<?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>35932</bug_id>
          
          <creation_ts>2010-03-09 11:20:35 -0800</creation_ts>
          <short_desc>[EFL] Add ewk_view.{cpp,h} to WK/efl/ewk.</short_desc>
          <delta_ts>2010-04-07 09:33:55 -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>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Leandro Pereira">leandro</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>barbieri</cc>
    
    <cc>bunhere</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>gustavo</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>hyuki.a.kim</cc>
    
    <cc>hyuki.kim</cc>
    
    <cc>joone.hur</cc>
    
    <cc>rakuco</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>197680</commentid>
    <comment_count>0</comment_count>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2010-03-09 11:20:35 -0800</bug_when>
    <thetext>+++ This bug was initially created as a clone of Bug #35059 +++

The attached patch adds ewk_view.cpp and ewk_view.h to WebKit/efl/ewk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>197684</commentid>
    <comment_count>1</comment_count>
      <attachid>50331</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2010-03-09 11:21:38 -0800</bug_when>
    <thetext>Created attachment 50331
Add ewk_view to WK/efl/ewk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199863</commentid>
    <comment_count>2</comment_count>
      <attachid>50331</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-15 15:26:04 -0700</bug_when>
    <thetext>Comment on attachment 50331
Add ewk_view to WK/efl/ewk.

I don&apos;t understand how anyone is supposed to review this.

I assume EFL/EWK are not supposed to conform to webkit.org style?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199864</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-15 15:26:41 -0700</bug_when>
    <thetext>I don&apos;t think any webkit.org reviewer knows EFL/EWK, so the best we could offer is a rubber-stamp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199940</commentid>
    <comment_count>4</comment_count>
    <who name="Gustavo Sverzut Barbieri">barbieri</who>
    <bug_when>2010-03-15 18:04:02 -0700</bug_when>
    <thetext>Hi Eric,

There are lots of EFL specific bits, yes... but I&apos;d like to have your review on couple of critical functions, specially those that have PassPtr and RefPtr in their signature... I did these based on GTK, Qt and couple of others, I guess they are all fine, but extra review would be awesome! :-) These functions should have not much of EFL, it&apos;s more about WebKit.

The rest just feel free to ignore if you wish, we wrote it like most of other EFL code, so it&apos;s very C-ish and all. But it works like a charm :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200394</commentid>
    <comment_count>5</comment_count>
      <attachid>50331</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2010-03-16 13:24:11 -0700</bug_when>
    <thetext>Comment on attachment 50331
Add ewk_view to WK/efl/ewk.

 169 static inline void _ewk_view_smart_changed(Ewk_View_Smart_Data* sd)

There are several inline markers in this code. In WebKit land we&apos;re averse to premature, unmeasured optimization. If you have measured that this helps, this should be OK, but if you haven&apos;t I&apos;d recommend leaving this up to the compiler.

 478 static inline WTF::PassRefPtr&lt;WebCore::Frame&gt; _ewk_view_core_frame_new(Ewk_View_Smart_Data* sd, Ewk_View_Private_Data* priv, WebCore::HTMLFrameOwnerElement* owner)
[...]
 488     return WebCore::Frame::create(priv-&gt;page, owner, flc).get();

This is wrong. Frame::create will adopt the ref a RefPtr is holding, and return a PassRefPtr already. What you&apos;re doing here is you are getting the raw pointer, and returning it. When the returned PassRefPtr goes out of scope the frame will likely be deleted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205524</commentid>
    <comment_count>6</comment_count>
      <attachid>51927</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2010-03-29 10:38:12 -0700</bug_when>
    <thetext>Created attachment 51927
Add ewk_view to WK/efl/ewk.

Revised patch, with requested changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205526</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-03-29 10:42:30 -0700</bug_when>
    <thetext>Attachment 51927 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebKit/efl/ewk/ewk_view.cpp:29:  Alphabetical sorting problem.  [build/include_order] [4]
WebKit/efl/ewk/ewk_view.cpp:30:  &quot;EditorClientEfl.h&quot; already included at WebKit/efl/ewk/ewk_view.cpp:28  [build/include] [4]
WebKit/efl/ewk/ewk_view.cpp:545:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:2269:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:2270:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:2277:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:2984:  Declaration has space between type name and * in Evas_Object *frame  [whitespace/declaration] [3]
WebKit/efl/ewk/ewk_view.cpp:3042:  Declaration has space between type name and * in Evas_Object *frame  [whitespace/declaration] [3]
WebKit/efl/ewk/ewk_view.cpp:3117:  Declaration has space between type name and * in Evas_Object *ewk_view_window_create  [whitespace/declaration] [3]
WebKit/efl/ewk/ewk_view.cpp:3119:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:3146:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:3428:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebKit/efl/ewk/ewk_view.cpp:3431:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:3434:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
WebKit/efl/ewk/ewk_view.cpp:3434:  Use 0 instead of NULL.  [readability/null] [5]
WebKit/efl/ewk/ewk_view.cpp:3553:  Should have a space between // and comment  [whitespace/comments] [4]
WebKit/efl/ewk/ewk_view.cpp:3555:  Missing spaces around =  [whitespace/operators] [4]
WebKit/efl/ewk/ewk_view.cpp:3556:  Declaration has space between type name and * in Ewk_Menu_Item *item  [whitespace/declaration] [3]
WebKit/efl/ewk/ewk_view.cpp:3599:  Declaration has space between type name and * in void *itemv  [whitespace/declaration] [3]
WebKit/efl/ewk/ewk_view.cpp:3601:  Declaration has space between type name and * in Ewk_Menu_Item *item  [whitespace/declaration] [3]
WebKit/efl/ewk/ewk_view.cpp:3606:  Use 0 instead of NULL.  [readability/null] [5]
Total errors found: 21 in 3 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205548</commentid>
    <comment_count>8</comment_count>
      <attachid>51933</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2010-03-29 11:10:43 -0700</bug_when>
    <thetext>Created attachment 51933
Add ewk_view to WK/efl/ewk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206138</commentid>
    <comment_count>9</comment_count>
      <attachid>52073</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2010-03-30 13:09:40 -0700</bug_when>
    <thetext>Created attachment 52073
Add ewk_view to WK/efl/ewk.

I&apos;ve overlooked some coding style issues in previous patch. Here&apos;s an updated version.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209598</commentid>
    <comment_count>10</comment_count>
      <attachid>52073</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2010-04-07 06:10:32 -0700</bug_when>
    <thetext>Comment on attachment 52073
Add ewk_view to WK/efl/ewk.

Wow, bug patch :-) Generally it looks good. There might be some issues, but nothing that should block this from the initial release.

You seem to have some settings related things in the view, such as ewk_view_exceeded_database_quota. I would suggest making a dedicated settings system. In Qt we have one that is global, but can be specialized per page/view.

 249     const Ewk_View_Smart_Class *api; /**&lt; reference to casted class instance */
 250     Evas_Object *self; /**&lt; reference to owner object */
 251     Evas_Object *main_frame; /**&lt; reference to main frame object */
 252     Evas_Object *backing_store; /**&lt; reference to backing store */

^ coding style, but I&apos;m ok with that as it is in your public header.

&gt; +#define EWK_VIEW_TYPE_CHECK(o, ...)                                     \
&gt; +    do {                                                                \
&gt; +        const char* _tmp_otype = evas_object_type_get(o);               \
&gt; +        const Evas_Smart* _tmp_s = evas_object_smart_smart_get(o);      \
&gt; +        if (EINA_UNLIKELY(!_tmp_s)) {                                   \
&gt; +            EINA_LOG_CRIT                                               \
&gt; +                (&quot;%p (%s) is not a smart object!&quot;, o,                   \
&gt; +                 _tmp_otype ? _tmp_otype : &quot;(null)&quot;);                   \
&gt; +            return __VA_ARGS__;                                         \
&gt; +        }                                                               \
&gt; +        const Evas_Smart_Class* _tmp_sc = evas_smart_class_get(_tmp_s); \
&gt; +        if (EINA_UNLIKELY(!_tmp_sc)) {                                  \
&gt; +            EINA_LOG_CRIT                                               \
&gt; +                (&quot;%p (%s) is not a smart object!&quot;, o,                   \
&gt; +                 _tmp_otype ? _tmp_otype : &quot;(null)&quot;);                   \
&gt; +            return __VA_ARGS__;                                         \
&gt; +        }                                                               \
&gt; +        if (EINA_UNLIKELY(_tmp_sc-&gt;data != EWK_VIEW_TYPE_STR)) {        \
&gt; +            EINA_LOG_CRIT                                               \
&gt; +                (&quot;%p (%s) is not of an ewk_view (need %p, got %p)!&quot;,    \
&gt; +                 o, _tmp_otype ? _tmp_otype : &quot;(null)&quot;,                 \
&gt; +                 EWK_VIEW_TYPE_STR, _tmp_sc-&gt;data);                     \
&gt; +            return __VA_ARGS__;                                         \
&gt; +        }                                                               \
&gt; +    } while (0)
&gt; +#endif

As this is C++ you could use templates for this instead, but that is up to you.

&gt; +    // fprintf(stderr, &quot;&gt;&gt;&gt; repaint requested: %d,%d+%dx%d\n&quot;, x, y, w, h);

Generally, we don&apos;t leave out commented code, though you will find some in current webkit code


&gt; +// Default Event Handling //////////////////////////////////////////////

Whyt the trailing /// ? :-)

&gt; +            &quot;\t       button: %s&quot;, message, defaultValue, *value, ret?&quot;ok&quot;:&quot;cancel&quot;);

Generally we would suggest spacing here &quot;ok&quot; etc

&gt; +error_history:
&gt; +    // delete priv-&gt;main_frame; /* do not delete priv-&gt;main_frame */

??

&gt; +error_main_frame:
&gt; +error_settings:
&gt; +    delete priv-&gt;page;
&gt; +error_page:
&gt; +    free(priv);
&gt; +    return 0;
&gt; +}

It might make sense for you to use some of our smart pointers for controlling deletion, such as OwnPtr.

And generally avoid goto.

&gt; +        if (view) {
&gt; +            view-&gt;resize(w, h);
&gt; +            view-&gt;forceLayout();
&gt; +            view-&gt;adjustViewSize();
&gt; +            IntSize size = view-&gt;contentsSize();

Maybe you should refactor some of this out in a viewport_size_set method. You might not always want to layout using the size of the view, at least not if you want to support something like the viewport meta tag known from the iPhone.

&gt; +/**
&gt; + * Set a fixed layout size to be used, dissociating it from viewport size.
&gt; + *

Oh you already have something like that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209604</commentid>
    <comment_count>11</comment_count>
    <who name="Gustavo Sverzut Barbieri">barbieri</who>
    <bug_when>2010-04-07 06:21:47 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 52073 [details])
&gt; Wow, bug patch :-) Generally it looks good. There might be some issues, but
&gt; nothing that should block this from the initial release.
&gt; 
&gt; You seem to have some settings related things in the view, such as
&gt; ewk_view_exceeded_database_quota. I would suggest making a dedicated settings
&gt; system. In Qt we have one that is global, but can be specialized per page/view.

We considered it as well, but opted to go per-view.

 
&gt;  249     const Ewk_View_Smart_Class *api; /**&lt; reference to casted class
&gt; instance */
&gt;  250     Evas_Object *self; /**&lt; reference to owner object */
&gt;  251     Evas_Object *main_frame; /**&lt; reference to main frame object */
&gt;  252     Evas_Object *backing_store; /**&lt; reference to backing store */
&gt; 
&gt; ^ coding style, but I&apos;m ok with that as it is in your public header.

Yes, that will be used by EFL/C applications and thus should follow their rules.


&gt; &gt; +#define EWK_VIEW_TYPE_CHECK(o, ...)                                     \
&gt; &gt; +    do {                                                                \
&gt; &gt; +        const char* _tmp_otype = evas_object_type_get(o);               \
&gt; &gt; +        const Evas_Smart* _tmp_s = evas_object_smart_smart_get(o);      \
&gt; &gt; +        if (EINA_UNLIKELY(!_tmp_s)) {                                   \
&gt; &gt; +            EINA_LOG_CRIT                                               \
&gt; &gt; +                (&quot;%p (%s) is not a smart object!&quot;, o,                   \
&gt; &gt; +                 _tmp_otype ? _tmp_otype : &quot;(null)&quot;);                   \
&gt; &gt; +            return __VA_ARGS__;                                         \
&gt; &gt; +        }                                                               \
&gt; &gt; +        const Evas_Smart_Class* _tmp_sc = evas_smart_class_get(_tmp_s); \
&gt; &gt; +        if (EINA_UNLIKELY(!_tmp_sc)) {                                  \
&gt; &gt; +            EINA_LOG_CRIT                                               \
&gt; &gt; +                (&quot;%p (%s) is not a smart object!&quot;, o,                   \
&gt; &gt; +                 _tmp_otype ? _tmp_otype : &quot;(null)&quot;);                   \
&gt; &gt; +            return __VA_ARGS__;                                         \
&gt; &gt; +        }                                                               \
&gt; &gt; +        if (EINA_UNLIKELY(_tmp_sc-&gt;data != EWK_VIEW_TYPE_STR)) {        \
&gt; &gt; +            EINA_LOG_CRIT                                               \
&gt; &gt; +                (&quot;%p (%s) is not of an ewk_view (need %p, got %p)!&quot;,    \
&gt; &gt; +                 o, _tmp_otype ? _tmp_otype : &quot;(null)&quot;,                 \
&gt; &gt; +                 EWK_VIEW_TYPE_STR, _tmp_sc-&gt;data);                     \
&gt; &gt; +            return __VA_ARGS__;                                         \
&gt; &gt; +        }                                                               \
&gt; &gt; +    } while (0)
&gt; &gt; +#endif
&gt; 
&gt; As this is C++ you could use templates for this instead, but that is up to you.

In this case this is not possible. We&apos;re dealing with Evas_Object and we really don&apos;t know if it is an image, text or anything else other than ewk_view. I&apos;m currently introducing hierarchy types and thus type-checking in Evas, but this is new and needs some testing, later on I can move this type check macro to use the other check instead.

 
&gt; &gt; +    // fprintf(stderr, &quot;&gt;&gt;&gt; repaint requested: %d,%d+%dx%d\n&quot;, x, y, w, h);
&gt; 
&gt; Generally, we don&apos;t leave out commented code, though you will find some in
&gt; current webkit code

/me looks at Rafael Antognolli ;-)


&gt; &gt; +// Default Event Handling //////////////////////////////////////////////
&gt; 
&gt; Whyt the trailing /// ? :-)

it&apos;s just to make the &quot;section&quot; easier to spot.


&gt; &gt; +            &quot;\t       button: %s&quot;, message, defaultValue, *value, ret?&quot;ok&quot;:&quot;cancel&quot;);
&gt; 
&gt; Generally we would suggest spacing here &quot;ok&quot; etc

/me looks at Lucas De Marchi and his space saving style. 


&gt; &gt; +error_history:
&gt; &gt; +    // delete priv-&gt;main_frame; /* do not delete priv-&gt;main_frame */
&gt; 
&gt; ??

My initial implementation did that delete, and it segfaulted. Later on I went to realize the reason, since the main_frame was being used and deleted by view, thus we should not delete it there. I left the code and the comment to make clear I or any other developer fall in the same trap again.

 
&gt; &gt; +error_main_frame:
&gt; &gt; +error_settings:
&gt; &gt; +    delete priv-&gt;page;
&gt; &gt; +error_page:
&gt; &gt; +    free(priv);
&gt; &gt; +    return 0;
&gt; &gt; +}
&gt; 
&gt; It might make sense for you to use some of our smart pointers for controlling
&gt; deletion, such as OwnPtr.

For priv-&gt;page that could be, for priv itself, it should not as that is stored directly by evas_object_smart_data_set() and then things would be more complicated.


&gt; And generally avoid goto.

EFL error checking style.


&gt; &gt; +        if (view) {
&gt; &gt; +            view-&gt;resize(w, h);
&gt; &gt; +            view-&gt;forceLayout();
&gt; &gt; +            view-&gt;adjustViewSize();
&gt; &gt; +            IntSize size = view-&gt;contentsSize();
&gt; 
&gt; Maybe you should refactor some of this out in a viewport_size_set method. You
&gt; might not always want to layout using the size of the view, at least not if you
&gt; want to support something like the viewport meta tag known from the iPhone.

Interesting to know about this meta-tag.


&gt; &gt; +/**
&gt; &gt; + * Set a fixed layout size to be used, dissociating it from viewport size.
&gt; &gt; + *
&gt; 
&gt; Oh you already have something like that.

Yes, but it is not a meta tag, rather being set explicitly by browser. The purpose is to have different zoom levels to scale based on the viewport. So the zoom level 2.0 would have the viewport 480x800 at 560x1600. This webkit part does that.

Thanks for your review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209674</commentid>
    <comment_count>12</comment_count>
      <attachid>52073</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-07 09:33:46 -0700</bug_when>
    <thetext>Comment on attachment 52073
Add ewk_view to WK/efl/ewk.

Clearing flags on attachment: 52073

Committed r57212: &lt;http://trac.webkit.org/changeset/57212&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209675</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-07 09:33:55 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50331</attachid>
            <date>2010-03-09 11:21:38 -0800</date>
            <delta_ts>2010-03-29 10:38:12 -0700</delta_ts>
            <desc>Add ewk_view to WK/efl/ewk.</desc>
            <filename>webkit_efl_ewk-6.diff</filename>
            <type>text/plain</type>
            <size>132216</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L0NoYW5nZUxvZwor
KysgV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzIEBACisyMDEwLTAzLTA5ICBMZWFuZHJv
IFBlcmVpcmEgIDxsZWFuZHJvQHByb2Z1c2lvbi5tb2JpPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBFRkwgcG9ydCBmaWxlcyB0byBlZmwvZXdr
LgorICAgICAgICBodHRwOi8vd2Via2l0Lm9yZy9iLzM1OTMyCisKKyAgICAgICAgKiBlZmwvZXdr
L2V3a192aWV3LmNwcDogQWRkZWQuCisgICAgICAgICogZWZsL2V3ay9ld2tfdmlldy5oOiBBZGRl
ZC4KKwogMjAxMC0wMy0wNCAgTWFyayBSb3dlICA8bXJvd2VAYXBwbGUuY29tPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJLaXQvZWZsL2V3ay9ld2tfdmlldy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBXZWJLaXQvZWZsL2V3ay9ld2tfdmlldy5j
cHAKQEAgLTAsMCArMSwzMzQzIEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFBy
b0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCisgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgU2Ft
c3VuZyBFbGVjdHJvbmljcworCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJld2tf
dmlldy5oIgorCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50RWZsLmgiCisjaW5jbHVkZSAiQ29udGV4
dE1lbnVDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJEcmFnQ2xpZW50RWZsLmgiCisjaW5jbHVkZSAi
RVdlYktpdC5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudEVmbC5oIgorI2luY2x1ZGUgIkZvY3Vz
Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyQ2xpZW50RWZsLmgiCisjaW5jbHVk
ZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAi
SW5zcGVjdG9yQ2xpZW50RWZsLmgiCisjaW5jbHVkZSAiUHJvZ3Jlc3NUcmFja2VyLmgiCisjaW5j
bHVkZSAiZXdrX3ByaXZhdGUuaCIKKworI2luY2x1ZGUgPEVjb3JlLmg+CisjaW5jbHVkZSA8RWlu
YS5oPgorI2luY2x1ZGUgPEV2YXMuaD4KKyNpbmNsdWRlIDxlaW5hX3NhZmV0eV9jaGVja3MuaD4K
KyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjZGVmaW5lIFpPT01fTUlOICgwLjA1KQorI2RlZmlu
ZSBaT09NX01BWCAoNC4wKQorCitzdGF0aWMgY29uc3QgY2hhciBFV0tfVklFV19UWVBFX1NUUltd
ID0gIkVXS19WaWV3IjsKKworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklFV19SRVBBSU5UU19T
SVpFX0lOSVRJQUwgPSAzMjsKK3N0YXRpYyBjb25zdCBzaXplX3QgRVdLX1ZJRVdfUkVQQUlOVFNf
U0laRV9TVEVQID0gODsKK3N0YXRpYyBjb25zdCBzaXplX3QgRVdLX1ZJRVdfUkVQQUlOVFNfU0la
RV9NQVhfRlJFRSA9IDY0OworCitzdGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVXX1NDUk9MTFNf
U0laRV9JTklUSUFMID0gODsKK3N0YXRpYyBjb25zdCBzaXplX3QgRVdLX1ZJRVdfU0NST0xMU19T
SVpFX1NURVAgPSAyOworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklFV19TQ1JPTExTX1NJWkVf
TUFYX0ZSRUUgPSAzMjsKKworc3RydWN0IF9Fd2tfVmlld19Qcml2YXRlX0RhdGEgeworICAgIFdl
YkNvcmU6OlBhZ2UqIHBhZ2U7CisgICAgV2ViQ29yZTo6U2V0dGluZ3MqIHBhZ2Vfc2V0dGluZ3M7
CisgICAgV2ViQ29yZTo6RnJhbWUqIG1haW5fZnJhbWU7CisgICAgRXdrX0hpc3RvcnkqIGhpc3Rv
cnk7CisgICAgc3RydWN0IHsKKyAgICAgICAgRWluYV9SZWN0YW5nbGUqIGFycmF5OworICAgICAg
ICBzaXplX3QgY291bnQ7CisgICAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7CisgICAgfSByZXBhaW50
czsKKyAgICBzdHJ1Y3QgeworICAgICAgICBFd2tfU2Nyb2xsX1JlcXVlc3QqIGFycmF5OworICAg
ICAgICBzaXplX3QgY291bnQ7CisgICAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7CisgICAgfSBzY3Jv
bGxzOworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIHVzZXJfYWdlbnQ7CisgICAg
ICAgIGNvbnN0IGNoYXIqIHVzZXJfc3R5bGVzaGVldDsKKyAgICAgICAgY29uc3QgY2hhciogZW5j
b2RpbmdfZGVmYXVsdDsKKyAgICAgICAgaW50IGZvbnRfbWluaW11bV9zaXplOworICAgICAgICBp
bnQgZm9udF9taW5pbXVtX2xvZ2ljYWxfc2l6ZTsKKyAgICAgICAgaW50IGZvbnRfZGVmYXVsdF9z
aXplOworICAgICAgICBpbnQgZm9udF9tb25vc3BhY2Vfc2l6ZTsKKyAgICAgICAgY29uc3QgY2hh
ciogZm9udF9zdGFuZGFyZDsKKyAgICAgICAgY29uc3QgY2hhciogZm9udF9jdXJzaXZlOworICAg
ICAgICBjb25zdCBjaGFyKiBmb250X21vbm9zcGFjZTsKKyAgICAgICAgY29uc3QgY2hhciogZm9u
dF9mYW50YXN5OworICAgICAgICBjb25zdCBjaGFyKiBmb250X3NlcmlmOworICAgICAgICBjb25z
dCBjaGFyKiBmb250X3NhbnNfc2VyaWY7CisgICAgICAgIEVpbmFfQm9vbCBhdXRvX2xvYWRfaW1h
Z2VzOjE7CisgICAgICAgIEVpbmFfQm9vbCBhdXRvX3Nocmlua19pbWFnZXM6MTsKKyAgICAgICAg
RWluYV9Cb29sIGVuYWJsZV9zY3JpcHRzOjE7CisgICAgICAgIEVpbmFfQm9vbCBlbmFibGVfcGx1
Z2luczoxOworICAgICAgICBFaW5hX0Jvb2wgc2NyaXB0c193aW5kb3dfb3BlbjoxOworICAgICAg
ICBFaW5hX0Jvb2wgcmVzaXphYmxlX3RleHRhcmVhczoxOworICAgICAgICBFaW5hX0Jvb2wgcHJp
dmF0ZV9icm93c2luZzoxOworICAgICAgICBFaW5hX0Jvb2wgY2FyZXRfYnJvd3Npbmc6MTsKKyAg
ICB9IHNldHRpbmdzOworICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAg
ICBkb3VibGUgc3RhcnQ7CisgICAgICAgICAgICBkb3VibGUgZW5kOworICAgICAgICAgICAgZG91
YmxlIGR1cmF0aW9uOworICAgICAgICB9IHRpbWU7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAg
ICAgICBmbG9hdCBzdGFydDsKKyAgICAgICAgICAgIGZsb2F0IGVuZDsKKyAgICAgICAgICAgIGZs
b2F0IHJhbmdlOworICAgICAgICB9IHpvb207CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAg
ICBFdmFzX0Nvb3JkIHgsIHk7CisgICAgICAgIH0gY2VudGVyOworICAgICAgICBFY29yZV9Bbmlt
YXRvciogYW5pbWF0b3I7CisgICAgfSBhbmltYXRlZF96b29tOworICAgIHN0cnVjdCB7CisgICAg
ICAgIEV2YXNfQ29vcmQgdywgaDsKKyAgICAgICAgRWluYV9Cb29sIHVzZToxOworICAgIH0gZml4
ZWRfbGF5b3V0OworfTsKKworI2lmbmRlZiBFV0tfVFlQRV9DSEVDSworI2RlZmluZSBFV0tfVklF
V19UWVBFX0NIRUNLKG8sIC4uLikgZG8geyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRVdL
X1ZJRVdfVFlQRV9DSEVDSyhvLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgY2hhciogX3RtcF9vdHlwZSA9
IGV2YXNfb2JqZWN0X3R5cGVfZ2V0KG8pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3Qg
RXZhc19TbWFydCogX3RtcF9zID0gZXZhc19vYmplY3Rfc21hcnRfc21hcnRfZ2V0KG8pOyAgICAg
IFwKKyAgICAgICAgaWYgKEVJTkFfVU5MSUtFTFkoIV90bXBfcykpIHsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEVJTkFfTE9HX0NSSVQgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAo
IiVwICglcykgaXMgbm90IGEgc21hcnQgb2JqZWN0ISIsIG8sICAgICAgICAgICAgICAgICAgIFwK
KyAgICAgICAgICAgICAgICAgX3RtcF9vdHlwZSA/IF90bXBfb3R5cGUgOiAiKG51bGwpIik7ICAg
ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBfX1ZBX0FSR1NfXzsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAg
ICAgICAgY29uc3QgRXZhc19TbWFydF9DbGFzcyogX3RtcF9zYyA9IGV2YXNfc21hcnRfY2xhc3Nf
Z2V0KF90bXBfcyk7IFwKKyAgICAgICAgaWYgKEVJTkFfVU5MSUtFTFkoIV90bXBfc2MpKSB7ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEVJTkFfTE9HX0NS
SVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAg
ICAgICAgICAgICAoIiVwICglcykgaXMgbm90IGEgc21hcnQgb2JqZWN0ISIsIG8sICAgICAgICAg
ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgX3RtcF9vdHlwZSA/IF90bXBfb3R5cGUgOiAi
KG51bGwpIik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBfX1ZBX0FS
R1NfXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAg
fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICAgICAgaWYgKEVJTkFfVU5MSUtFTFkoX3RtcF9zYy0+ZGF0YSAhPSBFV0tf
VklFV19UWVBFX1NUUikpIHsgICAgICAgIFwKKyAgICAgICAgICAgIEVJTkFfTE9HX0NSSVQgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAg
ICAgICAoIiVwICglcykgaXMgbm90IG9mIGFuIGV3a192aWV3IChuZWVkICVwLCBnb3QgJXApISIs
ICAgIFwKKyAgICAgICAgICAgICAgICAgbywgX3RtcF9vdHlwZSA/IF90bXBfb3R5cGUgOiAiKG51
bGwpIiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgRVdLX1ZJRVdfVFlQRV9T
VFIsIF90bXBfc2MtPmRhdGEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJl
dHVybiBfX1ZBX0FSR1NfXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUg
RVdLX1ZJRVdfU0RfR0VUKG8sIHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgRXdrX1ZpZXdfU21hcnRfRGF0YSogcHRyID0gKEV3a19WaWV3X1NtYXJ0X0RhdGEqKWV2
YXNfb2JqZWN0X3NtYXJ0X2RhdGFfZ2V0KG8pCisKKyNkZWZpbmUgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBwdHIsIC4uLikgICAgICAgICAgXAorICAgIEVXS19WSUVXX1RZUEVfQ0hFQ0so
bywgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICBcCisgICAgRVdLX1ZJRVdfU0RfR0VUKG8s
IHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXB0cikgeyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUklUSUNBTCgi
bm8gc21hcnQgZGF0YSBmb3Igb2JqZWN0ICVwICglcykiLCAgICBcCisgICAgICAgICAgICAgICAg
IG8sIGV2YXNfb2JqZWN0X3R5cGVfZ2V0KG8pKTsgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJu
IF9fVkFfQVJHU19fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2Rl
ZmluZSBFV0tfVklFV19QUklWX0dFVChzZCwgcHRyKSAgICAgICAgICAgICAgXAorICAgIEV3a19W
aWV3X1ByaXZhdGVfRGF0YSogcHRyID0gc2QtPl9wcml2CisKKyNkZWZpbmUgRVdLX1ZJRVdfUFJJ
Vl9HRVRfT1JfUkVUVVJOKHNkLCBwdHIsIC4uLikgICAgICAgICAgICAgICBcCisgICAgRVdLX1ZJ
RVdfUFJJVl9HRVQoc2QsIHB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgIGlmICghcHRyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICAgICAgQ1JJVElDQUwoIm5vIHByaXZhdGUgZGF0YSBmb3Igb2JqZWN0ICVw
ICglcykiLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHNkLT5zZWxmLCBldmFzX29iamVj
dF90eXBlX2dldChzZC0+c2VsZikpOyAgICAgXAorICAgICAgICByZXR1cm4gX19WQV9BUkdTX187
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK3N0YXRpYyBp
bmxpbmUgdm9pZCBfZXdrX3ZpZXdfc21hcnRfY2hhbmdlZChFd2tfVmlld19TbWFydF9EYXRhKiBz
ZCkKK3sKKyAgICBpZiAoc2QtPmNoYW5nZWQuYW55KQorICAgICAgICByZXR1cm47CisgICAgc2Qt
PmNoYW5nZWQuYW55ID0gRUlOQV9UUlVFOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NoYW5nZWQo
c2QtPnNlbGYpOworfQorCitzdGF0aWMgaW5saW5lIEVpbmFfQm9vbCBfZXdrX3ZpZXdfcmVwYWlu
dHNfcmVzaXplKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgc2l6ZV90IHNpemUpCit7Cisg
ICAgdm9pZCogdG1wID0gcmVhbGxvYyhwcml2LT5yZXBhaW50cy5hcnJheSwgc2l6ZSAqIHNpemVv
ZihFaW5hX1JlY3RhbmdsZSkpOworICAgIGlmICghdG1wKSB7CisgICAgICAgIENSSVRJQ0FMKCJj
b3VsZCBub3QgcmVhbGxvYyByZXBhaW50cyBhcnJheSB0byAlenUgZWxlbWVudHMuIiwgc2l6ZSk7
CisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0KKyAgICBwcml2LT5yZXBhaW50cy5h
bGxvY2F0ZWQgPSBzaXplOworICAgIHByaXYtPnJlcGFpbnRzLmFycmF5ID0gKEVpbmFfUmVjdGFu
Z2xlKil0bXA7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIGlubGluZSB2b2lk
IF9ld2tfdmlld19yZXBhaW50X2FkZChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYsIEV2YXNf
Q29vcmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCkKK3sKKyAg
ICBFaW5hX1JlY3RhbmdsZSogcjsKKworICAgIC8vIGZwcmludGYoc3RkZXJyLCAiPj4+IHJlcGFp
bnQgcmVxdWVzdGVkOiAlZCwlZCslZHglZFxuIiwgeCwgeSwgdywgaCk7CisgICAgaWYgKHByaXYt
PnJlcGFpbnRzLmFsbG9jYXRlZCA9PSBwcml2LT5yZXBhaW50cy5jb3VudCkgeworICAgICAgICBz
aXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKCFwcml2LT5yZXBhaW50cy5hbGxvY2F0ZWQpCisgICAg
ICAgICAgICBzaXplID0gRVdLX1ZJRVdfUkVQQUlOVFNfU0laRV9JTklUSUFMOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBzaXplID0gcHJpdi0+cmVwYWludHMuYWxsb2NhdGVkICsgRVdLX1ZJ
RVdfUkVQQUlOVFNfU0laRV9TVEVQOworICAgICAgICBpZiAoIV9ld2tfdmlld19yZXBhaW50c19y
ZXNpemUocHJpdiwgc2l6ZSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgciA9
IHByaXYtPnJlcGFpbnRzLmFycmF5ICsgcHJpdi0+cmVwYWludHMuY291bnQ7CisgICAgcHJpdi0+
cmVwYWludHMuY291bnQrKzsKKworICAgIHItPnggPSB4OworICAgIHItPnkgPSB5OworICAgIHIt
PncgPSB3OworICAgIHItPmggPSBoOworCisgICAgREJHKCJhZGQgcmVwYWludCAlZCwlZCslZHgl
ZCIsIHgsIHksIHcsIGgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX2V3a192aWV3X3JlcGFp
bnRzX2ZsdXNoKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdikKK3sKKyAgICBwcml2LT5yZXBh
aW50cy5jb3VudCA9IDA7CisgICAgaWYgKHByaXYtPnJlcGFpbnRzLmFsbG9jYXRlZCA8PSBFV0tf
VklFV19SRVBBSU5UU19TSVpFX01BWF9GUkVFKQorICAgICAgICByZXR1cm47CisgICAgX2V3a192
aWV3X3JlcGFpbnRzX3Jlc2l6ZShwcml2LCBFV0tfVklFV19SRVBBSU5UU19TSVpFX01BWF9GUkVF
KTsKK30KKworc3RhdGljIGlubGluZSBFaW5hX0Jvb2wgX2V3a192aWV3X3Njcm9sbHNfcmVzaXpl
KEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCog
dG1wID0gcmVhbGxvYyhwcml2LT5zY3JvbGxzLmFycmF5LCBzaXplICogc2l6ZW9mKEV3a19TY3Jv
bGxfUmVxdWVzdCkpOworICAgIGlmICghdG1wKSB7CisgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBu
b3QgcmVhbGxvYyBzY3JvbGxzIGFycmF5IHRvICV6dSBlbGVtZW50cy4iLCBzaXplKTsKKyAgICAg
ICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorICAgIHByaXYtPnNjcm9sbHMuYWxsb2NhdGVk
ID0gc2l6ZTsKKyAgICBwcml2LT5zY3JvbGxzLmFycmF5ID0gKEV3a19TY3JvbGxfUmVxdWVzdCop
dG1wOworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfZXdr
X3ZpZXdfc2Nyb2xsX2FkZChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYsIEV2YXNfQ29vcmQg
ZHgsIEV2YXNfQ29vcmQgZHksIEV2YXNfQ29vcmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3Jk
IHcsIEV2YXNfQ29vcmQgaCwgRWluYV9Cb29sIG1haW5fc2Nyb2xsKQoreworICAgIEV3a19TY3Jv
bGxfUmVxdWVzdCogcjsKKyAgICBFd2tfU2Nyb2xsX1JlcXVlc3QqIHJfZW5kOworICAgIEV2YXNf
Q29vcmQgeDIgPSB4ICsgdywgeTIgPSB5ICsgaDsKKworICAgIHIgPSBwcml2LT5zY3JvbGxzLmFy
cmF5OworICAgIHJfZW5kID0gciArIHByaXYtPnNjcm9sbHMuY291bnQ7CisgICAgZm9yICg7IHIg
PCByX2VuZDsgcisrKSB7CisgICAgICAgIGlmIChyLT54ID09IHggJiYgci0+eSA9PSB5ICYmIHIt
PncgPT0gdyAmJiByLT5oID09IGgpIHsKKyAgICAgICAgICAgIERCRygicmVnaW9uIGFscmVhZHkg
c2Nyb2xsZWQgJWQsJWQrJWR4JWQgJSswM2QsJSswM2QgYWRkICIKKyAgICAgICAgICAgICAgICAi
JSswM2QsJSswM2QiLAorICAgICAgICAgICAgICAgIHItPngsIHItPnksIHItPncsIHItPmgsIHIt
PmR4LCByLT5keSwgZHgsIGR5KTsKKyAgICAgICAgICAgIHItPmR4ICs9IGR4OworICAgICAgICAg
ICAgci0+ZHkgKz0gZHk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAg
aWYgKCh4IDw9IHItPnggJiYgeDIgPj0gci0+eDIpICYmICh5IDw9IHItPnkgJiYgeTIgPj0gci0+
eTIpKSB7CisgICAgICAgICAgICBEQkcoIm9sZCB2aWV3cG9ydCAoJWQsJWQrJWR4JWQgJSswM2Qs
JSswM2QpIHdhcyBzY3JvbGxlZCBpdHNlbGYsICIKKyAgICAgICAgICAgICAgICAiYWRkICUrMDNk
LCUrMDNkIiwKKyAgICAgICAgICAgICAgICByLT54LCByLT55LCByLT53LCByLT5oLCByLT5keCwg
ci0+ZHksIGR4LCBkeSk7CisgICAgICAgICAgICByLT54ICs9IGR4OworICAgICAgICAgICAgci0+
eSArPSBkeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcml2LT5zY3JvbGxzLmFsbG9j
YXRlZCA9PSBwcml2LT5zY3JvbGxzLmNvdW50KSB7CisgICAgICAgIHNpemVfdCBzaXplOworICAg
ICAgICBpZiAoIXByaXYtPnNjcm9sbHMuYWxsb2NhdGVkKQorICAgICAgICAgICAgc2l6ZSA9IEVX
S19WSUVXX1NDUk9MTFNfU0laRV9JTklUSUFMOworICAgICAgICBlbHNlCisgICAgICAgICAgICBz
aXplID0gcHJpdi0+c2Nyb2xscy5hbGxvY2F0ZWQgKyBFV0tfVklFV19TQ1JPTExTX1NJWkVfU1RF
UDsKKyAgICAgICAgaWYgKCFfZXdrX3ZpZXdfc2Nyb2xsc19yZXNpemUocHJpdiwgc2l6ZSkpCisg
ICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgciA9IHByaXYtPnNjcm9sbHMuYXJyYXkg
KyBwcml2LT5zY3JvbGxzLmNvdW50OworICAgIHByaXYtPnNjcm9sbHMuY291bnQrKzsKKworICAg
IHItPnggPSB4OworICAgIHItPnkgPSB5OworICAgIHItPncgPSB3OworICAgIHItPmggPSBoOwor
ICAgIHItPngyID0geDI7CisgICAgci0+eTIgPSB5MjsKKyAgICByLT5keCA9IGR4OworICAgIHIt
PmR5ID0gZHk7CisgICAgci0+bWFpbl9zY3JvbGwgPSBtYWluX3Njcm9sbDsKKyAgICBEQkcoImFk
ZCBzY3JvbGwgaW4gcmVnaW9uOiAlZCwlZCslZHglZCAlKzAzZCwlKzAzZCIsIHgsIHksIHcsIGgs
IGR4LCBkeSk7CisKKyAgICBFaW5hX1JlY3RhbmdsZSogcHI7CisgICAgRWluYV9SZWN0YW5nbGUq
IHByX2VuZDsKKyAgICBzaXplX3QgY291bnQ7CisgICAgcHIgPSBwcml2LT5yZXBhaW50cy5hcnJh
eTsKKyAgICBjb3VudCA9IHByaXYtPnJlcGFpbnRzLmNvdW50OworICAgIHByX2VuZCA9IHByICsg
Y291bnQ7CisgICAgZm9yICg7IHByIDwgcHJfZW5kOyBwcisrKSB7CisgICAgICAgIHByLT54ICs9
IGR4OworICAgICAgICBwci0+eSArPSBkeTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p
ZCBfZXdrX3ZpZXdfc2Nyb2xsc19mbHVzaChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYpCit7
CisgICAgcHJpdi0+c2Nyb2xscy5jb3VudCA9IDA7CisgICAgaWYgKHByaXYtPnNjcm9sbHMuYWxs
b2NhdGVkIDw9IEVXS19WSUVXX1NDUk9MTFNfU0laRV9NQVhfRlJFRSkKKyAgICAgICAgcmV0dXJu
OworICAgIF9ld2tfdmlld19zY3JvbGxzX3Jlc2l6ZShwcml2LCBFV0tfVklFV19TQ1JPTExTX1NJ
WkVfTUFYX0ZSRUUpOworfQorCisvLyBEZWZhdWx0IEV2ZW50IEhhbmRsaW5nIC8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBFaW5hX0Jvb2wgX2V3
a192aWV3X3NtYXJ0X2ZvY3VzX2luKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIEVX
S19WSUVXX1BSSVZfR0VUKHNkLCBwcml2KTsKKyAgICBXZWJDb3JlOjpGb2N1c0NvbnRyb2xsZXIq
IGZjID0gcHJpdi0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCk7CisgICAgREJHKCJvPSVwLCBmYz0l
cCIsIHNkLT5zZWxmLCBmYyk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKGZj
LCBFSU5BX0ZBTFNFKTsKKworICAgIGZjLT5zZXRBY3RpdmUodHJ1ZSk7CisgICAgZmMtPnNldEZv
Y3VzZWQodHJ1ZSk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIEVpbmFfQm9v
bCBfZXdrX3ZpZXdfc21hcnRfZm9jdXNfb3V0KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQorewor
ICAgIEVXS19WSUVXX1BSSVZfR0VUKHNkLCBwcml2KTsKKyAgICBXZWJDb3JlOjpGb2N1c0NvbnRy
b2xsZXIqIGZjID0gcHJpdi0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCk7CisgICAgREJHKCJvPSVw
LCBmYz0lcCIsIHNkLT5zZWxmLCBmYyk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5f
VkFMKGZjLCBFSU5BX0ZBTFNFKTsKKworICAgIGZjLT5zZXRBY3RpdmUoZmFsc2UpOworICAgIGZj
LT5zZXRGb2N1c2VkKGZhbHNlKTsKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitzdGF0aWMg
RWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9tb3VzZV93aGVlbChFd2tfVmlld19TbWFydF9EYXRh
KiBzZCwgY29uc3QgRXZhc19FdmVudF9Nb3VzZV9XaGVlbCogZXYpCit7CisgICAgcmV0dXJuIGV3
a19mcmFtZV9mZWVkX21vdXNlX3doZWVsKHNkLT5tYWluX2ZyYW1lLCBldik7Cit9CisKK3N0YXRp
YyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X21vdXNlX2Rvd24oRXdrX1ZpZXdfU21hcnRfRGF0
YSogc2QsIGNvbnN0IEV2YXNfRXZlbnRfTW91c2VfRG93biogZXYpCit7CisgICAgcmV0dXJuIGV3
a19mcmFtZV9mZWVkX21vdXNlX2Rvd24oc2QtPm1haW5fZnJhbWUsIGV2KTsKK30KKworc3RhdGlj
IEVpbmFfQm9vbCBfZXdrX3ZpZXdfc21hcnRfbW91c2VfdXAoRXdrX1ZpZXdfU21hcnRfRGF0YSog
c2QsIGNvbnN0IEV2YXNfRXZlbnRfTW91c2VfVXAqIGV2KQoreworICAgIHJldHVybiBld2tfZnJh
bWVfZmVlZF9tb3VzZV91cChzZC0+bWFpbl9mcmFtZSwgZXYpOworfQorCitzdGF0aWMgRWluYV9C
b29sIF9ld2tfdmlld19zbWFydF9tb3VzZV9tb3ZlKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBj
b25zdCBFdmFzX0V2ZW50X01vdXNlX01vdmUqIGV2KQoreworICAgIHJldHVybiBld2tfZnJhbWVf
ZmVlZF9tb3VzZV9tb3ZlKHNkLT5tYWluX2ZyYW1lLCBldik7Cit9CisKK3N0YXRpYyBFaW5hX0Jv
b2wgX2V3a192aWV3X3NtYXJ0X2tleV9kb3duKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25z
dCBFdmFzX0V2ZW50X0tleV9Eb3duKiBldikKK3sKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBl
d2tfdmlld19mcmFtZV9mb2N1c2VkX2dldChzZC0+c2VsZik7CisKKyAgICBpZiAoIWZyYW1lKQor
ICAgICAgICBmcmFtZSA9IHNkLT5tYWluX2ZyYW1lOworCisgICAgcmV0dXJuIGV3a19mcmFtZV9m
ZWVkX2tleV9kb3duKGZyYW1lLCBldik7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3
X3NtYXJ0X2tleV91cChFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgY29uc3QgRXZhc19FdmVudF9L
ZXlfVXAqIGV2KQoreworICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX2Zv
Y3VzZWRfZ2V0KHNkLT5zZWxmKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIGZyYW1lID0g
c2QtPm1haW5fZnJhbWU7CisKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2ZlZWRfa2V5X3VwKGZyYW1l
LCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9hZGRfY29uc29sZV9tZXNz
YWdlKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25zdCBjaGFyKiBtZXNzYWdlLCB1bnNpZ25l
ZCBpbnQgbGluZU51bWJlciwgY29uc3QgY2hhciogc291cmNlSUQpCit7CisgICAgSU5GKCJjb25z
b2xlIG1lc3NhZ2U6ICVzIEAlZDogJXNcbiIsIHNvdXJjZUlELCBsaW5lTnVtYmVyLCBtZXNzYWdl
KTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZhc2NyaXB0X2FsZXJ0
KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBFdmFzX09iamVjdCogZnJhbWUsIGNvbnN0IGNoYXIq
IG1lc3NhZ2UpCit7CisgICAgSU5GKCJqYXZhc2NyaXB0IGFsZXJ0OiAlc1xuIiwgbWVzc2FnZSk7
Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZhc2NyaXB0X2Nv
bmZpcm0oRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QsIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3Qg
Y2hhciogbWVzc2FnZSkKK3sKKyAgICBJTkYoImphdmFzY3JpcHQgY29uZmlybTogJXMiLCBtZXNz
YWdlKTsKKyAgICBJTkYoImphdmFzY3JpcHQgY29uZmlybSAoSEFSRCBDT0RFRCk/IFlFUyIpOwor
ICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3Nt
YXJ0X3Nob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlwdChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkK
K3sKKyAgICBJTkYoInNob3VsZCBpbnRlcnJ1cHQgamF2YXNjcmlwdD9cbiIKKyAgICAgICAgICAg
ICJcdChIQVJEIENPREVEKSBOTyIpOworICAgIHJldHVybiBFSU5BX0ZBTFNFOworfQorCitzdGF0
aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9ydW5famF2YXNjcmlwdF9wcm9tcHQoRXdrX1Zp
ZXdfU21hcnRfRGF0YSogc2QsIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciogbWVzc2Fn
ZSwgY29uc3QgY2hhciogZGVmYXVsdFZhbHVlLCBjaGFyKiogdmFsdWUpCit7CisgICAgKnZhbHVl
ID0gc3RyZHVwKCJ0ZXN0Iik7CisgICAgRWluYV9Cb29sIHJldCA9IEVJTkFfVFJVRTsKKyAgICBJ
TkYoImphdmFzY3JpcHQgcHJvbXB0OlxuIgorICAgICAgICAgICAgIlx0ICAgICAgbWVzc2FnZTog
JXNcbiIKKyAgICAgICAgICAgICJcdGRlZmF1bHQgdmFsdWU6ICVzXG4iCisgICAgICAgICAgICAi
XHRnaXZpbmcgYW5zd2VyOiAlc1xuIgorICAgICAgICAgICAgIlx0ICAgICAgIGJ1dHRvbjogJXMi
LCBtZXNzYWdlLCBkZWZhdWx0VmFsdWUsICp2YWx1ZSwgcmV0PyJvayI6ImNhbmNlbCIpOworCisg
ICAgcmV0dXJuIHJldDsKK30KKworLy8gRXZlbnQgSGFuZGxpbmcgLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0aWMgdm9pZCBfZXdrX3Zp
ZXdfb25fZm9jdXNfaW4odm9pZCogZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQq
IGV2ZW50X2luZm8pCit7CisgICAgRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdf
U21hcnRfRGF0YSopZGF0YTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBp
KTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT5mb2N1c19pbik7Cisg
ICAgc2QtPmFwaS0+Zm9jdXNfaW4oc2QpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfb25f
Zm9jdXNfb3V0KHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVu
dF9pbmZvKQoreworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1NtYXJ0
X0RhdGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaSk7Cisg
ICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+Zm9jdXNfb3V0KTsKKyAgICBz
ZC0+YXBpLT5mb2N1c19vdXQoc2QpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfb25fbW91
c2Vfd2hlZWwodm9pZCogZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50
X2luZm8pCit7CisgICAgRXZhc19FdmVudF9Nb3VzZV9XaGVlbCogZXYgPSAoRXZhc19FdmVudF9N
b3VzZV9XaGVlbCopZXZlbnRfaW5mbzsKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBzZCA9IChF
d2tfVmlld19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJO
KHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPm1vdXNl
X3doZWVsKTsKKyAgICBzZC0+YXBpLT5tb3VzZV93aGVlbChzZCwgZXYpOworfQorCitzdGF0aWMg
dm9pZCBfZXdrX3ZpZXdfb25fbW91c2VfZG93bih2b2lkKiBkYXRhLCBFdmFzKiBlLCBFdmFzX09i
amVjdCogbywgdm9pZCogZXZlbnRfaW5mbykKK3sKKyAgICBFdmFzX0V2ZW50X01vdXNlX0Rvd24q
IGV2ID0gKEV2YXNfRXZlbnRfTW91c2VfRG93biopZXZlbnRfaW5mbzsKKyAgICBFd2tfVmlld19T
bWFydF9EYXRhKiBzZCA9IChFd2tfVmlld19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FG
RVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOKHNkLT5hcGktPm1vdXNlX2Rvd24pOworICAgIHNkLT5hcGktPm1vdXNlX2Rvd24oc2QsIGV2
KTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X29uX21vdXNlX3VwKHZvaWQqIGRhdGEsIEV2
YXMqIGUsIEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAgIEV2YXNfRXZl
bnRfTW91c2VfVXAqIGV2ID0gKEV2YXNfRXZlbnRfTW91c2VfVXAqKWV2ZW50X2luZm87CisgICAg
RXdrX1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0YTsKKyAg
ICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl9OVUxMX1JFVFVSTihzZC0+YXBpLT5tb3VzZV91cCk7CisgICAgc2QtPmFwaS0+bW91c2VfdXAo
c2QsIGV2KTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X29uX21vdXNlX21vdmUodm9pZCog
ZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50X2luZm8pCit7CisgICAg
RXZhc19FdmVudF9Nb3VzZV9Nb3ZlKiBldiA9IChFdmFzX0V2ZW50X01vdXNlX01vdmUqKWV2ZW50
X2luZm87CisgICAgRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0
YSopZGF0YTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT5tb3VzZV9tb3ZlKTsKKyAgICBzZC0+
YXBpLT5tb3VzZV9tb3ZlKHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19vbl9r
ZXlfZG93bih2b2lkKiBkYXRhLCBFdmFzKiBlLCBFdmFzX09iamVjdCogbywgdm9pZCogZXZlbnRf
aW5mbykKK3sKKyAgICBFdmFzX0V2ZW50X0tleV9Eb3duKiBldiA9IChFdmFzX0V2ZW50X0tleV9E
b3duKilldmVudF9pbmZvOworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3
X1NtYXJ0X0RhdGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFw
aSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+a2V5X2Rvd24pOwor
ICAgIHNkLT5hcGktPmtleV9kb3duKHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmll
d19vbl9rZXlfdXAodm9pZCogZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2
ZW50X2luZm8pCit7CisgICAgRXZhc19FdmVudF9LZXlfVXAqIGV2ID0gKEV2YXNfRXZlbnRfS2V5
X1VwKilldmVudF9pbmZvOworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3
X1NtYXJ0X0RhdGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFw
aSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+a2V5X3VwKTsKKyAg
ICBzZC0+YXBpLT5rZXlfdXAoc2QsIGV2KTsKK30KKworc3RhdGljIGlubGluZSBXVEY6OlBhc3NS
ZWZQdHI8V2ViQ29yZTo6RnJhbWU+IF9ld2tfdmlld19jb3JlX2ZyYW1lX25ldyhFd2tfVmlld19T
bWFydF9EYXRhKiBzZCwgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBXZWJDb3JlOjpIVE1M
RnJhbWVPd25lckVsZW1lbnQqIG93bmVyKQoreworICAgIFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xp
ZW50RWZsKiBmbGMgPQorICAgICAgICBuZXcgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRFZmwo
c2QtPnNlbGYpOworICAgIGlmICghZmxjKSB7CisgICAgICAgIENSSVRJQ0FMKCJDb3VsZCBub3Qg
Y3JlYXRlIGZyYW1lIGxvYWRlciBjbGllbnQuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KyAgICBmbGMtPnNldEN1c3RvbVVzZXJBZ2VudChXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KHBy
aXYtPnNldHRpbmdzLnVzZXJfYWdlbnQpKTsKKworICAgIHJldHVybiBXZWJDb3JlOjpGcmFtZTo6
Y3JlYXRlKHByaXYtPnBhZ2UsIG93bmVyLCBmbGMpLmdldCgpOworfQorCitzdGF0aWMgRXZhc19T
bWFydF9DbGFzcyBfcGFyZW50X3NjID0gRVZBU19TTUFSVF9DTEFTU19JTklUX05VTEw7CisKK3N0
YXRpYyBFd2tfVmlld19Qcml2YXRlX0RhdGEqIF9ld2tfdmlld19wcml2X25ldyhFd2tfVmlld19T
bWFydF9EYXRhKiBzZCkKK3sKKyAgICBFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYgPQorICAg
ICAgICAoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiljYWxsb2MoMSwgc2l6ZW9mKEV3a19WaWV3X1By
aXZhdGVfRGF0YSkpOworICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzOworICAgIFdlYkNvcmU6
OktVUkwgdXJsOworCisgICAgaWYgKCFwcml2KSB7CisgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBu
b3QgYWxsb2NhdGUgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhIik7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKyAgICBwcml2LT5wYWdlID0gbmV3IFdlYkNvcmU6OlBhZ2UoCisgICAgICAgIHN0YXRp
Y19jYXN0PFdlYkNvcmU6OkNocm9tZUNsaWVudCo+KG5ldyBXZWJDb3JlOjpDaHJvbWVDbGllbnRF
Zmwoc2QtPnNlbGYpKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8V2ViQ29yZTo6Q29udGV4dE1lbnVD
bGllbnQqPihuZXcgV2ViQ29yZTo6Q29udGV4dE1lbnVDbGllbnRFZmwoc2QtPnNlbGYpKSwKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RWRpdG9yQ2xpZW50Kj4obmV3IFdlYkNvcmU6OkVk
aXRvckNsaWVudEVmbChzZC0+c2VsZikpLAorICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpE
cmFnQ2xpZW50Kj4obmV3IFdlYkNvcmU6OkRyYWdDbGllbnRFZmwpLAorICAgICAgICBzdGF0aWNf
Y2FzdDxXZWJDb3JlOjpJbnNwZWN0b3JDbGllbnQqPihuZXcgV2ViQ29yZTo6SW5zcGVjdG9yQ2xp
ZW50RWZsKSwKKyAgICAgICAgMCwKKyAgICAgICAgMCk7CisgICAgaWYgKCFwcml2LT5wYWdlKSB7
CisgICAgICAgIENSSVRJQ0FMKCJDb3VsZCBub3QgY3JlYXRlIFdlYktpdCBQYWdlIik7CisgICAg
ICAgIGdvdG8gZXJyb3JfcGFnZTsKKyAgICB9CisKKyAgICBwcml2LT5wYWdlX3NldHRpbmdzID0g
cHJpdi0+cGFnZS0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXByaXYtPnBhZ2Vfc2V0dGluZ3MpIHsK
KyAgICAgICAgQ1JJVElDQUwoIkNvdWxkIG5vdCBnZXQgcGFnZSBzZXR0aW5ncy4iKTsKKyAgICAg
ICAgZ290byBlcnJvcl9zZXR0aW5nczsKKyAgICB9CisKKyAgICBwcml2LT5wYWdlX3NldHRpbmdz
LT5zZXRMb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkodHJ1ZSk7CisgICAgcHJpdi0+cGFnZV9zZXR0
aW5ncy0+c2V0RGVmYXVsdEZpeGVkRm9udFNpemUoMTIpOworICAgIHByaXYtPnBhZ2Vfc2V0dGlu
Z3MtPnNldERlZmF1bHRGb250U2l6ZSgxNik7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0
U2VyaWZGb250RmFtaWx5KCJzZXJpZiIpOworICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEZp
eGVkRm9udEZhbWlseSgibW9ub3R5cGUiKTsKKyAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRT
YW5zU2VyaWZGb250RmFtaWx5KCJzYW5zIik7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0
U3RhbmRhcmRGb250RmFtaWx5KCJzYW5zIik7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0
SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0UGx1
Z2luc0VuYWJsZWQodHJ1ZSk7CisKKyAgICB1cmwgPSBwcml2LT5wYWdlX3NldHRpbmdzLT51c2Vy
U3R5bGVTaGVldExvY2F0aW9uKCk7CisgICAgcHJpdi0+c2V0dGluZ3MudXNlcl9zdHlsZXNoZWV0
ID0gZWluYV9zdHJpbmdzaGFyZV9hZGQodXJsLnByZXR0eVVSTCgpLnV0ZjgoKS5kYXRhKCkpOwor
CisgICAgcHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfZGVmYXVsdCA9IGVpbmFfc3RyaW5nc2hhcmVf
YWRkCisgICAgICAgIChwcml2LT5wYWdlX3NldHRpbmdzLT5kZWZhdWx0VGV4dEVuY29kaW5nTmFt
ZSgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9taW5pbXVtX3Np
emUgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5taW5pbXVtRm9udFNpemUoKTsKKyAgICBwcml2LT5z
ZXR0aW5ncy5mb250X21pbmltdW1fbG9naWNhbF9zaXplID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+
bWluaW11bUxvZ2ljYWxGb250U2l6ZSgpOworICAgIHByaXYtPnNldHRpbmdzLmZvbnRfZGVmYXVs
dF9zaXplID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCk7CisgICAgcHJp
di0+c2V0dGluZ3MuZm9udF9tb25vc3BhY2Vfc2l6ZSA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmRl
ZmF1bHRGaXhlZEZvbnRTaXplKCk7CisKKyAgICBzID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+c3Rh
bmRhcmRGb250RmFtaWx5KCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9zdGFuZGFyZCA9IGVp
bmFfc3RyaW5nc2hhcmVfYWRkKHMuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgcyA9IHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPmN1cnNpdmVGb250RmFtaWx5KCk7CisgICAgcHJpdi0+c2V0dGlu
Z3MuZm9udF9jdXJzaXZlID0gZWluYV9zdHJpbmdzaGFyZV9hZGQocy5zdHJpbmcoKS51dGY4KCku
ZGF0YSgpKTsKKyAgICBzID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+Zml4ZWRGb250RmFtaWx5KCk7
CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9tb25vc3BhY2UgPSBlaW5hX3N0cmluZ3NoYXJlX2Fk
ZChzLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIHMgPSBwcml2LT5wYWdlX3NldHRpbmdz
LT5mYW50YXN5Rm9udEZhbWlseSgpOworICAgIHByaXYtPnNldHRpbmdzLmZvbnRfZmFudGFzeSA9
IGVpbmFfc3RyaW5nc2hhcmVfYWRkKHMuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgcyA9
IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNlcmlmRm9udEZhbWlseSgpOworICAgIHByaXYtPnNldHRp
bmdzLmZvbnRfc2VyaWYgPSBlaW5hX3N0cmluZ3NoYXJlX2FkZChzLnN0cmluZygpLnV0ZjgoKS5k
YXRhKCkpOworICAgIHMgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5zYW5zU2VyaWZGb250RmFtaWx5
KCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9zYW5zX3NlcmlmID0gZWluYV9zdHJpbmdzaGFy
ZV9hZGQocy5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIHByaXYtPnNldHRpbmdzLmF1
dG9fbG9hZF9pbWFnZXMgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5sb2Fkc0ltYWdlc0F1dG9tYXRp
Y2FsbHkoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5hdXRvX3Nocmlua19pbWFnZXMgPSBwcml2LT5w
YWdlX3NldHRpbmdzLT5zaHJpbmtzU3RhbmRhbG9uZUltYWdlc1RvRml0KCk7CisgICAgcHJpdi0+
c2V0dGluZ3MuZW5hYmxlX3NjcmlwdHMgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5pc0phdmFTY3Jp
cHRFbmFibGVkKCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZW5hYmxlX3BsdWdpbnMgPSBwcml2LT5w
YWdlX3NldHRpbmdzLT5hcmVQbHVnaW5zRW5hYmxlZCgpOworICAgIHByaXYtPnNldHRpbmdzLnNj
cmlwdHNfd2luZG93X29wZW4gPSBwcml2LT5wYWdlX3NldHRpbmdzLT5hbGxvd1NjcmlwdHNUb0Ns
b3NlV2luZG93cygpOworICAgIHByaXYtPnNldHRpbmdzLnJlc2l6YWJsZV90ZXh0YXJlYXMgPSBw
cml2LT5wYWdlX3NldHRpbmdzLT50ZXh0QXJlYXNBcmVSZXNpemFibGUoKTsKKyAgICBwcml2LT5z
ZXR0aW5ncy5wcml2YXRlX2Jyb3dzaW5nID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+cHJpdmF0ZUJy
b3dzaW5nRW5hYmxlZCgpOworICAgIHByaXYtPnNldHRpbmdzLmNhcmV0X2Jyb3dzaW5nID0gcHJp
di0+cGFnZV9zZXR0aW5ncy0+Y2FyZXRCcm93c2luZ0VuYWJsZWQoKTsKKworCisgICAgcHJpdi0+
bWFpbl9mcmFtZSA9IF9ld2tfdmlld19jb3JlX2ZyYW1lX25ldyhzZCwgcHJpdiwgMCkuZ2V0KCk7
CisgICAgaWYgKCFwcml2LT5tYWluX2ZyYW1lKSB7CisgICAgICAgIENSSVRJQ0FMKCJDb3VsZCBu
b3QgY3JlYXRlIG1haW4gZnJhbWUuIik7CisgICAgICAgIGdvdG8gZXJyb3JfbWFpbl9mcmFtZTsK
KyAgICB9CisKKyAgICBwcml2LT5oaXN0b3J5ID0gZXdrX2hpc3RvcnlfbmV3KHByaXYtPnBhZ2Ut
PmJhY2tGb3J3YXJkTGlzdCgpKTsKKyAgICBpZiAoIXByaXYtPmhpc3RvcnkpIHsKKyAgICAgICAg
Q1JJVElDQUwoIkNvdWxkIG5vdCBjcmVhdGUgaGlzdG9yeSBpbnN0YW5jZSBmb3Igdmlldy4iKTsK
KyAgICAgICAgZ290byBlcnJvcl9oaXN0b3J5OworICAgIH0KKworICAgIHJldHVybiBwcml2Owor
CitlcnJvcl9oaXN0b3J5OgorICAgIC8vIGRlbGV0ZSBwcml2LT5tYWluX2ZyYW1lOyAvKiBkbyBu
b3QgZGVsZXRlIHByaXYtPm1haW5fZnJhbWUgKi8KK2Vycm9yX21haW5fZnJhbWU6CitlcnJvcl9z
ZXR0aW5nczoKKyAgICBkZWxldGUgcHJpdi0+cGFnZTsKK2Vycm9yX3BhZ2U6CisgICAgZnJlZShw
cml2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3ByaXZfZGVs
KEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdikKK3sKKyAgICBpZiAoIXByaXYpCisgICAgICAg
IHJldHVybjsKKworICAgIC8qIGRvIG5vdCBkZWxldGUgcHJpdi0+bWFpbl9mcmFtZSAqLworCisg
ICAgZnJlZShwcml2LT5yZXBhaW50cy5hcnJheSk7CisgICAgZnJlZShwcml2LT5zY3JvbGxzLmFy
cmF5KTsKKworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLnVzZXJfYWdl
bnQpOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLnVzZXJfc3R5bGVz
aGVldCk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZW5jb2Rpbmdf
ZGVmYXVsdCk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZm9udF9z
dGFuZGFyZCk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZm9udF9j
dXJzaXZlKTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5mb250X21v
bm9zcGFjZSk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZm9udF9m
YW50YXN5KTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5mb250X3Nl
cmlmKTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5mb250X3NhbnNf
c2VyaWYpOworCisgICAgaWYgKHByaXYtPmFuaW1hdGVkX3pvb20uYW5pbWF0b3IpCisgICAgICAg
IGVjb3JlX2FuaW1hdG9yX2RlbChwcml2LT5hbmltYXRlZF96b29tLmFuaW1hdG9yKTsKKworICAg
IGV3a19oaXN0b3J5X2ZyZWUocHJpdi0+aGlzdG9yeSk7CisKKyAgICBkZWxldGUgcHJpdi0+cGFn
ZTsKKyAgICBmcmVlKHByaXYpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21hcnRfYWRk
KEV2YXNfT2JqZWN0KiBvKQoreworICAgIGNvbnN0IEV2YXNfU21hcnQqIHNtYXJ0ID0gZXZhc19v
YmplY3Rfc21hcnRfc21hcnRfZ2V0KG8pOworICAgIGNvbnN0IEV2YXNfU21hcnRfQ2xhc3MqIHNj
ID0gZXZhc19zbWFydF9jbGFzc19nZXQoc21hcnQpOworICAgIGNvbnN0IEV3a19WaWV3X1NtYXJ0
X0NsYXNzKiBhcGkgPSAoY29uc3QgRXdrX1ZpZXdfU21hcnRfQ2xhc3MqKXNjOworICAgIEVJTkFf
U0FGRVRZX09OX05VTExfUkVUVVJOKGFwaS0+YmFja2luZ19zdG9yZV9hZGQpOworICAgIEVXS19W
SUVXX1NEX0dFVChvLCBzZCk7CisKKyAgICBpZiAoIXNkKSB7CisgICAgICAgIHNkID0gKEV3a19W
aWV3X1NtYXJ0X0RhdGEqKWNhbGxvYygxLCBzaXplb2YoRXdrX1ZpZXdfU21hcnRfRGF0YSkpOwor
ICAgICAgICBpZiAoIXNkKQorICAgICAgICAgICAgQ1JJVElDQUwoImNvdWxkIG5vdCBhbGxvY2F0
ZSBFd2tfVmlld19TbWFydF9EYXRhIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YXNf
b2JqZWN0X3NtYXJ0X2RhdGFfc2V0KG8sIHNkKTsKKyAgICB9CisKKyAgICBzZC0+YmdfY29sb3Iu
ciA9IDI1NTsKKyAgICBzZC0+YmdfY29sb3IuZyA9IDI1NTsKKyAgICBzZC0+YmdfY29sb3IuYiA9
IDI1NTsKKyAgICBzZC0+YmdfY29sb3IuYSA9IDI1NTsKKworICAgIHNkLT5zZWxmID0gbzsKKyAg
ICBzZC0+X3ByaXYgPSBfZXdrX3ZpZXdfcHJpdl9uZXcoc2QpOworICAgIHNkLT5hcGkgPSBhcGk7
CisKKyAgICBfcGFyZW50X3NjLmFkZChvKTsKKworICAgIGlmICghc2QtPl9wcml2KQorICAgICAg
ICByZXR1cm47CisKKyAgICBFV0tfVklFV19QUklWX0dFVChzZCwgcHJpdik7CisKKyAgICBzZC0+
YmFja2luZ19zdG9yZSA9IGFwaS0+YmFja2luZ19zdG9yZV9hZGQoc2QpOworICAgIGlmICghc2Qt
PmJhY2tpbmdfc3RvcmUpIHsKKyAgICAgICAgRVJSKCJDb3VsZCBub3QgY3JlYXRlIGJhY2tpbmcg
c3RvcmUgb2JqZWN0LiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZXZhc19vYmpl
Y3Rfc21hcnRfbWVtYmVyX2FkZChzZC0+YmFja2luZ19zdG9yZSwgbyk7CisgICAgZXZhc19vYmpl
Y3Rfc2hvdyhzZC0+YmFja2luZ19zdG9yZSk7CisKKyAgICBzZC0+bWFpbl9mcmFtZSA9IGV3a19m
cmFtZV9hZGQoc2QtPmJhc2UuZXZhcyk7CisgICAgaWYgKCFzZC0+bWFpbl9mcmFtZSkgeworICAg
ICAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgbWFpbiBmcmFtZSBvYmplY3QuIik7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWV3a19mcmFtZV9pbml0KHNkLT5tYWluX2ZyYW1l
LCBvLCBwcml2LT5tYWluX2ZyYW1lKSkgeworICAgICAgICBFUlIoIkNvdWxkIG5vdCBpbml0aWFs
aXplIG1haW4gZnJtZSBvYmplY3QuIik7CisgICAgICAgIGV2YXNfb2JqZWN0X2RlbChzZC0+bWFp
bl9mcmFtZSk7CisgICAgICAgIHNkLT5tYWluX2ZyYW1lID0gMDsKKworICAgICAgICBkZWxldGUg
cHJpdi0+bWFpbl9mcmFtZTsKKyAgICAgICAgcHJpdi0+bWFpbl9mcmFtZSA9IDA7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBldmFzX29iamVjdF9uYW1lX3NldChzZC0+bWFpbl9mcmFt
ZSwgIkVXS19GcmFtZTptYWluIik7CisgICAgZXZhc19vYmplY3Rfc21hcnRfbWVtYmVyX2FkZChz
ZC0+bWFpbl9mcmFtZSwgbyk7CisgICAgZXZhc19vYmplY3Rfc2hvdyhzZC0+bWFpbl9mcmFtZSk7
CisKKyNkZWZpbmUgQ09OTkVDVChzLCBjKSBldmFzX29iamVjdF9ldmVudF9jYWxsYmFja19hZGQo
bywgcywgYywgc2QpCisgICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX0ZPQ1VTX0lOLCBfZXdrX3Zp
ZXdfb25fZm9jdXNfaW4pOworICAgIENPTk5FQ1QoRVZBU19DQUxMQkFDS19GT0NVU19PVVQsIF9l
d2tfdmlld19vbl9mb2N1c19vdXQpOworICAgIENPTk5FQ1QoRVZBU19DQUxMQkFDS19NT1VTRV9X
SEVFTCwgX2V3a192aWV3X29uX21vdXNlX3doZWVsKTsKKyAgICBDT05ORUNUKEVWQVNfQ0FMTEJB
Q0tfTU9VU0VfRE9XTiwgX2V3a192aWV3X29uX21vdXNlX2Rvd24pOworICAgIENPTk5FQ1QoRVZB
U19DQUxMQkFDS19NT1VTRV9VUCwgX2V3a192aWV3X29uX21vdXNlX3VwKTsKKyAgICBDT05ORUNU
KEVWQVNfQ0FMTEJBQ0tfTU9VU0VfTU9WRSwgX2V3a192aWV3X29uX21vdXNlX21vdmUpOworICAg
IENPTk5FQ1QoRVZBU19DQUxMQkFDS19LRVlfRE9XTiwgX2V3a192aWV3X29uX2tleV9kb3duKTsK
KyAgICBDT05ORUNUKEVWQVNfQ0FMTEJBQ0tfS0VZX1VQLCBfZXdrX3ZpZXdfb25fa2V5X3VwKTsK
KyN1bmRlZiBDT05ORUNUCit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9kZWwoRXZh
c19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUKG8sIHNkKTsKKyAgICBFd2tfVmll
d19Qcml2YXRlX0RhdGEqIHByaXYgPSBzZCA/IHNkLT5fcHJpdiA6IDA7CisKKyAgICBfcGFyZW50
X3NjLmRlbChvKTsKKyAgICBfZXdrX3ZpZXdfcHJpdl9kZWwocHJpdik7Cit9CisKK3N0YXRpYyB2
b2lkIF9ld2tfdmlld19zbWFydF9yZXNpemUoRXZhc19PYmplY3QqIG8sIEV2YXNfQ29vcmQgdywg
RXZhc19Db29yZCBoKQoreworICAgIEVXS19WSUVXX1NEX0dFVChvLCBzZCk7CisKKyAgICAvLyB0
aGVzZSBzaG91bGQgYmUgcXVldWVkIGFuZCBwcm9jZXNzZWQgaW4gY2FsY3VsYXRlIGFzIHdlbGwh
CisgICAgZXZhc19vYmplY3RfcmVzaXplKHNkLT5iYWNraW5nX3N0b3JlLCB3LCBoKTsKKworICAg
IHNkLT5jaGFuZ2VkLnNpemUgPSBFSU5BX1RSVUU7CisgICAgX2V3a192aWV3X3NtYXJ0X2NoYW5n
ZWQoc2QpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21hcnRfbW92ZShFdmFzX09iamVj
dCogbywgRXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
KG8sIHNkKTsKKyAgICBzZC0+Y2hhbmdlZC5wb3NpdGlvbiA9IEVJTkFfVFJVRTsKKyAgICBfZXdr
X3ZpZXdfc21hcnRfY2hhbmdlZChzZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFy
dF9jYWxjdWxhdGUoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUKG8sIHNk
KTsKKyAgICBFV0tfVklFV19QUklWX0dFVChzZCwgcHJpdik7CisgICAgRUlOQV9TQUZFVFlfT05f
TlVMTF9SRVRVUk4oc2QtPmFwaS0+Y29udGVudHNfcmVzaXplKTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl9OVUxMX1JFVFVSTihzZC0+YXBpLT5zY3JvbGxzX3Byb2Nlc3MpOworICAgIEVJTkFfU0FGRVRZ
X09OX05VTExfUkVUVVJOKHNkLT5hcGktPnJlcGFpbnRzX3Byb2Nlc3MpOworICAgIEV2YXNfQ29v
cmQgeCwgeSwgdywgaDsKKworICAgIHNkLT5jaGFuZ2VkLmFueSA9IEVJTkFfRkFMU0U7CisKKyAg
ICBpZiAoIXNkLT5tYWluX2ZyYW1lIHx8ICFwcml2LT5tYWluX2ZyYW1lKQorICAgICAgICByZXR1
cm47CisKKyAgICBldmFzX29iamVjdF9nZW9tZXRyeV9nZXQobywgJngsICZ5LCAmdywgJmgpOwor
CisgICAgREJHKCJvPSVwIGdlbz1bJWQsICVkICsgJWR4JWRdLCBjaGFuZ2VkOiBzaXplPSVoaHUs
ICIKKyAgICAgICAgInNjcm9sbHM9JXp1LCByZXBhaW50cz0lenUiLAorICAgICAgICBvLCB4LCB5
LCB3LCBoLCBzZC0+Y2hhbmdlZC5zaXplLAorICAgICAgICBwcml2LT5zY3JvbGxzLmNvdW50LCBw
cml2LT5yZXBhaW50cy5jb3VudCk7CisKKyAgICBpZiAoc2QtPmNoYW5nZWQuc2l6ZSAmJiAoKHcg
IT0gc2QtPnZpZXcudykgfHwgKGggIT0gc2QtPnZpZXcuaCkpKSB7CisgICAgICAgIFdlYkNvcmU6
OkZyYW1lVmlldyogdmlldyA9IHByaXYtPm1haW5fZnJhbWUtPnZpZXcoKTsKKyAgICAgICAgaWYg
KHZpZXcpIHsKKyAgICAgICAgICAgIHZpZXctPnJlc2l6ZSh3LCBoKTsKKyAgICAgICAgICAgIHZp
ZXctPmZvcmNlTGF5b3V0KCk7CisgICAgICAgICAgICB2aWV3LT5hZGp1c3RWaWV3U2l6ZSgpOwor
ICAgICAgICAgICAgSW50U2l6ZSBzaXplID0gdmlldy0+Y29udGVudHNTaXplKCk7CisgICAgICAg
ICAgICBpZiAoIXNkLT5hcGktPmNvbnRlbnRzX3Jlc2l6ZShzZCwgc2l6ZS53aWR0aCgpLCBzaXpl
LmhlaWdodCgpKSkKKyAgICAgICAgICAgICAgICBFUlIoImZhaWxlZCB0byByZXNpemUgY29udGVu
dHMgdG8gJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICBzaXplLndpZHRoKCksIHNpemUuaGVp
Z2h0KCkpOworICAgICAgICB9CisgICAgICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShzZC0+bWFpbl9m
cmFtZSwgdywgaCk7CisgICAgICAgIHNkLT5jaGFuZ2VkLmZyYW1lX3JlY3QgPSBFSU5BX1RSVUU7
CisgICAgICAgIHNkLT52aWV3LncgPSB3OworICAgICAgICBzZC0+dmlldy5oID0gaDsKKyAgICB9
CisgICAgc2QtPmNoYW5nZWQuc2l6ZSA9IEVJTkFfRkFMU0U7CisKKyAgICBpZiAoc2QtPmNoYW5n
ZWQucG9zaXRpb24gJiYgKCh4ICE9IHNkLT52aWV3LngpIHx8ICh5ICE9IHNkLT52aWV3LnkpKSkg
eworICAgICAgICBldmFzX29iamVjdF9tb3ZlKHNkLT5tYWluX2ZyYW1lLCB4LCB5KTsKKyAgICAg
ICAgZXZhc19vYmplY3RfbW92ZShzZC0+YmFja2luZ19zdG9yZSwgeCwgeSk7CisgICAgICAgIHNk
LT5jaGFuZ2VkLmZyYW1lX3JlY3QgPSBFSU5BX1RSVUU7CisgICAgICAgIHNkLT52aWV3LnggPSB4
OworICAgICAgICBzZC0+dmlldy55ID0geTsKKyAgICB9CisgICAgc2QtPmNoYW5nZWQucG9zaXRp
b24gPSBFSU5BX0ZBTFNFOworCisgICAgZXdrX3ZpZXdfbGF5b3V0X2lmX25lZWRlZF9yZWN1cnNp
dmUoc2QtPl9wcml2KTsKKworICAgIGlmICghc2QtPmFwaS0+c2Nyb2xsc19wcm9jZXNzKHNkKSkK
KyAgICAgICAgRVJSKCJmYWlsZWQgdG8gcHJvY2VzcyBzY3JvbGxzLiIpOworICAgIF9ld2tfdmll
d19zY3JvbGxzX2ZsdXNoKHByaXYpOworCisgICAgaWYgKCFzZC0+YXBpLT5yZXBhaW50c19wcm9j
ZXNzKHNkKSkKKyAgICAgICAgRVJSKCJmYWlsZWQgdG8gcHJvY2VzcyByZXBhaW50cy4iKTsKKyAg
ICBfZXdrX3ZpZXdfcmVwYWludHNfZmx1c2gocHJpdik7CisKKyAgICBpZiAoc2QtPmNoYW5nZWQu
ZnJhbWVfcmVjdCkgeworICAgICAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBwcml2LT5t
YWluX2ZyYW1lLT52aWV3KCk7CisgICAgICAgIHZpZXctPmZyYW1lUmVjdHNDaGFuZ2VkKCk7IC8q
IGZvcmNlIHRyZWUgdG8gZ2V0IHBvc2l0aW9uIGZyb20gcm9vdCAqLworICAgICAgICBzZC0+Y2hh
bmdlZC5mcmFtZV9yZWN0ID0gRUlOQV9GQUxTRTsKKyAgICB9Cit9CisKK3N0YXRpYyBFaW5hX0Jv
b2wgX2V3a192aWV3X3NtYXJ0X2NvbnRlbnRzX3Jlc2l6ZShFd2tfVmlld19TbWFydF9EYXRhKiBz
ZCwgaW50IHcsIGludCBoKQoreworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK3N0YXRpYyBF
aW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X3pvb21fc2V0KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNk
LCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KQoreworICAgIGRvdWJs
ZSBweCwgcHk7CisgICAgRXZhc19Db29yZCB4LCB5LCB3LCBoOworICAgIEVpbmFfQm9vbCByZXQ7
CisKKyAgICBld2tfZnJhbWVfc2Nyb2xsX3NpemVfZ2V0KHNkLT5tYWluX2ZyYW1lLCAmdywgJmgp
OworICAgIGV3a19mcmFtZV9zY3JvbGxfcG9zX2dldChzZC0+bWFpbl9mcmFtZSwgJngsICZ5KTsK
KworICAgIGlmICh3ICsgc2QtPnZpZXcudyA+IDApCisgICAgICAgIHB4ID0gKGRvdWJsZSkoeCAr
IGN4KSAvICh3ICsgc2QtPnZpZXcudyk7CisgICAgZWxzZQorICAgICAgICBweCA9IDAuMDsKKwor
ICAgIGlmIChoICsgc2QtPnZpZXcuaCA+IDApCisgICAgICAgIHB5ID0gKGRvdWJsZSkoeSArIGN5
KSAvIChoICsgc2QtPnZpZXcuaCk7CisgICAgZWxzZQorICAgICAgICBweSA9IDAuMDsKKworICAg
IHJldCA9IGV3a19mcmFtZV96b29tX3NldChzZC0+bWFpbl9mcmFtZSwgem9vbSk7CisKKyAgICBl
d2tfZnJhbWVfc2Nyb2xsX3NpemVfZ2V0KHNkLT5tYWluX2ZyYW1lLCAmdywgJmgpOworICAgIHgg
PSAodyArIHNkLT52aWV3LncpICogcHggLSBjeDsKKyAgICB5ID0gKGggKyBzZC0+dmlldy5oKSAq
IHB5IC0gY3k7CisgICAgZXdrX2ZyYW1lX3Njcm9sbF9zZXQoc2QtPm1haW5fZnJhbWUsIHgsIHkp
OworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9mbHVz
aChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYpOworICAgIF9ld2tfdmlld19yZXBhaW50c19mbHVzaChwcml2KTsKKyAg
ICBfZXdrX3ZpZXdfc2Nyb2xsc19mbHVzaChwcml2KTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBf
ZXdrX3ZpZXdfc21hcnRfcHJlX3JlbmRlcl9yZWdpb24oRXdrX1ZpZXdfU21hcnRfRGF0YSogc2Qs
IEV2YXNfQ29vcmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCwg
ZmxvYXQgem9vbSkKK3sKKyAgICBXUk4oIm5vdCBzdXBwb3J0ZWQgYnkgZW5naW5lLiBzZD0lcCBh
cmVhPSVkLCVkKyVkeCVkLCB6b29tPSVmIiwKKyAgICAgICAgc2QsIHgsIHksIHcsIGgsIHpvb20p
OworICAgIHJldHVybiBFSU5BX0ZBTFNFOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21h
cnRfcHJlX3JlbmRlcl9jYW5jZWwoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgV1JO
KCJub3Qgc3VwcG9ydGVkIGJ5IGVuZ2luZS4gc2Q9JXAiLCBzZCk7Cit9CisKK3N0YXRpYyBpbmxp
bmUgdm9pZCBfZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3AoRXdrX1ZpZXdfU21hcnRf
RGF0YSogc2QpCit7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCA9IDAuMDsKKyAg
ICBzZC0+YW5pbWF0ZWRfem9vbS56b29tLmVuZCA9IDAuMDsKKyAgICBzZC0+YW5pbWF0ZWRfem9v
bS56b29tLmN1cnJlbnQgPSAwLjA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfZXdrX3ZpZXdf
em9vbV9hbmltYXRlZF9maW5pc2goRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgRVdL
X1ZJRVdfUFJJVl9HRVQoc2QsIHByaXYpOworICAgIGVjb3JlX2FuaW1hdG9yX2RlbChwcml2LT5h
bmltYXRlZF96b29tLmFuaW1hdG9yKTsKKyAgICBwcml2LT5hbmltYXRlZF96b29tLmFuaW1hdG9y
ID0gMDsKKyAgICBfZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3Aoc2QpOworICAgIGV2
YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwoc2QtPnNlbGYsICJ6b29tLGFuaW1hdGVkLGVu
ZCIsIDApOworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0IF9ld2tfdmlld196b29tX2FuaW1hdGVk
X2N1cnJlbnQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2KQoreworICAgIGRvdWJsZSBub3cg
PSBlY29yZV9sb29wX3RpbWVfZ2V0KCk7CisgICAgZG91YmxlIGRlbHRhID0gbm93IC0gcHJpdi0+
YW5pbWF0ZWRfem9vbS50aW1lLnN0YXJ0OworCisgICAgaWYgKGRlbHRhID4gcHJpdi0+YW5pbWF0
ZWRfem9vbS50aW1lLmR1cmF0aW9uKQorICAgICAgICBkZWx0YSA9IHByaXYtPmFuaW1hdGVkX3pv
b20udGltZS5kdXJhdGlvbjsKKyAgICBpZiAoZGVsdGEgPCAwLjApIC8vIHRpbWUgd2VudCBiYWNr
LCBjbG9jayBhZGp1c3RlZD8KKyAgICAgICAgZGVsdGEgPSAwLjA7CisKKyAgICBkZWx0YSAvPSBw
cml2LT5hbmltYXRlZF96b29tLnRpbWUuZHVyYXRpb247CisKKyAgICByZXR1cm4gKChwcml2LT5h
bmltYXRlZF96b29tLnpvb20ucmFuZ2UgKiBkZWx0YSkKKyAgICAgICAgICAgICsgcHJpdi0+YW5p
bWF0ZWRfem9vbS56b29tLnN0YXJ0KTsKK30KKworc3RhdGljIGludCBfZXdrX3ZpZXdfem9vbV9h
bmltYXRvcl9jYih2b2lkKiBkYXRhKQoreworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0g
KEV3a19WaWV3X1NtYXJ0X0RhdGEqKWRhdGE7CisgICAgRXZhc19Db29yZCBjeCwgY3k7CisgICAg
RVdLX1ZJRVdfUFJJVl9HRVQoc2QsIHByaXYpOworICAgIGRvdWJsZSBub3cgPSBlY29yZV9sb29w
X3RpbWVfZ2V0KCk7CisKKyAgICBjeCA9IHByaXYtPmFuaW1hdGVkX3pvb20uY2VudGVyLng7Cisg
ICAgY3kgPSBwcml2LT5hbmltYXRlZF96b29tLmNlbnRlci55OworCisgICAgLy8gVE9ETzogcHJv
Z3Jlc3NpdmVseSBjZW50ZXIgKGN4LCBjeSkgLT4gKHZpZXcueCArIHZpZXcuaC8yLCB2aWV3Lnkg
KyB2aWV3LmgvMikKKyAgICBpZiAoY3ggPj0gc2QtPnZpZXcudykKKyAgICAgICAgY3ggPSBzZC0+
dmlldy53IC0gMTsKKyAgICBpZiAoY3kgPj0gc2QtPnZpZXcuaCkKKyAgICAgICAgY3kgPSBzZC0+
dmlldy5oIC0gMTsKKworICAgIGlmICgobm93ID49IHByaXYtPmFuaW1hdGVkX3pvb20udGltZS5l
bmQpCisgICAgICAgIHx8IChub3cgPCBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuc3RhcnQpKSB7
CisgICAgICAgIF9ld2tfdmlld196b29tX2FuaW1hdGVkX2ZpbmlzaChzZCk7CisgICAgICAgIGV3
a192aWV3X3pvb21fc2V0KHNkLT5zZWxmLCBwcml2LT5hbmltYXRlZF96b29tLnpvb20uZW5kLCBj
eCwgY3kpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzZC0+YW5pbWF0ZWRfem9v
bS56b29tLmN1cnJlbnQgPSBfZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9jdXJyZW50KHByaXYpOwor
ICAgIHNkLT5hcGktPnpvb21fd2Vha19zZXQoc2QsIHNkLT5hbmltYXRlZF96b29tLnpvb20uY3Vy
cmVudCwgY3gsIGN5KTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9l
d2tfdmlld196b29tX2FuaW1hdGlvbl9zdGFydChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sK
KyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIGlmIChwcml2
LT5hbmltYXRlZF96b29tLmFuaW1hdG9yKQorICAgICAgICByZXR1cm47CisgICAgcHJpdi0+YW5p
bWF0ZWRfem9vbS5hbmltYXRvciA9IGVjb3JlX2FuaW1hdG9yX2FkZAorICAgICAgICAoX2V3a192
aWV3X3pvb21fYW5pbWF0b3JfY2IsIHNkKTsKK30KKworLyoqCisgKiBTZXRzIHRoZSBzbWFydCBj
bGFzcyBhcGkgd2l0aG91dCBhbnkgYmFja2luZyBzdG9yZSwgZW5hYmxpbmcgdmlldworICogdG8g
YmUgaW5oZXJpdGVkLgorICoKKyAqIEBwYXJhbSBhcGkgY2xhc3MgZGVmaW5pdGlvbiB0byBiZSBz
ZXQsIGFsbCBtZW1iZXJzIHdpdGggdGhlCisgKiAgICAgICAgZXhjZXB0aW9uIG9mIEV2YXNfU21h
cnRfQ2xhc3MtPmRhdGEgbWF5IGJlIG92ZXJyaWRkZW4uIE11c3QKKyAqICAgICAgICBAYiBub3Qg
YmUgQGMgTlVMTC4KKyAqCisgKiBAbm90ZSBFdmFzX1NtYXJ0X0NsYXNzLT5kYXRhIGlzIHVzZWQg
dG8gaW1wbGVtZW50IHR5cGUgY2hlY2tpbmcgYW5kCisgKiAgICAgICBpcyBub3Qgc3VwcG9zZWQg
dG8gYmUgY2hhbmdlZC9vdmVycmlkZGVuLiBJZiB5b3UgbmVlZCBleHRyYQorICogICAgICAgZGF0
YSBmb3IgeW91ciBzbWFydCBjbGFzcyB0byB3b3JrLCBqdXN0IGV4dGVuZAorICogICAgICAgRXdr
X1ZpZXdfU21hcnRfQ2xhc3MgaW5zdGVhZC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBv
biBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG9uIGZhaWx1cmUgKHByb2JhYmx5CisgKiAgICAgICAg
IHZlcnNpb24gbWlzbWF0Y2gpLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfc2luZ2xlX3NtYXJ0X3Nl
dCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19iYXNlX3NtYXJ0X3NldChFd2tfVmlld19TbWFy
dF9DbGFzcyogYXBpKQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChhcGks
IEVJTkFfRkFMU0UpOworCisgICAgaWYgKGFwaS0+dmVyc2lvbiAhPSBFV0tfVklFV19TTUFSVF9D
TEFTU19WRVJTSU9OKSB7CisgICAgICAgIEVJTkFfTE9HX0NSSVQKKyAgICAgICAgICAgICgiRXdr
X1ZpZXdfU21hcnRfQ2xhc3MgJXAgaXMgdmVyc2lvbiAlbHUgd2hpbGUgJWx1IHdhcyBleHBlY3Rl
ZC4iLAorICAgICAgICAgICAgIGFwaSwgYXBpLT52ZXJzaW9uLCBFV0tfVklFV19TTUFSVF9DTEFT
U19WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorCisgICAgaWYg
KEVJTkFfVU5MSUtFTFkoIV9wYXJlbnRfc2MuYWRkKSkKKyAgICAgICAgZXZhc19vYmplY3Rfc21h
cnRfY2xpcHBlZF9zbWFydF9zZXQoJl9wYXJlbnRfc2MpOworCisgICAgZXZhc19vYmplY3Rfc21h
cnRfY2xpcHBlZF9zbWFydF9zZXQoJmFwaS0+c2MpOworICAgIGFwaS0+c2MuYWRkID0gX2V3a192
aWV3X3NtYXJ0X2FkZDsKKyAgICBhcGktPnNjLmRlbCA9IF9ld2tfdmlld19zbWFydF9kZWw7Cisg
ICAgYXBpLT5zYy5yZXNpemUgPSBfZXdrX3ZpZXdfc21hcnRfcmVzaXplOworICAgIGFwaS0+c2Mu
bW92ZSA9IF9ld2tfdmlld19zbWFydF9tb3ZlOworICAgIGFwaS0+c2MuY2FsY3VsYXRlID0gX2V3
a192aWV3X3NtYXJ0X2NhbGN1bGF0ZTsKKyAgICBhcGktPnNjLmRhdGEgPSBFV0tfVklFV19UWVBF
X1NUUjsgLyogdXNlZCBieSB0eXBlIGNoZWNraW5nICovCisKKyAgICBhcGktPmNvbnRlbnRzX3Jl
c2l6ZSA9IF9ld2tfdmlld19zbWFydF9jb250ZW50c19yZXNpemU7CisgICAgYXBpLT56b29tX3Nl
dCA9IF9ld2tfdmlld19zbWFydF96b29tX3NldDsKKyAgICBhcGktPmZsdXNoID0gX2V3a192aWV3
X3NtYXJ0X2ZsdXNoOworICAgIGFwaS0+cHJlX3JlbmRlcl9yZWdpb24gPSBfZXdrX3ZpZXdfc21h
cnRfcHJlX3JlbmRlcl9yZWdpb247CisgICAgYXBpLT5wcmVfcmVuZGVyX2NhbmNlbCA9IF9ld2tf
dmlld19zbWFydF9wcmVfcmVuZGVyX2NhbmNlbDsKKworICAgIGFwaS0+Zm9jdXNfaW4gPSBfZXdr
X3ZpZXdfc21hcnRfZm9jdXNfaW47CisgICAgYXBpLT5mb2N1c19vdXQgPSBfZXdrX3ZpZXdfc21h
cnRfZm9jdXNfb3V0OworICAgIGFwaS0+bW91c2Vfd2hlZWwgPSBfZXdrX3ZpZXdfc21hcnRfbW91
c2Vfd2hlZWw7CisgICAgYXBpLT5tb3VzZV9kb3duID0gX2V3a192aWV3X3NtYXJ0X21vdXNlX2Rv
d247CisgICAgYXBpLT5tb3VzZV91cCA9IF9ld2tfdmlld19zbWFydF9tb3VzZV91cDsKKyAgICBh
cGktPm1vdXNlX21vdmUgPSBfZXdrX3ZpZXdfc21hcnRfbW91c2VfbW92ZTsKKyAgICBhcGktPmtl
eV9kb3duID0gX2V3a192aWV3X3NtYXJ0X2tleV9kb3duOworICAgIGFwaS0+a2V5X3VwID0gX2V3
a192aWV3X3NtYXJ0X2tleV91cDsKKworICAgIGFwaS0+YWRkX2NvbnNvbGVfbWVzc2FnZSA9IF9l
d2tfdmlld19zbWFydF9hZGRfY29uc29sZV9tZXNzYWdlOworICAgIGFwaS0+cnVuX2phdmFzY3Jp
cHRfYWxlcnQgPSBfZXdrX3ZpZXdfc21hcnRfcnVuX2phdmFzY3JpcHRfYWxlcnQ7CisgICAgYXBp
LT5ydW5famF2YXNjcmlwdF9jb25maXJtID0gX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZhc2NyaXB0
X2NvbmZpcm07CisgICAgYXBpLT5ydW5famF2YXNjcmlwdF9wcm9tcHQgPSBfZXdrX3ZpZXdfc21h
cnRfcnVuX2phdmFzY3JpcHRfcHJvbXB0OworICAgIGFwaS0+c2hvdWxkX2ludGVycnVwdF9qYXZh
c2NyaXB0ID0gX2V3a192aWV3X3NtYXJ0X3Nob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlwdDsKKwor
ICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogU2V0IGEgZml4ZWQgbGF5b3V0IHNp
emUgdG8gYmUgdXNlZCwgZGlzc29jaWF0aW5nIGl0IGZyb20gdmlld3BvcnQgc2l6ZS4KKyAqCisg
KiBTZXR0aW5nIGEgd2lkdGggZGlmZmVyZW50IHRoYW4gemVybyBlbmFibGVzIGZpeGVkIGxheW91
dCBvbiB0aGF0CisgKiBzaXplLiBJdCdzIGF1dG9tYXRpY2FsbHkgc2NhbGVkIGJhc2VkIG9uIHpv
b20sIGJ1dCB3aWxsIG5vdCBjaGFuZ2UKKyAqIGlmIHZpZXdwb3J0IGNoYW5nZXMuCisgKgorICog
U2V0dGluZyBib3RoIEBhIHcgYW5kIEBhIGggdG8gemVybyB3aWxsIGRpc2FibGUgZml4ZWQgbGF5
b3V0LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoYW5nZSBmaXhlZCBsYXlvdXQu
CisgKiBAcGFyYW0gdyBmaXhlZCB3aWR0aCB0byB1c2UuIFRoaXMgc2l6ZSB3aWxsIGJlIGF1dG9t
YXRpY2FsbHkgc2NhbGVkCisgKiAgICAgICAgYmFzZWQgb24gem9vbSBsZXZlbC4KKyAqIEBwYXJh
bSBoIGZpeGVkIGhlaWdodCB0byB1c2UuIFRoaXMgc2l6ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkg
c2NhbGVkCisgKiAgICAgICAgYmFzZWQgb24gem9vbSBsZXZlbC4KKyAqLwordm9pZCBld2tfdmll
d19maXhlZF9sYXlvdXRfc2l6ZV9zZXQoRXZhc19PYmplY3QqIG8sIEV2YXNfQ29vcmQgdywgRXZh
c19Db29yZCBoKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAg
IEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdik7CisgICAgV2ViQ29yZTo6RnJh
bWVWaWV3KiB2aWV3ID0gc2QtPl9wcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAgaWYgKHcg
PD0gMCAmJiBoIDw9IDApIHsKKyAgICAgICAgaWYgKCFwcml2LT5maXhlZF9sYXlvdXQudXNlKQor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwcml2LT5maXhlZF9sYXlvdXQudyA9IDA7Cisg
ICAgICAgIHByaXYtPmZpeGVkX2xheW91dC5oID0gMDsKKyAgICAgICAgcHJpdi0+Zml4ZWRfbGF5
b3V0LnVzZSA9IEVJTkFfRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHByaXYtPmZp
eGVkX2xheW91dC51c2UKKyAgICAgICAgICAgICYmIHByaXYtPmZpeGVkX2xheW91dC53ID09IHcg
JiYgcHJpdi0+Zml4ZWRfbGF5b3V0LmggPT0gaCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgcHJpdi0+Zml4ZWRfbGF5b3V0LncgPSB3OworICAgICAgICBwcml2LT5maXhlZF9sYXlvdXQu
aCA9IGg7CisgICAgICAgIHByaXYtPmZpeGVkX2xheW91dC51c2UgPSBFSU5BX1RSVUU7CisKKyAg
ICAgICAgaWYgKHZpZXcpCisgICAgICAgICAgICB2aWV3LT5zZXRGaXhlZExheW91dFNpemUoV2Vi
Q29yZTo6SW50U2l6ZSh3LCBoKSk7CisgICAgfQorCisgICAgaWYgKCF2aWV3KQorICAgICAgICBy
ZXR1cm47CisgICAgdmlldy0+c2V0VXNlRml4ZWRMYXlvdXQocHJpdi0+Zml4ZWRfbGF5b3V0LnVz
ZSk7CisgICAgdmlldy0+Zm9yY2VMYXlvdXQoKTsKK30KKworLyoqCisgKiBHZXQgZml4ZWQgbGF5
b3V0IHNpemUgaW4gdXNlLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHF1ZXJ5IGZp
eGVkIGxheW91dCBzaXplLgorICogQHBhcmFtIHcgd2hlcmUgdG8gcmV0dXJuIHdpZHRoLiBSZXR1
cm5zIDAgb24gZXJyb3Igb3IgaWYgbm8gZml4ZWQKKyAqICAgICAgICBsYXlvdXQgaW4gdXNlLgor
ICogQHBhcmFtIGggd2hlcmUgdG8gcmV0dXJuIGhlaWdodC4gUmV0dXJucyAwIG9uIGVycm9yIG9y
IGlmIG5vIGZpeGVkCisgKiAgICAgICAgbGF5b3V0IGluIHVzZS4KKyAqLwordm9pZCBld2tfdmll
d19maXhlZF9sYXlvdXRfc2l6ZV9nZXQoRXZhc19PYmplY3QqIG8sIEV2YXNfQ29vcmQqIHcsIEV2
YXNfQ29vcmQqIGgpCit7CisgICAgaWYgKHcpCisgICAgICAgICp3ID0gMDsKKyAgICBpZiAoaCkK
KyAgICAgICAgKmggPSAwOworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOwor
ICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdik7CisgICAgaWYgKHByaXYt
PmZpeGVkX2xheW91dC51c2UpIHsKKyAgICAgICAgaWYgKHcpCisgICAgICAgICAgICAqdyA9IHBy
aXYtPmZpeGVkX2xheW91dC53OworICAgICAgICBpZiAoaCkKKyAgICAgICAgICAgICpoID0gcHJp
di0+Zml4ZWRfbGF5b3V0Lmg7CisgICAgfQorfQorCisvKioKKyAqIFNldCB0aGUgdGhlbWUgcGF0
aCB0byBiZSB1c2VkIGJ5IHRoaXMgdmlldy4KKyAqCisgKiBUaGlzIGFsc28gc2V0cyB0aGUgdGhl
bWUgb24gdGhlIG1haW4gZnJhbWUuIEFzIGZyYW1lcyBpbmhlcml0IHRoZW1lCisgKiBmcm9tIHRo
ZWlyIHBhcmVudCwgdGhpcyB3aWxsIGhhdmUgYWxsIGZyYW1lcyB3aXRoIHVuc2V0IHRoZW1lIHRv
CisgKiB1c2UgdGhpcyBvbmUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gY2hhbmdl
IHRoZW1lLgorICogQHBhcmFtIHBhdGggdGhlbWUgcGF0aCwgbWF5IGJlIEBjIE5VTEwgdG8gcmVz
ZXQgdG8gZGVmYXVsdC4KKyAqLwordm9pZCBld2tfdmlld190aGVtZV9zZXQoRXZhc19PYmplY3Qq
IG8sIGNvbnN0IGNoYXIqIHBhdGgpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihv
LCBzZCk7CisgICAgZXdrX2ZyYW1lX3RoZW1lX3NldChzZC0+bWFpbl9mcmFtZSwgcGF0aCk7Cit9
CisKKy8qKgorICogR2V0cyB0aGUgdGhlbWUgc2V0IG9uIHRoaXMgZnJhbWUuCisgKgorICogVGhp
cyByZXR1cm5zIHRoZSB2YWx1ZSBzZXQgYnkgZXdrX3ZpZXdfdGhlbWVfc2V0KCkuCisgKgorICog
QHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IHRoZW1lIHBhdGguCisgKgorICogQHJldHVybiB0
aGVtZSBwYXRoLCBtYXkgYmUgQGMgTlVMTCBpZiBub3Qgc2V0LgorICovCitjb25zdCBjaGFyKiBl
d2tfdmlld190aGVtZV9nZXQoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgcmV0dXJuIGV3a19mcmFtZV90aGVtZV9nZXQoc2Qt
Pm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIEdldCB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50
cyB0aGUgbWFpbiBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBnZXQgbWFp
biBmcmFtZS4KKyAqCisgKiBAcmV0dXJuIGV3a19mcmFtZSBvYmplY3Qgb3IgQGMgTlVMTCBpZiBu
b25lIHlldC4KKyAqLworRXZhc19PYmplY3QqIGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IDApOworICAgIHJldHVybiBzZC0+bWFpbl9mcmFtZTsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1
cnJlbnRseSBmb2N1c2VkIGZyYW1lIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVj
dCB0byBnZXQgZm9jdXNlZCBmcmFtZS4KKyAqCisgKiBAcmV0dXJuIGV3a19mcmFtZSBvYmplY3Qg
b3IgQGMgTlVMTCBpZiBub25lIHlldC4KKyAqLworRXZhc19PYmplY3QqIGV3a192aWV3X2ZyYW1l
X2ZvY3VzZWRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihz
ZCwgcHJpdiwgMCk7CisKKyAgICBXZWJDb3JlOjpGcmFtZSogY29yZSA9IHByaXYtPnBhZ2UtPmZv
Y3VzQ29udHJvbGxlcigpLT5mb2N1c2VkRnJhbWUoKTsKKyAgICBpZiAoIWNvcmUpCisgICAgICAg
IHJldHVybiAwOworCisgICAgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRFZmwqIGNsaWVudCA9
IHN0YXRpY19jYXN0PFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50RWZsKj4oY29yZS0+bG9hZGVy
KCktPmNsaWVudCgpKTsKKyAgICBpZiAoIWNsaWVudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIGNsaWVudC0+d2ViRnJhbWUoKTsKK30KKworLyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0
byBsb2FkIHRoZSBnaXZlbiBVUkkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gbG9h
ZCB1cmkuCisgKiBAcGFyYW0gdXJpIHVuaWZvcm0gcmVzb3VyY2UgaWRlbnRpZmllciB0byBsb2Fk
LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3NmdWwgcmVxdWVzdCwgQGMg
RUlOQV9GQUxTRSBvbiBmYWlsdXJlLgorICogICAgICAgICBOb3RlIHRoYXQgaXQgbWVhbnMgdGhl
IHJlcXVlc3Qgd2FzIGRvbmUsIG5vdCB0aGF0IGl0IHdhcworICogICAgICAgICBzYXRpc2ZpZWQu
CisgKi8KK0VpbmFfQm9vbCBld2tfdmlld191cmlfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBj
aGFyKiB1cmkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9G
QUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV91cmlfc2V0KHNkLT5tYWluX2ZyYW1lLCB1cmkp
OworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB1cmkgbG9hZGVkIGJ5IG1haW4gZnJhbWUu
CisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IGN1cnJlbnQgdXJpLgorICoKKyAq
IEByZXR1cm4gY3VycmVudCB1cmkgcmVmZXJlbmNlIG9yIEBjIE5VTEwuIEl0J3MgaW50ZXJuYWws
IGRvbid0IGNoYW5nZS4KKyAqLworY29uc3QgY2hhciogZXdrX3ZpZXdfdXJpX2dldChjb25zdCBF
dmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAw
KTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3VyaV9nZXQoc2QtPm1haW5fZnJhbWUpOworfQorCisv
KioKKyAqIEdldCB0aGUgY3VycmVudCB0aXRsZSBvZiBtYWluIGZyYW1lLgorICoKKyAqIEBwYXJh
bSBvIHZpZXcgb2JqZWN0IHRvIGdldCBjdXJyZW50IHRpdGxlLgorICoKKyAqIEByZXR1cm4gY3Vy
cmVudCB0aXRsZSByZWZlcmVuY2Ugb3IgQGMgTlVMTC4gSXQncyBpbnRlcm5hbCwgZG9uJ3QgY2hh
bmdlLgorICovCitjb25zdCBjaGFyKiBld2tfdmlld190aXRsZV9nZXQoY29uc3QgRXZhc19PYmpl
Y3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAg
cmV0dXJuIGV3a19mcmFtZV90aXRsZV9nZXQoc2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAq
IEdldHMgaWYgbWFpbiBmcmFtZSBpcyBlZGl0YWJsZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9i
amVjdCB0byBnZXQgZWRpdGFibGUgc3RhdGUuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUg
aWYgZWRpdGFibGUsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdr
X3ZpZXdfZWRpdGFibGVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVX
X1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJh
bWVfZWRpdGFibGVfZ2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBTZXQgYmFja2dy
b3VuZCBjb2xvciBhbmQgdHJhbnNwYXJlbmN5CisgKgorICogSnVzdCBhcyBpbiBFdmFzLCBjb2xv
cnMgYXJlIHByZS1tdWx0aXBsaWVkLCBzbyA1MCUgcmVkIGlzCisgKiAoMTI4LCAwLCAwLCAxMjgp
IGFuZCBub3QgKDI1NSwgMCwgMCwgMTI4KSEKKyAqCisgKiBAd2FybmluZyBXYXRjaCBvdXQgcGVy
Zm9ybWFuY2UgaXNzdWVzIHdpdGggdHJhbnNwYXJlbmN5ISBPYmplY3QKKyAqICAgICAgICAgIHdp
bGwgYmUgaGFuZGxlZCBhcyB0cmFuc3BhcmVudCBpbWFnZSBieSBldmFzIGV2ZW4gaWYgdGhlCisg
KiAgICAgICAgICB3ZWJwYWdlIHNwZWNpZmllcyBhIGJhY2tncm91bmQgY29sb3IuIFRoYXQgbWVh
biB5b3UnbGwgcGF5CisgKiAgICAgICAgICBhIHByaWNlIGV2ZW4gaWYgaXQncyBub3QgcmVhbGx5
IHRyYW5zcGFyZW50LCB0aHVzCisgKiAgICAgICAgICBzY3JvbGxpbmcvcGFubmluZyBhbmQgem9v
bWluZyB3aWxsIGJlIGxpa2VseSBzbG93ZXIgdGhhbgorICogICAgICAgICAgaWYgdHJhbnNwYXJl
bmN5IGlzIG9mZi4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGFuZ2UuCisgKiBA
cGFyYW0gciByZWQgY29tcG9uZW50LgorICogQHBhcmFtIGcgZ3JlZW4gY29tcG9uZW50LgorICog
QHBhcmFtIGIgYmx1ZSBjb21wb25lbnQuCisgKiBAcGFyYW0gYSB0cmFuc3BhcmVuY3kuCisgKi8K
K3ZvaWQgZXdrX3ZpZXdfYmdfY29sb3Jfc2V0KEV2YXNfT2JqZWN0KiBvLCBpbnQgciwgaW50IGcs
IGludCBiLCBpbnQgYSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsK
KyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVU
WV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT5iZ19jb2xvcl9zZXQpOworCisgICAgaWYgKGEgPCAw
KSB7CisgICAgICAgIFdSTigiQWxwaGEgbGVzcyB0aGFuIHplcm8gKCVkKS4iLCBhKTsKKyAgICAg
ICAgYSA9IDA7CisgICAgfSBlbHNlIGlmIChhID4gMjU1KSB7CisgICAgICAgIFdSTigiQWxwaGEg
aXMgbGFyZ2VyIHRoYW4gMjU1ICglZCkuIiwgYSk7CisgICAgICAgIGEgPSAyNTU7CisgICAgfQor
CisjZGVmaW5lIENIRUNLX1BSRU1VTF9DT0xPUihjLCBhKSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGMgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSTigiQ29sb3Ig
Y29tcG9uZW50ICIjYyIgaXMgbGVzcyB0aGFuIHplcm8gKCVkKS4iLCBjKTsgICAgICAgICBcCisg
ICAgICAgIGMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChjID4gYSkgeyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSTigiQ29sb3IgY29t
cG9uZW50ICIjYyIgaXMgZ3JlYXRlciB0aGFuIGFscGhhICglZCwgYWxwaGE9JWQpLiIsIFwKKyAg
ICAgICAgICAgIGMsIGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgICAgYyA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgQ0hFQ0tfUFJFTVVM
X0NPTE9SKHIsIGEpOworICAgIENIRUNLX1BSRU1VTF9DT0xPUihnLCBhKTsKKyAgICBDSEVDS19Q
UkVNVUxfQ09MT1IoYiwgYSk7CisjdW5kZWYgQ0hFQ0tfUFJFTVVMX0NPTE9SCisKKyAgICBzZC0+
YmdfY29sb3IuciA9IHI7CisgICAgc2QtPmJnX2NvbG9yLmcgPSBnOworICAgIHNkLT5iZ19jb2xv
ci5iID0gYjsKKyAgICBzZC0+YmdfY29sb3IuYSA9IGE7CisKKyAgICBzZC0+YXBpLT5iZ19jb2xv
cl9zZXQoc2QsIHIsIGcsIGIsIGEpOworCisgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3ID0g
c2QtPl9wcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAgaWYgKHZpZXcpIHsKKyAgICAgICAg
V2ViQ29yZTo6Q29sb3IgY29sb3I7CisKKyAgICAgICAgaWYgKCFhKQorICAgICAgICAgICAgY29s
b3IgPSBXZWJDb3JlOjpDb2xvcigwLCAwLCAwLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoYSA9PSAy
NTUpCisgICAgICAgICAgICBjb2xvciA9IFdlYkNvcmU6OkNvbG9yKHIsIGcsIGIsIGEpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBjb2xvciA9IFdlYkNvcmU6OkNvbG9yKHIgKiAyNTUgLyBh
LCBnICogMjU1IC8gYSwgYiAqIDI1NSAvIGEsIGEpOworCisgICAgICAgIHZpZXctPnVwZGF0ZUJh
Y2tncm91bmRSZWN1cnNpdmVseShjb2xvciwgIWEpOworICAgIH0KK30KKworLyoqCisgKiBRdWVy
eSBpZiB2aWV3IG9iamVjdCBiYWNrZ3JvdW5kIGNvbG9yLgorICoKKyAqIEp1c3QgYXMgaW4gRXZh
cywgY29sb3JzIGFyZSBwcmUtbXVsdGlwbGllZCwgc28gNTAlIHJlZCBpcworICogKDEyOCwgMCwg
MCwgMTI4KSBhbmQgbm90ICgyNTUsIDAsIDAsIDEyOCkhCisgKgorICogQHBhcmFtIG8gdmlldyBv
YmplY3QgdG8gcXVlcnkuCisgKiBAcGFyYW0gciB3aGVyZSB0byByZXR1cm4gcmVkIGNvbG9yIGNv
bXBvbmVudC4KKyAqIEBwYXJhbSBnIHdoZXJlIHRvIHJldHVybiBncmVlbiBjb2xvciBjb21wb25l
bnQuCisgKiBAcGFyYW0gYiB3aGVyZSB0byByZXR1cm4gYmx1ZSBjb2xvciBjb21wb25lbnQuCisg
KiBAcGFyYW0gYSB3aGVyZSB0byByZXR1cm4gYWxwaGEgdmFsdWUuCisgKi8KK3ZvaWQgZXdrX3Zp
ZXdfYmdfY29sb3JfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvLCBpbnQqIHIsIGludCogZywgaW50
KiBiLCBpbnQqIGEpCit7CisgICAgaWYgKHIpCisgICAgICAgICpyID0gMDsKKyAgICBpZiAoZykK
KyAgICAgICAgKmcgPSAwOworICAgIGlmIChiKQorICAgICAgICAqYiA9IDA7CisgICAgaWYgKGEp
CisgICAgICAgICphID0gMDsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsK
KyAgICBpZiAocikKKyAgICAgICAgKnIgPSBzZC0+YmdfY29sb3IucjsKKyAgICBpZiAoZykKKyAg
ICAgICAgKmcgPSBzZC0+YmdfY29sb3IuZzsKKyAgICBpZiAoYikKKyAgICAgICAgKmIgPSBzZC0+
YmdfY29sb3IuYjsKKyAgICBpZiAoYSkKKyAgICAgICAgKmEgPSBzZC0+YmdfY29sb3IuYTsKK30K
KworLyoqCisgKiBTZWFyY2ggdGhlIGdpdmVuIHRleHQgc3RyaW5nIGluIGRvY3VtZW50LgorICoK
KyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHdoZXJlIHRvIHNlYXJjaCB0ZXh0LgorICogQHBhcmFt
IHN0cmluZyByZWZlcmVuY2Ugc3RyaW5nIHRvIHNlYXJjaC4KKyAqIEBwYXJhbSBjYXNlX3NlbnNp
dGl2ZSBpZiBzZWFyY2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdC4KKyAqIEBwYXJh
bSBmb3J3YXJkIGlmIHNlYXJjaCBpcyBmcm9tIGN1cnNvciBhbmQgb24gb3IgYmFja3dhcmRzLgor
ICogQHBhcmFtIHdyYXAgaWYgc2VhcmNoIHNob3VsZCB3cmFwIGF0IGVuZC4KKyAqCisgKiBAcmV0
dXJuIEBjIEVJTkFfVFJVRSBpZiBmb3VuZCwgQGMgRUlOQV9GQUxTRSBpZiBub3Qgb3IgZmFpbHVy
ZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3RleHRfc2VhcmNoKGNvbnN0IEV2YXNfT2JqZWN0
KiBvLCBjb25zdCBjaGFyKiBzdHJpbmcsIEVpbmFfQm9vbCBjYXNlX3NlbnNpdGl2ZSwgRWluYV9C
b29sIGZvcndhcmQsIEVpbmFfQm9vbCB3cmFwKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9S
RVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVS
TihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5f
VkFMKHN0cmluZywgRUlOQV9GQUxTRSk7CisgICAgV2ViQ29yZTo6VGV4dENhc2VTZW5zaXRpdml0
eSBzZW5zaXRpdmU7CisgICAgV2ViQ29yZTo6RmluZERpcmVjdGlvbiBkaXJlY3Rpb247CisKKyAg
ICBpZiAoY2FzZV9zZW5zaXRpdmUpCisgICAgICAgIHNlbnNpdGl2ZSA9IFdlYkNvcmU6OlRleHRD
YXNlU2Vuc2l0aXZlOworICAgIGVsc2UKKyAgICAgICAgc2Vuc2l0aXZlID0gV2ViQ29yZTo6VGV4
dENhc2VJbnNlbnNpdGl2ZTsKKworICAgIGlmIChmb3J3YXJkKQorICAgICAgICBkaXJlY3Rpb24g
PSBXZWJDb3JlOjpGaW5kRGlyZWN0aW9uRm9yd2FyZDsKKyAgICBlbHNlCisgICAgICAgIGRpcmVj
dGlvbiA9IFdlYkNvcmU6OkZpbmREaXJlY3Rpb25CYWNrd2FyZDsKKworICAgIHJldHVybiBwcml2
LT5wYWdlLT5maW5kU3RyaW5nKFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgoc3RyaW5nKSwgc2Vu
c2l0aXZlLCBkaXJlY3Rpb24sIHdyYXApOworfQorCisvKioKKyAqIE1hcmsgbWF0Y2hlcyB0aGUg
Z2l2ZW4gdGV4dCBzdHJpbmcgaW4gZG9jdW1lbnQuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmpl
Y3Qgd2hlcmUgdG8gc2VhcmNoIHRleHQuCisgKiBAcGFyYW0gc3RyaW5nIHJlZmVyZW5jZSBzdHJp
bmcgdG8gbWF0Y2guCisgKiBAcGFyYW0gY2FzZV9zZW5zaXRpdmUgaWYgbWF0Y2ggc2hvdWxkIGJl
IGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdC4KKyAqIEBwYXJhbSBoaWdobGlnaHQgaWYgbWF0Y2hlcyBz
aG91bGQgYmUgaGlnaGxpZ2h0ZWQuCisgKiBAcGFyYW0gbGltaXQgbWF4aW11bSBhbW91bnQgb2Yg
bWF0Y2hlcywgb3IgemVybyB0byB1bmxpbWl0ZWQuCisgKgorICogQHJldHVybiBudW1iZXIgb2Yg
bWF0Y2hlcy4KKyAqLwordW5zaWduZWQgaW50IGV3a192aWV3X3RleHRfbWF0Y2hlc19tYXJrKEV2
YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBzdHJpbmcsIEVpbmFfQm9vbCBjYXNlX3NlbnNpdGl2
ZSwgRWluYV9Cb29sIGhpZ2hsaWdodCwgdW5zaWduZWQgaW50IGxpbWl0KQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09S
X1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFM
KHN0cmluZywgMCk7CisgICAgV2ViQ29yZTo6VGV4dENhc2VTZW5zaXRpdml0eSBzZW5zaXRpdmU7
CisKKyAgICBpZiAoY2FzZV9zZW5zaXRpdmUpCisgICAgICAgIHNlbnNpdGl2ZSA9IFdlYkNvcmU6
OlRleHRDYXNlU2Vuc2l0aXZlOworICAgIGVsc2UKKyAgICAgICAgc2Vuc2l0aXZlID0gV2ViQ29y
ZTo6VGV4dENhc2VJbnNlbnNpdGl2ZTsKKworICAgIHJldHVybiBwcml2LT5wYWdlLT5tYXJrQWxs
TWF0Y2hlc0ZvclRleHQoV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChzdHJpbmcpLCBzZW5zaXRp
dmUsIGhpZ2hsaWdodCwgbGltaXQpOworfQorCisvKioKKyAqIFJldmVyc2VzIHRoZSBlZmZlY3Qg
b2YgZXdrX3ZpZXdfdGV4dF9tYXRjaGVzX21hcmsoKQorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2Jq
ZWN0IHdoZXJlIHRvIHNlYXJjaCB0ZXh0LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9u
IHN1Y2Nlc3MsIEBjIEVJTkFfRkFMU0UgZm9yIGZhaWx1cmUuCisgKi8KK0VpbmFfQm9vbCBld2tf
dmlld190ZXh0X21hdGNoZXNfdW5tYXJrX2FsbChFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tf
VklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHByaXYtPnBhZ2Ut
PnVubWFya0FsbFRleHRNYXRjaGVzKCk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoq
CisgKiBTZXQgaWYgc2hvdWxkIGhpZ2hsaWdodCBtYXRjaGVzIG1hcmtlZCB3aXRoIGV3a192aWV3
X3RleHRfbWF0Y2hlc19tYXJrKCkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3Qgd2hlcmUg
dG8gc2V0IGlmIG1hdGNoZXMgYXJlIGhpZ2hsaWdodGVkIG9yIG5vdC4KKyAqIEBwYXJhbSBoaWdo
bGlnaHQgaWYgQGMgRUlOQV9UUlVFLCBtYXRjaGVzIHdpbGwgYmUgaGlnaGxpZ2h0ZWQuCisgKgor
ICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBmb3IgZmFp
bHVyZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3RleHRfbWF0Y2hlc19oaWdobGlnaHRfc2V0
KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgaGlnaGxpZ2h0KQoreworICAgIEVXS19WSUVXX1NE
X0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVf
dGV4dF9tYXRjaGVzX2hpZ2hsaWdodF9zZXQoc2QtPm1haW5fZnJhbWUsIGhpZ2hsaWdodCk7Cit9
CisKKy8qKgorICogR2V0IGlmIHNob3VsZCBoaWdobGlnaHQgbWF0Y2hlcyBtYXJrZWQgd2l0aCBl
d2tfdmlld190ZXh0X21hdGNoZXNfbWFyaygpLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0
IHRvIHF1ZXJ5IGlmIG1hdGNoZXMgYXJlIGhpZ2hsaWdodGVkIG9yIG5vdC4KKyAqCisgKiBAcmV0
dXJuIEBjIEVJTkFfVFJVRSBpZiB0aGV5IGFyZSBoaWdobGlnaHRlZCwgQGMgRUlOQV9GQUxTRSBv
dGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld190ZXh0X21hdGNoZXNfaGlnaGxpZ2h0
X2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3RleHRfbWF0Y2hl
c19oaWdobGlnaHRfZ2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBTZXRzIGlmIG1h
aW4gZnJhbWUgaXMgZWRpdGFibGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gc2V0
IGVkaXRhYmxlIHN0YXRlLgorICogQHBhcmFtIGVkaXRhYmxlIG5ldyBzdGF0ZS4KKyAqCisgKiBA
cmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4K
KyAqLworRWluYV9Cb29sIGV3a192aWV3X2VkaXRhYmxlX3NldChFdmFzX09iamVjdCogbywgRWlu
YV9Cb29sIGVkaXRhYmxlKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVfZWRpdGFibGVfc2V0KHNkLT5tYWlu
X2ZyYW1lLCBlZGl0YWJsZSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBjb3B5IG9mIHRoZSBzZWxl
Y3Rpb24gdGV4dC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBnZXQgc2VsZWN0aW9u
IHRleHQuCisgKgorICogQHJldHVybiBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIG9yIEBjIE5VTEwg
aWYgbm90aGluZyBpcyBzZWxlY3RlZCBvciBmYWlsdXJlLgorICovCitjaGFyKiBld2tfdmlld19z
ZWxlY3Rpb25fZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihz
ZCwgcHJpdiwgMCk7CisgICAgV2ViQ29yZTo6Q1N0cmluZyBzID0gcHJpdi0+cGFnZS0+Zm9jdXND
b250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3RlZFRleHQoKS51dGY4KCk7
CisgICAgaWYgKHMuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdHJk
dXAocy5kYXRhKCkpOworfQorCitzdGF0aWMgaW5saW5lIEVpbmFfQm9vbCBfZXdrX3ZpZXdfZWRp
dG9yX2NvbW1hbmQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBjb25zdCBjaGFyKiBjb21t
YW5kKQoreworICAgIHJldHVybiBwcml2LT5wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCktPmVkaXRvcigpLT5jb21tYW5kKFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVU
RjgoY29tbWFuZCkpLmV4ZWN1dGUoKTsKK30KKworLyoqCisgKiBVbnNlbGVjdHMgd2hhdGV2ZXIg
d2FzIHNlbGVjdGVkLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIG9wZXJhdGlvbiB3
YXMgZXhlY3V0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdr
X3ZpZXdfc2VsZWN0X25vbmUoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3a192aWV3X2VkaXRv
cl9jb21tYW5kKHByaXYsICJVbnNlbGVjdCIpOworfQorCisvKioKKyAqIFNlbGVjdHMgZXZlcnl0
aGluZy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRpb24gd2FzIGV4ZWN1
dGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3Nl
bGVjdF9hbGwoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3a192aWV3X2VkaXRvcl9jb21tYW5k
KHByaXYsICJTZWxlY3RBbGwiKTsKK30KKworLyoqCisgKiBTZWxlY3RzIHRoZSBjdXJyZW50IHBh
cmFncmFoLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIG9wZXJhdGlvbiB3YXMgZXhl
Y3V0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
c2VsZWN0X3BhcmFncmFwaChFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBfZXdrX3ZpZXdfZWRpdG9y
X2NvbW1hbmQocHJpdiwgIlNlbGVjdFBhcmFncmFwaCIpOworfQorCisvKioKKyAqIFNlbGVjdHMg
dGhlIGN1cnJlbnQgc2VudGVuY2UuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgb3Bl
cmF0aW9uIHdhcyBleGVjdXRlZCwgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFf
Qm9vbCBld2tfdmlld19zZWxlY3Rfc2VudGVuY2UoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3
a192aWV3X2VkaXRvcl9jb21tYW5kKHByaXYsICJTZWxlY3RTZW50ZW5jZSIpOworfQorCisvKioK
KyAqIFNlbGVjdHMgdGhlIGN1cnJlbnQgbGluZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJV
RSBpZiBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAq
LworRWluYV9Cb29sIGV3a192aWV3X3NlbGVjdF9saW5lKEV2YXNfT2JqZWN0KiBvKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJu
IF9ld2tfdmlld19lZGl0b3JfY29tbWFuZChwcml2LCAiU2VsZWN0TGluZSIpOworfQorCisvKioK
KyAqIFNlbGVjdHMgdGhlIGN1cnJlbnQgd29yZC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJV
RSBpZiBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAq
LworRWluYV9Cb29sIGV3a192aWV3X3NlbGVjdF93b3JkKEV2YXNfT2JqZWN0KiBvKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJu
IF9ld2tfdmlld19lZGl0b3JfY29tbWFuZChwcml2LCAiU2VsZWN0V29yZCIpOworfQorCisvKioK
KyAqIEdldCBjdXJyZW50IGxvYWQgcHJvZ3Jlc3MgZXN0aW1hdGUgZnJvbSAwLjAgdG8gMS4wLgor
ICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGdldCBjdXJyZW50IHByb2dyZXNzLgorICoK
KyAqIEByZXR1cm4gcHJvZ3JlcyB2YWx1ZSBmcm9tIDAuMCB0byAxLjAgb3IgLTEuMCBvbiBlcnJv
ci4KKyAqLworZG91YmxlIGV3a192aWV3X2xvYWRfcHJvZ3Jlc3NfZ2V0KGNvbnN0IEV2YXNfT2Jq
ZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIC0xLjApOwor
ICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgLTEuMCk7CisgICAgcmV0
dXJuIHByaXYtPnBhZ2UtPnByb2dyZXNzKCktPmVzdGltYXRlZFByb2dyZXNzKCk7Cit9CisKKy8q
KgorICogQXNrIG1haW4gZnJhbWUgdG8gc3RvcCBsb2FkaW5nLgorICoKKyAqIEBwYXJhbSBvIHZp
ZXcgb2JqZWN0IHRvIHN0b3AgbG9hZGluZy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBv
biBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a19mcmFt
ZV9zdG9wKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X3N0b3AoRXZhc19PYmplY3QqIG8pCit7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAg
cmV0dXJuIGV3a19mcmFtZV9zdG9wKHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBBc2sg
bWFpbiBmcmFtZSB0byByZWxvYWQgY3VycmVudCBkb2N1bWVudC4KKyAqCisgKiBAcGFyYW0gbyB2
aWV3IG9iamVjdCB0byByZWxvYWQuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3Vj
Y2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJhbWVfcmVs
b2FkKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X3JlbG9hZChFdmFzX09iamVjdCogbykKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBy
ZXR1cm4gZXdrX2ZyYW1lX3JlbG9hZChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogQXNr
IG1haW4gZnJhbWUgdG8gZnVsbHkgcmVsb2FkIGN1cnJlbnQgZG9jdW1lbnQsIHVzaW5nIG5vIGNh
Y2hlcy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byByZWxvYWQuCisgKgorICogQHJl
dHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisg
KgorICogQHNlZSBld2tfZnJhbWVfcmVsb2FkX2Z1bGwoKQorICovCitFaW5hX0Jvb2wgZXdrX3Zp
ZXdfcmVsb2FkX2Z1bGwoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9yZWxvYWRf
ZnVsbChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gbmF2
aWdhdGUgYmFjayBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIG5h
dmlnYXRlIGJhY2suCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMg
RUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJhbWVfYmFjaygpCisgKi8K
K0VpbmFfQm9vbCBld2tfdmlld19iYWNrKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVX
X1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJh
bWVfYmFjayhzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8g
bmF2aWdhdGUgZm9yd2FyZCBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0
IHRvIG5hdmlnYXRlIGZvcndhcmQuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3Vj
Y2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJhbWVfZm9y
d2FyZCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19mb3J3YXJkKEV2YXNfT2JqZWN0KiBvKQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAg
IHJldHVybiBld2tfZnJhbWVfZm9yd2FyZChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICog
TmF2aWdhdGUgYmFjayBvciBmb3J3YXJkIGluIGhpc3RvcnkuCisgKgorICogQHBhcmFtIG8gdmll
dyBvYmplY3QgdG8gbmF2aWdhdGUuCisgKiBAcGFyYW0gc3RlcHMgaWYgcG9zaXRpdmUgbmF2aWdh
dGVzIHRoYXQgYW1vdW50IGZvcndhcmRzLCBpZiBuZWdhdGl2ZQorICogICAgICAgIGRvZXMgYmFj
a3dhcmRzLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFf
RkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX2ZyYW1lX25hdmlnYXRlKCkKKyAqLwor
RWluYV9Cb29sIGV3a192aWV3X25hdmlnYXRlKEV2YXNfT2JqZWN0KiBvLCBpbnQgc3RlcHMpCit7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAg
cmV0dXJuIGV3a19mcmFtZV9uYXZpZ2F0ZShzZC0+bWFpbl9mcmFtZSwgc3RlcHMpOworfQorCisv
KioKKyAqIENoZWNrIGlmIGl0IGlzIHBvc3NpYmxlIHRvIG5hdmlnYXRlIGJhY2t3YXJkcyBvbmUg
aXRlbSBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoZWNrIGlm
IGJhY2t3YXJkIG5hdmlnYXRpb24gaXMgcG9zc2libGUuCisgKgorICogQHJldHVybiBAYyBFSU5B
X1RSVUUgaWYgcG9zc2libGUsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUg
ZXdrX3ZpZXdfbmF2aWdhdGVfcG9zc2libGUoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfYmFj
a19wb3NzaWJsZShFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2JhY2tfcG9zc2li
bGUoc2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIENoZWNrIGlmIGl0IGlzIHBvc3NpYmxl
IHRvIG5hdmlnYXRlIGZvcndhcmRzIG9uZSBpdGVtIGluIGhpc3RvcnkuCisgKgorICogQHBhcmFt
IG8gdmlldyBvYmplY3QgdG8gY2hlY2sgaWYgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHBvc3NpYmxl
LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIHBvc3NpYmxlLCBAYyBFSU5BX0ZBTFNF
IG90aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a192aWV3X25hdmlnYXRlX3Bvc3NpYmxlKCkKKyAq
LworRWluYV9Cb29sIGV3a192aWV3X2ZvcndhcmRfcG9zc2libGUoRXZhc19PYmplY3QqIG8pCit7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAg
cmV0dXJuIGV3a19mcmFtZV9mb3J3YXJkX3Bvc3NpYmxlKHNkLT5tYWluX2ZyYW1lKTsKK30KKwor
LyoqCisgKiBDaGVjayBpZiBpdCBpcyBwb3NzaWJsZSB0byBuYXZpZ2F0ZSBnaXZlbiBAYSBzdGVw
cyBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIG5hdmlnYXRlLgor
ICogQHBhcmFtIHN0ZXBzIGlmIHBvc2l0aXZlIG5hdmlnYXRlcyB0aGF0IGFtb3VudCBmb3J3YXJk
cywgaWYgbmVnYXRpdmUKKyAqICAgICAgICBkb2VzIGJhY2t3YXJkcy4KKyAqCisgKiBAcmV0dXJu
IEBjIEVJTkFfVFJVRSBpZiBwb3NzaWJsZSwgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8K
K0VpbmFfQm9vbCBld2tfdmlld19uYXZpZ2F0ZV9wb3NzaWJsZShFdmFzX09iamVjdCogbywgaW50
IHN0ZXBzKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFM
U0UpOworICAgIHJldHVybiBld2tfZnJhbWVfbmF2aWdhdGVfcG9zc2libGUoc2QtPm1haW5fZnJh
bWUsIHN0ZXBzKTsKK30KKworLyoqCisgKiBDaGVjayBpZiBuYXZpZ2F0aW9uIGhpc3RvcnkgKGJh
Y2stZm9yd2FyZCBsaXN0cykgaXMgZW5hYmxlZC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVj
dCB0byBjaGVjayBpZiBuYXZpZ2F0aW9uIGhpc3RvcnkgaXMgZW5hYmxlZC4KKyAqCisgKiBAcmV0
dXJuIEBjIEVJTkFfVFJVRSBpZiB2aWV3IGtlZXBzIGhpc3RvcnksIEBjIEVJTkFfRkFMU0Ugb3Ro
ZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpLT5l
bmFibGVkKCk7Cit9CisKKy8qKgorICogU2V0cyBpZiBuYXZpZ2F0aW9uIGhpc3RvcnkgKGJhY2st
Zm9yd2FyZCBsaXN0cykgaXMgZW5hYmxlZC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0
byBzZXQgaWYgbmF2aWdhdGlvbiBoaXN0b3J5IGlzIGVuYWJsZWQuCisgKiBAcGFyYW0gZW5hYmxl
IEBjIEVJTkFfVFJVRSBpZiB3ZSB3YW50IHRvIGVuYWJsZSBuYXZpZ2F0aW9uIGhpc3Rvcnk7Cisg
KiBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBv
biBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192
aWV3X2hpc3RvcnlfZW5hYmxlX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkK
K3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAg
ICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAg
IHByaXYtPnBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpLT5zZXRFbmFibGVkKGVuYWJsZSk7CisgICAg
cmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBoaXN0b3J5IChiYWNrLWZv
cndhcmQgbGlzdCkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldy4KKyAqCisgKiBAcGFyYW0gbyB2
aWV3IG9iamVjdCB0byBnZXQgbmF2aWdhdGlvbiBoaXN0b3J5IGZyb20uCisgKgorICogQHJldHVy
biByZXR1cm5zIHRoZSBoaXN0b3J5IGluc3RhbmNlIGhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhp
cworICogICAgICAgICB2aWV3IG9yIEBjIE5VTEwgb24gZXJyb3JzIChpbmNsdWRpbmcgd2hlbiBo
aXN0b3J5IGlzIG5vdAorICogICAgICAgICBlbmFibGVkIHdpdGggZXdrX3ZpZXdfaGlzdG9yeV9l
bmFibGVfc2V0KCkpLiBUaGlzIGluc3RhbmNlCisgKiAgICAgICAgIGlzIHVuaXF1ZSBmb3IgdGhp
cyB2aWV3IGFuZCB0aHVzIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMKKyAqICAgICAgICAgZnVuY3Rp
b24gd2l0aCB0aGUgc2FtZSB2aWV3IGFzIHBhcmFtZXRlciByZXR1cm5zIHRoZSBzYW1lCisgKiAg
ICAgICAgIGhhbmRsZS4gVGhpcyBoYW5kbGUgaXMgYWxpdmUgd2hpbGUgdmlldyBpcyBhbGl2ZSwg
dGh1cyBvbmUKKyAqICAgICAgICAgbWlnaHQgd2FudCB0byBsaXN0ZW4gZm9yIEVWQVNfQ0FMTEJB
Q0tfREVMIG9uIGdpdmVuIHZpZXcKKyAqICAgICAgICAgKEBhIG8pIHRvIGtub3cgd2hlbiB0byBz
dG9wIHVzaW5nIHJldHVybmVkIGhhbmRsZS4KKyAqCisgKiBAc2VlIGV3a192aWV3X2hpc3Rvcnlf
ZW5hYmxlX3NldCgpCisgKi8KK0V3a19IaXN0b3J5KiBld2tfdmlld19oaXN0b3J5X2dldChjb25z
dCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAg
IGlmICghcHJpdi0+cGFnZS0+YmFja0ZvcndhcmRMaXN0KCktPmVuYWJsZWQoKSkgeworICAgICAg
ICBFUlIoImFza2VkIGhpc3RvcnksIGJ1dCBpdCdzIGRpc2FibGVkISBSZXR1cm5pbmcgTlVMTCEi
KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBwcml2LT5oaXN0b3J5Owor
fQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIG1haW4gZnJhbWUuCisg
KgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gcXVlcnkgem9vbSBsZXZlbC4KKyAqCisgKiBA
cmV0dXJuIGN1cnJlbnQgem9vbSBsZXZlbCBpbiB1c2Ugb3IgLTEuMCBvbiBlcnJvci4KKyAqLwor
ZmxvYXQgZXdrX3ZpZXdfem9vbV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgLTEuMCk7CisgICAgcmV0dXJuIGV3a19mcmFt
ZV96b29tX2dldChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBjdXJyZW50
IHpvb20gbGV2ZWwgb2YgbWFpbiBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0
byBzZXQgem9vbSBsZXZlbC4KKyAqIEBwYXJhbSB6b29tIG5ldyBsZXZlbCB0byB1c2UuCisgKiBA
cGFyYW0gY3ggeCBvZiBjZW50ZXIgY29vcmRpbmF0ZQorICogQHBhcmFtIGN5IHkgb2YgY2VudGVy
IGNvb3JkaW5hdGUKKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBF
SU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fc2V0KEV2
YXNfT2JqZWN0KiBvLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZBTFNFKTsKKyAg
ICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV9zZXQsIEVJTkFf
RkFMU0UpOworICAgIGlmICh6b29tIDwgWk9PTV9NSU4pIHsKKyAgICAgICAgV1JOKCJ6b29tIGxl
dmVsIGlzIDwgJWYgOiAlZiIsIChkb3VibGUpWk9PTV9NSU4sIChkb3VibGUpem9vbSk7CisgICAg
ICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0KKyAgICBpZiAoem9vbSA+IFpPT01fTUFYKSB7
CisgICAgICAgIFdSTigiem9vbSBsZXZlbCBpcyA+ICVmIDogJWYiLCAoZG91YmxlKVpPT01fTUFY
LCAoZG91YmxlKXpvb20pOworICAgICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKyAgICB9CisKKyAg
ICBpZiAoY3ggPj0gc2QtPnZpZXcudykKKyAgICAgICAgY3ggPSBzZC0+dmlldy53IC0gMTsKKyAg
ICBpZiAoY3kgPj0gc2QtPnZpZXcuaCkKKyAgICAgICAgY3kgPSBzZC0+dmlldy5oIC0gMTsKKyAg
ICBpZiAoY3ggPCAwKQorICAgICAgICBjeCA9IDA7CisgICAgaWYgKGN5IDwgMCkKKyAgICAgICAg
Y3kgPSAwOworICAgIF9ld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfc3RvcChzZCk7CisgICAg
cmV0dXJuIHNkLT5hcGktPnpvb21fc2V0KHNkLCB6b29tLCBjeCwgY3kpOworfQorCitFaW5hX0Jv
b2wgZXdrX3ZpZXdfem9vbV93ZWFrX3Ntb290aF9zY2FsZV9nZXQoY29uc3QgRXZhc19PYmplY3Qq
IG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7
CisgICAgcmV0dXJuIHNkLT56b29tX3dlYWtfc21vb3RoX3NjYWxlOworfQorCit2b2lkIGV3a192
aWV3X3pvb21fd2Vha19zbW9vdGhfc2NhbGVfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wg
c21vb3RoX3NjYWxlKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOwor
ICAgIHNtb290aF9zY2FsZSA9ICEhc21vb3RoX3NjYWxlOworICAgIGlmIChzZC0+em9vbV93ZWFr
X3Ntb290aF9zY2FsZSA9PSBzbW9vdGhfc2NhbGUpCisgICAgICAgIHJldHVybjsKKyAgICBzZC0+
em9vbV93ZWFrX3Ntb290aF9zY2FsZSA9IHNtb290aF9zY2FsZTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihz
ZC0+YXBpLT56b29tX3dlYWtfc21vb3RoX3NjYWxlX3NldCk7CisgICAgc2QtPmFwaS0+em9vbV93
ZWFrX3Ntb290aF9zY2FsZV9zZXQoc2QsIHNtb290aF9zY2FsZSk7Cit9CisKKy8qKgorICogU2V0
IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwgb2YgYmFja2luZyBzdG9yZSwgY2VudGVyZWQgYXQgZ2l2
ZW4gcG9pbnQuCisgKgorICogVW5saWtlIGV3a192aWV3X3pvb21fc2V0KCksIHRoaXMgY2FsbCBk
byBub3QgYXNrIFdlYktpdCB0byByZW5kZXIKKyAqIGF0IG5ldyBzaXplLCBidXQgc2NhbGUgd2hh
dCBpcyBhbHJlYWR5IHJlbmRlcmVkLCBiZWluZyBtdWNoIGZhc3RlcgorICogYnV0IHdvcnNlIHF1
YWxpdHkuCisgKgorICogT2Z0ZW4gb25lIHNob3VsZCB1c2UgZXdrX3ZpZXdfem9vbV9hbmltYXRl
ZF9zZXQoKSwgaXQgd2lsbCBjYWxsIHRoZQorICogc2FtZSBtYWNoaW5lcnkgaW50ZXJuYWxseS4K
KyAqCisgKiBAbm90ZSB0aGlzIHdpbGwgc2V0IHZhcmlhYmxlcyB1c2VkIGJ5IGV3a192aWV3X3pv
b21fYW5pbWF0ZWRfc2V0KCkKKyAqICAgICAgIHNvIHN1Yi1jbGFzc2VzIHdpbGwgbm90IHJlc2V0
IGludGVybmFsIHN0YXRlIG9uIHRoZWlyCisgKiAgICAgICAiY2FsY3VsYXRlIiBwaGFzZS4gVG8g
dW5zZXQgdGhvc2UgYW5kIGVuYWJsZSBzdWItY2xhc3NlcyB0bworICogICAgICAgcmVzZXQgdGhl
aXIgaW50ZXJuYWwgc3RhdGUsIGNhbGwKKyAqICAgICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRf
bWFya19zdG9wKCkuIE5hbWVseSwgdGhpcyBjYWxsIHdpbGwKKyAqICAgICAgIHNldCBld2tfdmll
d196b29tX2FuaW1hdGVkX21hcmtfc3RhcnQoKSB0byBhY3R1YWwgd2Via2l0IHpvb20KKyAqICAg
ICAgIGxldmVsLCBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKCkgYW5kCisgKiAgICAg
ICBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfY3VycmVudCgpIHRvIGdpdmVuIHpvb20gbGV2
ZWwuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gc2V0IHdlYWsgem9vbSBsZXZlbC4K
KyAqIEBwYXJhbSB6b29tIGxldmVsIHRvIHNjYWxlIGJhY2tpbmcgc3RvcmUuCisgKiBAcGFyYW0g
Y3ggaG9yaXpvbnRhbCBjZW50ZXIgb2Zmc2V0LCByZWxhdGl2ZSB0byBvYmplY3QgKHcvMiBpcyBt
aWRkbGUpLgorICogQHBhcmFtIGN5IHZlcnRpY2FsIGNlbnRlciBvZmZzZXQsIHJlbGF0aXZlIHRv
IG9iamVjdCAoaC8yIGlzIG1pZGRsZSkuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24g
c3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmll
d196b29tX3dlYWtfc2V0KEV2YXNfT2JqZWN0KiBvLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4
LCBFdmFzX0Nvb3JkIGN5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChzZC0+YXBp
LCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoc2QtPmFw
aS0+em9vbV93ZWFrX3NldCwgRUlOQV9GQUxTRSk7CisgICAgaWYgKHpvb20gPCBaT09NX01JTikg
eworICAgICAgICBXUk4oInpvb20gbGV2ZWwgaXMgPCAlZiA6ICVmIiwgKGRvdWJsZSlaT09NX01J
TiwgKGRvdWJsZSl6b29tKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorICAg
IGlmICh6b29tID4gWk9PTV9NQVgpIHsKKyAgICAgICAgV1JOKCJ6b29tIGxldmVsIGlzID4gJWYg
OiAlZiIsIChkb3VibGUpWk9PTV9NQVgsIChkb3VibGUpem9vbSk7CisgICAgICAgIHJldHVybiBF
SU5BX0ZBTFNFOworICAgIH0KKworICAgIGlmIChjeCA+PSBzZC0+dmlldy53KQorICAgICAgICBj
eCA9IHNkLT52aWV3LncgLSAxOworICAgIGlmIChjeSA+PSBzZC0+dmlldy5oKQorICAgICAgICBj
eSA9IHNkLT52aWV3LmggLSAxOworICAgIGlmIChjeCA8IDApCisgICAgICAgIGN4ID0gMDsKKyAg
ICBpZiAoY3kgPCAwKQorICAgICAgICBjeSA9IDA7CisKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56
b29tLnN0YXJ0ID0gZXdrX2ZyYW1lX3pvb21fZ2V0KHNkLT5tYWluX2ZyYW1lKTsKKyAgICBzZC0+
YW5pbWF0ZWRfem9vbS56b29tLmVuZCA9IHpvb207CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9v
bS5jdXJyZW50ID0gem9vbTsKKyAgICByZXR1cm4gc2QtPmFwaS0+em9vbV93ZWFrX3NldChzZCwg
em9vbSwgY3gsIGN5KTsKK30KKworLyoqCisgKiBNYXJrIGludGVybmFsIHpvb20gYW5pbWF0aW9u
IHN0YXRlIHRvIGdpdmVuIHpvb20uCisgKgorICogVGhpcyBkb2VzIG5vdCBtb2RpZnkgYW55IGFj
dHVhbCB6b29tIGluIFdlYktpdCBvciBiYWNraW5nIHN0b3JlLAorICoganVzdCBzZXQgdGhlIEV3
a19WaWV3X1NtYXJ0X0RhdGEtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCBzbworICogc3ViLWNs
YXNzZXMgd2lsbCBrbm93IHRoZXkgc2hvdWxkIG5vdCByZXNldCB0aGVpciBpbnRlcm5hbCBzdGF0
ZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGFuZ2UgdmFsdWUuCisgKiBAcGFy
YW0gem9vbSBuZXcgc3RhcnQgdmFsdWUuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24g
c3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfdmlld196
b29tX2FuaW1hdGVkX3NldCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fd2Vha19zZXQoKQorICog
QHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfc3RvcCgpCisgKiBAc2VlIGV3a192aWV3
X3pvb21fYW5pbWF0ZWRfbWFya19lbmQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVk
X21hcmtfY3VycmVudCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX2FuaW1hdGVkX21h
cmtfc3RhcnQoRXZhc19PYmplY3QqIG8sIGZsb2F0IHpvb20pCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgc2QtPmFuaW1hdGVkX3pvb20u
em9vbS5zdGFydCA9IHpvb207CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBN
YXJrIGludGVybmFsIHpvb20gYW5pbWF0aW9uIHN0YXRlIHRvIGdpdmVuIHpvb20uCisgKgorICog
VGhpcyBkb2VzIG5vdCBtb2RpZnkgYW55IGFjdHVhbCB6b29tIGluIFdlYktpdCBvciBiYWNraW5n
IHN0b3JlLAorICoganVzdCBzZXQgdGhlIEV3a19WaWV3X1NtYXJ0X0RhdGEtPmFuaW1hdGVkX3pv
b20uem9vbS5lbmQgc28KKyAqIHN1Yi1jbGFzc2VzIHdpbGwga25vdyB0aGV5IHNob3VsZCBub3Qg
cmVzZXQgdGhlaXIgaW50ZXJuYWwgc3RhdGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3Qg
dG8gY2hhbmdlIHZhbHVlLgorICogQHBhcmFtIHpvb20gbmV3IGVuZCB2YWx1ZS4KKyAqCisgKiBA
cmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4K
KyAqCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfc2V0KCkKKyAqIEBzZWUgZXdrX3Zp
ZXdfem9vbV93ZWFrX3NldCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19z
dG9wKCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0YXJ0KCkKKyAqIEBz
ZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoKQorICovCitFaW5hX0Jvb2wg
ZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2VuZChFdmFzX09iamVjdCogbywgZmxvYXQgem9v
bSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsK
KyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29tLmVuZCA9IHpvb207CisgICAgcmV0dXJuIEVJTkFf
VFJVRTsKK30KKworLyoqCisgKiBNYXJrIGludGVybmFsIHpvb20gYW5pbWF0aW9uIHN0YXRlIHRv
IGdpdmVuIHpvb20uCisgKgorICogVGhpcyBkb2VzIG5vdCBtb2RpZnkgYW55IGFjdHVhbCB6b29t
IGluIFdlYktpdCBvciBiYWNraW5nIHN0b3JlLAorICoganVzdCBzZXQgdGhlIEV3a19WaWV3X1Nt
YXJ0X0RhdGEtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50IHNvCisgKiBzdWItY2xhc3NlcyB3
aWxsIGtub3cgdGhleSBzaG91bGQgbm90IHJlc2V0IHRoZWlyIGludGVybmFsIHN0YXRlLgorICoK
KyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoYW5nZSB2YWx1ZS4KKyAqIEBwYXJhbSB6b29t
IG5ldyBjdXJyZW50IHZhbHVlLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nl
c3MsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9h
bmltYXRlZF9zZXQoKQorICogQHNlZSBld2tfdmlld196b29tX3dlYWtfc2V0KCkKKyAqIEBzZWUg
ZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3AoKQorICogQHNlZSBld2tfdmlld196b29t
X2FuaW1hdGVkX21hcmtfc3RhcnQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21h
cmtfZW5kKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19jdXJy
ZW50KEV2YXNfT2JqZWN0KiBvLCBmbG9hdCB6b29tKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20u
Y3VycmVudCA9IHpvb207CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBVbm1h
cmsgaW50ZXJuYWwgem9vbSBhbmltYXRpb24gc3RhdGUuCisgKgorICogVGhpcyB6ZXJvIGFsbCBz
dGFydCwgZW5kIGFuZCBjdXJyZW50IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVj
dCB0byBtYXJrIGFzIGFuaW1hdGVkIGlzIHN0b3BwZWQuCisgKgorICogQHNlZSBld2tfdmlld196
b29tX2FuaW1hdGVkX21hcmtfc3RhcnQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVk
X21hcmtfZW5kKCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQo
KQorICogQHNlZSBld2tfdmlld196b29tX3dlYWtfc2V0KCkKKyAqLworRWluYV9Cb29sIGV3a192
aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIF9ld2tfdmlld196
b29tX2FuaW1hdGVkX21hcmtfc3RvcChzZCk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKwor
LyoqCisgKiBTZXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCB3aGlsZSBhbmltYXRpbmcuCisgKgor
ICogSWYgdGhlIHZpZXcgd2FzIGFscmVhZHkgYW5pbWF0aW5nIHRvIGFub3RoZXIgem9vbSwgaXQg
d2lsbCBzdGFydAorICogZnJvbSBjdXJyZW50IHBvaW50IHRvIHRoZSBuZXh0IHByb3ZpZGVkIHpv
b20gKEBhIHpvb20gcGFyYW1ldGVyKQorICogYW5kIGR1cmF0aW9uIChAYSBkdXJhdGlvbiBwYXJh
bWV0ZXIpLgorICoKKyAqIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBkbyB0cmFuc2l0
aW9ucyBmcm9tIG9uZSBsZXZlbCB0bworICogYW5vdGhlci4gSG93ZXZlciwgb25lIG1heSB3aXNo
IHRvIGRvIHRob3NlIGZyb20gb3V0c2lkZSwgaW4gdGhhdAorICogY2FzZSB1c2UgZXdrX3ZpZXdf
em9vbV93ZWFrX3NldCgpIGFuZCBsYXRlciBjb250cm9sIGludGVybWVkaWF0ZQorICogc3RhdGVz
IHdpdGggZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoKSwKKyAqIGV3a192aWV3
X3pvb21fYW5pbWF0ZWRfbWFya19lbmQoKSBhbmQKKyAqIGV3a192aWV3X3pvb21fYW5pbWF0ZWRf
bWFya19zdG9wKCkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gYW5pbWF0ZS4KKyAq
IEBwYXJhbSB6b29tIGZpbmFsIHpvb20gbGV2ZWwgdG8gdXNlLgorICogQHBhcmFtIGR1cmF0aW9u
IHRpbWUgaW4gc2Vjb25kcyB0aGUgYW5pbWF0aW9uIHNob3VsZCB0YWtlLgorICogQHBhcmFtIGN4
IG9mZnNldCBpbnNpZGUgb2JqZWN0IHRoYXQgZGVmaW5lcyB6b29tIGNlbnRlci4gMCBpcyBsZWZ0
IHNpZGUuCisgKiBAcGFyYW0gY3kgb2Zmc2V0IGluc2lkZSBvYmplY3QgdGhhdCBkZWZpbmVzIHpv
b20gY2VudGVyLiAwIGlzIHRvcCBzaWRlLgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgYW5p
bWF0aW9uIHdpbGwgYmUgc3RhcnRlZCwgQGMgRUlOQV9GQUxTRSBpZiBub3QKKyAqICAgICAgICAg
ICAgYmVjYXVzZSB6b29tIGlzIHRvbyBzbWFsbC9iaWcuCisgKi8KK0VpbmFfQm9vbCBld2tfdmll
d196b29tX2FuaW1hdGVkX3NldChFdmFzX09iamVjdCogbywgZmxvYXQgem9vbSwgZmxvYXQgZHVy
YXRpb24sIEV2YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpCit7CisgICAgZG91YmxlIG5vdzsK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIEVJ
TkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZBTFNFKTsKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV93ZWFrX3NldCwgRUlO
QV9GQUxTRSk7CisKKyAgICBpZiAoem9vbSA8IFpPT01fTUlOKSB7CisgICAgICAgIFdSTigiem9v
bSBsZXZlbCBpcyA8ICVmIDogJWYiLCAoZG91YmxlKVpPT01fTUlOLCAoZG91YmxlKXpvb20pOwor
ICAgICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKyAgICB9CisgICAgaWYgKHpvb20gPiBaT09NX01B
WCkgeworICAgICAgICBXUk4oInpvb20gbGV2ZWwgaXMgPiAlZiA6ICVmIiwgKGRvdWJsZSlaT09N
X01BWCwgKGRvdWJsZSl6b29tKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQor
CisgICAgaWYgKHByaXYtPmFuaW1hdGVkX3pvb20uYW5pbWF0b3IpCisgICAgICAgIHByaXYtPmFu
aW1hdGVkX3pvb20uem9vbS5zdGFydCA9IF9ld2tfdmlld196b29tX2FuaW1hdGVkX2N1cnJlbnQo
cHJpdik7CisgICAgZWxzZSB7CisgICAgICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFy
dCA9IGV3a19mcmFtZV96b29tX2dldChzZC0+bWFpbl9mcmFtZSk7CisgICAgICAgIF9ld2tfdmll
d196b29tX2FuaW1hdGlvbl9zdGFydChzZCk7CisgICAgfQorCisgICAgaWYgKGN4IDwgMCkKKyAg
ICAgICAgY3ggPSAwOworICAgIGlmIChjeSA8IDApCisgICAgICAgIGN5ID0gMDsKKworICAgIG5v
dyA9IGVjb3JlX2xvb3BfdGltZV9nZXQoKTsKKyAgICBwcml2LT5hbmltYXRlZF96b29tLnRpbWUu
c3RhcnQgPSBub3c7CisgICAgcHJpdi0+YW5pbWF0ZWRfem9vbS50aW1lLmVuZCA9IG5vdyArIGR1
cmF0aW9uOworICAgIHByaXYtPmFuaW1hdGVkX3pvb20udGltZS5kdXJhdGlvbiA9IGR1cmF0aW9u
OworICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5lbmQgPSB6b29tOworICAgIHByaXYtPmFu
aW1hdGVkX3pvb20uem9vbS5yYW5nZSA9IChwcml2LT5hbmltYXRlZF96b29tLnpvb20uZW5kIC0g
cHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0KTsKKyAgICBwcml2LT5hbmltYXRlZF96b29t
LmNlbnRlci54ID0gY3g7CisgICAgcHJpdi0+YW5pbWF0ZWRfem9vbS5jZW50ZXIueSA9IGN5Owor
ICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uY3VycmVudCA9IHByaXYtPmFuaW1hdGVkX3pvb20u
em9vbS5zdGFydDsKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0gcHJpdi0+YW5p
bWF0ZWRfem9vbS56b29tLnN0YXJ0OworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uZW5kID0g
cHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLmVuZDsKKworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9
CisKKy8qKgorICogUXVlcnkgaWYgem9vbSBsZXZlbCBqdXN0IGFwcGxpZXMgdG8gdGV4dCBhbmQg
bm90IG90aGVyIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgdG8gcXVlcnkgc2V0dGlu
Zy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBqdXN0IHRleHQgYXJlIHNjYWxlZCwg
QGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX3Rl
eHRfb25seV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV96b29t
X3RleHRfb25seV9nZXQoc2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIFNldCBpZiB6b29t
IGxldmVsIGp1c3QgYXBwbGllcyB0byB0ZXh0IGFuZCBub3Qgb3RoZXIgZWxlbWVudHMuCisgKgor
ICogQHBhcmFtIG8gdmlldyB0byBjaGFuZ2Ugc2V0dGluZy4KKyAqIEBwYXJhbSBzZXR0aW5nIEBj
IEVJTkFfVFJVRSBpZiB6b29tIHNob3VsZCBqdXN0IGJlIGFwcGxpZWQgdG8gdGV4dC4KKyAqCisg
KiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lz
ZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fdGV4dF9vbmx5X3NldChFdmFzX09iamVj
dCogbywgRWluYV9Cb29sIHNldHRpbmcpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV96b29tX3RleHRfb25s
eV9zZXQoc2QtPm1haW5fZnJhbWUsIHNldHRpbmcpOworfQorCisvKioKKyAqIEhpbnQgZW5naW5l
IHRvIHByZS1yZW5kZXIgcmVnaW9uLgorICoKKyAqIEVuZ2luZXMgYW5kIGJhY2tpbmcgc3RvcmUg
bWlnaHQgYmUgYWJsZSB0byBwcmUtcmVuZGVyIHJlZ2lvbnMgaW4KKyAqIG9yZGVyIHRvIHNwZWVk
IHVwIHpvb21pbmcgb3Igc2Nyb2xsaW5nIHRvIHRoYXQgcmVnaW9uLiBOb3QgYWxsCisgKiBlbmdp
bmVzIG1pZ2h0IGltcGxlbWVudCB0aGF0IGFuZCB0aGV5IHdpbGwgcmV0dXJuIEBjIEVJTkFfRkFM
U0UKKyAqIGluIHRoYXQgY2FzZS4KKyAqCisgKiBUaGUgZ2l2ZW4gcmVnaW9uIGlzIGEgaGludC4g
RW5naW5lcyBtaWdodCBkbyBiaWdnZXIgb3Igc21hbGxlciBhcmVhCisgKiB0aGF0IGNvdmVycyB0
aGF0IHJlZ2lvbi4gUHJlLXJlbmRlciBtaWdodCBub3QgYmUgaW1tZWRpYXRlLCBpdCBtYXkKKyAq
IGJlIHBvc3Rwb25lZCB0byBhIHRocmVhZCwgb3BlcmF0ZWQgY29vcGVyYXRpdmVseSBpbiB0aGUg
bWFpbiBsb29wCisgKiBhbmQgbWF5IGJlIGV2ZW4gaWdub3JlZCBvciBjYW5jZWxsZWQgYWZ0ZXJ3
YXJkcy4KKyAqCisgKiBNdWx0aXBsZSByZXF1ZXN0cyBtaWdodCBiZSBxdWV1ZWQgYnkgZW5naW5l
cy4gT25lIGNhbiBjbGVhci9mb3JnZXQKKyAqIGFib3V0IHRoZW0gd2l0aCBld2tfdmlld19wcmVf
cmVuZGVyX2NhbmNlbCgpLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgdG8gYXNrIHByZS1yZW5kZXIg
b2YgZ2l2ZW4gcmVnaW9uLgorICogQHBhcmFtIHggYWJzb2x1dGUgY29vcmRpbmF0ZSAoMD1sZWZ0
KSB0byBwcmUtcmVuZGVyIGF0IHpvb20uCisgKiBAcGFyYW0geSBhYnNvbHV0ZSBjb29yZGluYXRl
ICgwPXRvcCkgdG8gcHJlLXJlbmRlciBhdCB6b29tLgorICogQHBhcmFtIHcgd2lkdGggdG8gcHJl
LXJlbmRlciBzdGFydGluZyBmcm9tIEBhIHggYXQgem9vbS4KKyAqIEBwYXJhbSBoIGhlaWdodCB0
byBwcmUtcmVuZGVyIHN0YXJ0aW5nIGZyb20gQGEgeSBhdCB6b29tLgorICogQHBhcmFtIHpvb20g
ZGVzaXJlZCB6b29tLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIHJlcXVlc3Qgd2Fz
IGFjY2VwdGVkLCBAYyBFSU5BX0ZBTFNFCisgKiAgICAgICAgIG90aGVyd2lzZSAoZXJyb3JzLCBw
cmUtcmVuZGVyIG5vdCBzdXBwb3J0ZWQsIGV0YykuCisgKgorICogQHNlZSBld2tfdmlld19wcmVf
cmVuZGVyX2NhbmNlbCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19wcmVfcmVuZGVyX3JlZ2lv
bihFdmFzX09iamVjdCogbywgRXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQg
dywgRXZhc19Db29yZCBoLCBmbG9hdCB6b29tKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9S
RVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJO
X1ZBTChzZC0+YXBpLT5wcmVfcmVuZGVyX3JlZ2lvbiwgRUlOQV9GQUxTRSk7CisgICAgZmxvYXQg
Y3VyX3pvb20gPSBld2tfZnJhbWVfem9vbV9nZXQoc2QtPm1haW5fZnJhbWUpOworICAgIEV2YXNf
Q29vcmQgY3csIGNoOworCisgICAgaWYgKGN1cl96b29tIDwgMC4wMDAwMSkKKyAgICAgICAgcmV0
dXJuIEVJTkFfRkFMU0U7CisgICAgaWYgKCFld2tfZnJhbWVfY29udGVudHNfc2l6ZV9nZXQoc2Qt
Pm1haW5fZnJhbWUsICZjdywgJmNoKSkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAg
ICBjdyAqPSB6b29tIC8gY3VyX3pvb207CisgICAgY2ggKj0gem9vbSAvIGN1cl96b29tOworICAg
IERCRygicmVnaW9uICVkLCVkKyVkeCVkIEAgJWYgY29udGVudHM9JWR4JWQiLCB4LCB5LCB3LCBo
LCB6b29tLCBjdywgY2gpOworCisgICAgaWYgKHggKyB3ID4gY3cpCisgICAgICAgIHcgPSBjdyAt
IHg7CisKKyAgICBpZiAoeSArIGggPiBjaCkKKyAgICAgICAgaCA9IGNoIC0geTsKKworICAgIGlm
ICh4IDwgMCkgeworICAgICAgICB3ICs9IHg7CisgICAgICAgIHggPSAwOworICAgIH0KKyAgICBp
ZiAoeSA8IDApIHsKKyAgICAgICAgaCArPSB5OworICAgICAgICB5ID0gMDsKKyAgICB9CisKKyAg
ICByZXR1cm4gc2QtPmFwaS0+cHJlX3JlbmRlcl9yZWdpb24oc2QsIHgsIHksIHcsIGgsIHpvb20p
OworfQorCisvKioKKyAqIENhbmNlbCAoY2xlYXIpIHByZXZpb3VzIHByZS1yZW5kZXIgcmVxdWVz
dHMuCisgKgorICogQHBhcmFtIG8gdmlldyB0byBjbGVhciBwcmUtcmVuZGVyIHJlcXVlc3RzLgor
ICovCit2b2lkIGV3a192aWV3X3ByZV9yZW5kZXJfY2FuY2VsKEV2YXNfT2JqZWN0KiBvKQorewor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FGRVRZX09O
X05VTExfUkVUVVJOKHNkLT5hcGktPnByZV9yZW5kZXJfY2FuY2VsKTsKKyAgICBzZC0+YXBpLT5w
cmVfcmVuZGVyX2NhbmNlbChzZCk7Cit9CisKK2NvbnN0IGNoYXIqIGV3a192aWV3X3NldHRpbmdf
dXNlcl9hZ2VudF9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MudXNlcl9hZ2VudDsKK30K
KworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfdXNlcl9hZ2VudF9zZXQoRXZhc19PYmplY3Qq
IG8sIGNvbnN0IGNoYXIqIHVzZXJfYWdlbnQpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNl
KCZwcml2LT5zZXR0aW5ncy51c2VyX2FnZW50LCB1c2VyX2FnZW50KSkgeworICAgICAgICBXZWJD
b3JlOjpGcmFtZUxvYWRlckNsaWVudEVmbCogY2xpZW50ID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6
RnJhbWVMb2FkZXJDbGllbnRFZmwqPihwcml2LT5tYWluX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50
KCkpOworICAgICAgICBjbGllbnQtPnNldEN1c3RvbVVzZXJBZ2VudChXZWJDb3JlOjpTdHJpbmc6
OmZyb21VVEY4KHVzZXJfYWdlbnQpKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30K
KworY29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ191c2VyX3N0eWxlc2hlZXRfZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAg
cmV0dXJuIHByaXYtPnNldHRpbmdzLnVzZXJfc3R5bGVzaGVldDsKK30KKworRWluYV9Cb29sIGV3
a192aWV3X3NldHRpbmdfdXNlcl9zdHlsZXNoZWV0X3NldChFdmFzX09iamVjdCogbywgY29uc3Qg
Y2hhciogdXJpKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFf
RkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9G
QUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3Mu
dXNlcl9zdHlsZXNoZWV0LCB1cmkpKSB7CisgICAgICAgIFdlYkNvcmU6OktVUkwga3VybChXZWJD
b3JlOjpLVVJMKCksIFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgodXJpKSk7CisgICAgICAgIHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24oa3VybCk7CisgICAg
fQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5n
X2F1dG9fbG9hZF9pbWFnZXNfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BS
SVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYt
PnNldHRpbmdzLmF1dG9fbG9hZF9pbWFnZXM7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0
aW5nX2F1dG9fbG9hZF9pbWFnZXNfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgYXV0b21h
dGljKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7
CisgICAgYXV0b21hdGljID0gISFhdXRvbWF0aWM7CisgICAgaWYgKHByaXYtPnNldHRpbmdzLmF1
dG9fbG9hZF9pbWFnZXMgIT0gYXV0b21hdGljKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGlu
Z3MtPnNldExvYWRzSW1hZ2VzQXV0b21hdGljYWxseShhdXRvbWF0aWMpOworICAgICAgICBwcml2
LT5zZXR0aW5ncy5hdXRvX2xvYWRfaW1hZ2VzID0gYXV0b21hdGljOworICAgIH0KKyAgICByZXR1
cm4gRUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19hdXRvX3Nocmlu
a19pbWFnZXNfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09S
X1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdz
LmF1dG9fc2hyaW5rX2ltYWdlczsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfYXV0
b19zaHJpbmtfaW1hZ2VzX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGF1dG9tYXRpYykK
K3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAg
ICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAg
IGF1dG9tYXRpYyA9ICEhYXV0b21hdGljOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5hdXRvX3No
cmlua19pbWFnZXMgIT0gYXV0b21hdGljKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3Mt
PnNldFNocmlua3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQoYXV0b21hdGljKTsKKyAgICAgICAgcHJp
di0+c2V0dGluZ3MuYXV0b19zaHJpbmtfaW1hZ2VzID0gYXV0b21hdGljOworICAgIH0KKyAgICBy
ZXR1cm4gRUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVf
c2NyaXB0c19nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3Mu
ZW5hYmxlX3NjcmlwdHM7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9z
Y3JpcHRzX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBFV0tf
VklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGVuYWJsZSA9ICEh
ZW5hYmxlOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5lbmFibGVfc2NyaXB0cyAhPSBlbmFibGUp
IHsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0SmF2YVNjcmlwdEVuYWJsZWQoZW5h
YmxlKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuZW5hYmxlX3NjcmlwdHMgPSBlbmFibGU7Cisg
ICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0
aW5nX2VuYWJsZV9wbHVnaW5zX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tf
VklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBwcml2
LT5zZXR0aW5ncy5lbmFibGVfcGx1Z2luczsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRp
bmdfZW5hYmxlX3BsdWdpbnNfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgZW5hYmxlKQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAg
IEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAg
ZW5hYmxlID0gISFlbmFibGU7CisgICAgaWYgKHByaXYtPnNldHRpbmdzLmVuYWJsZV9wbHVnaW5z
ICE9IGVuYWJsZSkgeworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRQbHVnaW5zRW5h
YmxlZChlbmFibGUpOworICAgICAgICBwcml2LT5zZXR0aW5ncy5lbmFibGVfcGx1Z2lucyA9IGVu
YWJsZTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworRWluYV9Cb29sIGV3a192
aWV3X3NldHRpbmdfc2NyaXB0c193aW5kb3dfb3Blbl9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8p
Cit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7Cisg
ICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAg
ICByZXR1cm4gcHJpdi0+c2V0dGluZ3Muc2NyaXB0c193aW5kb3dfb3BlbjsKK30KKworRWluYV9C
b29sIGV3a192aWV3X3NldHRpbmdfc2NyaXB0c193aW5kb3dfb3Blbl9zZXQoRXZhc19PYmplY3Qq
IG8sIEVpbmFfQm9vbCBhbGxvdykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8s
IHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIEVJTkFfRkFMU0UpOworICAgIGFsbG93ID0gISFhbGxvdzsKKyAgICBpZiAocHJpdi0+c2V0
dGluZ3Muc2NyaXB0c193aW5kb3dfb3BlbiAhPSBhbGxvdykgeworICAgICAgICBwcml2LT5wYWdl
X3NldHRpbmdzLT5zZXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KGFsbG93
KTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3Muc2NyaXB0c193aW5kb3dfb3BlbiA9IGFsbG93Owor
ICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0
dGluZ19yZXNpemFibGVfdGV4dGFyZWFzX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAg
ICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tf
VklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVy
biBwcml2LT5zZXR0aW5ncy5yZXNpemFibGVfdGV4dGFyZWFzOworfQorCitFaW5hX0Jvb2wgZXdr
X3ZpZXdfc2V0dGluZ19yZXNpemFibGVfdGV4dGFyZWFzX3NldChFdmFzX09iamVjdCogbywgRWlu
YV9Cb29sIGVuYWJsZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBF
SU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJ
TkFfRkFMU0UpOworICAgIGVuYWJsZSA9ICEhZW5hYmxlOworICAgIGlmIChwcml2LT5zZXR0aW5n
cy5yZXNpemFibGVfdGV4dGFyZWFzICE9IGVuYWJsZSkgeworICAgICAgICBwcml2LT5wYWdlX3Nl
dHRpbmdzLT5zZXRUZXh0QXJlYXNBcmVSZXNpemFibGUoZW5hYmxlKTsKKyAgICAgICAgcHJpdi0+
c2V0dGluZ3MucmVzaXphYmxlX3RleHRhcmVhcyA9IGVuYWJsZTsKKyAgICB9CisgICAgcmV0dXJu
IEVJTkFfVFJVRTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfcHJpdmF0ZV9icm93
c2luZ19nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVU
VVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MucHJp
dmF0ZV9icm93c2luZzsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfcHJpdmF0ZV9i
cm93c2luZ19zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCBlbmFibGUpCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBlbmFibGUgPSAh
IWVuYWJsZTsKKyAgICBpZiAocHJpdi0+c2V0dGluZ3MucHJpdmF0ZV9icm93c2luZyAhPSBlbmFi
bGUpIHsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0UHJpdmF0ZUJyb3dzaW5nRW5h
YmxlZChlbmFibGUpOworICAgICAgICBwcml2LT5zZXR0aW5ncy5wcml2YXRlX2Jyb3dzaW5nID0g
ZW5hYmxlOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdr
X3ZpZXdfc2V0dGluZ19jYXJldF9icm93c2luZ19nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAg
RVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBy
ZXR1cm4gcHJpdi0+c2V0dGluZ3MuY2FyZXRfYnJvd3Npbmc7Cit9CisKK0VpbmFfQm9vbCBld2tf
dmlld19zZXR0aW5nX2NhcmV0X2Jyb3dzaW5nX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29s
IGVuYWJsZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZB
TFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFM
U0UpOworICAgIGVuYWJsZSA9ICEhZW5hYmxlOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5jYXJl
dF9icm93c2luZyAhPSBlbmFibGUpIHsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0
Q2FyZXRCcm93c2luZ0VuYWJsZWQoZW5hYmxlKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuY2Fy
ZXRfYnJvd3NpbmcgPSBlbmFibGU7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisK
K2NvbnN0IGNoYXIqIGV3a192aWV3X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVsdF9nZXQoY29uc3Qg
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
MCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICBy
ZXR1cm4gcHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfZGVmYXVsdDsKK30KKworRWluYV9Cb29sIGV3
a192aWV3X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVsdF9zZXQoRXZhc19PYmplY3QqIG8sIGNvbnN0
IGNoYXIqIGVuY29kaW5nKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0
dGluZ3MuZW5jb2RpbmdfZGVmYXVsdCwgZW5jb2RpbmcpKQorICAgICAgICBwcml2LT5wYWdlX3Nl
dHRpbmdzLT5zZXREZWZhdWx0VGV4dEVuY29kaW5nTmFtZShXZWJDb3JlOjpTdHJpbmc6OmZyb21V
VEY4KGVuY29kaW5nKSk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworaW50IGV3a192aWV3
X3NldHRpbmdfZm9udF9taW5pbXVtX3NpemVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQorewor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BS
SVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdz
LmZvbnRfbWluaW11bV9zaXplOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250
X21pbmltdW1fc2l6ZV9zZXQoRXZhc19PYmplY3QqIG8sIGludCBzaXplKQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BS
SVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKHByaXYtPnNl
dHRpbmdzLmZvbnRfbWluaW11bV9zaXplICE9IHNpemUpIHsKKyAgICAgICAgcHJpdi0+cGFnZV9z
ZXR0aW5ncy0+c2V0TWluaW11bUZvbnRTaXplKHNpemUpOworICAgICAgICBwcml2LT5zZXR0aW5n
cy5mb250X21pbmltdW1fc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7
Cit9CisKK2ludCBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9sb2dpY2FsX3NpemVfZ2V0
KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7
CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmZvbnRfbWluaW11bV9sb2dpY2FsX3NpemU7Cit9
CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9sb2dpY2FsX3NpemVf
c2V0KEV2YXNfT2JqZWN0KiBvLCBpbnQgc2l6ZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRV
Uk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5mb250X21p
bmltdW1fbG9naWNhbF9zaXplICE9IHNpemUpIHsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5n
cy0+c2V0TWluaW11bUxvZ2ljYWxGb250U2l6ZShzaXplKTsKKyAgICAgICAgcHJpdi0+c2V0dGlu
Z3MuZm9udF9taW5pbXVtX2xvZ2ljYWxfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBF
SU5BX1RSVUU7Cit9CisKK2ludCBld2tfdmlld19zZXR0aW5nX2ZvbnRfZGVmYXVsdF9zaXplX2dl
dChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJO
KG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDAp
OworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X2RlZmF1bHRfc2l6ZTsKK30KKworRWlu
YV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9kZWZhdWx0X3NpemVfc2V0KEV2YXNfT2JqZWN0
KiBvLCBpbnQgc2l6ZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBF
SU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJ
TkFfRkFMU0UpOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5mb250X2RlZmF1bHRfc2l6ZSAhPSBz
aXplKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldERlZmF1bHRGb250U2l6ZShz
aXplKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9kZWZhdWx0X3NpemUgPSBzaXplOwor
ICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitpbnQgZXdrX3ZpZXdfc2V0dGluZ19m
b250X21vbm9zcGFjZV9zaXplX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tf
VklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9P
Ul9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X21v
bm9zcGFjZV9zaXplOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9z
cGFjZV9zaXplX3NldChFdmFzX09iamVjdCogbywgaW50IHNpemUpCit7CisgICAgRVdLX1ZJRVdf
U0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9H
RVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAocHJpdi0+c2V0dGlu
Z3MuZm9udF9tb25vc3BhY2Vfc2l6ZSAhPSBzaXplKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0
dGluZ3MtPnNldERlZmF1bHRGaXhlZEZvbnRTaXplKHNpemUpOworICAgICAgICBwcml2LT5zZXR0
aW5ncy5mb250X21vbm9zcGFjZV9zaXplID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFf
VFJVRTsKK30KKworY29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ19mb250X3N0YW5kYXJkX2dl
dChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJO
KG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDAp
OworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X3N0YW5kYXJkOworfQorCitFaW5hX0Jv
b2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X3N0YW5kYXJkX3NldChFdmFzX09iamVjdCogbywgY29u
c3QgY2hhciogZmFtaWx5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0
dGluZ3MuZm9udF9zdGFuZGFyZCwgZmFtaWx5KSkgeworICAgICAgICBXZWJDb3JlOjpBdG9taWNT
dHJpbmcgcyA9IFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgoZmFtaWx5KTsKKyAgICAgICAgcHJp
di0+cGFnZV9zZXR0aW5ncy0+c2V0U3RhbmRhcmRGb250RmFtaWx5KHMpOworICAgIH0KKyAgICBy
ZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0aW5nX2ZvbnRf
Y3Vyc2l2ZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9jdXJzaXZlOworfQor
CitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X2N1cnNpdmVfc2V0KEV2YXNfT2JqZWN0
KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZw
cml2LT5zZXR0aW5ncy5mb250X2N1cnNpdmUsIGZhbWlseSkpIHsKKyAgICAgICAgV2ViQ29yZTo6
QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZhbWlseSk7CisgICAg
ICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEN1cnNpdmVGb250RmFtaWx5KHMpOworICAgIH0K
KyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0aW5n
X2ZvbnRfZmFudGFzeV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdf
U0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVU
VVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9mYW50YXN5
OworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfc2V0KEV2YXNf
T2JqZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVU
VVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBs
YWNlKCZwcml2LT5zZXR0aW5ncy5mb250X2ZhbnRhc3ksIGZhbWlseSkpIHsKKyAgICAgICAgV2Vi
Q29yZTo6QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZhbWlseSk7
CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEZhbnRhc3lGb250RmFtaWx5KHMpOwor
ICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19z
ZXR0aW5nX2ZvbnRfbW9ub3NwYWNlX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBF
V0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dF
VF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250
X21vbm9zcGFjZTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3Bh
Y2Vfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJ
Vl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJp
bmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy5mb250X21vbm9zcGFjZSwgZmFtaWx5KSkg
eworICAgICAgICBXZWJDb3JlOjpBdG9taWNTdHJpbmcgcyA9IFdlYkNvcmU6OlN0cmluZzo6ZnJv
bVVURjgoZmFtaWx5KTsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0Rml4ZWRGb250
RmFtaWx5KHMpOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFy
KiBld2tfdmlld19zZXR0aW5nX2ZvbnRfc2VyaWZfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVX
X1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRp
bmdzLmZvbnRfc2VyaWY7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2ZvbnRfc2Vy
aWZfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJ
Vl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJp
bmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy5mb250X3NlcmlmLCBmYW1pbHkpKSB7Cisg
ICAgICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzID0gV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRG
OChmYW1pbHkpOworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRTZXJpZkZvbnRGYW1p
bHkocyk7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK2NvbnN0IGNoYXIqIGV3
a192aWV3X3NldHRpbmdfZm9udF9zYW5zX3NlcmlmX2dldChjb25zdCBFdmFzX09iamVjdCogbykK
K3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklF
V19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0
aW5ncy5mb250X3NhbnNfc2VyaWY7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2Zv
bnRfc2Fuc19zZXJpZl9zZXQoRXZhc19PYmplY3QqIG8sIGNvbnN0IGNoYXIqIGZhbWlseSkKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlm
IChlaW5hX3N0cmluZ3NoYXJlX3JlcGxhY2UoJnByaXYtPnNldHRpbmdzLmZvbnRfc2Fuc19zZXJp
ZiwgZmFtaWx5KSkgeworICAgICAgICBXZWJDb3JlOjpBdG9taWNTdHJpbmcgcyA9IFdlYkNvcmU6
OlN0cmluZzo6ZnJvbVVURjgoZmFtaWx5KTsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+
c2V0U2Fuc1NlcmlmRm9udEZhbWlseShzKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsK
K30KKworLyoqCisgKiBTaW1pbGFyIHRvIGV2YXNfb2JqZWN0X3NtYXJ0X2RhdGFfZ2V0KCksIGJ1
dCBkb2VzIHR5cGUgY2hlY2tpbmcuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gcXVl
cnkgaW50ZXJuYWwgZGF0YS4KKyAqIEByZXR1cm4gaW50ZXJuYWwgZGF0YSBvciBAYyBOVUxMIG9u
IGVycm9ycyAoaWU6IGluY29ycmVjdCB0eXBlIG9mIEBhIG8pLgorICovCitFd2tfVmlld19TbWFy
dF9EYXRhKiBld2tfdmlld19zbWFydF9kYXRhX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICByZXR1cm4gc2Q7
Cit9CisKKy8qKgorICogR2V0cyB0aGUgaW50ZXJuYWwgYXJyYXkgb2YgcmVwYWludCByZXF1ZXN0
cy4KKyAqCisgKiBUaGlzIGFycmF5IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYW55aG93LiBJdCBz
aG91bGQgYmUgcHJvY2Vzc2VkCisgKiBpbW1lZGlhdGVseSBhcyBhbnkgZnVydGhlciBld2tfdmll
dyBjYWxsIG1pZ2h0IGNoYW5nZSBpdCwgbGlrZQorICogdGhvc2UgdGhhdCBhZGQgcmVwYWludHMg
b3IgZmx1c2ggdGhlbSwgc28gYmUgc3VyZSB0aGF0IHlvdXIgY29kZQorICogZG9lcyBub3QgY2Fs
bCBhbnkgb2YgdGhvc2Ugd2hpbGUgeW91IHByb2Nlc3MgdGhlIHJlcGFpbnRzLAorICogb3RoZXJ3
aXNlIGNvcHkgdGhlIGFycmF5LgorICoKKyAqIEBwYXJhbSBwcml2IHByaXZhdGUgaGFuZGxlIHBv
aW50ZXIgb2YgdGhlIHZpZXcgdG8gZ2V0IHJlcGFpbnRzLgorICogQHBhcmFtIGNvdW50IHdoZXJl
IHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHJldHVybmVkIGFycmF5LgorICoK
KyAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIGFycmF5IG9mIHJlcXVlc3RlZCByZXBhaW50cy4KKyAq
CisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNs
YXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3Rv
cmUuCisgKi8KK2NvbnN0IEVpbmFfUmVjdGFuZ2xlKiBld2tfdmlld19yZXBhaW50c19nZXQoY29u
c3QgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBzaXplX3QqIGNvdW50KQoreworICAgIEVJ
TkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChjb3VudCwgMCk7CisgICAgaWYgKGNvdW50KQor
ICAgICAgICAqY291bnQgPSAwOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChw
cml2LCAwKTsKKyAgICBpZiAoY291bnQpCisgICAgICAgICpjb3VudCA9IHByaXYtPnJlcGFpbnRz
LmNvdW50OworICAgIHJldHVybiBwcml2LT5yZXBhaW50cy5hcnJheTsKK30KKworLyoqCisgKiBH
ZXRzIHRoZSBpbnRlcm5hbCBhcnJheSBvZiBzY3JvbGwgcmVxdWVzdHMuCisgKgorICogVGhpcyBh
cnJheSBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGFueWhvdy4gSXQgc2hvdWxkIGJlIHByb2Nlc3Nl
ZAorICogaW1tZWRpYXRlbHkgYXMgYW55IGZ1cnRoZXIgZXdrX3ZpZXcgY2FsbCBtaWdodCBjaGFu
Z2UgaXQsIGxpa2UKKyAqIHRob3NlIHRoYXQgYWRkIHNjcm9sbHMgb3IgZmx1c2ggdGhlbSwgc28g
YmUgc3VyZSB0aGF0IHlvdXIgY29kZQorICogZG9lcyBub3QgY2FsbCBhbnkgb2YgdGhvc2Ugd2hp
bGUgeW91IHByb2Nlc3MgdGhlIHNjcm9sbHMsCisgKiBvdGhlcndpc2UgY29weSB0aGUgYXJyYXku
CisgKgorICogQHBhcmFtIHByaXYgcHJpdmF0ZSBoYW5kbGUgcG9pbnRlciBvZiB0aGUgdmlldyB0
byBnZXQgc2Nyb2xscy4KKyAqIEBwYXJhbSBjb3VudCB3aGVyZSB0byByZXR1cm4gdGhlIG51bWJl
ciBvZiBlbGVtZW50cyBvZiByZXR1cm5lZCBhcnJheS4KKyAqCisgKiBAcmV0dXJuIHJlZmVyZW5j
ZSB0byBhcnJheSBvZiByZXF1ZXN0ZWQgc2Nyb2xscy4KKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5v
dCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAg
ICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK2NvbnN0IEV3a19T
Y3JvbGxfUmVxdWVzdCogZXdrX3ZpZXdfc2Nyb2xsX3JlcXVlc3RzX2dldChjb25zdCBFd2tfVmll
d19Qcml2YXRlX0RhdGEqIHByaXYsIHNpemVfdCogY291bnQpCit7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk5fVkFMKGNvdW50LCAwKTsKKyAgICBpZiAoY291bnQpCisgICAgICAgICpj
b3VudCA9IDA7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHByaXYsIDApOwor
ICAgIGlmIChjb3VudCkKKyAgICAgICAgKmNvdW50ID0gcHJpdi0+c2Nyb2xscy5jb3VudDsKKyAg
ICByZXR1cm4gcHJpdi0+c2Nyb2xscy5hcnJheTsKK30KKworLyoqCisgKiBBZGQgYSBuZXcgcmVw
YWludCByZXF1ZXN0IHRvIHF1ZXVlLgorICoKKyAqIFRoZSByZXBhaW50cyBhcmUgYXNzdW1lZCB0
byBiZSByZWxhdGl2ZSB0byBjdXJyZW50IHZpZXdwb3J0LgorICoKKyAqIEBwYXJhbSBwcml2IHBy
aXZhdGUgaGFuZGxlIHBvaW50ZXIgb2YgdGhlIHZpZXcgdG8gYWRkIHJlcGFpbnQgcmVxdWVzdC4K
KyAqIEBwYXJhbSB4IGhvcml6b250YWwgcG9zaXRpb24gcmVsYXRpdmUgdG8gY3VycmVudCB2aWV3
IHBvcnQgKHNjcm9sbGVkKS4KKyAqIEBwYXJhbSB5IHZlcnRpY2FsIHBvc2l0aW9uIHJlbGF0aXZl
IHRvIGN1cnJlbnQgdmlldyBwb3J0IChzY3JvbGxlZCkuCisgKiBAcGFyYW0gdyB3aWR0aCBvZiBh
cmVhIHRvIGJlIHJlcGFpbnRlZAorICogQHBhcmFtIGggaGVpZ2h0IG9mIGFyZWEgdG8gYmUgcmVw
YWludGVkCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0
IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBi
YWNraW5nIHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3JlcGFpbnRfYWRkKEV3a19WaWV3X1By
aXZhdGVfRGF0YSogcHJpdiwgRXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQg
dywgRXZhc19Db29yZCBoKQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHByaXYp
OworICAgIF9ld2tfdmlld19yZXBhaW50X2FkZChwcml2LCB4LCB5LCB3LCBoKTsKK30KKworLyoq
CisgKiBEbyBsYXlvdXQgaWYgcmVxdWlyZWQsIGFwcGxpZWQgcmVjdXJzaXZlbHkuCisgKgorICog
QHBhcmFtIHByaXYgcHJpdmF0ZSBoYW5kbGUgcG9pbnRlciBvZiB0aGUgdmlldyB0byBsYXlvdXQu
CisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBz
dWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5n
IHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X2xheW91dF9pZl9uZWVkZWRfcmVjdXJzaXZlKEV3
a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdikKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JF
VFVSTihwcml2KTsKKworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdiA9IHByaXYtPm1haW5fZnJh
bWUtPnZpZXcoKTsKKyAgICBpZiAoIXYpIHsKKyAgICAgICAgRVJSKCJubyBtYWluIGZyYW1lIHZp
ZXciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2LT5sYXlvdXRJZk5lZWRlZFJlY3Vy
c2l2ZSgpOworfQorCit2b2lkIGV3a192aWV3X3Njcm9sbHNfcHJvY2VzcyhFd2tfVmlld19TbWFy
dF9EYXRhKiBzZCkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZCk7CisgICAg
RVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2KTsKKyAgICBpZiAoIXNkLT5hcGkt
PnNjcm9sbHNfcHJvY2VzcyhzZCkpCisgICAgICAgIEVSUigiZmFpbGVkIHRvIHByb2Nlc3Mgc2Ny
b2xscy4iKTsKKyAgICBfZXdrX3ZpZXdfc2Nyb2xsc19mbHVzaChwcml2KTsKK30KKworc3RydWN0
IF9Fd2tfVmlld19QYWludF9Db250ZXh0IHsKKyAgICBXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQq
IGdjOworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldzsKKyAgICBjYWlyb190KiBjcjsKK307
CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHBhaW50IGNvbnRleHQgdXNpbmcgdGhlIHZpZXcgYXMg
c291cmNlIGFuZCBjYWlybyBhcyBvdXRwdXQuCisgKgorICogQHBhcmFtIHByaXYgcHJpdmF0ZSBo
YW5kbGUgcG9pbnRlciBvZiB0aGUgdmlldyB0byB1c2UgYXMgcGFpbnQgc291cmNlLgorICogQHBh
cmFtIGNyIGNhaXJvIGNvbnRleHQgdG8gdXNlIGFzIHBhaW50IGRlc3RpbmF0aW9uLiBBIG5ldwor
ICogICAgICAgIHJlZmVyZW5jZSBpcyB0YWtlbiwgc28gaXQncyBzYWZlIHRvIGNhbGwgY2Fpcm9f
ZGVzdHJveSgpCisgKiAgICAgICAgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgorICoKKyAq
IEByZXR1cm4gbmV3bHkgYWxsb2NhdGVkIGluc3RhbmNlIG9yIEBjIE5VTEwgb24gZXJyb3JzLgor
ICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3Vi
Y2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBz
dG9yZS4KKyAqLworRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogZXdrX3ZpZXdfcGFpbnRfY29udGV4
dF9uZXcoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBjYWlyb190KiBjcikKK3sKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwocHJpdiwgMCk7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk5fVkFMKGNyLCAwKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVS
Tl9WQUwocHJpdi0+bWFpbl9mcmFtZSwgMCk7CisgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3
ID0gcHJpdi0+bWFpbl9mcmFtZS0+dmlldygpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOX1ZBTCh2aWV3LCAwKTsKKyAgICBFd2tfVmlld19QYWludF9Db250ZXh0KiBjdHh0ID0gKEV3
a19WaWV3X1BhaW50X0NvbnRleHQqKW1hbGxvYyhzaXplb2YoKmN0eHQpKTsKKyAgICBFSU5BX1NB
RkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoY3R4dCwgMCk7CisKKyAgICBjdHh0LT5nYyA9IG5ldyBX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQoY3IpOworICAgIGlmICghY3R4dC0+Z2MpIHsKKyAgICAg
ICAgZnJlZShjdHh0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGN0eHQtPnZpZXcg
PSB2aWV3OworICAgIGN0eHQtPmNyID0gY2Fpcm9fcmVmZXJlbmNlKGNyKTsKKyAgICByZXR1cm4g
Y3R4dDsKK30KKworLyoqCisgKiBEZXN0cm95IHByZXZpb3VzbHkgY3JlYXRlZCBwYWludCBjb250
ZXh0LgorICoKKyAqIEBwYXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gZGVzdHJveS4gTXVzdCBA
YiBub3QgYmUgQGMgTlVMTC4KKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1
c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUg
dGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4
dF9mcmVlKEV3a19WaWV3X1BhaW50X0NvbnRleHQqIGN0eHQpCit7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk4oY3R4dCk7CisgICAgZGVsZXRlIGN0eHQtPmdjOworICAgIGNhaXJvX2Rl
c3Ryb3koY3R4dC0+Y3IpOworICAgIGZyZWUoY3R4dCk7Cit9CisKKy8qKgorICogU2F2ZSAocHVz
aCB0byBzdGFjaykgcGFpbnQgY29udGV4dCBzdGF0dXMuCisgKgorICogQHBhcmFtIGN0eHQgcGFp
bnQgY29udGV4dCB0byBzYXZlLiBNdXN0IEBiIG5vdCBiZSBAYyBOVUxMLgorICoKKyAqIEBzZWUg
ZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9yZXN0b3JlKCkKKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5v
dCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAg
ICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK3ZvaWQgZXdrX3Zp
ZXdfcGFpbnRfY29udGV4dF9zYXZlKEV3a19WaWV3X1BhaW50X0NvbnRleHQqIGN0eHQpCit7Cisg
ICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oY3R4dCk7CisgICAgY2Fpcm9fc2F2ZShjdHh0
LT5jcik7CisgICAgY3R4dC0+Z2MtPnNhdmUoKTsKK30KKworLyoqCisgKiBSZXN0b3JlIChwb3Ag
ZnJvbSBzdGFjaykgcGFpbnQgY29udGV4dCBzdGF0dXMuCisgKgorICogQHBhcmFtIGN0eHQgcGFp
bnQgY29udGV4dCB0byByZXN0b3JlLiBNdXN0IEBiIG5vdCBiZSBAYyBOVUxMLgorICoKKyAqIEBz
ZWUgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9zYXZlKCkKKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5v
dCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAg
ICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK3ZvaWQgZXdrX3Zp
ZXdfcGFpbnRfY29udGV4dF9yZXN0b3JlKEV3a19WaWV3X1BhaW50X0NvbnRleHQqIGN0eHQpCit7
CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oY3R4dCk7CisgICAgY3R4dC0+Z2MtPnJl
c3RvcmUoKTsKKyAgICBjYWlyb19yZXN0b3JlKGN0eHQtPmNyKTsKK30KKworLyoqCisgKiBDbGlw
IHBhaW50IGNvbnRleHQgZHJhd2luZ3MgdG8gZ2l2ZW4gYXJlYS4KKyAqCisgKiBAcGFyYW0gY3R4
dCBwYWludCBjb250ZXh0IHRvIGNsaXAuIE11c3QgQGIgbm90IGJlIEBjIE5VTEwuCisgKiBAcGFy
YW0gYXJlYSBjbGlwIGFyZWEgdG8gdXNlLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29u
dGV4dF9zYXZlKCkKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9yZXN0b3JlKCkKKyAq
CisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNs
YXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3Rv
cmUuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9jbGlwKEV3a19WaWV3X1BhaW50
X0NvbnRleHQqIGN0eHQsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlKiBhcmVhKQoreworICAgIEVJTkFf
U0FGRVRZX09OX05VTExfUkVUVVJOKGN0eHQpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOKGFyZWEpOworICAgIGN0eHQtPmdjLT5jbGlwKFdlYkNvcmU6OkludFJlY3QoYXJlYS0+eCwg
YXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCkpOworfQorCisvKioKKyAqIFBhaW50IHVzaW5nIGNv
bnRleHQgdXNpbmcgZ2l2ZW4gYXJlYS4KKyAqCisgKiBAcGFyYW0gY3R4dCBwYWludCBjb250ZXh0
IHRvIHBhaW50LiBNdXN0IEBiIG5vdCBiZSBAYyBOVUxMLgorICogQHBhcmFtIGFyZWEgcGFpbnQg
YXJlYSB0byB1c2UuIENvb3JkaW5hdGVzIGFyZSByZWxhdGl2ZSB0byBjdXJyZW50IHZpZXdwb3J0
LAorICogICAgICAgIHRodXMgInNjcm9sbGVkIi4KKyAqCisgKiBAbm90ZSBvbmUgbWF5IHVzZSBj
YWlybyBmdW5jdGlvbnMgb24gdGhlIGNhaXJvIGNvbnRleHQgdG8KKyAqICAgICAgIHRyYW5zbGF0
ZSwgc2NhbGUgb3IgYW55IG1vZGlmaWNhdGlvbiB0aGF0IG1heSBmaXQgaGlzIGRlc2lyZXMuCisg
KgorICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0X2NsaXAoKQorICogQHNlZSBld2tfdmll
d19wYWludF9jb250ZXh0X3BhaW50X2NvbnRlbnRzKCkKKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5v
dCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAg
ICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK3ZvaWQgZXdrX3Zp
ZXdfcGFpbnRfY29udGV4dF9wYWludChFd2tfVmlld19QYWludF9Db250ZXh0KiBjdHh0LCBjb25z
dCBFaW5hX1JlY3RhbmdsZSogYXJlYSkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVS
TihjdHh0KTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihhcmVhKTsKKworICAgIFdl
YkNvcmU6OkludFJlY3QgcmVjdChhcmVhLT54LCBhcmVhLT55LCBhcmVhLT53LCBhcmVhLT5oKTsK
KworICAgIGlmIChjdHh0LT52aWV3LT5pc1RyYW5zcGFyZW50KCkpCisgICAgICAgIGN0eHQtPmdj
LT5jbGVhclJlY3QocmVjdCk7CisgICAgY3R4dC0+dmlldy0+cGFpbnQoY3R4dC0+Z2MsIHJlY3Qp
OworfQorCisvKioKKyAqIFBhaW50IGp1c3QgY29udGVudHMgdXNpbmcgY29udGV4dCB1c2luZyBn
aXZlbiBhcmVhLgorICoKKyAqIFVubGlrZSBld2tfdmlld19wYWludF9jb250ZXh0X3BhaW50KCks
IHRoaXMgZnVuY3Rpb24gcGFpbnQganVzdAorICogYmFyZSBjb250ZW50cyBhbmQgaWdub3JlcyBh
bnkgc2Nyb2xsaW5nLCBzY3JvbGxiYXJzIGFuZCBleHRyYXMuIEl0CisgKiB3aWxsIHdhbGsgdGhl
IHJlbmRlcmluZyB0cmVlIGFuZCBwYWludCBjb250ZW50cyBpbnNpZGUgdGhlIGdpdmVuCisgKiBh
cmVhIHRvIHRoZSBjYWlybyBjb250ZXh0IHNwZWNpZmllZCBpbiBAYSBjdHh0LgorICoKKyAqIEBw
YXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gcGFpbnQuIE11c3QgQGIgbm90IGJlIEBjIE5VTEwu
CisgKiBAcGFyYW0gYXJlYSBwYWludCBhcmVhIHRvIHVzZS4gQ29vcmRpbmF0ZXMgYXJlIGFic29s
dXRlIHRvIHBhZ2UuCisgKgorICogQG5vdGUgb25lIG1heSB1c2UgY2Fpcm8gZnVuY3Rpb25zIG9u
IHRoZSBjYWlybyBjb250ZXh0IHRvCisgKiAgICAgICB0cmFuc2xhdGUsIHNjYWxlIG9yIGFueSBt
b2RpZmljYXRpb24gdGhhdCBtYXkgZml0IGhpcyBkZXNpcmVzLgorICoKKyAqIEBzZWUgZXdrX3Zp
ZXdfcGFpbnRfY29udGV4dF9jbGlwKCkKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9w
YWludCgpCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0
IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBi
YWNraW5nIHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnRfY29u
dGVudHMoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUq
IGFyZWEpCit7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oY3R4dCk7CisgICAgRUlO
QV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oYXJlYSk7CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHJl
Y3QoYXJlYS0+eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCk7CisKKyAgICBpZiAoY3R4dC0+
dmlldy0+aXNUcmFuc3BhcmVudCgpKQorICAgICAgICBjdHh0LT5nYy0+Y2xlYXJSZWN0KHJlY3Qp
OworCisgICAgY3R4dC0+dmlldy0+cGFpbnRDb250ZW50cyhjdHh0LT5nYywgcmVjdCk7Cit9CisK
Ky8qKgorICogU2NhbGUgdGhlIGNvbnRlbnRzIGJ5IHRoZSBnaXZlbiBmYWN0b3JzLgorICoKKyAq
IFRoaXMgZnVuY3Rpb24gYXBwbGllcyBhIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gdXNpbmcgQ2Fp
cm8uCisgKgorICogQHBhcmFtIGN0eHQgICAgcGFpbnQgY29udGV4dCB0byBwYWludC4gTXVzdCBA
YiBub3QgYmUgQGMgTlVMTC4KKyAqIEBwYXJhbSBzY2FsZV94IHNjYWxlIGZhY3RvciBmb3IgdGhl
IFggZGltZW5zaW9uLgorICogQHBhcmFtIHNjYWxlX3kgc2NhbGUgZmFjdG9yIGZvciB0aGUgWSBk
aW1lbnNpb24uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9zY2FsZShFd2tfVmll
d19QYWludF9Db250ZXh0KiBjdHh0LCBmbG9hdCBzY2FsZV94LCBmbG9hdCBzY2FsZV95KQorewor
ICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKGN0eHQpOworCisgICAgY3R4dC0+Z2MtPnNj
YWxlKFdlYkNvcmU6OkZsb2F0U2l6ZShzY2FsZV94LCBzY2FsZV95KSk7Cit9CisKKy8qKgorICog
UGVyZm9ybXMgYSB0cmFuc2xhdGlvbiBvZiB0aGUgb3JpZ2luIGNvb3JkaW5hdGVzLgorICoKKyAq
IFRoaXMgZnVuY3Rpb24gbW92ZXMgdGhlIG9yaWdpbiBjb29yZGluYXRlcyBieSBAcCB4IGFuZCBA
cCB5IHBpeGVscy4KKyAqCisgKiBAcGFyYW0gY3R4dCBwYWludCBjb250ZXh0IHRvIHBhaW50LiBN
dXN0IEBiIG5vdCBiZSBAYyBOVUxMLgorICogQHBhcmFtIHggICAgYW1vdW50IG9mIHBpeGVscyB0
byB0cmFuc2xhdGUgaW4gdGhlIFggZGltZW5zaW9uLgorICogQHBhcmFtIHkgICAgYW1vdW50IG9m
IHBpeGVscyB0byB0cmFuc2xhdGUgaW4gdGhlIFkgZGltZW5zaW9uLgorICovCit2b2lkIGV3a192
aWV3X3BhaW50X2NvbnRleHRfdHJhbnNsYXRlKEV3a19WaWV3X1BhaW50X0NvbnRleHQqIGN0eHQs
IGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oY3R4
dCk7CisKKyAgICBjdHh0LT5nYy0+dHJhbnNsYXRlKHgsIHkpOworfQorCisvKioKKyAqIFBhaW50
IHVzaW5nIGdpdmVuIGdyYXBoaWNzIGNvbnRleHQgdGhlIGdpdmVuIGFyZWEuCisgKgorICogVGhp
cyB1c2VzIHZpZXdwb3J0IHJlbGF0aXZlIGFyZWEgYW5kIHdpbGwgYWxzbyBoYW5kbGUgc2Nyb2xs
YmFycworICogYW5kIG90aGVyIGV4dHJhIGVsZW1lbnRzLiBTZWUgZXdrX3ZpZXdfcGFpbnRfY29u
dGVudHMoKSBmb3IgdGhlCisgKiBhbHRlcm5hdGl2ZSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0g
cHJpdiBwcml2YXRlIGhhbmRsZSBwb2ludGVyIG9mIHZpZXcgdG8gdXNlIGFzIHBhaW50IHNvdXJj
ZS4KKyAqIEBwYXJhbSBjciBjYWlybyBjb250ZXh0IHRvIHVzZSBhcyBwYWludCBkZXN0aW5hdGlv
bi4gSXRzIHN0YXRlIHdpbGwKKyAqICAgICAgICBiZSBzYXZlZCBiZWZvcmUgb3BlcmF0aW9uIGFu
ZCByZXN0b3JlZCBhZnRlcndhcmRzLgorICogQHBhcmFtIGFyZWEgdmlld3BvcnQgcmVsYXRpdmUg
Z2VvbWV0cnkgdG8gcGFpbnQuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2Vz
cyBhbmQgQGMgRUlOQV9GQUxTRSBvbiBmYWlsdXJlLCBsaWtlCisgKiAgICAgICAgIGluY29ycmVj
dCBwYXJhbWV0ZXJzLgorICoKKyAqIEBub3RlIHRoaXMgaXMgYW4gZWFzeSB0byB1c2UgdmVyc2lv
biwgYnV0IGludGVybmFsIHN0cnVjdHVyZXMgYXJlCisgKiAgICAgICBhbHdheXMgY3JlYXRlZCwg
dGhlbiBncmFwaGljcyBjb250ZXh0IGlzIGNsaXBwZWQsIHRoZW4KKyAqICAgICAgIHBhaW50ZWQs
IHJlc3RvcmVkIGFuZCBkZXN0cm95ZWQuIFRoaXMgbWlnaHQgbm90IGJlIG9wdGltdW0sCisgKiAg
ICAgICBzbyB1c2luZyAjRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCBtYXkgYmUgYSBiZXR0ZXIgc29s
dXRpb25zCisgKiAgICAgICBmb3IgbGFyZ2UgbnVtYmVyIG9mIG9wZXJhdGlvbnMuCisgKgorICog
QHNlZSBld2tfdmlld19wYWludF9jb250ZW50cygpCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2Nv
bnRleHRfcGFpbnQoKQorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBi
dXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVp
ciBvd24gYmFja2luZyBzdG9yZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3BhaW50KEV3a19W
aWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgY2Fpcm9fdCogY3IsIGNvbnN0IEVpbmFfUmVjdGFuZ2xl
KiBhcmVhKQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChwcml2LCBFSU5B
X0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoY3IsIEVJTkFfRkFM
U0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChhcmVhLCBFSU5BX0ZBTFNF
KTsKKyAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBwcml2LT5tYWluX2ZyYW1lLT52aWV3
KCk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHZpZXcsIEVJTkFfRkFMU0Up
OworCisgICAgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0IGdjKGNyKTsKKyAgICBXZWJDb3JlOjpJ
bnRSZWN0IHJlY3QoYXJlYS0+eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCk7CisKKyAgICBj
YWlyb19zYXZlKGNyKTsKKyAgICBnYy5zYXZlKCk7CisgICAgZ2MuY2xpcChyZWN0KTsKKyAgICBp
ZiAodmlldy0+aXNUcmFuc3BhcmVudCgpKQorICAgICAgICBnYy5jbGVhclJlY3QocmVjdCk7Cisg
ICAgdmlldy0+cGFpbnQoJmdjLCAgcmVjdCk7CisgICAgZ2MucmVzdG9yZSgpOworICAgIGNhaXJv
X3Jlc3RvcmUoY3IpOworCisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBQYWlu
dCBqdXN0IGNvbnRlbnRzIHVzaW5nIGdpdmVuIGdyYXBoaWNzIGNvbnRleHQgdGhlIGdpdmVuIGFy
ZWEuCisgKgorICogVGhpcyB1c2VzIGFic29sdXRlIGNvb3JkaW5hdGVzIGZvciBhcmVhIGFuZCB3
aWxsIGp1c3QgaGFuZGxlCisgKiBjb250ZW50cywgbm8gc2Nyb2xsYmFycyBvciBleHRyYXMuIFNl
ZSBld2tfdmlld19wYWludCgpIGZvciB0aGUKKyAqIGFsdGVybmF0aXZlIHNvbHV0aW9uLgorICoK
KyAqIEBwYXJhbSBwcml2IHByaXZhdGUgaGFuZGxlIHBvaW50ZXIgb2YgdmlldyB0byB1c2UgYXMg
cGFpbnQgc291cmNlLgorICogQHBhcmFtIGNyIGNhaXJvIGNvbnRleHQgdG8gdXNlIGFzIHBhaW50
IGRlc3RpbmF0aW9uLiBJdHMgc3RhdGUgd2lsbAorICogICAgICAgIGJlIHNhdmVkIGJlZm9yZSBv
cGVyYXRpb24gYW5kIHJlc3RvcmVkIGFmdGVyd2FyZHMuCisgKiBAcGFyYW0gYXJlYSBhYnNvbHV0
ZSBnZW9tZXRyeSB0byBwYWludC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNj
ZXNzIGFuZCBAYyBFSU5BX0ZBTFNFIG9uIGZhaWx1cmUsIGxpa2UKKyAqICAgICAgICAgaW5jb3Jy
ZWN0IHBhcmFtZXRlcnMuCisgKgorICogQG5vdGUgdGhpcyBpcyBhbiBlYXN5IHRvIHVzZSB2ZXJz
aW9uLCBidXQgaW50ZXJuYWwgc3RydWN0dXJlcyBhcmUKKyAqICAgICAgIGFsd2F5cyBjcmVhdGVk
LCB0aGVuIGdyYXBoaWNzIGNvbnRleHQgaXMgY2xpcHBlZCwgdGhlbgorICogICAgICAgcGFpbnRl
ZCwgcmVzdG9yZWQgYW5kIGRlc3Ryb3llZC4gVGhpcyBtaWdodCBub3QgYmUgb3B0aW11bSwKKyAq
ICAgICAgIHNvIHVzaW5nICNFd2tfVmlld19QYWludF9Db250ZXh0IG1heSBiZSBhIGJldHRlciBz
b2x1dGlvbnMKKyAqICAgICAgIGZvciBsYXJnZSBudW1iZXIgb2Ygb3BlcmF0aW9ucy4KKyAqCisg
KiBAc2VlIGV3a192aWV3X3BhaW50KCkKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9w
YWludF9jb250ZW50cygpCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNl
IGJ1dCBqdXN0IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRo
ZWlyIG93biBiYWNraW5nIHN0b3JlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfcGFpbnRfY29u
dGVudHMoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBjYWlyb190KiBjciwgY29uc3QgRWlu
YV9SZWN0YW5nbGUqIGFyZWEpCit7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFM
KHByaXYsIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChj
ciwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKGFyZWEs
IEVJTkFfRkFMU0UpOworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IHByaXYtPm1haW5f
ZnJhbWUtPnZpZXcoKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwodmlldywg
RUlOQV9GQUxTRSk7CisKKyAgICBXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQgZ2MoY3IpOworICAg
IFdlYkNvcmU6OkludFJlY3QgcmVjdChhcmVhLT54LCBhcmVhLT55LCBhcmVhLT53LCBhcmVhLT5o
KTsKKworICAgIGNhaXJvX3NhdmUoY3IpOworICAgIGdjLnNhdmUoKTsKKyAgICBnYy5jbGlwKHJl
Y3QpOworICAgIGlmICh2aWV3LT5pc1RyYW5zcGFyZW50KCkpCisgICAgICAgIGdjLmNsZWFyUmVj
dChyZWN0KTsKKyAgICB2aWV3LT5wYWludENvbnRlbnRzKCZnYywgIHJlY3QpOworICAgIGdjLnJl
c3RvcmUoKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKKworICAgIHJldHVybiBFSU5BX1RSVUU7
Cit9CisKKworLyogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqLworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMg
dGhlIHZpZXcgaXMgcmVhZHkgdG8gYmUgZGlzcGxheWVkIGFzIGFsbCBlbGVtZW50cyBhcmUgYXJl
YWR5LgorICoKKyAqIEVtaXRzIHNpZ25hbDogInJlYWR5IiB3aXRoIG5vIHBhcmFtZXRlcnMuCisg
Ki8KK3ZvaWQgZXdrX3ZpZXdfcmVhZHkoRXZhc19PYmplY3QqIG8pCit7CisgICAgREJHKCJvPSVw
Iiwgbyk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAicmVhZHkiLCAw
KTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFRoZSB2aWV3IHRpdGxlIHdhcyBjaGFuZ2Vk
IGJ5IHRoZSBmcmFtZSBsb2FkZXIuCisgKgorICogRW1pdHMgc2lnbmFsOiAidGl0bGUsY2hhbmdl
ZCIgd2l0aCBwb2ludGVyIHRvIG5ldyB0aXRsZSBzdHJpbmcuCisgKi8KK3ZvaWQgZXdrX3ZpZXdf
dGl0bGVfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiB0aXRsZSkKK3sKKyAgICBEQkco
Im89JXAsIHRpdGxlPSVzIiwgbywgdGl0bGUgPyB0aXRsZSA6ICIobnVsbCkiKTsKKyAgICBldmFz
X29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJ0aXRsZSxjaGFuZ2VkIiwgKHZvaWQqKXRp
dGxlKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgdGhhdCBtYWluIGZyYW1l
J3MgdXJpIGNoYW5nZWQuCisgKgorICogRW1pdHMgc2lnbmFsOiAidXJpLGNoYW5nZWQiIHdpdGgg
cG9pbnRlciB0byB0aGUgbmV3IHVyaSBzdHJpbmcuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfdXJpX2No
YW5nZWQoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihv
LCBzZCk7CisgICAgY29uc3QgY2hhciogdXJpID0gZXdrX2ZyYW1lX3VyaV9nZXQoc2QtPm1haW5f
ZnJhbWUpOworICAgIERCRygibz0lcCwgdXJpPSVzIiwgbywgdXJpID8gdXJpIDogIihudWxsKSIp
OworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInVyaSxjaGFuZ2VkIiwg
KHZvaWQqKXVyaSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHRoZSB2aWV3
IHN0YXJ0ZWQgbG9hZGluZyBzb21ldGhpbmcuCisgKgorICogRW1pdHMgc2lnbmFsOiAibG9hZCxz
dGFydGVkIiB3aXRoIG5vIHBhcmFtZXRlcnMuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9zdGFy
dGVkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIERCRygibz0lcCIsIG8pOworICAgIEVXS19WSUVX
X1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJO
KHNkLT5hcGktPmZsdXNoKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8s
ICJsb2FkLHN0YXJ0ZWQiLCAwKTsKK30KKwordm9pZCBld2tfdmlld19mcmFtZV9tYWluX2xvYWRf
c3RhcnRlZChFdmFzX09iamVjdCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBFV0tf
VklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JF
VFVSTihzZC0+YXBpLT5mbHVzaCk7CisgICAgc2QtPmFwaS0+Zmx1c2goc2QpOworfQorCisvKioK
KyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyBsb2FkIGZpbmlzaGVkLCBvcHRpb25hbGx5IHdpdGgg
ZXJyb3IgaW5mb3JtYXRpb24uCisgKgorICogRW1pdHMgc2lnbmFsOiAibG9hZCxmaW5pc2hlZCIg
d2l0aCBwb2ludGVyIHRvICNFd2tfRnJhbWVfTG9hZF9FcnJvcgorICogaWYgYW55IGVycm9yLCBv
ciBAYyBOVUxMIGlmIHN1Y2Nlc3NmdWwgbG9hZC4KKyAqCisgKiBAbm90ZSB0aGVyZSBzaG91bGQg
bm90IGJlIGFueSBlcnJvciBzdHVmZiBoZXJlLCBidXQgdHJ5aW5nIHRvIGJlCisgKiAgICAgICBj
b21wYXRpYmxlIHdpdGggcHJldmlvdXMgV2ViS2l0LgorICovCit2b2lkIGV3a192aWV3X2xvYWRf
ZmluaXNoZWQoRXZhc19PYmplY3QqIG8sIGNvbnN0IEV3a19GcmFtZV9Mb2FkX0Vycm9yKiBlcnJv
cikKK3sKKyAgICBEQkcoIm89JXAsIGVycm9yPSVwIiwgbywgZXJyb3IpOworICAgIGV2YXNfb2Jq
ZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgImxvYWQsZmluaXNoZWQiLCAodm9pZCopZXJyb3Ip
OworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyBsb2FkIGZhaWxlZCB3aXRoIGVy
cm9yIGluZm9ybWF0aW9uLgorICoKKyAqIEVtaXRzIHNpZ25hbDogImxvYWQsZXJyb3IiIHdpdGgg
cG9pbnRlciB0byBFd2tfRnJhbWVfTG9hZF9FcnJvci4KKyAqLwordm9pZCBld2tfdmlld19sb2Fk
X2Vycm9yKEV2YXNfT2JqZWN0KiBvLCBjb25zdCBFd2tfRnJhbWVfTG9hZF9FcnJvciogZXJyb3Ip
Cit7CisgICAgREJHKCJvPSVwLCBlcnJvcj0lcCIsIG8sIGVycm9yKTsKKyAgICBldmFzX29iamVj
dF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJsb2FkLGVycm9yIiwgKHZvaWQqKWVycm9yKTsKK30K
KworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgbG9hZCBwcm9ncmVzcyBjaGFuZ2VkLgor
ICoKKyAqIEVtaXRzIHNpZ25hbDogImxvYWQscHJvZ3Jlc3MiIHdpdGggcG9pbnRlciB0byBhIGRv
dWJsZSBmcm9tIDAuMCB0byAxLjAuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9wcm9ncmVzc19j
aGFuZ2VkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdik7CisKKyAg
ICAvLyBFdmFzX0Nvb3JkIHcsIGg7CisgICAgZG91YmxlIHByb2dyZXNzID0gcHJpdi0+cGFnZS0+
cHJvZ3Jlc3MoKS0+ZXN0aW1hdGVkUHJvZ3Jlc3MoKTsKKworICAgIERCRygibz0lcCAocD0lMC4z
ZikiLCBvLCBwcm9ncmVzcyk7CisKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxs
KG8sICJsb2FkLHByb2dyZXNzIiwgJnByb2dyZXNzKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwK
KyAqIFJlcG9ydHMgbW91c2UgaGFzIG1vdmVkIG92ZXIgYSBsaW5rLgorICoKKyAqIEVtaXRzIHNp
Z25hbDogImxpbmssaG92ZXIsaW4iCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbW91c2VfbGlua19ob3Zl
cl9pbihFdmFzX09iamVjdCAqbywgdm9pZCAqZGF0YSkKK3sKKyAgICBldmFzX29iamVjdF9zbWFy
dF9jYWxsYmFja19jYWxsKG8sICJsaW5rLGhvdmVyLGluIiwgZGF0YSk7Cit9CisKKy8qKgorICog
QGludGVybmFsCisgKiBSZXBvcnRzIG1vdXNlIGlzIG5vdCBvdmVyIGEgbGluayBhbnltb3JlLgor
ICoKKyAqIEVtaXRzIHNpZ25hbDogImxpbmssaG92ZXIsb3V0IgorICovCit2b2lkIGV3a192aWV3
X21vdXNlX2xpbmtfaG92ZXJfb3V0KEV2YXNfT2JqZWN0KiBvKQoreworICAgIGV2YXNfb2JqZWN0
X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgImxpbmssaG92ZXIsb3V0IiwgMCk7Cit9CisKKy8qKgor
ICogQGludGVybmFsCisgKiBTZXQgdG9vbGJhciB2aXNpYmxlLgorICoKKyAqIEVtaXRzIHNpZ25h
bDogInRvb2xiYXJzLHZpc2libGUsc2V0IiB3aXRoIGEgcG9pbnRlciB0byBhIGJvb2xlYW4uCisg
Ki8KK3ZvaWQgZXdrX3ZpZXdfdG9vbGJhcnNfdmlzaWJsZV9zZXQoRXZhc19PYmplY3QqIG8sIEVp
bmFfQm9vbCB2aXNpYmxlKQoreworICAgIERCRygibz0lcCAodmlzaWJsZT0lZCkiLCBvLCAhIXZp
c2libGUpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInRvb2xiYXJz
LHZpc2libGUsc2V0IiwgJnZpc2libGUpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogR2V0
IHRvb2xiYXIgdmlzaWJpbGl0eS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHZp
c2libGUgYm9vbGVhbiBwb2ludGVyIGluIHdoaWNoIHRvIHNhdmUgdGhlIHJlc3VsdC4gSXQgZGVm
YXVsdHMKKyAqIHRvIEBjIEZBTFNFLCBpLmUuIGlmIGJyb3dzZXIgZG9lcyBubyBsaXN0ZW4gdG8g
ZW1pdHRlZCBzaWduYWwsIGl0IG1lYW5zCisgKiB0aGVyZSBhcmUgbm8gdG9vbGJhcnMgYW5kIHRo
ZXJlZm9yZSB0aGV5IGFyZSBub3QgdmlzaWJsZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJ0b29s
YmFycyx2aXNpYmxlLGdldCIgd2l0aCBhIHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lk
IGV3a192aWV3X3Rvb2xiYXJzX3Zpc2libGVfZ2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wq
IHZpc2libGUpCit7CisgICAgREJHKCIlcywgbz0lcCIsIF9fZnVuY19fLCBvKTsKKyAgICAqdmlz
aWJsZSA9IEVJTkFfRkFMU0U7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChv
LCAidG9vbGJhcnMsdmlzaWJsZSxnZXQiLCB2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50ZXJu
YWwKKyAqIFNldCBzdGF0dXNiYXIgdmlzaWJsZS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICog
QHBhcmFtIHZpc2libGUgQGMgVFJVRSBpZiBzdGF0dXNiYXIgYXJlIHZpc2libGUsIEBjIEZBTFNF
IG90aGVyd2lzZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJzdGF0dXNiYXIsdmlzaWJsZSxzZXQi
IHdpdGggYSBwb2ludGVyIHRvIGEgYm9vbGVhbi4KKyAqLwordm9pZCBld2tfdmlld19zdGF0dXNi
YXJfdmlzaWJsZV9zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCB2aXNpYmxlKQoreworICAg
IERCRygibz0lcCAodmlzaWJsZT0lZCkiLCBvLCAhIXZpc2libGUpOworICAgIGV2YXNfb2JqZWN0
X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInN0YXR1c2Jhcix2aXNpYmxlLHNldCIsICZ2aXNpYmxl
KTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIEdldCBzdGF0dXNiYXIgdmlzaWJpbGl0eS4K
KyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHZpc2libGUgYm9vbGVhbiBwb2ludGVy
IGluIHdoaWNoIHRvIHNhdmUgdGhlIHJlc3VsdC4gSXQgZGVmYXVsdHMKKyAqIHRvIEBjIEZBTFNF
LCBpLmUuIGlmIGJyb3dzZXIgZG9lcyBubyBsaXN0ZW4gdG8gZW1pdHRlZCBzaWduYWwsIGl0IG1l
YW5zCisgKiB0aGVyZSBpcyBubyBzdGF0dXNiYXIgYW5kIHRoZXJlZm9yZSBpdCBpcyBub3Qgdmlz
aWJsZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJzdGF0dXNiYXIsdmlzaWJsZSxnZXQiIHdpdGgg
YSBwb2ludGVyIHRvIGEgYm9vbGVhbi4KKyAqLwordm9pZCBld2tfdmlld19zdGF0dXNiYXJfdmlz
aWJsZV9nZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCogdmlzaWJsZSkKK3sKKyAgICBEQkco
IiVzLCBvPSVwIiwgX19mdW5jX18sIG8pOworICAgICp2aXNpYmxlID0gRUlOQV9GQUxTRTsKKyAg
ICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJzdGF0dXNiYXIsdmlzaWJsZSxn
ZXQiLCB2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFNldCB0ZXh0IG9mIHN0
YXR1c2JhcgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdGV4dCBOZXcgdGV4dCB0
byBwdXQgb24gc3RhdHVzYmFyLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInN0YXR1c2Jhcix0ZXh0
LHNldCIgd2l0aCBhIHN0cmluZy4KKyAqLwordm9pZCBld2tfdmlld19zdGF0dXNiYXJfdGV4dF9z
ZXQoRXZhc19PYmplY3QqIG8sIGNvbnN0IGNoYXIqIHRleHQpCit7CisgICAgREJHKCJvPSVwICh0
ZXh0PSVzKSIsIG8sIHRleHQpOworICAgIElORigic3RhdHVzIGJhciB0ZXh0IHNldDogJXMiLCB0
ZXh0KTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJzdGF0dXNiYXIs
dGV4dCxzZXQiLCAodm9pZCAqKXRleHQpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogU2V0
IHNjcm9sbGJhcnMgdmlzaWJsZS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHZp
c2libGUgQGMgVFJVRSBpZiBzY3JvbGxiYXJzIGFyZSB2aXNpYmxlLCBAYyBGQUxTRSBvdGhlcndp
c2UuCisgKgorICogRW1pdHMgc2lnbmFsOiAic2Nyb2xsYmFycyx2aXNpYmxlLHNldCIgd2l0aCBh
IHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lkIGV3a192aWV3X3Njcm9sbGJhcnNfdmlz
aWJsZV9zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCB2aXNpYmxlKQoreworICAgIERCRygi
bz0lcCAodmlzaWJsZT0lZCkiLCBvLCAhIXZpc2libGUpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0
X2NhbGxiYWNrX2NhbGwobywgInNjcm9sbGJhcnMsdmlzaWJsZSxzZXQiLCAmdmlzaWJsZSk7Cit9
CisKKy8qKgorICogQGludGVybmFsCisgKiBHZXQgc2Nyb2xsYmFycyB2aXNpYmlsaXR5LgorICoK
KyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBib29sZWFuIHBvaW50ZXIgaW4g
d2hpY2ggdG8gc2F2ZSB0aGUgcmVzdWx0LiBJdCBkZWZhdWx0cworICogdG8gQGMgRkFMU0UsIGku
ZS4gaWYgYnJvd3NlciBkb2VzIG5vIGxpc3RlbiB0byBlbWl0dGVkIHNpZ25hbCwgaXQgbWVhbnMK
KyAqIHRoZXJlIGFyZSBubyBzY3JvbGxiYXJzIGFuZCB0aGVyZWZvcmUgdGhleSBhcmUgbm90IHZp
c2libGUuCisgKgorICogRW1pdHMgc2lnbmFsOiAic2Nyb2xsYmFycyx2aXNpYmxlLGdldCIgd2l0
aCBhIHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lkIGV3a192aWV3X3Njcm9sbGJhcnNf
dmlzaWJsZV9nZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCogdmlzaWJsZSkKK3sKKyAgICBE
QkcoIiVzLCBvPSVwIiwgX19mdW5jX18sIG8pOworICAgICp2aXNpYmxlID0gRUlOQV9GQUxTRTsK
KyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJzY3JvbGxiYXJzLHZpc2li
bGUsZ2V0IiwgdmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBTZXQgbWVudWJh
ciB2aXNpYmxlLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBAYyBU
UlVFIGlmIG1lbnViYXIgaXMgdmlzaWJsZSwgQGMgRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEVt
aXRzIHNpZ25hbDogIm1lbnViYXIsdmlzaWJsZSxzZXQiIHdpdGggYSBwb2ludGVyIHRvIGEgYm9v
bGVhbi4KKyAqLwordm9pZCBld2tfdmlld19tZW51YmFyX3Zpc2libGVfc2V0KEV2YXNfT2JqZWN0
KiBvLCBFaW5hX0Jvb2wgdmlzaWJsZSkKK3sKKyAgICBEQkcoIm89JXAgKHZpc2libGU9JWQpIiwg
bywgISF2aXNpYmxlKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJt
ZW51YmFyLHZpc2libGUsc2V0IiwgJnZpc2libGUpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAor
ICogR2V0IG1lbnViYXIgdmlzaWJpbGl0eS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBh
cmFtIHZpc2libGUgYm9vbGVhbiBwb2ludGVyIGluIHdoaWNoIHRvIHNhdmUgdGhlIHJlc3VsdC4g
SXQgZGVmYXVsdHMKKyAqIHRvIEBjIEZBTFNFLCBpLmUuIGlmIGJyb3dzZXIgZG9lcyBubyBsaXN0
ZW4gdG8gZW1pdHRlZCBzaWduYWwsIGl0IG1lYW5zCisgKiB0aGVyZSBpcyBubyBtZW51YmFyIGFu
ZCB0aGVyZWZvcmUgaXQgaXMgbm90IHZpc2libGUuCisgKgorICogRW1pdHMgc2lnbmFsOiAibWVu
dWJhcix2aXNpYmxlLGdldCIgd2l0aCBhIHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lk
IGV3a192aWV3X21lbnViYXJfdmlzaWJsZV9nZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCog
dmlzaWJsZSkKK3sKKyAgICBEQkcoIiVzLCBvPSVwIiwgX19mdW5jX18sIG8pOworICAgICp2aXNp
YmxlID0gRUlOQV9GQUxTRTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8s
ICJtZW51YmFyLHZpc2libGUsZ2V0IiwgdmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFs
CisgKiBTZXQgdG9vbHRpcCB0ZXh0IGFuZCBkaXNwbGF5IGlmIGl0IGlzIGN1cnJlbnRseSBoaWRk
ZW4uCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSB0ZXh0IFRleHQgdG8gc2V0IHRv
b2x0aXAgdG8uCisgKgorICogRW1pdHMgc2lnbmFsOiAidG9vbHRpcCx0ZXh0LHNldCIgd2l0aCBh
IHN0cmluZy4gSWYgdG9vbHRpcCBtdXN0IGJlIGFjdHVhbGx5CisgKiByZW1vdmVkLCB0ZXh0IHdp
bGwgYmUgTlVMTCBvciAnXDAnCisgKi8KK3ZvaWQgZXdrX3ZpZXdfdG9vbHRpcF90ZXh0X3NldChF
dmFzX09iamVjdCogbywgY29uc3QgY2hhciogdGV4dCkKK3sKKyAgICBEQkcoIm89JXAgdGV4dD0l
cyIsIG8sIHRleHQpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInRv
b2x0aXAsdGV4dCxzZXQiLCAodm9pZCAqKXRleHQpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAor
ICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcgdG8gc2hvdyBv
biBjb25zb2xlLgorICogQHBhcmFtIGxpbmVOdW1iZXIgTGluZSBudW1iZXIuCisgKiBAc291cmNl
SUQgU291cmNlIGlkLgorICoKKyAqLwordm9pZCBld2tfdmlld19hZGRfY29uc29sZV9tZXNzYWdl
KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBtZXNzYWdlLCB1bnNpZ25lZCBpbnQgbGluZU51
bWJlciwgY29uc3QgY2hhciogc291cmNlSUQpCit7CisgICAgREJHKCJvPSVwIG1lc3NhZ2U9JXMg
bGluZU51bWJlcj0ldSBzb3VyY2VJRD0lcyIsIG8sIG1lc3NhZ2UsIGxpbmVOdW1iZXIsIHNvdXJj
ZUlEKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFSU5BX1NB
RkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JF
VFVSTihzZC0+YXBpLT5hZGRfY29uc29sZV9tZXNzYWdlKTsKKyAgICBzZC0+YXBpLT5hZGRfY29u
c29sZV9tZXNzYWdlKHNkLCBtZXNzYWdlLCBsaW5lTnVtYmVyLCBzb3VyY2VJRCk7Cit9CisKK3Zv
aWQgZXdrX3ZpZXdfcnVuX2phdmFzY3JpcHRfYWxlcnQoRXZhc19PYmplY3QqIG8sIEV2YXNfT2Jq
ZWN0KiBmcmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKyAgICBEQkcoIm89JXAgZnJhbWU9
JXAgbWVzc2FnZT0lcyIsIG8sIGZyYW1lLCBtZXNzYWdlKTsKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBp
KTsKKworICAgIGlmICghc2QtPmFwaS0+cnVuX2phdmFzY3JpcHRfYWxlcnQpCisgICAgICAgIHJl
dHVybjsKKworICAgIHNkLT5hcGktPnJ1bl9qYXZhc2NyaXB0X2FsZXJ0KHNkLCBmcmFtZSwgbWVz
c2FnZSk7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19ydW5famF2YXNjcmlwdF9jb25maXJtKEV2
YXNfT2JqZWN0KiBvLCBFdmFzX09iamVjdCogZnJhbWUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7
CisgICAgREJHKCJvPSVwIGZyYW1lPSVwIG1lc3NhZ2U9JXMiLCBvLCBmcmFtZSwgbWVzc2FnZSk7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAg
RUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHNkLT5hcGksIEVJTkFfRkFMU0UpOworCisg
ICAgaWYgKCFzZC0+YXBpLT5ydW5famF2YXNjcmlwdF9jb25maXJtKQorICAgICAgICByZXR1cm4g
RUlOQV9GQUxTRTsKKworICAgIHJldHVybiBzZC0+YXBpLT5ydW5famF2YXNjcmlwdF9jb25maXJt
KHNkLCBmcmFtZSwgbWVzc2FnZSk7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19ydW5famF2YXNj
cmlwdF9wcm9tcHQoRXZhc19PYmplY3QqIG8sIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hh
ciogbWVzc2FnZSwgY29uc3QgY2hhciogZGVmYXVsdFZhbHVlLCBjaGFyKiogdmFsdWUpCit7Cisg
ICAgREJHKCJvPSVwIGZyYW1lPSVwIG1lc3NhZ2U9JXMiLCBvLCBmcmFtZSwgbWVzc2FnZSk7Cisg
ICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRUlO
QV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHNkLT5hcGksIEVJTkFfRkFMU0UpOworCisgICAg
aWYgKCFzZC0+YXBpLT5ydW5famF2YXNjcmlwdF9wcm9tcHQpCisgICAgICAgIHJldHVybiBFSU5B
X0ZBTFNFOworCisgICAgcmV0dXJuIHNkLT5hcGktPnJ1bl9qYXZhc2NyaXB0X3Byb21wdChzZCwg
ZnJhbWUsIG1lc3NhZ2UsIGRlZmF1bHRWYWx1ZSwgdmFsdWUpOworfQorCisvKioKKyAqIEBpbnRl
cm5hbAorICogRGVsZWdhdGVzIHRvIGNsaWVudCB0byBkZWNpZGUgd2hldGhlciBhIHNjcmlwdCBt
dXN0IGJlIHN0b3BwZWQgYmVjYXVzZSBpdCdzCisgKiBydW5uaW5nIGZvciB0b28gbG9uZy4gSWYg
Y2xpZW50IGRvZXMgbm90IGltcGxlbWVudCBpdCwgaXQgZ29lcyB0byBkZWZhdWx0CisgKiBpbXBs
ZW1lbnRhdGlvbiwgd2hpY2ggbG9ncyBhbmQgcmV0dXJucyBFSU5BX0ZBTFNFLiBDbGllbnQgbWF5
IHJlbW92ZSBsb2cgYnkKKyAqIHNldHRpbmcgdGhpcyBmdW5jdGlvbiAwLCB3aGljaCB3aWxsIGp1
c3QgcmV0dXJuIEVJTkFfRkFMU0UuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqCisgKiBAcmV0
dXJuIEBjIEVJTkFfVFJVRSBpZiBzY3JpcHQgc2hvdWxkIGJlIHN0b3BwZWQ7IEBjIEVJTkFfRkFM
U0Ugb3RoZXJ3aXNlCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19zaG91bGRfaW50ZXJydXB0X2ph
dmFzY3JpcHQoRXZhc19PYmplY3QqIG8pCit7CisgICAgREJHKCJvPSVwIiwgbyk7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZF
VFlfT05fTlVMTF9SRVRVUk5fVkFMKHNkLT5hcGksIEVJTkFfRkFMU0UpOworCisgICAgaWYgKCFz
ZC0+YXBpLT5zaG91bGRfaW50ZXJydXB0X2phdmFzY3JpcHQpCisgICAgICAgIHJldHVybiBFSU5B
X0ZBTFNFOworCisgICAgcmV0dXJuIHNkLT5hcGktPnNob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlw
dChzZCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZl
ciB0aGUgd2ViIHNpdGUgc2hvd24gaW4gQHBhcmFtIGZyYW1lIGlzIGFza2luZyB0byBzdG9yZSBk
YXRhCisgKiB0byB0aGUgZGF0YWJhc2UgQHBhcmFtIGRhdGFiYXNlTmFtZSBhbmQgdGhlIHF1b3Rh
IGFsbG9jYXRlZCB0byB0aGF0IHdlYiBzaXRlCisgKiBpcyBleGNlZWRlZC4gQnJvd3NlciBtYXkg
dXNlIHRoaXMgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgcXVvdGEgYmVmb3JlIHRoZQorICogb3Jp
Z2luYXRpbmcgb3BlcmF0aW9uYSBmYWlscy4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBh
cmFtIGZyYW1lIFRoZSBmcmFtZSB3aG9zZSB3ZWIgcGFnZSBleGNlZWRlZCBpdHMgZGF0YWJhc2Ug
cXVvdGEuCisgKiBAcGFyYW0gZGF0YWJhc2VOYW1lIERhdGFiYXNlIG5hbWUuCisgKi8KK3ZvaWQg
ZXdrX3ZpZXdfZXhjZWVkZWRfZGF0YWJhc2VfcXVvdGEoRXZhc19PYmplY3QqIG8sIEV2YXNfT2Jq
ZWN0KiBmcmFtZSwgY29uc3QgY2hhciogZGF0YWJhc2VOYW1lKQoreworICAgIERCRygibz0lcCIs
IG8pOworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FG
RVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOKHNkLT5hcGktPmV4Y2VlZGVkX2RhdGFiYXNlX3F1b3RhKTsKKyAgICBzZC0+YXBpLT5leGNl
ZWRlZF9kYXRhYmFzZV9xdW90YShzZCwgZnJhbWUsIGRhdGFiYXNlTmFtZSk7Cit9CisKK3ZvaWQg
ZXdrX3ZpZXdfcmVwYWludChFdmFzX09iamVjdCogbywgRXZhc19Db29yZCB4LCBFdmFzX0Nvb3Jk
IHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoKQoreworICAgIERCRygibz0lcCwgcmVnaW9u
PSVkLCVkICsgJWR4JWQiLCBvLCB4LCB5LCB3LCBoKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYp
OworCisgICAgaWYgKCFwcml2LT5tYWluX2ZyYW1lLT5jb250ZW50UmVuZGVyZXIoKSkgeworICAg
ICAgICBFUlIoIm5vIG1haW4gZnJhbWUgY29udGVudCByZW5kZXJlci4iKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIF9ld2tfdmlld19yZXBhaW50X2FkZChwcml2LCB4LCB5LCB3LCBo
KTsKKyAgICBfZXdrX3ZpZXdfc21hcnRfY2hhbmdlZChzZCk7Cit9CisKK3ZvaWQgZXdrX3ZpZXdf
c2Nyb2xsKEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3JkIGR4LCBFdmFzX0Nvb3JkIGR5LCBFdmFz
X0Nvb3JkIHN4LCBFdmFzX0Nvb3JkIHN5LCBFdmFzX0Nvb3JkIHN3LCBFdmFzX0Nvb3JkIHNoLCBF
dmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5LCBFdmFzX0Nvb3JkIGN3LCBFdmFzX0Nvb3JkIGNo
LCBFaW5hX0Jvb2wgbWFpbl9mcmFtZSkKK3sKKyAgICBEQkcoIm89JXAsIGRlbHRhOiAlZCwlZCwg
c2Nyb2xsOiAlZCwlZCslZHglZCwgY2xpcDogJWQsJWQrJWR4JWQiLAorICAgICAgICBvLCBkeCwg
ZHksIHN4LCBzeSwgc3csIHNoLCBjeCwgY3ksIGN3LCBjaCk7CisKKyAgICBpZiAoKHN4ICE9IGN4
KSB8fCAoc3kgIT0gY3kpIHx8IChzdyAhPSBjdykgfHwgKHNoICE9IGNoKSkKKyAgICAgICAgV1JO
KCJzY3JvbGwgcmVnaW9uIGFuZCBjbGlwIGFyZSBkaWZmZXJlbnQhICVkLCVkKyVkeCVkIGFuZCAl
ZCwlZCslZHglZCIsCisgICAgICAgICAgICBzeCwgc3ksIHN3LCBzaCwgY3gsIGN5LCBjdywgY2gp
OworCisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2KTsKKyAgICBFSU5BX1NBRkVUWV9PTl9UUlVFX1JF
VFVSTighZHggJiYgIWR5KTsKKworICAgIF9ld2tfdmlld19zY3JvbGxfYWRkKHByaXYsIGR4LCBk
eSwgc3gsIHN5LCBzdywgc2gsIG1haW5fZnJhbWUpOworICAgIF9ld2tfdmlld19zbWFydF9jaGFu
Z2VkKHNkKTsKK30KKworV2ViQ29yZTo6UGFnZSogZXdrX3ZpZXdfY29yZV9wYWdlX2dldChjb25z
dCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAg
IHJldHVybiBwcml2LT5wYWdlOworfQorCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgZnJhbWUgZm9y
IGdpdmVuIHVybCBhbmQgb3duZXIgZWxlbWVudC4KKyAqCisgKiBFbWl0cyAiZnJhbWUsY3JlYXRl
ZCIgd2l0aCB0aGUgbmV3IGZyYW1lIG9iamVjdCBvbiBzdWNjZXNzLgorICovCitXVEY6OlBhc3NS
ZWZQdHI8V2ViQ29yZTo6RnJhbWU+IGV3a192aWV3X2ZyYW1lX2NyZWF0ZShFdmFzX09iamVjdCog
bywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25zdCBXZWJDb3JlOjpTdHJpbmcmIG5hbWUsIFdlYkNv
cmU6OkhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXJFbGVtZW50LCBjb25zdCBXZWJDb3JlOjpL
VVJMJiB1cmwsIGNvbnN0IFdlYkNvcmU6OlN0cmluZyYgcmVmZXJyZXIpCit7CisgICAgREJHKCJv
PSVwLCBmcmFtZT0lcCwgbmFtZT0lcywgb3duZXJFbGVtZW50PSVwLCB1cmw9JXMsIHJlZmVycmVy
PSVzIiwKKyAgICAgICAgbywgZnJhbWUsIG5hbWUudXRmOCgpLmRhdGEoKSwgb3duZXJFbGVtZW50
LAorICAgICAgICB1cmwucHJldHR5VVJMKCkudXRmOCgpLmRhdGEoKSwgcmVmZXJyZXIudXRmOCgp
LmRhdGEoKSk7CisKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAg
ICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworCisgICAgV1RGOjpS
ZWZQdHI8V2ViQ29yZTo6RnJhbWU+IGNmID0gX2V3a192aWV3X2NvcmVfZnJhbWVfbmV3CisgICAg
ICAgIChzZCwgcHJpdiwgb3duZXJFbGVtZW50KTsKKyAgICBpZiAoIWNmKSB7CisgICAgICAgIEVS
UigiQ291bGQgbm90IGNyZWF0ZSBjaGlsZCBjb3JlIGZyYW1lICclcyciLCBuYW1lLnV0ZjgoKS5k
YXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWV3a19mcmFtZV9j
aGlsZF9hZGQoZnJhbWUsIGNmLCBuYW1lLCB1cmwsIHJlZmVycmVyKSkgeworICAgICAgICBFUlIo
IkNvdWxkIG5vdCBjcmVhdGUgY2hpbGQgZnJhbWUgb2JqZWN0ICclcyciLCBuYW1lLnV0ZjgoKS5k
YXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBUaGUgY3JlYXRpb24g
b2YgdGhlIGZyYW1lIG1heSBoYXZlIHJlbW92ZWQgaXRzZWxmIGFscmVhZHkuCisgICAgaWYgKCFj
Zi0+cGFnZSgpIHx8ICFjZi0+dHJlZSgpIHx8ICFjZi0+dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBzZC0+Y2hhbmdlZC5mcmFtZV9yZWN0ID0gRUlOQV9UUlVFOwor
ICAgIF9ld2tfdmlld19zbWFydF9jaGFuZ2VkKHNkKTsKKworICAgIGV2YXNfb2JqZWN0X3NtYXJ0
X2NhbGxiYWNrX2NhbGwobywgImZyYW1lLGNyZWF0ZWQiLCBmcmFtZSk7CisgICAgcmV0dXJuIGNm
LnJlbGVhc2UoKTsKK30KKworV1RGOjpQYXNzUmVmUHRyPFdlYkNvcmU6OldpZGdldD4gZXdrX3Zp
ZXdfcGx1Z2luX2NyZWF0ZShFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25z
dCBXZWJDb3JlOjpJbnRTaXplJiBwbHVnaW5TaXplLCBXZWJDb3JlOjpIVE1MUGx1Z0luRWxlbWVu
dCogZWxlbWVudCwgY29uc3QgV2ViQ29yZTo6S1VSTCYgdXJsLCBjb25zdCBXVEY6OlZlY3RvcjxX
ZWJDb3JlOjpTdHJpbmc+JiBwYXJhbU5hbWVzLCBjb25zdCBXVEY6OlZlY3RvcjxXZWJDb3JlOjpT
dHJpbmc+JiBwYXJhbVZhbHVlcywgY29uc3QgV2ViQ29yZTo6U3RyaW5nJiBtaW1lVHlwZSwgYm9v
bCBsb2FkTWFudWFsbHkpCit7CisgICAgREJHKCJvPSVwLCBmcmFtZT0lcCwgc2l6ZT0lZHglZCwg
ZWxlbWVudD0lcCwgdXJsPSVzLCBtaW1lVHlwZT0lcyIsCisgICAgICAgIG8sIGZyYW1lLCBwbHVn
aW5TaXplLndpZHRoKCksIHBsdWdpblNpemUuaGVpZ2h0KCksIGVsZW1lbnQsCisgICAgICAgIHVy
bC5wcmV0dHlVUkwoKS51dGY4KCkuZGF0YSgpLCBtaW1lVHlwZS51dGY4KCkuZGF0YSgpKTsKKwor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIHNkLT5jaGFuZ2Vk
LmZyYW1lX3JlY3QgPSBFSU5BX1RSVUU7CisgICAgX2V3a192aWV3X3NtYXJ0X2NoYW5nZWQoc2Qp
OworCisgICAgcmV0dXJuIGV3a19mcmFtZV9wbHVnaW5fY3JlYXRlCisgICAgICAgIChmcmFtZSwg
cGx1Z2luU2l6ZSwgZWxlbWVudCwgdXJsLCBwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcywKKyAgICAg
ICAgIG1pbWVUeXBlLCBsb2FkTWFudWFsbHkpOworfQorCkluZGV4OiBXZWJLaXQvZWZsL2V3ay9l
d2tfdmlldy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgV2ViS2l0L2VmbC9ld2svZXdr
X3ZpZXcuaApAQCAtMCwwICsxLDQwMSBAQAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDktMjAx
MCBQcm9GVVNJT04gZW1iZWRkZWQgc3lzdGVtcworICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEw
IFNhbXN1bmcgRWxlY3Ryb25pY3MKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaWZuZGVmIGV3a192aWV3X2gKKyNkZWZpbmUgZXdr
X3ZpZXdfaAorCisjaW5jbHVkZSA8RXZhcy5oPgorI2luY2x1ZGUgPGNhaXJvLmg+CisjaW5jbHVk
ZSA8ZXdrX2hpc3RvcnkuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNl
bmRpZgorCisvKioKKyAqIEBicmllZiBXZWJLaXQgbWFpbiBzbWFydCBvYmplY3QuCisgKgorICog
VGhpcyBvYmplY3QgaXMgdGhlIGhpZ2ggbGV2ZWwgYWNjZXNzIHRvIFdlYktpdC1FRkwgYnJvd3Nl
cgorICogY29tcG9uZW50LiBJdCBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIG1haW4g
ZnJhbWUgYW5kIG90aGVyCisgKiBjcml0aWNhbCByZXNvdXJjZXMuCisgKgorICogRXZlcnkgZXdr
X3ZpZXcgaGFzIGF0IGxlYXN0IG9uZSBmcmFtZSwgY2FsbGVkICJtYWluIGZyYW1lIiBhbmQKKyAq
IHJldHJpZXZlZCB3aXRoIGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KCkuIERpcmVjdCBmcmFtZSBh
Y2Nlc3MgaXMKKyAqIG9mdGVuIGRpc2NvdXJhZ2VkLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2Ug
ZXdrX3ZpZXcgZnVuY3Rpb25zCisgKiBpbnN0ZWFkLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgc2ln
bmFscyAoc2VlIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2FkZCgpKSBhcmUgZW1pdHRlZDoK
KyAqCisgKiAgLSAicmVhZHkiLCB2b2lkOiBwYWdlIGlzIGZ1bGx5IGxvYWRlZC4KKyAqICAtICJ0
aXRsZSxjaGFuZ2VkIiwgY29uc3QgY2hhcio6IHRpdGxlIG9mIHRoZSBtYWluIGZyYW1lIGNoYW5n
ZWQuCisgKiAgLSAidXJpLGNoYW5nZWQiLCBjb25zdCBjaGFyKjogdXJpIG9mIHRoZSBtYWluIGZy
YW1lIGNoYW5nZWQuCisgKiAgLSAibG9hZCxzdGFydGVkIiwgdm9pZDogZnJhbWUgc3RhcnRlZCBs
b2FkaW5nLgorICogIC0gImxvYWQscHJvZ3Jlc3MiLCBkb3VibGUqOiBsb2FkIHByb2dyZXNzIGNo
YW5nZWQgKG92ZXJhbGwgdmFsdWUKKyAqICAgIGZyb20gMC4wIHRvIDEuMCwgY29ubmVjdCB0byBp
bmRpdmlkdWFsIGZyYW1lcyBmb3IgZmluZSBncmFpbmVkKS4KKyAqICAtICJsb2FkLGZpbmlzaGVk
IiwgY29uc3QgRXdrX0ZyYW1lX0xvYWRfRXJyb3IqOiByZXBvcnRzIGxvYWQKKyAqICAgIGZpbmlz
aGVkIGFuZCBhcyBhcmd1bWVudCBAYyBOVUxMIGlmIHN1Y2Nlc3NmdWxseSBvciBwb2ludGVyIHRv
CisgKiAgICBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIGVycm9yLgorICogIC0gImxvYWQsZXJyb3Ii
LCBjb25zdCBFd2tfRnJhbWVfTG9hZF9FcnJvcio6IHJlcG9ydHMgbG9hZCBmYWlsZWQKKyAqICAg
IGFuZCBhcyBhcmd1bWVudCBhIHBvaW50ZXIgdG8gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBlcnJv
ci4KKyAqICAtICJmcmFtZSxjcmVhdGVkIiwgRXZhc19PYmplY3QqOiB3aGVuIGZyYW1lcyBhcmUg
Y3JlYXRlZCwgdGhleSBhcmUKKyAqICAgIGVtaXR0ZWQgaW4gdGhpcyBzaWduYWwuCisgKiAgLSAi
em9vbSxhbmltYXRlZCxlbmQiLCB2b2lkOiByZXF1ZXN0ZWQgYW5pbWF0ZWQgem9vbSBpcyBmaW5p
c2hlZC4KKyAqICAtICJtZW51YmFyLHZpc2libGUsc2V0IiwgRWluYV9Cb29sOiBzZXQgbWVudWJh
ciB2aXNpYmlsaXR5LgorICogIC0gIm1lbnViYXIsdmlzaWJsZSxnZXQiLCBFaW5hX0Jvb2wgKjog
ZXhwZWN0cyBhIEBjIEVJTkFfVFJVRSBpZiBtZW51YmFyIGlzCisgKiAgICB2aXNpYmxlOyBvdGhl
cndpc2UsIEBjIEVJTkFfRkFMU0UuCisgKiAgLSAibWVudWJhcix2aXNpYmxlLHNldCIsIEVpbmFf
Qm9vbDogc2V0IG1lbnViYXIgdmlzaWJpbGl0eS4KKyAqICAtICJtZW51YmFyLHZpc2libGUsZ2V0
IiwgRWluYV9Cb29sICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgbWVudWJhciBpcworICog
ICAgdmlzaWJsZTsgQGMgRUlOQV9GQUxTRSwgb3RoZXJ3aXNlLgorICogIC0gInNjcm9sbGJhcnMs
dmlzaWJsZSxzZXQiLCBFaW5hX0Jvb2w6IHNldCBzY3JvbGxiYXJzIHZpc2liaWxpdHkuCisgKiAg
LSAic2Nyb2xsYmFycyx2aXNpYmxlLGdldCIsIEVpbmFfQm9vbCAqOiBleHBlY3RzIGEgQGMgRUlO
QV9UUlVFIGlmIHNjcm9sbGJhcnMKKyAqICAgIGFyZSB2aXNpYmxlOyBAYyBFSU5BX0ZBTFNFLCBv
dGhlcndpc2UuCisgKiAgLSAic3RhdHVzYmFyLHZpc2libGUsc2V0IiwgRWluYV9Cb29sOiBzZXQg
c3RhdHVzYmFyIHZpc2liaWxpdHkuCisgKiAgLSAic3RhdHVzYmFyLHZpc2libGUsZ2V0IiwgRWlu
YV9Cb29sICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgc3RhdHVzYmFyIGlzCisgKiAgICB2
aXNpYmxlOyBAYyBFSU5BX0ZBTFNFLCBvdGhlcndpc2UuCisgKiAgLSAidG9vbGJhcix2aXNpYmxl
LHNldCIsIEVpbmFfQm9vbDogc2V0IHRvb2xiYXIgdmlzaWJpbGl0eS4KKyAqICAtICJ0b29sYmFy
LHZpc2libGUsZ2V0IiwgRWluYV9Cb29sICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgdG9v
bGJhcgorICogICAgaXMgdmlzaWJsZTsgQGMgRUlOQV9GQUxTRSwgb3RoZXJ3aXNlLgorICogIC0g
ImxpbmssaG92ZXIsaW4iLCBjb25zdCBjaGFyICpsaW5rWzJdOiByZXBvcnRzIG1vdXNlIGlzIG92
ZXIgYSBsaW5rIGFuZCBhcworICogICAgYXJndW1lbnQgZ2l2ZXMgdGhlIHVybCBpbiBsaW5rWzBd
IGFuZCBsaW5rJ3MgdGl0bGUgaW4gbGlua1sxXS4KKyAqICAtICJsaW5rLGhvdmVyLG91dCIsIGNv
bnN0IGNoYXIgKmxpbmtbMl06IHJlcG9ydHMgbW91c2UgbW92ZWQgb3V0IGZyb20gYSBsaW5rCisg
KiAgICBhbmQgYXMgYXJndW1lbnQgZ2l2ZXMgdGhlIHVybCBpbiBsaW5rWzBdIGFuZCBsaW5rJ3Mg
dGl0bGUgaW4gbGlua1sxXS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBfRXdrX1ZpZXdfU21hcnRf
RGF0YSBFd2tfVmlld19TbWFydF9EYXRhOworCisvKioKKyAqIEV3ayB2aWV3J3MgY2xhc3MsIHRv
IGJlIG92ZXJyaWRkZW4gYnkgc3ViLWNsYXNzZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9Fd2tf
Vmlld19TbWFydF9DbGFzcyBFd2tfVmlld19TbWFydF9DbGFzczsKK3N0cnVjdCBfRXdrX1ZpZXdf
U21hcnRfQ2xhc3MgeworICAgIEV2YXNfU21hcnRfQ2xhc3Mgc2M7IC8qKjwgYWxsIGJ1dCAnZGF0
YScgaXMgZnJlZSB0byBiZSBjaGFuZ2VkLiAqLworICAgIHVuc2lnbmVkIGxvbmcgdmVyc2lvbjsK
KyAgICAvLyBob29rcyB0byBhbGxvdyBkaWZmZXJlbnQgYmFja2luZyBzdG9yZXMKKyAgICBFdmFz
X09iamVjdCAqKCpiYWNraW5nX3N0b3JlX2FkZCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QpOyAv
Kio8IG11c3QgYmUgZGVmaW5lZCAqLworICAgIEVpbmFfQm9vbCAoKnNjcm9sbHNfcHJvY2Vzcyko
RXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QpOyAvKio8IG11c3QgYmUgZGVmaW5lZCAqLworICAgIEVp
bmFfQm9vbCAoKnJlcGFpbnRzX3Byb2Nlc3MpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsgLyoq
PCBtdXN0IGJlIGRlZmluZWQgKi8KKyAgICBFaW5hX0Jvb2wgKCpjb250ZW50c19yZXNpemUpKEV3
a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBpbnQgdywgaW50IGgpOworICAgIEVpbmFfQm9vbCAoKnpv
b21fc2V0KShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgZmxvYXQgem9vbSwgRXZhc19Db29yZCBj
eCwgRXZhc19Db29yZCBjeSk7CisgICAgRWluYV9Cb29sICgqem9vbV93ZWFrX3NldCkoRXdrX1Zp
ZXdfU21hcnRfRGF0YSAqc2QsIGZsb2F0IHpvb20sIEV2YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQg
Y3kpOworICAgIHZvaWQgKCp6b29tX3dlYWtfc21vb3RoX3NjYWxlX3NldCkoRXdrX1ZpZXdfU21h
cnRfRGF0YSAqc2QsIEVpbmFfQm9vbCBzbW9vdGhfc2NhbGUpOworICAgIHZvaWQgKCpiZ19jb2xv
cl9zZXQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCB1bnNpZ25lZCBjaGFyIHIsIHVuc2lnbmVk
IGNoYXIgZywgdW5zaWduZWQgY2hhciBiLCB1bnNpZ25lZCBjaGFyIGEpOworICAgIHZvaWQgKCpm
bHVzaCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QpOworICAgIEVpbmFfQm9vbCAoKnByZV9yZW5k
ZXJfcmVnaW9uKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgRXZhc19Db29yZCB4LCBFdmFzX0Nv
b3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoLCBmbG9hdCB6b29tKTsKKyAgICB2b2lk
ICgqcHJlX3JlbmRlcl9jYW5jZWwpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICAvLyBl
dmVudCBoYW5kbGluZzoKKyAgICAvLyAgLSByZXR1cm5zIHRydWUgaWYgaGFuZGxlZAorICAgIC8v
ICAtIGlmIG92ZXJyaWRkZW4sIGhhdmUgdG8gY2FsbCBwYXJlbnQgbWV0aG9kIGlmIGRlc2lyZWQK
KyAgICBFaW5hX0Jvb2wgKCpmb2N1c19pbikoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QpOworICAg
IEVpbmFfQm9vbCAoKmZvY3VzX291dCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QpOworICAgIEVp
bmFfQm9vbCAoKm1vdXNlX3doZWVsKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgY29uc3QgRXZh
c19FdmVudF9Nb3VzZV9XaGVlbCAqZXYpOworICAgIEVpbmFfQm9vbCAoKm1vdXNlX2Rvd24pKEV3
a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBjb25zdCBFdmFzX0V2ZW50X01vdXNlX0Rvd24gKmV2KTsK
KyAgICBFaW5hX0Jvb2wgKCptb3VzZV91cCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0
IEV2YXNfRXZlbnRfTW91c2VfVXAgKmV2KTsKKyAgICBFaW5hX0Jvb2wgKCptb3VzZV9tb3ZlKShF
d2tfVmlld19TbWFydF9EYXRhICpzZCwgY29uc3QgRXZhc19FdmVudF9Nb3VzZV9Nb3ZlICpldik7
CisgICAgRWluYV9Cb29sICgqa2V5X2Rvd24pKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBjb25z
dCBFdmFzX0V2ZW50X0tleV9Eb3duICpldik7CisgICAgRWluYV9Cb29sICgqa2V5X3VwKShFd2tf
Vmlld19TbWFydF9EYXRhICpzZCwgY29uc3QgRXZhc19FdmVudF9LZXlfVXAgKmV2KTsKKworICAg
IHZvaWQgKCphZGRfY29uc29sZV9tZXNzYWdlKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgY29u
c3QgY2hhciAqbWVzc2FnZSwgdW5zaWduZWQgaW50IGxpbmVOdW1iZXIsIGNvbnN0IGNoYXIgKnNv
dXJjZUlEKTsKKyAgICB2b2lkICgqcnVuX2phdmFzY3JpcHRfYWxlcnQpKEV3a19WaWV3X1NtYXJ0
X0RhdGEgKnNkLCBFdmFzX09iamVjdCAqZnJhbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworICAg
IEVpbmFfQm9vbCAoKnJ1bl9qYXZhc2NyaXB0X2NvbmZpcm0pKEV3a19WaWV3X1NtYXJ0X0RhdGEg
KnNkLCBFdmFzX09iamVjdCAqZnJhbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOworICAgIEVpbmFf
Qm9vbCAoKnJ1bl9qYXZhc2NyaXB0X3Byb21wdCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIEV2
YXNfT2JqZWN0ICpmcmFtZSwgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqZGVmYXVs
dFZhbHVlLCBjaGFyICoqdmFsdWUpOworICAgIEVpbmFfQm9vbCAoKnNob3VsZF9pbnRlcnJ1cHRf
amF2YXNjcmlwdCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QpOworICAgIHZvaWQgKCpleGNlZWRl
ZF9kYXRhYmFzZV9xdW90YSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIEV2YXNfT2JqZWN0ICpm
cmFtZSwgY29uc3QgY2hhciAqZGF0YWJhc2VOYW1lKTsKK307CisKKyNkZWZpbmUgRVdLX1ZJRVdf
U01BUlRfQ0xBU1NfVkVSU0lPTiAxVUwgLyoqIHRoZSB2ZXJzaW9uIHlvdSBoYXZlIHRvIHB1dCBp
bnRvIHRoZSB2ZXJzaW9uIGZpZWxkIGluIHRoZSBFd2tfVmlld19TbWFydF9DbGFzcyBzdHJ1Y3R1
cmUgKi8KKworLyoqCisgKiBJbml0aWFsaXplciBmb3Igd2hvbGUgRXdrX1ZpZXdfU21hcnRfQ2xh
c3Mgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBzbWFydF9jbGFzc19pbml0IGluaXRpYWxpemVy
IHRvIHVzZSBmb3IgdGhlICJiYXNlIiBmaWVsZAorICogKEV2YXNfU21hcnRfQ2xhc3MpLgorICoK
KyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9OVUxMCisgKiBAc2VlIEVXS19WSUVX
X1NNQVJUX0NMQVNTX0lOSVRfVkVSU0lPTgorICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19J
TklUX05BTUVfVkVSU0lPTgorICovCisjZGVmaW5lIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVQo
c21hcnRfY2xhc3NfaW5pdCkge3NtYXJ0X2NsYXNzX2luaXQsIEVXS19WSUVXX1NNQVJUX0NMQVNT
X1ZFUlNJT04sIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisKKy8qKgorICogSW5pdGlhbGl6ZXIgdG8gemVy
byBhIHdob2xlIEV3a19WaWV3X1NtYXJ0X0NsYXNzIHN0cnVjdHVyZS4KKyAqCisgKiBAc2VlIEVX
S19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfVkVSU0lPTgorICogQHNlZSBFV0tfVklFV19TTUFSVF9D
TEFTU19JTklUX05BTUVfVkVSU0lPTgorICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklU
CisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9OVUxMIEVXS19WSUVXX1NN
QVJUX0NMQVNTX0lOSVQoRVZBU19TTUFSVF9DTEFTU19JTklUX05VTEwpCisKKy8qKgorICogSW5p
dGlhbGl6ZXIgdG8gemVybyBhIHdob2xlIEV3a19WaWV3X1NtYXJ0X0NsYXNzIHN0cnVjdHVyZSBh
bmQgc2V0IHZlcnNpb24uCisgKgorICogU2ltaWxhciB0byBFV0tfVklFV19TTUFSVF9DTEFTU19J
TklUX05VTEwsIGJ1dCB3aWxsIHNldCB2ZXJzaW9uIGZpZWxkIG9mCisgKiBFdmFzX1NtYXJ0X0Ns
YXNzIChiYXNlIGZpZWxkKSB0byBsYXRlc3QgRVZBU19TTUFSVF9DTEFTU19WRVJTSU9OCisgKgor
ICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05VTEwKKyAqIEBzZWUgRVdLX1ZJRVdf
U01BUlRfQ0xBU1NfSU5JVF9OQU1FX1ZFUlNJT04KKyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xB
U1NfSU5JVAorICovCisjZGVmaW5lIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfVkVSU0lPTiBF
V0tfVklFV19TTUFSVF9DTEFTU19JTklUKEVWQVNfU01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OKQor
CisvKioKKyAqIEluaXRpYWxpemVyIHRvIHplcm8gYSB3aG9sZSBFd2tfVmlld19TbWFydF9DbGFz
cyBzdHJ1Y3R1cmUgYW5kIHNldAorICogbmFtZSBhbmQgdmVyc2lvbi4KKyAqCisgKiBTaW1pbGFy
IHRvIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTlVMTCwgYnV0IHdpbGwgc2V0IHZlcnNpb24g
ZmllbGQgb2YKKyAqIEV2YXNfU21hcnRfQ2xhc3MgKGJhc2UgZmllbGQpIHRvIGxhdGVzdCBFVkFT
X1NNQVJUX0NMQVNTX1ZFUlNJT04gYW5kIG5hbWUKKyAqIHRvIHRoZSBzcGVjaWZpYyB2YWx1ZS4K
KyAqCisgKiBJdCB3aWxsIGtlZXAgYSByZWZlcmVuY2UgdG8gbmFtZSBmaWVsZCBhcyBhICJjb25z
dCBjaGFyICoiLCB0aGF0IGlzLAorICogbmFtZSBtdXN0IGJlIGF2YWlsYWJsZSB3aGlsZSB0aGUg
c3RydWN0dXJlIGlzIHVzZWQgKGhpbnQ6IHN0YXRpYyBvciBnbG9iYWwhKQorICogYW5kIHdpbGwg
bm90IGJlIG1vZGlmaWVkLgorICoKKyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9O
VUxMCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfVkVSU0lPTgorICogQHNlZSBF
V0tfVklFV19TTUFSVF9DTEFTU19JTklUCisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdfU01BUlRfQ0xB
U1NfSU5JVF9OQU1FX1ZFUlNJT04obmFtZSkgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVChFVkFT
X1NNQVJUX0NMQVNTX0lOSVRfTkFNRV9WRVJTSU9OKG5hbWUpKQorCisvKioKKyAqIEBpbnRlcm5h
bAorICoKKyAqIHByaXZhdGUgZGF0YSB0aGF0IGlzIHVzZWQgaW50ZXJuYWxseSBieSBFRkwgV2Vi
S2l0IGFuZCBzaG91bGQgbmV2ZXIKKyAqIGJlIG1vZGlmaWVkIGZyb20gb3V0c2lkZS4KKyAqLwor
dHlwZWRlZiBzdHJ1Y3QgX0V3a19WaWV3X1ByaXZhdGVfRGF0YSBFd2tfVmlld19Qcml2YXRlX0Rh
dGE7CisKKy8qKgorICogU2Nyb2xsIHJlcXVlc3QgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5
IHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0V3a19TY3Jv
bGxfUmVxdWVzdCBFd2tfU2Nyb2xsX1JlcXVlc3Q7CitzdHJ1Y3QgX0V3a19TY3JvbGxfUmVxdWVz
dCB7CisgICAgRXZhc19Db29yZCBkeCwgZHk7CisgICAgRXZhc19Db29yZCB4LCB5LCB3LCBoLCB4
MiwgeTI7CisgICAgRWluYV9Cb29sIG1haW5fc2Nyb2xsOworfTsKKworLyoqCisgKiBTdHJ1Y3R1
cmUgdG8gY29udGFpbiBpbnRlcm5hbCBWaWV3IGRhdGEsIGl0IGlzIHRvIGJlIGNvbnNpZGVyZWQK
KyAqIHByaXZhdGUgYnkgdXNlcnMsIGJ1dCBtYXkgYmUgZXh0ZW5kZWQgb3IgY2hhbmdlZCBieSBz
dWItY2xhc3NlcworICogKHRoYXQncyB3aHkgaXQncyBpbiBwdWJsaWMgaGVhZGVyIGZpbGUpLgor
ICovCitzdHJ1Y3QgX0V3a19WaWV3X1NtYXJ0X0RhdGEgeworICAgIEV2YXNfT2JqZWN0X1NtYXJ0
X0NsaXBwZWRfRGF0YSBiYXNlOworICAgIGNvbnN0IEV3a19WaWV3X1NtYXJ0X0NsYXNzICphcGk7
IC8qKjwgcmVmZXJlbmNlIHRvIGNhc3RlZCBjbGFzcyBpbnN0YW5jZSAqLworICAgIEV2YXNfT2Jq
ZWN0ICpzZWxmOyAvKio8IHJlZmVyZW5jZSB0byBvd25lciBvYmplY3QgKi8KKyAgICBFdmFzX09i
amVjdCAqbWFpbl9mcmFtZTsgLyoqPCByZWZlcmVuY2UgdG8gbWFpbiBmcmFtZSBvYmplY3QgKi8K
KyAgICBFdmFzX09iamVjdCAqYmFja2luZ19zdG9yZTsgLyoqPCByZWZlcmVuY2UgdG8gYmFja2lu
ZyBzdG9yZSAqLworICAgIEV3a19WaWV3X1ByaXZhdGVfRGF0YSAqX3ByaXY7IC8qKjwgc2hvdWxk
IG5ldmVyIGJlIGFjY2Vzc2VkLCBjKysgc3R1ZmYgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBF
dmFzX0Nvb3JkIHgsIHksIHcsIGg7IC8qKjwgbGFzdCB1c2VkIHZpZXdwb3J0ICovCisgICAgfSB2
aWV3OworICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBmbG9hdCBz
dGFydDsKKyAgICAgICAgICAgIGZsb2F0IGVuZDsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnQ7
IC8qKjwgaWYgPiAwLjAsIHRoZW4gZG9pbmcgYW5pbWF0ZWQgem9vbS4gKi8KKyAgICAgICAgfSB6
b29tOworICAgIH0gYW5pbWF0ZWRfem9vbTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25l
ZCBjaGFyIHIsIGcsIGIsIGE7CisgICAgfSBiZ19jb2xvcjsKKyAgICBFaW5hX0Jvb2wgem9vbV93
ZWFrX3Ntb290aF9zY2FsZToxOworICAgIHN0cnVjdCB7IC8qKjwgd2hhdCBjaGFuZ2VkIHNpbmNl
IGxhc3Qgc21hcnRfY2FsY3VsYXRlICovCisgICAgICAgIEVpbmFfQm9vbCBhbnk6MTsKKyAgICAg
ICAgRWluYV9Cb29sIHNpemU6MTsKKyAgICAgICAgRWluYV9Cb29sIHBvc2l0aW9uOjE7CisgICAg
ICAgIEVpbmFfQm9vbCBmcmFtZV9yZWN0OjE7CisgICAgfSBjaGFuZ2VkOworfTsKKworRUFQSSBF
aW5hX0Jvb2wgICAgZXdrX3ZpZXdfYmFzZV9zbWFydF9zZXQoRXdrX1ZpZXdfU21hcnRfQ2xhc3Mg
KmFwaSk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zaW5nbGVfc21hcnRfc2V0KEV3a19W
aWV3X1NtYXJ0X0NsYXNzICphcGkpOworCitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19zaW5n
bGVfYWRkKEV2YXMgKmUpOworCitFQVBJIHZvaWQgICAgICAgICBld2tfdmlld19maXhlZF9sYXlv
dXRfc2l6ZV9zZXQoRXZhc19PYmplY3QgKm8sIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoKTsK
K0VBUEkgdm9pZCAgICAgICAgIGV3a192aWV3X2ZpeGVkX2xheW91dF9zaXplX2dldChFdmFzX09i
amVjdCAqbywgRXZhc19Db29yZCAqdywgRXZhc19Db29yZCAqaCk7CisKK0VBUEkgdm9pZCAgICAg
ICAgIGV3a192aWV3X3RoZW1lX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqcGF0aCk7
CitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld190aGVtZV9nZXQoRXZhc19PYmplY3QgKm8pOwor
CitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19mcmFtZV9tYWluX2dldChjb25zdCBFdmFzX09i
amVjdCAqbyk7CitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19mcmFtZV9mb2N1c2VkX2dldChj
b25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3VyaV9z
ZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKnVyaSk7CitFQVBJIGNvbnN0IGNoYXIgICpl
d2tfdmlld191cmlfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgY29uc3QgY2hhciAg
KmV3a192aWV3X3RpdGxlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgRWluYV9C
b29sICAgIGV3a192aWV3X2VkaXRhYmxlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJ
IEVpbmFfQm9vbCAgICBld2tfdmlld19lZGl0YWJsZV9zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFf
Qm9vbCBlZGl0YWJsZSk7CisKK0VBUEkgdm9pZCAgICAgICAgIGV3a192aWV3X2JnX2NvbG9yX3Nl
dChFdmFzX09iamVjdCAqbywgaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEpOworRUFQSSB2b2lk
ICAgICAgICAgZXdrX3ZpZXdfYmdfY29sb3JfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvLCBpbnQg
KnIsIGludCAqZywgaW50ICpiLCBpbnQgKmEpOworCitFQVBJIGNoYXIgICAgICAgICpld2tfdmll
d19zZWxlY3Rpb25fZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAg
IGV3a192aWV3X3NlbGVjdF9ub25lKEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAg
IGV3a192aWV3X3NlbGVjdF9hbGwoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfc2VsZWN0X3BhcmFncmFwaChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9v
bCAgICBld2tfdmlld19zZWxlY3Rfc2VudGVuY2UoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5h
X0Jvb2wgICAgZXdrX3ZpZXdfc2VsZWN0X2xpbmUoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5h
X0Jvb2wgICAgZXdrX3ZpZXdfc2VsZWN0X3dvcmQoRXZhc19PYmplY3QgKm8pOworCitFQVBJIEVp
bmFfQm9vbCAgICBld2tfdmlld190ZXh0X3NlYXJjaChjb25zdCBFdmFzX09iamVjdCAqbywgY29u
c3QgY2hhciAqc3RyaW5nLCBFaW5hX0Jvb2wgY2FzZV9zZW5zaXRpdmUsIEVpbmFfQm9vbCBmb3J3
YXJkLCBFaW5hX0Jvb2wgd3JhcCk7CisKK0VBUEkgdW5zaWduZWQgaW50IGV3a192aWV3X3RleHRf
bWF0Y2hlc19tYXJrKEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFyICpzdHJpbmcsIEVpbmFfQm9v
bCBjYXNlX3NlbnNpdGl2ZSwgRWluYV9Cb29sIGhpZ2hsaWdodCwgdW5zaWduZWQgaW50IGxpbWl0
KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3RleHRfbWF0Y2hlc191bm1hcmtfYWxsKEV2
YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3RleHRfbWF0Y2hlc19o
aWdobGlnaHRfc2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgaGlnaGxpZ2h0KTsKK0VBUEkg
RWluYV9Cb29sICAgIGV3a192aWV3X3RleHRfbWF0Y2hlc19oaWdobGlnaHRfZ2V0KGNvbnN0IEV2
YXNfT2JqZWN0ICpvKTsKKworRUFQSSBkb3VibGUgICAgICAgZXdrX3ZpZXdfbG9hZF9wcm9ncmVz
c19nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d19zdG9wKEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3JlbG9h
ZChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19yZWxvYWRfZnVs
bChFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X2JhY2soRXZh
c19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfZm9yd2FyZChFdmFzX09i
amVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19uYXZpZ2F0ZShFdmFzX09iamVj
dCAqbywgaW50IHN0ZXBzKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfYmFja19wb3Nz
aWJsZShFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19mb3J3YXJk
X3Bvc3NpYmxlKEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X25h
dmlnYXRlX3Bvc3NpYmxlKEV2YXNfT2JqZWN0ICpvLCBpbnQgc3RlcHMpOworCitFQVBJIEVpbmFf
Qm9vbCAgICBld2tfdmlld19oaXN0b3J5X2VuYWJsZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8p
OworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfc2V0KEV2YXNfT2Jq
ZWN0ICpvLCBFaW5hX0Jvb2wgZW5hYmxlKTsKK0VBUEkgRXdrX0hpc3RvcnkgKmV3a192aWV3X2hp
c3RvcnlfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKKworRUFQSSBmbG9hdCAgICAgICAgZXdr
X3ZpZXdfem9vbV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfem9vbV9zZXQoRXZhc19PYmplY3QgKm8sIGZsb2F0IHpvb20sIEV2YXNfQ29vcmQg
Y3gsIEV2YXNfQ29vcmQgY3kpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld196b29tX3dl
YWtfc21vb3RoX3NjYWxlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIHZvaWQgICAg
ICAgICBld2tfdmlld196b29tX3dlYWtfc21vb3RoX3NjYWxlX3NldChFdmFzX09iamVjdCAqbywg
RWluYV9Cb29sIHNtb290aF9zY2FsZSk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pv
b21fd2Vha19zZXQoRXZhc19PYmplY3QgKm8sIGZsb2F0IHpvb20sIEV2YXNfQ29vcmQgY3gsIEV2
YXNfQ29vcmQgY3kpOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9t
YXJrX3N0YXJ0KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tKTsKK0VBUEkgRWluYV9Cb29sICAg
IGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19lbmQoRXZhc19PYmplY3QgKm8sIGZsb2F0IHpv
b20pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJl
bnQoRXZhc19PYmplY3QgKm8sIGZsb2F0IHpvb20pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3AoRXZhc19PYmplY3QgKm8pOworCitFQVBJIEVpbmFf
Qm9vbCAgICBld2tfdmlld196b29tX2FuaW1hdGVkX3NldChFdmFzX09iamVjdCAqbywgZmxvYXQg
em9vbSwgZmxvYXQgZHVyYXRpb24sIEV2YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpOworRUFQ
SSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfem9vbV90ZXh0X29ubHlfZ2V0KGNvbnN0IEV2YXNfT2Jq
ZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fdGV4dF9vbmx5X3NldChF
dmFzX09iamVjdCAqbywgRWluYV9Cb29sIHNldHRpbmcpOworCitFQVBJIEVpbmFfQm9vbCAgICBl
d2tfdmlld19wcmVfcmVuZGVyX3JlZ2lvbihFdmFzX09iamVjdCAqbywgRXZhc19Db29yZCB4LCBF
dmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoLCBmbG9hdCB6b29tKTsKK0VB
UEkgdm9pZCAgICAgICAgIGV3a192aWV3X3ByZV9yZW5kZXJfY2FuY2VsKEV2YXNfT2JqZWN0ICpv
KTsKKworLyogc2V0dGluZ3MgKi8KK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdf
dXNlcl9hZ2VudF9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfc2V0dGluZ191c2VyX2FnZW50X3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hh
ciAqdXNlcl9hZ2VudCk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfYXV0
b19sb2FkX2ltYWdlc19nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wg
ICAgZXdrX3ZpZXdfc2V0dGluZ19hdXRvX2xvYWRfaW1hZ2VzX3NldChFdmFzX09iamVjdCAqbywg
RWluYV9Cb29sIGF1dG9tYXRpYyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRp
bmdfYXV0b19zaHJpbmtfaW1hZ2VzX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVp
bmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2F1dG9fc2hyaW5rX2ltYWdlc19zZXQoRXZhc19P
YmplY3QgKm8sIEVpbmFfQm9vbCBhdXRvbWF0aWMpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tf
dmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitF
QVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX3NldChFdmFz
X09iamVjdCAqbywgRWluYV9Cb29sIGVuYWJsZSk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192
aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VB
UEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNfc2V0KEV2YXNf
T2JqZWN0ICpvLCBFaW5hX0Jvb2wgZW5hYmxlKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfc2V0dGluZ19zY3JpcHRzX3dpbmRvd19vcGVuX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7
CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX3NjcmlwdHNfd2luZG93X29wZW5f
c2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgYWxsb3cpOworCitFQVBJIEVpbmFfQm9vbCAg
ICBld2tfdmlld19zZXR0aW5nX3Jlc2l6YWJsZV90ZXh0YXJlYXNfZ2V0KGNvbnN0IEV2YXNfT2Jq
ZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfcmVzaXphYmxlX3Rl
eHRhcmVhc19zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlbmFibGUpOworCitFQVBJIGNv
bnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX3VzZXJfc3R5bGVzaGVldF9nZXQoY29uc3QgRXZh
c19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ191c2VyX3N0
eWxlc2hlZXRfc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFyICp1cmkpOworCitFQVBJIEVp
bmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX3ByaXZhdGVfYnJvd3NpbmdfZ2V0KGNvbnN0IEV2
YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfcHJpdmF0
ZV9icm93c2luZ19zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlbmFibGUpOworCitFQVBJ
IEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2NhcmV0X2Jyb3dzaW5nX2dldChjb25zdCBF
dmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2NhcmV0
X2Jyb3dzaW5nX3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGVuYWJsZSk7CisKK0VBUEkg
Y29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVsdF9nZXQoY29uc3Qg
RXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmNv
ZGluZ19kZWZhdWx0X3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqZW5jb2RpbmcpOwor
CitFQVBJIGludCAgICAgICAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9zaXplX2dl
dChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0
aW5nX2ZvbnRfbWluaW11bV9zaXplX3NldChFdmFzX09iamVjdCAqbywgaW50IHNpemUpOworRUFQ
SSBpbnQgICAgICAgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fbG9naWNhbF9zaXpl
X2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19z
ZXR0aW5nX2ZvbnRfbWluaW11bV9sb2dpY2FsX3NpemVfc2V0KEV2YXNfT2JqZWN0ICpvLCBpbnQg
c2l6ZSk7CitFQVBJIGludCAgICAgICAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfZGVmYXVsdF9z
aXplX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d19zZXR0aW5nX2ZvbnRfZGVmYXVsdF9zaXplX3NldChFdmFzX09iamVjdCAqbywgaW50IHNpemUp
OworRUFQSSBpbnQgICAgICAgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9zaXpl
X2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19z
ZXR0aW5nX2ZvbnRfbW9ub3NwYWNlX3NpemVfc2V0KEV2YXNfT2JqZWN0ICpvLCBpbnQgc2l6ZSk7
CisKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFyZF9nZXQo
Y29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGlu
Z19mb250X3N0YW5kYXJkX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqZmFtaWx5KTsK
KworRUFQSSBjb25zdCBjaGFyICAqZXdrX3ZpZXdfc2V0dGluZ19mb250X2N1cnNpdmVfZ2V0KGNv
bnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdf
Zm9udF9jdXJzaXZlX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqZmFtaWx5KTsKKwor
RUFQSSBjb25zdCBjaGFyICAqZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9nZXQoY29u
c3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19m
b250X21vbm9zcGFjZV9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWlseSk7CisK
K0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9mYW50YXN5X2dldChjb25z
dCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2Zv
bnRfZmFudGFzeV9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWlseSk7CisKK0VB
UEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9zZXJpZl9nZXQoY29uc3QgRXZh
c19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X3Nl
cmlmX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqZmFtaWx5KTsKKworRUFQSSBjb25z
dCBjaGFyICAqZXdrX3ZpZXdfc2V0dGluZ19mb250X3NhbnNfc2VyaWZfZ2V0KGNvbnN0IEV2YXNf
T2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zYW5z
X3NlcmlmX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqZmFtaWx5KTsKKworLyogdG8g
YmUgdXNlZCBieSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbnMgKi8KK0VBUEkgRXdrX1ZpZXdfU21h
cnRfRGF0YSAqZXdrX3ZpZXdfc21hcnRfZGF0YV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOwor
CitFQVBJIGNvbnN0IEVpbmFfUmVjdGFuZ2xlICpld2tfdmlld19yZXBhaW50c19nZXQoY29uc3Qg
RXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2LCBzaXplX3QgKmNvdW50KTsKK0VBUEkgY29uc3Qg
RXdrX1Njcm9sbF9SZXF1ZXN0ICpld2tfdmlld19zY3JvbGxfcmVxdWVzdHNfZ2V0KGNvbnN0IEV3
a19WaWV3X1ByaXZhdGVfRGF0YSAqcHJpdiwgc2l6ZV90ICpjb3VudCk7CisKK0VBUEkgdm9pZCBl
d2tfdmlld19yZXBhaW50X2FkZChFd2tfVmlld19Qcml2YXRlX0RhdGEgKnByaXYsIEV2YXNfQ29v
cmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCk7CisKK0VBUEkg
dm9pZCBld2tfdmlld19sYXlvdXRfaWZfbmVlZGVkX3JlY3Vyc2l2ZShFd2tfVmlld19Qcml2YXRl
X0RhdGEgKnByaXYpOworCitFQVBJIHZvaWQgZXdrX3ZpZXdfc2Nyb2xsc19wcm9jZXNzKEV3a19W
aWV3X1NtYXJ0X0RhdGEgKnNkKTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdGhhdCBrZWVwcyBwYWlu
dCBjb250ZXh0LgorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQg
anVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBv
d24gYmFja2luZyBzdG9yZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0V3a19WaWV3X1BhaW50X0Nv
bnRleHQgRXdrX1ZpZXdfUGFpbnRfQ29udGV4dDsKKworRUFQSSBFd2tfVmlld19QYWludF9Db250
ZXh0ICpld2tfdmlld19wYWludF9jb250ZXh0X25ldyhFd2tfVmlld19Qcml2YXRlX0RhdGEgKnBy
aXYsIGNhaXJvX3QgKmNyKTsKK0VBUEkgdm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X2ZyZWUo
RXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCk7CisKK0VBUEkgdm9pZCBld2tfdmlld19wYWlu
dF9jb250ZXh0X3NhdmUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCk7CitFQVBJIHZvaWQg
ZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9yZXN0b3JlKEV3a19WaWV3X1BhaW50X0NvbnRleHQgKmN0
eHQpOworRUFQSSB2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfY2xpcChFd2tfVmlld19QYWlu
dF9Db250ZXh0ICpjdHh0LCBjb25zdCBFaW5hX1JlY3RhbmdsZSAqYXJlYSk7CitFQVBJIHZvaWQg
ZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9wYWludChFd2tfVmlld19QYWludF9Db250ZXh0ICpjdHh0
LCBjb25zdCBFaW5hX1JlY3RhbmdsZSAqYXJlYSk7CitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRf
Y29udGV4dF9wYWludF9jb250ZW50cyhFd2tfVmlld19QYWludF9Db250ZXh0ICpjdHh0LCBjb25z
dCBFaW5hX1JlY3RhbmdsZSAqYXJlYSk7CitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4
dF9zY2FsZShFd2tfVmlld19QYWludF9Db250ZXh0ICpjdHh0LCBmbG9hdCBzY2FsZV94LCBmbG9h
dCBzY2FsZV95KTsKK0VBUEkgdm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X3RyYW5zbGF0ZShF
d2tfVmlld19QYWludF9Db250ZXh0ICpjdHh0LCBmbG9hdCB4LCBmbG9hdCB5KTsKKworRUFQSSBF
aW5hX0Jvb2wgZXdrX3ZpZXdfcGFpbnQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2LCBjYWly
b190ICpjciwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEpOworRUFQSSBFaW5hX0Jvb2wgZXdr
X3ZpZXdfcGFpbnRfY29udGVudHMoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2LCBjYWlyb190
ICpjciwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEpOworCisjaWZkZWYgX19jcGx1c3BsdXMK
K30KKyNlbmRpZgorI2VuZGlmIC8vIGV3a192aWV3X2gK
</data>
<flag name="review"
          id="33442"
          type_id="1"
          status="-"
          setter="gustavo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51927</attachid>
            <date>2010-03-29 10:38:12 -0700</date>
            <delta_ts>2010-03-29 11:08:05 -0700</delta_ts>
            <desc>Add ewk_view to WK/efl/ewk.</desc>
            <filename>webkit-efl-webkit_efl_ewk-1.diff</filename>
            <type>text/plain</type>
            <size>143263</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L0NoYW5nZUxvZwor
KysgV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDEwLTAzLTI5ICBMZWFuZHJv
IFBlcmVpcmEgIDxsZWFuZHJvQHByb2Z1c2lvbi5tb2JpPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBld2tfdmlldyAodGhlIGhpZ2ggbGV2ZWwg
b2JqZWN0IHRvIGFjY2VzcyB0aGUgV2ViS2l0LUVGTCBicm93c2VyCisgICAgICAgIGNvbXBvbmVu
dCkgdG8gZWZsL2V3ay4KKyAgICAgICAgaHR0cDovL3dlYmtpdC5vcmcvYi8zNTkzMgorCisgICAg
ICAgICogZWZsL2V3ay9ld2tfdmlldy5jcHA6IEFkZGVkLgorICAgICAgICAqIGVmbC9ld2svZXdr
X3ZpZXcuaDogQWRkZWQuCisKIDIwMTAtMDMtMjggIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBh
cHBsZS5jb20+CiAKICAgICAgICAgQnVpbGQgZml4LiBJbmNsdWRlIFdpbmRvd3NLZXlib2FyZENv
ZGVzLmggaW5zdGVhZCBvZiBLZXlib2FyZENvZGVzLmguCkluZGV4OiBXZWJLaXQvZWZsL2V3ay9l
d2tfdmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBXZWJLaXQvZWZsL2V3ay9l
d2tfdmlldy5jcHAKQEAgLTAsMCArMSwzNjQ1IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAw
OS0yMDEwIFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCisgICAgQ29weXJpZ2h0IChDKSAyMDA5
LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
ICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJld2tfdmlldy5oIgorCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50RWZsLmgiCisjaW5jbHVk
ZSAiQ29udGV4dE1lbnVDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgor
I2luY2x1ZGUgIkRyYWdDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnRFZmwuaCIK
KyNpbmNsdWRlICJFV2ViS2l0LmgiCisjaW5jbHVkZSAiRWRpdG9yQ2xpZW50RWZsLmgiCisjaW5j
bHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRFZmwu
aCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJQb3B1cE1lbnVDbGll
bnQuaCIKKyNpbmNsdWRlICJQcm9ncmVzc1RyYWNrZXIuaCIKKyNpbmNsdWRlICJld2tfcHJpdmF0
ZS5oIgorCisjaW5jbHVkZSA8RWNvcmUuaD4KKyNpbmNsdWRlIDxFaW5hLmg+CisjaW5jbHVkZSA8
RXZhcy5oPgorI2luY2x1ZGUgPGVpbmFfc2FmZXR5X2NoZWNrcy5oPgorI2luY2x1ZGUgPHN5cy90
aW1lLmg+CisKKyNkZWZpbmUgWk9PTV9NSU4gKDAuMDUpCisjZGVmaW5lIFpPT01fTUFYICg0LjAp
CisKK3N0YXRpYyBjb25zdCBjaGFyIEVXS19WSUVXX1RZUEVfU1RSW10gPSAiRVdLX1ZpZXciOwor
CitzdGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVXX1JFUEFJTlRTX1NJWkVfSU5JVElBTCA9IDMy
Oworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklFV19SRVBBSU5UU19TSVpFX1NURVAgPSA4Owor
c3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklFV19SRVBBSU5UU19TSVpFX01BWF9GUkVFID0gNjQ7
CisKK3N0YXRpYyBjb25zdCBzaXplX3QgRVdLX1ZJRVdfU0NST0xMU19TSVpFX0lOSVRJQUwgPSA4
Oworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklFV19TQ1JPTExTX1NJWkVfU1RFUCA9IDI7Citz
dGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVXX1NDUk9MTFNfU0laRV9NQVhfRlJFRSA9IDMyOwor
CitzdHJ1Y3QgX0V3a19WaWV3X1ByaXZhdGVfRGF0YSB7CisgICAgV2ViQ29yZTo6UGFnZSogcGFn
ZTsKKyAgICBXZWJDb3JlOjpTZXR0aW5ncyogcGFnZV9zZXR0aW5nczsKKyAgICBXZWJDb3JlOjpG
cmFtZSogbWFpbl9mcmFtZTsKKyAgICBFd2tfSGlzdG9yeSogaGlzdG9yeTsKKyAgICBzdHJ1Y3Qg
eworICAgICAgICBFd2tfTWVudSBtZW51OworICAgICAgICBXZWJDb3JlOjpQb3B1cE1lbnVDbGll
bnQqIG1lbnVfY2xpZW50OworICAgIH0gcG9wdXA7CisgICAgc3RydWN0IHsKKyAgICAgICAgRWlu
YV9SZWN0YW5nbGUqIGFycmF5OworICAgICAgICBzaXplX3QgY291bnQ7CisgICAgICAgIHNpemVf
dCBhbGxvY2F0ZWQ7CisgICAgfSByZXBhaW50czsKKyAgICBzdHJ1Y3QgeworICAgICAgICBFd2tf
U2Nyb2xsX1JlcXVlc3QqIGFycmF5OworICAgICAgICBzaXplX3QgY291bnQ7CisgICAgICAgIHNp
emVfdCBhbGxvY2F0ZWQ7CisgICAgfSBzY3JvbGxzOworICAgIHN0cnVjdCB7CisgICAgICAgIGNv
bnN0IGNoYXIqIHVzZXJfYWdlbnQ7CisgICAgICAgIGNvbnN0IGNoYXIqIHVzZXJfc3R5bGVzaGVl
dDsKKyAgICAgICAgY29uc3QgY2hhciogZW5jb2RpbmdfZGVmYXVsdDsKKyAgICAgICAgY29uc3Qg
Y2hhciogZW5jb2RpbmdfY3VzdG9tOworICAgICAgICBpbnQgZm9udF9taW5pbXVtX3NpemU7Cisg
ICAgICAgIGludCBmb250X21pbmltdW1fbG9naWNhbF9zaXplOworICAgICAgICBpbnQgZm9udF9k
ZWZhdWx0X3NpemU7CisgICAgICAgIGludCBmb250X21vbm9zcGFjZV9zaXplOworICAgICAgICBj
b25zdCBjaGFyKiBmb250X3N0YW5kYXJkOworICAgICAgICBjb25zdCBjaGFyKiBmb250X2N1cnNp
dmU7CisgICAgICAgIGNvbnN0IGNoYXIqIGZvbnRfbW9ub3NwYWNlOworICAgICAgICBjb25zdCBj
aGFyKiBmb250X2ZhbnRhc3k7CisgICAgICAgIGNvbnN0IGNoYXIqIGZvbnRfc2VyaWY7CisgICAg
ICAgIGNvbnN0IGNoYXIqIGZvbnRfc2Fuc19zZXJpZjsKKyAgICAgICAgRWluYV9Cb29sIGF1dG9f
bG9hZF9pbWFnZXM6MTsKKyAgICAgICAgRWluYV9Cb29sIGF1dG9fc2hyaW5rX2ltYWdlczoxOwor
ICAgICAgICBFaW5hX0Jvb2wgZW5hYmxlX3NjcmlwdHM6MTsKKyAgICAgICAgRWluYV9Cb29sIGVu
YWJsZV9wbHVnaW5zOjE7CisgICAgICAgIEVpbmFfQm9vbCBzY3JpcHRzX3dpbmRvd19vcGVuOjE7
CisgICAgICAgIEVpbmFfQm9vbCByZXNpemFibGVfdGV4dGFyZWFzOjE7CisgICAgICAgIEVpbmFf
Qm9vbCBwcml2YXRlX2Jyb3dzaW5nOjE7CisgICAgICAgIEVpbmFfQm9vbCBjYXJldF9icm93c2lu
ZzoxOworICAgIH0gc2V0dGluZ3M7CisgICAgc3RydWN0IHsKKyAgICAgICAgc3RydWN0IHsKKyAg
ICAgICAgICAgIGRvdWJsZSBzdGFydDsKKyAgICAgICAgICAgIGRvdWJsZSBlbmQ7CisgICAgICAg
ICAgICBkb3VibGUgZHVyYXRpb247CisgICAgICAgIH0gdGltZTsKKyAgICAgICAgc3RydWN0IHsK
KyAgICAgICAgICAgIGZsb2F0IHN0YXJ0OworICAgICAgICAgICAgZmxvYXQgZW5kOworICAgICAg
ICAgICAgZmxvYXQgcmFuZ2U7CisgICAgICAgIH0gem9vbTsKKyAgICAgICAgc3RydWN0IHsKKyAg
ICAgICAgICAgIEV2YXNfQ29vcmQgeCwgeTsKKyAgICAgICAgfSBjZW50ZXI7CisgICAgICAgIEVj
b3JlX0FuaW1hdG9yKiBhbmltYXRvcjsKKyAgICB9IGFuaW1hdGVkX3pvb207CisgICAgc3RydWN0
IHsKKyAgICAgICAgRXZhc19Db29yZCB3LCBoOworICAgICAgICBFaW5hX0Jvb2wgdXNlOjE7Cisg
ICAgfSBmaXhlZF9sYXlvdXQ7Cit9OworCisjaWZuZGVmIEVXS19UWVBFX0NIRUNLCisjZGVmaW5l
IEVXS19WSUVXX1RZUEVfQ0hFQ0sobywgLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZWxzZQorI2Rl
ZmluZSBFV0tfVklFV19UWVBFX0NIRUNLKG8sIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBjaGFyKiBfdG1w
X290eXBlID0gZXZhc19vYmplY3RfdHlwZV9nZXQobyk7ICAgICAgICAgICAgICAgXAorICAgICAg
ICBjb25zdCBFdmFzX1NtYXJ0KiBfdG1wX3MgPSBldmFzX29iamVjdF9zbWFydF9zbWFydF9nZXQo
byk7ICAgICAgXAorICAgICAgICBpZiAoRUlOQV9VTkxJS0VMWSghX3RtcF9zKSkgeyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRUlOQV9MT0dfQ1JJVCAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAg
ICAgICAgICgiJXAgKCVzKSBpcyBub3QgYSBzbWFydCBvYmplY3QhIiwgbywgICAgICAgICAgICAg
ICAgICAgXAorICAgICAgICAgICAgICAgICBfdG1wX290eXBlID8gX3RtcF9vdHlwZSA6ICIobnVs
bCkiKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIF9fVkFfQVJHU19f
OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgICBjb25zdCBFdmFzX1NtYXJ0X0NsYXNzKiBfdG1wX3NjID0gZXZhc19zbWFy
dF9jbGFzc19nZXQoX3RtcF9zKTsgXAorICAgICAgICBpZiAoRUlOQV9VTkxJS0VMWSghX3RtcF9z
YykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRUlO
QV9MT0dfQ1JJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICAgICAgICAgICAgICAgICgiJXAgKCVzKSBpcyBub3QgYSBzbWFydCBvYmplY3QhIiwgbywg
ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBfdG1wX290eXBlID8gX3RtcF9v
dHlwZSA6ICIobnVsbCkiKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJu
IF9fVkFfQVJHU19fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoRUlOQV9VTkxJS0VMWShfdG1wX3NjLT5kYXRh
ICE9IEVXS19WSUVXX1RZUEVfU1RSKSkgeyAgICAgICAgXAorICAgICAgICAgICAgRUlOQV9MT0df
Q1JJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAg
ICAgICAgICAgICAgICgiJXAgKCVzKSBpcyBub3Qgb2YgYW4gZXdrX3ZpZXcgKG5lZWQgJXAsIGdv
dCAlcCkhIiwgICAgXAorICAgICAgICAgICAgICAgICBvLCBfdG1wX290eXBlID8gX3RtcF9vdHlw
ZSA6ICIobnVsbCkiLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBFV0tfVklF
V19UWVBFX1NUUiwgX3RtcF9zYy0+ZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAg
ICAgICAgcmV0dXJuIF9fVkFfQVJHU19fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKwor
I2RlZmluZSBFV0tfVklFV19TRF9HRVQobywgcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBwdHIgPSAoRXdrX1ZpZXdfU21hcnRf
RGF0YSopZXZhc19vYmplY3Rfc21hcnRfZGF0YV9nZXQobykKKworI2RlZmluZSBFV0tfVklFV19T
RF9HRVRfT1JfUkVUVVJOKG8sIHB0ciwgLi4uKSAgICAgICAgICBcCisgICAgRVdLX1ZJRVdfVFlQ
RV9DSEVDSyhvLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgIFwKKyAgICBFV0tfVklFV19T
RF9HRVQobywgcHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcHRy
KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENS
SVRJQ0FMKCJubyBzbWFydCBkYXRhIGZvciBvYmplY3QgJXAgKCVzKSIsICAgIFwKKyAgICAgICAg
ICAgICAgICAgbywgZXZhc19vYmplY3RfdHlwZV9nZXQobykpOyAgICAgICAgICAgXAorICAgICAg
ICByZXR1cm4gX19WQV9BUkdTX187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAg
fQorCisjZGVmaW5lIEVXS19WSUVXX1BSSVZfR0VUKHNkLCBwdHIpICAgICAgICAgICAgICBcCisg
ICAgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwdHIgPSBzZC0+X3ByaXYKKworI2RlZmluZSBFV0tf
VklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHB0ciwgLi4uKSAgICAgICAgICAgICAgIFwKKyAg
ICBFV0tfVklFV19QUklWX0dFVChzZCwgcHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgaWYgKCFwdHIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgICAgICBDUklUSUNBTCgibm8gcHJpdmF0ZSBkYXRhIGZvciBv
YmplY3QgJXAgKCVzKSIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgc2QtPnNlbGYsIGV2
YXNfb2JqZWN0X3R5cGVfZ2V0KHNkLT5zZWxmKSk7ICAgICBcCisgICAgICAgIHJldHVybiBfX1ZB
X0FSR1NfXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKwor
c3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2NoYW5nZWQoRXdrX1ZpZXdfU21hcnRfRGF0YSog
c2QpCit7CisgICAgaWYgKHNkLT5jaGFuZ2VkLmFueSkKKyAgICAgICAgcmV0dXJuOworICAgIHNk
LT5jaGFuZ2VkLmFueSA9IEVJTkFfVFJVRTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jaGFuZ2Vk
KHNkLT5zZWxmKTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfcmVwYWludHNfcmVz
aXplKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgc2l6ZV90IHNpemUpCit7CisgICAgdm9p
ZCogdG1wID0gcmVhbGxvYyhwcml2LT5yZXBhaW50cy5hcnJheSwgc2l6ZSAqIHNpemVvZihFaW5h
X1JlY3RhbmdsZSkpOworICAgIGlmICghdG1wKSB7CisgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBu
b3QgcmVhbGxvYyByZXBhaW50cyBhcnJheSB0byAlenUgZWxlbWVudHMuIiwgc2l6ZSk7CisgICAg
ICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0KKyAgICBwcml2LT5yZXBhaW50cy5hbGxvY2F0
ZWQgPSBzaXplOworICAgIHByaXYtPnJlcGFpbnRzLmFycmF5ID0gKEVpbmFfUmVjdGFuZ2xlKil0
bXA7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3Jl
cGFpbnRfYWRkKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgRXZhc19Db29yZCB4LCBFdmFz
X0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoKQoreworICAgIEVpbmFfUmVjdGFu
Z2xlKiByOworCisgICAgLy8gZnByaW50ZihzdGRlcnIsICI+Pj4gcmVwYWludCByZXF1ZXN0ZWQ6
ICVkLCVkKyVkeCVkXG4iLCB4LCB5LCB3LCBoKTsKKyAgICBpZiAocHJpdi0+cmVwYWludHMuYWxs
b2NhdGVkID09IHByaXYtPnJlcGFpbnRzLmNvdW50KSB7CisgICAgICAgIHNpemVfdCBzaXplOwor
ICAgICAgICBpZiAoIXByaXYtPnJlcGFpbnRzLmFsbG9jYXRlZCkKKyAgICAgICAgICAgIHNpemUg
PSBFV0tfVklFV19SRVBBSU5UU19TSVpFX0lOSVRJQUw7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIHNpemUgPSBwcml2LT5yZXBhaW50cy5hbGxvY2F0ZWQgKyBFV0tfVklFV19SRVBBSU5UU19T
SVpFX1NURVA7CisgICAgICAgIGlmICghX2V3a192aWV3X3JlcGFpbnRzX3Jlc2l6ZShwcml2LCBz
aXplKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByID0gcHJpdi0+cmVwYWlu
dHMuYXJyYXkgKyBwcml2LT5yZXBhaW50cy5jb3VudDsKKyAgICBwcml2LT5yZXBhaW50cy5jb3Vu
dCsrOworCisgICAgci0+eCA9IHg7CisgICAgci0+eSA9IHk7CisgICAgci0+dyA9IHc7CisgICAg
ci0+aCA9IGg7CisKKyAgICBEQkcoImFkZCByZXBhaW50ICVkLCVkKyVkeCVkIiwgeCwgeSwgdywg
aCk7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19yZXBhaW50c19mbHVzaChFd2tfVmlld19Q
cml2YXRlX0RhdGEqIHByaXYpCit7CisgICAgcHJpdi0+cmVwYWludHMuY291bnQgPSAwOworICAg
IGlmIChwcml2LT5yZXBhaW50cy5hbGxvY2F0ZWQgPD0gRVdLX1ZJRVdfUkVQQUlOVFNfU0laRV9N
QVhfRlJFRSkKKyAgICAgICAgcmV0dXJuOworICAgIF9ld2tfdmlld19yZXBhaW50c19yZXNpemUo
cHJpdiwgRVdLX1ZJRVdfUkVQQUlOVFNfU0laRV9NQVhfRlJFRSk7Cit9CisKK3N0YXRpYyBFaW5h
X0Jvb2wgX2V3a192aWV3X3Njcm9sbHNfcmVzaXplKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJp
diwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCogdG1wID0gcmVhbGxvYyhwcml2LT5zY3JvbGxz
LmFycmF5LCBzaXplICogc2l6ZW9mKEV3a19TY3JvbGxfUmVxdWVzdCkpOworICAgIGlmICghdG1w
KSB7CisgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBub3QgcmVhbGxvYyBzY3JvbGxzIGFycmF5IHRv
ICV6dSBlbGVtZW50cy4iLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAg
fQorICAgIHByaXYtPnNjcm9sbHMuYWxsb2NhdGVkID0gc2l6ZTsKKyAgICBwcml2LT5zY3JvbGxz
LmFycmF5ID0gKEV3a19TY3JvbGxfUmVxdWVzdCopdG1wOworICAgIHJldHVybiBFSU5BX1RSVUU7
Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zY3JvbGxfYWRkKEV3a19WaWV3X1ByaXZhdGVf
RGF0YSogcHJpdiwgRXZhc19Db29yZCBkeCwgRXZhc19Db29yZCBkeSwgRXZhc19Db29yZCB4LCBF
dmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoLCBFaW5hX0Jvb2wgbWFpbl9z
Y3JvbGwpCit7CisgICAgRXdrX1Njcm9sbF9SZXF1ZXN0KiByOworICAgIEV3a19TY3JvbGxfUmVx
dWVzdCogcl9lbmQ7CisgICAgRXZhc19Db29yZCB4MiA9IHggKyB3LCB5MiA9IHkgKyBoOworCisg
ICAgciA9IHByaXYtPnNjcm9sbHMuYXJyYXk7CisgICAgcl9lbmQgPSByICsgcHJpdi0+c2Nyb2xs
cy5jb3VudDsKKyAgICBmb3IgKDsgciA8IHJfZW5kOyByKyspIHsKKyAgICAgICAgaWYgKHItPngg
PT0geCAmJiByLT55ID09IHkgJiYgci0+dyA9PSB3ICYmIHItPmggPT0gaCkgeworICAgICAgICAg
ICAgREJHKCJyZWdpb24gYWxyZWFkeSBzY3JvbGxlZCAlZCwlZCslZHglZCAlKzAzZCwlKzAzZCBh
ZGQgIgorICAgICAgICAgICAgICAgICIlKzAzZCwlKzAzZCIsCisgICAgICAgICAgICAgICAgci0+
eCwgci0+eSwgci0+dywgci0+aCwgci0+ZHgsIHItPmR5LCBkeCwgZHkpOworICAgICAgICAgICAg
ci0+ZHggKz0gZHg7CisgICAgICAgICAgICByLT5keSArPSBkeTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHggPD0gci0+eCAmJiB4MiA+PSByLT54MikgJiYg
KHkgPD0gci0+eSAmJiB5MiA+PSByLT55MikpIHsKKyAgICAgICAgICAgIERCRygib2xkIHZpZXdw
b3J0ICglZCwlZCslZHglZCAlKzAzZCwlKzAzZCkgd2FzIHNjcm9sbGVkIGl0c2VsZiwgIgorICAg
ICAgICAgICAgICAgICJhZGQgJSswM2QsJSswM2QiLAorICAgICAgICAgICAgICAgIHItPngsIHIt
PnksIHItPncsIHItPmgsIHItPmR4LCByLT5keSwgZHgsIGR5KTsKKyAgICAgICAgICAgIHItPngg
Kz0gZHg7CisgICAgICAgICAgICByLT55ICs9IGR5OworICAgICAgICB9CisgICAgfQorCisgICAg
aWYgKHByaXYtPnNjcm9sbHMuYWxsb2NhdGVkID09IHByaXYtPnNjcm9sbHMuY291bnQpIHsKKyAg
ICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghcHJpdi0+c2Nyb2xscy5hbGxvY2F0ZWQp
CisgICAgICAgICAgICBzaXplID0gRVdLX1ZJRVdfU0NST0xMU19TSVpFX0lOSVRJQUw7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHNpemUgPSBwcml2LT5zY3JvbGxzLmFsbG9jYXRlZCArIEVX
S19WSUVXX1NDUk9MTFNfU0laRV9TVEVQOworICAgICAgICBpZiAoIV9ld2tfdmlld19zY3JvbGxz
X3Jlc2l6ZShwcml2LCBzaXplKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBy
ID0gcHJpdi0+c2Nyb2xscy5hcnJheSArIHByaXYtPnNjcm9sbHMuY291bnQ7CisgICAgcHJpdi0+
c2Nyb2xscy5jb3VudCsrOworCisgICAgci0+eCA9IHg7CisgICAgci0+eSA9IHk7CisgICAgci0+
dyA9IHc7CisgICAgci0+aCA9IGg7CisgICAgci0+eDIgPSB4MjsKKyAgICByLT55MiA9IHkyOwor
ICAgIHItPmR4ID0gZHg7CisgICAgci0+ZHkgPSBkeTsKKyAgICByLT5tYWluX3Njcm9sbCA9IG1h
aW5fc2Nyb2xsOworICAgIERCRygiYWRkIHNjcm9sbCBpbiByZWdpb246ICVkLCVkKyVkeCVkICUr
MDNkLCUrMDNkIiwgeCwgeSwgdywgaCwgZHgsIGR5KTsKKworICAgIEVpbmFfUmVjdGFuZ2xlKiBw
cjsKKyAgICBFaW5hX1JlY3RhbmdsZSogcHJfZW5kOworICAgIHNpemVfdCBjb3VudDsKKyAgICBw
ciA9IHByaXYtPnJlcGFpbnRzLmFycmF5OworICAgIGNvdW50ID0gcHJpdi0+cmVwYWludHMuY291
bnQ7CisgICAgcHJfZW5kID0gcHIgKyBjb3VudDsKKyAgICBmb3IgKDsgcHIgPCBwcl9lbmQ7IHBy
KyspIHsKKyAgICAgICAgcHItPnggKz0gZHg7CisgICAgICAgIHByLT55ICs9IGR5OworICAgIH0K
K30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3Njcm9sbHNfZmx1c2goRXdrX1ZpZXdfUHJpdmF0
ZV9EYXRhKiBwcml2KQoreworICAgIHByaXYtPnNjcm9sbHMuY291bnQgPSAwOworICAgIGlmIChw
cml2LT5zY3JvbGxzLmFsbG9jYXRlZCA8PSBFV0tfVklFV19TQ1JPTExTX1NJWkVfTUFYX0ZSRUUp
CisgICAgICAgIHJldHVybjsKKyAgICBfZXdrX3ZpZXdfc2Nyb2xsc19yZXNpemUocHJpdiwgRVdL
X1ZJRVdfU0NST0xMU19TSVpFX01BWF9GUkVFKTsKK30KKworLy8gRGVmYXVsdCBFdmVudCBIYW5k
bGluZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0
aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9mb2N1c19pbihFd2tfVmlld19TbWFydF9EYXRh
KiBzZCkKK3sKKyAgICBFV0tfVklFV19QUklWX0dFVChzZCwgcHJpdik7CisgICAgV2ViQ29yZTo6
Rm9jdXNDb250cm9sbGVyKiBmYyA9IHByaXYtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpOworICAg
IERCRygibz0lcCwgZmM9JXAiLCBzZC0+c2VsZiwgZmMpOworICAgIEVJTkFfU0FGRVRZX09OX05V
TExfUkVUVVJOX1ZBTChmYywgRUlOQV9GQUxTRSk7CisKKyAgICBmYy0+c2V0QWN0aXZlKHRydWUp
OworICAgIGZjLT5zZXRGb2N1c2VkKHRydWUpOworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisK
K3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X2ZvY3VzX291dChFd2tfVmlld19TbWFy
dF9EYXRhKiBzZCkKK3sKKyAgICBFV0tfVklFV19QUklWX0dFVChzZCwgcHJpdik7CisgICAgV2Vi
Q29yZTo6Rm9jdXNDb250cm9sbGVyKiBmYyA9IHByaXYtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigp
OworICAgIERCRygibz0lcCwgZmM9JXAiLCBzZC0+c2VsZiwgZmMpOworICAgIEVJTkFfU0FGRVRZ
X09OX05VTExfUkVUVVJOX1ZBTChmYywgRUlOQV9GQUxTRSk7CisKKyAgICBmYy0+c2V0QWN0aXZl
KGZhbHNlKTsKKyAgICBmYy0+c2V0Rm9jdXNlZChmYWxzZSk7CisgICAgcmV0dXJuIEVJTkFfVFJV
RTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfc21hcnRfbW91c2Vfd2hlZWwoRXdr
X1ZpZXdfU21hcnRfRGF0YSogc2QsIGNvbnN0IEV2YXNfRXZlbnRfTW91c2VfV2hlZWwqIGV2KQor
eworICAgIHJldHVybiBld2tfZnJhbWVfZmVlZF9tb3VzZV93aGVlbChzZC0+bWFpbl9mcmFtZSwg
ZXYpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9tb3VzZV9kb3duKEV3
a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25zdCBFdmFzX0V2ZW50X01vdXNlX0Rvd24qIGV2KQor
eworICAgIHJldHVybiBld2tfZnJhbWVfZmVlZF9tb3VzZV9kb3duKHNkLT5tYWluX2ZyYW1lLCBl
dik7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X21vdXNlX3VwKEV3a19W
aWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25zdCBFdmFzX0V2ZW50X01vdXNlX1VwKiBldikKK3sKKyAg
ICByZXR1cm4gZXdrX2ZyYW1lX2ZlZWRfbW91c2VfdXAoc2QtPm1haW5fZnJhbWUsIGV2KTsKK30K
Kworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfc21hcnRfbW91c2VfbW92ZShFd2tfVmlld19T
bWFydF9EYXRhKiBzZCwgY29uc3QgRXZhc19FdmVudF9Nb3VzZV9Nb3ZlKiBldikKK3sKKyAgICBy
ZXR1cm4gZXdrX2ZyYW1lX2ZlZWRfbW91c2VfbW92ZShzZC0+bWFpbl9mcmFtZSwgZXYpOworfQor
CitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9rZXlfZG93bihFd2tfVmlld19TbWFy
dF9EYXRhKiBzZCwgY29uc3QgRXZhc19FdmVudF9LZXlfRG93biogZXYpCit7CisgICAgRXZhc19P
YmplY3QqIGZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfZm9jdXNlZF9nZXQoc2QtPnNlbGYpOworCisg
ICAgaWYgKCFmcmFtZSkKKyAgICAgICAgZnJhbWUgPSBzZC0+bWFpbl9mcmFtZTsKKworICAgIHJl
dHVybiBld2tfZnJhbWVfZmVlZF9rZXlfZG93bihmcmFtZSwgZXYpOworfQorCitzdGF0aWMgRWlu
YV9Cb29sIF9ld2tfdmlld19zbWFydF9rZXlfdXAoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QsIGNv
bnN0IEV2YXNfRXZlbnRfS2V5X1VwKiBldikKK3sKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBl
d2tfdmlld19mcmFtZV9mb2N1c2VkX2dldChzZC0+c2VsZik7CisKKyAgICBpZiAoIWZyYW1lKQor
ICAgICAgICBmcmFtZSA9IHNkLT5tYWluX2ZyYW1lOworCisgICAgcmV0dXJuIGV3a19mcmFtZV9m
ZWVkX2tleV91cChmcmFtZSwgZXYpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21hcnRf
YWRkX2NvbnNvbGVfbWVzc2FnZShFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgY29uc3QgY2hhciog
bWVzc2FnZSwgdW5zaWduZWQgaW50IGxpbmVOdW1iZXIsIGNvbnN0IGNoYXIqIHNvdXJjZUlEKQor
eworICAgIElORigiY29uc29sZSBtZXNzYWdlOiAlcyBAJWQ6ICVzXG4iLCBzb3VyY2VJRCwgbGlu
ZU51bWJlciwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9ydW5f
amF2YXNjcmlwdF9hbGVydChFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgRXZhc19PYmplY3QqIGZy
YW1lLCBjb25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIElORigiamF2YXNjcmlwdCBhbGVydDog
JXNcbiIsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9y
dW5famF2YXNjcmlwdF9jb25maXJtKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBFdmFzX09iamVj
dCogZnJhbWUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7CisgICAgSU5GKCJqYXZhc2NyaXB0IGNv
bmZpcm06ICVzIiwgbWVzc2FnZSk7CisgICAgSU5GKCJqYXZhc2NyaXB0IGNvbmZpcm0gKEhBUkQg
Q09ERUQpPyBZRVMiKTsKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitzdGF0aWMgRWluYV9C
b29sIF9ld2tfdmlld19zbWFydF9zaG91bGRfaW50ZXJydXB0X2phdmFzY3JpcHQoRXdrX1ZpZXdf
U21hcnRfRGF0YSogc2QpCit7CisgICAgSU5GKCJzaG91bGQgaW50ZXJydXB0IGphdmFzY3JpcHQ/
XG4iCisgICAgICAgICAgICAiXHQoSEFSRCBDT0RFRCkgTk8iKTsKKyAgICByZXR1cm4gRUlOQV9G
QUxTRTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfc21hcnRfcnVuX2phdmFzY3Jp
cHRfcHJvbXB0KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBFdmFzX09iamVjdCogZnJhbWUsIGNv
bnN0IGNoYXIqIG1lc3NhZ2UsIGNvbnN0IGNoYXIqIGRlZmF1bHRWYWx1ZSwgY2hhcioqIHZhbHVl
KQoreworICAgICp2YWx1ZSA9IHN0cmR1cCgidGVzdCIpOworICAgIEVpbmFfQm9vbCByZXQgPSBF
SU5BX1RSVUU7CisgICAgSU5GKCJqYXZhc2NyaXB0IHByb21wdDpcbiIKKyAgICAgICAgICAgICJc
dCAgICAgIG1lc3NhZ2U6ICVzXG4iCisgICAgICAgICAgICAiXHRkZWZhdWx0IHZhbHVlOiAlc1xu
IgorICAgICAgICAgICAgIlx0Z2l2aW5nIGFuc3dlcjogJXNcbiIKKyAgICAgICAgICAgICJcdCAg
ICAgICBidXR0b246ICVzIiwgbWVzc2FnZSwgZGVmYXVsdFZhbHVlLCAqdmFsdWUsIHJldD8ib2si
OiJjYW5jZWwiKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8vIEV2ZW50IEhhbmRsaW5nIC8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworc3Rh
dGljIHZvaWQgX2V3a192aWV3X29uX2ZvY3VzX2luKHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNf
T2JqZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEq
IHNkID0gKEV3a19WaWV3X1NtYXJ0X0RhdGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVM
TF9SRVRVUk4oc2QtPmFwaSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFw
aS0+Zm9jdXNfaW4pOworICAgIHNkLT5hcGktPmZvY3VzX2luKHNkKTsKK30KKworc3RhdGljIHZv
aWQgX2V3a192aWV3X29uX2ZvY3VzX291dCh2b2lkKiBkYXRhLCBFdmFzKiBlLCBFdmFzX09iamVj
dCogbywgdm9pZCogZXZlbnRfaW5mbykKK3sKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBzZCA9
IChFd2tfVmlld19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPmZv
Y3VzX291dCk7CisgICAgc2QtPmFwaS0+Zm9jdXNfb3V0KHNkKTsKK30KKworc3RhdGljIHZvaWQg
X2V3a192aWV3X29uX21vdXNlX3doZWVsKHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNfT2JqZWN0
KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAgIEV2YXNfRXZlbnRfTW91c2VfV2hlZWwqIGV2
ID0gKEV2YXNfRXZlbnRfTW91c2VfV2hlZWwqKWV2ZW50X2luZm87CisgICAgRXdrX1ZpZXdfU21h
cnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0YTsKKyAgICBFSU5BX1NBRkVU
WV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVS
TihzZC0+YXBpLT5tb3VzZV93aGVlbCk7CisgICAgc2QtPmFwaS0+bW91c2Vfd2hlZWwoc2QsIGV2
KTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X29uX21vdXNlX2Rvd24odm9pZCogZGF0YSwg
RXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50X2luZm8pCit7CisgICAgRXZhc19F
dmVudF9Nb3VzZV9Eb3duKiBldiA9IChFdmFzX0V2ZW50X01vdXNlX0Rvd24qKWV2ZW50X2luZm87
CisgICAgRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0
YTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NB
RkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT5tb3VzZV9kb3duKTsKKyAgICBzZC0+YXBpLT5t
b3VzZV9kb3duKHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19vbl9tb3VzZV91
cCh2b2lkKiBkYXRhLCBFdmFzKiBlLCBFdmFzX09iamVjdCogbywgdm9pZCogZXZlbnRfaW5mbykK
K3sKKyAgICBFdmFzX0V2ZW50X01vdXNlX1VwKiBldiA9IChFdmFzX0V2ZW50X01vdXNlX1VwKill
dmVudF9pbmZvOworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1NtYXJ0
X0RhdGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaSk7Cisg
ICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+bW91c2VfdXApOworICAgIHNk
LT5hcGktPm1vdXNlX3VwKHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19vbl9t
b3VzZV9tb3ZlKHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVu
dF9pbmZvKQoreworICAgIEV2YXNfRXZlbnRfTW91c2VfTW92ZSogZXYgPSAoRXZhc19FdmVudF9N
b3VzZV9Nb3ZlKilldmVudF9pbmZvOworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3
a19WaWV3X1NtYXJ0X0RhdGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4o
c2QtPmFwaSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+bW91c2Vf
bW92ZSk7CisgICAgc2QtPmFwaS0+bW91c2VfbW92ZShzZCwgZXYpOworfQorCitzdGF0aWMgdm9p
ZCBfZXdrX3ZpZXdfb25fa2V5X2Rvd24odm9pZCogZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3Qq
IG8sIHZvaWQqIGV2ZW50X2luZm8pCit7CisgICAgRXZhc19FdmVudF9LZXlfRG93biogZXYgPSAo
RXZhc19FdmVudF9LZXlfRG93biopZXZlbnRfaW5mbzsKKyAgICBFd2tfVmlld19TbWFydF9EYXRh
KiBzZCA9IChFd2tfVmlld19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OX05V
TExfUkVUVVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5h
cGktPmtleV9kb3duKTsKKyAgICBzZC0+YXBpLT5rZXlfZG93bihzZCwgZXYpOworfQorCitzdGF0
aWMgdm9pZCBfZXdrX3ZpZXdfb25fa2V5X3VwKHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNfT2Jq
ZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAgIEV2YXNfRXZlbnRfS2V5X1VwKiBldiA9
IChFdmFzX0V2ZW50X0tleV9VcCopZXZlbnRfaW5mbzsKKyAgICBFd2tfVmlld19TbWFydF9EYXRh
KiBzZCA9IChFd2tfVmlld19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OX05V
TExfUkVUVVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5h
cGktPmtleV91cCk7CisgICAgc2QtPmFwaS0+a2V5X3VwKHNkLCBldik7Cit9CisKK3N0YXRpYyBX
VEY6OlBhc3NSZWZQdHI8V2ViQ29yZTo6RnJhbWU+IF9ld2tfdmlld19jb3JlX2ZyYW1lX25ldyhF
d2tfVmlld19TbWFydF9EYXRhKiBzZCwgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBXZWJD
b3JlOjpIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyKQoreworICAgIFdlYkNvcmU6OkZyYW1l
TG9hZGVyQ2xpZW50RWZsKiBmbGMgPSBuZXcgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRFZmwo
c2QtPnNlbGYpOworICAgIGlmICghZmxjKSB7CisgICAgICAgIENSSVRJQ0FMKCJDb3VsZCBub3Qg
Y3JlYXRlIGZyYW1lIGxvYWRlciBjbGllbnQuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KyAgICBmbGMtPnNldEN1c3RvbVVzZXJBZ2VudChXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KHBy
aXYtPnNldHRpbmdzLnVzZXJfYWdlbnQpKTsKKworICAgIHJldHVybiBXZWJDb3JlOjpGcmFtZTo6
Y3JlYXRlKHByaXYtPnBhZ2UsIG93bmVyLCBmbGMpOworfQorCitzdGF0aWMgRXZhc19TbWFydF9D
bGFzcyBfcGFyZW50X3NjID0gRVZBU19TTUFSVF9DTEFTU19JTklUX05VTEw7CisKK3N0YXRpYyBF
d2tfVmlld19Qcml2YXRlX0RhdGEqIF9ld2tfdmlld19wcml2X25ldyhFd2tfVmlld19TbWFydF9E
YXRhKiBzZCkKK3sKKyAgICBFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYgPQorICAgICAgICAo
RXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiljYWxsb2MoMSwgc2l6ZW9mKEV3a19WaWV3X1ByaXZhdGVf
RGF0YSkpOworICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzOworICAgIFdlYkNvcmU6OktVUkwg
dXJsOworCisgICAgaWYgKCFwcml2KSB7CisgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBub3QgYWxs
b2NhdGUgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KyAgICBwcml2LT5wYWdlID0gbmV3IFdlYkNvcmU6OlBhZ2UoCisgICAgICAgIHN0YXRpY19jYXN0
PFdlYkNvcmU6OkNocm9tZUNsaWVudCo+KG5ldyBXZWJDb3JlOjpDaHJvbWVDbGllbnRFZmwoc2Qt
PnNlbGYpKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8V2ViQ29yZTo6Q29udGV4dE1lbnVDbGllbnQq
PihuZXcgV2ViQ29yZTo6Q29udGV4dE1lbnVDbGllbnRFZmwoc2QtPnNlbGYpKSwKKyAgICAgICAg
c3RhdGljX2Nhc3Q8V2ViQ29yZTo6RWRpdG9yQ2xpZW50Kj4obmV3IFdlYkNvcmU6OkVkaXRvckNs
aWVudEVmbChzZC0+c2VsZikpLAorICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpEcmFnQ2xp
ZW50Kj4obmV3IFdlYkNvcmU6OkRyYWdDbGllbnRFZmwpLAorICAgICAgICBzdGF0aWNfY2FzdDxX
ZWJDb3JlOjpJbnNwZWN0b3JDbGllbnQqPihuZXcgV2ViQ29yZTo6SW5zcGVjdG9yQ2xpZW50RWZs
KSwKKyAgICAgICAgMCwKKyAgICAgICAgMCk7CisgICAgaWYgKCFwcml2LT5wYWdlKSB7CisgICAg
ICAgIENSSVRJQ0FMKCJDb3VsZCBub3QgY3JlYXRlIFdlYktpdCBQYWdlIik7CisgICAgICAgIGdv
dG8gZXJyb3JfcGFnZTsKKyAgICB9CisKKyAgICBwcml2LT5wYWdlX3NldHRpbmdzID0gcHJpdi0+
cGFnZS0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXByaXYtPnBhZ2Vfc2V0dGluZ3MpIHsKKyAgICAg
ICAgQ1JJVElDQUwoIkNvdWxkIG5vdCBnZXQgcGFnZSBzZXR0aW5ncy4iKTsKKyAgICAgICAgZ290
byBlcnJvcl9zZXR0aW5nczsKKyAgICB9CisKKyAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRM
b2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkodHJ1ZSk7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+
c2V0RGVmYXVsdEZpeGVkRm9udFNpemUoMTIpOworICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNl
dERlZmF1bHRGb250U2l6ZSgxNik7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0U2VyaWZG
b250RmFtaWx5KCJzZXJpZiIpOworICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEZpeGVkRm9u
dEZhbWlseSgibW9ub3R5cGUiKTsKKyAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRTYW5zU2Vy
aWZGb250RmFtaWx5KCJzYW5zIik7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0U3RhbmRh
cmRGb250RmFtaWx5KCJzYW5zIik7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0SmF2YVNj
cmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0UGx1Z2luc0Vu
YWJsZWQodHJ1ZSk7CisKKyAgICB1cmwgPSBwcml2LT5wYWdlX3NldHRpbmdzLT51c2VyU3R5bGVT
aGVldExvY2F0aW9uKCk7CisgICAgcHJpdi0+c2V0dGluZ3MudXNlcl9zdHlsZXNoZWV0ID0gZWlu
YV9zdHJpbmdzaGFyZV9hZGQodXJsLnByZXR0eVVSTCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAg
cHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfZGVmYXVsdCA9IGVpbmFfc3RyaW5nc2hhcmVfYWRkCisg
ICAgICAgIChwcml2LT5wYWdlX3NldHRpbmdzLT5kZWZhdWx0VGV4dEVuY29kaW5nTmFtZSgpLnV0
ZjgoKS5kYXRhKCkpOworICAgIHByaXYtPnNldHRpbmdzLmVuY29kaW5nX2N1c3RvbSA9IE5VTEw7
CisKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X21pbmltdW1fc2l6ZSA9IHByaXYtPnBhZ2Vfc2V0
dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOworICAgIHByaXYtPnNldHRpbmdzLmZvbnRfbWluaW11
bV9sb2dpY2FsX3NpemUgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5taW5pbXVtTG9naWNhbEZvbnRT
aXplKCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9kZWZhdWx0X3NpemUgPSBwcml2LT5wYWdl
X3NldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X21v
bm9zcGFjZV9zaXplID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUo
KTsKKworICAgIHMgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsK
KyAgICBwcml2LT5zZXR0aW5ncy5mb250X3N0YW5kYXJkID0gZWluYV9zdHJpbmdzaGFyZV9hZGQo
cy5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBzID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+
Y3Vyc2l2ZUZvbnRGYW1pbHkoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X2N1cnNpdmUgPSBl
aW5hX3N0cmluZ3NoYXJlX2FkZChzLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIHMgPSBw
cml2LT5wYWdlX3NldHRpbmdzLT5maXhlZEZvbnRGYW1pbHkoKTsKKyAgICBwcml2LT5zZXR0aW5n
cy5mb250X21vbm9zcGFjZSA9IGVpbmFfc3RyaW5nc2hhcmVfYWRkKHMuc3RyaW5nKCkudXRmOCgp
LmRhdGEoKSk7CisgICAgcyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmZhbnRhc3lGb250RmFtaWx5
KCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9mYW50YXN5ID0gZWluYV9zdHJpbmdzaGFyZV9h
ZGQocy5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBzID0gcHJpdi0+cGFnZV9zZXR0aW5n
cy0+c2VyaWZGb250RmFtaWx5KCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9zZXJpZiA9IGVp
bmFfc3RyaW5nc2hhcmVfYWRkKHMuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgcyA9IHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPnNhbnNTZXJpZkZvbnRGYW1pbHkoKTsKKyAgICBwcml2LT5zZXR0
aW5ncy5mb250X3NhbnNfc2VyaWYgPSBlaW5hX3N0cmluZ3NoYXJlX2FkZChzLnN0cmluZygpLnV0
ZjgoKS5kYXRhKCkpOworCisgICAgcHJpdi0+c2V0dGluZ3MuYXV0b19sb2FkX2ltYWdlcyA9IHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPmxvYWRzSW1hZ2VzQXV0b21hdGljYWxseSgpOworICAgIHByaXYt
PnNldHRpbmdzLmF1dG9fc2hyaW5rX2ltYWdlcyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNocmlu
a3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5lbmFibGVfc2Ny
aXB0cyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmlzSmF2YVNjcmlwdEVuYWJsZWQoKTsKKyAgICBw
cml2LT5zZXR0aW5ncy5lbmFibGVfcGx1Z2lucyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmFyZVBs
dWdpbnNFbmFibGVkKCk7CisgICAgcHJpdi0+c2V0dGluZ3Muc2NyaXB0c193aW5kb3dfb3BlbiA9
IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmFsbG93U2NyaXB0c1RvQ2xvc2VXaW5kb3dzKCk7CisgICAg
cHJpdi0+c2V0dGluZ3MucmVzaXphYmxlX3RleHRhcmVhcyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3Mt
PnRleHRBcmVhc0FyZVJlc2l6YWJsZSgpOworICAgIHByaXYtPnNldHRpbmdzLnByaXZhdGVfYnJv
d3NpbmcgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5wcml2YXRlQnJvd3NpbmdFbmFibGVkKCk7Cisg
ICAgcHJpdi0+c2V0dGluZ3MuY2FyZXRfYnJvd3NpbmcgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5j
YXJldEJyb3dzaW5nRW5hYmxlZCgpOworCisgICAgcHJpdi0+bWFpbl9mcmFtZSA9IF9ld2tfdmll
d19jb3JlX2ZyYW1lX25ldyhzZCwgcHJpdiwgMCkuZ2V0KCk7CisgICAgaWYgKCFwcml2LT5tYWlu
X2ZyYW1lKSB7CisgICAgICAgIENSSVRJQ0FMKCJDb3VsZCBub3QgY3JlYXRlIG1haW4gZnJhbWUu
Iik7CisgICAgICAgIGdvdG8gZXJyb3JfbWFpbl9mcmFtZTsKKyAgICB9CisKKyAgICBwcml2LT5o
aXN0b3J5ID0gZXdrX2hpc3RvcnlfbmV3KHByaXYtPnBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpKTsK
KyAgICBpZiAoIXByaXYtPmhpc3RvcnkpIHsKKyAgICAgICAgQ1JJVElDQUwoIkNvdWxkIG5vdCBj
cmVhdGUgaGlzdG9yeSBpbnN0YW5jZSBmb3Igdmlldy4iKTsKKyAgICAgICAgZ290byBlcnJvcl9o
aXN0b3J5OworICAgIH0KKworICAgIHJldHVybiBwcml2OworCitlcnJvcl9oaXN0b3J5OgorICAg
IC8vIGRlbGV0ZSBwcml2LT5tYWluX2ZyYW1lOyAvKiBkbyBub3QgZGVsZXRlIHByaXYtPm1haW5f
ZnJhbWUgKi8KK2Vycm9yX21haW5fZnJhbWU6CitlcnJvcl9zZXR0aW5nczoKKyAgICBkZWxldGUg
cHJpdi0+cGFnZTsKK2Vycm9yX3BhZ2U6CisgICAgZnJlZShwcml2KTsKKyAgICByZXR1cm4gMDsK
K30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3ByaXZfZGVsKEV3a19WaWV3X1ByaXZhdGVfRGF0
YSogcHJpdikKK3sKKyAgICBpZiAoIXByaXYpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIGRv
IG5vdCBkZWxldGUgcHJpdi0+bWFpbl9mcmFtZSAqLworCisgICAgZnJlZShwcml2LT5yZXBhaW50
cy5hcnJheSk7CisgICAgZnJlZShwcml2LT5zY3JvbGxzLmFycmF5KTsKKworICAgIGVpbmFfc3Ry
aW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLnVzZXJfYWdlbnQpOworICAgIGVpbmFfc3RyaW5n
c2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLnVzZXJfc3R5bGVzaGVldCk7CisgICAgZWluYV9zdHJp
bmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfZGVmYXVsdCk7CisgICAgZWluYV9z
dHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfY3VzdG9tKTsKKyAgICBlaW5h
X3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5mb250X3N0YW5kYXJkKTsKKyAgICBlaW5h
X3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5mb250X2N1cnNpdmUpOworICAgIGVpbmFf
c3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZvbnRfbW9ub3NwYWNlKTsKKyAgICBlaW5h
X3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5mb250X2ZhbnRhc3kpOworICAgIGVpbmFf
c3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZvbnRfc2VyaWYpOworICAgIGVpbmFfc3Ry
aW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZvbnRfc2Fuc19zZXJpZik7CisKKyAgICBpZiAo
cHJpdi0+YW5pbWF0ZWRfem9vbS5hbmltYXRvcikKKyAgICAgICAgZWNvcmVfYW5pbWF0b3JfZGVs
KHByaXYtPmFuaW1hdGVkX3pvb20uYW5pbWF0b3IpOworCisgICAgZXdrX2hpc3RvcnlfZnJlZShw
cml2LT5oaXN0b3J5KTsKKworICAgIGRlbGV0ZSBwcml2LT5wYWdlOworICAgIGZyZWUocHJpdik7
Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9hZGQoRXZhc19PYmplY3QqIG8pCit7
CisgICAgY29uc3QgRXZhc19TbWFydCogc21hcnQgPSBldmFzX29iamVjdF9zbWFydF9zbWFydF9n
ZXQobyk7CisgICAgY29uc3QgRXZhc19TbWFydF9DbGFzcyogc2MgPSBldmFzX3NtYXJ0X2NsYXNz
X2dldChzbWFydCk7CisgICAgY29uc3QgRXdrX1ZpZXdfU21hcnRfQ2xhc3MqIGFwaSA9IChjb25z
dCBFd2tfVmlld19TbWFydF9DbGFzcyopc2M7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRV
Uk4oYXBpLT5iYWNraW5nX3N0b3JlX2FkZCk7CisgICAgRVdLX1ZJRVdfU0RfR0VUKG8sIHNkKTsK
KworICAgIGlmICghc2QpIHsKKyAgICAgICAgc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopY2Fs
bG9jKDEsIHNpemVvZihFd2tfVmlld19TbWFydF9EYXRhKSk7CisgICAgICAgIGlmICghc2QpCisg
ICAgICAgICAgICBDUklUSUNBTCgiY291bGQgbm90IGFsbG9jYXRlIEV3a19WaWV3X1NtYXJ0X0Rh
dGEiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZhc19vYmplY3Rfc21hcnRfZGF0YV9z
ZXQobywgc2QpOworICAgIH0KKworICAgIHNkLT5iZ19jb2xvci5yID0gMjU1OworICAgIHNkLT5i
Z19jb2xvci5nID0gMjU1OworICAgIHNkLT5iZ19jb2xvci5iID0gMjU1OworICAgIHNkLT5iZ19j
b2xvci5hID0gMjU1OworCisgICAgc2QtPnNlbGYgPSBvOworICAgIHNkLT5fcHJpdiA9IF9ld2tf
dmlld19wcml2X25ldyhzZCk7CisgICAgc2QtPmFwaSA9IGFwaTsKKworICAgIF9wYXJlbnRfc2Mu
YWRkKG8pOworCisgICAgaWYgKCFzZC0+X3ByaXYpCisgICAgICAgIHJldHVybjsKKworICAgIEVX
S19WSUVXX1BSSVZfR0VUKHNkLCBwcml2KTsKKworICAgIHNkLT5iYWNraW5nX3N0b3JlID0gYXBp
LT5iYWNraW5nX3N0b3JlX2FkZChzZCk7CisgICAgaWYgKCFzZC0+YmFja2luZ19zdG9yZSkgewor
ICAgICAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgYmFja2luZyBzdG9yZSBvYmplY3QuIik7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBldmFzX29iamVjdF9zbWFydF9tZW1iZXJfYWRk
KHNkLT5iYWNraW5nX3N0b3JlLCBvKTsKKyAgICBldmFzX29iamVjdF9zaG93KHNkLT5iYWNraW5n
X3N0b3JlKTsKKworICAgIHNkLT5tYWluX2ZyYW1lID0gZXdrX2ZyYW1lX2FkZChzZC0+YmFzZS5l
dmFzKTsKKyAgICBpZiAoIXNkLT5tYWluX2ZyYW1lKSB7CisgICAgICAgIEVSUigiQ291bGQgbm90
IGNyZWF0ZSBtYWluIGZyYW1lIG9iamVjdC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGlmICghZXdrX2ZyYW1lX2luaXQoc2QtPm1haW5fZnJhbWUsIG8sIHByaXYtPm1haW5fZnJh
bWUpKSB7CisgICAgICAgIEVSUigiQ291bGQgbm90IGluaXRpYWxpemUgbWFpbiBmcm1lIG9iamVj
dC4iKTsKKyAgICAgICAgZXZhc19vYmplY3RfZGVsKHNkLT5tYWluX2ZyYW1lKTsKKyAgICAgICAg
c2QtPm1haW5fZnJhbWUgPSAwOworCisgICAgICAgIGRlbGV0ZSBwcml2LT5tYWluX2ZyYW1lOwor
ICAgICAgICBwcml2LT5tYWluX2ZyYW1lID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGV2YXNfb2JqZWN0X25hbWVfc2V0KHNkLT5tYWluX2ZyYW1lLCAiRVdLX0ZyYW1lOm1haW4i
KTsKKyAgICBldmFzX29iamVjdF9zbWFydF9tZW1iZXJfYWRkKHNkLT5tYWluX2ZyYW1lLCBvKTsK
KyAgICBldmFzX29iamVjdF9zaG93KHNkLT5tYWluX2ZyYW1lKTsKKworI2RlZmluZSBDT05ORUNU
KHMsIGMpIGV2YXNfb2JqZWN0X2V2ZW50X2NhbGxiYWNrX2FkZChvLCBzLCBjLCBzZCkKKyAgICBD
T05ORUNUKEVWQVNfQ0FMTEJBQ0tfRk9DVVNfSU4sIF9ld2tfdmlld19vbl9mb2N1c19pbik7Cisg
ICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX0ZPQ1VTX09VVCwgX2V3a192aWV3X29uX2ZvY3VzX291
dCk7CisgICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX01PVVNFX1dIRUVMLCBfZXdrX3ZpZXdfb25f
bW91c2Vfd2hlZWwpOworICAgIENPTk5FQ1QoRVZBU19DQUxMQkFDS19NT1VTRV9ET1dOLCBfZXdr
X3ZpZXdfb25fbW91c2VfZG93bik7CisgICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX01PVVNFX1VQ
LCBfZXdrX3ZpZXdfb25fbW91c2VfdXApOworICAgIENPTk5FQ1QoRVZBU19DQUxMQkFDS19NT1VT
RV9NT1ZFLCBfZXdrX3ZpZXdfb25fbW91c2VfbW92ZSk7CisgICAgQ09OTkVDVChFVkFTX0NBTExC
QUNLX0tFWV9ET1dOLCBfZXdrX3ZpZXdfb25fa2V5X2Rvd24pOworICAgIENPTk5FQ1QoRVZBU19D
QUxMQkFDS19LRVlfVVAsIF9ld2tfdmlld19vbl9rZXlfdXApOworI3VuZGVmIENPTk5FQ1QKK30K
Kworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2RlbChFdmFzX09iamVjdCogbykKK3sKKyAg
ICBFV0tfVklFV19TRF9HRVQobywgc2QpOworICAgIEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJp
diA9IHNkID8gc2QtPl9wcml2IDogMDsKKworICAgIF9wYXJlbnRfc2MuZGVsKG8pOworICAgIF9l
d2tfdmlld19wcml2X2RlbChwcml2KTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0
X3Jlc2l6ZShFdmFzX09iamVjdCogbywgRXZhc19Db29yZCB3LCBFdmFzX0Nvb3JkIGgpCit7Cisg
ICAgRVdLX1ZJRVdfU0RfR0VUKG8sIHNkKTsKKworICAgIC8vIHRoZXNlIHNob3VsZCBiZSBxdWV1
ZWQgYW5kIHByb2Nlc3NlZCBpbiBjYWxjdWxhdGUgYXMgd2VsbCEKKyAgICBldmFzX29iamVjdF9y
ZXNpemUoc2QtPmJhY2tpbmdfc3RvcmUsIHcsIGgpOworCisgICAgc2QtPmNoYW5nZWQuc2l6ZSA9
IEVJTkFfVFJVRTsKKyAgICBfZXdrX3ZpZXdfc21hcnRfY2hhbmdlZChzZCk7Cit9CisKK3N0YXRp
YyB2b2lkIF9ld2tfdmlld19zbWFydF9tb3ZlKEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3JkIHgs
IEV2YXNfQ29vcmQgeSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVQobywgc2QpOworICAgIHNkLT5j
aGFuZ2VkLnBvc2l0aW9uID0gRUlOQV9UUlVFOworICAgIF9ld2tfdmlld19zbWFydF9jaGFuZ2Vk
KHNkKTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2NhbGN1bGF0ZShFdmFzX09i
amVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVQobywgc2QpOworICAgIEVXS19WSUVXX1BS
SVZfR0VUKHNkLCBwcml2KTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBp
LT5jb250ZW50c19yZXNpemUpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5h
cGktPnNjcm9sbHNfcHJvY2Vzcyk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2Qt
PmFwaS0+cmVwYWludHNfcHJvY2Vzcyk7CisgICAgRXZhc19Db29yZCB4LCB5LCB3LCBoOworCisg
ICAgc2QtPmNoYW5nZWQuYW55ID0gRUlOQV9GQUxTRTsKKworICAgIGlmICghc2QtPm1haW5fZnJh
bWUgfHwgIXByaXYtPm1haW5fZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIGV2YXNfb2Jq
ZWN0X2dlb21ldHJ5X2dldChvLCAmeCwgJnksICZ3LCAmaCk7CisKKyAgICBEQkcoIm89JXAgZ2Vv
PVslZCwgJWQgKyAlZHglZF0sIGNoYW5nZWQ6IHNpemU9JWhodSwgIgorICAgICAgICAic2Nyb2xs
cz0lenUsIHJlcGFpbnRzPSV6dSIsCisgICAgICAgIG8sIHgsIHksIHcsIGgsIHNkLT5jaGFuZ2Vk
LnNpemUsCisgICAgICAgIHByaXYtPnNjcm9sbHMuY291bnQsIHByaXYtPnJlcGFpbnRzLmNvdW50
KTsKKworICAgIGlmIChzZC0+Y2hhbmdlZC5zaXplICYmICgodyAhPSBzZC0+dmlldy53KSB8fCAo
aCAhPSBzZC0+dmlldy5oKSkpIHsKKyAgICAgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3ID0g
cHJpdi0+bWFpbl9mcmFtZS0+dmlldygpOworICAgICAgICBpZiAodmlldykgeworICAgICAgICAg
ICAgdmlldy0+cmVzaXplKHcsIGgpOworICAgICAgICAgICAgdmlldy0+Zm9yY2VMYXlvdXQoKTsK
KyAgICAgICAgICAgIHZpZXctPmFkanVzdFZpZXdTaXplKCk7CisgICAgICAgICAgICBJbnRTaXpl
IHNpemUgPSB2aWV3LT5jb250ZW50c1NpemUoKTsKKyAgICAgICAgICAgIGlmICghc2QtPmFwaS0+
Y29udGVudHNfcmVzaXplKHNkLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpKQorICAgICAg
ICAgICAgICAgIEVSUigiZmFpbGVkIHRvIHJlc2l6ZSBjb250ZW50cyB0byAlZHglZCIsCisgICAg
ICAgICAgICAgICAgICAgIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIH0K
KyAgICAgICAgZXZhc19vYmplY3RfcmVzaXplKHNkLT5tYWluX2ZyYW1lLCB3LCBoKTsKKyAgICAg
ICAgc2QtPmNoYW5nZWQuZnJhbWVfcmVjdCA9IEVJTkFfVFJVRTsKKyAgICAgICAgc2QtPnZpZXcu
dyA9IHc7CisgICAgICAgIHNkLT52aWV3LmggPSBoOworICAgIH0KKyAgICBzZC0+Y2hhbmdlZC5z
aXplID0gRUlOQV9GQUxTRTsKKworICAgIGlmIChzZC0+Y2hhbmdlZC5wb3NpdGlvbiAmJiAoKHgg
IT0gc2QtPnZpZXcueCkgfHwgKHkgIT0gc2QtPnZpZXcueSkpKSB7CisgICAgICAgIGV2YXNfb2Jq
ZWN0X21vdmUoc2QtPm1haW5fZnJhbWUsIHgsIHkpOworICAgICAgICBldmFzX29iamVjdF9tb3Zl
KHNkLT5iYWNraW5nX3N0b3JlLCB4LCB5KTsKKyAgICAgICAgc2QtPmNoYW5nZWQuZnJhbWVfcmVj
dCA9IEVJTkFfVFJVRTsKKyAgICAgICAgc2QtPnZpZXcueCA9IHg7CisgICAgICAgIHNkLT52aWV3
LnkgPSB5OworICAgIH0KKyAgICBzZC0+Y2hhbmdlZC5wb3NpdGlvbiA9IEVJTkFfRkFMU0U7CisK
KyAgICBld2tfdmlld19sYXlvdXRfaWZfbmVlZGVkX3JlY3Vyc2l2ZShzZC0+X3ByaXYpOworCisg
ICAgaWYgKCFzZC0+YXBpLT5zY3JvbGxzX3Byb2Nlc3Moc2QpKQorICAgICAgICBFUlIoImZhaWxl
ZCB0byBwcm9jZXNzIHNjcm9sbHMuIik7CisgICAgX2V3a192aWV3X3Njcm9sbHNfZmx1c2gocHJp
dik7CisKKyAgICBpZiAoIXNkLT5hcGktPnJlcGFpbnRzX3Byb2Nlc3Moc2QpKQorICAgICAgICBF
UlIoImZhaWxlZCB0byBwcm9jZXNzIHJlcGFpbnRzLiIpOworICAgIF9ld2tfdmlld19yZXBhaW50
c19mbHVzaChwcml2KTsKKworICAgIGlmIChzZC0+Y2hhbmdlZC5mcmFtZV9yZWN0KSB7CisgICAg
ICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IHByaXYtPm1haW5fZnJhbWUtPnZpZXcoKTsK
KyAgICAgICAgdmlldy0+ZnJhbWVSZWN0c0NoYW5nZWQoKTsgLyogZm9yY2UgdHJlZSB0byBnZXQg
cG9zaXRpb24gZnJvbSByb290ICovCisgICAgICAgIHNkLT5jaGFuZ2VkLmZyYW1lX3JlY3QgPSBF
SU5BX0ZBTFNFOworICAgIH0KK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfc21hcnRf
Y29udGVudHNfcmVzaXplKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBpbnQgdywgaW50IGgpCit7
CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdf
c21hcnRfem9vbV9zZXQoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGZsb2F0IHpvb20sIEV2YXNf
Q29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpCit7CisgICAgZG91YmxlIHB4LCBweTsKKyAgICBFdmFz
X0Nvb3JkIHgsIHksIHcsIGg7CisgICAgRWluYV9Cb29sIHJldDsKKworICAgIGV3a19mcmFtZV9z
Y3JvbGxfc2l6ZV9nZXQoc2QtPm1haW5fZnJhbWUsICZ3LCAmaCk7CisgICAgZXdrX2ZyYW1lX3Nj
cm9sbF9wb3NfZ2V0KHNkLT5tYWluX2ZyYW1lLCAmeCwgJnkpOworCisgICAgaWYgKHcgKyBzZC0+
dmlldy53ID4gMCkKKyAgICAgICAgcHggPSAoZG91YmxlKSh4ICsgY3gpIC8gKHcgKyBzZC0+dmll
dy53KTsKKyAgICBlbHNlCisgICAgICAgIHB4ID0gMC4wOworCisgICAgaWYgKGggKyBzZC0+dmll
dy5oID4gMCkKKyAgICAgICAgcHkgPSAoZG91YmxlKSh5ICsgY3kpIC8gKGggKyBzZC0+dmlldy5o
KTsKKyAgICBlbHNlCisgICAgICAgIHB5ID0gMC4wOworCisgICAgcmV0ID0gZXdrX2ZyYW1lX3pv
b21fc2V0KHNkLT5tYWluX2ZyYW1lLCB6b29tKTsKKworICAgIGV3a19mcmFtZV9zY3JvbGxfc2l6
ZV9nZXQoc2QtPm1haW5fZnJhbWUsICZ3LCAmaCk7CisgICAgeCA9ICh3ICsgc2QtPnZpZXcudykg
KiBweCAtIGN4OworICAgIHkgPSAoaCArIHNkLT52aWV3LmgpICogcHkgLSBjeTsKKyAgICBld2tf
ZnJhbWVfc2Nyb2xsX3NldChzZC0+bWFpbl9mcmFtZSwgeCwgeSk7CisgICAgcmV0dXJuIHJldDsK
K30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2ZsdXNoKEV3a19WaWV3X1NtYXJ0X0Rh
dGEgKnNkKQoreworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdik7Cisg
ICAgX2V3a192aWV3X3JlcGFpbnRzX2ZsdXNoKHByaXYpOworICAgIF9ld2tfdmlld19zY3JvbGxz
X2ZsdXNoKHByaXYpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9wcmVf
cmVuZGVyX3JlZ2lvbihFd2tfVmlld19TbWFydF9EYXRhICpzZCwgRXZhc19Db29yZCB4LCBFdmFz
X0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoLCBmbG9hdCB6b29tKQoreworICAg
IFdSTigibm90IHN1cHBvcnRlZCBieSBlbmdpbmUuIHNkPSVwIGFyZWE9JWQsJWQrJWR4JWQsIHpv
b209JWYiLAorICAgICAgICBzZCwgeCwgeSwgdywgaCwgem9vbSk7CisgICAgcmV0dXJuIEVJTkFf
RkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9wcmVfcmVuZGVyX2NhbmNl
bChFd2tfVmlld19TbWFydF9EYXRhICpzZCkKK3sKKyAgICBXUk4oIm5vdCBzdXBwb3J0ZWQgYnkg
ZW5naW5lLiBzZD0lcCIsIHNkKTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3pvb21fYW5p
bWF0ZWRfbWFya19zdG9wKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIHNkLT5hbmlt
YXRlZF96b29tLnpvb20uc3RhcnQgPSAwLjA7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5l
bmQgPSAwLjA7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50ID0gMC4wOworfQor
CitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9maW5pc2goRXdrX1ZpZXdfU21h
cnRfRGF0YSogc2QpCit7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVQoc2QsIHByaXYpOworICAgIGVj
b3JlX2FuaW1hdG9yX2RlbChwcml2LT5hbmltYXRlZF96b29tLmFuaW1hdG9yKTsKKyAgICBwcml2
LT5hbmltYXRlZF96b29tLmFuaW1hdG9yID0gMDsKKyAgICBfZXdrX3ZpZXdfem9vbV9hbmltYXRl
ZF9tYXJrX3N0b3Aoc2QpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwoc2Qt
PnNlbGYsICJ6b29tLGFuaW1hdGVkLGVuZCIsIDApOworfQorCitzdGF0aWMgZmxvYXQgX2V3a192
aWV3X3pvb21fYW5pbWF0ZWRfY3VycmVudChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYpCit7
CisgICAgZG91YmxlIG5vdyA9IGVjb3JlX2xvb3BfdGltZV9nZXQoKTsKKyAgICBkb3VibGUgZGVs
dGEgPSBub3cgLSBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuc3RhcnQ7CisKKyAgICBpZiAoZGVs
dGEgPiBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuZHVyYXRpb24pCisgICAgICAgIGRlbHRhID0g
cHJpdi0+YW5pbWF0ZWRfem9vbS50aW1lLmR1cmF0aW9uOworICAgIGlmIChkZWx0YSA8IDAuMCkg
Ly8gdGltZSB3ZW50IGJhY2ssIGNsb2NrIGFkanVzdGVkPworICAgICAgICBkZWx0YSA9IDAuMDsK
KworICAgIGRlbHRhIC89IHByaXYtPmFuaW1hdGVkX3pvb20udGltZS5kdXJhdGlvbjsKKworICAg
IHJldHVybiAoKHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5yYW5nZSAqIGRlbHRhKQorICAgICAg
ICAgICAgKyBwcml2LT5hbmltYXRlZF96b29tLnpvb20uc3RhcnQpOworfQorCitzdGF0aWMgaW50
IF9ld2tfdmlld196b29tX2FuaW1hdG9yX2NiKHZvaWQqIGRhdGEpCit7CisgICAgRXdrX1ZpZXdf
U21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0YTsKKyAgICBFdmFzX0Nv
b3JkIGN4LCBjeTsKKyAgICBFV0tfVklFV19QUklWX0dFVChzZCwgcHJpdik7CisgICAgZG91Ymxl
IG5vdyA9IGVjb3JlX2xvb3BfdGltZV9nZXQoKTsKKworICAgIGN4ID0gcHJpdi0+YW5pbWF0ZWRf
em9vbS5jZW50ZXIueDsKKyAgICBjeSA9IHByaXYtPmFuaW1hdGVkX3pvb20uY2VudGVyLnk7CisK
KyAgICAvLyBUT0RPOiBwcm9ncmVzc2l2ZWx5IGNlbnRlciAoY3gsIGN5KSAtPiAodmlldy54ICsg
dmlldy5oLzIsIHZpZXcueSArIHZpZXcuaC8yKQorICAgIGlmIChjeCA+PSBzZC0+dmlldy53KQor
ICAgICAgICBjeCA9IHNkLT52aWV3LncgLSAxOworICAgIGlmIChjeSA+PSBzZC0+dmlldy5oKQor
ICAgICAgICBjeSA9IHNkLT52aWV3LmggLSAxOworCisgICAgaWYgKChub3cgPj0gcHJpdi0+YW5p
bWF0ZWRfem9vbS50aW1lLmVuZCkKKyAgICAgICAgfHwgKG5vdyA8IHByaXYtPmFuaW1hdGVkX3pv
b20udGltZS5zdGFydCkpIHsKKyAgICAgICAgX2V3a192aWV3X3pvb21fYW5pbWF0ZWRfZmluaXNo
KHNkKTsKKyAgICAgICAgZXdrX3ZpZXdfem9vbV9zZXQoc2QtPnNlbGYsIHByaXYtPmFuaW1hdGVk
X3pvb20uem9vbS5lbmQsIGN4LCBjeSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAg
IHNkLT5hbmltYXRlZF96b29tLnpvb20uY3VycmVudCA9IF9ld2tfdmlld196b29tX2FuaW1hdGVk
X2N1cnJlbnQocHJpdik7CisgICAgc2QtPmFwaS0+em9vbV93ZWFrX3NldChzZCwgc2QtPmFuaW1h
dGVkX3pvb20uem9vbS5jdXJyZW50LCBjeCwgY3kpOworICAgIHJldHVybiAxOworfQorCitzdGF0
aWMgdm9pZCBfZXdrX3ZpZXdfem9vbV9hbmltYXRpb25fc3RhcnQoRXdrX1ZpZXdfU21hcnRfRGF0
YSogc2QpCit7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2KTsKKyAg
ICBpZiAocHJpdi0+YW5pbWF0ZWRfem9vbS5hbmltYXRvcikKKyAgICAgICAgcmV0dXJuOworICAg
IHByaXYtPmFuaW1hdGVkX3pvb20uYW5pbWF0b3IgPSBlY29yZV9hbmltYXRvcl9hZGQKKyAgICAg
ICAgKF9ld2tfdmlld196b29tX2FuaW1hdG9yX2NiLCBzZCk7Cit9CisKKy8qKgorICogU2V0cyB0
aGUgc21hcnQgY2xhc3MgYXBpIHdpdGhvdXQgYW55IGJhY2tpbmcgc3RvcmUsIGVuYWJsaW5nIHZp
ZXcKKyAqIHRvIGJlIGluaGVyaXRlZC4KKyAqCisgKiBAcGFyYW0gYXBpIGNsYXNzIGRlZmluaXRp
b24gdG8gYmUgc2V0LCBhbGwgbWVtYmVycyB3aXRoIHRoZQorICogICAgICAgIGV4Y2VwdGlvbiBv
ZiBFdmFzX1NtYXJ0X0NsYXNzLT5kYXRhIG1heSBiZSBvdmVycmlkZGVuLiBNdXN0CisgKiAgICAg
ICAgQGIgbm90IGJlIEBjIE5VTEwuCisgKgorICogQG5vdGUgRXZhc19TbWFydF9DbGFzcy0+ZGF0
YSBpcyB1c2VkIHRvIGltcGxlbWVudCB0eXBlIGNoZWNraW5nIGFuZAorICogICAgICAgaXMgbm90
IHN1cHBvc2VkIHRvIGJlIGNoYW5nZWQvb3ZlcnJpZGRlbi4gSWYgeW91IG5lZWQgZXh0cmEKKyAq
ICAgICAgIGRhdGEgZm9yIHlvdXIgc21hcnQgY2xhc3MgdG8gd29yaywganVzdCBleHRlbmQKKyAq
ICAgICAgIEV3a19WaWV3X1NtYXJ0X0NsYXNzIGluc3RlYWQuCisgKgorICogQHJldHVybiBAYyBF
SU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvbiBmYWlsdXJlIChwcm9iYWJseQor
ICogICAgICAgICB2ZXJzaW9uIG1pc21hdGNoKS4KKyAqCisgKiBAc2VlIGV3a192aWV3X3Npbmds
ZV9zbWFydF9zZXQoKQorICogQHNlZSBld2tfdmlld190aWxlZF9zbWFydF9zZXQoKQorICovCitF
aW5hX0Jvb2wgZXdrX3ZpZXdfYmFzZV9zbWFydF9zZXQoRXdrX1ZpZXdfU21hcnRfQ2xhc3MqIGFw
aSkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoYXBpLCBFSU5BX0ZBTFNF
KTsKKworICAgIGlmIChhcGktPnZlcnNpb24gIT0gRVdLX1ZJRVdfU01BUlRfQ0xBU1NfVkVSU0lP
TikgeworICAgICAgICBFSU5BX0xPR19DUklUCisgICAgICAgICAgICAoIkV3a19WaWV3X1NtYXJ0
X0NsYXNzICVwIGlzIHZlcnNpb24gJWx1IHdoaWxlICVsdSB3YXMgZXhwZWN0ZWQuIiwKKyAgICAg
ICAgICAgICBhcGksIGFwaS0+dmVyc2lvbiwgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfVkVSU0lPTik7
CisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0KKworICAgIGlmIChFSU5BX1VOTElL
RUxZKCFfcGFyZW50X3NjLmFkZCkpCisgICAgICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NsaXBwZWRf
c21hcnRfc2V0KCZfcGFyZW50X3NjKTsKKworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NsaXBwZWRf
c21hcnRfc2V0KCZhcGktPnNjKTsKKyAgICBhcGktPnNjLmFkZCA9IF9ld2tfdmlld19zbWFydF9h
ZGQ7CisgICAgYXBpLT5zYy5kZWwgPSBfZXdrX3ZpZXdfc21hcnRfZGVsOworICAgIGFwaS0+c2Mu
cmVzaXplID0gX2V3a192aWV3X3NtYXJ0X3Jlc2l6ZTsKKyAgICBhcGktPnNjLm1vdmUgPSBfZXdr
X3ZpZXdfc21hcnRfbW92ZTsKKyAgICBhcGktPnNjLmNhbGN1bGF0ZSA9IF9ld2tfdmlld19zbWFy
dF9jYWxjdWxhdGU7CisgICAgYXBpLT5zYy5kYXRhID0gRVdLX1ZJRVdfVFlQRV9TVFI7IC8qIHVz
ZWQgYnkgdHlwZSBjaGVja2luZyAqLworCisgICAgYXBpLT5jb250ZW50c19yZXNpemUgPSBfZXdr
X3ZpZXdfc21hcnRfY29udGVudHNfcmVzaXplOworICAgIGFwaS0+em9vbV9zZXQgPSBfZXdrX3Zp
ZXdfc21hcnRfem9vbV9zZXQ7CisgICAgYXBpLT5mbHVzaCA9IF9ld2tfdmlld19zbWFydF9mbHVz
aDsKKyAgICBhcGktPnByZV9yZW5kZXJfcmVnaW9uID0gX2V3a192aWV3X3NtYXJ0X3ByZV9yZW5k
ZXJfcmVnaW9uOworICAgIGFwaS0+cHJlX3JlbmRlcl9jYW5jZWwgPSBfZXdrX3ZpZXdfc21hcnRf
cHJlX3JlbmRlcl9jYW5jZWw7CisKKyAgICBhcGktPmZvY3VzX2luID0gX2V3a192aWV3X3NtYXJ0
X2ZvY3VzX2luOworICAgIGFwaS0+Zm9jdXNfb3V0ID0gX2V3a192aWV3X3NtYXJ0X2ZvY3VzX291
dDsKKyAgICBhcGktPm1vdXNlX3doZWVsID0gX2V3a192aWV3X3NtYXJ0X21vdXNlX3doZWVsOwor
ICAgIGFwaS0+bW91c2VfZG93biA9IF9ld2tfdmlld19zbWFydF9tb3VzZV9kb3duOworICAgIGFw
aS0+bW91c2VfdXAgPSBfZXdrX3ZpZXdfc21hcnRfbW91c2VfdXA7CisgICAgYXBpLT5tb3VzZV9t
b3ZlID0gX2V3a192aWV3X3NtYXJ0X21vdXNlX21vdmU7CisgICAgYXBpLT5rZXlfZG93biA9IF9l
d2tfdmlld19zbWFydF9rZXlfZG93bjsKKyAgICBhcGktPmtleV91cCA9IF9ld2tfdmlld19zbWFy
dF9rZXlfdXA7CisKKyAgICBhcGktPmFkZF9jb25zb2xlX21lc3NhZ2UgPSBfZXdrX3ZpZXdfc21h
cnRfYWRkX2NvbnNvbGVfbWVzc2FnZTsKKyAgICBhcGktPnJ1bl9qYXZhc2NyaXB0X2FsZXJ0ID0g
X2V3a192aWV3X3NtYXJ0X3J1bl9qYXZhc2NyaXB0X2FsZXJ0OworICAgIGFwaS0+cnVuX2phdmFz
Y3JpcHRfY29uZmlybSA9IF9ld2tfdmlld19zbWFydF9ydW5famF2YXNjcmlwdF9jb25maXJtOwor
ICAgIGFwaS0+cnVuX2phdmFzY3JpcHRfcHJvbXB0ID0gX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZh
c2NyaXB0X3Byb21wdDsKKyAgICBhcGktPnNob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlwdCA9IF9l
d2tfdmlld19zbWFydF9zaG91bGRfaW50ZXJydXB0X2phdmFzY3JpcHQ7CisKKyAgICByZXR1cm4g
RUlOQV9UUlVFOworfQorCisvKioKKyAqIFNldCBhIGZpeGVkIGxheW91dCBzaXplIHRvIGJlIHVz
ZWQsIGRpc3NvY2lhdGluZyBpdCBmcm9tIHZpZXdwb3J0IHNpemUuCisgKgorICogU2V0dGluZyBh
IHdpZHRoIGRpZmZlcmVudCB0aGFuIHplcm8gZW5hYmxlcyBmaXhlZCBsYXlvdXQgb24gdGhhdAor
ICogc2l6ZS4gSXQncyBhdXRvbWF0aWNhbGx5IHNjYWxlZCBiYXNlZCBvbiB6b29tLCBidXQgd2ls
bCBub3QgY2hhbmdlCisgKiBpZiB2aWV3cG9ydCBjaGFuZ2VzLgorICoKKyAqIFNldHRpbmcgYm90
aCBAYSB3IGFuZCBAYSBoIHRvIHplcm8gd2lsbCBkaXNhYmxlIGZpeGVkIGxheW91dC4KKyAqCisg
KiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGFuZ2UgZml4ZWQgbGF5b3V0LgorICogQHBhcmFt
IHcgZml4ZWQgd2lkdGggdG8gdXNlLiBUaGlzIHNpemUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNj
YWxlZAorICogICAgICAgIGJhc2VkIG9uIHpvb20gbGV2ZWwuCisgKiBAcGFyYW0gaCBmaXhlZCBo
ZWlnaHQgdG8gdXNlLiBUaGlzIHNpemUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNjYWxlZAorICog
ICAgICAgIGJhc2VkIG9uIHpvb20gbGV2ZWwuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfZml4ZWRfbGF5
b3V0X3NpemVfc2V0KEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCkK
K3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmll
dyA9IHNkLT5fcHJpdi0+bWFpbl9mcmFtZS0+dmlldygpOworICAgIGlmICh3IDw9IDAgJiYgaCA8
PSAwKSB7CisgICAgICAgIGlmICghcHJpdi0+Zml4ZWRfbGF5b3V0LnVzZSkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgcHJpdi0+Zml4ZWRfbGF5b3V0LncgPSAwOworICAgICAgICBwcml2
LT5maXhlZF9sYXlvdXQuaCA9IDA7CisgICAgICAgIHByaXYtPmZpeGVkX2xheW91dC51c2UgPSBF
SU5BX0ZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwcml2LT5maXhlZF9sYXlvdXQu
dXNlCisgICAgICAgICAgICAmJiBwcml2LT5maXhlZF9sYXlvdXQudyA9PSB3ICYmIHByaXYtPmZp
eGVkX2xheW91dC5oID09IGgpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHByaXYtPmZp
eGVkX2xheW91dC53ID0gdzsKKyAgICAgICAgcHJpdi0+Zml4ZWRfbGF5b3V0LmggPSBoOworICAg
ICAgICBwcml2LT5maXhlZF9sYXlvdXQudXNlID0gRUlOQV9UUlVFOworCisgICAgICAgIGlmICh2
aWV3KQorICAgICAgICAgICAgdmlldy0+c2V0Rml4ZWRMYXlvdXRTaXplKFdlYkNvcmU6OkludFNp
emUodywgaCkpOworICAgIH0KKworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJuOworICAg
IHZpZXctPnNldFVzZUZpeGVkTGF5b3V0KHByaXYtPmZpeGVkX2xheW91dC51c2UpOworICAgIHZp
ZXctPmZvcmNlTGF5b3V0KCk7Cit9CisKKy8qKgorICogR2V0IGZpeGVkIGxheW91dCBzaXplIGlu
IHVzZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBxdWVyeSBmaXhlZCBsYXlvdXQg
c2l6ZS4KKyAqIEBwYXJhbSB3IHdoZXJlIHRvIHJldHVybiB3aWR0aC4gUmV0dXJucyAwIG9uIGVy
cm9yIG9yIGlmIG5vIGZpeGVkCisgKiAgICAgICAgbGF5b3V0IGluIHVzZS4KKyAqIEBwYXJhbSBo
IHdoZXJlIHRvIHJldHVybiBoZWlnaHQuIFJldHVybnMgMCBvbiBlcnJvciBvciBpZiBubyBmaXhl
ZAorICogICAgICAgIGxheW91dCBpbiB1c2UuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfZml4ZWRfbGF5
b3V0X3NpemVfZ2V0KEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3JkKiB3LCBFdmFzX0Nvb3JkKiBo
KQoreworICAgIGlmICh3KQorICAgICAgICAqdyA9IDA7CisgICAgaWYgKGgpCisgICAgICAgICpo
ID0gMDsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklF
V19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIGlmIChwcml2LT5maXhlZF9sYXlv
dXQudXNlKSB7CisgICAgICAgIGlmICh3KQorICAgICAgICAgICAgKncgPSBwcml2LT5maXhlZF9s
YXlvdXQudzsKKyAgICAgICAgaWYgKGgpCisgICAgICAgICAgICAqaCA9IHByaXYtPmZpeGVkX2xh
eW91dC5oOworICAgIH0KK30KKworLyoqCisgKiBTZXQgdGhlIHRoZW1lIHBhdGggdG8gYmUgdXNl
ZCBieSB0aGlzIHZpZXcuCisgKgorICogVGhpcyBhbHNvIHNldHMgdGhlIHRoZW1lIG9uIHRoZSBt
YWluIGZyYW1lLiBBcyBmcmFtZXMgaW5oZXJpdCB0aGVtZQorICogZnJvbSB0aGVpciBwYXJlbnQs
IHRoaXMgd2lsbCBoYXZlIGFsbCBmcmFtZXMgd2l0aCB1bnNldCB0aGVtZSB0bworICogdXNlIHRo
aXMgb25lLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoYW5nZSB0aGVtZS4KKyAq
IEBwYXJhbSBwYXRoIHRoZW1lIHBhdGgsIG1heSBiZSBAYyBOVUxMIHRvIHJlc2V0IHRvIGRlZmF1
bHQuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfdGhlbWVfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBj
aGFyKiBwYXRoKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAg
IGV3a19mcmFtZV90aGVtZV9zZXQoc2QtPm1haW5fZnJhbWUsIHBhdGgpOworfQorCisvKioKKyAq
IEdldHMgdGhlIHRoZW1lIHNldCBvbiB0aGlzIGZyYW1lLgorICoKKyAqIFRoaXMgcmV0dXJucyB0
aGUgdmFsdWUgc2V0IGJ5IGV3a192aWV3X3RoZW1lX3NldCgpLgorICoKKyAqIEBwYXJhbSBvIHZp
ZXcgb2JqZWN0IHRvIGdldCB0aGVtZSBwYXRoLgorICoKKyAqIEByZXR1cm4gdGhlbWUgcGF0aCwg
bWF5IGJlIEBjIE5VTEwgaWYgbm90IHNldC4KKyAqLworY29uc3QgY2hhciogZXdrX3ZpZXdfdGhl
bWVfZ2V0KEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QsIDApOworICAgIHJldHVybiBld2tfZnJhbWVfdGhlbWVfZ2V0KHNkLT5tYWluX2ZyYW1l
KTsKK30KKworLyoqCisgKiBHZXQgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG1haW4g
ZnJhbWUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IG1haW4gZnJhbWUuCisg
KgorICogQHJldHVybiBld2tfZnJhbWUgb2JqZWN0IG9yIEBjIE5VTEwgaWYgbm9uZSB5ZXQuCisg
Ki8KK0V2YXNfT2JqZWN0KiBld2tfdmlld19mcmFtZV9tYWluX2dldChjb25zdCBFdmFzX09iamVj
dCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBy
ZXR1cm4gc2QtPm1haW5fZnJhbWU7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50bHkgZm9j
dXNlZCBmcmFtZSBvYmplY3QuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IGZv
Y3VzZWQgZnJhbWUuCisgKgorICogQHJldHVybiBld2tfZnJhbWUgb2JqZWN0IG9yIEBjIE5VTEwg
aWYgbm9uZSB5ZXQuCisgKi8KK0V2YXNfT2JqZWN0KiBld2tfdmlld19mcmFtZV9mb2N1c2VkX2dl
dChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJO
KG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDAp
OworCisgICAgV2ViQ29yZTo6RnJhbWUqIGNvcmUgPSBwcml2LT5wYWdlLT5mb2N1c0NvbnRyb2xs
ZXIoKS0+Zm9jdXNlZEZyYW1lKCk7CisgICAgaWYgKCFjb3JlKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50RWZsKiBjbGllbnQgPSBzdGF0aWNfY2Fz
dDxXZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudEVmbCo+KGNvcmUtPmxvYWRlcigpLT5jbGllbnQo
KSk7CisgICAgaWYgKCFjbGllbnQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBjbGll
bnQtPndlYkZyYW1lKCk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gbG9hZCB0aGUg
Z2l2ZW4gVVJJLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGxvYWQgdXJpLgorICog
QHBhcmFtIHVyaSB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIgdG8gbG9hZC4KKyAqCisgKiBA
cmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzZnVsIHJlcXVlc3QsIEBjIEVJTkFfRkFMU0Ug
b24gZmFpbHVyZS4KKyAqICAgICAgICAgTm90ZSB0aGF0IGl0IG1lYW5zIHRoZSByZXF1ZXN0IHdh
cyBkb25lLCBub3QgdGhhdCBpdCB3YXMKKyAqICAgICAgICAgc2F0aXNmaWVkLgorICovCitFaW5h
X0Jvb2wgZXdrX3ZpZXdfdXJpX3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogdXJpKQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAg
IHJldHVybiBld2tfZnJhbWVfdXJpX3NldChzZC0+bWFpbl9mcmFtZSwgdXJpKTsKK30KKworLyoq
CisgKiBHZXQgdGhlIGN1cnJlbnQgdXJpIGxvYWRlZCBieSBtYWluIGZyYW1lLgorICoKKyAqIEBw
YXJhbSBvIHZpZXcgb2JqZWN0IHRvIGdldCBjdXJyZW50IHVyaS4KKyAqCisgKiBAcmV0dXJuIGN1
cnJlbnQgdXJpIHJlZmVyZW5jZSBvciBAYyBOVUxMLiBJdCdzIGludGVybmFsLCBkb24ndCBjaGFu
Z2UuCisgKi8KK2NvbnN0IGNoYXIqIGV3a192aWV3X3VyaV9nZXQoY29uc3QgRXZhc19PYmplY3Qq
IG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgcmV0
dXJuIGV3a19mcmFtZV91cmlfZ2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBHZXQg
dGhlIGN1cnJlbnQgdGl0bGUgb2YgbWFpbiBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9i
amVjdCB0byBnZXQgY3VycmVudCB0aXRsZS4KKyAqCisgKiBAcmV0dXJuIGN1cnJlbnQgdGl0bGUg
cmVmZXJlbmNlIG9yIEBjIE5VTEwuIEl0J3MgaW50ZXJuYWwsIGRvbid0IGNoYW5nZS4KKyAqLwor
Y29uc3QgY2hhciogZXdrX3ZpZXdfdGl0bGVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQorewor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIHJldHVybiBld2tf
ZnJhbWVfdGl0bGVfZ2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBHZXRzIGlmIG1h
aW4gZnJhbWUgaXMgZWRpdGFibGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0
IGVkaXRhYmxlIHN0YXRlLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIGVkaXRhYmxl
LCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X2VkaXRh
YmxlX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2VkaXRhYmxl
X2dldChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogU2V0IGJhY2tncm91bmQgY29sb3Ig
YW5kIHRyYW5zcGFyZW5jeQorICoKKyAqIEp1c3QgYXMgaW4gRXZhcywgY29sb3JzIGFyZSBwcmUt
bXVsdGlwbGllZCwgc28gNTAlIHJlZCBpcworICogKDEyOCwgMCwgMCwgMTI4KSBhbmQgbm90ICgy
NTUsIDAsIDAsIDEyOCkhCisgKgorICogQHdhcm5pbmcgV2F0Y2ggb3V0IHBlcmZvcm1hbmNlIGlz
c3VlcyB3aXRoIHRyYW5zcGFyZW5jeSEgT2JqZWN0CisgKiAgICAgICAgICB3aWxsIGJlIGhhbmRs
ZWQgYXMgdHJhbnNwYXJlbnQgaW1hZ2UgYnkgZXZhcyBldmVuIGlmIHRoZQorICogICAgICAgICAg
d2VicGFnZSBzcGVjaWZpZXMgYSBiYWNrZ3JvdW5kIGNvbG9yLiBUaGF0IG1lYW4geW91J2xsIHBh
eQorICogICAgICAgICAgYSBwcmljZSBldmVuIGlmIGl0J3Mgbm90IHJlYWxseSB0cmFuc3BhcmVu
dCwgdGh1cworICogICAgICAgICAgc2Nyb2xsaW5nL3Bhbm5pbmcgYW5kIHpvb21pbmcgd2lsbCBi
ZSBsaWtlbHkgc2xvd2VyIHRoYW4KKyAqICAgICAgICAgIGlmIHRyYW5zcGFyZW5jeSBpcyBvZmYu
CisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gY2hhbmdlLgorICogQHBhcmFtIHIgcmVk
IGNvbXBvbmVudC4KKyAqIEBwYXJhbSBnIGdyZWVuIGNvbXBvbmVudC4KKyAqIEBwYXJhbSBiIGJs
dWUgY29tcG9uZW50LgorICogQHBhcmFtIGEgdHJhbnNwYXJlbmN5LgorICovCit2b2lkIGV3a192
aWV3X2JnX2NvbG9yX3NldChFdmFzX09iamVjdCogbywgaW50IHIsIGludCBnLCBpbnQgYiwgaW50
IGEpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgRUlOQV9T
QUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9S
RVRVUk4oc2QtPmFwaS0+YmdfY29sb3Jfc2V0KTsKKworICAgIGlmIChhIDwgMCkgeworICAgICAg
ICBXUk4oIkFscGhhIGxlc3MgdGhhbiB6ZXJvICglZCkuIiwgYSk7CisgICAgICAgIGEgPSAwOwor
ICAgIH0gZWxzZSBpZiAoYSA+IDI1NSkgeworICAgICAgICBXUk4oIkFscGhhIGlzIGxhcmdlciB0
aGFuIDI1NSAoJWQpLiIsIGEpOworICAgICAgICBhID0gMjU1OworICAgIH0KKworI2RlZmluZSBD
SEVDS19QUkVNVUxfQ09MT1IoYywgYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgIGlmIChjIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXUk4oIkNvbG9yIGNvbXBvbmVudCAi
I2MiIGlzIGxlc3MgdGhhbiB6ZXJvICglZCkuIiwgYyk7ICAgICAgICAgXAorICAgICAgICBjID0g
MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgIH0gZWxzZSBpZiAoYyA+IGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXUk4oIkNvbG9yIGNvbXBvbmVudCAiI2Mi
IGlzIGdyZWF0ZXIgdGhhbiBhbHBoYSAoJWQsIGFscGhhPSVkKS4iLCBcCisgICAgICAgICAgICBj
LCBhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgICAgIGMgPSBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgIENIRUNLX1BSRU1VTF9DT0xPUihyLCBh
KTsKKyAgICBDSEVDS19QUkVNVUxfQ09MT1IoZywgYSk7CisgICAgQ0hFQ0tfUFJFTVVMX0NPTE9S
KGIsIGEpOworI3VuZGVmIENIRUNLX1BSRU1VTF9DT0xPUgorCisgICAgc2QtPmJnX2NvbG9yLnIg
PSByOworICAgIHNkLT5iZ19jb2xvci5nID0gZzsKKyAgICBzZC0+YmdfY29sb3IuYiA9IGI7Cisg
ICAgc2QtPmJnX2NvbG9yLmEgPSBhOworCisgICAgc2QtPmFwaS0+YmdfY29sb3Jfc2V0KHNkLCBy
LCBnLCBiLCBhKTsKKworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IHNkLT5fcHJpdi0+
bWFpbl9mcmFtZS0+dmlldygpOworICAgIGlmICh2aWV3KSB7CisgICAgICAgIFdlYkNvcmU6OkNv
bG9yIGNvbG9yOworCisgICAgICAgIGlmICghYSkKKyAgICAgICAgICAgIGNvbG9yID0gV2ViQ29y
ZTo6Q29sb3IoMCwgMCwgMCwgMCk7CisgICAgICAgIGVsc2UgaWYgKGEgPT0gMjU1KQorICAgICAg
ICAgICAgY29sb3IgPSBXZWJDb3JlOjpDb2xvcihyLCBnLCBiLCBhKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgY29sb3IgPSBXZWJDb3JlOjpDb2xvcihyICogMjU1IC8gYSwgZyAqIDI1NSAv
IGEsIGIgKiAyNTUgLyBhLCBhKTsKKworICAgICAgICB2aWV3LT51cGRhdGVCYWNrZ3JvdW5kUmVj
dXJzaXZlbHkoY29sb3IsICFhKTsKKyAgICB9Cit9CisKKy8qKgorICogUXVlcnkgaWYgdmlldyBv
YmplY3QgYmFja2dyb3VuZCBjb2xvci4KKyAqCisgKiBKdXN0IGFzIGluIEV2YXMsIGNvbG9ycyBh
cmUgcHJlLW11bHRpcGxpZWQsIHNvIDUwJSByZWQgaXMKKyAqICgxMjgsIDAsIDAsIDEyOCkgYW5k
IG5vdCAoMjU1LCAwLCAwLCAxMjgpIQorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHF1
ZXJ5LgorICogQHBhcmFtIHIgd2hlcmUgdG8gcmV0dXJuIHJlZCBjb2xvciBjb21wb25lbnQuCisg
KiBAcGFyYW0gZyB3aGVyZSB0byByZXR1cm4gZ3JlZW4gY29sb3IgY29tcG9uZW50LgorICogQHBh
cmFtIGIgd2hlcmUgdG8gcmV0dXJuIGJsdWUgY29sb3IgY29tcG9uZW50LgorICogQHBhcmFtIGEg
d2hlcmUgdG8gcmV0dXJuIGFscGhhIHZhbHVlLgorICovCit2b2lkIGV3a192aWV3X2JnX2NvbG9y
X2dldChjb25zdCBFdmFzX09iamVjdCogbywgaW50KiByLCBpbnQqIGcsIGludCogYiwgaW50KiBh
KQoreworICAgIGlmIChyKQorICAgICAgICAqciA9IDA7CisgICAgaWYgKGcpCisgICAgICAgICpn
ID0gMDsKKyAgICBpZiAoYikKKyAgICAgICAgKmIgPSAwOworICAgIGlmIChhKQorICAgICAgICAq
YSA9IDA7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgaWYgKHIp
CisgICAgICAgICpyID0gc2QtPmJnX2NvbG9yLnI7CisgICAgaWYgKGcpCisgICAgICAgICpnID0g
c2QtPmJnX2NvbG9yLmc7CisgICAgaWYgKGIpCisgICAgICAgICpiID0gc2QtPmJnX2NvbG9yLmI7
CisgICAgaWYgKGEpCisgICAgICAgICphID0gc2QtPmJnX2NvbG9yLmE7Cit9CisKKy8qKgorICog
U2VhcmNoIHRoZSBnaXZlbiB0ZXh0IHN0cmluZyBpbiBkb2N1bWVudC4KKyAqCisgKiBAcGFyYW0g
byB2aWV3IG9iamVjdCB3aGVyZSB0byBzZWFyY2ggdGV4dC4KKyAqIEBwYXJhbSBzdHJpbmcgcmVm
ZXJlbmNlIHN0cmluZyB0byBzZWFyY2guCisgKiBAcGFyYW0gY2FzZV9zZW5zaXRpdmUgaWYgc2Vh
cmNoIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSBvciBub3QuCisgKiBAcGFyYW0gZm9yd2FyZCBp
ZiBzZWFyY2ggaXMgZnJvbSBjdXJzb3IgYW5kIG9uIG9yIGJhY2t3YXJkcy4KKyAqIEBwYXJhbSB3
cmFwIGlmIHNlYXJjaCBzaG91bGQgd3JhcCBhdCBlbmQuCisgKgorICogQHJldHVybiBAYyBFSU5B
X1RSVUUgaWYgZm91bmQsIEBjIEVJTkFfRkFMU0UgaWYgbm90IG9yIGZhaWx1cmUuCisgKi8KK0Vp
bmFfQm9vbCBld2tfdmlld190ZXh0X3NlYXJjaChjb25zdCBFdmFzX09iamVjdCogbywgY29uc3Qg
Y2hhciogc3RyaW5nLCBFaW5hX0Jvb2wgY2FzZV9zZW5zaXRpdmUsIEVpbmFfQm9vbCBmb3J3YXJk
LCBFaW5hX0Jvb2wgd3JhcCkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYs
IEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChzdHJpbmcs
IEVJTkFfRkFMU0UpOworICAgIFdlYkNvcmU6OlRleHRDYXNlU2Vuc2l0aXZpdHkgc2Vuc2l0aXZl
OworICAgIFdlYkNvcmU6OkZpbmREaXJlY3Rpb24gZGlyZWN0aW9uOworCisgICAgaWYgKGNhc2Vf
c2Vuc2l0aXZlKQorICAgICAgICBzZW5zaXRpdmUgPSBXZWJDb3JlOjpUZXh0Q2FzZVNlbnNpdGl2
ZTsKKyAgICBlbHNlCisgICAgICAgIHNlbnNpdGl2ZSA9IFdlYkNvcmU6OlRleHRDYXNlSW5zZW5z
aXRpdmU7CisKKyAgICBpZiAoZm9yd2FyZCkKKyAgICAgICAgZGlyZWN0aW9uID0gV2ViQ29yZTo6
RmluZERpcmVjdGlvbkZvcndhcmQ7CisgICAgZWxzZQorICAgICAgICBkaXJlY3Rpb24gPSBXZWJD
b3JlOjpGaW5kRGlyZWN0aW9uQmFja3dhcmQ7CisKKyAgICByZXR1cm4gcHJpdi0+cGFnZS0+Zmlu
ZFN0cmluZyhXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KHN0cmluZyksIHNlbnNpdGl2ZSwgZGly
ZWN0aW9uLCB3cmFwKTsKK30KKworLyoqCisgKiBNYXJrIG1hdGNoZXMgdGhlIGdpdmVuIHRleHQg
c3RyaW5nIGluIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHdoZXJlIHRv
IHNlYXJjaCB0ZXh0LgorICogQHBhcmFtIHN0cmluZyByZWZlcmVuY2Ugc3RyaW5nIHRvIG1hdGNo
LgorICogQHBhcmFtIGNhc2Vfc2Vuc2l0aXZlIGlmIG1hdGNoIHNob3VsZCBiZSBjYXNlIHNlbnNp
dGl2ZSBvciBub3QuCisgKiBAcGFyYW0gaGlnaGxpZ2h0IGlmIG1hdGNoZXMgc2hvdWxkIGJlIGhp
Z2hsaWdodGVkLgorICogQHBhcmFtIGxpbWl0IG1heGltdW0gYW1vdW50IG9mIG1hdGNoZXMsIG9y
IHplcm8gdG8gdW5saW1pdGVkLgorICoKKyAqIEByZXR1cm4gbnVtYmVyIG9mIG1hdGNoZXMuCisg
Ki8KK3Vuc2lnbmVkIGludCBld2tfdmlld190ZXh0X21hdGNoZXNfbWFyayhFdmFzX09iamVjdCog
bywgY29uc3QgY2hhciogc3RyaW5nLCBFaW5hX0Jvb2wgY2FzZV9zZW5zaXRpdmUsIEVpbmFfQm9v
bCBoaWdobGlnaHQsIHVuc2lnbmVkIGludCBsaW1pdCkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2Qs
IHByaXYsIDApOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChzdHJpbmcsIDAp
OworICAgIFdlYkNvcmU6OlRleHRDYXNlU2Vuc2l0aXZpdHkgc2Vuc2l0aXZlOworCisgICAgaWYg
KGNhc2Vfc2Vuc2l0aXZlKQorICAgICAgICBzZW5zaXRpdmUgPSBXZWJDb3JlOjpUZXh0Q2FzZVNl
bnNpdGl2ZTsKKyAgICBlbHNlCisgICAgICAgIHNlbnNpdGl2ZSA9IFdlYkNvcmU6OlRleHRDYXNl
SW5zZW5zaXRpdmU7CisKKyAgICByZXR1cm4gcHJpdi0+cGFnZS0+bWFya0FsbE1hdGNoZXNGb3JU
ZXh0KFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgoc3RyaW5nKSwgc2Vuc2l0aXZlLCBoaWdobGln
aHQsIGxpbWl0KTsKK30KKworLyoqCisgKiBSZXZlcnNlcyB0aGUgZWZmZWN0IG9mIGV3a192aWV3
X3RleHRfbWF0Y2hlc19tYXJrKCkKKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB3aGVyZSB0
byBzZWFyY2ggdGV4dC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBA
YyBFSU5BX0ZBTFNFIGZvciBmYWlsdXJlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfdGV4dF9t
YXRjaGVzX3VubWFya19hbGwoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBwcml2LT5wYWdlLT51bm1hcmtBbGxU
ZXh0TWF0Y2hlcygpOworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogU2V0IGlm
IHNob3VsZCBoaWdobGlnaHQgbWF0Y2hlcyBtYXJrZWQgd2l0aCBld2tfdmlld190ZXh0X21hdGNo
ZXNfbWFyaygpLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHdoZXJlIHRvIHNldCBpZiBt
YXRjaGVzIGFyZSBoaWdobGlnaHRlZCBvciBub3QuCisgKiBAcGFyYW0gaGlnaGxpZ2h0IGlmIEBj
IEVJTkFfVFJVRSwgbWF0Y2hlcyB3aWxsIGJlIGhpZ2hsaWdodGVkLgorICoKKyAqIEByZXR1cm4g
QGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFfRkFMU0UgZm9yIGZhaWx1cmUuCisgKi8K
K0VpbmFfQm9vbCBld2tfdmlld190ZXh0X21hdGNoZXNfaGlnaGxpZ2h0X3NldChFdmFzX09iamVj
dCogbywgRWluYV9Cb29sIGhpZ2hsaWdodCkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3RleHRfbWF0Y2hl
c19oaWdobGlnaHRfc2V0KHNkLT5tYWluX2ZyYW1lLCBoaWdobGlnaHQpOworfQorCisvKioKKyAq
IEdldCBpZiBzaG91bGQgaGlnaGxpZ2h0IG1hdGNoZXMgbWFya2VkIHdpdGggZXdrX3ZpZXdfdGV4
dF9tYXRjaGVzX21hcmsoKS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBxdWVyeSBp
ZiBtYXRjaGVzIGFyZSBoaWdobGlnaHRlZCBvciBub3QuCisgKgorICogQHJldHVybiBAYyBFSU5B
X1RSVUUgaWYgdGhleSBhcmUgaGlnaGxpZ2h0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgor
ICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfdGV4dF9tYXRjaGVzX2hpZ2hsaWdodF9nZXQoY29uc3Qg
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV90ZXh0X21hdGNoZXNfaGlnaGxpZ2h0
X2dldChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogU2V0cyBpZiBtYWluIGZyYW1lIGlz
IGVkaXRhYmxlLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHNldCBlZGl0YWJsZSBz
dGF0ZS4KKyAqIEBwYXJhbSBlZGl0YWJsZSBuZXcgc3RhdGUuCisgKgorICogQHJldHVybiBAYyBF
SU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFf
Qm9vbCBld2tfdmlld19lZGl0YWJsZV9zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCBlZGl0
YWJsZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNF
KTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2VkaXRhYmxlX3NldChzZC0+bWFpbl9mcmFtZSwgZWRp
dGFibGUpOworfQorCisvKioKKyAqIEdldCB0aGUgY29weSBvZiB0aGUgc2VsZWN0aW9uIHRleHQu
CisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IHNlbGVjdGlvbiB0ZXh0LgorICoK
KyAqIEByZXR1cm4gbmV3bHkgYWxsb2NhdGVkIHN0cmluZyBvciBAYyBOVUxMIGlmIG5vdGhpbmcg
aXMgc2VsZWN0ZWQgb3IgZmFpbHVyZS4KKyAqLworY2hhciogZXdrX3ZpZXdfc2VsZWN0aW9uX2dl
dChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJO
KG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDAp
OworICAgIFdlYkNvcmU6OkNTdHJpbmcgcyA9IHByaXYtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigp
LT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2VsZWN0ZWRUZXh0KCkudXRmOCgpOworICAgIGlmIChz
LmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc3RyZHVwKHMuZGF0YSgp
KTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfZWRpdG9yX2NvbW1hbmQoRXdrX1Zp
ZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBjb25zdCBjaGFyKiBjb21tYW5kKQoreworICAgIHJldHVy
biBwcml2LT5wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmVk
aXRvcigpLT5jb21tYW5kKFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgoY29tbWFuZCkpLmV4ZWN1
dGUoKTsKK30KKworLyoqCisgKiBVbnNlbGVjdHMgd2hhdGV2ZXIgd2FzIHNlbGVjdGVkLgorICoK
KyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIG9wZXJhdGlvbiB3YXMgZXhlY3V0ZWQsIEBjIEVJ
TkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2VsZWN0X25vbmUo
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBF
SU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3a192aWV3X2VkaXRvcl9jb21tYW5kKHByaXYsICJV
bnNlbGVjdCIpOworfQorCisvKioKKyAqIFNlbGVjdHMgZXZlcnl0aGluZy4KKyAqCisgKiBAcmV0
dXJuIEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNF
IG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3NlbGVjdF9hbGwoRXZhc19PYmpl
Y3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxT
RSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNF
KTsKKyAgICByZXR1cm4gX2V3a192aWV3X2VkaXRvcl9jb21tYW5kKHByaXYsICJTZWxlY3RBbGwi
KTsKK30KKworLyoqCisgKiBTZWxlY3RzIHRoZSBjdXJyZW50IHBhcmFncmFoLgorICoKKyAqIEBy
ZXR1cm4gQGMgRUlOQV9UUlVFIGlmIG9wZXJhdGlvbiB3YXMgZXhlY3V0ZWQsIEBjIEVJTkFfRkFM
U0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2VsZWN0X3BhcmFncmFwaChF
dmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBF
SU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJ
TkFfRkFMU0UpOworICAgIHJldHVybiBfZXdrX3ZpZXdfZWRpdG9yX2NvbW1hbmQocHJpdiwgIlNl
bGVjdFBhcmFncmFwaCIpOworfQorCisvKioKKyAqIFNlbGVjdHMgdGhlIGN1cnJlbnQgc2VudGVu
Y2UuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgb3BlcmF0aW9uIHdhcyBleGVjdXRl
ZCwgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19zZWxl
Y3Rfc2VudGVuY2UoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3a192aWV3X2VkaXRvcl9jb21t
YW5kKHByaXYsICJTZWxlY3RTZW50ZW5jZSIpOworfQorCisvKioKKyAqIFNlbGVjdHMgdGhlIGN1
cnJlbnQgbGluZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRpb24gd2Fz
IGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192
aWV3X3NlbGVjdF9saW5lKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JF
VFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIF9ld2tfdmlld19lZGl0b3Jf
Y29tbWFuZChwcml2LCAiU2VsZWN0TGluZSIpOworfQorCisvKioKKyAqIFNlbGVjdHMgdGhlIGN1
cnJlbnQgd29yZC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRpb24gd2Fz
IGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192
aWV3X3NlbGVjdF93b3JkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JF
VFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIF9ld2tfdmlld19lZGl0b3Jf
Y29tbWFuZChwcml2LCAiU2VsZWN0V29yZCIpOworfQorCisvKioKKyAqIEdldCBjdXJyZW50IGxv
YWQgcHJvZ3Jlc3MgZXN0aW1hdGUgZnJvbSAwLjAgdG8gMS4wLgorICoKKyAqIEBwYXJhbSBvIHZp
ZXcgb2JqZWN0IHRvIGdldCBjdXJyZW50IHByb2dyZXNzLgorICoKKyAqIEByZXR1cm4gcHJvZ3Jl
cyB2YWx1ZSBmcm9tIDAuMCB0byAxLjAgb3IgLTEuMCBvbiBlcnJvci4KKyAqLworZG91YmxlIGV3
a192aWV3X2xvYWRfcHJvZ3Jlc3NfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVX
S19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIC0xLjApOworICAgIEVXS19WSUVXX1BSSVZf
R0VUX09SX1JFVFVSTihzZCwgcHJpdiwgLTEuMCk7CisgICAgcmV0dXJuIHByaXYtPnBhZ2UtPnBy
b2dyZXNzKCktPmVzdGltYXRlZFByb2dyZXNzKCk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJh
bWUgdG8gc3RvcCBsb2FkaW5nLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHN0b3Ag
bG9hZGluZy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5B
X0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a19mcmFtZV9zdG9wKCkKKyAqLworRWlu
YV9Cb29sIGV3a192aWV3X3N0b3AoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9z
dG9wKHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0byByZWxv
YWQgY3VycmVudCBkb2N1bWVudC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byByZWxv
YWQuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxT
RSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJhbWVfcmVsb2FkKCkKKyAqLworRWluYV9C
b29sIGV3a192aWV3X3JlbG9hZChFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9H
RVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3Jl
bG9hZChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gZnVs
bHkgcmVsb2FkIGN1cnJlbnQgZG9jdW1lbnQsIHVzaW5nIG5vIGNhY2hlcy4KKyAqCisgKiBAcGFy
YW0gbyB2aWV3IG9iamVjdCB0byByZWxvYWQuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUg
b24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJh
bWVfcmVsb2FkX2Z1bGwoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfcmVsb2FkX2Z1bGwoRXZh
c19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlO
QV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9yZWxvYWRfZnVsbChzZC0+bWFpbl9mcmFt
ZSk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gbmF2aWdhdGUgYmFjayBpbiBoaXN0
b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIG5hdmlnYXRlIGJhY2suCisgKgor
ICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndp
c2UuCisgKgorICogQHNlZSBld2tfZnJhbWVfYmFjaygpCisgKi8KK0VpbmFfQm9vbCBld2tfdmll
d19iYWNrKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVfYmFjayhzZC0+bWFpbl9m
cmFtZSk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gbmF2aWdhdGUgZm9yd2FyZCBp
biBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIG5hdmlnYXRlIGZvcndh
cmQuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxT
RSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJhbWVfZm9yd2FyZCgpCisgKi8KK0VpbmFf
Qm9vbCBld2tfdmlld19mb3J3YXJkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NE
X0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVf
Zm9yd2FyZChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogTmF2aWdhdGUgYmFjayBvciBm
b3J3YXJkIGluIGhpc3RvcnkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gbmF2aWdh
dGUuCisgKiBAcGFyYW0gc3RlcHMgaWYgcG9zaXRpdmUgbmF2aWdhdGVzIHRoYXQgYW1vdW50IGZv
cndhcmRzLCBpZiBuZWdhdGl2ZQorICogICAgICAgIGRvZXMgYmFja3dhcmRzLgorICoKKyAqIEBy
ZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgor
ICoKKyAqIEBzZWUgZXdrX2ZyYW1lX25hdmlnYXRlKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3
X25hdmlnYXRlKEV2YXNfT2JqZWN0KiBvLCBpbnQgc3RlcHMpCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9u
YXZpZ2F0ZShzZC0+bWFpbl9mcmFtZSwgc3RlcHMpOworfQorCisvKioKKyAqIENoZWNrIGlmIGl0
IGlzIHBvc3NpYmxlIHRvIG5hdmlnYXRlIGJhY2t3YXJkcyBvbmUgaXRlbSBpbiBoaXN0b3J5Lgor
ICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoZWNrIGlmIGJhY2t3YXJkIG5hdmlnYXRp
b24gaXMgcG9zc2libGUuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgcG9zc2libGUs
IEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfbmF2aWdhdGVf
cG9zc2libGUoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfYmFja19wb3NzaWJsZShFdmFzX09i
amVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZB
TFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2JhY2tfcG9zc2libGUoc2QtPm1haW5fZnJhbWUp
OworfQorCisvKioKKyAqIENoZWNrIGlmIGl0IGlzIHBvc3NpYmxlIHRvIG5hdmlnYXRlIGZvcndh
cmRzIG9uZSBpdGVtIGluIGhpc3RvcnkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8g
Y2hlY2sgaWYgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIHBvc3NpYmxlLgorICoKKyAqIEByZXR1cm4g
QGMgRUlOQV9UUlVFIGlmIHBvc3NpYmxlLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisg
KiBAc2VlIGV3a192aWV3X25hdmlnYXRlX3Bvc3NpYmxlKCkKKyAqLworRWluYV9Cb29sIGV3a192
aWV3X2ZvcndhcmRfcG9zc2libGUoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9m
b3J3YXJkX3Bvc3NpYmxlKHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBDaGVjayBpZiBp
dCBpcyBwb3NzaWJsZSB0byBuYXZpZ2F0ZSBnaXZlbiBAYSBzdGVwcyBpbiBoaXN0b3J5LgorICoK
KyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIG5hdmlnYXRlLgorICogQHBhcmFtIHN0ZXBzIGlm
IHBvc2l0aXZlIG5hdmlnYXRlcyB0aGF0IGFtb3VudCBmb3J3YXJkcywgaWYgbmVnYXRpdmUKKyAq
ICAgICAgICBkb2VzIGJhY2t3YXJkcy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBw
b3NzaWJsZSwgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmll
d19uYXZpZ2F0ZV9wb3NzaWJsZShFdmFzX09iamVjdCogbywgaW50IHN0ZXBzKQoreworICAgIEVX
S19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBl
d2tfZnJhbWVfbmF2aWdhdGVfcG9zc2libGUoc2QtPm1haW5fZnJhbWUsIHN0ZXBzKTsKK30KKwor
LyoqCisgKiBDaGVjayBpZiBuYXZpZ2F0aW9uIGhpc3RvcnkgKGJhY2stZm9yd2FyZCBsaXN0cykg
aXMgZW5hYmxlZC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGVjayBpZiBuYXZp
Z2F0aW9uIGhpc3RvcnkgaXMgZW5hYmxlZC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBp
ZiB2aWV3IGtlZXBzIGhpc3RvcnksIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5h
X0Jvb2wgZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAg
IEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAg
cmV0dXJuIHByaXYtPnBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpLT5lbmFibGVkKCk7Cit9CisKKy8q
KgorICogU2V0cyBpZiBuYXZpZ2F0aW9uIGhpc3RvcnkgKGJhY2stZm9yd2FyZCBsaXN0cykgaXMg
ZW5hYmxlZC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBzZXQgaWYgbmF2aWdhdGlv
biBoaXN0b3J5IGlzIGVuYWJsZWQuCisgKiBAcGFyYW0gZW5hYmxlIEBjIEVJTkFfVFJVRSBpZiB3
ZSB3YW50IHRvIGVuYWJsZSBuYXZpZ2F0aW9uIGhpc3Rvcnk7CisgKiBAYyBFSU5BX0ZBTFNFIG90
aGVyd2lzZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5B
X0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X2hpc3RvcnlfZW5hYmxl
X3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBFV0tfVklFV19T
RF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dF
VF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHByaXYtPnBhZ2UtPmJhY2tG
b3J3YXJkTGlzdCgpLT5zZXRFbmFibGVkKGVuYWJsZSk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsK
K30KKworLyoqCisgKiBHZXRzIHRoZSBoaXN0b3J5IChiYWNrLWZvcndhcmQgbGlzdCkgYXNzb2Np
YXRlZCB3aXRoIHRoaXMgdmlldy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBnZXQg
bmF2aWdhdGlvbiBoaXN0b3J5IGZyb20uCisgKgorICogQHJldHVybiByZXR1cm5zIHRoZSBoaXN0
b3J5IGluc3RhbmNlIGhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogICAgICAgICB2aWV3
IG9yIEBjIE5VTEwgb24gZXJyb3JzIChpbmNsdWRpbmcgd2hlbiBoaXN0b3J5IGlzIG5vdAorICog
ICAgICAgICBlbmFibGVkIHdpdGggZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfc2V0KCkpLiBUaGlz
IGluc3RhbmNlCisgKiAgICAgICAgIGlzIHVuaXF1ZSBmb3IgdGhpcyB2aWV3IGFuZCB0aHVzIG11
bHRpcGxlIGNhbGxzIHRvIHRoaXMKKyAqICAgICAgICAgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSB2
aWV3IGFzIHBhcmFtZXRlciByZXR1cm5zIHRoZSBzYW1lCisgKiAgICAgICAgIGhhbmRsZS4gVGhp
cyBoYW5kbGUgaXMgYWxpdmUgd2hpbGUgdmlldyBpcyBhbGl2ZSwgdGh1cyBvbmUKKyAqICAgICAg
ICAgbWlnaHQgd2FudCB0byBsaXN0ZW4gZm9yIEVWQVNfQ0FMTEJBQ0tfREVMIG9uIGdpdmVuIHZp
ZXcKKyAqICAgICAgICAgKEBhIG8pIHRvIGtub3cgd2hlbiB0byBzdG9wIHVzaW5nIHJldHVybmVk
IGhhbmRsZS4KKyAqCisgKiBAc2VlIGV3a192aWV3X2hpc3RvcnlfZW5hYmxlX3NldCgpCisgKi8K
K0V3a19IaXN0b3J5KiBld2tfdmlld19oaXN0b3J5X2dldChjb25zdCBFdmFzX09iamVjdCogbykK
K3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklF
V19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIGlmICghcHJpdi0+cGFnZS0+
YmFja0ZvcndhcmRMaXN0KCktPmVuYWJsZWQoKSkgeworICAgICAgICBFUlIoImFza2VkIGhpc3Rv
cnksIGJ1dCBpdCdzIGRpc2FibGVkISBSZXR1cm5pbmcgTlVMTCEiKTsKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgfQorICAgIHJldHVybiBwcml2LT5oaXN0b3J5OworfQorCisvKioKKyAqIEdldCB0
aGUgY3VycmVudCB6b29tIGxldmVsIG9mIG1haW4gZnJhbWUuCisgKgorICogQHBhcmFtIG8gdmll
dyBvYmplY3QgdG8gcXVlcnkgem9vbSBsZXZlbC4KKyAqCisgKiBAcmV0dXJuIGN1cnJlbnQgem9v
bSBsZXZlbCBpbiB1c2Ugb3IgLTEuMCBvbiBlcnJvci4KKyAqLworZmxvYXQgZXdrX3ZpZXdfem9v
bV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgLTEuMCk7CisgICAgcmV0dXJuIGV3a19mcmFtZV96b29tX2dldChzZC0+bWFp
bl9mcmFtZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwgb2YgbWFp
biBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBzZXQgem9vbSBsZXZlbC4K
KyAqIEBwYXJhbSB6b29tIG5ldyBsZXZlbCB0byB1c2UuCisgKiBAcGFyYW0gY3ggeCBvZiBjZW50
ZXIgY29vcmRpbmF0ZQorICogQHBhcmFtIGN5IHkgb2YgY2VudGVyIGNvb3JkaW5hdGUKKyAqCisg
KiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lz
ZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fc2V0KEV2YXNfT2JqZWN0KiBvLCBmbG9h
dCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KQoreworICAgIEVXS19WSUVXX1NE
X0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05V
TExfUkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9O
VUxMX1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV9zZXQsIEVJTkFfRkFMU0UpOworICAgIGlmICh6
b29tIDwgWk9PTV9NSU4pIHsKKyAgICAgICAgV1JOKCJ6b29tIGxldmVsIGlzIDwgJWYgOiAlZiIs
IChkb3VibGUpWk9PTV9NSU4sIChkb3VibGUpem9vbSk7CisgICAgICAgIHJldHVybiBFSU5BX0ZB
TFNFOworICAgIH0KKyAgICBpZiAoem9vbSA+IFpPT01fTUFYKSB7CisgICAgICAgIFdSTigiem9v
bSBsZXZlbCBpcyA+ICVmIDogJWYiLCAoZG91YmxlKVpPT01fTUFYLCAoZG91YmxlKXpvb20pOwor
ICAgICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoY3ggPj0gc2QtPnZp
ZXcudykKKyAgICAgICAgY3ggPSBzZC0+dmlldy53IC0gMTsKKyAgICBpZiAoY3kgPj0gc2QtPnZp
ZXcuaCkKKyAgICAgICAgY3kgPSBzZC0+dmlldy5oIC0gMTsKKyAgICBpZiAoY3ggPCAwKQorICAg
ICAgICBjeCA9IDA7CisgICAgaWYgKGN5IDwgMCkKKyAgICAgICAgY3kgPSAwOworICAgIF9ld2tf
dmlld196b29tX2FuaW1hdGVkX21hcmtfc3RvcChzZCk7CisgICAgcmV0dXJuIHNkLT5hcGktPnpv
b21fc2V0KHNkLCB6b29tLCBjeCwgY3kpOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfem9vbV93
ZWFrX3Ntb290aF9zY2FsZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHNkLT56
b29tX3dlYWtfc21vb3RoX3NjYWxlOworfQorCit2b2lkIGV3a192aWV3X3pvb21fd2Vha19zbW9v
dGhfc2NhbGVfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgc21vb3RoX3NjYWxlKQorewor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIHNtb290aF9zY2FsZSA9
ICEhc21vb3RoX3NjYWxlOworICAgIGlmIChzZC0+em9vbV93ZWFrX3Ntb290aF9zY2FsZSA9PSBz
bW9vdGhfc2NhbGUpCisgICAgICAgIHJldHVybjsKKyAgICBzZC0+em9vbV93ZWFrX3Ntb290aF9z
Y2FsZSA9IHNtb290aF9zY2FsZTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+
YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT56b29tX3dlYWtf
c21vb3RoX3NjYWxlX3NldCk7CisgICAgc2QtPmFwaS0+em9vbV93ZWFrX3Ntb290aF9zY2FsZV9z
ZXQoc2QsIHNtb290aF9zY2FsZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBjdXJyZW50IHpvb20g
bGV2ZWwgb2YgYmFja2luZyBzdG9yZSwgY2VudGVyZWQgYXQgZ2l2ZW4gcG9pbnQuCisgKgorICog
VW5saWtlIGV3a192aWV3X3pvb21fc2V0KCksIHRoaXMgY2FsbCBkbyBub3QgYXNrIFdlYktpdCB0
byByZW5kZXIKKyAqIGF0IG5ldyBzaXplLCBidXQgc2NhbGUgd2hhdCBpcyBhbHJlYWR5IHJlbmRl
cmVkLCBiZWluZyBtdWNoIGZhc3RlcgorICogYnV0IHdvcnNlIHF1YWxpdHkuCisgKgorICogT2Z0
ZW4gb25lIHNob3VsZCB1c2UgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9zZXQoKSwgaXQgd2lsbCBj
YWxsIHRoZQorICogc2FtZSBtYWNoaW5lcnkgaW50ZXJuYWxseS4KKyAqCisgKiBAbm90ZSB0aGlz
IHdpbGwgc2V0IHZhcmlhYmxlcyB1c2VkIGJ5IGV3a192aWV3X3pvb21fYW5pbWF0ZWRfc2V0KCkK
KyAqICAgICAgIHNvIHN1Yi1jbGFzc2VzIHdpbGwgbm90IHJlc2V0IGludGVybmFsIHN0YXRlIG9u
IHRoZWlyCisgKiAgICAgICAiY2FsY3VsYXRlIiBwaGFzZS4gVG8gdW5zZXQgdGhvc2UgYW5kIGVu
YWJsZSBzdWItY2xhc3NlcyB0bworICogICAgICAgcmVzZXQgdGhlaXIgaW50ZXJuYWwgc3RhdGUs
IGNhbGwKKyAqICAgICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKCkuIE5hbWVs
eSwgdGhpcyBjYWxsIHdpbGwKKyAqICAgICAgIHNldCBld2tfdmlld196b29tX2FuaW1hdGVkX21h
cmtfc3RhcnQoKSB0byBhY3R1YWwgd2Via2l0IHpvb20KKyAqICAgICAgIGxldmVsLCBld2tfdmll
d196b29tX2FuaW1hdGVkX21hcmtfZW5kKCkgYW5kCisgKiAgICAgICBld2tfdmlld196b29tX2Fu
aW1hdGVkX21hcmtfY3VycmVudCgpIHRvIGdpdmVuIHpvb20gbGV2ZWwuCisgKgorICogQHBhcmFt
IG8gdmlldyBvYmplY3QgdG8gc2V0IHdlYWsgem9vbSBsZXZlbC4KKyAqIEBwYXJhbSB6b29tIGxl
dmVsIHRvIHNjYWxlIGJhY2tpbmcgc3RvcmUuCisgKiBAcGFyYW0gY3ggaG9yaXpvbnRhbCBjZW50
ZXIgb2Zmc2V0LCByZWxhdGl2ZSB0byBvYmplY3QgKHcvMiBpcyBtaWRkbGUpLgorICogQHBhcmFt
IGN5IHZlcnRpY2FsIGNlbnRlciBvZmZzZXQsIHJlbGF0aXZlIHRvIG9iamVjdCAoaC8yIGlzIG1p
ZGRsZSkuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9G
QUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX3dlYWtfc2V0KEV2
YXNfT2JqZWN0KiBvLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZBTFNFKTsKKyAg
ICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV93ZWFrX3NldCwg
RUlOQV9GQUxTRSk7CisgICAgaWYgKHpvb20gPCBaT09NX01JTikgeworICAgICAgICBXUk4oInpv
b20gbGV2ZWwgaXMgPCAlZiA6ICVmIiwgKGRvdWJsZSlaT09NX01JTiwgKGRvdWJsZSl6b29tKTsK
KyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorICAgIGlmICh6b29tID4gWk9PTV9N
QVgpIHsKKyAgICAgICAgV1JOKCJ6b29tIGxldmVsIGlzID4gJWYgOiAlZiIsIChkb3VibGUpWk9P
TV9NQVgsIChkb3VibGUpem9vbSk7CisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0K
KworICAgIGlmIChjeCA+PSBzZC0+dmlldy53KQorICAgICAgICBjeCA9IHNkLT52aWV3LncgLSAx
OworICAgIGlmIChjeSA+PSBzZC0+dmlldy5oKQorICAgICAgICBjeSA9IHNkLT52aWV3LmggLSAx
OworICAgIGlmIChjeCA8IDApCisgICAgICAgIGN4ID0gMDsKKyAgICBpZiAoY3kgPCAwKQorICAg
ICAgICBjeSA9IDA7CisKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0gZXdrX2Zy
YW1lX3pvb21fZ2V0KHNkLT5tYWluX2ZyYW1lKTsKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29t
LmVuZCA9IHpvb207CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50ID0gem9vbTsK
KyAgICByZXR1cm4gc2QtPmFwaS0+em9vbV93ZWFrX3NldChzZCwgem9vbSwgY3gsIGN5KTsKK30K
KworLyoqCisgKiBNYXJrIGludGVybmFsIHpvb20gYW5pbWF0aW9uIHN0YXRlIHRvIGdpdmVuIHpv
b20uCisgKgorICogVGhpcyBkb2VzIG5vdCBtb2RpZnkgYW55IGFjdHVhbCB6b29tIGluIFdlYktp
dCBvciBiYWNraW5nIHN0b3JlLAorICoganVzdCBzZXQgdGhlIEV3a19WaWV3X1NtYXJ0X0RhdGEt
PmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCBzbworICogc3ViLWNsYXNzZXMgd2lsbCBrbm93IHRo
ZXkgc2hvdWxkIG5vdCByZXNldCB0aGVpciBpbnRlcm5hbCBzdGF0ZS4KKyAqCisgKiBAcGFyYW0g
byB2aWV3IG9iamVjdCB0byBjaGFuZ2UgdmFsdWUuCisgKiBAcGFyYW0gem9vbSBuZXcgc3RhcnQg
dmFsdWUuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9G
QUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX3NldCgp
CisgKiBAc2VlIGV3a192aWV3X3pvb21fd2Vha19zZXQoKQorICogQHNlZSBld2tfdmlld196b29t
X2FuaW1hdGVkX21hcmtfc3RvcCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFy
a19lbmQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfY3VycmVudCgpCisg
Ki8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfc3RhcnQoRXZhc19PYmpl
Y3QqIG8sIGZsb2F0IHpvb20pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBz
ZCwgRUlOQV9GQUxTRSk7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCA9IHpvb207
CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBNYXJrIGludGVybmFsIHpvb20g
YW5pbWF0aW9uIHN0YXRlIHRvIGdpdmVuIHpvb20uCisgKgorICogVGhpcyBkb2VzIG5vdCBtb2Rp
ZnkgYW55IGFjdHVhbCB6b29tIGluIFdlYktpdCBvciBiYWNraW5nIHN0b3JlLAorICoganVzdCBz
ZXQgdGhlIEV3a19WaWV3X1NtYXJ0X0RhdGEtPmFuaW1hdGVkX3pvb20uem9vbS5lbmQgc28KKyAq
IHN1Yi1jbGFzc2VzIHdpbGwga25vdyB0aGV5IHNob3VsZCBub3QgcmVzZXQgdGhlaXIgaW50ZXJu
YWwgc3RhdGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gY2hhbmdlIHZhbHVlLgor
ICogQHBhcmFtIHpvb20gbmV3IGVuZCB2YWx1ZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJV
RSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a192
aWV3X3pvb21fYW5pbWF0ZWRfc2V0KCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV93ZWFrX3NldCgp
CisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKCkKKyAqIEBzZWUgZXdr
X3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0YXJ0KCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9h
bmltYXRlZF9tYXJrX2N1cnJlbnQoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfem9vbV9hbmlt
YXRlZF9tYXJrX2VuZChFdmFzX09iamVjdCogbywgZmxvYXQgem9vbSkKK3sKKyAgICBFV0tfVklF
V19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBzZC0+YW5pbWF0ZWRf
em9vbS56b29tLmVuZCA9IHpvb207CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisg
KiBNYXJrIGludGVybmFsIHpvb20gYW5pbWF0aW9uIHN0YXRlIHRvIGdpdmVuIHpvb20uCisgKgor
ICogVGhpcyBkb2VzIG5vdCBtb2RpZnkgYW55IGFjdHVhbCB6b29tIGluIFdlYktpdCBvciBiYWNr
aW5nIHN0b3JlLAorICoganVzdCBzZXQgdGhlIEV3a19WaWV3X1NtYXJ0X0RhdGEtPmFuaW1hdGVk
X3pvb20uem9vbS5jdXJyZW50IHNvCisgKiBzdWItY2xhc3NlcyB3aWxsIGtub3cgdGhleSBzaG91
bGQgbm90IHJlc2V0IHRoZWlyIGludGVybmFsIHN0YXRlLgorICoKKyAqIEBwYXJhbSBvIHZpZXcg
b2JqZWN0IHRvIGNoYW5nZSB2YWx1ZS4KKyAqIEBwYXJhbSB6b29tIG5ldyBjdXJyZW50IHZhbHVl
LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFfRkFMU0Ug
b3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9zZXQoKQorICog
QHNlZSBld2tfdmlld196b29tX3dlYWtfc2V0KCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9hbmlt
YXRlZF9tYXJrX3N0b3AoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfc3Rh
cnQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKCkKKyAqLworRWlu
YV9Cb29sIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19jdXJyZW50KEV2YXNfT2JqZWN0KiBv
LCBmbG9hdCB6b29tKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJ
TkFfRkFMU0UpOworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uY3VycmVudCA9IHpvb207Cisg
ICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBVbm1hcmsgaW50ZXJuYWwgem9vbSBh
bmltYXRpb24gc3RhdGUuCisgKgorICogVGhpcyB6ZXJvIGFsbCBzdGFydCwgZW5kIGFuZCBjdXJy
ZW50IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBtYXJrIGFzIGFuaW1h
dGVkIGlzIHN0b3BwZWQuCisgKgorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtf
c3RhcnQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKCkKKyAqIEBz
ZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoKQorICogQHNlZSBld2tfdmll
d196b29tX3dlYWtfc2V0KCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fYW5pbWF0ZWRf
bWFya19zdG9wKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRV
Uk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIF9ld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtf
c3RvcChzZCk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBTZXQgdGhlIGN1
cnJlbnQgem9vbSBsZXZlbCB3aGlsZSBhbmltYXRpbmcuCisgKgorICogSWYgdGhlIHZpZXcgd2Fz
IGFscmVhZHkgYW5pbWF0aW5nIHRvIGFub3RoZXIgem9vbSwgaXQgd2lsbCBzdGFydAorICogZnJv
bSBjdXJyZW50IHBvaW50IHRvIHRoZSBuZXh0IHByb3ZpZGVkIHpvb20gKEBhIHpvb20gcGFyYW1l
dGVyKQorICogYW5kIGR1cmF0aW9uIChAYSBkdXJhdGlvbiBwYXJhbWV0ZXIpLgorICoKKyAqIFRo
aXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBkbyB0cmFuc2l0aW9ucyBmcm9tIG9uZSBsZXZl
bCB0bworICogYW5vdGhlci4gSG93ZXZlciwgb25lIG1heSB3aXNoIHRvIGRvIHRob3NlIGZyb20g
b3V0c2lkZSwgaW4gdGhhdAorICogY2FzZSB1c2UgZXdrX3ZpZXdfem9vbV93ZWFrX3NldCgpIGFu
ZCBsYXRlciBjb250cm9sIGludGVybWVkaWF0ZQorICogc3RhdGVzIHdpdGggZXdrX3ZpZXdfem9v
bV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoKSwKKyAqIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFy
a19lbmQoKSBhbmQKKyAqIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKCkuCisgKgor
ICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gYW5pbWF0ZS4KKyAqIEBwYXJhbSB6b29tIGZpbmFs
IHpvb20gbGV2ZWwgdG8gdXNlLgorICogQHBhcmFtIGR1cmF0aW9uIHRpbWUgaW4gc2Vjb25kcyB0
aGUgYW5pbWF0aW9uIHNob3VsZCB0YWtlLgorICogQHBhcmFtIGN4IG9mZnNldCBpbnNpZGUgb2Jq
ZWN0IHRoYXQgZGVmaW5lcyB6b29tIGNlbnRlci4gMCBpcyBsZWZ0IHNpZGUuCisgKiBAcGFyYW0g
Y3kgb2Zmc2V0IGluc2lkZSBvYmplY3QgdGhhdCBkZWZpbmVzIHpvb20gY2VudGVyLiAwIGlzIHRv
cCBzaWRlLgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgYW5pbWF0aW9uIHdpbGwgYmUgc3Rh
cnRlZCwgQGMgRUlOQV9GQUxTRSBpZiBub3QKKyAqICAgICAgICAgICAgYmVjYXVzZSB6b29tIGlz
IHRvbyBzbWFsbC9iaWcuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX2FuaW1hdGVkX3Nl
dChFdmFzX09iamVjdCogbywgZmxvYXQgem9vbSwgZmxvYXQgZHVyYXRpb24sIEV2YXNfQ29vcmQg
Y3gsIEV2YXNfQ29vcmQgY3kpCit7CisgICAgZG91YmxlIG5vdzsKKyAgICBFV0tfVklFV19TRF9H
RVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9P
Ul9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExf
UkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxM
X1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV93ZWFrX3NldCwgRUlOQV9GQUxTRSk7CisKKyAgICBp
ZiAoem9vbSA8IFpPT01fTUlOKSB7CisgICAgICAgIFdSTigiem9vbSBsZXZlbCBpcyA8ICVmIDog
JWYiLCAoZG91YmxlKVpPT01fTUlOLCAoZG91YmxlKXpvb20pOworICAgICAgICByZXR1cm4gRUlO
QV9GQUxTRTsKKyAgICB9CisgICAgaWYgKHpvb20gPiBaT09NX01BWCkgeworICAgICAgICBXUk4o
Inpvb20gbGV2ZWwgaXMgPiAlZiA6ICVmIiwgKGRvdWJsZSlaT09NX01BWCwgKGRvdWJsZSl6b29t
KTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHByaXYtPmFu
aW1hdGVkX3pvb20uYW5pbWF0b3IpCisgICAgICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5z
dGFydCA9IF9ld2tfdmlld196b29tX2FuaW1hdGVkX2N1cnJlbnQocHJpdik7CisgICAgZWxzZSB7
CisgICAgICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCA9IGV3a19mcmFtZV96b29t
X2dldChzZC0+bWFpbl9mcmFtZSk7CisgICAgICAgIF9ld2tfdmlld196b29tX2FuaW1hdGlvbl9z
dGFydChzZCk7CisgICAgfQorCisgICAgaWYgKGN4IDwgMCkKKyAgICAgICAgY3ggPSAwOworICAg
IGlmIChjeSA8IDApCisgICAgICAgIGN5ID0gMDsKKworICAgIG5vdyA9IGVjb3JlX2xvb3BfdGlt
ZV9nZXQoKTsKKyAgICBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuc3RhcnQgPSBub3c7CisgICAg
cHJpdi0+YW5pbWF0ZWRfem9vbS50aW1lLmVuZCA9IG5vdyArIGR1cmF0aW9uOworICAgIHByaXYt
PmFuaW1hdGVkX3pvb20udGltZS5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIHByaXYtPmFuaW1h
dGVkX3pvb20uem9vbS5lbmQgPSB6b29tOworICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5y
YW5nZSA9IChwcml2LT5hbmltYXRlZF96b29tLnpvb20uZW5kIC0gcHJpdi0+YW5pbWF0ZWRfem9v
bS56b29tLnN0YXJ0KTsKKyAgICBwcml2LT5hbmltYXRlZF96b29tLmNlbnRlci54ID0gY3g7Cisg
ICAgcHJpdi0+YW5pbWF0ZWRfem9vbS5jZW50ZXIueSA9IGN5OworICAgIHNkLT5hbmltYXRlZF96
b29tLnpvb20uY3VycmVudCA9IHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydDsKKyAgICBz
ZC0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0gcHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnN0
YXJ0OworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uZW5kID0gcHJpdi0+YW5pbWF0ZWRfem9v
bS56b29tLmVuZDsKKworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogUXVlcnkg
aWYgem9vbSBsZXZlbCBqdXN0IGFwcGxpZXMgdG8gdGV4dCBhbmQgbm90IG90aGVyIGVsZW1lbnRz
LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgdG8gcXVlcnkgc2V0dGluZy4KKyAqCisgKiBAcmV0dXJu
IEBjIEVJTkFfVFJVRSBpZiBqdXN0IHRleHQgYXJlIHNjYWxlZCwgQGMgRUlOQV9GQUxTRSBvdGhl
cndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX3RleHRfb25seV9nZXQoY29uc3Qg
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV96b29tX3RleHRfb25seV9nZXQoc2Qt
Pm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIFNldCBpZiB6b29tIGxldmVsIGp1c3QgYXBwbGll
cyB0byB0ZXh0IGFuZCBub3Qgb3RoZXIgZWxlbWVudHMuCisgKgorICogQHBhcmFtIG8gdmlldyB0
byBjaGFuZ2Ugc2V0dGluZy4KKyAqIEBwYXJhbSBzZXR0aW5nIEBjIEVJTkFfVFJVRSBpZiB6b29t
IHNob3VsZCBqdXN0IGJlIGFwcGxpZWQgdG8gdGV4dC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFf
VFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29s
IGV3a192aWV3X3pvb21fdGV4dF9vbmx5X3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIHNl
dHRpbmcpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxT
RSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV96b29tX3RleHRfb25seV9zZXQoc2QtPm1haW5fZnJh
bWUsIHNldHRpbmcpOworfQorCisvKioKKyAqIEhpbnQgZW5naW5lIHRvIHByZS1yZW5kZXIgcmVn
aW9uLgorICoKKyAqIEVuZ2luZXMgYW5kIGJhY2tpbmcgc3RvcmUgbWlnaHQgYmUgYWJsZSB0byBw
cmUtcmVuZGVyIHJlZ2lvbnMgaW4KKyAqIG9yZGVyIHRvIHNwZWVkIHVwIHpvb21pbmcgb3Igc2Ny
b2xsaW5nIHRvIHRoYXQgcmVnaW9uLiBOb3QgYWxsCisgKiBlbmdpbmVzIG1pZ2h0IGltcGxlbWVu
dCB0aGF0IGFuZCB0aGV5IHdpbGwgcmV0dXJuIEBjIEVJTkFfRkFMU0UKKyAqIGluIHRoYXQgY2Fz
ZS4KKyAqCisgKiBUaGUgZ2l2ZW4gcmVnaW9uIGlzIGEgaGludC4gRW5naW5lcyBtaWdodCBkbyBi
aWdnZXIgb3Igc21hbGxlciBhcmVhCisgKiB0aGF0IGNvdmVycyB0aGF0IHJlZ2lvbi4gUHJlLXJl
bmRlciBtaWdodCBub3QgYmUgaW1tZWRpYXRlLCBpdCBtYXkKKyAqIGJlIHBvc3Rwb25lZCB0byBh
IHRocmVhZCwgb3BlcmF0ZWQgY29vcGVyYXRpdmVseSBpbiB0aGUgbWFpbiBsb29wCisgKiBhbmQg
bWF5IGJlIGV2ZW4gaWdub3JlZCBvciBjYW5jZWxsZWQgYWZ0ZXJ3YXJkcy4KKyAqCisgKiBNdWx0
aXBsZSByZXF1ZXN0cyBtaWdodCBiZSBxdWV1ZWQgYnkgZW5naW5lcy4gT25lIGNhbiBjbGVhci9m
b3JnZXQKKyAqIGFib3V0IHRoZW0gd2l0aCBld2tfdmlld19wcmVfcmVuZGVyX2NhbmNlbCgpLgor
ICoKKyAqIEBwYXJhbSBvIHZpZXcgdG8gYXNrIHByZS1yZW5kZXIgb2YgZ2l2ZW4gcmVnaW9uLgor
ICogQHBhcmFtIHggYWJzb2x1dGUgY29vcmRpbmF0ZSAoMD1sZWZ0KSB0byBwcmUtcmVuZGVyIGF0
IHpvb20uCisgKiBAcGFyYW0geSBhYnNvbHV0ZSBjb29yZGluYXRlICgwPXRvcCkgdG8gcHJlLXJl
bmRlciBhdCB6b29tLgorICogQHBhcmFtIHcgd2lkdGggdG8gcHJlLXJlbmRlciBzdGFydGluZyBm
cm9tIEBhIHggYXQgem9vbS4KKyAqIEBwYXJhbSBoIGhlaWdodCB0byBwcmUtcmVuZGVyIHN0YXJ0
aW5nIGZyb20gQGEgeSBhdCB6b29tLgorICogQHBhcmFtIHpvb20gZGVzaXJlZCB6b29tLgorICoK
KyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIHJlcXVlc3Qgd2FzIGFjY2VwdGVkLCBAYyBFSU5B
X0ZBTFNFCisgKiAgICAgICAgIG90aGVyd2lzZSAoZXJyb3JzLCBwcmUtcmVuZGVyIG5vdCBzdXBw
b3J0ZWQsIGV0YykuCisgKgorICogQHNlZSBld2tfdmlld19wcmVfcmVuZGVyX2NhbmNlbCgpCisg
Ki8KK0VpbmFfQm9vbCBld2tfdmlld19wcmVfcmVuZGVyX3JlZ2lvbihFdmFzX09iamVjdCogbywg
RXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoLCBm
bG9hdCB6b29tKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFf
RkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChzZC0+YXBpLT5wcmVf
cmVuZGVyX3JlZ2lvbiwgRUlOQV9GQUxTRSk7CisgICAgZmxvYXQgY3VyX3pvb20gPSBld2tfZnJh
bWVfem9vbV9nZXQoc2QtPm1haW5fZnJhbWUpOworICAgIEV2YXNfQ29vcmQgY3csIGNoOworCisg
ICAgaWYgKGN1cl96b29tIDwgMC4wMDAwMSkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7Cisg
ICAgaWYgKCFld2tfZnJhbWVfY29udGVudHNfc2l6ZV9nZXQoc2QtPm1haW5fZnJhbWUsICZjdywg
JmNoKSkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICBjdyAqPSB6b29tIC8gY3Vy
X3pvb207CisgICAgY2ggKj0gem9vbSAvIGN1cl96b29tOworICAgIERCRygicmVnaW9uICVkLCVk
KyVkeCVkIEAgJWYgY29udGVudHM9JWR4JWQiLCB4LCB5LCB3LCBoLCB6b29tLCBjdywgY2gpOwor
CisgICAgaWYgKHggKyB3ID4gY3cpCisgICAgICAgIHcgPSBjdyAtIHg7CisKKyAgICBpZiAoeSAr
IGggPiBjaCkKKyAgICAgICAgaCA9IGNoIC0geTsKKworICAgIGlmICh4IDwgMCkgeworICAgICAg
ICB3ICs9IHg7CisgICAgICAgIHggPSAwOworICAgIH0KKyAgICBpZiAoeSA8IDApIHsKKyAgICAg
ICAgaCArPSB5OworICAgICAgICB5ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gc2QtPmFwaS0+
cHJlX3JlbmRlcl9yZWdpb24oc2QsIHgsIHksIHcsIGgsIHpvb20pOworfQorCisvKioKKyAqIENh
bmNlbCAoY2xlYXIpIHByZXZpb3VzIHByZS1yZW5kZXIgcmVxdWVzdHMuCisgKgorICogQHBhcmFt
IG8gdmlldyB0byBjbGVhciBwcmUtcmVuZGVyIHJlcXVlc3RzLgorICovCit2b2lkIGV3a192aWV3
X3ByZV9yZW5kZXJfY2FuY2VsKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5h
cGktPnByZV9yZW5kZXJfY2FuY2VsKTsKKyAgICBzZC0+YXBpLT5wcmVfcmVuZGVyX2NhbmNlbChz
ZCk7Cit9CisKK2NvbnN0IGNoYXIqIGV3a192aWV3X3NldHRpbmdfdXNlcl9hZ2VudF9nZXQoY29u
c3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBz
ZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAg
ICByZXR1cm4gcHJpdi0+c2V0dGluZ3MudXNlcl9hZ2VudDsKK30KKworRWluYV9Cb29sIGV3a192
aWV3X3NldHRpbmdfdXNlcl9hZ2VudF9zZXQoRXZhc19PYmplY3QqIG8sIGNvbnN0IGNoYXIqIHVz
ZXJfYWdlbnQpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9G
QUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZB
TFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy51
c2VyX2FnZW50LCB1c2VyX2FnZW50KSkgeworICAgICAgICBXZWJDb3JlOjpGcmFtZUxvYWRlckNs
aWVudEVmbCogY2xpZW50ID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRF
ZmwqPihwcml2LT5tYWluX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCkpOworICAgICAgICBjbGll
bnQtPnNldEN1c3RvbVVzZXJBZ2VudChXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KHVzZXJfYWdl
bnQpKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworY29uc3QgY2hhciogZXdr
X3ZpZXdfc2V0dGluZ191c2VyX3N0eWxlc2hlZXRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVX
X1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRp
bmdzLnVzZXJfc3R5bGVzaGVldDsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfdXNl
cl9zdHlsZXNoZWV0X3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogdXJpKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKGVp
bmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MudXNlcl9zdHlsZXNoZWV0LCB1
cmkpKSB7CisgICAgICAgIFdlYkNvcmU6OktVUkwga3VybChXZWJDb3JlOjpLVVJMKCksIFdlYkNv
cmU6OlN0cmluZzo6ZnJvbVVURjgodXJpKSk7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3Mt
PnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24oa3VybCk7CisgICAgfQorICAgIHJldHVybiBFSU5B
X1RSVUU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2F1dG9fbG9hZF9pbWFnZXNf
Z2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRV
Uk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihz
ZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmF1dG9fbG9h
ZF9pbWFnZXM7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2F1dG9fbG9hZF9pbWFn
ZXNfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgYXV0b21hdGljKQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BS
SVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgYXV0b21hdGljID0g
ISFhdXRvbWF0aWM7CisgICAgaWYgKHByaXYtPnNldHRpbmdzLmF1dG9fbG9hZF9pbWFnZXMgIT0g
YXV0b21hdGljKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldExvYWRzSW1hZ2Vz
QXV0b21hdGljYWxseShhdXRvbWF0aWMpOworICAgICAgICBwcml2LT5zZXR0aW5ncy5hdXRvX2xv
YWRfaW1hZ2VzID0gYXV0b21hdGljOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQor
CitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19hdXRvX3Nocmlua19pbWFnZXNfZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmF1dG9fc2hyaW5rX2ltYWdl
czsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfYXV0b19zaHJpbmtfaW1hZ2VzX3Nl
dChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGF1dG9tYXRpYykKK3sKKyAgICBFV0tfVklFV19T
RF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dF
VF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGF1dG9tYXRpYyA9ICEhYXV0
b21hdGljOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5hdXRvX3Nocmlua19pbWFnZXMgIT0gYXV0
b21hdGljKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFNocmlua3NTdGFuZGFs
b25lSW1hZ2VzVG9GaXQoYXV0b21hdGljKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuYXV0b19z
aHJpbmtfaW1hZ2VzID0gYXV0b21hdGljOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOwor
fQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfc2NyaXB0c19nZXQoY29uc3Qg
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBF
SU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZW5hYmxlX3NjcmlwdHM7Cit9
CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX3NldChFdmFzX09i
amVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4o
c2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGVuYWJsZSA9ICEhZW5hYmxlOworICAgIGlmIChw
cml2LT5zZXR0aW5ncy5lbmFibGVfc2NyaXB0cyAhPSBlbmFibGUpIHsKKyAgICAgICAgcHJpdi0+
cGFnZV9zZXR0aW5ncy0+c2V0SmF2YVNjcmlwdEVuYWJsZWQoZW5hYmxlKTsKKyAgICAgICAgcHJp
di0+c2V0dGluZ3MuZW5hYmxlX3NjcmlwdHMgPSBlbmFibGU7CisgICAgfQorICAgIHJldHVybiBF
SU5BX1RSVUU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVnaW5z
X2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4o
c2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5lbmFibGVf
cGx1Z2luczsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNf
c2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgZW5hYmxlKQoreworICAgIEVXS19WSUVXX1NE
X0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VU
X09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgZW5hYmxlID0gISFlbmFibGU7
CisgICAgaWYgKHByaXYtPnNldHRpbmdzLmVuYWJsZV9wbHVnaW5zICE9IGVuYWJsZSkgeworICAg
ICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRQbHVnaW5zRW5hYmxlZChlbmFibGUpOworICAg
ICAgICBwcml2LT5zZXR0aW5ncy5lbmFibGVfcGx1Z2lucyA9IGVuYWJsZTsKKyAgICB9CisgICAg
cmV0dXJuIEVJTkFfVFJVRTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfc2NyaXB0
c193aW5kb3dfb3Blbl9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdf
U0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9H
RVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0
dGluZ3Muc2NyaXB0c193aW5kb3dfb3BlbjsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRp
bmdfc2NyaXB0c193aW5kb3dfb3Blbl9zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCBhbGxv
dykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsK
KyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOwor
ICAgIGFsbG93ID0gISFhbGxvdzsKKyAgICBpZiAocHJpdi0+c2V0dGluZ3Muc2NyaXB0c193aW5k
b3dfb3BlbiAhPSBhbGxvdykgeworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRKYXZh
U2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KGFsbG93KTsKKyAgICAgICAgcHJpdi0+
c2V0dGluZ3Muc2NyaXB0c193aW5kb3dfb3BlbiA9IGFsbG93OworICAgIH0KKyAgICByZXR1cm4g
RUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19yZXNpemFibGVfdGV4
dGFyZWFzX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5y
ZXNpemFibGVfdGV4dGFyZWFzOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19yZXNp
emFibGVfdGV4dGFyZWFzX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGVu
YWJsZSA9ICEhZW5hYmxlOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5yZXNpemFibGVfdGV4dGFy
ZWFzICE9IGVuYWJsZSkgeworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRUZXh0QXJl
YXNBcmVSZXNpemFibGUoZW5hYmxlKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MucmVzaXphYmxl
X3RleHRhcmVhcyA9IGVuYWJsZTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKwor
RWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfcHJpdmF0ZV9icm93c2luZ19nZXQoY29uc3QgRXZh
c19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlO
QV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5B
X0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MucHJpdmF0ZV9icm93c2luZzsKK30K
KworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfcHJpdmF0ZV9icm93c2luZ19zZXQoRXZhc19P
YmplY3QqIG8sIEVpbmFfQm9vbCBlbmFibGUpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBlbmFibGUgPSAhIWVuYWJsZTsKKyAgICBpZiAo
cHJpdi0+c2V0dGluZ3MucHJpdmF0ZV9icm93c2luZyAhPSBlbmFibGUpIHsKKyAgICAgICAgcHJp
di0+cGFnZV9zZXR0aW5ncy0+c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChlbmFibGUpOworICAg
ICAgICBwcml2LT5zZXR0aW5ncy5wcml2YXRlX2Jyb3dzaW5nID0gZW5hYmxlOworICAgIH0KKyAg
ICByZXR1cm4gRUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19jYXJl
dF9icm93c2luZ19nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRf
T1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGlu
Z3MuY2FyZXRfYnJvd3Npbmc7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2NhcmV0
X2Jyb3dzaW5nX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBF
V0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklF
V19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGVuYWJsZSA9
ICEhZW5hYmxlOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5jYXJldF9icm93c2luZyAhPSBlbmFi
bGUpIHsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0Q2FyZXRCcm93c2luZ0VuYWJs
ZWQoZW5hYmxlKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuY2FyZXRfYnJvd3NpbmcgPSBlbmFi
bGU7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogR2V0IGN1cnJl
bnQgZW5jb2Rpbmcgb2YgdGhpcyBWaWV3LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKgorICog
QHJldHVybiBBIHBvaW50ZXIgdG8gYW4gZWluYV9zdHJpbnNoYXJlIGNvbnRhaW5pbmcgdGhlIGN1
cnJlbnQgY3VzdG9tCisgKiBlbmNvZGluZyBmb3IgVmlldyBvYmplY3QgQHBhcmFtIG8sIG9yIEBj
IE5VTEwgaWYgaXQncyBub3Qgc2V0LgorICovCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0aW5n
X2VuY29kaW5nX2N1c3RvbV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgTlVMTCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRf
T1JfUkVUVVJOKHNkLCBwcml2LCBOVUxMKTsKKyAgICBFdmFzX09iamVjdCogbWFpbl9mcmFtZSA9
IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KG8pOworICAgIFdlYkNvcmU6OkZyYW1lKiBjb3JlX2Zy
YW1lID0gZXdrX2ZyYW1lX2NvcmVfZ2V0KG1haW5fZnJhbWUpOworCisgICAgV2ViQ29yZTo6U3Ry
aW5nIG92ZXJyaWRlRW5jb2RpbmcgPSBjb3JlX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2Fk
ZXIoKS0+b3ZlcnJpZGVFbmNvZGluZygpOworCisgICAgaWYgKG92ZXJyaWRlRW5jb2RpbmcuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGVpbmFfc3RyaW5nc2hhcmVfcmVw
bGFjZSgmcHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfY3VzdG9tLCBvdmVycmlkZUVuY29kaW5nLnV0
ZjgoKS5kYXRhKCkpOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5lbmNvZGluZ19jdXN0b207
Cit9CisKKy8qKgorICogU2V0IGVuY29kaW5nIG9mIHRoaXMgVmlldyBhbmQgcmVsb2FkIHBhZ2Uu
CisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSBlbmNvZGluZyBUaGUgbmV3IGVuY29k
aW5nIG9yIEBjIE5VTEwgdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBlbmNvZGluZy4KKyAqCisgKiBA
cmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4K
KyAqLworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZW5jb2RpbmdfY3VzdG9tX3NldChFdmFz
X09iamVjdCAqbywgY29uc3QgY2hhciAqZW5jb2RpbmcpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBFdmFzX09iamVjdCogbWFpbl9mcmFt
ZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KG8pOworICAgIFdlYkNvcmU6OkZyYW1lKiBjb3Jl
X2ZyYW1lID0gZXdrX2ZyYW1lX2NvcmVfZ2V0KG1haW5fZnJhbWUpOworREJHKCIlcyIsIGVuY29k
aW5nKTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX3JlcGxhY2UoJnByaXYtPnNldHRpbmdzLmVuY29k
aW5nX2N1c3RvbSwgZW5jb2RpbmcpOworICAgIGNvcmVfZnJhbWUtPmxvYWRlcigpLT5yZWxvYWRX
aXRoT3ZlcnJpZGVFbmNvZGluZyhXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGVuY29kaW5nKSk7
CisKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0
aW5nX2VuY29kaW5nX2RlZmF1bHRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVX
S19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VU
X09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmVuY29k
aW5nX2RlZmF1bHQ7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2Rl
ZmF1bHRfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBlbmNvZGluZykKK3sKKyAgICBF
V0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklF
V19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlmIChlaW5h
X3N0cmluZ3NoYXJlX3JlcGxhY2UoJnByaXYtPnNldHRpbmdzLmVuY29kaW5nX2RlZmF1bHQsIGVu
Y29kaW5nKSkKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0RGVmYXVsdFRleHRFbmNv
ZGluZ05hbWUoV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChlbmNvZGluZykpOworICAgIHJldHVy
biBFSU5BX1RSVUU7Cit9CisKK2ludCBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9zaXpl
X2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYs
IDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X21pbmltdW1fc2l6ZTsKK30KKwor
RWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9taW5pbXVtX3NpemVfc2V0KEV2YXNfT2Jq
ZWN0KiBvLCBpbnQgc2l6ZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYs
IEVJTkFfRkFMU0UpOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5mb250X21pbmltdW1fc2l6ZSAh
PSBzaXplKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldE1pbmltdW1Gb250U2l6
ZShzaXplKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9taW5pbXVtX3NpemUgPSBzaXpl
OworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitpbnQgZXdrX3ZpZXdfc2V0dGlu
Z19mb250X21pbmltdW1fbG9naWNhbF9zaXplX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5n
cy5mb250X21pbmltdW1fbG9naWNhbF9zaXplOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0
dGluZ19mb250X21pbmltdW1fbG9naWNhbF9zaXplX3NldChFdmFzX09iamVjdCogbywgaW50IHNp
emUpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7
CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsK
KyAgICBpZiAocHJpdi0+c2V0dGluZ3MuZm9udF9taW5pbXVtX2xvZ2ljYWxfc2l6ZSAhPSBzaXpl
KSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldE1pbmltdW1Mb2dpY2FsRm9udFNp
emUoc2l6ZSk7CisgICAgICAgIHByaXYtPnNldHRpbmdzLmZvbnRfbWluaW11bV9sb2dpY2FsX3Np
emUgPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitpbnQgZXdrX3Zp
ZXdfc2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGlu
Z3MuZm9udF9kZWZhdWx0X3NpemU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2Zv
bnRfZGVmYXVsdF9zaXplX3NldChFdmFzX09iamVjdCogbywgaW50IHNpemUpCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAocHJpdi0+
c2V0dGluZ3MuZm9udF9kZWZhdWx0X3NpemUgIT0gc2l6ZSkgeworICAgICAgICBwcml2LT5wYWdl
X3NldHRpbmdzLT5zZXREZWZhdWx0Rm9udFNpemUoc2l6ZSk7CisgICAgICAgIHByaXYtPnNldHRp
bmdzLmZvbnRfZGVmYXVsdF9zaXplID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJV
RTsKK30KKworaW50IGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9nZXQoY29u
c3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBz
ZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAg
ICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9tb25vc3BhY2Vfc2l6ZTsKK30KKworRWluYV9C
b29sIGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9zZXQoRXZhc19PYmplY3Qq
IG8sIGludCBzaXplKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJ
TkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlO
QV9GQUxTRSk7CisgICAgaWYgKHByaXYtPnNldHRpbmdzLmZvbnRfbW9ub3NwYWNlX3NpemUgIT0g
c2l6ZSkgeworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXREZWZhdWx0Rml4ZWRGb250
U2l6ZShzaXplKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9tb25vc3BhY2Vfc2l6ZSA9
IHNpemU7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK2NvbnN0IGNoYXIqIGV3
a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFyZF9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGlu
Z3MuZm9udF9zdGFuZGFyZDsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9z
dGFuZGFyZF9zZXQoRXZhc19PYmplY3QqIG8sIGNvbnN0IGNoYXIqIGZhbWlseSkKK3sKKyAgICBF
V0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklF
V19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlmIChlaW5h
X3N0cmluZ3NoYXJlX3JlcGxhY2UoJnByaXYtPnNldHRpbmdzLmZvbnRfc3RhbmRhcmQsIGZhbWls
eSkpIHsKKyAgICAgICAgV2ViQ29yZTo6QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6
OmZyb21VVEY4KGZhbWlseSk7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFN0YW5k
YXJkRm9udEZhbWlseShzKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworY29u
c3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ19mb250X2N1cnNpdmVfZ2V0KGNvbnN0IEV2YXNfT2Jq
ZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAg
IEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHBy
aXYtPnNldHRpbmdzLmZvbnRfY3Vyc2l2ZTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRp
bmdfZm9udF9jdXJzaXZlX3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogZmFtaWx5KQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAg
IEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAg
aWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZm9udF9jdXJzaXZl
LCBmYW1pbHkpKSB7CisgICAgICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzID0gV2ViQ29yZTo6
U3RyaW5nOjpmcm9tVVRGOChmYW1pbHkpOworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5z
ZXRDdXJzaXZlRm9udEZhbWlseShzKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30K
KworY29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfZ2V0KGNvbnN0IEV2
YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDAp
OworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0
dXJuIHByaXYtPnNldHRpbmdzLmZvbnRfZmFudGFzeTsKK30KKworRWluYV9Cb29sIGV3a192aWV3
X3NldHRpbmdfZm9udF9mYW50YXN5X3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogZmFt
aWx5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7
CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZm9udF9m
YW50YXN5LCBmYW1pbHkpKSB7CisgICAgICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzID0gV2Vi
Q29yZTo6U3RyaW5nOjpmcm9tVVRGOChmYW1pbHkpOworICAgICAgICBwcml2LT5wYWdlX3NldHRp
bmdzLT5zZXRGYW50YXN5Rm9udEZhbWlseShzKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJV
RTsKK30KKworY29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9nZXQo
Y29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihv
LCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsK
KyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9tb25vc3BhY2U7Cit9CisKK0VpbmFfQm9v
bCBld2tfdmlld19zZXR0aW5nX2ZvbnRfbW9ub3NwYWNlX3NldChFdmFzX09iamVjdCogbywgY29u
c3QgY2hhciogZmFtaWx5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0
dGluZ3MuZm9udF9tb25vc3BhY2UsIGZhbWlseSkpIHsKKyAgICAgICAgV2ViQ29yZTo6QXRvbWlj
U3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZhbWlseSk7CisgICAgICAgIHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEZpeGVkRm9udEZhbWlseShzKTsKKyAgICB9CisgICAgcmV0
dXJuIEVJTkFfVFJVRTsKK30KKworY29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ19mb250X3Nl
cmlmX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X3NlcmlmOworfQorCitFaW5h
X0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X3NlcmlmX3NldChFdmFzX09iamVjdCogbywgY29u
c3QgY2hhciogZmFtaWx5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0
dGluZ3MuZm9udF9zZXJpZiwgZmFtaWx5KSkgeworICAgICAgICBXZWJDb3JlOjpBdG9taWNTdHJp
bmcgcyA9IFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgoZmFtaWx5KTsKKyAgICAgICAgcHJpdi0+
cGFnZV9zZXR0aW5ncy0+c2V0U2VyaWZGb250RmFtaWx5KHMpOworICAgIH0KKyAgICByZXR1cm4g
RUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0aW5nX2ZvbnRfc2Fuc19z
ZXJpZl9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBw
cml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9zYW5zX3NlcmlmOworfQor
CitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X3NhbnNfc2VyaWZfc2V0KEV2YXNfT2Jq
ZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNl
KCZwcml2LT5zZXR0aW5ncy5mb250X3NhbnNfc2VyaWYsIGZhbWlseSkpIHsKKyAgICAgICAgV2Vi
Q29yZTo6QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZhbWlseSk7
CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFNhbnNTZXJpZkZvbnRGYW1pbHkocyk7
CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogU2ltaWxhciB0byBl
dmFzX29iamVjdF9zbWFydF9kYXRhX2dldCgpLCBidXQgZG9lcyB0eXBlIGNoZWNraW5nLgorICoK
KyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHF1ZXJ5IGludGVybmFsIGRhdGEuCisgKiBAcmV0
dXJuIGludGVybmFsIGRhdGEgb3IgQGMgTlVMTCBvbiBlcnJvcnMgKGllOiBpbmNvcnJlY3QgdHlw
ZSBvZiBAYSBvKS4KKyAqLworRXdrX1ZpZXdfU21hcnRfRGF0YSogZXdrX3ZpZXdfc21hcnRfZGF0
YV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgMCk7CisgICAgcmV0dXJuIHNkOworfQorCisvKioKKyAqIEdldHMgdGhlIGlu
dGVybmFsIGFycmF5IG9mIHJlcGFpbnQgcmVxdWVzdHMuCisgKgorICogVGhpcyBhcnJheSBzaG91
bGQgbm90IGJlIG1vZGlmaWVkIGFueWhvdy4gSXQgc2hvdWxkIGJlIHByb2Nlc3NlZAorICogaW1t
ZWRpYXRlbHkgYXMgYW55IGZ1cnRoZXIgZXdrX3ZpZXcgY2FsbCBtaWdodCBjaGFuZ2UgaXQsIGxp
a2UKKyAqIHRob3NlIHRoYXQgYWRkIHJlcGFpbnRzIG9yIGZsdXNoIHRoZW0sIHNvIGJlIHN1cmUg
dGhhdCB5b3VyIGNvZGUKKyAqIGRvZXMgbm90IGNhbGwgYW55IG9mIHRob3NlIHdoaWxlIHlvdSBw
cm9jZXNzIHRoZSByZXBhaW50cywKKyAqIG90aGVyd2lzZSBjb3B5IHRoZSBhcnJheS4KKyAqCisg
KiBAcGFyYW0gcHJpdiBwcml2YXRlIGhhbmRsZSBwb2ludGVyIG9mIHRoZSB2aWV3IHRvIGdldCBy
ZXBhaW50cy4KKyAqIEBwYXJhbSBjb3VudCB3aGVyZSB0byByZXR1cm4gdGhlIG51bWJlciBvZiBl
bGVtZW50cyBvZiByZXR1cm5lZCBhcnJheS4KKyAqCisgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byBh
cnJheSBvZiByZXF1ZXN0ZWQgcmVwYWludHMuCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9y
IGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAg
dG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgorICovCitjb25zdCBFaW5hX1JlY3Rh
bmdsZSogZXdrX3ZpZXdfcmVwYWludHNfZ2V0KGNvbnN0IEV3a19WaWV3X1ByaXZhdGVfRGF0YSog
cHJpdiwgc2l6ZV90KiBjb3VudCkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9W
QUwoY291bnQsIDApOworICAgIGlmIChjb3VudCkKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwocHJpdiwgMCk7CisgICAgaWYgKGNvdW50KQor
ICAgICAgICAqY291bnQgPSBwcml2LT5yZXBhaW50cy5jb3VudDsKKyAgICByZXR1cm4gcHJpdi0+
cmVwYWludHMuYXJyYXk7Cit9CisKKy8qKgorICogR2V0cyB0aGUgaW50ZXJuYWwgYXJyYXkgb2Yg
c2Nyb2xsIHJlcXVlc3RzLgorICoKKyAqIFRoaXMgYXJyYXkgc2hvdWxkIG5vdCBiZSBtb2RpZmll
ZCBhbnlob3cuIEl0IHNob3VsZCBiZSBwcm9jZXNzZWQKKyAqIGltbWVkaWF0ZWx5IGFzIGFueSBm
dXJ0aGVyIGV3a192aWV3IGNhbGwgbWlnaHQgY2hhbmdlIGl0LCBsaWtlCisgKiB0aG9zZSB0aGF0
IGFkZCBzY3JvbGxzIG9yIGZsdXNoIHRoZW0sIHNvIGJlIHN1cmUgdGhhdCB5b3VyIGNvZGUKKyAq
IGRvZXMgbm90IGNhbGwgYW55IG9mIHRob3NlIHdoaWxlIHlvdSBwcm9jZXNzIHRoZSBzY3JvbGxz
LAorICogb3RoZXJ3aXNlIGNvcHkgdGhlIGFycmF5LgorICoKKyAqIEBwYXJhbSBwcml2IHByaXZh
dGUgaGFuZGxlIHBvaW50ZXIgb2YgdGhlIHZpZXcgdG8gZ2V0IHNjcm9sbHMuCisgKiBAcGFyYW0g
Y291bnQgd2hlcmUgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgcmV0dXJuZWQg
YXJyYXkuCisgKgorICogQHJldHVybiByZWZlcmVuY2UgdG8gYXJyYXkgb2YgcmVxdWVzdGVkIHNj
cm9sbHMuCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0
IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBi
YWNraW5nIHN0b3JlLgorICovCitjb25zdCBFd2tfU2Nyb2xsX1JlcXVlc3QqIGV3a192aWV3X3Nj
cm9sbF9yZXF1ZXN0c19nZXQoY29uc3QgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBzaXpl
X3QqIGNvdW50KQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChjb3VudCwg
MCk7CisgICAgaWYgKGNvdW50KQorICAgICAgICAqY291bnQgPSAwOworICAgIEVJTkFfU0FGRVRZ
X09OX05VTExfUkVUVVJOX1ZBTChwcml2LCAwKTsKKyAgICBpZiAoY291bnQpCisgICAgICAgICpj
b3VudCA9IHByaXYtPnNjcm9sbHMuY291bnQ7CisgICAgcmV0dXJuIHByaXYtPnNjcm9sbHMuYXJy
YXk7Cit9CisKKy8qKgorICogQWRkIGEgbmV3IHJlcGFpbnQgcmVxdWVzdCB0byBxdWV1ZS4KKyAq
CisgKiBUaGUgcmVwYWludHMgYXJlIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gY3VycmVudCB2
aWV3cG9ydC4KKyAqCisgKiBAcGFyYW0gcHJpdiBwcml2YXRlIGhhbmRsZSBwb2ludGVyIG9mIHRo
ZSB2aWV3IHRvIGFkZCByZXBhaW50IHJlcXVlc3QuCisgKiBAcGFyYW0geCBob3Jpem9udGFsIHBv
c2l0aW9uIHJlbGF0aXZlIHRvIGN1cnJlbnQgdmlldyBwb3J0IChzY3JvbGxlZCkuCisgKiBAcGFy
YW0geSB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBjdXJyZW50IHZpZXcgcG9ydCAoc2Ny
b2xsZWQpLgorICogQHBhcmFtIHcgd2lkdGggb2YgYXJlYSB0byBiZSByZXBhaW50ZWQKKyAqIEBw
YXJhbSBoIGhlaWdodCBvZiBhcmVhIHRvIGJlIHJlcGFpbnRlZAorICoKKyAqIEBub3RlIHRoaXMg
aXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQK
KyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBl
d2tfdmlld19yZXBhaW50X2FkZChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYsIEV2YXNfQ29v
cmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCkKK3sKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihwcml2KTsKKyAgICBfZXdrX3ZpZXdfcmVwYWludF9h
ZGQocHJpdiwgeCwgeSwgdywgaCk7Cit9CisKKy8qKgorICogRG8gbGF5b3V0IGlmIHJlcXVpcmVk
LCBhcHBsaWVkIHJlY3Vyc2l2ZWx5LgorICoKKyAqIEBwYXJhbSBwcml2IHByaXZhdGUgaGFuZGxl
IHBvaW50ZXIgb2YgdGhlIHZpZXcgdG8gbGF5b3V0LgorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90
IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAg
ICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBld2tfdmll
d19sYXlvdXRfaWZfbmVlZGVkX3JlY3Vyc2l2ZShFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYp
Cit7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4ocHJpdik7CisKKyAgICBXZWJDb3Jl
OjpGcmFtZVZpZXcqIHYgPSBwcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAgaWYgKCF2KSB7
CisgICAgICAgIEVSUigibm8gbWFpbiBmcmFtZSB2aWV3Iik7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgdi0+bGF5b3V0SWZOZWVkZWRSZWN1cnNpdmUoKTsKK30KKwordm9pZCBld2tfdmll
d19zY3JvbGxzX3Byb2Nlc3MoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgRUlOQV9T
QUZFVFlfT05fTlVMTF9SRVRVUk4oc2QpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVS
TihzZCwgcHJpdik7CisgICAgaWYgKCFzZC0+YXBpLT5zY3JvbGxzX3Byb2Nlc3Moc2QpKQorICAg
ICAgICBFUlIoImZhaWxlZCB0byBwcm9jZXNzIHNjcm9sbHMuIik7CisgICAgX2V3a192aWV3X3Nj
cm9sbHNfZmx1c2gocHJpdik7Cit9CisKK3N0cnVjdCBfRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCB7
CisgICAgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KiBnYzsKKyAgICBXZWJDb3JlOjpGcmFtZVZp
ZXcqIHZpZXc7CisgICAgY2Fpcm9fdCogY3I7Cit9OworCisvKioKKyAqIENyZWF0ZSBhIG5ldyBw
YWludCBjb250ZXh0IHVzaW5nIHRoZSB2aWV3IGFzIHNvdXJjZSBhbmQgY2Fpcm8gYXMgb3V0cHV0
LgorICoKKyAqIEBwYXJhbSBwcml2IHByaXZhdGUgaGFuZGxlIHBvaW50ZXIgb2YgdGhlIHZpZXcg
dG8gdXNlIGFzIHBhaW50IHNvdXJjZS4KKyAqIEBwYXJhbSBjciBjYWlybyBjb250ZXh0IHRvIHVz
ZSBhcyBwYWludCBkZXN0aW5hdGlvbi4gQSBuZXcKKyAqICAgICAgICByZWZlcmVuY2UgaXMgdGFr
ZW4sIHNvIGl0J3Mgc2FmZSB0byBjYWxsIGNhaXJvX2Rlc3Ryb3koKQorICogICAgICAgIGFmdGVy
IHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqCisgKiBAcmV0dXJuIG5ld2x5IGFsbG9jYXRlZCBp
bnN0YW5jZSBvciBAYyBOVUxMIG9uIGVycm9ycy4KKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5vdCBm
b3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAgICAg
ICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK0V3a19WaWV3X1BhaW50
X0NvbnRleHQqIGV3a192aWV3X3BhaW50X2NvbnRleHRfbmV3KEV3a19WaWV3X1ByaXZhdGVfRGF0
YSogcHJpdiwgY2Fpcm9fdCogY3IpCit7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5f
VkFMKHByaXYsIDApOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChjciwgMCk7
CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHByaXYtPm1haW5fZnJhbWUsIDAp
OworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IHByaXYtPm1haW5fZnJhbWUtPnZpZXco
KTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwodmlldywgMCk7CisgICAgRXdr
X1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCA9IChFd2tfVmlld19QYWludF9Db250ZXh0KiltYWxs
b2Moc2l6ZW9mKCpjdHh0KSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKGN0
eHQsIDApOworCisgICAgY3R4dC0+Z2MgPSBuZXcgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KGNy
KTsKKyAgICBpZiAoIWN0eHQtPmdjKSB7CisgICAgICAgIGZyZWUoY3R4dCk7CisgICAgICAgIHJl
dHVybiAwOworICAgIH0KKyAgICBjdHh0LT52aWV3ID0gdmlldzsKKyAgICBjdHh0LT5jciA9IGNh
aXJvX3JlZmVyZW5jZShjcik7CisgICAgcmV0dXJuIGN0eHQ7Cit9CisKKy8qKgorICogRGVzdHJv
eSBwcmV2aW91c2x5IGNyZWF0ZWQgcGFpbnQgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gY3R4dCBw
YWludCBjb250ZXh0IHRvIGRlc3Ryb3kuIE11c3QgQGIgbm90IGJlIEBjIE5VTEwuCisgKgorICog
QG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2Vz
IHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgor
ICovCit2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfZnJlZShFd2tfVmlld19QYWludF9Db250
ZXh0KiBjdHh0KQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKGN0eHQpOworICAg
IGRlbGV0ZSBjdHh0LT5nYzsKKyAgICBjYWlyb19kZXN0cm95KGN0eHQtPmNyKTsKKyAgICBmcmVl
KGN0eHQpOworfQorCisvKioKKyAqIFNhdmUgKHB1c2ggdG8gc3RhY2spIHBhaW50IGNvbnRleHQg
c3RhdHVzLgorICoKKyAqIEBwYXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gc2F2ZS4gTXVzdCBA
YiBub3QgYmUgQGMgTlVMTC4KKyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfcmVz
dG9yZSgpCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0
IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBi
YWNraW5nIHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfc2F2ZShFd2tf
Vmlld19QYWludF9Db250ZXh0KiBjdHh0KQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOKGN0eHQpOworICAgIGNhaXJvX3NhdmUoY3R4dC0+Y3IpOworICAgIGN0eHQtPmdjLT5zYXZl
KCk7Cit9CisKKy8qKgorICogUmVzdG9yZSAocG9wIGZyb20gc3RhY2spIHBhaW50IGNvbnRleHQg
c3RhdHVzLgorICoKKyAqIEBwYXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gcmVzdG9yZS4gTXVz
dCBAYiBub3QgYmUgQGMgTlVMTC4KKyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRf
c2F2ZSgpCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0
IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBi
YWNraW5nIHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcmVzdG9yZShF
d2tfVmlld19QYWludF9Db250ZXh0KiBjdHh0KQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExf
UkVUVVJOKGN0eHQpOworICAgIGN0eHQtPmdjLT5yZXN0b3JlKCk7CisgICAgY2Fpcm9fcmVzdG9y
ZShjdHh0LT5jcik7Cit9CisKKy8qKgorICogQ2xpcCBwYWludCBjb250ZXh0IGRyYXdpbmdzIHRv
IGdpdmVuIGFyZWEuCisgKgorICogQHBhcmFtIGN0eHQgcGFpbnQgY29udGV4dCB0byBjbGlwLiBN
dXN0IEBiIG5vdCBiZSBAYyBOVUxMLgorICogQHBhcmFtIGFyZWEgY2xpcCBhcmVhIHRvIHVzZS4K
KyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfc2F2ZSgpCisgKiBAc2VlIGV3a192
aWV3X3BhaW50X2NvbnRleHRfcmVzdG9yZSgpCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9y
IGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAg
dG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3Bh
aW50X2NvbnRleHRfY2xpcChFd2tfVmlld19QYWludF9Db250ZXh0KiBjdHh0LCBjb25zdCBFaW5h
X1JlY3RhbmdsZSogYXJlYSkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihjdHh0
KTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihhcmVhKTsKKyAgICBjdHh0LT5nYy0+
Y2xpcChXZWJDb3JlOjpJbnRSZWN0KGFyZWEtPngsIGFyZWEtPnksIGFyZWEtPncsIGFyZWEtPmgp
KTsKK30KKworLyoqCisgKiBQYWludCB1c2luZyBjb250ZXh0IHVzaW5nIGdpdmVuIGFyZWEuCisg
KgorICogQHBhcmFtIGN0eHQgcGFpbnQgY29udGV4dCB0byBwYWludC4gTXVzdCBAYiBub3QgYmUg
QGMgTlVMTC4KKyAqIEBwYXJhbSBhcmVhIHBhaW50IGFyZWEgdG8gdXNlLiBDb29yZGluYXRlcyBh
cmUgcmVsYXRpdmUgdG8gY3VycmVudCB2aWV3cG9ydCwKKyAqICAgICAgICB0aHVzICJzY3JvbGxl
ZCIuCisgKgorICogQG5vdGUgb25lIG1heSB1c2UgY2Fpcm8gZnVuY3Rpb25zIG9uIHRoZSBjYWly
byBjb250ZXh0IHRvCisgKiAgICAgICB0cmFuc2xhdGUsIHNjYWxlIG9yIGFueSBtb2RpZmljYXRp
b24gdGhhdCBtYXkgZml0IGhpcyBkZXNpcmVzLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRf
Y29udGV4dF9jbGlwKCkKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9wYWludF9jb250
ZW50cygpCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0
IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBi
YWNraW5nIHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnQoRXdr
X1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUqIGFyZWEpCit7
CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oY3R4dCk7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk4oYXJlYSk7CisKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHJlY3QoYXJlYS0+
eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCk7CisKKyAgICBpZiAoY3R4dC0+dmlldy0+aXNU
cmFuc3BhcmVudCgpKQorICAgICAgICBjdHh0LT5nYy0+Y2xlYXJSZWN0KHJlY3QpOworICAgIGN0
eHQtPnZpZXctPnBhaW50KGN0eHQtPmdjLCByZWN0KTsKK30KKworLyoqCisgKiBQYWludCBqdXN0
IGNvbnRlbnRzIHVzaW5nIGNvbnRleHQgdXNpbmcgZ2l2ZW4gYXJlYS4KKyAqCisgKiBVbmxpa2Ug
ZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9wYWludCgpLCB0aGlzIGZ1bmN0aW9uIHBhaW50IGp1c3QK
KyAqIGJhcmUgY29udGVudHMgYW5kIGlnbm9yZXMgYW55IHNjcm9sbGluZywgc2Nyb2xsYmFycyBh
bmQgZXh0cmFzLiBJdAorICogd2lsbCB3YWxrIHRoZSByZW5kZXJpbmcgdHJlZSBhbmQgcGFpbnQg
Y29udGVudHMgaW5zaWRlIHRoZSBnaXZlbgorICogYXJlYSB0byB0aGUgY2Fpcm8gY29udGV4dCBz
cGVjaWZpZWQgaW4gQGEgY3R4dC4KKyAqCisgKiBAcGFyYW0gY3R4dCBwYWludCBjb250ZXh0IHRv
IHBhaW50LiBNdXN0IEBiIG5vdCBiZSBAYyBOVUxMLgorICogQHBhcmFtIGFyZWEgcGFpbnQgYXJl
YSB0byB1c2UuIENvb3JkaW5hdGVzIGFyZSBhYnNvbHV0ZSB0byBwYWdlLgorICoKKyAqIEBub3Rl
IG9uZSBtYXkgdXNlIGNhaXJvIGZ1bmN0aW9ucyBvbiB0aGUgY2Fpcm8gY29udGV4dCB0bworICog
ICAgICAgdHJhbnNsYXRlLCBzY2FsZSBvciBhbnkgbW9kaWZpY2F0aW9uIHRoYXQgbWF5IGZpdCBo
aXMgZGVzaXJlcy4KKyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfY2xpcCgpCisg
KiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnQoKQorICoKKyAqIEBub3RlIHRoaXMg
aXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQK
KyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBl
d2tfdmlld19wYWludF9jb250ZXh0X3BhaW50X2NvbnRlbnRzKEV3a19WaWV3X1BhaW50X0NvbnRl
eHQqIGN0eHQsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlKiBhcmVhKQoreworICAgIEVJTkFfU0FGRVRZ
X09OX05VTExfUkVUVVJOKGN0eHQpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKGFy
ZWEpOworCisgICAgV2ViQ29yZTo6SW50UmVjdCByZWN0KGFyZWEtPngsIGFyZWEtPnksIGFyZWEt
PncsIGFyZWEtPmgpOworCisgICAgaWYgKGN0eHQtPnZpZXctPmlzVHJhbnNwYXJlbnQoKSkKKyAg
ICAgICAgY3R4dC0+Z2MtPmNsZWFyUmVjdChyZWN0KTsKKworICAgIGN0eHQtPnZpZXctPnBhaW50
Q29udGVudHMoY3R4dC0+Z2MsIHJlY3QpOworfQorCisvKioKKyAqIFNjYWxlIHRoZSBjb250ZW50
cyBieSB0aGUgZ2l2ZW4gZmFjdG9ycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFwcGxpZXMgYSBz
Y2FsaW5nIHRyYW5zZm9ybWF0aW9uIHVzaW5nIENhaXJvLgorICoKKyAqIEBwYXJhbSBjdHh0ICAg
IHBhaW50IGNvbnRleHQgdG8gcGFpbnQuIE11c3QgQGIgbm90IGJlIEBjIE5VTEwuCisgKiBAcGFy
YW0gc2NhbGVfeCBzY2FsZSBmYWN0b3IgZm9yIHRoZSBYIGRpbWVuc2lvbi4KKyAqIEBwYXJhbSBz
Y2FsZV95IHNjYWxlIGZhY3RvciBmb3IgdGhlIFkgZGltZW5zaW9uLgorICovCit2b2lkIGV3a192
aWV3X3BhaW50X2NvbnRleHRfc2NhbGUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCwgZmxv
YXQgc2NhbGVfeCwgZmxvYXQgc2NhbGVfeSkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JF
VFVSTihjdHh0KTsKKworICAgIGN0eHQtPmdjLT5zY2FsZShXZWJDb3JlOjpGbG9hdFNpemUoc2Nh
bGVfeCwgc2NhbGVfeSkpOworfQorCisvKioKKyAqIFBlcmZvcm1zIGEgdHJhbnNsYXRpb24gb2Yg
dGhlIG9yaWdpbiBjb29yZGluYXRlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1vdmVzIHRoZSBv
cmlnaW4gY29vcmRpbmF0ZXMgYnkgQHAgeCBhbmQgQHAgeSBwaXhlbHMuCisgKgorICogQHBhcmFt
IGN0eHQgcGFpbnQgY29udGV4dCB0byBwYWludC4gTXVzdCBAYiBub3QgYmUgQGMgTlVMTC4KKyAq
IEBwYXJhbSB4ICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gdHJhbnNsYXRlIGluIHRoZSBYIGRpbWVu
c2lvbi4KKyAqIEBwYXJhbSB5ICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gdHJhbnNsYXRlIGluIHRo
ZSBZIGRpbWVuc2lvbi4KKyAqLwordm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X3RyYW5zbGF0
ZShFd2tfVmlld19QYWludF9Db250ZXh0KiBjdHh0LCBmbG9hdCB4LCBmbG9hdCB5KQoreworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKGN0eHQpOworCisgICAgY3R4dC0+Z2MtPnRyYW5z
bGF0ZSh4LCB5KTsKK30KKworLyoqCisgKiBQYWludCB1c2luZyBnaXZlbiBncmFwaGljcyBjb250
ZXh0IHRoZSBnaXZlbiBhcmVhLgorICoKKyAqIFRoaXMgdXNlcyB2aWV3cG9ydCByZWxhdGl2ZSBh
cmVhIGFuZCB3aWxsIGFsc28gaGFuZGxlIHNjcm9sbGJhcnMKKyAqIGFuZCBvdGhlciBleHRyYSBl
bGVtZW50cy4gU2VlIGV3a192aWV3X3BhaW50X2NvbnRlbnRzKCkgZm9yIHRoZQorICogYWx0ZXJu
YXRpdmUgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHByaXYgcHJpdmF0ZSBoYW5kbGUgcG9pbnRl
ciBvZiB2aWV3IHRvIHVzZSBhcyBwYWludCBzb3VyY2UuCisgKiBAcGFyYW0gY3IgY2Fpcm8gY29u
dGV4dCB0byB1c2UgYXMgcGFpbnQgZGVzdGluYXRpb24uIEl0cyBzdGF0ZSB3aWxsCisgKiAgICAg
ICAgYmUgc2F2ZWQgYmVmb3JlIG9wZXJhdGlvbiBhbmQgcmVzdG9yZWQgYWZ0ZXJ3YXJkcy4KKyAq
IEBwYXJhbSBhcmVhIHZpZXdwb3J0IHJlbGF0aXZlIGdlb21ldHJ5IHRvIHBhaW50LgorICoKKyAq
IEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MgYW5kIEBjIEVJTkFfRkFMU0Ugb24gZmFp
bHVyZSwgbGlrZQorICogICAgICAgICBpbmNvcnJlY3QgcGFyYW1ldGVycy4KKyAqCisgKiBAbm90
ZSB0aGlzIGlzIGFuIGVhc3kgdG8gdXNlIHZlcnNpb24sIGJ1dCBpbnRlcm5hbCBzdHJ1Y3R1cmVz
IGFyZQorICogICAgICAgYWx3YXlzIGNyZWF0ZWQsIHRoZW4gZ3JhcGhpY3MgY29udGV4dCBpcyBj
bGlwcGVkLCB0aGVuCisgKiAgICAgICBwYWludGVkLCByZXN0b3JlZCBhbmQgZGVzdHJveWVkLiBU
aGlzIG1pZ2h0IG5vdCBiZSBvcHRpbXVtLAorICogICAgICAgc28gdXNpbmcgI0V3a19WaWV3X1Bh
aW50X0NvbnRleHQgbWF5IGJlIGEgYmV0dGVyIHNvbHV0aW9ucworICogICAgICAgZm9yIGxhcmdl
IG51bWJlciBvZiBvcGVyYXRpb25zLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGVu
dHMoKQorICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0X3BhaW50KCkKKyAqCisgKiBAbm90
ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhh
dCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8K
K0VpbmFfQm9vbCBld2tfdmlld19wYWludChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYsIGNh
aXJvX3QqIGNyLCBjb25zdCBFaW5hX1JlY3RhbmdsZSogYXJlYSkKK3sKKyAgICBFSU5BX1NBRkVU
WV9PTl9OVUxMX1JFVFVSTl9WQUwocHJpdiwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk5fVkFMKGNyLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9O
VUxMX1JFVFVSTl9WQUwoYXJlYSwgRUlOQV9GQUxTRSk7CisgICAgV2ViQ29yZTo6RnJhbWVWaWV3
KiB2aWV3ID0gcHJpdi0+bWFpbl9mcmFtZS0+dmlldygpOworICAgIEVJTkFfU0FGRVRZX09OX05V
TExfUkVUVVJOX1ZBTCh2aWV3LCBFSU5BX0ZBTFNFKTsKKworICAgIGlmICh2aWV3LT5uZWVkc0xh
eW91dCgpKQorICAgICAgICB2aWV3LT5mb3JjZUxheW91dCgpOworICAgIFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dCBnYyhjcik7CisgICAgV2ViQ29yZTo6SW50UmVjdCByZWN0KGFyZWEtPngsIGFy
ZWEtPnksIGFyZWEtPncsIGFyZWEtPmgpOworCisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgZ2Mu
c2F2ZSgpOworICAgIGdjLmNsaXAocmVjdCk7CisgICAgaWYgKHZpZXctPmlzVHJhbnNwYXJlbnQo
KSkKKyAgICAgICAgZ2MuY2xlYXJSZWN0KHJlY3QpOworICAgIHZpZXctPnBhaW50KCZnYywgIHJl
Y3QpOworICAgIGdjLnJlc3RvcmUoKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKKworICAgIHJl
dHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogUGFpbnQganVzdCBjb250ZW50cyB1c2luZyBn
aXZlbiBncmFwaGljcyBjb250ZXh0IHRoZSBnaXZlbiBhcmVhLgorICoKKyAqIFRoaXMgdXNlcyBh
YnNvbHV0ZSBjb29yZGluYXRlcyBmb3IgYXJlYSBhbmQgd2lsbCBqdXN0IGhhbmRsZQorICogY29u
dGVudHMsIG5vIHNjcm9sbGJhcnMgb3IgZXh0cmFzLiBTZWUgZXdrX3ZpZXdfcGFpbnQoKSBmb3Ig
dGhlCisgKiBhbHRlcm5hdGl2ZSBzb2x1dGlvbi4KKyAqCisgKiBAcGFyYW0gcHJpdiBwcml2YXRl
IGhhbmRsZSBwb2ludGVyIG9mIHZpZXcgdG8gdXNlIGFzIHBhaW50IHNvdXJjZS4KKyAqIEBwYXJh
bSBjciBjYWlybyBjb250ZXh0IHRvIHVzZSBhcyBwYWludCBkZXN0aW5hdGlvbi4gSXRzIHN0YXRl
IHdpbGwKKyAqICAgICAgICBiZSBzYXZlZCBiZWZvcmUgb3BlcmF0aW9uIGFuZCByZXN0b3JlZCBh
ZnRlcndhcmRzLgorICogQHBhcmFtIGFyZWEgYWJzb2x1dGUgZ2VvbWV0cnkgdG8gcGFpbnQuCisg
KgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcyBhbmQgQGMgRUlOQV9GQUxTRSBv
biBmYWlsdXJlLCBsaWtlCisgKiAgICAgICAgIGluY29ycmVjdCBwYXJhbWV0ZXJzLgorICoKKyAq
IEBub3RlIHRoaXMgaXMgYW4gZWFzeSB0byB1c2UgdmVyc2lvbiwgYnV0IGludGVybmFsIHN0cnVj
dHVyZXMgYXJlCisgKiAgICAgICBhbHdheXMgY3JlYXRlZCwgdGhlbiBncmFwaGljcyBjb250ZXh0
IGlzIGNsaXBwZWQsIHRoZW4KKyAqICAgICAgIHBhaW50ZWQsIHJlc3RvcmVkIGFuZCBkZXN0cm95
ZWQuIFRoaXMgbWlnaHQgbm90IGJlIG9wdGltdW0sCisgKiAgICAgICBzbyB1c2luZyAjRXdrX1Zp
ZXdfUGFpbnRfQ29udGV4dCBtYXkgYmUgYSBiZXR0ZXIgc29sdXRpb25zCisgKiAgICAgICBmb3Ig
bGFyZ2UgbnVtYmVyIG9mIG9wZXJhdGlvbnMuCisgKgorICogQHNlZSBld2tfdmlld19wYWludCgp
CisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnRfY29udGVudHMoKQorICoKKyAq
IEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3Nl
cyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4K
KyAqLworRWluYV9Cb29sIGV3a192aWV3X3BhaW50X2NvbnRlbnRzKEV3a19WaWV3X1ByaXZhdGVf
RGF0YSogcHJpdiwgY2Fpcm9fdCogY3IsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlKiBhcmVhKQorewor
ICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChwcml2LCBFSU5BX0ZBTFNFKTsKKyAg
ICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoY3IsIEVJTkFfRkFMU0UpOworICAgIEVJ
TkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChhcmVhLCBFSU5BX0ZBTFNFKTsKKyAgICBXZWJD
b3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBwcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAgRUlO
QV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHZpZXcsIEVJTkFfRkFMU0UpOworCisgICAgV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0IGdjKGNyKTsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHJlY3Qo
YXJlYS0+eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCk7CisKKyAgICBjYWlyb19zYXZlKGNy
KTsKKyAgICBnYy5zYXZlKCk7CisgICAgZ2MuY2xpcChyZWN0KTsKKyAgICBpZiAodmlldy0+aXNU
cmFuc3BhcmVudCgpKQorICAgICAgICBnYy5jbGVhclJlY3QocmVjdCk7CisgICAgdmlldy0+cGFp
bnRDb250ZW50cygmZ2MsICByZWN0KTsKKyAgICBnYy5yZXN0b3JlKCk7CisgICAgY2Fpcm9fcmVz
dG9yZShjcik7CisKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCisKKy8qIGludGVybmFsIG1l
dGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
Ki8KKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHRoZSB2aWV3IGlzIHJlYWR5IHRvIGJl
IGRpc3BsYXllZCBhcyBhbGwgZWxlbWVudHMgYXJlIGFyZWFkeS4KKyAqCisgKiBFbWl0cyBzaWdu
YWw6ICJyZWFkeSIgd2l0aCBubyBwYXJhbWV0ZXJzLgorICovCit2b2lkIGV3a192aWV3X3JlYWR5
KEV2YXNfT2JqZWN0KiBvKQoreworICAgIERCRygibz0lcCIsIG8pOworICAgIGV2YXNfb2JqZWN0
X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInJlYWR5IiwgMCk7Cit9CisKKy8qKgorICogQGludGVy
bmFsCisgKiBUaGUgdmlldyB0aXRsZSB3YXMgY2hhbmdlZCBieSB0aGUgZnJhbWUgbG9hZGVyLgor
ICoKKyAqIEVtaXRzIHNpZ25hbDogInRpdGxlLGNoYW5nZWQiIHdpdGggcG9pbnRlciB0byBuZXcg
dGl0bGUgc3RyaW5nLgorICovCit2b2lkIGV3a192aWV3X3RpdGxlX3NldChFdmFzX09iamVjdCog
bywgY29uc3QgY2hhciogdGl0bGUpCit7CisgICAgREJHKCJvPSVwLCB0aXRsZT0lcyIsIG8sIHRp
dGxlID8gdGl0bGUgOiAiKG51bGwpIik7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tf
Y2FsbChvLCAidGl0bGUsY2hhbmdlZCIsICh2b2lkKil0aXRsZSk7Cit9CisKKy8qKgorICogQGlu
dGVybmFsCisgKiBSZXBvcnRzIHRoYXQgbWFpbiBmcmFtZSdzIHVyaSBjaGFuZ2VkLgorICoKKyAq
IEVtaXRzIHNpZ25hbDogInVyaSxjaGFuZ2VkIiB3aXRoIHBvaW50ZXIgdG8gdGhlIG5ldyB1cmkg
c3RyaW5nLgorICovCit2b2lkIGV3a192aWV3X3VyaV9jaGFuZ2VkKEV2YXNfT2JqZWN0KiBvKQor
eworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIGNvbnN0IGNoYXIq
IHVyaSA9IGV3a19mcmFtZV91cmlfZ2V0KHNkLT5tYWluX2ZyYW1lKTsKKyAgICBEQkcoIm89JXAs
IHVyaT0lcyIsIG8sIHVyaSA/IHVyaSA6ICIobnVsbCkiKTsKKyAgICBldmFzX29iamVjdF9zbWFy
dF9jYWxsYmFja19jYWxsKG8sICJ1cmksY2hhbmdlZCIsICh2b2lkKil1cmkpOworfQorCisvKioK
KyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyB0aGUgdmlldyBzdGFydGVkIGxvYWRpbmcgc29tZXRo
aW5nLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKgorICogRW1pdHMgc2lnbmFsOiAibG9hZCxz
dGFydGVkIiB3aXRoIG5vIHBhcmFtZXRlcnMuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9zdGFy
dGVkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIERCRygibz0lcCIsIG8pOworICAgIGV2YXNfb2Jq
ZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgImxvYWQsc3RhcnRlZCIsIDApOworfQorCisvKioK
KyAqIFJlcG9ydHMgdGhlIGZyYW1lIHN0YXJ0ZWQgbG9hZGluZyBzb21ldGhpbmcuCisgKgorICog
QHBhcmFtIG8gVmlldy4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJsb2FkLHN0YXJ0ZWQiIG9uIG1h
aW4gZnJhbWUgd2l0aCBubyBwYXJhbWV0ZXJzLgorICovCit2b2lkIGV3a192aWV3X2ZyYW1lX21h
aW5fbG9hZF9zdGFydGVkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIERCRygibz0lcCIsIG8pOwor
ICAgIEV2YXNfT2JqZWN0ICpmcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KG8pOworICAg
IGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwoZnJhbWUsICJsb2FkLHN0YXJ0ZWQiLCAw
KTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgdGhlIG1haW4gZnJhbWUgc3Rh
cnRlZCBwcm92aXNpb25hbCBsb2FkLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKgorICogRW1p
dHMgc2lnbmFsOiAibG9hZCxwcm92aXNpb25hbCIgb24gVmlldyB3aXRoIG5vIHBhcmFtZXRlcnMu
CisgKi8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9wcm92aXNpb25hbChFdmFzX09iamVjdCogbykKK3sK
KyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxs
KG8sICJsb2FkLHByb3Zpc2lvbmFsIiwgMCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBS
ZXBvcnRzIHZpZXcgY2FuIGJlIHNob3duIGFmdGVyIGEgbmV3IHdpbmRvdyBpcyBjcmVhdGVkLgor
ICoKKyAqIEBwYXJhbSBvIEZyYW1lLgorICoKKyAqIEVtaXRzIHNpZ25hbDogImxvYWQsbmV3d2lu
ZG93LHNob3ciIG9uIHZpZXcgd2l0aCBubyBwYXJhbWV0ZXJzLgorICovCit2b2lkIGV3a192aWV3
X2xvYWRfc2hvdyhFdmFzX09iamVjdCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBl
dmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJsb2FkLG5ld3dpbmRvdyxzaG93Iiwg
MCk7Cit9CisKKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgdGhlIG1haW4gZnJhbWUg
d2FzIGNsZWFyZWQuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqLwordm9pZCBld2tfdmlld19m
cmFtZV9tYWluX2NsZWFyZWQoRXZhc19PYmplY3QqIG8pCit7CisgICAgREJHKCJvPSVwIiwgbyk7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+Zmx1c2gpOworICAgIHNkLT5hcGktPmZsdXNoKHNkKTsK
K30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgdGhlIG1haW4gZnJhbWUgcmVjZWl2
ZWQgYW4gaWNvbi4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICoKKyAqIEVtaXRzIHNpZ25hbDog
Imljb24scmVjZWl2ZWQiIHdpdGggbm8gcGFyYW1ldGVycy4KKyAqLwordm9pZCBld2tfdmlld19m
cmFtZV9tYWluX2ljb25fcmVjZWl2ZWQoRXZhc19PYmplY3QgKm8pCit7CisgICAgREJHKCJvPSVw
Iiwgbyk7CisgICAgRXZhc19PYmplY3QgKmZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQo
byk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChmcmFtZSwgImljb24scmVj
ZWl2ZWQiLCAwKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgbG9hZCBmaW5p
c2hlZCwgb3B0aW9uYWxseSB3aXRoIGVycm9yIGluZm9ybWF0aW9uLgorICoKKyAqIEVtaXRzIHNp
Z25hbDogImxvYWQsZmluaXNoZWQiIHdpdGggcG9pbnRlciB0byAjRXdrX0ZyYW1lX0xvYWRfRXJy
b3IKKyAqIGlmIGFueSBlcnJvciwgb3IgQGMgTlVMTCBpZiBzdWNjZXNzZnVsIGxvYWQuCisgKgor
ICogQG5vdGUgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgZXJyb3Igc3R1ZmYgaGVyZSwgYnV0IHRy
eWluZyB0byBiZQorICogICAgICAgY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIFdlYktpdC4KKyAq
Lwordm9pZCBld2tfdmlld19sb2FkX2ZpbmlzaGVkKEV2YXNfT2JqZWN0KiBvLCBjb25zdCBFd2tf
RnJhbWVfTG9hZF9FcnJvciogZXJyb3IpCit7CisgICAgREJHKCJvPSVwLCBlcnJvcj0lcCIsIG8s
IGVycm9yKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJsb2FkLGZp
bmlzaGVkIiwgKHZvaWQqKWVycm9yKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9y
dHMgbG9hZCBmYWlsZWQgd2l0aCBlcnJvciBpbmZvcm1hdGlvbi4KKyAqCisgKiBFbWl0cyBzaWdu
YWw6ICJsb2FkLGVycm9yIiB3aXRoIHBvaW50ZXIgdG8gRXdrX0ZyYW1lX0xvYWRfRXJyb3IuCisg
Ki8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9lcnJvcihFdmFzX09iamVjdCogbywgY29uc3QgRXdrX0Zy
YW1lX0xvYWRfRXJyb3IqIGVycm9yKQoreworICAgIERCRygibz0lcCwgZXJyb3I9JXAiLCBvLCBl
cnJvcik7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAibG9hZCxlcnJv
ciIsICh2b2lkKillcnJvcik7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIGxv
YWQgcHJvZ3Jlc3MgY2hhbmdlZC4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJsb2FkLHByb2dyZXNz
IiB3aXRoIHBvaW50ZXIgdG8gYSBkb3VibGUgZnJvbSAwLjAgdG8gMS4wLgorICovCit2b2lkIGV3
a192aWV3X2xvYWRfcHJvZ3Jlc3NfY2hhbmdlZChFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tf
VklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYpOworCisgICAgLy8gRXZhc19Db29yZCB3LCBoOworICAgIGRvdWJsZSBw
cm9ncmVzcyA9IHByaXYtPnBhZ2UtPnByb2dyZXNzKCktPmVzdGltYXRlZFByb2dyZXNzKCk7CisK
KyAgICBEQkcoIm89JXAgKHA9JTAuM2YpIiwgbywgcHJvZ3Jlc3MpOworCisgICAgZXZhc19vYmpl
Y3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAibG9hZCxwcm9ncmVzcyIsICZwcm9ncmVzcyk7Cit9
CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHZpZXcgQHBhcmFtIG8gc2hvdWxkIGJl
IHJlc3RvcmVkIHRvIGRlZmF1bHQgY29uZGl0aW9ucworICoKKyAqIEBwYXJhbSBvIFZpZXcuCisg
KiBAcGFyYW0gZnJhbWUgRnJhbWUgdGhhdCBvcmlnaW5hdGVkIHJlc3RvcmUuCisgKgorICogRW1p
dHMgc2lnbmFsOiAicmVzdG9yZSIgd2l0aCBmcmFtZS4KKyAqLwordm9pZCBld2tfdmlld19yZXN0
b3JlX3N0YXRlKEV2YXNfT2JqZWN0ICpvLCBFdmFzX09iamVjdCAqZnJhbWUpCit7CisgICAgZXZh
c19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAicmVzdG9yZSIsIGZyYW1lKTsKK30KKwor
LyoqCisgKiBAaW50ZXJuYWwKKyAqIERlbGVnYXRlcyB0byBicm93c2VyIHRoZSBjcmVhdGlvbiBv
ZiBhIG5ldyB3aW5kb3cuIElmIGl0IGlzIG5vdCBpbXBsZW1lbnRlZCwKKyAqIGN1cnJlbnQgdmll
dyBpcyByZXR1cm5lZCwgc28gbmF2aWdhdGlvbiBtaWdodCBjb250aW51ZSBpbiBzYW1lIHdpbmRv
dy4KKyAqCisgKiBAcGFyYW0gbyBDdXJyZW50IHZpZXcuCisgKgorICogQHJldHVybiBOZXcgdmll
dywgaW4gY2FzZSBzbWFydCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjcmVhdGlvbiBvZiBuZXcgd2lu
ZG93czsKKyAqIGVsc2UsIGN1cnJlbnQgdmlldyBAcGFyYW0gby4KKyAqLworRXZhc19PYmplY3Qg
KmV3a192aWV3X3dpbmRvd19jcmVhdGUoRXZhc19PYmplY3QgKm8pCit7CisgICAgRVdLX1ZJRVdf
U0RfR0VUX09SX1JFVFVSTihvLCBzZCwgTlVMTCk7CisKKyAgICBpZiAoIXNkLT5hcGktPndpbmRv
d19jcmVhdGUpCisgICAgICAgIHJldHVybiBvOworCisgICAgcmV0dXJuIHNkLT5hcGktPndpbmRv
d19jcmVhdGUoc2QpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyBtb3VzZSBo
YXMgbW92ZWQgb3ZlciBhIGxpbmsuCisgKgorICogRW1pdHMgc2lnbmFsOiAibGluayxob3Zlcixp
biIKKyAqLwordm9pZCBld2tfdmlld19tb3VzZV9saW5rX2hvdmVyX2luKEV2YXNfT2JqZWN0ICpv
LCB2b2lkICpkYXRhKQoreworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywg
ImxpbmssaG92ZXIsaW4iLCBkYXRhKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9y
dHMgbW91c2UgaXMgbm90IG92ZXIgYSBsaW5rIGFueW1vcmUuCisgKgorICogRW1pdHMgc2lnbmFs
OiAibGluayxob3ZlcixvdXQiCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbW91c2VfbGlua19ob3Zlcl9v
dXQoRXZhc19PYmplY3QgKm8pCit7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2Fs
bChvLCAibGluayxob3ZlcixvdXQiLCBOVUxMKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAq
IFNldCB0b29sYmFyIHZpc2libGUuCisgKgorICogRW1pdHMgc2lnbmFsOiAidG9vbGJhcnMsdmlz
aWJsZSxzZXQiIHdpdGggYSBwb2ludGVyIHRvIGEgYm9vbGVhbi4KKyAqLwordm9pZCBld2tfdmll
d190b29sYmFyc192aXNpYmxlX3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIHZpc2libGUp
Cit7CisgICAgREJHKCJvPSVwICh2aXNpYmxlPSVkKSIsIG8sICEhdmlzaWJsZSk7CisgICAgZXZh
c19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAidG9vbGJhcnMsdmlzaWJsZSxzZXQiLCAm
dmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBHZXQgdG9vbGJhciB2aXNpYmls
aXR5LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBib29sZWFuIHBv
aW50ZXIgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgcmVzdWx0LiBJdCBkZWZhdWx0cworICogdG8gQGMg
RkFMU0UsIGkuZS4gaWYgYnJvd3NlciBkb2VzIG5vIGxpc3RlbiB0byBlbWl0dGVkIHNpZ25hbCwg
aXQgbWVhbnMKKyAqIHRoZXJlIGFyZSBubyB0b29sYmFycyBhbmQgdGhlcmVmb3JlIHRoZXkgYXJl
IG5vdCB2aXNpYmxlLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInRvb2xiYXJzLHZpc2libGUsZ2V0
IiB3aXRoIGEgcG9pbnRlciB0byBhIGJvb2xlYW4uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfdG9vbGJh
cnNfdmlzaWJsZV9nZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCAqdmlzaWJsZSkKK3sKKyAg
ICBEQkcoIiVzLCBvPSVwIiwgX19mdW5jX18sIG8pOworICAgICp2aXNpYmxlID0gRUlOQV9GQUxT
RTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJ0b29sYmFycyx2aXNp
YmxlLGdldCIsIHZpc2libGUpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogU2V0IHN0YXR1
c2JhciB2aXNpYmxlLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBA
YyBUUlVFIGlmIHN0YXR1c2JhciBhcmUgdmlzaWJsZSwgQGMgRkFMU0Ugb3RoZXJ3aXNlLgorICoK
KyAqIEVtaXRzIHNpZ25hbDogInN0YXR1c2Jhcix2aXNpYmxlLHNldCIgd2l0aCBhIHBvaW50ZXIg
dG8gYSBib29sZWFuLgorICovCit2b2lkIGV3a192aWV3X3N0YXR1c2Jhcl92aXNpYmxlX3NldChF
dmFzX09iamVjdCAqbywgRWluYV9Cb29sIHZpc2libGUpCit7CisgICAgREJHKCJvPSVwICh2aXNp
YmxlPSVkKSIsIG8sICEhdmlzaWJsZSk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tf
Y2FsbChvLCAic3RhdHVzYmFyLHZpc2libGUsc2V0IiwgJnZpc2libGUpOworfQorCisvKioKKyAq
IEBpbnRlcm5hbAorICogR2V0IHN0YXR1c2JhciB2aXNpYmlsaXR5LgorICoKKyAqIEBwYXJhbSBv
IFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBib29sZWFuIHBvaW50ZXIgaW4gd2hpY2ggdG8gc2F2
ZSB0aGUgcmVzdWx0LiBJdCBkZWZhdWx0cworICogdG8gQGMgRkFMU0UsIGkuZS4gaWYgYnJvd3Nl
ciBkb2VzIG5vIGxpc3RlbiB0byBlbWl0dGVkIHNpZ25hbCwgaXQgbWVhbnMKKyAqIHRoZXJlIGlz
IG5vIHN0YXR1c2JhciBhbmQgdGhlcmVmb3JlIGl0IGlzIG5vdCB2aXNpYmxlLgorICoKKyAqIEVt
aXRzIHNpZ25hbDogInN0YXR1c2Jhcix2aXNpYmxlLGdldCIgd2l0aCBhIHBvaW50ZXIgdG8gYSBi
b29sZWFuLgorICovCit2b2lkIGV3a192aWV3X3N0YXR1c2Jhcl92aXNpYmxlX2dldChFdmFzX09i
amVjdCAqbywgRWluYV9Cb29sICp2aXNpYmxlKQoreworICAgIERCRygiJXMsIG89JXAiLCBfX2Z1
bmNfXywgbyk7CisgICAgKnZpc2libGUgPSBFSU5BX0ZBTFNFOworICAgIGV2YXNfb2JqZWN0X3Nt
YXJ0X2NhbGxiYWNrX2NhbGwobywgInN0YXR1c2Jhcix2aXNpYmxlLGdldCIsIHZpc2libGUpOwor
fQorCisvKioKKyAqIEBpbnRlcm5hbAorICogU2V0IHRleHQgb2Ygc3RhdHVzYmFyCisgKgorICog
QHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSB0ZXh0IE5ldyB0ZXh0IHRvIHB1dCBvbiBzdGF0dXNi
YXIuCisgKgorICogRW1pdHMgc2lnbmFsOiAic3RhdHVzYmFyLHRleHQsc2V0IiB3aXRoIGEgc3Ry
aW5nLgorICovCit2b2lkIGV3a192aWV3X3N0YXR1c2Jhcl90ZXh0X3NldChFdmFzX09iamVjdCAq
bywgY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgICBEQkcoIm89JXAgKHRleHQ9JXMpIiwgbywgdGV4
dCk7CisgICAgSU5GKCJzdGF0dXMgYmFyIHRleHQgc2V0OiAlcyIsIHRleHQpOworICAgIGV2YXNf
b2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInN0YXR1c2Jhcix0ZXh0LHNldCIsICh2b2lk
ICopdGV4dCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBTZXQgc2Nyb2xsYmFycyB2aXNp
YmxlLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBAYyBUUlVFIGlm
IHNjcm9sbGJhcnMgYXJlIHZpc2libGUsIEBjIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBFbWl0
cyBzaWduYWw6ICJzY3JvbGxiYXJzLHZpc2libGUsc2V0IiB3aXRoIGEgcG9pbnRlciB0byBhIGJv
b2xlYW4uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfc2Nyb2xsYmFyc192aXNpYmxlX3NldChFdmFzX09i
amVjdCAqbywgRWluYV9Cb29sIHZpc2libGUpCit7CisgICAgREJHKCJvPSVwICh2aXNpYmxlPSVk
KSIsIG8sICEhdmlzaWJsZSk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChv
LCAic2Nyb2xsYmFycyx2aXNpYmxlLHNldCIsICZ2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50
ZXJuYWwKKyAqIEdldCBzY3JvbGxiYXJzIHZpc2liaWxpdHkuCisgKgorICogQHBhcmFtIG8gVmll
dy4KKyAqIEBwYXJhbSB2aXNpYmxlIGJvb2xlYW4gcG9pbnRlciBpbiB3aGljaCB0byBzYXZlIHRo
ZSByZXN1bHQuIEl0IGRlZmF1bHRzCisgKiB0byBAYyBGQUxTRSwgaS5lLiBpZiBicm93c2VyIGRv
ZXMgbm8gbGlzdGVuIHRvIGVtaXR0ZWQgc2lnbmFsLCBpdCBtZWFucworICogdGhlcmUgYXJlIG5v
IHNjcm9sbGJhcnMgYW5kIHRoZXJlZm9yZSB0aGV5IGFyZSBub3QgdmlzaWJsZS4KKyAqCisgKiBF
bWl0cyBzaWduYWw6ICJzY3JvbGxiYXJzLHZpc2libGUsZ2V0IiB3aXRoIGEgcG9pbnRlciB0byBh
IGJvb2xlYW4uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfc2Nyb2xsYmFyc192aXNpYmxlX2dldChFdmFz
X09iamVjdCogbywgRWluYV9Cb29sKiB2aXNpYmxlKQoreworICAgIERCRygiJXMsIG89JXAiLCBf
X2Z1bmNfXywgbyk7CisgICAgKnZpc2libGUgPSBFSU5BX0ZBTFNFOworICAgIGV2YXNfb2JqZWN0
X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInNjcm9sbGJhcnMsdmlzaWJsZSxnZXQiLCB2aXNpYmxl
KTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFNldCBtZW51YmFyIHZpc2libGUuCisgKgor
ICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSB2aXNpYmxlIEBjIFRSVUUgaWYgbWVudWJhciBp
cyB2aXNpYmxlLCBAYyBGQUxTRSBvdGhlcndpc2UuCisgKgorICogRW1pdHMgc2lnbmFsOiAibWVu
dWJhcix2aXNpYmxlLHNldCIgd2l0aCBhIHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lk
IGV3a192aWV3X21lbnViYXJfdmlzaWJsZV9zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCB2
aXNpYmxlKQoreworICAgIERCRygibz0lcCAodmlzaWJsZT0lZCkiLCBvLCAhIXZpc2libGUpOwor
ICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgIm1lbnViYXIsdmlzaWJsZSxz
ZXQiLCAmdmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBHZXQgbWVudWJhciB2
aXNpYmlsaXR5LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBib29s
ZWFuIHBvaW50ZXIgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgcmVzdWx0LiBJdCBkZWZhdWx0cworICog
dG8gQGMgRkFMU0UsIGkuZS4gaWYgYnJvd3NlciBkb2VzIG5vIGxpc3RlbiB0byBlbWl0dGVkIHNp
Z25hbCwgaXQgbWVhbnMKKyAqIHRoZXJlIGlzIG5vIG1lbnViYXIgYW5kIHRoZXJlZm9yZSBpdCBp
cyBub3QgdmlzaWJsZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJtZW51YmFyLHZpc2libGUsZ2V0
IiB3aXRoIGEgcG9pbnRlciB0byBhIGJvb2xlYW4uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbWVudWJh
cl92aXNpYmxlX2dldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sKiB2aXNpYmxlKQoreworICAg
IERCRygiJXMsIG89JXAiLCBfX2Z1bmNfXywgbyk7CisgICAgKnZpc2libGUgPSBFSU5BX0ZBTFNF
OworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgIm1lbnViYXIsdmlzaWJs
ZSxnZXQiLCB2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFNldCB0b29sdGlw
IHRleHQgYW5kIGRpc3BsYXkgaWYgaXQgaXMgY3VycmVudGx5IGhpZGRlbi4KKyAqCisgKiBAcGFy
YW0gbyBWaWV3LgorICogQHBhcmFtIHRleHQgVGV4dCB0byBzZXQgdG9vbHRpcCB0by4KKyAqCisg
KiBFbWl0cyBzaWduYWw6ICJ0b29sdGlwLHRleHQsc2V0IiB3aXRoIGEgc3RyaW5nLiBJZiB0b29s
dGlwIG11c3QgYmUgYWN0dWFsbHkKKyAqIHJlbW92ZWQsIHRleHQgd2lsbCBiZSBOVUxMIG9yICdc
MCcKKyAqLwordm9pZCBld2tfdmlld190b29sdGlwX3RleHRfc2V0KEV2YXNfT2JqZWN0KiBvLCBj
b25zdCBjaGFyKiB0ZXh0KQoreworICAgIERCRygibz0lcCB0ZXh0PSVzIiwgbywgdGV4dCk7Cisg
ICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAidG9vbHRpcCx0ZXh0LHNldCIs
ICh2b2lkICopdGV4dCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKgorICogQHBhcmFtIG8g
Vmlldy4KKyAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZyB0byBzaG93IG9uIGNvbnNvbGUuCisgKiBA
cGFyYW0gbGluZU51bWJlciBMaW5lIG51bWJlci4KKyAqIEBzb3VyY2VJRCBTb3VyY2UgaWQuCisg
KgorICovCit2b2lkIGV3a192aWV3X2FkZF9jb25zb2xlX21lc3NhZ2UoRXZhc19PYmplY3QqIG8s
IGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVuc2lnbmVkIGludCBsaW5lTnVtYmVyLCBjb25zdCBjaGFy
KiBzb3VyY2VJRCkKK3sKKyAgICBEQkcoIm89JXAgbWVzc2FnZT0lcyBsaW5lTnVtYmVyPSV1IHNv
dXJjZUlEPSVzIiwgbywgbWVzc2FnZSwgbGluZU51bWJlciwgc291cmNlSUQpOworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPmFk
ZF9jb25zb2xlX21lc3NhZ2UpOworICAgIHNkLT5hcGktPmFkZF9jb25zb2xlX21lc3NhZ2Uoc2Qs
IG1lc3NhZ2UsIGxpbmVOdW1iZXIsIHNvdXJjZUlEKTsKK30KKwordm9pZCBld2tfdmlld19ydW5f
amF2YXNjcmlwdF9hbGVydChFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25z
dCBjaGFyKiBtZXNzYWdlKQoreworICAgIERCRygibz0lcCBmcmFtZT0lcCBtZXNzYWdlPSVzIiwg
bywgZnJhbWUsIG1lc3NhZ2UpOworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qp
OworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGkpOworCisgICAgaWYgKCFz
ZC0+YXBpLT5ydW5famF2YXNjcmlwdF9hbGVydCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2Qt
PmFwaS0+cnVuX2phdmFzY3JpcHRfYWxlcnQoc2QsIGZyYW1lLCBtZXNzYWdlKTsKK30KKworRWlu
YV9Cb29sIGV3a192aWV3X3J1bl9qYXZhc2NyaXB0X2NvbmZpcm0oRXZhc19PYmplY3QqIG8sIEV2
YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKyAgICBEQkcoIm89JXAg
ZnJhbWU9JXAgbWVzc2FnZT0lcyIsIG8sIGZyYW1lLCBtZXNzYWdlKTsKKyAgICBFV0tfVklFV19T
RF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9O
VUxMX1JFVFVSTl9WQUwoc2QtPmFwaSwgRUlOQV9GQUxTRSk7CisKKyAgICBpZiAoIXNkLT5hcGkt
PnJ1bl9qYXZhc2NyaXB0X2NvbmZpcm0pCisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworCisg
ICAgcmV0dXJuIHNkLT5hcGktPnJ1bl9qYXZhc2NyaXB0X2NvbmZpcm0oc2QsIGZyYW1lLCBtZXNz
YWdlKTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3J1bl9qYXZhc2NyaXB0X3Byb21wdChFdmFz
X09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25zdCBjaGFyKiBtZXNzYWdlLCBjb25z
dCBjaGFyKiBkZWZhdWx0VmFsdWUsIGNoYXIqKiB2YWx1ZSkKK3sKKyAgICBEQkcoIm89JXAgZnJh
bWU9JXAgbWVzc2FnZT0lcyIsIG8sIGZyYW1lLCBtZXNzYWdlKTsKKyAgICBFV0tfVklFV19TRF9H
RVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxM
X1JFVFVSTl9WQUwoc2QtPmFwaSwgRUlOQV9GQUxTRSk7CisKKyAgICBpZiAoIXNkLT5hcGktPnJ1
bl9qYXZhc2NyaXB0X3Byb21wdCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICBy
ZXR1cm4gc2QtPmFwaS0+cnVuX2phdmFzY3JpcHRfcHJvbXB0KHNkLCBmcmFtZSwgbWVzc2FnZSwg
ZGVmYXVsdFZhbHVlLCB2YWx1ZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBEZWxlZ2F0
ZXMgdG8gY2xpZW50IHRvIGRlY2lkZSB3aGV0aGVyIGEgc2NyaXB0IG11c3QgYmUgc3RvcHBlZCBi
ZWNhdXNlIGl0J3MKKyAqIHJ1bm5pbmcgZm9yIHRvbyBsb25nLiBJZiBjbGllbnQgZG9lcyBub3Qg
aW1wbGVtZW50IGl0LCBpdCBnb2VzIHRvIGRlZmF1bHQKKyAqIGltcGxlbWVudGF0aW9uLCB3aGlj
aCBsb2dzIGFuZCByZXR1cm5zIEVJTkFfRkFMU0UuIENsaWVudCBtYXkgcmVtb3ZlIGxvZyBieQor
ICogc2V0dGluZyB0aGlzIGZ1bmN0aW9uIDAsIHdoaWNoIHdpbGwganVzdCByZXR1cm4gRUlOQV9G
QUxTRS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVF
IGlmIHNjcmlwdCBzaG91bGQgYmUgc3RvcHBlZDsgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UKKyAq
LworRWluYV9Cb29sIGV3a192aWV3X3Nob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlwdChFdmFzX09i
amVjdCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVS
Tl9WQUwoc2QtPmFwaSwgRUlOQV9GQUxTRSk7CisKKyAgICBpZiAoIXNkLT5hcGktPnNob3VsZF9p
bnRlcnJ1cHRfamF2YXNjcmlwdCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICBy
ZXR1cm4gc2QtPmFwaS0+c2hvdWxkX2ludGVycnVwdF9qYXZhc2NyaXB0KHNkKTsKK30KKworLyoq
CisgKiBAaW50ZXJuYWwKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSB3ZWIgc2l0ZSBz
aG93biBpbiBAcGFyYW0gZnJhbWUgaXMgYXNraW5nIHRvIHN0b3JlIGRhdGEKKyAqIHRvIHRoZSBk
YXRhYmFzZSBAcGFyYW0gZGF0YWJhc2VOYW1lIGFuZCB0aGUgcXVvdGEgYWxsb2NhdGVkIHRvIHRo
YXQgd2ViIHNpdGUKKyAqIGlzIGV4Y2VlZGVkLiBCcm93c2VyIG1heSB1c2UgdGhpcyB0byBpbmNy
ZWFzZSB0aGUgc2l6ZSBvZiBxdW90YSBiZWZvcmUgdGhlCisgKiBvcmlnaW5hdGluZyBvcGVyYXRp
b25hIGZhaWxzLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gZnJhbWUgVGhlIGZy
YW1lIHdob3NlIHdlYiBwYWdlIGV4Y2VlZGVkIGl0cyBkYXRhYmFzZSBxdW90YS4KKyAqIEBwYXJh
bSBkYXRhYmFzZU5hbWUgRGF0YWJhc2UgbmFtZS4KKyAqLwordm9pZCBld2tfdmlld19leGNlZWRl
ZF9kYXRhYmFzZV9xdW90YShFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25z
dCBjaGFyKiBkYXRhYmFzZU5hbWUpCit7CisgICAgREJHKCJvPSVwIiwgbyk7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRV
Uk4oc2QtPmFwaSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+ZXhj
ZWVkZWRfZGF0YWJhc2VfcXVvdGEpOworICAgIHNkLT5hcGktPmV4Y2VlZGVkX2RhdGFiYXNlX3F1
b3RhKHNkLCBmcmFtZSwgZGF0YWJhc2VOYW1lKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAq
IE9wZW4gcGFuZWwgdG8gY2hvb3NlIGEgZmlsZS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICog
QHBhcmFtIGZyYW1lIEZyYW1lIGluIHdoaWNoIG9wZXJhdGlvbiBpcyByZXF1aXJlZC4KKyAqIEBw
YXJhbSBhbGxvd3NfbXVsdGlwbGVfZmlsZXMgQGMgRUlOQV9UUlVFIHdoZW4gbW9yZSB0aGFuIG9u
ZSBmaWxlIG1heSBiZQorICogc2VsZWN0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlCisgKiBA
c3VnZ2VzdGVkX2ZpbGVuYW1lcyBMaXN0IG9mIHN1Z2dlc3RlZCBmaWxlcyB0byBzZWxlY3QuIEl0
J3MgYWR2aXNhYmxlIHRvCisgKiBqdXN0IGlnbm9yZSB0aGlzIHZhbHVlLCBzaW5jZSBpdCdzIGEg
c291cmNlIG9mIHNlY3VyaXR5IGZsYXcuCisgKiBAc2VsZWN0ZWRfZmlsZW5hbWVzIExpc3Qgb2Yg
ZmlsZXMgc2VsZWN0ZWQuCisgKgorICogQHJldHVybiBARUlOQV9GQUxTRSBpZiB1c2VyIGNhbmNl
bGVkIGZpbGUgc2VsZWN0aW9uOyBARUlOQV9UUlVFIGlmIGNvbmZpcm1lZC4KKyAqLworRWluYV9C
b29sIGV3a192aWV3X3J1bl9vcGVuX3BhbmVsKEV2YXNfT2JqZWN0ICpvLCBFdmFzX09iamVjdCAq
ZnJhbWUsIEVpbmFfQm9vbCBhbGxvd3NfbXVsdGlwbGVfZmlsZXMsIGNvbnN0IEVpbmFfTGlzdCAq
c3VnZ2VzdGVkX2ZpbGVuYW1lcywgRWluYV9MaXN0ICoqc2VsZWN0ZWRfZmlsZW5hbWVzKQorewor
ICAgIERCRygibz0lcCBmcmFtZT0lcCBhbGxvd3NfbXVsdGlwbGVfZmlsZXM9JWQiLCBvLCBmcmFt
ZSwgYWxsb3dzX211bHRpcGxlX2ZpbGVzKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJO
KG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwo
c2QtPmFwaSwgRUlOQV9GQUxTRSk7CisgICAgRWluYV9Cb29sIGNvbmZpcm07CisKKyAgICBpZiAo
c2QtPmFwaS0+cnVuX29wZW5fcGFuZWwgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7
CisKKyAgICAqc2VsZWN0ZWRfZmlsZW5hbWVzID0gTlVMTDsKKworICAgIGNvbmZpcm0gPSBzZC0+
YXBpLT5ydW5fb3Blbl9wYW5lbChzZCwgZnJhbWUsIGFsbG93c19tdWx0aXBsZV9maWxlcywgc3Vn
Z2VzdGVkX2ZpbGVuYW1lcywgc2VsZWN0ZWRfZmlsZW5hbWVzKTsKKyAgICBpZiAoIWNvbmZpcm0g
JiYgKnNlbGVjdGVkX2ZpbGVuYW1lcyAhPSBOVUxMKQorICAgICAgICBFUlIoIkNhbmNlbGVkIGZp
bGUgc2VsZWN0aW9uLCBidXQgc2VsZWN0ZWQgZmlsZW5hbWVzICE9IE5VTEwuIEZyZWUgbmFtZXMg
YmVmb3JlIHJldHVybi4iKTsKKyAgICByZXR1cm4gY29uZmlybTsKK30KKwordm9pZCBld2tfdmll
d19yZXBhaW50KEV2YXNfT2JqZWN0ICpvLCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZh
c19Db29yZCB3LCBFdmFzX0Nvb3JkIGgpCit7CisgICAgREJHKCJvPSVwLCByZWdpb249JWQsJWQg
KyAlZHglZCIsIG8sIHgsIHksIHcsIGgpOworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdik7CisKKyAg
ICBpZiAoIXByaXYtPm1haW5fZnJhbWUtPmNvbnRlbnRSZW5kZXJlcigpKSB7CisgICAgICAgIEVS
Uigibm8gbWFpbiBmcmFtZSBjb250ZW50IHJlbmRlcmVyLiIpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgX2V3a192aWV3X3JlcGFpbnRfYWRkKHByaXYsIHgsIHksIHcsIGgpOworICAg
IF9ld2tfdmlld19zbWFydF9jaGFuZ2VkKHNkKTsKK30KKwordm9pZCBld2tfdmlld19zY3JvbGwo
RXZhc19PYmplY3QqIG8sIEV2YXNfQ29vcmQgZHgsIEV2YXNfQ29vcmQgZHksIEV2YXNfQ29vcmQg
c3gsIEV2YXNfQ29vcmQgc3ksIEV2YXNfQ29vcmQgc3csIEV2YXNfQ29vcmQgc2gsIEV2YXNfQ29v
cmQgY3gsIEV2YXNfQ29vcmQgY3ksIEV2YXNfQ29vcmQgY3csIEV2YXNfQ29vcmQgY2gsIEVpbmFf
Qm9vbCBtYWluX2ZyYW1lKQoreworICAgIERCRygibz0lcCwgZGVsdGE6ICVkLCVkLCBzY3JvbGw6
ICVkLCVkKyVkeCVkLCBjbGlwOiAlZCwlZCslZHglZCIsCisgICAgICAgIG8sIGR4LCBkeSwgc3gs
IHN5LCBzdywgc2gsIGN4LCBjeSwgY3csIGNoKTsKKworICAgIGlmICgoc3ggIT0gY3gpIHx8IChz
eSAhPSBjeSkgfHwgKHN3ICE9IGN3KSB8fCAoc2ggIT0gY2gpKQorICAgICAgICBXUk4oInNjcm9s
bCByZWdpb24gYW5kIGNsaXAgYXJlIGRpZmZlcmVudCEgJWQsJWQrJWR4JWQgYW5kICVkLCVkKyVk
eCVkIiwKKyAgICAgICAgICAgIHN4LCBzeSwgc3csIHNoLCBjeCwgY3ksIGN3LCBjaCk7CisKKyAg
ICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19QUklWX0dF
VF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIEVJTkFfU0FGRVRZX09OX1RSVUVfUkVUVVJOKCFk
eCAmJiAhZHkpOworCisgICAgX2V3a192aWV3X3Njcm9sbF9hZGQocHJpdiwgZHgsIGR5LCBzeCwg
c3ksIHN3LCBzaCwgbWFpbl9mcmFtZSk7CisgICAgX2V3a192aWV3X3NtYXJ0X2NoYW5nZWQoc2Qp
OworfQorCitXZWJDb3JlOjpQYWdlKiBld2tfdmlld19jb3JlX3BhZ2VfZ2V0KGNvbnN0IEV2YXNf
T2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOwor
ICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJu
IHByaXYtPnBhZ2U7Cit9CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBmcmFtZSBmb3IgZ2l2ZW4g
dXJsIGFuZCBvd25lciBlbGVtZW50LgorICoKKyAqIEVtaXRzICJmcmFtZSxjcmVhdGVkIiB3aXRo
IHRoZSBuZXcgZnJhbWUgb2JqZWN0IG9uIHN1Y2Nlc3MuCisgKi8KK1dURjo6UGFzc1JlZlB0cjxX
ZWJDb3JlOjpGcmFtZT4gZXdrX3ZpZXdfZnJhbWVfY3JlYXRlKEV2YXNfT2JqZWN0KiBvLCBFdmFz
X09iamVjdCogZnJhbWUsIGNvbnN0IFdlYkNvcmU6OlN0cmluZyYgbmFtZSwgV2ViQ29yZTo6SFRN
TEZyYW1lT3duZXJFbGVtZW50KiBvd25lckVsZW1lbnQsIGNvbnN0IFdlYkNvcmU6OktVUkwmIHVy
bCwgY29uc3QgV2ViQ29yZTo6U3RyaW5nJiByZWZlcnJlcikKK3sKKyAgICBEQkcoIm89JXAsIGZy
YW1lPSVwLCBuYW1lPSVzLCBvd25lckVsZW1lbnQ9JXAsIHVybD0lcywgcmVmZXJyZXI9JXMiLAor
ICAgICAgICBvLCBmcmFtZSwgbmFtZS51dGY4KCkuZGF0YSgpLCBvd25lckVsZW1lbnQsCisgICAg
ICAgIHVybC5wcmV0dHlVUkwoKS51dGY4KCkuZGF0YSgpLCByZWZlcnJlci51dGY4KCkuZGF0YSgp
KTsKKworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisKKyAgICBXVEY6OlJlZlB0cjxX
ZWJDb3JlOjpGcmFtZT4gY2YgPSBfZXdrX3ZpZXdfY29yZV9mcmFtZV9uZXcKKyAgICAgICAgKHNk
LCBwcml2LCBvd25lckVsZW1lbnQpOworICAgIGlmICghY2YpIHsKKyAgICAgICAgRVJSKCJDb3Vs
ZCBub3QgY3JlYXRlIGNoaWxkIGNvcmUgZnJhbWUgJyVzJyIsIG5hbWUudXRmOCgpLmRhdGEoKSk7
CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghZXdrX2ZyYW1lX2NoaWxkX2Fk
ZChmcmFtZSwgY2YsIG5hbWUsIHVybCwgcmVmZXJyZXIpKSB7CisgICAgICAgIEVSUigiQ291bGQg
bm90IGNyZWF0ZSBjaGlsZCBmcmFtZSBvYmplY3QgJyVzJyIsIG5hbWUudXRmOCgpLmRhdGEoKSk7
CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIFRoZSBjcmVhdGlvbiBvZiB0aGUg
ZnJhbWUgbWF5IGhhdmUgcmVtb3ZlZCBpdHNlbGYgYWxyZWFkeS4KKyAgICBpZiAoIWNmLT5wYWdl
KCkgfHwgIWNmLT50cmVlKCkgfHwgIWNmLT50cmVlKCktPnBhcmVudCgpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIHNkLT5jaGFuZ2VkLmZyYW1lX3JlY3QgPSBFSU5BX1RSVUU7CisgICAgX2V3
a192aWV3X3NtYXJ0X2NoYW5nZWQoc2QpOworCisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJh
Y2tfY2FsbChvLCAiZnJhbWUsY3JlYXRlZCIsIGZyYW1lKTsKKyAgICByZXR1cm4gY2YucmVsZWFz
ZSgpOworfQorCitXVEY6OlBhc3NSZWZQdHI8V2ViQ29yZTo6V2lkZ2V0PiBld2tfdmlld19wbHVn
aW5fY3JlYXRlKEV2YXNfT2JqZWN0KiBvLCBFdmFzX09iamVjdCogZnJhbWUsIGNvbnN0IFdlYkNv
cmU6OkludFNpemUmIHBsdWdpblNpemUsIFdlYkNvcmU6OkhUTUxQbHVnSW5FbGVtZW50KiBlbGVt
ZW50LCBjb25zdCBXZWJDb3JlOjpLVVJMJiB1cmwsIGNvbnN0IFdURjo6VmVjdG9yPFdlYkNvcmU6
OlN0cmluZz4mIHBhcmFtTmFtZXMsIGNvbnN0IFdURjo6VmVjdG9yPFdlYkNvcmU6OlN0cmluZz4m
IHBhcmFtVmFsdWVzLCBjb25zdCBXZWJDb3JlOjpTdHJpbmcmIG1pbWVUeXBlLCBib29sIGxvYWRN
YW51YWxseSkKK3sKKyAgICBEQkcoIm89JXAsIGZyYW1lPSVwLCBzaXplPSVkeCVkLCBlbGVtZW50
PSVwLCB1cmw9JXMsIG1pbWVUeXBlPSVzIiwKKyAgICAgICAgbywgZnJhbWUsIHBsdWdpblNpemUu
d2lkdGgoKSwgcGx1Z2luU2l6ZS5oZWlnaHQoKSwgZWxlbWVudCwKKyAgICAgICAgdXJsLnByZXR0
eVVSTCgpLnV0ZjgoKS5kYXRhKCksIG1pbWVUeXBlLnV0ZjgoKS5kYXRhKCkpOworCisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgc2QtPmNoYW5nZWQuZnJhbWVf
cmVjdCA9IEVJTkFfVFJVRTsKKyAgICBfZXdrX3ZpZXdfc21hcnRfY2hhbmdlZChzZCk7CisKKyAg
ICByZXR1cm4gZXdrX2ZyYW1lX3BsdWdpbl9jcmVhdGUKKyAgICAgICAgKGZyYW1lLCBwbHVnaW5T
aXplLCBlbGVtZW50LCB1cmwsIHBhcmFtTmFtZXMsIHBhcmFtVmFsdWVzLAorICAgICAgICAgbWlt
ZVR5cGUsIGxvYWRNYW51YWxseSk7Cit9CisKKworLyoqCisgKiBAaW50ZXJuYWwKKyAqCisgKiBD
cmVhdGVzIGEgbmV3IHBvcHVwIHdpdGggb3B0aW9ucyB3aGVuIGEgc2VsZWN0IHdpZGdldCB3YXMg
Y2xpY2tlZC4KKyAqCisgKiBAcGFyYW0gY2xpZW50IFBvcHVwTWVudUNsaWVudCBpbnN0YW5jZSB0
aGF0IGFsbG93cyBjb21tdW5pY2F0aW9uIHdpdGggd2Via2l0LgorICogQHBhcmFtIHNlbGVjdGVk
IFNlbGVjdGVkIGl0ZW0uCisgKiBAcGFyYW0gcmVjdCBNZW51J3MgcG9zaXRpb24uCisgKgorICog
RW1pdHM6ICJwb3B1cCxjcmVhdGUiIHdpdGggYSBsaXN0IG9mIEV3a19NZW51IGNvbnRhaW5pbmcg
ZWFjaCBpdGVtJ3MgZGF0YQorICovCit2b2lkIGV3a192aWV3X3BvcHVwX25ldyhFdmFzX09iamVj
dCAqbywgV2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50KiBjbGllbnQsIGludCBzZWxlY3RlZCwgY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICBJTkYoIm89JXAiLCBvKTsKKyAgICBF
V0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9P
Ul9SRVRVUk4oc2QsIHByaXYpOworCisgICAgaWYgKHByaXYtPnBvcHVwLm1lbnVfY2xpZW50KQor
ICAgICAgICBld2tfdmlld19wb3B1cF9kZXN0cm95KG8pOworCisgICAgcHJpdi0+cG9wdXAubWVu
dV9jbGllbnQgPSBjbGllbnQ7CisKKyAgICAvL3BvcHVsYXRlIGl0ZW5zCisgICAgY29uc3QgaW50
IHNpemUgPSBjbGllbnQtPmxpc3RTaXplKCk7CisgICAgZm9yIChpbnQgaT0wOyBpIDwgc2l6ZTsg
KytpKSB7CisgICAgICAgIEV3a19NZW51X0l0ZW0gKml0ZW0gPSAoRXdrX01lbnVfSXRlbSopIG1h
bGxvYyhzaXplb2YoKml0ZW0pKTsKKyAgICAgICAgaWYgKGNsaWVudC0+aXRlbUlzU2VwYXJhdG9y
KGkpKQorICAgICAgICAgICAgaXRlbS0+dHlwZSA9IEVXS19NRU5VX1NFUEFSQVRPUjsKKyAgICAg
ICAgZWxzZSBpZiAoY2xpZW50LT5pdGVtSXNMYWJlbChpKSkKKyAgICAgICAgICAgIGl0ZW0tPnR5
cGUgPSBFV0tfTUVOVV9HUk9VUDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaXRlbS0+dHlw
ZSA9IEVXS19NRU5VX09QVElPTjsKKyAgICAgICAgaXRlbS0+dGV4dCA9IGVpbmFfc3RyaW5nc2hh
cmVfYWRkKGNsaWVudC0+aXRlbVRleHQoaSkudXRmOCgpLmRhdGEoKSk7CisKKyAgICAgICAgcHJp
di0+cG9wdXAubWVudS5pdGVtcyA9IGVpbmFfbGlzdF9hcHBlbmQocHJpdi0+cG9wdXAubWVudS5p
dGVtcywgaXRlbSk7CisgICAgfQorCisgICAgcHJpdi0+cG9wdXAubWVudS54ID0gcmVjdC54KCk7
CisgICAgcHJpdi0+cG9wdXAubWVudS55ID0gcmVjdC55KCk7CisgICAgcHJpdi0+cG9wdXAubWVu
dS53aWR0aCA9IHJlY3Qud2lkdGgoKTsKKyAgICBwcml2LT5wb3B1cC5tZW51LmhlaWdodCA9IHJl
Y3QuaGVpZ2h0KCk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAicG9w
dXAsY3JlYXRlIiwgJnByaXYtPnBvcHVwLm1lbnUpOworfQorCisvKioKKyAqIERlc3Ryb3kgYSBw
cmV2aW91c2x5IGNyZWF0ZWQgbWVudS4KKyAqCisgKiBCZWZvcmUgZGVzdHJveWluZywgaXQgaW5m
b3JtcyBjbGllbnQgdGhhdCBtZW51J3MgZGF0YSBpcyByZWFkeSB0byBiZQorICogZGVzdHJveWVk
IGJ5IHNlbmRpbmcgYSAicG9wdXAsd2lsbGRlbGV0ZSIgd2l0aCBhIGxpc3Qgb2YgbWVudSBpdGVt
cy4gVGhlbiBpdAorICogcmVtb3ZlcyBhbnkgcmVmZXJlbmNlIHRvIG1lbnUgaW5zaWRlIHdlYmtp
dC4gSXQncyBzYWZlIHRvIGNhbGwgdGhpcworICogZnVuY3Rpb24gZWl0aGVyIGZyb20gaW5zaWRl
IHdlYmtpdCBvciBmcm9tIGJyb3dzZXIuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqCisgKiBA
cmV0dXJucyBFSU5BX1RSVUUgaW4gY2FzZSBtZW51IHdhcyBzdWNjZXNzZnVsbHkgZGVzdHJveWVk
IG9yIEVJTkFfVFJVRSBpbgorICogY2FzZSB0aGVyZSB3YXNuJ3QgYW55IG1lbnUgdG8gYmUgZGVz
dHJveWVkLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfcG9wdXBfZGVzdHJveShFdmFzX09iamVj
dCAqbykKK3sKKyAgICBJTkYoIm89JXAiLCBvKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4o
c2QsIHByaXYsIEVJTkFfRkFMU0UpOworCisgICAgaWYgKCFwcml2LT5wb3B1cC5tZW51X2NsaWVu
dCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICBldmFzX29iamVjdF9zbWFydF9j
YWxsYmFja19jYWxsKG8sICJwb3B1cCx3aWxsZGVsZXRlIiwgJnByaXYtPnBvcHVwLm1lbnUpOwor
CisgICAgdm9pZCAqaXRlbXY7CisgICAgRUlOQV9MSVNUX0ZSRUUocHJpdi0+cG9wdXAubWVudS5p
dGVtcywgaXRlbXYpIHsKKyAgICAgICAgRXdrX01lbnVfSXRlbSAqaXRlbSA9IChFd2tfTWVudV9J
dGVtICopaXRlbXY7CisgICAgICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKGl0ZW0tPnRleHQpOwor
ICAgICAgICBmcmVlKGl0ZW0pOworICAgIH0KKyAgICBwcml2LT5wb3B1cC5tZW51X2NsaWVudC0+
cG9wdXBEaWRIaWRlKCk7CisgICAgcHJpdi0+cG9wdXAubWVudV9jbGllbnQgPSBOVUxMOworCisg
ICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBDaGFuZ2VzIGN1cnJlbnRseSBzZWxl
Y3RlZCBpdGVtLgorICoKKyAqIENoYW5nZXMgdGhlIG9wdGlvbiBzZWxlY3RlZCBpbiBzZWxlY3Qg
d2lkZ2V0LiBUaGlzIGlzIGNhbGxlZCBieSBicm93c2VyCisgKiB3aGVuZXZlciB1c2VyIGhhcyBj
aG9zZW4gYSBkaWZmZXJlbnQgaXRlbS4gTW9zdCBsaWtlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzLCBh
CisgKiBjYWxsIHRvIGV3a192aWV3X3BvcHVwX2Rlc3Ryb3kgbWlnaHQgYmUgbWFkZSBpbiBvcmRl
ciB0byBjbG9zZSB0aGUgcG9wdXAuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqIEBpbmRleCBJ
bmRleCBvZiBzZWxlY3RlZCBpdGVtLgorICoKKyAqLwordm9pZCBld2tfdmlld19wb3B1cF9zZWxl
Y3RlZF9zZXQoRXZhc19PYmplY3QgKm8sIGludCBpbmRleCkKK3sKKyAgICBJTkYoIm89JXAiLCBv
KTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworCisgICAgcHJpdi0+cG9wdXAubWVudV9jbGll
bnQtPnZhbHVlQ2hhbmdlZChpbmRleCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXF1
ZXN0IGEgZG93bmxvYWQgdG8gdXNlci4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQG9hcmFt
IGRvd25sb2FkIEV3a19Eb3dubG9hZCBzdHJ1Y3QgdG8gYmUgc2VudC4KKyAqCisgKiBFbWl0czog
ImRvd25sb2FkLHJlcXVlc3QiIHdpdGggYW4gRXdrX0Rvd25sb2FkIGNvbnRhaW5pbmcgdGhlIGRl
dGFpbHMgb2YgdGhlCisgKiByZXF1ZXN0ZWQgZG93bmxvYWQuIFRoZSBkb3dubG9hZCBwZXIgc2Ug
bXVzdCBiZSBoYW5kbGVkIG91dHNpZGUgb2Ygd2Via2l0LgorICovCit2b2lkIGV3a192aWV3X2Rv
d25sb2FkX3JlcXVlc3QoRXZhc19PYmplY3QgKm8sIEV3a19Eb3dubG9hZCogZG93bmxvYWQpCit7
CisgICAgREJHKCJ2aWV3PSVwIiwgbyk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tf
Y2FsbChvLCAiZG93bmxvYWQscmVxdWVzdCIsIGRvd25sb2FkKTsKK30KSW5kZXg6IFdlYktpdC9l
ZmwvZXdrL2V3a192aWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBXZWJLaXQvZWZs
L2V3ay9ld2tfdmlldy5oCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICAgIENvcHlyaWdodCAoQykg
MjAwOS0yMDEwIFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCisgICAgQ29weXJpZ2h0IChDKSAy
MDA5LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAg
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNpZm5kZWYgZXdrX3ZpZXdfaAorI2Rl
ZmluZSBld2tfdmlld19oCisKKyNpbmNsdWRlIDxFdmFzLmg+CisjaW5jbHVkZSA8Y2Fpcm8uaD4K
KyNpbmNsdWRlIDxld2tfaGlzdG9yeS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAi
QyIgeworI2VuZGlmCisKKy8qKgorICogQGJyaWVmIFdlYktpdCBtYWluIHNtYXJ0IG9iamVjdC4K
KyAqCisgKiBUaGlzIG9iamVjdCBpcyB0aGUgaGlnaCBsZXZlbCBhY2Nlc3MgdG8gV2ViS2l0LUVG
TCBicm93c2VyCisgKiBjb21wb25lbnQuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0
aGUgbWFpbiBmcmFtZSBhbmQgb3RoZXIKKyAqIGNyaXRpY2FsIHJlc291cmNlcy4KKyAqCisgKiBF
dmVyeSBld2tfdmlldyBoYXMgYXQgbGVhc3Qgb25lIGZyYW1lLCBjYWxsZWQgIm1haW4gZnJhbWUi
IGFuZAorICogcmV0cmlldmVkIHdpdGggZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQoKS4gRGlyZWN0
IGZyYW1lIGFjY2VzcyBpcworICogb2Z0ZW4gZGlzY291cmFnZWQsIGl0IGlzIHJlY29tbWVuZGVk
IHRvIHVzZSBld2tfdmlldyBmdW5jdGlvbnMKKyAqIGluc3RlYWQuCisgKgorICogVGhlIGZvbGxv
d2luZyBzaWduYWxzIChzZWUgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfYWRkKCkpIGFyZSBl
bWl0dGVkOgorICoKKyAqICAtICJyZWFkeSIsIHZvaWQ6IHBhZ2UgaXMgZnVsbHkgbG9hZGVkLgor
ICogIC0gInRpdGxlLGNoYW5nZWQiLCBjb25zdCBjaGFyKjogdGl0bGUgb2YgdGhlIG1haW4gZnJh
bWUgY2hhbmdlZC4KKyAqICAtICJ1cmksY2hhbmdlZCIsIGNvbnN0IGNoYXIqOiB1cmkgb2YgdGhl
IG1haW4gZnJhbWUgY2hhbmdlZC4KKyAqICAtICJsb2FkLHN0YXJ0ZWQiLCB2b2lkOiBmcmFtZSBz
dGFydGVkIGxvYWRpbmcuCisgKiAgLSAibG9hZCxwcm9ncmVzcyIsIGRvdWJsZSo6IGxvYWQgcHJv
Z3Jlc3MgY2hhbmdlZCAob3ZlcmFsbCB2YWx1ZQorICogICAgZnJvbSAwLjAgdG8gMS4wLCBjb25u
ZWN0IHRvIGluZGl2aWR1YWwgZnJhbWVzIGZvciBmaW5lIGdyYWluZWQpLgorICogIC0gImxvYWQs
ZmluaXNoZWQiLCBjb25zdCBFd2tfRnJhbWVfTG9hZF9FcnJvcio6IHJlcG9ydHMgbG9hZAorICog
ICAgZmluaXNoZWQgYW5kIGFzIGFyZ3VtZW50IEBjIE5VTEwgaWYgc3VjY2Vzc2Z1bGx5IG9yIHBv
aW50ZXIgdG8KKyAqICAgIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgZXJyb3IuCisgKiAgLSAibG9h
ZCxwcm92aXNpb25hbCIsIHZvaWQ6IHZpZXcgc3RhcnRlZCBwcm92aXNpb25hbCBsb2FkLgorICog
IC0gImxvYWQsZXJyb3IiLCBjb25zdCBFd2tfRnJhbWVfTG9hZF9FcnJvcio6IHJlcG9ydHMgbG9h
ZCBmYWlsZWQKKyAqICAgIGFuZCBhcyBhcmd1bWVudCBhIHBvaW50ZXIgdG8gc3RydWN0dXJlIGRl
ZmluaW5nIHRoZSBlcnJvci4KKyAqICAtICJmcmFtZSxjcmVhdGVkIiwgRXZhc19PYmplY3QqOiB3
aGVuIGZyYW1lcyBhcmUgY3JlYXRlZCwgdGhleSBhcmUKKyAqICAgIGVtaXR0ZWQgaW4gdGhpcyBz
aWduYWwuCisgKiAgLSAiem9vbSxhbmltYXRlZCxlbmQiLCB2b2lkOiByZXF1ZXN0ZWQgYW5pbWF0
ZWQgem9vbSBpcyBmaW5pc2hlZC4KKyAqICAtICJtZW51YmFyLHZpc2libGUsc2V0IiwgRWluYV9C
b29sOiBzZXQgbWVudWJhciB2aXNpYmlsaXR5LgorICogIC0gIm1lbnViYXIsdmlzaWJsZSxnZXQi
LCBFaW5hX0Jvb2wgKjogZXhwZWN0cyBhIEBjIEVJTkFfVFJVRSBpZiBtZW51YmFyIGlzCisgKiAg
ICB2aXNpYmxlOyBvdGhlcndpc2UsIEBjIEVJTkFfRkFMU0UuCisgKiAgLSAibWVudWJhcix2aXNp
YmxlLHNldCIsIEVpbmFfQm9vbDogc2V0IG1lbnViYXIgdmlzaWJpbGl0eS4KKyAqICAtICJtZW51
YmFyLHZpc2libGUsZ2V0IiwgRWluYV9Cb29sICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYg
bWVudWJhciBpcworICogICAgdmlzaWJsZTsgQGMgRUlOQV9GQUxTRSwgb3RoZXJ3aXNlLgorICog
IC0gInNjcm9sbGJhcnMsdmlzaWJsZSxzZXQiLCBFaW5hX0Jvb2w6IHNldCBzY3JvbGxiYXJzIHZp
c2liaWxpdHkuCisgKiAgLSAic2Nyb2xsYmFycyx2aXNpYmxlLGdldCIsIEVpbmFfQm9vbCAqOiBl
eHBlY3RzIGEgQGMgRUlOQV9UUlVFIGlmIHNjcm9sbGJhcnMKKyAqICAgIGFyZSB2aXNpYmxlOyBA
YyBFSU5BX0ZBTFNFLCBvdGhlcndpc2UuCisgKiAgLSAic3RhdHVzYmFyLHZpc2libGUsc2V0Iiwg
RWluYV9Cb29sOiBzZXQgc3RhdHVzYmFyIHZpc2liaWxpdHkuCisgKiAgLSAic3RhdHVzYmFyLHZp
c2libGUsZ2V0IiwgRWluYV9Cb29sICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgc3RhdHVz
YmFyIGlzCisgKiAgICB2aXNpYmxlOyBAYyBFSU5BX0ZBTFNFLCBvdGhlcndpc2UuCisgKiAgLSAi
dG9vbGJhcix2aXNpYmxlLHNldCIsIEVpbmFfQm9vbDogc2V0IHRvb2xiYXIgdmlzaWJpbGl0eS4K
KyAqICAtICJ0b29sYmFyLHZpc2libGUsZ2V0IiwgRWluYV9Cb29sICo6IGV4cGVjdHMgYSBAYyBF
SU5BX1RSVUUgaWYgdG9vbGJhcgorICogICAgaXMgdmlzaWJsZTsgQGMgRUlOQV9GQUxTRSwgb3Ro
ZXJ3aXNlLgorICogIC0gImxpbmssaG92ZXIsaW4iLCBjb25zdCBjaGFyICpsaW5rWzJdOiByZXBv
cnRzIG1vdXNlIGlzIG92ZXIgYSBsaW5rIGFuZCBhcworICogICAgYXJndW1lbnQgZ2l2ZXMgdGhl
IHVybCBpbiBsaW5rWzBdIGFuZCBsaW5rJ3MgdGl0bGUgaW4gbGlua1sxXS4KKyAqICAtICJsaW5r
LGhvdmVyLG91dCIsIGNvbnN0IGNoYXIgKmxpbmtbMl06IHJlcG9ydHMgbW91c2UgbW92ZWQgb3V0
IGZyb20gYSBsaW5rCisgKiAgICBhbmQgYXMgYXJndW1lbnQgZ2l2ZXMgdGhlIHVybCBpbiBsaW5r
WzBdIGFuZCBsaW5rJ3MgdGl0bGUgaW4gbGlua1sxXS4KKyAqICAtICJwb3B1cCxjcmVhdGUiLCBF
d2tfTWVudTogcmVwb3J0cyB0aGF0IGEgbmV3IG1lbnUgd2FzIGNyZWF0ZWQuCisgKiAgLSAicG9w
dXAsd2lsbGRlbGV0ZWQiLCBFd2tfTWVudTogcmVwb3J0cyB0aGF0IGEgcHJldmlvdXNseSBjcmVh
dGVkIG1lbnUgaXMKKyAqICAgIGFib3V0IHRvIGJlIGRlbGV0ZWQuCisgKiAgLSAiZG93bmxvYWQs
cmVxdWVzdCIsIEV3a19Eb3dubG9hZDogcmVwb3J0cyBhIGRvd25sb2FkIGlzIGJlaW5nIHJlcXVl
c3RlZAorICogICAgYW5kIGFzIGFyZ3VtZW50cyBnaXZlcyBpdHMgZGV0YWlscy4KKyAqICAtICJp
Y29uLHJlY2VpdmVkIiwgdm9pZDogbWFpbiBmcmFtZSByZWNlaXZlZCBhbiBpY29uLgorICovCisK
K3R5cGVkZWYgc3RydWN0IF9Fd2tfVmlld19TbWFydF9EYXRhIEV3a19WaWV3X1NtYXJ0X0RhdGE7
CisKKy8qKgorICogRXdrIHZpZXcncyBjbGFzcywgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWItY2xh
c3Nlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0V3a19WaWV3X1NtYXJ0X0NsYXNzIEV3a19WaWV3
X1NtYXJ0X0NsYXNzOworc3RydWN0IF9Fd2tfVmlld19TbWFydF9DbGFzcyB7CisgICAgRXZhc19T
bWFydF9DbGFzcyBzYzsgLyoqPCBhbGwgYnV0ICdkYXRhJyBpcyBmcmVlIHRvIGJlIGNoYW5nZWQu
ICovCisgICAgdW5zaWduZWQgbG9uZyB2ZXJzaW9uOworCisgICAgRXZhc19PYmplY3QgKigqd2lu
ZG93X2NyZWF0ZSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QpOyAvKio8IGNyZWF0ZXMgYSBuZXcg
d2luZG93LCByZXF1ZXN0ZWQgYnkgd2Via2l0ICovCisgICAgLy8gaG9va3MgdG8gYWxsb3cgZGlm
ZmVyZW50IGJhY2tpbmcgc3RvcmVzCisgICAgRXZhc19PYmplY3QgKigqYmFja2luZ19zdG9yZV9h
ZGQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsgLyoqPCBtdXN0IGJlIGRlZmluZWQgKi8KKyAg
ICBFaW5hX0Jvb2wgKCpzY3JvbGxzX3Byb2Nlc3MpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsg
LyoqPCBtdXN0IGJlIGRlZmluZWQgKi8KKyAgICBFaW5hX0Jvb2wgKCpyZXBhaW50c19wcm9jZXNz
KShFd2tfVmlld19TbWFydF9EYXRhICpzZCk7IC8qKjwgbXVzdCBiZSBkZWZpbmVkICovCisgICAg
RWluYV9Cb29sICgqY29udGVudHNfcmVzaXplKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgaW50
IHcsIGludCBoKTsKKyAgICBFaW5hX0Jvb2wgKCp6b29tX3NldCkoRXdrX1ZpZXdfU21hcnRfRGF0
YSAqc2QsIGZsb2F0IHpvb20sIEV2YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpOworICAgIEVp
bmFfQm9vbCAoKnpvb21fd2Vha19zZXQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBmbG9hdCB6
b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KTsKKyAgICB2b2lkICgqem9vbV93ZWFr
X3Ntb290aF9zY2FsZV9zZXQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBFaW5hX0Jvb2wgc21v
b3RoX3NjYWxlKTsKKyAgICB2b2lkICgqYmdfY29sb3Jfc2V0KShFd2tfVmlld19TbWFydF9EYXRh
ICpzZCwgdW5zaWduZWQgY2hhciByLCB1bnNpZ25lZCBjaGFyIGcsIHVuc2lnbmVkIGNoYXIgYiwg
dW5zaWduZWQgY2hhciBhKTsKKyAgICB2b2lkICgqZmx1c2gpKEV3a19WaWV3X1NtYXJ0X0RhdGEg
KnNkKTsKKyAgICBFaW5hX0Jvb2wgKCpwcmVfcmVuZGVyX3JlZ2lvbikoRXdrX1ZpZXdfU21hcnRf
RGF0YSAqc2QsIEV2YXNfQ29vcmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNf
Q29vcmQgaCwgZmxvYXQgem9vbSk7CisgICAgdm9pZCAoKnByZV9yZW5kZXJfY2FuY2VsKShFd2tf
Vmlld19TbWFydF9EYXRhICpzZCk7CisgICAgLy8gZXZlbnQgaGFuZGxpbmc6CisgICAgLy8gIC0g
cmV0dXJucyB0cnVlIGlmIGhhbmRsZWQKKyAgICAvLyAgLSBpZiBvdmVycmlkZGVuLCBoYXZlIHRv
IGNhbGwgcGFyZW50IG1ldGhvZCBpZiBkZXNpcmVkCisgICAgRWluYV9Cb29sICgqZm9jdXNfaW4p
KEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICBFaW5hX0Jvb2wgKCpmb2N1c19vdXQpKEV3
a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICBFaW5hX0Jvb2wgKCptb3VzZV93aGVlbCkoRXdr
X1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0IEV2YXNfRXZlbnRfTW91c2VfV2hlZWwgKmV2KTsK
KyAgICBFaW5hX0Jvb2wgKCptb3VzZV9kb3duKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgY29u
c3QgRXZhc19FdmVudF9Nb3VzZV9Eb3duICpldik7CisgICAgRWluYV9Cb29sICgqbW91c2VfdXAp
KEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBjb25zdCBFdmFzX0V2ZW50X01vdXNlX1VwICpldik7
CisgICAgRWluYV9Cb29sICgqbW91c2VfbW92ZSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNv
bnN0IEV2YXNfRXZlbnRfTW91c2VfTW92ZSAqZXYpOworICAgIEVpbmFfQm9vbCAoKmtleV9kb3du
KShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgY29uc3QgRXZhc19FdmVudF9LZXlfRG93biAqZXYp
OworICAgIEVpbmFfQm9vbCAoKmtleV91cCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0
IEV2YXNfRXZlbnRfS2V5X1VwICpldik7CisKKyAgICB2b2lkICgqYWRkX2NvbnNvbGVfbWVzc2Fn
ZSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHVuc2lnbmVk
IGludCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpzb3VyY2VJRCk7CisgICAgdm9pZCAoKnJ1bl9q
YXZhc2NyaXB0X2FsZXJ0KShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgRXZhc19PYmplY3QgKmZy
YW1lLCBjb25zdCBjaGFyICptZXNzYWdlKTsKKyAgICBFaW5hX0Jvb2wgKCpydW5famF2YXNjcmlw
dF9jb25maXJtKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgRXZhc19PYmplY3QgKmZyYW1lLCBj
b25zdCBjaGFyICptZXNzYWdlKTsKKyAgICBFaW5hX0Jvb2wgKCpydW5famF2YXNjcmlwdF9wcm9t
cHQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBFdmFzX09iamVjdCAqZnJhbWUsIGNvbnN0IGNo
YXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmRlZmF1bHRWYWx1ZSwgY2hhciAqKnZhbHVlKTsKKyAg
ICBFaW5hX0Jvb2wgKCpzaG91bGRfaW50ZXJydXB0X2phdmFzY3JpcHQpKEV3a19WaWV3X1NtYXJ0
X0RhdGEgKnNkKTsKKyAgICB2b2lkICgqZXhjZWVkZWRfZGF0YWJhc2VfcXVvdGEpKEV3a19WaWV3
X1NtYXJ0X0RhdGEgKnNkLCBFdmFzX09iamVjdCAqZnJhbWUsIGNvbnN0IGNoYXIgKmRhdGFiYXNl
TmFtZSk7CisKKyAgICBFaW5hX0Jvb2wgKCpydW5fb3Blbl9wYW5lbCkoRXdrX1ZpZXdfU21hcnRf
RGF0YSAqc2QsIEV2YXNfT2JqZWN0ICpmcmFtZSwgRWluYV9Cb29sIGFsbG93c19tdWx0aXBsZV9m
aWxlcywgY29uc3QgRWluYV9MaXN0ICpzdWdnZXN0ZWRfZmlsZW5hbWVzLCBFaW5hX0xpc3QgKipz
ZWxlY3RlZF9maWxlbmFtZXMpOworfTsKKworI2RlZmluZSBFV0tfVklFV19TTUFSVF9DTEFTU19W
RVJTSU9OIDFVTCAvKiogdGhlIHZlcnNpb24geW91IGhhdmUgdG8gcHV0IGludG8gdGhlIHZlcnNp
b24gZmllbGQgaW4gdGhlIEV3a19WaWV3X1NtYXJ0X0NsYXNzIHN0cnVjdHVyZSAqLworCisvKioK
KyAqIEluaXRpYWxpemVyIGZvciB3aG9sZSBFd2tfVmlld19TbWFydF9DbGFzcyBzdHJ1Y3R1cmUu
CisgKgorICogQHBhcmFtIHNtYXJ0X2NsYXNzX2luaXQgaW5pdGlhbGl6ZXIgdG8gdXNlIGZvciB0
aGUgImJhc2UiIGZpZWxkCisgKiAoRXZhc19TbWFydF9DbGFzcykuCisgKgorICogQHNlZSBFV0tf
VklFV19TTUFSVF9DTEFTU19JTklUX05VTEwKKyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1Nf
SU5JVF9WRVJTSU9OCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTkFNRV9WRVJT
SU9OCisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVChzbWFydF9jbGFzc19p
bml0KSB7c21hcnRfY2xhc3NfaW5pdCwgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfVkVSU0lPTiwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMH0KKworLyoqCisgKiBJbml0aWFsaXplciB0byB6ZXJvIGEgd2hv
bGUgRXdrX1ZpZXdfU21hcnRfQ2xhc3Mgc3RydWN0dXJlLgorICoKKyAqIEBzZWUgRVdLX1ZJRVdf
U01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lO
SVRfTkFNRV9WRVJTSU9OCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVQKKyAqLwor
I2RlZmluZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05VTEwgRVdLX1ZJRVdfU01BUlRfQ0xB
U1NfSU5JVChFVkFTX1NNQVJUX0NMQVNTX0lOSVRfTlVMTCkKKworLyoqCisgKiBJbml0aWFsaXpl
ciB0byB6ZXJvIGEgd2hvbGUgRXdrX1ZpZXdfU21hcnRfQ2xhc3Mgc3RydWN0dXJlIGFuZCBzZXQg
dmVyc2lvbi4KKyAqCisgKiBTaW1pbGFyIHRvIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTlVM
TCwgYnV0IHdpbGwgc2V0IHZlcnNpb24gZmllbGQgb2YKKyAqIEV2YXNfU21hcnRfQ2xhc3MgKGJh
c2UgZmllbGQpIHRvIGxhdGVzdCBFVkFTX1NNQVJUX0NMQVNTX1ZFUlNJT04KKyAqCisgKiBAc2Vl
IEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTlVMTAorICogQHNlZSBFV0tfVklFV19TTUFSVF9D
TEFTU19JTklUX05BTUVfVkVSU0lPTgorICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklU
CisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OIEVXS19WSUVX
X1NNQVJUX0NMQVNTX0lOSVQoRVZBU19TTUFSVF9DTEFTU19JTklUX1ZFUlNJT04pCisKKy8qKgor
ICogSW5pdGlhbGl6ZXIgdG8gemVybyBhIHdob2xlIEV3a19WaWV3X1NtYXJ0X0NsYXNzIHN0cnVj
dHVyZSBhbmQgc2V0CisgKiBuYW1lIGFuZCB2ZXJzaW9uLgorICoKKyAqIFNpbWlsYXIgdG8gRVdL
X1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9OVUxMLCBidXQgd2lsbCBzZXQgdmVyc2lvbiBmaWVsZCBv
ZgorICogRXZhc19TbWFydF9DbGFzcyAoYmFzZSBmaWVsZCkgdG8gbGF0ZXN0IEVWQVNfU01BUlRf
Q0xBU1NfVkVSU0lPTiBhbmQgbmFtZQorICogdG8gdGhlIHNwZWNpZmljIHZhbHVlLgorICoKKyAq
IEl0IHdpbGwga2VlcCBhIHJlZmVyZW5jZSB0byBuYW1lIGZpZWxkIGFzIGEgImNvbnN0IGNoYXIg
KiIsIHRoYXQgaXMsCisgKiBuYW1lIG11c3QgYmUgYXZhaWxhYmxlIHdoaWxlIHRoZSBzdHJ1Y3R1
cmUgaXMgdXNlZCAoaGludDogc3RhdGljIG9yIGdsb2JhbCEpCisgKiBhbmQgd2lsbCBub3QgYmUg
bW9kaWZpZWQuCisgKgorICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05VTEwKKyAq
IEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OCisgKiBAc2VlIEVXS19WSUVX
X1NNQVJUX0NMQVNTX0lOSVQKKyAqLworI2RlZmluZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklU
X05BTUVfVkVSU0lPTihuYW1lKSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUKEVWQVNfU01BUlRf
Q0xBU1NfSU5JVF9OQU1FX1ZFUlNJT04obmFtZSkpCisKKy8qKgorICogQGludGVybmFsCisgKgor
ICogcHJpdmF0ZSBkYXRhIHRoYXQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IEVGTCBXZWJLaXQgYW5k
IHNob3VsZCBuZXZlcgorICogYmUgbW9kaWZpZWQgZnJvbSBvdXRzaWRlLgorICovCit0eXBlZGVm
IHN0cnVjdCBfRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhIEV3a19WaWV3X1ByaXZhdGVfRGF0YTsKKwor
ZW51bSBfRXdrX01lbnVfSXRlbV9UeXBlIHsKKyAgICBFV0tfTUVOVV9TRVBBUkFUT1IsCisgICAg
RVdLX01FTlVfR1JPVVAsCisgICAgRVdLX01FTlVfT1BUSU9OCit9OwordHlwZWRlZiBlbnVtIF9F
d2tfTWVudV9JdGVtX1R5cGUgRXdrX01lbnVfSXRlbV9UeXBlOworCisKKy8qKgorICogU3RydWN0
dXJlIGRvIGNvbnRhaW4gZGF0YSBvZiBlYWNoIG1lbnUgaXRlbQorICovCit0eXBlZGVmIHN0cnVj
dCBfRXdrX01lbnVfSXRlbSBFd2tfTWVudV9JdGVtOworc3RydWN0IF9Fd2tfTWVudV9JdGVtIHsK
KyAgICBjb25zdCBjaGFyICp0ZXh0OyAvKio8IEl0ZW0ncyB0ZXh0ICovCisgICAgRXdrX01lbnVf
SXRlbV9UeXBlIHR5cGU7IC8qKiBJdGVtJ3MgdHlwZSAqLworfTsKKworLyoqCisgKiBTdHJ1Y3R1
cmUgdG8gY29udGFpbiBQb3B1cCBtZW51IGRhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9Fd2tf
TWVudSBFd2tfTWVudTsKK3N0cnVjdCBfRXdrX01lbnUgeworICAgICAgICBFaW5hX0xpc3QqIGl0
ZW1zOworICAgICAgICBpbnQgeDsKKyAgICAgICAgaW50IHk7CisgICAgICAgIGludCB3aWR0aDsK
KyAgICAgICAgaW50IGhlaWdodDsKK307CisKKy8qKgorICogU3RydWN0dXJlIHRvIGNvbnRhaW4g
RG93bmxvYWQgZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBfRXdrX0Rvd25sb2FkIEV3a19Eb3du
bG9hZDsKK3N0cnVjdCBfRXdrX0Rvd25sb2FkIHsKKyAgICBjb25zdCBjaGFyKiB1cmw7CisgICAg
LyogdG8gYmUgZXh0ZW5kZWQgKi8KK307CisKKy8qKgorICogU2Nyb2xsIHJlcXVlc3QgdGhhdCBz
aG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucy4KKyAqLwordHlw
ZWRlZiBzdHJ1Y3QgX0V3a19TY3JvbGxfUmVxdWVzdCBFd2tfU2Nyb2xsX1JlcXVlc3Q7CitzdHJ1
Y3QgX0V3a19TY3JvbGxfUmVxdWVzdCB7CisgICAgRXZhc19Db29yZCBkeCwgZHk7CisgICAgRXZh
c19Db29yZCB4LCB5LCB3LCBoLCB4MiwgeTI7CisgICAgRWluYV9Cb29sIG1haW5fc2Nyb2xsOwor
fTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdG8gY29udGFpbiBpbnRlcm5hbCBWaWV3IGRhdGEsIGl0
IGlzIHRvIGJlIGNvbnNpZGVyZWQKKyAqIHByaXZhdGUgYnkgdXNlcnMsIGJ1dCBtYXkgYmUgZXh0
ZW5kZWQgb3IgY2hhbmdlZCBieSBzdWItY2xhc3NlcworICogKHRoYXQncyB3aHkgaXQncyBpbiBw
dWJsaWMgaGVhZGVyIGZpbGUpLgorICovCitzdHJ1Y3QgX0V3a19WaWV3X1NtYXJ0X0RhdGEgewor
ICAgIEV2YXNfT2JqZWN0X1NtYXJ0X0NsaXBwZWRfRGF0YSBiYXNlOworICAgIGNvbnN0IEV3a19W
aWV3X1NtYXJ0X0NsYXNzICphcGk7IC8qKjwgcmVmZXJlbmNlIHRvIGNhc3RlZCBjbGFzcyBpbnN0
YW5jZSAqLworICAgIEV2YXNfT2JqZWN0ICpzZWxmOyAvKio8IHJlZmVyZW5jZSB0byBvd25lciBv
YmplY3QgKi8KKyAgICBFdmFzX09iamVjdCAqbWFpbl9mcmFtZTsgLyoqPCByZWZlcmVuY2UgdG8g
bWFpbiBmcmFtZSBvYmplY3QgKi8KKyAgICBFdmFzX09iamVjdCAqYmFja2luZ19zdG9yZTsgLyoq
PCByZWZlcmVuY2UgdG8gYmFja2luZyBzdG9yZSAqLworICAgIEV3a19WaWV3X1ByaXZhdGVfRGF0
YSAqX3ByaXY7IC8qKjwgc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkLCBjKysgc3R1ZmYgKi8KKyAg
ICBzdHJ1Y3QgeworICAgICAgICBFdmFzX0Nvb3JkIHgsIHksIHcsIGg7IC8qKjwgbGFzdCB1c2Vk
IHZpZXdwb3J0ICovCisgICAgfSB2aWV3OworICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCB7
CisgICAgICAgICAgICBmbG9hdCBzdGFydDsKKyAgICAgICAgICAgIGZsb2F0IGVuZDsKKyAgICAg
ICAgICAgIGZsb2F0IGN1cnJlbnQ7IC8qKjwgaWYgPiAwLjAsIHRoZW4gZG9pbmcgYW5pbWF0ZWQg
em9vbS4gKi8KKyAgICAgICAgfSB6b29tOworICAgIH0gYW5pbWF0ZWRfem9vbTsKKyAgICBzdHJ1
Y3QgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHIsIGcsIGIsIGE7CisgICAgfSBiZ19jb2xvcjsK
KyAgICBFaW5hX0Jvb2wgem9vbV93ZWFrX3Ntb290aF9zY2FsZToxOworICAgIHN0cnVjdCB7IC8q
Kjwgd2hhdCBjaGFuZ2VkIHNpbmNlIGxhc3Qgc21hcnRfY2FsY3VsYXRlICovCisgICAgICAgIEVp
bmFfQm9vbCBhbnk6MTsKKyAgICAgICAgRWluYV9Cb29sIHNpemU6MTsKKyAgICAgICAgRWluYV9C
b29sIHBvc2l0aW9uOjE7CisgICAgICAgIEVpbmFfQm9vbCBmcmFtZV9yZWN0OjE7CisgICAgfSBj
aGFuZ2VkOworfTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfYmFzZV9zbWFydF9zZXQo
RXdrX1ZpZXdfU21hcnRfQ2xhc3MgKmFwaSk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19z
aW5nbGVfc21hcnRfc2V0KEV3a19WaWV3X1NtYXJ0X0NsYXNzICphcGkpOworCitFQVBJIEV2YXNf
T2JqZWN0ICpld2tfdmlld19zaW5nbGVfYWRkKEV2YXMgKmUpOworCitFQVBJIHZvaWQgICAgICAg
ICBld2tfdmlld19maXhlZF9sYXlvdXRfc2l6ZV9zZXQoRXZhc19PYmplY3QgKm8sIEV2YXNfQ29v
cmQgdywgRXZhc19Db29yZCBoKTsKK0VBUEkgdm9pZCAgICAgICAgIGV3a192aWV3X2ZpeGVkX2xh
eW91dF9zaXplX2dldChFdmFzX09iamVjdCAqbywgRXZhc19Db29yZCAqdywgRXZhc19Db29yZCAq
aCk7CisKK0VBUEkgdm9pZCAgICAgICAgIGV3a192aWV3X3RoZW1lX3NldChFdmFzX09iamVjdCAq
bywgY29uc3QgY2hhciAqcGF0aCk7CitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld190aGVtZV9n
ZXQoRXZhc19PYmplY3QgKm8pOworCitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19mcmFtZV9t
YWluX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmll
d19mcmFtZV9mb2N1c2VkX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgRWluYV9C
b29sICAgIGV3a192aWV3X3VyaV9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKnVyaSk7
CitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld191cmlfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpv
KTsKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3RpdGxlX2dldChjb25zdCBFdmFzX09iamVj
dCAqbyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X2VkaXRhYmxlX2dldChjb25zdCBF
dmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19lZGl0YWJsZV9zZXQo
RXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlZGl0YWJsZSk7CisKK0VBUEkgdm9pZCAgICAgICAg
IGV3a192aWV3X2JnX2NvbG9yX3NldChFdmFzX09iamVjdCAqbywgaW50IHIsIGludCBnLCBpbnQg
YiwgaW50IGEpOworRUFQSSB2b2lkICAgICAgICAgZXdrX3ZpZXdfYmdfY29sb3JfZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0ICpvLCBpbnQgKnIsIGludCAqZywgaW50ICpiLCBpbnQgKmEpOworCitFQVBJ
IGNoYXIgICAgICAgICpld2tfdmlld19zZWxlY3Rpb25fZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpv
KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NlbGVjdF9ub25lKEV2YXNfT2JqZWN0ICpv
KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NlbGVjdF9hbGwoRXZhc19PYmplY3QgKm8p
OworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2VsZWN0X3BhcmFncmFwaChFdmFzX09iamVj
dCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZWxlY3Rfc2VudGVuY2UoRXZhc19P
YmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2VsZWN0X2xpbmUoRXZhc19P
YmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2VsZWN0X3dvcmQoRXZhc19P
YmplY3QgKm8pOworCitFQVBJIHZvaWQgICAgICAgICBld2tfdmlld19wb3B1cF9zZWxlY3RlZF9z
ZXQoRXZhc19PYmplY3QgKm8sIGludCBpbmRleCk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d19wb3B1cF9kZXN0cm95KEV2YXNfT2JqZWN0ICpvKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdr
X3ZpZXdfdGV4dF9zZWFyY2goY29uc3QgRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKnN0cmlu
ZywgRWluYV9Cb29sIGNhc2Vfc2Vuc2l0aXZlLCBFaW5hX0Jvb2wgZm9yd2FyZCwgRWluYV9Cb29s
IHdyYXApOworCitFQVBJIHVuc2lnbmVkIGludCBld2tfdmlld190ZXh0X21hdGNoZXNfbWFyayhF
dmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqc3RyaW5nLCBFaW5hX0Jvb2wgY2FzZV9zZW5zaXRp
dmUsIEVpbmFfQm9vbCBoaWdobGlnaHQsIHVuc2lnbmVkIGludCBsaW1pdCk7CitFQVBJIEVpbmFf
Qm9vbCAgICBld2tfdmlld190ZXh0X21hdGNoZXNfdW5tYXJrX2FsbChFdmFzX09iamVjdCAqbyk7
CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld190ZXh0X21hdGNoZXNfaGlnaGxpZ2h0X3NldChF
dmFzX09iamVjdCAqbywgRWluYV9Cb29sIGhpZ2hsaWdodCk7CitFQVBJIEVpbmFfQm9vbCAgICBl
d2tfdmlld190ZXh0X21hdGNoZXNfaGlnaGxpZ2h0X2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7
CisKK0VBUEkgZG91YmxlICAgICAgIGV3a192aWV3X2xvYWRfcHJvZ3Jlc3NfZ2V0KGNvbnN0IEV2
YXNfT2JqZWN0ICpvKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc3RvcChFdmFzX09i
amVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19yZWxvYWQoRXZhc19PYmplY3Qg
Km8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfcmVsb2FkX2Z1bGwoRXZhc19PYmplY3Qg
Km8pOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19iYWNrKEV2YXNfT2JqZWN0ICpvKTsK
K0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X2ZvcndhcmQoRXZhc19PYmplY3QgKm8pOworRUFQ
SSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfbmF2aWdhdGUoRXZhc19PYmplY3QgKm8sIGludCBzdGVw
cyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X2JhY2tfcG9zc2libGUoRXZhc19PYmpl
Y3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfZm9yd2FyZF9wb3NzaWJsZShFdmFz
X09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19uYXZpZ2F0ZV9wb3NzaWJs
ZShFdmFzX09iamVjdCAqbywgaW50IHN0ZXBzKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfaGlzdG9yeV9lbmFibGVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9C
b29sICAgIGV3a192aWV3X2hpc3RvcnlfZW5hYmxlX3NldChFdmFzX09iamVjdCAqbywgRWluYV9C
b29sIGVuYWJsZSk7CitFQVBJIEV3a19IaXN0b3J5ICpld2tfdmlld19oaXN0b3J5X2dldChjb25z
dCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgZmxvYXQgICAgICAgIGV3a192aWV3X3pvb21fZ2V0
KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21f
c2V0KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3Jk
IGN5KTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfem9vbV93ZWFrX3Ntb290aF9zY2Fs
ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSB2b2lkICAgICAgICAgZXdrX3ZpZXdf
em9vbV93ZWFrX3Ntb290aF9zY2FsZV9zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBzbW9v
dGhfc2NhbGUpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld196b29tX3dlYWtfc2V0KEV2
YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KTsK
K0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdGFydChFdmFz
X09iamVjdCAqbywgZmxvYXQgem9vbSk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld196b29t
X2FuaW1hdGVkX21hcmtfZW5kKEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tKTsKK0VBUEkgRWlu
YV9Cb29sICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19jdXJyZW50KEV2YXNfT2JqZWN0
ICpvLCBmbG9hdCB6b29tKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fYW5pbWF0
ZWRfbWFya19zdG9wKEV2YXNfT2JqZWN0ICpvKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfem9vbV9hbmltYXRlZF9zZXQoRXZhc19PYmplY3QgKm8sIGZsb2F0IHpvb20sIGZsb2F0IGR1
cmF0aW9uLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KTsKK0VBUEkgRWluYV9Cb29sICAg
IGV3a192aWV3X3pvb21fdGV4dF9vbmx5X2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJ
IEVpbmFfQm9vbCAgICBld2tfdmlld196b29tX3RleHRfb25seV9zZXQoRXZhc19PYmplY3QgKm8s
IEVpbmFfQm9vbCBzZXR0aW5nKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfcHJlX3Jl
bmRlcl9yZWdpb24oRXZhc19PYmplY3QgKm8sIEV2YXNfQ29vcmQgeCwgRXZhc19Db29yZCB5LCBF
dmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCwgZmxvYXQgem9vbSk7CitFQVBJIHZvaWQgICAgICAg
ICBld2tfdmlld19wcmVfcmVuZGVyX2NhbmNlbChFdmFzX09iamVjdCAqbyk7CisKKy8qIHNldHRp
bmdzICovCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX3VzZXJfYWdlbnRfZ2V0
KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRp
bmdfdXNlcl9hZ2VudF9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKnVzZXJfYWdlbnQp
OworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2F1dG9fbG9hZF9pbWFnZXNf
Z2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3Nl
dHRpbmdfYXV0b19sb2FkX2ltYWdlc19zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBhdXRv
bWF0aWMpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2F1dG9fc2hyaW5r
X2ltYWdlc19nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdr
X3ZpZXdfc2V0dGluZ19hdXRvX3Nocmlua19pbWFnZXNfc2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5h
X0Jvb2wgYXV0b21hdGljKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19l
bmFibGVfc2NyaXB0c19nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wg
ICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfc2NyaXB0c19zZXQoRXZhc19PYmplY3QgKm8sIEVp
bmFfQm9vbCBlbmFibGUpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2Vu
YWJsZV9wbHVnaW5zX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAg
ICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVnaW5zX3NldChFdmFzX09iamVjdCAqbywgRWlu
YV9Cb29sIGVuYWJsZSk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfc2Ny
aXB0c193aW5kb3dfb3Blbl9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jv
b2wgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRzX3dpbmRvd19vcGVuX3NldChFdmFzX09iamVj
dCAqbywgRWluYV9Cb29sIGFsbG93KTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0
dGluZ19yZXNpemFibGVfdGV4dGFyZWFzX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJ
IEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX3Jlc2l6YWJsZV90ZXh0YXJlYXNfc2V0KEV2
YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgZW5hYmxlKTsKKworRUFQSSBjb25zdCBjaGFyICAqZXdr
X3ZpZXdfc2V0dGluZ191c2VyX3N0eWxlc2hlZXRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsK
K0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfdXNlcl9zdHlsZXNoZWV0X3NldChF
dmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqdXJpKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdr
X3ZpZXdfc2V0dGluZ19wcml2YXRlX2Jyb3dzaW5nX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7
CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX3ByaXZhdGVfYnJvd3Npbmdfc2V0
KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgZW5hYmxlKTsKKworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfc2V0dGluZ19jYXJldF9icm93c2luZ19nZXQoY29uc3QgRXZhc19PYmplY3QgKm8p
OworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19jYXJldF9icm93c2luZ19zZXQo
RXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlbmFibGUpOworCitFQVBJIGNvbnN0IGNoYXIgICpl
d2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2N1c3RvbV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8p
OworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmNvZGluZ19jdXN0b21fc2V0
KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFyICplbmNvZGluZyk7CitFQVBJIGNvbnN0IGNoYXIg
ICpld2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2RlZmF1bHRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0
ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVs
dF9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmVuY29kaW5nKTsKKworRUFQSSBpbnQg
ICAgICAgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fc2l6ZV9nZXQoY29uc3QgRXZh
c19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21p
bmltdW1fc2l6ZV9zZXQoRXZhc19PYmplY3QgKm8sIGludCBzaXplKTsKK0VBUEkgaW50ICAgICAg
ICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9taW5pbXVtX2xvZ2ljYWxfc2l6ZV9nZXQoY29uc3Qg
RXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250
X21pbmltdW1fbG9naWNhbF9zaXplX3NldChFdmFzX09iamVjdCAqbywgaW50IHNpemUpOworRUFQ
SSBpbnQgICAgICAgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9nZXQoY29u
c3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19m
b250X2RlZmF1bHRfc2l6ZV9zZXQoRXZhc19PYmplY3QgKm8sIGludCBzaXplKTsKK0VBUEkgaW50
ICAgICAgICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9nZXQoY29uc3Qg
RXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250
X21vbm9zcGFjZV9zaXplX3NldChFdmFzX09iamVjdCAqbywgaW50IHNpemUpOworCitFQVBJIGNv
bnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2ZvbnRfc3RhbmRhcmRfZ2V0KGNvbnN0IEV2YXNf
T2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zdGFu
ZGFyZF9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWlseSk7CisKK0VBUEkgY29u
c3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9jdXJzaXZlX2dldChjb25zdCBFdmFzX09i
amVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfY3Vyc2l2
ZV9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWlseSk7CisKK0VBUEkgY29uc3Qg
Y2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2VfZ2V0KGNvbnN0IEV2YXNfT2Jq
ZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3Bh
Y2Vfc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFyICpmYW1pbHkpOworCitFQVBJIGNvbnN0
IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2ZvbnRfZmFudGFzeV9nZXQoY29uc3QgRXZhc19PYmpl
Y3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2ZhbnRhc3lf
c2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFyICpmYW1pbHkpOworCitFQVBJIGNvbnN0IGNo
YXIgICpld2tfdmlld19zZXR0aW5nX2ZvbnRfc2VyaWZfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpv
KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zZXJpZl9zZXQoRXZh
c19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWlseSk7CisKK0VBUEkgY29uc3QgY2hhciAgKmV3
a192aWV3X3NldHRpbmdfZm9udF9zYW5zX3NlcmlmX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7
CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2ZvbnRfc2Fuc19zZXJpZl9zZXQo
RXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWlseSk7CisKKy8qIHRvIGJlIHVzZWQgYnkg
c3ViY2xhc3MgaW1wbGVtZW50YXRpb25zICovCitFQVBJIEV3a19WaWV3X1NtYXJ0X0RhdGEgKmV3
a192aWV3X3NtYXJ0X2RhdGFfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKKworRUFQSSBjb25z
dCBFaW5hX1JlY3RhbmdsZSAqZXdrX3ZpZXdfcmVwYWludHNfZ2V0KGNvbnN0IEV3a19WaWV3X1By
aXZhdGVfRGF0YSAqcHJpdiwgc2l6ZV90ICpjb3VudCk7CitFQVBJIGNvbnN0IEV3a19TY3JvbGxf
UmVxdWVzdCAqZXdrX3ZpZXdfc2Nyb2xsX3JlcXVlc3RzX2dldChjb25zdCBFd2tfVmlld19Qcml2
YXRlX0RhdGEgKnByaXYsIHNpemVfdCAqY291bnQpOworCitFQVBJIHZvaWQgZXdrX3ZpZXdfcmVw
YWludF9hZGQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2LCBFdmFzX0Nvb3JkIHgsIEV2YXNf
Q29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFzX0Nvb3JkIGgpOworCitFQVBJIHZvaWQgZXdrX3Zp
ZXdfbGF5b3V0X2lmX25lZWRlZF9yZWN1cnNpdmUoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2
KTsKKworRUFQSSB2b2lkIGV3a192aWV3X3Njcm9sbHNfcHJvY2VzcyhFd2tfVmlld19TbWFydF9E
YXRhICpzZCk7CisKKy8qKgorICogU3RydWN0dXJlIHRoYXQga2VlcHMgcGFpbnQgY29udGV4dC4K
KyAqCisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1
YmNsYXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcg
c3RvcmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9Fd2tfVmlld19QYWludF9Db250ZXh0IEV3a19W
aWV3X1BhaW50X0NvbnRleHQ7CisKK0VBUEkgRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqZXdrX3Zp
ZXdfcGFpbnRfY29udGV4dF9uZXcoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2LCBjYWlyb190
ICpjcik7CitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9mcmVlKEV3a19WaWV3X1Bh
aW50X0NvbnRleHQgKmN0eHQpOworCitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9z
YXZlKEV3a19WaWV3X1BhaW50X0NvbnRleHQgKmN0eHQpOworRUFQSSB2b2lkIGV3a192aWV3X3Bh
aW50X2NvbnRleHRfcmVzdG9yZShFd2tfVmlld19QYWludF9Db250ZXh0ICpjdHh0KTsKK0VBUEkg
dm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X2NsaXAoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAq
Y3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEpOworRUFQSSB2b2lkIGV3a192aWV3X3Bh
aW50X2NvbnRleHRfcGFpbnQoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgY29uc3QgRWlu
YV9SZWN0YW5nbGUgKmFyZWEpOworRUFQSSB2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFp
bnRfY29udGVudHMoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgY29uc3QgRWluYV9SZWN0
YW5nbGUgKmFyZWEpOworRUFQSSB2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfc2NhbGUoRXdr
X1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgZmxvYXQgc2NhbGVfeCwgZmxvYXQgc2NhbGVfeSk7
CitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF90cmFuc2xhdGUoRXdrX1ZpZXdfUGFp
bnRfQ29udGV4dCAqY3R4dCwgZmxvYXQgeCwgZmxvYXQgeSk7CisKK0VBUEkgRWluYV9Cb29sIGV3
a192aWV3X3BhaW50KEV3a19WaWV3X1ByaXZhdGVfRGF0YSAqcHJpdiwgY2Fpcm9fdCAqY3IsIGNv
bnN0IEVpbmFfUmVjdGFuZ2xlICphcmVhKTsKK0VBUEkgRWluYV9Cb29sIGV3a192aWV3X3BhaW50
X2NvbnRlbnRzKEV3a19WaWV3X1ByaXZhdGVfRGF0YSAqcHJpdiwgY2Fpcm9fdCAqY3IsIGNvbnN0
IEVpbmFfUmVjdGFuZ2xlICphcmVhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYK
KyNlbmRpZiAvLyBld2tfdmlld19oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51933</attachid>
            <date>2010-03-29 11:10:43 -0700</date>
            <delta_ts>2010-03-30 13:09:40 -0700</delta_ts>
            <desc>Add ewk_view to WK/efl/ewk.</desc>
            <filename>webkit-efl-webkit_efl_ewk-1.diff</filename>
            <type>text/plain</type>
            <size>142888</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L0NoYW5nZUxvZwor
KysgV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDEwLTAzLTI5ICBMZWFuZHJv
IFBlcmVpcmEgIDxsZWFuZHJvQHByb2Z1c2lvbi5tb2JpPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBld2tfdmlldyAodGhlIGhpZ2ggbGV2ZWwg
b2JqZWN0IHRvIGFjY2VzcyB0aGUgV2ViS2l0LUVGTCBicm93c2VyCisgICAgICAgIGNvbXBvbmVu
dCkgdG8gZWZsL2V3ay4KKyAgICAgICAgaHR0cDovL3dlYmtpdC5vcmcvYi8zNTkzMgorCisgICAg
ICAgICogZWZsL2V3ay9ld2tfdmlldy5jcHA6IEFkZGVkLgorICAgICAgICAqIGVmbC9ld2svZXdr
X3ZpZXcuaDogQWRkZWQuCisKIDIwMTAtMDMtMjggIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBh
cHBsZS5jb20+CiAKICAgICAgICAgQnVpbGQgZml4LiBJbmNsdWRlIFdpbmRvd3NLZXlib2FyZENv
ZGVzLmggaW5zdGVhZCBvZiBLZXlib2FyZENvZGVzLmguCkluZGV4OiBXZWJLaXQvZWZsL2V3ay9l
d2tfdmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2Rldi9udWxsCisrKyBXZWJLaXQvZWZsL2V3ay9l
d2tfdmlldy5jcHAKQEAgLTAsMCArMSwzNjQ0IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAw
OS0yMDEwIFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0ZW1zCisgICAgQ29weXJpZ2h0IChDKSAyMDA5
LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
ICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJld2tfdmlldy5oIgorCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50RWZsLmgiCisjaW5jbHVk
ZSAiQ29udGV4dE1lbnVDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgor
I2luY2x1ZGUgIkRyYWdDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJFV2ViS2l0LmgiCisjaW5jbHVk
ZSAiRWRpdG9yQ2xpZW50RWZsLmgiCisjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiRnJhbWVMb2FkZXJDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRFZmwu
aCIKKyNpbmNsdWRlICJQb3B1cE1lbnVDbGllbnQuaCIKKyNpbmNsdWRlICJQcm9ncmVzc1RyYWNr
ZXIuaCIKKyNpbmNsdWRlICJld2tfcHJpdmF0ZS5oIgorCisjaW5jbHVkZSA8RWNvcmUuaD4KKyNp
bmNsdWRlIDxFaW5hLmg+CisjaW5jbHVkZSA8RXZhcy5oPgorI2luY2x1ZGUgPGVpbmFfc2FmZXR5
X2NoZWNrcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNkZWZpbmUgWk9PTV9NSU4gKDAu
MDUpCisjZGVmaW5lIFpPT01fTUFYICg0LjApCisKK3N0YXRpYyBjb25zdCBjaGFyIEVXS19WSUVX
X1RZUEVfU1RSW10gPSAiRVdLX1ZpZXciOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVX
X1JFUEFJTlRTX1NJWkVfSU5JVElBTCA9IDMyOworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklF
V19SRVBBSU5UU19TSVpFX1NURVAgPSA4Oworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklFV19S
RVBBSU5UU19TSVpFX01BWF9GUkVFID0gNjQ7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgRVdLX1ZJ
RVdfU0NST0xMU19TSVpFX0lOSVRJQUwgPSA4Oworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklF
V19TQ1JPTExTX1NJWkVfU1RFUCA9IDI7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVXX1ND
Uk9MTFNfU0laRV9NQVhfRlJFRSA9IDMyOworCitzdHJ1Y3QgX0V3a19WaWV3X1ByaXZhdGVfRGF0
YSB7CisgICAgV2ViQ29yZTo6UGFnZSogcGFnZTsKKyAgICBXZWJDb3JlOjpTZXR0aW5ncyogcGFn
ZV9zZXR0aW5nczsKKyAgICBXZWJDb3JlOjpGcmFtZSogbWFpbl9mcmFtZTsKKyAgICBFd2tfSGlz
dG9yeSogaGlzdG9yeTsKKyAgICBzdHJ1Y3QgeworICAgICAgICBFd2tfTWVudSBtZW51OworICAg
ICAgICBXZWJDb3JlOjpQb3B1cE1lbnVDbGllbnQqIG1lbnVfY2xpZW50OworICAgIH0gcG9wdXA7
CisgICAgc3RydWN0IHsKKyAgICAgICAgRWluYV9SZWN0YW5nbGUqIGFycmF5OworICAgICAgICBz
aXplX3QgY291bnQ7CisgICAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7CisgICAgfSByZXBhaW50czsK
KyAgICBzdHJ1Y3QgeworICAgICAgICBFd2tfU2Nyb2xsX1JlcXVlc3QqIGFycmF5OworICAgICAg
ICBzaXplX3QgY291bnQ7CisgICAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7CisgICAgfSBzY3JvbGxz
OworICAgIHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIHVzZXJfYWdlbnQ7CisgICAgICAg
IGNvbnN0IGNoYXIqIHVzZXJfc3R5bGVzaGVldDsKKyAgICAgICAgY29uc3QgY2hhciogZW5jb2Rp
bmdfZGVmYXVsdDsKKyAgICAgICAgY29uc3QgY2hhciogZW5jb2RpbmdfY3VzdG9tOworICAgICAg
ICBpbnQgZm9udF9taW5pbXVtX3NpemU7CisgICAgICAgIGludCBmb250X21pbmltdW1fbG9naWNh
bF9zaXplOworICAgICAgICBpbnQgZm9udF9kZWZhdWx0X3NpemU7CisgICAgICAgIGludCBmb250
X21vbm9zcGFjZV9zaXplOworICAgICAgICBjb25zdCBjaGFyKiBmb250X3N0YW5kYXJkOworICAg
ICAgICBjb25zdCBjaGFyKiBmb250X2N1cnNpdmU7CisgICAgICAgIGNvbnN0IGNoYXIqIGZvbnRf
bW9ub3NwYWNlOworICAgICAgICBjb25zdCBjaGFyKiBmb250X2ZhbnRhc3k7CisgICAgICAgIGNv
bnN0IGNoYXIqIGZvbnRfc2VyaWY7CisgICAgICAgIGNvbnN0IGNoYXIqIGZvbnRfc2Fuc19zZXJp
ZjsKKyAgICAgICAgRWluYV9Cb29sIGF1dG9fbG9hZF9pbWFnZXM6MTsKKyAgICAgICAgRWluYV9C
b29sIGF1dG9fc2hyaW5rX2ltYWdlczoxOworICAgICAgICBFaW5hX0Jvb2wgZW5hYmxlX3Njcmlw
dHM6MTsKKyAgICAgICAgRWluYV9Cb29sIGVuYWJsZV9wbHVnaW5zOjE7CisgICAgICAgIEVpbmFf
Qm9vbCBzY3JpcHRzX3dpbmRvd19vcGVuOjE7CisgICAgICAgIEVpbmFfQm9vbCByZXNpemFibGVf
dGV4dGFyZWFzOjE7CisgICAgICAgIEVpbmFfQm9vbCBwcml2YXRlX2Jyb3dzaW5nOjE7CisgICAg
ICAgIEVpbmFfQm9vbCBjYXJldF9icm93c2luZzoxOworICAgIH0gc2V0dGluZ3M7CisgICAgc3Ry
dWN0IHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGRvdWJsZSBzdGFydDsKKyAgICAg
ICAgICAgIGRvdWJsZSBlbmQ7CisgICAgICAgICAgICBkb3VibGUgZHVyYXRpb247CisgICAgICAg
IH0gdGltZTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGZsb2F0IHN0YXJ0OworICAg
ICAgICAgICAgZmxvYXQgZW5kOworICAgICAgICAgICAgZmxvYXQgcmFuZ2U7CisgICAgICAgIH0g
em9vbTsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIEV2YXNfQ29vcmQgeCwgeTsKKyAg
ICAgICAgfSBjZW50ZXI7CisgICAgICAgIEVjb3JlX0FuaW1hdG9yKiBhbmltYXRvcjsKKyAgICB9
IGFuaW1hdGVkX3pvb207CisgICAgc3RydWN0IHsKKyAgICAgICAgRXZhc19Db29yZCB3LCBoOwor
ICAgICAgICBFaW5hX0Jvb2wgdXNlOjE7CisgICAgfSBmaXhlZF9sYXlvdXQ7Cit9OworCisjaWZu
ZGVmIEVXS19UWVBFX0NIRUNLCisjZGVmaW5lIEVXS19WSUVXX1RZUEVfQ0hFQ0sobywgLi4uKSBk
byB7IH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBFV0tfVklFV19UWVBFX0NIRUNLKG8sIC4u
LikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
XAorICAgICAgICBjb25zdCBjaGFyKiBfdG1wX290eXBlID0gZXZhc19vYmplY3RfdHlwZV9nZXQo
byk7ICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBFdmFzX1NtYXJ0KiBfdG1wX3MgPSBl
dmFzX29iamVjdF9zbWFydF9zbWFydF9nZXQobyk7ICAgICAgXAorICAgICAgICBpZiAoRUlOQV9V
TkxJS0VMWSghX3RtcF9zKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgICAgICAgICAgRUlOQV9MT0dfQ1JJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgiJXAgKCVzKSBpcyBub3QgYSBzbWFy
dCBvYmplY3QhIiwgbywgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBfdG1w
X290eXBlID8gX3RtcF9vdHlwZSA6ICIobnVsbCkiKTsgICAgICAgICAgICAgICAgICAgXAorICAg
ICAgICAgICAgcmV0dXJuIF9fVkFfQVJHU19fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBFdmFzX1NtYXJ0
X0NsYXNzKiBfdG1wX3NjID0gZXZhc19zbWFydF9jbGFzc19nZXQoX3RtcF9zKTsgXAorICAgICAg
ICBpZiAoRUlOQV9VTkxJS0VMWSghX3RtcF9zYykpIHsgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgXAorICAgICAgICAgICAgRUlOQV9MT0dfQ1JJVCAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgiJXAgKCVzKSBp
cyBub3QgYSBzbWFydCBvYmplY3QhIiwgbywgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAg
ICAgICAgICBfdG1wX290eXBlID8gX3RtcF9vdHlwZSA6ICIobnVsbCkiKTsgICAgICAgICAgICAg
ICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIF9fVkFfQVJHU19fOyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAo
RUlOQV9VTkxJS0VMWShfdG1wX3NjLT5kYXRhICE9IEVXS19WSUVXX1RZUEVfU1RSKSkgeyAgICAg
ICAgXAorICAgICAgICAgICAgRUlOQV9MT0dfQ1JJVCAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgiJXAgKCVzKSBpcyBub3Qg
b2YgYW4gZXdrX3ZpZXcgKG5lZWQgJXAsIGdvdCAlcCkhIiwgICAgXAorICAgICAgICAgICAgICAg
ICBvLCBfdG1wX290eXBlID8gX3RtcF9vdHlwZSA6ICIobnVsbCkiLCAgICAgICAgICAgICAgICAg
XAorICAgICAgICAgICAgICAgICBFV0tfVklFV19UWVBFX1NUUiwgX3RtcF9zYy0+ZGF0YSk7ICAg
ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIF9fVkFfQVJHU19fOyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor
ICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBFV0tfVklFV19TRF9HRVQobywgcHRy
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBFd2tfVmlld19TbWFydF9E
YXRhKiBwdHIgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZXZhc19vYmplY3Rfc21hcnRfZGF0YV9n
ZXQobykKKworI2RlZmluZSBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHB0ciwgLi4uKSAg
ICAgICAgICBcCisgICAgRVdLX1ZJRVdfVFlQRV9DSEVDSyhvLCBfX1ZBX0FSR1NfXyk7ICAgICAg
ICAgICAgICAgIFwKKyAgICBFV0tfVklFV19TRF9HRVQobywgcHRyKTsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgXAorICAgIGlmICghcHRyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgIENSSVRJQ0FMKCJubyBzbWFydCBkYXRhIGZvciBvYmpl
Y3QgJXAgKCVzKSIsICAgIFwKKyAgICAgICAgICAgICAgICAgbywgZXZhc19vYmplY3RfdHlwZV9n
ZXQobykpOyAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gX19WQV9BUkdTX187ICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEVXS19WSUVXX1BSSVZfR0VU
KHNkLCBwdHIpICAgICAgICAgICAgICBcCisgICAgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwdHIg
PSBzZC0+X3ByaXYKKworI2RlZmluZSBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHB0
ciwgLi4uKSAgICAgICAgICAgICAgIFwKKyAgICBFV0tfVklFV19QUklWX0dFVChzZCwgcHRyKTsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFwdHIpIHsgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDUklU
SUNBTCgibm8gcHJpdmF0ZSBkYXRhIGZvciBvYmplY3QgJXAgKCVzKSIsICAgICAgICAgIFwKKyAg
ICAgICAgICAgICAgICAgc2QtPnNlbGYsIGV2YXNfb2JqZWN0X3R5cGVfZ2V0KHNkLT5zZWxmKSk7
ICAgICBcCisgICAgICAgIHJldHVybiBfX1ZBX0FSR1NfXzsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2No
YW5nZWQoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgaWYgKHNkLT5jaGFuZ2VkLmFu
eSkKKyAgICAgICAgcmV0dXJuOworICAgIHNkLT5jaGFuZ2VkLmFueSA9IEVJTkFfVFJVRTsKKyAg
ICBldmFzX29iamVjdF9zbWFydF9jaGFuZ2VkKHNkLT5zZWxmKTsKK30KKworc3RhdGljIEVpbmFf
Qm9vbCBfZXdrX3ZpZXdfcmVwYWludHNfcmVzaXplKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJp
diwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCogdG1wID0gcmVhbGxvYyhwcml2LT5yZXBhaW50
cy5hcnJheSwgc2l6ZSAqIHNpemVvZihFaW5hX1JlY3RhbmdsZSkpOworICAgIGlmICghdG1wKSB7
CisgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBub3QgcmVhbGxvYyByZXBhaW50cyBhcnJheSB0byAl
enUgZWxlbWVudHMuIiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0K
KyAgICBwcml2LT5yZXBhaW50cy5hbGxvY2F0ZWQgPSBzaXplOworICAgIHByaXYtPnJlcGFpbnRz
LmFycmF5ID0gKEVpbmFfUmVjdGFuZ2xlKil0bXA7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30K
Kworc3RhdGljIHZvaWQgX2V3a192aWV3X3JlcGFpbnRfYWRkKEV3a19WaWV3X1ByaXZhdGVfRGF0
YSogcHJpdiwgRXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19D
b29yZCBoKQoreworICAgIEVpbmFfUmVjdGFuZ2xlKiByOworCisgICAgLy8gZnByaW50ZihzdGRl
cnIsICI+Pj4gcmVwYWludCByZXF1ZXN0ZWQ6ICVkLCVkKyVkeCVkXG4iLCB4LCB5LCB3LCBoKTsK
KyAgICBpZiAocHJpdi0+cmVwYWludHMuYWxsb2NhdGVkID09IHByaXYtPnJlcGFpbnRzLmNvdW50
KSB7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAoIXByaXYtPnJlcGFpbnRzLmFs
bG9jYXRlZCkKKyAgICAgICAgICAgIHNpemUgPSBFV0tfVklFV19SRVBBSU5UU19TSVpFX0lOSVRJ
QUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNpemUgPSBwcml2LT5yZXBhaW50cy5hbGxv
Y2F0ZWQgKyBFV0tfVklFV19SRVBBSU5UU19TSVpFX1NURVA7CisgICAgICAgIGlmICghX2V3a192
aWV3X3JlcGFpbnRzX3Jlc2l6ZShwcml2LCBzaXplKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICByID0gcHJpdi0+cmVwYWludHMuYXJyYXkgKyBwcml2LT5yZXBhaW50cy5jb3Vu
dDsKKyAgICBwcml2LT5yZXBhaW50cy5jb3VudCsrOworCisgICAgci0+eCA9IHg7CisgICAgci0+
eSA9IHk7CisgICAgci0+dyA9IHc7CisgICAgci0+aCA9IGg7CisKKyAgICBEQkcoImFkZCByZXBh
aW50ICVkLCVkKyVkeCVkIiwgeCwgeSwgdywgaCk7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmll
d19yZXBhaW50c19mbHVzaChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYpCit7CisgICAgcHJp
di0+cmVwYWludHMuY291bnQgPSAwOworICAgIGlmIChwcml2LT5yZXBhaW50cy5hbGxvY2F0ZWQg
PD0gRVdLX1ZJRVdfUkVQQUlOVFNfU0laRV9NQVhfRlJFRSkKKyAgICAgICAgcmV0dXJuOworICAg
IF9ld2tfdmlld19yZXBhaW50c19yZXNpemUocHJpdiwgRVdLX1ZJRVdfUkVQQUlOVFNfU0laRV9N
QVhfRlJFRSk7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3Njcm9sbHNfcmVzaXpl
KEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCog
dG1wID0gcmVhbGxvYyhwcml2LT5zY3JvbGxzLmFycmF5LCBzaXplICogc2l6ZW9mKEV3a19TY3Jv
bGxfUmVxdWVzdCkpOworICAgIGlmICghdG1wKSB7CisgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBu
b3QgcmVhbGxvYyBzY3JvbGxzIGFycmF5IHRvICV6dSBlbGVtZW50cy4iLCBzaXplKTsKKyAgICAg
ICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorICAgIHByaXYtPnNjcm9sbHMuYWxsb2NhdGVk
ID0gc2l6ZTsKKyAgICBwcml2LT5zY3JvbGxzLmFycmF5ID0gKEV3a19TY3JvbGxfUmVxdWVzdCop
dG1wOworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19z
Y3JvbGxfYWRkKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgRXZhc19Db29yZCBkeCwgRXZh
c19Db29yZCBkeSwgRXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZh
c19Db29yZCBoLCBFaW5hX0Jvb2wgbWFpbl9zY3JvbGwpCit7CisgICAgRXdrX1Njcm9sbF9SZXF1
ZXN0KiByOworICAgIEV3a19TY3JvbGxfUmVxdWVzdCogcl9lbmQ7CisgICAgRXZhc19Db29yZCB4
MiA9IHggKyB3LCB5MiA9IHkgKyBoOworCisgICAgciA9IHByaXYtPnNjcm9sbHMuYXJyYXk7Cisg
ICAgcl9lbmQgPSByICsgcHJpdi0+c2Nyb2xscy5jb3VudDsKKyAgICBmb3IgKDsgciA8IHJfZW5k
OyByKyspIHsKKyAgICAgICAgaWYgKHItPnggPT0geCAmJiByLT55ID09IHkgJiYgci0+dyA9PSB3
ICYmIHItPmggPT0gaCkgeworICAgICAgICAgICAgREJHKCJyZWdpb24gYWxyZWFkeSBzY3JvbGxl
ZCAlZCwlZCslZHglZCAlKzAzZCwlKzAzZCBhZGQgIgorICAgICAgICAgICAgICAgICIlKzAzZCwl
KzAzZCIsCisgICAgICAgICAgICAgICAgci0+eCwgci0+eSwgci0+dywgci0+aCwgci0+ZHgsIHIt
PmR5LCBkeCwgZHkpOworICAgICAgICAgICAgci0+ZHggKz0gZHg7CisgICAgICAgICAgICByLT5k
eSArPSBkeTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHgg
PD0gci0+eCAmJiB4MiA+PSByLT54MikgJiYgKHkgPD0gci0+eSAmJiB5MiA+PSByLT55MikpIHsK
KyAgICAgICAgICAgIERCRygib2xkIHZpZXdwb3J0ICglZCwlZCslZHglZCAlKzAzZCwlKzAzZCkg
d2FzIHNjcm9sbGVkIGl0c2VsZiwgIgorICAgICAgICAgICAgICAgICJhZGQgJSswM2QsJSswM2Qi
LAorICAgICAgICAgICAgICAgIHItPngsIHItPnksIHItPncsIHItPmgsIHItPmR4LCByLT5keSwg
ZHgsIGR5KTsKKyAgICAgICAgICAgIHItPnggKz0gZHg7CisgICAgICAgICAgICByLT55ICs9IGR5
OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByaXYtPnNjcm9sbHMuYWxsb2NhdGVkID09
IHByaXYtPnNjcm9sbHMuY291bnQpIHsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlm
ICghcHJpdi0+c2Nyb2xscy5hbGxvY2F0ZWQpCisgICAgICAgICAgICBzaXplID0gRVdLX1ZJRVdf
U0NST0xMU19TSVpFX0lOSVRJQUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNpemUgPSBw
cml2LT5zY3JvbGxzLmFsbG9jYXRlZCArIEVXS19WSUVXX1NDUk9MTFNfU0laRV9TVEVQOworICAg
ICAgICBpZiAoIV9ld2tfdmlld19zY3JvbGxzX3Jlc2l6ZShwcml2LCBzaXplKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICByID0gcHJpdi0+c2Nyb2xscy5hcnJheSArIHByaXYt
PnNjcm9sbHMuY291bnQ7CisgICAgcHJpdi0+c2Nyb2xscy5jb3VudCsrOworCisgICAgci0+eCA9
IHg7CisgICAgci0+eSA9IHk7CisgICAgci0+dyA9IHc7CisgICAgci0+aCA9IGg7CisgICAgci0+
eDIgPSB4MjsKKyAgICByLT55MiA9IHkyOworICAgIHItPmR4ID0gZHg7CisgICAgci0+ZHkgPSBk
eTsKKyAgICByLT5tYWluX3Njcm9sbCA9IG1haW5fc2Nyb2xsOworICAgIERCRygiYWRkIHNjcm9s
bCBpbiByZWdpb246ICVkLCVkKyVkeCVkICUrMDNkLCUrMDNkIiwgeCwgeSwgdywgaCwgZHgsIGR5
KTsKKworICAgIEVpbmFfUmVjdGFuZ2xlKiBwcjsKKyAgICBFaW5hX1JlY3RhbmdsZSogcHJfZW5k
OworICAgIHNpemVfdCBjb3VudDsKKyAgICBwciA9IHByaXYtPnJlcGFpbnRzLmFycmF5OworICAg
IGNvdW50ID0gcHJpdi0+cmVwYWludHMuY291bnQ7CisgICAgcHJfZW5kID0gcHIgKyBjb3VudDsK
KyAgICBmb3IgKDsgcHIgPCBwcl9lbmQ7IHByKyspIHsKKyAgICAgICAgcHItPnggKz0gZHg7Cisg
ICAgICAgIHByLT55ICs9IGR5OworICAgIH0KK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3Nj
cm9sbHNfZmx1c2goRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2KQoreworICAgIHByaXYtPnNj
cm9sbHMuY291bnQgPSAwOworICAgIGlmIChwcml2LT5zY3JvbGxzLmFsbG9jYXRlZCA8PSBFV0tf
VklFV19TQ1JPTExTX1NJWkVfTUFYX0ZSRUUpCisgICAgICAgIHJldHVybjsKKyAgICBfZXdrX3Zp
ZXdfc2Nyb2xsc19yZXNpemUocHJpdiwgRVdLX1ZJRVdfU0NST0xMU19TSVpFX01BWF9GUkVFKTsK
K30KKworLy8gRGVmYXVsdCBFdmVudCBIYW5kbGluZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9m
b2N1c19pbihFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBFV0tfVklFV19QUklWX0dF
VChzZCwgcHJpdik7CisgICAgV2ViQ29yZTo6Rm9jdXNDb250cm9sbGVyKiBmYyA9IHByaXYtPnBh
Z2UtPmZvY3VzQ29udHJvbGxlcigpOworICAgIERCRygibz0lcCwgZmM9JXAiLCBzZC0+c2VsZiwg
ZmMpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChmYywgRUlOQV9GQUxTRSk7CisK
KyAgICBmYy0+c2V0QWN0aXZlKHRydWUpOworICAgIGZjLT5zZXRGb2N1c2VkKHRydWUpOworICAg
IHJldHVybiBFSU5BX1RSVUU7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0
X2ZvY3VzX291dChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBFV0tfVklFV19QUklW
X0dFVChzZCwgcHJpdik7CisgICAgV2ViQ29yZTo6Rm9jdXNDb250cm9sbGVyKiBmYyA9IHByaXYt
PnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpOworICAgIERCRygibz0lcCwgZmM9JXAiLCBzZC0+c2Vs
ZiwgZmMpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChmYywgRUlOQV9GQUxTRSk7
CisKKyAgICBmYy0+c2V0QWN0aXZlKGZhbHNlKTsKKyAgICBmYy0+c2V0Rm9jdXNlZChmYWxzZSk7
CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdf
c21hcnRfbW91c2Vfd2hlZWwoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QsIGNvbnN0IEV2YXNfRXZl
bnRfTW91c2VfV2hlZWwqIGV2KQoreworICAgIHJldHVybiBld2tfZnJhbWVfZmVlZF9tb3VzZV93
aGVlbChzZC0+bWFpbl9mcmFtZSwgZXYpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmll
d19zbWFydF9tb3VzZV9kb3duKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25zdCBFdmFzX0V2
ZW50X01vdXNlX0Rvd24qIGV2KQoreworICAgIHJldHVybiBld2tfZnJhbWVfZmVlZF9tb3VzZV9k
b3duKHNkLT5tYWluX2ZyYW1lLCBldik7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3
X3NtYXJ0X21vdXNlX3VwKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25zdCBFdmFzX0V2ZW50
X01vdXNlX1VwKiBldikKK3sKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2ZlZWRfbW91c2VfdXAoc2Qt
Pm1haW5fZnJhbWUsIGV2KTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfc21hcnRf
bW91c2VfbW92ZShFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgY29uc3QgRXZhc19FdmVudF9Nb3Vz
ZV9Nb3ZlKiBldikKK3sKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2ZlZWRfbW91c2VfbW92ZShzZC0+
bWFpbl9mcmFtZSwgZXYpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9r
ZXlfZG93bihFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgY29uc3QgRXZhc19FdmVudF9LZXlfRG93
biogZXYpCit7CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfZm9jdXNl
ZF9nZXQoc2QtPnNlbGYpOworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgZnJhbWUgPSBzZC0+
bWFpbl9mcmFtZTsKKworICAgIHJldHVybiBld2tfZnJhbWVfZmVlZF9rZXlfZG93bihmcmFtZSwg
ZXYpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9rZXlfdXAoRXdrX1Zp
ZXdfU21hcnRfRGF0YSogc2QsIGNvbnN0IEV2YXNfRXZlbnRfS2V5X1VwKiBldikKK3sKKyAgICBF
dmFzX09iamVjdCogZnJhbWUgPSBld2tfdmlld19mcmFtZV9mb2N1c2VkX2dldChzZC0+c2VsZik7
CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICBmcmFtZSA9IHNkLT5tYWluX2ZyYW1lOworCisg
ICAgcmV0dXJuIGV3a19mcmFtZV9mZWVkX2tleV91cChmcmFtZSwgZXYpOworfQorCitzdGF0aWMg
dm9pZCBfZXdrX3ZpZXdfc21hcnRfYWRkX2NvbnNvbGVfbWVzc2FnZShFd2tfVmlld19TbWFydF9E
YXRhKiBzZCwgY29uc3QgY2hhciogbWVzc2FnZSwgdW5zaWduZWQgaW50IGxpbmVOdW1iZXIsIGNv
bnN0IGNoYXIqIHNvdXJjZUlEKQoreworICAgIElORigiY29uc29sZSBtZXNzYWdlOiAlcyBAJWQ6
ICVzXG4iLCBzb3VyY2VJRCwgbGluZU51bWJlciwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyB2b2lk
IF9ld2tfdmlld19zbWFydF9ydW5famF2YXNjcmlwdF9hbGVydChFd2tfVmlld19TbWFydF9EYXRh
KiBzZCwgRXZhc19PYmplY3QqIGZyYW1lLCBjb25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIElO
RigiamF2YXNjcmlwdCBhbGVydDogJXNcbiIsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgRWluYV9C
b29sIF9ld2tfdmlld19zbWFydF9ydW5famF2YXNjcmlwdF9jb25maXJtKEV3a19WaWV3X1NtYXJ0
X0RhdGEqIHNkLCBFdmFzX09iamVjdCogZnJhbWUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7Cisg
ICAgSU5GKCJqYXZhc2NyaXB0IGNvbmZpcm06ICVzIiwgbWVzc2FnZSk7CisgICAgSU5GKCJqYXZh
c2NyaXB0IGNvbmZpcm0gKEhBUkQgQ09ERUQpPyBZRVMiKTsKKyAgICByZXR1cm4gRUlOQV9UUlVF
OworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19zbWFydF9zaG91bGRfaW50ZXJydXB0
X2phdmFzY3JpcHQoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgSU5GKCJzaG91bGQg
aW50ZXJydXB0IGphdmFzY3JpcHQ/XG4iCisgICAgICAgICAgICAiXHQoSEFSRCBDT0RFRCkgTk8i
KTsKKyAgICByZXR1cm4gRUlOQV9GQUxTRTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3Zp
ZXdfc21hcnRfcnVuX2phdmFzY3JpcHRfcHJvbXB0KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBF
dmFzX09iamVjdCogZnJhbWUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGNvbnN0IGNoYXIqIGRlZmF1
bHRWYWx1ZSwgY2hhcioqIHZhbHVlKQoreworICAgICp2YWx1ZSA9IHN0cmR1cCgidGVzdCIpOwor
ICAgIEVpbmFfQm9vbCByZXQgPSBFSU5BX1RSVUU7CisgICAgSU5GKCJqYXZhc2NyaXB0IHByb21w
dDpcbiIKKyAgICAgICAgICAgICJcdCAgICAgIG1lc3NhZ2U6ICVzXG4iCisgICAgICAgICAgICAi
XHRkZWZhdWx0IHZhbHVlOiAlc1xuIgorICAgICAgICAgICAgIlx0Z2l2aW5nIGFuc3dlcjogJXNc
biIKKyAgICAgICAgICAgICJcdCAgICAgICBidXR0b246ICVzIiwgbWVzc2FnZSwgZGVmYXVsdFZh
bHVlLCAqdmFsdWUsIHJldD8ib2siOiJjYW5jZWwiKTsKKworICAgIHJldHVybiByZXQ7Cit9CisK
Ky8vIEV2ZW50IEhhbmRsaW5nIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLworc3RhdGljIHZvaWQgX2V3a192aWV3X29uX2ZvY3VzX2luKHZvaWQq
IGRhdGEsIEV2YXMqIGUsIEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAg
IEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1NtYXJ0X0RhdGEqKWRhdGE7Cisg
ICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaSk7CisgICAgRUlOQV9TQUZFVFlfT05f
MF9SRVRVUk4oc2QtPmFwaS0+Zm9jdXNfaW4pOworICAgIHNkLT5hcGktPmZvY3VzX2luKHNkKTsK
K30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X29uX2ZvY3VzX291dCh2b2lkKiBkYXRhLCBFdmFz
KiBlLCBFdmFzX09iamVjdCogbywgdm9pZCogZXZlbnRfaW5mbykKK3sKKyAgICBFd2tfVmlld19T
bWFydF9EYXRhKiBzZCA9IChFd2tfVmlld19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FG
RVRZX09OXzBfUkVUVVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNk
LT5hcGktPmZvY3VzX291dCk7CisgICAgc2QtPmFwaS0+Zm9jdXNfb3V0KHNkKTsKK30KKworc3Rh
dGljIHZvaWQgX2V3a192aWV3X29uX21vdXNlX3doZWVsKHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2
YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAgIEV2YXNfRXZlbnRfTW91c2Vf
V2hlZWwqIGV2ID0gKEV2YXNfRXZlbnRfTW91c2VfV2hlZWwqKWV2ZW50X2luZm87CisgICAgRXdr
X1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0YTsKKyAgICBF
SU5BX1NBRkVUWV9PTl8wX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JF
VFVSTihzZC0+YXBpLT5tb3VzZV93aGVlbCk7CisgICAgc2QtPmFwaS0+bW91c2Vfd2hlZWwoc2Qs
IGV2KTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X29uX21vdXNlX2Rvd24odm9pZCogZGF0
YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50X2luZm8pCit7CisgICAgRXZh
c19FdmVudF9Nb3VzZV9Eb3duKiBldiA9IChFdmFzX0V2ZW50X01vdXNlX0Rvd24qKWV2ZW50X2lu
Zm87CisgICAgRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSop
ZGF0YTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NB
RkVUWV9PTl8wX1JFVFVSTihzZC0+YXBpLT5tb3VzZV9kb3duKTsKKyAgICBzZC0+YXBpLT5tb3Vz
ZV9kb3duKHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19vbl9tb3VzZV91cCh2
b2lkKiBkYXRhLCBFdmFzKiBlLCBFdmFzX09iamVjdCogbywgdm9pZCogZXZlbnRfaW5mbykKK3sK
KyAgICBFdmFzX0V2ZW50X01vdXNlX1VwKiBldiA9IChFdmFzX0V2ZW50X01vdXNlX1VwKilldmVu
dF9pbmZvOworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1NtYXJ0X0Rh
dGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaSk7CisgICAgRUlO
QV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaS0+bW91c2VfdXApOworICAgIHNkLT5hcGktPm1v
dXNlX3VwKHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19vbl9tb3VzZV9tb3Zl
KHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQor
eworICAgIEV2YXNfRXZlbnRfTW91c2VfTW92ZSogZXYgPSAoRXZhc19FdmVudF9Nb3VzZV9Nb3Zl
KilldmVudF9pbmZvOworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1Nt
YXJ0X0RhdGEqKWRhdGE7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaSk7Cisg
ICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaS0+bW91c2VfbW92ZSk7CisgICAgc2Qt
PmFwaS0+bW91c2VfbW92ZShzZCwgZXYpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfb25f
a2V5X2Rvd24odm9pZCogZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50
X2luZm8pCit7CisgICAgRXZhc19FdmVudF9LZXlfRG93biogZXYgPSAoRXZhc19FdmVudF9LZXlf
RG93biopZXZlbnRfaW5mbzsKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBzZCA9IChFd2tfVmll
d19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNkLT5hcGkp
OworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNkLT5hcGktPmtleV9kb3duKTsKKyAgICBz
ZC0+YXBpLT5rZXlfZG93bihzZCwgZXYpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfb25f
a2V5X3VwKHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVudF9p
bmZvKQoreworICAgIEV2YXNfRXZlbnRfS2V5X1VwKiBldiA9IChFdmFzX0V2ZW50X0tleV9VcCop
ZXZlbnRfaW5mbzsKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBzZCA9IChFd2tfVmlld19TbWFy
dF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNkLT5hcGkpOworICAg
IEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNkLT5hcGktPmtleV91cCk7CisgICAgc2QtPmFwaS0+
a2V5X3VwKHNkLCBldik7Cit9CisKK3N0YXRpYyBXVEY6OlBhc3NSZWZQdHI8V2ViQ29yZTo6RnJh
bWU+IF9ld2tfdmlld19jb3JlX2ZyYW1lX25ldyhFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgRXdr
X1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBXZWJDb3JlOjpIVE1MRnJhbWVPd25lckVsZW1lbnQq
IG93bmVyKQoreworICAgIFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50RWZsKiBmbGMgPSBuZXcg
V2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRFZmwoc2QtPnNlbGYpOworICAgIGlmICghZmxjKSB7
CisgICAgICAgIENSSVRJQ0FMKCJDb3VsZCBub3QgY3JlYXRlIGZyYW1lIGxvYWRlciBjbGllbnQu
Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmbGMtPnNldEN1c3RvbVVzZXJBZ2Vu
dChXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KHByaXYtPnNldHRpbmdzLnVzZXJfYWdlbnQpKTsK
KworICAgIHJldHVybiBXZWJDb3JlOjpGcmFtZTo6Y3JlYXRlKHByaXYtPnBhZ2UsIG93bmVyLCBm
bGMpOworfQorCitzdGF0aWMgRXZhc19TbWFydF9DbGFzcyBfcGFyZW50X3NjID0gRVZBU19TTUFS
VF9DTEFTU19JTklUXzA7CisKK3N0YXRpYyBFd2tfVmlld19Qcml2YXRlX0RhdGEqIF9ld2tfdmll
d19wcml2X25ldyhFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBFd2tfVmlld19Qcml2
YXRlX0RhdGEqIHByaXYgPQorICAgICAgICAoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiljYWxsb2Mo
MSwgc2l6ZW9mKEV3a19WaWV3X1ByaXZhdGVfRGF0YSkpOworICAgIFdlYkNvcmU6OkF0b21pY1N0
cmluZyBzOworICAgIFdlYkNvcmU6OktVUkwgdXJsOworCisgICAgaWYgKCFwcml2KSB7CisgICAg
ICAgIENSSVRJQ0FMKCJjb3VsZCBub3QgYWxsb2NhdGUgRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhIik7
CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwcml2LT5wYWdlID0gbmV3IFdlYkNvcmU6
OlBhZ2UoCisgICAgICAgIHN0YXRpY19jYXN0PFdlYkNvcmU6OkNocm9tZUNsaWVudCo+KG5ldyBX
ZWJDb3JlOjpDaHJvbWVDbGllbnRFZmwoc2QtPnNlbGYpKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8
V2ViQ29yZTo6Q29udGV4dE1lbnVDbGllbnQqPihuZXcgV2ViQ29yZTo6Q29udGV4dE1lbnVDbGll
bnRFZmwoc2QtPnNlbGYpKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RWRpdG9yQ2xp
ZW50Kj4obmV3IFdlYkNvcmU6OkVkaXRvckNsaWVudEVmbChzZC0+c2VsZikpLAorICAgICAgICBz
dGF0aWNfY2FzdDxXZWJDb3JlOjpEcmFnQ2xpZW50Kj4obmV3IFdlYkNvcmU6OkRyYWdDbGllbnRF
ZmwpLAorICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpJbnNwZWN0b3JDbGllbnQqPihuZXcg
V2ViQ29yZTo6SW5zcGVjdG9yQ2xpZW50RWZsKSwKKyAgICAgICAgMCwKKyAgICAgICAgMCk7Cisg
ICAgaWYgKCFwcml2LT5wYWdlKSB7CisgICAgICAgIENSSVRJQ0FMKCJDb3VsZCBub3QgY3JlYXRl
IFdlYktpdCBQYWdlIik7CisgICAgICAgIGdvdG8gZXJyb3JfcGFnZTsKKyAgICB9CisKKyAgICBw
cml2LT5wYWdlX3NldHRpbmdzID0gcHJpdi0+cGFnZS0+c2V0dGluZ3MoKTsKKyAgICBpZiAoIXBy
aXYtPnBhZ2Vfc2V0dGluZ3MpIHsKKyAgICAgICAgQ1JJVElDQUwoIkNvdWxkIG5vdCBnZXQgcGFn
ZSBzZXR0aW5ncy4iKTsKKyAgICAgICAgZ290byBlcnJvcl9zZXR0aW5nczsKKyAgICB9CisKKyAg
ICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRMb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkodHJ1ZSk7
CisgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0RGVmYXVsdEZpeGVkRm9udFNpemUoMTIpOwor
ICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldERlZmF1bHRGb250U2l6ZSgxNik7CisgICAgcHJp
di0+cGFnZV9zZXR0aW5ncy0+c2V0U2VyaWZGb250RmFtaWx5KCJzZXJpZiIpOworICAgIHByaXYt
PnBhZ2Vfc2V0dGluZ3MtPnNldEZpeGVkRm9udEZhbWlseSgibW9ub3R5cGUiKTsKKyAgICBwcml2
LT5wYWdlX3NldHRpbmdzLT5zZXRTYW5zU2VyaWZGb250RmFtaWx5KCJzYW5zIik7CisgICAgcHJp
di0+cGFnZV9zZXR0aW5ncy0+c2V0U3RhbmRhcmRGb250RmFtaWx5KCJzYW5zIik7CisgICAgcHJp
di0+cGFnZV9zZXR0aW5ncy0+c2V0SmF2YVNjcmlwdEVuYWJsZWQodHJ1ZSk7CisgICAgcHJpdi0+
cGFnZV9zZXR0aW5ncy0+c2V0UGx1Z2luc0VuYWJsZWQodHJ1ZSk7CisKKyAgICB1cmwgPSBwcml2
LT5wYWdlX3NldHRpbmdzLT51c2VyU3R5bGVTaGVldExvY2F0aW9uKCk7CisgICAgcHJpdi0+c2V0
dGluZ3MudXNlcl9zdHlsZXNoZWV0ID0gZWluYV9zdHJpbmdzaGFyZV9hZGQodXJsLnByZXR0eVVS
TCgpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgcHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfZGVmYXVs
dCA9IGVpbmFfc3RyaW5nc2hhcmVfYWRkCisgICAgICAgIChwcml2LT5wYWdlX3NldHRpbmdzLT5k
ZWZhdWx0VGV4dEVuY29kaW5nTmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworICAgIHByaXYtPnNldHRp
bmdzLmVuY29kaW5nX2N1c3RvbSA9IDA7CisKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X21pbmlt
dW1fc2l6ZSA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpOworICAgIHBy
aXYtPnNldHRpbmdzLmZvbnRfbWluaW11bV9sb2dpY2FsX3NpemUgPSBwcml2LT5wYWdlX3NldHRp
bmdzLT5taW5pbXVtTG9naWNhbEZvbnRTaXplKCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9k
ZWZhdWx0X3NpemUgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKTsKKyAg
ICBwcml2LT5zZXR0aW5ncy5mb250X21vbm9zcGFjZV9zaXplID0gcHJpdi0+cGFnZV9zZXR0aW5n
cy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKTsKKworICAgIHMgPSBwcml2LT5wYWdlX3NldHRpbmdz
LT5zdGFuZGFyZEZvbnRGYW1pbHkoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X3N0YW5kYXJk
ID0gZWluYV9zdHJpbmdzaGFyZV9hZGQocy5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBz
ID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+Y3Vyc2l2ZUZvbnRGYW1pbHkoKTsKKyAgICBwcml2LT5z
ZXR0aW5ncy5mb250X2N1cnNpdmUgPSBlaW5hX3N0cmluZ3NoYXJlX2FkZChzLnN0cmluZygpLnV0
ZjgoKS5kYXRhKCkpOworICAgIHMgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5maXhlZEZvbnRGYW1p
bHkoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X21vbm9zcGFjZSA9IGVpbmFfc3RyaW5nc2hh
cmVfYWRkKHMuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgcyA9IHByaXYtPnBhZ2Vfc2V0
dGluZ3MtPmZhbnRhc3lGb250RmFtaWx5KCk7CisgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9mYW50
YXN5ID0gZWluYV9zdHJpbmdzaGFyZV9hZGQocy5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAg
ICBzID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2VyaWZGb250RmFtaWx5KCk7CisgICAgcHJpdi0+
c2V0dGluZ3MuZm9udF9zZXJpZiA9IGVpbmFfc3RyaW5nc2hhcmVfYWRkKHMuc3RyaW5nKCkudXRm
OCgpLmRhdGEoKSk7CisgICAgcyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNhbnNTZXJpZkZvbnRG
YW1pbHkoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X3NhbnNfc2VyaWYgPSBlaW5hX3N0cmlu
Z3NoYXJlX2FkZChzLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgcHJpdi0+c2V0dGlu
Z3MuYXV0b19sb2FkX2ltYWdlcyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmxvYWRzSW1hZ2VzQXV0
b21hdGljYWxseSgpOworICAgIHByaXYtPnNldHRpbmdzLmF1dG9fc2hyaW5rX2ltYWdlcyA9IHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPnNocmlua3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQoKTsKKyAgICBw
cml2LT5zZXR0aW5ncy5lbmFibGVfc2NyaXB0cyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmlzSmF2
YVNjcmlwdEVuYWJsZWQoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5lbmFibGVfcGx1Z2lucyA9IHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPmFyZVBsdWdpbnNFbmFibGVkKCk7CisgICAgcHJpdi0+c2V0dGlu
Z3Muc2NyaXB0c193aW5kb3dfb3BlbiA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmFsbG93U2NyaXB0
c1RvQ2xvc2VXaW5kb3dzKCk7CisgICAgcHJpdi0+c2V0dGluZ3MucmVzaXphYmxlX3RleHRhcmVh
cyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnRleHRBcmVhc0FyZVJlc2l6YWJsZSgpOworICAgIHBy
aXYtPnNldHRpbmdzLnByaXZhdGVfYnJvd3NpbmcgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5wcml2
YXRlQnJvd3NpbmdFbmFibGVkKCk7CisgICAgcHJpdi0+c2V0dGluZ3MuY2FyZXRfYnJvd3Npbmcg
PSBwcml2LT5wYWdlX3NldHRpbmdzLT5jYXJldEJyb3dzaW5nRW5hYmxlZCgpOworCisgICAgcHJp
di0+bWFpbl9mcmFtZSA9IF9ld2tfdmlld19jb3JlX2ZyYW1lX25ldyhzZCwgcHJpdiwgMCkuZ2V0
KCk7CisgICAgaWYgKCFwcml2LT5tYWluX2ZyYW1lKSB7CisgICAgICAgIENSSVRJQ0FMKCJDb3Vs
ZCBub3QgY3JlYXRlIG1haW4gZnJhbWUuIik7CisgICAgICAgIGdvdG8gZXJyb3JfbWFpbl9mcmFt
ZTsKKyAgICB9CisKKyAgICBwcml2LT5oaXN0b3J5ID0gZXdrX2hpc3RvcnlfbmV3KHByaXYtPnBh
Z2UtPmJhY2tGb3J3YXJkTGlzdCgpKTsKKyAgICBpZiAoIXByaXYtPmhpc3RvcnkpIHsKKyAgICAg
ICAgQ1JJVElDQUwoIkNvdWxkIG5vdCBjcmVhdGUgaGlzdG9yeSBpbnN0YW5jZSBmb3Igdmlldy4i
KTsKKyAgICAgICAgZ290byBlcnJvcl9oaXN0b3J5OworICAgIH0KKworICAgIHJldHVybiBwcml2
OworCitlcnJvcl9oaXN0b3J5OgorICAgIC8vIGRlbGV0ZSBwcml2LT5tYWluX2ZyYW1lOyAvKiBk
byBub3QgZGVsZXRlIHByaXYtPm1haW5fZnJhbWUgKi8KK2Vycm9yX21haW5fZnJhbWU6CitlcnJv
cl9zZXR0aW5nczoKKyAgICBkZWxldGUgcHJpdi0+cGFnZTsKK2Vycm9yX3BhZ2U6CisgICAgZnJl
ZShwcml2KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3ByaXZf
ZGVsKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdikKK3sKKyAgICBpZiAoIXByaXYpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8qIGRvIG5vdCBkZWxldGUgcHJpdi0+bWFpbl9mcmFtZSAqLwor
CisgICAgZnJlZShwcml2LT5yZXBhaW50cy5hcnJheSk7CisgICAgZnJlZShwcml2LT5zY3JvbGxz
LmFycmF5KTsKKworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLnVzZXJf
YWdlbnQpOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLnVzZXJfc3R5
bGVzaGVldCk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZW5jb2Rp
bmdfZGVmYXVsdCk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZW5j
b2RpbmdfY3VzdG9tKTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5m
b250X3N0YW5kYXJkKTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5m
b250X2N1cnNpdmUpOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZv
bnRfbW9ub3NwYWNlKTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5m
b250X2ZhbnRhc3kpOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZv
bnRfc2VyaWYpOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZvbnRf
c2Fuc19zZXJpZik7CisKKyAgICBpZiAocHJpdi0+YW5pbWF0ZWRfem9vbS5hbmltYXRvcikKKyAg
ICAgICAgZWNvcmVfYW5pbWF0b3JfZGVsKHByaXYtPmFuaW1hdGVkX3pvb20uYW5pbWF0b3IpOwor
CisgICAgZXdrX2hpc3RvcnlfZnJlZShwcml2LT5oaXN0b3J5KTsKKworICAgIGRlbGV0ZSBwcml2
LT5wYWdlOworICAgIGZyZWUocHJpdik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFy
dF9hZGQoRXZhc19PYmplY3QqIG8pCit7CisgICAgY29uc3QgRXZhc19TbWFydCogc21hcnQgPSBl
dmFzX29iamVjdF9zbWFydF9zbWFydF9nZXQobyk7CisgICAgY29uc3QgRXZhc19TbWFydF9DbGFz
cyogc2MgPSBldmFzX3NtYXJ0X2NsYXNzX2dldChzbWFydCk7CisgICAgY29uc3QgRXdrX1ZpZXdf
U21hcnRfQ2xhc3MqIGFwaSA9IChjb25zdCBFd2tfVmlld19TbWFydF9DbGFzcyopc2M7CisgICAg
RUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oYXBpLT5iYWNraW5nX3N0b3JlX2FkZCk7CisgICAgRVdL
X1ZJRVdfU0RfR0VUKG8sIHNkKTsKKworICAgIGlmICghc2QpIHsKKyAgICAgICAgc2QgPSAoRXdr
X1ZpZXdfU21hcnRfRGF0YSopY2FsbG9jKDEsIHNpemVvZihFd2tfVmlld19TbWFydF9EYXRhKSk7
CisgICAgICAgIGlmICghc2QpCisgICAgICAgICAgICBDUklUSUNBTCgiY291bGQgbm90IGFsbG9j
YXRlIEV3a19WaWV3X1NtYXJ0X0RhdGEiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZh
c19vYmplY3Rfc21hcnRfZGF0YV9zZXQobywgc2QpOworICAgIH0KKworICAgIHNkLT5iZ19jb2xv
ci5yID0gMjU1OworICAgIHNkLT5iZ19jb2xvci5nID0gMjU1OworICAgIHNkLT5iZ19jb2xvci5i
ID0gMjU1OworICAgIHNkLT5iZ19jb2xvci5hID0gMjU1OworCisgICAgc2QtPnNlbGYgPSBvOwor
ICAgIHNkLT5fcHJpdiA9IF9ld2tfdmlld19wcml2X25ldyhzZCk7CisgICAgc2QtPmFwaSA9IGFw
aTsKKworICAgIF9wYXJlbnRfc2MuYWRkKG8pOworCisgICAgaWYgKCFzZC0+X3ByaXYpCisgICAg
ICAgIHJldHVybjsKKworICAgIEVXS19WSUVXX1BSSVZfR0VUKHNkLCBwcml2KTsKKworICAgIHNk
LT5iYWNraW5nX3N0b3JlID0gYXBpLT5iYWNraW5nX3N0b3JlX2FkZChzZCk7CisgICAgaWYgKCFz
ZC0+YmFja2luZ19zdG9yZSkgeworICAgICAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgYmFja2lu
ZyBzdG9yZSBvYmplY3QuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBldmFzX29i
amVjdF9zbWFydF9tZW1iZXJfYWRkKHNkLT5iYWNraW5nX3N0b3JlLCBvKTsKKyAgICBldmFzX29i
amVjdF9zaG93KHNkLT5iYWNraW5nX3N0b3JlKTsKKworICAgIHNkLT5tYWluX2ZyYW1lID0gZXdr
X2ZyYW1lX2FkZChzZC0+YmFzZS5ldmFzKTsKKyAgICBpZiAoIXNkLT5tYWluX2ZyYW1lKSB7Cisg
ICAgICAgIEVSUigiQ291bGQgbm90IGNyZWF0ZSBtYWluIGZyYW1lIG9iamVjdC4iKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghZXdrX2ZyYW1lX2luaXQoc2QtPm1haW5fZnJh
bWUsIG8sIHByaXYtPm1haW5fZnJhbWUpKSB7CisgICAgICAgIEVSUigiQ291bGQgbm90IGluaXRp
YWxpemUgbWFpbiBmcm1lIG9iamVjdC4iKTsKKyAgICAgICAgZXZhc19vYmplY3RfZGVsKHNkLT5t
YWluX2ZyYW1lKTsKKyAgICAgICAgc2QtPm1haW5fZnJhbWUgPSAwOworCisgICAgICAgIGRlbGV0
ZSBwcml2LT5tYWluX2ZyYW1lOworICAgICAgICBwcml2LT5tYWluX2ZyYW1lID0gMDsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGV2YXNfb2JqZWN0X25hbWVfc2V0KHNkLT5tYWluX2Zy
YW1lLCAiRVdLX0ZyYW1lOm1haW4iKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9tZW1iZXJfYWRk
KHNkLT5tYWluX2ZyYW1lLCBvKTsKKyAgICBldmFzX29iamVjdF9zaG93KHNkLT5tYWluX2ZyYW1l
KTsKKworI2RlZmluZSBDT05ORUNUKHMsIGMpIGV2YXNfb2JqZWN0X2V2ZW50X2NhbGxiYWNrX2Fk
ZChvLCBzLCBjLCBzZCkKKyAgICBDT05ORUNUKEVWQVNfQ0FMTEJBQ0tfRk9DVVNfSU4sIF9ld2tf
dmlld19vbl9mb2N1c19pbik7CisgICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX0ZPQ1VTX09VVCwg
X2V3a192aWV3X29uX2ZvY3VzX291dCk7CisgICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX01PVVNF
X1dIRUVMLCBfZXdrX3ZpZXdfb25fbW91c2Vfd2hlZWwpOworICAgIENPTk5FQ1QoRVZBU19DQUxM
QkFDS19NT1VTRV9ET1dOLCBfZXdrX3ZpZXdfb25fbW91c2VfZG93bik7CisgICAgQ09OTkVDVChF
VkFTX0NBTExCQUNLX01PVVNFX1VQLCBfZXdrX3ZpZXdfb25fbW91c2VfdXApOworICAgIENPTk5F
Q1QoRVZBU19DQUxMQkFDS19NT1VTRV9NT1ZFLCBfZXdrX3ZpZXdfb25fbW91c2VfbW92ZSk7Cisg
ICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX0tFWV9ET1dOLCBfZXdrX3ZpZXdfb25fa2V5X2Rvd24p
OworICAgIENPTk5FQ1QoRVZBU19DQUxMQkFDS19LRVlfVVAsIF9ld2tfdmlld19vbl9rZXlfdXAp
OworI3VuZGVmIENPTk5FQ1QKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2RlbChF
dmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVQobywgc2QpOworICAgIEV3a19W
aWV3X1ByaXZhdGVfRGF0YSogcHJpdiA9IHNkID8gc2QtPl9wcml2IDogMDsKKworICAgIF9wYXJl
bnRfc2MuZGVsKG8pOworICAgIF9ld2tfdmlld19wcml2X2RlbChwcml2KTsKK30KKworc3RhdGlj
IHZvaWQgX2V3a192aWV3X3NtYXJ0X3Jlc2l6ZShFdmFzX09iamVjdCogbywgRXZhc19Db29yZCB3
LCBFdmFzX0Nvb3JkIGgpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUKG8sIHNkKTsKKworICAgIC8v
IHRoZXNlIHNob3VsZCBiZSBxdWV1ZWQgYW5kIHByb2Nlc3NlZCBpbiBjYWxjdWxhdGUgYXMgd2Vs
bCEKKyAgICBldmFzX29iamVjdF9yZXNpemUoc2QtPmJhY2tpbmdfc3RvcmUsIHcsIGgpOworCisg
ICAgc2QtPmNoYW5nZWQuc2l6ZSA9IEVJTkFfVFJVRTsKKyAgICBfZXdrX3ZpZXdfc21hcnRfY2hh
bmdlZChzZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9tb3ZlKEV2YXNfT2Jq
ZWN0KiBvLCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSkKK3sKKyAgICBFV0tfVklFV19TRF9H
RVQobywgc2QpOworICAgIHNkLT5jaGFuZ2VkLnBvc2l0aW9uID0gRUlOQV9UUlVFOworICAgIF9l
d2tfdmlld19zbWFydF9jaGFuZ2VkKHNkKTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3Nt
YXJ0X2NhbGN1bGF0ZShFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVQobywg
c2QpOworICAgIEVXS19WSUVXX1BSSVZfR0VUKHNkLCBwcml2KTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl8wX1JFVFVSTihzZC0+YXBpLT5jb250ZW50c19yZXNpemUpOworICAgIEVJTkFfU0FGRVRZX09O
XzBfUkVUVVJOKHNkLT5hcGktPnNjcm9sbHNfcHJvY2Vzcyk7CisgICAgRUlOQV9TQUZFVFlfT05f
MF9SRVRVUk4oc2QtPmFwaS0+cmVwYWludHNfcHJvY2Vzcyk7CisgICAgRXZhc19Db29yZCB4LCB5
LCB3LCBoOworCisgICAgc2QtPmNoYW5nZWQuYW55ID0gRUlOQV9GQUxTRTsKKworICAgIGlmICgh
c2QtPm1haW5fZnJhbWUgfHwgIXByaXYtPm1haW5fZnJhbWUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGV2YXNfb2JqZWN0X2dlb21ldHJ5X2dldChvLCAmeCwgJnksICZ3LCAmaCk7CisKKyAgICBE
QkcoIm89JXAgZ2VvPVslZCwgJWQgKyAlZHglZF0sIGNoYW5nZWQ6IHNpemU9JWhodSwgIgorICAg
ICAgICAic2Nyb2xscz0lenUsIHJlcGFpbnRzPSV6dSIsCisgICAgICAgIG8sIHgsIHksIHcsIGgs
IHNkLT5jaGFuZ2VkLnNpemUsCisgICAgICAgIHByaXYtPnNjcm9sbHMuY291bnQsIHByaXYtPnJl
cGFpbnRzLmNvdW50KTsKKworICAgIGlmIChzZC0+Y2hhbmdlZC5zaXplICYmICgodyAhPSBzZC0+
dmlldy53KSB8fCAoaCAhPSBzZC0+dmlldy5oKSkpIHsKKyAgICAgICAgV2ViQ29yZTo6RnJhbWVW
aWV3KiB2aWV3ID0gcHJpdi0+bWFpbl9mcmFtZS0+dmlldygpOworICAgICAgICBpZiAodmlldykg
eworICAgICAgICAgICAgdmlldy0+cmVzaXplKHcsIGgpOworICAgICAgICAgICAgdmlldy0+Zm9y
Y2VMYXlvdXQoKTsKKyAgICAgICAgICAgIHZpZXctPmFkanVzdFZpZXdTaXplKCk7CisgICAgICAg
ICAgICBJbnRTaXplIHNpemUgPSB2aWV3LT5jb250ZW50c1NpemUoKTsKKyAgICAgICAgICAgIGlm
ICghc2QtPmFwaS0+Y29udGVudHNfcmVzaXplKHNkLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0
KCkpKQorICAgICAgICAgICAgICAgIEVSUigiZmFpbGVkIHRvIHJlc2l6ZSBjb250ZW50cyB0byAl
ZHglZCIsCisgICAgICAgICAgICAgICAgICAgIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSk7
CisgICAgICAgIH0KKyAgICAgICAgZXZhc19vYmplY3RfcmVzaXplKHNkLT5tYWluX2ZyYW1lLCB3
LCBoKTsKKyAgICAgICAgc2QtPmNoYW5nZWQuZnJhbWVfcmVjdCA9IEVJTkFfVFJVRTsKKyAgICAg
ICAgc2QtPnZpZXcudyA9IHc7CisgICAgICAgIHNkLT52aWV3LmggPSBoOworICAgIH0KKyAgICBz
ZC0+Y2hhbmdlZC5zaXplID0gRUlOQV9GQUxTRTsKKworICAgIGlmIChzZC0+Y2hhbmdlZC5wb3Np
dGlvbiAmJiAoKHggIT0gc2QtPnZpZXcueCkgfHwgKHkgIT0gc2QtPnZpZXcueSkpKSB7CisgICAg
ICAgIGV2YXNfb2JqZWN0X21vdmUoc2QtPm1haW5fZnJhbWUsIHgsIHkpOworICAgICAgICBldmFz
X29iamVjdF9tb3ZlKHNkLT5iYWNraW5nX3N0b3JlLCB4LCB5KTsKKyAgICAgICAgc2QtPmNoYW5n
ZWQuZnJhbWVfcmVjdCA9IEVJTkFfVFJVRTsKKyAgICAgICAgc2QtPnZpZXcueCA9IHg7CisgICAg
ICAgIHNkLT52aWV3LnkgPSB5OworICAgIH0KKyAgICBzZC0+Y2hhbmdlZC5wb3NpdGlvbiA9IEVJ
TkFfRkFMU0U7CisKKyAgICBld2tfdmlld19sYXlvdXRfaWZfbmVlZGVkX3JlY3Vyc2l2ZShzZC0+
X3ByaXYpOworCisgICAgaWYgKCFzZC0+YXBpLT5zY3JvbGxzX3Byb2Nlc3Moc2QpKQorICAgICAg
ICBFUlIoImZhaWxlZCB0byBwcm9jZXNzIHNjcm9sbHMuIik7CisgICAgX2V3a192aWV3X3Njcm9s
bHNfZmx1c2gocHJpdik7CisKKyAgICBpZiAoIXNkLT5hcGktPnJlcGFpbnRzX3Byb2Nlc3Moc2Qp
KQorICAgICAgICBFUlIoImZhaWxlZCB0byBwcm9jZXNzIHJlcGFpbnRzLiIpOworICAgIF9ld2tf
dmlld19yZXBhaW50c19mbHVzaChwcml2KTsKKworICAgIGlmIChzZC0+Y2hhbmdlZC5mcmFtZV9y
ZWN0KSB7CisgICAgICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IHByaXYtPm1haW5fZnJh
bWUtPnZpZXcoKTsKKyAgICAgICAgdmlldy0+ZnJhbWVSZWN0c0NoYW5nZWQoKTsgLyogZm9yY2Ug
dHJlZSB0byBnZXQgcG9zaXRpb24gZnJvbSByb290ICovCisgICAgICAgIHNkLT5jaGFuZ2VkLmZy
YW1lX3JlY3QgPSBFSU5BX0ZBTFNFOworICAgIH0KK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdr
X3ZpZXdfc21hcnRfY29udGVudHNfcmVzaXplKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBpbnQg
dywgaW50IGgpCit7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIEVpbmFfQm9v
bCBfZXdrX3ZpZXdfc21hcnRfem9vbV9zZXQoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QsIGZsb2F0
IHpvb20sIEV2YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpCit7CisgICAgZG91YmxlIHB4LCBw
eTsKKyAgICBFdmFzX0Nvb3JkIHgsIHksIHcsIGg7CisgICAgRWluYV9Cb29sIHJldDsKKworICAg
IGV3a19mcmFtZV9zY3JvbGxfc2l6ZV9nZXQoc2QtPm1haW5fZnJhbWUsICZ3LCAmaCk7CisgICAg
ZXdrX2ZyYW1lX3Njcm9sbF9wb3NfZ2V0KHNkLT5tYWluX2ZyYW1lLCAmeCwgJnkpOworCisgICAg
aWYgKHcgKyBzZC0+dmlldy53ID4gMCkKKyAgICAgICAgcHggPSAoZG91YmxlKSh4ICsgY3gpIC8g
KHcgKyBzZC0+dmlldy53KTsKKyAgICBlbHNlCisgICAgICAgIHB4ID0gMC4wOworCisgICAgaWYg
KGggKyBzZC0+dmlldy5oID4gMCkKKyAgICAgICAgcHkgPSAoZG91YmxlKSh5ICsgY3kpIC8gKGgg
KyBzZC0+dmlldy5oKTsKKyAgICBlbHNlCisgICAgICAgIHB5ID0gMC4wOworCisgICAgcmV0ID0g
ZXdrX2ZyYW1lX3pvb21fc2V0KHNkLT5tYWluX2ZyYW1lLCB6b29tKTsKKworICAgIGV3a19mcmFt
ZV9zY3JvbGxfc2l6ZV9nZXQoc2QtPm1haW5fZnJhbWUsICZ3LCAmaCk7CisgICAgeCA9ICh3ICsg
c2QtPnZpZXcudykgKiBweCAtIGN4OworICAgIHkgPSAoaCArIHNkLT52aWV3LmgpICogcHkgLSBj
eTsKKyAgICBld2tfZnJhbWVfc2Nyb2xsX3NldChzZC0+bWFpbl9mcmFtZSwgeCwgeSk7CisgICAg
cmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2ZsdXNoKEV3a19W
aWV3X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihz
ZCwgcHJpdik7CisgICAgX2V3a192aWV3X3JlcGFpbnRzX2ZsdXNoKHByaXYpOworICAgIF9ld2tf
dmlld19zY3JvbGxzX2ZsdXNoKHByaXYpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmll
d19zbWFydF9wcmVfcmVuZGVyX3JlZ2lvbihFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgRXZhc19D
b29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoLCBmbG9hdCB6
b29tKQoreworICAgIFdSTigibm90IHN1cHBvcnRlZCBieSBlbmdpbmUuIHNkPSVwIGFyZWE9JWQs
JWQrJWR4JWQsIHpvb209JWYiLAorICAgICAgICBzZCwgeCwgeSwgdywgaCwgem9vbSk7CisgICAg
cmV0dXJuIEVJTkFfRkFMU0U7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9wcmVf
cmVuZGVyX2NhbmNlbChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBXUk4oIm5vdCBz
dXBwb3J0ZWQgYnkgZW5naW5lLiBzZD0lcCIsIHNkKTsKK30KKworc3RhdGljIHZvaWQgX2V3a192
aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQorewor
ICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uc3RhcnQgPSAwLjA7CisgICAgc2QtPmFuaW1hdGVk
X3pvb20uem9vbS5lbmQgPSAwLjA7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50
ID0gMC4wOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9maW5pc2go
RXdrX1ZpZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVQoc2QsIHBy
aXYpOworICAgIGVjb3JlX2FuaW1hdG9yX2RlbChwcml2LT5hbmltYXRlZF96b29tLmFuaW1hdG9y
KTsKKyAgICBwcml2LT5hbmltYXRlZF96b29tLmFuaW1hdG9yID0gMDsKKyAgICBfZXdrX3ZpZXdf
em9vbV9hbmltYXRlZF9tYXJrX3N0b3Aoc2QpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxi
YWNrX2NhbGwoc2QtPnNlbGYsICJ6b29tLGFuaW1hdGVkLGVuZCIsIDApOworfQorCitzdGF0aWMg
ZmxvYXQgX2V3a192aWV3X3pvb21fYW5pbWF0ZWRfY3VycmVudChFd2tfVmlld19Qcml2YXRlX0Rh
dGEqIHByaXYpCit7CisgICAgZG91YmxlIG5vdyA9IGVjb3JlX2xvb3BfdGltZV9nZXQoKTsKKyAg
ICBkb3VibGUgZGVsdGEgPSBub3cgLSBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuc3RhcnQ7CisK
KyAgICBpZiAoZGVsdGEgPiBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuZHVyYXRpb24pCisgICAg
ICAgIGRlbHRhID0gcHJpdi0+YW5pbWF0ZWRfem9vbS50aW1lLmR1cmF0aW9uOworICAgIGlmIChk
ZWx0YSA8IDAuMCkgLy8gdGltZSB3ZW50IGJhY2ssIGNsb2NrIGFkanVzdGVkPworICAgICAgICBk
ZWx0YSA9IDAuMDsKKworICAgIGRlbHRhIC89IHByaXYtPmFuaW1hdGVkX3pvb20udGltZS5kdXJh
dGlvbjsKKworICAgIHJldHVybiAoKHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5yYW5nZSAqIGRl
bHRhKQorICAgICAgICAgICAgKyBwcml2LT5hbmltYXRlZF96b29tLnpvb20uc3RhcnQpOworfQor
CitzdGF0aWMgaW50IF9ld2tfdmlld196b29tX2FuaW1hdG9yX2NiKHZvaWQqIGRhdGEpCit7Cisg
ICAgRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0YTsK
KyAgICBFdmFzX0Nvb3JkIGN4LCBjeTsKKyAgICBFV0tfVklFV19QUklWX0dFVChzZCwgcHJpdik7
CisgICAgZG91YmxlIG5vdyA9IGVjb3JlX2xvb3BfdGltZV9nZXQoKTsKKworICAgIGN4ID0gcHJp
di0+YW5pbWF0ZWRfem9vbS5jZW50ZXIueDsKKyAgICBjeSA9IHByaXYtPmFuaW1hdGVkX3pvb20u
Y2VudGVyLnk7CisKKyAgICAvLyBUT0RPOiBwcm9ncmVzc2l2ZWx5IGNlbnRlciAoY3gsIGN5KSAt
PiAodmlldy54ICsgdmlldy5oLzIsIHZpZXcueSArIHZpZXcuaC8yKQorICAgIGlmIChjeCA+PSBz
ZC0+dmlldy53KQorICAgICAgICBjeCA9IHNkLT52aWV3LncgLSAxOworICAgIGlmIChjeSA+PSBz
ZC0+dmlldy5oKQorICAgICAgICBjeSA9IHNkLT52aWV3LmggLSAxOworCisgICAgaWYgKChub3cg
Pj0gcHJpdi0+YW5pbWF0ZWRfem9vbS50aW1lLmVuZCkKKyAgICAgICAgfHwgKG5vdyA8IHByaXYt
PmFuaW1hdGVkX3pvb20udGltZS5zdGFydCkpIHsKKyAgICAgICAgX2V3a192aWV3X3pvb21fYW5p
bWF0ZWRfZmluaXNoKHNkKTsKKyAgICAgICAgZXdrX3ZpZXdfem9vbV9zZXQoc2QtPnNlbGYsIHBy
aXYtPmFuaW1hdGVkX3pvb20uem9vbS5lbmQsIGN4LCBjeSk7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KKworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uY3VycmVudCA9IF9ld2tfdmlld196
b29tX2FuaW1hdGVkX2N1cnJlbnQocHJpdik7CisgICAgc2QtPmFwaS0+em9vbV93ZWFrX3NldChz
ZCwgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50LCBjeCwgY3kpOworICAgIHJldHVybiAx
OworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfem9vbV9hbmltYXRpb25fc3RhcnQoRXdrX1Zp
ZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2KTsKKyAgICBpZiAocHJpdi0+YW5pbWF0ZWRfem9vbS5hbmltYXRvcikKKyAgICAgICAg
cmV0dXJuOworICAgIHByaXYtPmFuaW1hdGVkX3pvb20uYW5pbWF0b3IgPSBlY29yZV9hbmltYXRv
cl9hZGQKKyAgICAgICAgKF9ld2tfdmlld196b29tX2FuaW1hdG9yX2NiLCBzZCk7Cit9CisKKy8q
KgorICogU2V0cyB0aGUgc21hcnQgY2xhc3MgYXBpIHdpdGhvdXQgYW55IGJhY2tpbmcgc3RvcmUs
IGVuYWJsaW5nIHZpZXcKKyAqIHRvIGJlIGluaGVyaXRlZC4KKyAqCisgKiBAcGFyYW0gYXBpIGNs
YXNzIGRlZmluaXRpb24gdG8gYmUgc2V0LCBhbGwgbWVtYmVycyB3aXRoIHRoZQorICogICAgICAg
IGV4Y2VwdGlvbiBvZiBFdmFzX1NtYXJ0X0NsYXNzLT5kYXRhIG1heSBiZSBvdmVycmlkZGVuLiBN
dXN0CisgKiAgICAgICAgQGIgbm90IGJlIEBjIDAuCisgKgorICogQG5vdGUgRXZhc19TbWFydF9D
bGFzcy0+ZGF0YSBpcyB1c2VkIHRvIGltcGxlbWVudCB0eXBlIGNoZWNraW5nIGFuZAorICogICAg
ICAgaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNoYW5nZWQvb3ZlcnJpZGRlbi4gSWYgeW91IG5lZWQg
ZXh0cmEKKyAqICAgICAgIGRhdGEgZm9yIHlvdXIgc21hcnQgY2xhc3MgdG8gd29yaywganVzdCBl
eHRlbmQKKyAqICAgICAgIEV3a19WaWV3X1NtYXJ0X0NsYXNzIGluc3RlYWQuCisgKgorICogQHJl
dHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvbiBmYWlsdXJlIChw
cm9iYWJseQorICogICAgICAgICB2ZXJzaW9uIG1pc21hdGNoKS4KKyAqCisgKiBAc2VlIGV3a192
aWV3X3NpbmdsZV9zbWFydF9zZXQoKQorICogQHNlZSBld2tfdmlld190aWxlZF9zbWFydF9zZXQo
KQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfYmFzZV9zbWFydF9zZXQoRXdrX1ZpZXdfU21hcnRf
Q2xhc3MqIGFwaSkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwoYXBpLCBFSU5B
X0ZBTFNFKTsKKworICAgIGlmIChhcGktPnZlcnNpb24gIT0gRVdLX1ZJRVdfU01BUlRfQ0xBU1Nf
VkVSU0lPTikgeworICAgICAgICBFSU5BX0xPR19DUklUCisgICAgICAgICAgICAoIkV3a19WaWV3
X1NtYXJ0X0NsYXNzICVwIGlzIHZlcnNpb24gJWx1IHdoaWxlICVsdSB3YXMgZXhwZWN0ZWQuIiwK
KyAgICAgICAgICAgICBhcGksIGFwaS0+dmVyc2lvbiwgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfVkVS
U0lPTik7CisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0KKworICAgIGlmIChFSU5B
X1VOTElLRUxZKCFfcGFyZW50X3NjLmFkZCkpCisgICAgICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2Ns
aXBwZWRfc21hcnRfc2V0KCZfcGFyZW50X3NjKTsKKworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2Ns
aXBwZWRfc21hcnRfc2V0KCZhcGktPnNjKTsKKyAgICBhcGktPnNjLmFkZCA9IF9ld2tfdmlld19z
bWFydF9hZGQ7CisgICAgYXBpLT5zYy5kZWwgPSBfZXdrX3ZpZXdfc21hcnRfZGVsOworICAgIGFw
aS0+c2MucmVzaXplID0gX2V3a192aWV3X3NtYXJ0X3Jlc2l6ZTsKKyAgICBhcGktPnNjLm1vdmUg
PSBfZXdrX3ZpZXdfc21hcnRfbW92ZTsKKyAgICBhcGktPnNjLmNhbGN1bGF0ZSA9IF9ld2tfdmll
d19zbWFydF9jYWxjdWxhdGU7CisgICAgYXBpLT5zYy5kYXRhID0gRVdLX1ZJRVdfVFlQRV9TVFI7
IC8qIHVzZWQgYnkgdHlwZSBjaGVja2luZyAqLworCisgICAgYXBpLT5jb250ZW50c19yZXNpemUg
PSBfZXdrX3ZpZXdfc21hcnRfY29udGVudHNfcmVzaXplOworICAgIGFwaS0+em9vbV9zZXQgPSBf
ZXdrX3ZpZXdfc21hcnRfem9vbV9zZXQ7CisgICAgYXBpLT5mbHVzaCA9IF9ld2tfdmlld19zbWFy
dF9mbHVzaDsKKyAgICBhcGktPnByZV9yZW5kZXJfcmVnaW9uID0gX2V3a192aWV3X3NtYXJ0X3By
ZV9yZW5kZXJfcmVnaW9uOworICAgIGFwaS0+cHJlX3JlbmRlcl9jYW5jZWwgPSBfZXdrX3ZpZXdf
c21hcnRfcHJlX3JlbmRlcl9jYW5jZWw7CisKKyAgICBhcGktPmZvY3VzX2luID0gX2V3a192aWV3
X3NtYXJ0X2ZvY3VzX2luOworICAgIGFwaS0+Zm9jdXNfb3V0ID0gX2V3a192aWV3X3NtYXJ0X2Zv
Y3VzX291dDsKKyAgICBhcGktPm1vdXNlX3doZWVsID0gX2V3a192aWV3X3NtYXJ0X21vdXNlX3do
ZWVsOworICAgIGFwaS0+bW91c2VfZG93biA9IF9ld2tfdmlld19zbWFydF9tb3VzZV9kb3duOwor
ICAgIGFwaS0+bW91c2VfdXAgPSBfZXdrX3ZpZXdfc21hcnRfbW91c2VfdXA7CisgICAgYXBpLT5t
b3VzZV9tb3ZlID0gX2V3a192aWV3X3NtYXJ0X21vdXNlX21vdmU7CisgICAgYXBpLT5rZXlfZG93
biA9IF9ld2tfdmlld19zbWFydF9rZXlfZG93bjsKKyAgICBhcGktPmtleV91cCA9IF9ld2tfdmll
d19zbWFydF9rZXlfdXA7CisKKyAgICBhcGktPmFkZF9jb25zb2xlX21lc3NhZ2UgPSBfZXdrX3Zp
ZXdfc21hcnRfYWRkX2NvbnNvbGVfbWVzc2FnZTsKKyAgICBhcGktPnJ1bl9qYXZhc2NyaXB0X2Fs
ZXJ0ID0gX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZhc2NyaXB0X2FsZXJ0OworICAgIGFwaS0+cnVu
X2phdmFzY3JpcHRfY29uZmlybSA9IF9ld2tfdmlld19zbWFydF9ydW5famF2YXNjcmlwdF9jb25m
aXJtOworICAgIGFwaS0+cnVuX2phdmFzY3JpcHRfcHJvbXB0ID0gX2V3a192aWV3X3NtYXJ0X3J1
bl9qYXZhc2NyaXB0X3Byb21wdDsKKyAgICBhcGktPnNob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlw
dCA9IF9ld2tfdmlld19zbWFydF9zaG91bGRfaW50ZXJydXB0X2phdmFzY3JpcHQ7CisKKyAgICBy
ZXR1cm4gRUlOQV9UUlVFOworfQorCisvKioKKyAqIFNldCBhIGZpeGVkIGxheW91dCBzaXplIHRv
IGJlIHVzZWQsIGRpc3NvY2lhdGluZyBpdCBmcm9tIHZpZXdwb3J0IHNpemUuCisgKgorICogU2V0
dGluZyBhIHdpZHRoIGRpZmZlcmVudCB0aGFuIHplcm8gZW5hYmxlcyBmaXhlZCBsYXlvdXQgb24g
dGhhdAorICogc2l6ZS4gSXQncyBhdXRvbWF0aWNhbGx5IHNjYWxlZCBiYXNlZCBvbiB6b29tLCBi
dXQgd2lsbCBub3QgY2hhbmdlCisgKiBpZiB2aWV3cG9ydCBjaGFuZ2VzLgorICoKKyAqIFNldHRp
bmcgYm90aCBAYSB3IGFuZCBAYSBoIHRvIHplcm8gd2lsbCBkaXNhYmxlIGZpeGVkIGxheW91dC4K
KyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGFuZ2UgZml4ZWQgbGF5b3V0LgorICog
QHBhcmFtIHcgZml4ZWQgd2lkdGggdG8gdXNlLiBUaGlzIHNpemUgd2lsbCBiZSBhdXRvbWF0aWNh
bGx5IHNjYWxlZAorICogICAgICAgIGJhc2VkIG9uIHpvb20gbGV2ZWwuCisgKiBAcGFyYW0gaCBm
aXhlZCBoZWlnaHQgdG8gdXNlLiBUaGlzIHNpemUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNjYWxl
ZAorICogICAgICAgIGJhc2VkIG9uIHpvb20gbGV2ZWwuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfZml4
ZWRfbGF5b3V0X3NpemVfc2V0KEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29v
cmQgaCkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tf
VklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIFdlYkNvcmU6OkZyYW1lVmll
dyogdmlldyA9IHNkLT5fcHJpdi0+bWFpbl9mcmFtZS0+dmlldygpOworICAgIGlmICh3IDw9IDAg
JiYgaCA8PSAwKSB7CisgICAgICAgIGlmICghcHJpdi0+Zml4ZWRfbGF5b3V0LnVzZSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgcHJpdi0+Zml4ZWRfbGF5b3V0LncgPSAwOworICAgICAg
ICBwcml2LT5maXhlZF9sYXlvdXQuaCA9IDA7CisgICAgICAgIHByaXYtPmZpeGVkX2xheW91dC51
c2UgPSBFSU5BX0ZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwcml2LT5maXhlZF9s
YXlvdXQudXNlCisgICAgICAgICAgICAmJiBwcml2LT5maXhlZF9sYXlvdXQudyA9PSB3ICYmIHBy
aXYtPmZpeGVkX2xheW91dC5oID09IGgpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHBy
aXYtPmZpeGVkX2xheW91dC53ID0gdzsKKyAgICAgICAgcHJpdi0+Zml4ZWRfbGF5b3V0LmggPSBo
OworICAgICAgICBwcml2LT5maXhlZF9sYXlvdXQudXNlID0gRUlOQV9UUlVFOworCisgICAgICAg
IGlmICh2aWV3KQorICAgICAgICAgICAgdmlldy0+c2V0Rml4ZWRMYXlvdXRTaXplKFdlYkNvcmU6
OkludFNpemUodywgaCkpOworICAgIH0KKworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJu
OworICAgIHZpZXctPnNldFVzZUZpeGVkTGF5b3V0KHByaXYtPmZpeGVkX2xheW91dC51c2UpOwor
ICAgIHZpZXctPmZvcmNlTGF5b3V0KCk7Cit9CisKKy8qKgorICogR2V0IGZpeGVkIGxheW91dCBz
aXplIGluIHVzZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBxdWVyeSBmaXhlZCBs
YXlvdXQgc2l6ZS4KKyAqIEBwYXJhbSB3IHdoZXJlIHRvIHJldHVybiB3aWR0aC4gUmV0dXJucyAw
IG9uIGVycm9yIG9yIGlmIG5vIGZpeGVkCisgKiAgICAgICAgbGF5b3V0IGluIHVzZS4KKyAqIEBw
YXJhbSBoIHdoZXJlIHRvIHJldHVybiBoZWlnaHQuIFJldHVybnMgMCBvbiBlcnJvciBvciBpZiBu
byBmaXhlZAorICogICAgICAgIGxheW91dCBpbiB1c2UuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfZml4
ZWRfbGF5b3V0X3NpemVfZ2V0KEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3JkKiB3LCBFdmFzX0Nv
b3JkKiBoKQoreworICAgIGlmICh3KQorICAgICAgICAqdyA9IDA7CisgICAgaWYgKGgpCisgICAg
ICAgICpoID0gMDsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIGlmIChwcml2LT5maXhl
ZF9sYXlvdXQudXNlKSB7CisgICAgICAgIGlmICh3KQorICAgICAgICAgICAgKncgPSBwcml2LT5m
aXhlZF9sYXlvdXQudzsKKyAgICAgICAgaWYgKGgpCisgICAgICAgICAgICAqaCA9IHByaXYtPmZp
eGVkX2xheW91dC5oOworICAgIH0KK30KKworLyoqCisgKiBTZXQgdGhlIHRoZW1lIHBhdGggdG8g
YmUgdXNlZCBieSB0aGlzIHZpZXcuCisgKgorICogVGhpcyBhbHNvIHNldHMgdGhlIHRoZW1lIG9u
IHRoZSBtYWluIGZyYW1lLiBBcyBmcmFtZXMgaW5oZXJpdCB0aGVtZQorICogZnJvbSB0aGVpciBw
YXJlbnQsIHRoaXMgd2lsbCBoYXZlIGFsbCBmcmFtZXMgd2l0aCB1bnNldCB0aGVtZSB0bworICog
dXNlIHRoaXMgb25lLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoYW5nZSB0aGVt
ZS4KKyAqIEBwYXJhbSBwYXRoIHRoZW1lIHBhdGgsIG1heSBiZSBAYyAwIHRvIHJlc2V0IHRvIGRl
ZmF1bHQuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfdGhlbWVfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25z
dCBjaGFyKiBwYXRoKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOwor
ICAgIGV3a19mcmFtZV90aGVtZV9zZXQoc2QtPm1haW5fZnJhbWUsIHBhdGgpOworfQorCisvKioK
KyAqIEdldHMgdGhlIHRoZW1lIHNldCBvbiB0aGlzIGZyYW1lLgorICoKKyAqIFRoaXMgcmV0dXJu
cyB0aGUgdmFsdWUgc2V0IGJ5IGV3a192aWV3X3RoZW1lX3NldCgpLgorICoKKyAqIEBwYXJhbSBv
IHZpZXcgb2JqZWN0IHRvIGdldCB0aGVtZSBwYXRoLgorICoKKyAqIEByZXR1cm4gdGhlbWUgcGF0
aCwgbWF5IGJlIEBjIDAgaWYgbm90IHNldC4KKyAqLworY29uc3QgY2hhciogZXdrX3ZpZXdfdGhl
bWVfZ2V0KEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QsIDApOworICAgIHJldHVybiBld2tfZnJhbWVfdGhlbWVfZ2V0KHNkLT5tYWluX2ZyYW1l
KTsKK30KKworLyoqCisgKiBHZXQgdGhlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIG1haW4g
ZnJhbWUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IG1haW4gZnJhbWUuCisg
KgorICogQHJldHVybiBld2tfZnJhbWUgb2JqZWN0IG9yIEBjIDAgaWYgbm9uZSB5ZXQuCisgKi8K
K0V2YXNfT2JqZWN0KiBld2tfdmlld19mcmFtZV9tYWluX2dldChjb25zdCBFdmFzX09iamVjdCog
bykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICByZXR1
cm4gc2QtPm1haW5fZnJhbWU7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50bHkgZm9jdXNl
ZCBmcmFtZSBvYmplY3QuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IGZvY3Vz
ZWQgZnJhbWUuCisgKgorICogQHJldHVybiBld2tfZnJhbWUgb2JqZWN0IG9yIEBjIDAgaWYgbm9u
ZSB5ZXQuCisgKi8KK0V2YXNfT2JqZWN0KiBld2tfdmlld19mcmFtZV9mb2N1c2VkX2dldChjb25z
dCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworCisg
ICAgV2ViQ29yZTo6RnJhbWUqIGNvcmUgPSBwcml2LT5wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+
Zm9jdXNlZEZyYW1lKCk7CisgICAgaWYgKCFjb3JlKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50RWZsKiBjbGllbnQgPSBzdGF0aWNfY2FzdDxXZWJD
b3JlOjpGcmFtZUxvYWRlckNsaWVudEVmbCo+KGNvcmUtPmxvYWRlcigpLT5jbGllbnQoKSk7Cisg
ICAgaWYgKCFjbGllbnQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBjbGllbnQtPndl
YkZyYW1lKCk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gbG9hZCB0aGUgZ2l2ZW4g
VVJJLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGxvYWQgdXJpLgorICogQHBhcmFt
IHVyaSB1bmlmb3JtIHJlc291cmNlIGlkZW50aWZpZXIgdG8gbG9hZC4KKyAqCisgKiBAcmV0dXJu
IEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzZnVsIHJlcXVlc3QsIEBjIEVJTkFfRkFMU0Ugb24gZmFp
bHVyZS4KKyAqICAgICAgICAgTm90ZSB0aGF0IGl0IG1lYW5zIHRoZSByZXF1ZXN0IHdhcyBkb25l
LCBub3QgdGhhdCBpdCB3YXMKKyAqICAgICAgICAgc2F0aXNmaWVkLgorICovCitFaW5hX0Jvb2wg
ZXdrX3ZpZXdfdXJpX3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogdXJpKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVy
biBld2tfZnJhbWVfdXJpX3NldChzZC0+bWFpbl9mcmFtZSwgdXJpKTsKK30KKworLyoqCisgKiBH
ZXQgdGhlIGN1cnJlbnQgdXJpIGxvYWRlZCBieSBtYWluIGZyYW1lLgorICoKKyAqIEBwYXJhbSBv
IHZpZXcgb2JqZWN0IHRvIGdldCBjdXJyZW50IHVyaS4KKyAqCisgKiBAcmV0dXJuIGN1cnJlbnQg
dXJpIHJlZmVyZW5jZSBvciBAYyAwLiBJdCdzIGludGVybmFsLCBkb24ndCBjaGFuZ2UuCisgKi8K
K2NvbnN0IGNoYXIqIGV3a192aWV3X3VyaV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7Cisg
ICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgcmV0dXJuIGV3a19m
cmFtZV91cmlfZ2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJl
bnQgdGl0bGUgb2YgbWFpbiBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBn
ZXQgY3VycmVudCB0aXRsZS4KKyAqCisgKiBAcmV0dXJuIGN1cnJlbnQgdGl0bGUgcmVmZXJlbmNl
IG9yIEBjIDAuIEl0J3MgaW50ZXJuYWwsIGRvbid0IGNoYW5nZS4KKyAqLworY29uc3QgY2hhciog
ZXdrX3ZpZXdfdGl0bGVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVX
X1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIHJldHVybiBld2tfZnJhbWVfdGl0bGVf
Z2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBHZXRzIGlmIG1haW4gZnJhbWUgaXMg
ZWRpdGFibGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IGVkaXRhYmxlIHN0
YXRlLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIGVkaXRhYmxlLCBAYyBFSU5BX0ZB
TFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X2VkaXRhYmxlX2dldChjb25z
dCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2VkaXRhYmxlX2dldChzZC0+bWFp
bl9mcmFtZSk7Cit9CisKKy8qKgorICogU2V0IGJhY2tncm91bmQgY29sb3IgYW5kIHRyYW5zcGFy
ZW5jeQorICoKKyAqIEp1c3QgYXMgaW4gRXZhcywgY29sb3JzIGFyZSBwcmUtbXVsdGlwbGllZCwg
c28gNTAlIHJlZCBpcworICogKDEyOCwgMCwgMCwgMTI4KSBhbmQgbm90ICgyNTUsIDAsIDAsIDEy
OCkhCisgKgorICogQHdhcm5pbmcgV2F0Y2ggb3V0IHBlcmZvcm1hbmNlIGlzc3VlcyB3aXRoIHRy
YW5zcGFyZW5jeSEgT2JqZWN0CisgKiAgICAgICAgICB3aWxsIGJlIGhhbmRsZWQgYXMgdHJhbnNw
YXJlbnQgaW1hZ2UgYnkgZXZhcyBldmVuIGlmIHRoZQorICogICAgICAgICAgd2VicGFnZSBzcGVj
aWZpZXMgYSBiYWNrZ3JvdW5kIGNvbG9yLiBUaGF0IG1lYW4geW91J2xsIHBheQorICogICAgICAg
ICAgYSBwcmljZSBldmVuIGlmIGl0J3Mgbm90IHJlYWxseSB0cmFuc3BhcmVudCwgdGh1cworICog
ICAgICAgICAgc2Nyb2xsaW5nL3Bhbm5pbmcgYW5kIHpvb21pbmcgd2lsbCBiZSBsaWtlbHkgc2xv
d2VyIHRoYW4KKyAqICAgICAgICAgIGlmIHRyYW5zcGFyZW5jeSBpcyBvZmYuCisgKgorICogQHBh
cmFtIG8gdmlldyBvYmplY3QgdG8gY2hhbmdlLgorICogQHBhcmFtIHIgcmVkIGNvbXBvbmVudC4K
KyAqIEBwYXJhbSBnIGdyZWVuIGNvbXBvbmVudC4KKyAqIEBwYXJhbSBiIGJsdWUgY29tcG9uZW50
LgorICogQHBhcmFtIGEgdHJhbnNwYXJlbmN5LgorICovCit2b2lkIGV3a192aWV3X2JnX2NvbG9y
X3NldChFdmFzX09iamVjdCogbywgaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEpCit7CisgICAg
RVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9S
RVRVUk4oc2QtPmFwaSk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaS0+Ymdf
Y29sb3Jfc2V0KTsKKworICAgIGlmIChhIDwgMCkgeworICAgICAgICBXUk4oIkFscGhhIGxlc3Mg
dGhhbiB6ZXJvICglZCkuIiwgYSk7CisgICAgICAgIGEgPSAwOworICAgIH0gZWxzZSBpZiAoYSA+
IDI1NSkgeworICAgICAgICBXUk4oIkFscGhhIGlzIGxhcmdlciB0aGFuIDI1NSAoJWQpLiIsIGEp
OworICAgICAgICBhID0gMjU1OworICAgIH0KKworI2RlZmluZSBDSEVDS19QUkVNVUxfQ09MT1Io
YywgYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChj
IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgXAorICAgICAgICBXUk4oIkNvbG9yIGNvbXBvbmVudCAiI2MiIGlzIGxlc3MgdGhhbiB6
ZXJvICglZCkuIiwgYyk7ICAgICAgICAgXAorICAgICAgICBjID0gMDsgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBp
ZiAoYyA+IGEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgXAorICAgICAgICBXUk4oIkNvbG9yIGNvbXBvbmVudCAiI2MiIGlzIGdyZWF0ZXIgdGhhbiBh
bHBoYSAoJWQsIGFscGhhPSVkKS4iLCBcCisgICAgICAgICAgICBjLCBhKTsgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMgPSBh
OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgfQorICAgIENIRUNLX1BSRU1VTF9DT0xPUihyLCBhKTsKKyAgICBDSEVDS19QUkVN
VUxfQ09MT1IoZywgYSk7CisgICAgQ0hFQ0tfUFJFTVVMX0NPTE9SKGIsIGEpOworI3VuZGVmIENI
RUNLX1BSRU1VTF9DT0xPUgorCisgICAgc2QtPmJnX2NvbG9yLnIgPSByOworICAgIHNkLT5iZ19j
b2xvci5nID0gZzsKKyAgICBzZC0+YmdfY29sb3IuYiA9IGI7CisgICAgc2QtPmJnX2NvbG9yLmEg
PSBhOworCisgICAgc2QtPmFwaS0+YmdfY29sb3Jfc2V0KHNkLCByLCBnLCBiLCBhKTsKKworICAg
IFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IHNkLT5fcHJpdi0+bWFpbl9mcmFtZS0+dmlldygp
OworICAgIGlmICh2aWV3KSB7CisgICAgICAgIFdlYkNvcmU6OkNvbG9yIGNvbG9yOworCisgICAg
ICAgIGlmICghYSkKKyAgICAgICAgICAgIGNvbG9yID0gV2ViQ29yZTo6Q29sb3IoMCwgMCwgMCwg
MCk7CisgICAgICAgIGVsc2UgaWYgKGEgPT0gMjU1KQorICAgICAgICAgICAgY29sb3IgPSBXZWJD
b3JlOjpDb2xvcihyLCBnLCBiLCBhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29sb3Ig
PSBXZWJDb3JlOjpDb2xvcihyICogMjU1IC8gYSwgZyAqIDI1NSAvIGEsIGIgKiAyNTUgLyBhLCBh
KTsKKworICAgICAgICB2aWV3LT51cGRhdGVCYWNrZ3JvdW5kUmVjdXJzaXZlbHkoY29sb3IsICFh
KTsKKyAgICB9Cit9CisKKy8qKgorICogUXVlcnkgaWYgdmlldyBvYmplY3QgYmFja2dyb3VuZCBj
b2xvci4KKyAqCisgKiBKdXN0IGFzIGluIEV2YXMsIGNvbG9ycyBhcmUgcHJlLW11bHRpcGxpZWQs
IHNvIDUwJSByZWQgaXMKKyAqICgxMjgsIDAsIDAsIDEyOCkgYW5kIG5vdCAoMjU1LCAwLCAwLCAx
MjgpIQorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHF1ZXJ5LgorICogQHBhcmFtIHIg
d2hlcmUgdG8gcmV0dXJuIHJlZCBjb2xvciBjb21wb25lbnQuCisgKiBAcGFyYW0gZyB3aGVyZSB0
byByZXR1cm4gZ3JlZW4gY29sb3IgY29tcG9uZW50LgorICogQHBhcmFtIGIgd2hlcmUgdG8gcmV0
dXJuIGJsdWUgY29sb3IgY29tcG9uZW50LgorICogQHBhcmFtIGEgd2hlcmUgdG8gcmV0dXJuIGFs
cGhhIHZhbHVlLgorICovCit2b2lkIGV3a192aWV3X2JnX2NvbG9yX2dldChjb25zdCBFdmFzX09i
amVjdCogbywgaW50KiByLCBpbnQqIGcsIGludCogYiwgaW50KiBhKQoreworICAgIGlmIChyKQor
ICAgICAgICAqciA9IDA7CisgICAgaWYgKGcpCisgICAgICAgICpnID0gMDsKKyAgICBpZiAoYikK
KyAgICAgICAgKmIgPSAwOworICAgIGlmIChhKQorICAgICAgICAqYSA9IDA7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgaWYgKHIpCisgICAgICAgICpyID0gc2Qt
PmJnX2NvbG9yLnI7CisgICAgaWYgKGcpCisgICAgICAgICpnID0gc2QtPmJnX2NvbG9yLmc7Cisg
ICAgaWYgKGIpCisgICAgICAgICpiID0gc2QtPmJnX2NvbG9yLmI7CisgICAgaWYgKGEpCisgICAg
ICAgICphID0gc2QtPmJnX2NvbG9yLmE7Cit9CisKKy8qKgorICogU2VhcmNoIHRoZSBnaXZlbiB0
ZXh0IHN0cmluZyBpbiBkb2N1bWVudC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB3aGVy
ZSB0byBzZWFyY2ggdGV4dC4KKyAqIEBwYXJhbSBzdHJpbmcgcmVmZXJlbmNlIHN0cmluZyB0byBz
ZWFyY2guCisgKiBAcGFyYW0gY2FzZV9zZW5zaXRpdmUgaWYgc2VhcmNoIHNob3VsZCBiZSBjYXNl
IHNlbnNpdGl2ZSBvciBub3QuCisgKiBAcGFyYW0gZm9yd2FyZCBpZiBzZWFyY2ggaXMgZnJvbSBj
dXJzb3IgYW5kIG9uIG9yIGJhY2t3YXJkcy4KKyAqIEBwYXJhbSB3cmFwIGlmIHNlYXJjaCBzaG91
bGQgd3JhcCBhdCBlbmQuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgZm91bmQsIEBj
IEVJTkFfRkFMU0UgaWYgbm90IG9yIGZhaWx1cmUuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld190
ZXh0X3NlYXJjaChjb25zdCBFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogc3RyaW5nLCBFaW5h
X0Jvb2wgY2FzZV9zZW5zaXRpdmUsIEVpbmFfQm9vbCBmb3J3YXJkLCBFaW5hX0Jvb2wgd3JhcCkK
K3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAg
ICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAg
IEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChzdHJpbmcsIEVJTkFfRkFMU0UpOworICAgIFdl
YkNvcmU6OlRleHRDYXNlU2Vuc2l0aXZpdHkgc2Vuc2l0aXZlOworICAgIFdlYkNvcmU6OkZpbmRE
aXJlY3Rpb24gZGlyZWN0aW9uOworCisgICAgaWYgKGNhc2Vfc2Vuc2l0aXZlKQorICAgICAgICBz
ZW5zaXRpdmUgPSBXZWJDb3JlOjpUZXh0Q2FzZVNlbnNpdGl2ZTsKKyAgICBlbHNlCisgICAgICAg
IHNlbnNpdGl2ZSA9IFdlYkNvcmU6OlRleHRDYXNlSW5zZW5zaXRpdmU7CisKKyAgICBpZiAoZm9y
d2FyZCkKKyAgICAgICAgZGlyZWN0aW9uID0gV2ViQ29yZTo6RmluZERpcmVjdGlvbkZvcndhcmQ7
CisgICAgZWxzZQorICAgICAgICBkaXJlY3Rpb24gPSBXZWJDb3JlOjpGaW5kRGlyZWN0aW9uQmFj
a3dhcmQ7CisKKyAgICByZXR1cm4gcHJpdi0+cGFnZS0+ZmluZFN0cmluZyhXZWJDb3JlOjpTdHJp
bmc6OmZyb21VVEY4KHN0cmluZyksIHNlbnNpdGl2ZSwgZGlyZWN0aW9uLCB3cmFwKTsKK30KKwor
LyoqCisgKiBNYXJrIG1hdGNoZXMgdGhlIGdpdmVuIHRleHQgc3RyaW5nIGluIGRvY3VtZW50Lgor
ICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHdoZXJlIHRvIHNlYXJjaCB0ZXh0LgorICogQHBh
cmFtIHN0cmluZyByZWZlcmVuY2Ugc3RyaW5nIHRvIG1hdGNoLgorICogQHBhcmFtIGNhc2Vfc2Vu
c2l0aXZlIGlmIG1hdGNoIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSBvciBub3QuCisgKiBAcGFy
YW0gaGlnaGxpZ2h0IGlmIG1hdGNoZXMgc2hvdWxkIGJlIGhpZ2hsaWdodGVkLgorICogQHBhcmFt
IGxpbWl0IG1heGltdW0gYW1vdW50IG9mIG1hdGNoZXMsIG9yIHplcm8gdG8gdW5saW1pdGVkLgor
ICoKKyAqIEByZXR1cm4gbnVtYmVyIG9mIG1hdGNoZXMuCisgKi8KK3Vuc2lnbmVkIGludCBld2tf
dmlld190ZXh0X21hdGNoZXNfbWFyayhFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogc3RyaW5n
LCBFaW5hX0Jvb2wgY2FzZV9zZW5zaXRpdmUsIEVpbmFfQm9vbCBoaWdobGlnaHQsIHVuc2lnbmVk
IGludCBsaW1pdCkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsK
KyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIEVJTkFf
U0FGRVRZX09OXzBfUkVUVVJOX1ZBTChzdHJpbmcsIDApOworICAgIFdlYkNvcmU6OlRleHRDYXNl
U2Vuc2l0aXZpdHkgc2Vuc2l0aXZlOworCisgICAgaWYgKGNhc2Vfc2Vuc2l0aXZlKQorICAgICAg
ICBzZW5zaXRpdmUgPSBXZWJDb3JlOjpUZXh0Q2FzZVNlbnNpdGl2ZTsKKyAgICBlbHNlCisgICAg
ICAgIHNlbnNpdGl2ZSA9IFdlYkNvcmU6OlRleHRDYXNlSW5zZW5zaXRpdmU7CisKKyAgICByZXR1
cm4gcHJpdi0+cGFnZS0+bWFya0FsbE1hdGNoZXNGb3JUZXh0KFdlYkNvcmU6OlN0cmluZzo6ZnJv
bVVURjgoc3RyaW5nKSwgc2Vuc2l0aXZlLCBoaWdobGlnaHQsIGxpbWl0KTsKK30KKworLyoqCisg
KiBSZXZlcnNlcyB0aGUgZWZmZWN0IG9mIGV3a192aWV3X3RleHRfbWF0Y2hlc19tYXJrKCkKKyAq
CisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB3aGVyZSB0byBzZWFyY2ggdGV4dC4KKyAqCisgKiBA
cmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIGZvciBmYWlsdXJl
LgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfdGV4dF9tYXRjaGVzX3VubWFya19hbGwoRXZhc19P
YmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9G
QUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZB
TFNFKTsKKyAgICBwcml2LT5wYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOworICAgIHJldHVy
biBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogU2V0IGlmIHNob3VsZCBoaWdobGlnaHQgbWF0Y2hl
cyBtYXJrZWQgd2l0aCBld2tfdmlld190ZXh0X21hdGNoZXNfbWFyaygpLgorICoKKyAqIEBwYXJh
bSBvIHZpZXcgb2JqZWN0IHdoZXJlIHRvIHNldCBpZiBtYXRjaGVzIGFyZSBoaWdobGlnaHRlZCBv
ciBub3QuCisgKiBAcGFyYW0gaGlnaGxpZ2h0IGlmIEBjIEVJTkFfVFJVRSwgbWF0Y2hlcyB3aWxs
IGJlIGhpZ2hsaWdodGVkLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3Ms
IEBjIEVJTkFfRkFMU0UgZm9yIGZhaWx1cmUuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld190ZXh0
X21hdGNoZXNfaGlnaGxpZ2h0X3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGhpZ2hsaWdo
dCkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsK
KyAgICByZXR1cm4gZXdrX2ZyYW1lX3RleHRfbWF0Y2hlc19oaWdobGlnaHRfc2V0KHNkLT5tYWlu
X2ZyYW1lLCBoaWdobGlnaHQpOworfQorCisvKioKKyAqIEdldCBpZiBzaG91bGQgaGlnaGxpZ2h0
IG1hdGNoZXMgbWFya2VkIHdpdGggZXdrX3ZpZXdfdGV4dF9tYXRjaGVzX21hcmsoKS4KKyAqCisg
KiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBxdWVyeSBpZiBtYXRjaGVzIGFyZSBoaWdobGlnaHRl
ZCBvciBub3QuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgdGhleSBhcmUgaGlnaGxp
Z2h0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
dGV4dF9tYXRjaGVzX2hpZ2hsaWdodF9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAg
RVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJu
IGV3a19mcmFtZV90ZXh0X21hdGNoZXNfaGlnaGxpZ2h0X2dldChzZC0+bWFpbl9mcmFtZSk7Cit9
CisKKy8qKgorICogU2V0cyBpZiBtYWluIGZyYW1lIGlzIGVkaXRhYmxlLgorICoKKyAqIEBwYXJh
bSBvIHZpZXcgb2JqZWN0IHRvIHNldCBlZGl0YWJsZSBzdGF0ZS4KKyAqIEBwYXJhbSBlZGl0YWJs
ZSBuZXcgc3RhdGUuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMg
RUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19lZGl0YWJsZV9z
ZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCBlZGl0YWJsZSkKK3sKKyAgICBFV0tfVklFV19T
RF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1l
X2VkaXRhYmxlX3NldChzZC0+bWFpbl9mcmFtZSwgZWRpdGFibGUpOworfQorCisvKioKKyAqIEdl
dCB0aGUgY29weSBvZiB0aGUgc2VsZWN0aW9uIHRleHQuCisgKgorICogQHBhcmFtIG8gdmlldyBv
YmplY3QgdG8gZ2V0IHNlbGVjdGlvbiB0ZXh0LgorICoKKyAqIEByZXR1cm4gbmV3bHkgYWxsb2Nh
dGVkIHN0cmluZyBvciBAYyAwIGlmIG5vdGhpbmcgaXMgc2VsZWN0ZWQgb3IgZmFpbHVyZS4KKyAq
LworY2hhciogZXdrX3ZpZXdfc2VsZWN0aW9uX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIFdlYkNvcmU6OkNTdHJpbmcgcyA9
IHByaXYtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+c2Vs
ZWN0ZWRUZXh0KCkudXRmOCgpOworICAgIGlmIChzLmlzTnVsbCgpKQorICAgICAgICByZXR1cm4g
MDsKKyAgICByZXR1cm4gc3RyZHVwKHMuZGF0YSgpKTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBf
ZXdrX3ZpZXdfZWRpdG9yX2NvbW1hbmQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBjb25z
dCBjaGFyKiBjb21tYW5kKQoreworICAgIHJldHVybiBwcml2LT5wYWdlLT5mb2N1c0NvbnRyb2xs
ZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmVkaXRvcigpLT5jb21tYW5kKFdlYkNvcmU6OlN0
cmluZzo6ZnJvbVVURjgoY29tbWFuZCkpLmV4ZWN1dGUoKTsKK30KKworLyoqCisgKiBVbnNlbGVj
dHMgd2hhdGV2ZXIgd2FzIHNlbGVjdGVkLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlm
IG9wZXJhdGlvbiB3YXMgZXhlY3V0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitF
aW5hX0Jvb2wgZXdrX3ZpZXdfc2VsZWN0X25vbmUoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3
a192aWV3X2VkaXRvcl9jb21tYW5kKHByaXYsICJVbnNlbGVjdCIpOworfQorCisvKioKKyAqIFNl
bGVjdHMgZXZlcnl0aGluZy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRp
b24gd2FzIGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29s
IGV3a192aWV3X3NlbGVjdF9hbGwoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRf
T1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3a192aWV3X2Vk
aXRvcl9jb21tYW5kKHByaXYsICJTZWxlY3RBbGwiKTsKK30KKworLyoqCisgKiBTZWxlY3RzIHRo
ZSBjdXJyZW50IHBhcmFncmFoLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIG9wZXJh
dGlvbiB3YXMgZXhlY3V0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jv
b2wgZXdrX3ZpZXdfc2VsZWN0X3BhcmFncmFwaChFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tf
VklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBfZXdr
X3ZpZXdfZWRpdG9yX2NvbW1hbmQocHJpdiwgIlNlbGVjdFBhcmFncmFwaCIpOworfQorCisvKioK
KyAqIFNlbGVjdHMgdGhlIGN1cnJlbnQgc2VudGVuY2UuCisgKgorICogQHJldHVybiBAYyBFSU5B
X1RSVUUgaWYgb3BlcmF0aW9uIHdhcyBleGVjdXRlZCwgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2Uu
CisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19zZWxlY3Rfc2VudGVuY2UoRXZhc19PYmplY3QqIG8p
Cit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7Cisg
ICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAg
ICByZXR1cm4gX2V3a192aWV3X2VkaXRvcl9jb21tYW5kKHByaXYsICJTZWxlY3RTZW50ZW5jZSIp
OworfQorCisvKioKKyAqIFNlbGVjdHMgdGhlIGN1cnJlbnQgbGluZS4KKyAqCisgKiBAcmV0dXJu
IEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNFIG90
aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3NlbGVjdF9saW5lKEV2YXNfT2JqZWN0
KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7
CisgICAgcmV0dXJuIF9ld2tfdmlld19lZGl0b3JfY29tbWFuZChwcml2LCAiU2VsZWN0TGluZSIp
OworfQorCisvKioKKyAqIFNlbGVjdHMgdGhlIGN1cnJlbnQgd29yZC4KKyAqCisgKiBAcmV0dXJu
IEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLCBAYyBFSU5BX0ZBTFNFIG90
aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3NlbGVjdF93b3JkKEV2YXNfT2JqZWN0
KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7
CisgICAgcmV0dXJuIF9ld2tfdmlld19lZGl0b3JfY29tbWFuZChwcml2LCAiU2VsZWN0V29yZCIp
OworfQorCisvKioKKyAqIEdldCBjdXJyZW50IGxvYWQgcHJvZ3Jlc3MgZXN0aW1hdGUgZnJvbSAw
LjAgdG8gMS4wLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGdldCBjdXJyZW50IHBy
b2dyZXNzLgorICoKKyAqIEByZXR1cm4gcHJvZ3JlcyB2YWx1ZSBmcm9tIDAuMCB0byAxLjAgb3Ig
LTEuMCBvbiBlcnJvci4KKyAqLworZG91YmxlIGV3a192aWV3X2xvYWRfcHJvZ3Jlc3NfZ2V0KGNv
bnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywg
c2QsIC0xLjApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgLTEu
MCk7CisgICAgcmV0dXJuIHByaXYtPnBhZ2UtPnByb2dyZXNzKCktPmVzdGltYXRlZFByb2dyZXNz
KCk7Cit9CisKKy8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gc3RvcCBsb2FkaW5nLgorICoKKyAq
IEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHN0b3AgbG9hZGluZy4KKyAqCisgKiBAcmV0dXJuIEBj
IEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBA
c2VlIGV3a19mcmFtZV9zdG9wKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X3N0b3AoRXZhc19P
YmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9G
QUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9zdG9wKHNkLT5tYWluX2ZyYW1lKTsKK30KKwor
LyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0byByZWxvYWQgY3VycmVudCBkb2N1bWVudC4KKyAqCisg
KiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byByZWxvYWQuCisgKgorICogQHJldHVybiBAYyBFSU5B
X1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBl
d2tfZnJhbWVfcmVsb2FkKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X3JlbG9hZChFdmFzX09i
amVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZB
TFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3JlbG9hZChzZC0+bWFpbl9mcmFtZSk7Cit9CisK
Ky8qKgorICogQXNrIG1haW4gZnJhbWUgdG8gZnVsbHkgcmVsb2FkIGN1cnJlbnQgZG9jdW1lbnQs
IHVzaW5nIG5vIGNhY2hlcy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byByZWxvYWQu
CisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBv
dGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJhbWVfcmVsb2FkX2Z1bGwoKQorICovCitFaW5h
X0Jvb2wgZXdrX3ZpZXdfcmVsb2FkX2Z1bGwoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19m
cmFtZV9yZWxvYWRfZnVsbChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogQXNrIG1haW4g
ZnJhbWUgdG8gbmF2aWdhdGUgYmFjayBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcg
b2JqZWN0IHRvIG5hdmlnYXRlIGJhY2suCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24g
c3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfZnJhbWVf
YmFjaygpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19iYWNrKEV2YXNfT2JqZWN0KiBvKQorewor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJl
dHVybiBld2tfZnJhbWVfYmFjayhzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogQXNrIG1h
aW4gZnJhbWUgdG8gbmF2aWdhdGUgZm9yd2FyZCBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBv
IHZpZXcgb2JqZWN0IHRvIG5hdmlnYXRlIGZvcndhcmQuCisgKgorICogQHJldHVybiBAYyBFSU5B
X1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBl
d2tfZnJhbWVfZm9yd2FyZCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19mb3J3YXJkKEV2YXNf
T2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFf
RkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVfZm9yd2FyZChzZC0+bWFpbl9mcmFtZSk7Cit9
CisKKy8qKgorICogTmF2aWdhdGUgYmFjayBvciBmb3J3YXJkIGluIGhpc3RvcnkuCisgKgorICog
QHBhcmFtIG8gdmlldyBvYmplY3QgdG8gbmF2aWdhdGUuCisgKiBAcGFyYW0gc3RlcHMgaWYgcG9z
aXRpdmUgbmF2aWdhdGVzIHRoYXQgYW1vdW50IGZvcndhcmRzLCBpZiBuZWdhdGl2ZQorICogICAg
ICAgIGRvZXMgYmFja3dhcmRzLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nl
c3MsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX2ZyYW1lX25hdmln
YXRlKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X25hdmlnYXRlKEV2YXNfT2JqZWN0KiBvLCBp
bnQgc3RlcHMpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9G
QUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9uYXZpZ2F0ZShzZC0+bWFpbl9mcmFtZSwgc3Rl
cHMpOworfQorCisvKioKKyAqIENoZWNrIGlmIGl0IGlzIHBvc3NpYmxlIHRvIG5hdmlnYXRlIGJh
Y2t3YXJkcyBvbmUgaXRlbSBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0
IHRvIGNoZWNrIGlmIGJhY2t3YXJkIG5hdmlnYXRpb24gaXMgcG9zc2libGUuCisgKgorICogQHJl
dHVybiBAYyBFSU5BX1RSVUUgaWYgcG9zc2libGUsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgor
ICoKKyAqIEBzZWUgZXdrX3ZpZXdfbmF2aWdhdGVfcG9zc2libGUoKQorICovCitFaW5hX0Jvb2wg
ZXdrX3ZpZXdfYmFja19wb3NzaWJsZShFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19T
RF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1l
X2JhY2tfcG9zc2libGUoc2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIENoZWNrIGlmIGl0
IGlzIHBvc3NpYmxlIHRvIG5hdmlnYXRlIGZvcndhcmRzIG9uZSBpdGVtIGluIGhpc3RvcnkuCisg
KgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gY2hlY2sgaWYgZm9yd2FyZCBuYXZpZ2F0aW9u
IGlzIHBvc3NpYmxlLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIHBvc3NpYmxlLCBA
YyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a192aWV3X25hdmlnYXRlX3Bv
c3NpYmxlKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X2ZvcndhcmRfcG9zc2libGUoRXZhc19P
YmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9G
QUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9mb3J3YXJkX3Bvc3NpYmxlKHNkLT5tYWluX2Zy
YW1lKTsKK30KKworLyoqCisgKiBDaGVjayBpZiBpdCBpcyBwb3NzaWJsZSB0byBuYXZpZ2F0ZSBn
aXZlbiBAYSBzdGVwcyBpbiBoaXN0b3J5LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRv
IG5hdmlnYXRlLgorICogQHBhcmFtIHN0ZXBzIGlmIHBvc2l0aXZlIG5hdmlnYXRlcyB0aGF0IGFt
b3VudCBmb3J3YXJkcywgaWYgbmVnYXRpdmUKKyAqICAgICAgICBkb2VzIGJhY2t3YXJkcy4KKyAq
CisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBwb3NzaWJsZSwgQGMgRUlOQV9GQUxTRSBvdGhl
cndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19uYXZpZ2F0ZV9wb3NzaWJsZShFdmFzX09i
amVjdCogbywgaW50IHN0ZXBzKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywg
c2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVfbmF2aWdhdGVfcG9zc2libGUo
c2QtPm1haW5fZnJhbWUsIHN0ZXBzKTsKK30KKworLyoqCisgKiBDaGVjayBpZiBuYXZpZ2F0aW9u
IGhpc3RvcnkgKGJhY2stZm9yd2FyZCBsaXN0cykgaXMgZW5hYmxlZC4KKyAqCisgKiBAcGFyYW0g
byB2aWV3IG9iamVjdCB0byBjaGVjayBpZiBuYXZpZ2F0aW9uIGhpc3RvcnkgaXMgZW5hYmxlZC4K
KyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiB2aWV3IGtlZXBzIGhpc3RvcnksIEBjIEVJ
TkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfaGlzdG9yeV9lbmFi
bGVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9S
RVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVS
TihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnBhZ2UtPmJhY2tGb3J3
YXJkTGlzdCgpLT5lbmFibGVkKCk7Cit9CisKKy8qKgorICogU2V0cyBpZiBuYXZpZ2F0aW9uIGhp
c3RvcnkgKGJhY2stZm9yd2FyZCBsaXN0cykgaXMgZW5hYmxlZC4KKyAqCisgKiBAcGFyYW0gbyB2
aWV3IG9iamVjdCB0byBzZXQgaWYgbmF2aWdhdGlvbiBoaXN0b3J5IGlzIGVuYWJsZWQuCisgKiBA
cGFyYW0gZW5hYmxlIEBjIEVJTkFfVFJVRSBpZiB3ZSB3YW50IHRvIGVuYWJsZSBuYXZpZ2F0aW9u
IGhpc3Rvcnk7CisgKiBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAcmV0dXJuIEBj
IEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWlu
YV9Cb29sIGV3a192aWV3X2hpc3RvcnlfZW5hYmxlX3NldChFdmFzX09iamVjdCogbywgRWluYV9C
b29sIGVuYWJsZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5B
X0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFf
RkFMU0UpOworICAgIHByaXYtPnBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpLT5zZXRFbmFibGVkKGVu
YWJsZSk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBoaXN0
b3J5IChiYWNrLWZvcndhcmQgbGlzdCkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldy4KKyAqCisg
KiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBnZXQgbmF2aWdhdGlvbiBoaXN0b3J5IGZyb20uCisg
KgorICogQHJldHVybiByZXR1cm5zIHRoZSBoaXN0b3J5IGluc3RhbmNlIGhhbmRsZSBhc3NvY2lh
dGVkIHdpdGggdGhpcworICogICAgICAgICB2aWV3IG9yIEBjIDAgb24gZXJyb3JzIChpbmNsdWRp
bmcgd2hlbiBoaXN0b3J5IGlzIG5vdAorICogICAgICAgICBlbmFibGVkIHdpdGggZXdrX3ZpZXdf
aGlzdG9yeV9lbmFibGVfc2V0KCkpLiBUaGlzIGluc3RhbmNlCisgKiAgICAgICAgIGlzIHVuaXF1
ZSBmb3IgdGhpcyB2aWV3IGFuZCB0aHVzIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMKKyAqICAgICAg
ICAgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSB2aWV3IGFzIHBhcmFtZXRlciByZXR1cm5zIHRoZSBz
YW1lCisgKiAgICAgICAgIGhhbmRsZS4gVGhpcyBoYW5kbGUgaXMgYWxpdmUgd2hpbGUgdmlldyBp
cyBhbGl2ZSwgdGh1cyBvbmUKKyAqICAgICAgICAgbWlnaHQgd2FudCB0byBsaXN0ZW4gZm9yIEVW
QVNfQ0FMTEJBQ0tfREVMIG9uIGdpdmVuIHZpZXcKKyAqICAgICAgICAgKEBhIG8pIHRvIGtub3cg
d2hlbiB0byBzdG9wIHVzaW5nIHJldHVybmVkIGhhbmRsZS4KKyAqCisgKiBAc2VlIGV3a192aWV3
X2hpc3RvcnlfZW5hYmxlX3NldCgpCisgKi8KK0V3a19IaXN0b3J5KiBld2tfdmlld19oaXN0b3J5
X2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYs
IDApOworICAgIGlmICghcHJpdi0+cGFnZS0+YmFja0ZvcndhcmRMaXN0KCktPmVuYWJsZWQoKSkg
eworICAgICAgICBFUlIoImFza2VkIGhpc3RvcnksIGJ1dCBpdCdzIGRpc2FibGVkISBSZXR1cm5p
bmcgMCEiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBwcml2LT5oaXN0
b3J5OworfQorCisvKioKKyAqIEdldCB0aGUgY3VycmVudCB6b29tIGxldmVsIG9mIG1haW4gZnJh
bWUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gcXVlcnkgem9vbSBsZXZlbC4KKyAq
CisgKiBAcmV0dXJuIGN1cnJlbnQgem9vbSBsZXZlbCBpbiB1c2Ugb3IgLTEuMCBvbiBlcnJvci4K
KyAqLworZmxvYXQgZXdrX3ZpZXdfem9vbV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7Cisg
ICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgLTEuMCk7CisgICAgcmV0dXJuIGV3
a19mcmFtZV96b29tX2dldChzZC0+bWFpbl9mcmFtZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBj
dXJyZW50IHpvb20gbGV2ZWwgb2YgbWFpbiBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9i
amVjdCB0byBzZXQgem9vbSBsZXZlbC4KKyAqIEBwYXJhbSB6b29tIG5ldyBsZXZlbCB0byB1c2Uu
CisgKiBAcGFyYW0gY3ggeCBvZiBjZW50ZXIgY29vcmRpbmF0ZQorICogQHBhcmFtIGN5IHkgb2Yg
Y2VudGVyIGNvb3JkaW5hdGUKKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNz
LCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21f
c2V0KEV2YXNfT2JqZWN0KiBvLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3Jk
IGN5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZBTFNFKTsK
KyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV9zZXQsIEVJTkFf
RkFMU0UpOworICAgIGlmICh6b29tIDwgWk9PTV9NSU4pIHsKKyAgICAgICAgV1JOKCJ6b29tIGxl
dmVsIGlzIDwgJWYgOiAlZiIsIChkb3VibGUpWk9PTV9NSU4sIChkb3VibGUpem9vbSk7CisgICAg
ICAgIHJldHVybiBFSU5BX0ZBTFNFOworICAgIH0KKyAgICBpZiAoem9vbSA+IFpPT01fTUFYKSB7
CisgICAgICAgIFdSTigiem9vbSBsZXZlbCBpcyA+ICVmIDogJWYiLCAoZG91YmxlKVpPT01fTUFY
LCAoZG91YmxlKXpvb20pOworICAgICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKyAgICB9CisKKyAg
ICBpZiAoY3ggPj0gc2QtPnZpZXcudykKKyAgICAgICAgY3ggPSBzZC0+dmlldy53IC0gMTsKKyAg
ICBpZiAoY3kgPj0gc2QtPnZpZXcuaCkKKyAgICAgICAgY3kgPSBzZC0+dmlldy5oIC0gMTsKKyAg
ICBpZiAoY3ggPCAwKQorICAgICAgICBjeCA9IDA7CisgICAgaWYgKGN5IDwgMCkKKyAgICAgICAg
Y3kgPSAwOworICAgIF9ld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfc3RvcChzZCk7CisgICAg
cmV0dXJuIHNkLT5hcGktPnpvb21fc2V0KHNkLCB6b29tLCBjeCwgY3kpOworfQorCitFaW5hX0Jv
b2wgZXdrX3ZpZXdfem9vbV93ZWFrX3Ntb290aF9zY2FsZV9nZXQoY29uc3QgRXZhc19PYmplY3Qq
IG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7
CisgICAgcmV0dXJuIHNkLT56b29tX3dlYWtfc21vb3RoX3NjYWxlOworfQorCit2b2lkIGV3a192
aWV3X3pvb21fd2Vha19zbW9vdGhfc2NhbGVfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wg
c21vb3RoX3NjYWxlKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOwor
ICAgIHNtb290aF9zY2FsZSA9ICEhc21vb3RoX3NjYWxlOworICAgIGlmIChzZC0+em9vbV93ZWFr
X3Ntb290aF9zY2FsZSA9PSBzbW9vdGhfc2NhbGUpCisgICAgICAgIHJldHVybjsKKyAgICBzZC0+
em9vbV93ZWFrX3Ntb290aF9zY2FsZSA9IHNtb290aF9zY2FsZTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl8wX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTihzZC0+YXBp
LT56b29tX3dlYWtfc21vb3RoX3NjYWxlX3NldCk7CisgICAgc2QtPmFwaS0+em9vbV93ZWFrX3Nt
b290aF9zY2FsZV9zZXQoc2QsIHNtb290aF9zY2FsZSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBj
dXJyZW50IHpvb20gbGV2ZWwgb2YgYmFja2luZyBzdG9yZSwgY2VudGVyZWQgYXQgZ2l2ZW4gcG9p
bnQuCisgKgorICogVW5saWtlIGV3a192aWV3X3pvb21fc2V0KCksIHRoaXMgY2FsbCBkbyBub3Qg
YXNrIFdlYktpdCB0byByZW5kZXIKKyAqIGF0IG5ldyBzaXplLCBidXQgc2NhbGUgd2hhdCBpcyBh
bHJlYWR5IHJlbmRlcmVkLCBiZWluZyBtdWNoIGZhc3RlcgorICogYnV0IHdvcnNlIHF1YWxpdHku
CisgKgorICogT2Z0ZW4gb25lIHNob3VsZCB1c2UgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9zZXQo
KSwgaXQgd2lsbCBjYWxsIHRoZQorICogc2FtZSBtYWNoaW5lcnkgaW50ZXJuYWxseS4KKyAqCisg
KiBAbm90ZSB0aGlzIHdpbGwgc2V0IHZhcmlhYmxlcyB1c2VkIGJ5IGV3a192aWV3X3pvb21fYW5p
bWF0ZWRfc2V0KCkKKyAqICAgICAgIHNvIHN1Yi1jbGFzc2VzIHdpbGwgbm90IHJlc2V0IGludGVy
bmFsIHN0YXRlIG9uIHRoZWlyCisgKiAgICAgICAiY2FsY3VsYXRlIiBwaGFzZS4gVG8gdW5zZXQg
dGhvc2UgYW5kIGVuYWJsZSBzdWItY2xhc3NlcyB0bworICogICAgICAgcmVzZXQgdGhlaXIgaW50
ZXJuYWwgc3RhdGUsIGNhbGwKKyAqICAgICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19z
dG9wKCkuIE5hbWVseSwgdGhpcyBjYWxsIHdpbGwKKyAqICAgICAgIHNldCBld2tfdmlld196b29t
X2FuaW1hdGVkX21hcmtfc3RhcnQoKSB0byBhY3R1YWwgd2Via2l0IHpvb20KKyAqICAgICAgIGxl
dmVsLCBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKCkgYW5kCisgKiAgICAgICBld2tf
dmlld196b29tX2FuaW1hdGVkX21hcmtfY3VycmVudCgpIHRvIGdpdmVuIHpvb20gbGV2ZWwuCisg
KgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gc2V0IHdlYWsgem9vbSBsZXZlbC4KKyAqIEBw
YXJhbSB6b29tIGxldmVsIHRvIHNjYWxlIGJhY2tpbmcgc3RvcmUuCisgKiBAcGFyYW0gY3ggaG9y
aXpvbnRhbCBjZW50ZXIgb2Zmc2V0LCByZWxhdGl2ZSB0byBvYmplY3QgKHcvMiBpcyBtaWRkbGUp
LgorICogQHBhcmFtIGN5IHZlcnRpY2FsIGNlbnRlciBvZmZzZXQsIHJlbGF0aXZlIHRvIG9iamVj
dCAoaC8yIGlzIG1pZGRsZSkuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2Vz
cywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29t
X3dlYWtfc2V0KEV2YXNfT2JqZWN0KiBvLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFz
X0Nvb3JkIGN5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFf
RkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZB
TFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV93ZWFr
X3NldCwgRUlOQV9GQUxTRSk7CisgICAgaWYgKHpvb20gPCBaT09NX01JTikgeworICAgICAgICBX
Uk4oInpvb20gbGV2ZWwgaXMgPCAlZiA6ICVmIiwgKGRvdWJsZSlaT09NX01JTiwgKGRvdWJsZSl6
b29tKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorICAgIGlmICh6b29tID4g
Wk9PTV9NQVgpIHsKKyAgICAgICAgV1JOKCJ6b29tIGxldmVsIGlzID4gJWYgOiAlZiIsIChkb3Vi
bGUpWk9PTV9NQVgsIChkb3VibGUpem9vbSk7CisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOwor
ICAgIH0KKworICAgIGlmIChjeCA+PSBzZC0+dmlldy53KQorICAgICAgICBjeCA9IHNkLT52aWV3
LncgLSAxOworICAgIGlmIChjeSA+PSBzZC0+dmlldy5oKQorICAgICAgICBjeSA9IHNkLT52aWV3
LmggLSAxOworICAgIGlmIChjeCA8IDApCisgICAgICAgIGN4ID0gMDsKKyAgICBpZiAoY3kgPCAw
KQorICAgICAgICBjeSA9IDA7CisKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0g
ZXdrX2ZyYW1lX3pvb21fZ2V0KHNkLT5tYWluX2ZyYW1lKTsKKyAgICBzZC0+YW5pbWF0ZWRfem9v
bS56b29tLmVuZCA9IHpvb207CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50ID0g
em9vbTsKKyAgICByZXR1cm4gc2QtPmFwaS0+em9vbV93ZWFrX3NldChzZCwgem9vbSwgY3gsIGN5
KTsKK30KKworLyoqCisgKiBNYXJrIGludGVybmFsIHpvb20gYW5pbWF0aW9uIHN0YXRlIHRvIGdp
dmVuIHpvb20uCisgKgorICogVGhpcyBkb2VzIG5vdCBtb2RpZnkgYW55IGFjdHVhbCB6b29tIGlu
IFdlYktpdCBvciBiYWNraW5nIHN0b3JlLAorICoganVzdCBzZXQgdGhlIEV3a19WaWV3X1NtYXJ0
X0RhdGEtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCBzbworICogc3ViLWNsYXNzZXMgd2lsbCBr
bm93IHRoZXkgc2hvdWxkIG5vdCByZXNldCB0aGVpciBpbnRlcm5hbCBzdGF0ZS4KKyAqCisgKiBA
cGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGFuZ2UgdmFsdWUuCisgKiBAcGFyYW0gem9vbSBuZXcg
c3RhcnQgdmFsdWUuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMg
RUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVk
X3NldCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fd2Vha19zZXQoKQorICogQHNlZSBld2tfdmll
d196b29tX2FuaW1hdGVkX21hcmtfc3RvcCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0
ZWRfbWFya19lbmQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfY3VycmVu
dCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfc3RhcnQoRXZh
c19PYmplY3QqIG8sIGZsb2F0IHpvb20pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCA9
IHpvb207CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBNYXJrIGludGVybmFs
IHpvb20gYW5pbWF0aW9uIHN0YXRlIHRvIGdpdmVuIHpvb20uCisgKgorICogVGhpcyBkb2VzIG5v
dCBtb2RpZnkgYW55IGFjdHVhbCB6b29tIGluIFdlYktpdCBvciBiYWNraW5nIHN0b3JlLAorICog
anVzdCBzZXQgdGhlIEV3a19WaWV3X1NtYXJ0X0RhdGEtPmFuaW1hdGVkX3pvb20uem9vbS5lbmQg
c28KKyAqIHN1Yi1jbGFzc2VzIHdpbGwga25vdyB0aGV5IHNob3VsZCBub3QgcmVzZXQgdGhlaXIg
aW50ZXJuYWwgc3RhdGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gY2hhbmdlIHZh
bHVlLgorICogQHBhcmFtIHpvb20gbmV3IGVuZCB2YWx1ZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJ
TkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAc2Vl
IGV3a192aWV3X3pvb21fYW5pbWF0ZWRfc2V0KCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV93ZWFr
X3NldCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKCkKKyAqIEBz
ZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0YXJ0KCkKKyAqIEBzZWUgZXdrX3ZpZXdf
em9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfem9v
bV9hbmltYXRlZF9tYXJrX2VuZChFdmFzX09iamVjdCogbywgZmxvYXQgem9vbSkKK3sKKyAgICBF
V0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBzZC0+YW5p
bWF0ZWRfem9vbS56b29tLmVuZCA9IHpvb207CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKwor
LyoqCisgKiBNYXJrIGludGVybmFsIHpvb20gYW5pbWF0aW9uIHN0YXRlIHRvIGdpdmVuIHpvb20u
CisgKgorICogVGhpcyBkb2VzIG5vdCBtb2RpZnkgYW55IGFjdHVhbCB6b29tIGluIFdlYktpdCBv
ciBiYWNraW5nIHN0b3JlLAorICoganVzdCBzZXQgdGhlIEV3a19WaWV3X1NtYXJ0X0RhdGEtPmFu
aW1hdGVkX3pvb20uem9vbS5jdXJyZW50IHNvCisgKiBzdWItY2xhc3NlcyB3aWxsIGtub3cgdGhl
eSBzaG91bGQgbm90IHJlc2V0IHRoZWlyIGludGVybmFsIHN0YXRlLgorICoKKyAqIEBwYXJhbSBv
IHZpZXcgb2JqZWN0IHRvIGNoYW5nZSB2YWx1ZS4KKyAqIEBwYXJhbSB6b29tIG5ldyBjdXJyZW50
IHZhbHVlLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFf
RkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9zZXQo
KQorICogQHNlZSBld2tfdmlld196b29tX3dlYWtfc2V0KCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9v
bV9hbmltYXRlZF9tYXJrX3N0b3AoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21h
cmtfc3RhcnQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKCkKKyAq
LworRWluYV9Cb29sIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19jdXJyZW50KEV2YXNfT2Jq
ZWN0KiBvLCBmbG9hdCB6b29tKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywg
c2QsIEVJTkFfRkFMU0UpOworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uY3VycmVudCA9IHpv
b207CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBVbm1hcmsgaW50ZXJuYWwg
em9vbSBhbmltYXRpb24gc3RhdGUuCisgKgorICogVGhpcyB6ZXJvIGFsbCBzdGFydCwgZW5kIGFu
ZCBjdXJyZW50IHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBtYXJrIGFz
IGFuaW1hdGVkIGlzIHN0b3BwZWQuCisgKgorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVk
X21hcmtfc3RhcnQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKCkK
KyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoKQorICogQHNlZSBl
d2tfdmlld196b29tX3dlYWtfc2V0KCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fYW5p
bWF0ZWRfbWFya19zdG9wKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIF9ld2tfdmlld196b29tX2FuaW1hdGVk
X21hcmtfc3RvcChzZCk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBTZXQg
dGhlIGN1cnJlbnQgem9vbSBsZXZlbCB3aGlsZSBhbmltYXRpbmcuCisgKgorICogSWYgdGhlIHZp
ZXcgd2FzIGFscmVhZHkgYW5pbWF0aW5nIHRvIGFub3RoZXIgem9vbSwgaXQgd2lsbCBzdGFydAor
ICogZnJvbSBjdXJyZW50IHBvaW50IHRvIHRoZSBuZXh0IHByb3ZpZGVkIHpvb20gKEBhIHpvb20g
cGFyYW1ldGVyKQorICogYW5kIGR1cmF0aW9uIChAYSBkdXJhdGlvbiBwYXJhbWV0ZXIpLgorICoK
KyAqIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIHdheSB0byBkbyB0cmFuc2l0aW9ucyBmcm9tIG9u
ZSBsZXZlbCB0bworICogYW5vdGhlci4gSG93ZXZlciwgb25lIG1heSB3aXNoIHRvIGRvIHRob3Nl
IGZyb20gb3V0c2lkZSwgaW4gdGhhdAorICogY2FzZSB1c2UgZXdrX3ZpZXdfem9vbV93ZWFrX3Nl
dCgpIGFuZCBsYXRlciBjb250cm9sIGludGVybWVkaWF0ZQorICogc3RhdGVzIHdpdGggZXdrX3Zp
ZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoKSwKKyAqIGV3a192aWV3X3pvb21fYW5pbWF0
ZWRfbWFya19lbmQoKSBhbmQKKyAqIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKCku
CisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gYW5pbWF0ZS4KKyAqIEBwYXJhbSB6b29t
IGZpbmFsIHpvb20gbGV2ZWwgdG8gdXNlLgorICogQHBhcmFtIGR1cmF0aW9uIHRpbWUgaW4gc2Vj
b25kcyB0aGUgYW5pbWF0aW9uIHNob3VsZCB0YWtlLgorICogQHBhcmFtIGN4IG9mZnNldCBpbnNp
ZGUgb2JqZWN0IHRoYXQgZGVmaW5lcyB6b29tIGNlbnRlci4gMCBpcyBsZWZ0IHNpZGUuCisgKiBA
cGFyYW0gY3kgb2Zmc2V0IGluc2lkZSBvYmplY3QgdGhhdCBkZWZpbmVzIHpvb20gY2VudGVyLiAw
IGlzIHRvcCBzaWRlLgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgYW5pbWF0aW9uIHdpbGwg
YmUgc3RhcnRlZCwgQGMgRUlOQV9GQUxTRSBpZiBub3QKKyAqICAgICAgICAgICAgYmVjYXVzZSB6
b29tIGlzIHRvbyBzbWFsbC9iaWcuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX2FuaW1h
dGVkX3NldChFdmFzX09iamVjdCogbywgZmxvYXQgem9vbSwgZmxvYXQgZHVyYXRpb24sIEV2YXNf
Q29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpCit7CisgICAgZG91YmxlIG5vdzsKKyAgICBFV0tfVklF
V19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklW
X0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09O
XzBfUkVUVVJOX1ZBTChzZC0+YXBpLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8w
X1JFVFVSTl9WQUwoc2QtPmFwaS0+em9vbV93ZWFrX3NldCwgRUlOQV9GQUxTRSk7CisKKyAgICBp
ZiAoem9vbSA8IFpPT01fTUlOKSB7CisgICAgICAgIFdSTigiem9vbSBsZXZlbCBpcyA8ICVmIDog
JWYiLCAoZG91YmxlKVpPT01fTUlOLCAoZG91YmxlKXpvb20pOworICAgICAgICByZXR1cm4gRUlO
QV9GQUxTRTsKKyAgICB9CisgICAgaWYgKHpvb20gPiBaT09NX01BWCkgeworICAgICAgICBXUk4o
Inpvb20gbGV2ZWwgaXMgPiAlZiA6ICVmIiwgKGRvdWJsZSlaT09NX01BWCwgKGRvdWJsZSl6b29t
KTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHByaXYtPmFu
aW1hdGVkX3pvb20uYW5pbWF0b3IpCisgICAgICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5z
dGFydCA9IF9ld2tfdmlld196b29tX2FuaW1hdGVkX2N1cnJlbnQocHJpdik7CisgICAgZWxzZSB7
CisgICAgICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCA9IGV3a19mcmFtZV96b29t
X2dldChzZC0+bWFpbl9mcmFtZSk7CisgICAgICAgIF9ld2tfdmlld196b29tX2FuaW1hdGlvbl9z
dGFydChzZCk7CisgICAgfQorCisgICAgaWYgKGN4IDwgMCkKKyAgICAgICAgY3ggPSAwOworICAg
IGlmIChjeSA8IDApCisgICAgICAgIGN5ID0gMDsKKworICAgIG5vdyA9IGVjb3JlX2xvb3BfdGlt
ZV9nZXQoKTsKKyAgICBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuc3RhcnQgPSBub3c7CisgICAg
cHJpdi0+YW5pbWF0ZWRfem9vbS50aW1lLmVuZCA9IG5vdyArIGR1cmF0aW9uOworICAgIHByaXYt
PmFuaW1hdGVkX3pvb20udGltZS5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIHByaXYtPmFuaW1h
dGVkX3pvb20uem9vbS5lbmQgPSB6b29tOworICAgIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5y
YW5nZSA9IChwcml2LT5hbmltYXRlZF96b29tLnpvb20uZW5kIC0gcHJpdi0+YW5pbWF0ZWRfem9v
bS56b29tLnN0YXJ0KTsKKyAgICBwcml2LT5hbmltYXRlZF96b29tLmNlbnRlci54ID0gY3g7Cisg
ICAgcHJpdi0+YW5pbWF0ZWRfem9vbS5jZW50ZXIueSA9IGN5OworICAgIHNkLT5hbmltYXRlZF96
b29tLnpvb20uY3VycmVudCA9IHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydDsKKyAgICBz
ZC0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0gcHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnN0
YXJ0OworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uZW5kID0gcHJpdi0+YW5pbWF0ZWRfem9v
bS56b29tLmVuZDsKKworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogUXVlcnkg
aWYgem9vbSBsZXZlbCBqdXN0IGFwcGxpZXMgdG8gdGV4dCBhbmQgbm90IG90aGVyIGVsZW1lbnRz
LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgdG8gcXVlcnkgc2V0dGluZy4KKyAqCisgKiBAcmV0dXJu
IEBjIEVJTkFfVFJVRSBpZiBqdXN0IHRleHQgYXJlIHNjYWxlZCwgQGMgRUlOQV9GQUxTRSBvdGhl
cndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX3RleHRfb25seV9nZXQoY29uc3Qg
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV96b29tX3RleHRfb25seV9nZXQoc2Qt
Pm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIFNldCBpZiB6b29tIGxldmVsIGp1c3QgYXBwbGll
cyB0byB0ZXh0IGFuZCBub3Qgb3RoZXIgZWxlbWVudHMuCisgKgorICogQHBhcmFtIG8gdmlldyB0
byBjaGFuZ2Ugc2V0dGluZy4KKyAqIEBwYXJhbSBzZXR0aW5nIEBjIEVJTkFfVFJVRSBpZiB6b29t
IHNob3VsZCBqdXN0IGJlIGFwcGxpZWQgdG8gdGV4dC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFf
VFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29s
IGV3a192aWV3X3pvb21fdGV4dF9vbmx5X3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIHNl
dHRpbmcpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxT
RSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV96b29tX3RleHRfb25seV9zZXQoc2QtPm1haW5fZnJh
bWUsIHNldHRpbmcpOworfQorCisvKioKKyAqIEhpbnQgZW5naW5lIHRvIHByZS1yZW5kZXIgcmVn
aW9uLgorICoKKyAqIEVuZ2luZXMgYW5kIGJhY2tpbmcgc3RvcmUgbWlnaHQgYmUgYWJsZSB0byBw
cmUtcmVuZGVyIHJlZ2lvbnMgaW4KKyAqIG9yZGVyIHRvIHNwZWVkIHVwIHpvb21pbmcgb3Igc2Ny
b2xsaW5nIHRvIHRoYXQgcmVnaW9uLiBOb3QgYWxsCisgKiBlbmdpbmVzIG1pZ2h0IGltcGxlbWVu
dCB0aGF0IGFuZCB0aGV5IHdpbGwgcmV0dXJuIEBjIEVJTkFfRkFMU0UKKyAqIGluIHRoYXQgY2Fz
ZS4KKyAqCisgKiBUaGUgZ2l2ZW4gcmVnaW9uIGlzIGEgaGludC4gRW5naW5lcyBtaWdodCBkbyBi
aWdnZXIgb3Igc21hbGxlciBhcmVhCisgKiB0aGF0IGNvdmVycyB0aGF0IHJlZ2lvbi4gUHJlLXJl
bmRlciBtaWdodCBub3QgYmUgaW1tZWRpYXRlLCBpdCBtYXkKKyAqIGJlIHBvc3Rwb25lZCB0byBh
IHRocmVhZCwgb3BlcmF0ZWQgY29vcGVyYXRpdmVseSBpbiB0aGUgbWFpbiBsb29wCisgKiBhbmQg
bWF5IGJlIGV2ZW4gaWdub3JlZCBvciBjYW5jZWxsZWQgYWZ0ZXJ3YXJkcy4KKyAqCisgKiBNdWx0
aXBsZSByZXF1ZXN0cyBtaWdodCBiZSBxdWV1ZWQgYnkgZW5naW5lcy4gT25lIGNhbiBjbGVhci9m
b3JnZXQKKyAqIGFib3V0IHRoZW0gd2l0aCBld2tfdmlld19wcmVfcmVuZGVyX2NhbmNlbCgpLgor
ICoKKyAqIEBwYXJhbSBvIHZpZXcgdG8gYXNrIHByZS1yZW5kZXIgb2YgZ2l2ZW4gcmVnaW9uLgor
ICogQHBhcmFtIHggYWJzb2x1dGUgY29vcmRpbmF0ZSAoMD1sZWZ0KSB0byBwcmUtcmVuZGVyIGF0
IHpvb20uCisgKiBAcGFyYW0geSBhYnNvbHV0ZSBjb29yZGluYXRlICgwPXRvcCkgdG8gcHJlLXJl
bmRlciBhdCB6b29tLgorICogQHBhcmFtIHcgd2lkdGggdG8gcHJlLXJlbmRlciBzdGFydGluZyBm
cm9tIEBhIHggYXQgem9vbS4KKyAqIEBwYXJhbSBoIGhlaWdodCB0byBwcmUtcmVuZGVyIHN0YXJ0
aW5nIGZyb20gQGEgeSBhdCB6b29tLgorICogQHBhcmFtIHpvb20gZGVzaXJlZCB6b29tLgorICoK
KyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIHJlcXVlc3Qgd2FzIGFjY2VwdGVkLCBAYyBFSU5B
X0ZBTFNFCisgKiAgICAgICAgIG90aGVyd2lzZSAoZXJyb3JzLCBwcmUtcmVuZGVyIG5vdCBzdXBw
b3J0ZWQsIGV0YykuCisgKgorICogQHNlZSBld2tfdmlld19wcmVfcmVuZGVyX2NhbmNlbCgpCisg
Ki8KK0VpbmFfQm9vbCBld2tfdmlld19wcmVfcmVuZGVyX3JlZ2lvbihFdmFzX09iamVjdCogbywg
RXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoLCBm
bG9hdCB6b29tKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFf
RkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChzZC0+YXBpLT5wcmVfcmVu
ZGVyX3JlZ2lvbiwgRUlOQV9GQUxTRSk7CisgICAgZmxvYXQgY3VyX3pvb20gPSBld2tfZnJhbWVf
em9vbV9nZXQoc2QtPm1haW5fZnJhbWUpOworICAgIEV2YXNfQ29vcmQgY3csIGNoOworCisgICAg
aWYgKGN1cl96b29tIDwgMC4wMDAwMSkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAg
aWYgKCFld2tfZnJhbWVfY29udGVudHNfc2l6ZV9nZXQoc2QtPm1haW5fZnJhbWUsICZjdywgJmNo
KSkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICBjdyAqPSB6b29tIC8gY3VyX3pv
b207CisgICAgY2ggKj0gem9vbSAvIGN1cl96b29tOworICAgIERCRygicmVnaW9uICVkLCVkKyVk
eCVkIEAgJWYgY29udGVudHM9JWR4JWQiLCB4LCB5LCB3LCBoLCB6b29tLCBjdywgY2gpOworCisg
ICAgaWYgKHggKyB3ID4gY3cpCisgICAgICAgIHcgPSBjdyAtIHg7CisKKyAgICBpZiAoeSArIGgg
PiBjaCkKKyAgICAgICAgaCA9IGNoIC0geTsKKworICAgIGlmICh4IDwgMCkgeworICAgICAgICB3
ICs9IHg7CisgICAgICAgIHggPSAwOworICAgIH0KKyAgICBpZiAoeSA8IDApIHsKKyAgICAgICAg
aCArPSB5OworICAgICAgICB5ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gc2QtPmFwaS0+cHJl
X3JlbmRlcl9yZWdpb24oc2QsIHgsIHksIHcsIGgsIHpvb20pOworfQorCisvKioKKyAqIENhbmNl
bCAoY2xlYXIpIHByZXZpb3VzIHByZS1yZW5kZXIgcmVxdWVzdHMuCisgKgorICogQHBhcmFtIG8g
dmlldyB0byBjbGVhciBwcmUtcmVuZGVyIHJlcXVlc3RzLgorICovCit2b2lkIGV3a192aWV3X3By
ZV9yZW5kZXJfY2FuY2VsKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNkLT5hcGktPnBy
ZV9yZW5kZXJfY2FuY2VsKTsKKyAgICBzZC0+YXBpLT5wcmVfcmVuZGVyX2NhbmNlbChzZCk7Cit9
CisKK2NvbnN0IGNoYXIqIGV3a192aWV3X3NldHRpbmdfdXNlcl9hZ2VudF9nZXQoY29uc3QgRXZh
c19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7
CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1
cm4gcHJpdi0+c2V0dGluZ3MudXNlcl9hZ2VudDsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3Nl
dHRpbmdfdXNlcl9hZ2VudF9zZXQoRXZhc19PYmplY3QqIG8sIGNvbnN0IGNoYXIqIHVzZXJfYWdl
bnQpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7
CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsK
KyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy51c2VyX2Fn
ZW50LCB1c2VyX2FnZW50KSkgeworICAgICAgICBXZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudEVm
bCogY2xpZW50ID0gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRFZmwqPihw
cml2LT5tYWluX2ZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCkpOworICAgICAgICBjbGllbnQtPnNl
dEN1c3RvbVVzZXJBZ2VudChXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KHVzZXJfYWdlbnQpKTsK
KyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworY29uc3QgY2hhciogZXdrX3ZpZXdf
c2V0dGluZ191c2VyX3N0eWxlc2hlZXRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZf
R0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLnVz
ZXJfc3R5bGVzaGVldDsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfdXNlcl9zdHls
ZXNoZWV0X3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogdXJpKQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BS
SVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3Ry
aW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MudXNlcl9zdHlsZXNoZWV0LCB1cmkpKSB7
CisgICAgICAgIFdlYkNvcmU6OktVUkwga3VybChXZWJDb3JlOjpLVVJMKCksIFdlYkNvcmU6OlN0
cmluZzo6ZnJvbVVURjgodXJpKSk7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFVz
ZXJTdHlsZVNoZWV0TG9jYXRpb24oa3VybCk7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7
Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2F1dG9fbG9hZF9pbWFnZXNfZ2V0KGNv
bnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywg
c2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJp
diwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmF1dG9fbG9hZF9pbWFn
ZXM7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2F1dG9fbG9hZF9pbWFnZXNfc2V0
KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgYXV0b21hdGljKQoreworICAgIEVXS19WSUVXX1NE
X0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VU
X09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgYXV0b21hdGljID0gISFhdXRv
bWF0aWM7CisgICAgaWYgKHByaXYtPnNldHRpbmdzLmF1dG9fbG9hZF9pbWFnZXMgIT0gYXV0b21h
dGljKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldExvYWRzSW1hZ2VzQXV0b21h
dGljYWxseShhdXRvbWF0aWMpOworICAgICAgICBwcml2LT5zZXR0aW5ncy5hdXRvX2xvYWRfaW1h
Z2VzID0gYXV0b21hdGljOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitFaW5h
X0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19hdXRvX3Nocmlua19pbWFnZXNfZ2V0KGNvbnN0IEV2YXNf
T2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFf
RkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9G
QUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmF1dG9fc2hyaW5rX2ltYWdlczsKK30K
KworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfYXV0b19zaHJpbmtfaW1hZ2VzX3NldChFdmFz
X09iamVjdCogbywgRWluYV9Cb29sIGF1dG9tYXRpYykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGF1dG9tYXRpYyA9ICEhYXV0b21hdGlj
OworICAgIGlmIChwcml2LT5zZXR0aW5ncy5hdXRvX3Nocmlua19pbWFnZXMgIT0gYXV0b21hdGlj
KSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFNocmlua3NTdGFuZGFsb25lSW1h
Z2VzVG9GaXQoYXV0b21hdGljKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuYXV0b19zaHJpbmtf
aW1hZ2VzID0gYXV0b21hdGljOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitF
aW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfc2NyaXB0c19nZXQoY29uc3QgRXZhc19P
YmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9G
QUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZB
TFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZW5hYmxlX3NjcmlwdHM7Cit9CisKK0Vp
bmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX3NldChFdmFzX09iamVjdCog
bywgRWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8s
IHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIEVJTkFfRkFMU0UpOworICAgIGVuYWJsZSA9ICEhZW5hYmxlOworICAgIGlmIChwcml2LT5z
ZXR0aW5ncy5lbmFibGVfc2NyaXB0cyAhPSBlbmFibGUpIHsKKyAgICAgICAgcHJpdi0+cGFnZV9z
ZXR0aW5ncy0+c2V0SmF2YVNjcmlwdEVuYWJsZWQoZW5hYmxlKTsKKyAgICAgICAgcHJpdi0+c2V0
dGluZ3MuZW5hYmxlX3NjcmlwdHMgPSBlbmFibGU7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RS
VUU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVnaW5zX2dldChj
b25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8s
IHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5lbmFibGVfcGx1Z2lu
czsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNfc2V0KEV2
YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgZW5hYmxlKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JF
VFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgZW5hYmxlID0gISFlbmFibGU7CisgICAg
aWYgKHByaXYtPnNldHRpbmdzLmVuYWJsZV9wbHVnaW5zICE9IGVuYWJsZSkgeworICAgICAgICBw
cml2LT5wYWdlX3NldHRpbmdzLT5zZXRQbHVnaW5zRW5hYmxlZChlbmFibGUpOworICAgICAgICBw
cml2LT5zZXR0aW5ncy5lbmFibGVfcGx1Z2lucyA9IGVuYWJsZTsKKyAgICB9CisgICAgcmV0dXJu
IEVJTkFfVFJVRTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfc2NyaXB0c193aW5k
b3dfb3Blbl9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3Mu
c2NyaXB0c193aW5kb3dfb3BlbjsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfc2Ny
aXB0c193aW5kb3dfb3Blbl9zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCBhbGxvdykKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGFs
bG93ID0gISFhbGxvdzsKKyAgICBpZiAocHJpdi0+c2V0dGluZ3Muc2NyaXB0c193aW5kb3dfb3Bl
biAhPSBhbGxvdykgeworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRKYXZhU2NyaXB0
Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KGFsbG93KTsKKyAgICAgICAgcHJpdi0+c2V0dGlu
Z3Muc2NyaXB0c193aW5kb3dfb3BlbiA9IGFsbG93OworICAgIH0KKyAgICByZXR1cm4gRUlOQV9U
UlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19yZXNpemFibGVfdGV4dGFyZWFz
X2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4o
c2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5yZXNpemFi
bGVfdGV4dGFyZWFzOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19yZXNpemFibGVf
dGV4dGFyZWFzX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBF
V0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklF
V19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGVuYWJsZSA9
ICEhZW5hYmxlOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5yZXNpemFibGVfdGV4dGFyZWFzICE9
IGVuYWJsZSkgeworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRUZXh0QXJlYXNBcmVS
ZXNpemFibGUoZW5hYmxlKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MucmVzaXphYmxlX3RleHRh
cmVhcyA9IGVuYWJsZTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworRWluYV9C
b29sIGV3a192aWV3X3NldHRpbmdfcHJpdmF0ZV9icm93c2luZ19nZXQoY29uc3QgRXZhc19PYmpl
Y3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxT
RSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNF
KTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MucHJpdmF0ZV9icm93c2luZzsKK30KKworRWlu
YV9Cb29sIGV3a192aWV3X3NldHRpbmdfcHJpdmF0ZV9icm93c2luZ19zZXQoRXZhc19PYmplY3Qq
IG8sIEVpbmFfQm9vbCBlbmFibGUpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihv
LCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBw
cml2LCBFSU5BX0ZBTFNFKTsKKyAgICBlbmFibGUgPSAhIWVuYWJsZTsKKyAgICBpZiAocHJpdi0+
c2V0dGluZ3MucHJpdmF0ZV9icm93c2luZyAhPSBlbmFibGUpIHsKKyAgICAgICAgcHJpdi0+cGFn
ZV9zZXR0aW5ncy0+c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChlbmFibGUpOworICAgICAgICBw
cml2LT5zZXR0aW5ncy5wcml2YXRlX2Jyb3dzaW5nID0gZW5hYmxlOworICAgIH0KKyAgICByZXR1
cm4gRUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19jYXJldF9icm93
c2luZ19nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVU
VVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuY2Fy
ZXRfYnJvd3Npbmc7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2NhcmV0X2Jyb3dz
aW5nX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBFV0tfVklF
V19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklW
X0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGVuYWJsZSA9ICEhZW5h
YmxlOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5jYXJldF9icm93c2luZyAhPSBlbmFibGUpIHsK
KyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0Q2FyZXRCcm93c2luZ0VuYWJsZWQoZW5h
YmxlKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuY2FyZXRfYnJvd3NpbmcgPSBlbmFibGU7Cisg
ICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogR2V0IGN1cnJlbnQgZW5j
b2Rpbmcgb2YgdGhpcyBWaWV3LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKgorICogQHJldHVy
biBBIHBvaW50ZXIgdG8gYW4gZWluYV9zdHJpbnNoYXJlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQg
Y3VzdG9tCisgKiBlbmNvZGluZyBmb3IgVmlldyBvYmplY3QgQHBhcmFtIG8sIG9yIEBjIDAgaWYg
aXQncyBub3Qgc2V0LgorICovCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0aW5nX2VuY29kaW5n
X2N1c3RvbV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2LCAwKTsKKyAgICBFdmFzX09iamVjdCogbWFpbl9mcmFtZSA9IGV3a192aWV3X2ZyYW1l
X21haW5fZ2V0KG8pOworICAgIFdlYkNvcmU6OkZyYW1lKiBjb3JlX2ZyYW1lID0gZXdrX2ZyYW1l
X2NvcmVfZ2V0KG1haW5fZnJhbWUpOworCisgICAgV2ViQ29yZTo6U3RyaW5nIG92ZXJyaWRlRW5j
b2RpbmcgPSBjb3JlX2ZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+b3ZlcnJpZGVF
bmNvZGluZygpOworCisgICAgaWYgKG92ZXJyaWRlRW5jb2RpbmcuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGlu
Z3MuZW5jb2RpbmdfY3VzdG9tLCBvdmVycmlkZUVuY29kaW5nLnV0ZjgoKS5kYXRhKCkpOworICAg
IHJldHVybiBwcml2LT5zZXR0aW5ncy5lbmNvZGluZ19jdXN0b207Cit9CisKKy8qKgorICogU2V0
IGVuY29kaW5nIG9mIHRoaXMgVmlldyBhbmQgcmVsb2FkIHBhZ2UuCisgKgorICogQHBhcmFtIG8g
Vmlldy4KKyAqIEBwYXJhbSBlbmNvZGluZyBUaGUgbmV3IGVuY29kaW5nIG9yIEBjIDAgdG8gcmVz
dG9yZSB0aGUgZGVmYXVsdCBlbmNvZGluZy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBv
biBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192
aWV3X3NldHRpbmdfZW5jb2RpbmdfY3VzdG9tX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hh
ciAqZW5jb2RpbmcpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlO
QV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5B
X0ZBTFNFKTsKKyAgICBFdmFzX09iamVjdCogbWFpbl9mcmFtZSA9IGV3a192aWV3X2ZyYW1lX21h
aW5fZ2V0KG8pOworICAgIFdlYkNvcmU6OkZyYW1lKiBjb3JlX2ZyYW1lID0gZXdrX2ZyYW1lX2Nv
cmVfZ2V0KG1haW5fZnJhbWUpOworREJHKCIlcyIsIGVuY29kaW5nKTsKKyAgICBlaW5hX3N0cmlu
Z3NoYXJlX3JlcGxhY2UoJnByaXYtPnNldHRpbmdzLmVuY29kaW5nX2N1c3RvbSwgZW5jb2Rpbmcp
OworICAgIGNvcmVfZnJhbWUtPmxvYWRlcigpLT5yZWxvYWRXaXRoT3ZlcnJpZGVFbmNvZGluZyhX
ZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGVuY29kaW5nKSk7CisKKyAgICByZXR1cm4gRUlOQV9U
UlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2RlZmF1bHRf
Z2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRV
Uk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
MCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmVuY29kaW5nX2RlZmF1bHQ7Cit9CisKK0Vp
bmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2RlZmF1bHRfc2V0KEV2YXNfT2JqZWN0
KiBvLCBjb25zdCBjaGFyKiBlbmNvZGluZykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4o
c2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlmIChlaW5hX3N0cmluZ3NoYXJlX3JlcGxhY2Uo
JnByaXYtPnNldHRpbmdzLmVuY29kaW5nX2RlZmF1bHQsIGVuY29kaW5nKSkKKyAgICAgICAgcHJp
di0+cGFnZV9zZXR0aW5ncy0+c2V0RGVmYXVsdFRleHRFbmNvZGluZ05hbWUoV2ViQ29yZTo6U3Ry
aW5nOjpmcm9tVVRGOChlbmNvZGluZykpOworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK2lu
dCBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9zaXplX2dldChjb25zdCBFdmFzX09iamVj
dCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2
LT5zZXR0aW5ncy5mb250X21pbmltdW1fc2l6ZTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3Nl
dHRpbmdfZm9udF9taW5pbXVtX3NpemVfc2V0KEV2YXNfT2JqZWN0KiBvLCBpbnQgc2l6ZSkKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlm
IChwcml2LT5zZXR0aW5ncy5mb250X21pbmltdW1fc2l6ZSAhPSBzaXplKSB7CisgICAgICAgIHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPnNldE1pbmltdW1Gb250U2l6ZShzaXplKTsKKyAgICAgICAgcHJp
di0+c2V0dGluZ3MuZm9udF9taW5pbXVtX3NpemUgPSBzaXplOworICAgIH0KKyAgICByZXR1cm4g
RUlOQV9UUlVFOworfQorCitpbnQgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fbG9naWNh
bF9zaXplX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2Qs
IHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X21pbmltdW1fbG9naWNh
bF9zaXplOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fbG9n
aWNhbF9zaXplX3NldChFdmFzX09iamVjdCogbywgaW50IHNpemUpCit7CisgICAgRVdLX1ZJRVdf
U0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9H
RVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAocHJpdi0+c2V0dGlu
Z3MuZm9udF9taW5pbXVtX2xvZ2ljYWxfc2l6ZSAhPSBzaXplKSB7CisgICAgICAgIHByaXYtPnBh
Z2Vfc2V0dGluZ3MtPnNldE1pbmltdW1Mb2dpY2FsRm9udFNpemUoc2l6ZSk7CisgICAgICAgIHBy
aXYtPnNldHRpbmdzLmZvbnRfbWluaW11bV9sb2dpY2FsX3NpemUgPSBzaXplOworICAgIH0KKyAg
ICByZXR1cm4gRUlOQV9UUlVFOworfQorCitpbnQgZXdrX3ZpZXdfc2V0dGluZ19mb250X2RlZmF1
bHRfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9kZWZhdWx0X3NpemU7
Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2ZvbnRfZGVmYXVsdF9zaXplX3NldChF
dmFzX09iamVjdCogbywgaW50IHNpemUpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAocHJpdi0+c2V0dGluZ3MuZm9udF9kZWZhdWx0
X3NpemUgIT0gc2l6ZSkgeworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXREZWZhdWx0
Rm9udFNpemUoc2l6ZSk7CisgICAgICAgIHByaXYtPnNldHRpbmdzLmZvbnRfZGVmYXVsdF9zaXpl
ID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworaW50IGV3a192aWV3
X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7
CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGlu
Z3MuZm9udF9tb25vc3BhY2Vfc2l6ZTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdf
Zm9udF9tb25vc3BhY2Vfc2l6ZV9zZXQoRXZhc19PYmplY3QqIG8sIGludCBzaXplKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKHBy
aXYtPnNldHRpbmdzLmZvbnRfbW9ub3NwYWNlX3NpemUgIT0gc2l6ZSkgeworICAgICAgICBwcml2
LT5wYWdlX3NldHRpbmdzLT5zZXREZWZhdWx0Rml4ZWRGb250U2l6ZShzaXplKTsKKyAgICAgICAg
cHJpdi0+c2V0dGluZ3MuZm9udF9tb25vc3BhY2Vfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJl
dHVybiBFSU5BX1RSVUU7Cit9CisKK2NvbnN0IGNoYXIqIGV3a192aWV3X3NldHRpbmdfZm9udF9z
dGFuZGFyZF9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNk
LCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9zdGFuZGFyZDsKK30K
KworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFyZF9zZXQoRXZhc19PYmpl
Y3QqIG8sIGNvbnN0IGNoYXIqIGZhbWlseSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4o
c2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlmIChlaW5hX3N0cmluZ3NoYXJlX3JlcGxhY2Uo
JnByaXYtPnNldHRpbmdzLmZvbnRfc3RhbmRhcmQsIGZhbWlseSkpIHsKKyAgICAgICAgV2ViQ29y
ZTo6QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZhbWlseSk7Cisg
ICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFN0YW5kYXJkRm9udEZhbWlseShzKTsKKyAg
ICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworY29uc3QgY2hhciogZXdrX3ZpZXdfc2V0
dGluZ19mb250X2N1cnNpdmVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09S
X1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmZvbnRfY3Vy
c2l2ZTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9jdXJzaXZlX3NldChF
dmFzX09iamVjdCogbywgY29uc3QgY2hhciogZmFtaWx5KQoreworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09S
X1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVf
cmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZm9udF9jdXJzaXZlLCBmYW1pbHkpKSB7CisgICAgICAg
IFdlYkNvcmU6OkF0b21pY1N0cmluZyBzID0gV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChmYW1p
bHkpOworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRDdXJzaXZlRm9udEZhbWlseShz
KTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworY29uc3QgY2hhciogZXdrX3Zp
ZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZf
R0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmZv
bnRfZmFudGFzeTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9mYW50YXN5
X3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogZmFtaWx5KQoreworICAgIEVXS19WSUVX
X1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZf
R0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5n
c2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZm9udF9mYW50YXN5LCBmYW1pbHkpKSB7Cisg
ICAgICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzID0gV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRG
OChmYW1pbHkpOworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRGYW50YXN5Rm9udEZh
bWlseShzKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworY29uc3QgY2hhciog
ZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8p
Cit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJ
RVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0
dGluZ3MuZm9udF9tb25vc3BhY2U7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2Zv
bnRfbW9ub3NwYWNlX3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogZmFtaWx5KQorewor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVX
S19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYg
KGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZm9udF9tb25vc3BhY2Us
IGZhbWlseSkpIHsKKyAgICAgICAgV2ViQ29yZTo6QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpT
dHJpbmc6OmZyb21VVEY4KGZhbWlseSk7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNl
dEZpeGVkRm9udEZhbWlseShzKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKwor
Y29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ19mb250X3NlcmlmX2dldChjb25zdCBFdmFzX09i
amVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAg
ICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBw
cml2LT5zZXR0aW5ncy5mb250X3NlcmlmOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGlu
Z19mb250X3NlcmlmX3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogZmFtaWx5KQorewor
ICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVX
S19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYg
KGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZm9udF9zZXJpZiwgZmFt
aWx5KSkgeworICAgICAgICBXZWJDb3JlOjpBdG9taWNTdHJpbmcgcyA9IFdlYkNvcmU6OlN0cmlu
Zzo6ZnJvbVVURjgoZmFtaWx5KTsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0U2Vy
aWZGb250RmFtaWx5KHMpOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25z
dCBjaGFyKiBld2tfdmlld19zZXR0aW5nX2ZvbnRfc2Fuc19zZXJpZl9nZXQoY29uc3QgRXZhc19P
YmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7Cisg
ICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4g
cHJpdi0+c2V0dGluZ3MuZm9udF9zYW5zX3NlcmlmOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
c2V0dGluZ19mb250X3NhbnNfc2VyaWZfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBm
YW1pbHkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxT
RSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNF
KTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy5mb250
X3NhbnNfc2VyaWYsIGZhbWlseSkpIHsKKyAgICAgICAgV2ViQ29yZTo6QXRvbWljU3RyaW5nIHMg
PSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZhbWlseSk7CisgICAgICAgIHByaXYtPnBhZ2Vf
c2V0dGluZ3MtPnNldFNhbnNTZXJpZkZvbnRGYW1pbHkocyk7CisgICAgfQorICAgIHJldHVybiBF
SU5BX1RSVUU7Cit9CisKKy8qKgorICogU2ltaWxhciB0byBldmFzX29iamVjdF9zbWFydF9kYXRh
X2dldCgpLCBidXQgZG9lcyB0eXBlIGNoZWNraW5nLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2Jq
ZWN0IHRvIHF1ZXJ5IGludGVybmFsIGRhdGEuCisgKiBAcmV0dXJuIGludGVybmFsIGRhdGEgb3Ig
QGMgMCBvbiBlcnJvcnMgKGllOiBpbmNvcnJlY3QgdHlwZSBvZiBAYSBvKS4KKyAqLworRXdrX1Zp
ZXdfU21hcnRfRGF0YSogZXdrX3ZpZXdfc21hcnRfZGF0YV9nZXQoY29uc3QgRXZhc19PYmplY3Qq
IG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgcmV0
dXJuIHNkOworfQorCisvKioKKyAqIEdldHMgdGhlIGludGVybmFsIGFycmF5IG9mIHJlcGFpbnQg
cmVxdWVzdHMuCisgKgorICogVGhpcyBhcnJheSBzaG91bGQgbm90IGJlIG1vZGlmaWVkIGFueWhv
dy4gSXQgc2hvdWxkIGJlIHByb2Nlc3NlZAorICogaW1tZWRpYXRlbHkgYXMgYW55IGZ1cnRoZXIg
ZXdrX3ZpZXcgY2FsbCBtaWdodCBjaGFuZ2UgaXQsIGxpa2UKKyAqIHRob3NlIHRoYXQgYWRkIHJl
cGFpbnRzIG9yIGZsdXNoIHRoZW0sIHNvIGJlIHN1cmUgdGhhdCB5b3VyIGNvZGUKKyAqIGRvZXMg
bm90IGNhbGwgYW55IG9mIHRob3NlIHdoaWxlIHlvdSBwcm9jZXNzIHRoZSByZXBhaW50cywKKyAq
IG90aGVyd2lzZSBjb3B5IHRoZSBhcnJheS4KKyAqCisgKiBAcGFyYW0gcHJpdiBwcml2YXRlIGhh
bmRsZSBwb2ludGVyIG9mIHRoZSB2aWV3IHRvIGdldCByZXBhaW50cy4KKyAqIEBwYXJhbSBjb3Vu
dCB3aGVyZSB0byByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiByZXR1cm5lZCBhcnJh
eS4KKyAqCisgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byBhcnJheSBvZiByZXF1ZXN0ZWQgcmVwYWlu
dHMuCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZv
ciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNr
aW5nIHN0b3JlLgorICovCitjb25zdCBFaW5hX1JlY3RhbmdsZSogZXdrX3ZpZXdfcmVwYWludHNf
Z2V0KGNvbnN0IEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgc2l6ZV90KiBjb3VudCkKK3sK
KyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwoY291bnQsIDApOworICAgIGlmIChjb3Vu
dCkKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwo
cHJpdiwgMCk7CisgICAgaWYgKGNvdW50KQorICAgICAgICAqY291bnQgPSBwcml2LT5yZXBhaW50
cy5jb3VudDsKKyAgICByZXR1cm4gcHJpdi0+cmVwYWludHMuYXJyYXk7Cit9CisKKy8qKgorICog
R2V0cyB0aGUgaW50ZXJuYWwgYXJyYXkgb2Ygc2Nyb2xsIHJlcXVlc3RzLgorICoKKyAqIFRoaXMg
YXJyYXkgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBhbnlob3cuIEl0IHNob3VsZCBiZSBwcm9jZXNz
ZWQKKyAqIGltbWVkaWF0ZWx5IGFzIGFueSBmdXJ0aGVyIGV3a192aWV3IGNhbGwgbWlnaHQgY2hh
bmdlIGl0LCBsaWtlCisgKiB0aG9zZSB0aGF0IGFkZCBzY3JvbGxzIG9yIGZsdXNoIHRoZW0sIHNv
IGJlIHN1cmUgdGhhdCB5b3VyIGNvZGUKKyAqIGRvZXMgbm90IGNhbGwgYW55IG9mIHRob3NlIHdo
aWxlIHlvdSBwcm9jZXNzIHRoZSBzY3JvbGxzLAorICogb3RoZXJ3aXNlIGNvcHkgdGhlIGFycmF5
LgorICoKKyAqIEBwYXJhbSBwcml2IHByaXZhdGUgaGFuZGxlIHBvaW50ZXIgb2YgdGhlIHZpZXcg
dG8gZ2V0IHNjcm9sbHMuCisgKiBAcGFyYW0gY291bnQgd2hlcmUgdG8gcmV0dXJuIHRoZSBudW1i
ZXIgb2YgZWxlbWVudHMgb2YgcmV0dXJuZWQgYXJyYXkuCisgKgorICogQHJldHVybiByZWZlcmVu
Y2UgdG8gYXJyYXkgb2YgcmVxdWVzdGVkIHNjcm9sbHMuCisgKgorICogQG5vdGUgdGhpcyBpcyBu
b3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICog
ICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgorICovCitjb25zdCBFd2tf
U2Nyb2xsX1JlcXVlc3QqIGV3a192aWV3X3Njcm9sbF9yZXF1ZXN0c19nZXQoY29uc3QgRXdrX1Zp
ZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBzaXplX3QqIGNvdW50KQoreworICAgIEVJTkFfU0FGRVRZ
X09OXzBfUkVUVVJOX1ZBTChjb3VudCwgMCk7CisgICAgaWYgKGNvdW50KQorICAgICAgICAqY291
bnQgPSAwOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChwcml2LCAwKTsKKyAgICBp
ZiAoY291bnQpCisgICAgICAgICpjb3VudCA9IHByaXYtPnNjcm9sbHMuY291bnQ7CisgICAgcmV0
dXJuIHByaXYtPnNjcm9sbHMuYXJyYXk7Cit9CisKKy8qKgorICogQWRkIGEgbmV3IHJlcGFpbnQg
cmVxdWVzdCB0byBxdWV1ZS4KKyAqCisgKiBUaGUgcmVwYWludHMgYXJlIGFzc3VtZWQgdG8gYmUg
cmVsYXRpdmUgdG8gY3VycmVudCB2aWV3cG9ydC4KKyAqCisgKiBAcGFyYW0gcHJpdiBwcml2YXRl
IGhhbmRsZSBwb2ludGVyIG9mIHRoZSB2aWV3IHRvIGFkZCByZXBhaW50IHJlcXVlc3QuCisgKiBA
cGFyYW0geCBob3Jpem9udGFsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIGN1cnJlbnQgdmlldyBwb3J0
IChzY3JvbGxlZCkuCisgKiBAcGFyYW0geSB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBj
dXJyZW50IHZpZXcgcG9ydCAoc2Nyb2xsZWQpLgorICogQHBhcmFtIHcgd2lkdGggb2YgYXJlYSB0
byBiZSByZXBhaW50ZWQKKyAqIEBwYXJhbSBoIGhlaWdodCBvZiBhcmVhIHRvIGJlIHJlcGFpbnRl
ZAorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Ig
c3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2lu
ZyBzdG9yZS4KKyAqLwordm9pZCBld2tfdmlld19yZXBhaW50X2FkZChFd2tfVmlld19Qcml2YXRl
X0RhdGEqIHByaXYsIEV2YXNfQ29vcmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2
YXNfQ29vcmQgaCkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTihwcml2KTsKKyAgICBf
ZXdrX3ZpZXdfcmVwYWludF9hZGQocHJpdiwgeCwgeSwgdywgaCk7Cit9CisKKy8qKgorICogRG8g
bGF5b3V0IGlmIHJlcXVpcmVkLCBhcHBsaWVkIHJlY3Vyc2l2ZWx5LgorICoKKyAqIEBwYXJhbSBw
cml2IHByaXZhdGUgaGFuZGxlIHBvaW50ZXIgb2YgdGhlIHZpZXcgdG8gbGF5b3V0LgorICoKKyAq
IEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3Nl
cyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4K
KyAqLwordm9pZCBld2tfdmlld19sYXlvdXRfaWZfbmVlZGVkX3JlY3Vyc2l2ZShFd2tfVmlld19Q
cml2YXRlX0RhdGEqIHByaXYpCit7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4ocHJpdik7
CisKKyAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHYgPSBwcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7
CisgICAgaWYgKCF2KSB7CisgICAgICAgIEVSUigibm8gbWFpbiBmcmFtZSB2aWV3Iik7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgdi0+bGF5b3V0SWZOZWVkZWRSZWN1cnNpdmUoKTsKK30K
Kwordm9pZCBld2tfdmlld19zY3JvbGxzX3Byb2Nlc3MoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2Qp
Cit7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QpOworICAgIEVXS19WSUVXX1BSSVZf
R0VUX09SX1JFVFVSTihzZCwgcHJpdik7CisgICAgaWYgKCFzZC0+YXBpLT5zY3JvbGxzX3Byb2Nl
c3Moc2QpKQorICAgICAgICBFUlIoImZhaWxlZCB0byBwcm9jZXNzIHNjcm9sbHMuIik7CisgICAg
X2V3a192aWV3X3Njcm9sbHNfZmx1c2gocHJpdik7Cit9CisKK3N0cnVjdCBfRXdrX1ZpZXdfUGFp
bnRfQ29udGV4dCB7CisgICAgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KiBnYzsKKyAgICBXZWJD
b3JlOjpGcmFtZVZpZXcqIHZpZXc7CisgICAgY2Fpcm9fdCogY3I7Cit9OworCisvKioKKyAqIENy
ZWF0ZSBhIG5ldyBwYWludCBjb250ZXh0IHVzaW5nIHRoZSB2aWV3IGFzIHNvdXJjZSBhbmQgY2Fp
cm8gYXMgb3V0cHV0LgorICoKKyAqIEBwYXJhbSBwcml2IHByaXZhdGUgaGFuZGxlIHBvaW50ZXIg
b2YgdGhlIHZpZXcgdG8gdXNlIGFzIHBhaW50IHNvdXJjZS4KKyAqIEBwYXJhbSBjciBjYWlybyBj
b250ZXh0IHRvIHVzZSBhcyBwYWludCBkZXN0aW5hdGlvbi4gQSBuZXcKKyAqICAgICAgICByZWZl
cmVuY2UgaXMgdGFrZW4sIHNvIGl0J3Mgc2FmZSB0byBjYWxsIGNhaXJvX2Rlc3Ryb3koKQorICog
ICAgICAgIGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqCisgKiBAcmV0dXJuIG5ld2x5
IGFsbG9jYXRlZCBpbnN0YW5jZSBvciBAYyAwIG9uIGVycm9ycy4KKyAqCisgKiBAbm90ZSB0aGlz
IGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50
CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK0V3a19W
aWV3X1BhaW50X0NvbnRleHQqIGV3a192aWV3X3BhaW50X2NvbnRleHRfbmV3KEV3a19WaWV3X1By
aXZhdGVfRGF0YSogcHJpdiwgY2Fpcm9fdCogY3IpCit7CisgICAgRUlOQV9TQUZFVFlfT05fMF9S
RVRVUk5fVkFMKHByaXYsIDApOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTChjciwg
MCk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk5fVkFMKHByaXYtPm1haW5fZnJhbWUsIDAp
OworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IHByaXYtPm1haW5fZnJhbWUtPnZpZXco
KTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwodmlldywgMCk7CisgICAgRXdrX1Zp
ZXdfUGFpbnRfQ29udGV4dCogY3R4dCA9IChFd2tfVmlld19QYWludF9Db250ZXh0KiltYWxsb2Mo
c2l6ZW9mKCpjdHh0KSk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk5fVkFMKGN0eHQsIDAp
OworCisgICAgY3R4dC0+Z2MgPSBuZXcgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KGNyKTsKKyAg
ICBpZiAoIWN0eHQtPmdjKSB7CisgICAgICAgIGZyZWUoY3R4dCk7CisgICAgICAgIHJldHVybiAw
OworICAgIH0KKyAgICBjdHh0LT52aWV3ID0gdmlldzsKKyAgICBjdHh0LT5jciA9IGNhaXJvX3Jl
ZmVyZW5jZShjcik7CisgICAgcmV0dXJuIGN0eHQ7Cit9CisKKy8qKgorICogRGVzdHJveSBwcmV2
aW91c2x5IGNyZWF0ZWQgcGFpbnQgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gY3R4dCBwYWludCBj
b250ZXh0IHRvIGRlc3Ryb3kuIE11c3QgQGIgbm90IGJlIEBjIDAuCisgKgorICogQG5vdGUgdGhp
cyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2VzIHRoYXQgd2Fu
dAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgorICovCit2b2lk
IGV3a192aWV3X3BhaW50X2NvbnRleHRfZnJlZShFd2tfVmlld19QYWludF9Db250ZXh0KiBjdHh0
KQoreworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKGN0eHQpOworICAgIGRlbGV0ZSBjdHh0
LT5nYzsKKyAgICBjYWlyb19kZXN0cm95KGN0eHQtPmNyKTsKKyAgICBmcmVlKGN0eHQpOworfQor
CisvKioKKyAqIFNhdmUgKHB1c2ggdG8gc3RhY2spIHBhaW50IGNvbnRleHQgc3RhdHVzLgorICoK
KyAqIEBwYXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gc2F2ZS4gTXVzdCBAYiBub3QgYmUgQGMg
MC4KKyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfcmVzdG9yZSgpCisgKgorICog
QG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2Vz
IHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgor
ICovCit2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfc2F2ZShFd2tfVmlld19QYWludF9Db250
ZXh0KiBjdHh0KQoreworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKGN0eHQpOworICAgIGNh
aXJvX3NhdmUoY3R4dC0+Y3IpOworICAgIGN0eHQtPmdjLT5zYXZlKCk7Cit9CisKKy8qKgorICog
UmVzdG9yZSAocG9wIGZyb20gc3RhY2spIHBhaW50IGNvbnRleHQgc3RhdHVzLgorICoKKyAqIEBw
YXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gcmVzdG9yZS4gTXVzdCBAYiBub3QgYmUgQGMgMC4K
KyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfc2F2ZSgpCisgKgorICogQG5vdGUg
dGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2VzIHRoYXQg
d2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgorICovCit2
b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcmVzdG9yZShFd2tfVmlld19QYWludF9Db250ZXh0
KiBjdHh0KQoreworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKGN0eHQpOworICAgIGN0eHQt
PmdjLT5yZXN0b3JlKCk7CisgICAgY2Fpcm9fcmVzdG9yZShjdHh0LT5jcik7Cit9CisKKy8qKgor
ICogQ2xpcCBwYWludCBjb250ZXh0IGRyYXdpbmdzIHRvIGdpdmVuIGFyZWEuCisgKgorICogQHBh
cmFtIGN0eHQgcGFpbnQgY29udGV4dCB0byBjbGlwLiBNdXN0IEBiIG5vdCBiZSBAYyAwLgorICog
QHBhcmFtIGFyZWEgY2xpcCBhcmVhIHRvIHVzZS4KKyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50
X2NvbnRleHRfc2F2ZSgpCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfcmVzdG9yZSgp
CisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBz
dWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5n
IHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfY2xpcChFd2tfVmlld19Q
YWludF9Db250ZXh0KiBjdHh0LCBjb25zdCBFaW5hX1JlY3RhbmdsZSogYXJlYSkKK3sKKyAgICBF
SU5BX1NBRkVUWV9PTl8wX1JFVFVSTihjdHh0KTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVS
TihhcmVhKTsKKyAgICBjdHh0LT5nYy0+Y2xpcChXZWJDb3JlOjpJbnRSZWN0KGFyZWEtPngsIGFy
ZWEtPnksIGFyZWEtPncsIGFyZWEtPmgpKTsKK30KKworLyoqCisgKiBQYWludCB1c2luZyBjb250
ZXh0IHVzaW5nIGdpdmVuIGFyZWEuCisgKgorICogQHBhcmFtIGN0eHQgcGFpbnQgY29udGV4dCB0
byBwYWludC4gTXVzdCBAYiBub3QgYmUgQGMgMC4KKyAqIEBwYXJhbSBhcmVhIHBhaW50IGFyZWEg
dG8gdXNlLiBDb29yZGluYXRlcyBhcmUgcmVsYXRpdmUgdG8gY3VycmVudCB2aWV3cG9ydCwKKyAq
ICAgICAgICB0aHVzICJzY3JvbGxlZCIuCisgKgorICogQG5vdGUgb25lIG1heSB1c2UgY2Fpcm8g
ZnVuY3Rpb25zIG9uIHRoZSBjYWlybyBjb250ZXh0IHRvCisgKiAgICAgICB0cmFuc2xhdGUsIHNj
YWxlIG9yIGFueSBtb2RpZmljYXRpb24gdGhhdCBtYXkgZml0IGhpcyBkZXNpcmVzLgorICoKKyAq
IEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9jbGlwKCkKKyAqIEBzZWUgZXdrX3ZpZXdfcGFp
bnRfY29udGV4dF9wYWludF9jb250ZW50cygpCisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9y
IGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAg
dG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgorICovCit2b2lkIGV3a192aWV3X3Bh
aW50X2NvbnRleHRfcGFpbnQoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCwgY29uc3QgRWlu
YV9SZWN0YW5nbGUqIGFyZWEpCit7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oY3R4dCk7
CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oYXJlYSk7CisKKyAgICBXZWJDb3JlOjpJbnRS
ZWN0IHJlY3QoYXJlYS0+eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJlYS0+aCk7CisKKyAgICBpZiAo
Y3R4dC0+dmlldy0+aXNUcmFuc3BhcmVudCgpKQorICAgICAgICBjdHh0LT5nYy0+Y2xlYXJSZWN0
KHJlY3QpOworICAgIGN0eHQtPnZpZXctPnBhaW50KGN0eHQtPmdjLCByZWN0KTsKK30KKworLyoq
CisgKiBQYWludCBqdXN0IGNvbnRlbnRzIHVzaW5nIGNvbnRleHQgdXNpbmcgZ2l2ZW4gYXJlYS4K
KyAqCisgKiBVbmxpa2UgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9wYWludCgpLCB0aGlzIGZ1bmN0
aW9uIHBhaW50IGp1c3QKKyAqIGJhcmUgY29udGVudHMgYW5kIGlnbm9yZXMgYW55IHNjcm9sbGlu
Zywgc2Nyb2xsYmFycyBhbmQgZXh0cmFzLiBJdAorICogd2lsbCB3YWxrIHRoZSByZW5kZXJpbmcg
dHJlZSBhbmQgcGFpbnQgY29udGVudHMgaW5zaWRlIHRoZSBnaXZlbgorICogYXJlYSB0byB0aGUg
Y2Fpcm8gY29udGV4dCBzcGVjaWZpZWQgaW4gQGEgY3R4dC4KKyAqCisgKiBAcGFyYW0gY3R4dCBw
YWludCBjb250ZXh0IHRvIHBhaW50LiBNdXN0IEBiIG5vdCBiZSBAYyAwLgorICogQHBhcmFtIGFy
ZWEgcGFpbnQgYXJlYSB0byB1c2UuIENvb3JkaW5hdGVzIGFyZSBhYnNvbHV0ZSB0byBwYWdlLgor
ICoKKyAqIEBub3RlIG9uZSBtYXkgdXNlIGNhaXJvIGZ1bmN0aW9ucyBvbiB0aGUgY2Fpcm8gY29u
dGV4dCB0bworICogICAgICAgdHJhbnNsYXRlLCBzY2FsZSBvciBhbnkgbW9kaWZpY2F0aW9uIHRo
YXQgbWF5IGZpdCBoaXMgZGVzaXJlcy4KKyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRl
eHRfY2xpcCgpCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnQoKQorICoKKyAq
IEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3Nl
cyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4K
KyAqLwordm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X3BhaW50X2NvbnRlbnRzKEV3a19WaWV3
X1BhaW50X0NvbnRleHQqIGN0eHQsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlKiBhcmVhKQoreworICAg
IEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKGN0eHQpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVU
VVJOKGFyZWEpOworCisgICAgV2ViQ29yZTo6SW50UmVjdCByZWN0KGFyZWEtPngsIGFyZWEtPnks
IGFyZWEtPncsIGFyZWEtPmgpOworCisgICAgaWYgKGN0eHQtPnZpZXctPmlzVHJhbnNwYXJlbnQo
KSkKKyAgICAgICAgY3R4dC0+Z2MtPmNsZWFyUmVjdChyZWN0KTsKKworICAgIGN0eHQtPnZpZXct
PnBhaW50Q29udGVudHMoY3R4dC0+Z2MsIHJlY3QpOworfQorCisvKioKKyAqIFNjYWxlIHRoZSBj
b250ZW50cyBieSB0aGUgZ2l2ZW4gZmFjdG9ycy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFwcGxp
ZXMgYSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIHVzaW5nIENhaXJvLgorICoKKyAqIEBwYXJhbSBj
dHh0ICAgIHBhaW50IGNvbnRleHQgdG8gcGFpbnQuIE11c3QgQGIgbm90IGJlIEBjIDAuCisgKiBA
cGFyYW0gc2NhbGVfeCBzY2FsZSBmYWN0b3IgZm9yIHRoZSBYIGRpbWVuc2lvbi4KKyAqIEBwYXJh
bSBzY2FsZV95IHNjYWxlIGZhY3RvciBmb3IgdGhlIFkgZGltZW5zaW9uLgorICovCit2b2lkIGV3
a192aWV3X3BhaW50X2NvbnRleHRfc2NhbGUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCwg
ZmxvYXQgc2NhbGVfeCwgZmxvYXQgc2NhbGVfeSkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JF
VFVSTihjdHh0KTsKKworICAgIGN0eHQtPmdjLT5zY2FsZShXZWJDb3JlOjpGbG9hdFNpemUoc2Nh
bGVfeCwgc2NhbGVfeSkpOworfQorCisvKioKKyAqIFBlcmZvcm1zIGEgdHJhbnNsYXRpb24gb2Yg
dGhlIG9yaWdpbiBjb29yZGluYXRlcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1vdmVzIHRoZSBv
cmlnaW4gY29vcmRpbmF0ZXMgYnkgQHAgeCBhbmQgQHAgeSBwaXhlbHMuCisgKgorICogQHBhcmFt
IGN0eHQgcGFpbnQgY29udGV4dCB0byBwYWludC4gTXVzdCBAYiBub3QgYmUgQGMgMC4KKyAqIEBw
YXJhbSB4ICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gdHJhbnNsYXRlIGluIHRoZSBYIGRpbWVuc2lv
bi4KKyAqIEBwYXJhbSB5ICAgIGFtb3VudCBvZiBwaXhlbHMgdG8gdHJhbnNsYXRlIGluIHRoZSBZ
IGRpbWVuc2lvbi4KKyAqLwordm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X3RyYW5zbGF0ZShF
d2tfVmlld19QYWludF9Db250ZXh0KiBjdHh0LCBmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIEVJ
TkFfU0FGRVRZX09OXzBfUkVUVVJOKGN0eHQpOworCisgICAgY3R4dC0+Z2MtPnRyYW5zbGF0ZSh4
LCB5KTsKK30KKworLyoqCisgKiBQYWludCB1c2luZyBnaXZlbiBncmFwaGljcyBjb250ZXh0IHRo
ZSBnaXZlbiBhcmVhLgorICoKKyAqIFRoaXMgdXNlcyB2aWV3cG9ydCByZWxhdGl2ZSBhcmVhIGFu
ZCB3aWxsIGFsc28gaGFuZGxlIHNjcm9sbGJhcnMKKyAqIGFuZCBvdGhlciBleHRyYSBlbGVtZW50
cy4gU2VlIGV3a192aWV3X3BhaW50X2NvbnRlbnRzKCkgZm9yIHRoZQorICogYWx0ZXJuYXRpdmUg
ZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHByaXYgcHJpdmF0ZSBoYW5kbGUgcG9pbnRlciBvZiB2
aWV3IHRvIHVzZSBhcyBwYWludCBzb3VyY2UuCisgKiBAcGFyYW0gY3IgY2Fpcm8gY29udGV4dCB0
byB1c2UgYXMgcGFpbnQgZGVzdGluYXRpb24uIEl0cyBzdGF0ZSB3aWxsCisgKiAgICAgICAgYmUg
c2F2ZWQgYmVmb3JlIG9wZXJhdGlvbiBhbmQgcmVzdG9yZWQgYWZ0ZXJ3YXJkcy4KKyAqIEBwYXJh
bSBhcmVhIHZpZXdwb3J0IHJlbGF0aXZlIGdlb21ldHJ5IHRvIHBhaW50LgorICoKKyAqIEByZXR1
cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MgYW5kIEBjIEVJTkFfRkFMU0Ugb24gZmFpbHVyZSwg
bGlrZQorICogICAgICAgICBpbmNvcnJlY3QgcGFyYW1ldGVycy4KKyAqCisgKiBAbm90ZSB0aGlz
IGlzIGFuIGVhc3kgdG8gdXNlIHZlcnNpb24sIGJ1dCBpbnRlcm5hbCBzdHJ1Y3R1cmVzIGFyZQor
ICogICAgICAgYWx3YXlzIGNyZWF0ZWQsIHRoZW4gZ3JhcGhpY3MgY29udGV4dCBpcyBjbGlwcGVk
LCB0aGVuCisgKiAgICAgICBwYWludGVkLCByZXN0b3JlZCBhbmQgZGVzdHJveWVkLiBUaGlzIG1p
Z2h0IG5vdCBiZSBvcHRpbXVtLAorICogICAgICAgc28gdXNpbmcgI0V3a19WaWV3X1BhaW50X0Nv
bnRleHQgbWF5IGJlIGEgYmV0dGVyIHNvbHV0aW9ucworICogICAgICAgZm9yIGxhcmdlIG51bWJl
ciBvZiBvcGVyYXRpb25zLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGVudHMoKQor
ICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0X3BhaW50KCkKKyAqCisgKiBAbm90ZSB0aGlz
IGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50
CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK0VpbmFf
Qm9vbCBld2tfdmlld19wYWludChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYsIGNhaXJvX3Qq
IGNyLCBjb25zdCBFaW5hX1JlY3RhbmdsZSogYXJlYSkKK3sKKyAgICBFSU5BX1NBRkVUWV9PTl8w
X1JFVFVSTl9WQUwocHJpdiwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRV
Uk5fVkFMKGNyLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwo
YXJlYSwgRUlOQV9GQUxTRSk7CisgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3ID0gcHJpdi0+
bWFpbl9mcmFtZS0+dmlldygpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZBTCh2aWV3
LCBFSU5BX0ZBTFNFKTsKKworICAgIGlmICh2aWV3LT5uZWVkc0xheW91dCgpKQorICAgICAgICB2
aWV3LT5mb3JjZUxheW91dCgpOworICAgIFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCBnYyhjcik7
CisgICAgV2ViQ29yZTo6SW50UmVjdCByZWN0KGFyZWEtPngsIGFyZWEtPnksIGFyZWEtPncsIGFy
ZWEtPmgpOworCisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgZ2Muc2F2ZSgpOworICAgIGdjLmNs
aXAocmVjdCk7CisgICAgaWYgKHZpZXctPmlzVHJhbnNwYXJlbnQoKSkKKyAgICAgICAgZ2MuY2xl
YXJSZWN0KHJlY3QpOworICAgIHZpZXctPnBhaW50KCZnYywgIHJlY3QpOworICAgIGdjLnJlc3Rv
cmUoKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyKTsKKworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9
CisKKy8qKgorICogUGFpbnQganVzdCBjb250ZW50cyB1c2luZyBnaXZlbiBncmFwaGljcyBjb250
ZXh0IHRoZSBnaXZlbiBhcmVhLgorICoKKyAqIFRoaXMgdXNlcyBhYnNvbHV0ZSBjb29yZGluYXRl
cyBmb3IgYXJlYSBhbmQgd2lsbCBqdXN0IGhhbmRsZQorICogY29udGVudHMsIG5vIHNjcm9sbGJh
cnMgb3IgZXh0cmFzLiBTZWUgZXdrX3ZpZXdfcGFpbnQoKSBmb3IgdGhlCisgKiBhbHRlcm5hdGl2
ZSBzb2x1dGlvbi4KKyAqCisgKiBAcGFyYW0gcHJpdiBwcml2YXRlIGhhbmRsZSBwb2ludGVyIG9m
IHZpZXcgdG8gdXNlIGFzIHBhaW50IHNvdXJjZS4KKyAqIEBwYXJhbSBjciBjYWlybyBjb250ZXh0
IHRvIHVzZSBhcyBwYWludCBkZXN0aW5hdGlvbi4gSXRzIHN0YXRlIHdpbGwKKyAqICAgICAgICBi
ZSBzYXZlZCBiZWZvcmUgb3BlcmF0aW9uIGFuZCByZXN0b3JlZCBhZnRlcndhcmRzLgorICogQHBh
cmFtIGFyZWEgYWJzb2x1dGUgZ2VvbWV0cnkgdG8gcGFpbnQuCisgKgorICogQHJldHVybiBAYyBF
SU5BX1RSVUUgb24gc3VjY2VzcyBhbmQgQGMgRUlOQV9GQUxTRSBvbiBmYWlsdXJlLCBsaWtlCisg
KiAgICAgICAgIGluY29ycmVjdCBwYXJhbWV0ZXJzLgorICoKKyAqIEBub3RlIHRoaXMgaXMgYW4g
ZWFzeSB0byB1c2UgdmVyc2lvbiwgYnV0IGludGVybmFsIHN0cnVjdHVyZXMgYXJlCisgKiAgICAg
ICBhbHdheXMgY3JlYXRlZCwgdGhlbiBncmFwaGljcyBjb250ZXh0IGlzIGNsaXBwZWQsIHRoZW4K
KyAqICAgICAgIHBhaW50ZWQsIHJlc3RvcmVkIGFuZCBkZXN0cm95ZWQuIFRoaXMgbWlnaHQgbm90
IGJlIG9wdGltdW0sCisgKiAgICAgICBzbyB1c2luZyAjRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCBt
YXkgYmUgYSBiZXR0ZXIgc29sdXRpb25zCisgKiAgICAgICBmb3IgbGFyZ2UgbnVtYmVyIG9mIG9w
ZXJhdGlvbnMuCisgKgorICogQHNlZSBld2tfdmlld19wYWludCgpCisgKiBAc2VlIGV3a192aWV3
X3BhaW50X2NvbnRleHRfcGFpbnRfY29udGVudHMoKQorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90
IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAg
ICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLworRWluYV9Cb29sIGV3
a192aWV3X3BhaW50X2NvbnRlbnRzKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgY2Fpcm9f
dCogY3IsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlKiBhcmVhKQoreworICAgIEVJTkFfU0FGRVRZX09O
XzBfUkVUVVJOX1ZBTChwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JF
VFVSTl9WQUwoY3IsIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOX1ZB
TChhcmVhLCBFSU5BX0ZBTFNFKTsKKyAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBwcml2
LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk5fVkFMKHZp
ZXcsIEVJTkFfRkFMU0UpOworCisgICAgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0IGdjKGNyKTsK
KyAgICBXZWJDb3JlOjpJbnRSZWN0IHJlY3QoYXJlYS0+eCwgYXJlYS0+eSwgYXJlYS0+dywgYXJl
YS0+aCk7CisKKyAgICBjYWlyb19zYXZlKGNyKTsKKyAgICBnYy5zYXZlKCk7CisgICAgZ2MuY2xp
cChyZWN0KTsKKyAgICBpZiAodmlldy0+aXNUcmFuc3BhcmVudCgpKQorICAgICAgICBnYy5jbGVh
clJlY3QocmVjdCk7CisgICAgdmlldy0+cGFpbnRDb250ZW50cygmZ2MsICByZWN0KTsKKyAgICBn
Yy5yZXN0b3JlKCk7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CisKKyAgICByZXR1cm4gRUlOQV9U
UlVFOworfQorCisKKy8qIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogQGludGVybmFsCisgKiBSZXBv
cnRzIHRoZSB2aWV3IGlzIHJlYWR5IHRvIGJlIGRpc3BsYXllZCBhcyBhbGwgZWxlbWVudHMgYXJl
IGFyZWFkeS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJyZWFkeSIgd2l0aCBubyBwYXJhbWV0ZXJz
LgorICovCit2b2lkIGV3a192aWV3X3JlYWR5KEV2YXNfT2JqZWN0KiBvKQoreworICAgIERCRygi
bz0lcCIsIG8pOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInJlYWR5
IiwgMCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBUaGUgdmlldyB0aXRsZSB3YXMgY2hh
bmdlZCBieSB0aGUgZnJhbWUgbG9hZGVyLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInRpdGxlLGNo
YW5nZWQiIHdpdGggcG9pbnRlciB0byBuZXcgdGl0bGUgc3RyaW5nLgorICovCit2b2lkIGV3a192
aWV3X3RpdGxlX3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogdGl0bGUpCit7CisgICAg
REJHKCJvPSVwLCB0aXRsZT0lcyIsIG8sIHRpdGxlID8gdGl0bGUgOiAiKG51bGwpIik7CisgICAg
ZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAidGl0bGUsY2hhbmdlZCIsICh2b2lk
Kil0aXRsZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHRoYXQgbWFpbiBm
cmFtZSdzIHVyaSBjaGFuZ2VkLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInVyaSxjaGFuZ2VkIiB3
aXRoIHBvaW50ZXIgdG8gdGhlIG5ldyB1cmkgc3RyaW5nLgorICovCit2b2lkIGV3a192aWV3X3Vy
aV9jaGFuZ2VkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRV
Uk4obywgc2QpOworICAgIGNvbnN0IGNoYXIqIHVyaSA9IGV3a19mcmFtZV91cmlfZ2V0KHNkLT5t
YWluX2ZyYW1lKTsKKyAgICBEQkcoIm89JXAsIHVyaT0lcyIsIG8sIHVyaSA/IHVyaSA6ICIobnVs
bCkiKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJ1cmksY2hhbmdl
ZCIsICh2b2lkKil1cmkpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyB0aGUg
dmlldyBzdGFydGVkIGxvYWRpbmcgc29tZXRoaW5nLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisg
KgorICogRW1pdHMgc2lnbmFsOiAibG9hZCxzdGFydGVkIiB3aXRoIG5vIHBhcmFtZXRlcnMuCisg
Ki8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9zdGFydGVkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIERC
Rygibz0lcCIsIG8pOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgImxv
YWQsc3RhcnRlZCIsIDApOworfQorCisvKioKKyAqIFJlcG9ydHMgdGhlIGZyYW1lIHN0YXJ0ZWQg
bG9hZGluZyBzb21ldGhpbmcuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqCisgKiBFbWl0cyBz
aWduYWw6ICJsb2FkLHN0YXJ0ZWQiIG9uIG1haW4gZnJhbWUgd2l0aCBubyBwYXJhbWV0ZXJzLgor
ICovCit2b2lkIGV3a192aWV3X2ZyYW1lX21haW5fbG9hZF9zdGFydGVkKEV2YXNfT2JqZWN0KiBv
KQoreworICAgIERCRygibz0lcCIsIG8pOworICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192
aWV3X2ZyYW1lX21haW5fZ2V0KG8pOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2Nh
bGwoZnJhbWUsICJsb2FkLHN0YXJ0ZWQiLCAwKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAq
IFJlcG9ydHMgdGhlIG1haW4gZnJhbWUgc3RhcnRlZCBwcm92aXNpb25hbCBsb2FkLgorICoKKyAq
IEBwYXJhbSBvIFZpZXcuCisgKgorICogRW1pdHMgc2lnbmFsOiAibG9hZCxwcm92aXNpb25hbCIg
b24gVmlldyB3aXRoIG5vIHBhcmFtZXRlcnMuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9wcm92
aXNpb25hbChFdmFzX09iamVjdCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBldmFz
X29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJsb2FkLHByb3Zpc2lvbmFsIiwgMCk7Cit9
CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHZpZXcgY2FuIGJlIHNob3duIGFmdGVy
IGEgbmV3IHdpbmRvdyBpcyBjcmVhdGVkLgorICoKKyAqIEBwYXJhbSBvIEZyYW1lLgorICoKKyAq
IEVtaXRzIHNpZ25hbDogImxvYWQsbmV3d2luZG93LHNob3ciIG9uIHZpZXcgd2l0aCBubyBwYXJh
bWV0ZXJzLgorICovCit2b2lkIGV3a192aWV3X2xvYWRfc2hvdyhFdmFzX09iamVjdCogbykKK3sK
KyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxs
KG8sICJsb2FkLG5ld3dpbmRvdyxzaG93IiwgMCk7Cit9CisKKworLyoqCisgKiBAaW50ZXJuYWwK
KyAqIFJlcG9ydHMgdGhlIG1haW4gZnJhbWUgd2FzIGNsZWFyZWQuCisgKgorICogQHBhcmFtIG8g
Vmlldy4KKyAqLwordm9pZCBld2tfdmlld19mcmFtZV9tYWluX2NsZWFyZWQoRXZhc19PYmplY3Qq
IG8pCit7CisgICAgREJHKCJvPSVwIiwgbyk7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaS0+Zmx1c2gpOwor
ICAgIHNkLT5hcGktPmZsdXNoKHNkKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9y
dHMgdGhlIG1haW4gZnJhbWUgcmVjZWl2ZWQgYW4gaWNvbi4KKyAqCisgKiBAcGFyYW0gbyBWaWV3
LgorICoKKyAqIEVtaXRzIHNpZ25hbDogImljb24scmVjZWl2ZWQiIHdpdGggbm8gcGFyYW1ldGVy
cy4KKyAqLwordm9pZCBld2tfdmlld19mcmFtZV9tYWluX2ljb25fcmVjZWl2ZWQoRXZhc19PYmpl
Y3QgKm8pCit7CisgICAgREJHKCJvPSVwIiwgbyk7CisgICAgRXZhc19PYmplY3QqIGZyYW1lID0g
ZXdrX3ZpZXdfZnJhbWVfbWFpbl9nZXQobyk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJh
Y2tfY2FsbChmcmFtZSwgImljb24scmVjZWl2ZWQiLCAwKTsKK30KKworLyoqCisgKiBAaW50ZXJu
YWwKKyAqIFJlcG9ydHMgbG9hZCBmaW5pc2hlZCwgb3B0aW9uYWxseSB3aXRoIGVycm9yIGluZm9y
bWF0aW9uLgorICoKKyAqIEVtaXRzIHNpZ25hbDogImxvYWQsZmluaXNoZWQiIHdpdGggcG9pbnRl
ciB0byAjRXdrX0ZyYW1lX0xvYWRfRXJyb3IKKyAqIGlmIGFueSBlcnJvciwgb3IgQGMgMCBpZiBz
dWNjZXNzZnVsIGxvYWQuCisgKgorICogQG5vdGUgdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgZXJy
b3Igc3R1ZmYgaGVyZSwgYnV0IHRyeWluZyB0byBiZQorICogICAgICAgY29tcGF0aWJsZSB3aXRo
IHByZXZpb3VzIFdlYktpdC4KKyAqLwordm9pZCBld2tfdmlld19sb2FkX2ZpbmlzaGVkKEV2YXNf
T2JqZWN0KiBvLCBjb25zdCBFd2tfRnJhbWVfTG9hZF9FcnJvciogZXJyb3IpCit7CisgICAgREJH
KCJvPSVwLCBlcnJvcj0lcCIsIG8sIGVycm9yKTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxs
YmFja19jYWxsKG8sICJsb2FkLGZpbmlzaGVkIiwgKHZvaWQqKWVycm9yKTsKK30KKworLyoqCisg
KiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgbG9hZCBmYWlsZWQgd2l0aCBlcnJvciBpbmZvcm1hdGlv
bi4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJsb2FkLGVycm9yIiB3aXRoIHBvaW50ZXIgdG8gRXdr
X0ZyYW1lX0xvYWRfRXJyb3IuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9lcnJvcihFdmFzX09i
amVjdCogbywgY29uc3QgRXdrX0ZyYW1lX0xvYWRfRXJyb3IqIGVycm9yKQoreworICAgIERCRygi
bz0lcCwgZXJyb3I9JXAiLCBvLCBlcnJvcik7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJh
Y2tfY2FsbChvLCAibG9hZCxlcnJvciIsICh2b2lkKillcnJvcik7Cit9CisKKy8qKgorICogQGlu
dGVybmFsCisgKiBSZXBvcnRzIGxvYWQgcHJvZ3Jlc3MgY2hhbmdlZC4KKyAqCisgKiBFbWl0cyBz
aWduYWw6ICJsb2FkLHByb2dyZXNzIiB3aXRoIHBvaW50ZXIgdG8gYSBkb3VibGUgZnJvbSAwLjAg
dG8gMS4wLgorICovCit2b2lkIGV3a192aWV3X2xvYWRfcHJvZ3Jlc3NfY2hhbmdlZChFdmFzX09i
amVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworCisgICAgLy8gRXZhc19Db29y
ZCB3LCBoOworICAgIGRvdWJsZSBwcm9ncmVzcyA9IHByaXYtPnBhZ2UtPnByb2dyZXNzKCktPmVz
dGltYXRlZFByb2dyZXNzKCk7CisKKyAgICBEQkcoIm89JXAgKHA9JTAuM2YpIiwgbywgcHJvZ3Jl
c3MpOworCisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAibG9hZCxwcm9n
cmVzcyIsICZwcm9ncmVzcyk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHZp
ZXcgQHBhcmFtIG8gc2hvdWxkIGJlIHJlc3RvcmVkIHRvIGRlZmF1bHQgY29uZGl0aW9ucworICoK
KyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gZnJhbWUgRnJhbWUgdGhhdCBvcmlnaW5hdGVk
IHJlc3RvcmUuCisgKgorICogRW1pdHMgc2lnbmFsOiAicmVzdG9yZSIgd2l0aCBmcmFtZS4KKyAq
Lwordm9pZCBld2tfdmlld19yZXN0b3JlX3N0YXRlKEV2YXNfT2JqZWN0KiBvLCBFdmFzX09iamVj
dCogZnJhbWUpCit7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAicmVz
dG9yZSIsIGZyYW1lKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIERlbGVnYXRlcyB0byBi
cm93c2VyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyB3aW5kb3cuIElmIGl0IGlzIG5vdCBpbXBsZW1l
bnRlZCwKKyAqIGN1cnJlbnQgdmlldyBpcyByZXR1cm5lZCwgc28gbmF2aWdhdGlvbiBtaWdodCBj
b250aW51ZSBpbiBzYW1lIHdpbmRvdy4KKyAqCisgKiBAcGFyYW0gbyBDdXJyZW50IHZpZXcuCisg
KgorICogQHJldHVybiBOZXcgdmlldywgaW4gY2FzZSBzbWFydCBjbGFzcyBpbXBsZW1lbnRzIHRo
ZSBjcmVhdGlvbiBvZiBuZXcgd2luZG93czsKKyAqIGVsc2UsIGN1cnJlbnQgdmlldyBAcGFyYW0g
by4KKyAqLworRXZhc19PYmplY3QqIGV3a192aWV3X3dpbmRvd19jcmVhdGUoRXZhc19PYmplY3Qq
IG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisKKyAgICBp
ZiAoIXNkLT5hcGktPndpbmRvd19jcmVhdGUpCisgICAgICAgIHJldHVybiBvOworCisgICAgcmV0
dXJuIHNkLT5hcGktPndpbmRvd19jcmVhdGUoc2QpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAor
ICogUmVwb3J0cyBtb3VzZSBoYXMgbW92ZWQgb3ZlciBhIGxpbmsuCisgKgorICogRW1pdHMgc2ln
bmFsOiAibGluayxob3ZlcixpbiIKKyAqLwordm9pZCBld2tfdmlld19tb3VzZV9saW5rX2hvdmVy
X2luKEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBkYXRhKQoreworICAgIGV2YXNfb2JqZWN0X3NtYXJ0
X2NhbGxiYWNrX2NhbGwobywgImxpbmssaG92ZXIsaW4iLCBkYXRhKTsKK30KKworLyoqCisgKiBA
aW50ZXJuYWwKKyAqIFJlcG9ydHMgbW91c2UgaXMgbm90IG92ZXIgYSBsaW5rIGFueW1vcmUuCisg
KgorICogRW1pdHMgc2lnbmFsOiAibGluayxob3ZlcixvdXQiCisgKi8KK3ZvaWQgZXdrX3ZpZXdf
bW91c2VfbGlua19ob3Zlcl9vdXQoRXZhc19PYmplY3QqIG8pCit7CisgICAgZXZhc19vYmplY3Rf
c21hcnRfY2FsbGJhY2tfY2FsbChvLCAibGluayxob3ZlcixvdXQiLCAwKTsKK30KKworLyoqCisg
KiBAaW50ZXJuYWwKKyAqIFNldCB0b29sYmFyIHZpc2libGUuCisgKgorICogRW1pdHMgc2lnbmFs
OiAidG9vbGJhcnMsdmlzaWJsZSxzZXQiIHdpdGggYSBwb2ludGVyIHRvIGEgYm9vbGVhbi4KKyAq
Lwordm9pZCBld2tfdmlld190b29sYmFyc192aXNpYmxlX3NldChFdmFzX09iamVjdCogbywgRWlu
YV9Cb29sIHZpc2libGUpCit7CisgICAgREJHKCJvPSVwICh2aXNpYmxlPSVkKSIsIG8sICEhdmlz
aWJsZSk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAidG9vbGJhcnMs
dmlzaWJsZSxzZXQiLCAmdmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBHZXQg
dG9vbGJhciB2aXNpYmlsaXR5LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlz
aWJsZSBib29sZWFuIHBvaW50ZXIgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgcmVzdWx0LiBJdCBkZWZh
dWx0cworICogdG8gQGMgRkFMU0UsIGkuZS4gaWYgYnJvd3NlciBkb2VzIG5vIGxpc3RlbiB0byBl
bWl0dGVkIHNpZ25hbCwgaXQgbWVhbnMKKyAqIHRoZXJlIGFyZSBubyB0b29sYmFycyBhbmQgdGhl
cmVmb3JlIHRoZXkgYXJlIG5vdCB2aXNpYmxlLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInRvb2xi
YXJzLHZpc2libGUsZ2V0IiB3aXRoIGEgcG9pbnRlciB0byBhIGJvb2xlYW4uCisgKi8KK3ZvaWQg
ZXdrX3ZpZXdfdG9vbGJhcnNfdmlzaWJsZV9nZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCog
dmlzaWJsZSkKK3sKKyAgICBEQkcoIiVzLCBvPSVwIiwgX19mdW5jX18sIG8pOworICAgICp2aXNp
YmxlID0gRUlOQV9GQUxTRTsKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8s
ICJ0b29sYmFycyx2aXNpYmxlLGdldCIsIHZpc2libGUpOworfQorCisvKioKKyAqIEBpbnRlcm5h
bAorICogU2V0IHN0YXR1c2JhciB2aXNpYmxlLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBA
cGFyYW0gdmlzaWJsZSBAYyBUUlVFIGlmIHN0YXR1c2JhciBhcmUgdmlzaWJsZSwgQGMgRkFMU0Ug
b3RoZXJ3aXNlLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInN0YXR1c2Jhcix2aXNpYmxlLHNldCIg
d2l0aCBhIHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lkIGV3a192aWV3X3N0YXR1c2Jh
cl92aXNpYmxlX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIHZpc2libGUpCit7CisgICAg
REJHKCJvPSVwICh2aXNpYmxlPSVkKSIsIG8sICEhdmlzaWJsZSk7CisgICAgZXZhc19vYmplY3Rf
c21hcnRfY2FsbGJhY2tfY2FsbChvLCAic3RhdHVzYmFyLHZpc2libGUsc2V0IiwgJnZpc2libGUp
OworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogR2V0IHN0YXR1c2JhciB2aXNpYmlsaXR5Lgor
ICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBib29sZWFuIHBvaW50ZXIg
aW4gd2hpY2ggdG8gc2F2ZSB0aGUgcmVzdWx0LiBJdCBkZWZhdWx0cworICogdG8gQGMgRkFMU0Us
IGkuZS4gaWYgYnJvd3NlciBkb2VzIG5vIGxpc3RlbiB0byBlbWl0dGVkIHNpZ25hbCwgaXQgbWVh
bnMKKyAqIHRoZXJlIGlzIG5vIHN0YXR1c2JhciBhbmQgdGhlcmVmb3JlIGl0IGlzIG5vdCB2aXNp
YmxlLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInN0YXR1c2Jhcix2aXNpYmxlLGdldCIgd2l0aCBh
IHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lkIGV3a192aWV3X3N0YXR1c2Jhcl92aXNp
YmxlX2dldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sKiB2aXNpYmxlKQoreworICAgIERCRygi
JXMsIG89JXAiLCBfX2Z1bmNfXywgbyk7CisgICAgKnZpc2libGUgPSBFSU5BX0ZBTFNFOworICAg
IGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInN0YXR1c2Jhcix2aXNpYmxlLGdl
dCIsIHZpc2libGUpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogU2V0IHRleHQgb2Ygc3Rh
dHVzYmFyCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSB0ZXh0IE5ldyB0ZXh0IHRv
IHB1dCBvbiBzdGF0dXNiYXIuCisgKgorICogRW1pdHMgc2lnbmFsOiAic3RhdHVzYmFyLHRleHQs
c2V0IiB3aXRoIGEgc3RyaW5nLgorICovCit2b2lkIGV3a192aWV3X3N0YXR1c2Jhcl90ZXh0X3Nl
dChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogdGV4dCkKK3sKKyAgICBEQkcoIm89JXAgKHRl
eHQ9JXMpIiwgbywgdGV4dCk7CisgICAgSU5GKCJzdGF0dXMgYmFyIHRleHQgc2V0OiAlcyIsIHRl
eHQpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInN0YXR1c2Jhcix0
ZXh0LHNldCIsICh2b2lkICopdGV4dCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBTZXQg
c2Nyb2xsYmFycyB2aXNpYmxlLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlz
aWJsZSBAYyBUUlVFIGlmIHNjcm9sbGJhcnMgYXJlIHZpc2libGUsIEBjIEZBTFNFIG90aGVyd2lz
ZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJzY3JvbGxiYXJzLHZpc2libGUsc2V0IiB3aXRoIGEg
cG9pbnRlciB0byBhIGJvb2xlYW4uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfc2Nyb2xsYmFyc192aXNp
YmxlX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIHZpc2libGUpCit7CisgICAgREJHKCJv
PSVwICh2aXNpYmxlPSVkKSIsIG8sICEhdmlzaWJsZSk7CisgICAgZXZhc19vYmplY3Rfc21hcnRf
Y2FsbGJhY2tfY2FsbChvLCAic2Nyb2xsYmFycyx2aXNpYmxlLHNldCIsICZ2aXNpYmxlKTsKK30K
KworLyoqCisgKiBAaW50ZXJuYWwKKyAqIEdldCBzY3JvbGxiYXJzIHZpc2liaWxpdHkuCisgKgor
ICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSB2aXNpYmxlIGJvb2xlYW4gcG9pbnRlciBpbiB3
aGljaCB0byBzYXZlIHRoZSByZXN1bHQuIEl0IGRlZmF1bHRzCisgKiB0byBAYyBGQUxTRSwgaS5l
LiBpZiBicm93c2VyIGRvZXMgbm8gbGlzdGVuIHRvIGVtaXR0ZWQgc2lnbmFsLCBpdCBtZWFucwor
ICogdGhlcmUgYXJlIG5vIHNjcm9sbGJhcnMgYW5kIHRoZXJlZm9yZSB0aGV5IGFyZSBub3Qgdmlz
aWJsZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJzY3JvbGxiYXJzLHZpc2libGUsZ2V0IiB3aXRo
IGEgcG9pbnRlciB0byBhIGJvb2xlYW4uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfc2Nyb2xsYmFyc192
aXNpYmxlX2dldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sKiB2aXNpYmxlKQoreworICAgIERC
RygiJXMsIG89JXAiLCBfX2Z1bmNfXywgbyk7CisgICAgKnZpc2libGUgPSBFSU5BX0ZBTFNFOwor
ICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInNjcm9sbGJhcnMsdmlzaWJs
ZSxnZXQiLCB2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFNldCBtZW51YmFy
IHZpc2libGUuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSB2aXNpYmxlIEBjIFRS
VUUgaWYgbWVudWJhciBpcyB2aXNpYmxlLCBAYyBGQUxTRSBvdGhlcndpc2UuCisgKgorICogRW1p
dHMgc2lnbmFsOiAibWVudWJhcix2aXNpYmxlLHNldCIgd2l0aCBhIHBvaW50ZXIgdG8gYSBib29s
ZWFuLgorICovCit2b2lkIGV3a192aWV3X21lbnViYXJfdmlzaWJsZV9zZXQoRXZhc19PYmplY3Qq
IG8sIEVpbmFfQm9vbCB2aXNpYmxlKQoreworICAgIERCRygibz0lcCAodmlzaWJsZT0lZCkiLCBv
LCAhIXZpc2libGUpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgIm1l
bnViYXIsdmlzaWJsZSxzZXQiLCAmdmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisg
KiBHZXQgbWVudWJhciB2aXNpYmlsaXR5LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFy
YW0gdmlzaWJsZSBib29sZWFuIHBvaW50ZXIgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgcmVzdWx0LiBJ
dCBkZWZhdWx0cworICogdG8gQGMgRkFMU0UsIGkuZS4gaWYgYnJvd3NlciBkb2VzIG5vIGxpc3Rl
biB0byBlbWl0dGVkIHNpZ25hbCwgaXQgbWVhbnMKKyAqIHRoZXJlIGlzIG5vIG1lbnViYXIgYW5k
IHRoZXJlZm9yZSBpdCBpcyBub3QgdmlzaWJsZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJtZW51
YmFyLHZpc2libGUsZ2V0IiB3aXRoIGEgcG9pbnRlciB0byBhIGJvb2xlYW4uCisgKi8KK3ZvaWQg
ZXdrX3ZpZXdfbWVudWJhcl92aXNpYmxlX2dldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sKiB2
aXNpYmxlKQoreworICAgIERCRygiJXMsIG89JXAiLCBfX2Z1bmNfXywgbyk7CisgICAgKnZpc2li
bGUgPSBFSU5BX0ZBTFNFOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywg
Im1lbnViYXIsdmlzaWJsZSxnZXQiLCB2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwK
KyAqIFNldCB0b29sdGlwIHRleHQgYW5kIGRpc3BsYXkgaWYgaXQgaXMgY3VycmVudGx5IGhpZGRl
bi4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHRleHQgVGV4dCB0byBzZXQgdG9v
bHRpcCB0by4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJ0b29sdGlwLHRleHQsc2V0IiB3aXRoIGEg
c3RyaW5nLiBJZiB0b29sdGlwIG11c3QgYmUgYWN0dWFsbHkKKyAqIHJlbW92ZWQsIHRleHQgd2ls
bCBiZSAwIG9yICdcMCcKKyAqLwordm9pZCBld2tfdmlld190b29sdGlwX3RleHRfc2V0KEV2YXNf
T2JqZWN0KiBvLCBjb25zdCBjaGFyKiB0ZXh0KQoreworICAgIERCRygibz0lcCB0ZXh0PSVzIiwg
bywgdGV4dCk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAidG9vbHRp
cCx0ZXh0LHNldCIsICh2b2lkICopdGV4dCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKgor
ICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZyB0byBzaG93IG9uIGNv
bnNvbGUuCisgKiBAcGFyYW0gbGluZU51bWJlciBMaW5lIG51bWJlci4KKyAqIEBzb3VyY2VJRCBT
b3VyY2UgaWQuCisgKgorICovCit2b2lkIGV3a192aWV3X2FkZF9jb25zb2xlX21lc3NhZ2UoRXZh
c19PYmplY3QqIG8sIGNvbnN0IGNoYXIqIG1lc3NhZ2UsIHVuc2lnbmVkIGludCBsaW5lTnVtYmVy
LCBjb25zdCBjaGFyKiBzb3VyY2VJRCkKK3sKKyAgICBEQkcoIm89JXAgbWVzc2FnZT0lcyBsaW5l
TnVtYmVyPSV1IHNvdXJjZUlEPSVzIiwgbywgbWVzc2FnZSwgbGluZU51bWJlciwgc291cmNlSUQp
OworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FGRVRZ
X09OXzBfUkVUVVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNkLT5h
cGktPmFkZF9jb25zb2xlX21lc3NhZ2UpOworICAgIHNkLT5hcGktPmFkZF9jb25zb2xlX21lc3Nh
Z2Uoc2QsIG1lc3NhZ2UsIGxpbmVOdW1iZXIsIHNvdXJjZUlEKTsKK30KKwordm9pZCBld2tfdmll
d19ydW5famF2YXNjcmlwdF9hbGVydChFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1l
LCBjb25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIERCRygibz0lcCBmcmFtZT0lcCBtZXNzYWdl
PSVzIiwgbywgZnJhbWUsIG1lc3NhZ2UpOworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QpOworICAgIEVJTkFfU0FGRVRZX09OXzBfUkVUVVJOKHNkLT5hcGkpOworCisgICAgaWYg
KCFzZC0+YXBpLT5ydW5famF2YXNjcmlwdF9hbGVydCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
c2QtPmFwaS0+cnVuX2phdmFzY3JpcHRfYWxlcnQoc2QsIGZyYW1lLCBtZXNzYWdlKTsKK30KKwor
RWluYV9Cb29sIGV3a192aWV3X3J1bl9qYXZhc2NyaXB0X2NvbmZpcm0oRXZhc19PYmplY3QqIG8s
IEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSkKK3sKKyAgICBEQkcoIm89
JXAgZnJhbWU9JXAgbWVzc2FnZT0lcyIsIG8sIGZyYW1lLCBtZXNzYWdlKTsKKyAgICBFV0tfVklF
V19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl8wX1JFVFVSTl9WQUwoc2QtPmFwaSwgRUlOQV9GQUxTRSk7CisKKyAgICBpZiAoIXNkLT5hcGkt
PnJ1bl9qYXZhc2NyaXB0X2NvbmZpcm0pCisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworCisg
ICAgcmV0dXJuIHNkLT5hcGktPnJ1bl9qYXZhc2NyaXB0X2NvbmZpcm0oc2QsIGZyYW1lLCBtZXNz
YWdlKTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3J1bl9qYXZhc2NyaXB0X3Byb21wdChFdmFz
X09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25zdCBjaGFyKiBtZXNzYWdlLCBjb25z
dCBjaGFyKiBkZWZhdWx0VmFsdWUsIGNoYXIqKiB2YWx1ZSkKK3sKKyAgICBEQkcoIm89JXAgZnJh
bWU9JXAgbWVzc2FnZT0lcyIsIG8sIGZyYW1lLCBtZXNzYWdlKTsKKyAgICBFV0tfVklFV19TRF9H
RVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JF
VFVSTl9WQUwoc2QtPmFwaSwgRUlOQV9GQUxTRSk7CisKKyAgICBpZiAoIXNkLT5hcGktPnJ1bl9q
YXZhc2NyaXB0X3Byb21wdCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICByZXR1
cm4gc2QtPmFwaS0+cnVuX2phdmFzY3JpcHRfcHJvbXB0KHNkLCBmcmFtZSwgbWVzc2FnZSwgZGVm
YXVsdFZhbHVlLCB2YWx1ZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBEZWxlZ2F0ZXMg
dG8gY2xpZW50IHRvIGRlY2lkZSB3aGV0aGVyIGEgc2NyaXB0IG11c3QgYmUgc3RvcHBlZCBiZWNh
dXNlIGl0J3MKKyAqIHJ1bm5pbmcgZm9yIHRvbyBsb25nLiBJZiBjbGllbnQgZG9lcyBub3QgaW1w
bGVtZW50IGl0LCBpdCBnb2VzIHRvIGRlZmF1bHQKKyAqIGltcGxlbWVudGF0aW9uLCB3aGljaCBs
b2dzIGFuZCByZXR1cm5zIEVJTkFfRkFMU0UuIENsaWVudCBtYXkgcmVtb3ZlIGxvZyBieQorICog
c2V0dGluZyB0aGlzIGZ1bmN0aW9uIDAsIHdoaWNoIHdpbGwganVzdCByZXR1cm4gRUlOQV9GQUxT
RS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlm
IHNjcmlwdCBzaG91bGQgYmUgc3RvcHBlZDsgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UKKyAqLwor
RWluYV9Cb29sIGV3a192aWV3X3Nob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlwdChFdmFzX09iamVj
dCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwo
c2QtPmFwaSwgRUlOQV9GQUxTRSk7CisKKyAgICBpZiAoIXNkLT5hcGktPnNob3VsZF9pbnRlcnJ1
cHRfamF2YXNjcmlwdCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICByZXR1cm4g
c2QtPmFwaS0+c2hvdWxkX2ludGVycnVwdF9qYXZhc2NyaXB0KHNkKTsKK30KKworLyoqCisgKiBA
aW50ZXJuYWwKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSB3ZWIgc2l0ZSBzaG93biBp
biBAcGFyYW0gZnJhbWUgaXMgYXNraW5nIHRvIHN0b3JlIGRhdGEKKyAqIHRvIHRoZSBkYXRhYmFz
ZSBAcGFyYW0gZGF0YWJhc2VOYW1lIGFuZCB0aGUgcXVvdGEgYWxsb2NhdGVkIHRvIHRoYXQgd2Vi
IHNpdGUKKyAqIGlzIGV4Y2VlZGVkLiBCcm93c2VyIG1heSB1c2UgdGhpcyB0byBpbmNyZWFzZSB0
aGUgc2l6ZSBvZiBxdW90YSBiZWZvcmUgdGhlCisgKiBvcmlnaW5hdGluZyBvcGVyYXRpb25hIGZh
aWxzLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gZnJhbWUgVGhlIGZyYW1lIHdo
b3NlIHdlYiBwYWdlIGV4Y2VlZGVkIGl0cyBkYXRhYmFzZSBxdW90YS4KKyAqIEBwYXJhbSBkYXRh
YmFzZU5hbWUgRGF0YWJhc2UgbmFtZS4KKyAqLwordm9pZCBld2tfdmlld19leGNlZWRlZF9kYXRh
YmFzZV9xdW90YShFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25zdCBjaGFy
KiBkYXRhYmFzZU5hbWUpCit7CisgICAgREJHKCJvPSVwIiwgbyk7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFw
aSk7CisgICAgRUlOQV9TQUZFVFlfT05fMF9SRVRVUk4oc2QtPmFwaS0+ZXhjZWVkZWRfZGF0YWJh
c2VfcXVvdGEpOworICAgIHNkLT5hcGktPmV4Y2VlZGVkX2RhdGFiYXNlX3F1b3RhKHNkLCBmcmFt
ZSwgZGF0YWJhc2VOYW1lKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIE9wZW4gcGFuZWwg
dG8gY2hvb3NlIGEgZmlsZS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIGZyYW1l
IEZyYW1lIGluIHdoaWNoIG9wZXJhdGlvbiBpcyByZXF1aXJlZC4KKyAqIEBwYXJhbSBhbGxvd3Nf
bXVsdGlwbGVfZmlsZXMgQGMgRUlOQV9UUlVFIHdoZW4gbW9yZSB0aGFuIG9uZSBmaWxlIG1heSBi
ZQorICogc2VsZWN0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlCisgKiBAc3VnZ2VzdGVkX2Zp
bGVuYW1lcyBMaXN0IG9mIHN1Z2dlc3RlZCBmaWxlcyB0byBzZWxlY3QuIEl0J3MgYWR2aXNhYmxl
IHRvCisgKiBqdXN0IGlnbm9yZSB0aGlzIHZhbHVlLCBzaW5jZSBpdCdzIGEgc291cmNlIG9mIHNl
Y3VyaXR5IGZsYXcuCisgKiBAc2VsZWN0ZWRfZmlsZW5hbWVzIExpc3Qgb2YgZmlsZXMgc2VsZWN0
ZWQuCisgKgorICogQHJldHVybiBARUlOQV9GQUxTRSBpZiB1c2VyIGNhbmNlbGVkIGZpbGUgc2Vs
ZWN0aW9uOyBARUlOQV9UUlVFIGlmIGNvbmZpcm1lZC4KKyAqLworRWluYV9Cb29sIGV3a192aWV3
X3J1bl9vcGVuX3BhbmVsKEV2YXNfT2JqZWN0ICpvLCBFdmFzX09iamVjdCAqZnJhbWUsIEVpbmFf
Qm9vbCBhbGxvd3NfbXVsdGlwbGVfZmlsZXMsIGNvbnN0IEVpbmFfTGlzdCAqc3VnZ2VzdGVkX2Zp
bGVuYW1lcywgRWluYV9MaXN0ICoqc2VsZWN0ZWRfZmlsZW5hbWVzKQoreworICAgIERCRygibz0l
cCBmcmFtZT0lcCBhbGxvd3NfbXVsdGlwbGVfZmlsZXM9JWQiLCBvLCBmcmFtZSwgYWxsb3dzX211
bHRpcGxlX2ZpbGVzKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5B
X0ZBTFNFKTsKKyAgICBFSU5BX1NBRkVUWV9PTl8wX1JFVFVSTl9WQUwoc2QtPmFwaSwgRUlOQV9G
QUxTRSk7CisgICAgRWluYV9Cb29sIGNvbmZpcm07CisKKyAgICBpZiAoIXNkLT5hcGktPnJ1bl9v
cGVuX3BhbmVsKQorICAgICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKworICAgICpzZWxlY3RlZF9m
aWxlbmFtZXMgPSAwOworCisgICAgY29uZmlybSA9IHNkLT5hcGktPnJ1bl9vcGVuX3BhbmVsKHNk
LCBmcmFtZSwgYWxsb3dzX211bHRpcGxlX2ZpbGVzLCBzdWdnZXN0ZWRfZmlsZW5hbWVzLCBzZWxl
Y3RlZF9maWxlbmFtZXMpOworICAgIGlmICghY29uZmlybSAmJiAqc2VsZWN0ZWRfZmlsZW5hbWVz
KQorICAgICAgICBFUlIoIkNhbmNlbGVkIGZpbGUgc2VsZWN0aW9uLCBidXQgc2VsZWN0ZWQgZmls
ZW5hbWVzICE9IDAuIEZyZWUgbmFtZXMgYmVmb3JlIHJldHVybi4iKTsKKyAgICByZXR1cm4gY29u
ZmlybTsKK30KKwordm9pZCBld2tfdmlld19yZXBhaW50KEV2YXNfT2JqZWN0ICpvLCBFdmFzX0Nv
b3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFzX0Nvb3JkIGgpCit7CisgICAg
REJHKCJvPSVwLCByZWdpb249JWQsJWQgKyAlZHglZCIsIG8sIHgsIHksIHcsIGgpOworICAgIEVX
S19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09S
X1JFVFVSTihzZCwgcHJpdik7CisKKyAgICBpZiAoIXByaXYtPm1haW5fZnJhbWUtPmNvbnRlbnRS
ZW5kZXJlcigpKSB7CisgICAgICAgIEVSUigibm8gbWFpbiBmcmFtZSBjb250ZW50IHJlbmRlcmVy
LiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgX2V3a192aWV3X3JlcGFpbnRfYWRk
KHByaXYsIHgsIHksIHcsIGgpOworICAgIF9ld2tfdmlld19zbWFydF9jaGFuZ2VkKHNkKTsKK30K
Kwordm9pZCBld2tfdmlld19zY3JvbGwoRXZhc19PYmplY3QqIG8sIEV2YXNfQ29vcmQgZHgsIEV2
YXNfQ29vcmQgZHksIEV2YXNfQ29vcmQgc3gsIEV2YXNfQ29vcmQgc3ksIEV2YXNfQ29vcmQgc3cs
IEV2YXNfQ29vcmQgc2gsIEV2YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQgY3ksIEV2YXNfQ29vcmQg
Y3csIEV2YXNfQ29vcmQgY2gsIEVpbmFfQm9vbCBtYWluX2ZyYW1lKQoreworICAgIERCRygibz0l
cCwgZGVsdGE6ICVkLCVkLCBzY3JvbGw6ICVkLCVkKyVkeCVkLCBjbGlwOiAlZCwlZCslZHglZCIs
CisgICAgICAgIG8sIGR4LCBkeSwgc3gsIHN5LCBzdywgc2gsIGN4LCBjeSwgY3csIGNoKTsKKwor
ICAgIGlmICgoc3ggIT0gY3gpIHx8IChzeSAhPSBjeSkgfHwgKHN3ICE9IGN3KSB8fCAoc2ggIT0g
Y2gpKQorICAgICAgICBXUk4oInNjcm9sbCByZWdpb24gYW5kIGNsaXAgYXJlIGRpZmZlcmVudCEg
JWQsJWQrJWR4JWQgYW5kICVkLCVkKyVkeCVkIiwKKyAgICAgICAgICAgIHN4LCBzeSwgc3csIHNo
LCBjeCwgY3ksIGN3LCBjaCk7CisKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
KTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIEVJTkFf
U0FGRVRZX09OX1RSVUVfUkVUVVJOKCFkeCAmJiAhZHkpOworCisgICAgX2V3a192aWV3X3Njcm9s
bF9hZGQocHJpdiwgZHgsIGR5LCBzeCwgc3ksIHN3LCBzaCwgbWFpbl9mcmFtZSk7CisgICAgX2V3
a192aWV3X3NtYXJ0X2NoYW5nZWQoc2QpOworfQorCitXZWJDb3JlOjpQYWdlKiBld2tfdmlld19j
b3JlX3BhZ2VfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihz
ZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnBhZ2U7Cit9CisKKy8qKgorICogQ3JlYXRl
cyBhIG5ldyBmcmFtZSBmb3IgZ2l2ZW4gdXJsIGFuZCBvd25lciBlbGVtZW50LgorICoKKyAqIEVt
aXRzICJmcmFtZSxjcmVhdGVkIiB3aXRoIHRoZSBuZXcgZnJhbWUgb2JqZWN0IG9uIHN1Y2Nlc3Mu
CisgKi8KK1dURjo6UGFzc1JlZlB0cjxXZWJDb3JlOjpGcmFtZT4gZXdrX3ZpZXdfZnJhbWVfY3Jl
YXRlKEV2YXNfT2JqZWN0KiBvLCBFdmFzX09iamVjdCogZnJhbWUsIGNvbnN0IFdlYkNvcmU6OlN0
cmluZyYgbmFtZSwgV2ViQ29yZTo6SFRNTEZyYW1lT3duZXJFbGVtZW50KiBvd25lckVsZW1lbnQs
IGNvbnN0IFdlYkNvcmU6OktVUkwmIHVybCwgY29uc3QgV2ViQ29yZTo6U3RyaW5nJiByZWZlcnJl
cikKK3sKKyAgICBEQkcoIm89JXAsIGZyYW1lPSVwLCBuYW1lPSVzLCBvd25lckVsZW1lbnQ9JXAs
IHVybD0lcywgcmVmZXJyZXI9JXMiLAorICAgICAgICBvLCBmcmFtZSwgbmFtZS51dGY4KCkuZGF0
YSgpLCBvd25lckVsZW1lbnQsCisgICAgICAgIHVybC5wcmV0dHlVUkwoKS51dGY4KCkuZGF0YSgp
LCByZWZlcnJlci51dGY4KCkuZGF0YSgpKTsKKworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRV
Uk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
MCk7CisKKyAgICBXVEY6OlJlZlB0cjxXZWJDb3JlOjpGcmFtZT4gY2YgPSBfZXdrX3ZpZXdfY29y
ZV9mcmFtZV9uZXcKKyAgICAgICAgKHNkLCBwcml2LCBvd25lckVsZW1lbnQpOworICAgIGlmICgh
Y2YpIHsKKyAgICAgICAgRVJSKCJDb3VsZCBub3QgY3JlYXRlIGNoaWxkIGNvcmUgZnJhbWUgJyVz
JyIsIG5hbWUudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAg
IGlmICghZXdrX2ZyYW1lX2NoaWxkX2FkZChmcmFtZSwgY2YsIG5hbWUsIHVybCwgcmVmZXJyZXIp
KSB7CisgICAgICAgIEVSUigiQ291bGQgbm90IGNyZWF0ZSBjaGlsZCBmcmFtZSBvYmplY3QgJyVz
JyIsIG5hbWUudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAg
IC8vIFRoZSBjcmVhdGlvbiBvZiB0aGUgZnJhbWUgbWF5IGhhdmUgcmVtb3ZlZCBpdHNlbGYgYWxy
ZWFkeS4KKyAgICBpZiAoIWNmLT5wYWdlKCkgfHwgIWNmLT50cmVlKCkgfHwgIWNmLT50cmVlKCkt
PnBhcmVudCgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNkLT5jaGFuZ2VkLmZyYW1lX3Jl
Y3QgPSBFSU5BX1RSVUU7CisgICAgX2V3a192aWV3X3NtYXJ0X2NoYW5nZWQoc2QpOworCisgICAg
ZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAiZnJhbWUsY3JlYXRlZCIsIGZyYW1l
KTsKKyAgICByZXR1cm4gY2YucmVsZWFzZSgpOworfQorCitXVEY6OlBhc3NSZWZQdHI8V2ViQ29y
ZTo6V2lkZ2V0PiBld2tfdmlld19wbHVnaW5fY3JlYXRlKEV2YXNfT2JqZWN0KiBvLCBFdmFzX09i
amVjdCogZnJhbWUsIGNvbnN0IFdlYkNvcmU6OkludFNpemUmIHBsdWdpblNpemUsIFdlYkNvcmU6
OkhUTUxQbHVnSW5FbGVtZW50KiBlbGVtZW50LCBjb25zdCBXZWJDb3JlOjpLVVJMJiB1cmwsIGNv
bnN0IFdURjo6VmVjdG9yPFdlYkNvcmU6OlN0cmluZz4mIHBhcmFtTmFtZXMsIGNvbnN0IFdURjo6
VmVjdG9yPFdlYkNvcmU6OlN0cmluZz4mIHBhcmFtVmFsdWVzLCBjb25zdCBXZWJDb3JlOjpTdHJp
bmcmIG1pbWVUeXBlLCBib29sIGxvYWRNYW51YWxseSkKK3sKKyAgICBEQkcoIm89JXAsIGZyYW1l
PSVwLCBzaXplPSVkeCVkLCBlbGVtZW50PSVwLCB1cmw9JXMsIG1pbWVUeXBlPSVzIiwKKyAgICAg
ICAgbywgZnJhbWUsIHBsdWdpblNpemUud2lkdGgoKSwgcGx1Z2luU2l6ZS5oZWlnaHQoKSwgZWxl
bWVudCwKKyAgICAgICAgdXJsLnByZXR0eVVSTCgpLnV0ZjgoKS5kYXRhKCksIG1pbWVUeXBlLnV0
ZjgoKS5kYXRhKCkpOworCisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7
CisgICAgc2QtPmNoYW5nZWQuZnJhbWVfcmVjdCA9IEVJTkFfVFJVRTsKKyAgICBfZXdrX3ZpZXdf
c21hcnRfY2hhbmdlZChzZCk7CisKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3BsdWdpbl9jcmVhdGUK
KyAgICAgICAgKGZyYW1lLCBwbHVnaW5TaXplLCBlbGVtZW50LCB1cmwsIHBhcmFtTmFtZXMsIHBh
cmFtVmFsdWVzLAorICAgICAgICAgbWltZVR5cGUsIGxvYWRNYW51YWxseSk7Cit9CisKKworLyoq
CisgKiBAaW50ZXJuYWwKKyAqCisgKiBDcmVhdGVzIGEgbmV3IHBvcHVwIHdpdGggb3B0aW9ucyB3
aGVuIGEgc2VsZWN0IHdpZGdldCB3YXMgY2xpY2tlZC4KKyAqCisgKiBAcGFyYW0gY2xpZW50IFBv
cHVwTWVudUNsaWVudCBpbnN0YW5jZSB0aGF0IGFsbG93cyBjb21tdW5pY2F0aW9uIHdpdGggd2Vi
a2l0LgorICogQHBhcmFtIHNlbGVjdGVkIFNlbGVjdGVkIGl0ZW0uCisgKiBAcGFyYW0gcmVjdCBN
ZW51J3MgcG9zaXRpb24uCisgKgorICogRW1pdHM6ICJwb3B1cCxjcmVhdGUiIHdpdGggYSBsaXN0
IG9mIEV3a19NZW51IGNvbnRhaW5pbmcgZWFjaCBpdGVtJ3MgZGF0YQorICovCit2b2lkIGV3a192
aWV3X3BvcHVwX25ldyhFdmFzX09iamVjdCAqbywgV2ViQ29yZTo6UG9wdXBNZW51Q2xpZW50KiBj
bGllbnQsIGludCBzZWxlY3RlZCwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgcmVjdCkKK3sKKyAg
ICBJTkYoIm89JXAiLCBvKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsK
KyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworCisgICAgaWYgKHBy
aXYtPnBvcHVwLm1lbnVfY2xpZW50KQorICAgICAgICBld2tfdmlld19wb3B1cF9kZXN0cm95KG8p
OworCisgICAgcHJpdi0+cG9wdXAubWVudV9jbGllbnQgPSBjbGllbnQ7CisKKyAgICAvLyBwb3B1
bGF0ZSBpdGVtcworICAgIGNvbnN0IGludCBzaXplID0gY2xpZW50LT5saXN0U2l6ZSgpOworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIEV3a19NZW51X0l0ZW0q
IGl0ZW0gPSAoRXdrX01lbnVfSXRlbSopIG1hbGxvYyhzaXplb2YoKml0ZW0pKTsKKyAgICAgICAg
aWYgKGNsaWVudC0+aXRlbUlzU2VwYXJhdG9yKGkpKQorICAgICAgICAgICAgaXRlbS0+dHlwZSA9
IEVXS19NRU5VX1NFUEFSQVRPUjsKKyAgICAgICAgZWxzZSBpZiAoY2xpZW50LT5pdGVtSXNMYWJl
bChpKSkKKyAgICAgICAgICAgIGl0ZW0tPnR5cGUgPSBFV0tfTUVOVV9HUk9VUDsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgaXRlbS0+dHlwZSA9IEVXS19NRU5VX09QVElPTjsKKyAgICAgICAg
aXRlbS0+dGV4dCA9IGVpbmFfc3RyaW5nc2hhcmVfYWRkKGNsaWVudC0+aXRlbVRleHQoaSkudXRm
OCgpLmRhdGEoKSk7CisKKyAgICAgICAgcHJpdi0+cG9wdXAubWVudS5pdGVtcyA9IGVpbmFfbGlz
dF9hcHBlbmQocHJpdi0+cG9wdXAubWVudS5pdGVtcywgaXRlbSk7CisgICAgfQorCisgICAgcHJp
di0+cG9wdXAubWVudS54ID0gcmVjdC54KCk7CisgICAgcHJpdi0+cG9wdXAubWVudS55ID0gcmVj
dC55KCk7CisgICAgcHJpdi0+cG9wdXAubWVudS53aWR0aCA9IHJlY3Qud2lkdGgoKTsKKyAgICBw
cml2LT5wb3B1cC5tZW51LmhlaWdodCA9IHJlY3QuaGVpZ2h0KCk7CisgICAgZXZhc19vYmplY3Rf
c21hcnRfY2FsbGJhY2tfY2FsbChvLCAicG9wdXAsY3JlYXRlIiwgJnByaXYtPnBvcHVwLm1lbnUp
OworfQorCisvKioKKyAqIERlc3Ryb3kgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVudS4KKyAqCisg
KiBCZWZvcmUgZGVzdHJveWluZywgaXQgaW5mb3JtcyBjbGllbnQgdGhhdCBtZW51J3MgZGF0YSBp
cyByZWFkeSB0byBiZQorICogZGVzdHJveWVkIGJ5IHNlbmRpbmcgYSAicG9wdXAsd2lsbGRlbGV0
ZSIgd2l0aCBhIGxpc3Qgb2YgbWVudSBpdGVtcy4gVGhlbiBpdAorICogcmVtb3ZlcyBhbnkgcmVm
ZXJlbmNlIHRvIG1lbnUgaW5zaWRlIHdlYmtpdC4gSXQncyBzYWZlIHRvIGNhbGwgdGhpcworICog
ZnVuY3Rpb24gZWl0aGVyIGZyb20gaW5zaWRlIHdlYmtpdCBvciBmcm9tIGJyb3dzZXIuCisgKgor
ICogQHBhcmFtIG8gVmlldy4KKyAqCisgKiBAcmV0dXJucyBFSU5BX1RSVUUgaW4gY2FzZSBtZW51
IHdhcyBzdWNjZXNzZnVsbHkgZGVzdHJveWVkIG9yIEVJTkFfVFJVRSBpbgorICogY2FzZSB0aGVy
ZSB3YXNuJ3QgYW55IG1lbnUgdG8gYmUgZGVzdHJveWVkLgorICovCitFaW5hX0Jvb2wgZXdrX3Zp
ZXdfcG9wdXBfZGVzdHJveShFdmFzX09iamVjdCAqbykKK3sKKyAgICBJTkYoIm89JXAiLCBvKTsK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworCisgICAg
aWYgKCFwcml2LT5wb3B1cC5tZW51X2NsaWVudCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7
CisKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJwb3B1cCx3aWxsZGVs
ZXRlIiwgJnByaXYtPnBvcHVwLm1lbnUpOworCisgICAgdm9pZCogaXRlbXY7CisgICAgRUlOQV9M
SVNUX0ZSRUUocHJpdi0+cG9wdXAubWVudS5pdGVtcywgaXRlbXYpIHsKKyAgICAgICAgRXdrX01l
bnVfSXRlbSogaXRlbSA9IChFd2tfTWVudV9JdGVtICopaXRlbXY7CisgICAgICAgIGVpbmFfc3Ry
aW5nc2hhcmVfZGVsKGl0ZW0tPnRleHQpOworICAgICAgICBmcmVlKGl0ZW0pOworICAgIH0KKyAg
ICBwcml2LT5wb3B1cC5tZW51X2NsaWVudC0+cG9wdXBEaWRIaWRlKCk7CisgICAgcHJpdi0+cG9w
dXAubWVudV9jbGllbnQgPSAwOworCisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisg
KiBDaGFuZ2VzIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLgorICoKKyAqIENoYW5nZXMgdGhlIG9w
dGlvbiBzZWxlY3RlZCBpbiBzZWxlY3Qgd2lkZ2V0LiBUaGlzIGlzIGNhbGxlZCBieSBicm93c2Vy
CisgKiB3aGVuZXZlciB1c2VyIGhhcyBjaG9zZW4gYSBkaWZmZXJlbnQgaXRlbS4gTW9zdCBsaWtl
bHkgYWZ0ZXIgY2FsbGluZyB0aGlzLCBhCisgKiBjYWxsIHRvIGV3a192aWV3X3BvcHVwX2Rlc3Ry
b3kgbWlnaHQgYmUgbWFkZSBpbiBvcmRlciB0byBjbG9zZSB0aGUgcG9wdXAuCisgKgorICogQHBh
cmFtIG8gVmlldy4KKyAqIEBpbmRleCBJbmRleCBvZiBzZWxlY3RlZCBpdGVtLgorICoKKyAqLwor
dm9pZCBld2tfdmlld19wb3B1cF9zZWxlY3RlZF9zZXQoRXZhc19PYmplY3QgKm8sIGludCBpbmRl
eCkKK3sKKyAgICBJTkYoIm89JXAiLCBvKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJO
KG8sIHNkKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworCisg
ICAgcHJpdi0+cG9wdXAubWVudV9jbGllbnQtPnZhbHVlQ2hhbmdlZChpbmRleCk7Cit9CisKKy8q
KgorICogQGludGVybmFsCisgKiBSZXF1ZXN0IGEgZG93bmxvYWQgdG8gdXNlci4KKyAqCisgKiBA
cGFyYW0gbyBWaWV3LgorICogQG9hcmFtIGRvd25sb2FkIEV3a19Eb3dubG9hZCBzdHJ1Y3QgdG8g
YmUgc2VudC4KKyAqCisgKiBFbWl0czogImRvd25sb2FkLHJlcXVlc3QiIHdpdGggYW4gRXdrX0Rv
d25sb2FkIGNvbnRhaW5pbmcgdGhlIGRldGFpbHMgb2YgdGhlCisgKiByZXF1ZXN0ZWQgZG93bmxv
YWQuIFRoZSBkb3dubG9hZCBwZXIgc2UgbXVzdCBiZSBoYW5kbGVkIG91dHNpZGUgb2Ygd2Via2l0
LgorICovCit2b2lkIGV3a192aWV3X2Rvd25sb2FkX3JlcXVlc3QoRXZhc19PYmplY3QgKm8sIEV3
a19Eb3dubG9hZCogZG93bmxvYWQpCit7CisgICAgREJHKCJ2aWV3PSVwIiwgbyk7CisgICAgZXZh
c19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAiZG93bmxvYWQscmVxdWVzdCIsIGRvd25s
b2FkKTsKK30KSW5kZXg6IFdlYktpdC9lZmwvZXdrL2V3a192aWV3LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
L2Rldi9udWxsCisrKyBXZWJLaXQvZWZsL2V3ay9ld2tfdmlldy5oCkBAIC0wLDAgKzEsNDU1IEBA
CisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFByb0ZVU0lPTiBlbWJlZGRlZCBzeXN0
ZW1zCisgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworCisg
ICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAg
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisK
KyNpZm5kZWYgZXdrX3ZpZXdfaAorI2RlZmluZSBld2tfdmlld19oCisKKyNpbmNsdWRlIDxFdmFz
Lmg+CisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxld2tfaGlzdG9yeS5oPgorCisjaWZk
ZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogQGJyaWVmIFdl
YktpdCBtYWluIHNtYXJ0IG9iamVjdC4KKyAqCisgKiBUaGlzIG9iamVjdCBpcyB0aGUgaGlnaCBs
ZXZlbCBhY2Nlc3MgdG8gV2ViS2l0LUVGTCBicm93c2VyCisgKiBjb21wb25lbnQuIEl0IGlzIHJl
c3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbWFpbiBmcmFtZSBhbmQgb3RoZXIKKyAqIGNyaXRp
Y2FsIHJlc291cmNlcy4KKyAqCisgKiBFdmVyeSBld2tfdmlldyBoYXMgYXQgbGVhc3Qgb25lIGZy
YW1lLCBjYWxsZWQgIm1haW4gZnJhbWUiIGFuZAorICogcmV0cmlldmVkIHdpdGggZXdrX3ZpZXdf
ZnJhbWVfbWFpbl9nZXQoKS4gRGlyZWN0IGZyYW1lIGFjY2VzcyBpcworICogb2Z0ZW4gZGlzY291
cmFnZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBld2tfdmlldyBmdW5jdGlvbnMKKyAqIGlu
c3RlYWQuCisgKgorICogVGhlIGZvbGxvd2luZyBzaWduYWxzIChzZWUgZXZhc19vYmplY3Rfc21h
cnRfY2FsbGJhY2tfYWRkKCkpIGFyZSBlbWl0dGVkOgorICoKKyAqICAtICJyZWFkeSIsIHZvaWQ6
IHBhZ2UgaXMgZnVsbHkgbG9hZGVkLgorICogIC0gInRpdGxlLGNoYW5nZWQiLCBjb25zdCBjaGFy
KjogdGl0bGUgb2YgdGhlIG1haW4gZnJhbWUgY2hhbmdlZC4KKyAqICAtICJ1cmksY2hhbmdlZCIs
IGNvbnN0IGNoYXIqOiB1cmkgb2YgdGhlIG1haW4gZnJhbWUgY2hhbmdlZC4KKyAqICAtICJsb2Fk
LHN0YXJ0ZWQiLCB2b2lkOiBmcmFtZSBzdGFydGVkIGxvYWRpbmcuCisgKiAgLSAibG9hZCxwcm9n
cmVzcyIsIGRvdWJsZSo6IGxvYWQgcHJvZ3Jlc3MgY2hhbmdlZCAob3ZlcmFsbCB2YWx1ZQorICog
ICAgZnJvbSAwLjAgdG8gMS4wLCBjb25uZWN0IHRvIGluZGl2aWR1YWwgZnJhbWVzIGZvciBmaW5l
IGdyYWluZWQpLgorICogIC0gImxvYWQsZmluaXNoZWQiLCBjb25zdCBFd2tfRnJhbWVfTG9hZF9F
cnJvcio6IHJlcG9ydHMgbG9hZAorICogICAgZmluaXNoZWQgYW5kIGFzIGFyZ3VtZW50IEBjIE5V
TEwgaWYgc3VjY2Vzc2Z1bGx5IG9yIHBvaW50ZXIgdG8KKyAqICAgIHN0cnVjdHVyZSBkZWZpbmlu
ZyB0aGUgZXJyb3IuCisgKiAgLSAibG9hZCxwcm92aXNpb25hbCIsIHZvaWQ6IHZpZXcgc3RhcnRl
ZCBwcm92aXNpb25hbCBsb2FkLgorICogIC0gImxvYWQsZXJyb3IiLCBjb25zdCBFd2tfRnJhbWVf
TG9hZF9FcnJvcio6IHJlcG9ydHMgbG9hZCBmYWlsZWQKKyAqICAgIGFuZCBhcyBhcmd1bWVudCBh
IHBvaW50ZXIgdG8gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBlcnJvci4KKyAqICAtICJmcmFtZSxj
cmVhdGVkIiwgRXZhc19PYmplY3QqOiB3aGVuIGZyYW1lcyBhcmUgY3JlYXRlZCwgdGhleSBhcmUK
KyAqICAgIGVtaXR0ZWQgaW4gdGhpcyBzaWduYWwuCisgKiAgLSAiem9vbSxhbmltYXRlZCxlbmQi
LCB2b2lkOiByZXF1ZXN0ZWQgYW5pbWF0ZWQgem9vbSBpcyBmaW5pc2hlZC4KKyAqICAtICJtZW51
YmFyLHZpc2libGUsc2V0IiwgRWluYV9Cb29sOiBzZXQgbWVudWJhciB2aXNpYmlsaXR5LgorICog
IC0gIm1lbnViYXIsdmlzaWJsZSxnZXQiLCBFaW5hX0Jvb2wgKjogZXhwZWN0cyBhIEBjIEVJTkFf
VFJVRSBpZiBtZW51YmFyIGlzCisgKiAgICB2aXNpYmxlOyBvdGhlcndpc2UsIEBjIEVJTkFfRkFM
U0UuCisgKiAgLSAibWVudWJhcix2aXNpYmxlLHNldCIsIEVpbmFfQm9vbDogc2V0IG1lbnViYXIg
dmlzaWJpbGl0eS4KKyAqICAtICJtZW51YmFyLHZpc2libGUsZ2V0IiwgRWluYV9Cb29sICo6IGV4
cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgbWVudWJhciBpcworICogICAgdmlzaWJsZTsgQGMgRUlO
QV9GQUxTRSwgb3RoZXJ3aXNlLgorICogIC0gInNjcm9sbGJhcnMsdmlzaWJsZSxzZXQiLCBFaW5h
X0Jvb2w6IHNldCBzY3JvbGxiYXJzIHZpc2liaWxpdHkuCisgKiAgLSAic2Nyb2xsYmFycyx2aXNp
YmxlLGdldCIsIEVpbmFfQm9vbCAqOiBleHBlY3RzIGEgQGMgRUlOQV9UUlVFIGlmIHNjcm9sbGJh
cnMKKyAqICAgIGFyZSB2aXNpYmxlOyBAYyBFSU5BX0ZBTFNFLCBvdGhlcndpc2UuCisgKiAgLSAi
c3RhdHVzYmFyLHZpc2libGUsc2V0IiwgRWluYV9Cb29sOiBzZXQgc3RhdHVzYmFyIHZpc2liaWxp
dHkuCisgKiAgLSAic3RhdHVzYmFyLHZpc2libGUsZ2V0IiwgRWluYV9Cb29sICo6IGV4cGVjdHMg
YSBAYyBFSU5BX1RSVUUgaWYgc3RhdHVzYmFyIGlzCisgKiAgICB2aXNpYmxlOyBAYyBFSU5BX0ZB
TFNFLCBvdGhlcndpc2UuCisgKiAgLSAidG9vbGJhcix2aXNpYmxlLHNldCIsIEVpbmFfQm9vbDog
c2V0IHRvb2xiYXIgdmlzaWJpbGl0eS4KKyAqICAtICJ0b29sYmFyLHZpc2libGUsZ2V0IiwgRWlu
YV9Cb29sICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgdG9vbGJhcgorICogICAgaXMgdmlz
aWJsZTsgQGMgRUlOQV9GQUxTRSwgb3RoZXJ3aXNlLgorICogIC0gImxpbmssaG92ZXIsaW4iLCBj
b25zdCBjaGFyICpsaW5rWzJdOiByZXBvcnRzIG1vdXNlIGlzIG92ZXIgYSBsaW5rIGFuZCBhcwor
ICogICAgYXJndW1lbnQgZ2l2ZXMgdGhlIHVybCBpbiBsaW5rWzBdIGFuZCBsaW5rJ3MgdGl0bGUg
aW4gbGlua1sxXS4KKyAqICAtICJsaW5rLGhvdmVyLG91dCIsIGNvbnN0IGNoYXIgKmxpbmtbMl06
IHJlcG9ydHMgbW91c2UgbW92ZWQgb3V0IGZyb20gYSBsaW5rCisgKiAgICBhbmQgYXMgYXJndW1l
bnQgZ2l2ZXMgdGhlIHVybCBpbiBsaW5rWzBdIGFuZCBsaW5rJ3MgdGl0bGUgaW4gbGlua1sxXS4K
KyAqICAtICJwb3B1cCxjcmVhdGUiLCBFd2tfTWVudTogcmVwb3J0cyB0aGF0IGEgbmV3IG1lbnUg
d2FzIGNyZWF0ZWQuCisgKiAgLSAicG9wdXAsd2lsbGRlbGV0ZWQiLCBFd2tfTWVudTogcmVwb3J0
cyB0aGF0IGEgcHJldmlvdXNseSBjcmVhdGVkIG1lbnUgaXMKKyAqICAgIGFib3V0IHRvIGJlIGRl
bGV0ZWQuCisgKiAgLSAiZG93bmxvYWQscmVxdWVzdCIsIEV3a19Eb3dubG9hZDogcmVwb3J0cyBh
IGRvd25sb2FkIGlzIGJlaW5nIHJlcXVlc3RlZAorICogICAgYW5kIGFzIGFyZ3VtZW50cyBnaXZl
cyBpdHMgZGV0YWlscy4KKyAqICAtICJpY29uLHJlY2VpdmVkIiwgdm9pZDogbWFpbiBmcmFtZSBy
ZWNlaXZlZCBhbiBpY29uLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9Fd2tfVmlld19TbWFydF9E
YXRhIEV3a19WaWV3X1NtYXJ0X0RhdGE7CisKKy8qKgorICogRXdrIHZpZXcncyBjbGFzcywgdG8g
YmUgb3ZlcnJpZGRlbiBieSBzdWItY2xhc3Nlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0V3a19W
aWV3X1NtYXJ0X0NsYXNzIEV3a19WaWV3X1NtYXJ0X0NsYXNzOworc3RydWN0IF9Fd2tfVmlld19T
bWFydF9DbGFzcyB7CisgICAgRXZhc19TbWFydF9DbGFzcyBzYzsgLyoqPCBhbGwgYnV0ICdkYXRh
JyBpcyBmcmVlIHRvIGJlIGNoYW5nZWQuICovCisgICAgdW5zaWduZWQgbG9uZyB2ZXJzaW9uOwor
CisgICAgRXZhc19PYmplY3QgKigqd2luZG93X2NyZWF0ZSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAq
c2QpOyAvKio8IGNyZWF0ZXMgYSBuZXcgd2luZG93LCByZXF1ZXN0ZWQgYnkgd2Via2l0ICovCisg
ICAgLy8gaG9va3MgdG8gYWxsb3cgZGlmZmVyZW50IGJhY2tpbmcgc3RvcmVzCisgICAgRXZhc19P
YmplY3QgKigqYmFja2luZ19zdG9yZV9hZGQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsgLyoq
PCBtdXN0IGJlIGRlZmluZWQgKi8KKyAgICBFaW5hX0Jvb2wgKCpzY3JvbGxzX3Byb2Nlc3MpKEV3
a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsgLyoqPCBtdXN0IGJlIGRlZmluZWQgKi8KKyAgICBFaW5h
X0Jvb2wgKCpyZXBhaW50c19wcm9jZXNzKShFd2tfVmlld19TbWFydF9EYXRhICpzZCk7IC8qKjwg
bXVzdCBiZSBkZWZpbmVkICovCisgICAgRWluYV9Cb29sICgqY29udGVudHNfcmVzaXplKShFd2tf
Vmlld19TbWFydF9EYXRhICpzZCwgaW50IHcsIGludCBoKTsKKyAgICBFaW5hX0Jvb2wgKCp6b29t
X3NldCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGZsb2F0IHpvb20sIEV2YXNfQ29vcmQgY3gs
IEV2YXNfQ29vcmQgY3kpOworICAgIEVpbmFfQm9vbCAoKnpvb21fd2Vha19zZXQpKEV3a19WaWV3
X1NtYXJ0X0RhdGEgKnNkLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5
KTsKKyAgICB2b2lkICgqem9vbV93ZWFrX3Ntb290aF9zY2FsZV9zZXQpKEV3a19WaWV3X1NtYXJ0
X0RhdGEgKnNkLCBFaW5hX0Jvb2wgc21vb3RoX3NjYWxlKTsKKyAgICB2b2lkICgqYmdfY29sb3Jf
c2V0KShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgdW5zaWduZWQgY2hhciByLCB1bnNpZ25lZCBj
aGFyIGcsIHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgY2hhciBhKTsKKyAgICB2b2lkICgqZmx1
c2gpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICBFaW5hX0Jvb2wgKCpwcmVfcmVuZGVy
X3JlZ2lvbikoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIEV2YXNfQ29vcmQgeCwgRXZhc19Db29y
ZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCwgZmxvYXQgem9vbSk7CisgICAgdm9pZCAo
KnByZV9yZW5kZXJfY2FuY2VsKShFd2tfVmlld19TbWFydF9EYXRhICpzZCk7CisgICAgLy8gZXZl
bnQgaGFuZGxpbmc6CisgICAgLy8gIC0gcmV0dXJucyB0cnVlIGlmIGhhbmRsZWQKKyAgICAvLyAg
LSBpZiBvdmVycmlkZGVuLCBoYXZlIHRvIGNhbGwgcGFyZW50IG1ldGhvZCBpZiBkZXNpcmVkCisg
ICAgRWluYV9Cb29sICgqZm9jdXNfaW4pKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICBF
aW5hX0Jvb2wgKCpmb2N1c19vdXQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICBFaW5h
X0Jvb2wgKCptb3VzZV93aGVlbCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0IEV2YXNf
RXZlbnRfTW91c2VfV2hlZWwgKmV2KTsKKyAgICBFaW5hX0Jvb2wgKCptb3VzZV9kb3duKShFd2tf
Vmlld19TbWFydF9EYXRhICpzZCwgY29uc3QgRXZhc19FdmVudF9Nb3VzZV9Eb3duICpldik7Cisg
ICAgRWluYV9Cb29sICgqbW91c2VfdXApKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBjb25zdCBF
dmFzX0V2ZW50X01vdXNlX1VwICpldik7CisgICAgRWluYV9Cb29sICgqbW91c2VfbW92ZSkoRXdr
X1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0IEV2YXNfRXZlbnRfTW91c2VfTW92ZSAqZXYpOwor
ICAgIEVpbmFfQm9vbCAoKmtleV9kb3duKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgY29uc3Qg
RXZhc19FdmVudF9LZXlfRG93biAqZXYpOworICAgIEVpbmFfQm9vbCAoKmtleV91cCkoRXdrX1Zp
ZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0IEV2YXNfRXZlbnRfS2V5X1VwICpldik7CisKKyAgICB2
b2lkICgqYWRkX2NvbnNvbGVfbWVzc2FnZSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0
IGNoYXIgKm1lc3NhZ2UsIHVuc2lnbmVkIGludCBsaW5lTnVtYmVyLCBjb25zdCBjaGFyICpzb3Vy
Y2VJRCk7CisgICAgdm9pZCAoKnJ1bl9qYXZhc2NyaXB0X2FsZXJ0KShFd2tfVmlld19TbWFydF9E
YXRhICpzZCwgRXZhc19PYmplY3QgKmZyYW1lLCBjb25zdCBjaGFyICptZXNzYWdlKTsKKyAgICBF
aW5hX0Jvb2wgKCpydW5famF2YXNjcmlwdF9jb25maXJtKShFd2tfVmlld19TbWFydF9EYXRhICpz
ZCwgRXZhc19PYmplY3QgKmZyYW1lLCBjb25zdCBjaGFyICptZXNzYWdlKTsKKyAgICBFaW5hX0Jv
b2wgKCpydW5famF2YXNjcmlwdF9wcm9tcHQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBFdmFz
X09iamVjdCAqZnJhbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmRlZmF1bHRW
YWx1ZSwgY2hhciAqKnZhbHVlKTsKKyAgICBFaW5hX0Jvb2wgKCpzaG91bGRfaW50ZXJydXB0X2ph
dmFzY3JpcHQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICB2b2lkICgqZXhjZWVkZWRf
ZGF0YWJhc2VfcXVvdGEpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBFdmFzX09iamVjdCAqZnJh
bWUsIGNvbnN0IGNoYXIgKmRhdGFiYXNlTmFtZSk7CisKKyAgICBFaW5hX0Jvb2wgKCpydW5fb3Bl
bl9wYW5lbCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIEV2YXNfT2JqZWN0ICpmcmFtZSwgRWlu
YV9Cb29sIGFsbG93c19tdWx0aXBsZV9maWxlcywgY29uc3QgRWluYV9MaXN0ICpzdWdnZXN0ZWRf
ZmlsZW5hbWVzLCBFaW5hX0xpc3QgKipzZWxlY3RlZF9maWxlbmFtZXMpOworfTsKKworI2RlZmlu
ZSBFV0tfVklFV19TTUFSVF9DTEFTU19WRVJTSU9OIDFVTCAvKiogdGhlIHZlcnNpb24geW91IGhh
dmUgdG8gcHV0IGludG8gdGhlIHZlcnNpb24gZmllbGQgaW4gdGhlIEV3a19WaWV3X1NtYXJ0X0Ns
YXNzIHN0cnVjdHVyZSAqLworCisvKioKKyAqIEluaXRpYWxpemVyIGZvciB3aG9sZSBFd2tfVmll
d19TbWFydF9DbGFzcyBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHNtYXJ0X2NsYXNzX2luaXQg
aW5pdGlhbGl6ZXIgdG8gdXNlIGZvciB0aGUgImJhc2UiIGZpZWxkCisgKiAoRXZhc19TbWFydF9D
bGFzcykuCisgKgorICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05VTEwKKyAqIEBz
ZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OCisgKiBAc2VlIEVXS19WSUVXX1NN
QVJUX0NMQVNTX0lOSVRfTkFNRV9WRVJTSU9OCisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdfU01BUlRf
Q0xBU1NfSU5JVChzbWFydF9jbGFzc19pbml0KSB7c21hcnRfY2xhc3NfaW5pdCwgRVdLX1ZJRVdf
U01BUlRfQ0xBU1NfVkVSU0lPTiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKworLyoqCisgKiBJ
bml0aWFsaXplciB0byB6ZXJvIGEgd2hvbGUgRXdrX1ZpZXdfU21hcnRfQ2xhc3Mgc3RydWN0dXJl
LgorICoKKyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OCisgKiBAc2Vl
IEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTkFNRV9WRVJTSU9OCisgKiBAc2VlIEVXS19WSUVX
X1NNQVJUX0NMQVNTX0lOSVQKKyAqLworI2RlZmluZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklU
X05VTEwgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVChFVkFTX1NNQVJUX0NMQVNTX0lOSVRfTlVM
TCkKKworLyoqCisgKiBJbml0aWFsaXplciB0byB6ZXJvIGEgd2hvbGUgRXdrX1ZpZXdfU21hcnRf
Q2xhc3Mgc3RydWN0dXJlIGFuZCBzZXQgdmVyc2lvbi4KKyAqCisgKiBTaW1pbGFyIHRvIEVXS19W
SUVXX1NNQVJUX0NMQVNTX0lOSVRfTlVMTCwgYnV0IHdpbGwgc2V0IHZlcnNpb24gZmllbGQgb2YK
KyAqIEV2YXNfU21hcnRfQ2xhc3MgKGJhc2UgZmllbGQpIHRvIGxhdGVzdCBFVkFTX1NNQVJUX0NM
QVNTX1ZFUlNJT04KKyAqCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTlVMTAor
ICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05BTUVfVkVSU0lPTgorICogQHNlZSBF
V0tfVklFV19TTUFSVF9DTEFTU19JTklUCisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdfU01BUlRfQ0xB
U1NfSU5JVF9WRVJTSU9OIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVQoRVZBU19TTUFSVF9DTEFT
U19JTklUX1ZFUlNJT04pCisKKy8qKgorICogSW5pdGlhbGl6ZXIgdG8gemVybyBhIHdob2xlIEV3
a19WaWV3X1NtYXJ0X0NsYXNzIHN0cnVjdHVyZSBhbmQgc2V0CisgKiBuYW1lIGFuZCB2ZXJzaW9u
LgorICoKKyAqIFNpbWlsYXIgdG8gRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9OVUxMLCBidXQg
d2lsbCBzZXQgdmVyc2lvbiBmaWVsZCBvZgorICogRXZhc19TbWFydF9DbGFzcyAoYmFzZSBmaWVs
ZCkgdG8gbGF0ZXN0IEVWQVNfU01BUlRfQ0xBU1NfVkVSU0lPTiBhbmQgbmFtZQorICogdG8gdGhl
IHNwZWNpZmljIHZhbHVlLgorICoKKyAqIEl0IHdpbGwga2VlcCBhIHJlZmVyZW5jZSB0byBuYW1l
IGZpZWxkIGFzIGEgImNvbnN0IGNoYXIgKiIsIHRoYXQgaXMsCisgKiBuYW1lIG11c3QgYmUgYXZh
aWxhYmxlIHdoaWxlIHRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCAoaGludDogc3RhdGljIG9yIGdsb2Jh
bCEpCisgKiBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCisgKgorICogQHNlZSBFV0tfVklFV19T
TUFSVF9DTEFTU19JTklUX05VTEwKKyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9W
RVJTSU9OCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVQKKyAqLworI2RlZmluZSBF
V0tfVklFV19TTUFSVF9DTEFTU19JTklUX05BTUVfVkVSU0lPTihuYW1lKSBFV0tfVklFV19TTUFS
VF9DTEFTU19JTklUKEVWQVNfU01BUlRfQ0xBU1NfSU5JVF9OQU1FX1ZFUlNJT04obmFtZSkpCisK
Ky8qKgorICogQGludGVybmFsCisgKgorICogcHJpdmF0ZSBkYXRhIHRoYXQgaXMgdXNlZCBpbnRl
cm5hbGx5IGJ5IEVGTCBXZWJLaXQgYW5kIHNob3VsZCBuZXZlcgorICogYmUgbW9kaWZpZWQgZnJv
bSBvdXRzaWRlLgorICovCit0eXBlZGVmIHN0cnVjdCBfRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhIEV3
a19WaWV3X1ByaXZhdGVfRGF0YTsKKworZW51bSBfRXdrX01lbnVfSXRlbV9UeXBlIHsKKyAgICBF
V0tfTUVOVV9TRVBBUkFUT1IsCisgICAgRVdLX01FTlVfR1JPVVAsCisgICAgRVdLX01FTlVfT1BU
SU9OCit9OwordHlwZWRlZiBlbnVtIF9Fd2tfTWVudV9JdGVtX1R5cGUgRXdrX01lbnVfSXRlbV9U
eXBlOworCisKKy8qKgorICogU3RydWN0dXJlIGRvIGNvbnRhaW4gZGF0YSBvZiBlYWNoIG1lbnUg
aXRlbQorICovCit0eXBlZGVmIHN0cnVjdCBfRXdrX01lbnVfSXRlbSBFd2tfTWVudV9JdGVtOwor
c3RydWN0IF9Fd2tfTWVudV9JdGVtIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0OyAvKio8IEl0ZW0n
cyB0ZXh0ICovCisgICAgRXdrX01lbnVfSXRlbV9UeXBlIHR5cGU7IC8qKiBJdGVtJ3MgdHlwZSAq
LworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdG8gY29udGFpbiBQb3B1cCBtZW51IGRhdGEuCisg
Ki8KK3R5cGVkZWYgc3RydWN0IF9Fd2tfTWVudSBFd2tfTWVudTsKK3N0cnVjdCBfRXdrX01lbnUg
eworICAgICAgICBFaW5hX0xpc3QqIGl0ZW1zOworICAgICAgICBpbnQgeDsKKyAgICAgICAgaW50
IHk7CisgICAgICAgIGludCB3aWR0aDsKKyAgICAgICAgaW50IGhlaWdodDsKK307CisKKy8qKgor
ICogU3RydWN0dXJlIHRvIGNvbnRhaW4gRG93bmxvYWQgZGF0YQorICovCit0eXBlZGVmIHN0cnVj
dCBfRXdrX0Rvd25sb2FkIEV3a19Eb3dubG9hZDsKK3N0cnVjdCBfRXdrX0Rvd25sb2FkIHsKKyAg
ICBjb25zdCBjaGFyKiB1cmw7CisgICAgLyogdG8gYmUgZXh0ZW5kZWQgKi8KK307CisKKy8qKgor
ICogU2Nyb2xsIHJlcXVlc3QgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHN1YmNsYXNzIGlt
cGxlbWVudGF0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0V3a19TY3JvbGxfUmVxdWVzdCBF
d2tfU2Nyb2xsX1JlcXVlc3Q7CitzdHJ1Y3QgX0V3a19TY3JvbGxfUmVxdWVzdCB7CisgICAgRXZh
c19Db29yZCBkeCwgZHk7CisgICAgRXZhc19Db29yZCB4LCB5LCB3LCBoLCB4MiwgeTI7CisgICAg
RWluYV9Cb29sIG1haW5fc2Nyb2xsOworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdG8gY29udGFp
biBpbnRlcm5hbCBWaWV3IGRhdGEsIGl0IGlzIHRvIGJlIGNvbnNpZGVyZWQKKyAqIHByaXZhdGUg
YnkgdXNlcnMsIGJ1dCBtYXkgYmUgZXh0ZW5kZWQgb3IgY2hhbmdlZCBieSBzdWItY2xhc3Nlcwor
ICogKHRoYXQncyB3aHkgaXQncyBpbiBwdWJsaWMgaGVhZGVyIGZpbGUpLgorICovCitzdHJ1Y3Qg
X0V3a19WaWV3X1NtYXJ0X0RhdGEgeworICAgIEV2YXNfT2JqZWN0X1NtYXJ0X0NsaXBwZWRfRGF0
YSBiYXNlOworICAgIGNvbnN0IEV3a19WaWV3X1NtYXJ0X0NsYXNzICphcGk7IC8qKjwgcmVmZXJl
bmNlIHRvIGNhc3RlZCBjbGFzcyBpbnN0YW5jZSAqLworICAgIEV2YXNfT2JqZWN0ICpzZWxmOyAv
Kio8IHJlZmVyZW5jZSB0byBvd25lciBvYmplY3QgKi8KKyAgICBFdmFzX09iamVjdCAqbWFpbl9m
cmFtZTsgLyoqPCByZWZlcmVuY2UgdG8gbWFpbiBmcmFtZSBvYmplY3QgKi8KKyAgICBFdmFzX09i
amVjdCAqYmFja2luZ19zdG9yZTsgLyoqPCByZWZlcmVuY2UgdG8gYmFja2luZyBzdG9yZSAqLwor
ICAgIEV3a19WaWV3X1ByaXZhdGVfRGF0YSAqX3ByaXY7IC8qKjwgc2hvdWxkIG5ldmVyIGJlIGFj
Y2Vzc2VkLCBjKysgc3R1ZmYgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBFdmFzX0Nvb3JkIHgs
IHksIHcsIGg7IC8qKjwgbGFzdCB1c2VkIHZpZXdwb3J0ICovCisgICAgfSB2aWV3OworICAgIHN0
cnVjdCB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBmbG9hdCBzdGFydDsKKyAgICAg
ICAgICAgIGZsb2F0IGVuZDsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnQ7IC8qKjwgaWYgPiAw
LjAsIHRoZW4gZG9pbmcgYW5pbWF0ZWQgem9vbS4gKi8KKyAgICAgICAgfSB6b29tOworICAgIH0g
YW5pbWF0ZWRfem9vbTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHIsIGcs
IGIsIGE7CisgICAgfSBiZ19jb2xvcjsKKyAgICBFaW5hX0Jvb2wgem9vbV93ZWFrX3Ntb290aF9z
Y2FsZToxOworICAgIHN0cnVjdCB7IC8qKjwgd2hhdCBjaGFuZ2VkIHNpbmNlIGxhc3Qgc21hcnRf
Y2FsY3VsYXRlICovCisgICAgICAgIEVpbmFfQm9vbCBhbnk6MTsKKyAgICAgICAgRWluYV9Cb29s
IHNpemU6MTsKKyAgICAgICAgRWluYV9Cb29sIHBvc2l0aW9uOjE7CisgICAgICAgIEVpbmFfQm9v
bCBmcmFtZV9yZWN0OjE7CisgICAgfSBjaGFuZ2VkOworfTsKKworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfYmFzZV9zbWFydF9zZXQoRXdrX1ZpZXdfU21hcnRfQ2xhc3MgKmFwaSk7CitFQVBJ
IEVpbmFfQm9vbCAgICBld2tfdmlld19zaW5nbGVfc21hcnRfc2V0KEV3a19WaWV3X1NtYXJ0X0Ns
YXNzICphcGkpOworCitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19zaW5nbGVfYWRkKEV2YXMg
KmUpOworCitFQVBJIHZvaWQgICAgICAgICBld2tfdmlld19maXhlZF9sYXlvdXRfc2l6ZV9zZXQo
RXZhc19PYmplY3QgKm8sIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoKTsKK0VBUEkgdm9pZCAg
ICAgICAgIGV3a192aWV3X2ZpeGVkX2xheW91dF9zaXplX2dldChFdmFzX09iamVjdCAqbywgRXZh
c19Db29yZCAqdywgRXZhc19Db29yZCAqaCk7CisKK0VBUEkgdm9pZCAgICAgICAgIGV3a192aWV3
X3RoZW1lX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqcGF0aCk7CitFQVBJIGNvbnN0
IGNoYXIgICpld2tfdmlld190aGVtZV9nZXQoRXZhc19PYmplY3QgKm8pOworCitFQVBJIEV2YXNf
T2JqZWN0ICpld2tfdmlld19mcmFtZV9tYWluX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitF
QVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19mcmFtZV9mb2N1c2VkX2dldChjb25zdCBFdmFzX09i
amVjdCAqbyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3VyaV9zZXQoRXZhc19PYmpl
Y3QgKm8sIGNvbnN0IGNoYXIgKnVyaSk7CitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld191cmlf
Z2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3Rp
dGxlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192
aWV3X2VkaXRhYmxlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAg
ICBld2tfdmlld19lZGl0YWJsZV9zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlZGl0YWJs
ZSk7CisKK0VBUEkgdm9pZCAgICAgICAgIGV3a192aWV3X2JnX2NvbG9yX3NldChFdmFzX09iamVj
dCAqbywgaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEpOworRUFQSSB2b2lkICAgICAgICAgZXdr
X3ZpZXdfYmdfY29sb3JfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvLCBpbnQgKnIsIGludCAqZywg
aW50ICpiLCBpbnQgKmEpOworCitFQVBJIGNoYXIgICAgICAgICpld2tfdmlld19zZWxlY3Rpb25f
Z2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3Nl
bGVjdF9ub25lKEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3Nl
bGVjdF9hbGwoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2Vs
ZWN0X3BhcmFncmFwaChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d19zZWxlY3Rfc2VudGVuY2UoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdr
X3ZpZXdfc2VsZWN0X2xpbmUoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdr
X3ZpZXdfc2VsZWN0X3dvcmQoRXZhc19PYmplY3QgKm8pOworCitFQVBJIHZvaWQgICAgICAgICBl
d2tfdmlld19wb3B1cF9zZWxlY3RlZF9zZXQoRXZhc19PYmplY3QgKm8sIGludCBpbmRleCk7CitF
QVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19wb3B1cF9kZXN0cm95KEV2YXNfT2JqZWN0ICpvKTsK
KworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfdGV4dF9zZWFyY2goY29uc3QgRXZhc19PYmpl
Y3QgKm8sIGNvbnN0IGNoYXIgKnN0cmluZywgRWluYV9Cb29sIGNhc2Vfc2Vuc2l0aXZlLCBFaW5h
X0Jvb2wgZm9yd2FyZCwgRWluYV9Cb29sIHdyYXApOworCitFQVBJIHVuc2lnbmVkIGludCBld2tf
dmlld190ZXh0X21hdGNoZXNfbWFyayhFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqc3RyaW5n
LCBFaW5hX0Jvb2wgY2FzZV9zZW5zaXRpdmUsIEVpbmFfQm9vbCBoaWdobGlnaHQsIHVuc2lnbmVk
IGludCBsaW1pdCk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld190ZXh0X21hdGNoZXNfdW5t
YXJrX2FsbChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld190ZXh0
X21hdGNoZXNfaGlnaGxpZ2h0X3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGhpZ2hsaWdo
dCk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld190ZXh0X21hdGNoZXNfaGlnaGxpZ2h0X2dl
dChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgZG91YmxlICAgICAgIGV3a192aWV3X2xv
YWRfcHJvZ3Jlc3NfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKKworRUFQSSBFaW5hX0Jvb2wg
ICAgZXdrX3ZpZXdfc3RvcChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tf
dmlld19yZWxvYWQoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdf
cmVsb2FkX2Z1bGwoRXZhc19PYmplY3QgKm8pOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d19iYWNrKEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X2Zvcndh
cmQoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfbmF2aWdhdGUo
RXZhc19PYmplY3QgKm8sIGludCBzdGVwcyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3
X2JhY2tfcG9zc2libGUoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfZm9yd2FyZF9wb3NzaWJsZShFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBl
d2tfdmlld19uYXZpZ2F0ZV9wb3NzaWJsZShFdmFzX09iamVjdCAqbywgaW50IHN0ZXBzKTsKKwor
RUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfZ2V0KGNvbnN0IEV2YXNf
T2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X2hpc3RvcnlfZW5hYmxlX3Nl
dChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGVuYWJsZSk7CitFQVBJIEV3a19IaXN0b3J5ICpl
d2tfdmlld19oaXN0b3J5X2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgZmxvYXQg
ICAgICAgIGV3a192aWV3X3pvb21fZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWlu
YV9Cb29sICAgIGV3a192aWV3X3pvb21fc2V0KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tLCBF
dmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfem9vbV93ZWFrX3Ntb290aF9zY2FsZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQ
SSB2b2lkICAgICAgICAgZXdrX3ZpZXdfem9vbV93ZWFrX3Ntb290aF9zY2FsZV9zZXQoRXZhc19P
YmplY3QgKm8sIEVpbmFfQm9vbCBzbW9vdGhfc2NhbGUpOworCitFQVBJIEVpbmFfQm9vbCAgICBl
d2tfdmlld196b29tX3dlYWtfc2V0KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tLCBFdmFzX0Nv
b3JkIGN4LCBFdmFzX0Nvb3JkIGN5KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21f
YW5pbWF0ZWRfbWFya19zdGFydChFdmFzX09iamVjdCAqbywgZmxvYXQgem9vbSk7CitFQVBJIEVp
bmFfQm9vbCAgICBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKEV2YXNfT2JqZWN0ICpv
LCBmbG9hdCB6b29tKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRf
bWFya19jdXJyZW50KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tKTsKK0VBUEkgRWluYV9Cb29s
ICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKEV2YXNfT2JqZWN0ICpvKTsKKwor
RUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9zZXQoRXZhc19PYmplY3Qg
Km8sIGZsb2F0IHpvb20sIGZsb2F0IGR1cmF0aW9uLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3Jk
IGN5KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fdGV4dF9vbmx5X2dldChjb25z
dCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld196b29tX3RleHRf
b25seV9zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBzZXR0aW5nKTsKKworRUFQSSBFaW5h
X0Jvb2wgICAgZXdrX3ZpZXdfcHJlX3JlbmRlcl9yZWdpb24oRXZhc19PYmplY3QgKm8sIEV2YXNf
Q29vcmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCwgZmxvYXQg
em9vbSk7CitFQVBJIHZvaWQgICAgICAgICBld2tfdmlld19wcmVfcmVuZGVyX2NhbmNlbChFdmFz
X09iamVjdCAqbyk7CisKKy8qIHNldHRpbmdzICovCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmll
d19zZXR0aW5nX3VzZXJfYWdlbnRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWlu
YV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfdXNlcl9hZ2VudF9zZXQoRXZhc19PYmplY3QgKm8s
IGNvbnN0IGNoYXIgKnVzZXJfYWdlbnQpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19z
ZXR0aW5nX2F1dG9fbG9hZF9pbWFnZXNfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkg
RWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfYXV0b19sb2FkX2ltYWdlc19zZXQoRXZhc19P
YmplY3QgKm8sIEVpbmFfQm9vbCBhdXRvbWF0aWMpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tf
dmlld19zZXR0aW5nX2F1dG9fc2hyaW5rX2ltYWdlc19nZXQoY29uc3QgRXZhc19PYmplY3QgKm8p
OworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19hdXRvX3Nocmlua19pbWFnZXNf
c2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgYXV0b21hdGljKTsKKworRUFQSSBFaW5hX0Jv
b2wgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfc2NyaXB0c19nZXQoY29uc3QgRXZhc19PYmpl
Y3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfc2NyaXB0
c19zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlbmFibGUpOworCitFQVBJIEVpbmFfQm9v
bCAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVnaW5zX2dldChjb25zdCBFdmFzX09iamVj
dCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVnaW5z
X3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGVuYWJsZSk7CisKK0VBUEkgRWluYV9Cb29s
ICAgIGV3a192aWV3X3NldHRpbmdfc2NyaXB0c193aW5kb3dfb3Blbl9nZXQoY29uc3QgRXZhc19P
YmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRzX3dp
bmRvd19vcGVuX3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGFsbG93KTsKKworRUFQSSBF
aW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19yZXNpemFibGVfdGV4dGFyZWFzX2dldChjb25z
dCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX3Jl
c2l6YWJsZV90ZXh0YXJlYXNfc2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgZW5hYmxlKTsK
KworRUFQSSBjb25zdCBjaGFyICAqZXdrX3ZpZXdfc2V0dGluZ191c2VyX3N0eWxlc2hlZXRfZ2V0
KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRp
bmdfdXNlcl9zdHlsZXNoZWV0X3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqdXJpKTsK
KworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19wcml2YXRlX2Jyb3dzaW5nX2dl
dChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0
aW5nX3ByaXZhdGVfYnJvd3Npbmdfc2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgZW5hYmxl
KTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19jYXJldF9icm93c2luZ19n
ZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0
dGluZ19jYXJldF9icm93c2luZ19zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlbmFibGUp
OworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2N1c3RvbV9n
ZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0
dGluZ19lbmNvZGluZ19jdXN0b21fc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFyICplbmNv
ZGluZyk7CitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2RlZmF1
bHRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3
X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVsdF9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIg
KmVuY29kaW5nKTsKKworRUFQSSBpbnQgICAgICAgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21p
bmltdW1fc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fc2l6ZV9zZXQoRXZhc19PYmplY3QgKm8sIGlu
dCBzaXplKTsKK0VBUEkgaW50ICAgICAgICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9taW5pbXVt
X2xvZ2ljYWxfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wg
ICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fbG9naWNhbF9zaXplX3NldChFdmFzX09i
amVjdCAqbywgaW50IHNpemUpOworRUFQSSBpbnQgICAgICAgICAgZXdrX3ZpZXdfc2V0dGluZ19m
b250X2RlZmF1bHRfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jv
b2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9zZXQoRXZhc19PYmplY3Qg
Km8sIGludCBzaXplKTsKK0VBUEkgaW50ICAgICAgICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9t
b25vc3BhY2Vfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wg
ICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9zaXplX3NldChFdmFzX09iamVjdCAq
bywgaW50IHNpemUpOworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2ZvbnRf
c3RhbmRhcmRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3
a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFyZF9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNo
YXIgKmZhbWlseSk7CisKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9j
dXJzaXZlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tf
dmlld19zZXR0aW5nX2ZvbnRfY3Vyc2l2ZV9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIg
KmZhbWlseSk7CisKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9tb25v
c3BhY2VfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192
aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFy
ICpmYW1pbHkpOworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2ZvbnRfZmFu
dGFzeV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFyICpm
YW1pbHkpOworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2ZvbnRfc2VyaWZf
Z2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3Nl
dHRpbmdfZm9udF9zZXJpZl9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWlseSk7
CisKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9zYW5zX3NlcmlmX2dl
dChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0
aW5nX2ZvbnRfc2Fuc19zZXJpZl9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZhbWls
eSk7CisKKy8qIHRvIGJlIHVzZWQgYnkgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zICovCitFQVBJ
IEV3a19WaWV3X1NtYXJ0X0RhdGEgKmV3a192aWV3X3NtYXJ0X2RhdGFfZ2V0KGNvbnN0IEV2YXNf
T2JqZWN0ICpvKTsKKworRUFQSSBjb25zdCBFaW5hX1JlY3RhbmdsZSAqZXdrX3ZpZXdfcmVwYWlu
dHNfZ2V0KGNvbnN0IEV3a19WaWV3X1ByaXZhdGVfRGF0YSAqcHJpdiwgc2l6ZV90ICpjb3VudCk7
CitFQVBJIGNvbnN0IEV3a19TY3JvbGxfUmVxdWVzdCAqZXdrX3ZpZXdfc2Nyb2xsX3JlcXVlc3Rz
X2dldChjb25zdCBFd2tfVmlld19Qcml2YXRlX0RhdGEgKnByaXYsIHNpemVfdCAqY291bnQpOwor
CitFQVBJIHZvaWQgZXdrX3ZpZXdfcmVwYWludF9hZGQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpw
cml2LCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFzX0Nvb3Jk
IGgpOworCitFQVBJIHZvaWQgZXdrX3ZpZXdfbGF5b3V0X2lmX25lZWRlZF9yZWN1cnNpdmUoRXdr
X1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2KTsKKworRUFQSSB2b2lkIGV3a192aWV3X3Njcm9sbHNf
cHJvY2VzcyhFd2tfVmlld19TbWFydF9EYXRhICpzZCk7CisKKy8qKgorICogU3RydWN0dXJlIHRo
YXQga2VlcHMgcGFpbnQgY29udGV4dC4KKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2Vu
ZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBk
ZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9Fd2tf
Vmlld19QYWludF9Db250ZXh0IEV3a19WaWV3X1BhaW50X0NvbnRleHQ7CisKK0VBUEkgRXdrX1Zp
ZXdfUGFpbnRfQ29udGV4dCAqZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9uZXcoRXdrX1ZpZXdfUHJp
dmF0ZV9EYXRhICpwcml2LCBjYWlyb190ICpjcik7CitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRf
Y29udGV4dF9mcmVlKEV3a19WaWV3X1BhaW50X0NvbnRleHQgKmN0eHQpOworCitFQVBJIHZvaWQg
ZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9zYXZlKEV3a19WaWV3X1BhaW50X0NvbnRleHQgKmN0eHQp
OworRUFQSSB2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcmVzdG9yZShFd2tfVmlld19QYWlu
dF9Db250ZXh0ICpjdHh0KTsKK0VBUEkgdm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X2NsaXAo
RXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEp
OworRUFQSSB2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnQoRXdrX1ZpZXdfUGFpbnRf
Q29udGV4dCAqY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEpOworRUFQSSB2b2lkIGV3
a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnRfY29udGVudHMoRXdrX1ZpZXdfUGFpbnRfQ29udGV4
dCAqY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEpOworRUFQSSB2b2lkIGV3a192aWV3
X3BhaW50X2NvbnRleHRfc2NhbGUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgZmxvYXQg
c2NhbGVfeCwgZmxvYXQgc2NhbGVfeSk7CitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4
dF90cmFuc2xhdGUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgZmxvYXQgeCwgZmxvYXQg
eSk7CisKK0VBUEkgRWluYV9Cb29sIGV3a192aWV3X3BhaW50KEV3a19WaWV3X1ByaXZhdGVfRGF0
YSAqcHJpdiwgY2Fpcm9fdCAqY3IsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlICphcmVhKTsKK0VBUEkg
RWluYV9Cb29sIGV3a192aWV3X3BhaW50X2NvbnRlbnRzKEV3a19WaWV3X1ByaXZhdGVfRGF0YSAq
cHJpdiwgY2Fpcm9fdCAqY3IsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlICphcmVhKTsKKworI2lmZGVm
IF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvLyBld2tfdmlld19oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52073</attachid>
            <date>2010-03-30 13:09:40 -0700</date>
            <delta_ts>2010-04-07 09:33:46 -0700</delta_ts>
            <desc>Add ewk_view to WK/efl/ewk.</desc>
            <filename>webkit_efl_ewk-1.diff</filename>
            <type>text/plain</type>
            <size>143122</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L0NoYW5nZUxvZwor
KysgV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDEwLTAzLTMwICBMZWFuZHJv
IFBlcmVpcmEgIDxsZWFuZHJvQHByb2Z1c2lvbi5tb2JpPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBld2tfdmlldyAodGhlIGhpZ2ggbGV2ZWwg
b2JqZWN0IHRvIGFjY2VzIHRoZSBXZWJLaXQtRUZMIGJyb3dzZXIKKyAgICAgICAgY29tcG9uZW50
KSB0byBlZmwvZXdrLgorICAgICAgICBodHRwOi8vd2Via2l0Lm9yZy9iLzM1OTMyCisKKyAgICAg
ICAgKiBlZmwvZXdrL2V3a192aWV3LmNwcDogQWRkZWQuCisgICAgICAgICogZWZsL2V3ay9ld2tf
dmlldy5oOiBBZGRlZC4KKwogMjAxMC0wMy0yOCAgQWxleGV5IFByb3NrdXJ5YWtvdiAgPGFwQGFw
cGxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXguIEluY2x1ZGUgV2luZG93c0tleWJvYXJkQ29k
ZXMuaCBpbnN0ZWFkIG9mIEtleWJvYXJkQ29kZXMuaC4KSW5kZXg6IFdlYktpdC9lZmwvZXdrL2V3
a192aWV3LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSAvZGV2L251bGwKKysrIFdlYktpdC9lZmwvZXdrL2V3
a192aWV3LmNwcApAQCAtMCwwICsxLDM2NDQgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA5
LTIwMTAgUHJvRlVTSU9OIGVtYmVkZGVkIHN5c3RlbXMKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDkt
MjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAg
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgImV3a192aWV3LmgiCisKKyNpbmNsdWRlICJDaHJvbWVDbGllbnRFZmwuaCIKKyNpbmNsdWRl
ICJDb250ZXh0TWVudUNsaWVudEVmbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisj
aW5jbHVkZSAiRHJhZ0NsaWVudEVmbC5oIgorI2luY2x1ZGUgIkVXZWJLaXQuaCIKKyNpbmNsdWRl
ICJFZGl0b3JDbGllbnRFZmwuaCIKKyNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKKyNpbmNs
dWRlICJGcmFtZUxvYWRlckNsaWVudEVmbC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNsaWVudEVmbC5o
IgorI2luY2x1ZGUgIlBvcHVwTWVudUNsaWVudC5oIgorI2luY2x1ZGUgIlByb2dyZXNzVHJhY2tl
ci5oIgorI2luY2x1ZGUgImV3a19wcml2YXRlLmgiCisKKyNpbmNsdWRlIDxFY29yZS5oPgorI2lu
Y2x1ZGUgPEVpbmEuaD4KKyNpbmNsdWRlIDxFdmFzLmg+CisjaW5jbHVkZSA8ZWluYV9zYWZldHlf
Y2hlY2tzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2RlZmluZSBaT09NX01JTiAoMC4w
NSkKKyNkZWZpbmUgWk9PTV9NQVggKDQuMCkKKworc3RhdGljIGNvbnN0IGNoYXIgRVdLX1ZJRVdf
VFlQRV9TVFJbXSA9ICJFV0tfVmlldyI7CisKK3N0YXRpYyBjb25zdCBzaXplX3QgRVdLX1ZJRVdf
UkVQQUlOVFNfU0laRV9JTklUSUFMID0gMzI7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVX
X1JFUEFJTlRTX1NJWkVfU1RFUCA9IDg7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVXX1JF
UEFJTlRTX1NJWkVfTUFYX0ZSRUUgPSA2NDsKKworc3RhdGljIGNvbnN0IHNpemVfdCBFV0tfVklF
V19TQ1JPTExTX1NJWkVfSU5JVElBTCA9IDg7CitzdGF0aWMgY29uc3Qgc2l6ZV90IEVXS19WSUVX
X1NDUk9MTFNfU0laRV9TVEVQID0gMjsKK3N0YXRpYyBjb25zdCBzaXplX3QgRVdLX1ZJRVdfU0NS
T0xMU19TSVpFX01BWF9GUkVFID0gMzI7CisKK3N0cnVjdCBfRXdrX1ZpZXdfUHJpdmF0ZV9EYXRh
IHsKKyAgICBXZWJDb3JlOjpQYWdlKiBwYWdlOworICAgIFdlYkNvcmU6OlNldHRpbmdzKiBwYWdl
X3NldHRpbmdzOworICAgIFdlYkNvcmU6OkZyYW1lKiBtYWluX2ZyYW1lOworICAgIEV3a19IaXN0
b3J5KiBoaXN0b3J5OworICAgIHN0cnVjdCB7CisgICAgICAgIEV3a19NZW51IG1lbnU7CisgICAg
ICAgIFdlYkNvcmU6OlBvcHVwTWVudUNsaWVudCogbWVudV9jbGllbnQ7CisgICAgfSBwb3B1cDsK
KyAgICBzdHJ1Y3QgeworICAgICAgICBFaW5hX1JlY3RhbmdsZSogYXJyYXk7CisgICAgICAgIHNp
emVfdCBjb3VudDsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKKyAgICB9IHJlcGFpbnRzOwor
ICAgIHN0cnVjdCB7CisgICAgICAgIEV3a19TY3JvbGxfUmVxdWVzdCogYXJyYXk7CisgICAgICAg
IHNpemVfdCBjb3VudDsKKyAgICAgICAgc2l6ZV90IGFsbG9jYXRlZDsKKyAgICB9IHNjcm9sbHM7
CisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciogdXNlcl9hZ2VudDsKKyAgICAgICAg
Y29uc3QgY2hhciogdXNlcl9zdHlsZXNoZWV0OworICAgICAgICBjb25zdCBjaGFyKiBlbmNvZGlu
Z19kZWZhdWx0OworICAgICAgICBjb25zdCBjaGFyKiBlbmNvZGluZ19jdXN0b207CisgICAgICAg
IGludCBmb250X21pbmltdW1fc2l6ZTsKKyAgICAgICAgaW50IGZvbnRfbWluaW11bV9sb2dpY2Fs
X3NpemU7CisgICAgICAgIGludCBmb250X2RlZmF1bHRfc2l6ZTsKKyAgICAgICAgaW50IGZvbnRf
bW9ub3NwYWNlX3NpemU7CisgICAgICAgIGNvbnN0IGNoYXIqIGZvbnRfc3RhbmRhcmQ7CisgICAg
ICAgIGNvbnN0IGNoYXIqIGZvbnRfY3Vyc2l2ZTsKKyAgICAgICAgY29uc3QgY2hhciogZm9udF9t
b25vc3BhY2U7CisgICAgICAgIGNvbnN0IGNoYXIqIGZvbnRfZmFudGFzeTsKKyAgICAgICAgY29u
c3QgY2hhciogZm9udF9zZXJpZjsKKyAgICAgICAgY29uc3QgY2hhciogZm9udF9zYW5zX3Nlcmlm
OworICAgICAgICBFaW5hX0Jvb2wgYXV0b19sb2FkX2ltYWdlczoxOworICAgICAgICBFaW5hX0Jv
b2wgYXV0b19zaHJpbmtfaW1hZ2VzOjE7CisgICAgICAgIEVpbmFfQm9vbCBlbmFibGVfc2NyaXB0
czoxOworICAgICAgICBFaW5hX0Jvb2wgZW5hYmxlX3BsdWdpbnM6MTsKKyAgICAgICAgRWluYV9C
b29sIHNjcmlwdHNfd2luZG93X29wZW46MTsKKyAgICAgICAgRWluYV9Cb29sIHJlc2l6YWJsZV90
ZXh0YXJlYXM6MTsKKyAgICAgICAgRWluYV9Cb29sIHByaXZhdGVfYnJvd3Npbmc6MTsKKyAgICAg
ICAgRWluYV9Cb29sIGNhcmV0X2Jyb3dzaW5nOjE7CisgICAgfSBzZXR0aW5nczsKKyAgICBzdHJ1
Y3QgeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgZG91YmxlIHN0YXJ0OworICAgICAg
ICAgICAgZG91YmxlIGVuZDsKKyAgICAgICAgICAgIGRvdWJsZSBkdXJhdGlvbjsKKyAgICAgICAg
fSB0aW1lOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgZmxvYXQgc3RhcnQ7CisgICAg
ICAgICAgICBmbG9hdCBlbmQ7CisgICAgICAgICAgICBmbG9hdCByYW5nZTsKKyAgICAgICAgfSB6
b29tOworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgRXZhc19Db29yZCB4LCB5OworICAg
ICAgICB9IGNlbnRlcjsKKyAgICAgICAgRWNvcmVfQW5pbWF0b3IqIGFuaW1hdG9yOworICAgIH0g
YW5pbWF0ZWRfem9vbTsKKyAgICBzdHJ1Y3QgeworICAgICAgICBFdmFzX0Nvb3JkIHcsIGg7Cisg
ICAgICAgIEVpbmFfQm9vbCB1c2U6MTsKKyAgICB9IGZpeGVkX2xheW91dDsKK307CisKKyNpZm5k
ZWYgRVdLX1RZUEVfQ0hFQ0sKKyNkZWZpbmUgRVdLX1ZJRVdfVFlQRV9DSEVDSyhvLCAuLi4pIGRv
IHsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEVXS19WSUVXX1RZUEVfQ0hFQ0sobywgLi4u
KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc
CisgICAgICAgIGNvbnN0IGNoYXIqIF90bXBfb3R5cGUgPSBldmFzX29iamVjdF90eXBlX2dldChv
KTsgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IEV2YXNfU21hcnQqIF90bXBfcyA9IGV2
YXNfb2JqZWN0X3NtYXJ0X3NtYXJ0X2dldChvKTsgICAgICBcCisgICAgICAgIGlmIChFSU5BX1VO
TElLRUxZKCFfdG1wX3MpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgICAgICAgICBFSU5BX0xPR19DUklUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCIlcCAoJXMpIGlzIG5vdCBhIHNtYXJ0
IG9iamVjdCEiLCBvLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIF90bXBf
b3R5cGUgPyBfdG1wX290eXBlIDogIihudWxsKSIpOyAgICAgICAgICAgICAgICAgICBcCisgICAg
ICAgICAgICByZXR1cm4gX19WQV9BUkdTX187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IEV2YXNfU21hcnRf
Q2xhc3MqIF90bXBfc2MgPSBldmFzX3NtYXJ0X2NsYXNzX2dldChfdG1wX3MpOyBcCisgICAgICAg
IGlmIChFSU5BX1VOTElLRUxZKCFfdG1wX3NjKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBcCisgICAgICAgICAgICBFSU5BX0xPR19DUklUICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCIlcCAoJXMpIGlz
IG5vdCBhIHNtYXJ0IG9iamVjdCEiLCBvLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAg
ICAgICAgIF90bXBfb3R5cGUgPyBfdG1wX290eXBlIDogIihudWxsKSIpOyAgICAgICAgICAgICAg
ICAgICBcCisgICAgICAgICAgICByZXR1cm4gX19WQV9BUkdTX187ICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChF
SU5BX1VOTElLRUxZKF90bXBfc2MtPmRhdGEgIT0gRVdLX1ZJRVdfVFlQRV9TVFIpKSB7ICAgICAg
ICBcCisgICAgICAgICAgICBFSU5BX0xPR19DUklUICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCIlcCAoJXMpIGlzIG5vdCBv
ZiBhbiBld2tfdmlldyAobmVlZCAlcCwgZ290ICVwKSEiLCAgICBcCisgICAgICAgICAgICAgICAg
IG8sIF90bXBfb3R5cGUgPyBfdG1wX290eXBlIDogIihudWxsKSIsICAgICAgICAgICAgICAgICBc
CisgICAgICAgICAgICAgICAgIEVXS19WSUVXX1RZUEVfU1RSLCBfdG1wX3NjLT5kYXRhKTsgICAg
ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gX19WQV9BUkdTX187ICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisg
ICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZGVmaW5lIEVXS19WSUVXX1NEX0dFVChvLCBwdHIp
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEV3a19WaWV3X1NtYXJ0X0Rh
dGEqIHB0ciA9IChFd2tfVmlld19TbWFydF9EYXRhKilldmFzX29iamVjdF9zbWFydF9kYXRhX2dl
dChvKQorCisjZGVmaW5lIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgcHRyLCAuLi4pICAg
ICAgICAgIFwKKyAgICBFV0tfVklFV19UWVBFX0NIRUNLKG8sIF9fVkFfQVJHU19fKTsgICAgICAg
ICAgICAgICAgXAorICAgIEVXS19WSUVXX1NEX0dFVChvLCBwdHIpOyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBcCisgICAgaWYgKCFwdHIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFwKKyAgICAgICAgQ1JJVElDQUwoIm5vIHNtYXJ0IGRhdGEgZm9yIG9iamVj
dCAlcCAoJXMpIiwgICAgXAorICAgICAgICAgICAgICAgICBvLCBldmFzX29iamVjdF90eXBlX2dl
dChvKSk7ICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBfX1ZBX0FSR1NfXzsgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgRVdLX1ZJRVdfUFJJVl9HRVQo
c2QsIHB0cikgICAgICAgICAgICAgIFwKKyAgICBFd2tfVmlld19Qcml2YXRlX0RhdGEqIHB0ciA9
IHNkLT5fcHJpdgorCisjZGVmaW5lIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHRy
LCAuLi4pICAgICAgICAgICAgICAgXAorICAgIEVXS19WSUVXX1BSSVZfR0VUKHNkLCBwdHIpOyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXB0cikgeyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENSSVRJ
Q0FMKCJubyBwcml2YXRlIGRhdGEgZm9yIG9iamVjdCAlcCAoJXMpIiwgICAgICAgICAgXAorICAg
ICAgICAgICAgICAgICBzZC0+c2VsZiwgZXZhc19vYmplY3RfdHlwZV9nZXQoc2QtPnNlbGYpKTsg
ICAgIFwKKyAgICAgICAgcmV0dXJuIF9fVkFfQVJHU19fOyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBcCisgICAgfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21hcnRfY2hh
bmdlZChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBpZiAoc2QtPmNoYW5nZWQuYW55
KQorICAgICAgICByZXR1cm47CisgICAgc2QtPmNoYW5nZWQuYW55ID0gRUlOQV9UUlVFOworICAg
IGV2YXNfb2JqZWN0X3NtYXJ0X2NoYW5nZWQoc2QtPnNlbGYpOworfQorCitzdGF0aWMgRWluYV9C
b29sIF9ld2tfdmlld19yZXBhaW50c19yZXNpemUoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2
LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkKiB0bXAgPSByZWFsbG9jKHByaXYtPnJlcGFpbnRz
LmFycmF5LCBzaXplICogc2l6ZW9mKEVpbmFfUmVjdGFuZ2xlKSk7CisgICAgaWYgKCF0bXApIHsK
KyAgICAgICAgQ1JJVElDQUwoImNvdWxkIG5vdCByZWFsbG9jIHJlcGFpbnRzIGFycmF5IHRvICV6
dSBlbGVtZW50cy4iLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQor
ICAgIHByaXYtPnJlcGFpbnRzLmFsbG9jYXRlZCA9IHNpemU7CisgICAgcHJpdi0+cmVwYWludHMu
YXJyYXkgPSAoRWluYV9SZWN0YW5nbGUqKXRtcDsKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQor
CitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfcmVwYWludF9hZGQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRh
KiBwcml2LCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFzX0Nv
b3JkIGgpCit7CisgICAgRWluYV9SZWN0YW5nbGUqIHI7CisKKyAgICAvLyBmcHJpbnRmKHN0ZGVy
ciwgIj4+PiByZXBhaW50IHJlcXVlc3RlZDogJWQsJWQrJWR4JWRcbiIsIHgsIHksIHcsIGgpOwor
ICAgIGlmIChwcml2LT5yZXBhaW50cy5hbGxvY2F0ZWQgPT0gcHJpdi0+cmVwYWludHMuY291bnQp
IHsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghcHJpdi0+cmVwYWludHMuYWxs
b2NhdGVkKQorICAgICAgICAgICAgc2l6ZSA9IEVXS19WSUVXX1JFUEFJTlRTX1NJWkVfSU5JVElB
TDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2l6ZSA9IHByaXYtPnJlcGFpbnRzLmFsbG9j
YXRlZCArIEVXS19WSUVXX1JFUEFJTlRTX1NJWkVfU1RFUDsKKyAgICAgICAgaWYgKCFfZXdrX3Zp
ZXdfcmVwYWludHNfcmVzaXplKHByaXYsIHNpemUpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIHIgPSBwcml2LT5yZXBhaW50cy5hcnJheSArIHByaXYtPnJlcGFpbnRzLmNvdW50
OworICAgIHByaXYtPnJlcGFpbnRzLmNvdW50Kys7CisKKyAgICByLT54ID0geDsKKyAgICByLT55
ID0geTsKKyAgICByLT53ID0gdzsKKyAgICByLT5oID0gaDsKKworICAgIERCRygiYWRkIHJlcGFp
bnQgJWQsJWQrJWR4JWQiLCB4LCB5LCB3LCBoKTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3
X3JlcGFpbnRzX2ZsdXNoKEV3a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdikKK3sKKyAgICBwcml2
LT5yZXBhaW50cy5jb3VudCA9IDA7CisgICAgaWYgKHByaXYtPnJlcGFpbnRzLmFsbG9jYXRlZCA8
PSBFV0tfVklFV19SRVBBSU5UU19TSVpFX01BWF9GUkVFKQorICAgICAgICByZXR1cm47CisgICAg
X2V3a192aWV3X3JlcGFpbnRzX3Jlc2l6ZShwcml2LCBFV0tfVklFV19SRVBBSU5UU19TSVpFX01B
WF9GUkVFKTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfc2Nyb2xsc19yZXNpemUo
RXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkKiB0
bXAgPSByZWFsbG9jKHByaXYtPnNjcm9sbHMuYXJyYXksIHNpemUgKiBzaXplb2YoRXdrX1Njcm9s
bF9SZXF1ZXN0KSk7CisgICAgaWYgKCF0bXApIHsKKyAgICAgICAgQ1JJVElDQUwoImNvdWxkIG5v
dCByZWFsbG9jIHNjcm9sbHMgYXJyYXkgdG8gJXp1IGVsZW1lbnRzLiIsIHNpemUpOworICAgICAg
ICByZXR1cm4gRUlOQV9GQUxTRTsKKyAgICB9CisgICAgcHJpdi0+c2Nyb2xscy5hbGxvY2F0ZWQg
PSBzaXplOworICAgIHByaXYtPnNjcm9sbHMuYXJyYXkgPSAoRXdrX1Njcm9sbF9SZXF1ZXN0Kil0
bXA7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3Nj
cm9sbF9hZGQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBFdmFzX0Nvb3JkIGR4LCBFdmFz
X0Nvb3JkIGR5LCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFz
X0Nvb3JkIGgsIEVpbmFfQm9vbCBtYWluX3Njcm9sbCkKK3sKKyAgICBFd2tfU2Nyb2xsX1JlcXVl
c3QqIHI7CisgICAgRXdrX1Njcm9sbF9SZXF1ZXN0KiByX2VuZDsKKyAgICBFdmFzX0Nvb3JkIHgy
ID0geCArIHcsIHkyID0geSArIGg7CisKKyAgICByID0gcHJpdi0+c2Nyb2xscy5hcnJheTsKKyAg
ICByX2VuZCA9IHIgKyBwcml2LT5zY3JvbGxzLmNvdW50OworICAgIGZvciAoOyByIDwgcl9lbmQ7
IHIrKykgeworICAgICAgICBpZiAoci0+eCA9PSB4ICYmIHItPnkgPT0geSAmJiByLT53ID09IHcg
JiYgci0+aCA9PSBoKSB7CisgICAgICAgICAgICBEQkcoInJlZ2lvbiBhbHJlYWR5IHNjcm9sbGVk
ICVkLCVkKyVkeCVkICUrMDNkLCUrMDNkIGFkZCAiCisgICAgICAgICAgICAgICAgIiUrMDNkLCUr
MDNkIiwKKyAgICAgICAgICAgICAgICByLT54LCByLT55LCByLT53LCByLT5oLCByLT5keCwgci0+
ZHksIGR4LCBkeSk7CisgICAgICAgICAgICByLT5keCArPSBkeDsKKyAgICAgICAgICAgIHItPmR5
ICs9IGR5OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgoeCA8
PSByLT54ICYmIHgyID49IHItPngyKSAmJiAoeSA8PSByLT55ICYmIHkyID49IHItPnkyKSkgewor
ICAgICAgICAgICAgREJHKCJvbGQgdmlld3BvcnQgKCVkLCVkKyVkeCVkICUrMDNkLCUrMDNkKSB3
YXMgc2Nyb2xsZWQgaXRzZWxmLCAiCisgICAgICAgICAgICAgICAgImFkZCAlKzAzZCwlKzAzZCIs
CisgICAgICAgICAgICAgICAgci0+eCwgci0+eSwgci0+dywgci0+aCwgci0+ZHgsIHItPmR5LCBk
eCwgZHkpOworICAgICAgICAgICAgci0+eCArPSBkeDsKKyAgICAgICAgICAgIHItPnkgKz0gZHk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJpdi0+c2Nyb2xscy5hbGxvY2F0ZWQgPT0g
cHJpdi0+c2Nyb2xscy5jb3VudCkgeworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYg
KCFwcml2LT5zY3JvbGxzLmFsbG9jYXRlZCkKKyAgICAgICAgICAgIHNpemUgPSBFV0tfVklFV19T
Q1JPTExTX1NJWkVfSU5JVElBTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2l6ZSA9IHBy
aXYtPnNjcm9sbHMuYWxsb2NhdGVkICsgRVdLX1ZJRVdfU0NST0xMU19TSVpFX1NURVA7CisgICAg
ICAgIGlmICghX2V3a192aWV3X3Njcm9sbHNfcmVzaXplKHByaXYsIHNpemUpKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIHIgPSBwcml2LT5zY3JvbGxzLmFycmF5ICsgcHJpdi0+
c2Nyb2xscy5jb3VudDsKKyAgICBwcml2LT5zY3JvbGxzLmNvdW50Kys7CisKKyAgICByLT54ID0g
eDsKKyAgICByLT55ID0geTsKKyAgICByLT53ID0gdzsKKyAgICByLT5oID0gaDsKKyAgICByLT54
MiA9IHgyOworICAgIHItPnkyID0geTI7CisgICAgci0+ZHggPSBkeDsKKyAgICByLT5keSA9IGR5
OworICAgIHItPm1haW5fc2Nyb2xsID0gbWFpbl9zY3JvbGw7CisgICAgREJHKCJhZGQgc2Nyb2xs
IGluIHJlZ2lvbjogJWQsJWQrJWR4JWQgJSswM2QsJSswM2QiLCB4LCB5LCB3LCBoLCBkeCwgZHkp
OworCisgICAgRWluYV9SZWN0YW5nbGUqIHByOworICAgIEVpbmFfUmVjdGFuZ2xlKiBwcl9lbmQ7
CisgICAgc2l6ZV90IGNvdW50OworICAgIHByID0gcHJpdi0+cmVwYWludHMuYXJyYXk7CisgICAg
Y291bnQgPSBwcml2LT5yZXBhaW50cy5jb3VudDsKKyAgICBwcl9lbmQgPSBwciArIGNvdW50Owor
ICAgIGZvciAoOyBwciA8IHByX2VuZDsgcHIrKykgeworICAgICAgICBwci0+eCArPSBkeDsKKyAg
ICAgICAgcHItPnkgKz0gZHk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc2Ny
b2xsc19mbHVzaChFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYpCit7CisgICAgcHJpdi0+c2Ny
b2xscy5jb3VudCA9IDA7CisgICAgaWYgKHByaXYtPnNjcm9sbHMuYWxsb2NhdGVkIDw9IEVXS19W
SUVXX1NDUk9MTFNfU0laRV9NQVhfRlJFRSkKKyAgICAgICAgcmV0dXJuOworICAgIF9ld2tfdmll
d19zY3JvbGxzX3Jlc2l6ZShwcml2LCBFV0tfVklFV19TQ1JPTExTX1NJWkVfTUFYX0ZSRUUpOwor
fQorCisvLyBEZWZhdWx0IEV2ZW50IEhhbmRsaW5nIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8KK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X2Zv
Y3VzX2luKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIEVXS19WSUVXX1BSSVZfR0VU
KHNkLCBwcml2KTsKKyAgICBXZWJDb3JlOjpGb2N1c0NvbnRyb2xsZXIqIGZjID0gcHJpdi0+cGFn
ZS0+Zm9jdXNDb250cm9sbGVyKCk7CisgICAgREJHKCJvPSVwLCBmYz0lcCIsIHNkLT5zZWxmLCBm
Yyk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKGZjLCBFSU5BX0ZBTFNFKTsK
KworICAgIGZjLT5zZXRBY3RpdmUodHJ1ZSk7CisgICAgZmMtPnNldEZvY3VzZWQodHJ1ZSk7Cisg
ICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdrX3ZpZXdfc21h
cnRfZm9jdXNfb3V0KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIEVXS19WSUVXX1BS
SVZfR0VUKHNkLCBwcml2KTsKKyAgICBXZWJDb3JlOjpGb2N1c0NvbnRyb2xsZXIqIGZjID0gcHJp
di0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCk7CisgICAgREJHKCJvPSVwLCBmYz0lcCIsIHNkLT5z
ZWxmLCBmYyk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKGZjLCBFSU5BX0ZB
TFNFKTsKKworICAgIGZjLT5zZXRBY3RpdmUoZmFsc2UpOworICAgIGZjLT5zZXRGb2N1c2VkKGZh
bHNlKTsKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tf
dmlld19zbWFydF9tb3VzZV93aGVlbChFd2tfVmlld19TbWFydF9EYXRhKiBzZCwgY29uc3QgRXZh
c19FdmVudF9Nb3VzZV9XaGVlbCogZXYpCit7CisgICAgcmV0dXJuIGV3a19mcmFtZV9mZWVkX21v
dXNlX3doZWVsKHNkLT5tYWluX2ZyYW1lLCBldik7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3
a192aWV3X3NtYXJ0X21vdXNlX2Rvd24oRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QsIGNvbnN0IEV2
YXNfRXZlbnRfTW91c2VfRG93biogZXYpCit7CisgICAgcmV0dXJuIGV3a19mcmFtZV9mZWVkX21v
dXNlX2Rvd24oc2QtPm1haW5fZnJhbWUsIGV2KTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBfZXdr
X3ZpZXdfc21hcnRfbW91c2VfdXAoRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QsIGNvbnN0IEV2YXNf
RXZlbnRfTW91c2VfVXAqIGV2KQoreworICAgIHJldHVybiBld2tfZnJhbWVfZmVlZF9tb3VzZV91
cChzZC0+bWFpbl9mcmFtZSwgZXYpOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19z
bWFydF9tb3VzZV9tb3ZlKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25zdCBFdmFzX0V2ZW50
X01vdXNlX01vdmUqIGV2KQoreworICAgIHJldHVybiBld2tfZnJhbWVfZmVlZF9tb3VzZV9tb3Zl
KHNkLT5tYWluX2ZyYW1lLCBldik7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3Nt
YXJ0X2tleV9kb3duKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBjb25zdCBFdmFzX0V2ZW50X0tl
eV9Eb3duKiBldikKK3sKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBld2tfdmlld19mcmFtZV9m
b2N1c2VkX2dldChzZC0+c2VsZik7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICBmcmFtZSA9
IHNkLT5tYWluX2ZyYW1lOworCisgICAgcmV0dXJuIGV3a19mcmFtZV9mZWVkX2tleV9kb3duKGZy
YW1lLCBldik7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X2tleV91cChF
d2tfVmlld19TbWFydF9EYXRhKiBzZCwgY29uc3QgRXZhc19FdmVudF9LZXlfVXAqIGV2KQorewor
ICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX2ZvY3VzZWRfZ2V0KHNkLT5z
ZWxmKTsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIGZyYW1lID0gc2QtPm1haW5fZnJhbWU7
CisKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2ZlZWRfa2V5X3VwKGZyYW1lLCBldik7Cit9CisKK3N0
YXRpYyB2b2lkIF9ld2tfdmlld19zbWFydF9hZGRfY29uc29sZV9tZXNzYWdlKEV3a19WaWV3X1Nt
YXJ0X0RhdGEqIHNkLCBjb25zdCBjaGFyKiBtZXNzYWdlLCB1bnNpZ25lZCBpbnQgbGluZU51bWJl
ciwgY29uc3QgY2hhciogc291cmNlSUQpCit7CisgICAgSU5GKCJjb25zb2xlIG1lc3NhZ2U6ICVz
IEAlZDogJXNcbiIsIHNvdXJjZUlELCBsaW5lTnVtYmVyLCBtZXNzYWdlKTsKK30KKworc3RhdGlj
IHZvaWQgX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZhc2NyaXB0X2FsZXJ0KEV3a19WaWV3X1NtYXJ0
X0RhdGEqIHNkLCBFdmFzX09iamVjdCogZnJhbWUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7Cisg
ICAgSU5GKCJqYXZhc2NyaXB0IGFsZXJ0OiAlc1xuIiwgbWVzc2FnZSk7Cit9CisKK3N0YXRpYyBF
aW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZhc2NyaXB0X2NvbmZpcm0oRXdrX1ZpZXdf
U21hcnRfRGF0YSogc2QsIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSkK
K3sKKyAgICBJTkYoImphdmFzY3JpcHQgY29uZmlybTogJXMiLCBtZXNzYWdlKTsKKyAgICBJTkYo
ImphdmFzY3JpcHQgY29uZmlybSAoSEFSRCBDT0RFRCk/IFlFUyIpOworICAgIHJldHVybiBFSU5B
X1RSVUU7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wgX2V3a192aWV3X3NtYXJ0X3Nob3VsZF9pbnRl
cnJ1cHRfamF2YXNjcmlwdChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBJTkYoInNo
b3VsZCBpbnRlcnJ1cHQgamF2YXNjcmlwdD9cbiIKKyAgICAgICAgICAgICJcdChIQVJEIENPREVE
KSBOTyIpOworICAgIHJldHVybiBFSU5BX0ZBTFNFOworfQorCitzdGF0aWMgRWluYV9Cb29sIF9l
d2tfdmlld19zbWFydF9ydW5famF2YXNjcmlwdF9wcm9tcHQoRXdrX1ZpZXdfU21hcnRfRGF0YSog
c2QsIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSwgY29uc3QgY2hhciog
ZGVmYXVsdFZhbHVlLCBjaGFyKiogdmFsdWUpCit7CisgICAgKnZhbHVlID0gc3RyZHVwKCJ0ZXN0
Iik7CisgICAgRWluYV9Cb29sIHJldCA9IEVJTkFfVFJVRTsKKyAgICBJTkYoImphdmFzY3JpcHQg
cHJvbXB0OlxuIgorICAgICAgICAgICAgIlx0ICAgICAgbWVzc2FnZTogJXNcbiIKKyAgICAgICAg
ICAgICJcdGRlZmF1bHQgdmFsdWU6ICVzXG4iCisgICAgICAgICAgICAiXHRnaXZpbmcgYW5zd2Vy
OiAlc1xuIgorICAgICAgICAgICAgIlx0ICAgICAgIGJ1dHRvbjogJXMiLCBtZXNzYWdlLCBkZWZh
dWx0VmFsdWUsICp2YWx1ZSwgcmV0PyJvayI6ImNhbmNlbCIpOworCisgICAgcmV0dXJuIHJldDsK
K30KKworLy8gRXZlbnQgSGFuZGxpbmcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vLy8vCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfb25fZm9jdXNfaW4o
dm9pZCogZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50X2luZm8pCit7
CisgICAgRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0
YTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NB
RkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT5mb2N1c19pbik7CisgICAgc2QtPmFwaS0+Zm9j
dXNfaW4oc2QpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfb25fZm9jdXNfb3V0KHZvaWQq
IGRhdGEsIEV2YXMqIGUsIEV2YXNfT2JqZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAg
IEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1NtYXJ0X0RhdGEqKWRhdGE7Cisg
ICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaSk7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+Zm9jdXNfb3V0KTsKKyAgICBzZC0+YXBpLT5mb2N1c19v
dXQoc2QpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfb25fbW91c2Vfd2hlZWwodm9pZCog
ZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50X2luZm8pCit7CisgICAg
RXZhc19FdmVudF9Nb3VzZV9XaGVlbCogZXYgPSAoRXZhc19FdmVudF9Nb3VzZV9XaGVlbCopZXZl
bnRfaW5mbzsKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBzZCA9IChFd2tfVmlld19TbWFydF9E
YXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGkpOworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPm1vdXNlX3doZWVsKTsKKyAgICBz
ZC0+YXBpLT5tb3VzZV93aGVlbChzZCwgZXYpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdf
b25fbW91c2VfZG93bih2b2lkKiBkYXRhLCBFdmFzKiBlLCBFdmFzX09iamVjdCogbywgdm9pZCog
ZXZlbnRfaW5mbykKK3sKKyAgICBFdmFzX0V2ZW50X01vdXNlX0Rvd24qIGV2ID0gKEV2YXNfRXZl
bnRfTW91c2VfRG93biopZXZlbnRfaW5mbzsKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBzZCA9
IChFd2tfVmlld19TbWFydF9EYXRhKilkYXRhOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOKHNkLT5hcGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPm1v
dXNlX2Rvd24pOworICAgIHNkLT5hcGktPm1vdXNlX2Rvd24oc2QsIGV2KTsKK30KKworc3RhdGlj
IHZvaWQgX2V3a192aWV3X29uX21vdXNlX3VwKHZvaWQqIGRhdGEsIEV2YXMqIGUsIEV2YXNfT2Jq
ZWN0KiBvLCB2b2lkKiBldmVudF9pbmZvKQoreworICAgIEV2YXNfRXZlbnRfTW91c2VfVXAqIGV2
ID0gKEV2YXNfRXZlbnRfTW91c2VfVXAqKWV2ZW50X2luZm87CisgICAgRXdrX1ZpZXdfU21hcnRf
RGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0YTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihz
ZC0+YXBpLT5tb3VzZV91cCk7CisgICAgc2QtPmFwaS0+bW91c2VfdXAoc2QsIGV2KTsKK30KKwor
c3RhdGljIHZvaWQgX2V3a192aWV3X29uX21vdXNlX21vdmUodm9pZCogZGF0YSwgRXZhcyogZSwg
RXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50X2luZm8pCit7CisgICAgRXZhc19FdmVudF9Nb3Vz
ZV9Nb3ZlKiBldiA9IChFdmFzX0V2ZW50X01vdXNlX01vdmUqKWV2ZW50X2luZm87CisgICAgRXdr
X1ZpZXdfU21hcnRfRGF0YSogc2QgPSAoRXdrX1ZpZXdfU21hcnRfRGF0YSopZGF0YTsKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9O
VUxMX1JFVFVSTihzZC0+YXBpLT5tb3VzZV9tb3ZlKTsKKyAgICBzZC0+YXBpLT5tb3VzZV9tb3Zl
KHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19vbl9rZXlfZG93bih2b2lkKiBk
YXRhLCBFdmFzKiBlLCBFdmFzX09iamVjdCogbywgdm9pZCogZXZlbnRfaW5mbykKK3sKKyAgICBF
dmFzX0V2ZW50X0tleV9Eb3duKiBldiA9IChFdmFzX0V2ZW50X0tleV9Eb3duKilldmVudF9pbmZv
OworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1NtYXJ0X0RhdGEqKWRh
dGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaSk7CisgICAgRUlOQV9T
QUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+a2V5X2Rvd24pOworICAgIHNkLT5hcGktPmtl
eV9kb3duKHNkLCBldik7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld19vbl9rZXlfdXAodm9p
ZCogZGF0YSwgRXZhcyogZSwgRXZhc19PYmplY3QqIG8sIHZvaWQqIGV2ZW50X2luZm8pCit7Cisg
ICAgRXZhc19FdmVudF9LZXlfVXAqIGV2ID0gKEV2YXNfRXZlbnRfS2V5X1VwKilldmVudF9pbmZv
OworICAgIEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkID0gKEV3a19WaWV3X1NtYXJ0X0RhdGEqKWRh
dGE7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaSk7CisgICAgRUlOQV9T
QUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+a2V5X3VwKTsKKyAgICBzZC0+YXBpLT5rZXlf
dXAoc2QsIGV2KTsKK30KKworc3RhdGljIFdURjo6UGFzc1JlZlB0cjxXZWJDb3JlOjpGcmFtZT4g
X2V3a192aWV3X2NvcmVfZnJhbWVfbmV3KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkLCBFd2tfVmll
d19Qcml2YXRlX0RhdGEqIHByaXYsIFdlYkNvcmU6OkhUTUxGcmFtZU93bmVyRWxlbWVudCogb3du
ZXIpCit7CisgICAgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRFZmwqIGZsYyA9IG5ldyBXZWJD
b3JlOjpGcmFtZUxvYWRlckNsaWVudEVmbChzZC0+c2VsZik7CisgICAgaWYgKCFmbGMpIHsKKyAg
ICAgICAgQ1JJVElDQUwoIkNvdWxkIG5vdCBjcmVhdGUgZnJhbWUgbG9hZGVyIGNsaWVudC4iKTsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGZsYy0+c2V0Q3VzdG9tVXNlckFnZW50KFdl
YkNvcmU6OlN0cmluZzo6ZnJvbVVURjgocHJpdi0+c2V0dGluZ3MudXNlcl9hZ2VudCkpOworCisg
ICAgcmV0dXJuIFdlYkNvcmU6OkZyYW1lOjpjcmVhdGUocHJpdi0+cGFnZSwgb3duZXIsIGZsYyk7
Cit9CisKK3N0YXRpYyBFdmFzX1NtYXJ0X0NsYXNzIF9wYXJlbnRfc2MgPSBFVkFTX1NNQVJUX0NM
QVNTX0lOSVRfMDsKKworc3RhdGljIEV3a19WaWV3X1ByaXZhdGVfRGF0YSogX2V3a192aWV3X3By
aXZfbmV3KEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIEV3a19WaWV3X1ByaXZhdGVf
RGF0YSogcHJpdiA9CisgICAgICAgIChFd2tfVmlld19Qcml2YXRlX0RhdGEqKWNhbGxvYygxLCBz
aXplb2YoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKSk7CisgICAgV2ViQ29yZTo6QXRvbWljU3RyaW5n
IHM7CisgICAgV2ViQ29yZTo6S1VSTCB1cmw7CisKKyAgICBpZiAoIXByaXYpIHsKKyAgICAgICAg
Q1JJVElDQUwoImNvdWxkIG5vdCBhbGxvY2F0ZSBFd2tfVmlld19Qcml2YXRlX0RhdGEiKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHByaXYtPnBhZ2UgPSBuZXcgV2ViQ29yZTo6UGFn
ZSgKKyAgICAgICAgc3RhdGljX2Nhc3Q8V2ViQ29yZTo6Q2hyb21lQ2xpZW50Kj4obmV3IFdlYkNv
cmU6OkNocm9tZUNsaWVudEVmbChzZC0+c2VsZikpLAorICAgICAgICBzdGF0aWNfY2FzdDxXZWJD
b3JlOjpDb250ZXh0TWVudUNsaWVudCo+KG5ldyBXZWJDb3JlOjpDb250ZXh0TWVudUNsaWVudEVm
bChzZC0+c2VsZikpLAorICAgICAgICBzdGF0aWNfY2FzdDxXZWJDb3JlOjpFZGl0b3JDbGllbnQq
PihuZXcgV2ViQ29yZTo6RWRpdG9yQ2xpZW50RWZsKHNkLT5zZWxmKSksCisgICAgICAgIHN0YXRp
Y19jYXN0PFdlYkNvcmU6OkRyYWdDbGllbnQqPihuZXcgV2ViQ29yZTo6RHJhZ0NsaWVudEVmbCks
CisgICAgICAgIHN0YXRpY19jYXN0PFdlYkNvcmU6Okluc3BlY3RvckNsaWVudCo+KG5ldyBXZWJD
b3JlOjpJbnNwZWN0b3JDbGllbnRFZmwpLAorICAgICAgICAwLAorICAgICAgICAwKTsKKyAgICBp
ZiAoIXByaXYtPnBhZ2UpIHsKKyAgICAgICAgQ1JJVElDQUwoIkNvdWxkIG5vdCBjcmVhdGUgV2Vi
S2l0IFBhZ2UiKTsKKyAgICAgICAgZ290byBlcnJvcl9wYWdlOworICAgIH0KKworICAgIHByaXYt
PnBhZ2Vfc2V0dGluZ3MgPSBwcml2LT5wYWdlLT5zZXR0aW5ncygpOworICAgIGlmICghcHJpdi0+
cGFnZV9zZXR0aW5ncykgeworICAgICAgICBDUklUSUNBTCgiQ291bGQgbm90IGdldCBwYWdlIHNl
dHRpbmdzLiIpOworICAgICAgICBnb3RvIGVycm9yX3NldHRpbmdzOworICAgIH0KKworICAgIHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPnNldExvYWRzSW1hZ2VzQXV0b21hdGljYWxseSh0cnVlKTsKKyAg
ICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXREZWZhdWx0Rml4ZWRGb250U2l6ZSgxMik7CisgICAg
cHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0RGVmYXVsdEZvbnRTaXplKDE2KTsKKyAgICBwcml2LT5w
YWdlX3NldHRpbmdzLT5zZXRTZXJpZkZvbnRGYW1pbHkoInNlcmlmIik7CisgICAgcHJpdi0+cGFn
ZV9zZXR0aW5ncy0+c2V0Rml4ZWRGb250RmFtaWx5KCJtb25vdHlwZSIpOworICAgIHByaXYtPnBh
Z2Vfc2V0dGluZ3MtPnNldFNhbnNTZXJpZkZvbnRGYW1pbHkoInNhbnMiKTsKKyAgICBwcml2LT5w
YWdlX3NldHRpbmdzLT5zZXRTdGFuZGFyZEZvbnRGYW1pbHkoInNhbnMiKTsKKyAgICBwcml2LT5w
YWdlX3NldHRpbmdzLT5zZXRKYXZhU2NyaXB0RW5hYmxlZCh0cnVlKTsKKyAgICBwcml2LT5wYWdl
X3NldHRpbmdzLT5zZXRQbHVnaW5zRW5hYmxlZCh0cnVlKTsKKworICAgIHVybCA9IHByaXYtPnBh
Z2Vfc2V0dGluZ3MtPnVzZXJTdHlsZVNoZWV0TG9jYXRpb24oKTsKKyAgICBwcml2LT5zZXR0aW5n
cy51c2VyX3N0eWxlc2hlZXQgPSBlaW5hX3N0cmluZ3NoYXJlX2FkZCh1cmwucHJldHR5VVJMKCku
dXRmOCgpLmRhdGEoKSk7CisKKyAgICBwcml2LT5zZXR0aW5ncy5lbmNvZGluZ19kZWZhdWx0ID0g
ZWluYV9zdHJpbmdzaGFyZV9hZGQKKyAgICAgICAgKHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmRlZmF1
bHRUZXh0RW5jb2RpbmdOYW1lKCkudXRmOCgpLmRhdGEoKSk7CisgICAgcHJpdi0+c2V0dGluZ3Mu
ZW5jb2RpbmdfY3VzdG9tID0gMDsKKworICAgIHByaXYtPnNldHRpbmdzLmZvbnRfbWluaW11bV9z
aXplID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+bWluaW11bUZvbnRTaXplKCk7CisgICAgcHJpdi0+
c2V0dGluZ3MuZm9udF9taW5pbXVtX2xvZ2ljYWxfc2l6ZSA9IHByaXYtPnBhZ2Vfc2V0dGluZ3Mt
Pm1pbmltdW1Mb2dpY2FsRm9udFNpemUoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X2RlZmF1
bHRfc2l6ZSA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpOworICAgIHBy
aXYtPnNldHRpbmdzLmZvbnRfbW9ub3NwYWNlX3NpemUgPSBwcml2LT5wYWdlX3NldHRpbmdzLT5k
ZWZhdWx0Rml4ZWRGb250U2l6ZSgpOworCisgICAgcyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnN0
YW5kYXJkRm9udEZhbWlseSgpOworICAgIHByaXYtPnNldHRpbmdzLmZvbnRfc3RhbmRhcmQgPSBl
aW5hX3N0cmluZ3NoYXJlX2FkZChzLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIHMgPSBw
cml2LT5wYWdlX3NldHRpbmdzLT5jdXJzaXZlRm9udEZhbWlseSgpOworICAgIHByaXYtPnNldHRp
bmdzLmZvbnRfY3Vyc2l2ZSA9IGVpbmFfc3RyaW5nc2hhcmVfYWRkKHMuc3RyaW5nKCkudXRmOCgp
LmRhdGEoKSk7CisgICAgcyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPmZpeGVkRm9udEZhbWlseSgp
OworICAgIHByaXYtPnNldHRpbmdzLmZvbnRfbW9ub3NwYWNlID0gZWluYV9zdHJpbmdzaGFyZV9h
ZGQocy5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBzID0gcHJpdi0+cGFnZV9zZXR0aW5n
cy0+ZmFudGFzeUZvbnRGYW1pbHkoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5mb250X2ZhbnRhc3kg
PSBlaW5hX3N0cmluZ3NoYXJlX2FkZChzLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIHMg
PSBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXJpZkZvbnRGYW1pbHkoKTsKKyAgICBwcml2LT5zZXR0
aW5ncy5mb250X3NlcmlmID0gZWluYV9zdHJpbmdzaGFyZV9hZGQocy5zdHJpbmcoKS51dGY4KCku
ZGF0YSgpKTsKKyAgICBzID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2Fuc1NlcmlmRm9udEZhbWls
eSgpOworICAgIHByaXYtPnNldHRpbmdzLmZvbnRfc2Fuc19zZXJpZiA9IGVpbmFfc3RyaW5nc2hh
cmVfYWRkKHMuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBwcml2LT5zZXR0aW5ncy5h
dXRvX2xvYWRfaW1hZ2VzID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+bG9hZHNJbWFnZXNBdXRvbWF0
aWNhbGx5KCk7CisgICAgcHJpdi0+c2V0dGluZ3MuYXV0b19zaHJpbmtfaW1hZ2VzID0gcHJpdi0+
cGFnZV9zZXR0aW5ncy0+c2hyaW5rc1N0YW5kYWxvbmVJbWFnZXNUb0ZpdCgpOworICAgIHByaXYt
PnNldHRpbmdzLmVuYWJsZV9zY3JpcHRzID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+aXNKYXZhU2Ny
aXB0RW5hYmxlZCgpOworICAgIHByaXYtPnNldHRpbmdzLmVuYWJsZV9wbHVnaW5zID0gcHJpdi0+
cGFnZV9zZXR0aW5ncy0+YXJlUGx1Z2luc0VuYWJsZWQoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5z
Y3JpcHRzX3dpbmRvd19vcGVuID0gcHJpdi0+cGFnZV9zZXR0aW5ncy0+YWxsb3dTY3JpcHRzVG9D
bG9zZVdpbmRvd3MoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5yZXNpemFibGVfdGV4dGFyZWFzID0g
cHJpdi0+cGFnZV9zZXR0aW5ncy0+dGV4dEFyZWFzQXJlUmVzaXphYmxlKCk7CisgICAgcHJpdi0+
c2V0dGluZ3MucHJpdmF0ZV9icm93c2luZyA9IHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnByaXZhdGVC
cm93c2luZ0VuYWJsZWQoKTsKKyAgICBwcml2LT5zZXR0aW5ncy5jYXJldF9icm93c2luZyA9IHBy
aXYtPnBhZ2Vfc2V0dGluZ3MtPmNhcmV0QnJvd3NpbmdFbmFibGVkKCk7CisKKyAgICBwcml2LT5t
YWluX2ZyYW1lID0gX2V3a192aWV3X2NvcmVfZnJhbWVfbmV3KHNkLCBwcml2LCAwKS5nZXQoKTsK
KyAgICBpZiAoIXByaXYtPm1haW5fZnJhbWUpIHsKKyAgICAgICAgQ1JJVElDQUwoIkNvdWxkIG5v
dCBjcmVhdGUgbWFpbiBmcmFtZS4iKTsKKyAgICAgICAgZ290byBlcnJvcl9tYWluX2ZyYW1lOwor
ICAgIH0KKworICAgIHByaXYtPmhpc3RvcnkgPSBld2tfaGlzdG9yeV9uZXcocHJpdi0+cGFnZS0+
YmFja0ZvcndhcmRMaXN0KCkpOworICAgIGlmICghcHJpdi0+aGlzdG9yeSkgeworICAgICAgICBD
UklUSUNBTCgiQ291bGQgbm90IGNyZWF0ZSBoaXN0b3J5IGluc3RhbmNlIGZvciB2aWV3LiIpOwor
ICAgICAgICBnb3RvIGVycm9yX2hpc3Rvcnk7CisgICAgfQorCisgICAgcmV0dXJuIHByaXY7CisK
K2Vycm9yX2hpc3Rvcnk6CisgICAgLy8gZGVsZXRlIHByaXYtPm1haW5fZnJhbWU7IC8qIGRvIG5v
dCBkZWxldGUgcHJpdi0+bWFpbl9mcmFtZSAqLworZXJyb3JfbWFpbl9mcmFtZToKK2Vycm9yX3Nl
dHRpbmdzOgorICAgIGRlbGV0ZSBwcml2LT5wYWdlOworZXJyb3JfcGFnZToKKyAgICBmcmVlKHBy
aXYpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfcHJpdl9kZWwo
RXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2KQoreworICAgIGlmICghcHJpdikKKyAgICAgICAg
cmV0dXJuOworCisgICAgLyogZG8gbm90IGRlbGV0ZSBwcml2LT5tYWluX2ZyYW1lICovCisKKyAg
ICBmcmVlKHByaXYtPnJlcGFpbnRzLmFycmF5KTsKKyAgICBmcmVlKHByaXYtPnNjcm9sbHMuYXJy
YXkpOworCisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MudXNlcl9hZ2Vu
dCk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MudXNlcl9zdHlsZXNo
ZWV0KTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5lbmNvZGluZ19k
ZWZhdWx0KTsKKyAgICBlaW5hX3N0cmluZ3NoYXJlX2RlbChwcml2LT5zZXR0aW5ncy5lbmNvZGlu
Z19jdXN0b20pOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZvbnRf
c3RhbmRhcmQpOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZvbnRf
Y3Vyc2l2ZSk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZm9udF9t
b25vc3BhY2UpOworICAgIGVpbmFfc3RyaW5nc2hhcmVfZGVsKHByaXYtPnNldHRpbmdzLmZvbnRf
ZmFudGFzeSk7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZm9udF9z
ZXJpZik7CisgICAgZWluYV9zdHJpbmdzaGFyZV9kZWwocHJpdi0+c2V0dGluZ3MuZm9udF9zYW5z
X3NlcmlmKTsKKworICAgIGlmIChwcml2LT5hbmltYXRlZF96b29tLmFuaW1hdG9yKQorICAgICAg
ICBlY29yZV9hbmltYXRvcl9kZWwocHJpdi0+YW5pbWF0ZWRfem9vbS5hbmltYXRvcik7CisKKyAg
ICBld2tfaGlzdG9yeV9mcmVlKHByaXYtPmhpc3RvcnkpOworCisgICAgZGVsZXRlIHByaXYtPnBh
Z2U7CisgICAgZnJlZShwcml2KTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X2Fk
ZChFdmFzX09iamVjdCogbykKK3sKKyAgICBjb25zdCBFdmFzX1NtYXJ0KiBzbWFydCA9IGV2YXNf
b2JqZWN0X3NtYXJ0X3NtYXJ0X2dldChvKTsKKyAgICBjb25zdCBFdmFzX1NtYXJ0X0NsYXNzKiBz
YyA9IGV2YXNfc21hcnRfY2xhc3NfZ2V0KHNtYXJ0KTsKKyAgICBjb25zdCBFd2tfVmlld19TbWFy
dF9DbGFzcyogYXBpID0gKGNvbnN0IEV3a19WaWV3X1NtYXJ0X0NsYXNzKilzYzsKKyAgICBFSU5B
X1NBRkVUWV9PTl9OVUxMX1JFVFVSTihhcGktPmJhY2tpbmdfc3RvcmVfYWRkKTsKKyAgICBFV0tf
VklFV19TRF9HRVQobywgc2QpOworCisgICAgaWYgKCFzZCkgeworICAgICAgICBzZCA9IChFd2tf
Vmlld19TbWFydF9EYXRhKiljYWxsb2MoMSwgc2l6ZW9mKEV3a19WaWV3X1NtYXJ0X0RhdGEpKTsK
KyAgICAgICAgaWYgKCFzZCkKKyAgICAgICAgICAgIENSSVRJQ0FMKCJjb3VsZCBub3QgYWxsb2Nh
dGUgRXdrX1ZpZXdfU21hcnRfRGF0YSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBldmFz
X29iamVjdF9zbWFydF9kYXRhX3NldChvLCBzZCk7CisgICAgfQorCisgICAgc2QtPmJnX2NvbG9y
LnIgPSAyNTU7CisgICAgc2QtPmJnX2NvbG9yLmcgPSAyNTU7CisgICAgc2QtPmJnX2NvbG9yLmIg
PSAyNTU7CisgICAgc2QtPmJnX2NvbG9yLmEgPSAyNTU7CisKKyAgICBzZC0+c2VsZiA9IG87Cisg
ICAgc2QtPl9wcml2ID0gX2V3a192aWV3X3ByaXZfbmV3KHNkKTsKKyAgICBzZC0+YXBpID0gYXBp
OworCisgICAgX3BhcmVudF9zYy5hZGQobyk7CisKKyAgICBpZiAoIXNkLT5fcHJpdikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgRVdLX1ZJRVdfUFJJVl9HRVQoc2QsIHByaXYpOworCisgICAgc2Qt
PmJhY2tpbmdfc3RvcmUgPSBhcGktPmJhY2tpbmdfc3RvcmVfYWRkKHNkKTsKKyAgICBpZiAoIXNk
LT5iYWNraW5nX3N0b3JlKSB7CisgICAgICAgIEVSUigiQ291bGQgbm90IGNyZWF0ZSBiYWNraW5n
IHN0b3JlIG9iamVjdC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGV2YXNfb2Jq
ZWN0X3NtYXJ0X21lbWJlcl9hZGQoc2QtPmJhY2tpbmdfc3RvcmUsIG8pOworICAgIGV2YXNfb2Jq
ZWN0X3Nob3coc2QtPmJhY2tpbmdfc3RvcmUpOworCisgICAgc2QtPm1haW5fZnJhbWUgPSBld2tf
ZnJhbWVfYWRkKHNkLT5iYXNlLmV2YXMpOworICAgIGlmICghc2QtPm1haW5fZnJhbWUpIHsKKyAg
ICAgICAgRVJSKCJDb3VsZCBub3QgY3JlYXRlIG1haW4gZnJhbWUgb2JqZWN0LiIpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFld2tfZnJhbWVfaW5pdChzZC0+bWFpbl9mcmFt
ZSwgbywgcHJpdi0+bWFpbl9mcmFtZSkpIHsKKyAgICAgICAgRVJSKCJDb3VsZCBub3QgaW5pdGlh
bGl6ZSBtYWluIGZybWUgb2JqZWN0LiIpOworICAgICAgICBldmFzX29iamVjdF9kZWwoc2QtPm1h
aW5fZnJhbWUpOworICAgICAgICBzZC0+bWFpbl9mcmFtZSA9IDA7CisKKyAgICAgICAgZGVsZXRl
IHByaXYtPm1haW5fZnJhbWU7CisgICAgICAgIHByaXYtPm1haW5fZnJhbWUgPSAwOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgZXZhc19vYmplY3RfbmFtZV9zZXQoc2QtPm1haW5fZnJh
bWUsICJFV0tfRnJhbWU6bWFpbiIpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X21lbWJlcl9hZGQo
c2QtPm1haW5fZnJhbWUsIG8pOworICAgIGV2YXNfb2JqZWN0X3Nob3coc2QtPm1haW5fZnJhbWUp
OworCisjZGVmaW5lIENPTk5FQ1QocywgYykgZXZhc19vYmplY3RfZXZlbnRfY2FsbGJhY2tfYWRk
KG8sIHMsIGMsIHNkKQorICAgIENPTk5FQ1QoRVZBU19DQUxMQkFDS19GT0NVU19JTiwgX2V3a192
aWV3X29uX2ZvY3VzX2luKTsKKyAgICBDT05ORUNUKEVWQVNfQ0FMTEJBQ0tfRk9DVVNfT1VULCBf
ZXdrX3ZpZXdfb25fZm9jdXNfb3V0KTsKKyAgICBDT05ORUNUKEVWQVNfQ0FMTEJBQ0tfTU9VU0Vf
V0hFRUwsIF9ld2tfdmlld19vbl9tb3VzZV93aGVlbCk7CisgICAgQ09OTkVDVChFVkFTX0NBTExC
QUNLX01PVVNFX0RPV04sIF9ld2tfdmlld19vbl9tb3VzZV9kb3duKTsKKyAgICBDT05ORUNUKEVW
QVNfQ0FMTEJBQ0tfTU9VU0VfVVAsIF9ld2tfdmlld19vbl9tb3VzZV91cCk7CisgICAgQ09OTkVD
VChFVkFTX0NBTExCQUNLX01PVVNFX01PVkUsIF9ld2tfdmlld19vbl9tb3VzZV9tb3ZlKTsKKyAg
ICBDT05ORUNUKEVWQVNfQ0FMTEJBQ0tfS0VZX0RPV04sIF9ld2tfdmlld19vbl9rZXlfZG93bik7
CisgICAgQ09OTkVDVChFVkFTX0NBTExCQUNLX0tFWV9VUCwgX2V3a192aWV3X29uX2tleV91cCk7
CisjdW5kZWYgQ09OTkVDVAorfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21hcnRfZGVsKEV2
YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVChvLCBzZCk7CisgICAgRXdrX1Zp
ZXdfUHJpdmF0ZV9EYXRhKiBwcml2ID0gc2QgPyBzZC0+X3ByaXYgOiAwOworCisgICAgX3BhcmVu
dF9zYy5kZWwobyk7CisgICAgX2V3a192aWV3X3ByaXZfZGVsKHByaXYpOworfQorCitzdGF0aWMg
dm9pZCBfZXdrX3ZpZXdfc21hcnRfcmVzaXplKEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3JkIHcs
IEV2YXNfQ29vcmQgaCkKK3sKKyAgICBFV0tfVklFV19TRF9HRVQobywgc2QpOworCisgICAgLy8g
dGhlc2Ugc2hvdWxkIGJlIHF1ZXVlZCBhbmQgcHJvY2Vzc2VkIGluIGNhbGN1bGF0ZSBhcyB3ZWxs
IQorICAgIGV2YXNfb2JqZWN0X3Jlc2l6ZShzZC0+YmFja2luZ19zdG9yZSwgdywgaCk7CisKKyAg
ICBzZC0+Y2hhbmdlZC5zaXplID0gRUlOQV9UUlVFOworICAgIF9ld2tfdmlld19zbWFydF9jaGFu
Z2VkKHNkKTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3NtYXJ0X21vdmUoRXZhc19PYmpl
Y3QqIG8sIEV2YXNfQ29vcmQgeCwgRXZhc19Db29yZCB5KQoreworICAgIEVXS19WSUVXX1NEX0dF
VChvLCBzZCk7CisgICAgc2QtPmNoYW5nZWQucG9zaXRpb24gPSBFSU5BX1RSVUU7CisgICAgX2V3
a192aWV3X3NtYXJ0X2NoYW5nZWQoc2QpOworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21h
cnRfY2FsY3VsYXRlKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVChvLCBz
ZCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVQoc2QsIHByaXYpOworICAgIEVJTkFfU0FGRVRZX09O
X05VTExfUkVUVVJOKHNkLT5hcGktPmNvbnRlbnRzX3Jlc2l6ZSk7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+c2Nyb2xsc19wcm9jZXNzKTsKKyAgICBFSU5BX1NBRkVU
WV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT5yZXBhaW50c19wcm9jZXNzKTsKKyAgICBFdmFzX0Nv
b3JkIHgsIHksIHcsIGg7CisKKyAgICBzZC0+Y2hhbmdlZC5hbnkgPSBFSU5BX0ZBTFNFOworCisg
ICAgaWYgKCFzZC0+bWFpbl9mcmFtZSB8fCAhcHJpdi0+bWFpbl9mcmFtZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgZXZhc19vYmplY3RfZ2VvbWV0cnlfZ2V0KG8sICZ4LCAmeSwgJncsICZoKTsK
KworICAgIERCRygibz0lcCBnZW89WyVkLCAlZCArICVkeCVkXSwgY2hhbmdlZDogc2l6ZT0laGh1
LCAiCisgICAgICAgICJzY3JvbGxzPSV6dSwgcmVwYWludHM9JXp1IiwKKyAgICAgICAgbywgeCwg
eSwgdywgaCwgc2QtPmNoYW5nZWQuc2l6ZSwKKyAgICAgICAgcHJpdi0+c2Nyb2xscy5jb3VudCwg
cHJpdi0+cmVwYWludHMuY291bnQpOworCisgICAgaWYgKHNkLT5jaGFuZ2VkLnNpemUgJiYgKCh3
ICE9IHNkLT52aWV3LncpIHx8IChoICE9IHNkLT52aWV3LmgpKSkgeworICAgICAgICBXZWJDb3Jl
OjpGcmFtZVZpZXcqIHZpZXcgPSBwcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAgICAgIGlm
ICh2aWV3KSB7CisgICAgICAgICAgICB2aWV3LT5yZXNpemUodywgaCk7CisgICAgICAgICAgICB2
aWV3LT5mb3JjZUxheW91dCgpOworICAgICAgICAgICAgdmlldy0+YWRqdXN0Vmlld1NpemUoKTsK
KyAgICAgICAgICAgIEludFNpemUgc2l6ZSA9IHZpZXctPmNvbnRlbnRzU2l6ZSgpOworICAgICAg
ICAgICAgaWYgKCFzZC0+YXBpLT5jb250ZW50c19yZXNpemUoc2QsIHNpemUud2lkdGgoKSwgc2l6
ZS5oZWlnaHQoKSkpCisgICAgICAgICAgICAgICAgRVJSKCJmYWlsZWQgdG8gcmVzaXplIGNvbnRl
bnRzIHRvICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZS53aWR0aCgpLCBzaXplLmhl
aWdodCgpKTsKKyAgICAgICAgfQorICAgICAgICBldmFzX29iamVjdF9yZXNpemUoc2QtPm1haW5f
ZnJhbWUsIHcsIGgpOworICAgICAgICBzZC0+Y2hhbmdlZC5mcmFtZV9yZWN0ID0gRUlOQV9UUlVF
OworICAgICAgICBzZC0+dmlldy53ID0gdzsKKyAgICAgICAgc2QtPnZpZXcuaCA9IGg7CisgICAg
fQorICAgIHNkLT5jaGFuZ2VkLnNpemUgPSBFSU5BX0ZBTFNFOworCisgICAgaWYgKHNkLT5jaGFu
Z2VkLnBvc2l0aW9uICYmICgoeCAhPSBzZC0+dmlldy54KSB8fCAoeSAhPSBzZC0+dmlldy55KSkp
IHsKKyAgICAgICAgZXZhc19vYmplY3RfbW92ZShzZC0+bWFpbl9mcmFtZSwgeCwgeSk7CisgICAg
ICAgIGV2YXNfb2JqZWN0X21vdmUoc2QtPmJhY2tpbmdfc3RvcmUsIHgsIHkpOworICAgICAgICBz
ZC0+Y2hhbmdlZC5mcmFtZV9yZWN0ID0gRUlOQV9UUlVFOworICAgICAgICBzZC0+dmlldy54ID0g
eDsKKyAgICAgICAgc2QtPnZpZXcueSA9IHk7CisgICAgfQorICAgIHNkLT5jaGFuZ2VkLnBvc2l0
aW9uID0gRUlOQV9GQUxTRTsKKworICAgIGV3a192aWV3X2xheW91dF9pZl9uZWVkZWRfcmVjdXJz
aXZlKHNkLT5fcHJpdik7CisKKyAgICBpZiAoIXNkLT5hcGktPnNjcm9sbHNfcHJvY2VzcyhzZCkp
CisgICAgICAgIEVSUigiZmFpbGVkIHRvIHByb2Nlc3Mgc2Nyb2xscy4iKTsKKyAgICBfZXdrX3Zp
ZXdfc2Nyb2xsc19mbHVzaChwcml2KTsKKworICAgIGlmICghc2QtPmFwaS0+cmVwYWludHNfcHJv
Y2VzcyhzZCkpCisgICAgICAgIEVSUigiZmFpbGVkIHRvIHByb2Nlc3MgcmVwYWludHMuIik7Cisg
ICAgX2V3a192aWV3X3JlcGFpbnRzX2ZsdXNoKHByaXYpOworCisgICAgaWYgKHNkLT5jaGFuZ2Vk
LmZyYW1lX3JlY3QpIHsKKyAgICAgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3ID0gcHJpdi0+
bWFpbl9mcmFtZS0+dmlldygpOworICAgICAgICB2aWV3LT5mcmFtZVJlY3RzQ2hhbmdlZCgpOyAv
KiBmb3JjZSB0cmVlIHRvIGdldCBwb3NpdGlvbiBmcm9tIHJvb3QgKi8KKyAgICAgICAgc2QtPmNo
YW5nZWQuZnJhbWVfcmVjdCA9IEVJTkFfRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgRWluYV9C
b29sIF9ld2tfdmlld19zbWFydF9jb250ZW50c19yZXNpemUoRXdrX1ZpZXdfU21hcnRfRGF0YSog
c2QsIGludCB3LCBpbnQgaCkKK3sKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitzdGF0aWMg
RWluYV9Cb29sIF9ld2tfdmlld19zbWFydF96b29tX3NldChFd2tfVmlld19TbWFydF9EYXRhKiBz
ZCwgZmxvYXQgem9vbSwgRXZhc19Db29yZCBjeCwgRXZhc19Db29yZCBjeSkKK3sKKyAgICBkb3Vi
bGUgcHgsIHB5OworICAgIEV2YXNfQ29vcmQgeCwgeSwgdywgaDsKKyAgICBFaW5hX0Jvb2wgcmV0
OworCisgICAgZXdrX2ZyYW1lX3Njcm9sbF9zaXplX2dldChzZC0+bWFpbl9mcmFtZSwgJncsICZo
KTsKKyAgICBld2tfZnJhbWVfc2Nyb2xsX3Bvc19nZXQoc2QtPm1haW5fZnJhbWUsICZ4LCAmeSk7
CisKKyAgICBpZiAodyArIHNkLT52aWV3LncgPiAwKQorICAgICAgICBweCA9IChkb3VibGUpKHgg
KyBjeCkgLyAodyArIHNkLT52aWV3LncpOworICAgIGVsc2UKKyAgICAgICAgcHggPSAwLjA7CisK
KyAgICBpZiAoaCArIHNkLT52aWV3LmggPiAwKQorICAgICAgICBweSA9IChkb3VibGUpKHkgKyBj
eSkgLyAoaCArIHNkLT52aWV3LmgpOworICAgIGVsc2UKKyAgICAgICAgcHkgPSAwLjA7CisKKyAg
ICByZXQgPSBld2tfZnJhbWVfem9vbV9zZXQoc2QtPm1haW5fZnJhbWUsIHpvb20pOworCisgICAg
ZXdrX2ZyYW1lX3Njcm9sbF9zaXplX2dldChzZC0+bWFpbl9mcmFtZSwgJncsICZoKTsKKyAgICB4
ID0gKHcgKyBzZC0+dmlldy53KSAqIHB4IC0gY3g7CisgICAgeSA9IChoICsgc2QtPnZpZXcuaCkg
KiBweSAtIGN5OworICAgIGV3a19mcmFtZV9zY3JvbGxfc2V0KHNkLT5tYWluX2ZyYW1lLCB4LCB5
KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfZXdrX3ZpZXdfc21hcnRfZmx1
c2goRXdrX1ZpZXdfU21hcnRfRGF0YSogc2QpCit7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2KTsKKyAgICBfZXdrX3ZpZXdfcmVwYWludHNfZmx1c2gocHJpdik7Cisg
ICAgX2V3a192aWV3X3Njcm9sbHNfZmx1c2gocHJpdik7Cit9CisKK3N0YXRpYyBFaW5hX0Jvb2wg
X2V3a192aWV3X3NtYXJ0X3ByZV9yZW5kZXJfcmVnaW9uKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNk
LCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFzX0Nvb3JkIGgs
IGZsb2F0IHpvb20pCit7CisgICAgV1JOKCJub3Qgc3VwcG9ydGVkIGJ5IGVuZ2luZS4gc2Q9JXAg
YXJlYT0lZCwlZCslZHglZCwgem9vbT0lZiIsCisgICAgICAgIHNkLCB4LCB5LCB3LCBoLCB6b29t
KTsKKyAgICByZXR1cm4gRUlOQV9GQUxTRTsKK30KKworc3RhdGljIHZvaWQgX2V3a192aWV3X3Nt
YXJ0X3ByZV9yZW5kZXJfY2FuY2VsKEV3a19WaWV3X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIFdS
Tigibm90IHN1cHBvcnRlZCBieSBlbmdpbmUuIHNkPSVwIiwgc2QpOworfQorCitzdGF0aWMgdm9p
ZCBfZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3AoRXdrX1ZpZXdfU21hcnRfRGF0YSog
c2QpCit7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFydCA9IDAuMDsKKyAgICBzZC0+
YW5pbWF0ZWRfem9vbS56b29tLmVuZCA9IDAuMDsKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29t
LmN1cnJlbnQgPSAwLjA7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld196b29tX2FuaW1hdGVk
X2ZpbmlzaChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBFV0tfVklFV19QUklWX0dF
VChzZCwgcHJpdik7CisgICAgZWNvcmVfYW5pbWF0b3JfZGVsKHByaXYtPmFuaW1hdGVkX3pvb20u
YW5pbWF0b3IpOworICAgIHByaXYtPmFuaW1hdGVkX3pvb20uYW5pbWF0b3IgPSAwOworICAgIF9l
d2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfc3RvcChzZCk7CisgICAgZXZhc19vYmplY3Rfc21h
cnRfY2FsbGJhY2tfY2FsbChzZC0+c2VsZiwgInpvb20sYW5pbWF0ZWQsZW5kIiwgMCk7Cit9CisK
K3N0YXRpYyBmbG9hdCBfZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9jdXJyZW50KEV3a19WaWV3X1By
aXZhdGVfRGF0YSogcHJpdikKK3sKKyAgICBkb3VibGUgbm93ID0gZWNvcmVfbG9vcF90aW1lX2dl
dCgpOworICAgIGRvdWJsZSBkZWx0YSA9IG5vdyAtIHByaXYtPmFuaW1hdGVkX3pvb20udGltZS5z
dGFydDsKKworICAgIGlmIChkZWx0YSA+IHByaXYtPmFuaW1hdGVkX3pvb20udGltZS5kdXJhdGlv
bikKKyAgICAgICAgZGVsdGEgPSBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuZHVyYXRpb247Cisg
ICAgaWYgKGRlbHRhIDwgMC4wKSAvLyB0aW1lIHdlbnQgYmFjaywgY2xvY2sgYWRqdXN0ZWQ/Cisg
ICAgICAgIGRlbHRhID0gMC4wOworCisgICAgZGVsdGEgLz0gcHJpdi0+YW5pbWF0ZWRfem9vbS50
aW1lLmR1cmF0aW9uOworCisgICAgcmV0dXJuICgocHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnJh
bmdlICogZGVsdGEpCisgICAgICAgICAgICArIHByaXYtPmFuaW1hdGVkX3pvb20uem9vbS5zdGFy
dCk7Cit9CisKK3N0YXRpYyBpbnQgX2V3a192aWV3X3pvb21fYW5pbWF0b3JfY2Iodm9pZCogZGF0
YSkKK3sKKyAgICBFd2tfVmlld19TbWFydF9EYXRhKiBzZCA9IChFd2tfVmlld19TbWFydF9EYXRh
KilkYXRhOworICAgIEV2YXNfQ29vcmQgY3gsIGN5OworICAgIEVXS19WSUVXX1BSSVZfR0VUKHNk
LCBwcml2KTsKKyAgICBkb3VibGUgbm93ID0gZWNvcmVfbG9vcF90aW1lX2dldCgpOworCisgICAg
Y3ggPSBwcml2LT5hbmltYXRlZF96b29tLmNlbnRlci54OworICAgIGN5ID0gcHJpdi0+YW5pbWF0
ZWRfem9vbS5jZW50ZXIueTsKKworICAgIC8vIFRPRE86IHByb2dyZXNzaXZlbHkgY2VudGVyIChj
eCwgY3kpIC0+ICh2aWV3LnggKyB2aWV3LmgvMiwgdmlldy55ICsgdmlldy5oLzIpCisgICAgaWYg
KGN4ID49IHNkLT52aWV3LncpCisgICAgICAgIGN4ID0gc2QtPnZpZXcudyAtIDE7CisgICAgaWYg
KGN5ID49IHNkLT52aWV3LmgpCisgICAgICAgIGN5ID0gc2QtPnZpZXcuaCAtIDE7CisKKyAgICBp
ZiAoKG5vdyA+PSBwcml2LT5hbmltYXRlZF96b29tLnRpbWUuZW5kKQorICAgICAgICB8fCAobm93
IDwgcHJpdi0+YW5pbWF0ZWRfem9vbS50aW1lLnN0YXJ0KSkgeworICAgICAgICBfZXdrX3ZpZXdf
em9vbV9hbmltYXRlZF9maW5pc2goc2QpOworICAgICAgICBld2tfdmlld196b29tX3NldChzZC0+
c2VsZiwgcHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLmVuZCwgY3gsIGN5KTsKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgfQorCisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50ID0gX2V3
a192aWV3X3pvb21fYW5pbWF0ZWRfY3VycmVudChwcml2KTsKKyAgICBzZC0+YXBpLT56b29tX3dl
YWtfc2V0KHNkLCBzZC0+YW5pbWF0ZWRfem9vbS56b29tLmN1cnJlbnQsIGN4LCBjeSk7CisgICAg
cmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9ld2tfdmlld196b29tX2FuaW1hdGlvbl9zdGFy
dChFd2tfVmlld19TbWFydF9EYXRhKiBzZCkKK3sKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYpOworICAgIGlmIChwcml2LT5hbmltYXRlZF96b29tLmFuaW1hdG9yKQor
ICAgICAgICByZXR1cm47CisgICAgcHJpdi0+YW5pbWF0ZWRfem9vbS5hbmltYXRvciA9IGVjb3Jl
X2FuaW1hdG9yX2FkZAorICAgICAgICAoX2V3a192aWV3X3pvb21fYW5pbWF0b3JfY2IsIHNkKTsK
K30KKworLyoqCisgKiBTZXRzIHRoZSBzbWFydCBjbGFzcyBhcGkgd2l0aG91dCBhbnkgYmFja2lu
ZyBzdG9yZSwgZW5hYmxpbmcgdmlldworICogdG8gYmUgaW5oZXJpdGVkLgorICoKKyAqIEBwYXJh
bSBhcGkgY2xhc3MgZGVmaW5pdGlvbiB0byBiZSBzZXQsIGFsbCBtZW1iZXJzIHdpdGggdGhlCisg
KiAgICAgICAgZXhjZXB0aW9uIG9mIEV2YXNfU21hcnRfQ2xhc3MtPmRhdGEgbWF5IGJlIG92ZXJy
aWRkZW4uIE11c3QKKyAqICAgICAgICBAYiBub3QgYmUgQGMgMC4KKyAqCisgKiBAbm90ZSBFdmFz
X1NtYXJ0X0NsYXNzLT5kYXRhIGlzIHVzZWQgdG8gaW1wbGVtZW50IHR5cGUgY2hlY2tpbmcgYW5k
CisgKiAgICAgICBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgY2hhbmdlZC9vdmVycmlkZGVuLiBJZiB5
b3UgbmVlZCBleHRyYQorICogICAgICAgZGF0YSBmb3IgeW91ciBzbWFydCBjbGFzcyB0byB3b3Jr
LCBqdXN0IGV4dGVuZAorICogICAgICAgRXdrX1ZpZXdfU21hcnRfQ2xhc3MgaW5zdGVhZC4KKyAq
CisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG9uIGZh
aWx1cmUgKHByb2JhYmx5CisgKiAgICAgICAgIHZlcnNpb24gbWlzbWF0Y2gpLgorICoKKyAqIEBz
ZWUgZXdrX3ZpZXdfc2luZ2xlX3NtYXJ0X3NldCgpCisgKiBAc2VlIGV3a192aWV3X3RpbGVkX3Nt
YXJ0X3NldCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19iYXNlX3NtYXJ0X3NldChFd2tfVmll
d19TbWFydF9DbGFzcyogYXBpKQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZB
TChhcGksIEVJTkFfRkFMU0UpOworCisgICAgaWYgKGFwaS0+dmVyc2lvbiAhPSBFV0tfVklFV19T
TUFSVF9DTEFTU19WRVJTSU9OKSB7CisgICAgICAgIEVJTkFfTE9HX0NSSVQKKyAgICAgICAgICAg
ICgiRXdrX1ZpZXdfU21hcnRfQ2xhc3MgJXAgaXMgdmVyc2lvbiAlbHUgd2hpbGUgJWx1IHdhcyBl
eHBlY3RlZC4iLAorICAgICAgICAgICAgIGFwaSwgYXBpLT52ZXJzaW9uLCBFV0tfVklFV19TTUFS
VF9DTEFTU19WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorCisg
ICAgaWYgKEVJTkFfVU5MSUtFTFkoIV9wYXJlbnRfc2MuYWRkKSkKKyAgICAgICAgZXZhc19vYmpl
Y3Rfc21hcnRfY2xpcHBlZF9zbWFydF9zZXQoJl9wYXJlbnRfc2MpOworCisgICAgZXZhc19vYmpl
Y3Rfc21hcnRfY2xpcHBlZF9zbWFydF9zZXQoJmFwaS0+c2MpOworICAgIGFwaS0+c2MuYWRkID0g
X2V3a192aWV3X3NtYXJ0X2FkZDsKKyAgICBhcGktPnNjLmRlbCA9IF9ld2tfdmlld19zbWFydF9k
ZWw7CisgICAgYXBpLT5zYy5yZXNpemUgPSBfZXdrX3ZpZXdfc21hcnRfcmVzaXplOworICAgIGFw
aS0+c2MubW92ZSA9IF9ld2tfdmlld19zbWFydF9tb3ZlOworICAgIGFwaS0+c2MuY2FsY3VsYXRl
ID0gX2V3a192aWV3X3NtYXJ0X2NhbGN1bGF0ZTsKKyAgICBhcGktPnNjLmRhdGEgPSBFV0tfVklF
V19UWVBFX1NUUjsgLyogdXNlZCBieSB0eXBlIGNoZWNraW5nICovCisKKyAgICBhcGktPmNvbnRl
bnRzX3Jlc2l6ZSA9IF9ld2tfdmlld19zbWFydF9jb250ZW50c19yZXNpemU7CisgICAgYXBpLT56
b29tX3NldCA9IF9ld2tfdmlld19zbWFydF96b29tX3NldDsKKyAgICBhcGktPmZsdXNoID0gX2V3
a192aWV3X3NtYXJ0X2ZsdXNoOworICAgIGFwaS0+cHJlX3JlbmRlcl9yZWdpb24gPSBfZXdrX3Zp
ZXdfc21hcnRfcHJlX3JlbmRlcl9yZWdpb247CisgICAgYXBpLT5wcmVfcmVuZGVyX2NhbmNlbCA9
IF9ld2tfdmlld19zbWFydF9wcmVfcmVuZGVyX2NhbmNlbDsKKworICAgIGFwaS0+Zm9jdXNfaW4g
PSBfZXdrX3ZpZXdfc21hcnRfZm9jdXNfaW47CisgICAgYXBpLT5mb2N1c19vdXQgPSBfZXdrX3Zp
ZXdfc21hcnRfZm9jdXNfb3V0OworICAgIGFwaS0+bW91c2Vfd2hlZWwgPSBfZXdrX3ZpZXdfc21h
cnRfbW91c2Vfd2hlZWw7CisgICAgYXBpLT5tb3VzZV9kb3duID0gX2V3a192aWV3X3NtYXJ0X21v
dXNlX2Rvd247CisgICAgYXBpLT5tb3VzZV91cCA9IF9ld2tfdmlld19zbWFydF9tb3VzZV91cDsK
KyAgICBhcGktPm1vdXNlX21vdmUgPSBfZXdrX3ZpZXdfc21hcnRfbW91c2VfbW92ZTsKKyAgICBh
cGktPmtleV9kb3duID0gX2V3a192aWV3X3NtYXJ0X2tleV9kb3duOworICAgIGFwaS0+a2V5X3Vw
ID0gX2V3a192aWV3X3NtYXJ0X2tleV91cDsKKworICAgIGFwaS0+YWRkX2NvbnNvbGVfbWVzc2Fn
ZSA9IF9ld2tfdmlld19zbWFydF9hZGRfY29uc29sZV9tZXNzYWdlOworICAgIGFwaS0+cnVuX2ph
dmFzY3JpcHRfYWxlcnQgPSBfZXdrX3ZpZXdfc21hcnRfcnVuX2phdmFzY3JpcHRfYWxlcnQ7Cisg
ICAgYXBpLT5ydW5famF2YXNjcmlwdF9jb25maXJtID0gX2V3a192aWV3X3NtYXJ0X3J1bl9qYXZh
c2NyaXB0X2NvbmZpcm07CisgICAgYXBpLT5ydW5famF2YXNjcmlwdF9wcm9tcHQgPSBfZXdrX3Zp
ZXdfc21hcnRfcnVuX2phdmFzY3JpcHRfcHJvbXB0OworICAgIGFwaS0+c2hvdWxkX2ludGVycnVw
dF9qYXZhc2NyaXB0ID0gX2V3a192aWV3X3NtYXJ0X3Nob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlw
dDsKKworICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKKy8qKgorICogU2V0IGEgZml4ZWQgbGF5
b3V0IHNpemUgdG8gYmUgdXNlZCwgZGlzc29jaWF0aW5nIGl0IGZyb20gdmlld3BvcnQgc2l6ZS4K
KyAqCisgKiBTZXR0aW5nIGEgd2lkdGggZGlmZmVyZW50IHRoYW4gemVybyBlbmFibGVzIGZpeGVk
IGxheW91dCBvbiB0aGF0CisgKiBzaXplLiBJdCdzIGF1dG9tYXRpY2FsbHkgc2NhbGVkIGJhc2Vk
IG9uIHpvb20sIGJ1dCB3aWxsIG5vdCBjaGFuZ2UKKyAqIGlmIHZpZXdwb3J0IGNoYW5nZXMuCisg
KgorICogU2V0dGluZyBib3RoIEBhIHcgYW5kIEBhIGggdG8gemVybyB3aWxsIGRpc2FibGUgZml4
ZWQgbGF5b3V0LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoYW5nZSBmaXhlZCBs
YXlvdXQuCisgKiBAcGFyYW0gdyBmaXhlZCB3aWR0aCB0byB1c2UuIFRoaXMgc2l6ZSB3aWxsIGJl
IGF1dG9tYXRpY2FsbHkgc2NhbGVkCisgKiAgICAgICAgYmFzZWQgb24gem9vbSBsZXZlbC4KKyAq
IEBwYXJhbSBoIGZpeGVkIGhlaWdodCB0byB1c2UuIFRoaXMgc2l6ZSB3aWxsIGJlIGF1dG9tYXRp
Y2FsbHkgc2NhbGVkCisgKiAgICAgICAgYmFzZWQgb24gem9vbSBsZXZlbC4KKyAqLwordm9pZCBl
d2tfdmlld19maXhlZF9sYXlvdXRfc2l6ZV9zZXQoRXZhc19PYmplY3QqIG8sIEV2YXNfQ29vcmQg
dywgRXZhc19Db29yZCBoKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qp
OworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdik7CisgICAgV2ViQ29y
ZTo6RnJhbWVWaWV3KiB2aWV3ID0gc2QtPl9wcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAg
aWYgKHcgPD0gMCAmJiBoIDw9IDApIHsKKyAgICAgICAgaWYgKCFwcml2LT5maXhlZF9sYXlvdXQu
dXNlKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwcml2LT5maXhlZF9sYXlvdXQudyA9
IDA7CisgICAgICAgIHByaXYtPmZpeGVkX2xheW91dC5oID0gMDsKKyAgICAgICAgcHJpdi0+Zml4
ZWRfbGF5b3V0LnVzZSA9IEVJTkFfRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHBy
aXYtPmZpeGVkX2xheW91dC51c2UKKyAgICAgICAgICAgICYmIHByaXYtPmZpeGVkX2xheW91dC53
ID09IHcgJiYgcHJpdi0+Zml4ZWRfbGF5b3V0LmggPT0gaCkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgcHJpdi0+Zml4ZWRfbGF5b3V0LncgPSB3OworICAgICAgICBwcml2LT5maXhlZF9s
YXlvdXQuaCA9IGg7CisgICAgICAgIHByaXYtPmZpeGVkX2xheW91dC51c2UgPSBFSU5BX1RSVUU7
CisKKyAgICAgICAgaWYgKHZpZXcpCisgICAgICAgICAgICB2aWV3LT5zZXRGaXhlZExheW91dFNp
emUoV2ViQ29yZTo6SW50U2l6ZSh3LCBoKSk7CisgICAgfQorCisgICAgaWYgKCF2aWV3KQorICAg
ICAgICByZXR1cm47CisgICAgdmlldy0+c2V0VXNlRml4ZWRMYXlvdXQocHJpdi0+Zml4ZWRfbGF5
b3V0LnVzZSk7CisgICAgdmlldy0+Zm9yY2VMYXlvdXQoKTsKK30KKworLyoqCisgKiBHZXQgZml4
ZWQgbGF5b3V0IHNpemUgaW4gdXNlLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHF1
ZXJ5IGZpeGVkIGxheW91dCBzaXplLgorICogQHBhcmFtIHcgd2hlcmUgdG8gcmV0dXJuIHdpZHRo
LiBSZXR1cm5zIDAgb24gZXJyb3Igb3IgaWYgbm8gZml4ZWQKKyAqICAgICAgICBsYXlvdXQgaW4g
dXNlLgorICogQHBhcmFtIGggd2hlcmUgdG8gcmV0dXJuIGhlaWdodC4gUmV0dXJucyAwIG9uIGVy
cm9yIG9yIGlmIG5vIGZpeGVkCisgKiAgICAgICAgbGF5b3V0IGluIHVzZS4KKyAqLwordm9pZCBl
d2tfdmlld19maXhlZF9sYXlvdXRfc2l6ZV9nZXQoRXZhc19PYmplY3QqIG8sIEV2YXNfQ29vcmQq
IHcsIEV2YXNfQ29vcmQqIGgpCit7CisgICAgaWYgKHcpCisgICAgICAgICp3ID0gMDsKKyAgICBp
ZiAoaCkKKyAgICAgICAgKmggPSAwOworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywg
c2QpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdik7CisgICAgaWYg
KHByaXYtPmZpeGVkX2xheW91dC51c2UpIHsKKyAgICAgICAgaWYgKHcpCisgICAgICAgICAgICAq
dyA9IHByaXYtPmZpeGVkX2xheW91dC53OworICAgICAgICBpZiAoaCkKKyAgICAgICAgICAgICpo
ID0gcHJpdi0+Zml4ZWRfbGF5b3V0Lmg7CisgICAgfQorfQorCisvKioKKyAqIFNldCB0aGUgdGhl
bWUgcGF0aCB0byBiZSB1c2VkIGJ5IHRoaXMgdmlldy4KKyAqCisgKiBUaGlzIGFsc28gc2V0cyB0
aGUgdGhlbWUgb24gdGhlIG1haW4gZnJhbWUuIEFzIGZyYW1lcyBpbmhlcml0IHRoZW1lCisgKiBm
cm9tIHRoZWlyIHBhcmVudCwgdGhpcyB3aWxsIGhhdmUgYWxsIGZyYW1lcyB3aXRoIHVuc2V0IHRo
ZW1lIHRvCisgKiB1c2UgdGhpcyBvbmUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8g
Y2hhbmdlIHRoZW1lLgorICogQHBhcmFtIHBhdGggdGhlbWUgcGF0aCwgbWF5IGJlIEBjIDAgdG8g
cmVzZXQgdG8gZGVmYXVsdC4KKyAqLwordm9pZCBld2tfdmlld190aGVtZV9zZXQoRXZhc19PYmpl
Y3QqIG8sIGNvbnN0IGNoYXIqIHBhdGgpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCk7CisgICAgZXdrX2ZyYW1lX3RoZW1lX3NldChzZC0+bWFpbl9mcmFtZSwgcGF0aCk7
Cit9CisKKy8qKgorICogR2V0cyB0aGUgdGhlbWUgc2V0IG9uIHRoaXMgZnJhbWUuCisgKgorICog
VGhpcyByZXR1cm5zIHRoZSB2YWx1ZSBzZXQgYnkgZXdrX3ZpZXdfdGhlbWVfc2V0KCkuCisgKgor
ICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IHRoZW1lIHBhdGguCisgKgorICogQHJldHVy
biB0aGVtZSBwYXRoLCBtYXkgYmUgQGMgMCBpZiBub3Qgc2V0LgorICovCitjb25zdCBjaGFyKiBl
d2tfdmlld190aGVtZV9nZXQoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgcmV0dXJuIGV3a19mcmFtZV90aGVtZV9nZXQoc2Qt
Pm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIEdldCB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50
cyB0aGUgbWFpbiBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBnZXQgbWFp
biBmcmFtZS4KKyAqCisgKiBAcmV0dXJuIGV3a19mcmFtZSBvYmplY3Qgb3IgQGMgMCBpZiBub25l
IHlldC4KKyAqLworRXZhc19PYmplY3QqIGV3a192aWV3X2ZyYW1lX21haW5fZ2V0KGNvbnN0IEV2
YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDAp
OworICAgIHJldHVybiBzZC0+bWFpbl9mcmFtZTsKK30KKworLyoqCisgKiBHZXQgdGhlIGN1cnJl
bnRseSBmb2N1c2VkIGZyYW1lIG9iamVjdC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0
byBnZXQgZm9jdXNlZCBmcmFtZS4KKyAqCisgKiBAcmV0dXJuIGV3a19mcmFtZSBvYmplY3Qgb3Ig
QGMgMCBpZiBub25lIHlldC4KKyAqLworRXZhc19PYmplY3QqIGV3a192aWV3X2ZyYW1lX2ZvY3Vz
ZWRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9S
RVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJp
diwgMCk7CisKKyAgICBXZWJDb3JlOjpGcmFtZSogY29yZSA9IHByaXYtPnBhZ2UtPmZvY3VzQ29u
dHJvbGxlcigpLT5mb2N1c2VkRnJhbWUoKTsKKyAgICBpZiAoIWNvcmUpCisgICAgICAgIHJldHVy
biAwOworCisgICAgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRFZmwqIGNsaWVudCA9IHN0YXRp
Y19jYXN0PFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50RWZsKj4oY29yZS0+bG9hZGVyKCktPmNs
aWVudCgpKTsKKyAgICBpZiAoIWNsaWVudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJu
IGNsaWVudC0+d2ViRnJhbWUoKTsKK30KKworLyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0byBsb2Fk
IHRoZSBnaXZlbiBVUkkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gbG9hZCB1cmku
CisgKiBAcGFyYW0gdXJpIHVuaWZvcm0gcmVzb3VyY2UgaWRlbnRpZmllciB0byBsb2FkLgorICoK
KyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3NmdWwgcmVxdWVzdCwgQGMgRUlOQV9G
QUxTRSBvbiBmYWlsdXJlLgorICogICAgICAgICBOb3RlIHRoYXQgaXQgbWVhbnMgdGhlIHJlcXVl
c3Qgd2FzIGRvbmUsIG5vdCB0aGF0IGl0IHdhcworICogICAgICAgICBzYXRpc2ZpZWQuCisgKi8K
K0VpbmFfQm9vbCBld2tfdmlld191cmlfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiB1
cmkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7
CisgICAgcmV0dXJuIGV3a19mcmFtZV91cmlfc2V0KHNkLT5tYWluX2ZyYW1lLCB1cmkpOworfQor
CisvKioKKyAqIEdldCB0aGUgY3VycmVudCB1cmkgbG9hZGVkIGJ5IG1haW4gZnJhbWUuCisgKgor
ICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gZ2V0IGN1cnJlbnQgdXJpLgorICoKKyAqIEByZXR1
cm4gY3VycmVudCB1cmkgcmVmZXJlbmNlIG9yIEBjIDAuIEl0J3MgaW50ZXJuYWwsIGRvbid0IGNo
YW5nZS4KKyAqLworY29uc3QgY2hhciogZXdrX3ZpZXdfdXJpX2dldChjb25zdCBFdmFzX09iamVj
dCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBy
ZXR1cm4gZXdrX2ZyYW1lX3VyaV9nZXQoc2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIEdl
dCB0aGUgY3VycmVudCB0aXRsZSBvZiBtYWluIGZyYW1lLgorICoKKyAqIEBwYXJhbSBvIHZpZXcg
b2JqZWN0IHRvIGdldCBjdXJyZW50IHRpdGxlLgorICoKKyAqIEByZXR1cm4gY3VycmVudCB0aXRs
ZSByZWZlcmVuY2Ugb3IgQGMgMC4gSXQncyBpbnRlcm5hbCwgZG9uJ3QgY2hhbmdlLgorICovCitj
b25zdCBjaGFyKiBld2tfdmlld190aXRsZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7Cisg
ICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgcmV0dXJuIGV3a19m
cmFtZV90aXRsZV9nZXQoc2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIEdldHMgaWYgbWFp
biBmcmFtZSBpcyBlZGl0YWJsZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBnZXQg
ZWRpdGFibGUgc3RhdGUuCisgKgorICogQHJldHVybiBAYyBFSU5BX1RSVUUgaWYgZWRpdGFibGUs
IEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfZWRpdGFi
bGVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9S
RVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVfZWRpdGFibGVf
Z2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBTZXQgYmFja2dyb3VuZCBjb2xvciBh
bmQgdHJhbnNwYXJlbmN5CisgKgorICogSnVzdCBhcyBpbiBFdmFzLCBjb2xvcnMgYXJlIHByZS1t
dWx0aXBsaWVkLCBzbyA1MCUgcmVkIGlzCisgKiAoMTI4LCAwLCAwLCAxMjgpIGFuZCBub3QgKDI1
NSwgMCwgMCwgMTI4KSEKKyAqCisgKiBAd2FybmluZyBXYXRjaCBvdXQgcGVyZm9ybWFuY2UgaXNz
dWVzIHdpdGggdHJhbnNwYXJlbmN5ISBPYmplY3QKKyAqICAgICAgICAgIHdpbGwgYmUgaGFuZGxl
ZCBhcyB0cmFuc3BhcmVudCBpbWFnZSBieSBldmFzIGV2ZW4gaWYgdGhlCisgKiAgICAgICAgICB3
ZWJwYWdlIHNwZWNpZmllcyBhIGJhY2tncm91bmQgY29sb3IuIFRoYXQgbWVhbiB5b3UnbGwgcGF5
CisgKiAgICAgICAgICBhIHByaWNlIGV2ZW4gaWYgaXQncyBub3QgcmVhbGx5IHRyYW5zcGFyZW50
LCB0aHVzCisgKiAgICAgICAgICBzY3JvbGxpbmcvcGFubmluZyBhbmQgem9vbWluZyB3aWxsIGJl
IGxpa2VseSBzbG93ZXIgdGhhbgorICogICAgICAgICAgaWYgdHJhbnNwYXJlbmN5IGlzIG9mZi4K
KyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGFuZ2UuCisgKiBAcGFyYW0gciByZWQg
Y29tcG9uZW50LgorICogQHBhcmFtIGcgZ3JlZW4gY29tcG9uZW50LgorICogQHBhcmFtIGIgYmx1
ZSBjb21wb25lbnQuCisgKiBAcGFyYW0gYSB0cmFuc3BhcmVuY3kuCisgKi8KK3ZvaWQgZXdrX3Zp
ZXdfYmdfY29sb3Jfc2V0KEV2YXNfT2JqZWN0KiBvLCBpbnQgciwgaW50IGcsIGludCBiLCBpbnQg
YSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFSU5BX1NB
RkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JF
VFVSTihzZC0+YXBpLT5iZ19jb2xvcl9zZXQpOworCisgICAgaWYgKGEgPCAwKSB7CisgICAgICAg
IFdSTigiQWxwaGEgbGVzcyB0aGFuIHplcm8gKCVkKS4iLCBhKTsKKyAgICAgICAgYSA9IDA7Cisg
ICAgfSBlbHNlIGlmIChhID4gMjU1KSB7CisgICAgICAgIFdSTigiQWxwaGEgaXMgbGFyZ2VyIHRo
YW4gMjU1ICglZCkuIiwgYSk7CisgICAgICAgIGEgPSAyNTU7CisgICAgfQorCisjZGVmaW5lIENI
RUNLX1BSRU1VTF9DT0xPUihjLCBhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCisgICAgaWYgKGMgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSTigiQ29sb3IgY29tcG9uZW50ICIj
YyIgaXMgbGVzcyB0aGFuIHplcm8gKCVkKS4iLCBjKTsgICAgICAgICBcCisgICAgICAgIGMgPSAw
OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBcCisgICAgfSBlbHNlIGlmIChjID4gYSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSTigiQ29sb3IgY29tcG9uZW50ICIjYyIg
aXMgZ3JlYXRlciB0aGFuIGFscGhhICglZCwgYWxwaGE9JWQpLiIsIFwKKyAgICAgICAgICAgIGMs
IGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFwKKyAgICAgICAgYyA9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgQ0hFQ0tfUFJFTVVMX0NPTE9SKHIsIGEp
OworICAgIENIRUNLX1BSRU1VTF9DT0xPUihnLCBhKTsKKyAgICBDSEVDS19QUkVNVUxfQ09MT1Io
YiwgYSk7CisjdW5kZWYgQ0hFQ0tfUFJFTVVMX0NPTE9SCisKKyAgICBzZC0+YmdfY29sb3IuciA9
IHI7CisgICAgc2QtPmJnX2NvbG9yLmcgPSBnOworICAgIHNkLT5iZ19jb2xvci5iID0gYjsKKyAg
ICBzZC0+YmdfY29sb3IuYSA9IGE7CisKKyAgICBzZC0+YXBpLT5iZ19jb2xvcl9zZXQoc2QsIHIs
IGcsIGIsIGEpOworCisgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3ID0gc2QtPl9wcml2LT5t
YWluX2ZyYW1lLT52aWV3KCk7CisgICAgaWYgKHZpZXcpIHsKKyAgICAgICAgV2ViQ29yZTo6Q29s
b3IgY29sb3I7CisKKyAgICAgICAgaWYgKCFhKQorICAgICAgICAgICAgY29sb3IgPSBXZWJDb3Jl
OjpDb2xvcigwLCAwLCAwLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoYSA9PSAyNTUpCisgICAgICAg
ICAgICBjb2xvciA9IFdlYkNvcmU6OkNvbG9yKHIsIGcsIGIsIGEpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBjb2xvciA9IFdlYkNvcmU6OkNvbG9yKHIgKiAyNTUgLyBhLCBnICogMjU1IC8g
YSwgYiAqIDI1NSAvIGEsIGEpOworCisgICAgICAgIHZpZXctPnVwZGF0ZUJhY2tncm91bmRSZWN1
cnNpdmVseShjb2xvciwgIWEpOworICAgIH0KK30KKworLyoqCisgKiBRdWVyeSBpZiB2aWV3IG9i
amVjdCBiYWNrZ3JvdW5kIGNvbG9yLgorICoKKyAqIEp1c3QgYXMgaW4gRXZhcywgY29sb3JzIGFy
ZSBwcmUtbXVsdGlwbGllZCwgc28gNTAlIHJlZCBpcworICogKDEyOCwgMCwgMCwgMTI4KSBhbmQg
bm90ICgyNTUsIDAsIDAsIDEyOCkhCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gcXVl
cnkuCisgKiBAcGFyYW0gciB3aGVyZSB0byByZXR1cm4gcmVkIGNvbG9yIGNvbXBvbmVudC4KKyAq
IEBwYXJhbSBnIHdoZXJlIHRvIHJldHVybiBncmVlbiBjb2xvciBjb21wb25lbnQuCisgKiBAcGFy
YW0gYiB3aGVyZSB0byByZXR1cm4gYmx1ZSBjb2xvciBjb21wb25lbnQuCisgKiBAcGFyYW0gYSB3
aGVyZSB0byByZXR1cm4gYWxwaGEgdmFsdWUuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfYmdfY29sb3Jf
Z2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvLCBpbnQqIHIsIGludCogZywgaW50KiBiLCBpbnQqIGEp
Cit7CisgICAgaWYgKHIpCisgICAgICAgICpyID0gMDsKKyAgICBpZiAoZykKKyAgICAgICAgKmcg
PSAwOworICAgIGlmIChiKQorICAgICAgICAqYiA9IDA7CisgICAgaWYgKGEpCisgICAgICAgICph
ID0gMDsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBpZiAocikK
KyAgICAgICAgKnIgPSBzZC0+YmdfY29sb3IucjsKKyAgICBpZiAoZykKKyAgICAgICAgKmcgPSBz
ZC0+YmdfY29sb3IuZzsKKyAgICBpZiAoYikKKyAgICAgICAgKmIgPSBzZC0+YmdfY29sb3IuYjsK
KyAgICBpZiAoYSkKKyAgICAgICAgKmEgPSBzZC0+YmdfY29sb3IuYTsKK30KKworLyoqCisgKiBT
ZWFyY2ggdGhlIGdpdmVuIHRleHQgc3RyaW5nIGluIGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBv
IHZpZXcgb2JqZWN0IHdoZXJlIHRvIHNlYXJjaCB0ZXh0LgorICogQHBhcmFtIHN0cmluZyByZWZl
cmVuY2Ugc3RyaW5nIHRvIHNlYXJjaC4KKyAqIEBwYXJhbSBjYXNlX3NlbnNpdGl2ZSBpZiBzZWFy
Y2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdC4KKyAqIEBwYXJhbSBmb3J3YXJkIGlm
IHNlYXJjaCBpcyBmcm9tIGN1cnNvciBhbmQgb24gb3IgYmFja3dhcmRzLgorICogQHBhcmFtIHdy
YXAgaWYgc2VhcmNoIHNob3VsZCB3cmFwIGF0IGVuZC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFf
VFJVRSBpZiBmb3VuZCwgQGMgRUlOQV9GQUxTRSBpZiBub3Qgb3IgZmFpbHVyZS4KKyAqLworRWlu
YV9Cb29sIGV3a192aWV3X3RleHRfc2VhcmNoKGNvbnN0IEV2YXNfT2JqZWN0KiBvLCBjb25zdCBj
aGFyKiBzdHJpbmcsIEVpbmFfQm9vbCBjYXNlX3NlbnNpdGl2ZSwgRWluYV9Cb29sIGZvcndhcmQs
IEVpbmFfQm9vbCB3cmFwKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHN0cmluZywg
RUlOQV9GQUxTRSk7CisgICAgV2ViQ29yZTo6VGV4dENhc2VTZW5zaXRpdml0eSBzZW5zaXRpdmU7
CisgICAgV2ViQ29yZTo6RmluZERpcmVjdGlvbiBkaXJlY3Rpb247CisKKyAgICBpZiAoY2FzZV9z
ZW5zaXRpdmUpCisgICAgICAgIHNlbnNpdGl2ZSA9IFdlYkNvcmU6OlRleHRDYXNlU2Vuc2l0aXZl
OworICAgIGVsc2UKKyAgICAgICAgc2Vuc2l0aXZlID0gV2ViQ29yZTo6VGV4dENhc2VJbnNlbnNp
dGl2ZTsKKworICAgIGlmIChmb3J3YXJkKQorICAgICAgICBkaXJlY3Rpb24gPSBXZWJDb3JlOjpG
aW5kRGlyZWN0aW9uRm9yd2FyZDsKKyAgICBlbHNlCisgICAgICAgIGRpcmVjdGlvbiA9IFdlYkNv
cmU6OkZpbmREaXJlY3Rpb25CYWNrd2FyZDsKKworICAgIHJldHVybiBwcml2LT5wYWdlLT5maW5k
U3RyaW5nKFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgoc3RyaW5nKSwgc2Vuc2l0aXZlLCBkaXJl
Y3Rpb24sIHdyYXApOworfQorCisvKioKKyAqIE1hcmsgbWF0Y2hlcyB0aGUgZ2l2ZW4gdGV4dCBz
dHJpbmcgaW4gZG9jdW1lbnQuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3Qgd2hlcmUgdG8g
c2VhcmNoIHRleHQuCisgKiBAcGFyYW0gc3RyaW5nIHJlZmVyZW5jZSBzdHJpbmcgdG8gbWF0Y2gu
CisgKiBAcGFyYW0gY2FzZV9zZW5zaXRpdmUgaWYgbWF0Y2ggc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0
aXZlIG9yIG5vdC4KKyAqIEBwYXJhbSBoaWdobGlnaHQgaWYgbWF0Y2hlcyBzaG91bGQgYmUgaGln
aGxpZ2h0ZWQuCisgKiBAcGFyYW0gbGltaXQgbWF4aW11bSBhbW91bnQgb2YgbWF0Y2hlcywgb3Ig
emVybyB0byB1bmxpbWl0ZWQuCisgKgorICogQHJldHVybiBudW1iZXIgb2YgbWF0Y2hlcy4KKyAq
LwordW5zaWduZWQgaW50IGV3a192aWV3X3RleHRfbWF0Y2hlc19tYXJrKEV2YXNfT2JqZWN0KiBv
LCBjb25zdCBjaGFyKiBzdHJpbmcsIEVpbmFfQm9vbCBjYXNlX3NlbnNpdGl2ZSwgRWluYV9Cb29s
IGhpZ2hsaWdodCwgdW5zaWduZWQgaW50IGxpbWl0KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwg
cHJpdiwgMCk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHN0cmluZywgMCk7
CisgICAgV2ViQ29yZTo6VGV4dENhc2VTZW5zaXRpdml0eSBzZW5zaXRpdmU7CisKKyAgICBpZiAo
Y2FzZV9zZW5zaXRpdmUpCisgICAgICAgIHNlbnNpdGl2ZSA9IFdlYkNvcmU6OlRleHRDYXNlU2Vu
c2l0aXZlOworICAgIGVsc2UKKyAgICAgICAgc2Vuc2l0aXZlID0gV2ViQ29yZTo6VGV4dENhc2VJ
bnNlbnNpdGl2ZTsKKworICAgIHJldHVybiBwcml2LT5wYWdlLT5tYXJrQWxsTWF0Y2hlc0ZvclRl
eHQoV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChzdHJpbmcpLCBzZW5zaXRpdmUsIGhpZ2hsaWdo
dCwgbGltaXQpOworfQorCisvKioKKyAqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgZXdrX3ZpZXdf
dGV4dF9tYXRjaGVzX21hcmsoKQorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHdoZXJlIHRv
IHNlYXJjaCB0ZXh0LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBj
IEVJTkFfRkFMU0UgZm9yIGZhaWx1cmUuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld190ZXh0X21h
dGNoZXNfdW5tYXJrX2FsbChFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHByaXYtPnBhZ2UtPnVubWFya0FsbFRl
eHRNYXRjaGVzKCk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBTZXQgaWYg
c2hvdWxkIGhpZ2hsaWdodCBtYXRjaGVzIG1hcmtlZCB3aXRoIGV3a192aWV3X3RleHRfbWF0Y2hl
c19tYXJrKCkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3Qgd2hlcmUgdG8gc2V0IGlmIG1h
dGNoZXMgYXJlIGhpZ2hsaWdodGVkIG9yIG5vdC4KKyAqIEBwYXJhbSBoaWdobGlnaHQgaWYgQGMg
RUlOQV9UUlVFLCBtYXRjaGVzIHdpbGwgYmUgaGlnaGxpZ2h0ZWQuCisgKgorICogQHJldHVybiBA
YyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBmb3IgZmFpbHVyZS4KKyAqLwor
RWluYV9Cb29sIGV3a192aWV3X3RleHRfbWF0Y2hlc19oaWdobGlnaHRfc2V0KEV2YXNfT2JqZWN0
KiBvLCBFaW5hX0Jvb2wgaGlnaGxpZ2h0KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRV
Uk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVfdGV4dF9tYXRjaGVz
X2hpZ2hsaWdodF9zZXQoc2QtPm1haW5fZnJhbWUsIGhpZ2hsaWdodCk7Cit9CisKKy8qKgorICog
R2V0IGlmIHNob3VsZCBoaWdobGlnaHQgbWF0Y2hlcyBtYXJrZWQgd2l0aCBld2tfdmlld190ZXh0
X21hdGNoZXNfbWFyaygpLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHF1ZXJ5IGlm
IG1hdGNoZXMgYXJlIGhpZ2hsaWdodGVkIG9yIG5vdC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFf
VFJVRSBpZiB0aGV5IGFyZSBoaWdobGlnaHRlZCwgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisg
Ki8KK0VpbmFfQm9vbCBld2tfdmlld190ZXh0X21hdGNoZXNfaGlnaGxpZ2h0X2dldChjb25zdCBF
dmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBF
SU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3RleHRfbWF0Y2hlc19oaWdobGlnaHRf
Z2V0KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBTZXRzIGlmIG1haW4gZnJhbWUgaXMg
ZWRpdGFibGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gc2V0IGVkaXRhYmxlIHN0
YXRlLgorICogQHBhcmFtIGVkaXRhYmxlIG5ldyBzdGF0ZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJ
TkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9C
b29sIGV3a192aWV3X2VkaXRhYmxlX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGVkaXRh
YmxlKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIHJldHVybiBld2tfZnJhbWVfZWRpdGFibGVfc2V0KHNkLT5tYWluX2ZyYW1lLCBlZGl0
YWJsZSk7Cit9CisKKy8qKgorICogR2V0IHRoZSBjb3B5IG9mIHRoZSBzZWxlY3Rpb24gdGV4dC4K
KyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBnZXQgc2VsZWN0aW9uIHRleHQuCisgKgor
ICogQHJldHVybiBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIG9yIEBjIDAgaWYgbm90aGluZyBpcyBz
ZWxlY3RlZCBvciBmYWlsdXJlLgorICovCitjaGFyKiBld2tfdmlld19zZWxlY3Rpb25fZ2V0KGNv
bnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywg
c2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7Cisg
ICAgV2ViQ29yZTo6Q1N0cmluZyBzID0gcHJpdi0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZv
Y3VzZWRPck1haW5GcmFtZSgpLT5zZWxlY3RlZFRleHQoKS51dGY4KCk7CisgICAgaWYgKHMuaXNO
dWxsKCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdHJkdXAocy5kYXRhKCkpOwor
fQorCitzdGF0aWMgRWluYV9Cb29sIF9ld2tfdmlld19lZGl0b3JfY29tbWFuZChFd2tfVmlld19Q
cml2YXRlX0RhdGEqIHByaXYsIGNvbnN0IGNoYXIqIGNvbW1hbmQpCit7CisgICAgcmV0dXJuIHBy
aXYtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZWRpdG9y
KCktPmNvbW1hbmQoV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChjb21tYW5kKSkuZXhlY3V0ZSgp
OworfQorCisvKioKKyAqIFVuc2VsZWN0cyB3aGF0ZXZlciB3YXMgc2VsZWN0ZWQuCisgKgorICog
QHJldHVybiBAYyBFSU5BX1RSVUUgaWYgb3BlcmF0aW9uIHdhcyBleGVjdXRlZCwgQGMgRUlOQV9G
QUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19zZWxlY3Rfbm9uZShFdmFz
X09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5B
X0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFf
RkFMU0UpOworICAgIHJldHVybiBfZXdrX3ZpZXdfZWRpdG9yX2NvbW1hbmQocHJpdiwgIlVuc2Vs
ZWN0Iik7Cit9CisKKy8qKgorICogU2VsZWN0cyBldmVyeXRoaW5nLgorICoKKyAqIEByZXR1cm4g
QGMgRUlOQV9UUlVFIGlmIG9wZXJhdGlvbiB3YXMgZXhlY3V0ZWQsIEBjIEVJTkFfRkFMU0Ugb3Ro
ZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2VsZWN0X2FsbChFdmFzX09iamVjdCog
bykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsK
KyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOwor
ICAgIHJldHVybiBfZXdrX3ZpZXdfZWRpdG9yX2NvbW1hbmQocHJpdiwgIlNlbGVjdEFsbCIpOwor
fQorCisvKioKKyAqIFNlbGVjdHMgdGhlIGN1cnJlbnQgcGFyYWdyYWguCisgKgorICogQHJldHVy
biBAYyBFSU5BX1RSVUUgaWYgb3BlcmF0aW9uIHdhcyBleGVjdXRlZCwgQGMgRUlOQV9GQUxTRSBv
dGhlcndpc2UuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19zZWxlY3RfcGFyYWdyYXBoKEV2YXNf
T2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFf
RkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9G
QUxTRSk7CisgICAgcmV0dXJuIF9ld2tfdmlld19lZGl0b3JfY29tbWFuZChwcml2LCAiU2VsZWN0
UGFyYWdyYXBoIik7Cit9CisKKy8qKgorICogU2VsZWN0cyB0aGUgY3VycmVudCBzZW50ZW5jZS4K
KyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBvcGVyYXRpb24gd2FzIGV4ZWN1dGVkLCBA
YyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3NlbGVjdF9z
ZW50ZW5jZShFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJO
KG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2Qs
IHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBfZXdrX3ZpZXdfZWRpdG9yX2NvbW1hbmQo
cHJpdiwgIlNlbGVjdFNlbnRlbmNlIik7Cit9CisKKy8qKgorICogU2VsZWN0cyB0aGUgY3VycmVu
dCBsaW5lLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIG9wZXJhdGlvbiB3YXMgZXhl
Y3V0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
c2VsZWN0X2xpbmUoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3a192aWV3X2VkaXRvcl9jb21t
YW5kKHByaXYsICJTZWxlY3RMaW5lIik7Cit9CisKKy8qKgorICogU2VsZWN0cyB0aGUgY3VycmVu
dCB3b3JkLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIG9wZXJhdGlvbiB3YXMgZXhl
Y3V0ZWQsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
c2VsZWN0X3dvcmQoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gX2V3a192aWV3X2VkaXRvcl9jb21t
YW5kKHByaXYsICJTZWxlY3RXb3JkIik7Cit9CisKKy8qKgorICogR2V0IGN1cnJlbnQgbG9hZCBw
cm9ncmVzcyBlc3RpbWF0ZSBmcm9tIDAuMCB0byAxLjAuCisgKgorICogQHBhcmFtIG8gdmlldyBv
YmplY3QgdG8gZ2V0IGN1cnJlbnQgcHJvZ3Jlc3MuCisgKgorICogQHJldHVybiBwcm9ncmVzIHZh
bHVlIGZyb20gMC4wIHRvIDEuMCBvciAtMS4wIG9uIGVycm9yLgorICovCitkb3VibGUgZXdrX3Zp
ZXdfbG9hZF9wcm9ncmVzc19nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgLTEuMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRf
T1JfUkVUVVJOKHNkLCBwcml2LCAtMS4wKTsKKyAgICByZXR1cm4gcHJpdi0+cGFnZS0+cHJvZ3Jl
c3MoKS0+ZXN0aW1hdGVkUHJvZ3Jlc3MoKTsKK30KKworLyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0
byBzdG9wIGxvYWRpbmcuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gc3RvcCBsb2Fk
aW5nLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFfRkFM
U0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX2ZyYW1lX3N0b3AoKQorICovCitFaW5hX0Jv
b2wgZXdrX3ZpZXdfc3RvcChFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3N0b3Ao
c2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIEFzayBtYWluIGZyYW1lIHRvIHJlbG9hZCBj
dXJyZW50IGRvY3VtZW50LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHJlbG9hZC4K
KyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90
aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a19mcmFtZV9yZWxvYWQoKQorICovCitFaW5hX0Jvb2wg
ZXdrX3ZpZXdfcmVsb2FkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBld2tfZnJhbWVfcmVsb2Fk
KHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0byBmdWxseSBy
ZWxvYWQgY3VycmVudCBkb2N1bWVudCwgdXNpbmcgbm8gY2FjaGVzLgorICoKKyAqIEBwYXJhbSBv
IHZpZXcgb2JqZWN0IHRvIHJlbG9hZC4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBz
dWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a19mcmFtZV9y
ZWxvYWRfZnVsbCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19yZWxvYWRfZnVsbChFdmFzX09i
amVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZB
TFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3JlbG9hZF9mdWxsKHNkLT5tYWluX2ZyYW1lKTsK
K30KKworLyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0byBuYXZpZ2F0ZSBiYWNrIGluIGhpc3Rvcnku
CisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gbmF2aWdhdGUgYmFjay4KKyAqCisgKiBA
cmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4K
KyAqCisgKiBAc2VlIGV3a19mcmFtZV9iYWNrKCkKKyAqLworRWluYV9Cb29sIGV3a192aWV3X2Jh
Y2soRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBz
ZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9iYWNrKHNkLT5tYWluX2ZyYW1l
KTsKK30KKworLyoqCisgKiBBc2sgbWFpbiBmcmFtZSB0byBuYXZpZ2F0ZSBmb3J3YXJkIGluIGhp
c3RvcnkuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gbmF2aWdhdGUgZm9yd2FyZC4K
KyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90
aGVyd2lzZS4KKyAqCisgKiBAc2VlIGV3a19mcmFtZV9mb3J3YXJkKCkKKyAqLworRWluYV9Cb29s
IGV3a192aWV3X2ZvcndhcmQoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19mcmFtZV9mb3J3
YXJkKHNkLT5tYWluX2ZyYW1lKTsKK30KKworLyoqCisgKiBOYXZpZ2F0ZSBiYWNrIG9yIGZvcndh
cmQgaW4gaGlzdG9yeS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBuYXZpZ2F0ZS4K
KyAqIEBwYXJhbSBzdGVwcyBpZiBwb3NpdGl2ZSBuYXZpZ2F0ZXMgdGhhdCBhbW91bnQgZm9yd2Fy
ZHMsIGlmIG5lZ2F0aXZlCisgKiAgICAgICAgZG9lcyBiYWNrd2FyZHMuCisgKgorICogQHJldHVy
biBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgor
ICogQHNlZSBld2tfZnJhbWVfbmF2aWdhdGUoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfbmF2
aWdhdGUoRXZhc19PYmplY3QqIG8sIGludCBzdGVwcykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX25hdmln
YXRlKHNkLT5tYWluX2ZyYW1lLCBzdGVwcyk7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgaXQgaXMg
cG9zc2libGUgdG8gbmF2aWdhdGUgYmFja3dhcmRzIG9uZSBpdGVtIGluIGhpc3RvcnkuCisgKgor
ICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8gY2hlY2sgaWYgYmFja3dhcmQgbmF2aWdhdGlvbiBp
cyBwb3NzaWJsZS4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBwb3NzaWJsZSwgQGMg
RUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKgorICogQHNlZSBld2tfdmlld19uYXZpZ2F0ZV9wb3Nz
aWJsZSgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19iYWNrX3Bvc3NpYmxlKEV2YXNfT2JqZWN0
KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIHJldHVybiBld2tfZnJhbWVfYmFja19wb3NzaWJsZShzZC0+bWFpbl9mcmFtZSk7Cit9
CisKKy8qKgorICogQ2hlY2sgaWYgaXQgaXMgcG9zc2libGUgdG8gbmF2aWdhdGUgZm9yd2FyZHMg
b25lIGl0ZW0gaW4gaGlzdG9yeS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGVj
ayBpZiBmb3J3YXJkIG5hdmlnYXRpb24gaXMgcG9zc2libGUuCisgKgorICogQHJldHVybiBAYyBF
SU5BX1RSVUUgaWYgcG9zc2libGUsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBz
ZWUgZXdrX3ZpZXdfbmF2aWdhdGVfcG9zc2libGUoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
Zm9yd2FyZF9wb3NzaWJsZShFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX2Zvcndh
cmRfcG9zc2libGUoc2QtPm1haW5fZnJhbWUpOworfQorCisvKioKKyAqIENoZWNrIGlmIGl0IGlz
IHBvc3NpYmxlIHRvIG5hdmlnYXRlIGdpdmVuIEBhIHN0ZXBzIGluIGhpc3RvcnkuCisgKgorICog
QHBhcmFtIG8gdmlldyBvYmplY3QgdG8gbmF2aWdhdGUuCisgKiBAcGFyYW0gc3RlcHMgaWYgcG9z
aXRpdmUgbmF2aWdhdGVzIHRoYXQgYW1vdW50IGZvcndhcmRzLCBpZiBuZWdhdGl2ZQorICogICAg
ICAgIGRvZXMgYmFja3dhcmRzLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIHBvc3Np
YmxlLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X25h
dmlnYXRlX3Bvc3NpYmxlKEV2YXNfT2JqZWN0KiBvLCBpbnQgc3RlcHMpCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIGV3a19m
cmFtZV9uYXZpZ2F0ZV9wb3NzaWJsZShzZC0+bWFpbl9mcmFtZSwgc3RlcHMpOworfQorCisvKioK
KyAqIENoZWNrIGlmIG5hdmlnYXRpb24gaGlzdG9yeSAoYmFjay1mb3J3YXJkIGxpc3RzKSBpcyBl
bmFibGVkLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGNoZWNrIGlmIG5hdmlnYXRp
b24gaGlzdG9yeSBpcyBlbmFibGVkLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIGlmIHZp
ZXcga2VlcHMgaGlzdG9yeSwgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2UuCisgKi8KK0VpbmFfQm9v
bCBld2tfdmlld19oaXN0b3J5X2VuYWJsZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7Cisg
ICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdL
X1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1
cm4gcHJpdi0+cGFnZS0+YmFja0ZvcndhcmRMaXN0KCktPmVuYWJsZWQoKTsKK30KKworLyoqCisg
KiBTZXRzIGlmIG5hdmlnYXRpb24gaGlzdG9yeSAoYmFjay1mb3J3YXJkIGxpc3RzKSBpcyBlbmFi
bGVkLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHNldCBpZiBuYXZpZ2F0aW9uIGhp
c3RvcnkgaXMgZW5hYmxlZC4KKyAqIEBwYXJhbSBlbmFibGUgQGMgRUlOQV9UUlVFIGlmIHdlIHdh
bnQgdG8gZW5hYmxlIG5hdmlnYXRpb24gaGlzdG9yeTsKKyAqIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3
aXNlLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFfRkFM
U0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfc2V0
KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgZW5hYmxlKQoreworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09S
X1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcHJpdi0+cGFnZS0+YmFja0Zvcndh
cmRMaXN0KCktPnNldEVuYWJsZWQoZW5hYmxlKTsKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQor
CisvKioKKyAqIEdldHMgdGhlIGhpc3RvcnkgKGJhY2stZm9yd2FyZCBsaXN0KSBhc3NvY2lhdGVk
IHdpdGggdGhpcyB2aWV3LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIGdldCBuYXZp
Z2F0aW9uIGhpc3RvcnkgZnJvbS4KKyAqCisgKiBAcmV0dXJuIHJldHVybnMgdGhlIGhpc3Rvcnkg
aW5zdGFuY2UgaGFuZGxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiAgICAgICAgIHZpZXcgb3Ig
QGMgMCBvbiBlcnJvcnMgKGluY2x1ZGluZyB3aGVuIGhpc3RvcnkgaXMgbm90CisgKiAgICAgICAg
IGVuYWJsZWQgd2l0aCBld2tfdmlld19oaXN0b3J5X2VuYWJsZV9zZXQoKSkuIFRoaXMgaW5zdGFu
Y2UKKyAqICAgICAgICAgaXMgdW5pcXVlIGZvciB0aGlzIHZpZXcgYW5kIHRodXMgbXVsdGlwbGUg
Y2FsbHMgdG8gdGhpcworICogICAgICAgICBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHZpZXcgYXMg
cGFyYW1ldGVyIHJldHVybnMgdGhlIHNhbWUKKyAqICAgICAgICAgaGFuZGxlLiBUaGlzIGhhbmRs
ZSBpcyBhbGl2ZSB3aGlsZSB2aWV3IGlzIGFsaXZlLCB0aHVzIG9uZQorICogICAgICAgICBtaWdo
dCB3YW50IHRvIGxpc3RlbiBmb3IgRVZBU19DQUxMQkFDS19ERUwgb24gZ2l2ZW4gdmlldworICog
ICAgICAgICAoQGEgbykgdG8ga25vdyB3aGVuIHRvIHN0b3AgdXNpbmcgcmV0dXJuZWQgaGFuZGxl
LgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfc2V0KCkKKyAqLworRXdrX0hp
c3RvcnkqIGV3a192aWV3X2hpc3RvcnlfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZf
R0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgaWYgKCFwcml2LT5wYWdlLT5iYWNrRm9y
d2FyZExpc3QoKS0+ZW5hYmxlZCgpKSB7CisgICAgICAgIEVSUigiYXNrZWQgaGlzdG9yeSwgYnV0
IGl0J3MgZGlzYWJsZWQhIFJldHVybmluZyAwISIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9
CisgICAgcmV0dXJuIHByaXYtPmhpc3Rvcnk7Cit9CisKKy8qKgorICogR2V0IHRoZSBjdXJyZW50
IHpvb20gbGV2ZWwgb2YgbWFpbiBmcmFtZS4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0
byBxdWVyeSB6b29tIGxldmVsLgorICoKKyAqIEByZXR1cm4gY3VycmVudCB6b29tIGxldmVsIGlu
IHVzZSBvciAtMS4wIG9uIGVycm9yLgorICovCitmbG9hdCBld2tfdmlld196b29tX2dldChjb25z
dCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCAtMS4wKTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3pvb21fZ2V0KHNkLT5tYWluX2ZyYW1lKTsK
K30KKworLyoqCisgKiBTZXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiBtYWluIGZyYW1lLgor
ICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIHNldCB6b29tIGxldmVsLgorICogQHBhcmFt
IHpvb20gbmV3IGxldmVsIHRvIHVzZS4KKyAqIEBwYXJhbSBjeCB4IG9mIGNlbnRlciBjb29yZGlu
YXRlCisgKiBAcGFyYW0gY3kgeSBvZiBjZW50ZXIgY29vcmRpbmF0ZQorICoKKyAqIEByZXR1cm4g
QGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitF
aW5hX0Jvb2wgZXdrX3ZpZXdfem9vbV9zZXQoRXZhc19PYmplY3QqIG8sIGZsb2F0IHpvb20sIEV2
YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5f
VkFMKHNkLT5hcGksIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJO
X1ZBTChzZC0+YXBpLT56b29tX3NldCwgRUlOQV9GQUxTRSk7CisgICAgaWYgKHpvb20gPCBaT09N
X01JTikgeworICAgICAgICBXUk4oInpvb20gbGV2ZWwgaXMgPCAlZiA6ICVmIiwgKGRvdWJsZSla
T09NX01JTiwgKGRvdWJsZSl6b29tKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAg
fQorICAgIGlmICh6b29tID4gWk9PTV9NQVgpIHsKKyAgICAgICAgV1JOKCJ6b29tIGxldmVsIGlz
ID4gJWYgOiAlZiIsIChkb3VibGUpWk9PTV9NQVgsIChkb3VibGUpem9vbSk7CisgICAgICAgIHJl
dHVybiBFSU5BX0ZBTFNFOworICAgIH0KKworICAgIGlmIChjeCA+PSBzZC0+dmlldy53KQorICAg
ICAgICBjeCA9IHNkLT52aWV3LncgLSAxOworICAgIGlmIChjeSA+PSBzZC0+dmlldy5oKQorICAg
ICAgICBjeSA9IHNkLT52aWV3LmggLSAxOworICAgIGlmIChjeCA8IDApCisgICAgICAgIGN4ID0g
MDsKKyAgICBpZiAoY3kgPCAwKQorICAgICAgICBjeSA9IDA7CisgICAgX2V3a192aWV3X3pvb21f
YW5pbWF0ZWRfbWFya19zdG9wKHNkKTsKKyAgICByZXR1cm4gc2QtPmFwaS0+em9vbV9zZXQoc2Qs
IHpvb20sIGN4LCBjeSk7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld196b29tX3dlYWtfc21vb3Ro
X3NjYWxlX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gc2QtPnpvb21fd2Vha19z
bW9vdGhfc2NhbGU7Cit9CisKK3ZvaWQgZXdrX3ZpZXdfem9vbV93ZWFrX3Ntb290aF9zY2FsZV9z
ZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCBzbW9vdGhfc2NhbGUpCit7CisgICAgRVdLX1ZJ
RVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgc21vb3RoX3NjYWxlID0gISFzbW9vdGhf
c2NhbGU7CisgICAgaWYgKHNkLT56b29tX3dlYWtfc21vb3RoX3NjYWxlID09IHNtb290aF9zY2Fs
ZSkKKyAgICAgICAgcmV0dXJuOworICAgIHNkLT56b29tX3dlYWtfc21vb3RoX3NjYWxlID0gc21v
b3RoX3NjYWxlOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGkpOworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPnpvb21fd2Vha19zbW9vdGhfc2Nh
bGVfc2V0KTsKKyAgICBzZC0+YXBpLT56b29tX3dlYWtfc21vb3RoX3NjYWxlX3NldChzZCwgc21v
b3RoX3NjYWxlKTsKK30KKworLyoqCisgKiBTZXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBvZiBi
YWNraW5nIHN0b3JlLCBjZW50ZXJlZCBhdCBnaXZlbiBwb2ludC4KKyAqCisgKiBVbmxpa2UgZXdr
X3ZpZXdfem9vbV9zZXQoKSwgdGhpcyBjYWxsIGRvIG5vdCBhc2sgV2ViS2l0IHRvIHJlbmRlcgor
ICogYXQgbmV3IHNpemUsIGJ1dCBzY2FsZSB3aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQsIGJlaW5n
IG11Y2ggZmFzdGVyCisgKiBidXQgd29yc2UgcXVhbGl0eS4KKyAqCisgKiBPZnRlbiBvbmUgc2hv
dWxkIHVzZSBld2tfdmlld196b29tX2FuaW1hdGVkX3NldCgpLCBpdCB3aWxsIGNhbGwgdGhlCisg
KiBzYW1lIG1hY2hpbmVyeSBpbnRlcm5hbGx5LgorICoKKyAqIEBub3RlIHRoaXMgd2lsbCBzZXQg
dmFyaWFibGVzIHVzZWQgYnkgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9zZXQoKQorICogICAgICAg
c28gc3ViLWNsYXNzZXMgd2lsbCBub3QgcmVzZXQgaW50ZXJuYWwgc3RhdGUgb24gdGhlaXIKKyAq
ICAgICAgICJjYWxjdWxhdGUiIHBoYXNlLiBUbyB1bnNldCB0aG9zZSBhbmQgZW5hYmxlIHN1Yi1j
bGFzc2VzIHRvCisgKiAgICAgICByZXNldCB0aGVpciBpbnRlcm5hbCBzdGF0ZSwgY2FsbAorICog
ICAgICAgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3AoKS4gTmFtZWx5LCB0aGlzIGNh
bGwgd2lsbAorICogICAgICAgc2V0IGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdGFydCgp
IHRvIGFjdHVhbCB3ZWJraXQgem9vbQorICogICAgICAgbGV2ZWwsIGV3a192aWV3X3pvb21fYW5p
bWF0ZWRfbWFya19lbmQoKSBhbmQKKyAqICAgICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFy
a19jdXJyZW50KCkgdG8gZ2l2ZW4gem9vbSBsZXZlbC4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9i
amVjdCB0byBzZXQgd2VhayB6b29tIGxldmVsLgorICogQHBhcmFtIHpvb20gbGV2ZWwgdG8gc2Nh
bGUgYmFja2luZyBzdG9yZS4KKyAqIEBwYXJhbSBjeCBob3Jpem9udGFsIGNlbnRlciBvZmZzZXQs
IHJlbGF0aXZlIHRvIG9iamVjdCAody8yIGlzIG1pZGRsZSkuCisgKiBAcGFyYW0gY3kgdmVydGlj
YWwgY2VudGVyIG9mZnNldCwgcmVsYXRpdmUgdG8gb2JqZWN0IChoLzIgaXMgbWlkZGxlKS4KKyAq
CisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVy
d2lzZS4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fd2Vha19zZXQoRXZhc19PYmplY3Qq
IG8sIGZsb2F0IHpvb20sIEV2YXNfQ29vcmQgY3gsIEV2YXNfQ29vcmQgY3kpCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZF
VFlfT05fTlVMTF9SRVRVUk5fVkFMKHNkLT5hcGksIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FG
RVRZX09OX05VTExfUkVUVVJOX1ZBTChzZC0+YXBpLT56b29tX3dlYWtfc2V0LCBFSU5BX0ZBTFNF
KTsKKyAgICBpZiAoem9vbSA8IFpPT01fTUlOKSB7CisgICAgICAgIFdSTigiem9vbSBsZXZlbCBp
cyA8ICVmIDogJWYiLCAoZG91YmxlKVpPT01fTUlOLCAoZG91YmxlKXpvb20pOworICAgICAgICBy
ZXR1cm4gRUlOQV9GQUxTRTsKKyAgICB9CisgICAgaWYgKHpvb20gPiBaT09NX01BWCkgeworICAg
ICAgICBXUk4oInpvb20gbGV2ZWwgaXMgPiAlZiA6ICVmIiwgKGRvdWJsZSlaT09NX01BWCwgKGRv
dWJsZSl6b29tKTsKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisgICAgfQorCisgICAgaWYg
KGN4ID49IHNkLT52aWV3LncpCisgICAgICAgIGN4ID0gc2QtPnZpZXcudyAtIDE7CisgICAgaWYg
KGN5ID49IHNkLT52aWV3LmgpCisgICAgICAgIGN5ID0gc2QtPnZpZXcuaCAtIDE7CisgICAgaWYg
KGN4IDwgMCkKKyAgICAgICAgY3ggPSAwOworICAgIGlmIChjeSA8IDApCisgICAgICAgIGN5ID0g
MDsKKworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uc3RhcnQgPSBld2tfZnJhbWVfem9vbV9n
ZXQoc2QtPm1haW5fZnJhbWUpOworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20uZW5kID0gem9v
bTsKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29tLmN1cnJlbnQgPSB6b29tOworICAgIHJldHVy
biBzZC0+YXBpLT56b29tX3dlYWtfc2V0KHNkLCB6b29tLCBjeCwgY3kpOworfQorCisvKioKKyAq
IE1hcmsgaW50ZXJuYWwgem9vbSBhbmltYXRpb24gc3RhdGUgdG8gZ2l2ZW4gem9vbS4KKyAqCisg
KiBUaGlzIGRvZXMgbm90IG1vZGlmeSBhbnkgYWN0dWFsIHpvb20gaW4gV2ViS2l0IG9yIGJhY2tp
bmcgc3RvcmUsCisgKiBqdXN0IHNldCB0aGUgRXdrX1ZpZXdfU21hcnRfRGF0YS0+YW5pbWF0ZWRf
em9vbS56b29tLnN0YXJ0IHNvCisgKiBzdWItY2xhc3NlcyB3aWxsIGtub3cgdGhleSBzaG91bGQg
bm90IHJlc2V0IHRoZWlyIGludGVybmFsIHN0YXRlLgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2Jq
ZWN0IHRvIGNoYW5nZSB2YWx1ZS4KKyAqIEBwYXJhbSB6b29tIG5ldyBzdGFydCB2YWx1ZS4KKyAq
CisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzLCBAYyBFSU5BX0ZBTFNFIG90aGVy
d2lzZS4KKyAqCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfc2V0KCkKKyAqIEBzZWUg
ZXdrX3ZpZXdfem9vbV93ZWFrX3NldCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRf
bWFya19zdG9wKCkKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2VuZCgpCisg
KiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19jdXJyZW50KCkKKyAqLworRWluYV9C
b29sIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdGFydChFdmFzX09iamVjdCogbywgZmxv
YXQgem9vbSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZB
TFNFKTsKKyAgICBzZC0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0gem9vbTsKKyAgICByZXR1
cm4gRUlOQV9UUlVFOworfQorCisvKioKKyAqIE1hcmsgaW50ZXJuYWwgem9vbSBhbmltYXRpb24g
c3RhdGUgdG8gZ2l2ZW4gem9vbS4KKyAqCisgKiBUaGlzIGRvZXMgbm90IG1vZGlmeSBhbnkgYWN0
dWFsIHpvb20gaW4gV2ViS2l0IG9yIGJhY2tpbmcgc3RvcmUsCisgKiBqdXN0IHNldCB0aGUgRXdr
X1ZpZXdfU21hcnRfRGF0YS0+YW5pbWF0ZWRfem9vbS56b29tLmVuZCBzbworICogc3ViLWNsYXNz
ZXMgd2lsbCBrbm93IHRoZXkgc2hvdWxkIG5vdCByZXNldCB0aGVpciBpbnRlcm5hbCBzdGF0ZS4K
KyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVjdCB0byBjaGFuZ2UgdmFsdWUuCisgKiBAcGFyYW0g
em9vbSBuZXcgZW5kIHZhbHVlLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nl
c3MsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfem9vbV9h
bmltYXRlZF9zZXQoKQorICogQHNlZSBld2tfdmlld196b29tX3dlYWtfc2V0KCkKKyAqIEBzZWUg
ZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3AoKQorICogQHNlZSBld2tfdmlld196b29t
X2FuaW1hdGVkX21hcmtfc3RhcnQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21h
cmtfY3VycmVudCgpCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtf
ZW5kKEV2YXNfT2JqZWN0KiBvLCBmbG9hdCB6b29tKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9P
Ul9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIHNkLT5hbmltYXRlZF96b29tLnpvb20u
ZW5kID0gem9vbTsKKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCisvKioKKyAqIE1hcmsgaW50
ZXJuYWwgem9vbSBhbmltYXRpb24gc3RhdGUgdG8gZ2l2ZW4gem9vbS4KKyAqCisgKiBUaGlzIGRv
ZXMgbm90IG1vZGlmeSBhbnkgYWN0dWFsIHpvb20gaW4gV2ViS2l0IG9yIGJhY2tpbmcgc3RvcmUs
CisgKiBqdXN0IHNldCB0aGUgRXdrX1ZpZXdfU21hcnRfRGF0YS0+YW5pbWF0ZWRfem9vbS56b29t
LmN1cnJlbnQgc28KKyAqIHN1Yi1jbGFzc2VzIHdpbGwga25vdyB0aGV5IHNob3VsZCBub3QgcmVz
ZXQgdGhlaXIgaW50ZXJuYWwgc3RhdGUuCisgKgorICogQHBhcmFtIG8gdmlldyBvYmplY3QgdG8g
Y2hhbmdlIHZhbHVlLgorICogQHBhcmFtIHpvb20gbmV3IGN1cnJlbnQgdmFsdWUuCisgKgorICog
QHJldHVybiBAYyBFSU5BX1RSVUUgb24gc3VjY2VzcywgQGMgRUlOQV9GQUxTRSBvdGhlcndpc2Uu
CisgKgorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX3NldCgpCisgKiBAc2VlIGV3a192
aWV3X3pvb21fd2Vha19zZXQoKQorICogQHNlZSBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtf
c3RvcCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdGFydCgpCisgKiBA
c2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19lbmQoKQorICovCitFaW5hX0Jvb2wgZXdr
X3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2N1cnJlbnQoRXZhc19PYmplY3QqIG8sIGZsb2F0IHpv
b20pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7
CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5jdXJyZW50ID0gem9vbTsKKyAgICByZXR1cm4g
RUlOQV9UUlVFOworfQorCisvKioKKyAqIFVubWFyayBpbnRlcm5hbCB6b29tIGFuaW1hdGlvbiBz
dGF0ZS4KKyAqCisgKiBUaGlzIHplcm8gYWxsIHN0YXJ0LCBlbmQgYW5kIGN1cnJlbnQgdmFsdWVz
LgorICoKKyAqIEBwYXJhbSBvIHZpZXcgb2JqZWN0IHRvIG1hcmsgYXMgYW5pbWF0ZWQgaXMgc3Rv
cHBlZC4KKyAqCisgKiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdGFydCgpCisg
KiBAc2VlIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19lbmQoKQorICogQHNlZSBld2tfdmll
d196b29tX2FuaW1hdGVkX21hcmtfY3VycmVudCgpCisgKiBAc2VlIGV3a192aWV3X3pvb21fd2Vh
a19zZXQoKQorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3Ao
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgX2V3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKHNkKTsK
KyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCisvKioKKyAqIFNldCB0aGUgY3VycmVudCB6b29t
IGxldmVsIHdoaWxlIGFuaW1hdGluZy4KKyAqCisgKiBJZiB0aGUgdmlldyB3YXMgYWxyZWFkeSBh
bmltYXRpbmcgdG8gYW5vdGhlciB6b29tLCBpdCB3aWxsIHN0YXJ0CisgKiBmcm9tIGN1cnJlbnQg
cG9pbnQgdG8gdGhlIG5leHQgcHJvdmlkZWQgem9vbSAoQGEgem9vbSBwYXJhbWV0ZXIpCisgKiBh
bmQgZHVyYXRpb24gKEBhIGR1cmF0aW9uIHBhcmFtZXRlcikuCisgKgorICogVGhpcyBpcyB0aGUg
cmVjb21tZW5kZWQgd2F5IHRvIGRvIHRyYW5zaXRpb25zIGZyb20gb25lIGxldmVsIHRvCisgKiBh
bm90aGVyLiBIb3dldmVyLCBvbmUgbWF5IHdpc2ggdG8gZG8gdGhvc2UgZnJvbSBvdXRzaWRlLCBp
biB0aGF0CisgKiBjYXNlIHVzZSBld2tfdmlld196b29tX3dlYWtfc2V0KCkgYW5kIGxhdGVyIGNv
bnRyb2wgaW50ZXJtZWRpYXRlCisgKiBzdGF0ZXMgd2l0aCBld2tfdmlld196b29tX2FuaW1hdGVk
X21hcmtfY3VycmVudCgpLAorICogZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX2VuZCgpIGFu
ZAorICogZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9tYXJrX3N0b3AoKS4KKyAqCisgKiBAcGFyYW0g
byB2aWV3IG9iamVjdCB0byBhbmltYXRlLgorICogQHBhcmFtIHpvb20gZmluYWwgem9vbSBsZXZl
bCB0byB1c2UuCisgKiBAcGFyYW0gZHVyYXRpb24gdGltZSBpbiBzZWNvbmRzIHRoZSBhbmltYXRp
b24gc2hvdWxkIHRha2UuCisgKiBAcGFyYW0gY3ggb2Zmc2V0IGluc2lkZSBvYmplY3QgdGhhdCBk
ZWZpbmVzIHpvb20gY2VudGVyLiAwIGlzIGxlZnQgc2lkZS4KKyAqIEBwYXJhbSBjeSBvZmZzZXQg
aW5zaWRlIG9iamVjdCB0aGF0IGRlZmluZXMgem9vbSBjZW50ZXIuIDAgaXMgdG9wIHNpZGUuCisg
KiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBhbmltYXRpb24gd2lsbCBiZSBzdGFydGVkLCBAYyBF
SU5BX0ZBTFNFIGlmIG5vdAorICogICAgICAgICAgICBiZWNhdXNlIHpvb20gaXMgdG9vIHNtYWxs
L2JpZy4KKyAqLworRWluYV9Cb29sIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfc2V0KEV2YXNfT2Jq
ZWN0KiBvLCBmbG9hdCB6b29tLCBmbG9hdCBkdXJhdGlvbiwgRXZhc19Db29yZCBjeCwgRXZhc19D
b29yZCBjeSkKK3sKKyAgICBkb3VibGUgbm93OworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRV
Uk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihz
ZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFM
KHNkLT5hcGksIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZB
TChzZC0+YXBpLT56b29tX3dlYWtfc2V0LCBFSU5BX0ZBTFNFKTsKKworICAgIGlmICh6b29tIDwg
Wk9PTV9NSU4pIHsKKyAgICAgICAgV1JOKCJ6b29tIGxldmVsIGlzIDwgJWYgOiAlZiIsIChkb3Vi
bGUpWk9PTV9NSU4sIChkb3VibGUpem9vbSk7CisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOwor
ICAgIH0KKyAgICBpZiAoem9vbSA+IFpPT01fTUFYKSB7CisgICAgICAgIFdSTigiem9vbSBsZXZl
bCBpcyA+ICVmIDogJWYiLCAoZG91YmxlKVpPT01fTUFYLCAoZG91YmxlKXpvb20pOworICAgICAg
ICByZXR1cm4gRUlOQV9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAocHJpdi0+YW5pbWF0ZWRfem9v
bS5hbmltYXRvcikKKyAgICAgICAgcHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0gX2V3
a192aWV3X3pvb21fYW5pbWF0ZWRfY3VycmVudChwcml2KTsKKyAgICBlbHNlIHsKKyAgICAgICAg
cHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0ID0gZXdrX2ZyYW1lX3pvb21fZ2V0KHNkLT5t
YWluX2ZyYW1lKTsKKyAgICAgICAgX2V3a192aWV3X3pvb21fYW5pbWF0aW9uX3N0YXJ0KHNkKTsK
KyAgICB9CisKKyAgICBpZiAoY3ggPCAwKQorICAgICAgICBjeCA9IDA7CisgICAgaWYgKGN5IDwg
MCkKKyAgICAgICAgY3kgPSAwOworCisgICAgbm93ID0gZWNvcmVfbG9vcF90aW1lX2dldCgpOwor
ICAgIHByaXYtPmFuaW1hdGVkX3pvb20udGltZS5zdGFydCA9IG5vdzsKKyAgICBwcml2LT5hbmlt
YXRlZF96b29tLnRpbWUuZW5kID0gbm93ICsgZHVyYXRpb247CisgICAgcHJpdi0+YW5pbWF0ZWRf
em9vbS50aW1lLmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgcHJpdi0+YW5pbWF0ZWRfem9vbS56
b29tLmVuZCA9IHpvb207CisgICAgcHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnJhbmdlID0gKHBy
aXYtPmFuaW1hdGVkX3pvb20uem9vbS5lbmQgLSBwcml2LT5hbmltYXRlZF96b29tLnpvb20uc3Rh
cnQpOworICAgIHByaXYtPmFuaW1hdGVkX3pvb20uY2VudGVyLnggPSBjeDsKKyAgICBwcml2LT5h
bmltYXRlZF96b29tLmNlbnRlci55ID0gY3k7CisgICAgc2QtPmFuaW1hdGVkX3pvb20uem9vbS5j
dXJyZW50ID0gcHJpdi0+YW5pbWF0ZWRfem9vbS56b29tLnN0YXJ0OworICAgIHNkLT5hbmltYXRl
ZF96b29tLnpvb20uc3RhcnQgPSBwcml2LT5hbmltYXRlZF96b29tLnpvb20uc3RhcnQ7CisgICAg
c2QtPmFuaW1hdGVkX3pvb20uem9vbS5lbmQgPSBwcml2LT5hbmltYXRlZF96b29tLnpvb20uZW5k
OworCisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBRdWVyeSBpZiB6b29tIGxl
dmVsIGp1c3QgYXBwbGllcyB0byB0ZXh0IGFuZCBub3Qgb3RoZXIgZWxlbWVudHMuCisgKgorICog
QHBhcmFtIG8gdmlldyB0byBxdWVyeSBzZXR0aW5nLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9U
UlVFIGlmIGp1c3QgdGV4dCBhcmUgc2NhbGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZS4KKyAq
LworRWluYV9Cb29sIGV3a192aWV3X3pvb21fdGV4dF9vbmx5X2dldChjb25zdCBFdmFzX09iamVj
dCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNF
KTsKKyAgICByZXR1cm4gZXdrX2ZyYW1lX3pvb21fdGV4dF9vbmx5X2dldChzZC0+bWFpbl9mcmFt
ZSk7Cit9CisKKy8qKgorICogU2V0IGlmIHpvb20gbGV2ZWwganVzdCBhcHBsaWVzIHRvIHRleHQg
YW5kIG5vdCBvdGhlciBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IHRvIGNoYW5nZSBz
ZXR0aW5nLgorICogQHBhcmFtIHNldHRpbmcgQGMgRUlOQV9UUlVFIGlmIHpvb20gc2hvdWxkIGp1
c3QgYmUgYXBwbGllZCB0byB0ZXh0LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1
Y2Nlc3MsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
em9vbV90ZXh0X29ubHlfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgc2V0dGluZykKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBy
ZXR1cm4gZXdrX2ZyYW1lX3pvb21fdGV4dF9vbmx5X3NldChzZC0+bWFpbl9mcmFtZSwgc2V0dGlu
Zyk7Cit9CisKKy8qKgorICogSGludCBlbmdpbmUgdG8gcHJlLXJlbmRlciByZWdpb24uCisgKgor
ICogRW5naW5lcyBhbmQgYmFja2luZyBzdG9yZSBtaWdodCBiZSBhYmxlIHRvIHByZS1yZW5kZXIg
cmVnaW9ucyBpbgorICogb3JkZXIgdG8gc3BlZWQgdXAgem9vbWluZyBvciBzY3JvbGxpbmcgdG8g
dGhhdCByZWdpb24uIE5vdCBhbGwKKyAqIGVuZ2luZXMgbWlnaHQgaW1wbGVtZW50IHRoYXQgYW5k
IHRoZXkgd2lsbCByZXR1cm4gQGMgRUlOQV9GQUxTRQorICogaW4gdGhhdCBjYXNlLgorICoKKyAq
IFRoZSBnaXZlbiByZWdpb24gaXMgYSBoaW50LiBFbmdpbmVzIG1pZ2h0IGRvIGJpZ2dlciBvciBz
bWFsbGVyIGFyZWEKKyAqIHRoYXQgY292ZXJzIHRoYXQgcmVnaW9uLiBQcmUtcmVuZGVyIG1pZ2h0
IG5vdCBiZSBpbW1lZGlhdGUsIGl0IG1heQorICogYmUgcG9zdHBvbmVkIHRvIGEgdGhyZWFkLCBv
cGVyYXRlZCBjb29wZXJhdGl2ZWx5IGluIHRoZSBtYWluIGxvb3AKKyAqIGFuZCBtYXkgYmUgZXZl
biBpZ25vcmVkIG9yIGNhbmNlbGxlZCBhZnRlcndhcmRzLgorICoKKyAqIE11bHRpcGxlIHJlcXVl
c3RzIG1pZ2h0IGJlIHF1ZXVlZCBieSBlbmdpbmVzLiBPbmUgY2FuIGNsZWFyL2ZvcmdldAorICog
YWJvdXQgdGhlbSB3aXRoIGV3a192aWV3X3ByZV9yZW5kZXJfY2FuY2VsKCkuCisgKgorICogQHBh
cmFtIG8gdmlldyB0byBhc2sgcHJlLXJlbmRlciBvZiBnaXZlbiByZWdpb24uCisgKiBAcGFyYW0g
eCBhYnNvbHV0ZSBjb29yZGluYXRlICgwPWxlZnQpIHRvIHByZS1yZW5kZXIgYXQgem9vbS4KKyAq
IEBwYXJhbSB5IGFic29sdXRlIGNvb3JkaW5hdGUgKDA9dG9wKSB0byBwcmUtcmVuZGVyIGF0IHpv
b20uCisgKiBAcGFyYW0gdyB3aWR0aCB0byBwcmUtcmVuZGVyIHN0YXJ0aW5nIGZyb20gQGEgeCBh
dCB6b29tLgorICogQHBhcmFtIGggaGVpZ2h0IHRvIHByZS1yZW5kZXIgc3RhcnRpbmcgZnJvbSBA
YSB5IGF0IHpvb20uCisgKiBAcGFyYW0gem9vbSBkZXNpcmVkIHpvb20uCisgKgorICogQHJldHVy
biBAYyBFSU5BX1RSVUUgaWYgcmVxdWVzdCB3YXMgYWNjZXB0ZWQsIEBjIEVJTkFfRkFMU0UKKyAq
ICAgICAgICAgb3RoZXJ3aXNlIChlcnJvcnMsIHByZS1yZW5kZXIgbm90IHN1cHBvcnRlZCwgZXRj
KS4KKyAqCisgKiBAc2VlIGV3a192aWV3X3ByZV9yZW5kZXJfY2FuY2VsKCkKKyAqLworRWluYV9C
b29sIGV3a192aWV3X3ByZV9yZW5kZXJfcmVnaW9uKEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3Jk
IHgsIEV2YXNfQ29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFzX0Nvb3JkIGgsIGZsb2F0IHpvb20p
Cit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7Cisg
ICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHNkLT5hcGktPnByZV9yZW5kZXJfcmVn
aW9uLCBFSU5BX0ZBTFNFKTsKKyAgICBmbG9hdCBjdXJfem9vbSA9IGV3a19mcmFtZV96b29tX2dl
dChzZC0+bWFpbl9mcmFtZSk7CisgICAgRXZhc19Db29yZCBjdywgY2g7CisKKyAgICBpZiAoY3Vy
X3pvb20gPCAwLjAwMDAxKQorICAgICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKyAgICBpZiAoIWV3
a19mcmFtZV9jb250ZW50c19zaXplX2dldChzZC0+bWFpbl9mcmFtZSwgJmN3LCAmY2gpKQorICAg
ICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKworICAgIGN3ICo9IHpvb20gLyBjdXJfem9vbTsKKyAg
ICBjaCAqPSB6b29tIC8gY3VyX3pvb207CisgICAgREJHKCJyZWdpb24gJWQsJWQrJWR4JWQgQCAl
ZiBjb250ZW50cz0lZHglZCIsIHgsIHksIHcsIGgsIHpvb20sIGN3LCBjaCk7CisKKyAgICBpZiAo
eCArIHcgPiBjdykKKyAgICAgICAgdyA9IGN3IC0geDsKKworICAgIGlmICh5ICsgaCA+IGNoKQor
ICAgICAgICBoID0gY2ggLSB5OworCisgICAgaWYgKHggPCAwKSB7CisgICAgICAgIHcgKz0geDsK
KyAgICAgICAgeCA9IDA7CisgICAgfQorICAgIGlmICh5IDwgMCkgeworICAgICAgICBoICs9IHk7
CisgICAgICAgIHkgPSAwOworICAgIH0KKworICAgIHJldHVybiBzZC0+YXBpLT5wcmVfcmVuZGVy
X3JlZ2lvbihzZCwgeCwgeSwgdywgaCwgem9vbSk7Cit9CisKKy8qKgorICogQ2FuY2VsIChjbGVh
cikgcHJldmlvdXMgcHJlLXJlbmRlciByZXF1ZXN0cy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IHRv
IGNsZWFyIHByZS1yZW5kZXIgcmVxdWVzdHMuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfcHJlX3JlbmRl
cl9jYW5jZWwoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oc2QtPmFwaS0+cHJlX3Jl
bmRlcl9jYW5jZWwpOworICAgIHNkLT5hcGktPnByZV9yZW5kZXJfY2FuY2VsKHNkKTsKK30KKwor
Y29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ191c2VyX2FnZW50X2dldChjb25zdCBFdmFzX09i
amVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAg
ICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBw
cml2LT5zZXR0aW5ncy51c2VyX2FnZW50OworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGlu
Z191c2VyX2FnZW50X3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogdXNlcl9hZ2VudCkK
K3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAg
ICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAg
IGlmIChlaW5hX3N0cmluZ3NoYXJlX3JlcGxhY2UoJnByaXYtPnNldHRpbmdzLnVzZXJfYWdlbnQs
IHVzZXJfYWdlbnQpKSB7CisgICAgICAgIFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50RWZsKiBj
bGllbnQgPSBzdGF0aWNfY2FzdDxXZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudEVmbCo+KHByaXYt
Pm1haW5fZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgICAgIGNsaWVudC0+c2V0Q3Vz
dG9tVXNlckFnZW50KFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgodXNlcl9hZ2VudCkpOworICAg
IH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0
aW5nX3VzZXJfc3R5bGVzaGVldF9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRf
T1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MudXNlcl9z
dHlsZXNoZWV0OworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ191c2VyX3N0eWxlc2hl
ZXRfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiB1cmkpCit7CisgICAgRVdLX1ZJRVdf
U0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9H
RVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdz
aGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy51c2VyX3N0eWxlc2hlZXQsIHVyaSkpIHsKKyAg
ICAgICAgV2ViQ29yZTo6S1VSTCBrdXJsKFdlYkNvcmU6OktVUkwoKSwgV2ViQ29yZTo6U3RyaW5n
Ojpmcm9tVVRGOCh1cmkpKTsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0VXNlclN0
eWxlU2hlZXRMb2NhdGlvbihrdXJsKTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30K
KworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfYXV0b19sb2FkX2ltYWdlc19nZXQoY29uc3Qg
RXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBF
SU5BX0ZBTFNFKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuYXV0b19sb2FkX2ltYWdlczsK
K30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfYXV0b19sb2FkX2ltYWdlc19zZXQoRXZh
c19PYmplY3QqIG8sIEVpbmFfQm9vbCBhdXRvbWF0aWMpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VU
X09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBhdXRvbWF0aWMgPSAhIWF1dG9tYXRp
YzsKKyAgICBpZiAocHJpdi0+c2V0dGluZ3MuYXV0b19sb2FkX2ltYWdlcyAhPSBhdXRvbWF0aWMp
IHsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0TG9hZHNJbWFnZXNBdXRvbWF0aWNh
bGx5KGF1dG9tYXRpYyk7CisgICAgICAgIHByaXYtPnNldHRpbmdzLmF1dG9fbG9hZF9pbWFnZXMg
PSBhdXRvbWF0aWM7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK0VpbmFfQm9v
bCBld2tfdmlld19zZXR0aW5nX2F1dG9fc2hyaW5rX2ltYWdlc19nZXQoY29uc3QgRXZhc19PYmpl
Y3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxT
RSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNF
KTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuYXV0b19zaHJpbmtfaW1hZ2VzOworfQorCitF
aW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19hdXRvX3Nocmlua19pbWFnZXNfc2V0KEV2YXNfT2Jq
ZWN0KiBvLCBFaW5hX0Jvb2wgYXV0b21hdGljKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9S
RVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVS
TihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgYXV0b21hdGljID0gISFhdXRvbWF0aWM7Cisg
ICAgaWYgKHByaXYtPnNldHRpbmdzLmF1dG9fc2hyaW5rX2ltYWdlcyAhPSBhdXRvbWF0aWMpIHsK
KyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0U2hyaW5rc1N0YW5kYWxvbmVJbWFnZXNU
b0ZpdChhdXRvbWF0aWMpOworICAgICAgICBwcml2LT5zZXR0aW5ncy5hdXRvX3Nocmlua19pbWFn
ZXMgPSBhdXRvbWF0aWM7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK0VpbmFf
Qm9vbCBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9zY3JpcHRzX2dldChjb25zdCBFdmFzX09iamVj
dCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNF
KTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0Up
OworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5lbmFibGVfc2NyaXB0czsKK30KKworRWluYV9C
b29sIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3NjcmlwdHNfc2V0KEV2YXNfT2JqZWN0KiBvLCBF
aW5hX0Jvb2wgZW5hYmxlKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgZW5hYmxlID0gISFlbmFibGU7CisgICAgaWYgKHByaXYtPnNldHRp
bmdzLmVuYWJsZV9zY3JpcHRzICE9IGVuYWJsZSkgeworICAgICAgICBwcml2LT5wYWdlX3NldHRp
bmdzLT5zZXRKYXZhU2NyaXB0RW5hYmxlZChlbmFibGUpOworICAgICAgICBwcml2LT5zZXR0aW5n
cy5lbmFibGVfc2NyaXB0cyA9IGVuYWJsZTsKKyAgICB9CisgICAgcmV0dXJuIEVJTkFfVFJVRTsK
K30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZW5hYmxlX3BsdWdpbnNfZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2Qs
IEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwg
RUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmVuYWJsZV9wbHVnaW5zOwor
fQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfcGx1Z2luc19zZXQoRXZhc19P
YmplY3QqIG8sIEVpbmFfQm9vbCBlbmFibGUpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJO
KHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBlbmFibGUgPSAhIWVuYWJsZTsKKyAgICBpZiAo
cHJpdi0+c2V0dGluZ3MuZW5hYmxlX3BsdWdpbnMgIT0gZW5hYmxlKSB7CisgICAgICAgIHByaXYt
PnBhZ2Vfc2V0dGluZ3MtPnNldFBsdWdpbnNFbmFibGVkKGVuYWJsZSk7CisgICAgICAgIHByaXYt
PnNldHRpbmdzLmVuYWJsZV9wbHVnaW5zID0gZW5hYmxlOworICAgIH0KKyAgICByZXR1cm4gRUlO
QV9UUlVFOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRzX3dpbmRvd19v
cGVuX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRV
Uk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5zY3Jp
cHRzX3dpbmRvd19vcGVuOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19zY3JpcHRz
X3dpbmRvd19vcGVuX3NldChFdmFzX09iamVjdCogbywgRWluYV9Cb29sIGFsbG93KQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgYWxsb3cg
PSAhIWFsbG93OworICAgIGlmIChwcml2LT5zZXR0aW5ncy5zY3JpcHRzX3dpbmRvd19vcGVuICE9
IGFsbG93KSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEphdmFTY3JpcHRDYW5P
cGVuV2luZG93c0F1dG9tYXRpY2FsbHkoYWxsb3cpOworICAgICAgICBwcml2LT5zZXR0aW5ncy5z
Y3JpcHRzX3dpbmRvd19vcGVuID0gYWxsb3c7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7
Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX3Jlc2l6YWJsZV90ZXh0YXJlYXNfZ2V0
KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwg
cHJpdiwgRUlOQV9GQUxTRSk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLnJlc2l6YWJsZV90
ZXh0YXJlYXM7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX3Jlc2l6YWJsZV90ZXh0
YXJlYXNfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgZW5hYmxlKQoreworICAgIEVXS19W
SUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BS
SVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgZW5hYmxlID0gISFl
bmFibGU7CisgICAgaWYgKHByaXYtPnNldHRpbmdzLnJlc2l6YWJsZV90ZXh0YXJlYXMgIT0gZW5h
YmxlKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldFRleHRBcmVhc0FyZVJlc2l6
YWJsZShlbmFibGUpOworICAgICAgICBwcml2LT5zZXR0aW5ncy5yZXNpemFibGVfdGV4dGFyZWFz
ID0gZW5hYmxlOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitFaW5hX0Jvb2wg
ZXdrX3ZpZXdfc2V0dGluZ19wcml2YXRlX2Jyb3dzaW5nX2dldChjb25zdCBFdmFzX09iamVjdCog
bykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsK
KyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOwor
ICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5wcml2YXRlX2Jyb3dzaW5nOworfQorCitFaW5hX0Jv
b2wgZXdrX3ZpZXdfc2V0dGluZ19wcml2YXRlX2Jyb3dzaW5nX3NldChFdmFzX09iamVjdCogbywg
RWluYV9Cb29sIGVuYWJsZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNk
LCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYs
IEVJTkFfRkFMU0UpOworICAgIGVuYWJsZSA9ICEhZW5hYmxlOworICAgIGlmIChwcml2LT5zZXR0
aW5ncy5wcml2YXRlX2Jyb3dzaW5nICE9IGVuYWJsZSkgeworICAgICAgICBwcml2LT5wYWdlX3Nl
dHRpbmdzLT5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGVuYWJsZSk7CisgICAgICAgIHByaXYt
PnNldHRpbmdzLnByaXZhdGVfYnJvd3NpbmcgPSBlbmFibGU7CisgICAgfQorICAgIHJldHVybiBF
SU5BX1RSVUU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2NhcmV0X2Jyb3dzaW5n
X2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVU
VVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4o
c2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5jYXJldF9i
cm93c2luZzsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfY2FyZXRfYnJvd3Npbmdf
c2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgZW5hYmxlKQoreworICAgIEVXS19WSUVXX1NE
X0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VU
X09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgZW5hYmxlID0gISFlbmFibGU7
CisgICAgaWYgKHByaXYtPnNldHRpbmdzLmNhcmV0X2Jyb3dzaW5nICE9IGVuYWJsZSkgeworICAg
ICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRDYXJldEJyb3dzaW5nRW5hYmxlZChlbmFibGUp
OworICAgICAgICBwcml2LT5zZXR0aW5ncy5jYXJldF9icm93c2luZyA9IGVuYWJsZTsKKyAgICB9
CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworLyoqCisgKiBHZXQgY3VycmVudCBlbmNvZGlu
ZyBvZiB0aGlzIFZpZXcuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqCisgKiBAcmV0dXJuIEEg
cG9pbnRlciB0byBhbiBlaW5hX3N0cmluc2hhcmUgY29udGFpbmluZyB0aGUgY3VycmVudCBjdXN0
b20KKyAqIGVuY29kaW5nIGZvciBWaWV3IG9iamVjdCBAcGFyYW0gbywgb3IgQGMgMCBpZiBpdCdz
IG5vdCBzZXQuCisgKi8KK2NvbnN0IGNoYXIqIGV3a192aWV3X3NldHRpbmdfZW5jb2RpbmdfY3Vz
dG9tX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIDApOworICAgIEV2YXNfT2JqZWN0KiBtYWluX2ZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfbWFp
bl9nZXQobyk7CisgICAgV2ViQ29yZTo6RnJhbWUqIGNvcmVfZnJhbWUgPSBld2tfZnJhbWVfY29y
ZV9nZXQobWFpbl9mcmFtZSk7CisKKyAgICBXZWJDb3JlOjpTdHJpbmcgb3ZlcnJpZGVFbmNvZGlu
ZyA9IGNvcmVfZnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT5vdmVycmlkZUVuY29k
aW5nKCk7CisKKyAgICBpZiAob3ZlcnJpZGVFbmNvZGluZy5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgZWluYV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy5l
bmNvZGluZ19jdXN0b20sIG92ZXJyaWRlRW5jb2RpbmcudXRmOCgpLmRhdGEoKSk7CisgICAgcmV0
dXJuIHByaXYtPnNldHRpbmdzLmVuY29kaW5nX2N1c3RvbTsKK30KKworLyoqCisgKiBTZXQgZW5j
b2Rpbmcgb2YgdGhpcyBWaWV3IGFuZCByZWxvYWQgcGFnZS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3
LgorICogQHBhcmFtIGVuY29kaW5nIFRoZSBuZXcgZW5jb2Rpbmcgb3IgQGMgMCB0byByZXN0b3Jl
IHRoZSBkZWZhdWx0IGVuY29kaW5nLgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1
Y2Nlc3MsIEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlLgorICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdf
c2V0dGluZ19lbmNvZGluZ19jdXN0b21fc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyICpl
bmNvZGluZykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZB
TFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFM
U0UpOworICAgIEV2YXNfT2JqZWN0KiBtYWluX2ZyYW1lID0gZXdrX3ZpZXdfZnJhbWVfbWFpbl9n
ZXQobyk7CisgICAgV2ViQ29yZTo6RnJhbWUqIGNvcmVfZnJhbWUgPSBld2tfZnJhbWVfY29yZV9n
ZXQobWFpbl9mcmFtZSk7CitEQkcoIiVzIiwgZW5jb2RpbmcpOworICAgIGVpbmFfc3RyaW5nc2hh
cmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfY3VzdG9tLCBlbmNvZGluZyk7Cisg
ICAgY29yZV9mcmFtZS0+bG9hZGVyKCktPnJlbG9hZFdpdGhPdmVycmlkZUVuY29kaW5nKFdlYkNv
cmU6OlN0cmluZzo6ZnJvbVVURjgoZW5jb2RpbmcpKTsKKworICAgIHJldHVybiBFSU5BX1RSVUU7
Cit9CisKK2NvbnN0IGNoYXIqIGV3a192aWV3X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVsdF9nZXQo
Y29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihv
LCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCAwKTsK
KyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZW5jb2RpbmdfZGVmYXVsdDsKK30KKworRWluYV9C
b29sIGV3a192aWV3X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVsdF9zZXQoRXZhc19PYmplY3QqIG8s
IGNvbnN0IGNoYXIqIGVuY29kaW5nKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwg
cHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJp
di0+c2V0dGluZ3MuZW5jb2RpbmdfZGVmYXVsdCwgZW5jb2RpbmcpKQorICAgICAgICBwcml2LT5w
YWdlX3NldHRpbmdzLT5zZXREZWZhdWx0VGV4dEVuY29kaW5nTmFtZShXZWJDb3JlOjpTdHJpbmc6
OmZyb21VVEY4KGVuY29kaW5nKSk7CisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworaW50IGV3
a192aWV3X3NldHRpbmdfZm9udF9taW5pbXVtX3NpemVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBv
KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNl
dHRpbmdzLmZvbnRfbWluaW11bV9zaXplOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGlu
Z19mb250X21pbmltdW1fc2l6ZV9zZXQoRXZhc19PYmplY3QqIG8sIGludCBzaXplKQoreworICAg
IEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19W
SUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKHBy
aXYtPnNldHRpbmdzLmZvbnRfbWluaW11bV9zaXplICE9IHNpemUpIHsKKyAgICAgICAgcHJpdi0+
cGFnZV9zZXR0aW5ncy0+c2V0TWluaW11bUZvbnRTaXplKHNpemUpOworICAgICAgICBwcml2LT5z
ZXR0aW5ncy5mb250X21pbmltdW1fc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBFSU5B
X1RSVUU7Cit9CisKK2ludCBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9sb2dpY2FsX3Np
emVfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9S
RVRVUk4obywgc2QsIDApOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJp
diwgMCk7CisgICAgcmV0dXJuIHByaXYtPnNldHRpbmdzLmZvbnRfbWluaW11bV9sb2dpY2FsX3Np
emU7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2ZvbnRfbWluaW11bV9sb2dpY2Fs
X3NpemVfc2V0KEV2YXNfT2JqZWN0KiBvLCBpbnQgc2l6ZSkKK3sKKyAgICBFV0tfVklFV19TRF9H
RVRfT1JfUkVUVVJOKG8sIHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9P
Ul9SRVRVUk4oc2QsIHByaXYsIEVJTkFfRkFMU0UpOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5m
b250X21pbmltdW1fbG9naWNhbF9zaXplICE9IHNpemUpIHsKKyAgICAgICAgcHJpdi0+cGFnZV9z
ZXR0aW5ncy0+c2V0TWluaW11bUxvZ2ljYWxGb250U2l6ZShzaXplKTsKKyAgICAgICAgcHJpdi0+
c2V0dGluZ3MuZm9udF9taW5pbXVtX2xvZ2ljYWxfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJl
dHVybiBFSU5BX1RSVUU7Cit9CisKK2ludCBld2tfdmlld19zZXR0aW5nX2ZvbnRfZGVmYXVsdF9z
aXplX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X2RlZmF1bHRfc2l6ZTsKK30K
KworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9kZWZhdWx0X3NpemVfc2V0KEV2YXNf
T2JqZWN0KiBvLCBpbnQgc2l6ZSkKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8s
IHNkLCBFSU5BX0ZBTFNFKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIEVJTkFfRkFMU0UpOworICAgIGlmIChwcml2LT5zZXR0aW5ncy5mb250X2RlZmF1bHRfc2l6
ZSAhPSBzaXplKSB7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldERlZmF1bHRGb250
U2l6ZShzaXplKTsKKyAgICAgICAgcHJpdi0+c2V0dGluZ3MuZm9udF9kZWZhdWx0X3NpemUgPSBz
aXplOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitpbnQgZXdrX3ZpZXdfc2V0
dGluZ19mb250X21vbm9zcGFjZV9zaXplX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAg
ICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklW
X0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5m
b250X21vbm9zcGFjZV9zaXplOworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250
X21vbm9zcGFjZV9zaXplX3NldChFdmFzX09iamVjdCogbywgaW50IHNpemUpCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdf
UFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAocHJpdi0+
c2V0dGluZ3MuZm9udF9tb25vc3BhY2Vfc2l6ZSAhPSBzaXplKSB7CisgICAgICAgIHByaXYtPnBh
Z2Vfc2V0dGluZ3MtPnNldERlZmF1bHRGaXhlZEZvbnRTaXplKHNpemUpOworICAgICAgICBwcml2
LT5zZXR0aW5ncy5mb250X21vbm9zcGFjZV9zaXplID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJu
IEVJTkFfVFJVRTsKK30KKworY29uc3QgY2hhciogZXdrX3ZpZXdfc2V0dGluZ19mb250X3N0YW5k
YXJkX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHBy
aXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5ncy5mb250X3N0YW5kYXJkOworfQorCitF
aW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X3N0YW5kYXJkX3NldChFdmFzX09iamVjdCog
bywgY29uc3QgY2hhciogZmFtaWx5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4o
bywgc2QsIEVJTkFfRkFMU0UpOworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwg
cHJpdiwgRUlOQV9GQUxTRSk7CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJp
di0+c2V0dGluZ3MuZm9udF9zdGFuZGFyZCwgZmFtaWx5KSkgeworICAgICAgICBXZWJDb3JlOjpB
dG9taWNTdHJpbmcgcyA9IFdlYkNvcmU6OlN0cmluZzo6ZnJvbVVURjgoZmFtaWx5KTsKKyAgICAg
ICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0U3RhbmRhcmRGb250RmFtaWx5KHMpOworICAgIH0K
KyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19zZXR0aW5n
X2ZvbnRfY3Vyc2l2ZV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdLX1ZJRVdf
U0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVU
VVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9jdXJzaXZl
OworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X2N1cnNpdmVfc2V0KEV2YXNf
T2JqZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVU
VVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFyZV9yZXBs
YWNlKCZwcml2LT5zZXR0aW5ncy5mb250X2N1cnNpdmUsIGZhbWlseSkpIHsKKyAgICAgICAgV2Vi
Q29yZTo6QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZhbWlseSk7
CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEN1cnNpdmVGb250RmFtaWx5KHMpOwor
ICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tfdmlld19z
ZXR0aW5nX2ZvbnRfZmFudGFzeV9nZXQoY29uc3QgRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgMCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRf
T1JfUkVUVVJOKHNkLCBwcml2LCAwKTsKKyAgICByZXR1cm4gcHJpdi0+c2V0dGluZ3MuZm9udF9m
YW50YXN5OworfQorCitFaW5hX0Jvb2wgZXdrX3ZpZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfc2V0
KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAgRVdLX1ZJRVdfU0Rf
R0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRf
T1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWluYV9zdHJpbmdzaGFy
ZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy5mb250X2ZhbnRhc3ksIGZhbWlseSkpIHsKKyAgICAg
ICAgV2ViQ29yZTo6QXRvbWljU3RyaW5nIHMgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KGZh
bWlseSk7CisgICAgICAgIHByaXYtPnBhZ2Vfc2V0dGluZ3MtPnNldEZhbnRhc3lGb250RmFtaWx5
KHMpOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25zdCBjaGFyKiBld2tf
dmlld19zZXR0aW5nX2ZvbnRfbW9ub3NwYWNlX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19Q
UklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5zZXR0aW5n
cy5mb250X21vbm9zcGFjZTsKK30KKworRWluYV9Cb29sIGV3a192aWV3X3NldHRpbmdfZm9udF9t
b25vc3BhY2Vfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAg
RVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJ
RVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWlu
YV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy5mb250X21vbm9zcGFjZSwgZmFt
aWx5KSkgeworICAgICAgICBXZWJDb3JlOjpBdG9taWNTdHJpbmcgcyA9IFdlYkNvcmU6OlN0cmlu
Zzo6ZnJvbVVURjgoZmFtaWx5KTsKKyAgICAgICAgcHJpdi0+cGFnZV9zZXR0aW5ncy0+c2V0Rml4
ZWRGb250RmFtaWx5KHMpOworICAgIH0KKyAgICByZXR1cm4gRUlOQV9UUlVFOworfQorCitjb25z
dCBjaGFyKiBld2tfdmlld19zZXR0aW5nX2ZvbnRfc2VyaWZfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0
KiBvKQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIEVX
S19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgMCk7CisgICAgcmV0dXJuIHByaXYt
PnNldHRpbmdzLmZvbnRfc2VyaWY7Cit9CisKK0VpbmFfQm9vbCBld2tfdmlld19zZXR0aW5nX2Zv
bnRfc2VyaWZfc2V0KEV2YXNfT2JqZWN0KiBvLCBjb25zdCBjaGFyKiBmYW1pbHkpCit7CisgICAg
RVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRVdLX1ZJ
RVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsKKyAgICBpZiAoZWlu
YV9zdHJpbmdzaGFyZV9yZXBsYWNlKCZwcml2LT5zZXR0aW5ncy5mb250X3NlcmlmLCBmYW1pbHkp
KSB7CisgICAgICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzID0gV2ViQ29yZTo6U3RyaW5nOjpm
cm9tVVRGOChmYW1pbHkpOworICAgICAgICBwcml2LT5wYWdlX3NldHRpbmdzLT5zZXRTZXJpZkZv
bnRGYW1pbHkocyk7CisgICAgfQorICAgIHJldHVybiBFSU5BX1RSVUU7Cit9CisKK2NvbnN0IGNo
YXIqIGV3a192aWV3X3NldHRpbmdfZm9udF9zYW5zX3NlcmlmX2dldChjb25zdCBFdmFzX09iamVj
dCogbykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBF
V0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2
LT5zZXR0aW5ncy5mb250X3NhbnNfc2VyaWY7Cit9CisgIAorRWluYV9Cb29sIGV3a192aWV3X3Nl
dHRpbmdfZm9udF9zYW5zX3NlcmlmX3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hhciogZmFt
aWx5KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0Up
OworICAgIEVXS19WSUVXX1BSSVZfR0VUX09SX1JFVFVSTihzZCwgcHJpdiwgRUlOQV9GQUxTRSk7
CisgICAgaWYgKGVpbmFfc3RyaW5nc2hhcmVfcmVwbGFjZSgmcHJpdi0+c2V0dGluZ3MuZm9udF9z
YW5zX3NlcmlmLCBmYW1pbHkpKSB7CisgICAgICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZyBzID0g
V2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChmYW1pbHkpOworICAgICAgICBwcml2LT5wYWdlX3Nl
dHRpbmdzLT5zZXRTYW5zU2VyaWZGb250RmFtaWx5KHMpOworICAgIH0KKyAgICByZXR1cm4gRUlO
QV9UUlVFOworfQorCisvKioKKyAqIFNpbWlsYXIgdG8gZXZhc19vYmplY3Rfc21hcnRfZGF0YV9n
ZXQoKSwgYnV0IGRvZXMgdHlwZSBjaGVja2luZy4KKyAqCisgKiBAcGFyYW0gbyB2aWV3IG9iamVj
dCB0byBxdWVyeSBpbnRlcm5hbCBkYXRhLgorICogQHJldHVybiBpbnRlcm5hbCBkYXRhIG9yIEBj
IDAgb24gZXJyb3JzIChpZTogaW5jb3JyZWN0IHR5cGUgb2YgQGEgbykuCisgKi8KK0V3a19WaWV3
X1NtYXJ0X0RhdGEqIGV3a192aWV3X3NtYXJ0X2RhdGFfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0KiBv
KQoreworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworICAgIHJldHVy
biBzZDsKK30KKworLyoqCisgKiBHZXRzIHRoZSBpbnRlcm5hbCBhcnJheSBvZiByZXBhaW50IHJl
cXVlc3RzLgorICoKKyAqIFRoaXMgYXJyYXkgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBhbnlob3cu
IEl0IHNob3VsZCBiZSBwcm9jZXNzZWQKKyAqIGltbWVkaWF0ZWx5IGFzIGFueSBmdXJ0aGVyIGV3
a192aWV3IGNhbGwgbWlnaHQgY2hhbmdlIGl0LCBsaWtlCisgKiB0aG9zZSB0aGF0IGFkZCByZXBh
aW50cyBvciBmbHVzaCB0aGVtLCBzbyBiZSBzdXJlIHRoYXQgeW91ciBjb2RlCisgKiBkb2VzIG5v
dCBjYWxsIGFueSBvZiB0aG9zZSB3aGlsZSB5b3UgcHJvY2VzcyB0aGUgcmVwYWludHMsCisgKiBv
dGhlcndpc2UgY29weSB0aGUgYXJyYXkuCisgKgorICogQHBhcmFtIHByaXYgcHJpdmF0ZSBoYW5k
bGUgcG9pbnRlciBvZiB0aGUgdmlldyB0byBnZXQgcmVwYWludHMuCisgKiBAcGFyYW0gY291bnQg
d2hlcmUgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgcmV0dXJuZWQgYXJyYXku
CisgKgorICogQHJldHVybiByZWZlcmVuY2UgdG8gYXJyYXkgb2YgcmVxdWVzdGVkIHJlcGFpbnRz
LgorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Ig
c3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2lu
ZyBzdG9yZS4KKyAqLworY29uc3QgRWluYV9SZWN0YW5nbGUqIGV3a192aWV3X3JlcGFpbnRzX2dl
dChjb25zdCBFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYsIHNpemVfdCogY291bnQpCit7Cisg
ICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKGNvdW50LCAwKTsKKyAgICBpZiAoY291
bnQpCisgICAgICAgICpjb3VudCA9IDA7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5f
VkFMKHByaXYsIDApOworICAgIGlmIChjb3VudCkKKyAgICAgICAgKmNvdW50ID0gcHJpdi0+cmVw
YWludHMuY291bnQ7CisgICAgcmV0dXJuIHByaXYtPnJlcGFpbnRzLmFycmF5OworfQorCisvKioK
KyAqIEdldHMgdGhlIGludGVybmFsIGFycmF5IG9mIHNjcm9sbCByZXF1ZXN0cy4KKyAqCisgKiBU
aGlzIGFycmF5IHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYW55aG93LiBJdCBzaG91bGQgYmUgcHJv
Y2Vzc2VkCisgKiBpbW1lZGlhdGVseSBhcyBhbnkgZnVydGhlciBld2tfdmlldyBjYWxsIG1pZ2h0
IGNoYW5nZSBpdCwgbGlrZQorICogdGhvc2UgdGhhdCBhZGQgc2Nyb2xscyBvciBmbHVzaCB0aGVt
LCBzbyBiZSBzdXJlIHRoYXQgeW91ciBjb2RlCisgKiBkb2VzIG5vdCBjYWxsIGFueSBvZiB0aG9z
ZSB3aGlsZSB5b3UgcHJvY2VzcyB0aGUgc2Nyb2xscywKKyAqIG90aGVyd2lzZSBjb3B5IHRoZSBh
cnJheS4KKyAqCisgKiBAcGFyYW0gcHJpdiBwcml2YXRlIGhhbmRsZSBwb2ludGVyIG9mIHRoZSB2
aWV3IHRvIGdldCBzY3JvbGxzLgorICogQHBhcmFtIGNvdW50IHdoZXJlIHRvIHJldHVybiB0aGUg
bnVtYmVyIG9mIGVsZW1lbnRzIG9mIHJldHVybmVkIGFycmF5LgorICoKKyAqIEByZXR1cm4gcmVm
ZXJlbmNlIHRvIGFycmF5IG9mIHJlcXVlc3RlZCBzY3JvbGxzLgorICoKKyAqIEBub3RlIHRoaXMg
aXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQK
KyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLworY29uc3Qg
RXdrX1Njcm9sbF9SZXF1ZXN0KiBld2tfdmlld19zY3JvbGxfcmVxdWVzdHNfZ2V0KGNvbnN0IEV3
a19WaWV3X1ByaXZhdGVfRGF0YSogcHJpdiwgc2l6ZV90KiBjb3VudCkKK3sKKyAgICBFSU5BX1NB
RkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoY291bnQsIDApOworICAgIGlmIChjb3VudCkKKyAgICAg
ICAgKmNvdW50ID0gMDsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwocHJpdiwg
MCk7CisgICAgaWYgKGNvdW50KQorICAgICAgICAqY291bnQgPSBwcml2LT5zY3JvbGxzLmNvdW50
OworICAgIHJldHVybiBwcml2LT5zY3JvbGxzLmFycmF5OworfQorCisvKioKKyAqIEFkZCBhIG5l
dyByZXBhaW50IHJlcXVlc3QgdG8gcXVldWUuCisgKgorICogVGhlIHJlcGFpbnRzIGFyZSBhc3N1
bWVkIHRvIGJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgdmlld3BvcnQuCisgKgorICogQHBhcmFtIHBy
aXYgcHJpdmF0ZSBoYW5kbGUgcG9pbnRlciBvZiB0aGUgdmlldyB0byBhZGQgcmVwYWludCByZXF1
ZXN0LgorICogQHBhcmFtIHggaG9yaXpvbnRhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byBjdXJyZW50
IHZpZXcgcG9ydCAoc2Nyb2xsZWQpLgorICogQHBhcmFtIHkgdmVydGljYWwgcG9zaXRpb24gcmVs
YXRpdmUgdG8gY3VycmVudCB2aWV3IHBvcnQgKHNjcm9sbGVkKS4KKyAqIEBwYXJhbSB3IHdpZHRo
IG9mIGFyZWEgdG8gYmUgcmVwYWludGVkCisgKiBAcGFyYW0gaCBoZWlnaHQgb2YgYXJlYSB0byBi
ZSByZXBhaW50ZWQKKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0
IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIg
b3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfcmVwYWludF9hZGQoRXdrX1Zp
ZXdfUHJpdmF0ZV9EYXRhKiBwcml2LCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZhc19D
b29yZCB3LCBFdmFzX0Nvb3JkIGgpCit7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4o
cHJpdik7CisgICAgX2V3a192aWV3X3JlcGFpbnRfYWRkKHByaXYsIHgsIHksIHcsIGgpOworfQor
CisvKioKKyAqIERvIGxheW91dCBpZiByZXF1aXJlZCwgYXBwbGllZCByZWN1cnNpdmVseS4KKyAq
CisgKiBAcGFyYW0gcHJpdiBwcml2YXRlIGhhbmRsZSBwb2ludGVyIG9mIHRoZSB2aWV3IHRvIGxh
eW91dC4KKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3Qg
Zm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJh
Y2tpbmcgc3RvcmUuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfbGF5b3V0X2lmX25lZWRlZF9yZWN1cnNp
dmUoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2KQoreworICAgIEVJTkFfU0FGRVRZX09OX05V
TExfUkVUVVJOKHByaXYpOworCisgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2ID0gcHJpdi0+bWFp
bl9mcmFtZS0+dmlldygpOworICAgIGlmICghdikgeworICAgICAgICBFUlIoIm5vIG1haW4gZnJh
bWUgdmlldyIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHYtPmxheW91dElmTmVlZGVk
UmVjdXJzaXZlKCk7Cit9CisKK3ZvaWQgZXdrX3ZpZXdfc2Nyb2xsc19wcm9jZXNzKEV3a19WaWV3
X1NtYXJ0X0RhdGEqIHNkKQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkKTsK
KyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworICAgIGlmICghc2Qt
PmFwaS0+c2Nyb2xsc19wcm9jZXNzKHNkKSkKKyAgICAgICAgRVJSKCJmYWlsZWQgdG8gcHJvY2Vz
cyBzY3JvbGxzLiIpOworICAgIF9ld2tfdmlld19zY3JvbGxzX2ZsdXNoKHByaXYpOworfQorCitz
dHJ1Y3QgX0V3a19WaWV3X1BhaW50X0NvbnRleHQgeworICAgIFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dCogZ2M7CisgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3OworICAgIGNhaXJvX3QqIGNy
OworfTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgcGFpbnQgY29udGV4dCB1c2luZyB0aGUgdmll
dyBhcyBzb3VyY2UgYW5kIGNhaXJvIGFzIG91dHB1dC4KKyAqCisgKiBAcGFyYW0gcHJpdiBwcml2
YXRlIGhhbmRsZSBwb2ludGVyIG9mIHRoZSB2aWV3IHRvIHVzZSBhcyBwYWludCBzb3VyY2UuCisg
KiBAcGFyYW0gY3IgY2Fpcm8gY29udGV4dCB0byB1c2UgYXMgcGFpbnQgZGVzdGluYXRpb24uIEEg
bmV3CisgKiAgICAgICAgcmVmZXJlbmNlIGlzIHRha2VuLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBj
YWlyb19kZXN0cm95KCkKKyAqICAgICAgICBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisg
KgorICogQHJldHVybiBuZXdseSBhbGxvY2F0ZWQgaW5zdGFuY2Ugb3IgQGMgMCBvbiBlcnJvcnMu
CisgKgorICogQG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBz
dWJjbGFzc2VzIHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5n
IHN0b3JlLgorICovCitFd2tfVmlld19QYWludF9Db250ZXh0KiBld2tfdmlld19wYWludF9jb250
ZXh0X25ldyhFd2tfVmlld19Qcml2YXRlX0RhdGEqIHByaXYsIGNhaXJvX3QqIGNyKQoreworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChwcml2LCAwKTsKKyAgICBFSU5BX1NBRkVU
WV9PTl9OVUxMX1JFVFVSTl9WQUwoY3IsIDApOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVU
VVJOX1ZBTChwcml2LT5tYWluX2ZyYW1lLCAwKTsKKyAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZp
ZXcgPSBwcml2LT5tYWluX2ZyYW1lLT52aWV3KCk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9S
RVRVUk5fVkFMKHZpZXcsIDApOworICAgIEV3a19WaWV3X1BhaW50X0NvbnRleHQqIGN0eHQgPSAo
RXdrX1ZpZXdfUGFpbnRfQ29udGV4dCopbWFsbG9jKHNpemVvZigqY3R4dCkpOworICAgIEVJTkFf
U0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTChjdHh0LCAwKTsKKworICAgIGN0eHQtPmdjID0gbmV3
IFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dChjcik7CisgICAgaWYgKCFjdHh0LT5nYykgeworICAg
ICAgICBmcmVlKGN0eHQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY3R4dC0+dmll
dyA9IHZpZXc7CisgICAgY3R4dC0+Y3IgPSBjYWlyb19yZWZlcmVuY2UoY3IpOworICAgIHJldHVy
biBjdHh0OworfQorCisvKioKKyAqIERlc3Ryb3kgcHJldmlvdXNseSBjcmVhdGVkIHBhaW50IGNv
bnRleHQuCisgKgorICogQHBhcmFtIGN0eHQgcGFpbnQgY29udGV4dCB0byBkZXN0cm95LiBNdXN0
IEBiIG5vdCBiZSBAYyAwLgorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVz
ZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0
aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBld2tfdmlld19wYWludF9jb250ZXh0
X2ZyZWUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCkKK3sKKyAgICBFSU5BX1NBRkVUWV9P
Tl9OVUxMX1JFVFVSTihjdHh0KTsKKyAgICBkZWxldGUgY3R4dC0+Z2M7CisgICAgY2Fpcm9fZGVz
dHJveShjdHh0LT5jcik7CisgICAgZnJlZShjdHh0KTsKK30KKworLyoqCisgKiBTYXZlIChwdXNo
IHRvIHN0YWNrKSBwYWludCBjb250ZXh0IHN0YXR1cy4KKyAqCisgKiBAcGFyYW0gY3R4dCBwYWlu
dCBjb250ZXh0IHRvIHNhdmUuIE11c3QgQGIgbm90IGJlIEBjIDAuCisgKgorICogQHNlZSBld2tf
dmlld19wYWludF9jb250ZXh0X3Jlc3RvcmUoKQorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZv
ciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAg
IHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBld2tfdmlld19w
YWludF9jb250ZXh0X3NhdmUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCkKK3sKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihjdHh0KTsKKyAgICBjYWlyb19zYXZlKGN0eHQtPmNy
KTsKKyAgICBjdHh0LT5nYy0+c2F2ZSgpOworfQorCisvKioKKyAqIFJlc3RvcmUgKHBvcCBmcm9t
IHN0YWNrKSBwYWludCBjb250ZXh0IHN0YXR1cy4KKyAqCisgKiBAcGFyYW0gY3R4dCBwYWludCBj
b250ZXh0IHRvIHJlc3RvcmUuIE11c3QgQGIgbm90IGJlIEBjIDAuCisgKgorICogQHNlZSBld2tf
dmlld19wYWludF9jb250ZXh0X3NhdmUoKQorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBn
ZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRv
IGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBld2tfdmlld19wYWlu
dF9jb250ZXh0X3Jlc3RvcmUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCkKK3sKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihjdHh0KTsKKyAgICBjdHh0LT5nYy0+cmVzdG9yZSgp
OworICAgIGNhaXJvX3Jlc3RvcmUoY3R4dC0+Y3IpOworfQorCisvKioKKyAqIENsaXAgcGFpbnQg
Y29udGV4dCBkcmF3aW5ncyB0byBnaXZlbiBhcmVhLgorICoKKyAqIEBwYXJhbSBjdHh0IHBhaW50
IGNvbnRleHQgdG8gY2xpcC4gTXVzdCBAYiBub3QgYmUgQGMgMC4KKyAqIEBwYXJhbSBhcmVhIGNs
aXAgYXJlYSB0byB1c2UuCisgKgorICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0X3NhdmUo
KQorICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0X3Jlc3RvcmUoKQorICoKKyAqIEBub3Rl
IHRoaXMgaXMgbm90IGZvciBnZW5lcmFsIHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0
IHdhbnQKKyAqICAgICAgIHRvIGRlZmluZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwor
dm9pZCBld2tfdmlld19wYWludF9jb250ZXh0X2NsaXAoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCog
Y3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUqIGFyZWEpCit7CisgICAgRUlOQV9TQUZFVFlfT05f
TlVMTF9SRVRVUk4oY3R4dCk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk4oYXJlYSk7
CisgICAgY3R4dC0+Z2MtPmNsaXAoV2ViQ29yZTo6SW50UmVjdChhcmVhLT54LCBhcmVhLT55LCBh
cmVhLT53LCBhcmVhLT5oKSk7Cit9CisKKy8qKgorICogUGFpbnQgdXNpbmcgY29udGV4dCB1c2lu
ZyBnaXZlbiBhcmVhLgorICoKKyAqIEBwYXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gcGFpbnQu
IE11c3QgQGIgbm90IGJlIEBjIDAuCisgKiBAcGFyYW0gYXJlYSBwYWludCBhcmVhIHRvIHVzZS4g
Q29vcmRpbmF0ZXMgYXJlIHJlbGF0aXZlIHRvIGN1cnJlbnQgdmlld3BvcnQsCisgKiAgICAgICAg
dGh1cyAic2Nyb2xsZWQiLgorICoKKyAqIEBub3RlIG9uZSBtYXkgdXNlIGNhaXJvIGZ1bmN0aW9u
cyBvbiB0aGUgY2Fpcm8gY29udGV4dCB0bworICogICAgICAgdHJhbnNsYXRlLCBzY2FsZSBvciBh
bnkgbW9kaWZpY2F0aW9uIHRoYXQgbWF5IGZpdCBoaXMgZGVzaXJlcy4KKyAqCisgKiBAc2VlIGV3
a192aWV3X3BhaW50X2NvbnRleHRfY2xpcCgpCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2NvbnRl
eHRfcGFpbnRfY29udGVudHMoKQorICoKKyAqIEBub3RlIHRoaXMgaXMgbm90IGZvciBnZW5lcmFs
IHVzZSBidXQganVzdCBmb3Igc3ViY2xhc3NlcyB0aGF0IHdhbnQKKyAqICAgICAgIHRvIGRlZmlu
ZSB0aGVpciBvd24gYmFja2luZyBzdG9yZS4KKyAqLwordm9pZCBld2tfdmlld19wYWludF9jb250
ZXh0X3BhaW50KEV3a19WaWV3X1BhaW50X0NvbnRleHQqIGN0eHQsIGNvbnN0IEVpbmFfUmVjdGFu
Z2xlKiBhcmVhKQoreworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKGN0eHQpOworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKGFyZWEpOworCisgICAgV2ViQ29yZTo6SW50UmVj
dCByZWN0KGFyZWEtPngsIGFyZWEtPnksIGFyZWEtPncsIGFyZWEtPmgpOworCisgICAgaWYgKGN0
eHQtPnZpZXctPmlzVHJhbnNwYXJlbnQoKSkKKyAgICAgICAgY3R4dC0+Z2MtPmNsZWFyUmVjdChy
ZWN0KTsKKyAgICBjdHh0LT52aWV3LT5wYWludChjdHh0LT5nYywgcmVjdCk7Cit9CisKKy8qKgor
ICogUGFpbnQganVzdCBjb250ZW50cyB1c2luZyBjb250ZXh0IHVzaW5nIGdpdmVuIGFyZWEuCisg
KgorICogVW5saWtlIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnQoKSwgdGhpcyBmdW5jdGlv
biBwYWludCBqdXN0CisgKiBiYXJlIGNvbnRlbnRzIGFuZCBpZ25vcmVzIGFueSBzY3JvbGxpbmcs
IHNjcm9sbGJhcnMgYW5kIGV4dHJhcy4gSXQKKyAqIHdpbGwgd2FsayB0aGUgcmVuZGVyaW5nIHRy
ZWUgYW5kIHBhaW50IGNvbnRlbnRzIGluc2lkZSB0aGUgZ2l2ZW4KKyAqIGFyZWEgdG8gdGhlIGNh
aXJvIGNvbnRleHQgc3BlY2lmaWVkIGluIEBhIGN0eHQuCisgKgorICogQHBhcmFtIGN0eHQgcGFp
bnQgY29udGV4dCB0byBwYWludC4gTXVzdCBAYiBub3QgYmUgQGMgMC4KKyAqIEBwYXJhbSBhcmVh
IHBhaW50IGFyZWEgdG8gdXNlLiBDb29yZGluYXRlcyBhcmUgYWJzb2x1dGUgdG8gcGFnZS4KKyAq
CisgKiBAbm90ZSBvbmUgbWF5IHVzZSBjYWlybyBmdW5jdGlvbnMgb24gdGhlIGNhaXJvIGNvbnRl
eHQgdG8KKyAqICAgICAgIHRyYW5zbGF0ZSwgc2NhbGUgb3IgYW55IG1vZGlmaWNhdGlvbiB0aGF0
IG1heSBmaXQgaGlzIGRlc2lyZXMuCisgKgorICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0
X2NsaXAoKQorICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0X3BhaW50KCkKKyAqCisgKiBA
bm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMg
dGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisg
Ki8KK3ZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9wYWludF9jb250ZW50cyhFd2tfVmlld19Q
YWludF9Db250ZXh0KiBjdHh0LCBjb25zdCBFaW5hX1JlY3RhbmdsZSogYXJlYSkKK3sKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihjdHh0KTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxM
X1JFVFVSTihhcmVhKTsKKworICAgIFdlYkNvcmU6OkludFJlY3QgcmVjdChhcmVhLT54LCBhcmVh
LT55LCBhcmVhLT53LCBhcmVhLT5oKTsKKworICAgIGlmIChjdHh0LT52aWV3LT5pc1RyYW5zcGFy
ZW50KCkpCisgICAgICAgIGN0eHQtPmdjLT5jbGVhclJlY3QocmVjdCk7CisKKyAgICBjdHh0LT52
aWV3LT5wYWludENvbnRlbnRzKGN0eHQtPmdjLCByZWN0KTsKK30KKworLyoqCisgKiBTY2FsZSB0
aGUgY29udGVudHMgYnkgdGhlIGdpdmVuIGZhY3RvcnMuCisgKgorICogVGhpcyBmdW5jdGlvbiBh
cHBsaWVzIGEgc2NhbGluZyB0cmFuc2Zvcm1hdGlvbiB1c2luZyBDYWlyby4KKyAqCisgKiBAcGFy
YW0gY3R4dCAgICBwYWludCBjb250ZXh0IHRvIHBhaW50LiBNdXN0IEBiIG5vdCBiZSBAYyAwLgor
ICogQHBhcmFtIHNjYWxlX3ggc2NhbGUgZmFjdG9yIGZvciB0aGUgWCBkaW1lbnNpb24uCisgKiBA
cGFyYW0gc2NhbGVfeSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBZIGRpbWVuc2lvbi4KKyAqLwordm9p
ZCBld2tfdmlld19wYWludF9jb250ZXh0X3NjYWxlKEV3a19WaWV3X1BhaW50X0NvbnRleHQqIGN0
eHQsIGZsb2F0IHNjYWxlX3gsIGZsb2F0IHNjYWxlX3kpCit7CisgICAgRUlOQV9TQUZFVFlfT05f
TlVMTF9SRVRVUk4oY3R4dCk7CisKKyAgICBjdHh0LT5nYy0+c2NhbGUoV2ViQ29yZTo6RmxvYXRT
aXplKHNjYWxlX3gsIHNjYWxlX3kpKTsKK30KKworLyoqCisgKiBQZXJmb3JtcyBhIHRyYW5zbGF0
aW9uIG9mIHRoZSBvcmlnaW4gY29vcmRpbmF0ZXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBtb3Zl
cyB0aGUgb3JpZ2luIGNvb3JkaW5hdGVzIGJ5IEBwIHggYW5kIEBwIHkgcGl4ZWxzLgorICoKKyAq
IEBwYXJhbSBjdHh0IHBhaW50IGNvbnRleHQgdG8gcGFpbnQuIE11c3QgQGIgbm90IGJlIEBjIDAu
CisgKiBAcGFyYW0geCAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIHRyYW5zbGF0ZSBpbiB0aGUgWCBk
aW1lbnNpb24uCisgKiBAcGFyYW0geSAgICBhbW91bnQgb2YgcGl4ZWxzIHRvIHRyYW5zbGF0ZSBp
biB0aGUgWSBkaW1lbnNpb24uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF90cmFu
c2xhdGUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCogY3R4dCwgZmxvYXQgeCwgZmxvYXQgeSkKK3sK
KyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihjdHh0KTsKKworICAgIGN0eHQtPmdjLT50
cmFuc2xhdGUoeCwgeSk7Cit9CisKKy8qKgorICogUGFpbnQgdXNpbmcgZ2l2ZW4gZ3JhcGhpY3Mg
Y29udGV4dCB0aGUgZ2l2ZW4gYXJlYS4KKyAqCisgKiBUaGlzIHVzZXMgdmlld3BvcnQgcmVsYXRp
dmUgYXJlYSBhbmQgd2lsbCBhbHNvIGhhbmRsZSBzY3JvbGxiYXJzCisgKiBhbmQgb3RoZXIgZXh0
cmEgZWxlbWVudHMuIFNlZSBld2tfdmlld19wYWludF9jb250ZW50cygpIGZvciB0aGUKKyAqIGFs
dGVybmF0aXZlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSBwcml2IHByaXZhdGUgaGFuZGxlIHBv
aW50ZXIgb2YgdmlldyB0byB1c2UgYXMgcGFpbnQgc291cmNlLgorICogQHBhcmFtIGNyIGNhaXJv
IGNvbnRleHQgdG8gdXNlIGFzIHBhaW50IGRlc3RpbmF0aW9uLiBJdHMgc3RhdGUgd2lsbAorICog
ICAgICAgIGJlIHNhdmVkIGJlZm9yZSBvcGVyYXRpb24gYW5kIHJlc3RvcmVkIGFmdGVyd2FyZHMu
CisgKiBAcGFyYW0gYXJlYSB2aWV3cG9ydCByZWxhdGl2ZSBnZW9tZXRyeSB0byBwYWludC4KKyAq
CisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBvbiBzdWNjZXNzIGFuZCBAYyBFSU5BX0ZBTFNFIG9u
IGZhaWx1cmUsIGxpa2UKKyAqICAgICAgICAgaW5jb3JyZWN0IHBhcmFtZXRlcnMuCisgKgorICog
QG5vdGUgdGhpcyBpcyBhbiBlYXN5IHRvIHVzZSB2ZXJzaW9uLCBidXQgaW50ZXJuYWwgc3RydWN0
dXJlcyBhcmUKKyAqICAgICAgIGFsd2F5cyBjcmVhdGVkLCB0aGVuIGdyYXBoaWNzIGNvbnRleHQg
aXMgY2xpcHBlZCwgdGhlbgorICogICAgICAgcGFpbnRlZCwgcmVzdG9yZWQgYW5kIGRlc3Ryb3ll
ZC4gVGhpcyBtaWdodCBub3QgYmUgb3B0aW11bSwKKyAqICAgICAgIHNvIHVzaW5nICNFd2tfVmll
d19QYWludF9Db250ZXh0IG1heSBiZSBhIGJldHRlciBzb2x1dGlvbnMKKyAqICAgICAgIGZvciBs
YXJnZSBudW1iZXIgb2Ygb3BlcmF0aW9ucy4KKyAqCisgKiBAc2VlIGV3a192aWV3X3BhaW50X2Nv
bnRlbnRzKCkKKyAqIEBzZWUgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9wYWludCgpCisgKgorICog
QG5vdGUgdGhpcyBpcyBub3QgZm9yIGdlbmVyYWwgdXNlIGJ1dCBqdXN0IGZvciBzdWJjbGFzc2Vz
IHRoYXQgd2FudAorICogICAgICAgdG8gZGVmaW5lIHRoZWlyIG93biBiYWNraW5nIHN0b3JlLgor
ICovCitFaW5hX0Jvb2wgZXdrX3ZpZXdfcGFpbnQoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhKiBwcml2
LCBjYWlyb190KiBjciwgY29uc3QgRWluYV9SZWN0YW5nbGUqIGFyZWEpCit7CisgICAgRUlOQV9T
QUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHByaXYsIEVJTkFfRkFMU0UpOworICAgIEVJTkFfU0FG
RVRZX09OX05VTExfUkVUVVJOX1ZBTChjciwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlf
T05fTlVMTF9SRVRVUk5fVkFMKGFyZWEsIEVJTkFfRkFMU0UpOworICAgIFdlYkNvcmU6OkZyYW1l
VmlldyogdmlldyA9IHByaXYtPm1haW5fZnJhbWUtPnZpZXcoKTsKKyAgICBFSU5BX1NBRkVUWV9P
Tl9OVUxMX1JFVFVSTl9WQUwodmlldywgRUlOQV9GQUxTRSk7CisKKyAgICBpZiAodmlldy0+bmVl
ZHNMYXlvdXQoKSkKKyAgICAgICAgdmlldy0+Zm9yY2VMYXlvdXQoKTsKKyAgICBXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQgZ2MoY3IpOworICAgIFdlYkNvcmU6OkludFJlY3QgcmVjdChhcmVhLT54
LCBhcmVhLT55LCBhcmVhLT53LCBhcmVhLT5oKTsKKworICAgIGNhaXJvX3NhdmUoY3IpOworICAg
IGdjLnNhdmUoKTsKKyAgICBnYy5jbGlwKHJlY3QpOworICAgIGlmICh2aWV3LT5pc1RyYW5zcGFy
ZW50KCkpCisgICAgICAgIGdjLmNsZWFyUmVjdChyZWN0KTsKKyAgICB2aWV3LT5wYWludCgmZ2Ms
ICByZWN0KTsKKyAgICBnYy5yZXN0b3JlKCk7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CisKKyAg
ICByZXR1cm4gRUlOQV9UUlVFOworfQorCisvKioKKyAqIFBhaW50IGp1c3QgY29udGVudHMgdXNp
bmcgZ2l2ZW4gZ3JhcGhpY3MgY29udGV4dCB0aGUgZ2l2ZW4gYXJlYS4KKyAqCisgKiBUaGlzIHVz
ZXMgYWJzb2x1dGUgY29vcmRpbmF0ZXMgZm9yIGFyZWEgYW5kIHdpbGwganVzdCBoYW5kbGUKKyAq
IGNvbnRlbnRzLCBubyBzY3JvbGxiYXJzIG9yIGV4dHJhcy4gU2VlIGV3a192aWV3X3BhaW50KCkg
Zm9yIHRoZQorICogYWx0ZXJuYXRpdmUgc29sdXRpb24uCisgKgorICogQHBhcmFtIHByaXYgcHJp
dmF0ZSBoYW5kbGUgcG9pbnRlciBvZiB2aWV3IHRvIHVzZSBhcyBwYWludCBzb3VyY2UuCisgKiBA
cGFyYW0gY3IgY2Fpcm8gY29udGV4dCB0byB1c2UgYXMgcGFpbnQgZGVzdGluYXRpb24uIEl0cyBz
dGF0ZSB3aWxsCisgKiAgICAgICAgYmUgc2F2ZWQgYmVmb3JlIG9wZXJhdGlvbiBhbmQgcmVzdG9y
ZWQgYWZ0ZXJ3YXJkcy4KKyAqIEBwYXJhbSBhcmVhIGFic29sdXRlIGdlb21ldHJ5IHRvIHBhaW50
LgorICoKKyAqIEByZXR1cm4gQGMgRUlOQV9UUlVFIG9uIHN1Y2Nlc3MgYW5kIEBjIEVJTkFfRkFM
U0Ugb24gZmFpbHVyZSwgbGlrZQorICogICAgICAgICBpbmNvcnJlY3QgcGFyYW1ldGVycy4KKyAq
CisgKiBAbm90ZSB0aGlzIGlzIGFuIGVhc3kgdG8gdXNlIHZlcnNpb24sIGJ1dCBpbnRlcm5hbCBz
dHJ1Y3R1cmVzIGFyZQorICogICAgICAgYWx3YXlzIGNyZWF0ZWQsIHRoZW4gZ3JhcGhpY3MgY29u
dGV4dCBpcyBjbGlwcGVkLCB0aGVuCisgKiAgICAgICBwYWludGVkLCByZXN0b3JlZCBhbmQgZGVz
dHJveWVkLiBUaGlzIG1pZ2h0IG5vdCBiZSBvcHRpbXVtLAorICogICAgICAgc28gdXNpbmcgI0V3
a19WaWV3X1BhaW50X0NvbnRleHQgbWF5IGJlIGEgYmV0dGVyIHNvbHV0aW9ucworICogICAgICAg
Zm9yIGxhcmdlIG51bWJlciBvZiBvcGVyYXRpb25zLgorICoKKyAqIEBzZWUgZXdrX3ZpZXdfcGFp
bnQoKQorICogQHNlZSBld2tfdmlld19wYWludF9jb250ZXh0X3BhaW50X2NvbnRlbnRzKCkKKyAq
CisgKiBAbm90ZSB0aGlzIGlzIG5vdCBmb3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNs
YXNzZXMgdGhhdCB3YW50CisgKiAgICAgICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3Rv
cmUuCisgKi8KK0VpbmFfQm9vbCBld2tfdmlld19wYWludF9jb250ZW50cyhFd2tfVmlld19Qcml2
YXRlX0RhdGEqIHByaXYsIGNhaXJvX3QqIGNyLCBjb25zdCBFaW5hX1JlY3RhbmdsZSogYXJlYSkK
K3sKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwocHJpdiwgRUlOQV9GQUxTRSk7
CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKGNyLCBFSU5BX0ZBTFNFKTsKKyAg
ICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTl9WQUwoYXJlYSwgRUlOQV9GQUxTRSk7CisgICAg
V2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3ID0gcHJpdi0+bWFpbl9mcmFtZS0+dmlldygpOworICAg
IEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOX1ZBTCh2aWV3LCBFSU5BX0ZBTFNFKTsKKworICAg
IFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCBnYyhjcik7CisgICAgV2ViQ29yZTo6SW50UmVjdCBy
ZWN0KGFyZWEtPngsIGFyZWEtPnksIGFyZWEtPncsIGFyZWEtPmgpOworCisgICAgY2Fpcm9fc2F2
ZShjcik7CisgICAgZ2Muc2F2ZSgpOworICAgIGdjLmNsaXAocmVjdCk7CisgICAgaWYgKHZpZXct
PmlzVHJhbnNwYXJlbnQoKSkKKyAgICAgICAgZ2MuY2xlYXJSZWN0KHJlY3QpOworICAgIHZpZXct
PnBhaW50Q29udGVudHMoJmdjLCAgcmVjdCk7CisgICAgZ2MucmVzdG9yZSgpOworICAgIGNhaXJv
X3Jlc3RvcmUoY3IpOworCisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKworCisvKiBpbnRlcm5h
bCBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKiovCisvKioKKyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyB0aGUgdmlldyBpcyByZWFkeSB0
byBiZSBkaXNwbGF5ZWQgYXMgYWxsIGVsZW1lbnRzIGFyZSBhcmVhZHkuCisgKgorICogRW1pdHMg
c2lnbmFsOiAicmVhZHkiIHdpdGggbm8gcGFyYW1ldGVycy4KKyAqLwordm9pZCBld2tfdmlld19y
ZWFkeShFdmFzX09iamVjdCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBldmFzX29i
amVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJyZWFkeSIsIDApOworfQorCisvKioKKyAqIEBp
bnRlcm5hbAorICogVGhlIHZpZXcgdGl0bGUgd2FzIGNoYW5nZWQgYnkgdGhlIGZyYW1lIGxvYWRl
ci4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJ0aXRsZSxjaGFuZ2VkIiB3aXRoIHBvaW50ZXIgdG8g
bmV3IHRpdGxlIHN0cmluZy4KKyAqLwordm9pZCBld2tfdmlld190aXRsZV9zZXQoRXZhc19PYmpl
Y3QqIG8sIGNvbnN0IGNoYXIqIHRpdGxlKQoreworICAgIERCRygibz0lcCwgdGl0bGU9JXMiLCBv
LCB0aXRsZSA/IHRpdGxlIDogIihudWxsKSIpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxi
YWNrX2NhbGwobywgInRpdGxlLGNoYW5nZWQiLCAodm9pZCopdGl0bGUpOworfQorCisvKioKKyAq
IEBpbnRlcm5hbAorICogUmVwb3J0cyB0aGF0IG1haW4gZnJhbWUncyB1cmkgY2hhbmdlZC4KKyAq
CisgKiBFbWl0cyBzaWduYWw6ICJ1cmksY2hhbmdlZCIgd2l0aCBwb2ludGVyIHRvIHRoZSBuZXcg
dXJpIHN0cmluZy4KKyAqLwordm9pZCBld2tfdmlld191cmlfY2hhbmdlZChFdmFzX09iamVjdCog
bykKK3sKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBjb25zdCBj
aGFyKiB1cmkgPSBld2tfZnJhbWVfdXJpX2dldChzZC0+bWFpbl9mcmFtZSk7CisgICAgREJHKCJv
PSVwLCB1cmk9JXMiLCBvLCB1cmkgPyB1cmkgOiAiKG51bGwpIik7CisgICAgZXZhc19vYmplY3Rf
c21hcnRfY2FsbGJhY2tfY2FsbChvLCAidXJpLGNoYW5nZWQiLCAodm9pZCopdXJpKTsKK30KKwor
LyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgdGhlIHZpZXcgc3RhcnRlZCBsb2FkaW5nIHNv
bWV0aGluZy4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICoKKyAqIEVtaXRzIHNpZ25hbDogImxv
YWQsc3RhcnRlZCIgd2l0aCBubyBwYXJhbWV0ZXJzLgorICovCit2b2lkIGV3a192aWV3X2xvYWRf
c3RhcnRlZChFdmFzX09iamVjdCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBvKTsKKyAgICBldmFz
X29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJsb2FkLHN0YXJ0ZWQiLCAwKTsKK30KKwor
LyoqCisgKiBSZXBvcnRzIHRoZSBmcmFtZSBzdGFydGVkIGxvYWRpbmcgc29tZXRoaW5nLgorICoK
KyAqIEBwYXJhbSBvIFZpZXcuCisgKgorICogRW1pdHMgc2lnbmFsOiAibG9hZCxzdGFydGVkIiBv
biBtYWluIGZyYW1lIHdpdGggbm8gcGFyYW1ldGVycy4KKyAqLwordm9pZCBld2tfdmlld19mcmFt
ZV9tYWluX2xvYWRfc3RhcnRlZChFdmFzX09iamVjdCogbykKK3sKKyAgICBEQkcoIm89JXAiLCBv
KTsKKyAgICBFdmFzX09iamVjdCogZnJhbWUgPSBld2tfdmlld19mcmFtZV9tYWluX2dldChvKTsK
KyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKGZyYW1lLCAibG9hZCxzdGFydGVk
IiwgMCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHRoZSBtYWluIGZyYW1l
IHN0YXJ0ZWQgcHJvdmlzaW9uYWwgbG9hZC4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICoKKyAq
IEVtaXRzIHNpZ25hbDogImxvYWQscHJvdmlzaW9uYWwiIG9uIFZpZXcgd2l0aCBubyBwYXJhbWV0
ZXJzLgorICovCit2b2lkIGV3a192aWV3X2xvYWRfcHJvdmlzaW9uYWwoRXZhc19PYmplY3QqIG8p
Cit7CisgICAgREJHKCJvPSVwIiwgbyk7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tf
Y2FsbChvLCAibG9hZCxwcm92aXNpb25hbCIsIDApOworfQorCisvKioKKyAqIEBpbnRlcm5hbAor
ICogUmVwb3J0cyB2aWV3IGNhbiBiZSBzaG93biBhZnRlciBhIG5ldyB3aW5kb3cgaXMgY3JlYXRl
ZC4KKyAqCisgKiBAcGFyYW0gbyBGcmFtZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJsb2FkLG5l
d3dpbmRvdyxzaG93IiBvbiB2aWV3IHdpdGggbm8gcGFyYW1ldGVycy4KKyAqLwordm9pZCBld2tf
dmlld19sb2FkX3Nob3coRXZhc19PYmplY3QqIG8pCit7CisgICAgREJHKCJvPSVwIiwgbyk7Cisg
ICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAibG9hZCxuZXd3aW5kb3csc2hv
dyIsIDApOworfQorCisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHRoZSBtYWluIGZy
YW1lIHdhcyBjbGVhcmVkLgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKi8KK3ZvaWQgZXdrX3Zp
ZXdfZnJhbWVfbWFpbl9jbGVhcmVkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIERCRygibz0lcCIs
IG8pOworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FG
RVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPmZsdXNoKTsKKyAgICBzZC0+YXBpLT5mbHVzaChz
ZCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIHRoZSBtYWluIGZyYW1lIHJl
Y2VpdmVkIGFuIGljb24uCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqCisgKiBFbWl0cyBzaWdu
YWw6ICJpY29uLHJlY2VpdmVkIiB3aXRoIG5vIHBhcmFtZXRlcnMuCisgKi8KK3ZvaWQgZXdrX3Zp
ZXdfZnJhbWVfbWFpbl9pY29uX3JlY2VpdmVkKEV2YXNfT2JqZWN0KiBvKQoreworICAgIERCRygi
bz0lcCIsIG8pOworICAgIEV2YXNfT2JqZWN0KiBmcmFtZSA9IGV3a192aWV3X2ZyYW1lX21haW5f
Z2V0KG8pOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwoZnJhbWUsICJpY29u
LHJlY2VpdmVkIiwgMCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRzIGxvYWQg
ZmluaXNoZWQsIG9wdGlvbmFsbHkgd2l0aCBlcnJvciBpbmZvcm1hdGlvbi4KKyAqCisgKiBFbWl0
cyBzaWduYWw6ICJsb2FkLGZpbmlzaGVkIiB3aXRoIHBvaW50ZXIgdG8gI0V3a19GcmFtZV9Mb2Fk
X0Vycm9yCisgKiBpZiBhbnkgZXJyb3IsIG9yIEBjIDAgaWYgc3VjY2Vzc2Z1bCBsb2FkLgorICoK
KyAqIEBub3RlIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IGVycm9yIHN0dWZmIGhlcmUsIGJ1dCB0
cnlpbmcgdG8gYmUKKyAqICAgICAgIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyBXZWJLaXQuCisg
Ki8KK3ZvaWQgZXdrX3ZpZXdfbG9hZF9maW5pc2hlZChFdmFzX09iamVjdCogbywgY29uc3QgRXdr
X0ZyYW1lX0xvYWRfRXJyb3IqIGVycm9yKQoreworICAgIERCRygibz0lcCwgZXJyb3I9JXAiLCBv
LCBlcnJvcik7CisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAibG9hZCxm
aW5pc2hlZCIsICh2b2lkKillcnJvcik7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBv
cnRzIGxvYWQgZmFpbGVkIHdpdGggZXJyb3IgaW5mb3JtYXRpb24uCisgKgorICogRW1pdHMgc2ln
bmFsOiAibG9hZCxlcnJvciIgd2l0aCBwb2ludGVyIHRvIEV3a19GcmFtZV9Mb2FkX0Vycm9yLgor
ICovCit2b2lkIGV3a192aWV3X2xvYWRfZXJyb3IoRXZhc19PYmplY3QqIG8sIGNvbnN0IEV3a19G
cmFtZV9Mb2FkX0Vycm9yKiBlcnJvcikKK3sKKyAgICBEQkcoIm89JXAsIGVycm9yPSVwIiwgbywg
ZXJyb3IpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgImxvYWQsZXJy
b3IiLCAodm9pZCopZXJyb3IpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyBs
b2FkIHByb2dyZXNzIGNoYW5nZWQuCisgKgorICogRW1pdHMgc2lnbmFsOiAibG9hZCxwcm9ncmVz
cyIgd2l0aCBwb2ludGVyIHRvIGEgZG91YmxlIGZyb20gMC4wIHRvIDEuMC4KKyAqLwordm9pZCBl
d2tfdmlld19sb2FkX3Byb2dyZXNzX2NoYW5nZWQoRXZhc19PYmplY3QqIG8pCit7CisgICAgRVdL
X1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1Jf
UkVUVVJOKHNkLCBwcml2KTsKKworICAgIC8vIEV2YXNfQ29vcmQgdywgaDsKKyAgICBkb3VibGUg
cHJvZ3Jlc3MgPSBwcml2LT5wYWdlLT5wcm9ncmVzcygpLT5lc3RpbWF0ZWRQcm9ncmVzcygpOwor
CisgICAgREJHKCJvPSVwIChwPSUwLjNmKSIsIG8sIHByb2dyZXNzKTsKKworICAgIGV2YXNfb2Jq
ZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgImxvYWQscHJvZ3Jlc3MiLCAmcHJvZ3Jlc3MpOwor
fQorCisvKioKKyAqIEBpbnRlcm5hbAorICogUmVwb3J0cyB2aWV3IEBwYXJhbSBvIHNob3VsZCBi
ZSByZXN0b3JlZCB0byBkZWZhdWx0IGNvbmRpdGlvbnMKKyAqCisgKiBAcGFyYW0gbyBWaWV3Lgor
ICogQHBhcmFtIGZyYW1lIEZyYW1lIHRoYXQgb3JpZ2luYXRlZCByZXN0b3JlLgorICoKKyAqIEVt
aXRzIHNpZ25hbDogInJlc3RvcmUiIHdpdGggZnJhbWUuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfcmVz
dG9yZV9zdGF0ZShFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lKQoreworICAgIGV2
YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInJlc3RvcmUiLCBmcmFtZSk7Cit9CisK
Ky8qKgorICogQGludGVybmFsCisgKiBEZWxlZ2F0ZXMgdG8gYnJvd3NlciB0aGUgY3JlYXRpb24g
b2YgYSBuZXcgd2luZG93LiBJZiBpdCBpcyBub3QgaW1wbGVtZW50ZWQsCisgKiBjdXJyZW50IHZp
ZXcgaXMgcmV0dXJuZWQsIHNvIG5hdmlnYXRpb24gbWlnaHQgY29udGludWUgaW4gc2FtZSB3aW5k
b3cuCisgKgorICogQHBhcmFtIG8gQ3VycmVudCB2aWV3LgorICoKKyAqIEByZXR1cm4gTmV3IHZp
ZXcsIGluIGNhc2Ugc21hcnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgY3JlYXRpb24gb2YgbmV3IHdp
bmRvd3M7CisgKiBlbHNlLCBjdXJyZW50IHZpZXcgQHBhcmFtIG8uCisgKi8KK0V2YXNfT2JqZWN0
KiBld2tfdmlld193aW5kb3dfY3JlYXRlKEV2YXNfT2JqZWN0KiBvKQoreworICAgIEVXS19WSUVX
X1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIDApOworCisgICAgaWYgKCFzZC0+YXBpLT53aW5kb3df
Y3JlYXRlKQorICAgICAgICByZXR1cm4gbzsKKworICAgIHJldHVybiBzZC0+YXBpLT53aW5kb3df
Y3JlYXRlKHNkKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFJlcG9ydHMgbW91c2UgaGFz
IG1vdmVkIG92ZXIgYSBsaW5rLgorICoKKyAqIEVtaXRzIHNpZ25hbDogImxpbmssaG92ZXIsaW4i
CisgKi8KK3ZvaWQgZXdrX3ZpZXdfbW91c2VfbGlua19ob3Zlcl9pbihFdmFzX09iamVjdCogbywg
dm9pZCogZGF0YSkKK3sKKyAgICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJs
aW5rLGhvdmVyLGluIiwgZGF0YSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXBvcnRz
IG1vdXNlIGlzIG5vdCBvdmVyIGEgbGluayBhbnltb3JlLgorICoKKyAqIEVtaXRzIHNpZ25hbDog
ImxpbmssaG92ZXIsb3V0IgorICovCit2b2lkIGV3a192aWV3X21vdXNlX2xpbmtfaG92ZXJfb3V0
KEV2YXNfT2JqZWN0KiBvKQoreworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwo
bywgImxpbmssaG92ZXIsb3V0IiwgMCk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBTZXQg
dG9vbGJhciB2aXNpYmxlLgorICoKKyAqIEVtaXRzIHNpZ25hbDogInRvb2xiYXJzLHZpc2libGUs
c2V0IiB3aXRoIGEgcG9pbnRlciB0byBhIGJvb2xlYW4uCisgKi8KK3ZvaWQgZXdrX3ZpZXdfdG9v
bGJhcnNfdmlzaWJsZV9zZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCB2aXNpYmxlKQorewor
ICAgIERCRygibz0lcCAodmlzaWJsZT0lZCkiLCBvLCAhIXZpc2libGUpOworICAgIGV2YXNfb2Jq
ZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInRvb2xiYXJzLHZpc2libGUsc2V0IiwgJnZpc2li
bGUpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogR2V0IHRvb2xiYXIgdmlzaWJpbGl0eS4K
KyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHZpc2libGUgYm9vbGVhbiBwb2ludGVy
IGluIHdoaWNoIHRvIHNhdmUgdGhlIHJlc3VsdC4gSXQgZGVmYXVsdHMKKyAqIHRvIEBjIEZBTFNF
LCBpLmUuIGlmIGJyb3dzZXIgZG9lcyBubyBsaXN0ZW4gdG8gZW1pdHRlZCBzaWduYWwsIGl0IG1l
YW5zCisgKiB0aGVyZSBhcmUgbm8gdG9vbGJhcnMgYW5kIHRoZXJlZm9yZSB0aGV5IGFyZSBub3Qg
dmlzaWJsZS4KKyAqCisgKiBFbWl0cyBzaWduYWw6ICJ0b29sYmFycyx2aXNpYmxlLGdldCIgd2l0
aCBhIHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lkIGV3a192aWV3X3Rvb2xiYXJzX3Zp
c2libGVfZ2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wqIHZpc2libGUpCit7CisgICAgREJH
KCIlcywgbz0lcCIsIF9fZnVuY19fLCBvKTsKKyAgICAqdmlzaWJsZSA9IEVJTkFfRkFMU0U7Cisg
ICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAidG9vbGJhcnMsdmlzaWJsZSxn
ZXQiLCB2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50ZXJuYWwKKyAqIFNldCBzdGF0dXNiYXIg
dmlzaWJsZS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHZpc2libGUgQGMgVFJV
RSBpZiBzdGF0dXNiYXIgYXJlIHZpc2libGUsIEBjIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBF
bWl0cyBzaWduYWw6ICJzdGF0dXNiYXIsdmlzaWJsZSxzZXQiIHdpdGggYSBwb2ludGVyIHRvIGEg
Ym9vbGVhbi4KKyAqLwordm9pZCBld2tfdmlld19zdGF0dXNiYXJfdmlzaWJsZV9zZXQoRXZhc19P
YmplY3QqIG8sIEVpbmFfQm9vbCB2aXNpYmxlKQoreworICAgIERCRygibz0lcCAodmlzaWJsZT0l
ZCkiLCBvLCAhIXZpc2libGUpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwo
bywgInN0YXR1c2Jhcix2aXNpYmxlLHNldCIsICZ2aXNpYmxlKTsKK30KKworLyoqCisgKiBAaW50
ZXJuYWwKKyAqIEdldCBzdGF0dXNiYXIgdmlzaWJpbGl0eS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3
LgorICogQHBhcmFtIHZpc2libGUgYm9vbGVhbiBwb2ludGVyIGluIHdoaWNoIHRvIHNhdmUgdGhl
IHJlc3VsdC4gSXQgZGVmYXVsdHMKKyAqIHRvIEBjIEZBTFNFLCBpLmUuIGlmIGJyb3dzZXIgZG9l
cyBubyBsaXN0ZW4gdG8gZW1pdHRlZCBzaWduYWwsIGl0IG1lYW5zCisgKiB0aGVyZSBpcyBubyBz
dGF0dXNiYXIgYW5kIHRoZXJlZm9yZSBpdCBpcyBub3QgdmlzaWJsZS4KKyAqCisgKiBFbWl0cyBz
aWduYWw6ICJzdGF0dXNiYXIsdmlzaWJsZSxnZXQiIHdpdGggYSBwb2ludGVyIHRvIGEgYm9vbGVh
bi4KKyAqLwordm9pZCBld2tfdmlld19zdGF0dXNiYXJfdmlzaWJsZV9nZXQoRXZhc19PYmplY3Qq
IG8sIEVpbmFfQm9vbCogdmlzaWJsZSkKK3sKKyAgICBEQkcoIiVzLCBvPSVwIiwgX19mdW5jX18s
IG8pOworICAgICp2aXNpYmxlID0gRUlOQV9GQUxTRTsKKyAgICBldmFzX29iamVjdF9zbWFydF9j
YWxsYmFja19jYWxsKG8sICJzdGF0dXNiYXIsdmlzaWJsZSxnZXQiLCB2aXNpYmxlKTsKK30KKwor
LyoqCisgKiBAaW50ZXJuYWwKKyAqIFNldCB0ZXh0IG9mIHN0YXR1c2JhcgorICoKKyAqIEBwYXJh
bSBvIFZpZXcuCisgKiBAcGFyYW0gdGV4dCBOZXcgdGV4dCB0byBwdXQgb24gc3RhdHVzYmFyLgor
ICoKKyAqIEVtaXRzIHNpZ25hbDogInN0YXR1c2Jhcix0ZXh0LHNldCIgd2l0aCBhIHN0cmluZy4K
KyAqLwordm9pZCBld2tfdmlld19zdGF0dXNiYXJfdGV4dF9zZXQoRXZhc19PYmplY3QqIG8sIGNv
bnN0IGNoYXIqIHRleHQpCit7CisgICAgREJHKCJvPSVwICh0ZXh0PSVzKSIsIG8sIHRleHQpOwor
ICAgIElORigic3RhdHVzIGJhciB0ZXh0IHNldDogJXMiLCB0ZXh0KTsKKyAgICBldmFzX29iamVj
dF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJzdGF0dXNiYXIsdGV4dCxzZXQiLCAodm9pZCAqKXRl
eHQpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogU2V0IHNjcm9sbGJhcnMgdmlzaWJsZS4K
KyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHZpc2libGUgQGMgVFJVRSBpZiBzY3Jv
bGxiYXJzIGFyZSB2aXNpYmxlLCBAYyBGQUxTRSBvdGhlcndpc2UuCisgKgorICogRW1pdHMgc2ln
bmFsOiAic2Nyb2xsYmFycyx2aXNpYmxlLHNldCIgd2l0aCBhIHBvaW50ZXIgdG8gYSBib29sZWFu
LgorICovCit2b2lkIGV3a192aWV3X3Njcm9sbGJhcnNfdmlzaWJsZV9zZXQoRXZhc19PYmplY3Qq
IG8sIEVpbmFfQm9vbCB2aXNpYmxlKQoreworICAgIERCRygibz0lcCAodmlzaWJsZT0lZCkiLCBv
LCAhIXZpc2libGUpOworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInNj
cm9sbGJhcnMsdmlzaWJsZSxzZXQiLCAmdmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFs
CisgKiBHZXQgc2Nyb2xsYmFycyB2aXNpYmlsaXR5LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisg
KiBAcGFyYW0gdmlzaWJsZSBib29sZWFuIHBvaW50ZXIgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgcmVz
dWx0LiBJdCBkZWZhdWx0cworICogdG8gQGMgRkFMU0UsIGkuZS4gaWYgYnJvd3NlciBkb2VzIG5v
IGxpc3RlbiB0byBlbWl0dGVkIHNpZ25hbCwgaXQgbWVhbnMKKyAqIHRoZXJlIGFyZSBubyBzY3Jv
bGxiYXJzIGFuZCB0aGVyZWZvcmUgdGhleSBhcmUgbm90IHZpc2libGUuCisgKgorICogRW1pdHMg
c2lnbmFsOiAic2Nyb2xsYmFycyx2aXNpYmxlLGdldCIgd2l0aCBhIHBvaW50ZXIgdG8gYSBib29s
ZWFuLgorICovCit2b2lkIGV3a192aWV3X3Njcm9sbGJhcnNfdmlzaWJsZV9nZXQoRXZhc19PYmpl
Y3QqIG8sIEVpbmFfQm9vbCogdmlzaWJsZSkKK3sKKyAgICBEQkcoIiVzLCBvPSVwIiwgX19mdW5j
X18sIG8pOworICAgICp2aXNpYmxlID0gRUlOQV9GQUxTRTsKKyAgICBldmFzX29iamVjdF9zbWFy
dF9jYWxsYmFja19jYWxsKG8sICJzY3JvbGxiYXJzLHZpc2libGUsZ2V0IiwgdmlzaWJsZSk7Cit9
CisKKy8qKgorICogQGludGVybmFsCisgKiBTZXQgbWVudWJhciB2aXNpYmxlLgorICoKKyAqIEBw
YXJhbSBvIFZpZXcuCisgKiBAcGFyYW0gdmlzaWJsZSBAYyBUUlVFIGlmIG1lbnViYXIgaXMgdmlz
aWJsZSwgQGMgRkFMU0Ugb3RoZXJ3aXNlLgorICoKKyAqIEVtaXRzIHNpZ25hbDogIm1lbnViYXIs
dmlzaWJsZSxzZXQiIHdpdGggYSBwb2ludGVyIHRvIGEgYm9vbGVhbi4KKyAqLwordm9pZCBld2tf
dmlld19tZW51YmFyX3Zpc2libGVfc2V0KEV2YXNfT2JqZWN0KiBvLCBFaW5hX0Jvb2wgdmlzaWJs
ZSkKK3sKKyAgICBEQkcoIm89JXAgKHZpc2libGU9JWQpIiwgbywgISF2aXNpYmxlKTsKKyAgICBl
dmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJtZW51YmFyLHZpc2libGUsc2V0Iiwg
JnZpc2libGUpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogR2V0IG1lbnViYXIgdmlzaWJp
bGl0eS4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIHZpc2libGUgYm9vbGVhbiBw
b2ludGVyIGluIHdoaWNoIHRvIHNhdmUgdGhlIHJlc3VsdC4gSXQgZGVmYXVsdHMKKyAqIHRvIEBj
IEZBTFNFLCBpLmUuIGlmIGJyb3dzZXIgZG9lcyBubyBsaXN0ZW4gdG8gZW1pdHRlZCBzaWduYWws
IGl0IG1lYW5zCisgKiB0aGVyZSBpcyBubyBtZW51YmFyIGFuZCB0aGVyZWZvcmUgaXQgaXMgbm90
IHZpc2libGUuCisgKgorICogRW1pdHMgc2lnbmFsOiAibWVudWJhcix2aXNpYmxlLGdldCIgd2l0
aCBhIHBvaW50ZXIgdG8gYSBib29sZWFuLgorICovCit2b2lkIGV3a192aWV3X21lbnViYXJfdmlz
aWJsZV9nZXQoRXZhc19PYmplY3QqIG8sIEVpbmFfQm9vbCogdmlzaWJsZSkKK3sKKyAgICBEQkco
IiVzLCBvPSVwIiwgX19mdW5jX18sIG8pOworICAgICp2aXNpYmxlID0gRUlOQV9GQUxTRTsKKyAg
ICBldmFzX29iamVjdF9zbWFydF9jYWxsYmFja19jYWxsKG8sICJtZW51YmFyLHZpc2libGUsZ2V0
IiwgdmlzaWJsZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBTZXQgdG9vbHRpcCB0ZXh0
IGFuZCBkaXNwbGF5IGlmIGl0IGlzIGN1cnJlbnRseSBoaWRkZW4uCisgKgorICogQHBhcmFtIG8g
Vmlldy4KKyAqIEBwYXJhbSB0ZXh0IFRleHQgdG8gc2V0IHRvb2x0aXAgdG8uCisgKgorICogRW1p
dHMgc2lnbmFsOiAidG9vbHRpcCx0ZXh0LHNldCIgd2l0aCBhIHN0cmluZy4gSWYgdG9vbHRpcCBt
dXN0IGJlIGFjdHVhbGx5CisgKiByZW1vdmVkLCB0ZXh0IHdpbGwgYmUgMCBvciAnXDAnCisgKi8K
K3ZvaWQgZXdrX3ZpZXdfdG9vbHRpcF90ZXh0X3NldChFdmFzX09iamVjdCogbywgY29uc3QgY2hh
ciogdGV4dCkKK3sKKyAgICBEQkcoIm89JXAgdGV4dD0lcyIsIG8sIHRleHQpOworICAgIGV2YXNf
b2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInRvb2x0aXAsdGV4dCxzZXQiLCAodm9pZCAq
KXRleHQpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisg
KiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcgdG8gc2hvdyBvbiBjb25zb2xlLgorICogQHBhcmFtIGxp
bmVOdW1iZXIgTGluZSBudW1iZXIuCisgKiBAc291cmNlSUQgU291cmNlIGlkLgorICoKKyAqLwor
dm9pZCBld2tfdmlld19hZGRfY29uc29sZV9tZXNzYWdlKEV2YXNfT2JqZWN0KiBvLCBjb25zdCBj
aGFyKiBtZXNzYWdlLCB1bnNpZ25lZCBpbnQgbGluZU51bWJlciwgY29uc3QgY2hhciogc291cmNl
SUQpCit7CisgICAgREJHKCJvPSVwIG1lc3NhZ2U9JXMgbGluZU51bWJlcj0ldSBzb3VyY2VJRD0l
cyIsIG8sIG1lc3NhZ2UsIGxpbmVOdW1iZXIsIHNvdXJjZUlEKTsKKyAgICBFV0tfVklFV19TRF9H
RVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+
YXBpKTsKKyAgICBFSU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpLT5hZGRfY29uc29s
ZV9tZXNzYWdlKTsKKyAgICBzZC0+YXBpLT5hZGRfY29uc29sZV9tZXNzYWdlKHNkLCBtZXNzYWdl
LCBsaW5lTnVtYmVyLCBzb3VyY2VJRCk7Cit9CisKK3ZvaWQgZXdrX3ZpZXdfcnVuX2phdmFzY3Jp
cHRfYWxlcnQoRXZhc19PYmplY3QqIG8sIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciog
bWVzc2FnZSkKK3sKKyAgICBEQkcoIm89JXAgZnJhbWU9JXAgbWVzc2FnZT0lcyIsIG8sIGZyYW1l
LCBtZXNzYWdlKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBF
SU5BX1NBRkVUWV9PTl9OVUxMX1JFVFVSTihzZC0+YXBpKTsKKworICAgIGlmICghc2QtPmFwaS0+
cnVuX2phdmFzY3JpcHRfYWxlcnQpCisgICAgICAgIHJldHVybjsKKworICAgIHNkLT5hcGktPnJ1
bl9qYXZhc2NyaXB0X2FsZXJ0KHNkLCBmcmFtZSwgbWVzc2FnZSk7Cit9CisKK0VpbmFfQm9vbCBl
d2tfdmlld19ydW5famF2YXNjcmlwdF9jb25maXJtKEV2YXNfT2JqZWN0KiBvLCBFdmFzX09iamVj
dCogZnJhbWUsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7CisgICAgREJHKCJvPSVwIGZyYW1lPSVw
IG1lc3NhZ2U9JXMiLCBvLCBmcmFtZSwgbWVzc2FnZSk7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09S
X1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRV
Uk5fVkFMKHNkLT5hcGksIEVJTkFfRkFMU0UpOworCisgICAgaWYgKCFzZC0+YXBpLT5ydW5famF2
YXNjcmlwdF9jb25maXJtKQorICAgICAgICByZXR1cm4gRUlOQV9GQUxTRTsKKworICAgIHJldHVy
biBzZC0+YXBpLT5ydW5famF2YXNjcmlwdF9jb25maXJtKHNkLCBmcmFtZSwgbWVzc2FnZSk7Cit9
CisKK0VpbmFfQm9vbCBld2tfdmlld19ydW5famF2YXNjcmlwdF9wcm9tcHQoRXZhc19PYmplY3Qq
IG8sIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciogbWVzc2FnZSwgY29uc3QgY2hhciog
ZGVmYXVsdFZhbHVlLCBjaGFyKiogdmFsdWUpCit7CisgICAgREJHKCJvPSVwIGZyYW1lPSVwIG1l
c3NhZ2U9JXMiLCBvLCBmcmFtZSwgbWVzc2FnZSk7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JF
VFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5f
VkFMKHNkLT5hcGksIEVJTkFfRkFMU0UpOworCisgICAgaWYgKCFzZC0+YXBpLT5ydW5famF2YXNj
cmlwdF9wcm9tcHQpCisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworCisgICAgcmV0dXJuIHNk
LT5hcGktPnJ1bl9qYXZhc2NyaXB0X3Byb21wdChzZCwgZnJhbWUsIG1lc3NhZ2UsIGRlZmF1bHRW
YWx1ZSwgdmFsdWUpOworfQorCisvKioKKyAqIEBpbnRlcm5hbAorICogRGVsZWdhdGVzIHRvIGNs
aWVudCB0byBkZWNpZGUgd2hldGhlciBhIHNjcmlwdCBtdXN0IGJlIHN0b3BwZWQgYmVjYXVzZSBp
dCdzCisgKiBydW5uaW5nIGZvciB0b28gbG9uZy4gSWYgY2xpZW50IGRvZXMgbm90IGltcGxlbWVu
dCBpdCwgaXQgZ29lcyB0byBkZWZhdWx0CisgKiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggbG9ncyBh
bmQgcmV0dXJucyBFSU5BX0ZBTFNFLiBDbGllbnQgbWF5IHJlbW92ZSBsb2cgYnkKKyAqIHNldHRp
bmcgdGhpcyBmdW5jdGlvbiAwLCB3aGljaCB3aWxsIGp1c3QgcmV0dXJuIEVJTkFfRkFMU0UuCisg
KgorICogQHBhcmFtIG8gVmlldy4KKyAqCisgKiBAcmV0dXJuIEBjIEVJTkFfVFJVRSBpZiBzY3Jp
cHQgc2hvdWxkIGJlIHN0b3BwZWQ7IEBjIEVJTkFfRkFMU0Ugb3RoZXJ3aXNlCisgKi8KK0VpbmFf
Qm9vbCBld2tfdmlld19zaG91bGRfaW50ZXJydXB0X2phdmFzY3JpcHQoRXZhc19PYmplY3QqIG8p
Cit7CisgICAgREJHKCJvPSVwIiwgbyk7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihv
LCBzZCwgRUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHNk
LT5hcGksIEVJTkFfRkFMU0UpOworCisgICAgaWYgKCFzZC0+YXBpLT5zaG91bGRfaW50ZXJydXB0
X2phdmFzY3JpcHQpCisgICAgICAgIHJldHVybiBFSU5BX0ZBTFNFOworCisgICAgcmV0dXJuIHNk
LT5hcGktPnNob3VsZF9pbnRlcnJ1cHRfamF2YXNjcmlwdChzZCk7Cit9CisKKy8qKgorICogQGlu
dGVybmFsCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgd2ViIHNpdGUgc2hvd24gaW4g
QHBhcmFtIGZyYW1lIGlzIGFza2luZyB0byBzdG9yZSBkYXRhCisgKiB0byB0aGUgZGF0YWJhc2Ug
QHBhcmFtIGRhdGFiYXNlTmFtZSBhbmQgdGhlIHF1b3RhIGFsbG9jYXRlZCB0byB0aGF0IHdlYiBz
aXRlCisgKiBpcyBleGNlZWRlZC4gQnJvd3NlciBtYXkgdXNlIHRoaXMgdG8gaW5jcmVhc2UgdGhl
IHNpemUgb2YgcXVvdGEgYmVmb3JlIHRoZQorICogb3JpZ2luYXRpbmcgb3BlcmF0aW9uYSBmYWls
cy4KKyAqCisgKiBAcGFyYW0gbyBWaWV3LgorICogQHBhcmFtIGZyYW1lIFRoZSBmcmFtZSB3aG9z
ZSB3ZWIgcGFnZSBleGNlZWRlZCBpdHMgZGF0YWJhc2UgcXVvdGEuCisgKiBAcGFyYW0gZGF0YWJh
c2VOYW1lIERhdGFiYXNlIG5hbWUuCisgKi8KK3ZvaWQgZXdrX3ZpZXdfZXhjZWVkZWRfZGF0YWJh
c2VfcXVvdGEoRXZhc19PYmplY3QqIG8sIEV2YXNfT2JqZWN0KiBmcmFtZSwgY29uc3QgY2hhciog
ZGF0YWJhc2VOYW1lKQoreworICAgIERCRygibz0lcCIsIG8pOworICAgIEVXS19WSUVXX1NEX0dF
VF9PUl9SRVRVUk4obywgc2QpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5h
cGkpOworICAgIEVJTkFfU0FGRVRZX09OX05VTExfUkVUVVJOKHNkLT5hcGktPmV4Y2VlZGVkX2Rh
dGFiYXNlX3F1b3RhKTsKKyAgICBzZC0+YXBpLT5leGNlZWRlZF9kYXRhYmFzZV9xdW90YShzZCwg
ZnJhbWUsIGRhdGFiYXNlTmFtZSk7Cit9CisKKy8qKgorICogQGludGVybmFsCisgKiBPcGVuIHBh
bmVsIHRvIGNob29zZSBhIGZpbGUuCisgKgorICogQHBhcmFtIG8gVmlldy4KKyAqIEBwYXJhbSBm
cmFtZSBGcmFtZSBpbiB3aGljaCBvcGVyYXRpb24gaXMgcmVxdWlyZWQuCisgKiBAcGFyYW0gYWxs
b3dzX211bHRpcGxlX2ZpbGVzIEBjIEVJTkFfVFJVRSB3aGVuIG1vcmUgdGhhbiBvbmUgZmlsZSBt
YXkgYmUKKyAqIHNlbGVjdGVkLCBAYyBFSU5BX0ZBTFNFIG90aGVyd2lzZQorICogQHN1Z2dlc3Rl
ZF9maWxlbmFtZXMgTGlzdCBvZiBzdWdnZXN0ZWQgZmlsZXMgdG8gc2VsZWN0LiBJdCdzIGFkdmlz
YWJsZSB0bworICoganVzdCBpZ25vcmUgdGhpcyB2YWx1ZSwgc2luY2UgaXQncyBhIHNvdXJjZSBv
ZiBzZWN1cml0eSBmbGF3LgorICogQHNlbGVjdGVkX2ZpbGVuYW1lcyBMaXN0IG9mIGZpbGVzIHNl
bGVjdGVkLgorICoKKyAqIEByZXR1cm4gQEVJTkFfRkFMU0UgaWYgdXNlciBjYW5jZWxlZCBmaWxl
IHNlbGVjdGlvbjsgQEVJTkFfVFJVRSBpZiBjb25maXJtZWQuCisgKi8KK0VpbmFfQm9vbCBld2tf
dmlld19ydW5fb3Blbl9wYW5lbChFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBF
aW5hX0Jvb2wgYWxsb3dzX211bHRpcGxlX2ZpbGVzLCBjb25zdCBFaW5hX0xpc3QqIHN1Z2dlc3Rl
ZF9maWxlbmFtZXMsIEVpbmFfTGlzdCoqIHNlbGVjdGVkX2ZpbGVuYW1lcykKK3sKKyAgICBEQkco
Im89JXAgZnJhbWU9JXAgYWxsb3dzX211bHRpcGxlX2ZpbGVzPSVkIiwgbywgZnJhbWUsIGFsbG93
c19tdWx0aXBsZV9maWxlcyk7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwg
RUlOQV9GQUxTRSk7CisgICAgRUlOQV9TQUZFVFlfT05fTlVMTF9SRVRVUk5fVkFMKHNkLT5hcGks
IEVJTkFfRkFMU0UpOworICAgIEVpbmFfQm9vbCBjb25maXJtOworCisgICAgaWYgKCFzZC0+YXBp
LT5ydW5fb3Blbl9wYW5lbCkKKyAgICAgICAgcmV0dXJuIEVJTkFfRkFMU0U7CisKKyAgICAqc2Vs
ZWN0ZWRfZmlsZW5hbWVzID0gMDsKKworICAgIGNvbmZpcm0gPSBzZC0+YXBpLT5ydW5fb3Blbl9w
YW5lbChzZCwgZnJhbWUsIGFsbG93c19tdWx0aXBsZV9maWxlcywgc3VnZ2VzdGVkX2ZpbGVuYW1l
cywgc2VsZWN0ZWRfZmlsZW5hbWVzKTsKKyAgICBpZiAoIWNvbmZpcm0gJiYgKnNlbGVjdGVkX2Zp
bGVuYW1lcykKKyAgICAgICAgRVJSKCJDYW5jZWxlZCBmaWxlIHNlbGVjdGlvbiwgYnV0IHNlbGVj
dGVkIGZpbGVuYW1lcyAhPSAwLiBGcmVlIG5hbWVzIGJlZm9yZSByZXR1cm4uIik7CisgICAgcmV0
dXJuIGNvbmZpcm07Cit9CisKK3ZvaWQgZXdrX3ZpZXdfcmVwYWludChFdmFzX09iamVjdCogbywg
RXZhc19Db29yZCB4LCBFdmFzX0Nvb3JkIHksIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoKQor
eworICAgIERCRygibz0lcCwgcmVnaW9uPSVkLCVkICsgJWR4JWQiLCBvLCB4LCB5LCB3LCBoKTsK
KyAgICBFV0tfVklFV19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19QUklW
X0dFVF9PUl9SRVRVUk4oc2QsIHByaXYpOworCisgICAgaWYgKCFwcml2LT5tYWluX2ZyYW1lLT5j
b250ZW50UmVuZGVyZXIoKSkgeworICAgICAgICBFUlIoIm5vIG1haW4gZnJhbWUgY29udGVudCBy
ZW5kZXJlci4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9ld2tfdmlld19yZXBh
aW50X2FkZChwcml2LCB4LCB5LCB3LCBoKTsKKyAgICBfZXdrX3ZpZXdfc21hcnRfY2hhbmdlZChz
ZCk7Cit9CisKK3ZvaWQgZXdrX3ZpZXdfc2Nyb2xsKEV2YXNfT2JqZWN0KiBvLCBFdmFzX0Nvb3Jk
IGR4LCBFdmFzX0Nvb3JkIGR5LCBFdmFzX0Nvb3JkIHN4LCBFdmFzX0Nvb3JkIHN5LCBFdmFzX0Nv
b3JkIHN3LCBFdmFzX0Nvb3JkIHNoLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5LCBFdmFz
X0Nvb3JkIGN3LCBFdmFzX0Nvb3JkIGNoLCBFaW5hX0Jvb2wgbWFpbl9mcmFtZSkKK3sKKyAgICBE
QkcoIm89JXAsIGRlbHRhOiAlZCwlZCwgc2Nyb2xsOiAlZCwlZCslZHglZCwgY2xpcDogJWQsJWQr
JWR4JWQiLAorICAgICAgICBvLCBkeCwgZHksIHN4LCBzeSwgc3csIHNoLCBjeCwgY3ksIGN3LCBj
aCk7CisKKyAgICBpZiAoKHN4ICE9IGN4KSB8fCAoc3kgIT0gY3kpIHx8IChzdyAhPSBjdykgfHwg
KHNoICE9IGNoKSkKKyAgICAgICAgV1JOKCJzY3JvbGwgcmVnaW9uIGFuZCBjbGlwIGFyZSBkaWZm
ZXJlbnQhICVkLCVkKyVkeCVkIGFuZCAlZCwlZCslZHglZCIsCisgICAgICAgICAgICBzeCwgc3ks
IHN3LCBzaCwgY3gsIGN5LCBjdywgY2gpOworCisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVS
TihvLCBzZCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2KTsKKyAg
ICBFSU5BX1NBRkVUWV9PTl9UUlVFX1JFVFVSTighZHggJiYgIWR5KTsKKworICAgIF9ld2tfdmll
d19zY3JvbGxfYWRkKHByaXYsIGR4LCBkeSwgc3gsIHN5LCBzdywgc2gsIG1haW5fZnJhbWUpOwor
ICAgIF9ld2tfdmlld19zbWFydF9jaGFuZ2VkKHNkKTsKK30KKworV2ViQ29yZTo6UGFnZSogZXdr
X3ZpZXdfY29yZV9wYWdlX2dldChjb25zdCBFdmFzX09iamVjdCogbykKK3sKKyAgICBFV0tfVklF
V19TRF9HRVRfT1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9S
RVRVUk4oc2QsIHByaXYsIDApOworICAgIHJldHVybiBwcml2LT5wYWdlOworfQorCisvKioKKyAq
IENyZWF0ZXMgYSBuZXcgZnJhbWUgZm9yIGdpdmVuIHVybCBhbmQgb3duZXIgZWxlbWVudC4KKyAq
CisgKiBFbWl0cyAiZnJhbWUsY3JlYXRlZCIgd2l0aCB0aGUgbmV3IGZyYW1lIG9iamVjdCBvbiBz
dWNjZXNzLgorICovCitXVEY6OlBhc3NSZWZQdHI8V2ViQ29yZTo6RnJhbWU+IGV3a192aWV3X2Zy
YW1lX2NyZWF0ZShFdmFzX09iamVjdCogbywgRXZhc19PYmplY3QqIGZyYW1lLCBjb25zdCBXZWJD
b3JlOjpTdHJpbmcmIG5hbWUsIFdlYkNvcmU6OkhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXJF
bGVtZW50LCBjb25zdCBXZWJDb3JlOjpLVVJMJiB1cmwsIGNvbnN0IFdlYkNvcmU6OlN0cmluZyYg
cmVmZXJyZXIpCit7CisgICAgREJHKCJvPSVwLCBmcmFtZT0lcCwgbmFtZT0lcywgb3duZXJFbGVt
ZW50PSVwLCB1cmw9JXMsIHJlZmVycmVyPSVzIiwKKyAgICAgICAgbywgZnJhbWUsIG5hbWUudXRm
OCgpLmRhdGEoKSwgb3duZXJFbGVtZW50LAorICAgICAgICB1cmwucHJldHR5VVJMKCkudXRmOCgp
LmRhdGEoKSwgcmVmZXJyZXIudXRmOCgpLmRhdGEoKSk7CisKKyAgICBFV0tfVklFV19TRF9HRVRf
T1JfUkVUVVJOKG8sIHNkLCAwKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2Qs
IHByaXYsIDApOworCisgICAgV1RGOjpSZWZQdHI8V2ViQ29yZTo6RnJhbWU+IGNmID0gX2V3a192
aWV3X2NvcmVfZnJhbWVfbmV3CisgICAgICAgIChzZCwgcHJpdiwgb3duZXJFbGVtZW50KTsKKyAg
ICBpZiAoIWNmKSB7CisgICAgICAgIEVSUigiQ291bGQgbm90IGNyZWF0ZSBjaGlsZCBjb3JlIGZy
YW1lICclcyciLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9
CisKKyAgICBpZiAoIWV3a19mcmFtZV9jaGlsZF9hZGQoZnJhbWUsIGNmLCBuYW1lLCB1cmwsIHJl
ZmVycmVyKSkgeworICAgICAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgY2hpbGQgZnJhbWUgb2Jq
ZWN0ICclcyciLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9
CisKKyAgICAvLyBUaGUgY3JlYXRpb24gb2YgdGhlIGZyYW1lIG1heSBoYXZlIHJlbW92ZWQgaXRz
ZWxmIGFscmVhZHkuCisgICAgaWYgKCFjZi0+cGFnZSgpIHx8ICFjZi0+dHJlZSgpIHx8ICFjZi0+
dHJlZSgpLT5wYXJlbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzZC0+Y2hhbmdlZC5m
cmFtZV9yZWN0ID0gRUlOQV9UUlVFOworICAgIF9ld2tfdmlld19zbWFydF9jaGFuZ2VkKHNkKTsK
KworICAgIGV2YXNfb2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgImZyYW1lLGNyZWF0ZWQi
LCBmcmFtZSk7CisgICAgcmV0dXJuIGNmLnJlbGVhc2UoKTsKK30KKworV1RGOjpQYXNzUmVmUHRy
PFdlYkNvcmU6OldpZGdldD4gZXdrX3ZpZXdfcGx1Z2luX2NyZWF0ZShFdmFzX09iamVjdCogbywg
RXZhc19PYmplY3QqIGZyYW1lLCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBwbHVnaW5TaXplLCBX
ZWJDb3JlOjpIVE1MUGx1Z0luRWxlbWVudCogZWxlbWVudCwgY29uc3QgV2ViQ29yZTo6S1VSTCYg
dXJsLCBjb25zdCBXVEY6OlZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+JiBwYXJhbU5hbWVzLCBjb25z
dCBXVEY6OlZlY3RvcjxXZWJDb3JlOjpTdHJpbmc+JiBwYXJhbVZhbHVlcywgY29uc3QgV2ViQ29y
ZTo6U3RyaW5nJiBtaW1lVHlwZSwgYm9vbCBsb2FkTWFudWFsbHkpCit7CisgICAgREJHKCJvPSVw
LCBmcmFtZT0lcCwgc2l6ZT0lZHglZCwgZWxlbWVudD0lcCwgdXJsPSVzLCBtaW1lVHlwZT0lcyIs
CisgICAgICAgIG8sIGZyYW1lLCBwbHVnaW5TaXplLndpZHRoKCksIHBsdWdpblNpemUuaGVpZ2h0
KCksIGVsZW1lbnQsCisgICAgICAgIHVybC5wcmV0dHlVUkwoKS51dGY4KCkuZGF0YSgpLCBtaW1l
VHlwZS51dGY4KCkuZGF0YSgpKTsKKworICAgIEVXS19WSUVXX1NEX0dFVF9PUl9SRVRVUk4obywg
c2QsIDApOworICAgIHNkLT5jaGFuZ2VkLmZyYW1lX3JlY3QgPSBFSU5BX1RSVUU7CisgICAgX2V3
a192aWV3X3NtYXJ0X2NoYW5nZWQoc2QpOworCisgICAgcmV0dXJuIGV3a19mcmFtZV9wbHVnaW5f
Y3JlYXRlCisgICAgICAgIChmcmFtZSwgcGx1Z2luU2l6ZSwgZWxlbWVudCwgdXJsLCBwYXJhbU5h
bWVzLCBwYXJhbVZhbHVlcywKKyAgICAgICAgIG1pbWVUeXBlLCBsb2FkTWFudWFsbHkpOworfQor
CisKKy8qKgorICogQGludGVybmFsCisgKgorICogQ3JlYXRlcyBhIG5ldyBwb3B1cCB3aXRoIG9w
dGlvbnMgd2hlbiBhIHNlbGVjdCB3aWRnZXQgd2FzIGNsaWNrZWQuCisgKgorICogQHBhcmFtIGNs
aWVudCBQb3B1cE1lbnVDbGllbnQgaW5zdGFuY2UgdGhhdCBhbGxvd3MgY29tbXVuaWNhdGlvbiB3
aXRoIHdlYmtpdC4KKyAqIEBwYXJhbSBzZWxlY3RlZCBTZWxlY3RlZCBpdGVtLgorICogQHBhcmFt
IHJlY3QgTWVudSdzIHBvc2l0aW9uLgorICoKKyAqIEVtaXRzOiAicG9wdXAsY3JlYXRlIiB3aXRo
IGEgbGlzdCBvZiBFd2tfTWVudSBjb250YWluaW5nIGVhY2ggaXRlbSdzIGRhdGEKKyAqLwordm9p
ZCBld2tfdmlld19wb3B1cF9uZXcoRXZhc19PYmplY3QqIG8sIFdlYkNvcmU6OlBvcHVwTWVudUNs
aWVudCogY2xpZW50LCBpbnQgc2VsZWN0ZWQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3Qp
Cit7CisgICAgSU5GKCJvPSVwIiwgbyk7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihv
LCBzZCk7CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2KTsKKworICAg
IGlmIChwcml2LT5wb3B1cC5tZW51X2NsaWVudCkKKyAgICAgICAgZXdrX3ZpZXdfcG9wdXBfZGVz
dHJveShvKTsKKworICAgIHByaXYtPnBvcHVwLm1lbnVfY2xpZW50ID0gY2xpZW50OworCisgICAg
Ly8gcG9wdWxhdGUgaXRlbXMKKyAgICBjb25zdCBpbnQgc2l6ZSA9IGNsaWVudC0+bGlzdFNpemUo
KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBFd2tfTWVu
dV9JdGVtKiBpdGVtID0gKEV3a19NZW51X0l0ZW0qKSBtYWxsb2Moc2l6ZW9mKCppdGVtKSk7Cisg
ICAgICAgIGlmIChjbGllbnQtPml0ZW1Jc1NlcGFyYXRvcihpKSkKKyAgICAgICAgICAgIGl0ZW0t
PnR5cGUgPSBFV0tfTUVOVV9TRVBBUkFUT1I7CisgICAgICAgIGVsc2UgaWYgKGNsaWVudC0+aXRl
bUlzTGFiZWwoaSkpCisgICAgICAgICAgICBpdGVtLT50eXBlID0gRVdLX01FTlVfR1JPVVA7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGl0ZW0tPnR5cGUgPSBFV0tfTUVOVV9PUFRJT047Cisg
ICAgICAgIGl0ZW0tPnRleHQgPSBlaW5hX3N0cmluZ3NoYXJlX2FkZChjbGllbnQtPml0ZW1UZXh0
KGkpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgIHByaXYtPnBvcHVwLm1lbnUuaXRlbXMgPSBl
aW5hX2xpc3RfYXBwZW5kKHByaXYtPnBvcHVwLm1lbnUuaXRlbXMsIGl0ZW0pOworICAgIH0KKwor
ICAgIHByaXYtPnBvcHVwLm1lbnUueCA9IHJlY3QueCgpOworICAgIHByaXYtPnBvcHVwLm1lbnUu
eSA9IHJlY3QueSgpOworICAgIHByaXYtPnBvcHVwLm1lbnUud2lkdGggPSByZWN0LndpZHRoKCk7
CisgICAgcHJpdi0+cG9wdXAubWVudS5oZWlnaHQgPSByZWN0LmhlaWdodCgpOworICAgIGV2YXNf
b2JqZWN0X3NtYXJ0X2NhbGxiYWNrX2NhbGwobywgInBvcHVwLGNyZWF0ZSIsICZwcml2LT5wb3B1
cC5tZW51KTsKK30KKworLyoqCisgKiBEZXN0cm95IGEgcHJldmlvdXNseSBjcmVhdGVkIG1lbnUu
CisgKgorICogQmVmb3JlIGRlc3Ryb3lpbmcsIGl0IGluZm9ybXMgY2xpZW50IHRoYXQgbWVudSdz
IGRhdGEgaXMgcmVhZHkgdG8gYmUKKyAqIGRlc3Ryb3llZCBieSBzZW5kaW5nIGEgInBvcHVwLHdp
bGxkZWxldGUiIHdpdGggYSBsaXN0IG9mIG1lbnUgaXRlbXMuIFRoZW4gaXQKKyAqIHJlbW92ZXMg
YW55IHJlZmVyZW5jZSB0byBtZW51IGluc2lkZSB3ZWJraXQuIEl0J3Mgc2FmZSB0byBjYWxsIHRo
aXMKKyAqIGZ1bmN0aW9uIGVpdGhlciBmcm9tIGluc2lkZSB3ZWJraXQgb3IgZnJvbSBicm93c2Vy
LgorICoKKyAqIEBwYXJhbSBvIFZpZXcuCisgKgorICogQHJldHVybnMgRUlOQV9UUlVFIGluIGNh
c2UgbWVudSB3YXMgc3VjY2Vzc2Z1bGx5IGRlc3Ryb3llZCBvciBFSU5BX1RSVUUgaW4KKyAqIGNh
c2UgdGhlcmUgd2Fzbid0IGFueSBtZW51IHRvIGJlIGRlc3Ryb3llZC4KKyAqLworRWluYV9Cb29s
IGV3a192aWV3X3BvcHVwX2Rlc3Ryb3koRXZhc19PYmplY3QqIG8pCit7CisgICAgSU5GKCJvPSVw
Iiwgbyk7CisgICAgRVdLX1ZJRVdfU0RfR0VUX09SX1JFVFVSTihvLCBzZCwgRUlOQV9GQUxTRSk7
CisgICAgRVdLX1ZJRVdfUFJJVl9HRVRfT1JfUkVUVVJOKHNkLCBwcml2LCBFSU5BX0ZBTFNFKTsK
KworICAgIGlmICghcHJpdi0+cG9wdXAubWVudV9jbGllbnQpCisgICAgICAgIHJldHVybiBFSU5B
X0ZBTFNFOworCisgICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAicG9wdXAs
d2lsbGRlbGV0ZSIsICZwcml2LT5wb3B1cC5tZW51KTsKKworICAgIHZvaWQqIGl0ZW12OworICAg
IEVJTkFfTElTVF9GUkVFKHByaXYtPnBvcHVwLm1lbnUuaXRlbXMsIGl0ZW12KSB7CisgICAgICAg
IEV3a19NZW51X0l0ZW0qIGl0ZW0gPSAoRXdrX01lbnVfSXRlbSopaXRlbXY7CisgICAgICAgIGVp
bmFfc3RyaW5nc2hhcmVfZGVsKGl0ZW0tPnRleHQpOworICAgICAgICBmcmVlKGl0ZW0pOworICAg
IH0KKyAgICBwcml2LT5wb3B1cC5tZW51X2NsaWVudC0+cG9wdXBEaWRIaWRlKCk7CisgICAgcHJp
di0+cG9wdXAubWVudV9jbGllbnQgPSAwOworCisgICAgcmV0dXJuIEVJTkFfVFJVRTsKK30KKwor
LyoqCisgKiBDaGFuZ2VzIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLgorICoKKyAqIENoYW5nZXMg
dGhlIG9wdGlvbiBzZWxlY3RlZCBpbiBzZWxlY3Qgd2lkZ2V0LiBUaGlzIGlzIGNhbGxlZCBieSBi
cm93c2VyCisgKiB3aGVuZXZlciB1c2VyIGhhcyBjaG9zZW4gYSBkaWZmZXJlbnQgaXRlbS4gTW9z
dCBsaWtlbHkgYWZ0ZXIgY2FsbGluZyB0aGlzLCBhCisgKiBjYWxsIHRvIGV3a192aWV3X3BvcHVw
X2Rlc3Ryb3kgbWlnaHQgYmUgbWFkZSBpbiBvcmRlciB0byBjbG9zZSB0aGUgcG9wdXAuCisgKgor
ICogQHBhcmFtIG8gVmlldy4KKyAqIEBpbmRleCBJbmRleCBvZiBzZWxlY3RlZCBpdGVtLgorICoK
KyAqLwordm9pZCBld2tfdmlld19wb3B1cF9zZWxlY3RlZF9zZXQoRXZhc19PYmplY3QqIG8sIGlu
dCBpbmRleCkKK3sKKyAgICBJTkYoIm89JXAiLCBvKTsKKyAgICBFV0tfVklFV19TRF9HRVRfT1Jf
UkVUVVJOKG8sIHNkKTsKKyAgICBFV0tfVklFV19QUklWX0dFVF9PUl9SRVRVUk4oc2QsIHByaXYp
OworCisgICAgcHJpdi0+cG9wdXAubWVudV9jbGllbnQtPnZhbHVlQ2hhbmdlZChpbmRleCk7Cit9
CisKKy8qKgorICogQGludGVybmFsCisgKiBSZXF1ZXN0IGEgZG93bmxvYWQgdG8gdXNlci4KKyAq
CisgKiBAcGFyYW0gbyBWaWV3LgorICogQG9hcmFtIGRvd25sb2FkIEV3a19Eb3dubG9hZCBzdHJ1
Y3QgdG8gYmUgc2VudC4KKyAqCisgKiBFbWl0czogImRvd25sb2FkLHJlcXVlc3QiIHdpdGggYW4g
RXdrX0Rvd25sb2FkIGNvbnRhaW5pbmcgdGhlIGRldGFpbHMgb2YgdGhlCisgKiByZXF1ZXN0ZWQg
ZG93bmxvYWQuIFRoZSBkb3dubG9hZCBwZXIgc2UgbXVzdCBiZSBoYW5kbGVkIG91dHNpZGUgb2Yg
d2Via2l0LgorICovCit2b2lkIGV3a192aWV3X2Rvd25sb2FkX3JlcXVlc3QoRXZhc19PYmplY3Qq
IG8sIEV3a19Eb3dubG9hZCogZG93bmxvYWQpCit7CisgICAgREJHKCJ2aWV3PSVwIiwgbyk7Cisg
ICAgZXZhc19vYmplY3Rfc21hcnRfY2FsbGJhY2tfY2FsbChvLCAiZG93bmxvYWQscmVxdWVzdCIs
IGRvd25sb2FkKTsKK30KSW5kZXg6IFdlYktpdC9lZmwvZXdrL2V3a192aWV3LmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gL2Rldi9udWxsCisrKyBXZWJLaXQvZWZsL2V3ay9ld2tfdmlldy5oCkBAIC0wLDAgKzEs
NDU1IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFByb0ZVU0lPTiBlbWJlZGRl
ZCBzeXN0ZW1zCisgICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgU2Ftc3VuZyBFbGVjdHJvbmlj
cworCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
KyovCisKKyNpZm5kZWYgZXdrX3ZpZXdfaAorI2RlZmluZSBld2tfdmlld19oCisKKyNpbmNsdWRl
IDxFdmFzLmg+CisjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxld2tfaGlzdG9yeS5oPgor
CisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKgorICogQGJy
aWVmIFdlYktpdCBtYWluIHNtYXJ0IG9iamVjdC4KKyAqCisgKiBUaGlzIG9iamVjdCBpcyB0aGUg
aGlnaCBsZXZlbCBhY2Nlc3MgdG8gV2ViS2l0LUVGTCBicm93c2VyCisgKiBjb21wb25lbnQuIEl0
IGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgbWFpbiBmcmFtZSBhbmQgb3RoZXIKKyAq
IGNyaXRpY2FsIHJlc291cmNlcy4KKyAqCisgKiBFdmVyeSBld2tfdmlldyBoYXMgYXQgbGVhc3Qg
b25lIGZyYW1lLCBjYWxsZWQgIm1haW4gZnJhbWUiIGFuZAorICogcmV0cmlldmVkIHdpdGggZXdr
X3ZpZXdfZnJhbWVfbWFpbl9nZXQoKS4gRGlyZWN0IGZyYW1lIGFjY2VzcyBpcworICogb2Z0ZW4g
ZGlzY291cmFnZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBld2tfdmlldyBmdW5jdGlvbnMK
KyAqIGluc3RlYWQuCisgKgorICogVGhlIGZvbGxvd2luZyBzaWduYWxzIChzZWUgZXZhc19vYmpl
Y3Rfc21hcnRfY2FsbGJhY2tfYWRkKCkpIGFyZSBlbWl0dGVkOgorICoKKyAqICAtICJyZWFkeSIs
IHZvaWQ6IHBhZ2UgaXMgZnVsbHkgbG9hZGVkLgorICogIC0gInRpdGxlLGNoYW5nZWQiLCBjb25z
dCBjaGFyKjogdGl0bGUgb2YgdGhlIG1haW4gZnJhbWUgY2hhbmdlZC4KKyAqICAtICJ1cmksY2hh
bmdlZCIsIGNvbnN0IGNoYXIqOiB1cmkgb2YgdGhlIG1haW4gZnJhbWUgY2hhbmdlZC4KKyAqICAt
ICJsb2FkLHN0YXJ0ZWQiLCB2b2lkOiBmcmFtZSBzdGFydGVkIGxvYWRpbmcuCisgKiAgLSAibG9h
ZCxwcm9ncmVzcyIsIGRvdWJsZSo6IGxvYWQgcHJvZ3Jlc3MgY2hhbmdlZCAob3ZlcmFsbCB2YWx1
ZQorICogICAgZnJvbSAwLjAgdG8gMS4wLCBjb25uZWN0IHRvIGluZGl2aWR1YWwgZnJhbWVzIGZv
ciBmaW5lIGdyYWluZWQpLgorICogIC0gImxvYWQsZmluaXNoZWQiLCBjb25zdCBFd2tfRnJhbWVf
TG9hZF9FcnJvcio6IHJlcG9ydHMgbG9hZAorICogICAgZmluaXNoZWQgYW5kIGFzIGFyZ3VtZW50
IEBjIE5VTEwgaWYgc3VjY2Vzc2Z1bGx5IG9yIHBvaW50ZXIgdG8KKyAqICAgIHN0cnVjdHVyZSBk
ZWZpbmluZyB0aGUgZXJyb3IuCisgKiAgLSAibG9hZCxwcm92aXNpb25hbCIsIHZvaWQ6IHZpZXcg
c3RhcnRlZCBwcm92aXNpb25hbCBsb2FkLgorICogIC0gImxvYWQsZXJyb3IiLCBjb25zdCBFd2tf
RnJhbWVfTG9hZF9FcnJvcio6IHJlcG9ydHMgbG9hZCBmYWlsZWQKKyAqICAgIGFuZCBhcyBhcmd1
bWVudCBhIHBvaW50ZXIgdG8gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBlcnJvci4KKyAqICAtICJm
cmFtZSxjcmVhdGVkIiwgRXZhc19PYmplY3QqOiB3aGVuIGZyYW1lcyBhcmUgY3JlYXRlZCwgdGhl
eSBhcmUKKyAqICAgIGVtaXR0ZWQgaW4gdGhpcyBzaWduYWwuCisgKiAgLSAiem9vbSxhbmltYXRl
ZCxlbmQiLCB2b2lkOiByZXF1ZXN0ZWQgYW5pbWF0ZWQgem9vbSBpcyBmaW5pc2hlZC4KKyAqICAt
ICJtZW51YmFyLHZpc2libGUsc2V0IiwgRWluYV9Cb29sOiBzZXQgbWVudWJhciB2aXNpYmlsaXR5
LgorICogIC0gIm1lbnViYXIsdmlzaWJsZSxnZXQiLCBFaW5hX0Jvb2wgKjogZXhwZWN0cyBhIEBj
IEVJTkFfVFJVRSBpZiBtZW51YmFyIGlzCisgKiAgICB2aXNpYmxlOyBvdGhlcndpc2UsIEBjIEVJ
TkFfRkFMU0UuCisgKiAgLSAibWVudWJhcix2aXNpYmxlLHNldCIsIEVpbmFfQm9vbDogc2V0IG1l
bnViYXIgdmlzaWJpbGl0eS4KKyAqICAtICJtZW51YmFyLHZpc2libGUsZ2V0IiwgRWluYV9Cb29s
ICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgbWVudWJhciBpcworICogICAgdmlzaWJsZTsg
QGMgRUlOQV9GQUxTRSwgb3RoZXJ3aXNlLgorICogIC0gInNjcm9sbGJhcnMsdmlzaWJsZSxzZXQi
LCBFaW5hX0Jvb2w6IHNldCBzY3JvbGxiYXJzIHZpc2liaWxpdHkuCisgKiAgLSAic2Nyb2xsYmFy
cyx2aXNpYmxlLGdldCIsIEVpbmFfQm9vbCAqOiBleHBlY3RzIGEgQGMgRUlOQV9UUlVFIGlmIHNj
cm9sbGJhcnMKKyAqICAgIGFyZSB2aXNpYmxlOyBAYyBFSU5BX0ZBTFNFLCBvdGhlcndpc2UuCisg
KiAgLSAic3RhdHVzYmFyLHZpc2libGUsc2V0IiwgRWluYV9Cb29sOiBzZXQgc3RhdHVzYmFyIHZp
c2liaWxpdHkuCisgKiAgLSAic3RhdHVzYmFyLHZpc2libGUsZ2V0IiwgRWluYV9Cb29sICo6IGV4
cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgc3RhdHVzYmFyIGlzCisgKiAgICB2aXNpYmxlOyBAYyBF
SU5BX0ZBTFNFLCBvdGhlcndpc2UuCisgKiAgLSAidG9vbGJhcix2aXNpYmxlLHNldCIsIEVpbmFf
Qm9vbDogc2V0IHRvb2xiYXIgdmlzaWJpbGl0eS4KKyAqICAtICJ0b29sYmFyLHZpc2libGUsZ2V0
IiwgRWluYV9Cb29sICo6IGV4cGVjdHMgYSBAYyBFSU5BX1RSVUUgaWYgdG9vbGJhcgorICogICAg
aXMgdmlzaWJsZTsgQGMgRUlOQV9GQUxTRSwgb3RoZXJ3aXNlLgorICogIC0gImxpbmssaG92ZXIs
aW4iLCBjb25zdCBjaGFyICpsaW5rWzJdOiByZXBvcnRzIG1vdXNlIGlzIG92ZXIgYSBsaW5rIGFu
ZCBhcworICogICAgYXJndW1lbnQgZ2l2ZXMgdGhlIHVybCBpbiBsaW5rWzBdIGFuZCBsaW5rJ3Mg
dGl0bGUgaW4gbGlua1sxXS4KKyAqICAtICJsaW5rLGhvdmVyLG91dCIsIGNvbnN0IGNoYXIgKmxp
bmtbMl06IHJlcG9ydHMgbW91c2UgbW92ZWQgb3V0IGZyb20gYSBsaW5rCisgKiAgICBhbmQgYXMg
YXJndW1lbnQgZ2l2ZXMgdGhlIHVybCBpbiBsaW5rWzBdIGFuZCBsaW5rJ3MgdGl0bGUgaW4gbGlu
a1sxXS4KKyAqICAtICJwb3B1cCxjcmVhdGUiLCBFd2tfTWVudTogcmVwb3J0cyB0aGF0IGEgbmV3
IG1lbnUgd2FzIGNyZWF0ZWQuCisgKiAgLSAicG9wdXAsd2lsbGRlbGV0ZWQiLCBFd2tfTWVudTog
cmVwb3J0cyB0aGF0IGEgcHJldmlvdXNseSBjcmVhdGVkIG1lbnUgaXMKKyAqICAgIGFib3V0IHRv
IGJlIGRlbGV0ZWQuCisgKiAgLSAiZG93bmxvYWQscmVxdWVzdCIsIEV3a19Eb3dubG9hZDogcmVw
b3J0cyBhIGRvd25sb2FkIGlzIGJlaW5nIHJlcXVlc3RlZAorICogICAgYW5kIGFzIGFyZ3VtZW50
cyBnaXZlcyBpdHMgZGV0YWlscy4KKyAqICAtICJpY29uLHJlY2VpdmVkIiwgdm9pZDogbWFpbiBm
cmFtZSByZWNlaXZlZCBhbiBpY29uLgorICovCisKK3R5cGVkZWYgc3RydWN0IF9Fd2tfVmlld19T
bWFydF9EYXRhIEV3a19WaWV3X1NtYXJ0X0RhdGE7CisKKy8qKgorICogRXdrIHZpZXcncyBjbGFz
cywgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWItY2xhc3Nlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qg
X0V3a19WaWV3X1NtYXJ0X0NsYXNzIEV3a19WaWV3X1NtYXJ0X0NsYXNzOworc3RydWN0IF9Fd2tf
Vmlld19TbWFydF9DbGFzcyB7CisgICAgRXZhc19TbWFydF9DbGFzcyBzYzsgLyoqPCBhbGwgYnV0
ICdkYXRhJyBpcyBmcmVlIHRvIGJlIGNoYW5nZWQuICovCisgICAgdW5zaWduZWQgbG9uZyB2ZXJz
aW9uOworCisgICAgRXZhc19PYmplY3QgKigqd2luZG93X2NyZWF0ZSkoRXdrX1ZpZXdfU21hcnRf
RGF0YSAqc2QpOyAvKio8IGNyZWF0ZXMgYSBuZXcgd2luZG93LCByZXF1ZXN0ZWQgYnkgd2Via2l0
ICovCisgICAgLy8gaG9va3MgdG8gYWxsb3cgZGlmZmVyZW50IGJhY2tpbmcgc3RvcmVzCisgICAg
RXZhc19PYmplY3QgKigqYmFja2luZ19zdG9yZV9hZGQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNk
KTsgLyoqPCBtdXN0IGJlIGRlZmluZWQgKi8KKyAgICBFaW5hX0Jvb2wgKCpzY3JvbGxzX3Byb2Nl
c3MpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsgLyoqPCBtdXN0IGJlIGRlZmluZWQgKi8KKyAg
ICBFaW5hX0Jvb2wgKCpyZXBhaW50c19wcm9jZXNzKShFd2tfVmlld19TbWFydF9EYXRhICpzZCk7
IC8qKjwgbXVzdCBiZSBkZWZpbmVkICovCisgICAgRWluYV9Cb29sICgqY29udGVudHNfcmVzaXpl
KShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgaW50IHcsIGludCBoKTsKKyAgICBFaW5hX0Jvb2wg
KCp6b29tX3NldCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGZsb2F0IHpvb20sIEV2YXNfQ29v
cmQgY3gsIEV2YXNfQ29vcmQgY3kpOworICAgIEVpbmFfQm9vbCAoKnpvb21fd2Vha19zZXQpKEV3
a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBmbG9hdCB6b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nv
b3JkIGN5KTsKKyAgICB2b2lkICgqem9vbV93ZWFrX3Ntb290aF9zY2FsZV9zZXQpKEV3a19WaWV3
X1NtYXJ0X0RhdGEgKnNkLCBFaW5hX0Jvb2wgc21vb3RoX3NjYWxlKTsKKyAgICB2b2lkICgqYmdf
Y29sb3Jfc2V0KShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgdW5zaWduZWQgY2hhciByLCB1bnNp
Z25lZCBjaGFyIGcsIHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgY2hhciBhKTsKKyAgICB2b2lk
ICgqZmx1c2gpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICBFaW5hX0Jvb2wgKCpwcmVf
cmVuZGVyX3JlZ2lvbikoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIEV2YXNfQ29vcmQgeCwgRXZh
c19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCwgZmxvYXQgem9vbSk7CisgICAg
dm9pZCAoKnByZV9yZW5kZXJfY2FuY2VsKShFd2tfVmlld19TbWFydF9EYXRhICpzZCk7CisgICAg
Ly8gZXZlbnQgaGFuZGxpbmc6CisgICAgLy8gIC0gcmV0dXJucyB0cnVlIGlmIGhhbmRsZWQKKyAg
ICAvLyAgLSBpZiBvdmVycmlkZGVuLCBoYXZlIHRvIGNhbGwgcGFyZW50IG1ldGhvZCBpZiBkZXNp
cmVkCisgICAgRWluYV9Cb29sICgqZm9jdXNfaW4pKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsK
KyAgICBFaW5hX0Jvb2wgKCpmb2N1c19vdXQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAg
ICBFaW5hX0Jvb2wgKCptb3VzZV93aGVlbCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0
IEV2YXNfRXZlbnRfTW91c2VfV2hlZWwgKmV2KTsKKyAgICBFaW5hX0Jvb2wgKCptb3VzZV9kb3du
KShFd2tfVmlld19TbWFydF9EYXRhICpzZCwgY29uc3QgRXZhc19FdmVudF9Nb3VzZV9Eb3duICpl
dik7CisgICAgRWluYV9Cb29sICgqbW91c2VfdXApKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBj
b25zdCBFdmFzX0V2ZW50X01vdXNlX1VwICpldik7CisgICAgRWluYV9Cb29sICgqbW91c2VfbW92
ZSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0IEV2YXNfRXZlbnRfTW91c2VfTW92ZSAq
ZXYpOworICAgIEVpbmFfQm9vbCAoKmtleV9kb3duKShFd2tfVmlld19TbWFydF9EYXRhICpzZCwg
Y29uc3QgRXZhc19FdmVudF9LZXlfRG93biAqZXYpOworICAgIEVpbmFfQm9vbCAoKmtleV91cCko
RXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIGNvbnN0IEV2YXNfRXZlbnRfS2V5X1VwICpldik7CisK
KyAgICB2b2lkICgqYWRkX2NvbnNvbGVfbWVzc2FnZSkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2Qs
IGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHVuc2lnbmVkIGludCBsaW5lTnVtYmVyLCBjb25zdCBjaGFy
ICpzb3VyY2VJRCk7CisgICAgdm9pZCAoKnJ1bl9qYXZhc2NyaXB0X2FsZXJ0KShFd2tfVmlld19T
bWFydF9EYXRhICpzZCwgRXZhc19PYmplY3QgKmZyYW1lLCBjb25zdCBjaGFyICptZXNzYWdlKTsK
KyAgICBFaW5hX0Jvb2wgKCpydW5famF2YXNjcmlwdF9jb25maXJtKShFd2tfVmlld19TbWFydF9E
YXRhICpzZCwgRXZhc19PYmplY3QgKmZyYW1lLCBjb25zdCBjaGFyICptZXNzYWdlKTsKKyAgICBF
aW5hX0Jvb2wgKCpydW5famF2YXNjcmlwdF9wcm9tcHQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNk
LCBFdmFzX09iamVjdCAqZnJhbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGNvbnN0IGNoYXIgKmRl
ZmF1bHRWYWx1ZSwgY2hhciAqKnZhbHVlKTsKKyAgICBFaW5hX0Jvb2wgKCpzaG91bGRfaW50ZXJy
dXB0X2phdmFzY3JpcHQpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkKTsKKyAgICB2b2lkICgqZXhj
ZWVkZWRfZGF0YWJhc2VfcXVvdGEpKEV3a19WaWV3X1NtYXJ0X0RhdGEgKnNkLCBFdmFzX09iamVj
dCAqZnJhbWUsIGNvbnN0IGNoYXIgKmRhdGFiYXNlTmFtZSk7CisKKyAgICBFaW5hX0Jvb2wgKCpy
dW5fb3Blbl9wYW5lbCkoRXdrX1ZpZXdfU21hcnRfRGF0YSAqc2QsIEV2YXNfT2JqZWN0ICpmcmFt
ZSwgRWluYV9Cb29sIGFsbG93c19tdWx0aXBsZV9maWxlcywgY29uc3QgRWluYV9MaXN0ICpzdWdn
ZXN0ZWRfZmlsZW5hbWVzLCBFaW5hX0xpc3QgKipzZWxlY3RlZF9maWxlbmFtZXMpOworfTsKKwor
I2RlZmluZSBFV0tfVklFV19TTUFSVF9DTEFTU19WRVJTSU9OIDFVTCAvKiogdGhlIHZlcnNpb24g
eW91IGhhdmUgdG8gcHV0IGludG8gdGhlIHZlcnNpb24gZmllbGQgaW4gdGhlIEV3a19WaWV3X1Nt
YXJ0X0NsYXNzIHN0cnVjdHVyZSAqLworCisvKioKKyAqIEluaXRpYWxpemVyIGZvciB3aG9sZSBF
d2tfVmlld19TbWFydF9DbGFzcyBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHNtYXJ0X2NsYXNz
X2luaXQgaW5pdGlhbGl6ZXIgdG8gdXNlIGZvciB0aGUgImJhc2UiIGZpZWxkCisgKiAoRXZhc19T
bWFydF9DbGFzcykuCisgKgorICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05VTEwK
KyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OCisgKiBAc2VlIEVXS19W
SUVXX1NNQVJUX0NMQVNTX0lOSVRfTkFNRV9WRVJTSU9OCisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdf
U01BUlRfQ0xBU1NfSU5JVChzbWFydF9jbGFzc19pbml0KSB7c21hcnRfY2xhc3NfaW5pdCwgRVdL
X1ZJRVdfU01BUlRfQ0xBU1NfVkVSU0lPTiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKworLyoq
CisgKiBJbml0aWFsaXplciB0byB6ZXJvIGEgd2hvbGUgRXdrX1ZpZXdfU21hcnRfQ2xhc3Mgc3Ry
dWN0dXJlLgorICoKKyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9WRVJTSU9OCisg
KiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTkFNRV9WRVJTSU9OCisgKiBAc2VlIEVX
S19WSUVXX1NNQVJUX0NMQVNTX0lOSVQKKyAqLworI2RlZmluZSBFV0tfVklFV19TTUFSVF9DTEFT
U19JTklUX05VTEwgRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVChFVkFTX1NNQVJUX0NMQVNTX0lO
SVRfTlVMTCkKKworLyoqCisgKiBJbml0aWFsaXplciB0byB6ZXJvIGEgd2hvbGUgRXdrX1ZpZXdf
U21hcnRfQ2xhc3Mgc3RydWN0dXJlIGFuZCBzZXQgdmVyc2lvbi4KKyAqCisgKiBTaW1pbGFyIHRv
IEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRfTlVMTCwgYnV0IHdpbGwgc2V0IHZlcnNpb24gZmll
bGQgb2YKKyAqIEV2YXNfU21hcnRfQ2xhc3MgKGJhc2UgZmllbGQpIHRvIGxhdGVzdCBFVkFTX1NN
QVJUX0NMQVNTX1ZFUlNJT04KKyAqCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVRf
TlVMTAorICogQHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05BTUVfVkVSU0lPTgorICog
QHNlZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUCisgKi8KKyNkZWZpbmUgRVdLX1ZJRVdfU01B
UlRfQ0xBU1NfSU5JVF9WRVJTSU9OIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVQoRVZBU19TTUFS
VF9DTEFTU19JTklUX1ZFUlNJT04pCisKKy8qKgorICogSW5pdGlhbGl6ZXIgdG8gemVybyBhIHdo
b2xlIEV3a19WaWV3X1NtYXJ0X0NsYXNzIHN0cnVjdHVyZSBhbmQgc2V0CisgKiBuYW1lIGFuZCB2
ZXJzaW9uLgorICoKKyAqIFNpbWlsYXIgdG8gRVdLX1ZJRVdfU01BUlRfQ0xBU1NfSU5JVF9OVUxM
LCBidXQgd2lsbCBzZXQgdmVyc2lvbiBmaWVsZCBvZgorICogRXZhc19TbWFydF9DbGFzcyAoYmFz
ZSBmaWVsZCkgdG8gbGF0ZXN0IEVWQVNfU01BUlRfQ0xBU1NfVkVSU0lPTiBhbmQgbmFtZQorICog
dG8gdGhlIHNwZWNpZmljIHZhbHVlLgorICoKKyAqIEl0IHdpbGwga2VlcCBhIHJlZmVyZW5jZSB0
byBuYW1lIGZpZWxkIGFzIGEgImNvbnN0IGNoYXIgKiIsIHRoYXQgaXMsCisgKiBuYW1lIG11c3Qg
YmUgYXZhaWxhYmxlIHdoaWxlIHRoZSBzdHJ1Y3R1cmUgaXMgdXNlZCAoaGludDogc3RhdGljIG9y
IGdsb2JhbCEpCisgKiBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCisgKgorICogQHNlZSBFV0tf
VklFV19TTUFSVF9DTEFTU19JTklUX05VTEwKKyAqIEBzZWUgRVdLX1ZJRVdfU01BUlRfQ0xBU1Nf
SU5JVF9WRVJTSU9OCisgKiBAc2VlIEVXS19WSUVXX1NNQVJUX0NMQVNTX0lOSVQKKyAqLworI2Rl
ZmluZSBFV0tfVklFV19TTUFSVF9DTEFTU19JTklUX05BTUVfVkVSU0lPTihuYW1lKSBFV0tfVklF
V19TTUFSVF9DTEFTU19JTklUKEVWQVNfU01BUlRfQ0xBU1NfSU5JVF9OQU1FX1ZFUlNJT04obmFt
ZSkpCisKKy8qKgorICogQGludGVybmFsCisgKgorICogcHJpdmF0ZSBkYXRhIHRoYXQgaXMgdXNl
ZCBpbnRlcm5hbGx5IGJ5IEVGTCBXZWJLaXQgYW5kIHNob3VsZCBuZXZlcgorICogYmUgbW9kaWZp
ZWQgZnJvbSBvdXRzaWRlLgorICovCit0eXBlZGVmIHN0cnVjdCBfRXdrX1ZpZXdfUHJpdmF0ZV9E
YXRhIEV3a19WaWV3X1ByaXZhdGVfRGF0YTsKKworZW51bSBfRXdrX01lbnVfSXRlbV9UeXBlIHsK
KyAgICBFV0tfTUVOVV9TRVBBUkFUT1IsCisgICAgRVdLX01FTlVfR1JPVVAsCisgICAgRVdLX01F
TlVfT1BUSU9OCit9OwordHlwZWRlZiBlbnVtIF9Fd2tfTWVudV9JdGVtX1R5cGUgRXdrX01lbnVf
SXRlbV9UeXBlOworCisKKy8qKgorICogU3RydWN0dXJlIGRvIGNvbnRhaW4gZGF0YSBvZiBlYWNo
IG1lbnUgaXRlbQorICovCit0eXBlZGVmIHN0cnVjdCBfRXdrX01lbnVfSXRlbSBFd2tfTWVudV9J
dGVtOworc3RydWN0IF9Fd2tfTWVudV9JdGVtIHsKKyAgICBjb25zdCBjaGFyICp0ZXh0OyAvKio8
IEl0ZW0ncyB0ZXh0ICovCisgICAgRXdrX01lbnVfSXRlbV9UeXBlIHR5cGU7IC8qKiBJdGVtJ3Mg
dHlwZSAqLworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdG8gY29udGFpbiBQb3B1cCBtZW51IGRh
dGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9Fd2tfTWVudSBFd2tfTWVudTsKK3N0cnVjdCBfRXdr
X01lbnUgeworICAgICAgICBFaW5hX0xpc3QqIGl0ZW1zOworICAgICAgICBpbnQgeDsKKyAgICAg
ICAgaW50IHk7CisgICAgICAgIGludCB3aWR0aDsKKyAgICAgICAgaW50IGhlaWdodDsKK307CisK
Ky8qKgorICogU3RydWN0dXJlIHRvIGNvbnRhaW4gRG93bmxvYWQgZGF0YQorICovCit0eXBlZGVm
IHN0cnVjdCBfRXdrX0Rvd25sb2FkIEV3a19Eb3dubG9hZDsKK3N0cnVjdCBfRXdrX0Rvd25sb2Fk
IHsKKyAgICBjb25zdCBjaGFyKiB1cmw7CisgICAgLyogdG8gYmUgZXh0ZW5kZWQgKi8KK307CisK
Ky8qKgorICogU2Nyb2xsIHJlcXVlc3QgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHN1YmNs
YXNzIGltcGxlbWVudGF0aW9ucy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0V3a19TY3JvbGxfUmVx
dWVzdCBFd2tfU2Nyb2xsX1JlcXVlc3Q7CitzdHJ1Y3QgX0V3a19TY3JvbGxfUmVxdWVzdCB7Cisg
ICAgRXZhc19Db29yZCBkeCwgZHk7CisgICAgRXZhc19Db29yZCB4LCB5LCB3LCBoLCB4MiwgeTI7
CisgICAgRWluYV9Cb29sIG1haW5fc2Nyb2xsOworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdG8g
Y29udGFpbiBpbnRlcm5hbCBWaWV3IGRhdGEsIGl0IGlzIHRvIGJlIGNvbnNpZGVyZWQKKyAqIHBy
aXZhdGUgYnkgdXNlcnMsIGJ1dCBtYXkgYmUgZXh0ZW5kZWQgb3IgY2hhbmdlZCBieSBzdWItY2xh
c3NlcworICogKHRoYXQncyB3aHkgaXQncyBpbiBwdWJsaWMgaGVhZGVyIGZpbGUpLgorICovCitz
dHJ1Y3QgX0V3a19WaWV3X1NtYXJ0X0RhdGEgeworICAgIEV2YXNfT2JqZWN0X1NtYXJ0X0NsaXBw
ZWRfRGF0YSBiYXNlOworICAgIGNvbnN0IEV3a19WaWV3X1NtYXJ0X0NsYXNzICphcGk7IC8qKjwg
cmVmZXJlbmNlIHRvIGNhc3RlZCBjbGFzcyBpbnN0YW5jZSAqLworICAgIEV2YXNfT2JqZWN0ICpz
ZWxmOyAvKio8IHJlZmVyZW5jZSB0byBvd25lciBvYmplY3QgKi8KKyAgICBFdmFzX09iamVjdCAq
bWFpbl9mcmFtZTsgLyoqPCByZWZlcmVuY2UgdG8gbWFpbiBmcmFtZSBvYmplY3QgKi8KKyAgICBF
dmFzX09iamVjdCAqYmFja2luZ19zdG9yZTsgLyoqPCByZWZlcmVuY2UgdG8gYmFja2luZyBzdG9y
ZSAqLworICAgIEV3a19WaWV3X1ByaXZhdGVfRGF0YSAqX3ByaXY7IC8qKjwgc2hvdWxkIG5ldmVy
IGJlIGFjY2Vzc2VkLCBjKysgc3R1ZmYgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBFdmFzX0Nv
b3JkIHgsIHksIHcsIGg7IC8qKjwgbGFzdCB1c2VkIHZpZXdwb3J0ICovCisgICAgfSB2aWV3Owor
ICAgIHN0cnVjdCB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBmbG9hdCBzdGFydDsK
KyAgICAgICAgICAgIGZsb2F0IGVuZDsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnQ7IC8qKjwg
aWYgPiAwLjAsIHRoZW4gZG9pbmcgYW5pbWF0ZWQgem9vbS4gKi8KKyAgICAgICAgfSB6b29tOwor
ICAgIH0gYW5pbWF0ZWRfem9vbTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBjaGFy
IHIsIGcsIGIsIGE7CisgICAgfSBiZ19jb2xvcjsKKyAgICBFaW5hX0Jvb2wgem9vbV93ZWFrX3Nt
b290aF9zY2FsZToxOworICAgIHN0cnVjdCB7IC8qKjwgd2hhdCBjaGFuZ2VkIHNpbmNlIGxhc3Qg
c21hcnRfY2FsY3VsYXRlICovCisgICAgICAgIEVpbmFfQm9vbCBhbnk6MTsKKyAgICAgICAgRWlu
YV9Cb29sIHNpemU6MTsKKyAgICAgICAgRWluYV9Cb29sIHBvc2l0aW9uOjE7CisgICAgICAgIEVp
bmFfQm9vbCBmcmFtZV9yZWN0OjE7CisgICAgfSBjaGFuZ2VkOworfTsKKworRUFQSSBFaW5hX0Jv
b2wgICAgZXdrX3ZpZXdfYmFzZV9zbWFydF9zZXQoRXdrX1ZpZXdfU21hcnRfQ2xhc3MgKmFwaSk7
CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zaW5nbGVfc21hcnRfc2V0KEV3a19WaWV3X1Nt
YXJ0X0NsYXNzICphcGkpOworCitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19zaW5nbGVfYWRk
KEV2YXMgKmUpOworCitFQVBJIHZvaWQgICAgICAgICBld2tfdmlld19maXhlZF9sYXlvdXRfc2l6
ZV9zZXQoRXZhc19PYmplY3QgKm8sIEV2YXNfQ29vcmQgdywgRXZhc19Db29yZCBoKTsKK0VBUEkg
dm9pZCAgICAgICAgIGV3a192aWV3X2ZpeGVkX2xheW91dF9zaXplX2dldChFdmFzX09iamVjdCAq
bywgRXZhc19Db29yZCAqdywgRXZhc19Db29yZCAqaCk7CisKK0VBUEkgdm9pZCAgICAgICAgIGV3
a192aWV3X3RoZW1lX3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAqcGF0aCk7CitFQVBJ
IGNvbnN0IGNoYXIgICpld2tfdmlld190aGVtZV9nZXQoRXZhc19PYmplY3QgKm8pOworCitFQVBJ
IEV2YXNfT2JqZWN0ICpld2tfdmlld19mcmFtZV9tYWluX2dldChjb25zdCBFdmFzX09iamVjdCAq
byk7CitFQVBJIEV2YXNfT2JqZWN0ICpld2tfdmlld19mcmFtZV9mb2N1c2VkX2dldChjb25zdCBF
dmFzX09iamVjdCAqbyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3VyaV9zZXQoRXZh
c19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKnVyaSk7CitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmll
d191cmlfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgY29uc3QgY2hhciAgKmV3a192
aWV3X3RpdGxlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgRWluYV9Cb29sICAg
IGV3a192aWV3X2VkaXRhYmxlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFf
Qm9vbCAgICBld2tfdmlld19lZGl0YWJsZV9zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBl
ZGl0YWJsZSk7CisKK0VBUEkgdm9pZCAgICAgICAgIGV3a192aWV3X2JnX2NvbG9yX3NldChFdmFz
X09iamVjdCAqbywgaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEpOworRUFQSSB2b2lkICAgICAg
ICAgZXdrX3ZpZXdfYmdfY29sb3JfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvLCBpbnQgKnIsIGlu
dCAqZywgaW50ICpiLCBpbnQgKmEpOworCitFQVBJIGNoYXIgICAgICAgICpld2tfdmlld19zZWxl
Y3Rpb25fZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192
aWV3X3NlbGVjdF9ub25lKEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192
aWV3X3NlbGVjdF9hbGwoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfc2VsZWN0X3BhcmFncmFwaChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBl
d2tfdmlld19zZWxlY3Rfc2VudGVuY2UoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wg
ICAgZXdrX3ZpZXdfc2VsZWN0X2xpbmUoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wg
ICAgZXdrX3ZpZXdfc2VsZWN0X3dvcmQoRXZhc19PYmplY3QgKm8pOworCitFQVBJIHZvaWQgICAg
ICAgICBld2tfdmlld19wb3B1cF9zZWxlY3RlZF9zZXQoRXZhc19PYmplY3QgKm8sIGludCBpbmRl
eCk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19wb3B1cF9kZXN0cm95KEV2YXNfT2JqZWN0
ICpvKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfdGV4dF9zZWFyY2goY29uc3QgRXZh
c19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKnN0cmluZywgRWluYV9Cb29sIGNhc2Vfc2Vuc2l0aXZl
LCBFaW5hX0Jvb2wgZm9yd2FyZCwgRWluYV9Cb29sIHdyYXApOworCitFQVBJIHVuc2lnbmVkIGlu
dCBld2tfdmlld190ZXh0X21hdGNoZXNfbWFyayhFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAq
c3RyaW5nLCBFaW5hX0Jvb2wgY2FzZV9zZW5zaXRpdmUsIEVpbmFfQm9vbCBoaWdobGlnaHQsIHVu
c2lnbmVkIGludCBsaW1pdCk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld190ZXh0X21hdGNo
ZXNfdW5tYXJrX2FsbChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d190ZXh0X21hdGNoZXNfaGlnaGxpZ2h0X3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGhp
Z2hsaWdodCk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld190ZXh0X21hdGNoZXNfaGlnaGxp
Z2h0X2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkgZG91YmxlICAgICAgIGV3a192
aWV3X2xvYWRfcHJvZ3Jlc3NfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKKworRUFQSSBFaW5h
X0Jvb2wgICAgZXdrX3ZpZXdfc3RvcChFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAg
ICBld2tfdmlld19yZWxvYWQoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdr
X3ZpZXdfcmVsb2FkX2Z1bGwoRXZhc19PYmplY3QgKm8pOworCitFQVBJIEVpbmFfQm9vbCAgICBl
d2tfdmlld19iYWNrKEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3
X2ZvcndhcmQoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfbmF2
aWdhdGUoRXZhc19PYmplY3QgKm8sIGludCBzdGVwcyk7CisKK0VBUEkgRWluYV9Cb29sICAgIGV3
a192aWV3X2JhY2tfcG9zc2libGUoRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfZm9yd2FyZF9wb3NzaWJsZShFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9v
bCAgICBld2tfdmlld19uYXZpZ2F0ZV9wb3NzaWJsZShFdmFzX09iamVjdCAqbywgaW50IHN0ZXBz
KTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfaGlzdG9yeV9lbmFibGVfZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X2hpc3RvcnlfZW5h
YmxlX3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGVuYWJsZSk7CitFQVBJIEV3a19IaXN0
b3J5ICpld2tfdmlld19oaXN0b3J5X2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CisKK0VBUEkg
ZmxvYXQgICAgICAgIGV3a192aWV3X3pvb21fZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VB
UEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fc2V0KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6
b29tLCBFdmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KTsKKworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfem9vbV93ZWFrX3Ntb290aF9zY2FsZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8p
OworRUFQSSB2b2lkICAgICAgICAgZXdrX3ZpZXdfem9vbV93ZWFrX3Ntb290aF9zY2FsZV9zZXQo
RXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBzbW9vdGhfc2NhbGUpOworCitFQVBJIEVpbmFfQm9v
bCAgICBld2tfdmlld196b29tX3dlYWtfc2V0KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tLCBF
dmFzX0Nvb3JkIGN4LCBFdmFzX0Nvb3JkIGN5KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3
X3pvb21fYW5pbWF0ZWRfbWFya19zdGFydChFdmFzX09iamVjdCAqbywgZmxvYXQgem9vbSk7CitF
QVBJIEVpbmFfQm9vbCAgICBld2tfdmlld196b29tX2FuaW1hdGVkX21hcmtfZW5kKEV2YXNfT2Jq
ZWN0ICpvLCBmbG9hdCB6b29tKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fYW5p
bWF0ZWRfbWFya19jdXJyZW50KEV2YXNfT2JqZWN0ICpvLCBmbG9hdCB6b29tKTsKK0VBUEkgRWlu
YV9Cb29sICAgIGV3a192aWV3X3pvb21fYW5pbWF0ZWRfbWFya19zdG9wKEV2YXNfT2JqZWN0ICpv
KTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfem9vbV9hbmltYXRlZF9zZXQoRXZhc19P
YmplY3QgKm8sIGZsb2F0IHpvb20sIGZsb2F0IGR1cmF0aW9uLCBFdmFzX0Nvb3JkIGN4LCBFdmFz
X0Nvb3JkIGN5KTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3pvb21fdGV4dF9vbmx5X2dl
dChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld196b29t
X3RleHRfb25seV9zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBzZXR0aW5nKTsKKworRUFQ
SSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfcHJlX3JlbmRlcl9yZWdpb24oRXZhc19PYmplY3QgKm8s
IEV2YXNfQ29vcmQgeCwgRXZhc19Db29yZCB5LCBFdmFzX0Nvb3JkIHcsIEV2YXNfQ29vcmQgaCwg
ZmxvYXQgem9vbSk7CitFQVBJIHZvaWQgICAgICAgICBld2tfdmlld19wcmVfcmVuZGVyX2NhbmNl
bChFdmFzX09iamVjdCAqbyk7CisKKy8qIHNldHRpbmdzICovCitFQVBJIGNvbnN0IGNoYXIgICpl
d2tfdmlld19zZXR0aW5nX3VzZXJfYWdlbnRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VB
UEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfdXNlcl9hZ2VudF9zZXQoRXZhc19PYmpl
Y3QgKm8sIGNvbnN0IGNoYXIgKnVzZXJfYWdlbnQpOworCitFQVBJIEVpbmFfQm9vbCAgICBld2tf
dmlld19zZXR0aW5nX2F1dG9fbG9hZF9pbWFnZXNfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsK
K0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfYXV0b19sb2FkX2ltYWdlc19zZXQo
RXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBhdXRvbWF0aWMpOworCitFQVBJIEVpbmFfQm9vbCAg
ICBld2tfdmlld19zZXR0aW5nX2F1dG9fc2hyaW5rX2ltYWdlc19nZXQoY29uc3QgRXZhc19PYmpl
Y3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19hdXRvX3Nocmlua19p
bWFnZXNfc2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgYXV0b21hdGljKTsKKworRUFQSSBF
aW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVfc2NyaXB0c19nZXQoY29uc3QgRXZh
c19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19lbmFibGVf
c2NyaXB0c19zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBlbmFibGUpOworCitFQVBJIEVp
bmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9wbHVnaW5zX2dldChjb25zdCBFdmFz
X09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0aW5nX2VuYWJsZV9w
bHVnaW5zX3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGVuYWJsZSk7CisKK0VBUEkgRWlu
YV9Cb29sICAgIGV3a192aWV3X3NldHRpbmdfc2NyaXB0c193aW5kb3dfb3Blbl9nZXQoY29uc3Qg
RXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19zY3Jp
cHRzX3dpbmRvd19vcGVuX3NldChFdmFzX09iamVjdCAqbywgRWluYV9Cb29sIGFsbG93KTsKKwor
RUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19yZXNpemFibGVfdGV4dGFyZWFzX2dl
dChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmlld19zZXR0
aW5nX3Jlc2l6YWJsZV90ZXh0YXJlYXNfc2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wgZW5h
YmxlKTsKKworRUFQSSBjb25zdCBjaGFyICAqZXdrX3ZpZXdfc2V0dGluZ191c2VyX3N0eWxlc2hl
ZXRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192aWV3
X3NldHRpbmdfdXNlcl9zdHlsZXNoZWV0X3NldChFdmFzX09iamVjdCAqbywgY29uc3QgY2hhciAq
dXJpKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19wcml2YXRlX2Jyb3dz
aW5nX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d19zZXR0aW5nX3ByaXZhdGVfYnJvd3Npbmdfc2V0KEV2YXNfT2JqZWN0ICpvLCBFaW5hX0Jvb2wg
ZW5hYmxlKTsKKworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19jYXJldF9icm93
c2luZ19nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfc2V0dGluZ19jYXJldF9icm93c2luZ19zZXQoRXZhc19PYmplY3QgKm8sIEVpbmFfQm9vbCBl
bmFibGUpOworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2VuY29kaW5nX2N1
c3RvbV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAgZXdrX3Zp
ZXdfc2V0dGluZ19lbmNvZGluZ19jdXN0b21fc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBjaGFy
ICplbmNvZGluZyk7CitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2VuY29kaW5n
X2RlZmF1bHRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3
a192aWV3X3NldHRpbmdfZW5jb2RpbmdfZGVmYXVsdF9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0
IGNoYXIgKmVuY29kaW5nKTsKKworRUFQSSBpbnQgICAgICAgICAgZXdrX3ZpZXdfc2V0dGluZ19m
b250X21pbmltdW1fc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jv
b2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fc2l6ZV9zZXQoRXZhc19PYmplY3Qg
Km8sIGludCBzaXplKTsKK0VBUEkgaW50ICAgICAgICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9t
aW5pbXVtX2xvZ2ljYWxfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5h
X0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21pbmltdW1fbG9naWNhbF9zaXplX3NldChF
dmFzX09iamVjdCAqbywgaW50IHNpemUpOworRUFQSSBpbnQgICAgICAgICAgZXdrX3ZpZXdfc2V0
dGluZ19mb250X2RlZmF1bHRfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBF
aW5hX0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X2RlZmF1bHRfc2l6ZV9zZXQoRXZhc19P
YmplY3QgKm8sIGludCBzaXplKTsKK0VBUEkgaW50ICAgICAgICAgIGV3a192aWV3X3NldHRpbmdf
Zm9udF9tb25vc3BhY2Vfc2l6ZV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5h
X0Jvb2wgICAgZXdrX3ZpZXdfc2V0dGluZ19mb250X21vbm9zcGFjZV9zaXplX3NldChFdmFzX09i
amVjdCAqbywgaW50IHNpemUpOworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5n
X2ZvbnRfc3RhbmRhcmRfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29s
ICAgIGV3a192aWV3X3NldHRpbmdfZm9udF9zdGFuZGFyZF9zZXQoRXZhc19PYmplY3QgKm8sIGNv
bnN0IGNoYXIgKmZhbWlseSk7CisKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdf
Zm9udF9jdXJzaXZlX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAg
ICBld2tfdmlld19zZXR0aW5nX2ZvbnRfY3Vyc2l2ZV9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0
IGNoYXIgKmZhbWlseSk7CisKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9u
dF9tb25vc3BhY2VfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAg
IGV3a192aWV3X3NldHRpbmdfZm9udF9tb25vc3BhY2Vfc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25z
dCBjaGFyICpmYW1pbHkpOworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2Zv
bnRfZmFudGFzeV9nZXQoY29uc3QgRXZhc19PYmplY3QgKm8pOworRUFQSSBFaW5hX0Jvb2wgICAg
ZXdrX3ZpZXdfc2V0dGluZ19mb250X2ZhbnRhc3lfc2V0KEV2YXNfT2JqZWN0ICpvLCBjb25zdCBj
aGFyICpmYW1pbHkpOworCitFQVBJIGNvbnN0IGNoYXIgICpld2tfdmlld19zZXR0aW5nX2ZvbnRf
c2VyaWZfZ2V0KGNvbnN0IEV2YXNfT2JqZWN0ICpvKTsKK0VBUEkgRWluYV9Cb29sICAgIGV3a192
aWV3X3NldHRpbmdfZm9udF9zZXJpZl9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIgKmZh
bWlseSk7CisKK0VBUEkgY29uc3QgY2hhciAgKmV3a192aWV3X3NldHRpbmdfZm9udF9zYW5zX3Nl
cmlmX2dldChjb25zdCBFdmFzX09iamVjdCAqbyk7CitFQVBJIEVpbmFfQm9vbCAgICBld2tfdmll
d19zZXR0aW5nX2ZvbnRfc2Fuc19zZXJpZl9zZXQoRXZhc19PYmplY3QgKm8sIGNvbnN0IGNoYXIg
KmZhbWlseSk7CisKKy8qIHRvIGJlIHVzZWQgYnkgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zICov
CitFQVBJIEV3a19WaWV3X1NtYXJ0X0RhdGEgKmV3a192aWV3X3NtYXJ0X2RhdGFfZ2V0KGNvbnN0
IEV2YXNfT2JqZWN0ICpvKTsKKworRUFQSSBjb25zdCBFaW5hX1JlY3RhbmdsZSAqZXdrX3ZpZXdf
cmVwYWludHNfZ2V0KGNvbnN0IEV3a19WaWV3X1ByaXZhdGVfRGF0YSAqcHJpdiwgc2l6ZV90ICpj
b3VudCk7CitFQVBJIGNvbnN0IEV3a19TY3JvbGxfUmVxdWVzdCAqZXdrX3ZpZXdfc2Nyb2xsX3Jl
cXVlc3RzX2dldChjb25zdCBFd2tfVmlld19Qcml2YXRlX0RhdGEgKnByaXYsIHNpemVfdCAqY291
bnQpOworCitFQVBJIHZvaWQgZXdrX3ZpZXdfcmVwYWludF9hZGQoRXdrX1ZpZXdfUHJpdmF0ZV9E
YXRhICpwcml2LCBFdmFzX0Nvb3JkIHgsIEV2YXNfQ29vcmQgeSwgRXZhc19Db29yZCB3LCBFdmFz
X0Nvb3JkIGgpOworCitFQVBJIHZvaWQgZXdrX3ZpZXdfbGF5b3V0X2lmX25lZWRlZF9yZWN1cnNp
dmUoRXdrX1ZpZXdfUHJpdmF0ZV9EYXRhICpwcml2KTsKKworRUFQSSB2b2lkIGV3a192aWV3X3Nj
cm9sbHNfcHJvY2VzcyhFd2tfVmlld19TbWFydF9EYXRhICpzZCk7CisKKy8qKgorICogU3RydWN0
dXJlIHRoYXQga2VlcHMgcGFpbnQgY29udGV4dC4KKyAqCisgKiBAbm90ZSB0aGlzIGlzIG5vdCBm
b3IgZ2VuZXJhbCB1c2UgYnV0IGp1c3QgZm9yIHN1YmNsYXNzZXMgdGhhdCB3YW50CisgKiAgICAg
ICB0byBkZWZpbmUgdGhlaXIgb3duIGJhY2tpbmcgc3RvcmUuCisgKi8KK3R5cGVkZWYgc3RydWN0
IF9Fd2tfVmlld19QYWludF9Db250ZXh0IEV3a19WaWV3X1BhaW50X0NvbnRleHQ7CisKK0VBUEkg
RXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9uZXcoRXdrX1Zp
ZXdfUHJpdmF0ZV9EYXRhICpwcml2LCBjYWlyb190ICpjcik7CitFQVBJIHZvaWQgZXdrX3ZpZXdf
cGFpbnRfY29udGV4dF9mcmVlKEV3a19WaWV3X1BhaW50X0NvbnRleHQgKmN0eHQpOworCitFQVBJ
IHZvaWQgZXdrX3ZpZXdfcGFpbnRfY29udGV4dF9zYXZlKEV3a19WaWV3X1BhaW50X0NvbnRleHQg
KmN0eHQpOworRUFQSSB2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcmVzdG9yZShFd2tfVmll
d19QYWludF9Db250ZXh0ICpjdHh0KTsKK0VBUEkgdm9pZCBld2tfdmlld19wYWludF9jb250ZXh0
X2NsaXAoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUg
KmFyZWEpOworRUFQSSB2b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnQoRXdrX1ZpZXdf
UGFpbnRfQ29udGV4dCAqY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEpOworRUFQSSB2
b2lkIGV3a192aWV3X3BhaW50X2NvbnRleHRfcGFpbnRfY29udGVudHMoRXdrX1ZpZXdfUGFpbnRf
Q29udGV4dCAqY3R4dCwgY29uc3QgRWluYV9SZWN0YW5nbGUgKmFyZWEpOworRUFQSSB2b2lkIGV3
a192aWV3X3BhaW50X2NvbnRleHRfc2NhbGUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwg
ZmxvYXQgc2NhbGVfeCwgZmxvYXQgc2NhbGVfeSk7CitFQVBJIHZvaWQgZXdrX3ZpZXdfcGFpbnRf
Y29udGV4dF90cmFuc2xhdGUoRXdrX1ZpZXdfUGFpbnRfQ29udGV4dCAqY3R4dCwgZmxvYXQgeCwg
ZmxvYXQgeSk7CisKK0VBUEkgRWluYV9Cb29sIGV3a192aWV3X3BhaW50KEV3a19WaWV3X1ByaXZh
dGVfRGF0YSAqcHJpdiwgY2Fpcm9fdCAqY3IsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlICphcmVhKTsK
K0VBUEkgRWluYV9Cb29sIGV3a192aWV3X3BhaW50X2NvbnRlbnRzKEV3a19WaWV3X1ByaXZhdGVf
RGF0YSAqcHJpdiwgY2Fpcm9fdCAqY3IsIGNvbnN0IEVpbmFfUmVjdGFuZ2xlICphcmVhKTsKKwor
I2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvLyBld2tfdmlld19oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>