<?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>149301</bug_id>
          
          <creation_ts>2015-09-17 15:08:02 -0700</creation_ts>
          <short_desc>add a regress test for richards with try/catch.</short_desc>
          <delta_ts>2015-09-18 16:44:04 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>149329</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1126885</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-09-17 15:08:02 -0700</bug_when>
    <thetext>Forgot to add this in DFG try/catch patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126934</commentid>
    <comment_count>1</comment_count>
      <attachid>261455</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-09-17 16:45:59 -0700</bug_when>
    <thetext>Created attachment 261455
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126940</commentid>
    <comment_count>2</comment_count>
      <attachid>261455</attachid>
    <who name="Oliver Hunt">oliver</who>
    <bug_when>2015-09-17 16:50:31 -0700</bug_when>
    <thetext>Comment on attachment 261455
patch

How many exceptions do you actually hit?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126955</commentid>
    <comment_count>3</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-09-17 17:22:28 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; Comment on attachment 261455 [details]
&gt; patch
&gt; 
&gt; How many exceptions do you actually hit?

3486.

I&apos;ve played with the frequency number a bit.
Obviously, as that number gets smaller, the
tests get slower. And as it becomes larger,
and exceptions are less frequent, the test
becomes faster.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126962</commentid>
    <comment_count>4</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-09-17 17:44:31 -0700</bug_when>
    <thetext>Here are some perf results with different exception frequencies. 
The only affects richards-try-catch benchmark.
Also, r189935 is the try/catch patch. And r189934 is the revision right
before this patch.


------------------


With the frequency being 1/10000
VMs tested:
&quot;og&quot; at /Volumes/Data/WK/c/OpenSource/WebKitBuild/Release/jsc (r189934)
&quot;tryCatch&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r189935)

Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between
sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific
preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95%
confidence intervals in milliseconds.

                                      og                     tryCatch                                     

richards-empty-try-catch      194.9911+-3.4160     ^     76.2141+-3.4663        ^ definitely 2.5585x faster
richards-try-catch            294.3329+-9.1718     ^    211.1737+-5.1058        ^ definitely 1.3938x faster

&lt;geometric&gt;                   239.5515+-3.4016     ^    126.8551+-3.7277        ^ definitely 1.8884x faster


--------------------


With the frequency being 1/5000 (what&apos;s in the actual patch)
VMs tested:
&quot;og&quot; at /Volumes/Data/WK/c/OpenSource/WebKitBuild/Release/jsc (r189934)
&quot;tryCatch&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r189935)

Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between
sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific
preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95%
confidence intervals in milliseconds.

                                      og                     tryCatch                                     

richards-empty-try-catch      195.6956+-4.6587     ^     76.0357+-2.4998        ^ definitely 2.5737x faster
richards-try-catch            309.5485+-6.6035     ^    235.3614+-16.2632       ^ definitely 1.3152x faster

&lt;geometric&gt;                   246.1172+-4.3429     ^    133.7329+-3.6655        ^ definitely 1.8404x faster


----------------


With the frequency being 1/2500
VMs tested:
&quot;og&quot; at /Volumes/Data/WK/c/OpenSource/WebKitBuild/Release/jsc (r189934)
&quot;tryCatch&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r189935)

Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between
sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific
preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95%
confidence intervals in milliseconds.

                                      og                     tryCatch                                     

richards-empty-try-catch      194.6537+-3.4410     ^     76.7055+-5.4004        ^ definitely 2.5377x faster
richards-try-catch            330.1699+-3.1142     ^    261.1393+-5.1116        ^ definitely 1.2643x faster

&lt;geometric&gt;                   253.5082+-2.2087     ^    141.5020+-5.0380        ^ definitely 1.7916x faster


----------------


With the frequency being 1/1000
VMs tested:
&quot;og&quot; at /Volumes/Data/WK/c/OpenSource/WebKitBuild/Release/jsc (r189934)
&quot;tryCatch&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r189935)

Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between
sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific
preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95%
confidence intervals in milliseconds.

                                      og                     tryCatch                                     

richards-empty-try-catch      198.9267+-10.7999    ^     77.1111+-3.5368        ^ definitely 2.5797x faster
richards-try-catch            422.8513+-5.3213     ^    349.4740+-8.3545        ^ definitely 1.2100x faster

&lt;geometric&gt;                   289.9953+-8.0337     ^    164.1356+-3.0591        ^ definitely 1.7668x faster


---------------


With the frequency being 1/500
VMs tested:
&quot;og&quot; at /Volumes/Data/WK/c/OpenSource/WebKitBuild/Release/jsc (r189934)
&quot;tryCatch&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r189935)

Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between
sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific
preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95%
confidence intervals in milliseconds.

                                      og                     tryCatch                                     

richards-empty-try-catch      195.8364+-7.6551     ^     76.0762+-3.0992        ^ definitely 2.5742x faster
richards-try-catch            524.2897+-10.7847    ^    467.4330+-11.8313       ^ definitely 1.1216x faster

&lt;geometric&gt;                   320.4008+-6.0738     ^    188.5623+-4.9270        ^ definitely 1.6992x faster


------------------


With the frequency being 1/100
VMs tested:
&quot;og&quot; at /Volumes/Data/WK/c/OpenSource/WebKitBuild/Release/jsc (r189934)
&quot;tryCatch&quot; at /Volumes/Data/WK/b/OpenSource/WebKitBuild/Release/jsc (r189935)

Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between
sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific
preciseTime() function to get microsecond-level timing. Reporting benchmark execution times with 95%
confidence intervals in milliseconds.

                                      og                     tryCatch                                     

richards-empty-try-catch      196.4677+-11.6653    ^     75.4759+-0.5515        ^ definitely 2.6031x faster
richards-try-catch           1538.8857+-21.0152    ^   1493.2333+-15.2021       ^ definitely 1.0306x faster

&lt;geometric&gt;                   549.7620+-14.2294    ^    335.7113+-2.2949        ^ definitely 1.6376x faster</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126974</commentid>
    <comment_count>5</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-09-17 17:54:23 -0700</bug_when>
    <thetext>http://www.wolframalpha.com/input/?i=ListPlot%5B+%7B1%2F10000%2C+211.1737%7D%2C+%7B1%2F5000%2C+235.3614%7D%2C+%7B1%2F2500%2C+261.1393%7D%2C+%7B1%2F1000%2C+349.4740%7D%2C+%7B1%2F500%2C+467.4330%7D%2C+%7B1%2F100%2C+1493.2333%7D%5D</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126995</commentid>
    <comment_count>6</comment_count>
      <attachid>261455</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-09-17 18:35:14 -0700</bug_when>
    <thetext>Comment on attachment 261455
patch

Clearing flags on attachment: 261455

Committed r189956: &lt;http://trac.webkit.org/changeset/189956&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1126996</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-09-17 18:35:18 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127019</commentid>
    <comment_count>8</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2015-09-17 19:49:23 -0700</bug_when>
    <thetext>&gt; Forgot to add this in DFG try/catch patch.

Not sure if this actually depends on that patch, but given this comment, I&apos;ll roll this out too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127022</commentid>
    <comment_count>9</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-09-17 19:52:37 -0700</bug_when>
    <thetext>Re-opened since this is blocked by bug 149329</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1127296</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2015-09-18 16:44:04 -0700</bug_when>
    <thetext>landed in:
http://trac.webkit.org/changeset/189996</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>261455</attachid>
            <date>2015-09-17 16:45:59 -0700</date>
            <delta_ts>2015-09-17 18:35:14 -0700</delta_ts>
            <desc>patch</desc>
            <filename>b-backup.diff</filename>
            <type>text/plain</type>
            <size>47137</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDE4OTk0NCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29y
a2luZyBjb3B5KQpAQCAtMSwzICsxLDk5IEBACisyMDE1LTA5LTE3ICBTYWFtIGJhcmF0aSAgPHNi
YXJhdGlAYXBwbGUuY29tPgorCisgICAgICAgIGFkZCBhIHJlZ3Jlc3MgdGVzdCBmb3IgcmljaGFy
ZHMgd2l0aCB0cnkvY2F0Y2guCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNDkzMDEKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBUaGlzIGFkZHMgdHdvIHZhcmlhbnRzIG9mIE9jdGFuZS9yaWNoYXJkcyBiZW5j
aG1hcmsgdXNpbmcKKyAgICAgICAgdHJ5L2NhdGNoLiBPbmUgdHJ5L2NhdGNoIHZhcmlhbnQgdGhh
dCBhY3R1YWxseSB0aHJvd3MuCisgICAgICAgIEFub3RoZXIgdGhhdCBuZXZlciB0aHJvd3MuIEkn
dmUgaW5jbHVkZWQgdHJ5L2NhdGNoIGluc2lkZQorICAgICAgICBldmVyeSBmdW5jdGlvbiBhbmQg
ZXZlcnkgbG9vcC4KKworICAgICAgICAqIGpzL3JlZ3Jlc3MvcmljaGFyZHMtZW1wdHktdHJ5LWNh
dGNoLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9yaWNoYXJkcy1l
bXB0eS10cnktY2F0Y2guaHRtbDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9yaWNoYXJk
cy10cnktY2F0Y2gtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL3Jp
Y2hhcmRzLXRyeS1jYXRjaC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL3Njcmlw
dC10ZXN0cy9yaWNoYXJkcy1lbXB0eS10cnktY2F0Y2guanM6IEFkZGVkLgorICAgICAgICAocnVu
UmljaGFyZHMpOgorICAgICAgICAoU2NoZWR1bGVyKToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90
b3R5cGUuYWRkSWRsZVRhc2spOgorICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlwZS5hZGRXb3Jr
ZXJUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuYWRkSGFuZGxlclRhc2spOgor
ICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlwZS5hZGREZXZpY2VUYXNrKToKKyAgICAgICAgKFNj
aGVkdWxlci5wcm90b3R5cGUuYWRkUnVubmluZ1Rhc2spOgorICAgICAgICAoU2NoZWR1bGVyLnBy
b3RvdHlwZS5hZGRUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuc2NoZWR1bGUp
OgorICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlwZS5yZWxlYXNlKToKKyAgICAgICAgKFNjaGVk
dWxlci5wcm90b3R5cGUuaG9sZEN1cnJlbnQpOgorICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlw
ZS5zdXNwZW5kQ3VycmVudCk6CisgICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLnF1ZXVlKToK
KyAgICAgICAgKFRhc2tDb250cm9sQmxvY2spOgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5w
cm90b3R5cGUuc2V0UnVubmluZyk6CisgICAgICAgIChUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlw
ZS5tYXJrQXNOb3RIZWxkKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLm1h
cmtBc0hlbGQpOgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuaXNIZWxkT3JT
dXNwZW5kZWQpOgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzU3Vz
cGVuZGVkKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc1J1bm5h
YmxlKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnJ1bik6CisgICAgICAg
IChUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5jaGVja1ByaW9yaXR5QWRkKToKKyAgICAgICAg
KFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKElkbGVUYXNr
KToKKyAgICAgICAgKElkbGVUYXNrLnByb3RvdHlwZS5ydW4pOgorICAgICAgICAoSWRsZVRhc2su
cHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKERldmljZVRhc2spOgorICAgICAgICAoRGV2
aWNlVGFzay5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKERldmljZVRhc2sucHJvdG90eXBlLnRv
U3RyaW5nKToKKyAgICAgICAgKFdvcmtlclRhc2spOgorICAgICAgICAoV29ya2VyVGFzay5wcm90
b3R5cGUucnVuKToKKyAgICAgICAgKFdvcmtlclRhc2sucHJvdG90eXBlLnRvU3RyaW5nKToKKyAg
ICAgICAgKEhhbmRsZXJUYXNrKToKKyAgICAgICAgKEhhbmRsZXJUYXNrLnByb3RvdHlwZS5ydW4p
OgorICAgICAgICAoSGFuZGxlclRhc2sucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKFBh
Y2tldCk6CisgICAgICAgIChQYWNrZXQucHJvdG90eXBlLmFkZFRvKToKKyAgICAgICAgKFBhY2tl
dC5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAqIGpzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3Rz
L3JpY2hhcmRzLXRyeS1jYXRjaC5qczogQWRkZWQuCisgICAgICAgIChyYW5kb21FeGNlcHRpb24p
OgorICAgICAgICAocnVuUmljaGFyZHMpOgorICAgICAgICAoU2NoZWR1bGVyKToKKyAgICAgICAg
KFNjaGVkdWxlci5wcm90b3R5cGUuYWRkSWRsZVRhc2spOgorICAgICAgICAoU2NoZWR1bGVyLnBy
b3RvdHlwZS5hZGRXb3JrZXJUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuYWRk
SGFuZGxlclRhc2spOgorICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlwZS5hZGREZXZpY2VUYXNr
KToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuYWRkUnVubmluZ1Rhc2spOgorICAgICAg
ICAoU2NoZWR1bGVyLnByb3RvdHlwZS5hZGRUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90
b3R5cGUuc2NoZWR1bGUpOgorICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlwZS5yZWxlYXNlKToK
KyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuaG9sZEN1cnJlbnQpOgorICAgICAgICAoU2No
ZWR1bGVyLnByb3RvdHlwZS5zdXNwZW5kQ3VycmVudCk6CisgICAgICAgIChTY2hlZHVsZXIucHJv
dG90eXBlLnF1ZXVlKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2spOgorICAgICAgICAoVGFz
a0NvbnRyb2xCbG9jay5wcm90b3R5cGUuc2V0UnVubmluZyk6CisgICAgICAgIChUYXNrQ29udHJv
bEJsb2NrLnByb3RvdHlwZS5tYXJrQXNOb3RIZWxkKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxv
Y2sucHJvdG90eXBlLm1hcmtBc0hlbGQpOgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5wcm90
b3R5cGUuaXNIZWxkT3JTdXNwZW5kZWQpOgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5wcm90
b3R5cGUubWFya0FzU3VzcGVuZGVkKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90
eXBlLm1hcmtBc1J1bm5hYmxlKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBl
LnJ1bik6CisgICAgICAgIChUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5jaGVja1ByaW9yaXR5
QWRkKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnRvU3RyaW5nKToKKyAg
ICAgICAgKElkbGVUYXNrKToKKyAgICAgICAgKElkbGVUYXNrLnByb3RvdHlwZS5ydW4pOgorICAg
ICAgICAoSWRsZVRhc2sucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKERldmljZVRhc2sp
OgorICAgICAgICAoRGV2aWNlVGFzay5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKERldmljZVRh
c2sucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKFdvcmtlclRhc2spOgorICAgICAgICAo
V29ya2VyVGFzay5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKFdvcmtlclRhc2sucHJvdG90eXBl
LnRvU3RyaW5nKToKKyAgICAgICAgKEhhbmRsZXJUYXNrKToKKyAgICAgICAgKEhhbmRsZXJUYXNr
LnByb3RvdHlwZS5ydW4pOgorICAgICAgICAoSGFuZGxlclRhc2sucHJvdG90eXBlLnRvU3RyaW5n
KToKKyAgICAgICAgKFBhY2tldCk6CisgICAgICAgIChQYWNrZXQucHJvdG90eXBlLmFkZFRvKToK
KyAgICAgICAgKFBhY2tldC5wcm90b3R5cGUudG9TdHJpbmcpOgorCiAyMDE1LTA5LTE3ICBTYWFt
IGJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgogCiAgICAgICAgIEltcGxlbWVudCB0cnkvY2F0
Y2ggaW4gdGhlIERGRy4KSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvcmljaGFyZHMtZW1w
dHktdHJ5LWNhdGNoLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL3JpY2hhcmRzLWVtcHR5LXRyeS1jYXRjaC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3JpY2hhcmRzLWVtcHR5LXRyeS1jYXRjaC1leHBl
Y3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL3JpY2hh
cmRzLWVtcHR5LXRyeS1jYXRjaAorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJpZXMg
b2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisKKworUEFT
UyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisK
K1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9yaWNoYXJkcy1l
bXB0eS10cnktY2F0Y2guaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNz
L3JpY2hhcmRzLWVtcHR5LXRyeS1jYXRjaC5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVz
dHMvanMvcmVncmVzcy9yaWNoYXJkcy1lbXB0eS10cnktY2F0Y2guaHRtbAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBI
VE1MLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9q
cy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxzY3JpcHQgc3JjPSIu
Li8uLi9yZXNvdXJjZXMvcmVncmVzcy1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNj
cmlwdC10ZXN0cy9yaWNoYXJkcy1lbXB0eS10cnktY2F0Y2guanMiPjwvc2NyaXB0PgorPHNjcmlw
dCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXBvc3QuanMiPjwvc2NyaXB0PgorPHNjcmlw
dCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5
PgorPC9odG1sPgpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9yaWNoYXJkcy10cnktY2F0
Y2gtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvcmlj
aGFyZHMtdHJ5LWNhdGNoLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3Rz
L2pzL3JlZ3Jlc3MvcmljaGFyZHMtdHJ5LWNhdGNoLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDEwIEBACitKU1JlZ3Jlc3MvcmljaGFyZHMtdHJ5LWNhdGNoCisKK09uIHN1
Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2Vk
IGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5vIGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mg
c3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlv
dXRUZXN0cy9qcy9yZWdyZXNzL3JpY2hhcmRzLXRyeS1jYXRjaC5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvcmljaGFyZHMtdHJ5LWNhdGNoLmh0bWwJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3JpY2hhcmRzLXRyeS1jYXRjaC5odG1sCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8v
SUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4v
cmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHNj
cmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9yZWdyZXNzLXByZS5qcyI+PC9zY3JpcHQ+Cis8c2Ny
aXB0IHNyYz0ic2NyaXB0LXRlc3RzL3JpY2hhcmRzLXRyeS1jYXRjaC5qcyI+PC9zY3JpcHQ+Cis8
c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL3JlZ3Jlc3MtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8
c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8
L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0
cy9yaWNoYXJkcy1lbXB0eS10cnktY2F0Y2guanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
anMvcmVncmVzcy9zY3JpcHQtdGVzdHMvcmljaGFyZHMtZW1wdHktdHJ5LWNhdGNoLmpzCShyZXZp
c2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvcmljaGFyZHMt
ZW1wdHktdHJ5LWNhdGNoLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQ2IEBACisvLyBD
b3B5cmlnaHQgMjAwNi0yMDA4IHRoZSBWOCBwcm9qZWN0IGF1dGhvcnMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorLy8gICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gICAgICAgY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKy8vICAgICAg
IGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZAorLy8gICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gICAgICAg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkCisvLyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8v
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisvLyBUaGlzIGlzIGEgSmF2YVNjcmlwdCBp
bXBsZW1lbnRhdGlvbiBvZiB0aGUgUmljaGFyZHMKKy8vIGJlbmNobWFyayBmcm9tOgorLy8KKy8v
ICAgIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tcjEwL0JlbmNoLmh0bWwKKy8vCisvLyBUaGUg
YmVuY2htYXJrIHdhcyBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGluIEJDUEwgYnkKKy8vIE1hcnRp
biBSaWNoYXJkcy4KKworCisvKioKKyAqIFRoZSBSaWNoYXJkcyBiZW5jaG1hcmsgc2ltdWxhdGVz
IHRoZSB0YXNrIGRpc3BhdGNoZXIgb2YgYW4KKyAqIG9wZXJhdGluZyBzeXN0ZW0uCisgKiovCitm
dW5jdGlvbiBydW5SaWNoYXJkcygpIHsKKyAgICB0cnkgeworICAgICAgICB2YXIgc2NoZWR1bGVy
ID0gbmV3IFNjaGVkdWxlcigpOworICAgICAgICBzY2hlZHVsZXIuYWRkSWRsZVRhc2soSURfSURM
RSwgMCwgbnVsbCwgQ09VTlQpOworCisgICAgICAgIHZhciBxdWV1ZSA9IG5ldyBQYWNrZXQobnVs
bCwgSURfV09SS0VSLCBLSU5EX1dPUkspOworICAgICAgICBxdWV1ZSA9IG5ldyBQYWNrZXQocXVl
dWUsICBJRF9XT1JLRVIsIEtJTkRfV09SSyk7CisgICAgICAgIHNjaGVkdWxlci5hZGRXb3JrZXJU
YXNrKElEX1dPUktFUiwgMTAwMCwgcXVldWUpOworCisgICAgICAgIHF1ZXVlID0gbmV3IFBhY2tl
dChudWxsLCBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICAgICAgICBxdWV1ZSA9IG5ldyBQ
YWNrZXQocXVldWUsICBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICAgICAgICBxdWV1ZSA9
IG5ldyBQYWNrZXQocXVldWUsICBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICAgICAgICBz
Y2hlZHVsZXIuYWRkSGFuZGxlclRhc2soSURfSEFORExFUl9BLCAyMDAwLCBxdWV1ZSk7CisKKyAg
ICAgICAgcXVldWUgPSBuZXcgUGFja2V0KG51bGwsIElEX0RFVklDRV9CLCBLSU5EX0RFVklDRSk7
CisgICAgICAgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9CLCBLSU5EX0RF
VklDRSk7CisgICAgICAgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9CLCBL
SU5EX0RFVklDRSk7CisgICAgICAgIHNjaGVkdWxlci5hZGRIYW5kbGVyVGFzayhJRF9IQU5ETEVS
X0IsIDMwMDAsIHF1ZXVlKTsKKworICAgICAgICBzY2hlZHVsZXIuYWRkRGV2aWNlVGFzayhJRF9E
RVZJQ0VfQSwgNDAwMCwgbnVsbCk7CisKKyAgICAgICAgc2NoZWR1bGVyLmFkZERldmljZVRhc2so
SURfREVWSUNFX0IsIDUwMDAsIG51bGwpOworCisgICAgICAgIHNjaGVkdWxlci5zY2hlZHVsZSgp
OworCisgICAgICAgIGlmIChzY2hlZHVsZXIucXVldWVDb3VudCAhPSBFWFBFQ1RFRF9RVUVVRV9D
T1VOVCB8fAorICAgICAgICAgICAgICAgIHNjaGVkdWxlci5ob2xkQ291bnQgIT0gRVhQRUNURURf
SE9MRF9DT1VOVCkgeworICAgICAgICAgICAgdmFyIG1zZyA9CisgICAgICAgICAgICAgICAgIkVy
cm9yIGR1cmluZyBleGVjdXRpb246IHF1ZXVlQ291bnQgPSAiICsgc2NoZWR1bGVyLnF1ZXVlQ291
bnQgKworICAgICAgICAgICAgICAgICIsIGhvbGRDb3VudCA9ICIgKyBzY2hlZHVsZXIuaG9sZENv
dW50ICsgIi4iOworICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CisgICAgICAgIH0K
KyAgICB9IGNhdGNoKGUpIHsgfQorfQorCit2YXIgQ09VTlQgPSAxMDAwOworCisvKioKKyAqIFRo
ZXNlIHR3byBjb25zdGFudHMgc3BlY2lmeSBob3cgbWFueSB0aW1lcyBhIHBhY2tldCBpcyBxdWV1
ZWQgYW5kCisgKiBob3cgbWFueSB0aW1lcyBhIHRhc2sgaXMgcHV0IG9uIGhvbGQgaW4gYSBjb3Jy
ZWN0IHJ1biBvZiByaWNoYXJkcy4KKyAqIFRoZXkgZG9uJ3QgaGF2ZSBhbnkgbWVhbmluZyBhIHN1
Y2ggYnV0IGFyZSBjaGFyYWN0ZXJpc3RpYyBvZiBhCisgKiBjb3JyZWN0IHJ1biBzbyBpZiB0aGUg
YWN0dWFsIHF1ZXVlIG9yIGhvbGQgY291bnQgaXMgZGlmZmVyZW50IGZyb20KKyAqIHRoZSBleHBl
Y3RlZCB0aGVyZSBtdXN0IGJlIGEgYnVnIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAqKi8KK3Zh
ciBFWFBFQ1RFRF9RVUVVRV9DT1VOVCA9IDIzMjI7Cit2YXIgRVhQRUNURURfSE9MRF9DT1VOVCA9
IDkyODsKKworCisvKioKKyAqIEEgc2NoZWR1bGVyIGNhbiBiZSB1c2VkIHRvIHNjaGVkdWxlIGEg
c2V0IG9mIHRhc2tzIGJhc2VkIG9uIHRoZWlyIHJlbGF0aXZlCisgKiBwcmlvcml0aWVzLiAgU2No
ZWR1bGluZyBpcyBkb25lIGJ5IG1haW50YWluaW5nIGEgbGlzdCBvZiB0YXNrIGNvbnRyb2wgYmxv
Y2tzCisgKiB3aGljaCBob2xkcyB0YXNrcyBhbmQgdGhlIGRhdGEgcXVldWUgdGhleSBhcmUgcHJv
Y2Vzc2luZy4KKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBTY2hlZHVsZXIoKSB7Cisg
ICAgdHJ5IHsKKyAgICAgICAgdGhpcy5xdWV1ZUNvdW50ID0gMDsKKyAgICAgICAgdGhpcy5ob2xk
Q291bnQgPSAwOworICAgICAgICB0aGlzLmJsb2NrcyA9IG5ldyBBcnJheShOVU1CRVJfT0ZfSURT
KTsKKyAgICAgICAgdGhpcy5saXN0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5jdXJyZW50VGNiID0g
bnVsbDsKKyAgICAgICAgdGhpcy5jdXJyZW50SWQgPSBudWxsOworCisgICAgfSBjYXRjaChlKSB7
IH0KK30KKwordmFyIElEX0lETEUgICAgICAgPSAwOwordmFyIElEX1dPUktFUiAgICAgPSAxOwor
dmFyIElEX0hBTkRMRVJfQSAgPSAyOwordmFyIElEX0hBTkRMRVJfQiAgPSAzOwordmFyIElEX0RF
VklDRV9BICAgPSA0OwordmFyIElEX0RFVklDRV9CICAgPSA1OwordmFyIE5VTUJFUl9PRl9JRFMg
PSA2OworCit2YXIgS0lORF9ERVZJQ0UgICA9IDA7Cit2YXIgS0lORF9XT1JLICAgICA9IDE7CisK
Ky8qKgorICogQWRkIGFuIGlkbGUgdGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7
aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0
eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVl
IG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gY291
bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0byBzY2hlZHVsZSB0aGUgdGFzaworICovCitTY2hlZHVs
ZXIucHJvdG90eXBlLmFkZElkbGVUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0eSwgcXVldWUs
IGNvdW50KSB7CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5hZGRSdW5uaW5nVGFzayhpZCwgcHJp
b3JpdHksIHF1ZXVlLCBuZXcgSWRsZVRhc2sodGhpcywgMSwgY291bnQpKTsKKyAgICB9IGNhdGNo
KGUpIHsgfQorfTsKKworLyoqCisgKiBBZGQgYSB3b3JrIHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIu
CisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0g
e2ludH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1
ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICovCitT
Y2hlZHVsZXIucHJvdG90eXBlLmFkZFdvcmtlclRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5
LCBxdWV1ZSkgeworICAgIHRyeSB7CisgICAgICAgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHks
IHF1ZXVlLCBuZXcgV29ya2VyVGFzayh0aGlzLCBJRF9IQU5ETEVSX0EsIDApKTsKKyAgICB9IGNh
dGNoKGUpIHsgfQorfTsKKworLyoqCisgKiBBZGQgYSBoYW5kbGVyIHRhc2sgdG8gdGhpcyBzY2hl
ZHVsZXIuCisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBA
cGFyYW0ge2ludH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNr
ZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzawor
ICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZEhhbmRsZXJUYXNrID0gZnVuY3Rpb24gKGlkLCBw
cmlvcml0eSwgcXVldWUpIHsKKyAgICB0cnkgeworICAgICAgICB0aGlzLmFkZFRhc2soaWQsIHBy
aW9yaXR5LCBxdWV1ZSwgbmV3IEhhbmRsZXJUYXNrKHRoaXMpKTsKKyAgICB9IGNhdGNoKGUpIHsg
fQorfTsKKworLyoqCisgKiBBZGQgYSBoYW5kbGVyIHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisg
KiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2lu
dH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVl
IHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICovCitTY2hl
ZHVsZXIucHJvdG90eXBlLmFkZERldmljZVRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBx
dWV1ZSkgeworICAgIHRyeSB7CisgICAgICAgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1
ZXVlLCBuZXcgRGV2aWNlVGFzayh0aGlzKSkKKyAgICB9IGNhdGNoKGUpIHsgfQorfTsKKworLyoq
CisgKiBBZGQgdGhlIHNwZWNpZmllZCB0YXNrIGFuZCBtYXJrIGl0IGFzIHJ1bm5pbmcuCisgKiBA
cGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0g
cHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRo
ZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICogQHBhcmFtIHtU
YXNrfSB0YXNrIHRoZSB0YXNrIHRvIGFkZAorICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZFJ1
bm5pbmdUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0eSwgcXVldWUsIHRhc2spIHsKKyAgICB0
cnkgeworICAgICAgICB0aGlzLmFkZFRhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzayk7Cisg
ICAgICAgIHRoaXMuY3VycmVudFRjYi5zZXRSdW5uaW5nKCk7CisgICAgfSBjYXRjaChlKSB7IH0K
K307CisKKy8qKgorICogQWRkIHRoZSBzcGVjaWZpZWQgdGFzayB0byB0aGlzIHNjaGVkdWxlci4K
KyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7
aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVl
dWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFy
YW0ge1Rhc2t9IHRhc2sgdGhlIHRhc2sgdG8gYWRkCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUu
YWRkVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKSB7CisgICAgdHJ5
IHsKKyAgICAgICAgdGhpcy5jdXJyZW50VGNiID0gbmV3IFRhc2tDb250cm9sQmxvY2sodGhpcy5s
aXN0LCBpZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKTsKKyAgICAgICAgdGhpcy5saXN0ID0gdGhp
cy5jdXJyZW50VGNiOworICAgICAgICB0aGlzLmJsb2Nrc1tpZF0gPSB0aGlzLmN1cnJlbnRUY2I7
CisgICAgfSBjYXRjaChlKSB7IH0KK307CisKKy8qKgorICogRXhlY3V0ZSB0aGUgdGFza3MgbWFu
YWdlZCBieSB0aGlzIHNjaGVkdWxlci4KKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVs
ZSA9IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmN1cnJlbnRUY2IgPSB0aGlzLmxpc3Q7CisgICAg
d2hpbGUgKHRoaXMuY3VycmVudFRjYiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAg
ICAgICBpZiAodGhpcy5jdXJyZW50VGNiLmlzSGVsZE9yU3VzcGVuZGVkKCkpIHsKKyAgICAgICAg
ICAgICAgICB0aGlzLmN1cnJlbnRUY2IgPSB0aGlzLmN1cnJlbnRUY2IubGluazsKKyAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SWQgPSB0aGlzLmN1cnJl
bnRUY2IuaWQ7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGNiID0gdGhpcy5jdXJyZW50
VGNiLnJ1bigpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgIH0K
K307CisKKy8qKgorICogUmVsZWFzZSBhIHRhc2sgdGhhdCBpcyBjdXJyZW50bHkgYmxvY2tlZCBh
bmQgcmV0dXJuIHRoZSBuZXh0IGJsb2NrIHRvIHJ1bi4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUg
aWQgb2YgdGhlIHRhc2sgdG8gc3VzcGVuZAorICovCitTY2hlZHVsZXIucHJvdG90eXBlLnJlbGVh
c2UgPSBmdW5jdGlvbiAoaWQpIHsKKyAgICB0cnkgeworICAgICAgICB2YXIgdGNiID0gdGhpcy5i
bG9ja3NbaWRdOworICAgICAgICBpZiAodGNiID09IG51bGwpIHJldHVybiB0Y2I7CisgICAgICAg
IHRjYi5tYXJrQXNOb3RIZWxkKCk7CisgICAgfSBjYXRjaChlKSB7IH0KKyAgICB0cnkgeworICAg
ICAgICBpZiAodGNiLnByaW9yaXR5ID4gdGhpcy5jdXJyZW50VGNiLnByaW9yaXR5KSB7CisgICAg
ICAgICAgICByZXR1cm4gdGNiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJu
IHRoaXMuY3VycmVudFRjYjsKKyAgICAgICAgfQorICAgIH0gY2F0Y2goZSkgeyB9Cit9OworCisv
KioKKyAqIEJsb2NrIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYW5kIHJldHVybiB0aGUg
bmV4dCB0YXNrIGNvbnRyb2wgYmxvY2sKKyAqIHRvIHJ1bi4gIFRoZSBibG9ja2VkIHRhc2sgd2ls
bCBub3QgYmUgbWFkZSBydW5uYWJsZSB1bnRpbCBpdCBpcyBleHBsaWNpdGx5CisgKiByZWxlYXNl
ZCwgZXZlbiBpZiBuZXcgd29yayBpcyBhZGRlZCB0byBpdC4KKyAqLworU2NoZWR1bGVyLnByb3Rv
dHlwZS5ob2xkQ3VycmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgICB0cnkgeworICAgICAgICB0aGlz
LmhvbGRDb3VudCsrOworICAgICAgICB0aGlzLmN1cnJlbnRUY2IubWFya0FzSGVsZCgpOworICAg
IH0gY2F0Y2goZSkgeyB9CisgICAgcmV0dXJuIHRoaXMuY3VycmVudFRjYi5saW5rOworfTsKKwor
LyoqCisgKiBTdXNwZW5kIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYW5kIHJldHVybiB0
aGUgbmV4dCB0YXNrIGNvbnRyb2wgYmxvY2sKKyAqIHRvIHJ1bi4gIElmIG5ldyB3b3JrIGlzIGFk
ZGVkIHRvIHRoZSBzdXNwZW5kZWQgdGFzayBpdCB3aWxsIGJlIG1hZGUgcnVubmFibGUuCisgKi8K
K1NjaGVkdWxlci5wcm90b3R5cGUuc3VzcGVuZEN1cnJlbnQgPSBmdW5jdGlvbiAoKSB7CisgICAg
dHJ5IHsKKyAgICAgICAgdGhpcy5jdXJyZW50VGNiLm1hcmtBc1N1c3BlbmRlZCgpOworICAgIH0g
Y2F0Y2goZSkgeyB9CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRjYjsK
KyAgICB9IGNhdGNoKGUpIHsgfQorfTsKKworLyoqCisgKiBBZGQgdGhlIHNwZWNpZmllZCBwYWNr
ZXQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya2xpc3QgdXNlZCBieSB0aGUgdGFzaworICogYXNzb2Np
YXRlZCB3aXRoIHRoZSBwYWNrZXQgYW5kIG1ha2UgdGhlIHRhc2sgcnVubmFibGUgaWYgaXQgaXMg
Y3VycmVudGx5CisgKiBzdXNwZW5kZWQuCisgKiBAcGFyYW0ge1BhY2tldH0gcGFja2V0IHRoZSBw
YWNrZXQgdG8gYWRkCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUucXVldWUgPSBmdW5jdGlvbiAo
cGFja2V0KSB7CisgICAgdHJ5IHsKKyAgICAgICAgdmFyIHQgPSB0aGlzLmJsb2Nrc1twYWNrZXQu
aWRdOworICAgICAgICBpZiAodCA9PSBudWxsKSByZXR1cm4gdDsKKyAgICAgICAgdGhpcy5xdWV1
ZUNvdW50Kys7CisgICAgICAgIHBhY2tldC5saW5rID0gbnVsbDsKKyAgICB9IGNhdGNoKGUpIHsg
fQorICAgIHBhY2tldC5pZCA9IHRoaXMuY3VycmVudElkOworICAgIHJldHVybiB0LmNoZWNrUHJp
b3JpdHlBZGQodGhpcy5jdXJyZW50VGNiLCBwYWNrZXQpOworfTsKKworLyoqCisgKiBBIHRhc2sg
Y29udHJvbCBibG9jayBtYW5hZ2VzIGEgdGFzayBhbmQgdGhlIHF1ZXVlIG9mIHdvcmsgcGFja2Fn
ZXMgYXNzb2NpYXRlZAorICogd2l0aCBpdC4KKyAqIEBwYXJhbSB7VGFza0NvbnRyb2xCbG9ja30g
bGluayB0aGUgcHJlY2VkaW5nIGJsb2NrIGluIHRoZSBsaW5rZWQgYmxvY2sgbGlzdAorICogQHBh
cmFtIHtpbnR9IGlkIHRoZSBpZCBvZiB0aGlzIGJsb2NrCisgKiBAcGFyYW0ge2ludH0gcHJpb3Jp
dHkgdGhlIHByaW9yaXR5IG9mIHRoaXMgYmxvY2sKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0
aGUgcXVldWUgb2YgcGFja2FnZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFy
YW0ge1Rhc2t9IHRhc2sgdGhlIHRhc2sKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBU
YXNrQ29udHJvbEJsb2NrKGxpbmssIGlkLCBwcmlvcml0eSwgcXVldWUsIHRhc2spIHsKKyAgICB0
cnkgeworICAgICAgICB0aGlzLmxpbmsgPSBsaW5rOworICAgICAgICB0aGlzLmlkID0gaWQ7Cisg
ICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgdGhpcy5xdWV1ZSA9IHF1
ZXVlOworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgIH0gY2F0Y2goZSkgeyB9CisgICAg
dHJ5IHsKKyAgICAgICAgaWYgKHF1ZXVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc3Rh
dGUgPSBTVEFURV9TVVNQRU5ERUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlz
LnN0YXRlID0gU1RBVEVfU1VTUEVOREVEX1JVTk5BQkxFOworICAgICAgICB9CisgICAgfSBjYXRj
aChlKSB7IH0KK30KKworLyoqCisgKiBUaGUgdGFzayBpcyBydW5uaW5nIGFuZCBpcyBjdXJyZW50
bHkgc2NoZWR1bGVkLgorICovCit2YXIgU1RBVEVfUlVOTklORyA9IDA7CisKKy8qKgorICogVGhl
IHRhc2sgaGFzIHBhY2tldHMgbGVmdCB0byBwcm9jZXNzLgorICovCit2YXIgU1RBVEVfUlVOTkFC
TEUgPSAxOworCisvKioKKyAqIFRoZSB0YXNrIGlzIG5vdCBjdXJyZW50bHkgcnVubmluZy4gIFRo
ZSB0YXNrIGlzIG5vdCBibG9ja2VkIGFzIHN1Y2ggYW5kIG1heQorICogYmUgc3RhcnRlZCBieSB0
aGUgc2NoZWR1bGVyLgorICovCit2YXIgU1RBVEVfU1VTUEVOREVEID0gMjsKKworLyoqCisgKiBU
aGUgdGFzayBpcyBibG9ja2VkIGFuZCBjYW5ub3QgYmUgcnVuIHVudGlsIGl0IGlzIGV4cGxpY2l0
bHkgcmVsZWFzZWQuCisgKi8KK3ZhciBTVEFURV9IRUxEID0gNDsKKwordmFyIFNUQVRFX1NVU1BF
TkRFRF9SVU5OQUJMRSA9IFNUQVRFX1NVU1BFTkRFRCB8IFNUQVRFX1JVTk5BQkxFOwordmFyIFNU
QVRFX05PVF9IRUxEID0gflNUQVRFX0hFTEQ7CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBl
LnNldFJ1bm5pbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5zdGF0
ZSA9IFNUQVRFX1JVTk5JTkc7CisgICAgfSBjYXRjaChlKXt9Cit9OworCitUYXNrQ29udHJvbEJs
b2NrLnByb3RvdHlwZS5tYXJrQXNOb3RIZWxkID0gZnVuY3Rpb24gKCkgeworICAgIHRyeSB7Cisg
ICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlICYgU1RBVEVfTk9UX0hFTEQ7CisgICAgfSBj
YXRjaChlKSB7IH0KK307CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc0hlbGQg
PSBmdW5jdGlvbiAoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3Rh
dGUgfCBTVEFURV9IRUxEOworICAgIH0gY2F0Y2goZSkgeyB9Cit9OworCitUYXNrQ29udHJvbEJs
b2NrLnByb3RvdHlwZS5pc0hlbGRPclN1c3BlbmRlZCA9IGZ1bmN0aW9uICgpIHsKKyAgICB0cnkg
eworICAgICAgICByZXR1cm4gKHRoaXMuc3RhdGUgJiBTVEFURV9IRUxEKSAhPSAwIHx8ICh0aGlz
LnN0YXRlID09IFNUQVRFX1NVU1BFTkRFRCk7CisgICAgfSBjYXRjaChlKSB7IAorICAgICAgICBy
ZXR1cm4gKHRoaXMuc3RhdGUgJiBTVEFURV9IRUxEKSAhPSAwIHx8ICh0aGlzLnN0YXRlID09IFNU
QVRFX1NVU1BFTkRFRCk7CisgICAgfQorfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUu
bWFya0FzU3VzcGVuZGVkID0gZnVuY3Rpb24gKCkgeworICAgIHRyeSB7CisgICAgICAgIHRoaXMu
c3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfU1VTUEVOREVEOworICAgIH0gY2F0Y2goZSkgeyAK
KyAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgfCBTVEFURV9TVVNQRU5ERUQ7CisgICAg
fQorfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzUnVubmFibGUgPSBmdW5j
dGlvbiAoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgfCBT
VEFURV9SVU5OQUJMRTsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IHRo
aXMuc3RhdGUgfCBTVEFURV9SVU5OQUJMRTsKKyAgICB9Cit9OworCisvKioKKyAqIFJ1bnMgdGhp
cyB0YXNrLCBpZiBpdCBpcyByZWFkeSB0byBiZSBydW4sIGFuZCByZXR1cm5zIHRoZSBuZXh0IHRh
c2sgdG8gcnVuLgorICovCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlv
biAoKSB7CisgICAgdmFyIHBhY2tldDsKKyAgICB0cnkgeworICAgICAgICBpZiAodGhpcy5zdGF0
ZSA9PSBTVEFURV9TVVNQRU5ERURfUlVOTkFCTEUpIHsKKyAgICAgICAgICAgIHBhY2tldCA9IHRo
aXMucXVldWU7CisgICAgICAgICAgICB0aGlzLnF1ZXVlID0gcGFja2V0Lmxpbms7CisgICAgICAg
ICAgICBpZiAodGhpcy5xdWV1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0
ZSA9IFNUQVRFX1JVTk5JTkc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IHRoaXMuc3RhdGUgPSBTVEFURV9SVU5OQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIHBhY2tldCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9IGNhdGNo
KGUpIHsgfQorICAgIHJldHVybiB0aGlzLnRhc2sucnVuKHBhY2tldCk7Cit9OworCisvKioKKyAq
IEFkZHMgYSBwYWNrZXQgdG8gdGhlIHdvcmtsaXN0IG9mIHRoaXMgYmxvY2sncyB0YXNrLCBtYXJr
cyB0aGlzIGFzIHJ1bm5hYmxlIGlmCisgKiBuZWNlc3NhcnksIGFuZCByZXR1cm5zIHRoZSBuZXh0
IHJ1bm5hYmxlIG9iamVjdCB0byBydW4gKHRoZSBvbmUKKyAqIHdpdGggdGhlIGhpZ2hlc3QgcHJp
b3JpdHkpLgorICovCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5jaGVja1ByaW9yaXR5QWRk
ID0gZnVuY3Rpb24gKHRhc2ssIHBhY2tldCkgeworICAgIHRyeSB7CisgICAgICAgIGlmICh0aGlz
LnF1ZXVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucXVldWUgPSBwYWNrZXQ7CisgICAg
ICAgICAgICB0aGlzLm1hcmtBc1J1bm5hYmxlKCk7CisgICAgICAgICAgICBpZiAodGhpcy5wcmlv
cml0eSA+IHRhc2sucHJpb3JpdHkpIHJldHVybiB0aGlzOworICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgdGhpcy5xdWV1ZSA9IHBhY2tldC5hZGRUbyh0aGlzLnF1ZXVlKTsKKyAgICAgICAg
fQorCisgICAgICAgIHJldHVybiB0YXNrOworICAgIH0gY2F0Y2goZSkgeyAKKyAgICAgICAgcmV0
dXJuIHRhc2s7CisgICAgfQorfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUudG9TdHJp
bmcgPSBmdW5jdGlvbiAoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuICJ0Y2IgeyAiICsg
dGhpcy50YXNrICsgIkAiICsgdGhpcy5zdGF0ZSArICIgfSI7CisgICAgfSBjYXRjaChlKSB7Cisg
ICAgICAgIHJldHVybiAidGNiIHsgIiArIHRoaXMudGFzayArICJAIiArIHRoaXMuc3RhdGUgKyAi
IH0iOworICAgIH0KK307CisKKy8qKgorICogQW4gaWRsZSB0YXNrIGRvZXNuJ3QgZG8gYW55IHdv
cmsgaXRzZWxmIGJ1dCBjeWNsZXMgY29udHJvbCBiZXR3ZWVuIHRoZSB0d28KKyAqIGRldmljZSB0
YXNrcy4KKyAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgdGhlIHNjaGVkdWxlciB0aGF0
IG1hbmFnZXMgdGhpcyB0YXNrCisgKiBAcGFyYW0ge2ludH0gdjEgYSBzZWVkIHZhbHVlIHRoYXQg
Y29udHJvbHMgaG93IHRoZSBkZXZpY2UgdGFza3MgYXJlIHNjaGVkdWxlZAorICogQHBhcmFtIHtp
bnR9IGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyB0YXNrIHNob3VsZCBiZSBzY2hlZHVs
ZWQKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBJZGxlVGFzayhzY2hlZHVsZXIsIHYx
LCBjb3VudCkgeworICAgIHRyeSB7CisgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVy
OworICAgICAgICB0aGlzLnYxID0gdjE7CisgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAg
ICB9IGNhdGNoKGUpIHsKKyAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgIH0KK30KKwor
SWRsZVRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgICB0cnkgewor
ICAgICAgICB0aGlzLmNvdW50LS07CisgICAgICAgIGlmICh0aGlzLmNvdW50ID09IDApIHJldHVy
biB0aGlzLnNjaGVkdWxlci5ob2xkQ3VycmVudCgpOworICAgIH0gY2F0Y2goZSkgeyB9CisKKyAg
ICB0cnkgeworICAgICAgICBpZiAoKHRoaXMudjEgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICB0
aGlzLnYxID0gdGhpcy52MSA+PiAxOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVy
LnJlbGVhc2UoSURfREVWSUNFX0EpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhp
cy52MSA9ICh0aGlzLnYxID4+IDEpIF4gMHhEMDA4OworICAgICAgICAgICAgcmV0dXJuIHRoaXMu
c2NoZWR1bGVyLnJlbGVhc2UoSURfREVWSUNFX0IpOworICAgICAgICB9CisgICAgfSBjYXRjaChl
KSB7IH0KK307CisKK0lkbGVUYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsK
KyAgICB0cnkgeworICAgICAgICByZXR1cm4gIklkbGVUYXNrIgorICAgIH0gY2F0Y2goZSkgewor
ICAgICAgICByZXR1cm4gIklkbGVUYXNrIgorICAgIH0KK307CisKKy8qKgorICogQSB0YXNrIHRo
YXQgc3VzcGVuZHMgaXRzZWxmIGFmdGVyIGVhY2ggdGltZSBpdCBoYXMgYmVlbiBydW4gdG8gc2lt
dWxhdGUKKyAqIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSBhbiBleHRlcm5hbCBkZXZpY2UuCisgKiBA
cGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRo
aXMgdGFzaworICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIERldmljZVRhc2soc2NoZWR1
bGVyKSB7CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7Cisg
ICAgICAgIHRoaXMudjEgPSBudWxsOworICAgIH0gY2F0Y2goZSkgeyB9Cit9CisKK0RldmljZVRh
c2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgICBpZiAocGFja2V0ID09
IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0aGlzLnYxID09IG51bGwp
IHJldHVybiB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgdmFy
IHYgPSB0aGlzLnYxOworICAgICAgICAgICAgdGhpcy52MSA9IG51bGw7CisgICAgICAgIH0gY2F0
Y2goZSkgeyB9CisgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5xdWV1ZSh2KTsKKyAgICB9
IGVsc2UgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy52MSA9IHBhY2tldDsKKyAg
ICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLmhvbGRD
dXJyZW50KCk7CisgICAgfQorfTsKKworRGV2aWNlVGFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBm
dW5jdGlvbiAoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuICJEZXZpY2VUYXNrIjsKKyAg
ICB9IGNhdGNoKGUpIHsgfQorfTsKKworLyoqCisgKiBBIHRhc2sgdGhhdCBtYW5pcHVsYXRlcyB3
b3JrIHBhY2tldHMuCisgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hlZHVs
ZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFzaworICogQHBhcmFtIHtpbnR9IHYxIGEgc2VlZCB1c2Vk
IHRvIHNwZWNpZnkgaG93IHdvcmsgcGFja2V0cyBhcmUgbWFuaXB1bGF0ZWQKKyAqIEBwYXJhbSB7
aW50fSB2MiBhbm90aGVyIHNlZWQgdXNlZCB0byBzcGVjaWZ5IGhvdyB3b3JrIHBhY2tldHMgYXJl
IG1hbmlwdWxhdGVkCisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gV29ya2VyVGFzayhz
Y2hlZHVsZXIsIHYxLCB2MikgeworICAgIHRyeSB7CisgICAgICAgIHRoaXMuc2NoZWR1bGVyID0g
c2NoZWR1bGVyOworICAgICAgICB0aGlzLnYxID0gdjE7CisgICAgICAgIHRoaXMudjIgPSB2MjsK
KyAgICB9IGNhdGNoKGUpIHsgfQorfQorCitXb3JrZXJUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5j
dGlvbiAocGFja2V0KSB7CisgICAgaWYgKHBhY2tldCA9PSBudWxsKSB7CisgICAgICAgIHJldHVy
biB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworICAgIH0gZWxzZSB7CisgICAgICAg
IHRyeSB7CisgICAgICAgICAgICBpZiAodGhpcy52MSA9PSBJRF9IQU5ETEVSX0EpIHsKKyAgICAg
ICAgICAgICAgICB0aGlzLnYxID0gSURfSEFORExFUl9COworICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICB0aGlzLnYxID0gSURfSEFORExFUl9BOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgcGFja2V0LmlkID0gdGhpcy52MTsKKyAgICAgICAgICAgIHBhY2tldC5hMSA9
IDA7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
REFUQV9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhp
cy52MisrOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnYyID4gMjYpIHRoaXMudjIgPSAxOwor
ICAgICAgICAgICAgICAgIHBhY2tldC5hMltpXSA9IHRoaXMudjI7CisgICAgICAgICAgICB9IGNh
dGNoKGUpIHsgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5xdWV1
ZShwYWNrZXQpOworICAgIH0KK307CisKK1dvcmtlclRhc2sucHJvdG90eXBlLnRvU3RyaW5nID0g
ZnVuY3Rpb24gKCkgeworICAgIHRyeSB7CisgICAgICAgIHJldHVybiAiV29ya2VyVGFzayI7Cisg
ICAgfSBjYXRjaChlKSB7IH0KK307CisKKy8qKgorICogQSB0YXNrIHRoYXQgbWFuaXB1bGF0ZXMg
d29yayBwYWNrZXRzIGFuZCB0aGVuIHN1c3BlbmRzIGl0c2VsZi4KKyAqIEBwYXJhbSB7U2NoZWR1
bGVyfSBzY2hlZHVsZXIgdGhlIHNjaGVkdWxlciB0aGF0IG1hbmFnZXMgdGhpcyB0YXNrCisgKiBA
Y29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gSGFuZGxlclRhc2soc2NoZWR1bGVyKSB7CisgICAg
dHJ5IHsKKyAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CisgICAgICAgIHRoaXMu
djEgPSBudWxsOworICAgICAgICB0aGlzLnYyID0gbnVsbDsKKyAgICB9IGNhdGNoKGUpIHsgfQor
fQorCitIYW5kbGVyVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHBhY2tldCkgeworICAg
IHRyeSB7CisgICAgICAgIGlmIChwYWNrZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBh
Y2tldC5raW5kID09IEtJTkRfV09SSykgeworICAgICAgICAgICAgICAgIHRoaXMudjEgPSBwYWNr
ZXQuYWRkVG8odGhpcy52MSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IHRoaXMudjIgPSBwYWNrZXQuYWRkVG8odGhpcy52Mik7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9IGNhdGNoKGUpIHsgfQorCisgICAgdHJ5IHsKKyAgICAgICAgaWYgKHRoaXMudjEg
IT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIGNvdW50ID0gdGhpcy52MS5hMTsKKyAgICAgICAg
ICAgIHZhciB2OworICAgICAgICAgICAgaWYgKGNvdW50IDwgREFUQV9TSVpFKSB7CisgICAgICAg
ICAgICAgICAgaWYgKHRoaXMudjIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB2ID0g
dGhpcy52MjsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy52MiA9IHRoaXMudjIubGluazsKKyAg
ICAgICAgICAgICAgICAgICAgdi5hMSA9IHRoaXMudjEuYTJbY291bnRdOworICAgICAgICAgICAg
ICAgICAgICB0aGlzLnYxLmExID0gY291bnQgKyAxOworICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdGhpcy5zY2hlZHVsZXIucXVldWUodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2ID0gdGhpcy52MTsKKyAgICAgICAgICAgICAg
ICB0aGlzLnYxID0gdGhpcy52MS5saW5rOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNj
aGVkdWxlci5xdWV1ZSh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gY2F0Y2go
ZSkgeyB9CisgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnN1c3BlbmRDdXJyZW50KCk7Cit9Owor
CitIYW5kbGVyVGFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgdHJ5
IHsKKyAgICAgICAgcmV0dXJuICJIYW5kbGVyVGFzayI7CisgICAgfSBjYXRjaChlKSB7IH0KK307
CisKKy8qIC0tLSAqCisgKiBQIGEgYyBrIGUgdAorICogLS0tICovCisKK3ZhciBEQVRBX1NJWkUg
PSA0OworCisvKioKKyAqIEEgc2ltcGxlIHBhY2thZ2Ugb2YgZGF0YSB0aGF0IGlzIG1hbmlwdWxh
dGVkIGJ5IHRoZSB0YXNrcy4gIFRoZSBleGFjdCBsYXlvdXQKKyAqIG9mIHRoZSBwYXlsb2FkIGRh
dGEgY2FycmllZCBieSBhIHBhY2tldCBpcyBub3QgaW1wb3J0YWludCwgYW5kIG5laXRoZXIgaXMg
dGhlCisgKiBuYXR1cmUgb2YgdGhlIHdvcmsgcGVyZm9ybWVkIG9uIHBhY2tldHMgYnkgdGhlIHRh
c2tzLgorICoKKyAqIEJlc2lkZXMgY2FycnlpbmcgZGF0YSwgcGFja2V0cyBmb3JtIGxpbmtlZCBs
aXN0cyBhbmQgYXJlIGhlbmNlIHVzZWQgYm90aCBhcworICogZGF0YSBhbmQgd29ya2xpc3RzLgor
ICogQHBhcmFtIHtQYWNrZXR9IGxpbmsgdGhlIHRhaWwgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIHBh
Y2tldHMKKyAqIEBwYXJhbSB7aW50fSBpZCBhbiBJRCBmb3IgdGhpcyBwYWNrZXQKKyAqIEBwYXJh
bSB7aW50fSBraW5kIHRoZSB0eXBlIG9mIHRoaXMgcGFja2V0CisgKiBAY29uc3RydWN0b3IKKyAq
LworZnVuY3Rpb24gUGFja2V0KGxpbmssIGlkLCBraW5kKSB7CisgICAgdHJ5IHsKKyAgICAgICAg
dGhpcy5saW5rID0gbGluazsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLmtp
bmQgPSBraW5kOworICAgICAgICB0aGlzLmExID0gMDsKKyAgICAgICAgdGhpcy5hMiA9IG5ldyBB
cnJheShEQVRBX1NJWkUpOworICAgIH0gY2F0Y2goZSkgeyB9Cit9CisKKy8qKgorICogQWRkIHRo
aXMgcGFja2V0IHRvIHRoZSBlbmQgb2YgYSB3b3JrbGlzdCwgYW5kIHJldHVybiB0aGUgd29ya2xp
c3QuCisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHdvcmtsaXN0IHRvIGFkZCB0aGlzIHBh
Y2tldCB0bworICovCitQYWNrZXQucHJvdG90eXBlLmFkZFRvID0gZnVuY3Rpb24gKHF1ZXVlKSB7
CisgICAgdGhpcy5saW5rID0gbnVsbDsKKyAgICBpZiAocXVldWUgPT0gbnVsbCkgcmV0dXJuIHRo
aXM7CisgICAgdmFyIHBlZWssIG5leHQgPSBxdWV1ZTsKKyAgICB3aGlsZSAoKHBlZWsgPSBuZXh0
LmxpbmspICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5leHQgPSBwZWVr
OworICAgICAgICB9IGNhdGNoKGUpIHsgfQorICAgIH0KKyAgICBuZXh0LmxpbmsgPSB0aGlzOwor
ICAgIHJldHVybiBxdWV1ZTsKK307CisKK1BhY2tldC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5j
dGlvbiAoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuICJQYWNrZXQiOworICAgIH0gY2F0
Y2goZSkgeyB9Cit9OworCitmb3IgKGxldCBpID0gMDsgaSA8IDM1MDsgKytpKQorICBydW5SaWNo
YXJkcygpOwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvcmljaGFy
ZHMtdHJ5LWNhdGNoLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2Ny
aXB0LXRlc3RzL3JpY2hhcmRzLXRyeS1jYXRjaC5qcwkocmV2aXNpb24gMCkKKysrIExheW91dFRl
c3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL3JpY2hhcmRzLXRyeS1jYXRjaC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDY5NSBAQAorLy8gQ29weXJpZ2h0IDIwMDYtMjAwOCB0aGUgVjgg
cHJvamVjdCBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
Ky8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUKKy8vICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nCisvLyAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKy8vICAgICAgIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorLy8gICAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8K
Ky8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFO
RCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJ
R0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisKKworLy8gVGhpcyBpcyBhIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJpY2hh
cmRzCisvLyBiZW5jaG1hcmsgZnJvbToKKy8vCisvLyAgICBodHRwOi8vd3d3LmNsLmNhbS5hYy51
ay9+bXIxMC9CZW5jaC5odG1sCisvLworLy8gVGhlIGJlbmNobWFyayB3YXMgb3JpZ2luYWxseSBp
bXBsZW1lbnRlZCBpbiBCQ1BMIGJ5CisvLyBNYXJ0aW4gUmljaGFyZHMuCisKKworbGV0IF9fZXhj
ZXB0aW9uQ291bnRlciA9IDA7CitmdW5jdGlvbiByYW5kb21FeGNlcHRpb24oKSB7CisgICAgX19l
eGNlcHRpb25Db3VudGVyKys7CisgICAgaWYgKF9fZXhjZXB0aW9uQ291bnRlciAlIDUwMDAgPT09
IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJyYW5kbyIpOworICAgIH0KK30KK25vSW5s
aW5lKHJhbmRvbUV4Y2VwdGlvbik7CisKKy8qKgorICogVGhlIFJpY2hhcmRzIGJlbmNobWFyayBz
aW11bGF0ZXMgdGhlIHRhc2sgZGlzcGF0Y2hlciBvZiBhbgorICogb3BlcmF0aW5nIHN5c3RlbS4K
KyAqKi8KK2Z1bmN0aW9uIHJ1blJpY2hhcmRzKCkgeworICAgIHRyeSB7CisgICAgICAgIHZhciBz
Y2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyKCk7CisgICAgICAgIHNjaGVkdWxlci5hZGRJZGxlVGFz
ayhJRF9JRExFLCAwLCBudWxsLCBDT1VOVCk7CisKKyAgICAgICAgdmFyIHF1ZXVlID0gbmV3IFBh
Y2tldChudWxsLCBJRF9XT1JLRVIsIEtJTkRfV09SSyk7CisgICAgICAgIHF1ZXVlID0gbmV3IFBh
Y2tldChxdWV1ZSwgIElEX1dPUktFUiwgS0lORF9XT1JLKTsKKyAgICAgICAgc2NoZWR1bGVyLmFk
ZFdvcmtlclRhc2soSURfV09SS0VSLCAxMDAwLCBxdWV1ZSk7CisKKyAgICAgICAgcXVldWUgPSBu
ZXcgUGFja2V0KG51bGwsIElEX0RFVklDRV9BLCBLSU5EX0RFVklDRSk7CisgICAgICAgIHF1ZXVl
ID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9BLCBLSU5EX0RFVklDRSk7CisgICAgICAg
IHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9BLCBLSU5EX0RFVklDRSk7Cisg
ICAgICAgIHNjaGVkdWxlci5hZGRIYW5kbGVyVGFzayhJRF9IQU5ETEVSX0EsIDIwMDAsIHF1ZXVl
KTsKKworICAgICAgICBxdWV1ZSA9IG5ldyBQYWNrZXQobnVsbCwgSURfREVWSUNFX0IsIEtJTkRf
REVWSUNFKTsKKyAgICAgICAgcXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVWSUNFX0Is
IEtJTkRfREVWSUNFKTsKKyAgICAgICAgcXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVW
SUNFX0IsIEtJTkRfREVWSUNFKTsKKyAgICAgICAgc2NoZWR1bGVyLmFkZEhhbmRsZXJUYXNrKElE
X0hBTkRMRVJfQiwgMzAwMCwgcXVldWUpOworCisgICAgICAgIHNjaGVkdWxlci5hZGREZXZpY2VU
YXNrKElEX0RFVklDRV9BLCA0MDAwLCBudWxsKTsKKworICAgICAgICBzY2hlZHVsZXIuYWRkRGV2
aWNlVGFzayhJRF9ERVZJQ0VfQiwgNTAwMCwgbnVsbCk7CisKKyAgICAgICAgc2NoZWR1bGVyLnNj
aGVkdWxlKCk7CisKKyAgICAgICAgaWYgKHNjaGVkdWxlci5xdWV1ZUNvdW50ICE9IEVYUEVDVEVE
X1FVRVVFX0NPVU5UIHx8CisgICAgICAgICAgICAgICAgc2NoZWR1bGVyLmhvbGRDb3VudCAhPSBF
WFBFQ1RFRF9IT0xEX0NPVU5UKSB7CisgICAgICAgICAgICB2YXIgbXNnID0KKyAgICAgICAgICAg
ICAgICAiRXJyb3IgZHVyaW5nIGV4ZWN1dGlvbjogcXVldWVDb3VudCA9ICIgKyBzY2hlZHVsZXIu
cXVldWVDb3VudCArCisgICAgICAgICAgICAgICAgIiwgaG9sZENvdW50ID0gIiArIHNjaGVkdWxl
ci5ob2xkQ291bnQgKyAiLiI7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKKyAg
ICAgICAgfQorCisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgIH0gY2F0Y2goZSkgeyB9
Cit9CisKK3ZhciBDT1VOVCA9IDEwMDA7CisKKy8qKgorICogVGhlc2UgdHdvIGNvbnN0YW50cyBz
cGVjaWZ5IGhvdyBtYW55IHRpbWVzIGEgcGFja2V0IGlzIHF1ZXVlZCBhbmQKKyAqIGhvdyBtYW55
IHRpbWVzIGEgdGFzayBpcyBwdXQgb24gaG9sZCBpbiBhIGNvcnJlY3QgcnVuIG9mIHJpY2hhcmRz
LgorICogVGhleSBkb24ndCBoYXZlIGFueSBtZWFuaW5nIGEgc3VjaCBidXQgYXJlIGNoYXJhY3Rl
cmlzdGljIG9mIGEKKyAqIGNvcnJlY3QgcnVuIHNvIGlmIHRoZSBhY3R1YWwgcXVldWUgb3IgaG9s
ZCBjb3VudCBpcyBkaWZmZXJlbnQgZnJvbQorICogdGhlIGV4cGVjdGVkIHRoZXJlIG11c3QgYmUg
YSBidWcgaW4gdGhlIGltcGxlbWVudGF0aW9uLgorICoqLwordmFyIEVYUEVDVEVEX1FVRVVFX0NP
VU5UID0gMjMyMjsKK3ZhciBFWFBFQ1RFRF9IT0xEX0NPVU5UID0gOTI4OworCisKKy8qKgorICog
QSBzY2hlZHVsZXIgY2FuIGJlIHVzZWQgdG8gc2NoZWR1bGUgYSBzZXQgb2YgdGFza3MgYmFzZWQg
b24gdGhlaXIgcmVsYXRpdmUKKyAqIHByaW9yaXRpZXMuICBTY2hlZHVsaW5nIGlzIGRvbmUgYnkg
bWFpbnRhaW5pbmcgYSBsaXN0IG9mIHRhc2sgY29udHJvbCBibG9ja3MKKyAqIHdoaWNoIGhvbGRz
IHRhc2tzIGFuZCB0aGUgZGF0YSBxdWV1ZSB0aGV5IGFyZSBwcm9jZXNzaW5nLgorICogQGNvbnN0
cnVjdG9yCisgKi8KK2Z1bmN0aW9uIFNjaGVkdWxlcigpIHsKKyAgICB0cnkgeworICAgICAgICB0
aGlzLnF1ZXVlQ291bnQgPSAwOworICAgICAgICB0aGlzLmhvbGRDb3VudCA9IDA7CisgICAgICAg
IHRoaXMuYmxvY2tzID0gbmV3IEFycmF5KE5VTUJFUl9PRl9JRFMpOworICAgICAgICB0aGlzLmxp
c3QgPSBudWxsOworICAgICAgICB0aGlzLmN1cnJlbnRUY2IgPSBudWxsOworICAgICAgICB0aGlz
LmN1cnJlbnRJZCA9IG51bGw7CisKKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBj
YXRjaChlKSB7IH0KK30KKwordmFyIElEX0lETEUgICAgICAgPSAwOwordmFyIElEX1dPUktFUiAg
ICAgPSAxOwordmFyIElEX0hBTkRMRVJfQSAgPSAyOwordmFyIElEX0hBTkRMRVJfQiAgPSAzOwor
dmFyIElEX0RFVklDRV9BICAgPSA0OwordmFyIElEX0RFVklDRV9CICAgPSA1OwordmFyIE5VTUJF
Ul9PRl9JRFMgPSA2OworCit2YXIgS0lORF9ERVZJQ0UgICA9IDA7Cit2YXIgS0lORF9XT1JLICAg
ICA9IDE7CisKKy8qKgorICogQWRkIGFuIGlkbGUgdGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAq
IEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50
fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUg
dGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0g
e2ludH0gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0byBzY2hlZHVsZSB0aGUgdGFzaworICov
CitTY2hlZHVsZXIucHJvdG90eXBlLmFkZElkbGVUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0
eSwgcXVldWUsIGNvdW50KSB7CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5hZGRSdW5uaW5nVGFz
ayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgSWRsZVRhc2sodGhpcywgMSwgY291bnQpKTsKKyAg
ICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaChlKSB7IH0KK307CisKKy8qKgor
ICogQWRkIGEgd29yayB0YXNrIHRvIHRoaXMgc2NoZWR1bGVyLgorICogQHBhcmFtIHtpbnR9IGlk
IHRoZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSB0
YXNrJ3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2Ygd29y
ayB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5h
ZGRXb3JrZXJUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0eSwgcXVldWUpIHsKKyAgICB0cnkg
eworICAgICAgICB0aGlzLmFkZFRhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwgbmV3IFdvcmtlclRh
c2sodGhpcywgSURfSEFORExFUl9BLCAwKSk7CisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOwor
ICAgIH0gY2F0Y2goZSkgeyB9Cit9OworCisvKioKKyAqIEFkZCBhIGhhbmRsZXIgdGFzayB0byB0
aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRh
c2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFy
YW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRo
ZSB0YXNrCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUuYWRkSGFuZGxlclRhc2sgPSBmdW5jdGlv
biAoaWQsIHByaW9yaXR5LCBxdWV1ZSkgeworICAgIHRyeSB7CisgICAgICAgIHRoaXMuYWRkVGFz
ayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgSGFuZGxlclRhc2sodGhpcykpOworICAgICAgICBy
YW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorfTsKKworLyoqCisgKiBBZGQg
YSBoYW5kbGVyIHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisgKiBAcGFyYW0ge2ludH0gaWQgdGhl
IGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gcHJpb3JpdHkgdGhlIHRhc2sn
cyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRv
IGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZERl
dmljZVRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSkgeworICAgIHRyeSB7Cisg
ICAgICAgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgRGV2aWNlVGFzayh0
aGlzKSkKKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaChlKSB7IH0KK307
CisKKy8qKgorICogQWRkIHRoZSBzcGVjaWZpZWQgdGFzayBhbmQgbWFyayBpdCBhcyBydW5uaW5n
LgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFt
IHtpbnR9IHByaW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBx
dWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqIEBw
YXJhbSB7VGFza30gdGFzayB0aGUgdGFzayB0byBhZGQKKyAqLworU2NoZWR1bGVyLnByb3RvdHlw
ZS5hZGRSdW5uaW5nVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKSB7
CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5hZGRUYXNrKGlkLCBwcmlvcml0eSwgcXVldWUsIHRh
c2spOworICAgICAgICB0aGlzLmN1cnJlbnRUY2Iuc2V0UnVubmluZygpOworICAgICAgICByYW5k
b21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorfTsKKworLyoqCisgKiBBZGQgdGhl
IHNwZWNpZmllZCB0YXNrIHRvIHRoaXMgc2NoZWR1bGVyLgorICogQHBhcmFtIHtpbnR9IGlkIHRo
ZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSB0YXNr
J3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0
byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqIEBwYXJhbSB7VGFza30gdGFzayB0aGUgdGFz
ayB0byBhZGQKKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5hZGRUYXNrID0gZnVuY3Rpb24gKGlk
LCBwcmlvcml0eSwgcXVldWUsIHRhc2spIHsKKyAgICB0cnkgeworICAgICAgICB0aGlzLmN1cnJl
bnRUY2IgPSBuZXcgVGFza0NvbnRyb2xCbG9jayh0aGlzLmxpc3QsIGlkLCBwcmlvcml0eSwgcXVl
dWUsIHRhc2spOworICAgICAgICB0aGlzLmxpc3QgPSB0aGlzLmN1cnJlbnRUY2I7CisgICAgICAg
IHRoaXMuYmxvY2tzW2lkXSA9IHRoaXMuY3VycmVudFRjYjsKKyAgICAgICAgcmFuZG9tRXhjZXB0
aW9uKCk7CisgICAgfSBjYXRjaChlKSB7IH0KK307CisKKy8qKgorICogRXhlY3V0ZSB0aGUgdGFz
a3MgbWFuYWdlZCBieSB0aGlzIHNjaGVkdWxlci4KKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5z
Y2hlZHVsZSA9IGZ1bmN0aW9uICgpIHsKKyAgICB0aGlzLmN1cnJlbnRUY2IgPSB0aGlzLmxpc3Q7
CisgICAgd2hpbGUgKHRoaXMuY3VycmVudFRjYiAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7Cisg
ICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGNiLmlzSGVsZE9yU3VzcGVuZGVkKCkpIHsKKyAg
ICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUY2IgPSB0aGlzLmN1cnJlbnRUY2IubGluazsKKyAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SWQgPSB0aGlz
LmN1cnJlbnRUY2IuaWQ7CisgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGNiID0gdGhpcy5j
dXJyZW50VGNiLnJ1bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmFuZG9tRXhjZXB0
aW9uKCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgfQorfTsKKworLyoqCisgKiBSZWxl
YXNlIGEgdGFzayB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2VkIGFuZCByZXR1cm4gdGhlIG5leHQg
YmxvY2sgdG8gcnVuLgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZCBvZiB0aGUgdGFzayB0byBz
dXNwZW5kCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uIChpZCkg
eworICAgIHRyeSB7CisgICAgICAgIHZhciB0Y2IgPSB0aGlzLmJsb2Nrc1tpZF07CisgICAgICAg
IGlmICh0Y2IgPT0gbnVsbCkgcmV0dXJuIHRjYjsKKyAgICAgICAgdGNiLm1hcmtBc05vdEhlbGQo
KTsKKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaChlKSB7IH0KKyAgICB0
cnkgeworICAgICAgICBpZiAodGNiLnByaW9yaXR5ID4gdGhpcy5jdXJyZW50VGNiLnByaW9yaXR5
KSB7CisgICAgICAgICAgICByZXR1cm4gdGNiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuY3VycmVudFRjYjsKKyAgICAgICAgfQorICAgIH0gY2F0Y2goZSkgeyB9
Cit9OworCisvKioKKyAqIEJsb2NrIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYW5kIHJl
dHVybiB0aGUgbmV4dCB0YXNrIGNvbnRyb2wgYmxvY2sKKyAqIHRvIHJ1bi4gIFRoZSBibG9ja2Vk
IHRhc2sgd2lsbCBub3QgYmUgbWFkZSBydW5uYWJsZSB1bnRpbCBpdCBpcyBleHBsaWNpdGx5Cisg
KiByZWxlYXNlZCwgZXZlbiBpZiBuZXcgd29yayBpcyBhZGRlZCB0byBpdC4KKyAqLworU2NoZWR1
bGVyLnByb3RvdHlwZS5ob2xkQ3VycmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgICB0cnkgeworICAg
ICAgICB0aGlzLmhvbGRDb3VudCsrOworICAgICAgICB0aGlzLmN1cnJlbnRUY2IubWFya0FzSGVs
ZCgpOworICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorICAg
IHJldHVybiB0aGlzLmN1cnJlbnRUY2IubGluazsKK307CisKKy8qKgorICogU3VzcGVuZCB0aGUg
Y3VycmVudGx5IGV4ZWN1dGluZyB0YXNrIGFuZCByZXR1cm4gdGhlIG5leHQgdGFzayBjb250cm9s
IGJsb2NrCisgKiB0byBydW4uICBJZiBuZXcgd29yayBpcyBhZGRlZCB0byB0aGUgc3VzcGVuZGVk
IHRhc2sgaXQgd2lsbCBiZSBtYWRlIHJ1bm5hYmxlLgorICovCitTY2hlZHVsZXIucHJvdG90eXBl
LnN1c3BlbmRDdXJyZW50ID0gZnVuY3Rpb24gKCkgeworICAgIHRyeSB7CisgICAgICAgIHRoaXMu
Y3VycmVudFRjYi5tYXJrQXNTdXNwZW5kZWQoKTsKKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7
CisgICAgfSBjYXRjaChlKSB7IH0KKyAgICB0cnkgeworICAgICAgICByZXR1cm4gdGhpcy5jdXJy
ZW50VGNiOworICAgIH0gY2F0Y2goZSkgeyB9Cit9OworCisvKioKKyAqIEFkZCB0aGUgc3BlY2lm
aWVkIHBhY2tldCB0byB0aGUgZW5kIG9mIHRoZSB3b3JrbGlzdCB1c2VkIGJ5IHRoZSB0YXNrCisg
KiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2tldCBhbmQgbWFrZSB0aGUgdGFzayBydW5uYWJsZSBp
ZiBpdCBpcyBjdXJyZW50bHkKKyAqIHN1c3BlbmRlZC4KKyAqIEBwYXJhbSB7UGFja2V0fSBwYWNr
ZXQgdGhlIHBhY2tldCB0byBhZGQKKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5xdWV1ZSA9IGZ1
bmN0aW9uIChwYWNrZXQpIHsKKyAgICB0cnkgeworICAgICAgICB2YXIgdCA9IHRoaXMuYmxvY2tz
W3BhY2tldC5pZF07CisgICAgICAgIGlmICh0ID09IG51bGwpIHJldHVybiB0OworICAgICAgICB0
aGlzLnF1ZXVlQ291bnQrKzsKKyAgICAgICAgcGFja2V0LmxpbmsgPSBudWxsOworICAgICAgICBy
YW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorICAgIHBhY2tldC5pZCA9IHRo
aXMuY3VycmVudElkOworICAgIHJldHVybiB0LmNoZWNrUHJpb3JpdHlBZGQodGhpcy5jdXJyZW50
VGNiLCBwYWNrZXQpOworfTsKKworLyoqCisgKiBBIHRhc2sgY29udHJvbCBibG9jayBtYW5hZ2Vz
IGEgdGFzayBhbmQgdGhlIHF1ZXVlIG9mIHdvcmsgcGFja2FnZXMgYXNzb2NpYXRlZAorICogd2l0
aCBpdC4KKyAqIEBwYXJhbSB7VGFza0NvbnRyb2xCbG9ja30gbGluayB0aGUgcHJlY2VkaW5nIGJs
b2NrIGluIHRoZSBsaW5rZWQgYmxvY2sgbGlzdAorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZCBv
ZiB0aGlzIGJsb2NrCisgKiBAcGFyYW0ge2ludH0gcHJpb3JpdHkgdGhlIHByaW9yaXR5IG9mIHRo
aXMgYmxvY2sKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2YgcGFja2FnZXMg
dG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0ge1Rhc2t9IHRhc2sgdGhlIHRh
c2sKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBUYXNrQ29udHJvbEJsb2NrKGxpbmss
IGlkLCBwcmlvcml0eSwgcXVldWUsIHRhc2spIHsKKyAgICB0cnkgeworICAgICAgICB0aGlzLmxp
bmsgPSBsaW5rOworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMucHJpb3JpdHkg
PSBwcmlvcml0eTsKKyAgICAgICAgdGhpcy5xdWV1ZSA9IHF1ZXVlOworICAgICAgICB0aGlzLnRh
c2sgPSB0YXNrOworICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsg
fQorICAgIHRyeSB7CisgICAgICAgIGlmIChxdWV1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0
aGlzLnN0YXRlID0gU1RBVEVfU1VTUEVOREVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRTsKKyAgICAgICAgfQorICAg
ICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorfQorCisvKioKKyAq
IFRoZSB0YXNrIGlzIHJ1bm5pbmcgYW5kIGlzIGN1cnJlbnRseSBzY2hlZHVsZWQuCisgKi8KK3Zh
ciBTVEFURV9SVU5OSU5HID0gMDsKKworLyoqCisgKiBUaGUgdGFzayBoYXMgcGFja2V0cyBsZWZ0
IHRvIHByb2Nlc3MuCisgKi8KK3ZhciBTVEFURV9SVU5OQUJMRSA9IDE7CisKKy8qKgorICogVGhl
IHRhc2sgaXMgbm90IGN1cnJlbnRseSBydW5uaW5nLiAgVGhlIHRhc2sgaXMgbm90IGJsb2NrZWQg
YXMgc3VjaCBhbmQgbWF5CisgKiBiZSBzdGFydGVkIGJ5IHRoZSBzY2hlZHVsZXIuCisgKi8KK3Zh
ciBTVEFURV9TVVNQRU5ERUQgPSAyOworCisvKioKKyAqIFRoZSB0YXNrIGlzIGJsb2NrZWQgYW5k
IGNhbm5vdCBiZSBydW4gdW50aWwgaXQgaXMgZXhwbGljaXRseSByZWxlYXNlZC4KKyAqLwordmFy
IFNUQVRFX0hFTEQgPSA0OworCit2YXIgU1RBVEVfU1VTUEVOREVEX1JVTk5BQkxFID0gU1RBVEVf
U1VTUEVOREVEIHwgU1RBVEVfUlVOTkFCTEU7Cit2YXIgU1RBVEVfTk9UX0hFTEQgPSB+U1RBVEVf
SEVMRDsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuc2V0UnVubmluZyA9IGZ1bmN0aW9u
ICgpIHsKKyAgICB0cnkgeworICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUlVOTklORzsKKyAg
ICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaChlKXt9Cit9OworCitUYXNrQ29u
dHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNOb3RIZWxkID0gZnVuY3Rpb24gKCkgeworICAgIHRy
eSB7CisgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlICYgU1RBVEVfTk9UX0hFTEQ7Cisg
ICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgIH0gY2F0Y2goZSkgeyB9Cit9OworCitUYXNr
Q29udHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNIZWxkID0gZnVuY3Rpb24gKCkgeworICAgIHRy
eSB7CisgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfSEVMRDsKKyAgICAg
ICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaChlKSB7IH0KK307CisKK1Rhc2tDb250
cm9sQmxvY2sucHJvdG90eXBlLmlzSGVsZE9yU3VzcGVuZGVkID0gZnVuY3Rpb24gKCkgeworICAg
IHRyeSB7CisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gKHRoaXMu
c3RhdGUgJiBTVEFURV9IRUxEKSAhPSAwIHx8ICh0aGlzLnN0YXRlID09IFNUQVRFX1NVU1BFTkRF
RCk7CisgICAgfSBjYXRjaChlKSB7IAorICAgICAgICByZXR1cm4gKHRoaXMuc3RhdGUgJiBTVEFU
RV9IRUxEKSAhPSAwIHx8ICh0aGlzLnN0YXRlID09IFNUQVRFX1NVU1BFTkRFRCk7CisgICAgfQor
fTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzU3VzcGVuZGVkID0gZnVuY3Rp
b24gKCkgeworICAgIHRyeSB7CisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICB0
aGlzLnN0YXRlID0gdGhpcy5zdGF0ZSB8IFNUQVRFX1NVU1BFTkRFRDsKKyAgICB9IGNhdGNoKGUp
IHsgCisgICAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfU1VTUEVOREVEOwor
ICAgIH0KK307CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc1J1bm5hYmxlID0g
ZnVuY3Rpb24gKCkgeworICAgIHRyeSB7CisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAg
ICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZSB8IFNUQVRFX1JVTk5BQkxFOworICAgIH0gY2F0
Y2goZSkgeworICAgICAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZSB8IFNUQVRFX1JVTk5BQkxF
OworICAgIH0KK307CisKKy8qKgorICogUnVucyB0aGlzIHRhc2ssIGlmIGl0IGlzIHJlYWR5IHRv
IGJlIHJ1biwgYW5kIHJldHVybnMgdGhlIG5leHQgdGFzayB0byBydW4uCisgKi8KK1Rhc2tDb250
cm9sQmxvY2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgcGFja2V0Owor
ICAgIHRyeSB7CisgICAgICAgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1NVU1BFTkRFRF9SVU5O
QUJMRSkgeworICAgICAgICAgICAgcGFja2V0ID0gdGhpcy5xdWV1ZTsKKyAgICAgICAgICAgIHRo
aXMucXVldWUgPSBwYWNrZXQubGluazsKKyAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlID09IG51
bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUlVOTklORzsKKyAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1JVTk5B
QkxFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFja2V0
ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNh
dGNoKGUpIHsgfQorICAgIHJldHVybiB0aGlzLnRhc2sucnVuKHBhY2tldCk7Cit9OworCisvKioK
KyAqIEFkZHMgYSBwYWNrZXQgdG8gdGhlIHdvcmtsaXN0IG9mIHRoaXMgYmxvY2sncyB0YXNrLCBt
YXJrcyB0aGlzIGFzIHJ1bm5hYmxlIGlmCisgKiBuZWNlc3NhcnksIGFuZCByZXR1cm5zIHRoZSBu
ZXh0IHJ1bm5hYmxlIG9iamVjdCB0byBydW4gKHRoZSBvbmUKKyAqIHdpdGggdGhlIGhpZ2hlc3Qg
cHJpb3JpdHkpLgorICovCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5jaGVja1ByaW9yaXR5
QWRkID0gZnVuY3Rpb24gKHRhc2ssIHBhY2tldCkgeworICAgIHRyeSB7CisgICAgICAgIGlmICh0
aGlzLnF1ZXVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucXVldWUgPSBwYWNrZXQ7Cisg
ICAgICAgICAgICB0aGlzLm1hcmtBc1J1bm5hYmxlKCk7CisgICAgICAgICAgICBpZiAodGhpcy5w
cmlvcml0eSA+IHRhc2sucHJpb3JpdHkpIHJldHVybiB0aGlzOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgdGhpcy5xdWV1ZSA9IHBhY2tldC5hZGRUbyh0aGlzLnF1ZXVlKTsKKyAgICAg
ICAgfQorCisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gdGFzazsK
KyAgICB9IGNhdGNoKGUpIHsgCisgICAgICAgIHJldHVybiB0YXNrOworICAgIH0KK307CisKK1Rh
c2tDb250cm9sQmxvY2sucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICAgIHRy
eSB7CisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gInRjYiB7ICIg
KyB0aGlzLnRhc2sgKyAiQCIgKyB0aGlzLnN0YXRlICsgIiB9IjsKKyAgICB9IGNhdGNoKGUpIHsK
KyAgICAgICAgcmV0dXJuICJ0Y2IgeyAiICsgdGhpcy50YXNrICsgIkAiICsgdGhpcy5zdGF0ZSAr
ICIgfSI7CisgICAgfQorfTsKKworLyoqCisgKiBBbiBpZGxlIHRhc2sgZG9lc24ndCBkbyBhbnkg
d29yayBpdHNlbGYgYnV0IGN5Y2xlcyBjb250cm9sIGJldHdlZW4gdGhlIHR3bworICogZGV2aWNl
IHRhc2tzLgorICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciB0aGUgc2NoZWR1bGVyIHRo
YXQgbWFuYWdlcyB0aGlzIHRhc2sKKyAqIEBwYXJhbSB7aW50fSB2MSBhIHNlZWQgdmFsdWUgdGhh
dCBjb250cm9scyBob3cgdGhlIGRldmljZSB0YXNrcyBhcmUgc2NoZWR1bGVkCisgKiBAcGFyYW0g
e2ludH0gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIHRhc2sgc2hvdWxkIGJlIHNjaGVk
dWxlZAorICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIElkbGVUYXNrKHNjaGVkdWxlciwg
djEsIGNvdW50KSB7CisgICAgdHJ5IHsKKyAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVs
ZXI7CisgICAgICAgIHRoaXMudjEgPSB2MTsKKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7Cisg
ICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICB9IGNhdGNoKGUpIHsKKyAgICAgICAgdGhp
cy5jb3VudCA9IGNvdW50OworICAgIH0KK30KKworSWRsZVRhc2sucHJvdG90eXBlLnJ1biA9IGZ1
bmN0aW9uIChwYWNrZXQpIHsKKyAgICB0cnkgeworICAgICAgICB0aGlzLmNvdW50LS07CisgICAg
ICAgIGlmICh0aGlzLmNvdW50ID09IDApIHJldHVybiB0aGlzLnNjaGVkdWxlci5ob2xkQ3VycmVu
dCgpOworICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorCisg
ICAgdHJ5IHsKKyAgICAgICAgaWYgKCh0aGlzLnYxICYgMSkgPT0gMCkgeworICAgICAgICAgICAg
dGhpcy52MSA9IHRoaXMudjEgPj4gMTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxl
ci5yZWxlYXNlKElEX0RFVklDRV9BKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRo
aXMudjEgPSAodGhpcy52MSA+PiAxKSBeIDB4RDAwODsKKyAgICAgICAgICAgIHJldHVybiB0aGlz
LnNjaGVkdWxlci5yZWxlYXNlKElEX0RFVklDRV9CKTsKKyAgICAgICAgfQorICAgIH0gY2F0Y2go
ZSkgeyB9Cit9OworCitJZGxlVGFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7
CisgICAgdHJ5IHsKKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiAi
SWRsZVRhc2siCisgICAgfSBjYXRjaChlKSB7CisgICAgICAgIHJldHVybiAiSWRsZVRhc2siCisg
ICAgfQorfTsKKworLyoqCisgKiBBIHRhc2sgdGhhdCBzdXNwZW5kcyBpdHNlbGYgYWZ0ZXIgZWFj
aCB0aW1lIGl0IGhhcyBiZWVuIHJ1biB0byBzaW11bGF0ZQorICogd2FpdGluZyBmb3IgZGF0YSBm
cm9tIGFuIGV4dGVybmFsIGRldmljZS4KKyAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIg
dGhlIHNjaGVkdWxlciB0aGF0IG1hbmFnZXMgdGhpcyB0YXNrCisgKiBAY29uc3RydWN0b3IKKyAq
LworZnVuY3Rpb24gRGV2aWNlVGFzayhzY2hlZHVsZXIpIHsKKyAgICB0cnkgeworICAgICAgICB0
aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKKyAgICAgICAgdGhpcy52MSA9IG51bGw7CisgICAg
ICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgIH0gY2F0Y2goZSkgeyB9Cit9CisKK0RldmljZVRh
c2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgICBpZiAocGFja2V0ID09
IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICh0aGlzLnYxID09IG51bGwp
IHJldHVybiB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgdmFy
IHYgPSB0aGlzLnYxOworICAgICAgICAgICAgdGhpcy52MSA9IG51bGw7CisgICAgICAgICAgICBy
YW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRjaChlKSB7IH0KKyAgICAgICAgcmV0dXJu
IHRoaXMuc2NoZWR1bGVyLnF1ZXVlKHYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyeSB7Cisg
ICAgICAgICAgICB0aGlzLnYxID0gcGFja2V0OworICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9u
KCk7CisgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxl
ci5ob2xkQ3VycmVudCgpOworICAgIH0KK307CisKK0RldmljZVRhc2sucHJvdG90eXBlLnRvU3Ry
aW5nID0gZnVuY3Rpb24gKCkgeworICAgIHRyeSB7CisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigp
OworICAgICAgICByZXR1cm4gIkRldmljZVRhc2siOworICAgIH0gY2F0Y2goZSkgeyB9Cit9Owor
CisvKioKKyAqIEEgdGFzayB0aGF0IG1hbmlwdWxhdGVzIHdvcmsgcGFja2V0cy4KKyAqIEBwYXJh
bSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgdGhlIHNjaGVkdWxlciB0aGF0IG1hbmFnZXMgdGhpcyB0
YXNrCisgKiBAcGFyYW0ge2ludH0gdjEgYSBzZWVkIHVzZWQgdG8gc3BlY2lmeSBob3cgd29yayBw
YWNrZXRzIGFyZSBtYW5pcHVsYXRlZAorICogQHBhcmFtIHtpbnR9IHYyIGFub3RoZXIgc2VlZCB1
c2VkIHRvIHNwZWNpZnkgaG93IHdvcmsgcGFja2V0cyBhcmUgbWFuaXB1bGF0ZWQKKyAqIEBjb25z
dHJ1Y3RvcgorICovCitmdW5jdGlvbiBXb3JrZXJUYXNrKHNjaGVkdWxlciwgdjEsIHYyKSB7Cisg
ICAgdHJ5IHsKKyAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CisgICAgICAgIHRo
aXMudjEgPSB2MTsKKyAgICAgICAgdGhpcy52MiA9IHYyOworICAgICAgICByYW5kb21FeGNlcHRp
b24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorfQorCitXb3JrZXJUYXNrLnByb3RvdHlwZS5ydW4g
PSBmdW5jdGlvbiAocGFja2V0KSB7CisgICAgaWYgKHBhY2tldCA9PSBudWxsKSB7CisgICAgICAg
IHJldHVybiB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGhpcy52MSA9PSBJRF9IQU5ETEVSX0EpIHsK
KyAgICAgICAgICAgICAgICB0aGlzLnYxID0gSURfSEFORExFUl9COworICAgICAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLnYxID0gSURfSEFORExFUl9BOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgcGFja2V0LmlkID0gdGhpcy52MTsKKyAgICAgICAgICAgIHBhY2tl
dC5hMSA9IDA7CisgICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICAgICAgfSBjYXRj
aChlKSB7IH0KKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBEQVRBX1NJWkU7IGkrKykgewor
ICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLnYyKys7CisgICAgICAgICAg
ICAgICAgaWYgKHRoaXMudjIgPiAyNikgdGhpcy52MiA9IDE7CisgICAgICAgICAgICAgICAgcGFj
a2V0LmEyW2ldID0gdGhpcy52MjsKKyAgICAgICAgICAgICAgICByYW5kb21FeGNlcHRpb24oKTsK
KyAgICAgICAgICAgIH0gY2F0Y2goZSkgeyB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRo
aXMuc2NoZWR1bGVyLnF1ZXVlKHBhY2tldCk7CisgICAgfQorfTsKKworV29ya2VyVGFzay5wcm90
b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJu
ICJXb3JrZXJUYXNrIjsKKyAgICB9IGNhdGNoKGUpIHsgfQorfTsKKworLyoqCisgKiBBIHRhc2sg
dGhhdCBtYW5pcHVsYXRlcyB3b3JrIHBhY2tldHMgYW5kIHRoZW4gc3VzcGVuZHMgaXRzZWxmLgor
ICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciB0aGUgc2NoZWR1bGVyIHRoYXQgbWFuYWdl
cyB0aGlzIHRhc2sKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBIYW5kbGVyVGFzayhz
Y2hlZHVsZXIpIHsKKyAgICB0cnkgeworICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxl
cjsKKyAgICAgICAgdGhpcy52MSA9IG51bGw7CisgICAgICAgIHRoaXMudjIgPSBudWxsOworICAg
ICAgICByYW5kb21FeGNlcHRpb24oKTsKKyAgICB9IGNhdGNoKGUpIHsgfQorfQorCitIYW5kbGVy
VGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHBhY2tldCkgeworICAgIHRyeSB7CisgICAg
ICAgIGlmIChwYWNrZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBhY2tldC5raW5kID09
IEtJTkRfV09SSykgeworICAgICAgICAgICAgICAgIHRoaXMudjEgPSBwYWNrZXQuYWRkVG8odGhp
cy52MSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMudjIgPSBw
YWNrZXQuYWRkVG8odGhpcy52Mik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAg
cmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaChlKSB7IH0KKworICAgIHRyeSB7CisgICAg
ICAgIGlmICh0aGlzLnYxICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMu
djEuYTE7CisgICAgICAgICAgICB2YXIgdjsKKyAgICAgICAgICAgIGlmIChjb3VudCA8IERBVEFf
U0laRSkgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLnYyICE9IG51bGwpIHsKKyAgICAgICAg
ICAgICAgICAgICAgdiA9IHRoaXMudjI7CisgICAgICAgICAgICAgICAgICAgIHRoaXMudjIgPSB0
aGlzLnYyLmxpbms7CisgICAgICAgICAgICAgICAgICAgIHYuYTEgPSB0aGlzLnYxLmEyW2NvdW50
XTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy52MS5hMSA9IGNvdW50ICsgMTsKKyAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnF1ZXVlKHYpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdiA9IHRoaXMudjE7
CisgICAgICAgICAgICAgICAgdGhpcy52MSA9IHRoaXMudjEubGluazsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucXVldWUodik7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgfSBjYXRjaChlKSB7IH0KKyAgICBy
ZXR1cm4gdGhpcy5zY2hlZHVsZXIuc3VzcGVuZEN1cnJlbnQoKTsKK307CisKK0hhbmRsZXJUYXNr
LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgICB0cnkgeworICAgICAgICBy
ZXR1cm4gIkhhbmRsZXJUYXNrIjsKKyAgICB9IGNhdGNoKGUpIHsgfQorfTsKKworLyogLS0tICoK
KyAqIFAgYSBjIGsgZSB0CisgKiAtLS0gKi8KKwordmFyIERBVEFfU0laRSA9IDQ7CisKKy8qKgor
ICogQSBzaW1wbGUgcGFja2FnZSBvZiBkYXRhIHRoYXQgaXMgbWFuaXB1bGF0ZWQgYnkgdGhlIHRh
c2tzLiAgVGhlIGV4YWN0IGxheW91dAorICogb2YgdGhlIHBheWxvYWQgZGF0YSBjYXJyaWVkIGJ5
IGEgcGFja2V0IGlzIG5vdCBpbXBvcnRhaW50LCBhbmQgbmVpdGhlciBpcyB0aGUKKyAqIG5hdHVy
ZSBvZiB0aGUgd29yayBwZXJmb3JtZWQgb24gcGFja2V0cyBieSB0aGUgdGFza3MuCisgKgorICog
QmVzaWRlcyBjYXJyeWluZyBkYXRhLCBwYWNrZXRzIGZvcm0gbGlua2VkIGxpc3RzIGFuZCBhcmUg
aGVuY2UgdXNlZCBib3RoIGFzCisgKiBkYXRhIGFuZCB3b3JrbGlzdHMuCisgKiBAcGFyYW0ge1Bh
Y2tldH0gbGluayB0aGUgdGFpbCBvZiB0aGUgbGlua2VkIGxpc3Qgb2YgcGFja2V0cworICogQHBh
cmFtIHtpbnR9IGlkIGFuIElEIGZvciB0aGlzIHBhY2tldAorICogQHBhcmFtIHtpbnR9IGtpbmQg
dGhlIHR5cGUgb2YgdGhpcyBwYWNrZXQKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBQ
YWNrZXQobGluaywgaWQsIGtpbmQpIHsKKyAgICB0cnkgeworICAgICAgICB0aGlzLmxpbmsgPSBs
aW5rOworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7Cisg
ICAgICAgIHRoaXMuYTEgPSAwOworICAgICAgICB0aGlzLmEyID0gbmV3IEFycmF5KERBVEFfU0la
RSk7CisgICAgICAgIHJhbmRvbUV4Y2VwdGlvbigpOworICAgIH0gY2F0Y2goZSkgeyB9Cit9CisK
Ky8qKgorICogQWRkIHRoaXMgcGFja2V0IHRvIHRoZSBlbmQgb2YgYSB3b3JrbGlzdCwgYW5kIHJl
dHVybiB0aGUgd29ya2xpc3QuCisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHdvcmtsaXN0
IHRvIGFkZCB0aGlzIHBhY2tldCB0bworICovCitQYWNrZXQucHJvdG90eXBlLmFkZFRvID0gZnVu
Y3Rpb24gKHF1ZXVlKSB7CisgICAgdGhpcy5saW5rID0gbnVsbDsKKyAgICBpZiAocXVldWUgPT0g
bnVsbCkgcmV0dXJuIHRoaXM7CisgICAgdmFyIHBlZWssIG5leHQgPSBxdWV1ZTsKKyAgICB3aGls
ZSAoKHBlZWsgPSBuZXh0LmxpbmspICE9IG51bGwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAg
ICAgIG5leHQgPSBwZWVrOworICAgICAgICAgICAgcmFuZG9tRXhjZXB0aW9uKCk7CisgICAgICAg
IH0gY2F0Y2goZSkgeyB9CisgICAgfQorICAgIG5leHQubGluayA9IHRoaXM7CisgICAgcmV0dXJu
IHF1ZXVlOworfTsKKworUGFja2V0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsK
KyAgICB0cnkgeworICAgICAgICByZXR1cm4gIlBhY2tldCI7CisgICAgfSBjYXRjaChlKSB7IH0K
K307CisKK2ZvciAobGV0IGkgPSAwOyBpIDwgMzUwOyArK2kpCisgIHJ1blJpY2hhcmRzKCk7Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>