<?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>46236</bug_id>
          
          <creation_ts>2010-09-21 18:32:29 -0700</creation_ts>
          <short_desc>[BREWMP] Port RenderTheme to BREWMP.</short_desc>
          <delta_ts>2012-07-26 05:20:30 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</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>33564</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Hyung Song">beergun</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>skyul</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>282715</commentid>
    <comment_count>0</comment_count>
    <who name="Hyung Song">beergun</who>
    <bug_when>2010-09-21 18:32:29 -0700</bug_when>
    <thetext>Enable drawing Button, Checkbox, Radio, MenuList for BREWMP.
Used Android implementations as reference.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282723</commentid>
    <comment_count>1</comment_count>
      <attachid>68322</attachid>
    <who name="Hyung Song">beergun</who>
    <bug_when>2010-09-21 18:45:14 -0700</bug_when>
    <thetext>Created attachment 68322
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282756</commentid>
    <comment_count>2</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2010-09-21 20:29:07 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; Created an attachment (id=68322) [details]
&gt; Patch

ImageBrew.cpp is already in bug 45873. Please remove the file from the patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282974</commentid>
    <comment_count>3</comment_count>
      <attachid>68380</attachid>
    <who name="Hyung Song">beergun</who>
    <bug_when>2010-09-22 09:25:37 -0700</bug_when>
    <thetext>Created attachment 68380
Patch. Removed ImageBrew.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282976</commentid>
    <comment_count>4</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2010-09-22 09:34:02 -0700</bug_when>
    <thetext>
(In reply to comment #3)
&gt; Created an attachment (id=68380) [details]
&gt; Patch. Removed ImageBrew.cpp

RenderThemeBrew::paintCombo is not implemented and used only by RenderThemeBrew::paintTextArea. Can you just get rid of RenderThemeBrew::paintCombo?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>282994</commentid>
    <comment_count>5</comment_count>
      <attachid>68384</attachid>
    <who name="Hyung Song">beergun</who>
    <bug_when>2010-09-22 09:53:39 -0700</bug_when>
    <thetext>Created attachment 68384
Patch. Removed paintCombo()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294791</commentid>
    <comment_count>6</comment_count>
      <attachid>68384</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-10-15 09:50:46 -0700</bug_when>
    <thetext>Comment on attachment 68384
Patch. Removed paintCombo()

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

ok otherwise.

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:3
&gt; + * Copyright (C) 2009 Company 100, Inc.

2010?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294793</commentid>
    <comment_count>7</comment_count>
      <attachid>70879</attachid>
    <who name="Hyung Song">beergun</who>
    <bug_when>2010-10-15 10:09:06 -0700</bug_when>
    <thetext>Created attachment 70879
patch

Fix year in license.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295163</commentid>
    <comment_count>8</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2010-10-16 14:24:34 -0700</bug_when>
    <thetext>ChangeLog is a bit misleading because this patch implements all of RenderTheme methods, not just button, checkbox, radio and menu list.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296195</commentid>
    <comment_count>9</comment_count>
      <attachid>68384</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-10-19 08:08:13 -0700</bug_when>
    <thetext>Comment on attachment 68384
Patch. Removed paintCombo()

Cleared Dimitri Glazkov&apos;s review+ from obsolete attachment 68384 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296415</commentid>
    <comment_count>10</comment_count>
      <attachid>70879</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-10-19 14:36:54 -0700</bug_when>
    <thetext>Comment on attachment 70879
patch

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

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:87
&gt; +    static RenderTheme* renderTheme = RenderThemeBrew::create().releaseRef();

I thought we used leakPtr here? or leakRef()?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:93
&gt; +    int i;

I would just put it in the fors.

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:106
&gt; +    for (i = 0; i &lt; ButtonStates; ++i) {
&gt; +        s_buttonImages[i] = Image::loadPlatformResource(s_buttonNames[i].name);
&gt; +        ASSERT(!s_buttonImages[i]-&gt;isNull());
&gt; +    }
&gt; +
&gt; +    for (i = 0; i &lt; OnOffStates; ++i) {
&gt; +        s_checkboxImages[i] = Image::loadPlatformResource(s_checkboxNames[i]);
&gt; +        ASSERT(!s_checkboxImages[i]-&gt;isNull());
&gt; +
&gt; +        s_radioImages[i] = Image::loadPlatformResource(s_radioNames[i]);
&gt; +        ASSERT(!s_radioImages[i]-&gt;isNull());
&gt; +    }

Seems this whole thing should be a separate loadResources function which the constructor calls, no?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:115
&gt; +    return Color(selectionColor);

is Color(RGBA32) explicit?  Or can you just return selectionColor?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:120
&gt; +    return Color(Color::transparent);

Don&apos;t need to construct it directly.

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:135
&gt; +    return Color(Color::transparent);

Same here.

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:146
&gt; +    return RenderTheme::baselinePosition(obj) - 5;

Constants are generally better with descriptive variable names.

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:233
&gt; +    ButtonState state;
&gt; +    if (isEnabled(obj)) {
&gt; +        if (isPressed(obj))
&gt; +            state = ButtonPressed;
&gt; +        else if (isFocused(obj))
&gt; +            state = ButtonFocused;
&gt; +        else
&gt; +            state = ButtonNormal;
&gt; +    } else
&gt; +        state = ButtonDisabled;

This feels like a helper function.  buttonStateForObject(obj)

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:299
&gt; +    const int listboxPadding = 5;

Nice.  Using a constant here helps readability, thank you.

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:326
&gt; +    if (lightness &gt; 1.0)
&gt; +        lightness = 1.0;
&gt; +    if (lightness &lt; 0.0)
&gt; +        lightness = 0.0;

Don&apos;t we already have a clamp function for this?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:338
&gt; +    SkColor baseColor = SkColorSetARGB(0xff, 0xdd, 0xdd, 0xdd);

Does this color not have a constant already?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:360
&gt; +    canvas-&gt;drawLine(rect.x() + 1, rect.y(), right - 1, rect.y(), paint);
&gt; +    canvas-&gt;drawLine(right - 1, rect.y() + 1, right - 1, bottom - 1, paint);
&gt; +    canvas-&gt;drawLine(rect.x() + 1, bottom - 1, right - 1, bottom - 1, paint);
&gt; +    canvas-&gt;drawLine(rect.x(), rect.y() + 1, rect.x(), bottom - 1, paint);

Why all the +1/-1?  That seems super error-prone.

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:376
&gt; +    shader-&gt;unref();

Do we not have a smart pointer for these?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:378
&gt; +    skrect.set(rect.x() + 1, rect.y() + 1, right - 1, bottom - 1);

Don&apos;t we have more descriptive ways of doing these +1/-1 bits?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:381
&gt; +    paint.setShader(0);

I assume the paint was smart enoguh to keep a ref to the shader?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:386
&gt; +    canvas-&gt;drawPoint(rect.x() + 1, rect.y() + 1, paint);
&gt; +    canvas-&gt;drawPoint(right - 2, rect.y() + 1, paint);
&gt; +    canvas-&gt;drawPoint(rect.x() + 1, bottom - 2, paint);
&gt; +    canvas-&gt;drawPoint(right - 2, bottom - 2, paint);

What&apos;s all the +1/-2 junk?

&gt; WebCore/platform/brew/RenderThemeBrew.cpp:457
&gt; +        &amp;&amp; style-&gt;hasAppearance()
&gt; +        &amp;&amp; style-&gt;appearance() != TextFieldPart
&gt; +        &amp;&amp; style-&gt;appearance() != SearchFieldPart
&gt; +        &amp;&amp; style-&gt;appearance() != TextAreaPart
&gt; +        &amp;&amp; style-&gt;appearance() != CheckboxPart
&gt; +        &amp;&amp; style-&gt;appearance() != RadioPart
&gt; +        &amp;&amp; style-&gt;appearance() != PushButtonPart
&gt; +        &amp;&amp; style-&gt;appearance() != SquareButtonPart
&gt; +        &amp;&amp; style-&gt;appearance() != ButtonPart
&gt; +        &amp;&amp; style-&gt;appearance() != ButtonBevelPart
&gt; +        &amp;&amp; style-&gt;appearance() != MenulistPart
&gt; +        &amp;&amp; style-&gt;appearance() != MenulistButtonPart;

Should this be a switch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>679188</commentid>
    <comment_count>11</comment_count>
    <who name="Kwang Yul Seo">skyul</who>
    <bug_when>2012-07-26 05:20:30 -0700</bug_when>
    <thetext>Brew MP port is no longer maintained.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68322</attachid>
            <date>2010-09-21 18:45:14 -0700</date>
            <delta_ts>2010-09-22 09:25:37 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>renderthemebrew.patch</filename>
            <type>text/plain</type>
            <size>26341</size>
            <attacher name="Hyung Song">beergun</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODAwNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTYgQEAKKzIwMTAtMDktMjEgIEh5dW5nIFNvbmcgIDxiZWVyZ3VuQGNvbXBhbnkx
MDAubmV0PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtCUkVXTVBdIFBvcnQgUmVuZGVyVGhlbWUgdG8gQlJFV01QLgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDYyMzYKKworICAgICAgICBFbmFibGUgQnV0
dG9uLCBDaGVja2JveCwgUmFkaW8gYW5kIE1lbnVMaXN0LgorCisgICAgICAgICogcGxhdGZvcm0v
YnJldy9SZW5kZXJUaGVtZUJyZXcuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmNhbnZh
c0Zyb21JbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6Y3JlYXRlKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lOjp0aGVtZUZvclBhZ2UpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpSZW5kZXJUaGVtZUJyZXcpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRD
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtSW5hY3Rp
dmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVCcmV3OjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3Jl
Z3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwbGF0Zm9y
bVRleHRTZWFyY2hIaWdobGlnaHRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUJyZXc6OmJhc2VsaW5lUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVC
cmV3OjphZGRJbnRyaW5zaWNNYXJnaW5zKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1l
QnJldzo6YWRqdXN0QnV0dG9uU3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVC
cmV3OjpwYWludENoZWNrYm94T3JSYWRpbyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50Q2hlY2tib3gpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3
OjpwYWludEJ1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBhaW50
UmFkaW8pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpzZXRDaGVja2JveFNp
emUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpzZXRSYWRpb1NpemUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RUZXh0RmllbGRTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBhaW50VGV4dEZpZWxkKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6YWRqdXN0VGV4dEFyZWFTdHlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBhaW50VGV4dEFyZWEpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRTZWFyY2hGaWVsZCk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdExpc3Rib3hTdHlsZSk6CisgICAg
ICAgIChXZWJDb3JlOjphZGp1c3RNZW51TGlzdFN0eWxlQ29tbW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lQnJldzo6YWRqdXN0TWVudUxpc3RTdHlsZSk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBhaW50Q29tYm8pOgorICAgICAgICAoV2ViQ29yZTo6YnJp
Z2h0ZW5Db2xvcik6CisgICAgICAgIChXZWJDb3JlOjpwYWludEJ1dHRvbkxpa2UpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwYWludE1lbnVMaXN0KToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lQnJldzo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBhaW50TWVudUxpc3RCdXR0b24pOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpzdXBwb3J0c0ZvY3VzUmluZyk6CisgICAg
ICAgICogcGxhdGZvcm0vYnJldy9SZW5kZXJUaGVtZUJyZXcuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnN1cHBvcnRzSG92ZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVCcmV3OjpzeXN0ZW1Gb250KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQnJldzo6bWluaW11bU1lbnVMaXN0U2l6ZSk6CisgICAgICAgICogcGxhdGZvcm0vYnJl
dy9TaGFyZWRCdWZmZXJCcmV3LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcjo6
Y3JlYXRlV2l0aENvbnRlbnRzT2ZGaWxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9i
cmV3L0ltYWdlQnJldy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2U6OmxvYWRQ
bGF0Zm9ybVJlc291cmNlKToKKwogMjAxMC0wOS0yMSAgQW5kcmV3IFdpbHNvbiAgPGF0d2lsc29u
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByNjc5ODIu
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3LmNwcAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYnJldy9SZW5kZXJUaGVtZUJyZXcuY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5k
cm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQ29tcGFueSAx
MDAsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJlbmRlclRo
ZW1lQnJldy5oIgorCisjaW5jbHVkZSAiQ29sb3IuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VTa2lhLmgi
CisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRT
a2lhLmgiCisjaW5jbHVkZSAiU2tDYW52YXMuaCIKKyNpbmNsdWRlICJTa0dyYWRpZW50U2hhZGVy
LmgiCisjaW5jbHVkZSAiU2tOaW5lUGF0Y2guaCIKKyNpbmNsdWRlICJTa1JlY3QuaCIKKyNpbmNs
dWRlICJTa1NoYWRlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0gQnV0dG9uU3Rh
dGUgeworICAgIEJ1dHRvbkRpc2FibGVkID0gMCwKKyAgICBCdXR0b25Ob3JtYWwsCisgICAgQnV0
dG9uRm9jdXNlZCwKKyAgICBCdXR0b25QcmVzc2VkLAorICAgIEJ1dHRvblN0YXRlcworfTsKKwor
c3RydWN0IFBhdGNoRGF0YSB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBpbnQ4X3QgbWFy
Z2luOworfTsKKworc3RhdGljIGNvbnN0IFBhdGNoRGF0YSBzX2J1dHRvbk5hbWVzW0J1dHRvblN0
YXRlc10gPSB7CisgICAgeyAiYnV0dG9uTm9ybWFsRGlzYWJsZWQiLCA5IH0sCisgICAgeyAiYnV0
dG9uTm9ybWFsIiwgOSB9LAorICAgIHsgImJ1dHRvblNlbGVjdGVkIiwgOSB9LAorICAgIHsgImJ1
dHRvblByZXNzZWQiLCA5IH0sCit9OworCitlbnVtIE9uT2ZmU3RhdGUgeyBPZmYgPSAwLCBPbiwg
T25PZmZTdGF0ZXMgfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIHNfY2hlY2tib3hOYW1lc1tPbk9m
ZlN0YXRlc10gPSB7ICJjaGVja2JveE9mZiIsICJjaGVja2JveE9uIiwgfTsKK3N0YXRpYyBjb25z
dCBjaGFyKiBzX3JhZGlvTmFtZXNbT25PZmZTdGF0ZXNdID0geyAicmFkaW9PZmYiLCAicmFkaW9P
biIsIH07CisKK3N0YXRpYyBSZWZQdHI8SW1hZ2U+IHNfYnV0dG9uSW1hZ2VzW0J1dHRvblN0YXRl
c107CitzdGF0aWMgUmVmUHRyPEltYWdlPiBzX2NoZWNrYm94SW1hZ2VzW09uT2ZmU3RhdGVzXTsK
K3N0YXRpYyBSZWZQdHI8SW1hZ2U+IHNfcmFkaW9JbWFnZXNbT25PZmZTdGF0ZXNdOworCitzdGF0
aWMgY29uc3QgaW50IHNfTWVudUxpc3RCdXR0b25TaXplID0gMjI7CisKK3N0YXRpYyBTa0NhbnZh
cyogY2FudmFzRnJvbUluZm8oY29uc3QgUGFpbnRJbmZvJiBpbmZvKQoreworICAgIHJldHVybiBp
bmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKTsKK30KKworUGFzc1JlZlB0
cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWVCcmV3OjpjcmVhdGUoKQoreworICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgUmVuZGVyVGhlbWVCcmV3KCkpOworfQorCitQYXNzUmVmUHRyPFJlbmRlclRo
ZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqKQoreworICAgIHN0YXRpYyBSZW5k
ZXJUaGVtZSogcmVuZGVyVGhlbWUgPSBSZW5kZXJUaGVtZUJyZXc6OmNyZWF0ZSgpLnJlbGVhc2VS
ZWYoKTsKKyAgICByZXR1cm4gcmVuZGVyVGhlbWU7Cit9CisKK1JlbmRlclRoZW1lQnJldzo6UmVu
ZGVyVGhlbWVCcmV3KCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBCdXR0
b25TdGF0ZXM7ICsraSkgeworICAgICAgICBzX2J1dHRvbkltYWdlc1tpXSA9IEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZShzX2J1dHRvbk5hbWVzW2ldLm5hbWUpOworICAgICAgICBBU1NFUlQo
IXNfYnV0dG9uSW1hZ2VzW2ldLT5pc051bGwoKSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsg
aSA8IE9uT2ZmU3RhdGVzOyArK2kpIHsKKyAgICAgICAgc19jaGVja2JveEltYWdlc1tpXSA9IElt
YWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShzX2NoZWNrYm94TmFtZXNbaV0pOworICAgICAgICBB
U1NFUlQoIXNfY2hlY2tib3hJbWFnZXNbaV0tPmlzTnVsbCgpKTsKKworICAgICAgICBzX3JhZGlv
SW1hZ2VzW2ldID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKHNfcmFkaW9OYW1lc1tpXSk7
CisgICAgICAgIEFTU0VSVCghc19yYWRpb0ltYWdlc1tpXS0+aXNOdWxsKCkpOworICAgIH0KK30K
KworQ29sb3IgUmVuZGVyVGhlbWVCcmV3OjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91
bmRDb2xvcigpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBpcyB0aGUgY29sb3Igb2Ygc2VsZWN0aW9u
IGluIGEgdGV4dGZpZWxkLiAgSXQgd2FzIG9idGFpbmVkIGJ5IGNoZWNraW5nCisgICAgLy8gdGhl
IGNvbG9yIG9mIHNlbGVjdGlvbiBpbiBUZXh0Vmlld3MgaW4gdGhlIHN5c3RlbS4KKyAgICBjb25z
dCBSR0JBMzIgc2VsZWN0aW9uQ29sb3IgPSBtYWtlUkdCKDI1NSwgMTQ2LCAwKTsKKworICAgIHJl
dHVybiBDb2xvcihzZWxlY3Rpb25Db2xvcik7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lQnJldzo6
cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAg
cmV0dXJuIENvbG9yKENvbG9yOjp0cmFuc3BhcmVudCk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1l
QnJldzo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAorewor
ICAgIHJldHVybiBDb2xvcjo6YmxhY2s7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lQnJldzo6cGxh
dGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0
dXJuIENvbG9yOjpibGFjazsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVCcmV3OjpwbGF0Zm9ybVRl
eHRTZWFyY2hIaWdobGlnaHRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIENvbG9yKENvbG9y
Ojp0cmFuc3BhcmVudCk7Cit9CisKK2ludCBSZW5kZXJUaGVtZUJyZXc6OmJhc2VsaW5lUG9zaXRp
b24oY29uc3QgUmVuZGVyT2JqZWN0KiBvYmopIGNvbnN0Cit7CisgICAgLy8gRnJvbSB0aGUgZGVz
Y3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbiBpbiBSZW5kZXJUaGVtZS5oOgorICAgIC8vIEEgbWV0
aG9kIHRvIG9idGFpbiB0aGUgYmFzZWxpbmUgcG9zaXRpb24gZm9yIGEgImxlYWYiIGNvbnRyb2wu
ICBUaGlzIHdpbGwgb25seSBiZSB1c2VkIGlmIGEgYmFzZWxpbmUKKyAgICAvLyBwb3NpdGlvbiBj
YW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBleGFtaW5pbmcgY2hpbGQgY29udGVudC4gQ2hlY2tib3hl
cyBhbmQgcmFkaW8gYnV0dG9ucyBhcmUgZXhhbXBsZXMgb2YKKyAgICAvLyBjb250cm9scyB0aGF0
IG5lZWQgdG8gZG8gdGhpcy4KKyAgICAvLworICAgIC8vIE91ciBjaGVja2JveGVzIGFuZCByYWRp
byBidXR0b25zIG5lZWQgdG8gYmUgb2Zmc2V0IHRvIGxpbmUgdXAgcHJvcGVybHkuCisgICAgcmV0
dXJuIFJlbmRlclRoZW1lOjpiYXNlbGluZVBvc2l0aW9uKG9iaikgLSA1OworfQorCit2b2lkIFJl
bmRlclRoZW1lQnJldzo6YWRkSW50cmluc2ljTWFyZ2lucyhSZW5kZXJTdHlsZSogc3R5bGUpIGNv
bnN0Cit7CisgICAgLy8gQ3V0IG91dCB0aGUgaW50cmluc2ljIG1hcmdpbnMgY29tcGxldGVseSBp
ZiB3ZSBlbmQgdXAgdXNpbmcgYSBzbWFsbCBmb250IHNpemUKKyAgICBpZiAoc3R5bGUtPmZvbnRT
aXplKCkgPCAxMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSW50cmluc2ljIG1hcmdpbiB2
YWx1ZS4KKyAgICBjb25zdCBpbnQgbSA9IDI7CisKKyAgICAvLyBGSVhNRTogVXNpbmcgd2lkdGgv
aGVpZ2h0IGFsb25lIGFuZCBub3QgYWxzbyBkZWFsaW5nIHdpdGggbWluLXdpZHRoL21heC13aWR0
aCBpcyBmbGF3ZWQuCisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkp
IHsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0KCkucXVpcmsoKSkKKyAgICAgICAgICAg
IHN0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChtLCBGaXhlZCkpOworICAgICAgICBpZiAoc3R5
bGUtPm1hcmdpblJpZ2h0KCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5S
aWdodChMZW5ndGgobSwgRml4ZWQpKTsKKyAgICB9CisKKyAgICBpZiAoc3R5bGUtPmhlaWdodCgp
LmlzQXV0bygpKSB7CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2luVG9wKCkucXVpcmsoKSkKKyAg
ICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Ub3AoTGVuZ3RoKG0sIEZpeGVkKSk7CisgICAgICAg
IGlmIChzdHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5z
ZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKG0sIEZpeGVkKSk7CisgICAgfQorfQorCit2b2lkIFJlbmRl
clRoZW1lQnJldzo6YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0
eWxlKiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVudCopIGNvbnN0Cit7CisgICAgLy8gQWRkIGEgY29u
c3RhbnQgYW1vdW50IG9mIHBhZGRpbmcgdG8gdGhlIHRleHRzaXplIHRvIGdldCB0aGUgZmluYWwg
aGVpZ2h0CisgICAgLy8gb2YgYnV0dG9ucywgc28gdGhhdCBvdXIgYnV0dG9uIGltYWdlcyBhcmUg
bGFyZ2UgZW5vdWdoIHRvIHByb3Blcmx5IGZpdAorICAgIC8vIHRoZSB0ZXh0LgorICAgIGNvbnN0
IGludCBidXR0b25QYWRkaW5nID0gMTg7CisKKyAgICAvLyBQYWRkaW5nIGNvZGUgaXMgdGFrZW4g
ZnJvbSBSZW5kZXJUaGVtZVNhZmFyaS5jcHAKKyAgICAvLyBJdCBtYWtlcyBzdXJlIHdlIGhhdmUg
ZW5vdWdoIHNwYWNlIGZvciB0aGUgYnV0dG9uIHRleHQuCisgICAgY29uc3QgaW50IHBhZGRpbmcg
PSA4OworCisgICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkp
OworICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7Cisg
ICAgc3R5bGUtPnNldE1pbkhlaWdodChMZW5ndGgoc3R5bGUtPmZvbnRTaXplKCkgKyBidXR0b25Q
YWRkaW5nLCBGaXhlZCkpOworfQorCisKK2Jvb2wgUmVuZGVyVGhlbWVCcmV3OjpwYWludENoZWNr
Ym94T3JSYWRpbyhSZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25z
dCBJbnRSZWN0JiByZWN0LCBib29sIGlzUmFkaW8pCit7CisgICAgYm9vbCBjaGVja2VkID0gaXND
aGVja2VkKG9iaik7CisKKyAgICBTa1JlY3QgcihyZWN0KTsKKyAgICBTa1BhaW50IHBhaW50Owor
ICAgIHBhaW50LnNldEZsYWdzKFNrUGFpbnQ6OmtGaWx0ZXJCaXRtYXBfRmxhZyk7CisKKyAgICBp
ZiAoIWlzRW5hYmxlZChvYmopKQorICAgICAgICBwYWludC5zZXRBbHBoYSgweDgwKTsKKworICAg
IFNrQml0bWFwJiBiaXRtYXAgPSBpc1JhZGlvID8gKnNfcmFkaW9JbWFnZXNbY2hlY2tlZF0tPm5h
dGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkgOiAqc19jaGVja2JveEltYWdlc1tjaGVja2VkXS0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKworICAgIFNrU2NhbGFyIHdpZHRoID0gcmVj
dC53aWR0aCgpOworICAgIFNrU2NhbGFyIHNjYWxlID0gU2tTY2FsYXJEaXYod2lkdGgsIFNrSW50
VG9TY2FsYXIoYml0bWFwLndpZHRoKCkpKTsKKyAgICBTa0NhbnZhcyogY2FudmFzID0gY2FudmFz
RnJvbUluZm8oaW5mbyk7CisgICAgaW50IHNhdmVTY2FsZUNvdW50ID0gY2FudmFzLT5zYXZlKCk7
CisgICAgY2FudmFzLT50cmFuc2xhdGUoci5mTGVmdCwgci5mVG9wKTsKKyAgICBjYW52YXMtPnNj
YWxlKHNjYWxlLCBzY2FsZSk7CisKKyAgICBjYW52YXMtPmRyYXdCaXRtYXAoYml0bWFwLCAwLCAw
LCAmcGFpbnQpOworICAgIGNhbnZhcy0+cmVzdG9yZVRvQ291bnQoc2F2ZVNjYWxlQ291bnQpOwor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQnJldzo6cGFpbnRDaGVj
a2JveChSZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRS
ZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludENoZWNrYm94T3JSYWRpbyhvYmosIGluZm8s
IHJlY3QsIGZhbHNlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnBhaW50QnV0dG9uKFJl
bmRlck9iamVjdCogb2JqLCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgQnV0dG9uU3RhdGUgc3RhdGU7CisgICAgaWYgKGlzRW5hYmxlZChvYmopKSB7
CisgICAgICAgIGlmIChpc1ByZXNzZWQob2JqKSkKKyAgICAgICAgICAgIHN0YXRlID0gQnV0dG9u
UHJlc3NlZDsKKyAgICAgICAgZWxzZSBpZiAoaXNGb2N1c2VkKG9iaikpCisgICAgICAgICAgICBz
dGF0ZSA9IEJ1dHRvbkZvY3VzZWQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0YXRlID0g
QnV0dG9uTm9ybWFsOworICAgIH0gZWxzZQorICAgICAgICBzdGF0ZSA9IEJ1dHRvbkRpc2FibGVk
OworCisgICAgU2tSZWN0IGJvdW5kcyhyZWN0KTsKKyAgICBpbnQgbWFyZ2luVmFsdWUgPSBzX2J1
dHRvbk5hbWVzW3N0YXRlXS5tYXJnaW47CisgICAgU2tJUmVjdCBtYXJnaW47CisgICAgbWFyZ2lu
LnNldChtYXJnaW5WYWx1ZSwgbWFyZ2luVmFsdWUsIG1hcmdpblZhbHVlLCBtYXJnaW5WYWx1ZSk7
CisgICAgU2tCaXRtYXAmIGJpdG1hcCA9ICpzX2J1dHRvbkltYWdlc1tzdGF0ZV0tPm5hdGl2ZUlt
YWdlRm9yQ3VycmVudEZyYW1lKCk7CisKKyAgICBTa05pbmVQYXRjaDo6RHJhd05pbmUoY2FudmFz
RnJvbUluZm8oaW5mbyksIGJvdW5kcywgYml0bWFwLCBtYXJnaW4pOworCisgICAgLy8gV2UgYWx3
YXlzIHJldHVybiBmYWxzZSBzbyB3ZSBkbyBub3QgcmVxdWVzdCB0byBiZSByZWRyYXduLgorICAg
IHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnBhaW50UmFkaW8oUmVu
ZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVj
dCkKK3sKKyAgICByZXR1cm4gcGFpbnRDaGVja2JveE9yUmFkaW8ob2JqLCBpbmZvLCByZWN0LCB0
cnVlKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OnNldENoZWNrYm94U2l6ZShSZW5kZXJT
dHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aCgxOSwgRml4
ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aCgxOSwgRml4ZWQpKTsKK30KKwordm9p
ZCBSZW5kZXJUaGVtZUJyZXc6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
Cit7CisgICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBjaGVja2JveGVzLgorICAgIHNldENoZWNr
Ym94U2l6ZShzdHlsZSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCcmV3OjphZGp1c3RUZXh0Rmll
bGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBXZWJDb3JlOjpF
bGVtZW50KikgY29uc3QKK3sKKyAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKK30KKwor
Ym9vbCBSZW5kZXJUaGVtZUJyZXc6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKQoreworICAgIHJldHVybiB0cnVlOworfQorCit2
b2lkIFJlbmRlclRoZW1lQnJldzo6YWRqdXN0VGV4dEFyZWFTdHlsZShDU1NTdHlsZVNlbGVjdG9y
KiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBXZWJDb3JlOjpFbGVtZW50KikgY29uc3QKK3sKKyAgICBh
ZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnBh
aW50VGV4dEFyZWEoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAob2JqLT5pc01lbnVMaXN0KCkpCisgICAgICAg
IHJldHVybiBwYWludENvbWJvKG9iaiwgaW5mbywgcmVjdCk7CisgICAgcmV0dXJuIHRydWU7Cit9
CisKK3ZvaWQgUmVuZGVyVGhlbWVCcmV3OjphZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxl
U2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIGFk
ZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOworfQorCitib29sIFJlbmRlclRoZW1lQnJldzo6cGFp
bnRTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRS
ZWN0JikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFk
anVzdExpc3Rib3hTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBF
bGVtZW50KikgY29uc3QKK3sKKyAgICAvLyBBZGQgcGFkZGluZyB0byB0aGUgZm9udFNpemUgb2Yg
TGlzdEJveGVzIHRvIGdldCB0aGVpciBtYXhpbXVtIHNpemVzLgorICAgIC8vIExpc3Rib3hlcyBv
ZnRlbiBoYXZlIGEgc3BlY2lmaWVkIHNpemUuICBTaW5jZSB3ZSBjaGFuZ2UgdGhlbSBpbnRvCisg
ICAgLy8gZHJvcGRvd25zLCB3ZSB3YW50IGEgbXVjaCBzbWFsbGVyIGhlaWdodCwgd2hpY2ggZW5j
b21wYXNzZXMgdGhlIHRleHQuCisgICAgY29uc3QgaW50IGxpc3Rib3hQYWRkaW5nID0gNTsKKwor
ICAgIHN0eWxlLT5zZXRNYXhIZWlnaHQoTGVuZ3RoKHN0eWxlLT5mb250U2l6ZSgpICsgbGlzdGJv
eFBhZGRpbmcsIEZpeGVkKSk7CisgICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7Cit9CisK
K3N0YXRpYyB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGVDb21tb24oUmVuZGVyU3R5bGUqIHN0eWxl
LCBFbGVtZW50KiBlKQoreworICAgIC8vIENvZGUgY29waWVkIGZyb20gUmVuZGVyVGhlbWVNYWMu
bW0KKyAgICAvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIHRleHQgc2hvd3MgdXAgb24gb3VyIHRyZWF0
bWVudAorICAgIGJvb2wgaXNFbmFibGVkID0gZS0+aXNFbmFibGVkRm9ybUNvbnRyb2woKTsKKyAg
ICBzdHlsZS0+c2V0Q29sb3IoaXNFbmFibGVkID8gQ29sb3I6OmJsYWNrIDogQ29sb3I6OmRhcmtH
cmF5KTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChzX01lbnVMaXN0QnV0dG9u
U2l6ZSwgRml4ZWQpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkanVzdE1lbnVMaXN0
U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkg
Y29uc3QKK3sKKyAgICBhZGp1c3RNZW51TGlzdFN0eWxlQ29tbW9uKHN0eWxlLCBlKTsKKyAgICBh
ZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnBh
aW50Q29tYm8oUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK3N0YXRpYyBTa0NvbG9yIGJyaWdodGVuQ29sb3IoZG91YmxlIGh1ZSwgZG91Ymxl
IHNhdHVyYXRpb24sIGRvdWJsZSBsaWdodG5lc3MsIGZsb2F0IGJyaWdodGVuQW1vdW50KQorewor
ICAgIGxpZ2h0bmVzcyArPSBicmlnaHRlbkFtb3VudDsKKyAgICBpZiAobGlnaHRuZXNzID4gMS4w
KQorICAgICAgICBsaWdodG5lc3MgPSAxLjA7CisgICAgaWYgKGxpZ2h0bmVzcyA8IDAuMCkKKyAg
ICAgICAgbGlnaHRuZXNzID0gMC4wOworCisgICAgcmV0dXJuIG1ha2VSR0JBRnJvbUhTTEEoaHVl
LCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIDEuMCk7Cit9CisKK3N0YXRpYyB2b2lkIHBhaW50QnV0
dG9uTGlrZShSZW5kZXJUaGVtZSogdGhlbWUsIFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJ
bmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIFNrQ2FudmFzKiBjb25zdCBjYW52
YXMgPSBpLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jYW52YXMoKTsKKyAgICBTa1BhaW50
IHBhaW50OworICAgIFNrUmVjdCBza3JlY3Q7CisgICAgY29uc3QgaW50IHJpZ2h0ID0gcmVjdC54
KCkgKyByZWN0LndpZHRoKCk7CisgICAgY29uc3QgaW50IGJvdHRvbSA9IHJlY3QueSgpICsgcmVj
dC5oZWlnaHQoKTsKKyAgICBTa0NvbG9yIGJhc2VDb2xvciA9IFNrQ29sb3JTZXRBUkdCKDB4ZmYs
IDB4ZGQsIDB4ZGQsIDB4ZGQpOworICAgIGlmIChvLT5oYXNCYWNrZ3JvdW5kKCkpCisgICAgICAg
IGJhc2VDb2xvciA9IG8tPnN0eWxlKCktPnZpc2l0ZWREZXBlbmRlbnRDb2xvcihDU1NQcm9wZXJ0
eUJhY2tncm91bmRDb2xvcikucmdiKCk7CisgICAgZG91YmxlIGh1ZSwgc2F0dXJhdGlvbiwgbGln
aHRuZXNzOworICAgIENvbG9yKGJhc2VDb2xvcikuZ2V0SFNMKGh1ZSwgc2F0dXJhdGlvbiwgbGln
aHRuZXNzKTsKKyAgICAvLyBPdXIgc3RhbmRhcmQgZ3JhZGllbnQgaXMgZnJvbSAweGRkIHRvIDB4
ZjguIFRoaXMgaXMgdGhlIGFtb3VudCBvZgorICAgIC8vIGluY3JlYXNlZCBsaWdodG5lc3N1bWlu
YW5jZSBiZXR3ZWVuIHRob3NlIHZhbGlnaHRuZXNzdWVzLgorICAgIFNrQ29sb3IgbGlnaHRDb2xv
cihicmlnaHRlbkNvbG9yKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCAwLjEwNSkpOworCisg
ICAgLy8gSWYgdGhlIGJ1dHRvbiBpcyB0b28gc21hbGwsIGZhbGxiYWNrIHRvIGRyYXdpbmcgYSBz
aW5nbGUsIHNvbGlkIGNvbG9yCisgICAgaWYgKHJlY3Qud2lkdGgoKSA8IDUgfHwgcmVjdC5oZWln
aHQoKSA8IDUpIHsKKyAgICAgICAgcGFpbnQuc2V0Q29sb3IoYmFzZUNvbG9yKTsKKyAgICAgICAg
c2tyZWN0LnNldChyZWN0LngoKSwgcmVjdC55KCksIHJpZ2h0LCBib3R0b20pOworICAgICAgICBj
YW52YXMtPmRyYXdSZWN0KHNrcmVjdCwgcGFpbnQpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgY29uc3QgaW50IGJvcmRlckFscGhhID0gdGhlbWUtPmlzSG92ZXJlZChvKSA/IDB4ODAg
OiAweDU1OworICAgIHBhaW50LnNldEFSR0IoYm9yZGVyQWxwaGEsIDAsIDAsIDApOworICAgIGNh
bnZhcy0+ZHJhd0xpbmUocmVjdC54KCkgKyAxLCByZWN0LnkoKSwgcmlnaHQgLSAxLCByZWN0Lnko
KSwgcGFpbnQpOworICAgIGNhbnZhcy0+ZHJhd0xpbmUocmlnaHQgLSAxLCByZWN0LnkoKSArIDEs
IHJpZ2h0IC0gMSwgYm90dG9tIC0gMSwgcGFpbnQpOworICAgIGNhbnZhcy0+ZHJhd0xpbmUocmVj
dC54KCkgKyAxLCBib3R0b20gLSAxLCByaWdodCAtIDEsIGJvdHRvbSAtIDEsIHBhaW50KTsKKyAg
ICBjYW52YXMtPmRyYXdMaW5lKHJlY3QueCgpLCByZWN0LnkoKSArIDEsIHJlY3QueCgpLCBib3R0
b20gLSAxLCBwYWludCk7CisKKyAgICBwYWludC5zZXRDb2xvcihTS19Db2xvckJMQUNLKTsKKyAg
ICBTa1BvaW50IHBbMl07CisgICAgY29uc3QgaW50IGxpZ2h0RW5kID0gdGhlbWUtPmlzUHJlc3Nl
ZChvKSA/IDEgOiAwOworICAgIGNvbnN0IGludCBkYXJrRW5kID0gIWxpZ2h0RW5kOworICAgIHBb
bGlnaHRFbmRdLnNldChTa0ludFRvU2NhbGFyKHJlY3QueCgpKSwgU2tJbnRUb1NjYWxhcihyZWN0
LnkoKSkpOworICAgIHBbZGFya0VuZF0uc2V0KFNrSW50VG9TY2FsYXIocmVjdC54KCkpLCBTa0lu
dFRvU2NhbGFyKGJvdHRvbSAtIDEpKTsKKyAgICBTa0NvbG9yIGNvbG9yc1syXTsKKyAgICBjb2xv
cnNbMF0gPSBsaWdodENvbG9yOworICAgIGNvbG9yc1sxXSA9IGJhc2VDb2xvcjsKKworICAgIFNr
U2hhZGVyKiBzaGFkZXIgPSBTa0dyYWRpZW50U2hhZGVyOjpDcmVhdGVMaW5lYXIoCisgICAgICAg
IHAsIGNvbG9ycywgMCwgMiwgU2tTaGFkZXI6OmtDbGFtcF9UaWxlTW9kZSwgMCk7CisgICAgcGFp
bnQuc2V0U3R5bGUoU2tQYWludDo6a0ZpbGxfU3R5bGUpOworICAgIHBhaW50LnNldFNoYWRlcihz
aGFkZXIpOworICAgIHNoYWRlci0+dW5yZWYoKTsKKworICAgIHNrcmVjdC5zZXQocmVjdC54KCkg
KyAxLCByZWN0LnkoKSArIDEsIHJpZ2h0IC0gMSwgYm90dG9tIC0gMSk7CisgICAgY2FudmFzLT5k
cmF3UmVjdChza3JlY3QsIHBhaW50KTsKKworICAgIHBhaW50LnNldFNoYWRlcigwKTsKKyAgICBw
YWludC5zZXRDb2xvcihicmlnaHRlbkNvbG9yKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCAt
MC4wNTg4KSk7CisgICAgY2FudmFzLT5kcmF3UG9pbnQocmVjdC54KCkgKyAxLCByZWN0LnkoKSAr
IDEsIHBhaW50KTsKKyAgICBjYW52YXMtPmRyYXdQb2ludChyaWdodCAtIDIsIHJlY3QueSgpICsg
MSwgcGFpbnQpOworICAgIGNhbnZhcy0+ZHJhd1BvaW50KHJlY3QueCgpICsgMSwgYm90dG9tIC0g
MiwgcGFpbnQpOworICAgIGNhbnZhcy0+ZHJhd1BvaW50KHJpZ2h0IC0gMiwgYm90dG9tIC0gMiwg
cGFpbnQpOworfQorCitib29sIFJlbmRlclRoZW1lQnJldzo6cGFpbnRNZW51TGlzdChSZW5kZXJP
YmplY3QqIG9iaiwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIFNrQ2FudmFzKiBjb25zdCBjYW52YXMgPSBpbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29u
dGV4dCgpLT5jYW52YXMoKTsKKyAgICBjb25zdCBpbnQgcmlnaHQgPSByZWN0LngoKSArIHJlY3Qu
d2lkdGgoKTsKKyAgICBjb25zdCBpbnQgbWlkZGxlID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgp
IC8gMjsKKworICAgIHBhaW50QnV0dG9uTGlrZSh0aGlzLCBvYmosIGluZm8sIHJlY3QpOworCisg
ICAgLy8gRklYTUU6IFdyYXAgYXJyb3cgd2l0aCBhIGJveAorICAgIEludFJlY3QgcmVjdEJ1dHRv
bihyZWN0LngoKSArIHJlY3Qud2lkdGgoKSAtIChzX01lbnVMaXN0QnV0dG9uU2l6ZSAtIDQpLCBy
ZWN0LnkoKSArIDIsIHNfTWVudUxpc3RCdXR0b25TaXplIC0gNiwgcmVjdC5oZWlnaHQoKSAtIDQp
OworICAgIHBhaW50QnV0dG9uTGlrZSh0aGlzLCBvYmosIGluZm8sIHJlY3RCdXR0b24pOworCisg
ICAgU2tQYWludCBwYWludDsKKyAgICBwYWludC5zZXRDb2xvcihTS19Db2xvckJMQUNLKTsKKyAg
ICBwYWludC5zZXRBbnRpQWxpYXModHJ1ZSk7CisgICAgcGFpbnQuc2V0U3R5bGUoU2tQYWludDo6
a0ZpbGxfU3R5bGUpOworCisgICAgaW50IGFycm93WFBvc2l0aW9uID0gKG9iai0+c3R5bGUoKS0+
ZGlyZWN0aW9uKCkgPT0gUlRMKSA/IHJlY3QueCgpICsgNyA6IHJpZ2h0IC0gMTM7CisgICAgU2tQ
YXRoIHBhdGg7CisgICAgcGF0aC5tb3ZlVG8oYXJyb3dYUG9zaXRpb24sIG1pZGRsZSAtIDMpOwor
ICAgIHBhdGguckxpbmVUbyg2LCAwKTsKKyAgICBwYXRoLnJMaW5lVG8oLTMsIDYpOworICAgIHBh
dGguY2xvc2UoKTsKKyAgICBjYW52YXMtPmRyYXdQYXRoKHBhdGgsIHBhaW50KTsKKworICAgIHJl
dHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkanVzdE1lbnVMaXN0QnV0
dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwg
RWxlbWVudCogZSkgY29uc3QKK3sKKyAgICAvLyBDb3BpZWQgZnJvbSBSZW5kZXJUaGVtZVNhZmFy
aS4KKyAgICBjb25zdCBmbG9hdCBiYXNlRm9udFNpemUgPSAxMS4wZjsKKyAgICBjb25zdCBpbnQg
YmFzZUJvcmRlclJhZGl1cyA9IDU7CisgICAgZmxvYXQgZm9udFNjYWxlID0gc3R5bGUtPmZvbnRT
aXplKCkgLyBiYXNlRm9udFNpemU7CisKKyAgICBzdHlsZS0+cmVzZXRQYWRkaW5nKCk7CisgICAg
c3R5bGUtPnNldEJvcmRlclJhZGl1cyhJbnRTaXplKGludChiYXNlQm9yZGVyUmFkaXVzICsgZm9u
dFNjYWxlIC0gMSksIGludChiYXNlQm9yZGVyUmFkaXVzICsgZm9udFNjYWxlIC0gMSkpKTsgLy8g
RklYTUU6IFJvdW5kIHVwPworCisgICAgY29uc3QgaW50IG1pbkhlaWdodCA9IDE1OworICAgIHN0
eWxlLT5zZXRNaW5IZWlnaHQoTGVuZ3RoKG1pbkhlaWdodCwgRml4ZWQpKTsKKworICAgIHN0eWxl
LT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKyAgICAv
LyBGb3VuZCB0aGVzZSBwYWRkaW5nIG51bWJlcnMgYnkgdHJpYWwgYW5kIGVycm9yLgorICAgIGNv
bnN0IGludCBwYWRkaW5nID0gNDsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1RvcChMZW5ndGgocGFk
ZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ0xlZnQoTGVuZ3RoKHBhZGRpbmcs
IEZpeGVkKSk7CisgICAgYWRqdXN0TWVudUxpc3RTdHlsZUNvbW1vbihzdHlsZSwgZSk7Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVCcmV3OjpwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCog
b2JqLCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpIAoreworICAg
IHJldHVybiBwYWludE1lbnVMaXN0KG9iaiwgaW5mbywgcmVjdCk7Cit9CisKK2Jvb2wgUmVuZGVy
VGhlbWVCcmV3OjpzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUpIGNv
bnN0Cit7CisgICAgcmV0dXJuIHN0eWxlLT5vcGFjaXR5KCkgPiAwCisgICAgICAgICYmIHN0eWxl
LT5oYXNBcHBlYXJhbmNlKCkKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBUZXh0
RmllbGRQYXJ0CisgICAgICAgICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gU2VhcmNoRmllbGRQ
YXJ0CisgICAgICAgICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gVGV4dEFyZWFQYXJ0CisgICAg
ICAgICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gQ2hlY2tib3hQYXJ0CisgICAgICAgICYmIHN0
eWxlLT5hcHBlYXJhbmNlKCkgIT0gUmFkaW9QYXJ0CisgICAgICAgICYmIHN0eWxlLT5hcHBlYXJh
bmNlKCkgIT0gUHVzaEJ1dHRvblBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAh
PSBTcXVhcmVCdXR0b25QYXJ0CisgICAgICAgICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gQnV0
dG9uUGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IEJ1dHRvbkJldmVsUGFy
dAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IE1lbnVsaXN0UGFydAorICAgICAg
ICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IE1lbnVsaXN0QnV0dG9uUGFydDsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9icmV3L1JlbmRlclRo
ZW1lQnJldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYnJldy9SZW5kZXJUaGVt
ZUJyZXcuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYnJldy9SZW5kZXJUaGVt
ZUJyZXcuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAy
MDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgQ29tcGFueSAxMDAsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZW5kZXJUaGVtZUJyZXdfaAor
I2RlZmluZSBSZW5kZXJUaGVtZUJyZXdfaAorCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJUaGVtZUJyZXcgOiBwdWJsaWMgUmVu
ZGVyVGhlbWUgeworcHJpdmF0ZToKKyAgICBSZW5kZXJUaGVtZUJyZXcoKTsKKworcHVibGljOgor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBjcmVhdGUoKTsKKworICAgIHZpcnR1
YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSopIGNvbnN0OworICAg
IC8vIEEgbWV0aG9kIGFza2luZyBpZiB0aGUgdGhlbWUncyBjb250cm9scyBhY3R1YWxseSBjYXJl
IGFib3V0IHJlZHJhd2luZyB3aGVuIGhvdmVyZWQuCisgICAgdmlydHVhbCBib29sIHN1cHBvcnRz
SG92ZXIoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdCB7IHJldHVybiBzdHlsZS0+YWZm
ZWN0ZWRCeUhvdmVyUnVsZXMoKTsgfQorCisgICAgdmlydHVhbCBpbnQgYmFzZWxpbmVQb3NpdGlv
bihjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKKworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZv
cm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICB2aXJ0dWFsIENv
bG9yIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAg
ICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkg
Y29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdy
b3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybVRleHRTZWFyY2hI
aWdobGlnaHRDb2xvcigpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHN5c3RlbUZvbnQoaW50
LCBXZWJDb3JlOjpGb250RGVzY3JpcHRpb24mKSBjb25zdCB7fQorCisgICAgdmlydHVhbCBpbnQg
bWluaW11bU1lbnVMaXN0U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0IHsgcmV0dXJuIDA7IH0KKwor
cHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94T3JSYWRpbyhSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0JiwgYm9vbCBpc1JhZGlvKTsK
KworICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJlbmRlck9iamVjdCosIGNvbnN0IFBh
aW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2hlY2tib3hT
aXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRSYWRpbyhS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmly
dHVhbCB2b2lkIHNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworCisgICAgdmlydHVh
bCB2b2lkIGFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSos
IFdlYkNvcmU6OkVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24o
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAg
dmlydHVhbCB2b2lkIGFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5k
ZXJTdHlsZSosIFdlYkNvcmU6OkVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxl
Y3RvciosIFJlbmRlclN0eWxlKiwgV2ViQ29yZTo6RWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1
YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKKworICAgIGJvb2wgcGFpbnRDb21ibyhSZW5kZXJPYmplY3QqLCBjb25z
dCBQYWludEluZm8mLCAgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVz
dExpc3Rib3hTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50Kikg
Y29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxl
Y3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBw
YWludE1lbnVMaXN0KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJl
Y3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0
eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8m
LCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRT
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7Cisg
ICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCitwcml2YXRlOgorICAgIHZvaWQgYWRkSW50cmlu
c2ljTWFyZ2lucyhSZW5kZXJTdHlsZSopIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgLy8gUmVuZGVyVGhlbWVCcmV3X2gKKwpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9icmV3L0ltYWdlQnJldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9icmV3L0ltYWdlQnJldy5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JyZXcvSW1hZ2VCcmV3LmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgQ29tcGFueSAxMDAsIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1h
Z2UuaCIKKworI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiRmlsZVN5c3RlbS5o
IgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorCisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmlu
Zy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK1Bhc3NSZWZQdHI8SW1hZ2U+IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShjb25z
dCBjaGFyICpuYW1lKQoreworICAgIFN0cmluZyByZXNvdXJjZVBhdGggPSBob21lRGlyZWN0b3J5
UGF0aCgpICsgU3RyaW5nOjpmb3JtYXQoInJlcy8lcy5wbmciLCBuYW1lKTsKKworICAgIFJlZlB0
cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlV2l0aENvbnRlbnRz
T2ZGaWxlKHJlc291cmNlUGF0aC51dGY4KCkuZGF0YSgpKTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAg
ICAgICAgcmV0dXJuIEltYWdlOjpudWxsSW1hZ2UoKTsKKworICAgIFJlZlB0cjxJbWFnZT4gaW1h
Z2UgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKCk7CisgICAgaW1hZ2UtPnNldERhdGEoYnVmZmVyLCB0
cnVlKTsKKyAgICByZXR1cm4gaW1hZ2UucmVsZWFzZSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68380</attachid>
            <date>2010-09-22 09:25:37 -0700</date>
            <delta_ts>2010-09-22 09:53:39 -0700</delta_ts>
            <desc>Patch. Removed ImageBrew.cpp</desc>
            <filename>renderthemebrew.patch</filename>
            <type>text/plain</type>
            <size>23598</size>
            <attacher name="Hyung Song">beergun</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODA0OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTIgQEAKKzIwMTAtMDktMjIgIEh5dW5nIFNvbmcgIDxiZWVyZ3VuQGNvbXBhbnkx
MDAubmV0PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtCUkVXTVBdIFBvcnQgUmVuZGVyVGhlbWUgdG8gQlJFV01QLgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDYyMzYKKworICAgICAgICBFbmFibGUgZHJh
d2luZyBCdXR0b24sIENoZWNrYm94LCBSYWRpbywgTWVudUxpc3QuCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9icmV3L1JlbmRlclRoZW1lQnJldy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
Y2FudmFzRnJvbUluZm8pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpjcmVh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OlJlbmRlclRoZW1lQnJldyk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1J
bmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlv
bkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBs
YXRmb3JtVGV4dFNlYXJjaEhpZ2hsaWdodENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQnJldzo6YmFzZWxpbmVQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUJyZXc6OmFkZEludHJpbnNpY01hcmdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVCcmV3OjphZGp1c3RCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUJyZXc6OnBhaW50Q2hlY2tib3hPclJhZGlvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQnJldzo6cGFpbnRDaGVja2JveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6
cGFpbnRSYWRpbyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnNldENoZWNr
Ym94U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnNldFJhZGlvU2l6
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFRleHRGaWVsZFN0
eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRUZXh0RmllbGQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RUZXh0QXJlYVN0eWxl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRUZXh0QXJlYSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwYWludFNlYXJjaEZpZWxkKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6YWRqdXN0TGlzdGJveFN0eWxlKToK
KyAgICAgICAgKFdlYkNvcmU6OmFkanVzdE1lbnVMaXN0U3R5bGVDb21tb24pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RNZW51TGlzdFN0eWxlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRDb21ibyk6CisgICAgICAgIChXZWJDb3Jl
OjpicmlnaHRlbkNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OnBhaW50QnV0dG9uTGlrZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBhaW50TWVudUxpc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRNZW51TGlzdEJ1dHRvbik6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnN1cHBvcnRzRm9jdXNSaW5nKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9icmV3L1JlbmRlclRoZW1lQnJldy5oOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6c3VwcG9ydHNIb3Zlcik6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnN5c3RlbUZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVCcmV3OjptaW5pbXVtTWVudUxpc3RTaXplKToKKwogMjAxMC0wOS0yMiAgUGF2
ZWwgUG9kaXZpbG92ICA8cG9kaXZpbG92QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdl
ZCBieSBQYXZlbCBGZWxkbWFuLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9icmV3L1JlbmRlclRo
ZW1lQnJldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9icmV3L1JlbmRlclRo
ZW1lQnJldy5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVy
VGhlbWVCcmV3LmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NjggQEAKKy8qCisgKiBDb3B5
cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICogQ29weXJpZ2h0
IChDKSAyMDA5IENvbXBhbnkgMTAwLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJSZW5kZXJUaGVtZUJyZXcuaCIKKworI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5j
bHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUg
Ik5hdGl2ZUltYWdlU2tpYS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVk
ZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVk
ZSAiU2tHcmFkaWVudFNoYWRlci5oIgorI2luY2x1ZGUgIlNrTmluZVBhdGNoLmgiCisjaW5jbHVk
ZSAiU2tSZWN0LmgiCisjaW5jbHVkZSAiU2tTaGFkZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitlbnVtIEJ1dHRvblN0YXRlIHsKKyAgICBCdXR0b25EaXNhYmxlZCA9IDAsCisgICAgQnV0
dG9uTm9ybWFsLAorICAgIEJ1dHRvbkZvY3VzZWQsCisgICAgQnV0dG9uUHJlc3NlZCwKKyAgICBC
dXR0b25TdGF0ZXMKK307CisKK3N0cnVjdCBQYXRjaERhdGEgeworICAgIGNvbnN0IGNoYXIqIG5h
bWU7CisgICAgaW50OF90IG1hcmdpbjsKK307CisKK3N0YXRpYyBjb25zdCBQYXRjaERhdGEgc19i
dXR0b25OYW1lc1tCdXR0b25TdGF0ZXNdID0geworICAgIHsgImJ1dHRvbk5vcm1hbERpc2FibGVk
IiwgOSB9LAorICAgIHsgImJ1dHRvbk5vcm1hbCIsIDkgfSwKKyAgICB7ICJidXR0b25TZWxlY3Rl
ZCIsIDkgfSwKKyAgICB7ICJidXR0b25QcmVzc2VkIiwgOSB9LAorfTsKKworZW51bSBPbk9mZlN0
YXRlIHsgT2ZmID0gMCwgT24sIE9uT2ZmU3RhdGVzIH07CisKK3N0YXRpYyBjb25zdCBjaGFyKiBz
X2NoZWNrYm94TmFtZXNbT25PZmZTdGF0ZXNdID0geyAiY2hlY2tib3hPZmYiLCAiY2hlY2tib3hP
biIsIH07CitzdGF0aWMgY29uc3QgY2hhciogc19yYWRpb05hbWVzW09uT2ZmU3RhdGVzXSA9IHsg
InJhZGlvT2ZmIiwgInJhZGlvT24iLCB9OworCitzdGF0aWMgUmVmUHRyPEltYWdlPiBzX2J1dHRv
bkltYWdlc1tCdXR0b25TdGF0ZXNdOworc3RhdGljIFJlZlB0cjxJbWFnZT4gc19jaGVja2JveElt
YWdlc1tPbk9mZlN0YXRlc107CitzdGF0aWMgUmVmUHRyPEltYWdlPiBzX3JhZGlvSW1hZ2VzW09u
T2ZmU3RhdGVzXTsKKworc3RhdGljIGNvbnN0IGludCBzX01lbnVMaXN0QnV0dG9uU2l6ZSA9IDIy
OworCitzdGF0aWMgU2tDYW52YXMqIGNhbnZhc0Zyb21JbmZvKGNvbnN0IFBhaW50SW5mbyYgaW5m
bykKK3sKKyAgICByZXR1cm4gaW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFz
KCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lQnJldzo6Y3JlYXRl
KCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlbmRlclRoZW1lQnJldygpKTsKK30KKwor
UGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZShQYWdlKikK
K3sKKyAgICBzdGF0aWMgUmVuZGVyVGhlbWUqIHJlbmRlclRoZW1lID0gUmVuZGVyVGhlbWVCcmV3
OjpjcmVhdGUoKS5yZWxlYXNlUmVmKCk7CisgICAgcmV0dXJuIHJlbmRlclRoZW1lOworfQorCitS
ZW5kZXJUaGVtZUJyZXc6OlJlbmRlclRoZW1lQnJldygpCit7CisgICAgaW50IGk7CisKKyAgICBm
b3IgKGkgPSAwOyBpIDwgQnV0dG9uU3RhdGVzOyArK2kpIHsKKyAgICAgICAgc19idXR0b25JbWFn
ZXNbaV0gPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2Uoc19idXR0b25OYW1lc1tpXS5uYW1l
KTsKKyAgICAgICAgQVNTRVJUKCFzX2J1dHRvbkltYWdlc1tpXS0+aXNOdWxsKCkpOworICAgIH0K
KworICAgIGZvciAoaSA9IDA7IGkgPCBPbk9mZlN0YXRlczsgKytpKSB7CisgICAgICAgIHNfY2hl
Y2tib3hJbWFnZXNbaV0gPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2Uoc19jaGVja2JveE5h
bWVzW2ldKTsKKyAgICAgICAgQVNTRVJUKCFzX2NoZWNrYm94SW1hZ2VzW2ldLT5pc051bGwoKSk7
CisKKyAgICAgICAgc19yYWRpb0ltYWdlc1tpXSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJj
ZShzX3JhZGlvTmFtZXNbaV0pOworICAgICAgICBBU1NFUlQoIXNfcmFkaW9JbWFnZXNbaV0tPmlz
TnVsbCgpKTsKKyAgICB9Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1BY3Rp
dmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIC8vIFRoaXMgaXMgdGhl
IGNvbG9yIG9mIHNlbGVjdGlvbiBpbiBhIHRleHRmaWVsZC4gIEl0IHdhcyBvYnRhaW5lZCBieSBj
aGVja2luZworICAgIC8vIHRoZSBjb2xvciBvZiBzZWxlY3Rpb24gaW4gVGV4dFZpZXdzIGluIHRo
ZSBzeXN0ZW0uCisgICAgY29uc3QgUkdCQTMyIHNlbGVjdGlvbkNvbG9yID0gbWFrZVJHQigyNTUs
IDE0NiwgMCk7CisKKyAgICByZXR1cm4gQ29sb3Ioc2VsZWN0aW9uQ29sb3IpOworfQorCitDb2xv
ciBSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29s
b3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcihDb2xvcjo6dHJhbnNwYXJlbnQpOworfQor
CitDb2xvciBSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3Vu
ZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3I6OmJsYWNrOworfQorCitDb2xvciBS
ZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3Io
KSBjb25zdAoreworICAgIHJldHVybiBDb2xvcjo6YmxhY2s7Cit9CisKK0NvbG9yIFJlbmRlclRo
ZW1lQnJldzo6cGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29sb3IoKSBjb25zdAoreworICAg
IHJldHVybiBDb2xvcihDb2xvcjo6dHJhbnNwYXJlbnQpOworfQorCitpbnQgUmVuZGVyVGhlbWVC
cmV3OjpiYXNlbGluZVBvc2l0aW9uKGNvbnN0IFJlbmRlck9iamVjdCogb2JqKSBjb25zdAorewor
ICAgIC8vIEZyb20gdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rpb24gaW4gUmVuZGVyVGhl
bWUuaDoKKyAgICAvLyBBIG1ldGhvZCB0byBvYnRhaW4gdGhlIGJhc2VsaW5lIHBvc2l0aW9uIGZv
ciBhICJsZWFmIiBjb250cm9sLiAgVGhpcyB3aWxsIG9ubHkgYmUgdXNlZCBpZiBhIGJhc2VsaW5l
CisgICAgLy8gcG9zaXRpb24gY2Fubm90IGJlIGRldGVybWluZWQgYnkgZXhhbWluaW5nIGNoaWxk
IGNvbnRlbnQuIENoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgYXJlIGV4YW1wbGVzIG9mCisg
ICAgLy8gY29udHJvbHMgdGhhdCBuZWVkIHRvIGRvIHRoaXMuCisgICAgLy8KKyAgICAvLyBPdXIg
Y2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBuZWVkIHRvIGJlIG9mZnNldCB0byBsaW5lIHVw
IHByb3Blcmx5LgorICAgIHJldHVybiBSZW5kZXJUaGVtZTo6YmFzZWxpbmVQb3NpdGlvbihvYmop
IC0gNTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkZEludHJpbnNpY01hcmdpbnMoUmVu
ZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIEN1dCBvdXQgdGhlIGludHJpbnNpYyBt
YXJnaW5zIGNvbXBsZXRlbHkgaWYgd2UgZW5kIHVwIHVzaW5nIGEgc21hbGwgZm9udCBzaXplCisg
ICAgaWYgKHN0eWxlLT5mb250U2l6ZSgpIDwgMTEpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IEludHJpbnNpYyBtYXJnaW4gdmFsdWUuCisgICAgY29uc3QgaW50IG0gPSAyOworCisgICAgLy8g
RklYTUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFsc28gZGVhbGluZyB3aXRo
IG1pbi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgorICAgIGlmIChzdHlsZS0+d2lkdGgoKS5p
c0ludHJpbnNpY09yQXV0bygpKSB7CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2luTGVmdCgpLnF1
aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luTGVmdChMZW5ndGgobSwgRml4ZWQp
KTsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJrKCkpCisgICAgICAgICAg
ICBzdHlsZS0+c2V0TWFyZ2luUmlnaHQoTGVuZ3RoKG0sIEZpeGVkKSk7CisgICAgfQorCisgICAg
aWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgeworICAgICAgICBpZiAoc3R5bGUtPm1hcmdp
blRvcCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luVG9wKExlbmd0aCht
LCBGaXhlZCkpOworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRvbSgpLnF1aXJrKCkpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aChtLCBGaXhlZCkpOworICAg
IH0KK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxl
U2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIFdlYkNvcmU6OkVsZW1lbnQqKSBjb25zdAor
eworICAgIC8vIEFkZCBhIGNvbnN0YW50IGFtb3VudCBvZiBwYWRkaW5nIHRvIHRoZSB0ZXh0c2l6
ZSB0byBnZXQgdGhlIGZpbmFsIGhlaWdodAorICAgIC8vIG9mIGJ1dHRvbnMsIHNvIHRoYXQgb3Vy
IGJ1dHRvbiBpbWFnZXMgYXJlIGxhcmdlIGVub3VnaCB0byBwcm9wZXJseSBmaXQKKyAgICAvLyB0
aGUgdGV4dC4KKyAgICBjb25zdCBpbnQgYnV0dG9uUGFkZGluZyA9IDE4OworCisgICAgLy8gUGFk
ZGluZyBjb2RlIGlzIHRha2VuIGZyb20gUmVuZGVyVGhlbWVTYWZhcmkuY3BwCisgICAgLy8gSXQg
bWFrZXMgc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGJ1dHRvbiB0ZXh0LgorICAg
IGNvbnN0IGludCBwYWRkaW5nID0gODsKKworICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5n
dGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChw
YWRkaW5nLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRNaW5IZWlnaHQoTGVuZ3RoKHN0eWxlLT5m
b250U2l6ZSgpICsgYnV0dG9uUGFkZGluZywgRml4ZWQpKTsKK30KKworCitib29sIFJlbmRlclRo
ZW1lQnJldzo6cGFpbnRDaGVja2JveE9yUmFkaW8oUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBh
aW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBpc1JhZGlvKQoreworICAg
IGJvb2wgY2hlY2tlZCA9IGlzQ2hlY2tlZChvYmopOworCisgICAgU2tSZWN0IHIocmVjdCk7Cisg
ICAgU2tQYWludCBwYWludDsKKyAgICBwYWludC5zZXRGbGFncyhTa1BhaW50OjprRmlsdGVyQml0
bWFwX0ZsYWcpOworCisgICAgaWYgKCFpc0VuYWJsZWQob2JqKSkKKyAgICAgICAgcGFpbnQuc2V0
QWxwaGEoMHg4MCk7CisKKyAgICBTa0JpdG1hcCYgYml0bWFwID0gaXNSYWRpbyA/ICpzX3JhZGlv
SW1hZ2VzW2NoZWNrZWRdLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpIDogKnNfY2hlY2ti
b3hJbWFnZXNbY2hlY2tlZF0tPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisKKyAgICBT
a1NjYWxhciB3aWR0aCA9IHJlY3Qud2lkdGgoKTsKKyAgICBTa1NjYWxhciBzY2FsZSA9IFNrU2Nh
bGFyRGl2KHdpZHRoLCBTa0ludFRvU2NhbGFyKGJpdG1hcC53aWR0aCgpKSk7CisgICAgU2tDYW52
YXMqIGNhbnZhcyA9IGNhbnZhc0Zyb21JbmZvKGluZm8pOworICAgIGludCBzYXZlU2NhbGVDb3Vu
dCA9IGNhbnZhcy0+c2F2ZSgpOworICAgIGNhbnZhcy0+dHJhbnNsYXRlKHIuZkxlZnQsIHIuZlRv
cCk7CisgICAgY2FudmFzLT5zY2FsZShzY2FsZSwgc2NhbGUpOworCisgICAgY2FudmFzLT5kcmF3
Qml0bWFwKGJpdG1hcCwgMCwgMCwgJnBhaW50KTsKKyAgICBjYW52YXMtPnJlc3RvcmVUb0NvdW50
KHNhdmVTY2FsZUNvdW50KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZUJyZXc6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50SW5m
byYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRDaGVja2Jv
eE9yUmFkaW8ob2JqLCBpbmZvLCByZWN0LCBmYWxzZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVC
cmV3OjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgUGFpbnRJbmZvJiBpbmZv
LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEJ1dHRvblN0YXRlIHN0YXRlOworICAgIGlm
IChpc0VuYWJsZWQob2JqKSkgeworICAgICAgICBpZiAoaXNQcmVzc2VkKG9iaikpCisgICAgICAg
ICAgICBzdGF0ZSA9IEJ1dHRvblByZXNzZWQ7CisgICAgICAgIGVsc2UgaWYgKGlzRm9jdXNlZChv
YmopKQorICAgICAgICAgICAgc3RhdGUgPSBCdXR0b25Gb2N1c2VkOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBzdGF0ZSA9IEJ1dHRvbk5vcm1hbDsKKyAgICB9IGVsc2UKKyAgICAgICAgc3Rh
dGUgPSBCdXR0b25EaXNhYmxlZDsKKworICAgIFNrUmVjdCBib3VuZHMocmVjdCk7CisgICAgaW50
IG1hcmdpblZhbHVlID0gc19idXR0b25OYW1lc1tzdGF0ZV0ubWFyZ2luOworICAgIFNrSVJlY3Qg
bWFyZ2luOworICAgIG1hcmdpbi5zZXQobWFyZ2luVmFsdWUsIG1hcmdpblZhbHVlLCBtYXJnaW5W
YWx1ZSwgbWFyZ2luVmFsdWUpOworICAgIFNrQml0bWFwJiBiaXRtYXAgPSAqc19idXR0b25JbWFn
ZXNbc3RhdGVdLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworCisgICAgU2tOaW5lUGF0
Y2g6OkRyYXdOaW5lKGNhbnZhc0Zyb21JbmZvKGluZm8pLCBib3VuZHMsIGJpdG1hcCwgbWFyZ2lu
KTsKKworICAgIC8vIFdlIGFsd2F5cyByZXR1cm4gZmFsc2Ugc28gd2UgZG8gbm90IHJlcXVlc3Qg
dG8gYmUgcmVkcmF3bi4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVC
cmV3OjpwYWludFJhZGlvKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBQYWludEluZm8mIGluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50Q2hlY2tib3hPclJhZGlv
KG9iaiwgaW5mbywgcmVjdCwgdHJ1ZSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCcmV3OjpzZXRD
aGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIHN0eWxlLT5zZXRX
aWR0aChMZW5ndGgoMTksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoMTks
IEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCcmV3OjpzZXRSYWRpb1NpemUoUmVuZGVy
U3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2hlY2ti
b3hlcy4KKyAgICBzZXRDaGVja2JveFNpemUoc3R5bGUpOworfQorCit2b2lkIFJlbmRlclRoZW1l
QnJldzo6YWRqdXN0VGV4dEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxl
KiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVudCopIGNvbnN0Cit7CisgICAgYWRkSW50cmluc2ljTWFy
Z2lucyhzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCcmV3OjpwYWludFRleHRGaWVsZChS
ZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0JikKK3sKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFRleHRBcmVhU3R5
bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVu
dCopIGNvbnN0Cit7CisgICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7Cit9CisKK2Jvb2wg
UmVuZGVyVGhlbWVCcmV3OjpwYWludFRleHRBcmVhKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBQ
YWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKG9iai0+aXNN
ZW51TGlzdCgpKQorICAgICAgICByZXR1cm4gcGFpbnRDb21ibyhvYmosIGluZm8sIHJlY3QpOwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclRoZW1lQnJldzo6YWRqdXN0U2VhcmNo
RmllbGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KikgY29uc3QKK3sKKyAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKK30KKworYm9vbCBS
ZW5kZXJUaGVtZUJyZXc6OnBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RMaXN0Ym94U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJl
bmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7CisgICAgLy8gQWRkIHBhZGRpbmcg
dG8gdGhlIGZvbnRTaXplIG9mIExpc3RCb3hlcyB0byBnZXQgdGhlaXIgbWF4aW11bSBzaXplcy4K
KyAgICAvLyBMaXN0Ym94ZXMgb2Z0ZW4gaGF2ZSBhIHNwZWNpZmllZCBzaXplLiAgU2luY2Ugd2Ug
Y2hhbmdlIHRoZW0gaW50bworICAgIC8vIGRyb3Bkb3ducywgd2Ugd2FudCBhIG11Y2ggc21hbGxl
ciBoZWlnaHQsIHdoaWNoIGVuY29tcGFzc2VzIHRoZSB0ZXh0LgorICAgIGNvbnN0IGludCBsaXN0
Ym94UGFkZGluZyA9IDU7CisKKyAgICBzdHlsZS0+c2V0TWF4SGVpZ2h0KExlbmd0aChzdHlsZS0+
Zm9udFNpemUoKSArIGxpc3Rib3hQYWRkaW5nLCBGaXhlZCkpOworICAgIGFkZEludHJpbnNpY01h
cmdpbnMoc3R5bGUpOworfQorCitzdGF0aWMgdm9pZCBhZGp1c3RNZW51TGlzdFN0eWxlQ29tbW9u
KFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkKK3sKKyAgICAvLyBDb2RlIGNvcGllZCBm
cm9tIFJlbmRlclRoZW1lTWFjLm1tCisgICAgLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSB0ZXh0IHNo
b3dzIHVwIG9uIG91ciB0cmVhdG1lbnQKKyAgICBib29sIGlzRW5hYmxlZCA9IGUtPmlzRW5hYmxl
ZEZvcm1Db250cm9sKCk7CisgICAgc3R5bGUtPnNldENvbG9yKGlzRW5hYmxlZCA/IENvbG9yOjpi
bGFjayA6IENvbG9yOjpkYXJrR3JheSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdSaWdodChMZW5n
dGgoc19NZW51TGlzdEJ1dHRvblNpemUsIEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVC
cmV3OjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSog
c3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgYWRqdXN0TWVudUxpc3RTdHlsZUNvbW1v
bihzdHlsZSwgZSk7CisgICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7Cit9CisKK2Jvb2wg
UmVuZGVyVGhlbWVCcmV3OjpwYWludENvbWJvKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBQYWlu
dEluZm8mIGluZm8sICBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgU2tDb2xvciBicmlnaHRlbkNvbG9y
KGRvdWJsZSBodWUsIGRvdWJsZSBzYXR1cmF0aW9uLCBkb3VibGUgbGlnaHRuZXNzLCBmbG9hdCBi
cmlnaHRlbkFtb3VudCkKK3sKKyAgICBsaWdodG5lc3MgKz0gYnJpZ2h0ZW5BbW91bnQ7CisgICAg
aWYgKGxpZ2h0bmVzcyA+IDEuMCkKKyAgICAgICAgbGlnaHRuZXNzID0gMS4wOworICAgIGlmIChs
aWdodG5lc3MgPCAwLjApCisgICAgICAgIGxpZ2h0bmVzcyA9IDAuMDsKKworICAgIHJldHVybiBt
YWtlUkdCQUZyb21IU0xBKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCAxLjApOworfQorCitz
dGF0aWMgdm9pZCBwYWludEJ1dHRvbkxpa2UoUmVuZGVyVGhlbWUqIHRoZW1lLCBSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBT
a0NhbnZhcyogY29uc3QgY2FudmFzID0gaS5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2Fu
dmFzKCk7CisgICAgU2tQYWludCBwYWludDsKKyAgICBTa1JlY3Qgc2tyZWN0OworICAgIGNvbnN0
IGludCByaWdodCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIGNvbnN0IGludCBib3R0
b20gPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCk7CisgICAgU2tDb2xvciBiYXNlQ29sb3IgPSBT
a0NvbG9yU2V0QVJHQigweGZmLCAweGRkLCAweGRkLCAweGRkKTsKKyAgICBpZiAoby0+aGFzQmFj
a2dyb3VuZCgpKQorICAgICAgICBiYXNlQ29sb3IgPSBvLT5zdHlsZSgpLT52aXNpdGVkRGVwZW5k
ZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpLnJnYigpOworICAgIGRvdWJsZSBo
dWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzczsKKyAgICBDb2xvcihiYXNlQ29sb3IpLmdldEhTTCho
dWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcyk7CisgICAgLy8gT3VyIHN0YW5kYXJkIGdyYWRpZW50
IGlzIGZyb20gMHhkZCB0byAweGY4LiBUaGlzIGlzIHRoZSBhbW91bnQgb2YKKyAgICAvLyBpbmNy
ZWFzZWQgbGlnaHRuZXNzdW1pbmFuY2UgYmV0d2VlbiB0aG9zZSB2YWxpZ2h0bmVzc3Vlcy4KKyAg
ICBTa0NvbG9yIGxpZ2h0Q29sb3IoYnJpZ2h0ZW5Db2xvcihodWUsIHNhdHVyYXRpb24sIGxpZ2h0
bmVzcywgMC4xMDUpKTsKKworICAgIC8vIElmIHRoZSBidXR0b24gaXMgdG9vIHNtYWxsLCBmYWxs
YmFjayB0byBkcmF3aW5nIGEgc2luZ2xlLCBzb2xpZCBjb2xvcgorICAgIGlmIChyZWN0LndpZHRo
KCkgPCA1IHx8IHJlY3QuaGVpZ2h0KCkgPCA1KSB7CisgICAgICAgIHBhaW50LnNldENvbG9yKGJh
c2VDb2xvcik7CisgICAgICAgIHNrcmVjdC5zZXQocmVjdC54KCksIHJlY3QueSgpLCByaWdodCwg
Ym90dG9tKTsKKyAgICAgICAgY2FudmFzLT5kcmF3UmVjdChza3JlY3QsIHBhaW50KTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGludCBib3JkZXJBbHBoYSA9IHRoZW1lLT5p
c0hvdmVyZWQobykgPyAweDgwIDogMHg1NTsKKyAgICBwYWludC5zZXRBUkdCKGJvcmRlckFscGhh
LCAwLCAwLCAwKTsKKyAgICBjYW52YXMtPmRyYXdMaW5lKHJlY3QueCgpICsgMSwgcmVjdC55KCks
IHJpZ2h0IC0gMSwgcmVjdC55KCksIHBhaW50KTsKKyAgICBjYW52YXMtPmRyYXdMaW5lKHJpZ2h0
IC0gMSwgcmVjdC55KCkgKyAxLCByaWdodCAtIDEsIGJvdHRvbSAtIDEsIHBhaW50KTsKKyAgICBj
YW52YXMtPmRyYXdMaW5lKHJlY3QueCgpICsgMSwgYm90dG9tIC0gMSwgcmlnaHQgLSAxLCBib3R0
b20gLSAxLCBwYWludCk7CisgICAgY2FudmFzLT5kcmF3TGluZShyZWN0LngoKSwgcmVjdC55KCkg
KyAxLCByZWN0LngoKSwgYm90dG9tIC0gMSwgcGFpbnQpOworCisgICAgcGFpbnQuc2V0Q29sb3Io
U0tfQ29sb3JCTEFDSyk7CisgICAgU2tQb2ludCBwWzJdOworICAgIGNvbnN0IGludCBsaWdodEVu
ZCA9IHRoZW1lLT5pc1ByZXNzZWQobykgPyAxIDogMDsKKyAgICBjb25zdCBpbnQgZGFya0VuZCA9
ICFsaWdodEVuZDsKKyAgICBwW2xpZ2h0RW5kXS5zZXQoU2tJbnRUb1NjYWxhcihyZWN0LngoKSks
IFNrSW50VG9TY2FsYXIocmVjdC55KCkpKTsKKyAgICBwW2RhcmtFbmRdLnNldChTa0ludFRvU2Nh
bGFyKHJlY3QueCgpKSwgU2tJbnRUb1NjYWxhcihib3R0b20gLSAxKSk7CisgICAgU2tDb2xvciBj
b2xvcnNbMl07CisgICAgY29sb3JzWzBdID0gbGlnaHRDb2xvcjsKKyAgICBjb2xvcnNbMV0gPSBi
YXNlQ29sb3I7CisKKyAgICBTa1NoYWRlciogc2hhZGVyID0gU2tHcmFkaWVudFNoYWRlcjo6Q3Jl
YXRlTGluZWFyKAorICAgICAgICBwLCBjb2xvcnMsIDAsIDIsIFNrU2hhZGVyOjprQ2xhbXBfVGls
ZU1vZGUsIDApOworICAgIHBhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKKyAg
ICBwYWludC5zZXRTaGFkZXIoc2hhZGVyKTsKKyAgICBzaGFkZXItPnVucmVmKCk7CisKKyAgICBz
a3JlY3Quc2V0KHJlY3QueCgpICsgMSwgcmVjdC55KCkgKyAxLCByaWdodCAtIDEsIGJvdHRvbSAt
IDEpOworICAgIGNhbnZhcy0+ZHJhd1JlY3Qoc2tyZWN0LCBwYWludCk7CisKKyAgICBwYWludC5z
ZXRTaGFkZXIoMCk7CisgICAgcGFpbnQuc2V0Q29sb3IoYnJpZ2h0ZW5Db2xvcihodWUsIHNhdHVy
YXRpb24sIGxpZ2h0bmVzcywgLTAuMDU4OCkpOworICAgIGNhbnZhcy0+ZHJhd1BvaW50KHJlY3Qu
eCgpICsgMSwgcmVjdC55KCkgKyAxLCBwYWludCk7CisgICAgY2FudmFzLT5kcmF3UG9pbnQocmln
aHQgLSAyLCByZWN0LnkoKSArIDEsIHBhaW50KTsKKyAgICBjYW52YXMtPmRyYXdQb2ludChyZWN0
LngoKSArIDEsIGJvdHRvbSAtIDIsIHBhaW50KTsKKyAgICBjYW52YXMtPmRyYXdQb2ludChyaWdo
dCAtIDIsIGJvdHRvbSAtIDIsIHBhaW50KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnBh
aW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBTa0NhbnZhcyogY29uc3QgY2FudmFzID0gaW5mby5j
b250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCk7CisgICAgY29uc3QgaW50IHJpZ2h0
ID0gcmVjdC54KCkgKyByZWN0LndpZHRoKCk7CisgICAgY29uc3QgaW50IG1pZGRsZSA9IHJlY3Qu
eSgpICsgcmVjdC5oZWlnaHQoKSAvIDI7CisKKyAgICBwYWludEJ1dHRvbkxpa2UodGhpcywgb2Jq
LCBpbmZvLCByZWN0KTsKKworICAgIC8vIEZJWE1FOiBXcmFwIGFycm93IHdpdGggYSBib3gKKyAg
ICBJbnRSZWN0IHJlY3RCdXR0b24ocmVjdC54KCkgKyByZWN0LndpZHRoKCkgLSAoc19NZW51TGlz
dEJ1dHRvblNpemUgLSA0KSwgcmVjdC55KCkgKyAyLCBzX01lbnVMaXN0QnV0dG9uU2l6ZSAtIDYs
IHJlY3QuaGVpZ2h0KCkgLSA0KTsKKyAgICBwYWludEJ1dHRvbkxpa2UodGhpcywgb2JqLCBpbmZv
LCByZWN0QnV0dG9uKTsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFpbnQuc2V0Q29sb3Io
U0tfQ29sb3JCTEFDSyk7CisgICAgcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOworICAgIHBhaW50
LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKKworICAgIGludCBhcnJvd1hQb3NpdGlv
biA9IChvYmotPnN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkgPyByZWN0LngoKSArIDcgOiBy
aWdodCAtIDEzOworICAgIFNrUGF0aCBwYXRoOworICAgIHBhdGgubW92ZVRvKGFycm93WFBvc2l0
aW9uLCBtaWRkbGUgLSAzKTsKKyAgICBwYXRoLnJMaW5lVG8oNiwgMCk7CisgICAgcGF0aC5yTGlu
ZVRvKC0zLCA2KTsKKyAgICBwYXRoLmNsb3NlKCk7CisgICAgY2FudmFzLT5kcmF3UGF0aChwYXRo
LCBwYWludCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCcmV3
OjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgLy8gQ29waWVkIGZy
b20gUmVuZGVyVGhlbWVTYWZhcmkuCisgICAgY29uc3QgZmxvYXQgYmFzZUZvbnRTaXplID0gMTEu
MGY7CisgICAgY29uc3QgaW50IGJhc2VCb3JkZXJSYWRpdXMgPSA1OworICAgIGZsb2F0IGZvbnRT
Y2FsZSA9IHN0eWxlLT5mb250U2l6ZSgpIC8gYmFzZUZvbnRTaXplOworCisgICAgc3R5bGUtPnJl
c2V0UGFkZGluZygpOworICAgIHN0eWxlLT5zZXRCb3JkZXJSYWRpdXMoSW50U2l6ZShpbnQoYmFz
ZUJvcmRlclJhZGl1cyArIGZvbnRTY2FsZSAtIDEpLCBpbnQoYmFzZUJvcmRlclJhZGl1cyArIGZv
bnRTY2FsZSAtIDEpKSk7IC8vIEZJWE1FOiBSb3VuZCB1cD8KKworICAgIGNvbnN0IGludCBtaW5I
ZWlnaHQgPSAxNTsKKyAgICBzdHlsZS0+c2V0TWluSGVpZ2h0KExlbmd0aChtaW5IZWlnaHQsIEZp
eGVkKSk7CisKKyAgICBzdHlsZS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6aW5pdGlhbExp
bmVIZWlnaHQoKSk7CisgICAgLy8gRm91bmQgdGhlc2UgcGFkZGluZyBudW1iZXJzIGJ5IHRyaWFs
IGFuZCBlcnJvci4KKyAgICBjb25zdCBpbnQgcGFkZGluZyA9IDQ7CisgICAgc3R5bGUtPnNldFBh
ZGRpbmdUb3AoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdM
ZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIGFkanVzdE1lbnVMaXN0U3R5bGVDb21t
b24oc3R5bGUsIGUpOworfQorCitib29sIFJlbmRlclRoZW1lQnJldzo6cGFpbnRNZW51TGlzdEJ1
dHRvbihSZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRS
ZWN0JiByZWN0KSAKK3sKKyAgICByZXR1cm4gcGFpbnRNZW51TGlzdChvYmosIGluZm8sIHJlY3Qp
OworfQorCitib29sIFJlbmRlclRoZW1lQnJldzo6c3VwcG9ydHNGb2N1c1JpbmcoY29uc3QgUmVu
ZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIHJldHVybiBzdHlsZS0+b3BhY2l0eSgpID4g
MAorICAgICAgICAmJiBzdHlsZS0+aGFzQXBwZWFyYW5jZSgpCisgICAgICAgICYmIHN0eWxlLT5h
cHBlYXJhbmNlKCkgIT0gVGV4dEZpZWxkUGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5j
ZSgpICE9IFNlYXJjaEZpZWxkUGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9
IFRleHRBcmVhUGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IENoZWNrYm94
UGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IFJhZGlvUGFydAorICAgICAg
ICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IFB1c2hCdXR0b25QYXJ0CisgICAgICAgICYmIHN0
eWxlLT5hcHBlYXJhbmNlKCkgIT0gU3F1YXJlQnV0dG9uUGFydAorICAgICAgICAmJiBzdHlsZS0+
YXBwZWFyYW5jZSgpICE9IEJ1dHRvblBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2Uo
KSAhPSBCdXR0b25CZXZlbFBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBN
ZW51bGlzdFBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBNZW51bGlzdEJ1
dHRvblBhcnQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vYnJldy9SZW5kZXJUaGVtZUJyZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAor
ICogQ29weXJpZ2h0IChDKSAyMDA5IENvbXBhbnkgMTAwLCBJbmMuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
UmVuZGVyVGhlbWVCcmV3X2gKKyNkZWZpbmUgUmVuZGVyVGhlbWVCcmV3X2gKKworI2luY2x1ZGUg
IlJlbmRlclRoZW1lLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUmVuZGVyVGhl
bWVCcmV3IDogcHVibGljIFJlbmRlclRoZW1lIHsKK3ByaXZhdGU6CisgICAgUmVuZGVyVGhlbWVC
cmV3KCk7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gY3Jl
YXRlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNGb2N1c1JpbmcoY29uc3QgUmVuZGVy
U3R5bGUqKSBjb25zdDsKKyAgICAvLyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIHRoZW1lJ3MgY29u
dHJvbHMgYWN0dWFsbHkgY2FyZSBhYm91dCByZWRyYXdpbmcgd2hlbiBob3ZlcmVkLgorICAgIHZp
cnR1YWwgYm9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3Qg
eyByZXR1cm4gc3R5bGUtPmFmZmVjdGVkQnlIb3ZlclJ1bGVzKCk7IH0KKworICAgIHZpcnR1YWwg
aW50IGJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7CisKKyAgICB2
aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29u
c3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3Vu
ZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlv
bkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFj
dGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgQ29sb3Ig
cGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29sb3IoKSBjb25zdDsKKworICAgIHZpcnR1YWwg
dm9pZCBzeXN0ZW1Gb250KGludCwgV2ViQ29yZTo6Rm9udERlc2NyaXB0aW9uJikgY29uc3Qge30K
KworICAgIHZpcnR1YWwgaW50IG1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5bGUqKSBjb25z
dCB7IHJldHVybiAwOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDaGVj
a2JveE9yUmFkaW8oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYsIGJvb2wgaXNSYWRpbyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDaGVja2JveChSZW5k
ZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVh
bCB2b2lkIHNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworCisgICAgdmlydHVh
bCBib29sIHBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3Qg
SW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqKSBj
b25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVj
dG9yKiwgUmVuZGVyU3R5bGUqLCBXZWJDb3JlOjpFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVh
bCBib29sIHBhaW50QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0
IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0RmllbGRTdHlsZShDU1NT
dHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBXZWJDb3JlOjpFbGVtZW50KikgY29uc3Q7Cisg
ICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0QXJl
YVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIFdlYkNvcmU6OkVsZW1lbnQq
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqLCBj
b25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICBib29sIHBhaW50Q29tYm8o
UmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgIGNvbnN0IEludFJlY3QmKTsKKworICAg
IHZpcnR1YWwgdm9pZCBhZGp1c3RMaXN0Ym94U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRl
clN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlz
dFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsK
KyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRNZW51TGlzdChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxp
c3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50Kikg
Y29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lk
IGFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkKFJlbmRl
ck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworcHJpdmF0ZToK
KyAgICB2b2lkIGFkZEludHJpbnNpY01hcmdpbnMoUmVuZGVyU3R5bGUqKSBjb25zdDsKK307CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJlbmRlclRoZW1lQnJld19oCisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68384</attachid>
            <date>2010-09-22 09:53:39 -0700</date>
            <delta_ts>2010-10-19 08:08:12 -0700</delta_ts>
            <desc>Patch. Removed paintCombo()</desc>
            <filename>renderthemebrew.patch</filename>
            <type>text/plain</type>
            <size>23248</size>
            <attacher name="Hyung Song">beergun</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2ODA1MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTEgQEAKKzIwMTAtMDktMjIgIEh5dW5nIFNvbmcgIDxiZWVyZ3VuQGNvbXBhbnkx
MDAubmV0PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtCUkVXTVBdIFBvcnQgUmVuZGVyVGhlbWUgdG8gQlJFV01QLgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDYyMzYKKworICAgICAgICBFbmFibGUgZHJh
d2luZyBCdXR0b24sIENoZWNrYm94LCBSYWRpbywgTWVudUxpc3QuCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9icmV3L1JlbmRlclRoZW1lQnJldy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
Y2FudmFzRnJvbUluZm8pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpjcmVh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OlJlbmRlclRoZW1lQnJldyk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1J
bmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlv
bkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBs
YXRmb3JtVGV4dFNlYXJjaEhpZ2hsaWdodENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQnJldzo6YmFzZWxpbmVQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUJyZXc6OmFkZEludHJpbnNpY01hcmdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVCcmV3OjphZGp1c3RCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUJyZXc6OnBhaW50Q2hlY2tib3hPclJhZGlvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQnJldzo6cGFpbnRDaGVja2JveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6
cGFpbnRSYWRpbyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnNldENoZWNr
Ym94U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnNldFJhZGlvU2l6
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFRleHRGaWVsZFN0
eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRUZXh0RmllbGQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RUZXh0QXJlYVN0eWxl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRUZXh0QXJlYSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwYWludFNlYXJjaEZpZWxkKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6YWRqdXN0TGlzdGJveFN0eWxlKToK
KyAgICAgICAgKFdlYkNvcmU6OmFkanVzdE1lbnVMaXN0U3R5bGVDb21tb24pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RNZW51TGlzdFN0eWxlKToKKyAgICAgICAg
KFdlYkNvcmU6OmJyaWdodGVuQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6cGFpbnRCdXR0b25M
aWtlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRNZW51TGlzdCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdE1lbnVMaXN0QnV0dG9u
U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwYWludE1lbnVMaXN0
QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6c3VwcG9ydHNGb2N1
c1JpbmcpOgorICAgICAgICAqIHBsYXRmb3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3Lmg6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpzdXBwb3J0c0hvdmVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6c3lzdGVtRm9udCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6Om1pbmltdW1NZW51TGlzdFNpemUpOgorCiAyMDEwLTA5
LTIyICBNYXJ0aW4gUm9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBYYW4gTG9wZXouCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVy
VGhlbWVCcmV3LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVy
VGhlbWVCcmV3LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYnJldy9SZW5k
ZXJUaGVtZUJyZXcuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ2MCBAQAorLyoKKyAqIENv
cHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmln
aHQgKEMpIDIwMDkgQ29tcGFueSAxMDAsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIlJlbmRlclRoZW1lQnJldy5oIgorCisjaW5jbHVkZSAiQ29sb3IuaCIKKyNp
bmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVk
ZSAiTmF0aXZlSW1hZ2VTa2lhLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisjaW5jbHVkZSAiU2tDYW52YXMuaCIKKyNpbmNs
dWRlICJTa0dyYWRpZW50U2hhZGVyLmgiCisjaW5jbHVkZSAiU2tOaW5lUGF0Y2guaCIKKyNpbmNs
dWRlICJTa1JlY3QuaCIKKyNpbmNsdWRlICJTa1NoYWRlci5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2VudW0gQnV0dG9uU3RhdGUgeworICAgIEJ1dHRvbkRpc2FibGVkID0gMCwKKyAgICBC
dXR0b25Ob3JtYWwsCisgICAgQnV0dG9uRm9jdXNlZCwKKyAgICBCdXR0b25QcmVzc2VkLAorICAg
IEJ1dHRvblN0YXRlcworfTsKKworc3RydWN0IFBhdGNoRGF0YSB7CisgICAgY29uc3QgY2hhciog
bmFtZTsKKyAgICBpbnQ4X3QgbWFyZ2luOworfTsKKworc3RhdGljIGNvbnN0IFBhdGNoRGF0YSBz
X2J1dHRvbk5hbWVzW0J1dHRvblN0YXRlc10gPSB7CisgICAgeyAiYnV0dG9uTm9ybWFsRGlzYWJs
ZWQiLCA5IH0sCisgICAgeyAiYnV0dG9uTm9ybWFsIiwgOSB9LAorICAgIHsgImJ1dHRvblNlbGVj
dGVkIiwgOSB9LAorICAgIHsgImJ1dHRvblByZXNzZWQiLCA5IH0sCit9OworCitlbnVtIE9uT2Zm
U3RhdGUgeyBPZmYgPSAwLCBPbiwgT25PZmZTdGF0ZXMgfTsKKworc3RhdGljIGNvbnN0IGNoYXIq
IHNfY2hlY2tib3hOYW1lc1tPbk9mZlN0YXRlc10gPSB7ICJjaGVja2JveE9mZiIsICJjaGVja2Jv
eE9uIiwgfTsKK3N0YXRpYyBjb25zdCBjaGFyKiBzX3JhZGlvTmFtZXNbT25PZmZTdGF0ZXNdID0g
eyAicmFkaW9PZmYiLCAicmFkaW9PbiIsIH07CisKK3N0YXRpYyBSZWZQdHI8SW1hZ2U+IHNfYnV0
dG9uSW1hZ2VzW0J1dHRvblN0YXRlc107CitzdGF0aWMgUmVmUHRyPEltYWdlPiBzX2NoZWNrYm94
SW1hZ2VzW09uT2ZmU3RhdGVzXTsKK3N0YXRpYyBSZWZQdHI8SW1hZ2U+IHNfcmFkaW9JbWFnZXNb
T25PZmZTdGF0ZXNdOworCitzdGF0aWMgY29uc3QgaW50IHNfTWVudUxpc3RCdXR0b25TaXplID0g
MjI7CisKK3N0YXRpYyBTa0NhbnZhcyogY2FudmFzRnJvbUluZm8oY29uc3QgUGFpbnRJbmZvJiBp
bmZvKQoreworICAgIHJldHVybiBpbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jYW52
YXMoKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWVCcmV3OjpjcmVh
dGUoKQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmVuZGVyVGhlbWVCcmV3KCkpOworfQor
CitQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBSZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2Uq
KQoreworICAgIHN0YXRpYyBSZW5kZXJUaGVtZSogcmVuZGVyVGhlbWUgPSBSZW5kZXJUaGVtZUJy
ZXc6OmNyZWF0ZSgpLnJlbGVhc2VSZWYoKTsKKyAgICByZXR1cm4gcmVuZGVyVGhlbWU7Cit9CisK
K1JlbmRlclRoZW1lQnJldzo6UmVuZGVyVGhlbWVCcmV3KCkKK3sKKyAgICBpbnQgaTsKKworICAg
IGZvciAoaSA9IDA7IGkgPCBCdXR0b25TdGF0ZXM7ICsraSkgeworICAgICAgICBzX2J1dHRvbklt
YWdlc1tpXSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShzX2J1dHRvbk5hbWVzW2ldLm5h
bWUpOworICAgICAgICBBU1NFUlQoIXNfYnV0dG9uSW1hZ2VzW2ldLT5pc051bGwoKSk7CisgICAg
fQorCisgICAgZm9yIChpID0gMDsgaSA8IE9uT2ZmU3RhdGVzOyArK2kpIHsKKyAgICAgICAgc19j
aGVja2JveEltYWdlc1tpXSA9IEltYWdlOjpsb2FkUGxhdGZvcm1SZXNvdXJjZShzX2NoZWNrYm94
TmFtZXNbaV0pOworICAgICAgICBBU1NFUlQoIXNfY2hlY2tib3hJbWFnZXNbaV0tPmlzTnVsbCgp
KTsKKworICAgICAgICBzX3JhZGlvSW1hZ2VzW2ldID0gSW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291
cmNlKHNfcmFkaW9OYW1lc1tpXSk7CisgICAgICAgIEFTU0VSVCghc19yYWRpb0ltYWdlc1tpXS0+
aXNOdWxsKCkpOworICAgIH0KK30KKworQ29sb3IgUmVuZGVyVGhlbWVCcmV3OjpwbGF0Zm9ybUFj
dGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBpcyB0
aGUgY29sb3Igb2Ygc2VsZWN0aW9uIGluIGEgdGV4dGZpZWxkLiAgSXQgd2FzIG9idGFpbmVkIGJ5
IGNoZWNraW5nCisgICAgLy8gdGhlIGNvbG9yIG9mIHNlbGVjdGlvbiBpbiBUZXh0Vmlld3MgaW4g
dGhlIHN5c3RlbS4KKyAgICBjb25zdCBSR0JBMzIgc2VsZWN0aW9uQ29sb3IgPSBtYWtlUkdCKDI1
NSwgMTQ2LCAwKTsKKworICAgIHJldHVybiBDb2xvcihzZWxlY3Rpb25Db2xvcik7Cit9CisKK0Nv
bG9yIFJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRD
b2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIENvbG9yKENvbG9yOjp0cmFuc3BhcmVudCk7Cit9
CisKK0NvbG9yIFJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3Jv
dW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcjo6YmxhY2s7Cit9CisKK0NvbG9y
IFJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xv
cigpIGNvbnN0Cit7CisgICAgcmV0dXJuIENvbG9yOjpibGFjazsKK30KKworQ29sb3IgUmVuZGVy
VGhlbWVCcmV3OjpwbGF0Zm9ybVRleHRTZWFyY2hIaWdobGlnaHRDb2xvcigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIENvbG9yKENvbG9yOjp0cmFuc3BhcmVudCk7Cit9CisKK2ludCBSZW5kZXJUaGVt
ZUJyZXc6OmJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0KiBvYmopIGNvbnN0Cit7
CisgICAgLy8gRnJvbSB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBmdW5jdGlvbiBpbiBSZW5kZXJU
aGVtZS5oOgorICAgIC8vIEEgbWV0aG9kIHRvIG9idGFpbiB0aGUgYmFzZWxpbmUgcG9zaXRpb24g
Zm9yIGEgImxlYWYiIGNvbnRyb2wuICBUaGlzIHdpbGwgb25seSBiZSB1c2VkIGlmIGEgYmFzZWxp
bmUKKyAgICAvLyBwb3NpdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBleGFtaW5pbmcgY2hp
bGQgY29udGVudC4gQ2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBhcmUgZXhhbXBsZXMgb2YK
KyAgICAvLyBjb250cm9scyB0aGF0IG5lZWQgdG8gZG8gdGhpcy4KKyAgICAvLworICAgIC8vIE91
ciBjaGVja2JveGVzIGFuZCByYWRpbyBidXR0b25zIG5lZWQgdG8gYmUgb2Zmc2V0IHRvIGxpbmUg
dXAgcHJvcGVybHkuCisgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpiYXNlbGluZVBvc2l0aW9uKG9i
aikgLSA1OworfQorCit2b2lkIFJlbmRlclRoZW1lQnJldzo6YWRkSW50cmluc2ljTWFyZ2lucyhS
ZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8gQ3V0IG91dCB0aGUgaW50cmluc2lj
IG1hcmdpbnMgY29tcGxldGVseSBpZiB3ZSBlbmQgdXAgdXNpbmcgYSBzbWFsbCBmb250IHNpemUK
KyAgICBpZiAoc3R5bGUtPmZvbnRTaXplKCkgPCAxMSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gSW50cmluc2ljIG1hcmdpbiB2YWx1ZS4KKyAgICBjb25zdCBpbnQgbSA9IDI7CisKKyAgICAv
LyBGSVhNRTogVXNpbmcgd2lkdGgvaGVpZ2h0IGFsb25lIGFuZCBub3QgYWxzbyBkZWFsaW5nIHdp
dGggbWluLXdpZHRoL21heC13aWR0aCBpcyBmbGF3ZWQuCisgICAgaWYgKHN0eWxlLT53aWR0aCgp
LmlzSW50cmluc2ljT3JBdXRvKCkpIHsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5MZWZ0KCku
cXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5MZWZ0KExlbmd0aChtLCBGaXhl
ZCkpOworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpblJpZ2h0KCkucXVpcmsoKSkKKyAgICAgICAg
ICAgIHN0eWxlLT5zZXRNYXJnaW5SaWdodChMZW5ndGgobSwgRml4ZWQpKTsKKyAgICB9CisKKyAg
ICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKSB7CisgICAgICAgIGlmIChzdHlsZS0+bWFy
Z2luVG9wKCkucXVpcmsoKSkKKyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Ub3AoTGVuZ3Ro
KG0sIEZpeGVkKSk7CisgICAgICAgIGlmIChzdHlsZS0+bWFyZ2luQm90dG9tKCkucXVpcmsoKSkK
KyAgICAgICAgICAgIHN0eWxlLT5zZXRNYXJnaW5Cb3R0b20oTGVuZ3RoKG0sIEZpeGVkKSk7Cisg
ICAgfQorfQorCit2b2lkIFJlbmRlclRoZW1lQnJldzo6YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5
bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVudCopIGNvbnN0
Cit7CisgICAgLy8gQWRkIGEgY29uc3RhbnQgYW1vdW50IG9mIHBhZGRpbmcgdG8gdGhlIHRleHRz
aXplIHRvIGdldCB0aGUgZmluYWwgaGVpZ2h0CisgICAgLy8gb2YgYnV0dG9ucywgc28gdGhhdCBv
dXIgYnV0dG9uIGltYWdlcyBhcmUgbGFyZ2UgZW5vdWdoIHRvIHByb3Blcmx5IGZpdAorICAgIC8v
IHRoZSB0ZXh0LgorICAgIGNvbnN0IGludCBidXR0b25QYWRkaW5nID0gMTg7CisKKyAgICAvLyBQ
YWRkaW5nIGNvZGUgaXMgdGFrZW4gZnJvbSBSZW5kZXJUaGVtZVNhZmFyaS5jcHAKKyAgICAvLyBJ
dCBtYWtlcyBzdXJlIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgYnV0dG9uIHRleHQuCisg
ICAgY29uc3QgaW50IHBhZGRpbmcgPSA4OworCisgICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0KExl
bmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3Ro
KHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldE1pbkhlaWdodChMZW5ndGgoc3R5bGUt
PmZvbnRTaXplKCkgKyBidXR0b25QYWRkaW5nLCBGaXhlZCkpOworfQorCisKK2Jvb2wgUmVuZGVy
VGhlbWVCcmV3OjpwYWludENoZWNrYm94T3JSYWRpbyhSZW5kZXJPYmplY3QqIG9iaiwgY29uc3Qg
UGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIGlzUmFkaW8pCit7Cisg
ICAgYm9vbCBjaGVja2VkID0gaXNDaGVja2VkKG9iaik7CisKKyAgICBTa1JlY3QgcihyZWN0KTsK
KyAgICBTa1BhaW50IHBhaW50OworICAgIHBhaW50LnNldEZsYWdzKFNrUGFpbnQ6OmtGaWx0ZXJC
aXRtYXBfRmxhZyk7CisKKyAgICBpZiAoIWlzRW5hYmxlZChvYmopKQorICAgICAgICBwYWludC5z
ZXRBbHBoYSgweDgwKTsKKworICAgIFNrQml0bWFwJiBiaXRtYXAgPSBpc1JhZGlvID8gKnNfcmFk
aW9JbWFnZXNbY2hlY2tlZF0tPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCkgOiAqc19jaGVj
a2JveEltYWdlc1tjaGVja2VkXS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKworICAg
IFNrU2NhbGFyIHdpZHRoID0gcmVjdC53aWR0aCgpOworICAgIFNrU2NhbGFyIHNjYWxlID0gU2tT
Y2FsYXJEaXYod2lkdGgsIFNrSW50VG9TY2FsYXIoYml0bWFwLndpZHRoKCkpKTsKKyAgICBTa0Nh
bnZhcyogY2FudmFzID0gY2FudmFzRnJvbUluZm8oaW5mbyk7CisgICAgaW50IHNhdmVTY2FsZUNv
dW50ID0gY2FudmFzLT5zYXZlKCk7CisgICAgY2FudmFzLT50cmFuc2xhdGUoci5mTGVmdCwgci5m
VG9wKTsKKyAgICBjYW52YXMtPnNjYWxlKHNjYWxlLCBzY2FsZSk7CisKKyAgICBjYW52YXMtPmRy
YXdCaXRtYXAoYml0bWFwLCAwLCAwLCAmcGFpbnQpOworICAgIGNhbnZhcy0+cmVzdG9yZVRvQ291
bnQoc2F2ZVNjYWxlQ291bnQpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRl
clRoZW1lQnJldzo6cGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgUGFpbnRJ
bmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludENoZWNr
Ym94T3JSYWRpbyhvYmosIGluZm8sIHJlY3QsIGZhbHNlKTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50QnV0dG9uKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBQYWludEluZm8mIGlu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgQnV0dG9uU3RhdGUgc3RhdGU7CisgICAg
aWYgKGlzRW5hYmxlZChvYmopKSB7CisgICAgICAgIGlmIChpc1ByZXNzZWQob2JqKSkKKyAgICAg
ICAgICAgIHN0YXRlID0gQnV0dG9uUHJlc3NlZDsKKyAgICAgICAgZWxzZSBpZiAoaXNGb2N1c2Vk
KG9iaikpCisgICAgICAgICAgICBzdGF0ZSA9IEJ1dHRvbkZvY3VzZWQ7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHN0YXRlID0gQnV0dG9uTm9ybWFsOworICAgIH0gZWxzZQorICAgICAgICBz
dGF0ZSA9IEJ1dHRvbkRpc2FibGVkOworCisgICAgU2tSZWN0IGJvdW5kcyhyZWN0KTsKKyAgICBp
bnQgbWFyZ2luVmFsdWUgPSBzX2J1dHRvbk5hbWVzW3N0YXRlXS5tYXJnaW47CisgICAgU2tJUmVj
dCBtYXJnaW47CisgICAgbWFyZ2luLnNldChtYXJnaW5WYWx1ZSwgbWFyZ2luVmFsdWUsIG1hcmdp
blZhbHVlLCBtYXJnaW5WYWx1ZSk7CisgICAgU2tCaXRtYXAmIGJpdG1hcCA9ICpzX2J1dHRvbklt
YWdlc1tzdGF0ZV0tPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisKKyAgICBTa05pbmVQ
YXRjaDo6RHJhd05pbmUoY2FudmFzRnJvbUluZm8oaW5mbyksIGJvdW5kcywgYml0bWFwLCBtYXJn
aW4pOworCisgICAgLy8gV2UgYWx3YXlzIHJldHVybiBmYWxzZSBzbyB3ZSBkbyBub3QgcmVxdWVz
dCB0byBiZSByZWRyYXduLgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50SW5mbyYgaW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRDaGVja2JveE9yUmFk
aW8ob2JqLCBpbmZvLCByZWN0LCB0cnVlKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OnNl
dENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgc3R5bGUtPnNl
dFdpZHRoKExlbmd0aCgxOSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aCgx
OSwgRml4ZWQpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OnNldFJhZGlvU2l6ZShSZW5k
ZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBjaGVj
a2JveGVzLgorICAgIHNldENoZWNrYm94U2l6ZShzdHlsZSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVCcmV3OjphZGp1c3RUZXh0RmllbGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5
bGUqIHN0eWxlLCBXZWJDb3JlOjpFbGVtZW50KikgY29uc3QKK3sKKyAgICBhZGRJbnRyaW5zaWNN
YXJnaW5zKHN0eWxlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnBhaW50VGV4dEZpZWxk
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKQoreworICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclRoZW1lQnJldzo6YWRqdXN0VGV4dEFyZWFT
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBXZWJDb3JlOjpFbGVt
ZW50KikgY29uc3QKK3sKKyAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKK30KKworYm9v
bCBSZW5kZXJUaGVtZUJyZXc6OnBhaW50VGV4dEFyZWEoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0
IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUoQ1NT
U3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0Cit7Cisg
ICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCcmV3
OjpwYWludFNlYXJjaEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0
IEludFJlY3QmKQoreworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbmRlclRoZW1lQnJl
dzo6YWRqdXN0TGlzdGJveFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5
bGUsIEVsZW1lbnQqKSBjb25zdAoreworICAgIC8vIEFkZCBwYWRkaW5nIHRvIHRoZSBmb250U2l6
ZSBvZiBMaXN0Qm94ZXMgdG8gZ2V0IHRoZWlyIG1heGltdW0gc2l6ZXMuCisgICAgLy8gTGlzdGJv
eGVzIG9mdGVuIGhhdmUgYSBzcGVjaWZpZWQgc2l6ZS4gIFNpbmNlIHdlIGNoYW5nZSB0aGVtIGlu
dG8KKyAgICAvLyBkcm9wZG93bnMsIHdlIHdhbnQgYSBtdWNoIHNtYWxsZXIgaGVpZ2h0LCB3aGlj
aCBlbmNvbXBhc3NlcyB0aGUgdGV4dC4KKyAgICBjb25zdCBpbnQgbGlzdGJveFBhZGRpbmcgPSA1
OworCisgICAgc3R5bGUtPnNldE1heEhlaWdodChMZW5ndGgoc3R5bGUtPmZvbnRTaXplKCkgKyBs
aXN0Ym94UGFkZGluZywgRml4ZWQpKTsKKyAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsK
K30KKworc3RhdGljIHZvaWQgYWRqdXN0TWVudUxpc3RTdHlsZUNvbW1vbihSZW5kZXJTdHlsZSog
c3R5bGUsIEVsZW1lbnQqIGUpCit7CisgICAgLy8gQ29kZSBjb3BpZWQgZnJvbSBSZW5kZXJUaGVt
ZU1hYy5tbQorICAgIC8vIE1ha2VzIHN1cmUgdGhhdCB0aGUgdGV4dCBzaG93cyB1cCBvbiBvdXIg
dHJlYXRtZW50CisgICAgYm9vbCBpc0VuYWJsZWQgPSBlLT5pc0VuYWJsZWRGb3JtQ29udHJvbCgp
OworICAgIHN0eWxlLT5zZXRDb2xvcihpc0VuYWJsZWQgPyBDb2xvcjo6YmxhY2sgOiBDb2xvcjo6
ZGFya0dyYXkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKHNfTWVudUxpc3RC
dXR0b25TaXplLCBGaXhlZCkpOworfQorCit2b2lkIFJlbmRlclRoZW1lQnJldzo6YWRqdXN0TWVu
dUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50
KiBlKSBjb25zdAoreworICAgIGFkanVzdE1lbnVMaXN0U3R5bGVDb21tb24oc3R5bGUsIGUpOwor
ICAgIGFkZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOworfQorCitzdGF0aWMgU2tDb2xvciBicmln
aHRlbkNvbG9yKGRvdWJsZSBodWUsIGRvdWJsZSBzYXR1cmF0aW9uLCBkb3VibGUgbGlnaHRuZXNz
LCBmbG9hdCBicmlnaHRlbkFtb3VudCkKK3sKKyAgICBsaWdodG5lc3MgKz0gYnJpZ2h0ZW5BbW91
bnQ7CisgICAgaWYgKGxpZ2h0bmVzcyA+IDEuMCkKKyAgICAgICAgbGlnaHRuZXNzID0gMS4wOwor
ICAgIGlmIChsaWdodG5lc3MgPCAwLjApCisgICAgICAgIGxpZ2h0bmVzcyA9IDAuMDsKKworICAg
IHJldHVybiBtYWtlUkdCQUZyb21IU0xBKGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCAxLjAp
OworfQorCitzdGF0aWMgdm9pZCBwYWludEJ1dHRvbkxpa2UoUmVuZGVyVGhlbWUqIHRoZW1lLCBS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBTa0NhbnZhcyogY29uc3QgY2FudmFzID0gaS5jb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKS0+Y2FudmFzKCk7CisgICAgU2tQYWludCBwYWludDsKKyAgICBTa1JlY3Qgc2tyZWN0Owor
ICAgIGNvbnN0IGludCByaWdodCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIGNvbnN0
IGludCBib3R0b20gPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCk7CisgICAgU2tDb2xvciBiYXNl
Q29sb3IgPSBTa0NvbG9yU2V0QVJHQigweGZmLCAweGRkLCAweGRkLCAweGRkKTsKKyAgICBpZiAo
by0+aGFzQmFja2dyb3VuZCgpKQorICAgICAgICBiYXNlQ29sb3IgPSBvLT5zdHlsZSgpLT52aXNp
dGVkRGVwZW5kZW50Q29sb3IoQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IpLnJnYigpOworICAg
IGRvdWJsZSBodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzczsKKyAgICBDb2xvcihiYXNlQ29sb3Ip
LmdldEhTTChodWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcyk7CisgICAgLy8gT3VyIHN0YW5kYXJk
IGdyYWRpZW50IGlzIGZyb20gMHhkZCB0byAweGY4LiBUaGlzIGlzIHRoZSBhbW91bnQgb2YKKyAg
ICAvLyBpbmNyZWFzZWQgbGlnaHRuZXNzdW1pbmFuY2UgYmV0d2VlbiB0aG9zZSB2YWxpZ2h0bmVz
c3Vlcy4KKyAgICBTa0NvbG9yIGxpZ2h0Q29sb3IoYnJpZ2h0ZW5Db2xvcihodWUsIHNhdHVyYXRp
b24sIGxpZ2h0bmVzcywgMC4xMDUpKTsKKworICAgIC8vIElmIHRoZSBidXR0b24gaXMgdG9vIHNt
YWxsLCBmYWxsYmFjayB0byBkcmF3aW5nIGEgc2luZ2xlLCBzb2xpZCBjb2xvcgorICAgIGlmIChy
ZWN0LndpZHRoKCkgPCA1IHx8IHJlY3QuaGVpZ2h0KCkgPCA1KSB7CisgICAgICAgIHBhaW50LnNl
dENvbG9yKGJhc2VDb2xvcik7CisgICAgICAgIHNrcmVjdC5zZXQocmVjdC54KCksIHJlY3QueSgp
LCByaWdodCwgYm90dG9tKTsKKyAgICAgICAgY2FudmFzLT5kcmF3UmVjdChza3JlY3QsIHBhaW50
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IGludCBib3JkZXJBbHBoYSA9
IHRoZW1lLT5pc0hvdmVyZWQobykgPyAweDgwIDogMHg1NTsKKyAgICBwYWludC5zZXRBUkdCKGJv
cmRlckFscGhhLCAwLCAwLCAwKTsKKyAgICBjYW52YXMtPmRyYXdMaW5lKHJlY3QueCgpICsgMSwg
cmVjdC55KCksIHJpZ2h0IC0gMSwgcmVjdC55KCksIHBhaW50KTsKKyAgICBjYW52YXMtPmRyYXdM
aW5lKHJpZ2h0IC0gMSwgcmVjdC55KCkgKyAxLCByaWdodCAtIDEsIGJvdHRvbSAtIDEsIHBhaW50
KTsKKyAgICBjYW52YXMtPmRyYXdMaW5lKHJlY3QueCgpICsgMSwgYm90dG9tIC0gMSwgcmlnaHQg
LSAxLCBib3R0b20gLSAxLCBwYWludCk7CisgICAgY2FudmFzLT5kcmF3TGluZShyZWN0LngoKSwg
cmVjdC55KCkgKyAxLCByZWN0LngoKSwgYm90dG9tIC0gMSwgcGFpbnQpOworCisgICAgcGFpbnQu
c2V0Q29sb3IoU0tfQ29sb3JCTEFDSyk7CisgICAgU2tQb2ludCBwWzJdOworICAgIGNvbnN0IGlu
dCBsaWdodEVuZCA9IHRoZW1lLT5pc1ByZXNzZWQobykgPyAxIDogMDsKKyAgICBjb25zdCBpbnQg
ZGFya0VuZCA9ICFsaWdodEVuZDsKKyAgICBwW2xpZ2h0RW5kXS5zZXQoU2tJbnRUb1NjYWxhcihy
ZWN0LngoKSksIFNrSW50VG9TY2FsYXIocmVjdC55KCkpKTsKKyAgICBwW2RhcmtFbmRdLnNldChT
a0ludFRvU2NhbGFyKHJlY3QueCgpKSwgU2tJbnRUb1NjYWxhcihib3R0b20gLSAxKSk7CisgICAg
U2tDb2xvciBjb2xvcnNbMl07CisgICAgY29sb3JzWzBdID0gbGlnaHRDb2xvcjsKKyAgICBjb2xv
cnNbMV0gPSBiYXNlQ29sb3I7CisKKyAgICBTa1NoYWRlciogc2hhZGVyID0gU2tHcmFkaWVudFNo
YWRlcjo6Q3JlYXRlTGluZWFyKAorICAgICAgICBwLCBjb2xvcnMsIDAsIDIsIFNrU2hhZGVyOjpr
Q2xhbXBfVGlsZU1vZGUsIDApOworICAgIHBhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0
eWxlKTsKKyAgICBwYWludC5zZXRTaGFkZXIoc2hhZGVyKTsKKyAgICBzaGFkZXItPnVucmVmKCk7
CisKKyAgICBza3JlY3Quc2V0KHJlY3QueCgpICsgMSwgcmVjdC55KCkgKyAxLCByaWdodCAtIDEs
IGJvdHRvbSAtIDEpOworICAgIGNhbnZhcy0+ZHJhd1JlY3Qoc2tyZWN0LCBwYWludCk7CisKKyAg
ICBwYWludC5zZXRTaGFkZXIoMCk7CisgICAgcGFpbnQuc2V0Q29sb3IoYnJpZ2h0ZW5Db2xvciho
dWUsIHNhdHVyYXRpb24sIGxpZ2h0bmVzcywgLTAuMDU4OCkpOworICAgIGNhbnZhcy0+ZHJhd1Bv
aW50KHJlY3QueCgpICsgMSwgcmVjdC55KCkgKyAxLCBwYWludCk7CisgICAgY2FudmFzLT5kcmF3
UG9pbnQocmlnaHQgLSAyLCByZWN0LnkoKSArIDEsIHBhaW50KTsKKyAgICBjYW52YXMtPmRyYXdQ
b2ludChyZWN0LngoKSArIDEsIGJvdHRvbSAtIDIsIHBhaW50KTsKKyAgICBjYW52YXMtPmRyYXdQ
b2ludChyaWdodCAtIDIsIGJvdHRvbSAtIDIsIHBhaW50KTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50SW5mbyYg
aW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBTa0NhbnZhcyogY29uc3QgY2FudmFz
ID0gaW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y2FudmFzKCk7CisgICAgY29uc3Qg
aW50IHJpZ2h0ID0gcmVjdC54KCkgKyByZWN0LndpZHRoKCk7CisgICAgY29uc3QgaW50IG1pZGRs
ZSA9IHJlY3QueSgpICsgcmVjdC5oZWlnaHQoKSAvIDI7CisKKyAgICBwYWludEJ1dHRvbkxpa2Uo
dGhpcywgb2JqLCBpbmZvLCByZWN0KTsKKworICAgIC8vIEZJWE1FOiBXcmFwIGFycm93IHdpdGgg
YSBib3gKKyAgICBJbnRSZWN0IHJlY3RCdXR0b24ocmVjdC54KCkgKyByZWN0LndpZHRoKCkgLSAo
c19NZW51TGlzdEJ1dHRvblNpemUgLSA0KSwgcmVjdC55KCkgKyAyLCBzX01lbnVMaXN0QnV0dG9u
U2l6ZSAtIDYsIHJlY3QuaGVpZ2h0KCkgLSA0KTsKKyAgICBwYWludEJ1dHRvbkxpa2UodGhpcywg
b2JqLCBpbmZvLCByZWN0QnV0dG9uKTsKKworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFpbnQu
c2V0Q29sb3IoU0tfQ29sb3JCTEFDSyk7CisgICAgcGFpbnQuc2V0QW50aUFsaWFzKHRydWUpOwor
ICAgIHBhaW50LnNldFN0eWxlKFNrUGFpbnQ6OmtGaWxsX1N0eWxlKTsKKworICAgIGludCBhcnJv
d1hQb3NpdGlvbiA9IChvYmotPnN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkgPyByZWN0Lngo
KSArIDcgOiByaWdodCAtIDEzOworICAgIFNrUGF0aCBwYXRoOworICAgIHBhdGgubW92ZVRvKGFy
cm93WFBvc2l0aW9uLCBtaWRkbGUgLSAzKTsKKyAgICBwYXRoLnJMaW5lVG8oNiwgMCk7CisgICAg
cGF0aC5yTGluZVRvKC0zLCA2KTsKKyAgICBwYXRoLmNsb3NlKCk7CisgICAgY2FudmFzLT5kcmF3
UGF0aChwYXRoLCBwYWludCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVCcmV3OjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNl
bGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgLy8g
Q29waWVkIGZyb20gUmVuZGVyVGhlbWVTYWZhcmkuCisgICAgY29uc3QgZmxvYXQgYmFzZUZvbnRT
aXplID0gMTEuMGY7CisgICAgY29uc3QgaW50IGJhc2VCb3JkZXJSYWRpdXMgPSA1OworICAgIGZs
b2F0IGZvbnRTY2FsZSA9IHN0eWxlLT5mb250U2l6ZSgpIC8gYmFzZUZvbnRTaXplOworCisgICAg
c3R5bGUtPnJlc2V0UGFkZGluZygpOworICAgIHN0eWxlLT5zZXRCb3JkZXJSYWRpdXMoSW50U2l6
ZShpbnQoYmFzZUJvcmRlclJhZGl1cyArIGZvbnRTY2FsZSAtIDEpLCBpbnQoYmFzZUJvcmRlclJh
ZGl1cyArIGZvbnRTY2FsZSAtIDEpKSk7IC8vIEZJWE1FOiBSb3VuZCB1cD8KKworICAgIGNvbnN0
IGludCBtaW5IZWlnaHQgPSAxNTsKKyAgICBzdHlsZS0+c2V0TWluSGVpZ2h0KExlbmd0aChtaW5I
ZWlnaHQsIEZpeGVkKSk7CisKKyAgICBzdHlsZS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6
aW5pdGlhbExpbmVIZWlnaHQoKSk7CisgICAgLy8gRm91bmQgdGhlc2UgcGFkZGluZyBudW1iZXJz
IGJ5IHRyaWFsIGFuZCBlcnJvci4KKyAgICBjb25zdCBpbnQgcGFkZGluZyA9IDQ7CisgICAgc3R5
bGUtPnNldFBhZGRpbmdUb3AoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNl
dFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIGFkanVzdE1lbnVMaXN0
U3R5bGVDb21tb24oc3R5bGUsIGUpOworfQorCitib29sIFJlbmRlclRoZW1lQnJldzo6cGFpbnRN
ZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iaiwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KSAKK3sKKyAgICByZXR1cm4gcGFpbnRNZW51TGlzdChvYmosIGlu
Zm8sIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1lQnJldzo6c3VwcG9ydHNGb2N1c1Jpbmco
Y29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIHJldHVybiBzdHlsZS0+b3Bh
Y2l0eSgpID4gMAorICAgICAgICAmJiBzdHlsZS0+aGFzQXBwZWFyYW5jZSgpCisgICAgICAgICYm
IHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gVGV4dEZpZWxkUGFydAorICAgICAgICAmJiBzdHlsZS0+
YXBwZWFyYW5jZSgpICE9IFNlYXJjaEZpZWxkUGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFy
YW5jZSgpICE9IFRleHRBcmVhUGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9
IENoZWNrYm94UGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IFJhZGlvUGFy
dAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IFB1c2hCdXR0b25QYXJ0CisgICAg
ICAgICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gU3F1YXJlQnV0dG9uUGFydAorICAgICAgICAm
JiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IEJ1dHRvblBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFw
cGVhcmFuY2UoKSAhPSBCdXR0b25CZXZlbFBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFu
Y2UoKSAhPSBNZW51bGlzdFBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBN
ZW51bGlzdEJ1dHRvblBhcnQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vYnJldy9SZW5kZXJUaGVtZUJyZXcuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3LmgJKHJldmlzaW9uIDApCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3LmgJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2Ug
UHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDA5IENvbXBhbnkgMTAwLCBJbmMuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERF
UlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgUmVuZGVyVGhlbWVCcmV3X2gKKyNkZWZpbmUgUmVuZGVyVGhlbWVCcmV3X2gKKwor
I2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
UmVuZGVyVGhlbWVCcmV3IDogcHVibGljIFJlbmRlclRoZW1lIHsKK3ByaXZhdGU6CisgICAgUmVu
ZGVyVGhlbWVCcmV3KCk7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSZW5kZXJU
aGVtZT4gY3JlYXRlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNGb2N1c1JpbmcoY29u
c3QgUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICAvLyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIHRo
ZW1lJ3MgY29udHJvbHMgYWN0dWFsbHkgY2FyZSBhYm91dCByZWRyYXdpbmcgd2hlbiBob3ZlcmVk
LgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0IFJlbmRlclN0eWxlKiBzdHls
ZSkgY29uc3QgeyByZXR1cm4gc3R5bGUtPmFmZmVjdGVkQnlIb3ZlclJ1bGVzKCk7IH0KKworICAg
IHZpcnR1YWwgaW50IGJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0KikgY29uc3Q7
CisKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENv
bG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9u
QmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2
ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAgIHZpcnR1YWwgQ29sb3IgcGxh
dGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAgIHZpcnR1
YWwgQ29sb3IgcGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29sb3IoKSBjb25zdDsKKworICAg
IHZpcnR1YWwgdm9pZCBzeXN0ZW1Gb250KGludCwgV2ViQ29yZTo6Rm9udERlc2NyaXB0aW9uJikg
Y29uc3Qge30KKworICAgIHZpcnR1YWwgaW50IG1pbmltdW1NZW51TGlzdFNpemUoUmVuZGVyU3R5
bGUqKSBjb25zdCB7IHJldHVybiAwOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wg
cGFpbnRDaGVja2JveE9yUmFkaW8oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwgY29u
c3QgSW50UmVjdCYsIGJvb2wgaXNSYWRpbyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDaGVj
a2JveChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7Cisg
ICAgdmlydHVhbCB2b2lkIHNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworCisg
ICAgdmlydHVhbCBib29sIHBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZv
JiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBzZXRSYWRpb1NpemUoUmVuZGVy
U3R5bGUqKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25TdHlsZShDU1NT
dHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBXZWJDb3JlOjpFbGVtZW50KikgY29uc3Q7Cisg
ICAgdmlydHVhbCBib29sIHBhaW50QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5m
byYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0RmllbGRT
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBXZWJDb3JlOjpFbGVtZW50Kikg
Y29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNv
bnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RUZXh0QXJlYVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIFdlYkNvcmU6
OkVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShSZW5kZXJP
YmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0TGlzdGJveFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSos
IEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxpc3RTdHlsZShD
U1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgdmly
dHVhbCBib29sIHBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiwgY29uc3QgUGFpbnRJbmZvJiwg
Y29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFkanVzdE1lbnVMaXN0QnV0dG9u
U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0Owor
ICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0
IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RT
ZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQq
KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hGaWVsZChSZW5kZXJPYmplY3Qq
LCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKK3ByaXZhdGU6CisgICAgdm9p
ZCBhZGRJbnRyaW5zaWNNYXJnaW5zKFJlbmRlclN0eWxlKikgY29uc3Q7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZW5kZXJUaGVtZUJyZXdfaAorCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70879</attachid>
            <date>2010-10-15 10:09:06 -0700</date>
            <delta_ts>2010-10-19 14:36:54 -0700</delta_ts>
            <desc>patch</desc>
            <filename>change-year.patch</filename>
            <type>text/plain</type>
            <size>23266</size>
            <attacher name="Hyung Song">beergun</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTg1OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNTEgQEAKKzIwMTAtMTAtMTUgIEh5dW5nIFNvbmcgIDxiZWVyZ3VuQGNvbXBhbnkx
MDAubmV0PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IFtCUkVXTVBdIFBvcnQgUmVuZGVyVGhlbWUgdG8gQlJFV01QLgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDYyMzYKKworICAgICAgICBFbmFibGUgZHJh
d2luZyBCdXR0b24sIENoZWNrYm94LCBSYWRpbywgTWVudUxpc3QuCisKKyAgICAgICAgKiBwbGF0
Zm9ybS9icmV3L1JlbmRlclRoZW1lQnJldy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
Y2FudmFzRnJvbUluZm8pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpjcmVh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWU6OnRoZW1lRm9yUGFnZSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OlJlbmRlclRoZW1lQnJldyk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1J
bmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlv
bkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnBs
YXRmb3JtVGV4dFNlYXJjaEhpZ2hsaWdodENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQnJldzo6YmFzZWxpbmVQb3NpdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUJyZXc6OmFkZEludHJpbnNpY01hcmdpbnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVCcmV3OjphZGp1c3RCdXR0b25TdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUJyZXc6OnBhaW50Q2hlY2tib3hPclJhZGlvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lQnJldzo6cGFpbnRDaGVja2JveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6
cGFpbnRSYWRpbyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnNldENoZWNr
Ym94U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OnNldFJhZGlvU2l6
ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFRleHRGaWVsZFN0
eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRUZXh0RmllbGQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RUZXh0QXJlYVN0eWxl
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRUZXh0QXJlYSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdFNlYXJjaEZpZWxkU3R5bGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwYWludFNlYXJjaEZpZWxkKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6YWRqdXN0TGlzdGJveFN0eWxlKToK
KyAgICAgICAgKFdlYkNvcmU6OmFkanVzdE1lbnVMaXN0U3R5bGVDb21tb24pOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjphZGp1c3RNZW51TGlzdFN0eWxlKToKKyAgICAgICAg
KFdlYkNvcmU6OmJyaWdodGVuQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6cGFpbnRCdXR0b25M
aWtlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6cGFpbnRNZW51TGlzdCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6OmFkanVzdE1lbnVMaXN0QnV0dG9u
U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpwYWludE1lbnVMaXN0
QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6c3VwcG9ydHNGb2N1
c1JpbmcpOgorICAgICAgICAqIHBsYXRmb3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3Lmg6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVCcmV3OjpzdXBwb3J0c0hvdmVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lQnJldzo6c3lzdGVtRm9udCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUJyZXc6Om1pbmltdW1NZW51TGlzdFNpemUpOgorCiAyMDEwLTEw
LTE1ICBTZXJnaW8gVmlsbGFyIFNlbmluICA8c3ZpbGxhckBpZ2FsaWEuY29tPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IE1hcnRpbiBSb2JpbnNvbi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYnJl
dy9SZW5kZXJUaGVtZUJyZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYnJl
dy9SZW5kZXJUaGVtZUJyZXcuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9i
cmV3L1JlbmRlclRoZW1lQnJldy5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDYwIEBACisv
KgorICogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAq
IENvcHlyaWdodCAoQykgMjAwOS0yMDEwIENvbXBhbnkgMTAwLCBJbmMuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZUJyZXcuaCIKKworI2luY2x1ZGUg
IkNvbG9yLmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIk5hdGl2ZUltYWdlU2tpYS5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVu
dGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250ZXh0U2tpYS5oIgorI2luY2x1ZGUgIlNrQ2Fu
dmFzLmgiCisjaW5jbHVkZSAiU2tHcmFkaWVudFNoYWRlci5oIgorI2luY2x1ZGUgIlNrTmluZVBh
dGNoLmgiCisjaW5jbHVkZSAiU2tSZWN0LmgiCisjaW5jbHVkZSAiU2tTaGFkZXIuaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIEJ1dHRvblN0YXRlIHsKKyAgICBCdXR0b25EaXNhYmxl
ZCA9IDAsCisgICAgQnV0dG9uTm9ybWFsLAorICAgIEJ1dHRvbkZvY3VzZWQsCisgICAgQnV0dG9u
UHJlc3NlZCwKKyAgICBCdXR0b25TdGF0ZXMKK307CisKK3N0cnVjdCBQYXRjaERhdGEgeworICAg
IGNvbnN0IGNoYXIqIG5hbWU7CisgICAgaW50OF90IG1hcmdpbjsKK307CisKK3N0YXRpYyBjb25z
dCBQYXRjaERhdGEgc19idXR0b25OYW1lc1tCdXR0b25TdGF0ZXNdID0geworICAgIHsgImJ1dHRv
bk5vcm1hbERpc2FibGVkIiwgOSB9LAorICAgIHsgImJ1dHRvbk5vcm1hbCIsIDkgfSwKKyAgICB7
ICJidXR0b25TZWxlY3RlZCIsIDkgfSwKKyAgICB7ICJidXR0b25QcmVzc2VkIiwgOSB9LAorfTsK
KworZW51bSBPbk9mZlN0YXRlIHsgT2ZmID0gMCwgT24sIE9uT2ZmU3RhdGVzIH07CisKK3N0YXRp
YyBjb25zdCBjaGFyKiBzX2NoZWNrYm94TmFtZXNbT25PZmZTdGF0ZXNdID0geyAiY2hlY2tib3hP
ZmYiLCAiY2hlY2tib3hPbiIsIH07CitzdGF0aWMgY29uc3QgY2hhciogc19yYWRpb05hbWVzW09u
T2ZmU3RhdGVzXSA9IHsgInJhZGlvT2ZmIiwgInJhZGlvT24iLCB9OworCitzdGF0aWMgUmVmUHRy
PEltYWdlPiBzX2J1dHRvbkltYWdlc1tCdXR0b25TdGF0ZXNdOworc3RhdGljIFJlZlB0cjxJbWFn
ZT4gc19jaGVja2JveEltYWdlc1tPbk9mZlN0YXRlc107CitzdGF0aWMgUmVmUHRyPEltYWdlPiBz
X3JhZGlvSW1hZ2VzW09uT2ZmU3RhdGVzXTsKKworc3RhdGljIGNvbnN0IGludCBzX01lbnVMaXN0
QnV0dG9uU2l6ZSA9IDIyOworCitzdGF0aWMgU2tDYW52YXMqIGNhbnZhc0Zyb21JbmZvKGNvbnN0
IFBhaW50SW5mbyYgaW5mbykKK3sKKyAgICByZXR1cm4gaW5mby5jb250ZXh0LT5wbGF0Zm9ybUNv
bnRleHQoKS0+Y2FudmFzKCk7Cit9CisKK1Bhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRo
ZW1lQnJldzo6Y3JlYXRlKCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJlbmRlclRoZW1l
QnJldygpKTsKK30KKworUGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gUmVuZGVyVGhlbWU6OnRoZW1l
Rm9yUGFnZShQYWdlKikKK3sKKyAgICBzdGF0aWMgUmVuZGVyVGhlbWUqIHJlbmRlclRoZW1lID0g
UmVuZGVyVGhlbWVCcmV3OjpjcmVhdGUoKS5yZWxlYXNlUmVmKCk7CisgICAgcmV0dXJuIHJlbmRl
clRoZW1lOworfQorCitSZW5kZXJUaGVtZUJyZXc6OlJlbmRlclRoZW1lQnJldygpCit7CisgICAg
aW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQnV0dG9uU3RhdGVzOyArK2kpIHsKKyAgICAg
ICAgc19idXR0b25JbWFnZXNbaV0gPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2Uoc19idXR0
b25OYW1lc1tpXS5uYW1lKTsKKyAgICAgICAgQVNTRVJUKCFzX2J1dHRvbkltYWdlc1tpXS0+aXNO
dWxsKCkpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBPbk9mZlN0YXRlczsgKytpKSB7
CisgICAgICAgIHNfY2hlY2tib3hJbWFnZXNbaV0gPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3Vy
Y2Uoc19jaGVja2JveE5hbWVzW2ldKTsKKyAgICAgICAgQVNTRVJUKCFzX2NoZWNrYm94SW1hZ2Vz
W2ldLT5pc051bGwoKSk7CisKKyAgICAgICAgc19yYWRpb0ltYWdlc1tpXSA9IEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZShzX3JhZGlvTmFtZXNbaV0pOworICAgICAgICBBU1NFUlQoIXNfcmFk
aW9JbWFnZXNbaV0tPmlzTnVsbCgpKTsKKyAgICB9Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lQnJl
dzo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAg
IC8vIFRoaXMgaXMgdGhlIGNvbG9yIG9mIHNlbGVjdGlvbiBpbiBhIHRleHRmaWVsZC4gIEl0IHdh
cyBvYnRhaW5lZCBieSBjaGVja2luZworICAgIC8vIHRoZSBjb2xvciBvZiBzZWxlY3Rpb24gaW4g
VGV4dFZpZXdzIGluIHRoZSBzeXN0ZW0uCisgICAgY29uc3QgUkdCQTMyIHNlbGVjdGlvbkNvbG9y
ID0gbWFrZVJHQigyNTUsIDE0NiwgMCk7CisKKyAgICByZXR1cm4gQ29sb3Ioc2VsZWN0aW9uQ29s
b3IpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rp
b25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcihDb2xvcjo6dHJh
bnNwYXJlbnQpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtQWN0aXZlU2Vs
ZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3I6OmJsYWNr
OworfQorCitDb2xvciBSZW5kZXJUaGVtZUJyZXc6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25G
b3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBDb2xvcjo6YmxhY2s7Cit9CisK
K0NvbG9yIFJlbmRlclRoZW1lQnJldzo6cGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29sb3Io
KSBjb25zdAoreworICAgIHJldHVybiBDb2xvcihDb2xvcjo6dHJhbnNwYXJlbnQpOworfQorCitp
bnQgUmVuZGVyVGhlbWVCcmV3OjpiYXNlbGluZVBvc2l0aW9uKGNvbnN0IFJlbmRlck9iamVjdCog
b2JqKSBjb25zdAoreworICAgIC8vIEZyb20gdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZnVuY3Rp
b24gaW4gUmVuZGVyVGhlbWUuaDoKKyAgICAvLyBBIG1ldGhvZCB0byBvYnRhaW4gdGhlIGJhc2Vs
aW5lIHBvc2l0aW9uIGZvciBhICJsZWFmIiBjb250cm9sLiAgVGhpcyB3aWxsIG9ubHkgYmUgdXNl
ZCBpZiBhIGJhc2VsaW5lCisgICAgLy8gcG9zaXRpb24gY2Fubm90IGJlIGRldGVybWluZWQgYnkg
ZXhhbWluaW5nIGNoaWxkIGNvbnRlbnQuIENoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgYXJl
IGV4YW1wbGVzIG9mCisgICAgLy8gY29udHJvbHMgdGhhdCBuZWVkIHRvIGRvIHRoaXMuCisgICAg
Ly8KKyAgICAvLyBPdXIgY2hlY2tib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyBuZWVkIHRvIGJlIG9m
ZnNldCB0byBsaW5lIHVwIHByb3Blcmx5LgorICAgIHJldHVybiBSZW5kZXJUaGVtZTo6YmFzZWxp
bmVQb3NpdGlvbihvYmopIC0gNTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkZEludHJp
bnNpY01hcmdpbnMoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIEN1dCBvdXQg
dGhlIGludHJpbnNpYyBtYXJnaW5zIGNvbXBsZXRlbHkgaWYgd2UgZW5kIHVwIHVzaW5nIGEgc21h
bGwgZm9udCBzaXplCisgICAgaWYgKHN0eWxlLT5mb250U2l6ZSgpIDwgMTEpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIEludHJpbnNpYyBtYXJnaW4gdmFsdWUuCisgICAgY29uc3QgaW50IG0g
PSAyOworCisgICAgLy8gRklYTUU6IFVzaW5nIHdpZHRoL2hlaWdodCBhbG9uZSBhbmQgbm90IGFs
c28gZGVhbGluZyB3aXRoIG1pbi13aWR0aC9tYXgtd2lkdGggaXMgZmxhd2VkLgorICAgIGlmIChz
dHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKSB7CisgICAgICAgIGlmIChzdHlsZS0+
bWFyZ2luTGVmdCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luTGVmdChM
ZW5ndGgobSwgRml4ZWQpKTsKKyAgICAgICAgaWYgKHN0eWxlLT5tYXJnaW5SaWdodCgpLnF1aXJr
KCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luUmlnaHQoTGVuZ3RoKG0sIEZpeGVkKSk7
CisgICAgfQorCisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkgeworICAgICAgICBp
ZiAoc3R5bGUtPm1hcmdpblRvcCgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFy
Z2luVG9wKExlbmd0aChtLCBGaXhlZCkpOworICAgICAgICBpZiAoc3R5bGUtPm1hcmdpbkJvdHRv
bSgpLnF1aXJrKCkpCisgICAgICAgICAgICBzdHlsZS0+c2V0TWFyZ2luQm90dG9tKExlbmd0aCht
LCBGaXhlZCkpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFkanVzdEJ1dHRv
blN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIFdlYkNvcmU6OkVs
ZW1lbnQqKSBjb25zdAoreworICAgIC8vIEFkZCBhIGNvbnN0YW50IGFtb3VudCBvZiBwYWRkaW5n
IHRvIHRoZSB0ZXh0c2l6ZSB0byBnZXQgdGhlIGZpbmFsIGhlaWdodAorICAgIC8vIG9mIGJ1dHRv
bnMsIHNvIHRoYXQgb3VyIGJ1dHRvbiBpbWFnZXMgYXJlIGxhcmdlIGVub3VnaCB0byBwcm9wZXJs
eSBmaXQKKyAgICAvLyB0aGUgdGV4dC4KKyAgICBjb25zdCBpbnQgYnV0dG9uUGFkZGluZyA9IDE4
OworCisgICAgLy8gUGFkZGluZyBjb2RlIGlzIHRha2VuIGZyb20gUmVuZGVyVGhlbWVTYWZhcmku
Y3BwCisgICAgLy8gSXQgbWFrZXMgc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIGJ1
dHRvbiB0ZXh0LgorICAgIGNvbnN0IGludCBwYWRkaW5nID0gODsKKworICAgIHN0eWxlLT5zZXRQ
YWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGlu
Z1JpZ2h0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRNaW5IZWlnaHQo
TGVuZ3RoKHN0eWxlLT5mb250U2l6ZSgpICsgYnV0dG9uUGFkZGluZywgRml4ZWQpKTsKK30KKwor
Citib29sIFJlbmRlclRoZW1lQnJldzo6cGFpbnRDaGVja2JveE9yUmFkaW8oUmVuZGVyT2JqZWN0
KiBvYmosIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCBp
c1JhZGlvKQoreworICAgIGJvb2wgY2hlY2tlZCA9IGlzQ2hlY2tlZChvYmopOworCisgICAgU2tS
ZWN0IHIocmVjdCk7CisgICAgU2tQYWludCBwYWludDsKKyAgICBwYWludC5zZXRGbGFncyhTa1Bh
aW50OjprRmlsdGVyQml0bWFwX0ZsYWcpOworCisgICAgaWYgKCFpc0VuYWJsZWQob2JqKSkKKyAg
ICAgICAgcGFpbnQuc2V0QWxwaGEoMHg4MCk7CisKKyAgICBTa0JpdG1hcCYgYml0bWFwID0gaXNS
YWRpbyA/ICpzX3JhZGlvSW1hZ2VzW2NoZWNrZWRdLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFt
ZSgpIDogKnNfY2hlY2tib3hJbWFnZXNbY2hlY2tlZF0tPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZy
YW1lKCk7CisKKyAgICBTa1NjYWxhciB3aWR0aCA9IHJlY3Qud2lkdGgoKTsKKyAgICBTa1NjYWxh
ciBzY2FsZSA9IFNrU2NhbGFyRGl2KHdpZHRoLCBTa0ludFRvU2NhbGFyKGJpdG1hcC53aWR0aCgp
KSk7CisgICAgU2tDYW52YXMqIGNhbnZhcyA9IGNhbnZhc0Zyb21JbmZvKGluZm8pOworICAgIGlu
dCBzYXZlU2NhbGVDb3VudCA9IGNhbnZhcy0+c2F2ZSgpOworICAgIGNhbnZhcy0+dHJhbnNsYXRl
KHIuZkxlZnQsIHIuZlRvcCk7CisgICAgY2FudmFzLT5zY2FsZShzY2FsZSwgc2NhbGUpOworCisg
ICAgY2FudmFzLT5kcmF3Qml0bWFwKGJpdG1hcCwgMCwgMCwgJnBhaW50KTsKKyAgICBjYW52YXMt
PnJlc3RvcmVUb0NvdW50KHNhdmVTY2FsZUNvdW50KTsKKworICAgIHJldHVybiBmYWxzZTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBvYmos
IGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1
cm4gcGFpbnRDaGVja2JveE9yUmFkaW8ob2JqLCBpbmZvLCByZWN0LCBmYWxzZSk7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVCcmV3OjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iaiwgY29uc3Qg
UGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEJ1dHRvblN0YXRl
IHN0YXRlOworICAgIGlmIChpc0VuYWJsZWQob2JqKSkgeworICAgICAgICBpZiAoaXNQcmVzc2Vk
KG9iaikpCisgICAgICAgICAgICBzdGF0ZSA9IEJ1dHRvblByZXNzZWQ7CisgICAgICAgIGVsc2Ug
aWYgKGlzRm9jdXNlZChvYmopKQorICAgICAgICAgICAgc3RhdGUgPSBCdXR0b25Gb2N1c2VkOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0ZSA9IEJ1dHRvbk5vcm1hbDsKKyAgICB9IGVs
c2UKKyAgICAgICAgc3RhdGUgPSBCdXR0b25EaXNhYmxlZDsKKworICAgIFNrUmVjdCBib3VuZHMo
cmVjdCk7CisgICAgaW50IG1hcmdpblZhbHVlID0gc19idXR0b25OYW1lc1tzdGF0ZV0ubWFyZ2lu
OworICAgIFNrSVJlY3QgbWFyZ2luOworICAgIG1hcmdpbi5zZXQobWFyZ2luVmFsdWUsIG1hcmdp
blZhbHVlLCBtYXJnaW5WYWx1ZSwgbWFyZ2luVmFsdWUpOworICAgIFNrQml0bWFwJiBiaXRtYXAg
PSAqc19idXR0b25JbWFnZXNbc3RhdGVdLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOwor
CisgICAgU2tOaW5lUGF0Y2g6OkRyYXdOaW5lKGNhbnZhc0Zyb21JbmZvKGluZm8pLCBib3VuZHMs
IGJpdG1hcCwgbWFyZ2luKTsKKworICAgIC8vIFdlIGFsd2F5cyByZXR1cm4gZmFsc2Ugc28gd2Ug
ZG8gbm90IHJlcXVlc3QgdG8gYmUgcmVkcmF3bi4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVCcmV3OjpwYWludFJhZGlvKFJlbmRlck9iamVjdCogb2JqLCBjb25zdCBQ
YWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50
Q2hlY2tib3hPclJhZGlvKG9iaiwgaW5mbywgcmVjdCwgdHJ1ZSk7Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVCcmV3OjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAorewor
ICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoMTksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEhl
aWdodChMZW5ndGgoMTksIEZpeGVkKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCcmV3OjpzZXRS
YWRpb1NpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIFRoaXMgaXMgdGhl
IHNhbWUgYXMgY2hlY2tib3hlcy4KKyAgICBzZXRDaGVja2JveFNpemUoc3R5bGUpOworfQorCit2
b2lkIFJlbmRlclRoZW1lQnJldzo6YWRqdXN0VGV4dEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3Rv
ciosIFJlbmRlclN0eWxlKiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVudCopIGNvbnN0Cit7CisgICAg
YWRkSW50cmluc2ljTWFyZ2lucyhzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCcmV3Ojpw
YWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRS
ZWN0JikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJyZXc6OmFk
anVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwg
V2ViQ29yZTo6RWxlbWVudCopIGNvbnN0Cit7CisgICAgYWRkSW50cmluc2ljTWFyZ2lucyhzdHls
ZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVCcmV3OjpwYWludFRleHRBcmVhKFJlbmRlck9iamVj
dCogb2JqLCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVCcmV3OjphZGp1c3RTZWFyY2hG
aWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQq
KSBjb25zdAoreworICAgIGFkZEludHJpbnNpY01hcmdpbnMoc3R5bGUpOworfQorCitib29sIFJl
bmRlclRoZW1lQnJldzo6cGFpbnRTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWlu
dEluZm8mLCBjb25zdCBJbnRSZWN0JikKK3sKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBS
ZW5kZXJUaGVtZUJyZXc6OmFkanVzdExpc3Rib3hTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVu
ZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKK3sKKyAgICAvLyBBZGQgcGFkZGluZyB0
byB0aGUgZm9udFNpemUgb2YgTGlzdEJveGVzIHRvIGdldCB0aGVpciBtYXhpbXVtIHNpemVzLgor
ICAgIC8vIExpc3Rib3hlcyBvZnRlbiBoYXZlIGEgc3BlY2lmaWVkIHNpemUuICBTaW5jZSB3ZSBj
aGFuZ2UgdGhlbSBpbnRvCisgICAgLy8gZHJvcGRvd25zLCB3ZSB3YW50IGEgbXVjaCBzbWFsbGVy
IGhlaWdodCwgd2hpY2ggZW5jb21wYXNzZXMgdGhlIHRleHQuCisgICAgY29uc3QgaW50IGxpc3Ri
b3hQYWRkaW5nID0gNTsKKworICAgIHN0eWxlLT5zZXRNYXhIZWlnaHQoTGVuZ3RoKHN0eWxlLT5m
b250U2l6ZSgpICsgbGlzdGJveFBhZGRpbmcsIEZpeGVkKSk7CisgICAgYWRkSW50cmluc2ljTWFy
Z2lucyhzdHlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkanVzdE1lbnVMaXN0U3R5bGVDb21tb24o
UmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKQoreworICAgIC8vIENvZGUgY29waWVkIGZy
b20gUmVuZGVyVGhlbWVNYWMubW0KKyAgICAvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIHRleHQgc2hv
d3MgdXAgb24gb3VyIHRyZWF0bWVudAorICAgIGJvb2wgaXNFbmFibGVkID0gZS0+aXNFbmFibGVk
Rm9ybUNvbnRyb2woKTsKKyAgICBzdHlsZS0+c2V0Q29sb3IoaXNFbmFibGVkID8gQ29sb3I6OmJs
YWNrIDogQ29sb3I6OmRhcmtHcmF5KTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0
aChzX01lbnVMaXN0QnV0dG9uU2l6ZSwgRml4ZWQpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUJy
ZXc6OmFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBz
dHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sKKyAgICBhZGp1c3RNZW51TGlzdFN0eWxlQ29tbW9u
KHN0eWxlLCBlKTsKKyAgICBhZGRJbnRyaW5zaWNNYXJnaW5zKHN0eWxlKTsKK30KKworc3RhdGlj
IFNrQ29sb3IgYnJpZ2h0ZW5Db2xvcihkb3VibGUgaHVlLCBkb3VibGUgc2F0dXJhdGlvbiwgZG91
YmxlIGxpZ2h0bmVzcywgZmxvYXQgYnJpZ2h0ZW5BbW91bnQpCit7CisgICAgbGlnaHRuZXNzICs9
IGJyaWdodGVuQW1vdW50OworICAgIGlmIChsaWdodG5lc3MgPiAxLjApCisgICAgICAgIGxpZ2h0
bmVzcyA9IDEuMDsKKyAgICBpZiAobGlnaHRuZXNzIDwgMC4wKQorICAgICAgICBsaWdodG5lc3Mg
PSAwLjA7CisKKyAgICByZXR1cm4gbWFrZVJHQkFGcm9tSFNMQShodWUsIHNhdHVyYXRpb24sIGxp
Z2h0bmVzcywgMS4wKTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRCdXR0b25MaWtlKFJlbmRlclRo
ZW1lKiB0aGVtZSwgUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgU2tDYW52YXMqIGNvbnN0IGNhbnZhcyA9IGkuY29udGV4dC0+
cGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygpOworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgU2tS
ZWN0IHNrcmVjdDsKKyAgICBjb25zdCBpbnQgcmlnaHQgPSByZWN0LngoKSArIHJlY3Qud2lkdGgo
KTsKKyAgICBjb25zdCBpbnQgYm90dG9tID0gcmVjdC55KCkgKyByZWN0LmhlaWdodCgpOworICAg
IFNrQ29sb3IgYmFzZUNvbG9yID0gU2tDb2xvclNldEFSR0IoMHhmZiwgMHhkZCwgMHhkZCwgMHhk
ZCk7CisgICAgaWYgKG8tPmhhc0JhY2tncm91bmQoKSkKKyAgICAgICAgYmFzZUNvbG9yID0gby0+
c3R5bGUoKS0+dmlzaXRlZERlcGVuZGVudENvbG9yKENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9y
KS5yZ2IoKTsKKyAgICBkb3VibGUgaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3M7CisgICAgQ29s
b3IoYmFzZUNvbG9yKS5nZXRIU0woaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MpOworICAgIC8v
IE91ciBzdGFuZGFyZCBncmFkaWVudCBpcyBmcm9tIDB4ZGQgdG8gMHhmOC4gVGhpcyBpcyB0aGUg
YW1vdW50IG9mCisgICAgLy8gaW5jcmVhc2VkIGxpZ2h0bmVzc3VtaW5hbmNlIGJldHdlZW4gdGhv
c2UgdmFsaWdodG5lc3N1ZXMuCisgICAgU2tDb2xvciBsaWdodENvbG9yKGJyaWdodGVuQ29sb3Io
aHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIDAuMTA1KSk7CisKKyAgICAvLyBJZiB0aGUgYnV0
dG9uIGlzIHRvbyBzbWFsbCwgZmFsbGJhY2sgdG8gZHJhd2luZyBhIHNpbmdsZSwgc29saWQgY29s
b3IKKyAgICBpZiAocmVjdC53aWR0aCgpIDwgNSB8fCByZWN0LmhlaWdodCgpIDwgNSkgeworICAg
ICAgICBwYWludC5zZXRDb2xvcihiYXNlQ29sb3IpOworICAgICAgICBza3JlY3Quc2V0KHJlY3Qu
eCgpLCByZWN0LnkoKSwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgIGNhbnZhcy0+ZHJhd1JlY3Qo
c2tyZWN0LCBwYWludCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBpbnQg
Ym9yZGVyQWxwaGEgPSB0aGVtZS0+aXNIb3ZlcmVkKG8pID8gMHg4MCA6IDB4NTU7CisgICAgcGFp
bnQuc2V0QVJHQihib3JkZXJBbHBoYSwgMCwgMCwgMCk7CisgICAgY2FudmFzLT5kcmF3TGluZShy
ZWN0LngoKSArIDEsIHJlY3QueSgpLCByaWdodCAtIDEsIHJlY3QueSgpLCBwYWludCk7CisgICAg
Y2FudmFzLT5kcmF3TGluZShyaWdodCAtIDEsIHJlY3QueSgpICsgMSwgcmlnaHQgLSAxLCBib3R0
b20gLSAxLCBwYWludCk7CisgICAgY2FudmFzLT5kcmF3TGluZShyZWN0LngoKSArIDEsIGJvdHRv
bSAtIDEsIHJpZ2h0IC0gMSwgYm90dG9tIC0gMSwgcGFpbnQpOworICAgIGNhbnZhcy0+ZHJhd0xp
bmUocmVjdC54KCksIHJlY3QueSgpICsgMSwgcmVjdC54KCksIGJvdHRvbSAtIDEsIHBhaW50KTsK
KworICAgIHBhaW50LnNldENvbG9yKFNLX0NvbG9yQkxBQ0spOworICAgIFNrUG9pbnQgcFsyXTsK
KyAgICBjb25zdCBpbnQgbGlnaHRFbmQgPSB0aGVtZS0+aXNQcmVzc2VkKG8pID8gMSA6IDA7Cisg
ICAgY29uc3QgaW50IGRhcmtFbmQgPSAhbGlnaHRFbmQ7CisgICAgcFtsaWdodEVuZF0uc2V0KFNr
SW50VG9TY2FsYXIocmVjdC54KCkpLCBTa0ludFRvU2NhbGFyKHJlY3QueSgpKSk7CisgICAgcFtk
YXJrRW5kXS5zZXQoU2tJbnRUb1NjYWxhcihyZWN0LngoKSksIFNrSW50VG9TY2FsYXIoYm90dG9t
IC0gMSkpOworICAgIFNrQ29sb3IgY29sb3JzWzJdOworICAgIGNvbG9yc1swXSA9IGxpZ2h0Q29s
b3I7CisgICAgY29sb3JzWzFdID0gYmFzZUNvbG9yOworCisgICAgU2tTaGFkZXIqIHNoYWRlciA9
IFNrR3JhZGllbnRTaGFkZXI6OkNyZWF0ZUxpbmVhcigKKyAgICAgICAgcCwgY29sb3JzLCAwLCAy
LCBTa1NoYWRlcjo6a0NsYW1wX1RpbGVNb2RlLCAwKTsKKyAgICBwYWludC5zZXRTdHlsZShTa1Bh
aW50OjprRmlsbF9TdHlsZSk7CisgICAgcGFpbnQuc2V0U2hhZGVyKHNoYWRlcik7CisgICAgc2hh
ZGVyLT51bnJlZigpOworCisgICAgc2tyZWN0LnNldChyZWN0LngoKSArIDEsIHJlY3QueSgpICsg
MSwgcmlnaHQgLSAxLCBib3R0b20gLSAxKTsKKyAgICBjYW52YXMtPmRyYXdSZWN0KHNrcmVjdCwg
cGFpbnQpOworCisgICAgcGFpbnQuc2V0U2hhZGVyKDApOworICAgIHBhaW50LnNldENvbG9yKGJy
aWdodGVuQ29sb3IoaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIC0wLjA1ODgpKTsKKyAgICBj
YW52YXMtPmRyYXdQb2ludChyZWN0LngoKSArIDEsIHJlY3QueSgpICsgMSwgcGFpbnQpOworICAg
IGNhbnZhcy0+ZHJhd1BvaW50KHJpZ2h0IC0gMiwgcmVjdC55KCkgKyAxLCBwYWludCk7CisgICAg
Y2FudmFzLT5kcmF3UG9pbnQocmVjdC54KCkgKyAxLCBib3R0b20gLSAyLCBwYWludCk7CisgICAg
Y2FudmFzLT5kcmF3UG9pbnQocmlnaHQgLSAyLCBib3R0b20gLSAyLCBwYWludCk7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVCcmV3OjpwYWludE1lbnVMaXN0KFJlbmRlck9iamVjdCogb2JqLCBjb25z
dCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgU2tDYW52YXMq
IGNvbnN0IGNhbnZhcyA9IGluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmNhbnZhcygp
OworICAgIGNvbnN0IGludCByaWdodCA9IHJlY3QueCgpICsgcmVjdC53aWR0aCgpOworICAgIGNv
bnN0IGludCBtaWRkbGUgPSByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkgLyAyOworCisgICAgcGFp
bnRCdXR0b25MaWtlKHRoaXMsIG9iaiwgaW5mbywgcmVjdCk7CisKKyAgICAvLyBGSVhNRTogV3Jh
cCBhcnJvdyB3aXRoIGEgYm94CisgICAgSW50UmVjdCByZWN0QnV0dG9uKHJlY3QueCgpICsgcmVj
dC53aWR0aCgpIC0gKHNfTWVudUxpc3RCdXR0b25TaXplIC0gNCksIHJlY3QueSgpICsgMiwgc19N
ZW51TGlzdEJ1dHRvblNpemUgLSA2LCByZWN0LmhlaWdodCgpIC0gNCk7CisgICAgcGFpbnRCdXR0
b25MaWtlKHRoaXMsIG9iaiwgaW5mbywgcmVjdEJ1dHRvbik7CisKKyAgICBTa1BhaW50IHBhaW50
OworICAgIHBhaW50LnNldENvbG9yKFNLX0NvbG9yQkxBQ0spOworICAgIHBhaW50LnNldEFudGlB
bGlhcyh0cnVlKTsKKyAgICBwYWludC5zZXRTdHlsZShTa1BhaW50OjprRmlsbF9TdHlsZSk7CisK
KyAgICBpbnQgYXJyb3dYUG9zaXRpb24gPSAob2JqLT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBS
VEwpID8gcmVjdC54KCkgKyA3IDogcmlnaHQgLSAxMzsKKyAgICBTa1BhdGggcGF0aDsKKyAgICBw
YXRoLm1vdmVUbyhhcnJvd1hQb3NpdGlvbiwgbWlkZGxlIC0gMyk7CisgICAgcGF0aC5yTGluZVRv
KDYsIDApOworICAgIHBhdGguckxpbmVUbygtMywgNik7CisgICAgcGF0aC5jbG9zZSgpOworICAg
IGNhbnZhcy0+ZHJhd1BhdGgocGF0aCwgcGFpbnQpOworCisgICAgcmV0dXJuIGZhbHNlOworfQor
Cit2b2lkIFJlbmRlclRoZW1lQnJldzo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHls
ZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25z
dAoreworICAgIC8vIENvcGllZCBmcm9tIFJlbmRlclRoZW1lU2FmYXJpLgorICAgIGNvbnN0IGZs
b2F0IGJhc2VGb250U2l6ZSA9IDExLjBmOworICAgIGNvbnN0IGludCBiYXNlQm9yZGVyUmFkaXVz
ID0gNTsKKyAgICBmbG9hdCBmb250U2NhbGUgPSBzdHlsZS0+Zm9udFNpemUoKSAvIGJhc2VGb250
U2l6ZTsKKworICAgIHN0eWxlLT5yZXNldFBhZGRpbmcoKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVy
UmFkaXVzKEludFNpemUoaW50KGJhc2VCb3JkZXJSYWRpdXMgKyBmb250U2NhbGUgLSAxKSwgaW50
KGJhc2VCb3JkZXJSYWRpdXMgKyBmb250U2NhbGUgLSAxKSkpOyAvLyBGSVhNRTogUm91bmQgdXA/
CisKKyAgICBjb25zdCBpbnQgbWluSGVpZ2h0ID0gMTU7CisgICAgc3R5bGUtPnNldE1pbkhlaWdo
dChMZW5ndGgobWluSGVpZ2h0LCBGaXhlZCkpOworCisgICAgc3R5bGUtPnNldExpbmVIZWlnaHQo
UmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworICAgIC8vIEZvdW5kIHRoZXNlIHBh
ZGRpbmcgbnVtYmVycyBieSB0cmlhbCBhbmQgZXJyb3IuCisgICAgY29uc3QgaW50IHBhZGRpbmcg
PSA0OworICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwor
ICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywgRml4ZWQpKTsKKyAgICBh
ZGp1c3RNZW51TGlzdFN0eWxlQ29tbW9uKHN0eWxlLCBlKTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUJyZXc6OnBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiBvYmosIGNvbnN0IFBhaW50
SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkgCit7CisgICAgcmV0dXJuIHBhaW50TWVu
dUxpc3Qob2JqLCBpbmZvLCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUJyZXc6OnN1cHBv
cnRzRm9jdXNSaW5nKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICByZXR1
cm4gc3R5bGUtPm9wYWNpdHkoKSA+IDAKKyAgICAgICAgJiYgc3R5bGUtPmhhc0FwcGVhcmFuY2Uo
KQorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IFRleHRGaWVsZFBhcnQKKyAgICAg
ICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBTZWFyY2hGaWVsZFBhcnQKKyAgICAgICAgJiYg
c3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBUZXh0QXJlYVBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFw
cGVhcmFuY2UoKSAhPSBDaGVja2JveFBhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2Uo
KSAhPSBSYWRpb1BhcnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBQdXNoQnV0
dG9uUGFydAorICAgICAgICAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IFNxdWFyZUJ1dHRvblBh
cnQKKyAgICAgICAgJiYgc3R5bGUtPmFwcGVhcmFuY2UoKSAhPSBCdXR0b25QYXJ0CisgICAgICAg
ICYmIHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gQnV0dG9uQmV2ZWxQYXJ0CisgICAgICAgICYmIHN0
eWxlLT5hcHBlYXJhbmNlKCkgIT0gTWVudWxpc3RQYXJ0CisgICAgICAgICYmIHN0eWxlLT5hcHBl
YXJhbmNlKCkgIT0gTWVudWxpc3RCdXR0b25QYXJ0OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2JyZXcvUmVuZGVyVGhlbWVCcmV3LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9icmV3L1JlbmRlclRoZW1lQnJldy5oCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9icmV3L1JlbmRlclRoZW1lQnJldy5oCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lk
IE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIENvbXBhbnkg
MTAwLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmVuZGVyVGhlbWVCcmV3X2gKKyNkZWZpbmUgUmVu
ZGVyVGhlbWVCcmV3X2gKKworI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworY2xhc3MgUmVuZGVyVGhlbWVCcmV3IDogcHVibGljIFJlbmRlclRoZW1lIHsK
K3ByaXZhdGU6CisgICAgUmVuZGVyVGhlbWVCcmV3KCk7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxSZW5kZXJUaGVtZT4gY3JlYXRlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc3Vw
cG9ydHNGb2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICAvLyBBIG1ldGhv
ZCBhc2tpbmcgaWYgdGhlIHRoZW1lJ3MgY29udHJvbHMgYWN0dWFsbHkgY2FyZSBhYm91dCByZWRy
YXdpbmcgd2hlbiBob3ZlcmVkLgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0hvdmVyKGNvbnN0
IFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QgeyByZXR1cm4gc3R5bGUtPmFmZmVjdGVkQnlIb3Zl
clJ1bGVzKCk7IH0KKworICAgIHZpcnR1YWwgaW50IGJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVu
ZGVyT2JqZWN0KikgY29uc3Q7CisKKyAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtQWN0aXZlU2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9y
bUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBD
b2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAg
IHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigp
IGNvbnN0OworICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29s
b3IoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBzeXN0ZW1Gb250KGludCwgV2ViQ29yZTo6
Rm9udERlc2NyaXB0aW9uJikgY29uc3Qge30KKworICAgIHZpcnR1YWwgaW50IG1pbmltdW1NZW51
TGlzdFNpemUoUmVuZGVyU3R5bGUqKSBjb25zdCB7IHJldHVybiAwOyB9CisKK3Byb3RlY3RlZDoK
KyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDaGVja2JveE9yUmFkaW8oUmVuZGVyT2JqZWN0KiwgY29u
c3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYsIGJvb2wgaXNSYWRpbyk7CisKKyAgICB2aXJ0
dWFsIGJvb2wgcGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIHNldENoZWNrYm94U2l6ZShSZW5kZXJT
dHlsZSopIGNvbnN0OworCisgICAgdmlydHVhbCBib29sIHBhaW50UmFkaW8oUmVuZGVyT2JqZWN0
KiwgY29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCBz
ZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGp1
c3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBXZWJDb3JlOjpF
bGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50QnV0dG9uKFJlbmRlck9iamVj
dCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZpcnR1YWwgdm9p
ZCBhZGp1c3RUZXh0RmllbGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBX
ZWJDb3JlOjpFbGVtZW50KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxk
KFJlbmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAg
IHZpcnR1YWwgdm9pZCBhZGp1c3RUZXh0QXJlYVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5k
ZXJTdHlsZSosIFdlYkNvcmU6OkVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFp
bnRUZXh0QXJlYShSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0
Jik7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TGlzdGJveFN0eWxlKENTU1N0eWxlU2VsZWN0
b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRq
dXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50
KikgY29uc3Q7CisgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgUGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgdmlydHVhbCB2b2lkIGFk
anVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OworICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJl
bmRlck9iamVjdCosIGNvbnN0IFBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgIHZp
cnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5k
ZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTZWFyY2hG
aWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisK
K3ByaXZhdGU6CisgICAgdm9pZCBhZGRJbnRyaW5zaWNNYXJnaW5zKFJlbmRlclN0eWxlKikgY29u
c3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZW5kZXJUaGVt
ZUJyZXdfaAorCg==
</data>
<flag name="review"
          id="60806"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>