<?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>33403</bug_id>
          
          <creation_ts>2010-01-08 14:13:32 -0800</creation_ts>
          <short_desc>[OpenVG] Add (EGL) surface/context management</short_desc>
          <delta_ts>2010-01-21 20:44:09 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>33405</blocked>
    
    <blocked>33987</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Jakob Petsovits">jpetsovits</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>bfulgham</cc>
    
    <cc>efidler</cc>
    
    <cc>joybro201</cc>
    
    <cc>manyoso</cc>
    
    <cc>mario.bensi</cc>
    
    <cc>skyul</cc>
    
    <cc>staikos</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zuh</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>178801</commentid>
    <comment_count>0</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-08 14:13:32 -0800</bug_when>
    <thetext>[OpenVG] Add (EGL) surface/context management</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178805</commentid>
    <comment_count>1</comment_count>
      <attachid>46161</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-08 14:15:27 -0800</bug_when>
    <thetext>Created attachment 46161
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178808</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-01-08 14:23:09 -0800</bug_when>
    <thetext>style-queue ran check-webkit-style on attachment 46161 without any errors.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>178811</commentid>
    <comment_count>3</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-08 14:29:31 -0800</bug_when>
    <thetext>A new port is coming up! I finally got the patches rebased by topic and the lawyers&apos; OK, and this is the first patch in my upcoming series of patches adding OpenVG as a graphics backend. Whoo! Also the first time I&apos;m trying out webkit-patch/bugzilla-tool.

Admittedly also, this patch is not among the nicest patches in that series, which mostly stems from the fact that WebKit likes to keep resources like images, fonts and paths around (garbage collecting them later) and also does not currently pass context information to every graphics-related object there is. In part, EGLDisplayOpenVG is designed to work around these issues; by upstreaming the OpenVG port I also hope to find a cleaner solution to those issues eventually.

The nicer parts take care of using only a single EGL context for different EGL surfaces where available, and provide a nice &amp; clean interface for higher-level code that actually uses OpenVG calls. I&apos;ll wait for opinions for now while preparing the next couple of patches so you can get an idea what that is going to look like :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179368</commentid>
    <comment_count>4</comment_count>
      <attachid>46161</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2010-01-11 08:17:04 -0800</bug_when>
    <thetext>Comment on attachment 46161
Patch

EGLDisplayOpenVG ctor and dtor are marked as public.  These should be private as the static methods control creation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179393</commentid>
    <comment_count>5</comment_count>
      <attachid>46283</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-11 09:30:52 -0800</bug_when>
    <thetext>Created attachment 46283
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179394</commentid>
    <comment_count>6</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-11 09:32:13 -0800</bug_when>
    <thetext>Above patch puts constructor and destructor of EGLDisplayOpenVG into the private section. Good catch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179400</commentid>
    <comment_count>7</comment_count>
      <attachid>46283</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2010-01-11 09:43:36 -0800</bug_when>
    <thetext>Comment on attachment 46283
Patch

Looks good. r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179440</commentid>
    <comment_count>8</comment_count>
      <attachid>46283</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2010-01-11 11:19:43 -0800</bug_when>
    <thetext>Comment on attachment 46283
Patch

WildFox has further comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>179445</commentid>
    <comment_count>9</comment_count>
      <attachid>46283</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-01-11 11:39:44 -0800</bug_when>
    <thetext>Comment on attachment 46283
Patch

Some small comments:

&gt; diff --git a/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.cpp b/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.cpp
&gt; new file mode 100644
&gt; index 0000000..5f0357e
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.cpp
&gt; @@ -0,0 +1,385 @@
&gt; +/*
&gt; + * Copyright (C) Research In Motion Limited 2009. All rights reserved.
Update copyright to include 2010.

&gt; +
&gt; +// File-static variables.
&gt; +static WTF::HashMap&lt;EGLDisplay, EGLDisplayOpenVG*&gt;* s_displayManagers = 0;
&gt; +static EGLDisplayOpenVG* s_current = 0;
Please use static helper functions, containing DEFINE_STATIC_LOCAL macros, see existing code for examples. This is the preferred WebKit style.

&gt; +void EGLDisplayOpenVG::registerPlatformSurface(SurfaceOpenVG* platformSurface)
&gt; +{
&gt; +    EGLDisplayOpenVG* displayManager = EGLDisplayOpenVG::forDisplay(platformSurface-&gt;eglDisplay());
&gt; +    displayManager-&gt;m_platformSurfaces.set(platformSurface-&gt;eglSurface(), platformSurface);
&gt; +}
&gt; +
&gt; +void EGLDisplayOpenVG::unregisterPlatformSurface(SurfaceOpenVG* platformSurface)
&gt; +{
&gt; +    EGLDisplayOpenVG* displayManager = EGLDisplayOpenVG::forDisplay(platformSurface-&gt;eglDisplay());
&gt; +    displayManager-&gt;m_platformSurfaces.remove(platformSurface-&gt;eglSurface());
&gt; +}

It would be certainly nicer, to have inlined helper functions in EGLDisplayOpenVG, hiding the access to m_platformSurfaces.
Would be great, if there&apos;s no need to operatore on other classes member variables.

&gt; +EGLDisplayOpenVG* EGLDisplayOpenVG::forDisplay(EGLDisplay display)
&gt; +{
&gt; +    if (!s_displayManagers)
&gt; +        s_displayManagers = new WTF::HashMap&lt;EGLDisplay, EGLDisplayOpenVG*&gt;();
&gt; +
&gt; +    if (!s_displayManagers-&gt;contains(display))
&gt; +        s_displayManagers-&gt;set(display, new EGLDisplayOpenVG(display));
&gt; +
&gt; +    return s_displayManagers-&gt;get(display);
&gt; +}
Omit WTF:: prefixes, not needed.
Use DEFINE_STATIC_LOCAL for s_displayManagers.

&gt; +EGLDisplayOpenVG::~EGLDisplayOpenVG()
&gt; +{
&gt; +    eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
&gt; +    ASSERT_EGL_NO_ERROR();
&gt; +
&gt; +    delete m_sharedPlatformSurface;
&gt; +
&gt; +    WTF::HashMap&lt;EGLSurface, EGLint&gt;::const_iterator end = m_surfaceConfigIds.end();
&gt; +    for (WTF::HashMap&lt;EGLSurface, EGLint&gt;::const_iterator it = m_surfaceConfigIds.begin(); it != end; ++it)
&gt; +        destroySurface((*it).first);
&gt; +
&gt; +    eglTerminate(m_display);
&gt; +    ASSERT_EGL_NO_ERROR();
&gt; +}
Omit WTF:: prefixes. Won&apos;t repeat this again, just remove them everywhere.

&gt; +void EGLDisplayOpenVG::setDefaultPbufferConfig(EGLConfig config)
How about passing const-references?

&gt; +void EGLDisplayOpenVG::setDefaultWindowConfig(EGLConfig config)
Ditto,

&gt; +EGLSurface EGLDisplayOpenVG::createPbufferSurface(const IntSize&amp; size, EGLConfig config)
&gt; +{
&gt; +    if (!config)
&gt; +        config = defaultPbufferConfig();
Oh EGLConfig, contains operator==? This looks unsafe, on first sight.

&gt; +
&gt; +    m_surfaceConfigIds.set(surface, surfaceConfigId);
How about adding an assertion, that surfaceConfigId, is not yet set?

&gt; +EGLSurface EGLDisplayOpenVG::surfaceForWindow(EGLNativeWindowType wId, const EGLConfig&amp; config)
..
&gt; +    m_surfaceConfigIds.set(surface, surfaceConfigId);
Same here.

&gt; +bool EGLDisplayOpenVG::surfacesCompatible(EGLSurface surface, EGLSurface otherSurface)
Const-references?

&gt; +void EGLDisplayOpenVG::destroySurface(EGLSurface surface)
Ditto.

&gt; +    WTF::HashMap&lt;EGLNativeWindowType, EGLSurface&gt;::iterator end = m_windowSurfaces.end();
&gt; +    for (WTF::HashMap&lt;EGLNativeWindowType, EGLSurface&gt;::iterator it = m_windowSurfaces.begin(); it != end; ++it) {
&gt; +        if ((*it).second == surface)
&gt; +            m_windowSurfaces.remove(it);
&gt; +    }
Hmm, It seems to me a &apos;break&apos; is misssing here?

&gt; +EGLContext EGLDisplayOpenVG::contextForSurface(EGLSurface surface)
Const-references?

&gt; +    m_contexts.set(surfaceConfigId, context);
Assertion regarding existance of surfaceConfigId?

&gt; diff --git a/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.h b/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.h
&gt; new file mode 100644
&gt; index 0000000..7e2127d
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.h
&gt; @@ -0,0 +1,88 @@
&gt; +/*
&gt; + * Copyright (C) Research In Motion Limited 2009. All rights reserved.
2010 is missing.

&gt; +    friend class SurfaceOpenVG;
Would be great to remove the friendship, by modifying the access to the m_platformSurfaces map.

&gt; +    static SurfaceOpenVG* currentSurface();
&gt; +    static void setCurrentDisplay(EGLDisplay display);
&gt; +    static EGLDisplayOpenVG* current();
&gt; +    static EGLDisplayOpenVG* forDisplay(EGLDisplay display);
&gt; +
&gt; +    void setDefaultPbufferConfig(EGLConfig config);
&gt; +    EGLConfig defaultPbufferConfig();
&gt; +    void setDefaultWindowConfig(EGLConfig config);
&gt; +    EGLConfig defaultWindowConfig();
Omit argument names here.

&gt; +
&gt; +    EGLDisplay display() const { return m_display; }
&gt; +    SurfaceOpenVG* sharedPlatformSurface();
&gt; +
&gt; +    /** Creates a pbuffer surface using the given config. If no surface
&gt; +        * could be created, EGL_NO_SURFACE is returned and errors can be
&gt; +        * caught with eglGetError() (respectively ASSERT_EGL_NO_ERROR()). */
Not lined up correctly.

&gt; +    EGLSurface createPbufferSurface(const IntSize&amp; size, EGLConfig config = 0);
&gt; +
&gt; +    EGLSurface surfaceForWindow(EGLNativeWindowType wId, const EGLConfig&amp; config);
&gt; +
&gt; +    bool surfacesCompatible(EGLSurface surface1, EGLSurface otherSurface);
&gt; +
&gt; +    /** Destroy the surface and its corresponding context (unless another
&gt; +     * surface is still using the same context, in which case the context
&gt; +     * is not destroyed). */
&gt; +    void destroySurface(EGLSurface surface);
&gt; +
&gt; +    /** Return the context corresponding to the surface.
&gt; +     * If no corresponding context exists, one is created automatically. */
&gt; +    EGLContext contextForSurface(EGLSurface surface);
Omit argument names.

&gt; diff --git a/WebCore/platform/graphics/openvg/EGLUtils.h b/WebCore/platform/graphics/openvg/EGLUtils.h
&gt; new file mode 100644
&gt; index 0000000..0851b70
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/graphics/openvg/EGLUtils.h
&gt; @@ -0,0 +1,53 @@
&gt; +/*
&gt; + * Copyright (C) Research In Motion Limited 2009. All rights reserved.
Needs an update.

&gt; +#define ASSERT_EGL_NO_ERROR() \
&gt; +    do { \
&gt; +        EGLint error = eglGetError(); \
&gt; +        if (error != EGL_SUCCESS) { \
&gt; +            const char* txt; \
&gt; +            switch (error) { \
&gt; +            case EGL_NOT_INITIALIZED: txt = &quot;EGL_NOT_INITIALIZED&quot;; break;\
&gt; +            case EGL_BAD_ACCESS: txt = &quot;EGL_BAD_ACCESS&quot;; break;\
&gt; +            case EGL_BAD_ALLOC: txt = &quot;EGL_BAD_ALLOC&quot;; break;\
&gt; +            case EGL_BAD_ATTRIBUTE: txt = &quot;EGL_BAD_ATTRIBUTE&quot;; break;\
&gt; +            case EGL_BAD_CONTEXT: txt = &quot;EGL_BAD_CONTEXT&quot;; break;\
&gt; +            case EGL_BAD_CONFIG: txt = &quot;EGL_BAD_CONFIG&quot;; break;\
&gt; +            case EGL_BAD_CURRENT_SURFACE: txt = &quot;EGL_BAD_CURRENT_SURFACE&quot;; break;\
&gt; +            case EGL_BAD_DISPLAY: txt = &quot;EGL_BAD_DISPLAY&quot;; break;\
&gt; +            case EGL_BAD_SURFACE: txt = &quot;EGL_BAD_SURFACE&quot;; break;\
&gt; +            case EGL_BAD_MATCH: txt = &quot;EGL_BAD_MATCH&quot;; break;\
&gt; +            case EGL_BAD_PARAMETER: txt = &quot;EGL_BAD_PARAMETER&quot;; break;\
&gt; +            case EGL_BAD_NATIVE_PIXMAP: txt = &quot;EGL_BAD_NATIVE_PIXMAP&quot;; break;\
&gt; +            case EGL_BAD_NATIVE_WINDOW: txt = &quot;EGL_BAD_NATIVE_WINDOW&quot;; break;\
&gt; +            case EGL_CONTEXT_LOST: txt = &quot;EGL_CONTEXT_LOST&quot;; break;\
&gt; +            default: txt = &quot;UNKNOWN_ERROR&quot;; break;\
&gt; +            } \
&gt; +            WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, &quot;&quot;, &quot;Found %s&quot;, txt); \
&gt; +            CRASH(); \
&gt; +        } \
&gt; +    } while (0)

Eww, this is an ugly part of the patch :-)
Can you move this to a static inline helper function?

&gt; +
&gt; +#endif // EGLUtils_h
This is deprecated, we&apos;re leaving out the // Foo_h parts nowadays.

&gt; diff --git a/WebCore/platform/graphics/openvg/SurfaceOpenVG.cpp b/WebCore/platform/graphics/openvg/SurfaceOpenVG.cpp
&gt; new file mode 100644
&gt; index 0000000..40e9538
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/graphics/openvg/SurfaceOpenVG.cpp
&gt; @@ -0,0 +1,183 @@
&gt; +/*
&gt; + * Copyright (C) Research In Motion Limited 2009. All rights reserved.
Needs an update.

&gt; +SurfaceOpenVG* SurfaceOpenVG::currentSurface()
&gt; +{
&gt; +#if PLATFORM(EGL)
&gt; +    return EGLDisplayOpenVG::currentSurface();
&gt; +#endif
&gt; +}
This will generate an compilation error w/o PLATFORM(EGL). At least add return 0 as fallback.

&gt; +
&gt; +#if PLATFORM(EGL)
&gt; +SurfaceOpenVG::SurfaceOpenVG(const IntSize&amp; size, EGLDisplay display, EGLConfig config)
&gt; +    , m_eglDisplay(display)
&gt; +{
&gt; +    ASSERT(m_eglDisplay != EGL_NO_DISPLAY);
&gt; +
&gt; +    EGLDisplayOpenVG* displayManager = EGLDisplayOpenVG::forDisplay(m_eglDisplay);
&gt; +    if (!config)
&gt; +        config = displayManager-&gt;defaultPbufferConfig();
&gt; +
&gt; +    m_eglSurface = displayManager-&gt;createPbufferSurface(size, config);
&gt; +    if (m_eglSurface == EGL_NO_SURFACE)
&gt; +        return;
&gt; +
&gt; +    m_eglContext = displayManager-&gt;contextForSurface(m_eglSurface);
&gt; +    EGLDisplayOpenVG::registerPlatformSurface(this);
Hm, the &apos;early return&apos; leaves m_eglContext uninitialized. Maybe use default initializers for all, to be safe than sorry.

&gt; +SurfaceOpenVG::SurfaceOpenVG(EGLNativeWindowType window, EGLDisplay display, EGLConfig config)
&gt; +    , m_eglDisplay(display)
&gt; +{
&gt; +    ASSERT(m_eglDisplay != EGL_NO_DISPLAY);
&gt; +
&gt; +    EGLDisplayOpenVG* displayManager = EGLDisplayOpenVG::forDisplay(m_eglDisplay);
&gt; +    if (!config)
&gt; +        config = displayManager-&gt;defaultWindowConfig();
&gt; +
&gt; +    m_eglSurface = displayManager-&gt;surfaceForWindow(window, config);
&gt; +    if (m_eglSurface == EGL_NO_SURFACE)
&gt; +        return;
&gt; +
&gt; +    m_eglContext = displayManager-&gt;contextForSurface(m_eglSurface);
&gt; +    EGLDisplayOpenVG::registerPlatformSurface(this);
&gt; +}
Same comment as above.

&gt; +bool SurfaceOpenVG::isValid() const
&gt; +{
&gt; +#if PLATFORM(EGL)
&gt; +    return (m_eglSurface != EGL_NO_SURFACE);
&gt; +#endif
&gt; +}
&gt; +
&gt; +int SurfaceOpenVG::width() const
&gt; +{
&gt; +#if PLATFORM(EGL)
&gt; +    ASSERT(m_eglSurface != EGL_NO_SURFACE);
&gt; +
&gt; +    EGLint width;
&gt; +    eglQuerySurface(m_eglDisplay, m_eglSurface, EGL_WIDTH, &amp;width);
&gt; +    ASSERT_EGL_NO_ERROR();
&gt; +    return width;
&gt; +#endif
&gt; +}
&gt; +
&gt; +int SurfaceOpenVG::height() const
&gt; +{
&gt; +#if PLATFORM(EGL)
&gt; +    ASSERT(m_eglSurface != EGL_NO_SURFACE);
&gt; +
&gt; +    EGLint height;
&gt; +    eglQuerySurface(m_eglDisplay, m_eglSurface, EGL_HEIGHT, &amp;height);
&gt; +    ASSERT_EGL_NO_ERROR();
&gt; +    return height;
&gt; +#endif
&gt; +}
&gt; +
&gt; +SurfaceOpenVG* SurfaceOpenVG::sharedSurface() const
&gt; +{
&gt; +#if PLATFORM(EGL)
&gt; +    ASSERT(m_eglSurface != EGL_NO_SURFACE);
&gt; +    return EGLDisplayOpenVG::forDisplay(m_eglDisplay)-&gt;sharedPlatformSurface();
&gt; +#endif

Ouch, all these methods need fallbacks for non-egl builds. (Not that it would make any sense to compile these things w/o EGL, it&apos;s still not a good style)

&gt; diff --git a/WebCore/platform/graphics/openvg/SurfaceOpenVG.h b/WebCore/platform/graphics/openvg/SurfaceOpenVG.h
&gt; new file mode 100644
&gt; index 0000000..be76ff0
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/graphics/openvg/SurfaceOpenVG.h
&gt; @@ -0,0 +1,120 @@
&gt; +/*
&gt; + * Copyright (C) Research In Motion Limited 2009. All rights reserved.
Needs an update.

&gt; +
&gt; +#include &lt;wtf/Platform.h&gt;
&gt; +
&gt; +#if PLATFORM(EGL)
&gt; +#include &lt;egl.h&gt;
&gt; +#endif

Swap include order, to avoid a warning from the style bot.

&gt; +#if PLATFORM(EGL)
&gt; +class EGLDisplayOpenVG;
&gt; +#endif
No need to guard class forwards.

&gt; +class SurfaceOpenVG {
This class seems to be used as heap object only, so it might be a wise idea to inherit from Noncopyable.


&gt; +public:
&gt; +    static SurfaceOpenVG* currentSurface();
&gt; +
&gt; +#if PLATFORM(EGL)
&gt; +    friend class EGLDisplayOpenVG;
As I mentioned above, usually friendships should be avoided, unless there&apos;s an intrinsic reason.

&gt; +    SurfaceOpenVG(const IntSize&amp; size, EGLDisplay display, EGLConfig config = 0);
&gt; +    SurfaceOpenVG(EGLNativeWindowType window, EGLDisplay display, EGLConfig config = 0);
Omit argument names here.

&gt; +} // namespace WebCore
&gt; +
&gt; +#endif // SurfaceOpenVG_h

The trailing // comments are deprecated nowadays. Please remove.

&gt; diff --git a/WebCore/platform/graphics/openvg/VGUtils.h b/WebCore/platform/graphics/openvg/VGUtils.h
&gt; new file mode 100644
&gt; index 0000000..9b55de9
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/graphics/openvg/VGUtils.h
&gt; @@ -0,0 +1,47 @@
&gt; +/*
&gt; + * Copyright (C) Research In Motion Limited 2009. All rights reserved.
Needs an update.
&gt; +
&gt; +#define ASSERT_VG_NO_ERROR() \
&gt; +    do { \
&gt; +        VGErrorCode error = vgGetError(); \
&gt; +        if (error != VG_NO_ERROR) { \
&gt; +            const char* txt; \
&gt; +            switch (error) { \
&gt; +            case VG_BAD_HANDLE_ERROR: txt = &quot;VG_BAD_HANDLE_ERROR&quot;; break;\
&gt; +            case VG_ILLEGAL_ARGUMENT_ERROR: txt = &quot;VG_ILLEGAL_ARGUMENT_ERROR&quot;; break;\
&gt; +            case VG_OUT_OF_MEMORY_ERROR: txt = &quot;VG_OUT_OF_MEMORY_ERROR&quot;; break;\
&gt; +            case VG_PATH_CAPABILITY_ERROR: txt = &quot;VG_PATH_CAPABILITY_ERROR&quot;; break;\
&gt; +            case VG_UNSUPPORTED_IMAGE_FORMAT_ERROR: txt = &quot;VG_UNSUPPORTED_IMAGE_FORMAT_ERROR&quot;; break;\
&gt; +            case VG_UNSUPPORTED_PATH_FORMAT_ERROR: txt = &quot;VG_UNSUPPORTED_PATH_FORMAT_ERROR&quot;; break;\
&gt; +            case VG_IMAGE_IN_USE_ERROR: txt = &quot;VG_IMAGE_IN_USE_ERROR&quot;; break;\
&gt; +            case VG_NO_CONTEXT_ERROR: txt = &quot;VG_NO_CONTEXT_ERROR&quot;; break;\
&gt; +            default: txt = &quot;UNKNOWN_ERROR&quot;; break;\
&gt; +            } \
&gt; +            WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, &quot;&quot;, &quot;Found %s&quot;, txt); \
&gt; +            CRASH(); \
&gt; +        } \
&gt; +    } while (0)
&gt; +
Would be great to move this in a static inline helper function, as well.

Sorry for the long list of comments :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180385</commentid>
    <comment_count>10</comment_count>
      <attachid>46498</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-13 13:41:05 -0800</bug_when>
    <thetext>Created attachment 46498
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>180417</commentid>
    <comment_count>11</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-13 14:48:25 -0800</bug_when>
    <thetext>(In reply to comment #9)

Lots of good points there. The updated patch should take care of most of them, but I have some questions or remarks on the remaining ones.

&gt; &gt; +
&gt; &gt; +// File-static variables.
&gt; &gt; +static WTF::HashMap&lt;EGLDisplay, EGLDisplayOpenVG*&gt;* s_displayManagers = 0;
&gt; &gt; +static EGLDisplayOpenVG* s_current = 0;
&gt; Please use static helper functions, containing DEFINE_STATIC_LOCAL macros, see
&gt; existing code for examples. This is the preferred WebKit style.

I used it for s_displayManagers now, but s_current is still a regular file-static variable as it contains an actual pointer that can change, rather than a persistent static object. Using DEFINE_STATIC_LOCAL for s_current would mean returning a double-pointer from its helper function, and that&apos;s clumsy and less readable.

&gt; &gt; +void EGLDisplayOpenVG::registerPlatformSurface(SurfaceOpenVG* platformSurface)
&gt; &gt; +{
&gt; &gt; +    EGLDisplayOpenVG* displayManager = EGLDisplayOpenVG::forDisplay(platformSurface-&gt;eglDisplay());
&gt; &gt; +    displayManager-&gt;m_platformSurfaces.set(platformSurface-&gt;eglSurface(), platformSurface);
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +void EGLDisplayOpenVG::unregisterPlatformSurface(SurfaceOpenVG* platformSurface)
&gt; &gt; +{
&gt; &gt; +    EGLDisplayOpenVG* displayManager = EGLDisplayOpenVG::forDisplay(platformSurface-&gt;eglDisplay());
&gt; &gt; +    displayManager-&gt;m_platformSurfaces.remove(platformSurface-&gt;eglSurface());
&gt; &gt; +}
&gt; 
&gt; It would be certainly nicer, to have inlined helper functions in
&gt; EGLDisplayOpenVG, hiding the access to m_platformSurfaces.
&gt; Would be great, if there&apos;s no need to operatore on other classes member
&gt; variables.

Certainly possible, although I&apos;m really not convinced of the value or readability of two methods that perform a single-liner each. Mind that the functions above don&apos;t actually operate on other classes&apos; member variables, both the (static) methods and the m_platformSurfaces variable belong to EGLDisplayOpenVG itself. Imho a single class should know how to deal with its own member variables without requiring trivial wrapper methods, even from static methods.

&gt; &gt; +void EGLDisplayOpenVG::setDefaultPbufferConfig(EGLConfig config)
&gt; How about passing const-references?
&gt;
&gt; &gt; +void EGLDisplayOpenVG::setDefaultWindowConfig(EGLConfig config)
&gt; Ditto,
&gt; 
&gt; &gt; +EGLSurface EGLDisplayOpenVG::createPbufferSurface(const IntSize&amp; size, EGLConfig config)
&gt; &gt; +{
&gt; &gt; +    if (!config)
&gt; &gt; +        config = defaultPbufferConfig();
&gt; Oh EGLConfig, contains operator==? This looks unsafe, on first sight.

This point was kinda ambiguous to me. Usually all EGL (and VG) handles are defined as void* or similar, so in real-world EGL implementations you wouldn&apos;t actually pass an actual instance as is. Same thing with operator==(), which is not taken into account because config is actually a pointer.

That said, I looked it up in the EGL specification (1.2, which is the minimum required version for this code) and it doesn&apos;t specify that types like EGLConfig, EGLSurface etc. are actually primitive types, so theoretically implementations could still define these types as actual class types. I reworked some pieces involving EGLConfig objects so that the code now relies more on config ids (being plain integers) internally, instead of actual config objects. Parameters have been constified where appropriate.

&gt; &gt; diff --git a/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.h b/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.h
&gt; &gt; new file mode 100644
&gt; &gt; index 0000000..7e2127d
&gt; &gt; --- /dev/null
&gt; &gt; +++ b/WebCore/platform/graphics/openvg/EGLDisplayOpenVG.h
&gt; &gt; +    friend class SurfaceOpenVG;
&gt; Would be great to remove the friendship, by modifying the access to the
&gt; m_platformSurfaces map.

I&apos;m not sure what exactly you&apos;ve got in mind here, please detail your suggestion. The purpose of this friendship is to enable SurfaceOpenVG to [un]register in the m_platformSurfaces map, and I wanted to make it very clear that the API user is not supposed to call [un]registerPlatformSurface() by herself. The friendship enables me to enforce that, whereas if I make those two methods public then there&apos;s the chance that somebody will misunderstand the API and call it manually.

Personally, I think the gain in safety towards outside users is more important than  removing a friendship between two classes that know each other very well and need to interact tightly anyways.

&gt; &gt; diff --git a/WebCore/platform/graphics/openvg/EGLUtils.h b/WebCore/platform/graphics/openvg/EGLUtils.h
&gt; &gt; new file mode 100644
&gt; &gt; index 0000000..0851b70
&gt; &gt; --- /dev/null
&gt; &gt; +++ b/WebCore/platform/graphics/openvg/EGLUtils.h
&gt; &gt; @@ -0,0 +1,53 @@
&gt; &gt; +/*
&gt; &gt; + * Copyright (C) Research In Motion Limited 2009. All rights reserved.
&gt; Needs an update.

There&apos;s now a 2010 copyright in all the files because I updated them with your suggestions (and consider them &quot;significant changes&quot; in each), but I wanted to stress that copyright applies to the year when the code was written, not when it was released to the public. Therefore, the 2009 mentions above were correct in the initial patch.

I also noticed that I forgot to add them for EGLUtils/VGUtils in the new patch, but have them in my working copy, so they will be going into any subsequent patches or landings. I won&apos;t bother uploading a whole new patch just for that minor detail when there&apos;s good chances it&apos;ll still be modified anyways.

&gt; &gt; +#define ASSERT_EGL_NO_ERROR() \
&gt; &gt; +    do { \
&gt; &gt; +        EGLint error = eglGetError(); \
&gt; &gt; +        if (error != EGL_SUCCESS) { \
&gt; &gt; +            const char* txt; \
&gt; &gt; +            switch (error) { \
&gt; &gt; +            case EGL_NOT_INITIALIZED: txt = &quot;EGL_NOT_INITIALIZED&quot;; break;\
&gt; &gt; +            case EGL_BAD_ACCESS: txt = &quot;EGL_BAD_ACCESS&quot;; break;\
&gt; &gt; +            case EGL_BAD_ALLOC: txt = &quot;EGL_BAD_ALLOC&quot;; break;\
&gt; &gt; +            case EGL_BAD_ATTRIBUTE: txt = &quot;EGL_BAD_ATTRIBUTE&quot;; break;\
&gt; &gt; +            case EGL_BAD_CONTEXT: txt = &quot;EGL_BAD_CONTEXT&quot;; break;\
&gt; &gt; +            case EGL_BAD_CONFIG: txt = &quot;EGL_BAD_CONFIG&quot;; break;\
&gt; &gt; +            case EGL_BAD_CURRENT_SURFACE: txt = &quot;EGL_BAD_CURRENT_SURFACE&quot;; break;\
&gt; &gt; +            case EGL_BAD_DISPLAY: txt = &quot;EGL_BAD_DISPLAY&quot;; break;\
&gt; &gt; +            case EGL_BAD_SURFACE: txt = &quot;EGL_BAD_SURFACE&quot;; break;\
&gt; &gt; +            case EGL_BAD_MATCH: txt = &quot;EGL_BAD_MATCH&quot;; break;\
&gt; &gt; +            case EGL_BAD_PARAMETER: txt = &quot;EGL_BAD_PARAMETER&quot;; break;\
&gt; &gt; +            case EGL_BAD_NATIVE_PIXMAP: txt = &quot;EGL_BAD_NATIVE_PIXMAP&quot;; break;\
&gt; &gt; +            case EGL_BAD_NATIVE_WINDOW: txt = &quot;EGL_BAD_NATIVE_WINDOW&quot;; break;\
&gt; &gt; +            case EGL_CONTEXT_LOST: txt = &quot;EGL_CONTEXT_LOST&quot;; break;\
&gt; &gt; +            default: txt = &quot;UNKNOWN_ERROR&quot;; break;\
&gt; &gt; +            } \
&gt; &gt; +            WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, &quot;&quot;, &quot;Found %s&quot;, txt); \
&gt; &gt; +            CRASH(); \
&gt; &gt; +        } \
&gt; &gt; +    } while (0)
&gt; 
&gt; Eww, this is an ugly part of the patch :-)
&gt; Can you move this to a static inline helper function?

I have a workable solution now as discussed on IRC, hope this one&apos;s ok for you :)

&gt; &gt; +SurfaceOpenVG* SurfaceOpenVG::currentSurface()
&gt; &gt; +{
&gt; &gt; +#if PLATFORM(EGL)
&gt; &gt; +    return EGLDisplayOpenVG::currentSurface();
&gt; &gt; +#endif
&gt; &gt; +}
&gt; This will generate an compilation error w/o PLATFORM(EGL). At least add return 0 as fallback.

I disagree. This was done intentionally, because I strongly believe that code that is known not to work should fail as soon as possible, in this case as compiler warning or error. We know that without a context/surface backend, OpenVG will fail terribly, if there&apos;s a compiler error then that&apos;s a direct pointer to the programmer that says &quot;you need to implement this before your code can possibly work&quot;.

Apart from adding unused lines to the file, an #else path also gives the impression that there is an actual alternative, and makes it harder to find the places that need to be filled out for non-EGL ports. I am not convinced that making style improvements (are they actual improvements really?) is worth dropping the advantages of well-placed compiler errors.

&gt; &gt; diff --git a/WebCore/platform/graphics/openvg/SurfaceOpenVG.h b/WebCore/platform/graphics/openvg/SurfaceOpenVG.h
&gt; &gt; new file mode 100644
&gt; &gt; index 0000000..be76ff0
&gt; &gt; --- /dev/null
&gt; &gt; +++ b/WebCore/platform/graphics/openvg/SurfaceOpenVG.h
&gt; &gt; +#if PLATFORM(EGL)
&gt; &gt; +class EGLDisplayOpenVG;
&gt; &gt; +#endif
&gt; No need to guard class forwards.

But also no harm? Putting this in an ifdef tells the reader at first glance that this is not relevant for anything other than EGL, and is also handy when I grep for PLATFORM(EGL) in order to find all the EGL dependencies.

&gt; &gt; +public:
&gt; &gt; +    static SurfaceOpenVG* currentSurface();
&gt; &gt; +
&gt; &gt; +#if PLATFORM(EGL)
&gt; &gt; +    friend class EGLDisplayOpenVG;
&gt; As I mentioned above, usually friendships should be avoided, unless there&apos;s an
&gt; intrinsic reason.

Same as with the other friendship I explained above - I want to make really sure no one will be calling the constructor that only EGLDisplayOpenVG is going to call. (And that one is necessary because EGLDisplayOpenVG creates the first, shared surface which is the only one that does not refer to another surface for sharing resources.) Friendships are usually to be avoided, but I still find them nicer than API users being able to access stuff that they really should not have access to.

&gt; &gt; +    SurfaceOpenVG(const IntSize&amp; size, EGLDisplay display, EGLConfig config = 0);
&gt; &gt; +    SurfaceOpenVG(EGLNativeWindowType window, EGLDisplay display, EGLConfig config = 0);
&gt; Omit argument names here.

I think those argument names make a good point of what&apos;s the difference between those two constructors, and therefore are good for readability. I left them in the updated patch, but if you do insist on it, I can take them out, it&apos;s not something I&apos;m going to fight about.

&gt; Sorry for the long list of comments :-)

That&apos;s alright, it&apos;s great to get a thorough review :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181364</commentid>
    <comment_count>12</comment_count>
      <attachid>46710</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-15 13:42:04 -0800</bug_when>
    <thetext>Created attachment 46710
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>181366</commentid>
    <comment_count>13</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-15 13:45:37 -0800</bug_when>
    <thetext>Spoke to Niko on IRC, the above patch goes a middle way between his original comments and my replies and should hopefully satisfy Niko&apos;s demands.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182343</commentid>
    <comment_count>14</comment_count>
      <attachid>46930</attachid>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-19 11:33:51 -0800</bug_when>
    <thetext>Created attachment 46930
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182345</commentid>
    <comment_count>15</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-19 11:35:35 -0800</bug_when>
    <thetext>Yay, more style fixes suggested by Niko! By now it should really be ok, I hope. Thanks for the reviews!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182362</commentid>
    <comment_count>16</comment_count>
      <attachid>46930</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2010-01-19 12:02:32 -0800</bug_when>
    <thetext>Comment on attachment 46930
Patch

Looks great, some small style fixes remaining, please fix before landing:


&gt; +        static const EGLint configAttribs[] = {
&gt; +            EGL_RED_SIZE, 8,
....
&gt; +            EGL_NONE };

The }; needs to go in another line, aligned with the &quot;static const&quot; prefix.
There are several places in the patch that need to be fixed.


&gt; +    WTF::HashMap&lt;EGLSurface, SurfaceOpenVG*&gt; m_platformSurfaces;
&gt; +    WTF::HashMap&lt;EGLNativeWindowType, EGLSurface&gt; m_windowSurfaces;
&gt; +    WTF::HashMap&lt;EGLSurface, EGLint&gt; m_surfaceConfigIds;
&gt; +    WTF::HashMap&lt;EGLint, EGLint&gt; m_compatibleConfigIds;
&gt; +    WTF::HashMap&lt;EGLint, EGLContext&gt; m_contexts;

Remove WTF:: prefixes. HashMap uses &quot;using WTF::HashMap&quot;, so it&apos;s available in all namespaces.
Thanks for the patience... r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182478</commentid>
    <comment_count>17</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-19 15:09:39 -0800</bug_when>
    <thetext>Committed r53499: &lt;http://trac.webkit.org/changeset/53499&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182479</commentid>
    <comment_count>18</comment_count>
    <who name="Jakob Petsovits">jpetsovits</who>
    <bug_when>2010-01-19 15:14:07 -0800</bug_when>
    <thetext>Alright! OpenVG stuff to be continued in bug 33405. See you there!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46161</attachid>
            <date>2010-01-08 14:15:27 -0800</date>
            <delta_ts>2010-01-11 09:30:43 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-33403-20100108171522.patch</filename>
            <type>text/plain</type>
            <size>35067</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmQ4OTFiZC4uY2NjZTg4OCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2MiBAQAorMjAxMC0wMS0wOCAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFtPcGVuVkddIEFkZCAoRUdMKSBzdXJmYWNlL2NvbnRleHQgbWFu
YWdlbWVudAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MzM0MDMKKworICAgICAgICBUaGUgZm91bmRhdGlvbnMgZm9yIGEgbmV3IE9wZW5WRyBwb3J0Lgor
CisgICAgICAgIE9wZW5WRyBpcyBub3QgdGllZCB0byBFR0wgcGVyIHNlLCBFR0wganVzdCBoYXBw
ZW5zIHRvIGJlCisgICAgICAgIHRoZSBvbmx5IHVzYWJsZSBiYWNrZW5kIGZvciBPcGVuVkcgc3Rh
dGUgYW5kIHBhaW50aW5nLgorCisgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBTdXJmYWNlT3Bl
blZHIGNsYXNzIGlzIHRvIHByb3ZpZGUKKyAgICAgICAgYW4gRUdMLWluZGVwZW5kZW50IGludGVy
ZmFjZSBmb3IgT3BlblZHLXNwZWNpZmljIGNvZGUuCisgICAgICAgIFRoZSBFR0xEaXNwbGF5T3Bl
blZHIGNsYXNzIHRha2VzIGNhcmUgb2Yga2VlcGluZyB0cmFjaworICAgICAgICBvZiBFR0wgZGlz
cGxheXMsIHN1cmZhY2VzIGFuZCBjb250ZXh0cy4gSXQgYWxzbyBtYWtlcworICAgICAgICBzdXJl
IHRoYXQgYWxsIGNyZWF0ZWQgY29udGV4dHMgYXJlIGludGVyb3BlcmFibGUsIGFuZAorICAgICAg
ICB0aGF0IGRpZmZlcmVudCBzdXJmYWNlcyB1c2UgYSBzaW5nbGUgY29udGV4dCBpZiBwb3NzaWJs
ZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZH
LmNwcDogQWRkZWQuCisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50U3VyZmFjZSk6
CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpyZWdpc3RlclBsYXRmb3JtU3VyZmFjZSk6Cisg
ICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjp1bnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKToKKyAg
ICAgICAgKEVHTERpc3BsYXlPcGVuVkc6OnNldEN1cnJlbnREaXNwbGF5KToKKyAgICAgICAgKEVH
TERpc3BsYXlPcGVuVkc6OmN1cnJlbnQpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6Zm9y
RGlzcGxheSk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpFR0xEaXNwbGF5T3BlblZHKToK
KyAgICAgICAgKEVHTERpc3BsYXlPcGVuVkc6On5FR0xEaXNwbGF5T3BlblZHKToKKyAgICAgICAg
KEVHTERpc3BsYXlPcGVuVkc6OnNldERlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKEVH
TERpc3BsYXlPcGVuVkc6OmRlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKEVHTERpc3Bs
YXlPcGVuVkc6OnNldERlZmF1bHRXaW5kb3dDb25maWcpOgorICAgICAgICAoRUdMRGlzcGxheU9w
ZW5WRzo6ZGVmYXVsdFdpbmRvd0NvbmZpZyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpz
aGFyZWRQbGF0Zm9ybVN1cmZhY2UpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6Y3JlYXRl
UGJ1ZmZlclN1cmZhY2UpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZUZvcldp
bmRvdyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpzdXJmYWNlc0NvbXBhdGlibGUpOgor
ICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6ZGVzdHJveVN1cmZhY2UpOgorICAgICAgICAoRUdM
RGlzcGxheU9wZW5WRzo6Y29udGV4dEZvclN1cmZhY2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6RUdMRGlzcGxheU9wZW5WRzo6ZGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL0VHTFV0aWxzLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9TdXJmYWNlT3BlblZHLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTdXJm
YWNlT3BlblZHOjpjdXJyZW50U3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjptX2VnbERpc3Bs
YXkpOgorICAgICAgICAoV2ViQ29yZTo6bV9lZ2xDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlN1cmZhY2VPcGVuVkc6On5TdXJmYWNlT3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZh
Y2VPcGVuVkc6OmlzVmFsaWQpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6d2lk
dGgpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6aGVpZ2h0KToKKyAgICAgICAg
KFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6OnNoYXJlZFN1cmZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6U3VyZmFjZU9wZW5WRzo6bWFrZUN1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFj
ZU9wZW5WRzo6bWFrZUNvbXBhdGlibGVDdXJyZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZh
Y2VPcGVuVkc6OmZsdXNoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3Vy
ZmFjZU9wZW5WRy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6OmVn
bERpc3BsYXkpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6ZWdsU3VyZmFjZSk6
CisgICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjplZ2xDb250ZXh0KToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvVkdVdGlscy5oOiBBZGRlZC4KKwogMjAxMC0wMS0w
NyAgQ2hyaXN0aWFuIFNlamVyc2VuICA8Y2hyaXN0aWFuLndlYmtpdEBnbWFpbC5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjVmMDM1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmNwcApAQCAtMCwwICsxLDM4
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAw
OS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkVH
TERpc3BsYXlPcGVuVkcuaCIKKworI2luY2x1ZGUgIkVHTFV0aWxzLmgiCisjaW5jbHVkZSAiSW50
U2l6ZS5oIgorI2luY2x1ZGUgIlN1cmZhY2VPcGVuVkcuaCIKKworI2luY2x1ZGUgPHd0Zi9Bc3Nl
cnRpb25zLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCisvLyBGaWxlLXN0YXRpYyB2
YXJpYWJsZXMuCitzdGF0aWMgV1RGOjpIYXNoTWFwPEVHTERpc3BsYXksIEVHTERpc3BsYXlPcGVu
VkcqPiogc19kaXNwbGF5TWFuYWdlcnMgPSAwOworc3RhdGljIEVHTERpc3BsYXlPcGVuVkcqIHNf
Y3VycmVudCA9IDA7CisKKworLy8gU3RhdGljIGNsYXNzIG1lbWJlcnMuCisKK1N1cmZhY2VPcGVu
VkcqIEVHTERpc3BsYXlPcGVuVkc6OmN1cnJlbnRTdXJmYWNlKCkKK3sKKyAgICBpZiAoIXNfZGlz
cGxheU1hbmFnZXJzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEVHTERpc3BsYXkgY3VycmVu
dERpc3BsYXkgPSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpOworICAgIGlmIChjdXJyZW50RGlzcGxh
eSA9PSBFR0xfTk9fRElTUExBWSB8fCAhc19kaXNwbGF5TWFuYWdlcnMtPmNvbnRhaW5zKGN1cnJl
bnREaXNwbGF5KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBFR0xEaXNwbGF5T3BlblZHKiBk
aXNwbGF5TWFuYWdlciA9IHNfZGlzcGxheU1hbmFnZXJzLT5nZXQoY3VycmVudERpc3BsYXkpOwor
ICAgIEVHTFN1cmZhY2UgY3VycmVudFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xf
RFJBVyk7CisKKyAgICBpZiAoY3VycmVudFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UgfHwgIWRp
c3BsYXlNYW5hZ2VyLT5tX3BsYXRmb3JtU3VyZmFjZXMuY29udGFpbnMoY3VycmVudFN1cmZhY2Up
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBkaXNwbGF5TWFuYWdlci0+bV9wbGF0
Zm9ybVN1cmZhY2VzLmdldChjdXJyZW50U3VyZmFjZSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9w
ZW5WRzo6cmVnaXN0ZXJQbGF0Zm9ybVN1cmZhY2UoU3VyZmFjZU9wZW5WRyogcGxhdGZvcm1TdXJm
YWNlKQoreworICAgIEVHTERpc3BsYXlPcGVuVkcqIGRpc3BsYXlNYW5hZ2VyID0gRUdMRGlzcGxh
eU9wZW5WRzo6Zm9yRGlzcGxheShwbGF0Zm9ybVN1cmZhY2UtPmVnbERpc3BsYXkoKSk7CisgICAg
ZGlzcGxheU1hbmFnZXItPm1fcGxhdGZvcm1TdXJmYWNlcy5zZXQocGxhdGZvcm1TdXJmYWNlLT5l
Z2xTdXJmYWNlKCksIHBsYXRmb3JtU3VyZmFjZSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5W
Rzo6dW5yZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZHKiBwbGF0Zm9ybVN1cmZh
Y2UpCit7CisgICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5
T3BlblZHOjpmb3JEaXNwbGF5KHBsYXRmb3JtU3VyZmFjZS0+ZWdsRGlzcGxheSgpKTsKKyAgICBk
aXNwbGF5TWFuYWdlci0+bV9wbGF0Zm9ybVN1cmZhY2VzLnJlbW92ZShwbGF0Zm9ybVN1cmZhY2Ut
PmVnbFN1cmZhY2UoKSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6c2V0Q3VycmVudERp
c3BsYXkoRUdMRGlzcGxheSBkaXNwbGF5KQoreworICAgIHNfY3VycmVudCA9IEVHTERpc3BsYXlP
cGVuVkc6OmZvckRpc3BsYXkoZGlzcGxheSk7Cit9CisKK0VHTERpc3BsYXlPcGVuVkcqIEVHTERp
c3BsYXlPcGVuVkc6OmN1cnJlbnQoKQoreworICAgIGlmICghc19jdXJyZW50KSB7CisgICAgICAg
IEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7
CisgICAgICAgIGVnbEluaXRpYWxpemUoZGlzcGxheSwgMCwgMCk7CisgICAgICAgIEFTU0VSVF9F
R0xfTk9fRVJST1IoKTsKKworICAgICAgICBzX2N1cnJlbnQgPSBFR0xEaXNwbGF5T3BlblZHOjpm
b3JEaXNwbGF5KGRpc3BsYXkpOworICAgIH0KKyAgICByZXR1cm4gc19jdXJyZW50OworfQorCitF
R0xEaXNwbGF5T3BlblZHKiBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KEVHTERpc3BsYXkg
ZGlzcGxheSkKK3sKKyAgICBpZiAoIXNfZGlzcGxheU1hbmFnZXJzKQorICAgICAgICBzX2Rpc3Bs
YXlNYW5hZ2VycyA9IG5ldyBXVEY6Okhhc2hNYXA8RUdMRGlzcGxheSwgRUdMRGlzcGxheU9wZW5W
Ryo+KCk7CisKKyAgICBpZiAoIXNfZGlzcGxheU1hbmFnZXJzLT5jb250YWlucyhkaXNwbGF5KSkK
KyAgICAgICAgc19kaXNwbGF5TWFuYWdlcnMtPnNldChkaXNwbGF5LCBuZXcgRUdMRGlzcGxheU9w
ZW5WRyhkaXNwbGF5KSk7CisKKyAgICByZXR1cm4gc19kaXNwbGF5TWFuYWdlcnMtPmdldChkaXNw
bGF5KTsKK30KKworCisvLyBPYmplY3QvaW5zdGFuY2UgbWVtYmVycy4KKworRUdMRGlzcGxheU9w
ZW5WRzo6RUdMRGlzcGxheU9wZW5WRyhFR0xEaXNwbGF5IGRpc3BsYXkpCisgICAgOiBtX2Rpc3Bs
YXkoZGlzcGxheSkKKyAgICAsIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlKDApCisgICAgLCBtX3Bi
dWZmZXJDb25maWcoMCkKKyAgICAsIG1fd2luZG93Q29uZmlnKDApCit7CisgICAgZWdsQmluZEFQ
SShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworfQorCitFR0xE
aXNwbGF5T3BlblZHOjp+RUdMRGlzcGxheU9wZW5WRygpCit7CisgICAgZWdsTWFrZUN1cnJlbnQo
bV9kaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhU
KTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisKKyAgICBkZWxldGUgbV9zaGFyZWRQbGF0
Zm9ybVN1cmZhY2U7CisKKyAgICBXVEY6Okhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50Pjo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gbV9zdXJmYWNlQ29uZmlnSWRzLmVuZCgpOworICAgIGZvciAoV1RG
OjpIYXNoTWFwPEVHTFN1cmZhY2UsIEVHTGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9zdXJm
YWNlQ29uZmlnSWRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgZGVzdHJveVN1
cmZhY2UoKCppdCkuZmlyc3QpOworCisgICAgZWdsVGVybWluYXRlKG1fZGlzcGxheSk7CisgICAg
QVNTRVJUX0VHTF9OT19FUlJPUigpOworfQorCit2b2lkIEVHTERpc3BsYXlPcGVuVkc6OnNldERl
ZmF1bHRQYnVmZmVyQ29uZmlnKEVHTENvbmZpZyBjb25maWcpCit7CisgICAgbV9wYnVmZmVyQ29u
ZmlnID0gY29uZmlnOworfQorCitFR0xDb25maWcgRUdMRGlzcGxheU9wZW5WRzo6ZGVmYXVsdFBi
dWZmZXJDb25maWcoKQoreworICAgIC8vIEhvcGVmdWxseSB0aGUgY2xpZW50IHdpbGwgaGF2ZSBz
ZXQgdGhlIHBidWZmZXIgY29uZmlnIG9mIGl0cyBjaG9pY2UKKyAgICAvLyBieSBub3cgLSBpZiBu
b3QsIHVzZSBhIDMyLWJpdCBnZW5lcmljIG9uZSBhcyBkZWZhdWx0LgorICAgIGlmICghbV9wYnVm
ZmVyQ29uZmlnKSB7CisgICAgICAgIEVHTGludCBudW1Db25maWdzOworCisgICAgICAgIHN0YXRp
YyBjb25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgICAgRUdMX1JFRF9T
SVpFLCAgIDgsCisgICAgICAgICAgICBFR0xfR1JFRU5fU0laRSwgOCwKKyAgICAgICAgICAgIEVH
TF9CTFVFX1NJWkUsICA4LAorICAgICAgICAgICAgRUdMX0FMUEhBX1NJWkUsIDgsCisgICAgICAg
ICAgICBFR0xfQUxQSEFfTUFTS19TSVpFLCAxLAorICAgICAgICAgICAgRUdMX0xVTUlOQU5DRV9T
SVpFLCAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgIEVH
TF9QQlVGRkVSX0JJVCwKKyAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVO
VkdfQklULAorICAgICAgICAgICAgRUdMX05PTkUgfTsKKworICAgICAgICBlZ2xDaG9vc2VDb25m
aWcobV9kaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmbV9wYnVmZmVyQ29uZmlnLCAxLCAmbnVtQ29u
Zmlncyk7CisgICAgICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyAgICAgICAgQVNTRVJUKG51
bUNvbmZpZ3MgPT0gMSk7CisgICAgfQorICAgIHJldHVybiBtX3BidWZmZXJDb25maWc7Cit9CisK
K3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6c2V0RGVmYXVsdFdpbmRvd0NvbmZpZyhFR0xDb25maWcg
Y29uZmlnKQoreworICAgIG1fd2luZG93Q29uZmlnID0gY29uZmlnOworfQorCitFR0xDb25maWcg
RUdMRGlzcGxheU9wZW5WRzo6ZGVmYXVsdFdpbmRvd0NvbmZpZygpCit7CisgICAgLy8gSG9wZWZ1
bGx5IHRoZSBjbGllbnQgd2lsbCBoYXZlIHNldCB0aGUgd2luZG93IGNvbmZpZyBvZiBpdHMgY2hv
aWNlCisgICAgLy8gYnkgbm93IC0gaWYgbm90LCB1c2UgYSAzMi1iaXQgZ2VuZXJpYyBvbmUgYXMg
ZGVmYXVsdC4KKyAgICBpZiAoIW1fd2luZG93Q29uZmlnKSB7CisgICAgICAgIEVHTGludCBudW1D
b25maWdzOworCisgICAgICAgIHN0YXRpYyBjb25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0g
eworICAgICAgICAgICAgRUdMX1JFRF9TSVpFLCAgIDgsCisgICAgICAgICAgICBFR0xfR1JFRU5f
U0laRSwgOCwKKyAgICAgICAgICAgIEVHTF9CTFVFX1NJWkUsICA4LAorICAgICAgICAgICAgRUdM
X0FMUEhBX1NJWkUsIDgsCisgICAgICAgICAgICBFR0xfQUxQSEFfTUFTS19TSVpFLCAxLAorICAg
ICAgICAgICAgRUdMX0xVTUlOQU5DRV9TSVpFLCAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgICAg
IEVHTF9TVVJGQUNFX1RZUEUsICAgIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgRUdMX1JF
TkRFUkFCTEVfVFlQRSwgRUdMX09QRU5WR19CSVQsCisgICAgICAgICAgICBFR0xfTk9ORSB9Owor
CisgICAgICAgIGVnbENob29zZUNvbmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZtX3dp
bmRvd0NvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9S
KCk7CisgICAgICAgIEFTU0VSVChudW1Db25maWdzID09IDEpOworICAgIH0KKyAgICByZXR1cm4g
bV93aW5kb3dDb25maWc7Cit9CisKK1N1cmZhY2VPcGVuVkcqIEVHTERpc3BsYXlPcGVuVkc6OnNo
YXJlZFBsYXRmb3JtU3VyZmFjZSgpCit7CisgICAgaWYgKCFtX3NoYXJlZFBsYXRmb3JtU3VyZmFj
ZSkgeworICAgICAgICBFR0xDb25maWcgY29uZmlnID0gZGVmYXVsdFBidWZmZXJDb25maWcoKTsK
KyAgICAgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gY3JlYXRlUGJ1ZmZlclN1cmZhY2UoSW50U2l6
ZSgxLCAxKSwgY29uZmlnKTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAg
ICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobV9kaXNwbGF5LCBjb25m
aWcsIEVHTF9OT19DT05URVhULCAwKTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOwor
ICAgICAgICBtX2NvbnRleHRzLnNldChtX3N1cmZhY2VDb25maWdJZHMuZ2V0KHN1cmZhY2UpLCBj
b250ZXh0KTsKKworICAgICAgICBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZSA9IG5ldyBTdXJmYWNl
T3BlblZHKCk7CisgICAgICAgIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlLT5tX2VnbERpc3BsYXkg
PSBtX2Rpc3BsYXk7CisgICAgICAgIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlLT5tX2VnbFN1cmZh
Y2UgPSBzdXJmYWNlOworICAgICAgICBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZS0+bV9lZ2xDb250
ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbV9wbGF0Zm9ybVN1cmZhY2VzLnNldChzdXJmYWNlLCBt
X3NoYXJlZFBsYXRmb3JtU3VyZmFjZSk7IC8vIGEuay5hLiByZWdpc3RlclBsYXRmb3JtU3VyZmFj
ZSgpCisgICAgfQorICAgIHJldHVybiBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZTsKK30KKworRUdM
U3VyZmFjZSBFR0xEaXNwbGF5T3BlblZHOjpjcmVhdGVQYnVmZmVyU3VyZmFjZShjb25zdCBJbnRT
aXplJiBzaXplLCBFR0xDb25maWcgY29uZmlnKQoreworICAgIGlmICghY29uZmlnKQorICAgICAg
ICBjb25maWcgPSBkZWZhdWx0UGJ1ZmZlckNvbmZpZygpOworCisgICAgY29uc3QgRUdMaW50IGF0
dHJpYkxpc3RbXSA9IHsKKyAgICAgICAgRUdMX1dJRFRILCBzaXplLndpZHRoKCksCisgICAgICAg
IEVHTF9IRUlHSFQsIHNpemUuaGVpZ2h0KCksCisgICAgICAgIEVHTF9OT05FCisgICAgfTsKKyAg
ICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShtX2Rpc3BsYXks
IGNvbmZpZywgYXR0cmliTGlzdCk7CisgICAgaWYgKGVnbEdldEVycm9yKCkgIT0gRUdMX1NVQ0NF
U1MpCisgICAgICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKKworICAgIEVHTGludCBzdXJmYWNl
Q29uZmlnSWQ7CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1f
ZGlzcGxheSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICBB
U1NFUlQoc3VjY2VzcyA9PSBFR0xfVFJVRSk7CisgICAgQVNTRVJUKHN1cmZhY2VDb25maWdJZCAh
PSBFR0xfQkFEX0FUVFJJQlVURSk7CisKKyAgICBtX3N1cmZhY2VDb25maWdJZHMuc2V0KHN1cmZh
Y2UsIHN1cmZhY2VDb25maWdJZCk7CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK0VHTFN1cmZh
Y2UgRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZUZvcldpbmRvdyhFR0xOYXRpdmVXaW5kb3dUeXBl
IHdJZCwgY29uc3QgRUdMQ29uZmlnJiBjb25maWcpCit7CisgICAgaWYgKG1fd2luZG93U3VyZmFj
ZXMuY29udGFpbnMod0lkKSkKKyAgICAgICAgcmV0dXJuIG1fd2luZG93U3VyZmFjZXMuZ2V0KHdJ
ZCk7CisKKyAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1f
ZGlzcGxheSwgY29uZmlnLCB3SWQsIDApOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKwor
ICAgIEVHTGludCBzdXJmYWNlQ29uZmlnSWQ7CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWds
R2V0Q29uZmlnQXR0cmliKG1fZGlzcGxheSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmc3VyZmFj
ZUNvbmZpZ0lkKTsKKyAgICBBU1NFUlQoc3VjY2VzcyA9PSBFR0xfVFJVRSk7CisgICAgQVNTRVJU
KHN1cmZhY2VDb25maWdJZCAhPSBFR0xfQkFEX0FUVFJJQlVURSk7CisKKyAgICBtX3N1cmZhY2VD
b25maWdJZHMuc2V0KHN1cmZhY2UsIHN1cmZhY2VDb25maWdJZCk7CisgICAgcmV0dXJuIHN1cmZh
Y2U7Cit9CisKK2Jvb2wgRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZXNDb21wYXRpYmxlKEVHTFN1
cmZhY2Ugc3VyZmFjZSwgRUdMU3VyZmFjZSBvdGhlclN1cmZhY2UpCit7CisgICAgaWYgKHN1cmZh
Y2UgPT0gRUdMX05PX1NVUkZBQ0UgfHwgb3RoZXJTdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDdXJyZW50bHksIHdlIGFzc3VtZSB0aGF0
IGFsbCBzdXJmYWNlcyBrbm93biB0byB0aGlzIG9iamVjdCBhcmUKKyAgICAvLyBjb250ZXh0LWNv
bXBhdGlibGUgdG8gZWFjaCBvdGhlciAod2hpY2ggaXMgcmVhc29uYWJsZSB0byBhc3N1bWUsCisg
ICAgLy8gb3RoZXJ3aXNlIGVnbENyZWF0ZUNvbnRleHQoKSB3b3VsZCBmYWlsIHdpdGggRUdMX0JB
RF9NQVRDSCBmb3Igc2hhcmVkCisgICAgLy8gY29udGV4dCBjb21wYXRpYmlsaXR5IGFueXdheXMu
CisgICAgcmV0dXJuIChtX3N1cmZhY2VDb25maWdJZHMuY29udGFpbnMoc3VyZmFjZSkgJiYgbV9z
dXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKG90aGVyU3VyZmFjZSkpOworfQorCit2b2lkIEVHTERp
c3BsYXlPcGVuVkc6OmRlc3Ryb3lTdXJmYWNlKEVHTFN1cmZhY2Ugc3VyZmFjZSkKK3sKKyAgICBB
U1NFUlQoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBpZiAoZWdsR2V0Q3VycmVu
dFN1cmZhY2UoRUdMX0RSQVcpID09IHN1cmZhY2UpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQo
bV9kaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhU
KTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIH0KKworICAgIC8vIERlc3Ry
b3kgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB0byB0aGUgc3VyZmFjZSwgaWYgd2UgYWxyZWFkeSBj
cmVhdGVkIG9uZS4KKyAgICBpZiAobV9zdXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2Up
KSB7CisgICAgICAgIEVHTGludCBzdXJmYWNlQ29uZmlnSWQgPSBtX3N1cmZhY2VDb25maWdJZHMu
dGFrZShzdXJmYWNlKTsgLy8gdGFrZSA9IGdldCBhbmQgcmVtb3ZlCisgICAgICAgIGJvb2wgaXND
b250ZXh0UmVmZXJlbmNlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChtX2NvbXBhdGlibGVDb25m
aWdJZHMuY29udGFpbnMoc3VyZmFjZUNvbmZpZ0lkKSkKKyAgICAgICAgICAgIHN1cmZhY2VDb25m
aWdJZCA9IG1fY29tcGF0aWJsZUNvbmZpZ0lkcy5nZXQoc3VyZmFjZUNvbmZpZ0lkKTsKKworICAg
ICAgICBXVEY6Okhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50Pjo6aXRlcmF0b3IgZW5kID0gbV9z
dXJmYWNlQ29uZmlnSWRzLmVuZCgpOworCisgICAgICAgIC8vIC4uLmJ1dCBvbmx5IGlmIHRoZXJl
J3Mgbm8gb3RoZXIgc3VyZmFjZXMgYXNzb2NpYXRlZCB0byB0aGF0IGNvbnRleHQuCisgICAgICAg
IGZvciAoV1RGOjpIYXNoTWFwPEVHTFN1cmZhY2UsIEVHTGludD46Oml0ZXJhdG9yIGl0ID0gbV9z
dXJmYWNlQ29uZmlnSWRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAg
aWYgKCgqaXQpLnNlY29uZCA9PSBzdXJmYWNlQ29uZmlnSWQpIHsKKyAgICAgICAgICAgICAgICBp
c0NvbnRleHRSZWZlcmVuY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzQ29udGV4dFJlZmVyZW5jZWQgJiYg
bV9jb250ZXh0cy5jb250YWlucyhzdXJmYWNlQ29uZmlnSWQpKSB7CisgICAgICAgICAgICBFR0xD
b250ZXh0IGNvbnRleHQgPSBtX2NvbnRleHRzLnRha2Uoc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICAg
ICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KG1fZGlzcGxheSwgY29udGV4dCk7CisgICAgICAgICAg
ICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3BsYXRm
b3JtU3VyZmFjZXMucmVtb3ZlKHN1cmZhY2UpOworCisgICAgV1RGOjpIYXNoTWFwPEVHTE5hdGl2
ZVdpbmRvd1R5cGUsIEVHTFN1cmZhY2U+OjppdGVyYXRvciBlbmQgPSBtX3dpbmRvd1N1cmZhY2Vz
LmVuZCgpOworICAgIGZvciAoV1RGOjpIYXNoTWFwPEVHTE5hdGl2ZVdpbmRvd1R5cGUsIEVHTFN1
cmZhY2U+OjppdGVyYXRvciBpdCA9IG1fd2luZG93U3VyZmFjZXMuYmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS5zZWNvbmQgPT0gc3VyZmFjZSkKKyAgICAgICAg
ICAgIG1fd2luZG93U3VyZmFjZXMucmVtb3ZlKGl0KTsKKyAgICB9CisKKyAgICBlZ2xEZXN0cm95
U3VyZmFjZShtX2Rpc3BsYXksIHN1cmZhY2UpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsK
K30KKworRUdMQ29udGV4dCBFR0xEaXNwbGF5T3BlblZHOjpjb250ZXh0Rm9yU3VyZmFjZShFR0xT
dXJmYWNlIHN1cmZhY2UpCit7CisgICAgQVNTRVJUKHN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0Up
OworCisgICAgaWYgKG1fcGxhdGZvcm1TdXJmYWNlcy5jb250YWlucyhzdXJmYWNlKSkKKyAgICAg
ICAgcmV0dXJuIG1fcGxhdGZvcm1TdXJmYWNlcy5nZXQoc3VyZmFjZSktPmVnbENvbnRleHQoKTsK
KworICAgIGVnbEJpbmRBUEkoRUdMX09QRU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJS
T1IoKTsKKworICAgIEVHTGludCBzdXJmYWNlQ29uZmlnSWQ7CisKKyAgICBpZiAobV9zdXJmYWNl
Q29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2UpKQorICAgICAgICBzdXJmYWNlQ29uZmlnSWQgPSBt
X3N1cmZhY2VDb25maWdJZHMuZ2V0KHN1cmZhY2UpOworICAgIGVsc2UgeworICAgICAgICAvLyBS
ZXRyaWV2ZSB0aGUgc2FtZSBFR0wgY29uZmlnIGZvciBjb250ZXh0IGNyZWF0aW9uIHRoYXQgd2Fz
IHVzZWQgdG8KKyAgICAgICAgLy8gY3JlYXRlIHRoZSB0aGUgRUdMIHN1cmZhY2UuCisgICAgICAg
IEVHTEJvb2xlYW4gc3VjY2VzcyA9IGVnbFF1ZXJ5U3VyZmFjZShtX2Rpc3BsYXksIHN1cmZhY2Us
IEVHTF9DT05GSUdfSUQsICZzdXJmYWNlQ29uZmlnSWQpOworICAgICAgICBBU1NFUlQoc3VjY2Vz
cyA9PSBFR0xfVFJVRSk7CisgICAgICAgIEFTU0VSVChzdXJmYWNlQ29uZmlnSWQgIT0gRUdMX0JB
RF9BVFRSSUJVVEUpOworCisgICAgICAgIG1fc3VyZmFjZUNvbmZpZ0lkcy5zZXQoc3VyZmFjZSwg
c3VyZmFjZUNvbmZpZ0lkKTsKKyAgICB9CisKKyAgICBpZiAobV9jb21wYXRpYmxlQ29uZmlnSWRz
LmNvbnRhaW5zKHN1cmZhY2VDb25maWdJZCkpCisgICAgICAgIHN1cmZhY2VDb25maWdJZCA9IG1f
Y29tcGF0aWJsZUNvbmZpZ0lkcy5nZXQoc3VyZmFjZUNvbmZpZ0lkKTsKKworICAgIGlmIChtX2Nv
bnRleHRzLmNvbnRhaW5zKHN1cmZhY2VDb25maWdJZCkpCisgICAgICAgIHJldHVybiBtX2NvbnRl
eHRzLmdldChzdXJmYWNlQ29uZmlnSWQpOworCisgICAgaWYgKCFtX3NoYXJlZFBsYXRmb3JtU3Vy
ZmFjZSkgLy8gc2hhcmVkIGNvbnRleHQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0CisgICAgICAg
IHNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpOyAvLyBjcmVhdGVzIHRoZSBzaGFyZWQgc3VyZmFjZSAm
IGNvbnRleHQKKworICAgIEVHTERpc3BsYXkgY3VycmVudERpc3BsYXkgPSBlZ2xHZXRDdXJyZW50
RGlzcGxheSgpOworICAgIEVHTFN1cmZhY2UgY3VycmVudFJlYWRTdXJmYWNlID0gZWdsR2V0Q3Vy
cmVudFN1cmZhY2UoRUdMX1JFQUQpOworICAgIEVHTFN1cmZhY2UgY3VycmVudERyYXdTdXJmYWNl
ID0gZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMX0RSQVcpOworICAgIEVHTENvbnRleHQgY3VycmVu
dENvbnRleHQgPSBlZ2xHZXRDdXJyZW50Q29udGV4dCgpOworCisgICAgLy8gQmVmb3JlIGNyZWF0
aW5nIGEgbmV3IGNvbnRleHQsIGxldCdzIHRyeSB3aGV0aGVyIGFuIGV4aXN0aW5nIG9uZQorICAg
IC8vIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc3VyZmFjZS4gRUdMIGRvZXNuJ3QgZ2l2ZSB1cyBh
IGRpZmZlcmVudCB3YXkKKyAgICAvLyB0byBjaGVjayBjb250ZXh0L3N1cmZhY2UgY29tcGF0aWJp
bGl0eSB0aGFuIHRyeWluZyBpdCBvdXQsIHNvIGxldCdzCisgICAgLy8gZG8ganVzdCB0aGF0Lgor
ICAgIFdURjo6SGFzaE1hcDxFR0xpbnQsIEVHTENvbnRleHQ+OjppdGVyYXRvciBlbmQgPSBtX2Nv
bnRleHRzLmVuZCgpOworCisgICAgZm9yIChXVEY6Okhhc2hNYXA8RUdMaW50LCBFR0xDb250ZXh0
Pjo6aXRlcmF0b3IgaXQgPSBtX2NvbnRleHRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewor
ICAgICAgICBlZ2xNYWtlQ3VycmVudChtX2Rpc3BsYXksIHN1cmZhY2UsIHN1cmZhY2UsICgqaXQp
LnNlY29uZCk7CisgICAgICAgIGlmIChlZ2xHZXRFcnJvcigpID09IEVHTF9TVUNDRVNTKSB7Cisg
ICAgICAgICAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHN1cmZhY2UvY29udGV4dC4KKyAgICAgICAg
ICAgIGlmIChjdXJyZW50Q29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICAgICAg
ICAgIGVnbE1ha2VDdXJyZW50KGN1cnJlbnREaXNwbGF5LCBjdXJyZW50UmVhZFN1cmZhY2UsIGN1
cnJlbnREcmF3U3VyZmFjZSwgY3VycmVudENvbnRleHQpOworICAgICAgICAgICAgICAgIEFTU0VS
VF9FR0xfTk9fRVJST1IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvb2wsIHN1
cmZhY2UgaXMgY29tcGF0aWJsZSB0byBvbmUgb2Ygb3VyIGV4aXN0aW5nIGNvbnRleHRzLgorICAg
ICAgICAgICAgbV9jb21wYXRpYmxlQ29uZmlnSWRzLnNldChzdXJmYWNlQ29uZmlnSWQsICgqaXQp
LmZpcnN0KTsKKyAgICAgICAgICAgIHJldHVybiAoKml0KS5zZWNvbmQ7CisgICAgICAgIH0KKyAg
ICB9CisgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzdXJmYWNlL2NvbnRleHQuCisgICAgaWYgKGN1
cnJlbnRDb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIGVnbE1ha2VDdXJyZW50
KGN1cnJlbnREaXNwbGF5LCBjdXJyZW50UmVhZFN1cmZhY2UsIGN1cnJlbnREcmF3U3VyZmFjZSwg
Y3VycmVudENvbnRleHQpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgfQor
CisgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICBFR0xpbnQgbnVtQ29uZmlnczsKKworICAgIGNv
bnN0IEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgIEVHTF9DT05GSUdfSUQsIHN1
cmZhY2VDb25maWdJZCwKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworICAgIGVnbENob29zZUNv
bmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsK
KyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgQVNTRVJUKG51bUNvbmZpZ3MgPT0gMSk7
CisKKyAgICAvLyBXZSBzaGFyZSBhbGwgb2YgdGhlIGltYWdlcyBhbmQgcGF0aHMgYW1vbmdzdCB0
aGUgZGlmZmVyZW50IGNvbnRleHRzLAorICAgIC8vIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBp
biBhbGwgb2YgdGhlbS4gUmVzb3VyY2VzIHRoYXQgYXJlIGNyZWF0ZWQKKyAgICAvLyB3aGlsZSBt
X3NoYXJlZFBsYXRmb3JtU3VyZmFjZS0+Y29udGV4dCgpIGlzIGN1cnJlbnQgd2lsbCBiZQorICAg
IC8vIGFjY2Vzc2libGUgZnJvbSBhbGwgb3RoZXIgY29udGV4dHMsIGJ1dCBhcmUgbm90IHJlc3Ry
aWN0ZWQgdG8gdGhlCisgICAgLy8gbGlmZXRpbWUgb2YgdGhvc2UgY29udGV4dHMuCisgICAgRUdM
Q29udGV4dCBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtX2Rpc3BsYXksIGNvbmZpZywgbV9z
aGFyZWRQbGF0Zm9ybVN1cmZhY2UtPmVnbENvbnRleHQoKSwgMCk7CisgICAgQVNTRVJUX0VHTF9O
T19FUlJPUigpOworCisgICAgbV9jb250ZXh0cy5zZXQoc3VyZmFjZUNvbmZpZ0lkLCBjb250ZXh0
KTsKKyAgICByZXR1cm4gY29udGV4dDsKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi5hN2RlYmFkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9vcGVudmcvRUdMRGlzcGxheU9wZW5WRy5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDkuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKyNpZm5kZWYgRUdMRGlzcGxheU9wZW5WR19oCisjZGVmaW5lIEVHTERpc3Bs
YXlPcGVuVkdfaAorCisjaW5jbHVkZSA8ZWdsLmg+CisjaW5jbHVkZSA8b3BlbnZnLmg+CisjaW5j
bHVkZSA8d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJbnRT
aXplOworY2xhc3MgU3VyZmFjZU9wZW5WRzsKKworY2xhc3MgRUdMRGlzcGxheU9wZW5WRyB7Citw
dWJsaWM6CisgICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VPcGVuVkc7CisKKyAgICBzdGF0aWMgU3Vy
ZmFjZU9wZW5WRyogY3VycmVudFN1cmZhY2UoKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRDdXJyZW50
RGlzcGxheShFR0xEaXNwbGF5IGRpc3BsYXkpOworICAgIHN0YXRpYyBFR0xEaXNwbGF5T3BlblZH
KiBjdXJyZW50KCk7CisgICAgc3RhdGljIEVHTERpc3BsYXlPcGVuVkcqIGZvckRpc3BsYXkoRUdM
RGlzcGxheSBkaXNwbGF5KTsKKworICAgIEVHTERpc3BsYXlPcGVuVkcoRUdMRGlzcGxheSBkaXNw
bGF5KTsKKyAgICB+RUdMRGlzcGxheU9wZW5WRygpOworCisgICAgdm9pZCBzZXREZWZhdWx0UGJ1
ZmZlckNvbmZpZyhFR0xDb25maWcgY29uZmlnKTsKKyAgICBFR0xDb25maWcgZGVmYXVsdFBidWZm
ZXJDb25maWcoKTsKKyAgICB2b2lkIHNldERlZmF1bHRXaW5kb3dDb25maWcoRUdMQ29uZmlnIGNv
bmZpZyk7CisgICAgRUdMQ29uZmlnIGRlZmF1bHRXaW5kb3dDb25maWcoKTsKKworICAgIEVHTERp
c3BsYXkgZGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZGlzcGxheTsgfQorICAgIFN1cmZhY2VP
cGVuVkcqIHNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpOworCisgICAgLyoqIENyZWF0ZXMgYSBwYnVm
ZmVyIHN1cmZhY2UgdXNpbmcgdGhlIGdpdmVuIGNvbmZpZy4gSWYgbm8gc3VyZmFjZQorICAgICAg
ICAqIGNvdWxkIGJlIGNyZWF0ZWQsIEVHTF9OT19TVVJGQUNFIGlzIHJldHVybmVkIGFuZCBlcnJv
cnMgY2FuIGJlCisgICAgICAgICogY2F1Z2h0IHdpdGggZWdsR2V0RXJyb3IoKSAocmVzcGVjdGl2
ZWx5IEFTU0VSVF9FR0xfTk9fRVJST1IoKSkuICovCisgICAgRUdMU3VyZmFjZSBjcmVhdGVQYnVm
ZmVyU3VyZmFjZShjb25zdCBJbnRTaXplJiBzaXplLCBFR0xDb25maWcgY29uZmlnID0gMCk7CisK
KyAgICBFR0xTdXJmYWNlIHN1cmZhY2VGb3JXaW5kb3coRUdMTmF0aXZlV2luZG93VHlwZSB3SWQs
IGNvbnN0IEVHTENvbmZpZyYgY29uZmlnKTsKKworICAgIGJvb2wgc3VyZmFjZXNDb21wYXRpYmxl
KEVHTFN1cmZhY2Ugc3VyZmFjZTEsIEVHTFN1cmZhY2Ugb3RoZXJTdXJmYWNlKTsKKworICAgIC8q
KiBEZXN0cm95IHRoZSBzdXJmYWNlIGFuZCBpdHMgY29ycmVzcG9uZGluZyBjb250ZXh0ICh1bmxl
c3MgYW5vdGhlcgorICAgICAqIHN1cmZhY2UgaXMgc3RpbGwgdXNpbmcgdGhlIHNhbWUgY29udGV4
dCwgaW4gd2hpY2ggY2FzZSB0aGUgY29udGV4dAorICAgICAqIGlzIG5vdCBkZXN0cm95ZWQpLiAq
LworICAgIHZvaWQgZGVzdHJveVN1cmZhY2UoRUdMU3VyZmFjZSBzdXJmYWNlKTsKKworICAgIC8q
KiBSZXR1cm4gdGhlIGNvbnRleHQgY29ycmVzcG9uZGluZyB0byB0aGUgc3VyZmFjZS4KKyAgICAg
KiBJZiBubyBjb3JyZXNwb25kaW5nIGNvbnRleHQgZXhpc3RzLCBvbmUgaXMgY3JlYXRlZCBhdXRv
bWF0aWNhbGx5LiAqLworICAgIEVHTENvbnRleHQgY29udGV4dEZvclN1cmZhY2UoRUdMU3VyZmFj
ZSBzdXJmYWNlKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgdm9pZCByZWdpc3RlclBsYXRmb3Jt
U3VyZmFjZShTdXJmYWNlT3BlblZHKiBwbGF0Zm9ybVN1cmZhY2UpOworICAgIHN0YXRpYyB2b2lk
IHVucmVnaXN0ZXJQbGF0Zm9ybVN1cmZhY2UoU3VyZmFjZU9wZW5WRyogcGxhdGZvcm1TdXJmYWNl
KTsKKworcHJpdmF0ZToKKyAgICBFR0xEaXNwbGF5IG1fZGlzcGxheTsKKyAgICBTdXJmYWNlT3Bl
blZHKiBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZTsKKyAgICBFR0xDb25maWcgbV9wYnVmZmVyQ29u
ZmlnOworICAgIEVHTENvbmZpZyBtX3dpbmRvd0NvbmZpZzsKKworICAgIFdURjo6SGFzaE1hcDxF
R0xTdXJmYWNlLCBTdXJmYWNlT3BlblZHKj4gbV9wbGF0Zm9ybVN1cmZhY2VzOworICAgIFdURjo6
SGFzaE1hcDxFR0xOYXRpdmVXaW5kb3dUeXBlLCBFR0xTdXJmYWNlPiBtX3dpbmRvd1N1cmZhY2Vz
OworICAgIFdURjo6SGFzaE1hcDxFR0xTdXJmYWNlLCBFR0xpbnQ+IG1fc3VyZmFjZUNvbmZpZ0lk
czsKKyAgICBXVEY6Okhhc2hNYXA8RUdMaW50LCBFR0xpbnQ+IG1fY29tcGF0aWJsZUNvbmZpZ0lk
czsKKyAgICBXVEY6Okhhc2hNYXA8RUdMaW50LCBFR0xDb250ZXh0PiBtX2NvbnRleHRzOworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRUdMRGlzcGxheU9wZW5WR19o
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xVdGlscy5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMVXRpbHMuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODUxYjcwCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMVXRpbHMuaApAQCAtMCwwICsxLDUzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDA5LiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEVHTFV0aWxzX2gKKyNkZWZpbmUgRUdMVXRpbHNf
aAorCisjaW5jbHVkZSA8ZWdsLmg+CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworI2Rl
ZmluZSBBU1NFUlRfRUdMX05PX0VSUk9SKCkgXAorICAgIGRvIHsgXAorICAgICAgICBFR0xpbnQg
ZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBcCisgICAgICAgIGlmIChlcnJvciAhPSBFR0xfU1VDQ0VT
UykgeyBcCisgICAgICAgICAgICBjb25zdCBjaGFyKiB0eHQ7IFwKKyAgICAgICAgICAgIHN3aXRj
aCAoZXJyb3IpIHsgXAorICAgICAgICAgICAgY2FzZSBFR0xfTk9UX0lOSVRJQUxJWkVEOiB0eHQg
PSAiRUdMX05PVF9JTklUSUFMSVpFRCI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgRUdMX0JB
RF9BQ0NFU1M6IHR4dCA9ICJFR0xfQkFEX0FDQ0VTUyI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNh
c2UgRUdMX0JBRF9BTExPQzogdHh0ID0gIkVHTF9CQURfQUxMT0MiOyBicmVhaztcCisgICAgICAg
ICAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiB0eHQgPSAiRUdMX0JBRF9BVFRSSUJVVEUiOyBi
cmVhaztcCisgICAgICAgICAgICBjYXNlIEVHTF9CQURfQ09OVEVYVDogdHh0ID0gIkVHTF9CQURf
Q09OVEVYVCI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6IHR4dCA9
ICJFR0xfQkFEX0NPTkZJRyI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9DVVJS
RU5UX1NVUkZBQ0U6IHR4dCA9ICJFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSI7IGJyZWFrO1wKKyAg
ICAgICAgICAgIGNhc2UgRUdMX0JBRF9ESVNQTEFZOiB0eHQgPSAiRUdMX0JBRF9ESVNQTEFZIjsg
YnJlYWs7XAorICAgICAgICAgICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6IHR4dCA9ICJFR0xfQkFE
X1NVUkZBQ0UiOyBicmVhaztcCisgICAgICAgICAgICBjYXNlIEVHTF9CQURfTUFUQ0g6IHR4dCA9
ICJFR0xfQkFEX01BVENIIjsgYnJlYWs7XAorICAgICAgICAgICAgY2FzZSBFR0xfQkFEX1BBUkFN
RVRFUjogdHh0ID0gIkVHTF9CQURfUEFSQU1FVEVSIjsgYnJlYWs7XAorICAgICAgICAgICAgY2Fz
ZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6IHR4dCA9ICJFR0xfQkFEX05BVElWRV9QSVhNQVAiOyBi
cmVhaztcCisgICAgICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1dJTkRPVzogdHh0ID0gIkVH
TF9CQURfTkFUSVZFX1dJTkRPVyI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgRUdMX0NPTlRF
WFRfTE9TVDogdHh0ID0gIkVHTF9DT05URVhUX0xPU1QiOyBicmVhaztcCisgICAgICAgICAgICBk
ZWZhdWx0OiB0eHQgPSAiVU5LTk9XTl9FUlJPUiI7IGJyZWFrO1wKKyAgICAgICAgICAgIH0gXAor
ICAgICAgICAgICAgV1RGUmVwb3J0QXNzZXJ0aW9uRmFpbHVyZVdpdGhNZXNzYWdlKF9fRklMRV9f
LCBfX0xJTkVfXywgV1RGX1BSRVRUWV9GVU5DVElPTiwgIiIsICJGb3VuZCAlcyIsIHR4dCk7IFwK
KyAgICAgICAgICAgIENSQVNIKCk7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKwor
I2VuZGlmIC8vIEVHTFV0aWxzX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9v
cGVudmcvU3VyZmFjZU9wZW5WRy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uNDBlOTUzOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
b3BlbnZnL1N1cmZhY2VPcGVuVkcuY3BwCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDA5LiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3VyZmFjZU9wZW5WRy5oIgorCisj
aW5jbHVkZSAiSW50U2l6ZS5oIgorCisjaWYgUExBVEZPUk0oRUdMKQorI2luY2x1ZGUgIkVHTERp
c3BsYXlPcGVuVkcuaCIKKyNpbmNsdWRlICJFR0xVdGlscy5oIgorI2VuZGlmCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworU3VyZmFjZU9wZW5WRyogU3VyZmFjZU9wZW5WRzo6Y3VycmVudFN1cmZh
Y2UoKQoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICByZXR1cm4gRUdMRGlzcGxheU9wZW5WRzo6
Y3VycmVudFN1cmZhY2UoKTsKKyNlbmRpZgorfQorCisjaWYgUExBVEZPUk0oRUdMKQorU3VyZmFj
ZU9wZW5WRzo6U3VyZmFjZU9wZW5WRyhjb25zdCBJbnRTaXplJiBzaXplLCBFR0xEaXNwbGF5IGRp
c3BsYXksIEVHTENvbmZpZyBjb25maWcpCisgICAgLCBtX2VnbERpc3BsYXkoZGlzcGxheSkKK3sK
KyAgICBBU1NFUlQobV9lZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKTsKKworICAgIEVHTERp
c3BsYXlPcGVuVkcqIGRpc3BsYXlNYW5hZ2VyID0gRUdMRGlzcGxheU9wZW5WRzo6Zm9yRGlzcGxh
eShtX2VnbERpc3BsYXkpOworICAgIGlmICghY29uZmlnKQorICAgICAgICBjb25maWcgPSBkaXNw
bGF5TWFuYWdlci0+ZGVmYXVsdFBidWZmZXJDb25maWcoKTsKKworICAgIG1fZWdsU3VyZmFjZSA9
IGRpc3BsYXlNYW5hZ2VyLT5jcmVhdGVQYnVmZmVyU3VyZmFjZShzaXplLCBjb25maWcpOworICAg
IGlmIChtX2VnbFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fZWdsQ29udGV4dCA9IGRpc3BsYXlNYW5hZ2VyLT5jb250ZXh0Rm9yU3VyZmFjZShtX2Vn
bFN1cmZhY2UpOworICAgIEVHTERpc3BsYXlPcGVuVkc6OnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNl
KHRoaXMpOworfQorCitTdXJmYWNlT3BlblZHOjpTdXJmYWNlT3BlblZHKEVHTE5hdGl2ZVdpbmRv
d1R5cGUgd2luZG93LCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcpCisgICAg
LCBtX2VnbERpc3BsYXkoZGlzcGxheSkKK3sKKyAgICBBU1NFUlQobV9lZ2xEaXNwbGF5ICE9IEVH
TF9OT19ESVNQTEFZKTsKKworICAgIEVHTERpc3BsYXlPcGVuVkcqIGRpc3BsYXlNYW5hZ2VyID0g
RUdMRGlzcGxheU9wZW5WRzo6Zm9yRGlzcGxheShtX2VnbERpc3BsYXkpOworICAgIGlmICghY29u
ZmlnKQorICAgICAgICBjb25maWcgPSBkaXNwbGF5TWFuYWdlci0+ZGVmYXVsdFdpbmRvd0NvbmZp
ZygpOworCisgICAgbV9lZ2xTdXJmYWNlID0gZGlzcGxheU1hbmFnZXItPnN1cmZhY2VGb3JXaW5k
b3cod2luZG93LCBjb25maWcpOworICAgIGlmIChtX2VnbFN1cmZhY2UgPT0gRUdMX05PX1NVUkZB
Q0UpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZWdsQ29udGV4dCA9IGRpc3BsYXlNYW5hZ2Vy
LT5jb250ZXh0Rm9yU3VyZmFjZShtX2VnbFN1cmZhY2UpOworICAgIEVHTERpc3BsYXlPcGVuVkc6
OnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKHRoaXMpOworfQorCisvLyBDb25zdHJ1Y3RvciBvbmx5
IGFjY2Vzc2libGUgdG8gRUdMRGlzcGxheU9wZW5WRyBmb3Igc2hhcmVkIGNvbnRleHQKKy8vIGlu
aXRpYWxpemF0aW9uLiBUaGUgcGFyYW1ldGVyIHR5cGVzIG1pZ2h0IGRlZmluZSB0byB2b2lkKiBs
aWtlIGluIHRoZQorLy8gd2luZG93IHN1cmZhY2UgY29uc3RydWN0b3IsIHNvIGl0IGNhbid0IGJl
IG92ZXJsb2FkZWQgd2l0aCBhbGwgdGhlIHJlcXVpcmVkCisvLyBhcmd1bWVudHMgYW5kIEVHTERp
c3BsYXlPcGVuVkcgYmFzaWNhbGx5IGltcGxlbWVudHMgdGhlIGNvbnN0cnVjdG9yCisvLyBieSBp
dHNlbGYuCitTdXJmYWNlT3BlblZHOjpTdXJmYWNlT3BlblZHKCkKKyAgICAsIG1fZWdsRGlzcGxh
eSgwKQorICAgICwgbV9lZ2xTdXJmYWNlKDApCisgICAgLCBtX2VnbENvbnRleHQoMCkKK3sKK30K
KyNlbmRpZgorCitTdXJmYWNlT3BlblZHOjp+U3VyZmFjZU9wZW5WRygpCit7CisgICAgaWYgKCFp
c1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsKKworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICBFR0xE
aXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlzcGxheSktPmRlc3Ryb3lTdXJmYWNlKG1f
ZWdsU3VyZmFjZSk7CisgICAgRUdMRGlzcGxheU9wZW5WRzo6dW5yZWdpc3RlclBsYXRmb3JtU3Vy
ZmFjZSh0aGlzKTsKKyNlbmRpZgorfQorCitib29sIFN1cmZhY2VPcGVuVkc6OmlzVmFsaWQoKSBj
b25zdAoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICByZXR1cm4gKG1fZWdsU3VyZmFjZSAhPSBF
R0xfTk9fU1VSRkFDRSk7CisjZW5kaWYKK30KKworaW50IFN1cmZhY2VPcGVuVkc6OndpZHRoKCkg
Y29uc3QKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgQVNTRVJUKG1fZWdsU3VyZmFjZSAhPSBF
R0xfTk9fU1VSRkFDRSk7CisKKyAgICBFR0xpbnQgd2lkdGg7CisgICAgZWdsUXVlcnlTdXJmYWNl
KG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlLCBFR0xfV0lEVEgsICZ3aWR0aCk7CisgICAgQVNT
RVJUX0VHTF9OT19FUlJPUigpOworICAgIHJldHVybiB3aWR0aDsKKyNlbmRpZgorfQorCitpbnQg
U3VyZmFjZU9wZW5WRzo6aGVpZ2h0KCkgY29uc3QKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAg
QVNTRVJUKG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBFR0xpbnQgaGVp
Z2h0OworICAgIGVnbFF1ZXJ5U3VyZmFjZShtX2VnbERpc3BsYXksIG1fZWdsU3VyZmFjZSwgRUdM
X0hFSUdIVCwgJmhlaWdodCk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIHJldHVy
biBoZWlnaHQ7CisjZW5kaWYKK30KKworU3VyZmFjZU9wZW5WRyogU3VyZmFjZU9wZW5WRzo6c2hh
cmVkU3VyZmFjZSgpIGNvbnN0Cit7CisjaWYgUExBVEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2Vn
bFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpOworICAgIHJldHVybiBFR0xEaXNwbGF5T3BlblZH
Ojpmb3JEaXNwbGF5KG1fZWdsRGlzcGxheSktPnNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpOworI2Vu
ZGlmCit9CisKK3ZvaWQgU3VyZmFjZU9wZW5WRzo6bWFrZUN1cnJlbnQoKQoreworI2lmIFBMQVRG
T1JNKEVHTCkKKyAgICBBU1NFUlQobV9lZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKTsKKwor
ICAgIGVnbEJpbmRBUEkoRUdMX09QRU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1Io
KTsKKyAgICBFR0xTdXJmYWNlIGN1cnJlbnRTdXJmYWNlID0gZWdsR2V0Q3VycmVudFN1cmZhY2Uo
RUdMX0RSQVcpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIGlmIChjdXJyZW50
U3VyZmFjZSAhPSBtX2VnbFN1cmZhY2UpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQobV9lZ2xE
aXNwbGF5LCBtX2VnbFN1cmZhY2UsIG1fZWdsU3VyZmFjZSwgbV9lZ2xDb250ZXh0KTsKKyAgICAg
ICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIFN1cmZh
Y2VPcGVuVkc6Om1ha2VDb21wYXRpYmxlQ3VycmVudCgpCit7CisjaWYgUExBVEZPUk0oRUdMKQor
ICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpOworCisgICAgZWdsQmlu
ZEFQSShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIEVH
TFN1cmZhY2UgY3VycmVudFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7
CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAgaWYgKGN1cnJlbnRTdXJmYWNlICE9
IG1fZWdsU3VyZmFjZQorICAgICAgICAmJiAhRUdMRGlzcGxheU9wZW5WRzo6Zm9yRGlzcGxheSht
X2VnbERpc3BsYXkpLT5zdXJmYWNlc0NvbXBhdGlibGUoY3VycmVudFN1cmZhY2UsIG1fZWdsU3Vy
ZmFjZSkpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQobV9lZ2xEaXNwbGF5LCBtX2VnbFN1cmZh
Y2UsIG1fZWdsU3VyZmFjZSwgbV9lZ2xDb250ZXh0KTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19F
UlJPUigpOworICAgIH0KKyAgICAvLyBlbHNlOiBzdXJmYWNlcyBjb21wYXRpYmxlLCBubyBuZWVk
IHRvIHN3aXRjaCBjb250ZXh0cworI2VuZGlmCit9CisKK3ZvaWQgU3VyZmFjZU9wZW5WRzo6Zmx1
c2goKQoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICBBU1NFUlQobV9lZ2xTdXJmYWNlICE9IEVH
TF9OT19TVVJGQUNFKTsKKworICAgIGVnbFN3YXBCdWZmZXJzKG1fZWdsRGlzcGxheSwgbV9lZ2xT
dXJmYWNlKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisjZW5kaWYKK30KKworfQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5WRy5o
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5WRy5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNzZmZjAKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJmYWNlT3BlblZHLmgKQEAgLTAs
MCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkIDIwMDkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgU3VyZmFjZU9wZW5WR19oCisj
ZGVmaW5lIFN1cmZhY2VPcGVuVkdfaAorCisjaW5jbHVkZSA8d3RmL1BsYXRmb3JtLmg+CisKKyNp
ZiBQTEFURk9STShFR0wpCisjaW5jbHVkZSA8ZWdsLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCisjaWYgUExBVEZPUk0oRUdMKQorY2xhc3MgRUdMRGlzcGxheU9wZW5WRzsKKyNl
bmRpZgorY2xhc3MgSW50U2l6ZTsKKworY2xhc3MgU3VyZmFjZU9wZW5WRyB7CitwdWJsaWM6Cisg
ICAgc3RhdGljIFN1cmZhY2VPcGVuVkcqIGN1cnJlbnRTdXJmYWNlKCk7CisKKyNpZiBQTEFURk9S
TShFR0wpCisgICAgZnJpZW5kIGNsYXNzIEVHTERpc3BsYXlPcGVuVkc7CisKKyAgICAvKioKKyAg
ICAgKiBDcmVhdGUgYSBuZXcgRUdMIHBidWZmZXIgc3VyZmFjZSB3aXRoIHRoZSBzcGVjaWZpZWQg
c2l6ZSBhbmQgY29uZmlnIG9uCisgICAgICogdGhlIGdpdmVuIGRpc3BsYXkuIElmIGNvbmZpZyBp
cyBub3Qgc3BlY2lmaWVkLCB0aGUgZGlzcGxheSdzIGRlZmF1bHQKKyAgICAgKiBwYnVmZmVyIGNv
bmZpZyBpcyB1c2VkLgorICAgICAqCisgICAgICogRm9yIHJlYXNvbnMgb2YgcmVjb3ZlcmFiaWxp
dHkgKGUuZy4gSW1hZ2VCdWZmZXIncyAiYm9vbCBzdWNjZXNzIgorICAgICAqIHJldHVybiB2YWx1
ZSksIHRoaXMgY29uc3RydWN0b3Igd29uJ3QgYXNzZXJ0IGlmIGNyZWF0aW9uIG9mIHRoZSBzdXJm
YWNlCisgICAgICogZmFpbHMuIE1ha2Ugc3VyZSB0byBjaGVjayBzdWNjZXNzZnVsIHN1cmZhY2Ug
Y3JlYXRpb24gd2l0aCBlaXRoZXIKKyAgICAgKiBBU1NFUlRfRUdMX05PX0VSUk9SKCkgb3IgdGhl
IHN1cmZhY2UncyBpc1ZhbGlkKCkgbWV0aG9kLgorICAgICAqLworICAgIFN1cmZhY2VPcGVuVkco
Y29uc3QgSW50U2l6ZSYgc2l6ZSwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmln
ID0gMCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgRUdMIHdpbmRvdyBzdXJmYWNl
IHdpdGggdGhlIHNwZWNpZmllZCBuYXRpdmUgd2luZG93IGhhbmRsZQorICAgICAqIGFuZCBjb25m
aWcgb24gdGhlIGdpdmVuIGRpc3BsYXkuIElmIGNvbmZpZyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUK
KyAgICAgKiBkaXNwbGF5J3MgZGVmYXVsdCB3aW5kb3cgY29uZmlnIGlzIHVzZWQuCisgICAgICoK
KyAgICAgKiBGb3IgcmVhc29ucyBvZiByZWNvdmVyYWJpbGl0eSwgdGhpcyBjb25zdHJ1Y3RvciB3
b24ndCBhc3NlcnQgaWYgY3JlYXRpb24KKyAgICAgKiBvZiB0aGUgc3VyZmFjZSBmYWlscy4gTWFr
ZSBzdXJlIHRvIGNoZWNrIHN1Y2Nlc3NmdWwgc3VyZmFjZSBjcmVhdGlvbgorICAgICAqIHdpdGgg
ZWl0aGVyIEFTU0VSVF9FR0xfTk9fRVJST1IoKSBvciB0aGUgc3VyZmFjZSdzIGlzVmFsaWQoKSBt
ZXRob2QuCisgICAgICovCisgICAgU3VyZmFjZU9wZW5WRyhFR0xOYXRpdmVXaW5kb3dUeXBlIHdp
bmRvdywgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgY29uZmlnID0gMCk7CisKKyAgICBF
R0xEaXNwbGF5IGVnbERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtX2VnbERpc3BsYXk7IH0KKyAg
ICBFR0xTdXJmYWNlIGVnbFN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtX2VnbFN1cmZhY2U7IH0K
KyAgICBFR0xDb250ZXh0IGVnbENvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2VnbENvbnRleHQ7
IH0KKyNlbmRpZgorCisgICAgflN1cmZhY2VPcGVuVkcoKTsKKworICAgIC8qKgorICAgICAqIElm
IGEgc3VyZmFjZSBpcyBpbnZhbGlkIChjb3VsZCBub3QgYmUgY3JlYXRlZCksIGFsbCBtZXRob2Qg
Y2FsbHMgd2lsbAorICAgICAqIGNyYXNoIGhvcnJpYmx5LgorICAgICAqLworICAgIGJvb2wgaXNW
YWxpZCgpIGNvbnN0OworCisgICAgaW50IHdpZHRoKCkgY29uc3Q7CisgICAgaW50IGhlaWdodCgp
IGNvbnN0OworCisgICAgU3VyZmFjZU9wZW5WRyogc2hhcmVkU3VyZmFjZSgpIGNvbnN0OworCisg
ICAgLyoqCisgICAgICogTWFrZSB0aGUgYXNzb2NpYXRlZCBHTC9FR0wgY29udGV4dCB0aGUgY3Vy
cmVudCBvbmUsIHNvIHRoYXQgc3Vic2VxdWVudAorICAgICAqIE9wZW5WRyBjb21tYW5kcyBhcHBs
eSB0byBpdC4KKyAgICAgKi8KKyAgICB2b2lkIG1ha2VDdXJyZW50KCk7CisKKyAgICAvKioKKyAg
ICAgKiBNYWtlIGEgc3VyZmFjZS9jb250ZXh0IGNvbWJpbmF0aW9uIGN1cnJlbnQgdGhhdCBpcyAi
Y29tcGF0aWJsZSIKKyAgICAgKiAoaS5lLiBjYW4gYWNjZXNzIGl0cyBzaGFyZWQgcmVzb3VyY2Vz
KSB0byB0aGUgZ2l2ZW4gb25lLiBJZiBubworICAgICAqIHN1cmZhY2UvY29udGV4dCBpcyBjdXJy
ZW50LCB0aGUgZ2l2ZW4gb25lIGlzIG1hZGUgY3VycmVudC4KKyAgICAgKgorICAgICAqIFRoaXMg
bWV0aG9kIGlzIG1lYW50IHRvIGF2b2lkIGNvbnRleHQgY2hhbmdlcyBpZiB0aGV5J3JlIG5vdAor
ICAgICAqIG5lY2Vzc2FyeSwgcGFydGljdWxhcmx5IHRhaWxvcmVkIGZvciB0aGUgY2FzZSB3aGVy
ZSBzb21ldGhpbmcKKyAgICAgKiBjb21wYXRpYmxlIHRvIHRoZSBzaGFyZWQgc3VyZmFjZSBpcyBy
ZXF1ZXN0ZWQgd2hpbGUgYWN0dWFsIHBhaW50aW5nCisgICAgICogaGFwcGVucyBvbiBhbm90aGVy
IHN1cmZhY2UuCisgICAgICovCisgICAgdm9pZCBtYWtlQ29tcGF0aWJsZUN1cnJlbnQoKTsKKwor
ICAgIC8qKgorICAgICAqIEVtcHR5IHRoZSBPcGVuVkcgcGlwZWxpbmUgYW5kIG1ha2Ugc3VyZSBh
bGwgdGhlIHBlcmZvcm1lZCBwYWludAorICAgICAqIG9wZXJhdGlvbnMgc2hvdyB1cCBvbiB0aGUg
c3VyZmFjZSBhcyBhY3R1YWwgZHJhd24gcGl4ZWxzLgorICAgICAqLworICAgIHZvaWQgZmx1c2go
KTsKKworcHJpdmF0ZToKKyNpZiBQTEFURk9STShFR0wpCisgICAgU3VyZmFjZU9wZW5WRygpOyAv
LyBmb3IgRUdMRGlzcGxheU9wZW5WRworCisgICAgRUdMRGlzcGxheSBtX2VnbERpc3BsYXk7Cisg
ICAgRUdMU3VyZmFjZSBtX2VnbFN1cmZhY2U7CisgICAgRUdMQ29udGV4dCBtX2VnbENvbnRleHQ7
CisjZW5kaWYKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFN1cmZh
Y2VPcGVuVkdfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcv
VkdVdGlscy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvVkdVdGlscy5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNTVkZTkKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9WR1V0aWxzLmgKQEAgLTAsMCAr
MSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQg
MjAwOS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBWR1V0aWxzX2gKKyNkZWZpbmUgVkdV
dGlsc19oCisKKyNpbmNsdWRlIDxvcGVudmcuaD4KKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5o
PgorCisjZGVmaW5lIEFTU0VSVF9WR19OT19FUlJPUigpIFwKKyAgICBkbyB7IFwKKyAgICAgICAg
VkdFcnJvckNvZGUgZXJyb3IgPSB2Z0dldEVycm9yKCk7IFwKKyAgICAgICAgaWYgKGVycm9yICE9
IFZHX05PX0VSUk9SKSB7IFwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR4dDsgXAorICAgICAg
ICAgICAgc3dpdGNoIChlcnJvcikgeyBcCisgICAgICAgICAgICBjYXNlIFZHX0JBRF9IQU5ETEVf
RVJST1I6IHR4dCA9ICJWR19CQURfSEFORExFX0VSUk9SIjsgYnJlYWs7XAorICAgICAgICAgICAg
Y2FzZSBWR19JTExFR0FMX0FSR1VNRU5UX0VSUk9SOiB0eHQgPSAiVkdfSUxMRUdBTF9BUkdVTUVO
VF9FUlJPUiI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgVkdfT1VUX09GX01FTU9SWV9FUlJP
UjogdHh0ID0gIlZHX09VVF9PRl9NRU1PUllfRVJST1IiOyBicmVhaztcCisgICAgICAgICAgICBj
YXNlIFZHX1BBVEhfQ0FQQUJJTElUWV9FUlJPUjogdHh0ID0gIlZHX1BBVEhfQ0FQQUJJTElUWV9F
UlJPUiI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgVkdfVU5TVVBQT1JURURfSU1BR0VfRk9S
TUFUX0VSUk9SOiB0eHQgPSAiVkdfVU5TVVBQT1JURURfSU1BR0VfRk9STUFUX0VSUk9SIjsgYnJl
YWs7XAorICAgICAgICAgICAgY2FzZSBWR19VTlNVUFBPUlRFRF9QQVRIX0ZPUk1BVF9FUlJPUjog
dHh0ID0gIlZHX1VOU1VQUE9SVEVEX1BBVEhfRk9STUFUX0VSUk9SIjsgYnJlYWs7XAorICAgICAg
ICAgICAgY2FzZSBWR19JTUFHRV9JTl9VU0VfRVJST1I6IHR4dCA9ICJWR19JTUFHRV9JTl9VU0Vf
RVJST1IiOyBicmVhaztcCisgICAgICAgICAgICBjYXNlIFZHX05PX0NPTlRFWFRfRVJST1I6IHR4
dCA9ICJWR19OT19DT05URVhUX0VSUk9SIjsgYnJlYWs7XAorICAgICAgICAgICAgZGVmYXVsdDog
dHh0ID0gIlVOS05PV05fRVJST1IiOyBicmVhaztcCisgICAgICAgICAgICB9IFwKKyAgICAgICAg
ICAgIFdURlJlcG9ydEFzc2VydGlvbkZhaWx1cmVXaXRoTWVzc2FnZShfX0ZJTEVfXywgX19MSU5F
X18sIFdURl9QUkVUVFlfRlVOQ1RJT04sICIiLCAiRm91bmQgJXMiLCB0eHQpOyBcCisgICAgICAg
ICAgICBDUkFTSCgpOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKyNlbmRpZiAv
LyBWR1V0aWxzX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46283</attachid>
            <date>2010-01-11 09:30:52 -0800</date>
            <delta_ts>2010-01-13 13:40:57 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-33403-20100111123048.patch</filename>
            <type>text/plain</type>
            <size>35057</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmQ4OTFiZC4uY2NjZTg4OCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2MiBAQAorMjAxMC0wMS0wOCAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFtPcGVuVkddIEFkZCAoRUdMKSBzdXJmYWNlL2NvbnRleHQgbWFu
YWdlbWVudAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MzM0MDMKKworICAgICAgICBUaGUgZm91bmRhdGlvbnMgZm9yIGEgbmV3IE9wZW5WRyBwb3J0Lgor
CisgICAgICAgIE9wZW5WRyBpcyBub3QgdGllZCB0byBFR0wgcGVyIHNlLCBFR0wganVzdCBoYXBw
ZW5zIHRvIGJlCisgICAgICAgIHRoZSBvbmx5IHVzYWJsZSBiYWNrZW5kIGZvciBPcGVuVkcgc3Rh
dGUgYW5kIHBhaW50aW5nLgorCisgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBTdXJmYWNlT3Bl
blZHIGNsYXNzIGlzIHRvIHByb3ZpZGUKKyAgICAgICAgYW4gRUdMLWluZGVwZW5kZW50IGludGVy
ZmFjZSBmb3IgT3BlblZHLXNwZWNpZmljIGNvZGUuCisgICAgICAgIFRoZSBFR0xEaXNwbGF5T3Bl
blZHIGNsYXNzIHRha2VzIGNhcmUgb2Yga2VlcGluZyB0cmFjaworICAgICAgICBvZiBFR0wgZGlz
cGxheXMsIHN1cmZhY2VzIGFuZCBjb250ZXh0cy4gSXQgYWxzbyBtYWtlcworICAgICAgICBzdXJl
IHRoYXQgYWxsIGNyZWF0ZWQgY29udGV4dHMgYXJlIGludGVyb3BlcmFibGUsIGFuZAorICAgICAg
ICB0aGF0IGRpZmZlcmVudCBzdXJmYWNlcyB1c2UgYSBzaW5nbGUgY29udGV4dCBpZiBwb3NzaWJs
ZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZH
LmNwcDogQWRkZWQuCisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50U3VyZmFjZSk6
CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpyZWdpc3RlclBsYXRmb3JtU3VyZmFjZSk6Cisg
ICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjp1bnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKToKKyAg
ICAgICAgKEVHTERpc3BsYXlPcGVuVkc6OnNldEN1cnJlbnREaXNwbGF5KToKKyAgICAgICAgKEVH
TERpc3BsYXlPcGVuVkc6OmN1cnJlbnQpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6Zm9y
RGlzcGxheSk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpFR0xEaXNwbGF5T3BlblZHKToK
KyAgICAgICAgKEVHTERpc3BsYXlPcGVuVkc6On5FR0xEaXNwbGF5T3BlblZHKToKKyAgICAgICAg
KEVHTERpc3BsYXlPcGVuVkc6OnNldERlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKEVH
TERpc3BsYXlPcGVuVkc6OmRlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKEVHTERpc3Bs
YXlPcGVuVkc6OnNldERlZmF1bHRXaW5kb3dDb25maWcpOgorICAgICAgICAoRUdMRGlzcGxheU9w
ZW5WRzo6ZGVmYXVsdFdpbmRvd0NvbmZpZyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpz
aGFyZWRQbGF0Zm9ybVN1cmZhY2UpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6Y3JlYXRl
UGJ1ZmZlclN1cmZhY2UpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZUZvcldp
bmRvdyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpzdXJmYWNlc0NvbXBhdGlibGUpOgor
ICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6ZGVzdHJveVN1cmZhY2UpOgorICAgICAgICAoRUdM
RGlzcGxheU9wZW5WRzo6Y29udGV4dEZvclN1cmZhY2UpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6RUdMRGlzcGxheU9wZW5WRzo6ZGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL0VHTFV0aWxzLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9TdXJmYWNlT3BlblZHLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTdXJm
YWNlT3BlblZHOjpjdXJyZW50U3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjptX2VnbERpc3Bs
YXkpOgorICAgICAgICAoV2ViQ29yZTo6bV9lZ2xDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlN1cmZhY2VPcGVuVkc6On5TdXJmYWNlT3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZh
Y2VPcGVuVkc6OmlzVmFsaWQpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6d2lk
dGgpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6aGVpZ2h0KToKKyAgICAgICAg
KFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6OnNoYXJlZFN1cmZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6U3VyZmFjZU9wZW5WRzo6bWFrZUN1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFj
ZU9wZW5WRzo6bWFrZUNvbXBhdGlibGVDdXJyZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZh
Y2VPcGVuVkc6OmZsdXNoKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3Vy
ZmFjZU9wZW5WRy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6OmVn
bERpc3BsYXkpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6ZWdsU3VyZmFjZSk6
CisgICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjplZ2xDb250ZXh0KToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvVkdVdGlscy5oOiBBZGRlZC4KKwogMjAxMC0wMS0w
NyAgQ2hyaXN0aWFuIFNlamVyc2VuICA8Y2hyaXN0aWFuLndlYmtpdEBnbWFpbC5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjVmMDM1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmNwcApAQCAtMCwwICsxLDM4
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAw
OS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkVH
TERpc3BsYXlPcGVuVkcuaCIKKworI2luY2x1ZGUgIkVHTFV0aWxzLmgiCisjaW5jbHVkZSAiSW50
U2l6ZS5oIgorI2luY2x1ZGUgIlN1cmZhY2VPcGVuVkcuaCIKKworI2luY2x1ZGUgPHd0Zi9Bc3Nl
cnRpb25zLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCisvLyBGaWxlLXN0YXRpYyB2
YXJpYWJsZXMuCitzdGF0aWMgV1RGOjpIYXNoTWFwPEVHTERpc3BsYXksIEVHTERpc3BsYXlPcGVu
VkcqPiogc19kaXNwbGF5TWFuYWdlcnMgPSAwOworc3RhdGljIEVHTERpc3BsYXlPcGVuVkcqIHNf
Y3VycmVudCA9IDA7CisKKworLy8gU3RhdGljIGNsYXNzIG1lbWJlcnMuCisKK1N1cmZhY2VPcGVu
VkcqIEVHTERpc3BsYXlPcGVuVkc6OmN1cnJlbnRTdXJmYWNlKCkKK3sKKyAgICBpZiAoIXNfZGlz
cGxheU1hbmFnZXJzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEVHTERpc3BsYXkgY3VycmVu
dERpc3BsYXkgPSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpOworICAgIGlmIChjdXJyZW50RGlzcGxh
eSA9PSBFR0xfTk9fRElTUExBWSB8fCAhc19kaXNwbGF5TWFuYWdlcnMtPmNvbnRhaW5zKGN1cnJl
bnREaXNwbGF5KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBFR0xEaXNwbGF5T3BlblZHKiBk
aXNwbGF5TWFuYWdlciA9IHNfZGlzcGxheU1hbmFnZXJzLT5nZXQoY3VycmVudERpc3BsYXkpOwor
ICAgIEVHTFN1cmZhY2UgY3VycmVudFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xf
RFJBVyk7CisKKyAgICBpZiAoY3VycmVudFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UgfHwgIWRp
c3BsYXlNYW5hZ2VyLT5tX3BsYXRmb3JtU3VyZmFjZXMuY29udGFpbnMoY3VycmVudFN1cmZhY2Up
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBkaXNwbGF5TWFuYWdlci0+bV9wbGF0
Zm9ybVN1cmZhY2VzLmdldChjdXJyZW50U3VyZmFjZSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9w
ZW5WRzo6cmVnaXN0ZXJQbGF0Zm9ybVN1cmZhY2UoU3VyZmFjZU9wZW5WRyogcGxhdGZvcm1TdXJm
YWNlKQoreworICAgIEVHTERpc3BsYXlPcGVuVkcqIGRpc3BsYXlNYW5hZ2VyID0gRUdMRGlzcGxh
eU9wZW5WRzo6Zm9yRGlzcGxheShwbGF0Zm9ybVN1cmZhY2UtPmVnbERpc3BsYXkoKSk7CisgICAg
ZGlzcGxheU1hbmFnZXItPm1fcGxhdGZvcm1TdXJmYWNlcy5zZXQocGxhdGZvcm1TdXJmYWNlLT5l
Z2xTdXJmYWNlKCksIHBsYXRmb3JtU3VyZmFjZSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5W
Rzo6dW5yZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZHKiBwbGF0Zm9ybVN1cmZh
Y2UpCit7CisgICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5
T3BlblZHOjpmb3JEaXNwbGF5KHBsYXRmb3JtU3VyZmFjZS0+ZWdsRGlzcGxheSgpKTsKKyAgICBk
aXNwbGF5TWFuYWdlci0+bV9wbGF0Zm9ybVN1cmZhY2VzLnJlbW92ZShwbGF0Zm9ybVN1cmZhY2Ut
PmVnbFN1cmZhY2UoKSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6c2V0Q3VycmVudERp
c3BsYXkoRUdMRGlzcGxheSBkaXNwbGF5KQoreworICAgIHNfY3VycmVudCA9IEVHTERpc3BsYXlP
cGVuVkc6OmZvckRpc3BsYXkoZGlzcGxheSk7Cit9CisKK0VHTERpc3BsYXlPcGVuVkcqIEVHTERp
c3BsYXlPcGVuVkc6OmN1cnJlbnQoKQoreworICAgIGlmICghc19jdXJyZW50KSB7CisgICAgICAg
IEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7
CisgICAgICAgIGVnbEluaXRpYWxpemUoZGlzcGxheSwgMCwgMCk7CisgICAgICAgIEFTU0VSVF9F
R0xfTk9fRVJST1IoKTsKKworICAgICAgICBzX2N1cnJlbnQgPSBFR0xEaXNwbGF5T3BlblZHOjpm
b3JEaXNwbGF5KGRpc3BsYXkpOworICAgIH0KKyAgICByZXR1cm4gc19jdXJyZW50OworfQorCitF
R0xEaXNwbGF5T3BlblZHKiBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KEVHTERpc3BsYXkg
ZGlzcGxheSkKK3sKKyAgICBpZiAoIXNfZGlzcGxheU1hbmFnZXJzKQorICAgICAgICBzX2Rpc3Bs
YXlNYW5hZ2VycyA9IG5ldyBXVEY6Okhhc2hNYXA8RUdMRGlzcGxheSwgRUdMRGlzcGxheU9wZW5W
Ryo+KCk7CisKKyAgICBpZiAoIXNfZGlzcGxheU1hbmFnZXJzLT5jb250YWlucyhkaXNwbGF5KSkK
KyAgICAgICAgc19kaXNwbGF5TWFuYWdlcnMtPnNldChkaXNwbGF5LCBuZXcgRUdMRGlzcGxheU9w
ZW5WRyhkaXNwbGF5KSk7CisKKyAgICByZXR1cm4gc19kaXNwbGF5TWFuYWdlcnMtPmdldChkaXNw
bGF5KTsKK30KKworCisvLyBPYmplY3QvaW5zdGFuY2UgbWVtYmVycy4KKworRUdMRGlzcGxheU9w
ZW5WRzo6RUdMRGlzcGxheU9wZW5WRyhFR0xEaXNwbGF5IGRpc3BsYXkpCisgICAgOiBtX2Rpc3Bs
YXkoZGlzcGxheSkKKyAgICAsIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlKDApCisgICAgLCBtX3Bi
dWZmZXJDb25maWcoMCkKKyAgICAsIG1fd2luZG93Q29uZmlnKDApCit7CisgICAgZWdsQmluZEFQ
SShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworfQorCitFR0xE
aXNwbGF5T3BlblZHOjp+RUdMRGlzcGxheU9wZW5WRygpCit7CisgICAgZWdsTWFrZUN1cnJlbnQo
bV9kaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhU
KTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisKKyAgICBkZWxldGUgbV9zaGFyZWRQbGF0
Zm9ybVN1cmZhY2U7CisKKyAgICBXVEY6Okhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50Pjo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gbV9zdXJmYWNlQ29uZmlnSWRzLmVuZCgpOworICAgIGZvciAoV1RG
OjpIYXNoTWFwPEVHTFN1cmZhY2UsIEVHTGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9zdXJm
YWNlQ29uZmlnSWRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgZGVzdHJveVN1
cmZhY2UoKCppdCkuZmlyc3QpOworCisgICAgZWdsVGVybWluYXRlKG1fZGlzcGxheSk7CisgICAg
QVNTRVJUX0VHTF9OT19FUlJPUigpOworfQorCit2b2lkIEVHTERpc3BsYXlPcGVuVkc6OnNldERl
ZmF1bHRQYnVmZmVyQ29uZmlnKEVHTENvbmZpZyBjb25maWcpCit7CisgICAgbV9wYnVmZmVyQ29u
ZmlnID0gY29uZmlnOworfQorCitFR0xDb25maWcgRUdMRGlzcGxheU9wZW5WRzo6ZGVmYXVsdFBi
dWZmZXJDb25maWcoKQoreworICAgIC8vIEhvcGVmdWxseSB0aGUgY2xpZW50IHdpbGwgaGF2ZSBz
ZXQgdGhlIHBidWZmZXIgY29uZmlnIG9mIGl0cyBjaG9pY2UKKyAgICAvLyBieSBub3cgLSBpZiBu
b3QsIHVzZSBhIDMyLWJpdCBnZW5lcmljIG9uZSBhcyBkZWZhdWx0LgorICAgIGlmICghbV9wYnVm
ZmVyQ29uZmlnKSB7CisgICAgICAgIEVHTGludCBudW1Db25maWdzOworCisgICAgICAgIHN0YXRp
YyBjb25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgICAgRUdMX1JFRF9T
SVpFLCAgIDgsCisgICAgICAgICAgICBFR0xfR1JFRU5fU0laRSwgOCwKKyAgICAgICAgICAgIEVH
TF9CTFVFX1NJWkUsICA4LAorICAgICAgICAgICAgRUdMX0FMUEhBX1NJWkUsIDgsCisgICAgICAg
ICAgICBFR0xfQUxQSEFfTUFTS19TSVpFLCAxLAorICAgICAgICAgICAgRUdMX0xVTUlOQU5DRV9T
SVpFLCAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgIEVH
TF9QQlVGRkVSX0JJVCwKKyAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVO
VkdfQklULAorICAgICAgICAgICAgRUdMX05PTkUgfTsKKworICAgICAgICBlZ2xDaG9vc2VDb25m
aWcobV9kaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmbV9wYnVmZmVyQ29uZmlnLCAxLCAmbnVtQ29u
Zmlncyk7CisgICAgICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyAgICAgICAgQVNTRVJUKG51
bUNvbmZpZ3MgPT0gMSk7CisgICAgfQorICAgIHJldHVybiBtX3BidWZmZXJDb25maWc7Cit9CisK
K3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6c2V0RGVmYXVsdFdpbmRvd0NvbmZpZyhFR0xDb25maWcg
Y29uZmlnKQoreworICAgIG1fd2luZG93Q29uZmlnID0gY29uZmlnOworfQorCitFR0xDb25maWcg
RUdMRGlzcGxheU9wZW5WRzo6ZGVmYXVsdFdpbmRvd0NvbmZpZygpCit7CisgICAgLy8gSG9wZWZ1
bGx5IHRoZSBjbGllbnQgd2lsbCBoYXZlIHNldCB0aGUgd2luZG93IGNvbmZpZyBvZiBpdHMgY2hv
aWNlCisgICAgLy8gYnkgbm93IC0gaWYgbm90LCB1c2UgYSAzMi1iaXQgZ2VuZXJpYyBvbmUgYXMg
ZGVmYXVsdC4KKyAgICBpZiAoIW1fd2luZG93Q29uZmlnKSB7CisgICAgICAgIEVHTGludCBudW1D
b25maWdzOworCisgICAgICAgIHN0YXRpYyBjb25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0g
eworICAgICAgICAgICAgRUdMX1JFRF9TSVpFLCAgIDgsCisgICAgICAgICAgICBFR0xfR1JFRU5f
U0laRSwgOCwKKyAgICAgICAgICAgIEVHTF9CTFVFX1NJWkUsICA4LAorICAgICAgICAgICAgRUdM
X0FMUEhBX1NJWkUsIDgsCisgICAgICAgICAgICBFR0xfQUxQSEFfTUFTS19TSVpFLCAxLAorICAg
ICAgICAgICAgRUdMX0xVTUlOQU5DRV9TSVpFLCAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgICAg
IEVHTF9TVVJGQUNFX1RZUEUsICAgIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgRUdMX1JF
TkRFUkFCTEVfVFlQRSwgRUdMX09QRU5WR19CSVQsCisgICAgICAgICAgICBFR0xfTk9ORSB9Owor
CisgICAgICAgIGVnbENob29zZUNvbmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZtX3dp
bmRvd0NvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9S
KCk7CisgICAgICAgIEFTU0VSVChudW1Db25maWdzID09IDEpOworICAgIH0KKyAgICByZXR1cm4g
bV93aW5kb3dDb25maWc7Cit9CisKK1N1cmZhY2VPcGVuVkcqIEVHTERpc3BsYXlPcGVuVkc6OnNo
YXJlZFBsYXRmb3JtU3VyZmFjZSgpCit7CisgICAgaWYgKCFtX3NoYXJlZFBsYXRmb3JtU3VyZmFj
ZSkgeworICAgICAgICBFR0xDb25maWcgY29uZmlnID0gZGVmYXVsdFBidWZmZXJDb25maWcoKTsK
KyAgICAgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gY3JlYXRlUGJ1ZmZlclN1cmZhY2UoSW50U2l6
ZSgxLCAxKSwgY29uZmlnKTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAg
ICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobV9kaXNwbGF5LCBjb25m
aWcsIEVHTF9OT19DT05URVhULCAwKTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOwor
ICAgICAgICBtX2NvbnRleHRzLnNldChtX3N1cmZhY2VDb25maWdJZHMuZ2V0KHN1cmZhY2UpLCBj
b250ZXh0KTsKKworICAgICAgICBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZSA9IG5ldyBTdXJmYWNl
T3BlblZHKCk7CisgICAgICAgIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlLT5tX2VnbERpc3BsYXkg
PSBtX2Rpc3BsYXk7CisgICAgICAgIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlLT5tX2VnbFN1cmZh
Y2UgPSBzdXJmYWNlOworICAgICAgICBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZS0+bV9lZ2xDb250
ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbV9wbGF0Zm9ybVN1cmZhY2VzLnNldChzdXJmYWNlLCBt
X3NoYXJlZFBsYXRmb3JtU3VyZmFjZSk7IC8vIGEuay5hLiByZWdpc3RlclBsYXRmb3JtU3VyZmFj
ZSgpCisgICAgfQorICAgIHJldHVybiBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZTsKK30KKworRUdM
U3VyZmFjZSBFR0xEaXNwbGF5T3BlblZHOjpjcmVhdGVQYnVmZmVyU3VyZmFjZShjb25zdCBJbnRT
aXplJiBzaXplLCBFR0xDb25maWcgY29uZmlnKQoreworICAgIGlmICghY29uZmlnKQorICAgICAg
ICBjb25maWcgPSBkZWZhdWx0UGJ1ZmZlckNvbmZpZygpOworCisgICAgY29uc3QgRUdMaW50IGF0
dHJpYkxpc3RbXSA9IHsKKyAgICAgICAgRUdMX1dJRFRILCBzaXplLndpZHRoKCksCisgICAgICAg
IEVHTF9IRUlHSFQsIHNpemUuaGVpZ2h0KCksCisgICAgICAgIEVHTF9OT05FCisgICAgfTsKKyAg
ICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShtX2Rpc3BsYXks
IGNvbmZpZywgYXR0cmliTGlzdCk7CisgICAgaWYgKGVnbEdldEVycm9yKCkgIT0gRUdMX1NVQ0NF
U1MpCisgICAgICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKKworICAgIEVHTGludCBzdXJmYWNl
Q29uZmlnSWQ7CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1f
ZGlzcGxheSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICBB
U1NFUlQoc3VjY2VzcyA9PSBFR0xfVFJVRSk7CisgICAgQVNTRVJUKHN1cmZhY2VDb25maWdJZCAh
PSBFR0xfQkFEX0FUVFJJQlVURSk7CisKKyAgICBtX3N1cmZhY2VDb25maWdJZHMuc2V0KHN1cmZh
Y2UsIHN1cmZhY2VDb25maWdJZCk7CisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK0VHTFN1cmZh
Y2UgRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZUZvcldpbmRvdyhFR0xOYXRpdmVXaW5kb3dUeXBl
IHdJZCwgY29uc3QgRUdMQ29uZmlnJiBjb25maWcpCit7CisgICAgaWYgKG1fd2luZG93U3VyZmFj
ZXMuY29udGFpbnMod0lkKSkKKyAgICAgICAgcmV0dXJuIG1fd2luZG93U3VyZmFjZXMuZ2V0KHdJ
ZCk7CisKKyAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKG1f
ZGlzcGxheSwgY29uZmlnLCB3SWQsIDApOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKwor
ICAgIEVHTGludCBzdXJmYWNlQ29uZmlnSWQ7CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWds
R2V0Q29uZmlnQXR0cmliKG1fZGlzcGxheSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmc3VyZmFj
ZUNvbmZpZ0lkKTsKKyAgICBBU1NFUlQoc3VjY2VzcyA9PSBFR0xfVFJVRSk7CisgICAgQVNTRVJU
KHN1cmZhY2VDb25maWdJZCAhPSBFR0xfQkFEX0FUVFJJQlVURSk7CisKKyAgICBtX3N1cmZhY2VD
b25maWdJZHMuc2V0KHN1cmZhY2UsIHN1cmZhY2VDb25maWdJZCk7CisgICAgcmV0dXJuIHN1cmZh
Y2U7Cit9CisKK2Jvb2wgRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZXNDb21wYXRpYmxlKEVHTFN1
cmZhY2Ugc3VyZmFjZSwgRUdMU3VyZmFjZSBvdGhlclN1cmZhY2UpCit7CisgICAgaWYgKHN1cmZh
Y2UgPT0gRUdMX05PX1NVUkZBQ0UgfHwgb3RoZXJTdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDdXJyZW50bHksIHdlIGFzc3VtZSB0aGF0
IGFsbCBzdXJmYWNlcyBrbm93biB0byB0aGlzIG9iamVjdCBhcmUKKyAgICAvLyBjb250ZXh0LWNv
bXBhdGlibGUgdG8gZWFjaCBvdGhlciAod2hpY2ggaXMgcmVhc29uYWJsZSB0byBhc3N1bWUsCisg
ICAgLy8gb3RoZXJ3aXNlIGVnbENyZWF0ZUNvbnRleHQoKSB3b3VsZCBmYWlsIHdpdGggRUdMX0JB
RF9NQVRDSCBmb3Igc2hhcmVkCisgICAgLy8gY29udGV4dCBjb21wYXRpYmlsaXR5IGFueXdheXMu
CisgICAgcmV0dXJuIChtX3N1cmZhY2VDb25maWdJZHMuY29udGFpbnMoc3VyZmFjZSkgJiYgbV9z
dXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKG90aGVyU3VyZmFjZSkpOworfQorCit2b2lkIEVHTERp
c3BsYXlPcGVuVkc6OmRlc3Ryb3lTdXJmYWNlKEVHTFN1cmZhY2Ugc3VyZmFjZSkKK3sKKyAgICBB
U1NFUlQoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBpZiAoZWdsR2V0Q3VycmVu
dFN1cmZhY2UoRUdMX0RSQVcpID09IHN1cmZhY2UpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQo
bV9kaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhU
KTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIH0KKworICAgIC8vIERlc3Ry
b3kgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB0byB0aGUgc3VyZmFjZSwgaWYgd2UgYWxyZWFkeSBj
cmVhdGVkIG9uZS4KKyAgICBpZiAobV9zdXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2Up
KSB7CisgICAgICAgIEVHTGludCBzdXJmYWNlQ29uZmlnSWQgPSBtX3N1cmZhY2VDb25maWdJZHMu
dGFrZShzdXJmYWNlKTsgLy8gdGFrZSA9IGdldCBhbmQgcmVtb3ZlCisgICAgICAgIGJvb2wgaXND
b250ZXh0UmVmZXJlbmNlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChtX2NvbXBhdGlibGVDb25m
aWdJZHMuY29udGFpbnMoc3VyZmFjZUNvbmZpZ0lkKSkKKyAgICAgICAgICAgIHN1cmZhY2VDb25m
aWdJZCA9IG1fY29tcGF0aWJsZUNvbmZpZ0lkcy5nZXQoc3VyZmFjZUNvbmZpZ0lkKTsKKworICAg
ICAgICBXVEY6Okhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50Pjo6aXRlcmF0b3IgZW5kID0gbV9z
dXJmYWNlQ29uZmlnSWRzLmVuZCgpOworCisgICAgICAgIC8vIC4uLmJ1dCBvbmx5IGlmIHRoZXJl
J3Mgbm8gb3RoZXIgc3VyZmFjZXMgYXNzb2NpYXRlZCB0byB0aGF0IGNvbnRleHQuCisgICAgICAg
IGZvciAoV1RGOjpIYXNoTWFwPEVHTFN1cmZhY2UsIEVHTGludD46Oml0ZXJhdG9yIGl0ID0gbV9z
dXJmYWNlQ29uZmlnSWRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAg
aWYgKCgqaXQpLnNlY29uZCA9PSBzdXJmYWNlQ29uZmlnSWQpIHsKKyAgICAgICAgICAgICAgICBp
c0NvbnRleHRSZWZlcmVuY2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzQ29udGV4dFJlZmVyZW5jZWQgJiYg
bV9jb250ZXh0cy5jb250YWlucyhzdXJmYWNlQ29uZmlnSWQpKSB7CisgICAgICAgICAgICBFR0xD
b250ZXh0IGNvbnRleHQgPSBtX2NvbnRleHRzLnRha2Uoc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICAg
ICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KG1fZGlzcGxheSwgY29udGV4dCk7CisgICAgICAgICAg
ICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3BsYXRm
b3JtU3VyZmFjZXMucmVtb3ZlKHN1cmZhY2UpOworCisgICAgV1RGOjpIYXNoTWFwPEVHTE5hdGl2
ZVdpbmRvd1R5cGUsIEVHTFN1cmZhY2U+OjppdGVyYXRvciBlbmQgPSBtX3dpbmRvd1N1cmZhY2Vz
LmVuZCgpOworICAgIGZvciAoV1RGOjpIYXNoTWFwPEVHTE5hdGl2ZVdpbmRvd1R5cGUsIEVHTFN1
cmZhY2U+OjppdGVyYXRvciBpdCA9IG1fd2luZG93U3VyZmFjZXMuYmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS5zZWNvbmQgPT0gc3VyZmFjZSkKKyAgICAgICAg
ICAgIG1fd2luZG93U3VyZmFjZXMucmVtb3ZlKGl0KTsKKyAgICB9CisKKyAgICBlZ2xEZXN0cm95
U3VyZmFjZShtX2Rpc3BsYXksIHN1cmZhY2UpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsK
K30KKworRUdMQ29udGV4dCBFR0xEaXNwbGF5T3BlblZHOjpjb250ZXh0Rm9yU3VyZmFjZShFR0xT
dXJmYWNlIHN1cmZhY2UpCit7CisgICAgQVNTRVJUKHN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0Up
OworCisgICAgaWYgKG1fcGxhdGZvcm1TdXJmYWNlcy5jb250YWlucyhzdXJmYWNlKSkKKyAgICAg
ICAgcmV0dXJuIG1fcGxhdGZvcm1TdXJmYWNlcy5nZXQoc3VyZmFjZSktPmVnbENvbnRleHQoKTsK
KworICAgIGVnbEJpbmRBUEkoRUdMX09QRU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJS
T1IoKTsKKworICAgIEVHTGludCBzdXJmYWNlQ29uZmlnSWQ7CisKKyAgICBpZiAobV9zdXJmYWNl
Q29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2UpKQorICAgICAgICBzdXJmYWNlQ29uZmlnSWQgPSBt
X3N1cmZhY2VDb25maWdJZHMuZ2V0KHN1cmZhY2UpOworICAgIGVsc2UgeworICAgICAgICAvLyBS
ZXRyaWV2ZSB0aGUgc2FtZSBFR0wgY29uZmlnIGZvciBjb250ZXh0IGNyZWF0aW9uIHRoYXQgd2Fz
IHVzZWQgdG8KKyAgICAgICAgLy8gY3JlYXRlIHRoZSB0aGUgRUdMIHN1cmZhY2UuCisgICAgICAg
IEVHTEJvb2xlYW4gc3VjY2VzcyA9IGVnbFF1ZXJ5U3VyZmFjZShtX2Rpc3BsYXksIHN1cmZhY2Us
IEVHTF9DT05GSUdfSUQsICZzdXJmYWNlQ29uZmlnSWQpOworICAgICAgICBBU1NFUlQoc3VjY2Vz
cyA9PSBFR0xfVFJVRSk7CisgICAgICAgIEFTU0VSVChzdXJmYWNlQ29uZmlnSWQgIT0gRUdMX0JB
RF9BVFRSSUJVVEUpOworCisgICAgICAgIG1fc3VyZmFjZUNvbmZpZ0lkcy5zZXQoc3VyZmFjZSwg
c3VyZmFjZUNvbmZpZ0lkKTsKKyAgICB9CisKKyAgICBpZiAobV9jb21wYXRpYmxlQ29uZmlnSWRz
LmNvbnRhaW5zKHN1cmZhY2VDb25maWdJZCkpCisgICAgICAgIHN1cmZhY2VDb25maWdJZCA9IG1f
Y29tcGF0aWJsZUNvbmZpZ0lkcy5nZXQoc3VyZmFjZUNvbmZpZ0lkKTsKKworICAgIGlmIChtX2Nv
bnRleHRzLmNvbnRhaW5zKHN1cmZhY2VDb25maWdJZCkpCisgICAgICAgIHJldHVybiBtX2NvbnRl
eHRzLmdldChzdXJmYWNlQ29uZmlnSWQpOworCisgICAgaWYgKCFtX3NoYXJlZFBsYXRmb3JtU3Vy
ZmFjZSkgLy8gc2hhcmVkIGNvbnRleHQgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0CisgICAgICAg
IHNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpOyAvLyBjcmVhdGVzIHRoZSBzaGFyZWQgc3VyZmFjZSAm
IGNvbnRleHQKKworICAgIEVHTERpc3BsYXkgY3VycmVudERpc3BsYXkgPSBlZ2xHZXRDdXJyZW50
RGlzcGxheSgpOworICAgIEVHTFN1cmZhY2UgY3VycmVudFJlYWRTdXJmYWNlID0gZWdsR2V0Q3Vy
cmVudFN1cmZhY2UoRUdMX1JFQUQpOworICAgIEVHTFN1cmZhY2UgY3VycmVudERyYXdTdXJmYWNl
ID0gZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMX0RSQVcpOworICAgIEVHTENvbnRleHQgY3VycmVu
dENvbnRleHQgPSBlZ2xHZXRDdXJyZW50Q29udGV4dCgpOworCisgICAgLy8gQmVmb3JlIGNyZWF0
aW5nIGEgbmV3IGNvbnRleHQsIGxldCdzIHRyeSB3aGV0aGVyIGFuIGV4aXN0aW5nIG9uZQorICAg
IC8vIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc3VyZmFjZS4gRUdMIGRvZXNuJ3QgZ2l2ZSB1cyBh
IGRpZmZlcmVudCB3YXkKKyAgICAvLyB0byBjaGVjayBjb250ZXh0L3N1cmZhY2UgY29tcGF0aWJp
bGl0eSB0aGFuIHRyeWluZyBpdCBvdXQsIHNvIGxldCdzCisgICAgLy8gZG8ganVzdCB0aGF0Lgor
ICAgIFdURjo6SGFzaE1hcDxFR0xpbnQsIEVHTENvbnRleHQ+OjppdGVyYXRvciBlbmQgPSBtX2Nv
bnRleHRzLmVuZCgpOworCisgICAgZm9yIChXVEY6Okhhc2hNYXA8RUdMaW50LCBFR0xDb250ZXh0
Pjo6aXRlcmF0b3IgaXQgPSBtX2NvbnRleHRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewor
ICAgICAgICBlZ2xNYWtlQ3VycmVudChtX2Rpc3BsYXksIHN1cmZhY2UsIHN1cmZhY2UsICgqaXQp
LnNlY29uZCk7CisgICAgICAgIGlmIChlZ2xHZXRFcnJvcigpID09IEVHTF9TVUNDRVNTKSB7Cisg
ICAgICAgICAgICAvLyBSZXN0b3JlIHByZXZpb3VzIHN1cmZhY2UvY29udGV4dC4KKyAgICAgICAg
ICAgIGlmIChjdXJyZW50Q29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICAgICAg
ICAgIGVnbE1ha2VDdXJyZW50KGN1cnJlbnREaXNwbGF5LCBjdXJyZW50UmVhZFN1cmZhY2UsIGN1
cnJlbnREcmF3U3VyZmFjZSwgY3VycmVudENvbnRleHQpOworICAgICAgICAgICAgICAgIEFTU0VS
VF9FR0xfTk9fRVJST1IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvb2wsIHN1
cmZhY2UgaXMgY29tcGF0aWJsZSB0byBvbmUgb2Ygb3VyIGV4aXN0aW5nIGNvbnRleHRzLgorICAg
ICAgICAgICAgbV9jb21wYXRpYmxlQ29uZmlnSWRzLnNldChzdXJmYWNlQ29uZmlnSWQsICgqaXQp
LmZpcnN0KTsKKyAgICAgICAgICAgIHJldHVybiAoKml0KS5zZWNvbmQ7CisgICAgICAgIH0KKyAg
ICB9CisgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzdXJmYWNlL2NvbnRleHQuCisgICAgaWYgKGN1
cnJlbnRDb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7CisgICAgICAgIGVnbE1ha2VDdXJyZW50
KGN1cnJlbnREaXNwbGF5LCBjdXJyZW50UmVhZFN1cmZhY2UsIGN1cnJlbnREcmF3U3VyZmFjZSwg
Y3VycmVudENvbnRleHQpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgfQor
CisgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICBFR0xpbnQgbnVtQ29uZmlnczsKKworICAgIGNv
bnN0IEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7CisgICAgICAgIEVHTF9DT05GSUdfSUQsIHN1
cmZhY2VDb25maWdJZCwKKyAgICAgICAgRUdMX05PTkUKKyAgICB9OworICAgIGVnbENob29zZUNv
bmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsK
KyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgQVNTRVJUKG51bUNvbmZpZ3MgPT0gMSk7
CisKKyAgICAvLyBXZSBzaGFyZSBhbGwgb2YgdGhlIGltYWdlcyBhbmQgcGF0aHMgYW1vbmdzdCB0
aGUgZGlmZmVyZW50IGNvbnRleHRzLAorICAgIC8vIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBp
biBhbGwgb2YgdGhlbS4gUmVzb3VyY2VzIHRoYXQgYXJlIGNyZWF0ZWQKKyAgICAvLyB3aGlsZSBt
X3NoYXJlZFBsYXRmb3JtU3VyZmFjZS0+Y29udGV4dCgpIGlzIGN1cnJlbnQgd2lsbCBiZQorICAg
IC8vIGFjY2Vzc2libGUgZnJvbSBhbGwgb3RoZXIgY29udGV4dHMsIGJ1dCBhcmUgbm90IHJlc3Ry
aWN0ZWQgdG8gdGhlCisgICAgLy8gbGlmZXRpbWUgb2YgdGhvc2UgY29udGV4dHMuCisgICAgRUdM
Q29udGV4dCBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChtX2Rpc3BsYXksIGNvbmZpZywgbV9z
aGFyZWRQbGF0Zm9ybVN1cmZhY2UtPmVnbENvbnRleHQoKSwgMCk7CisgICAgQVNTRVJUX0VHTF9O
T19FUlJPUigpOworCisgICAgbV9jb250ZXh0cy5zZXQoc3VyZmFjZUNvbmZpZ0lkLCBjb250ZXh0
KTsKKyAgICByZXR1cm4gY29udGV4dDsKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi43ZTIxMjdkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9vcGVudmcvRUdMRGlzcGxheU9wZW5WRy5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDkuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKyNpZm5kZWYgRUdMRGlzcGxheU9wZW5WR19oCisjZGVmaW5lIEVHTERpc3Bs
YXlPcGVuVkdfaAorCisjaW5jbHVkZSA8ZWdsLmg+CisjaW5jbHVkZSA8b3BlbnZnLmg+CisjaW5j
bHVkZSA8d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJbnRT
aXplOworY2xhc3MgU3VyZmFjZU9wZW5WRzsKKworY2xhc3MgRUdMRGlzcGxheU9wZW5WRyB7Citw
dWJsaWM6CisgICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VPcGVuVkc7CisKKyAgICBzdGF0aWMgU3Vy
ZmFjZU9wZW5WRyogY3VycmVudFN1cmZhY2UoKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRDdXJyZW50
RGlzcGxheShFR0xEaXNwbGF5IGRpc3BsYXkpOworICAgIHN0YXRpYyBFR0xEaXNwbGF5T3BlblZH
KiBjdXJyZW50KCk7CisgICAgc3RhdGljIEVHTERpc3BsYXlPcGVuVkcqIGZvckRpc3BsYXkoRUdM
RGlzcGxheSBkaXNwbGF5KTsKKworICAgIHZvaWQgc2V0RGVmYXVsdFBidWZmZXJDb25maWcoRUdM
Q29uZmlnIGNvbmZpZyk7CisgICAgRUdMQ29uZmlnIGRlZmF1bHRQYnVmZmVyQ29uZmlnKCk7Cisg
ICAgdm9pZCBzZXREZWZhdWx0V2luZG93Q29uZmlnKEVHTENvbmZpZyBjb25maWcpOworICAgIEVH
TENvbmZpZyBkZWZhdWx0V2luZG93Q29uZmlnKCk7CisKKyAgICBFR0xEaXNwbGF5IGRpc3BsYXko
KSBjb25zdCB7IHJldHVybiBtX2Rpc3BsYXk7IH0KKyAgICBTdXJmYWNlT3BlblZHKiBzaGFyZWRQ
bGF0Zm9ybVN1cmZhY2UoKTsKKworICAgIC8qKiBDcmVhdGVzIGEgcGJ1ZmZlciBzdXJmYWNlIHVz
aW5nIHRoZSBnaXZlbiBjb25maWcuIElmIG5vIHN1cmZhY2UKKyAgICAgICAgKiBjb3VsZCBiZSBj
cmVhdGVkLCBFR0xfTk9fU1VSRkFDRSBpcyByZXR1cm5lZCBhbmQgZXJyb3JzIGNhbiBiZQorICAg
ICAgICAqIGNhdWdodCB3aXRoIGVnbEdldEVycm9yKCkgKHJlc3BlY3RpdmVseSBBU1NFUlRfRUdM
X05PX0VSUk9SKCkpLiAqLworICAgIEVHTFN1cmZhY2UgY3JlYXRlUGJ1ZmZlclN1cmZhY2UoY29u
c3QgSW50U2l6ZSYgc2l6ZSwgRUdMQ29uZmlnIGNvbmZpZyA9IDApOworCisgICAgRUdMU3VyZmFj
ZSBzdXJmYWNlRm9yV2luZG93KEVHTE5hdGl2ZVdpbmRvd1R5cGUgd0lkLCBjb25zdCBFR0xDb25m
aWcmIGNvbmZpZyk7CisKKyAgICBib29sIHN1cmZhY2VzQ29tcGF0aWJsZShFR0xTdXJmYWNlIHN1
cmZhY2UxLCBFR0xTdXJmYWNlIG90aGVyU3VyZmFjZSk7CisKKyAgICAvKiogRGVzdHJveSB0aGUg
c3VyZmFjZSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgY29udGV4dCAodW5sZXNzIGFub3RoZXIKKyAg
ICAgKiBzdXJmYWNlIGlzIHN0aWxsIHVzaW5nIHRoZSBzYW1lIGNvbnRleHQsIGluIHdoaWNoIGNh
c2UgdGhlIGNvbnRleHQKKyAgICAgKiBpcyBub3QgZGVzdHJveWVkKS4gKi8KKyAgICB2b2lkIGRl
c3Ryb3lTdXJmYWNlKEVHTFN1cmZhY2Ugc3VyZmFjZSk7CisKKyAgICAvKiogUmV0dXJuIHRoZSBj
b250ZXh0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cmZhY2UuCisgICAgICogSWYgbm8gY29ycmVz
cG9uZGluZyBjb250ZXh0IGV4aXN0cywgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gKi8K
KyAgICBFR0xDb250ZXh0IGNvbnRleHRGb3JTdXJmYWNlKEVHTFN1cmZhY2Ugc3VyZmFjZSk7CisK
K3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJQbGF0Zm9ybVN1cmZhY2UoU3VyZmFj
ZU9wZW5WRyogcGxhdGZvcm1TdXJmYWNlKTsKKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyUGxh
dGZvcm1TdXJmYWNlKFN1cmZhY2VPcGVuVkcqIHBsYXRmb3JtU3VyZmFjZSk7CisKKyAgICBFR0xE
aXNwbGF5T3BlblZHKEVHTERpc3BsYXkgZGlzcGxheSk7CisgICAgfkVHTERpc3BsYXlPcGVuVkco
KTsKKworICAgIEVHTERpc3BsYXkgbV9kaXNwbGF5OworICAgIFN1cmZhY2VPcGVuVkcqIG1fc2hh
cmVkUGxhdGZvcm1TdXJmYWNlOworICAgIEVHTENvbmZpZyBtX3BidWZmZXJDb25maWc7CisgICAg
RUdMQ29uZmlnIG1fd2luZG93Q29uZmlnOworCisgICAgV1RGOjpIYXNoTWFwPEVHTFN1cmZhY2Us
IFN1cmZhY2VPcGVuVkcqPiBtX3BsYXRmb3JtU3VyZmFjZXM7CisgICAgV1RGOjpIYXNoTWFwPEVH
TE5hdGl2ZVdpbmRvd1R5cGUsIEVHTFN1cmZhY2U+IG1fd2luZG93U3VyZmFjZXM7CisgICAgV1RG
OjpIYXNoTWFwPEVHTFN1cmZhY2UsIEVHTGludD4gbV9zdXJmYWNlQ29uZmlnSWRzOworICAgIFdU
Rjo6SGFzaE1hcDxFR0xpbnQsIEVHTGludD4gbV9jb21wYXRpYmxlQ29uZmlnSWRzOworICAgIFdU
Rjo6SGFzaE1hcDxFR0xpbnQsIEVHTENvbnRleHQ+IG1fY29udGV4dHM7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFR0xEaXNwbGF5T3BlblZHX2gKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTFV0aWxzLmggYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjA4NTFiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW52Zy9FR0xVdGlscy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDkuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpZm5kZWYgRUdMVXRpbHNfaAorI2RlZmluZSBFR0xVdGlsc19oCisKKyNpbmNs
dWRlIDxlZ2wuaD4KKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorCisjZGVmaW5lIEFTU0VS
VF9FR0xfTk9fRVJST1IoKSBcCisgICAgZG8geyBcCisgICAgICAgIEVHTGludCBlcnJvciA9IGVn
bEdldEVycm9yKCk7IFwKKyAgICAgICAgaWYgKGVycm9yICE9IEVHTF9TVUNDRVNTKSB7IFwKKyAg
ICAgICAgICAgIGNvbnN0IGNoYXIqIHR4dDsgXAorICAgICAgICAgICAgc3dpdGNoIChlcnJvcikg
eyBcCisgICAgICAgICAgICBjYXNlIEVHTF9OT1RfSU5JVElBTElaRUQ6IHR4dCA9ICJFR0xfTk9U
X0lOSVRJQUxJWkVEIjsgYnJlYWs7XAorICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzog
dHh0ID0gIkVHTF9CQURfQUNDRVNTIjsgYnJlYWs7XAorICAgICAgICAgICAgY2FzZSBFR0xfQkFE
X0FMTE9DOiB0eHQgPSAiRUdMX0JBRF9BTExPQyI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2Ug
RUdMX0JBRF9BVFRSSUJVVEU6IHR4dCA9ICJFR0xfQkFEX0FUVFJJQlVURSI7IGJyZWFrO1wKKyAg
ICAgICAgICAgIGNhc2UgRUdMX0JBRF9DT05URVhUOiB0eHQgPSAiRUdMX0JBRF9DT05URVhUIjsg
YnJlYWs7XAorICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogdHh0ID0gIkVHTF9CQURf
Q09ORklHIjsgYnJlYWs7XAorICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFD
RTogdHh0ID0gIkVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFIjsgYnJlYWs7XAorICAgICAgICAgICAg
Y2FzZSBFR0xfQkFEX0RJU1BMQVk6IHR4dCA9ICJFR0xfQkFEX0RJU1BMQVkiOyBicmVhaztcCisg
ICAgICAgICAgICBjYXNlIEVHTF9CQURfU1VSRkFDRTogdHh0ID0gIkVHTF9CQURfU1VSRkFDRSI7
IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogdHh0ID0gIkVHTF9CQURf
TUFUQ0giOyBicmVhaztcCisgICAgICAgICAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiB0eHQg
PSAiRUdMX0JBRF9QQVJBTUVURVIiOyBicmVhaztcCisgICAgICAgICAgICBjYXNlIEVHTF9CQURf
TkFUSVZFX1BJWE1BUDogdHh0ID0gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7IGJyZWFrO1wKKyAg
ICAgICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiB0eHQgPSAiRUdMX0JBRF9OQVRJ
VkVfV0lORE9XIjsgYnJlYWs7XAorICAgICAgICAgICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiB0
eHQgPSAiRUdMX0NPTlRFWFRfTE9TVCI7IGJyZWFrO1wKKyAgICAgICAgICAgIGRlZmF1bHQ6IHR4
dCA9ICJVTktOT1dOX0VSUk9SIjsgYnJlYWs7XAorICAgICAgICAgICAgfSBcCisgICAgICAgICAg
ICBXVEZSZXBvcnRBc3NlcnRpb25GYWlsdXJlV2l0aE1lc3NhZ2UoX19GSUxFX18sIF9fTElORV9f
LCBXVEZfUFJFVFRZX0ZVTkNUSU9OLCAiIiwgIkZvdW5kICVzIiwgdHh0KTsgXAorICAgICAgICAg
ICAgQ1JBU0goKTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisjZW5kaWYgLy8g
RUdMVXRpbHNfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcv
U3VyZmFjZU9wZW5WRy5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJm
YWNlT3BlblZHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU5NTM4
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3Vy
ZmFjZU9wZW5WRy5jcHAKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTdXJmYWNlT3BlblZHLmgiCisKKyNpbmNsdWRlICJJ
bnRTaXplLmgiCisKKyNpZiBQTEFURk9STShFR0wpCisjaW5jbHVkZSAiRUdMRGlzcGxheU9wZW5W
Ry5oIgorI2luY2x1ZGUgIkVHTFV0aWxzLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitTdXJmYWNlT3BlblZHKiBTdXJmYWNlT3BlblZHOjpjdXJyZW50U3VyZmFjZSgpCit7Cisj
aWYgUExBVEZPUk0oRUdMKQorICAgIHJldHVybiBFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50U3Vy
ZmFjZSgpOworI2VuZGlmCit9CisKKyNpZiBQTEFURk9STShFR0wpCitTdXJmYWNlT3BlblZHOjpT
dXJmYWNlT3BlblZHKGNvbnN0IEludFNpemUmIHNpemUsIEVHTERpc3BsYXkgZGlzcGxheSwgRUdM
Q29uZmlnIGNvbmZpZykKKyAgICAsIG1fZWdsRGlzcGxheShkaXNwbGF5KQoreworICAgIEFTU0VS
VChtX2VnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpOworCisgICAgRUdMRGlzcGxheU9wZW5W
RyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlz
cGxheSk7CisgICAgaWYgKCFjb25maWcpCisgICAgICAgIGNvbmZpZyA9IGRpc3BsYXlNYW5hZ2Vy
LT5kZWZhdWx0UGJ1ZmZlckNvbmZpZygpOworCisgICAgbV9lZ2xTdXJmYWNlID0gZGlzcGxheU1h
bmFnZXItPmNyZWF0ZVBidWZmZXJTdXJmYWNlKHNpemUsIGNvbmZpZyk7CisgICAgaWYgKG1fZWds
U3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9lZ2xD
b250ZXh0ID0gZGlzcGxheU1hbmFnZXItPmNvbnRleHRGb3JTdXJmYWNlKG1fZWdsU3VyZmFjZSk7
CisgICAgRUdMRGlzcGxheU9wZW5WRzo6cmVnaXN0ZXJQbGF0Zm9ybVN1cmZhY2UodGhpcyk7Cit9
CisKK1N1cmZhY2VPcGVuVkc6OlN1cmZhY2VPcGVuVkcoRUdMTmF0aXZlV2luZG93VHlwZSB3aW5k
b3csIEVHTERpc3BsYXkgZGlzcGxheSwgRUdMQ29uZmlnIGNvbmZpZykKKyAgICAsIG1fZWdsRGlz
cGxheShkaXNwbGF5KQoreworICAgIEFTU0VSVChtX2VnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BM
QVkpOworCisgICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5
T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlzcGxheSk7CisgICAgaWYgKCFjb25maWcpCisgICAg
ICAgIGNvbmZpZyA9IGRpc3BsYXlNYW5hZ2VyLT5kZWZhdWx0V2luZG93Q29uZmlnKCk7CisKKyAg
ICBtX2VnbFN1cmZhY2UgPSBkaXNwbGF5TWFuYWdlci0+c3VyZmFjZUZvcldpbmRvdyh3aW5kb3cs
IGNvbmZpZyk7CisgICAgaWYgKG1fZWdsU3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9lZ2xDb250ZXh0ID0gZGlzcGxheU1hbmFnZXItPmNvbnRleHRG
b3JTdXJmYWNlKG1fZWdsU3VyZmFjZSk7CisgICAgRUdMRGlzcGxheU9wZW5WRzo6cmVnaXN0ZXJQ
bGF0Zm9ybVN1cmZhY2UodGhpcyk7Cit9CisKKy8vIENvbnN0cnVjdG9yIG9ubHkgYWNjZXNzaWJs
ZSB0byBFR0xEaXNwbGF5T3BlblZHIGZvciBzaGFyZWQgY29udGV4dAorLy8gaW5pdGlhbGl6YXRp
b24uIFRoZSBwYXJhbWV0ZXIgdHlwZXMgbWlnaHQgZGVmaW5lIHRvIHZvaWQqIGxpa2UgaW4gdGhl
CisvLyB3aW5kb3cgc3VyZmFjZSBjb25zdHJ1Y3Rvciwgc28gaXQgY2FuJ3QgYmUgb3ZlcmxvYWRl
ZCB3aXRoIGFsbCB0aGUgcmVxdWlyZWQKKy8vIGFyZ3VtZW50cyBhbmQgRUdMRGlzcGxheU9wZW5W
RyBiYXNpY2FsbHkgaW1wbGVtZW50cyB0aGUgY29uc3RydWN0b3IKKy8vIGJ5IGl0c2VsZi4KK1N1
cmZhY2VPcGVuVkc6OlN1cmZhY2VPcGVuVkcoKQorICAgICwgbV9lZ2xEaXNwbGF5KDApCisgICAg
LCBtX2VnbFN1cmZhY2UoMCkKKyAgICAsIG1fZWdsQ29udGV4dCgwKQoreworfQorI2VuZGlmCisK
K1N1cmZhY2VPcGVuVkc6On5TdXJmYWNlT3BlblZHKCkKK3sKKyAgICBpZiAoIWlzVmFsaWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisjaWYgUExBVEZPUk0oRUdMKQorICAgIEVHTERpc3BsYXlPcGVu
Vkc6OmZvckRpc3BsYXkobV9lZ2xEaXNwbGF5KS0+ZGVzdHJveVN1cmZhY2UobV9lZ2xTdXJmYWNl
KTsKKyAgICBFR0xEaXNwbGF5T3BlblZHOjp1bnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKHRoaXMp
OworI2VuZGlmCit9CisKK2Jvb2wgU3VyZmFjZU9wZW5WRzo6aXNWYWxpZCgpIGNvbnN0Cit7Cisj
aWYgUExBVEZPUk0oRUdMKQorICAgIHJldHVybiAobV9lZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJG
QUNFKTsKKyNlbmRpZgorfQorCitpbnQgU3VyZmFjZU9wZW5WRzo6d2lkdGgoKSBjb25zdAorewor
I2lmIFBMQVRGT1JNKEVHTCkKKyAgICBBU1NFUlQobV9lZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJG
QUNFKTsKKworICAgIEVHTGludCB3aWR0aDsKKyAgICBlZ2xRdWVyeVN1cmZhY2UobV9lZ2xEaXNw
bGF5LCBtX2VnbFN1cmZhY2UsIEVHTF9XSURUSCwgJndpZHRoKTsKKyAgICBBU1NFUlRfRUdMX05P
X0VSUk9SKCk7CisgICAgcmV0dXJuIHdpZHRoOworI2VuZGlmCit9CisKK2ludCBTdXJmYWNlT3Bl
blZHOjpoZWlnaHQoKSBjb25zdAoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICBBU1NFUlQobV9l
Z2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBoZWlnaHQ7CisgICAg
ZWdsUXVlcnlTdXJmYWNlKG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlLCBFR0xfSEVJR0hULCAm
aGVpZ2h0KTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgcmV0dXJuIGhlaWdodDsK
KyNlbmRpZgorfQorCitTdXJmYWNlT3BlblZHKiBTdXJmYWNlT3BlblZHOjpzaGFyZWRTdXJmYWNl
KCkgY29uc3QKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgQVNTRVJUKG1fZWdsU3VyZmFjZSAh
PSBFR0xfTk9fU1VSRkFDRSk7CisgICAgcmV0dXJuIEVHTERpc3BsYXlPcGVuVkc6OmZvckRpc3Bs
YXkobV9lZ2xEaXNwbGF5KS0+c2hhcmVkUGxhdGZvcm1TdXJmYWNlKCk7CisjZW5kaWYKK30KKwor
dm9pZCBTdXJmYWNlT3BlblZHOjptYWtlQ3VycmVudCgpCit7CisjaWYgUExBVEZPUk0oRUdMKQor
ICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpOworCisgICAgZWdsQmlu
ZEFQSShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIEVH
TFN1cmZhY2UgY3VycmVudFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7
CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAgaWYgKGN1cnJlbnRTdXJmYWNlICE9
IG1fZWdsU3VyZmFjZSkgeworICAgICAgICBlZ2xNYWtlQ3VycmVudChtX2VnbERpc3BsYXksIG1f
ZWdsU3VyZmFjZSwgbV9lZ2xTdXJmYWNlLCBtX2VnbENvbnRleHQpOworICAgICAgICBBU1NFUlRf
RUdMX05PX0VSUk9SKCk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgU3VyZmFjZU9wZW5WRzo6
bWFrZUNvbXBhdGlibGVDdXJyZW50KCkKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgQVNTRVJU
KG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBlZ2xCaW5kQVBJKEVHTF9P
UEVOVkdfQVBJKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgRUdMU3VyZmFjZSBj
dXJyZW50U3VyZmFjZSA9IGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKyAgICBBU1NF
UlRfRUdMX05PX0VSUk9SKCk7CisKKyAgICBpZiAoY3VycmVudFN1cmZhY2UgIT0gbV9lZ2xTdXJm
YWNlCisgICAgICAgICYmICFFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlzcGxh
eSktPnN1cmZhY2VzQ29tcGF0aWJsZShjdXJyZW50U3VyZmFjZSwgbV9lZ2xTdXJmYWNlKSkgewor
ICAgICAgICBlZ2xNYWtlQ3VycmVudChtX2VnbERpc3BsYXksIG1fZWdsU3VyZmFjZSwgbV9lZ2xT
dXJmYWNlLCBtX2VnbENvbnRleHQpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7Cisg
ICAgfQorICAgIC8vIGVsc2U6IHN1cmZhY2VzIGNvbXBhdGlibGUsIG5vIG5lZWQgdG8gc3dpdGNo
IGNvbnRleHRzCisjZW5kaWYKK30KKwordm9pZCBTdXJmYWNlT3BlblZHOjpmbHVzaCgpCit7Cisj
aWYgUExBVEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZB
Q0UpOworCisgICAgZWdsU3dhcEJ1ZmZlcnMobV9lZ2xEaXNwbGF5LCBtX2VnbFN1cmZhY2UpOwor
ICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyNlbmRpZgorfQorCit9CmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJmYWNlT3BlblZHLmggYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJmYWNlT3BlblZHLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3NmZmMAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuaApAQCAtMCwwICsxLDEyMCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOS4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBTdXJmYWNlT3BlblZHX2gKKyNkZWZpbmUgU3Vy
ZmFjZU9wZW5WR19oCisKKyNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KKworI2lmIFBMQVRGT1JN
KEVHTCkKKyNpbmNsdWRlIDxlZ2wuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
KyNpZiBQTEFURk9STShFR0wpCitjbGFzcyBFR0xEaXNwbGF5T3BlblZHOworI2VuZGlmCitjbGFz
cyBJbnRTaXplOworCitjbGFzcyBTdXJmYWNlT3BlblZHIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
U3VyZmFjZU9wZW5WRyogY3VycmVudFN1cmZhY2UoKTsKKworI2lmIFBMQVRGT1JNKEVHTCkKKyAg
ICBmcmllbmQgY2xhc3MgRUdMRGlzcGxheU9wZW5WRzsKKworICAgIC8qKgorICAgICAqIENyZWF0
ZSBhIG5ldyBFR0wgcGJ1ZmZlciBzdXJmYWNlIHdpdGggdGhlIHNwZWNpZmllZCBzaXplIGFuZCBj
b25maWcgb24KKyAgICAgKiB0aGUgZ2l2ZW4gZGlzcGxheS4gSWYgY29uZmlnIGlzIG5vdCBzcGVj
aWZpZWQsIHRoZSBkaXNwbGF5J3MgZGVmYXVsdAorICAgICAqIHBidWZmZXIgY29uZmlnIGlzIHVz
ZWQuCisgICAgICoKKyAgICAgKiBGb3IgcmVhc29ucyBvZiByZWNvdmVyYWJpbGl0eSAoZS5nLiBJ
bWFnZUJ1ZmZlcidzICJib29sIHN1Y2Nlc3MiCisgICAgICogcmV0dXJuIHZhbHVlKSwgdGhpcyBj
b25zdHJ1Y3RvciB3b24ndCBhc3NlcnQgaWYgY3JlYXRpb24gb2YgdGhlIHN1cmZhY2UKKyAgICAg
KiBmYWlscy4gTWFrZSBzdXJlIHRvIGNoZWNrIHN1Y2Nlc3NmdWwgc3VyZmFjZSBjcmVhdGlvbiB3
aXRoIGVpdGhlcgorICAgICAqIEFTU0VSVF9FR0xfTk9fRVJST1IoKSBvciB0aGUgc3VyZmFjZSdz
IGlzVmFsaWQoKSBtZXRob2QuCisgICAgICovCisgICAgU3VyZmFjZU9wZW5WRyhjb25zdCBJbnRT
aXplJiBzaXplLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcgPSAwKTsKKwor
ICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBFR0wgd2luZG93IHN1cmZhY2Ugd2l0aCB0aGUg
c3BlY2lmaWVkIG5hdGl2ZSB3aW5kb3cgaGFuZGxlCisgICAgICogYW5kIGNvbmZpZyBvbiB0aGUg
Z2l2ZW4gZGlzcGxheS4gSWYgY29uZmlnIGlzIG5vdCBzcGVjaWZpZWQsIHRoZQorICAgICAqIGRp
c3BsYXkncyBkZWZhdWx0IHdpbmRvdyBjb25maWcgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEZv
ciByZWFzb25zIG9mIHJlY292ZXJhYmlsaXR5LCB0aGlzIGNvbnN0cnVjdG9yIHdvbid0IGFzc2Vy
dCBpZiBjcmVhdGlvbgorICAgICAqIG9mIHRoZSBzdXJmYWNlIGZhaWxzLiBNYWtlIHN1cmUgdG8g
Y2hlY2sgc3VjY2Vzc2Z1bCBzdXJmYWNlIGNyZWF0aW9uCisgICAgICogd2l0aCBlaXRoZXIgQVNT
RVJUX0VHTF9OT19FUlJPUigpIG9yIHRoZSBzdXJmYWNlJ3MgaXNWYWxpZCgpIG1ldGhvZC4KKyAg
ICAgKi8KKyAgICBTdXJmYWNlT3BlblZHKEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBFR0xE
aXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBjb25maWcgPSAwKTsKKworICAgIEVHTERpc3BsYXkg
ZWdsRGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsRGlzcGxheTsgfQorICAgIEVHTFN1cmZh
Y2UgZWdsU3VyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsU3VyZmFjZTsgfQorICAgIEVHTENv
bnRleHQgZWdsQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsQ29udGV4dDsgfQorI2VuZGlm
CisKKyAgICB+U3VyZmFjZU9wZW5WRygpOworCisgICAgLyoqCisgICAgICogSWYgYSBzdXJmYWNl
IGlzIGludmFsaWQgKGNvdWxkIG5vdCBiZSBjcmVhdGVkKSwgYWxsIG1ldGhvZCBjYWxscyB3aWxs
CisgICAgICogY3Jhc2ggaG9ycmlibHkuCisgICAgICovCisgICAgYm9vbCBpc1ZhbGlkKCkgY29u
c3Q7CisKKyAgICBpbnQgd2lkdGgoKSBjb25zdDsKKyAgICBpbnQgaGVpZ2h0KCkgY29uc3Q7CisK
KyAgICBTdXJmYWNlT3BlblZHKiBzaGFyZWRTdXJmYWNlKCkgY29uc3Q7CisKKyAgICAvKioKKyAg
ICAgKiBNYWtlIHRoZSBhc3NvY2lhdGVkIEdML0VHTCBjb250ZXh0IHRoZSBjdXJyZW50IG9uZSwg
c28gdGhhdCBzdWJzZXF1ZW50CisgICAgICogT3BlblZHIGNvbW1hbmRzIGFwcGx5IHRvIGl0Lgor
ICAgICAqLworICAgIHZvaWQgbWFrZUN1cnJlbnQoKTsKKworICAgIC8qKgorICAgICAqIE1ha2Ug
YSBzdXJmYWNlL2NvbnRleHQgY29tYmluYXRpb24gY3VycmVudCB0aGF0IGlzICJjb21wYXRpYmxl
IgorICAgICAqIChpLmUuIGNhbiBhY2Nlc3MgaXRzIHNoYXJlZCByZXNvdXJjZXMpIHRvIHRoZSBn
aXZlbiBvbmUuIElmIG5vCisgICAgICogc3VyZmFjZS9jb250ZXh0IGlzIGN1cnJlbnQsIHRoZSBn
aXZlbiBvbmUgaXMgbWFkZSBjdXJyZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMg
bWVhbnQgdG8gYXZvaWQgY29udGV4dCBjaGFuZ2VzIGlmIHRoZXkncmUgbm90CisgICAgICogbmVj
ZXNzYXJ5LCBwYXJ0aWN1bGFybHkgdGFpbG9yZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHNvbWV0aGlu
ZworICAgICAqIGNvbXBhdGlibGUgdG8gdGhlIHNoYXJlZCBzdXJmYWNlIGlzIHJlcXVlc3RlZCB3
aGlsZSBhY3R1YWwgcGFpbnRpbmcKKyAgICAgKiBoYXBwZW5zIG9uIGFub3RoZXIgc3VyZmFjZS4K
KyAgICAgKi8KKyAgICB2b2lkIG1ha2VDb21wYXRpYmxlQ3VycmVudCgpOworCisgICAgLyoqCisg
ICAgICogRW1wdHkgdGhlIE9wZW5WRyBwaXBlbGluZSBhbmQgbWFrZSBzdXJlIGFsbCB0aGUgcGVy
Zm9ybWVkIHBhaW50CisgICAgICogb3BlcmF0aW9ucyBzaG93IHVwIG9uIHRoZSBzdXJmYWNlIGFz
IGFjdHVhbCBkcmF3biBwaXhlbHMuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCitwcml2
YXRlOgorI2lmIFBMQVRGT1JNKEVHTCkKKyAgICBTdXJmYWNlT3BlblZHKCk7IC8vIGZvciBFR0xE
aXNwbGF5T3BlblZHCisKKyAgICBFR0xEaXNwbGF5IG1fZWdsRGlzcGxheTsKKyAgICBFR0xTdXJm
YWNlIG1fZWdsU3VyZmFjZTsKKyAgICBFR0xDb250ZXh0IG1fZWdsQ29udGV4dDsKKyNlbmRpZgor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gU3VyZmFjZU9wZW5WR19o
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9WR1V0aWxzLmgg
Yi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9WR1V0aWxzLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1NWRlOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1ZHVXRpbHMuaApAQCAtMCwwICsxLDQ3IEBACisv
KgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDA5LiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFZHVXRpbHNfaAorI2RlZmluZSBWR1V0aWxzX2gKKwor
I2luY2x1ZGUgPG9wZW52Zy5oPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisKKyNkZWZp
bmUgQVNTRVJUX1ZHX05PX0VSUk9SKCkgXAorICAgIGRvIHsgXAorICAgICAgICBWR0Vycm9yQ29k
ZSBlcnJvciA9IHZnR2V0RXJyb3IoKTsgXAorICAgICAgICBpZiAoZXJyb3IgIT0gVkdfTk9fRVJS
T1IpIHsgXAorICAgICAgICAgICAgY29uc3QgY2hhciogdHh0OyBcCisgICAgICAgICAgICBzd2l0
Y2ggKGVycm9yKSB7IFwKKyAgICAgICAgICAgIGNhc2UgVkdfQkFEX0hBTkRMRV9FUlJPUjogdHh0
ID0gIlZHX0JBRF9IQU5ETEVfRVJST1IiOyBicmVhaztcCisgICAgICAgICAgICBjYXNlIFZHX0lM
TEVHQUxfQVJHVU1FTlRfRVJST1I6IHR4dCA9ICJWR19JTExFR0FMX0FSR1VNRU5UX0VSUk9SIjsg
YnJlYWs7XAorICAgICAgICAgICAgY2FzZSBWR19PVVRfT0ZfTUVNT1JZX0VSUk9SOiB0eHQgPSAi
VkdfT1VUX09GX01FTU9SWV9FUlJPUiI7IGJyZWFrO1wKKyAgICAgICAgICAgIGNhc2UgVkdfUEFU
SF9DQVBBQklMSVRZX0VSUk9SOiB0eHQgPSAiVkdfUEFUSF9DQVBBQklMSVRZX0VSUk9SIjsgYnJl
YWs7XAorICAgICAgICAgICAgY2FzZSBWR19VTlNVUFBPUlRFRF9JTUFHRV9GT1JNQVRfRVJST1I6
IHR4dCA9ICJWR19VTlNVUFBPUlRFRF9JTUFHRV9GT1JNQVRfRVJST1IiOyBicmVhaztcCisgICAg
ICAgICAgICBjYXNlIFZHX1VOU1VQUE9SVEVEX1BBVEhfRk9STUFUX0VSUk9SOiB0eHQgPSAiVkdf
VU5TVVBQT1JURURfUEFUSF9GT1JNQVRfRVJST1IiOyBicmVhaztcCisgICAgICAgICAgICBjYXNl
IFZHX0lNQUdFX0lOX1VTRV9FUlJPUjogdHh0ID0gIlZHX0lNQUdFX0lOX1VTRV9FUlJPUiI7IGJy
ZWFrO1wKKyAgICAgICAgICAgIGNhc2UgVkdfTk9fQ09OVEVYVF9FUlJPUjogdHh0ID0gIlZHX05P
X0NPTlRFWFRfRVJST1IiOyBicmVhaztcCisgICAgICAgICAgICBkZWZhdWx0OiB0eHQgPSAiVU5L
Tk9XTl9FUlJPUiI7IGJyZWFrO1wKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgV1RGUmVw
b3J0QXNzZXJ0aW9uRmFpbHVyZVdpdGhNZXNzYWdlKF9fRklMRV9fLCBfX0xJTkVfXywgV1RGX1BS
RVRUWV9GVU5DVElPTiwgIiIsICJGb3VuZCAlcyIsIHR4dCk7IFwKKyAgICAgICAgICAgIENSQVNI
KCk7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIFZHVXRpbHNf
aAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46498</attachid>
            <date>2010-01-13 13:41:05 -0800</date>
            <delta_ts>2010-01-15 13:41:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-33403-20100113164101.patch</filename>
            <type>text/plain</type>
            <size>36012</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmQ4OTFiZC4uZDYyN2FhMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2NCBAQAorMjAxMC0wMS0xMyAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFtPcGVuVkddIEFkZCAoRUdMKSBzdXJmYWNlL2NvbnRleHQgbWFu
YWdlbWVudAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MzM0MDMKKworICAgICAgICBUaGUgZm91bmRhdGlvbnMgZm9yIGEgbmV3IE9wZW5WRyBwb3J0Lgor
CisgICAgICAgIE9wZW5WRyBpcyBub3QgdGllZCB0byBFR0wgcGVyIHNlLCBFR0wganVzdCBoYXBw
ZW5zIHRvIGJlCisgICAgICAgIHRoZSBvbmx5IHVzYWJsZSBiYWNrZW5kIGZvciBPcGVuVkcgc3Rh
dGUgYW5kIHBhaW50aW5nLgorCisgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBTdXJmYWNlT3Bl
blZHIGNsYXNzIGlzIHRvIHByb3ZpZGUKKyAgICAgICAgYW4gRUdMLWluZGVwZW5kZW50IGludGVy
ZmFjZSBmb3IgT3BlblZHLXNwZWNpZmljIGNvZGUuCisgICAgICAgIFRoZSBFR0xEaXNwbGF5T3Bl
blZHIGNsYXNzIHRha2VzIGNhcmUgb2Yga2VlcGluZyB0cmFjaworICAgICAgICBvZiBFR0wgZGlz
cGxheXMsIHN1cmZhY2VzIGFuZCBjb250ZXh0cy4gSXQgYWxzbyBtYWtlcworICAgICAgICBzdXJl
IHRoYXQgYWxsIGNyZWF0ZWQgY29udGV4dHMgYXJlIGludGVyb3BlcmFibGUsIGFuZAorICAgICAg
ICB0aGF0IGRpZmZlcmVudCBzdXJmYWNlcyB1c2UgYSBzaW5nbGUgY29udGV4dCBpZiBwb3NzaWJs
ZS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZH
LmNwcDogQWRkZWQuCisgICAgICAgIChkaXNwbGF5TWFuYWdlcnMpOgorICAgICAgICAoRUdMRGlz
cGxheU9wZW5WRzo6Y3VycmVudFN1cmZhY2UpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6
cmVnaXN0ZXJQbGF0Zm9ybVN1cmZhY2UpOgorICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6dW5y
ZWdpc3RlclBsYXRmb3JtU3VyZmFjZSk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpzZXRD
dXJyZW50RGlzcGxheSk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50KToKKyAg
ICAgICAgKEVHTERpc3BsYXlPcGVuVkc6OmZvckRpc3BsYXkpOgorICAgICAgICAoRUdMRGlzcGxh
eU9wZW5WRzo6RUdMRGlzcGxheU9wZW5WRyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjp+
RUdMRGlzcGxheU9wZW5WRyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpzZXREZWZhdWx0
UGJ1ZmZlckNvbmZpZyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpkZWZhdWx0UGJ1ZmZl
ckNvbmZpZyk6CisgICAgICAgIChFR0xEaXNwbGF5T3BlblZHOjpzZXREZWZhdWx0V2luZG93Q29u
ZmlnKToKKyAgICAgICAgKEVHTERpc3BsYXlPcGVuVkc6OmRlZmF1bHRXaW5kb3dDb25maWcpOgor
ICAgICAgICAoRUdMRGlzcGxheU9wZW5WRzo6c2hhcmVkUGxhdGZvcm1TdXJmYWNlKToKKyAgICAg
ICAgKEVHTERpc3BsYXlPcGVuVkc6OmNyZWF0ZVBidWZmZXJTdXJmYWNlKToKKyAgICAgICAgKEVH
TERpc3BsYXlPcGVuVkc6OnN1cmZhY2VGb3JXaW5kb3cpOgorICAgICAgICAoRUdMRGlzcGxheU9w
ZW5WRzo6c3VyZmFjZXNDb21wYXRpYmxlKToKKyAgICAgICAgKEVHTERpc3BsYXlPcGVuVkc6OmRl
c3Ryb3lTdXJmYWNlKToKKyAgICAgICAgKEVHTERpc3BsYXlPcGVuVkc6OmNvbnRleHRGb3JTdXJm
YWNlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMRGlzcGxheU9wZW5W
Ry5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlPcGVuVkc6OmRpc3BsYXkp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xVdGlscy5oOiBBZGRlZC4K
KyAgICAgICAgKHRvRUdMRXJyb3JDb25zdGFudCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlN1
cmZhY2VPcGVuVkc6OmN1cnJlbnRTdXJmYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VP
cGVuVkc6OlN1cmZhY2VPcGVuVkcpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6
flN1cmZhY2VPcGVuVkcpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6aXNWYWxp
ZCk6CisgICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjp3aWR0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpTdXJmYWNlT3BlblZHOjpoZWlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFj
ZU9wZW5WRzo6c2hhcmVkU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZH
OjptYWtlQ3VycmVudCk6CisgICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjptYWtlQ29t
cGF0aWJsZUN1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6Zmx1c2gp
OgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJmYWNlT3BlblZHLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6ZWdsRGlzcGxheSk6CisgICAg
ICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjplZ2xTdXJmYWNlKToKKyAgICAgICAgKFdlYkNv
cmU6OlN1cmZhY2VPcGVuVkc6OmVnbENvbnRleHQpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL29wZW52Zy9WR1V0aWxzLmg6IEFkZGVkLgorICAgICAgICAodG9WR0Vycm9yQ29uc3RhbnQp
OgorCiAyMDEwLTAxLTA3ICBDaHJpc3RpYW4gU2VqZXJzZW4gIDxjaHJpc3RpYW4ud2Via2l0QGdt
YWlsLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMRGlzcGxheU9wZW5WRy5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1ZDEyMAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuY3Bw
CkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZCAyMDA5LCAyMDEwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRUdMRGlzcGxheU9wZW5WRy5oIgorCisjaW5jbHVkZSAiRUdMVXRp
bHMuaCIKKyNpbmNsdWRlICJJbnRTaXplLmgiCisjaW5jbHVkZSAiU3VyZmFjZU9wZW5WRy5oIgor
CisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFz
Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIFdURjsKKwor
Ly8gTmVlZCB0byB0eXBlZGVmIHRoaXMsIG90aGVyd2lzZSBERUZJTkVfU1RBVElDX0xPQ0FMKCkg
ZG9lc24ndCBzd2FsbG93IGl0LgordHlwZWRlZiBIYXNoTWFwPEVHTERpc3BsYXksIEVHTERpc3Bs
YXlPcGVuVkcqPiBFR0xEaXNwbGF5TWFuYWdlck1hcDsKKworLy8gRmlsZS1zdGF0aWMgdmFyaWFi
bGVzLgorc3RhdGljIEVHTERpc3BsYXlNYW5hZ2VyTWFwJiBkaXNwbGF5TWFuYWdlcnMoKQorewor
ICAgIERFRklORV9TVEFUSUNfTE9DQUwoRUdMRGlzcGxheU1hbmFnZXJNYXAsIG1hbmFnZXJzLCAo
KSk7CisgICAgcmV0dXJuIG1hbmFnZXJzOworfQorCitzdGF0aWMgRUdMRGlzcGxheU9wZW5WRyog
c19jdXJyZW50ID0gMDsKKworCisvLyBTdGF0aWMgY2xhc3MgbWVtYmVycy4KKworU3VyZmFjZU9w
ZW5WRyogRUdMRGlzcGxheU9wZW5WRzo6Y3VycmVudFN1cmZhY2UoKQoreworICAgIEVHTERpc3Bs
YXlNYW5hZ2VyTWFwJiBtYW5hZ2VycyA9IGRpc3BsYXlNYW5hZ2VycygpOworICAgIEVHTERpc3Bs
YXkgY3VycmVudERpc3BsYXkgPSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpOworCisgICAgaWYgKGN1
cnJlbnREaXNwbGF5ID09IEVHTF9OT19ESVNQTEFZIHx8ICFtYW5hZ2Vycy5jb250YWlucyhjdXJy
ZW50RGlzcGxheSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgRUdMRGlzcGxheU9wZW5WRyog
ZGlzcGxheU1hbmFnZXIgPSBtYW5hZ2Vycy5nZXQoY3VycmVudERpc3BsYXkpOworICAgIEVHTFN1
cmZhY2UgY3VycmVudFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7CisK
KyAgICBpZiAoY3VycmVudFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UgfHwgIWRpc3BsYXlNYW5h
Z2VyLT5tX3BsYXRmb3JtU3VyZmFjZXMuY29udGFpbnMoY3VycmVudFN1cmZhY2UpKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIHJldHVybiBkaXNwbGF5TWFuYWdlci0+bV9wbGF0Zm9ybVN1cmZh
Y2VzLmdldChjdXJyZW50U3VyZmFjZSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6cmVn
aXN0ZXJQbGF0Zm9ybVN1cmZhY2UoU3VyZmFjZU9wZW5WRyogcGxhdGZvcm1TdXJmYWNlKQorewor
ICAgIEVHTERpc3BsYXlPcGVuVkcqIGRpc3BsYXlNYW5hZ2VyID0gRUdMRGlzcGxheU9wZW5WRzo6
Zm9yRGlzcGxheShwbGF0Zm9ybVN1cmZhY2UtPmVnbERpc3BsYXkoKSk7CisgICAgZGlzcGxheU1h
bmFnZXItPm1fcGxhdGZvcm1TdXJmYWNlcy5zZXQocGxhdGZvcm1TdXJmYWNlLT5lZ2xTdXJmYWNl
KCksIHBsYXRmb3JtU3VyZmFjZSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6dW5yZWdp
c3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZHKiBwbGF0Zm9ybVN1cmZhY2UpCit7Cisg
ICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5T3BlblZHOjpm
b3JEaXNwbGF5KHBsYXRmb3JtU3VyZmFjZS0+ZWdsRGlzcGxheSgpKTsKKyAgICBkaXNwbGF5TWFu
YWdlci0+bV9wbGF0Zm9ybVN1cmZhY2VzLnJlbW92ZShwbGF0Zm9ybVN1cmZhY2UtPmVnbFN1cmZh
Y2UoKSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6c2V0Q3VycmVudERpc3BsYXkoY29u
c3QgRUdMRGlzcGxheSYgZGlzcGxheSkKK3sKKyAgICBzX2N1cnJlbnQgPSBFR0xEaXNwbGF5T3Bl
blZHOjpmb3JEaXNwbGF5KGRpc3BsYXkpOworfQorCitFR0xEaXNwbGF5T3BlblZHKiBFR0xEaXNw
bGF5T3BlblZHOjpjdXJyZW50KCkKK3sKKyAgICBpZiAoIXNfY3VycmVudCkgeworICAgICAgICBF
R0xEaXNwbGF5IGRpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwor
ICAgICAgICBlZ2xJbml0aWFsaXplKGRpc3BsYXksIDAsIDApOworICAgICAgICBBU1NFUlRfRUdM
X05PX0VSUk9SKCk7CisKKyAgICAgICAgc19jdXJyZW50ID0gRUdMRGlzcGxheU9wZW5WRzo6Zm9y
RGlzcGxheShkaXNwbGF5KTsKKyAgICB9CisgICAgcmV0dXJuIHNfY3VycmVudDsKK30KKworRUdM
RGlzcGxheU9wZW5WRyogRUdMRGlzcGxheU9wZW5WRzo6Zm9yRGlzcGxheShjb25zdCBFR0xEaXNw
bGF5JiBkaXNwbGF5KQoreworICAgIEVHTERpc3BsYXlNYW5hZ2VyTWFwJiBtYW5hZ2VycyA9IGRp
c3BsYXlNYW5hZ2VycygpOworCisgICAgaWYgKCFtYW5hZ2Vycy5jb250YWlucyhkaXNwbGF5KSkK
KyAgICAgICAgbWFuYWdlcnMuc2V0KGRpc3BsYXksIG5ldyBFR0xEaXNwbGF5T3BlblZHKGRpc3Bs
YXkpKTsKKworICAgIHJldHVybiBtYW5hZ2Vycy5nZXQoZGlzcGxheSk7Cit9CisKKworLy8gT2Jq
ZWN0L2luc3RhbmNlIG1lbWJlcnMuCisKK0VHTERpc3BsYXlPcGVuVkc6OkVHTERpc3BsYXlPcGVu
VkcoY29uc3QgRUdMRGlzcGxheSYgZGlzcGxheSkKKyAgICA6IG1fZGlzcGxheShkaXNwbGF5KQor
ICAgICwgbV9zaGFyZWRQbGF0Zm9ybVN1cmZhY2UoMCkKKyAgICAsIG1fcGJ1ZmZlckNvbmZpZ0lk
KDApCisgICAgLCBtX3dpbmRvd0NvbmZpZ0lkKDApCit7CisgICAgZWdsQmluZEFQSShFR0xfT1BF
TlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworfQorCitFR0xEaXNwbGF5T3Bl
blZHOjp+RUdMRGlzcGxheU9wZW5WRygpCit7CisgICAgZWdsTWFrZUN1cnJlbnQobV9kaXNwbGF5
LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKyAgICBB
U1NFUlRfRUdMX05PX0VSUk9SKCk7CisKKyAgICBkZWxldGUgbV9zaGFyZWRQbGF0Zm9ybVN1cmZh
Y2U7CisKKyAgICBIYXNoTWFwPEVHTFN1cmZhY2UsIEVHTGludD46OmNvbnN0X2l0ZXJhdG9yIGVu
ZCA9IG1fc3VyZmFjZUNvbmZpZ0lkcy5lbmQoKTsKKyAgICBmb3IgKEhhc2hNYXA8RUdMU3VyZmFj
ZSwgRUdMaW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3N1cmZhY2VDb25maWdJZHMuYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICBkZXN0cm95U3VyZmFjZSgoKml0KS5maXJzdCk7
CisKKyAgICBlZ2xUZXJtaW5hdGUobV9kaXNwbGF5KTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9S
KCk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6c2V0RGVmYXVsdFBidWZmZXJDb25maWco
Y29uc3QgRUdMQ29uZmlnJiBjb25maWcpCit7CisgICAgRUdMaW50IGNvbmZpZ0lkOworICAgIEVH
TEJvb2xlYW4gc3VjY2VzcyA9IGVnbEdldENvbmZpZ0F0dHJpYihtX2Rpc3BsYXksIGNvbmZpZywg
RUdMX0NPTkZJR19JRCwgJmNvbmZpZ0lkKTsKKyAgICBBU1NFUlQoc3VjY2VzcyA9PSBFR0xfVFJV
RSk7CisgICAgQVNTRVJUKGNvbmZpZ0lkICE9IEVHTF9CQURfQVRUUklCVVRFKTsKKworICAgIG1f
cGJ1ZmZlckNvbmZpZ0lkID0gY29uZmlnSWQ7Cit9CisKK0VHTENvbmZpZyBFR0xEaXNwbGF5T3Bl
blZHOjpkZWZhdWx0UGJ1ZmZlckNvbmZpZygpCit7CisgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAg
ICBFR0xpbnQgbnVtQ29uZmlnczsKKworICAgIC8vIEhvcGVmdWxseSB0aGUgY2xpZW50IHdpbGwg
aGF2ZSBzZXQgdGhlIHBidWZmZXIgY29uZmlnIG9mIGl0cyBjaG9pY2UKKyAgICAvLyBieSBub3cg
LSBpZiBub3QsIHVzZSBhIDMyLWJpdCBnZW5lcmljIG9uZSBhcyBkZWZhdWx0LgorICAgIGlmICgh
bV9wYnVmZmVyQ29uZmlnSWQpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEVHTGludCBjb25maWdB
dHRyaWJzW10gPSB7CisgICAgICAgICAgICBFR0xfUkVEX1NJWkUsICAgOCwKKyAgICAgICAgICAg
IEVHTF9HUkVFTl9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgIDgsCisgICAg
ICAgICAgICBFR0xfQUxQSEFfU0laRSwgOCwKKyAgICAgICAgICAgIEVHTF9BTFBIQV9NQVNLX1NJ
WkUsIDEsCisgICAgICAgICAgICBFR0xfTFVNSU5BTkNFX1NJWkUsICBFR0xfRE9OVF9DQVJFLAor
ICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICAgRUdMX1BCVUZGRVJfQklULAorICAgICAg
ICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwgRUdMX09QRU5WR19CSVQsCisgICAgICAgICAgICBF
R0xfTk9ORSB9OworCisgICAgICAgIGVnbENob29zZUNvbmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0
dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBj
b25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgICAgRUdMX0NPTkZJR19J
RCwgbV9wYnVmZmVyQ29uZmlnSWQsCisgICAgICAgICAgICBFR0xfTk9ORQorICAgICAgICB9Owor
ICAgICAgICBlZ2xDaG9vc2VDb25maWcobV9kaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmY29uZmln
LCAxLCAmbnVtQ29uZmlncyk7CisgICAgfQorCisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOwor
ICAgIEFTU0VSVChudW1Db25maWdzID09IDEpOworICAgIHJldHVybiBjb25maWc7Cit9CisKK3Zv
aWQgRUdMRGlzcGxheU9wZW5WRzo6c2V0RGVmYXVsdFdpbmRvd0NvbmZpZyhjb25zdCBFR0xDb25m
aWcmIGNvbmZpZykKK3sKKyAgICBFR0xpbnQgY29uZmlnSWQ7CisgICAgRUdMQm9vbGVhbiBzdWNj
ZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1fZGlzcGxheSwgY29uZmlnLCBFR0xfQ09ORklHX0lE
LCAmY29uZmlnSWQpOworICAgIEFTU0VSVChzdWNjZXNzID09IEVHTF9UUlVFKTsKKyAgICBBU1NF
UlQoY29uZmlnSWQgIT0gRUdMX0JBRF9BVFRSSUJVVEUpOworCisgICAgbV93aW5kb3dDb25maWdJ
ZCA9IGNvbmZpZ0lkOworfQorCitFR0xDb25maWcgRUdMRGlzcGxheU9wZW5WRzo6ZGVmYXVsdFdp
bmRvd0NvbmZpZygpCit7CisgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICBFR0xpbnQgbnVtQ29u
ZmlnczsKKworICAgIC8vIEhvcGVmdWxseSB0aGUgY2xpZW50IHdpbGwgaGF2ZSBzZXQgdGhlIHdp
bmRvdyBjb25maWcgb2YgaXRzIGNob2ljZQorICAgIC8vIGJ5IG5vdyAtIGlmIG5vdCwgdXNlIGEg
MzItYml0IGdlbmVyaWMgb25lIGFzIGRlZmF1bHQuCisgICAgaWYgKCFtX3dpbmRvd0NvbmZpZ0lk
KSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0geworICAg
ICAgICAgICAgRUdMX1JFRF9TSVpFLCAgIDgsCisgICAgICAgICAgICBFR0xfR1JFRU5fU0laRSwg
OCwKKyAgICAgICAgICAgIEVHTF9CTFVFX1NJWkUsICA4LAorICAgICAgICAgICAgRUdMX0FMUEhB
X1NJWkUsIDgsCisgICAgICAgICAgICBFR0xfQUxQSEFfTUFTS19TSVpFLCAxLAorICAgICAgICAg
ICAgRUdMX0xVTUlOQU5DRV9TSVpFLCAgRUdMX0RPTlRfQ0FSRSwKKyAgICAgICAgICAgIEVHTF9T
VVJGQUNFX1RZUEUsICAgIEVHTF9XSU5ET1dfQklULAorICAgICAgICAgICAgRUdMX1JFTkRFUkFC
TEVfVFlQRSwgRUdMX09QRU5WR19CSVQsCisgICAgICAgICAgICBFR0xfTk9ORSB9OworCisgICAg
ICAgIGVnbENob29zZUNvbmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEs
ICZudW1Db25maWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBFR0xpbnQgY29uZmln
QXR0cmlic1tdID0geworICAgICAgICAgICAgRUdMX0NPTkZJR19JRCwgbV93aW5kb3dDb25maWdJ
ZCwKKyAgICAgICAgICAgIEVHTF9OT05FCisgICAgICAgIH07CisgICAgICAgIGVnbENob29zZUNv
bmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsK
KyAgICB9CisKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgQVNTRVJUKG51bUNvbmZp
Z3MgPT0gMSk7CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKworU3VyZmFjZU9wZW5WRyogRUdMRGlz
cGxheU9wZW5WRzo6c2hhcmVkUGxhdGZvcm1TdXJmYWNlKCkKK3sKKyAgICBpZiAoIW1fc2hhcmVk
UGxhdGZvcm1TdXJmYWNlKSB7CisgICAgICAgIEVHTENvbmZpZyBjb25maWcgPSBkZWZhdWx0UGJ1
ZmZlckNvbmZpZygpOworICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBjcmVhdGVQYnVmZmVy
U3VyZmFjZShJbnRTaXplKDEsIDEpLCBjb25maWcpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VS
Uk9SKCk7CisKKyAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dCht
X2Rpc3BsYXksIGNvbmZpZywgRUdMX05PX0NPTlRFWFQsIDApOworICAgICAgICBBU1NFUlRfRUdM
X05PX0VSUk9SKCk7CisgICAgICAgIG1fY29udGV4dHMuc2V0KG1fc3VyZmFjZUNvbmZpZ0lkcy5n
ZXQoc3VyZmFjZSksIGNvbnRleHQpOworCisgICAgICAgIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNl
ID0gbmV3IFN1cmZhY2VPcGVuVkcoKTsKKyAgICAgICAgbV9zaGFyZWRQbGF0Zm9ybVN1cmZhY2Ut
Pm1fZWdsRGlzcGxheSA9IG1fZGlzcGxheTsKKyAgICAgICAgbV9zaGFyZWRQbGF0Zm9ybVN1cmZh
Y2UtPm1fZWdsU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgIG1fc2hhcmVkUGxhdGZvcm1TdXJm
YWNlLT5tX2VnbENvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtX3BsYXRmb3JtU3VyZmFjZXMu
c2V0KHN1cmZhY2UsIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlKTsgLy8gYS5rLmEuIHJlZ2lzdGVy
UGxhdGZvcm1TdXJmYWNlKCkKKyAgICB9CisgICAgcmV0dXJuIG1fc2hhcmVkUGxhdGZvcm1TdXJm
YWNlOworfQorCitFR0xTdXJmYWNlIEVHTERpc3BsYXlPcGVuVkc6OmNyZWF0ZVBidWZmZXJTdXJm
YWNlKGNvbnN0IEludFNpemUmIHNpemUsIGNvbnN0IEVHTENvbmZpZyYgY29uZmlnKQoreworICAg
IGNvbnN0IEVHTGludCBhdHRyaWJMaXN0W10gPSB7CisgICAgICAgIEVHTF9XSURUSCwgc2l6ZS53
aWR0aCgpLAorICAgICAgICBFR0xfSEVJR0hULCBzaXplLmhlaWdodCgpLAorICAgICAgICBFR0xf
Tk9ORQorICAgIH07CisgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gZWdsQ3JlYXRlUGJ1ZmZlclN1
cmZhY2UobV9kaXNwbGF5LCBjb25maWcsIGF0dHJpYkxpc3QpOworICAgIGlmIChlZ2xHZXRFcnJv
cigpICE9IEVHTF9TVUNDRVNTKQorICAgICAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7CisKKyAg
ICBFR0xpbnQgc3VyZmFjZUNvbmZpZ0lkOworICAgIEVHTEJvb2xlYW4gc3VjY2VzcyA9IGVnbEdl
dENvbmZpZ0F0dHJpYihtX2Rpc3BsYXksIGNvbmZpZywgRUdMX0NPTkZJR19JRCwgJnN1cmZhY2VD
b25maWdJZCk7CisgICAgQVNTRVJUKHN1Y2Nlc3MgPT0gRUdMX1RSVUUpOworICAgIEFTU0VSVChz
dXJmYWNlQ29uZmlnSWQgIT0gRUdMX0JBRF9BVFRSSUJVVEUpOworCisgICAgQVNTRVJUKCFtX3N1
cmZhY2VDb25maWdJZHMuY29udGFpbnMoc3VyZmFjZSkpOworICAgIG1fc3VyZmFjZUNvbmZpZ0lk
cy5zZXQoc3VyZmFjZSwgc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICByZXR1cm4gc3VyZmFjZTsKK30K
KworRUdMU3VyZmFjZSBFR0xEaXNwbGF5T3BlblZHOjpzdXJmYWNlRm9yV2luZG93KEVHTE5hdGl2
ZVdpbmRvd1R5cGUgd0lkLCBjb25zdCBFR0xDb25maWcmIGNvbmZpZykKK3sKKyAgICBpZiAobV93
aW5kb3dTdXJmYWNlcy5jb250YWlucyh3SWQpKQorICAgICAgICByZXR1cm4gbV93aW5kb3dTdXJm
YWNlcy5nZXQod0lkKTsKKworICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRv
d1N1cmZhY2UobV9kaXNwbGF5LCBjb25maWcsIHdJZCwgMCk7CisgICAgQVNTRVJUX0VHTF9OT19F
UlJPUigpOworCisgICAgRUdMaW50IHN1cmZhY2VDb25maWdJZDsKKyAgICBFR0xCb29sZWFuIHN1
Y2Nlc3MgPSBlZ2xHZXRDb25maWdBdHRyaWIobV9kaXNwbGF5LCBjb25maWcsIEVHTF9DT05GSUdf
SUQsICZzdXJmYWNlQ29uZmlnSWQpOworICAgIEFTU0VSVChzdWNjZXNzID09IEVHTF9UUlVFKTsK
KyAgICBBU1NFUlQoc3VyZmFjZUNvbmZpZ0lkICE9IEVHTF9CQURfQVRUUklCVVRFKTsKKworICAg
IEFTU0VSVCghbV9zdXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2UpKTsKKyAgICBtX3N1
cmZhY2VDb25maWdJZHMuc2V0KHN1cmZhY2UsIHN1cmZhY2VDb25maWdJZCk7CisgICAgcmV0dXJu
IHN1cmZhY2U7Cit9CisKK2Jvb2wgRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZXNDb21wYXRpYmxl
KGNvbnN0IEVHTFN1cmZhY2UmIHN1cmZhY2UsIGNvbnN0IEVHTFN1cmZhY2UmIG90aGVyU3VyZmFj
ZSkKK3sKKyAgICBpZiAoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSB8fCBvdGhlclN1cmZhY2Ug
PT0gRUdMX05PX1NVUkZBQ0UpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEN1cnJl
bnRseSwgd2UgYXNzdW1lIHRoYXQgYWxsIHN1cmZhY2VzIGtub3duIHRvIHRoaXMgb2JqZWN0IGFy
ZQorICAgIC8vIGNvbnRleHQtY29tcGF0aWJsZSB0byBlYWNoIG90aGVyICh3aGljaCBpcyByZWFz
b25hYmxlIHRvIGFzc3VtZSwKKyAgICAvLyBvdGhlcndpc2UgZWdsQ3JlYXRlQ29udGV4dCgpIHdv
dWxkIGZhaWwgd2l0aCBFR0xfQkFEX01BVENIIGZvciBzaGFyZWQKKyAgICAvLyBjb250ZXh0IGNv
bXBhdGliaWxpdHkgYW55d2F5cy4KKyAgICByZXR1cm4gKG1fc3VyZmFjZUNvbmZpZ0lkcy5jb250
YWlucyhzdXJmYWNlKSAmJiBtX3N1cmZhY2VDb25maWdJZHMuY29udGFpbnMob3RoZXJTdXJmYWNl
KSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6ZGVzdHJveVN1cmZhY2UoY29uc3QgRUdM
U3VyZmFjZSYgc3VyZmFjZSkKK3sKKyAgICBBU1NFUlQoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFD
RSk7CisKKyAgICBpZiAoZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMX0RSQVcpID09IHN1cmZhY2Up
IHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQobV9kaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdM
X05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJP
UigpOworICAgIH0KKworICAgIC8vIERlc3Ryb3kgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB0byB0
aGUgc3VyZmFjZSwgaWYgd2UgYWxyZWFkeSBjcmVhdGVkIG9uZS4KKyAgICBpZiAobV9zdXJmYWNl
Q29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2UpKSB7CisgICAgICAgIEVHTGludCBzdXJmYWNlQ29u
ZmlnSWQgPSBtX3N1cmZhY2VDb25maWdJZHMudGFrZShzdXJmYWNlKTsgLy8gdGFrZSA9IGdldCBh
bmQgcmVtb3ZlCisgICAgICAgIGJvb2wgaXNDb250ZXh0UmVmZXJlbmNlZCA9IGZhbHNlOworCisg
ICAgICAgIGlmIChtX2NvbXBhdGlibGVDb25maWdJZHMuY29udGFpbnMoc3VyZmFjZUNvbmZpZ0lk
KSkKKyAgICAgICAgICAgIHN1cmZhY2VDb25maWdJZCA9IG1fY29tcGF0aWJsZUNvbmZpZ0lkcy5n
ZXQoc3VyZmFjZUNvbmZpZ0lkKTsKKworICAgICAgICBIYXNoTWFwPEVHTFN1cmZhY2UsIEVHTGlu
dD46Oml0ZXJhdG9yIGVuZCA9IG1fc3VyZmFjZUNvbmZpZ0lkcy5lbmQoKTsKKworICAgICAgICAv
LyAuLi5idXQgb25seSBpZiB0aGVyZSdzIG5vIG90aGVyIHN1cmZhY2VzIGFzc29jaWF0ZWQgdG8g
dGhhdCBjb250ZXh0LgorICAgICAgICBmb3IgKEhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50Pjo6
aXRlcmF0b3IgaXQgPSBtX3N1cmZhY2VDb25maWdJZHMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgICAgICBpZiAoKCppdCkuc2Vjb25kID09IHN1cmZhY2VDb25maWdJZCkgewor
ICAgICAgICAgICAgICAgIGlzQ29udGV4dFJlZmVyZW5jZWQgPSB0cnVlOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaXNDb250
ZXh0UmVmZXJlbmNlZCAmJiBtX2NvbnRleHRzLmNvbnRhaW5zKHN1cmZhY2VDb25maWdJZCkpIHsK
KyAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IG1fY29udGV4dHMudGFrZShzdXJmYWNl
Q29uZmlnSWQpOworICAgICAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobV9kaXNwbGF5LCBjb250
ZXh0KTsKKyAgICAgICAgICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIG1fcGxhdGZvcm1TdXJmYWNlcy5yZW1vdmUoc3VyZmFjZSk7CisKKyAgICBIYXNo
TWFwPEVHTE5hdGl2ZVdpbmRvd1R5cGUsIEVHTFN1cmZhY2U+OjppdGVyYXRvciBlbmQgPSBtX3dp
bmRvd1N1cmZhY2VzLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDxFR0xOYXRpdmVXaW5kb3dUeXBl
LCBFR0xTdXJmYWNlPjo6aXRlcmF0b3IgaXQgPSBtX3dpbmRvd1N1cmZhY2VzLmJlZ2luKCk7IGl0
ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoKCppdCkuc2Vjb25kID09IHN1cmZhY2UpIHsK
KyAgICAgICAgICAgIG1fd2luZG93U3VyZmFjZXMucmVtb3ZlKGl0KTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZWdsRGVzdHJveVN1cmZhY2UobV9kaXNwbGF5
LCBzdXJmYWNlKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7Cit9CisKK0VHTENvbnRleHQg
RUdMRGlzcGxheU9wZW5WRzo6Y29udGV4dEZvclN1cmZhY2UoY29uc3QgRUdMU3VyZmFjZSYgc3Vy
ZmFjZSkKK3sKKyAgICBBU1NFUlQoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBp
ZiAobV9wbGF0Zm9ybVN1cmZhY2VzLmNvbnRhaW5zKHN1cmZhY2UpKQorICAgICAgICByZXR1cm4g
bV9wbGF0Zm9ybVN1cmZhY2VzLmdldChzdXJmYWNlKS0+ZWdsQ29udGV4dCgpOworCisgICAgZWds
QmluZEFQSShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisg
ICAgRUdMaW50IHN1cmZhY2VDb25maWdJZDsKKworICAgIGlmIChtX3N1cmZhY2VDb25maWdJZHMu
Y29udGFpbnMoc3VyZmFjZSkpCisgICAgICAgIHN1cmZhY2VDb25maWdJZCA9IG1fc3VyZmFjZUNv
bmZpZ0lkcy5nZXQoc3VyZmFjZSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFJldHJpZXZlIHRo
ZSBzYW1lIEVHTCBjb25maWcgZm9yIGNvbnRleHQgY3JlYXRpb24gdGhhdCB3YXMgdXNlZCB0bwor
ICAgICAgICAvLyBjcmVhdGUgdGhlIHRoZSBFR0wgc3VyZmFjZS4KKyAgICAgICAgRUdMQm9vbGVh
biBzdWNjZXNzID0gZWdsUXVlcnlTdXJmYWNlKG1fZGlzcGxheSwgc3VyZmFjZSwgRUdMX0NPTkZJ
R19JRCwgJnN1cmZhY2VDb25maWdJZCk7CisgICAgICAgIEFTU0VSVChzdWNjZXNzID09IEVHTF9U
UlVFKTsKKyAgICAgICAgQVNTRVJUKHN1cmZhY2VDb25maWdJZCAhPSBFR0xfQkFEX0FUVFJJQlVU
RSk7CisKKyAgICAgICAgbV9zdXJmYWNlQ29uZmlnSWRzLnNldChzdXJmYWNlLCBzdXJmYWNlQ29u
ZmlnSWQpOworICAgIH0KKworICAgIGlmIChtX2NvbXBhdGlibGVDb25maWdJZHMuY29udGFpbnMo
c3VyZmFjZUNvbmZpZ0lkKSkKKyAgICAgICAgc3VyZmFjZUNvbmZpZ0lkID0gbV9jb21wYXRpYmxl
Q29uZmlnSWRzLmdldChzdXJmYWNlQ29uZmlnSWQpOworCisgICAgaWYgKG1fY29udGV4dHMuY29u
dGFpbnMoc3VyZmFjZUNvbmZpZ0lkKSkKKyAgICAgICAgcmV0dXJuIG1fY29udGV4dHMuZ2V0KHN1
cmZhY2VDb25maWdJZCk7CisKKyAgICBpZiAoIW1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlKSAvLyBz
aGFyZWQgY29udGV4dCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQKKyAgICAgICAgc2hhcmVkUGxh
dGZvcm1TdXJmYWNlKCk7IC8vIGNyZWF0ZXMgdGhlIHNoYXJlZCBzdXJmYWNlICYgY29udGV4dAor
CisgICAgRUdMRGlzcGxheSBjdXJyZW50RGlzcGxheSA9IGVnbEdldEN1cnJlbnREaXNwbGF5KCk7
CisgICAgRUdMU3VyZmFjZSBjdXJyZW50UmVhZFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFj
ZShFR0xfUkVBRCk7CisgICAgRUdMU3VyZmFjZSBjdXJyZW50RHJhd1N1cmZhY2UgPSBlZ2xHZXRD
dXJyZW50U3VyZmFjZShFR0xfRFJBVyk7CisgICAgRUdMQ29udGV4dCBjdXJyZW50Q29udGV4dCA9
IGVnbEdldEN1cnJlbnRDb250ZXh0KCk7CisKKyAgICAvLyBCZWZvcmUgY3JlYXRpbmcgYSBuZXcg
Y29udGV4dCwgbGV0J3MgdHJ5IHdoZXRoZXIgYW4gZXhpc3Rpbmcgb25lCisgICAgLy8gaXMgY29t
cGF0aWJsZSB3aXRoIHRoZSBzdXJmYWNlLiBFR0wgZG9lc24ndCBnaXZlIHVzIGEgZGlmZmVyZW50
IHdheQorICAgIC8vIHRvIGNoZWNrIGNvbnRleHQvc3VyZmFjZSBjb21wYXRpYmlsaXR5IHRoYW4g
dHJ5aW5nIGl0IG91dCwgc28gbGV0J3MKKyAgICAvLyBkbyBqdXN0IHRoYXQuCisgICAgSGFzaE1h
cDxFR0xpbnQsIEVHTENvbnRleHQ+OjppdGVyYXRvciBlbmQgPSBtX2NvbnRleHRzLmVuZCgpOwor
CisgICAgZm9yIChIYXNoTWFwPEVHTGludCwgRUdMQ29udGV4dD46Oml0ZXJhdG9yIGl0ID0gbV9j
b250ZXh0cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJl
bnQobV9kaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCAoKml0KS5zZWNvbmQpOworICAgICAgICBp
ZiAoZWdsR2V0RXJyb3IoKSA9PSBFR0xfU1VDQ0VTUykgeworICAgICAgICAgICAgLy8gUmVzdG9y
ZSBwcmV2aW91cyBzdXJmYWNlL2NvbnRleHQuCisgICAgICAgICAgICBpZiAoY3VycmVudENvbnRl
eHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChj
dXJyZW50RGlzcGxheSwgY3VycmVudFJlYWRTdXJmYWNlLCBjdXJyZW50RHJhd1N1cmZhY2UsIGN1
cnJlbnRDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDb29sLCBzdXJmYWNlIGlzIGNvbXBhdGlibGUg
dG8gb25lIG9mIG91ciBleGlzdGluZyBjb250ZXh0cy4KKyAgICAgICAgICAgIG1fY29tcGF0aWJs
ZUNvbmZpZ0lkcy5zZXQoc3VyZmFjZUNvbmZpZ0lkLCAoKml0KS5maXJzdCk7CisgICAgICAgICAg
ICByZXR1cm4gKCppdCkuc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIC8vIFJlc3RvcmUg
cHJldmlvdXMgc3VyZmFjZS9jb250ZXh0LgorICAgIGlmIChjdXJyZW50Q29udGV4dCAhPSBFR0xf
Tk9fQ09OVEVYVCkgeworICAgICAgICBlZ2xNYWtlQ3VycmVudChjdXJyZW50RGlzcGxheSwgY3Vy
cmVudFJlYWRTdXJmYWNlLCBjdXJyZW50RHJhd1N1cmZhY2UsIGN1cnJlbnRDb250ZXh0KTsKKyAg
ICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIH0KKworICAgIEVHTENvbmZpZyBjb25m
aWc7CisgICAgRUdMaW50IG51bUNvbmZpZ3M7CisKKyAgICBjb25zdCBFR0xpbnQgY29uZmlnQXR0
cmlic1tdID0geworICAgICAgICBFR0xfQ09ORklHX0lELCBzdXJmYWNlQ29uZmlnSWQsCisgICAg
ICAgIEVHTF9OT05FIH07CisKKyAgICBlZ2xDaG9vc2VDb25maWcobV9kaXNwbGF5LCBjb25maWdB
dHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJP
UigpOworICAgIEFTU0VSVChudW1Db25maWdzID09IDEpOworCisgICAgLy8gV2Ugc2hhcmUgYWxs
IG9mIHRoZSBpbWFnZXMgYW5kIHBhdGhzIGFtb25nc3QgdGhlIGRpZmZlcmVudCBjb250ZXh0cywK
KyAgICAvLyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gYWxsIG9mIHRoZW0uIFJlc291cmNl
cyB0aGF0IGFyZSBjcmVhdGVkCisgICAgLy8gd2hpbGUgbV9zaGFyZWRQbGF0Zm9ybVN1cmZhY2Ut
PmNvbnRleHQoKSBpcyBjdXJyZW50IHdpbGwgYmUKKyAgICAvLyBhY2Nlc3NpYmxlIGZyb20gYWxs
IG90aGVyIGNvbnRleHRzLCBidXQgYXJlIG5vdCByZXN0cmljdGVkIHRvIHRoZQorICAgIC8vIGxp
ZmV0aW1lIG9mIHRob3NlIGNvbnRleHRzLgorICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbENy
ZWF0ZUNvbnRleHQobV9kaXNwbGF5LCBjb25maWcsIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlLT5l
Z2xDb250ZXh0KCksIDApOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIEFTU0VS
VCghbV9jb250ZXh0cy5jb250YWlucyhzdXJmYWNlQ29uZmlnSWQpKTsKKyAgICBtX2NvbnRleHRz
LnNldChzdXJmYWNlQ29uZmlnSWQsIGNvbnRleHQpOworICAgIHJldHVybiBjb250ZXh0OworfQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMRGlzcGxheU9w
ZW5WRy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMRGlzcGxheU9wZW5W
Ry5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNTU1ZDUKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3Bl
blZHLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4g
TW90aW9uIExpbWl0ZWQgMjAwOSwgMjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBF
R0xEaXNwbGF5T3BlblZHX2gKKyNkZWZpbmUgRUdMRGlzcGxheU9wZW5WR19oCisKKyNpbmNsdWRl
IDxlZ2wuaD4KKyNpbmNsdWRlIDxvcGVudmcuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFNpemU7CitjbGFzcyBTdXJmYWNlT3Bl
blZHOworCitjbGFzcyBFR0xEaXNwbGF5T3BlblZHIHsKK3B1YmxpYzoKKyAgICBmcmllbmQgY2xh
c3MgU3VyZmFjZU9wZW5WRzsKKworICAgIHN0YXRpYyBTdXJmYWNlT3BlblZHKiBjdXJyZW50U3Vy
ZmFjZSgpOworICAgIHN0YXRpYyB2b2lkIHNldEN1cnJlbnREaXNwbGF5KGNvbnN0IEVHTERpc3Bs
YXkmKTsKKyAgICBzdGF0aWMgRUdMRGlzcGxheU9wZW5WRyogY3VycmVudCgpOworICAgIHN0YXRp
YyBFR0xEaXNwbGF5T3BlblZHKiBmb3JEaXNwbGF5KGNvbnN0IEVHTERpc3BsYXkmKTsKKworICAg
IHZvaWQgc2V0RGVmYXVsdFBidWZmZXJDb25maWcoY29uc3QgRUdMQ29uZmlnJik7CisgICAgRUdM
Q29uZmlnIGRlZmF1bHRQYnVmZmVyQ29uZmlnKCk7CisgICAgdm9pZCBzZXREZWZhdWx0V2luZG93
Q29uZmlnKGNvbnN0IEVHTENvbmZpZyYpOworICAgIEVHTENvbmZpZyBkZWZhdWx0V2luZG93Q29u
ZmlnKCk7CisKKyAgICBFR0xEaXNwbGF5IGRpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtX2Rpc3Bs
YXk7IH0KKyAgICBTdXJmYWNlT3BlblZHKiBzaGFyZWRQbGF0Zm9ybVN1cmZhY2UoKTsKKworICAg
IC8qKiBDcmVhdGVzIGEgcGJ1ZmZlciBzdXJmYWNlIHVzaW5nIHRoZSBnaXZlbiBjb25maWcuIElm
IG5vIHN1cmZhY2UKKyAgICAgKiBjb3VsZCBiZSBjcmVhdGVkLCBFR0xfTk9fU1VSRkFDRSBpcyBy
ZXR1cm5lZCBhbmQgZXJyb3JzIGNhbiBiZQorICAgICAqIGNhdWdodCB3aXRoIGVnbEdldEVycm9y
KCkgKHJlc3BlY3RpdmVseSBBU1NFUlRfRUdMX05PX0VSUk9SKCkpLiAqLworICAgIEVHTFN1cmZh
Y2UgY3JlYXRlUGJ1ZmZlclN1cmZhY2UoY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3QgRUdMQ29u
ZmlnJiBjb25maWcpOworCisgICAgRUdMU3VyZmFjZSBzdXJmYWNlRm9yV2luZG93KEVHTE5hdGl2
ZVdpbmRvd1R5cGUgd0lkLCBjb25zdCBFR0xDb25maWcmIGNvbmZpZyk7CisKKyAgICBib29sIHN1
cmZhY2VzQ29tcGF0aWJsZShjb25zdCBFR0xTdXJmYWNlJiBzdXJmYWNlLCBjb25zdCBFR0xTdXJm
YWNlJiBvdGhlclN1cmZhY2UpOworCisgICAgLyoqIERlc3Ryb3kgdGhlIHN1cmZhY2UgYW5kIGl0
cyBjb3JyZXNwb25kaW5nIGNvbnRleHQgKHVubGVzcyBhbm90aGVyCisgICAgICogc3VyZmFjZSBp
cyBzdGlsbCB1c2luZyB0aGUgc2FtZSBjb250ZXh0LCBpbiB3aGljaCBjYXNlIHRoZSBjb250ZXh0
CisgICAgICogaXMgbm90IGRlc3Ryb3llZCkuICovCisgICAgdm9pZCBkZXN0cm95U3VyZmFjZShj
b25zdCBFR0xTdXJmYWNlJik7CisKKyAgICAvKiogUmV0dXJuIHRoZSBjb250ZXh0IGNvcnJlc3Bv
bmRpbmcgdG8gdGhlIHN1cmZhY2UuCisgICAgICogSWYgbm8gY29ycmVzcG9uZGluZyBjb250ZXh0
IGV4aXN0cywgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gKi8KKyAgICBFR0xDb250ZXh0
IGNvbnRleHRGb3JTdXJmYWNlKGNvbnN0IEVHTFN1cmZhY2UmKTsKKworcHJpdmF0ZToKKyAgICBz
dGF0aWMgdm9pZCByZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZHKik7CisgICAg
c3RhdGljIHZvaWQgdW5yZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZHKik7CisK
KyAgICBFR0xEaXNwbGF5T3BlblZHKGNvbnN0IEVHTERpc3BsYXkmIGRpc3BsYXkpOworICAgIH5F
R0xEaXNwbGF5T3BlblZHKCk7CisKKyAgICBFR0xEaXNwbGF5IG1fZGlzcGxheTsKKyAgICBTdXJm
YWNlT3BlblZHKiBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZTsKKyAgICBFR0xpbnQgbV9wYnVmZmVy
Q29uZmlnSWQ7CisgICAgRUdMaW50IG1fd2luZG93Q29uZmlnSWQ7CisKKyAgICBXVEY6Okhhc2hN
YXA8RUdMU3VyZmFjZSwgU3VyZmFjZU9wZW5WRyo+IG1fcGxhdGZvcm1TdXJmYWNlczsKKyAgICBX
VEY6Okhhc2hNYXA8RUdMTmF0aXZlV2luZG93VHlwZSwgRUdMU3VyZmFjZT4gbV93aW5kb3dTdXJm
YWNlczsKKyAgICBXVEY6Okhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50PiBtX3N1cmZhY2VDb25m
aWdJZHM7CisgICAgV1RGOjpIYXNoTWFwPEVHTGludCwgRUdMaW50PiBtX2NvbXBhdGlibGVDb25m
aWdJZHM7CisgICAgV1RGOjpIYXNoTWFwPEVHTGludCwgRUdMQ29udGV4dD4gbV9jb250ZXh0czsK
K307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9FR0xVdGlscy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdM
VXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2RhMjVhCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMVXRpbHMu
aApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZCAyMDA5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIEVHTFV0aWxzX2gK
KyNkZWZpbmUgRUdMVXRpbHNfaAorCisjaW5jbHVkZSA8ZWdsLmg+CisjaW5jbHVkZSA8d3RmL0Fz
c2VydGlvbnMuaD4KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiB0b0VHTEVycm9yQ29uc3Rh
bnQoRUdMaW50IGVycm9yKQoreworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICBjYXNlIEVHTF9O
T1RfSU5JVElBTElaRUQ6IHJldHVybiAiRUdMX05PVF9JTklUSUFMSVpFRCI7CisgICAgY2FzZSBF
R0xfQkFEX0FDQ0VTUzogcmV0dXJuICJFR0xfQkFEX0FDQ0VTUyI7CisgICAgY2FzZSBFR0xfQkFE
X0FMTE9DOiByZXR1cm4gIkVHTF9CQURfQUxMT0MiOworICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJV
VEU6IHJldHVybiAiRUdMX0JBRF9BVFRSSUJVVEUiOworICAgIGNhc2UgRUdMX0JBRF9DT05URVhU
OiByZXR1cm4gIkVHTF9CQURfQ09OVEVYVCI7CisgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogcmV0
dXJuICJFR0xfQkFEX0NPTkZJRyI7CisgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTog
cmV0dXJuICJFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSI7CisgICAgY2FzZSBFR0xfQkFEX0RJU1BM
QVk6IHJldHVybiAiRUdMX0JBRF9ESVNQTEFZIjsKKyAgICBjYXNlIEVHTF9CQURfU1VSRkFDRTog
cmV0dXJuICJFR0xfQkFEX1NVUkZBQ0UiOworICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogcmV0dXJu
ICJFR0xfQkFEX01BVENIIjsKKyAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiByZXR1cm4gIkVH
TF9CQURfUEFSQU1FVEVSIjsKKyAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1BJWE1BUDogcmV0dXJu
ICJFR0xfQkFEX05BVElWRV9QSVhNQVAiOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9X
OiByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1dJTkRPVyI7CisgICAgY2FzZSBFR0xfQ09OVEVYVF9M
T1NUOiByZXR1cm4gIkVHTF9DT05URVhUX0xPU1QiOworICAgIGRlZmF1bHQ6IHJldHVybiAiVU5L
Tk9XTl9FUlJPUiI7CisgICAgfQorfQorCisjaWYgQVNTRVJUX0RJU0FCTEVECisjZGVmaW5lIEFT
U0VSVF9FR0xfTk9fRVJST1IoKSAoKHZvaWQpMCkKKyNlbHNlCisjZGVmaW5lIEFTU0VSVF9FR0xf
Tk9fRVJST1IoKSBcCisgICAgQVNTRVJUX1dJVEhfTUVTU0FHRShlZ2xHZXRFcnJvcigpID09IFZH
X05PX0VSUk9SLCAiRm91bmQgJXMiLCB0b0VHTEVycm9yQ29uc3RhbnQoZWdsR2V0RXJyb3IoKSkp
CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9TdXJmYWNlT3BlblZHLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3Bl
bnZnL1N1cmZhY2VPcGVuVkcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjcxMGJkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29w
ZW52Zy9TdXJmYWNlT3BlblZHLmNwcApAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOSwgMjAxMC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN1cmZhY2VPcGVuVkcuaCIK
KworI2luY2x1ZGUgIkludFNpemUuaCIKKyNpbmNsdWRlICJQYWludGVyT3BlblZHLmgiCisKKyNp
ZiBQTEFURk9STShFR0wpCisjaW5jbHVkZSAiRUdMRGlzcGxheU9wZW5WRy5oIgorI2luY2x1ZGUg
IkVHTFV0aWxzLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitTdXJmYWNlT3Bl
blZHKiBTdXJmYWNlT3BlblZHOjpjdXJyZW50U3VyZmFjZSgpCit7CisjaWYgUExBVEZPUk0oRUdM
KQorICAgIHJldHVybiBFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50U3VyZmFjZSgpOworI2VuZGlm
Cit9CisKKyNpZiBQTEFURk9STShFR0wpCitTdXJmYWNlT3BlblZHOjpTdXJmYWNlT3BlblZHKGNv
bnN0IEludFNpemUmIHNpemUsIGNvbnN0IEVHTERpc3BsYXkmIGRpc3BsYXksIEVHTENvbmZpZyog
Y29uZlB0cikKKyAgICA6IG1fZWdsRGlzcGxheShkaXNwbGF5KQorICAgICwgbV9lZ2xTdXJmYWNl
KEVHTF9OT19TVVJGQUNFKQorICAgICwgbV9lZ2xDb250ZXh0KEVHTF9OT19DT05URVhUKQorewor
ICAgIEFTU0VSVChtX2VnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpOworCisgICAgRUdMRGlz
cGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5
KG1fZWdsRGlzcGxheSk7CisgICAgRUdMQ29uZmlnIGNvbmZpZyA9IGNvbmZQdHIgPyAoKmNvbmZQ
dHIpIDogZGlzcGxheU1hbmFnZXItPmRlZmF1bHRQYnVmZmVyQ29uZmlnKCk7CisgICAgbV9lZ2xT
dXJmYWNlID0gZGlzcGxheU1hbmFnZXItPmNyZWF0ZVBidWZmZXJTdXJmYWNlKHNpemUsIGNvbmZp
Zyk7CisKKyAgICBpZiAobV9lZ2xTdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX2VnbENvbnRleHQgPSBkaXNwbGF5TWFuYWdlci0+Y29udGV4dEZvclN1
cmZhY2UobV9lZ2xTdXJmYWNlKTsKKyAgICBFR0xEaXNwbGF5T3BlblZHOjpyZWdpc3RlclBsYXRm
b3JtU3VyZmFjZSh0aGlzKTsKK30KKworU3VyZmFjZU9wZW5WRzo6U3VyZmFjZU9wZW5WRyhFR0xO
YXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMRGlzcGxheSYgZGlzcGxheSwgRUdMQ29u
ZmlnKiBjb25mUHRyKQorICAgIDogbV9lZ2xEaXNwbGF5KGRpc3BsYXkpCisgICAgLCBtX2VnbFN1
cmZhY2UoRUdMX05PX1NVUkZBQ0UpCisgICAgLCBtX2VnbENvbnRleHQoRUdMX05PX0NPTlRFWFQp
Cit7CisgICAgQVNTRVJUKG1fZWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSk7CisKKyAgICBF
R0xEaXNwbGF5T3BlblZHKiBkaXNwbGF5TWFuYWdlciA9IEVHTERpc3BsYXlPcGVuVkc6OmZvckRp
c3BsYXkobV9lZ2xEaXNwbGF5KTsKKyAgICBFR0xDb25maWcgY29uZmlnID0gY29uZlB0ciA/ICgq
Y29uZlB0cikgOiBkaXNwbGF5TWFuYWdlci0+ZGVmYXVsdFdpbmRvd0NvbmZpZygpOworICAgIG1f
ZWdsU3VyZmFjZSA9IGRpc3BsYXlNYW5hZ2VyLT5zdXJmYWNlRm9yV2luZG93KHdpbmRvdywgY29u
ZmlnKTsKKworICAgIGlmIChtX2VnbFN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fZWdsQ29udGV4dCA9IGRpc3BsYXlNYW5hZ2VyLT5jb250ZXh0Rm9y
U3VyZmFjZShtX2VnbFN1cmZhY2UpOworICAgIEVHTERpc3BsYXlPcGVuVkc6OnJlZ2lzdGVyUGxh
dGZvcm1TdXJmYWNlKHRoaXMpOworfQorCisvLyBDb25zdHJ1Y3RvciBvbmx5IGFjY2Vzc2libGUg
dG8gRUdMRGlzcGxheU9wZW5WRyBmb3Igc2hhcmVkIGNvbnRleHQKKy8vIGluaXRpYWxpemF0aW9u
LiBUaGUgcGFyYW1ldGVyIHR5cGVzIG1pZ2h0IGRlZmluZSB0byB2b2lkKiBsaWtlIGluIHRoZQor
Ly8gd2luZG93IHN1cmZhY2UgY29uc3RydWN0b3IsIHNvIGl0IGNhbid0IGJlIG92ZXJsb2FkZWQg
d2l0aCBhbGwgdGhlIHJlcXVpcmVkCisvLyBhcmd1bWVudHMgYW5kIEVHTERpc3BsYXlPcGVuVkcg
YmFzaWNhbGx5IGltcGxlbWVudHMgdGhlIGNvbnN0cnVjdG9yCisvLyBieSBpdHNlbGYuCitTdXJm
YWNlT3BlblZHOjpTdXJmYWNlT3BlblZHKCkKKyAgICA6IG1fZWdsRGlzcGxheShFR0xfTk9fRElT
UExBWSkKKyAgICAsIG1fZWdsU3VyZmFjZShFR0xfTk9fU1VSRkFDRSkKKyAgICAsIG1fZWdsQ29u
dGV4dChFR0xfTk9fQ09OVEVYVCkKK3sKK30KKyNlbmRpZgorCitTdXJmYWNlT3BlblZHOjp+U3Vy
ZmFjZU9wZW5WRygpCit7CisgICAgaWYgKCFpc1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsKKwor
I2lmIFBMQVRGT1JNKEVHTCkKKyAgICBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWds
RGlzcGxheSktPmRlc3Ryb3lTdXJmYWNlKG1fZWdsU3VyZmFjZSk7CisgICAgRUdMRGlzcGxheU9w
ZW5WRzo6dW5yZWdpc3RlclBsYXRmb3JtU3VyZmFjZSh0aGlzKTsKKyNlbmRpZgorfQorCitib29s
IFN1cmZhY2VPcGVuVkc6OmlzVmFsaWQoKSBjb25zdAoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAg
ICByZXR1cm4gKG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisjZW5kaWYKK30KKwor
aW50IFN1cmZhY2VPcGVuVkc6OndpZHRoKCkgY29uc3QKK3sKKyNpZiBQTEFURk9STShFR0wpCisg
ICAgQVNTRVJUKG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBFR0xpbnQg
d2lkdGg7CisgICAgZWdsUXVlcnlTdXJmYWNlKG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlLCBF
R0xfV0lEVEgsICZ3aWR0aCk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIHJldHVy
biB3aWR0aDsKKyNlbmRpZgorfQorCitpbnQgU3VyZmFjZU9wZW5WRzo6aGVpZ2h0KCkgY29uc3QK
K3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgQVNTRVJUKG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9f
U1VSRkFDRSk7CisKKyAgICBFR0xpbnQgaGVpZ2h0OworICAgIGVnbFF1ZXJ5U3VyZmFjZShtX2Vn
bERpc3BsYXksIG1fZWdsU3VyZmFjZSwgRUdMX0hFSUdIVCwgJmhlaWdodCk7CisgICAgQVNTRVJU
X0VHTF9OT19FUlJPUigpOworICAgIHJldHVybiBoZWlnaHQ7CisjZW5kaWYKK30KKworU3VyZmFj
ZU9wZW5WRyogU3VyZmFjZU9wZW5WRzo6c2hhcmVkU3VyZmFjZSgpIGNvbnN0Cit7CisjaWYgUExB
VEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpOwor
ICAgIHJldHVybiBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlzcGxheSktPnNo
YXJlZFBsYXRmb3JtU3VyZmFjZSgpOworI2VuZGlmCit9CisKK3ZvaWQgU3VyZmFjZU9wZW5WRzo6
bWFrZUN1cnJlbnQoTWFrZUN1cnJlbnRNb2RlIG1vZGUpCit7CisjaWYgUExBVEZPUk0oRUdMKQor
ICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpOworCisgICAgZWdsQmlu
ZEFQSShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIEVH
TFN1cmZhY2UgY3VycmVudFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7
CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAgaWYgKGN1cnJlbnRTdXJmYWNlICE9
IG1fZWdsU3VyZmFjZSkgeworICAgICAgICBlZ2xNYWtlQ3VycmVudChtX2VnbERpc3BsYXksIG1f
ZWdsU3VyZmFjZSwgbV9lZ2xTdXJmYWNlLCBtX2VnbENvbnRleHQpOworICAgICAgICBBU1NFUlRf
RUdMX05PX0VSUk9SKCk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgU3VyZmFjZU9wZW5WRzo6
bWFrZUNvbXBhdGlibGVDdXJyZW50KCkKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgQVNTRVJU
KG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBlZ2xCaW5kQVBJKEVHTF9P
UEVOVkdfQVBJKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgRUdMU3VyZmFjZSBj
dXJyZW50U3VyZmFjZSA9IGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKyAgICBBU1NF
UlRfRUdMX05PX0VSUk9SKCk7CisKKyAgICBpZiAoY3VycmVudFN1cmZhY2UgIT0gbV9lZ2xTdXJm
YWNlCisgICAgICAgICYmICFFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlzcGxh
eSktPnN1cmZhY2VzQ29tcGF0aWJsZShjdXJyZW50U3VyZmFjZSwgbV9lZ2xTdXJmYWNlKSkgewor
ICAgICAgICBlZ2xNYWtlQ3VycmVudChtX2VnbERpc3BsYXksIG1fZWdsU3VyZmFjZSwgbV9lZ2xT
dXJmYWNlLCBtX2VnbENvbnRleHQpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7Cisg
ICAgfQorICAgIC8vIGVsc2U6IHN1cmZhY2VzIGNvbXBhdGlibGUsIG5vIG5lZWQgdG8gc3dpdGNo
IGNvbnRleHRzCisjZW5kaWYKK30KKwordm9pZCBTdXJmYWNlT3BlblZHOjpmbHVzaCgpCit7Cisj
aWYgUExBVEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZB
Q0UpOworCisgICAgZWdsU3dhcEJ1ZmZlcnMobV9lZ2xEaXNwbGF5LCBtX2VnbFN1cmZhY2UpOwor
ICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyNlbmRpZgorfQorCit9CmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJmYWNlT3BlblZHLmggYi9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJmYWNlT3BlblZHLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjNmRlOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuaApAQCAtMCwwICsxLDEyMSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAwOSwg
MjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBTdXJmYWNlT3BlblZHX2gKKyNkZWZp
bmUgU3VyZmFjZU9wZW5WR19oCisKKyNpZiBQTEFURk9STShFR0wpCisjaW5jbHVkZSA8ZWdsLmg+
CisjZW5kaWYKKworI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgorI2luY2x1ZGUgPHd0Zi9Q
bGF0Zm9ybS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNpZiBQTEFURk9STShFR0wpCitj
bGFzcyBFR0xEaXNwbGF5T3BlblZHOworI2VuZGlmCitjbGFzcyBJbnRTaXplOworCitjbGFzcyBT
dXJmYWNlT3BlblZHIDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
U3VyZmFjZU9wZW5WRyogY3VycmVudFN1cmZhY2UoKTsKKworI2lmIFBMQVRGT1JNKEVHTCkKKyAg
ICBmcmllbmQgY2xhc3MgRUdMRGlzcGxheU9wZW5WRzsKKworICAgIC8qKgorICAgICAqIENyZWF0
ZSBhIG5ldyBFR0wgcGJ1ZmZlciBzdXJmYWNlIHdpdGggdGhlIHNwZWNpZmllZCBzaXplIGFuZCBj
b25maWcgb24KKyAgICAgKiB0aGUgZ2l2ZW4gZGlzcGxheS4gSWYgY29uZmlnIGlzIG5vdCBzcGVj
aWZpZWQsIHRoZSBkaXNwbGF5J3MgZGVmYXVsdAorICAgICAqIHBidWZmZXIgY29uZmlnIGlzIHVz
ZWQuCisgICAgICoKKyAgICAgKiBGb3IgcmVhc29ucyBvZiByZWNvdmVyYWJpbGl0eSAoZS5nLiBJ
bWFnZUJ1ZmZlcidzICJib29sIHN1Y2Nlc3MiCisgICAgICogcmV0dXJuIHZhbHVlKSwgdGhpcyBj
b25zdHJ1Y3RvciB3b24ndCBhc3NlcnQgaWYgY3JlYXRpb24gb2YgdGhlIHN1cmZhY2UKKyAgICAg
KiBmYWlscy4gTWFrZSBzdXJlIHRvIGNoZWNrIHN1Y2Nlc3NmdWwgc3VyZmFjZSBjcmVhdGlvbiB3
aXRoIGVpdGhlcgorICAgICAqIEFTU0VSVF9FR0xfTk9fRVJST1IoKSBvciB0aGUgc3VyZmFjZSdz
IGlzVmFsaWQoKSBtZXRob2QuCisgICAgICovCisgICAgU3VyZmFjZU9wZW5WRyhjb25zdCBJbnRT
aXplJiBzaXplLCBjb25zdCBFR0xEaXNwbGF5JiBkaXNwbGF5LCBFR0xDb25maWcqIGNvbmZpZyA9
IDApOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEVHTCB3aW5kb3cgc3VyZmFjZSB3
aXRoIHRoZSBzcGVjaWZpZWQgbmF0aXZlIHdpbmRvdyBoYW5kbGUKKyAgICAgKiBhbmQgY29uZmln
IG9uIHRoZSBnaXZlbiBkaXNwbGF5LiBJZiBjb25maWcgaXMgbm90IHNwZWNpZmllZCwgdGhlCisg
ICAgICogZGlzcGxheSdzIGRlZmF1bHQgd2luZG93IGNvbmZpZyBpcyB1c2VkLgorICAgICAqCisg
ICAgICogRm9yIHJlYXNvbnMgb2YgcmVjb3ZlcmFiaWxpdHksIHRoaXMgY29uc3RydWN0b3Igd29u
J3QgYXNzZXJ0IGlmIGNyZWF0aW9uCisgICAgICogb2YgdGhlIHN1cmZhY2UgZmFpbHMuIE1ha2Ug
c3VyZSB0byBjaGVjayBzdWNjZXNzZnVsIHN1cmZhY2UgY3JlYXRpb24KKyAgICAgKiB3aXRoIGVp
dGhlciBBU1NFUlRfRUdMX05PX0VSUk9SKCkgb3IgdGhlIHN1cmZhY2UncyBpc1ZhbGlkKCkgbWV0
aG9kLgorICAgICAqLworICAgIFN1cmZhY2VPcGVuVkcoRUdMTmF0aXZlV2luZG93VHlwZSB3aW5k
b3csIGNvbnN0IEVHTERpc3BsYXkmIGRpc3BsYXksIEVHTENvbmZpZyogY29uZmlnID0gMCk7CisK
KyAgICBFR0xEaXNwbGF5IGVnbERpc3BsYXkoKSBjb25zdCB7IHJldHVybiBtX2VnbERpc3BsYXk7
IH0KKyAgICBFR0xTdXJmYWNlIGVnbFN1cmZhY2UoKSBjb25zdCB7IHJldHVybiBtX2VnbFN1cmZh
Y2U7IH0KKyAgICBFR0xDb250ZXh0IGVnbENvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2VnbENv
bnRleHQ7IH0KKyNlbmRpZgorCisgICAgflN1cmZhY2VPcGVuVkcoKTsKKworICAgIC8qKgorICAg
ICAqIElmIGEgc3VyZmFjZSBpcyBpbnZhbGlkIChjb3VsZCBub3QgYmUgY3JlYXRlZCksIGFsbCBt
ZXRob2QgY2FsbHMgd2lsbAorICAgICAqIGNyYXNoIGhvcnJpYmx5LgorICAgICAqLworICAgIGJv
b2wgaXNWYWxpZCgpIGNvbnN0OworCisgICAgaW50IHdpZHRoKCkgY29uc3Q7CisgICAgaW50IGhl
aWdodCgpIGNvbnN0OworCisgICAgU3VyZmFjZU9wZW5WRyogc2hhcmVkU3VyZmFjZSgpIGNvbnN0
OworCisgICAgLyoqCisgICAgICogTWFrZSB0aGUgYXNzb2NpYXRlZCBHTC9FR0wgY29udGV4dCB0
aGUgY3VycmVudCBvbmUsIHNvIHRoYXQgc3Vic2VxdWVudAorICAgICAqIE9wZW5WRyBjb21tYW5k
cyBhcHBseSB0byBpdC4KKyAgICAgKi8KKyAgICB2b2lkIG1ha2VDdXJyZW50KCk7CisKKyAgICAv
KioKKyAgICAgKiBNYWtlIGEgc3VyZmFjZS9jb250ZXh0IGNvbWJpbmF0aW9uIGN1cnJlbnQgdGhh
dCBpcyAiY29tcGF0aWJsZSIKKyAgICAgKiAoaS5lLiBjYW4gYWNjZXNzIGl0cyBzaGFyZWQgcmVz
b3VyY2VzKSB0byB0aGUgZ2l2ZW4gb25lLiBJZiBubworICAgICAqIHN1cmZhY2UvY29udGV4dCBp
cyBjdXJyZW50LCB0aGUgZ2l2ZW4gb25lIGlzIG1hZGUgY3VycmVudC4KKyAgICAgKgorICAgICAq
IFRoaXMgbWV0aG9kIGlzIG1lYW50IHRvIGF2b2lkIGNvbnRleHQgY2hhbmdlcyBpZiB0aGV5J3Jl
IG5vdAorICAgICAqIG5lY2Vzc2FyeSwgcGFydGljdWxhcmx5IHRhaWxvcmVkIGZvciB0aGUgY2Fz
ZSB3aGVyZSBzb21ldGhpbmcKKyAgICAgKiBjb21wYXRpYmxlIHRvIHRoZSBzaGFyZWQgc3VyZmFj
ZSBpcyByZXF1ZXN0ZWQgd2hpbGUgYWN0dWFsIHBhaW50aW5nCisgICAgICogaGFwcGVucyBvbiBh
bm90aGVyIHN1cmZhY2UuCisgICAgICovCisgICAgdm9pZCBtYWtlQ29tcGF0aWJsZUN1cnJlbnQo
KTsKKworICAgIC8qKgorICAgICAqIEVtcHR5IHRoZSBPcGVuVkcgcGlwZWxpbmUgYW5kIG1ha2Ug
c3VyZSBhbGwgdGhlIHBlcmZvcm1lZCBwYWludAorICAgICAqIG9wZXJhdGlvbnMgc2hvdyB1cCBv
biB0aGUgc3VyZmFjZSBhcyBhY3R1YWwgZHJhd24gcGl4ZWxzLgorICAgICAqLworICAgIHZvaWQg
Zmx1c2goKTsKKworcHJpdmF0ZToKKyNpZiBQTEFURk9STShFR0wpCisgICAgU3VyZmFjZU9wZW5W
RygpOyAvLyBmb3IgRUdMRGlzcGxheU9wZW5WRworCisgICAgRUdMRGlzcGxheSBtX2VnbERpc3Bs
YXk7CisgICAgRUdMU3VyZmFjZSBtX2VnbFN1cmZhY2U7CisgICAgRUdMQ29udGV4dCBtX2VnbENv
bnRleHQ7CisjZW5kaWYKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL29wZW52Zy9WR1V0aWxzLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL29wZW52Zy9WR1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
NWFhNTFjMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3Bl
bnZnL1ZHVXRpbHMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDA5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVm
IFZHVXRpbHNfaAorI2RlZmluZSBWR1V0aWxzX2gKKworI2luY2x1ZGUgPG9wZW52Zy5oPgorI2lu
Y2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciogdG9W
R0Vycm9yQ29uc3RhbnQoVkdFcnJvckNvZGUgZXJyb3IpCit7CisgICAgc3dpdGNoIChlcnJvcikg
eworICAgIGNhc2UgVkdfQkFEX0hBTkRMRV9FUlJPUjogcmV0dXJuICJWR19CQURfSEFORExFX0VS
Uk9SIjsKKyAgICBjYXNlIFZHX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I6IHJldHVybiAiVkdfSUxM
RUdBTF9BUkdVTUVOVF9FUlJPUiI7CisgICAgY2FzZSBWR19PVVRfT0ZfTUVNT1JZX0VSUk9SOiBy
ZXR1cm4gIlZHX09VVF9PRl9NRU1PUllfRVJST1IiOworICAgIGNhc2UgVkdfUEFUSF9DQVBBQklM
SVRZX0VSUk9SOiByZXR1cm4gIlZHX1BBVEhfQ0FQQUJJTElUWV9FUlJPUiI7CisgICAgY2FzZSBW
R19VTlNVUFBPUlRFRF9JTUFHRV9GT1JNQVRfRVJST1I6IHJldHVybiAiVkdfVU5TVVBQT1JURURf
SU1BR0VfRk9STUFUX0VSUk9SIjsKKyAgICBjYXNlIFZHX1VOU1VQUE9SVEVEX1BBVEhfRk9STUFU
X0VSUk9SOiByZXR1cm4gIlZHX1VOU1VQUE9SVEVEX1BBVEhfRk9STUFUX0VSUk9SIjsKKyAgICBj
YXNlIFZHX0lNQUdFX0lOX1VTRV9FUlJPUjogcmV0dXJuICJWR19JTUFHRV9JTl9VU0VfRVJST1Ii
OworICAgIGNhc2UgVkdfTk9fQ09OVEVYVF9FUlJPUjogcmV0dXJuICJWR19OT19DT05URVhUX0VS
Uk9SIjsKKyAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV05fRVJST1IiOworICAgIH0KK30KKwor
I2lmIEFTU0VSVF9ESVNBQkxFRAorI2RlZmluZSBBU1NFUlRfVkdfTk9fRVJST1IoKSAoKHZvaWQp
MCkKKyNlbHNlCisjZGVmaW5lIEFTU0VSVF9WR19OT19FUlJPUigpIFwKKyAgICBBU1NFUlRfV0lU
SF9NRVNTQUdFKHZnR2V0RXJyb3IoKSA9PSBWR19OT19FUlJPUiwgIkZvdW5kICVzIiwgdG9WR0Vy
cm9yQ29uc3RhbnQodmdHZXRFcnJvcigpKSkKKyNlbmRpZgorCisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46710</attachid>
            <date>2010-01-15 13:42:04 -0800</date>
            <delta_ts>2010-01-19 11:33:45 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-33403-20100115164204.patch</filename>
            <type>text/plain</type>
            <size>37160</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmQ4OTFiZC4uMjJmZjQzNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2NSBAQAorMjAxMC0wMS0xNSAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFtPcGVuVkddIEFkZCAoRUdMKSBzdXJmYWNlL2NvbnRleHQgbWFu
YWdlbWVudAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MzM0MDMKKworICAgICAgICBUaGUgZm91bmRhdGlvbnMgZm9yIGEgbmV3IE9wZW5WRyBwb3J0Lgor
CisgICAgICAgIE9wZW5WRyBpcyBub3QgdGllZCB0byBFR0wgcGVyIHNlLCBFR0wganVzdCBoYXBw
ZW5zIHRvIGJlCisgICAgICAgIHRoZSBvbmx5IHVzYWJsZSBiYWNrZW5kIGZvciBPcGVuVkcgc3Rh
dGUgYW5kIHBhaW50aW5nCisgICAgICAgIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcuCisKKyAgICAg
ICAgVGhlIHB1cnBvc2Ugb2YgdGhlIFN1cmZhY2VPcGVuVkcgY2xhc3MgaXMgdG8gcHJvdmlkZQor
ICAgICAgICBhbiBFR0wtaW5kZXBlbmRlbnQgaW50ZXJmYWNlIGZvciBPcGVuVkctc3BlY2lmaWMg
Y29kZS4KKyAgICAgICAgVGhlIEVHTERpc3BsYXlPcGVuVkcgY2xhc3MgdGFrZXMgY2FyZSBvZiBr
ZWVwaW5nIHRyYWNrCisgICAgICAgIG9mIEVHTCBkaXNwbGF5cywgc3VyZmFjZXMgYW5kIGNvbnRl
eHRzLiBJdCBhbHNvIG1ha2VzCisgICAgICAgIHN1cmUgdGhhdCBhbGwgY3JlYXRlZCBjb250ZXh0
cyBhcmUgaW50ZXJvcGVyYWJsZSwgYW5kCisgICAgICAgIHRoYXQgZGlmZmVyZW50IHN1cmZhY2Vz
IHVzZSBhIHNpbmdsZSBjb250ZXh0IGlmIHBvc3NpYmxlLgorCisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OmRpc3BsYXlNYW5hZ2Vycyk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5T3Bl
blZHOjpjdXJyZW50U3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5T3BlblZH
OjpyZWdpc3RlclBsYXRmb3JtU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5
T3BlblZHOjp1bnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OkVH
TERpc3BsYXlPcGVuVkc6OnNldEN1cnJlbnREaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OkVH
TERpc3BsYXlPcGVuVkc6OmN1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6RUdMRGlzcGxheU9w
ZW5WRzo6Zm9yRGlzcGxheSk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5T3BlblZHOjpF
R0xEaXNwbGF5T3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlPcGVuVkc6On5F
R0xEaXNwbGF5T3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlPcGVuVkc6OnNl
dERlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlPcGVu
Vkc6OmRlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlP
cGVuVkc6OnNldERlZmF1bHRXaW5kb3dDb25maWcpOgorICAgICAgICAoV2ViQ29yZTo6RUdMRGlz
cGxheU9wZW5WRzo6ZGVmYXVsdFdpbmRvd0NvbmZpZyk6CisgICAgICAgIChXZWJDb3JlOjpFR0xE
aXNwbGF5T3BlblZHOjpzaGFyZWRQbGF0Zm9ybVN1cmZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6
RUdMRGlzcGxheU9wZW5WRzo6Y3JlYXRlUGJ1ZmZlclN1cmZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6RUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZUZvcldpbmRvdyk6CisgICAgICAgIChXZWJDb3Jl
OjpFR0xEaXNwbGF5T3BlblZHOjpzdXJmYWNlc0NvbXBhdGlibGUpOgorICAgICAgICAoV2ViQ29y
ZTo6RUdMRGlzcGxheU9wZW5WRzo6ZGVzdHJveVN1cmZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6
RUdMRGlzcGxheU9wZW5WRzo6Y29udGV4dEZvclN1cmZhY2UpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6RUdMRGlzcGxheU9wZW5WRzo6ZGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL0VHTFV0aWxzLmg6IEFkZGVkLgorICAgICAgICAodG9FR0xFcnJvckNvbnN0
YW50KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5WRy5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6Y3VycmVudFN1cmZh
Y2UpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6U3VyZmFjZU9wZW5WRyk6Cisg
ICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjp+U3VyZmFjZU9wZW5WRyk6CisgICAgICAg
IChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjppc1ZhbGlkKToKKyAgICAgICAgKFdlYkNvcmU6OlN1
cmZhY2VPcGVuVkc6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6Omhl
aWdodCk6CisgICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjpzaGFyZWRTdXJmYWNlKToK
KyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6Om1ha2VDdXJyZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6Om1ha2VDb21wYXRpYmxlQ3VycmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjpmbHVzaCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpT
dXJmYWNlT3BlblZHOjplZ2xEaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVu
Vkc6OmVnbFN1cmZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6ZWdsQ29u
dGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1ZHVXRpbHMuaDogQWRk
ZWQuCisgICAgICAgICh0b1ZHRXJyb3JDb25zdGFudCk6CisKIDIwMTAtMDEtMDcgIENocmlzdGlh
biBTZWplcnNlbiAgPGNocmlzdGlhbi53ZWJraXRAZ21haWwuY29tPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IERhcmluIEFkbGVyLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9vcGVudmcvRUdMRGlzcGxheU9wZW5WRy5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi45OWJjZTJhCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9vcGVudmcvRUdMRGlzcGxheU9wZW5WRy5jcHAKQEAgLTAsMCArMSw0MjMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDksIDIwMTAuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJFR0xEaXNw
bGF5T3BlblZHLmgiCisKKyNpbmNsdWRlICJFR0xVdGlscy5oIgorI2luY2x1ZGUgIkludFNpemUu
aCIKKyNpbmNsdWRlICJTdXJmYWNlT3BlblZHLmgiCisKKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9u
cy5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKwordXNpbmcgV1RGOjpIYXNoTWFw
OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIE5lZWQgdG8gdHlwZWRlZiB0aGlzLCBvdGhl
cndpc2UgREVGSU5FX1NUQVRJQ19MT0NBTCgpIGRvZXNuJ3Qgc3dhbGxvdyBpdC4KK3R5cGVkZWYg
SGFzaE1hcDxFR0xEaXNwbGF5LCBFR0xEaXNwbGF5T3BlblZHKj4gRUdMRGlzcGxheU1hbmFnZXJN
YXA7CisKKy8vIEZpbGUtc3RhdGljIHZhcmlhYmxlcy4KK3N0YXRpYyBFR0xEaXNwbGF5TWFuYWdl
ck1hcCYgZGlzcGxheU1hbmFnZXJzKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEVHTERp
c3BsYXlNYW5hZ2VyTWFwLCBtYW5hZ2VycywgKCkpOworICAgIHJldHVybiBtYW5hZ2VyczsKK30K
Kworc3RhdGljIEVHTERpc3BsYXlPcGVuVkcqIHNfY3VycmVudCA9IDA7CisKKy8vIFN0YXRpYyBj
bGFzcyBtZW1iZXJzLgorCitTdXJmYWNlT3BlblZHKiBFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50
U3VyZmFjZSgpCit7CisgICAgRUdMRGlzcGxheU1hbmFnZXJNYXAmIG1hbmFnZXJzID0gZGlzcGxh
eU1hbmFnZXJzKCk7CisgICAgRUdMRGlzcGxheSBjdXJyZW50RGlzcGxheSA9IGVnbEdldEN1cnJl
bnREaXNwbGF5KCk7CisKKyAgICBpZiAoY3VycmVudERpc3BsYXkgPT0gRUdMX05PX0RJU1BMQVkg
fHwgIW1hbmFnZXJzLmNvbnRhaW5zKGN1cnJlbnREaXNwbGF5KSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBFR0xEaXNwbGF5T3BlblZHKiBkaXNwbGF5TWFuYWdlciA9IG1hbmFnZXJzLmdldChj
dXJyZW50RGlzcGxheSk7CisgICAgRUdMU3VyZmFjZSBjdXJyZW50U3VyZmFjZSA9IGVnbEdldEN1
cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKworICAgIGlmIChjdXJyZW50U3VyZmFjZSA9PSBFR0xf
Tk9fU1VSRkFDRSB8fCAhZGlzcGxheU1hbmFnZXItPm1fcGxhdGZvcm1TdXJmYWNlcy5jb250YWlu
cyhjdXJyZW50U3VyZmFjZSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGRpc3Bs
YXlNYW5hZ2VyLT5tX3BsYXRmb3JtU3VyZmFjZXMuZ2V0KGN1cnJlbnRTdXJmYWNlKTsKK30KKwor
dm9pZCBFR0xEaXNwbGF5T3BlblZHOjpyZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3Bl
blZHKiBwbGF0Zm9ybVN1cmZhY2UpCit7CisgICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1h
bmFnZXIgPSBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KHBsYXRmb3JtU3VyZmFjZS0+ZWds
RGlzcGxheSgpKTsKKyAgICBkaXNwbGF5TWFuYWdlci0+bV9wbGF0Zm9ybVN1cmZhY2VzLnNldChw
bGF0Zm9ybVN1cmZhY2UtPmVnbFN1cmZhY2UoKSwgcGxhdGZvcm1TdXJmYWNlKTsKK30KKwordm9p
ZCBFR0xEaXNwbGF5T3BlblZHOjp1bnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKFN1cmZhY2VPcGVu
VkcqIHBsYXRmb3JtU3VyZmFjZSkKK3sKKyAgICBFR0xEaXNwbGF5T3BlblZHKiBkaXNwbGF5TWFu
YWdlciA9IEVHTERpc3BsYXlPcGVuVkc6OmZvckRpc3BsYXkocGxhdGZvcm1TdXJmYWNlLT5lZ2xE
aXNwbGF5KCkpOworICAgIGRpc3BsYXlNYW5hZ2VyLT5tX3BsYXRmb3JtU3VyZmFjZXMucmVtb3Zl
KHBsYXRmb3JtU3VyZmFjZS0+ZWdsU3VyZmFjZSgpKTsKK30KKwordm9pZCBFR0xEaXNwbGF5T3Bl
blZHOjpzZXRDdXJyZW50RGlzcGxheShjb25zdCBFR0xEaXNwbGF5JiBkaXNwbGF5KQoreworICAg
IHNfY3VycmVudCA9IEVHTERpc3BsYXlPcGVuVkc6OmZvckRpc3BsYXkoZGlzcGxheSk7Cit9CisK
K0VHTERpc3BsYXlPcGVuVkcqIEVHTERpc3BsYXlPcGVuVkc6OmN1cnJlbnQoKQoreworICAgIGlm
ICghc19jdXJyZW50KSB7CisgICAgICAgIEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldERpc3Bs
YXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgICAgIGVnbEluaXRpYWxpemUoZGlzcGxheSwg
MCwgMCk7CisgICAgICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgICAgICBzX2N1cnJl
bnQgPSBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KGRpc3BsYXkpOworICAgIH0KKyAgICBy
ZXR1cm4gc19jdXJyZW50OworfQorCitFR0xEaXNwbGF5T3BlblZHKiBFR0xEaXNwbGF5T3BlblZH
Ojpmb3JEaXNwbGF5KGNvbnN0IEVHTERpc3BsYXkmIGRpc3BsYXkpCit7CisgICAgRUdMRGlzcGxh
eU1hbmFnZXJNYXAmIG1hbmFnZXJzID0gZGlzcGxheU1hbmFnZXJzKCk7CisKKyAgICBpZiAoIW1h
bmFnZXJzLmNvbnRhaW5zKGRpc3BsYXkpKQorICAgICAgICBtYW5hZ2Vycy5zZXQoZGlzcGxheSwg
bmV3IEVHTERpc3BsYXlPcGVuVkcoZGlzcGxheSkpOworCisgICAgcmV0dXJuIG1hbmFnZXJzLmdl
dChkaXNwbGF5KTsKK30KKworCisvLyBPYmplY3QvaW5zdGFuY2UgbWVtYmVycy4KKworRUdMRGlz
cGxheU9wZW5WRzo6RUdMRGlzcGxheU9wZW5WRyhjb25zdCBFR0xEaXNwbGF5JiBkaXNwbGF5KQor
ICAgIDogbV9kaXNwbGF5KGRpc3BsYXkpCisgICAgLCBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZSgw
KQorICAgICwgbV9wYnVmZmVyQ29uZmlnSWQoMCkKKyAgICAsIG1fd2luZG93Q29uZmlnSWQoMCkK
K3sKKyAgICBlZ2xCaW5kQVBJKEVHTF9PUEVOVkdfQVBJKTsKKyAgICBBU1NFUlRfRUdMX05PX0VS
Uk9SKCk7Cit9CisKK0VHTERpc3BsYXlPcGVuVkc6On5FR0xEaXNwbGF5T3BlblZHKCkKK3sKKyAg
ICBlZ2xNYWtlQ3VycmVudChtX2Rpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFD
RSwgRUdMX05PX0NPTlRFWFQpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIGRl
bGV0ZSBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZTsKKworICAgIEhhc2hNYXA8RUdMU3VyZmFjZSwg
RUdMaW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9zdXJmYWNlQ29uZmlnSWRzLmVuZCgpOwor
ICAgIGZvciAoSGFzaE1hcDxFR0xTdXJmYWNlLCBFR0xpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG1fc3VyZmFjZUNvbmZpZ0lkcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIGRl
c3Ryb3lTdXJmYWNlKCgqaXQpLmZpcnN0KTsKKworICAgIGVnbFRlcm1pbmF0ZShtX2Rpc3BsYXkp
OworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKK30KKwordm9pZCBFR0xEaXNwbGF5T3BlblZH
OjpzZXREZWZhdWx0UGJ1ZmZlckNvbmZpZyhjb25zdCBFR0xDb25maWcmIGNvbmZpZykKK3sKKyAg
ICBFR0xpbnQgY29uZmlnSWQ7CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsR2V0Q29uZmln
QXR0cmliKG1fZGlzcGxheSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSWQpOworICAg
IEFTU0VSVChzdWNjZXNzID09IEVHTF9UUlVFKTsKKyAgICBBU1NFUlQoY29uZmlnSWQgIT0gRUdM
X0JBRF9BVFRSSUJVVEUpOworCisgICAgbV9wYnVmZmVyQ29uZmlnSWQgPSBjb25maWdJZDsKK30K
KworRUdMQ29uZmlnIEVHTERpc3BsYXlPcGVuVkc6OmRlZmF1bHRQYnVmZmVyQ29uZmlnKCkKK3sK
KyAgICBFR0xDb25maWcgY29uZmlnOworICAgIEVHTGludCBudW1Db25maWdzOworCisgICAgLy8g
SG9wZWZ1bGx5IHRoZSBjbGllbnQgd2lsbCBoYXZlIHNldCB0aGUgcGJ1ZmZlciBjb25maWcgb2Yg
aXRzIGNob2ljZQorICAgIC8vIGJ5IG5vdyAtIGlmIG5vdCwgdXNlIGEgMzItYml0IGdlbmVyaWMg
b25lIGFzIGRlZmF1bHQuCisgICAgaWYgKCFtX3BidWZmZXJDb25maWdJZCkgeworICAgICAgICBz
dGF0aWMgY29uc3QgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9S
RURfU0laRSwgICA4LAorICAgICAgICAgICAgRUdMX0dSRUVOX1NJWkUsIDgsCisgICAgICAgICAg
ICBFR0xfQkxVRV9TSVpFLCAgOCwKKyAgICAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAorICAg
ICAgICAgICAgRUdMX0FMUEhBX01BU0tfU0laRSwgMSwKKyAgICAgICAgICAgIEVHTF9MVU1JTkFO
Q0VfU0laRSwgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAg
ICBFR0xfUEJVRkZFUl9CSVQsCisgICAgICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xf
T1BFTlZHX0JJVCwKKyAgICAgICAgICAgIEVHTF9OT05FIH07CisKKyAgICAgICAgZWdsQ2hvb3Nl
Q29uZmlnKG1fZGlzcGxheSwgY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3Mp
OworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7
CisgICAgICAgICAgICBFR0xfQ09ORklHX0lELCBtX3BidWZmZXJDb25maWdJZCwKKyAgICAgICAg
ICAgIEVHTF9OT05FIH07CisKKyAgICAgICAgZWdsQ2hvb3NlQ29uZmlnKG1fZGlzcGxheSwgY29u
ZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgIH0KKworICAgIEFTU0VS
VF9FR0xfTk9fRVJST1IoKTsKKyAgICBBU1NFUlQobnVtQ29uZmlncyA9PSAxKTsKKyAgICByZXR1
cm4gY29uZmlnOworfQorCit2b2lkIEVHTERpc3BsYXlPcGVuVkc6OnNldERlZmF1bHRXaW5kb3dD
b25maWcoY29uc3QgRUdMQ29uZmlnJiBjb25maWcpCit7CisgICAgRUdMaW50IGNvbmZpZ0lkOwor
ICAgIEVHTEJvb2xlYW4gc3VjY2VzcyA9IGVnbEdldENvbmZpZ0F0dHJpYihtX2Rpc3BsYXksIGNv
bmZpZywgRUdMX0NPTkZJR19JRCwgJmNvbmZpZ0lkKTsKKyAgICBBU1NFUlQoc3VjY2VzcyA9PSBF
R0xfVFJVRSk7CisgICAgQVNTRVJUKGNvbmZpZ0lkICE9IEVHTF9CQURfQVRUUklCVVRFKTsKKwor
ICAgIG1fd2luZG93Q29uZmlnSWQgPSBjb25maWdJZDsKK30KKworRUdMQ29uZmlnIEVHTERpc3Bs
YXlPcGVuVkc6OmRlZmF1bHRXaW5kb3dDb25maWcoKQoreworICAgIEVHTENvbmZpZyBjb25maWc7
CisgICAgRUdMaW50IG51bUNvbmZpZ3M7CisKKyAgICAvLyBIb3BlZnVsbHkgdGhlIGNsaWVudCB3
aWxsIGhhdmUgc2V0IHRoZSB3aW5kb3cgY29uZmlnIG9mIGl0cyBjaG9pY2UKKyAgICAvLyBieSBu
b3cgLSBpZiBub3QsIHVzZSBhIDMyLWJpdCBnZW5lcmljIG9uZSBhcyBkZWZhdWx0LgorICAgIGlm
ICghbV93aW5kb3dDb25maWdJZCkgeworICAgICAgICBzdGF0aWMgY29uc3QgRUdMaW50IGNvbmZp
Z0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9SRURfU0laRSwgICA4LAorICAgICAgICAg
ICAgRUdMX0dSRUVOX1NJWkUsIDgsCisgICAgICAgICAgICBFR0xfQkxVRV9TSVpFLCAgOCwKKyAg
ICAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0FMUEhBX01BU0tf
U0laRSwgMSwKKyAgICAgICAgICAgIEVHTF9MVU1JTkFOQ0VfU0laRSwgIEVHTF9ET05UX0NBUkUs
CisgICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAgICBFR0xfV0lORE9XX0JJVCwKKyAgICAg
ICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOVkdfQklULAorICAgICAgICAgICAg
RUdMX05PTkUgfTsKKworICAgICAgICBlZ2xDaG9vc2VDb25maWcobV9kaXNwbGF5LCBjb25maWdB
dHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
Y29uc3QgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9DT05GSUdf
SUQsIG1fd2luZG93Q29uZmlnSWQsCisgICAgICAgICAgICBFR0xfTk9ORSB9OworCisgICAgICAg
IGVnbENob29zZUNvbmZpZyhtX2Rpc3BsYXksIGNvbmZpZ0F0dHJpYnMsICZjb25maWcsIDEsICZu
dW1Db25maWdzKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgQVNT
RVJUKG51bUNvbmZpZ3MgPT0gMSk7CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKworU3VyZmFjZU9w
ZW5WRyogRUdMRGlzcGxheU9wZW5WRzo6c2hhcmVkUGxhdGZvcm1TdXJmYWNlKCkKK3sKKyAgICBp
ZiAoIW1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlKSB7CisgICAgICAgIEVHTENvbmZpZyBjb25maWcg
PSBkZWZhdWx0UGJ1ZmZlckNvbmZpZygpOworICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBj
cmVhdGVQYnVmZmVyU3VyZmFjZShJbnRTaXplKDEsIDEpLCBjb25maWcpOworICAgICAgICBBU1NF
UlRfRUdMX05PX0VSUk9SKCk7CisKKyAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsQ3Jl
YXRlQ29udGV4dChtX2Rpc3BsYXksIGNvbmZpZywgRUdMX05PX0NPTlRFWFQsIDApOworICAgICAg
ICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgICAgIG1fY29udGV4dHMuc2V0KG1fc3VyZmFj
ZUNvbmZpZ0lkcy5nZXQoc3VyZmFjZSksIGNvbnRleHQpOworCisgICAgICAgIG1fc2hhcmVkUGxh
dGZvcm1TdXJmYWNlID0gbmV3IFN1cmZhY2VPcGVuVkcoKTsKKyAgICAgICAgbV9zaGFyZWRQbGF0
Zm9ybVN1cmZhY2UtPm1fZWdsRGlzcGxheSA9IG1fZGlzcGxheTsKKyAgICAgICAgbV9zaGFyZWRQ
bGF0Zm9ybVN1cmZhY2UtPm1fZWdsU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgIG1fc2hhcmVk
UGxhdGZvcm1TdXJmYWNlLT5tX2VnbENvbnRleHQgPSBjb250ZXh0OworICAgICAgICBtX3BsYXRm
b3JtU3VyZmFjZXMuc2V0KHN1cmZhY2UsIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlKTsgLy8gYS5r
LmEuIHJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKCkKKyAgICB9CisgICAgcmV0dXJuIG1fc2hhcmVk
UGxhdGZvcm1TdXJmYWNlOworfQorCitFR0xTdXJmYWNlIEVHTERpc3BsYXlPcGVuVkc6OmNyZWF0
ZVBidWZmZXJTdXJmYWNlKGNvbnN0IEludFNpemUmIHNpemUsIGNvbnN0IEVHTENvbmZpZyYgY29u
ZmlnKQoreworICAgIGNvbnN0IEVHTGludCBhdHRyaWJMaXN0W10gPSB7CisgICAgICAgIEVHTF9X
SURUSCwgc2l6ZS53aWR0aCgpLAorICAgICAgICBFR0xfSEVJR0hULCBzaXplLmhlaWdodCgpLAor
ICAgICAgICBFR0xfTk9ORSB9OworCisgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gZWdsQ3JlYXRl
UGJ1ZmZlclN1cmZhY2UobV9kaXNwbGF5LCBjb25maWcsIGF0dHJpYkxpc3QpOworICAgIGlmIChl
Z2xHZXRFcnJvcigpICE9IEVHTF9TVUNDRVNTKQorICAgICAgICByZXR1cm4gRUdMX05PX1NVUkZB
Q0U7CisKKyAgICBFR0xpbnQgc3VyZmFjZUNvbmZpZ0lkOworICAgIEVHTEJvb2xlYW4gc3VjY2Vz
cyA9IGVnbEdldENvbmZpZ0F0dHJpYihtX2Rpc3BsYXksIGNvbmZpZywgRUdMX0NPTkZJR19JRCwg
JnN1cmZhY2VDb25maWdJZCk7CisgICAgQVNTRVJUKHN1Y2Nlc3MgPT0gRUdMX1RSVUUpOworICAg
IEFTU0VSVChzdXJmYWNlQ29uZmlnSWQgIT0gRUdMX0JBRF9BVFRSSUJVVEUpOworCisgICAgQVNT
RVJUKCFtX3N1cmZhY2VDb25maWdJZHMuY29udGFpbnMoc3VyZmFjZSkpOworICAgIG1fc3VyZmFj
ZUNvbmZpZ0lkcy5zZXQoc3VyZmFjZSwgc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICByZXR1cm4gc3Vy
ZmFjZTsKK30KKworRUdMU3VyZmFjZSBFR0xEaXNwbGF5T3BlblZHOjpzdXJmYWNlRm9yV2luZG93
KEVHTE5hdGl2ZVdpbmRvd1R5cGUgd0lkLCBjb25zdCBFR0xDb25maWcmIGNvbmZpZykKK3sKKyAg
ICBpZiAobV93aW5kb3dTdXJmYWNlcy5jb250YWlucyh3SWQpKQorICAgICAgICByZXR1cm4gbV93
aW5kb3dTdXJmYWNlcy5nZXQod0lkKTsKKworICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGVnbENy
ZWF0ZVdpbmRvd1N1cmZhY2UobV9kaXNwbGF5LCBjb25maWcsIHdJZCwgMCk7CisgICAgQVNTRVJU
X0VHTF9OT19FUlJPUigpOworCisgICAgRUdMaW50IHN1cmZhY2VDb25maWdJZDsKKyAgICBFR0xC
b29sZWFuIHN1Y2Nlc3MgPSBlZ2xHZXRDb25maWdBdHRyaWIobV9kaXNwbGF5LCBjb25maWcsIEVH
TF9DT05GSUdfSUQsICZzdXJmYWNlQ29uZmlnSWQpOworICAgIEFTU0VSVChzdWNjZXNzID09IEVH
TF9UUlVFKTsKKyAgICBBU1NFUlQoc3VyZmFjZUNvbmZpZ0lkICE9IEVHTF9CQURfQVRUUklCVVRF
KTsKKworICAgIEFTU0VSVCghbV9zdXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2UpKTsK
KyAgICBtX3N1cmZhY2VDb25maWdJZHMuc2V0KHN1cmZhY2UsIHN1cmZhY2VDb25maWdJZCk7Cisg
ICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK2Jvb2wgRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZXND
b21wYXRpYmxlKGNvbnN0IEVHTFN1cmZhY2UmIHN1cmZhY2UsIGNvbnN0IEVHTFN1cmZhY2UmIG90
aGVyU3VyZmFjZSkKK3sKKyAgICBpZiAoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSB8fCBvdGhl
clN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIEN1cnJlbnRseSwgd2UgYXNzdW1lIHRoYXQgYWxsIHN1cmZhY2VzIGtub3duIHRvIHRoaXMg
b2JqZWN0IGFyZQorICAgIC8vIGNvbnRleHQtY29tcGF0aWJsZSB0byBlYWNoIG90aGVyICh3aGlj
aCBpcyByZWFzb25hYmxlIHRvIGFzc3VtZSwKKyAgICAvLyBvdGhlcndpc2UgZWdsQ3JlYXRlQ29u
dGV4dCgpIHdvdWxkIGZhaWwgd2l0aCBFR0xfQkFEX01BVENIIGZvciBzaGFyZWQKKyAgICAvLyBj
b250ZXh0IGNvbXBhdGliaWxpdHkgYW55d2F5cy4KKyAgICByZXR1cm4gKG1fc3VyZmFjZUNvbmZp
Z0lkcy5jb250YWlucyhzdXJmYWNlKSAmJiBtX3N1cmZhY2VDb25maWdJZHMuY29udGFpbnMob3Ro
ZXJTdXJmYWNlKSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheU9wZW5WRzo6ZGVzdHJveVN1cmZhY2Uo
Y29uc3QgRUdMU3VyZmFjZSYgc3VyZmFjZSkKK3sKKyAgICBBU1NFUlQoc3VyZmFjZSAhPSBFR0xf
Tk9fU1VSRkFDRSk7CisKKyAgICBpZiAoZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMX0RSQVcpID09
IHN1cmZhY2UpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQobV9kaXNwbGF5LCBFR0xfTk9fU1VS
RkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKKyAgICAgICAgQVNTRVJUX0VH
TF9OT19FUlJPUigpOworICAgIH0KKworICAgIC8vIERlc3Ryb3kgdGhlIGNvbnRleHQgYXNzb2Np
YXRlZCB0byB0aGUgc3VyZmFjZSwgaWYgd2UgYWxyZWFkeSBjcmVhdGVkIG9uZS4KKyAgICBpZiAo
bV9zdXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2UpKSB7CisgICAgICAgIEVHTGludCBz
dXJmYWNlQ29uZmlnSWQgPSBtX3N1cmZhY2VDb25maWdJZHMudGFrZShzdXJmYWNlKTsgLy8gdGFr
ZSA9IGdldCBhbmQgcmVtb3ZlCisgICAgICAgIGJvb2wgaXNDb250ZXh0UmVmZXJlbmNlZCA9IGZh
bHNlOworCisgICAgICAgIGlmIChtX2NvbXBhdGlibGVDb25maWdJZHMuY29udGFpbnMoc3VyZmFj
ZUNvbmZpZ0lkKSkKKyAgICAgICAgICAgIHN1cmZhY2VDb25maWdJZCA9IG1fY29tcGF0aWJsZUNv
bmZpZ0lkcy5nZXQoc3VyZmFjZUNvbmZpZ0lkKTsKKworICAgICAgICBIYXNoTWFwPEVHTFN1cmZh
Y2UsIEVHTGludD46Oml0ZXJhdG9yIGVuZCA9IG1fc3VyZmFjZUNvbmZpZ0lkcy5lbmQoKTsKKwor
ICAgICAgICAvLyAuLi5idXQgb25seSBpZiB0aGVyZSdzIG5vIG90aGVyIHN1cmZhY2VzIGFzc29j
aWF0ZWQgdG8gdGhhdCBjb250ZXh0LgorICAgICAgICBmb3IgKEhhc2hNYXA8RUdMU3VyZmFjZSwg
RUdMaW50Pjo6aXRlcmF0b3IgaXQgPSBtX3N1cmZhY2VDb25maWdJZHMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoKCppdCkuc2Vjb25kID09IHN1cmZhY2VDb25m
aWdJZCkgeworICAgICAgICAgICAgICAgIGlzQ29udGV4dFJlZmVyZW5jZWQgPSB0cnVlOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlm
ICghaXNDb250ZXh0UmVmZXJlbmNlZCAmJiBtX2NvbnRleHRzLmNvbnRhaW5zKHN1cmZhY2VDb25m
aWdJZCkpIHsKKyAgICAgICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IG1fY29udGV4dHMudGFr
ZShzdXJmYWNlQ29uZmlnSWQpOworICAgICAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobV9kaXNw
bGF5LCBjb250ZXh0KTsKKyAgICAgICAgICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIG1fcGxhdGZvcm1TdXJmYWNlcy5yZW1vdmUoc3VyZmFjZSk7CisK
KyAgICBIYXNoTWFwPEVHTE5hdGl2ZVdpbmRvd1R5cGUsIEVHTFN1cmZhY2U+OjppdGVyYXRvciBl
bmQgPSBtX3dpbmRvd1N1cmZhY2VzLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDxFR0xOYXRpdmVX
aW5kb3dUeXBlLCBFR0xTdXJmYWNlPjo6aXRlcmF0b3IgaXQgPSBtX3dpbmRvd1N1cmZhY2VzLmJl
Z2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoKCppdCkuc2Vjb25kID09IHN1
cmZhY2UpIHsKKyAgICAgICAgICAgIG1fd2luZG93U3VyZmFjZXMucmVtb3ZlKGl0KTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZWdsRGVzdHJveVN1cmZhY2Uo
bV9kaXNwbGF5LCBzdXJmYWNlKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7Cit9CisKK0VH
TENvbnRleHQgRUdMRGlzcGxheU9wZW5WRzo6Y29udGV4dEZvclN1cmZhY2UoY29uc3QgRUdMU3Vy
ZmFjZSYgc3VyZmFjZSkKK3sKKyAgICBBU1NFUlQoc3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7
CisKKyAgICBpZiAobV9wbGF0Zm9ybVN1cmZhY2VzLmNvbnRhaW5zKHN1cmZhY2UpKQorICAgICAg
ICByZXR1cm4gbV9wbGF0Zm9ybVN1cmZhY2VzLmdldChzdXJmYWNlKS0+ZWdsQ29udGV4dCgpOwor
CisgICAgZWdsQmluZEFQSShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJP
UigpOworCisgICAgRUdMaW50IHN1cmZhY2VDb25maWdJZDsKKworICAgIGlmIChtX3N1cmZhY2VD
b25maWdJZHMuY29udGFpbnMoc3VyZmFjZSkpCisgICAgICAgIHN1cmZhY2VDb25maWdJZCA9IG1f
c3VyZmFjZUNvbmZpZ0lkcy5nZXQoc3VyZmFjZSk7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFJl
dHJpZXZlIHRoZSBzYW1lIEVHTCBjb25maWcgZm9yIGNvbnRleHQgY3JlYXRpb24gdGhhdCB3YXMg
dXNlZCB0bworICAgICAgICAvLyBjcmVhdGUgdGhlIHRoZSBFR0wgc3VyZmFjZS4KKyAgICAgICAg
RUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsUXVlcnlTdXJmYWNlKG1fZGlzcGxheSwgc3VyZmFjZSwg
RUdMX0NPTkZJR19JRCwgJnN1cmZhY2VDb25maWdJZCk7CisgICAgICAgIEFTU0VSVChzdWNjZXNz
ID09IEVHTF9UUlVFKTsKKyAgICAgICAgQVNTRVJUKHN1cmZhY2VDb25maWdJZCAhPSBFR0xfQkFE
X0FUVFJJQlVURSk7CisKKyAgICAgICAgbV9zdXJmYWNlQ29uZmlnSWRzLnNldChzdXJmYWNlLCBz
dXJmYWNlQ29uZmlnSWQpOworICAgIH0KKworICAgIGlmIChtX2NvbXBhdGlibGVDb25maWdJZHMu
Y29udGFpbnMoc3VyZmFjZUNvbmZpZ0lkKSkKKyAgICAgICAgc3VyZmFjZUNvbmZpZ0lkID0gbV9j
b21wYXRpYmxlQ29uZmlnSWRzLmdldChzdXJmYWNlQ29uZmlnSWQpOworCisgICAgaWYgKG1fY29u
dGV4dHMuY29udGFpbnMoc3VyZmFjZUNvbmZpZ0lkKSkKKyAgICAgICAgcmV0dXJuIG1fY29udGV4
dHMuZ2V0KHN1cmZhY2VDb25maWdJZCk7CisKKyAgICBpZiAoIW1fc2hhcmVkUGxhdGZvcm1TdXJm
YWNlKSAvLyBzaGFyZWQgY29udGV4dCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQKKyAgICAgICAg
c2hhcmVkUGxhdGZvcm1TdXJmYWNlKCk7IC8vIGNyZWF0ZXMgdGhlIHNoYXJlZCBzdXJmYWNlICYg
Y29udGV4dAorCisgICAgRUdMRGlzcGxheSBjdXJyZW50RGlzcGxheSA9IGVnbEdldEN1cnJlbnRE
aXNwbGF5KCk7CisgICAgRUdMU3VyZmFjZSBjdXJyZW50UmVhZFN1cmZhY2UgPSBlZ2xHZXRDdXJy
ZW50U3VyZmFjZShFR0xfUkVBRCk7CisgICAgRUdMU3VyZmFjZSBjdXJyZW50RHJhd1N1cmZhY2Ug
PSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7CisgICAgRUdMQ29udGV4dCBjdXJyZW50
Q29udGV4dCA9IGVnbEdldEN1cnJlbnRDb250ZXh0KCk7CisKKyAgICAvLyBCZWZvcmUgY3JlYXRp
bmcgYSBuZXcgY29udGV4dCwgbGV0J3MgdHJ5IHdoZXRoZXIgYW4gZXhpc3Rpbmcgb25lCisgICAg
Ly8gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzdXJmYWNlLiBFR0wgZG9lc24ndCBnaXZlIHVzIGEg
ZGlmZmVyZW50IHdheQorICAgIC8vIHRvIGNoZWNrIGNvbnRleHQvc3VyZmFjZSBjb21wYXRpYmls
aXR5IHRoYW4gdHJ5aW5nIGl0IG91dCwgc28gbGV0J3MKKyAgICAvLyBkbyBqdXN0IHRoYXQuCisg
ICAgSGFzaE1hcDxFR0xpbnQsIEVHTENvbnRleHQ+OjppdGVyYXRvciBlbmQgPSBtX2NvbnRleHRz
LmVuZCgpOworCisgICAgZm9yIChIYXNoTWFwPEVHTGludCwgRUdMQ29udGV4dD46Oml0ZXJhdG9y
IGl0ID0gbV9jb250ZXh0cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgZWds
TWFrZUN1cnJlbnQobV9kaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCAoKml0KS5zZWNvbmQpOwor
ICAgICAgICBpZiAoZWdsR2V0RXJyb3IoKSA9PSBFR0xfU1VDQ0VTUykgeworICAgICAgICAgICAg
Ly8gUmVzdG9yZSBwcmV2aW91cyBzdXJmYWNlL2NvbnRleHQuCisgICAgICAgICAgICBpZiAoY3Vy
cmVudENvbnRleHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKKyAgICAgICAgICAgICAgICBlZ2xNYWtl
Q3VycmVudChjdXJyZW50RGlzcGxheSwgY3VycmVudFJlYWRTdXJmYWNlLCBjdXJyZW50RHJhd1N1
cmZhY2UsIGN1cnJlbnRDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRUdMX05PX0VS
Uk9SKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDb29sLCBzdXJmYWNlIGlzIGNv
bXBhdGlibGUgdG8gb25lIG9mIG91ciBleGlzdGluZyBjb250ZXh0cy4KKyAgICAgICAgICAgIG1f
Y29tcGF0aWJsZUNvbmZpZ0lkcy5zZXQoc3VyZmFjZUNvbmZpZ0lkLCAoKml0KS5maXJzdCk7Cisg
ICAgICAgICAgICByZXR1cm4gKCppdCkuc2Vjb25kOworICAgICAgICB9CisgICAgfQorICAgIC8v
IFJlc3RvcmUgcHJldmlvdXMgc3VyZmFjZS9jb250ZXh0LgorICAgIGlmIChjdXJyZW50Q29udGV4
dCAhPSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICBlZ2xNYWtlQ3VycmVudChjdXJyZW50RGlz
cGxheSwgY3VycmVudFJlYWRTdXJmYWNlLCBjdXJyZW50RHJhd1N1cmZhY2UsIGN1cnJlbnRDb250
ZXh0KTsKKyAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIH0KKworICAgIEVHTENv
bmZpZyBjb25maWc7CisgICAgRUdMaW50IG51bUNvbmZpZ3M7CisKKyAgICBjb25zdCBFR0xpbnQg
Y29uZmlnQXR0cmlic1tdID0geworICAgICAgICBFR0xfQ09ORklHX0lELCBzdXJmYWNlQ29uZmln
SWQsCisgICAgICAgIEVHTF9OT05FIH07CisKKyAgICBlZ2xDaG9vc2VDb25maWcobV9kaXNwbGF5
LCBjb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgQVNTRVJUX0VH
TF9OT19FUlJPUigpOworICAgIEFTU0VSVChudW1Db25maWdzID09IDEpOworCisgICAgLy8gV2Ug
c2hhcmUgYWxsIG9mIHRoZSBpbWFnZXMgYW5kIHBhdGhzIGFtb25nc3QgdGhlIGRpZmZlcmVudCBj
b250ZXh0cywKKyAgICAvLyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gYWxsIG9mIHRoZW0u
IFJlc291cmNlcyB0aGF0IGFyZSBjcmVhdGVkCisgICAgLy8gd2hpbGUgbV9zaGFyZWRQbGF0Zm9y
bVN1cmZhY2UtPmNvbnRleHQoKSBpcyBjdXJyZW50IHdpbGwgYmUKKyAgICAvLyBhY2Nlc3NpYmxl
IGZyb20gYWxsIG90aGVyIGNvbnRleHRzLCBidXQgYXJlIG5vdCByZXN0cmljdGVkIHRvIHRoZQor
ICAgIC8vIGxpZmV0aW1lIG9mIHRob3NlIGNvbnRleHRzLgorICAgIEVHTENvbnRleHQgY29udGV4
dCA9IGVnbENyZWF0ZUNvbnRleHQobV9kaXNwbGF5LCBjb25maWcsIG1fc2hhcmVkUGxhdGZvcm1T
dXJmYWNlLT5lZ2xDb250ZXh0KCksIDApOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKwor
ICAgIEFTU0VSVCghbV9jb250ZXh0cy5jb250YWlucyhzdXJmYWNlQ29uZmlnSWQpKTsKKyAgICBt
X2NvbnRleHRzLnNldChzdXJmYWNlQ29uZmlnSWQsIGNvbnRleHQpOworICAgIHJldHVybiBjb250
ZXh0OworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52
Zy9FR0xEaXNwbGF5T3BlblZHLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9F
R0xEaXNwbGF5T3BlblZHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1
NTVkNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZn
L0VHTERpc3BsYXlPcGVuVkcuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDA5LCAyMDEwLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
LworCisjaWZuZGVmIEVHTERpc3BsYXlPcGVuVkdfaAorI2RlZmluZSBFR0xEaXNwbGF5T3BlblZH
X2gKKworI2luY2x1ZGUgPGVnbC5oPgorI2luY2x1ZGUgPG9wZW52Zy5oPgorI2luY2x1ZGUgPHd0
Zi9IYXNoTWFwLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgSW50U2l6ZTsKK2Ns
YXNzIFN1cmZhY2VPcGVuVkc7CisKK2NsYXNzIEVHTERpc3BsYXlPcGVuVkcgeworcHVibGljOgor
ICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlT3BlblZHOworCisgICAgc3RhdGljIFN1cmZhY2VPcGVu
VkcqIGN1cnJlbnRTdXJmYWNlKCk7CisgICAgc3RhdGljIHZvaWQgc2V0Q3VycmVudERpc3BsYXko
Y29uc3QgRUdMRGlzcGxheSYpOworICAgIHN0YXRpYyBFR0xEaXNwbGF5T3BlblZHKiBjdXJyZW50
KCk7CisgICAgc3RhdGljIEVHTERpc3BsYXlPcGVuVkcqIGZvckRpc3BsYXkoY29uc3QgRUdMRGlz
cGxheSYpOworCisgICAgdm9pZCBzZXREZWZhdWx0UGJ1ZmZlckNvbmZpZyhjb25zdCBFR0xDb25m
aWcmKTsKKyAgICBFR0xDb25maWcgZGVmYXVsdFBidWZmZXJDb25maWcoKTsKKyAgICB2b2lkIHNl
dERlZmF1bHRXaW5kb3dDb25maWcoY29uc3QgRUdMQ29uZmlnJik7CisgICAgRUdMQ29uZmlnIGRl
ZmF1bHRXaW5kb3dDb25maWcoKTsKKworICAgIEVHTERpc3BsYXkgZGlzcGxheSgpIGNvbnN0IHsg
cmV0dXJuIG1fZGlzcGxheTsgfQorICAgIFN1cmZhY2VPcGVuVkcqIHNoYXJlZFBsYXRmb3JtU3Vy
ZmFjZSgpOworCisgICAgLyoqIENyZWF0ZXMgYSBwYnVmZmVyIHN1cmZhY2UgdXNpbmcgdGhlIGdp
dmVuIGNvbmZpZy4gSWYgbm8gc3VyZmFjZQorICAgICAqIGNvdWxkIGJlIGNyZWF0ZWQsIEVHTF9O
T19TVVJGQUNFIGlzIHJldHVybmVkIGFuZCBlcnJvcnMgY2FuIGJlCisgICAgICogY2F1Z2h0IHdp
dGggZWdsR2V0RXJyb3IoKSAocmVzcGVjdGl2ZWx5IEFTU0VSVF9FR0xfTk9fRVJST1IoKSkuICov
CisgICAgRUdMU3VyZmFjZSBjcmVhdGVQYnVmZmVyU3VyZmFjZShjb25zdCBJbnRTaXplJiBzaXpl
LCBjb25zdCBFR0xDb25maWcmIGNvbmZpZyk7CisKKyAgICBFR0xTdXJmYWNlIHN1cmZhY2VGb3JX
aW5kb3coRUdMTmF0aXZlV2luZG93VHlwZSB3SWQsIGNvbnN0IEVHTENvbmZpZyYgY29uZmlnKTsK
KworICAgIGJvb2wgc3VyZmFjZXNDb21wYXRpYmxlKGNvbnN0IEVHTFN1cmZhY2UmIHN1cmZhY2Us
IGNvbnN0IEVHTFN1cmZhY2UmIG90aGVyU3VyZmFjZSk7CisKKyAgICAvKiogRGVzdHJveSB0aGUg
c3VyZmFjZSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgY29udGV4dCAodW5sZXNzIGFub3RoZXIKKyAg
ICAgKiBzdXJmYWNlIGlzIHN0aWxsIHVzaW5nIHRoZSBzYW1lIGNvbnRleHQsIGluIHdoaWNoIGNh
c2UgdGhlIGNvbnRleHQKKyAgICAgKiBpcyBub3QgZGVzdHJveWVkKS4gKi8KKyAgICB2b2lkIGRl
c3Ryb3lTdXJmYWNlKGNvbnN0IEVHTFN1cmZhY2UmKTsKKworICAgIC8qKiBSZXR1cm4gdGhlIGNv
bnRleHQgY29ycmVzcG9uZGluZyB0byB0aGUgc3VyZmFjZS4KKyAgICAgKiBJZiBubyBjb3JyZXNw
b25kaW5nIGNvbnRleHQgZXhpc3RzLCBvbmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5LiAqLwor
ICAgIEVHTENvbnRleHQgY29udGV4dEZvclN1cmZhY2UoY29uc3QgRUdMU3VyZmFjZSYpOworCitw
cml2YXRlOgorICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKFN1cmZhY2VP
cGVuVkcqKTsKKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKFN1cmZh
Y2VPcGVuVkcqKTsKKworICAgIEVHTERpc3BsYXlPcGVuVkcoY29uc3QgRUdMRGlzcGxheSYgZGlz
cGxheSk7CisgICAgfkVHTERpc3BsYXlPcGVuVkcoKTsKKworICAgIEVHTERpc3BsYXkgbV9kaXNw
bGF5OworICAgIFN1cmZhY2VPcGVuVkcqIG1fc2hhcmVkUGxhdGZvcm1TdXJmYWNlOworICAgIEVH
TGludCBtX3BidWZmZXJDb25maWdJZDsKKyAgICBFR0xpbnQgbV93aW5kb3dDb25maWdJZDsKKwor
ICAgIFdURjo6SGFzaE1hcDxFR0xTdXJmYWNlLCBTdXJmYWNlT3BlblZHKj4gbV9wbGF0Zm9ybVN1
cmZhY2VzOworICAgIFdURjo6SGFzaE1hcDxFR0xOYXRpdmVXaW5kb3dUeXBlLCBFR0xTdXJmYWNl
PiBtX3dpbmRvd1N1cmZhY2VzOworICAgIFdURjo6SGFzaE1hcDxFR0xTdXJmYWNlLCBFR0xpbnQ+
IG1fc3VyZmFjZUNvbmZpZ0lkczsKKyAgICBXVEY6Okhhc2hNYXA8RUdMaW50LCBFR0xpbnQ+IG1f
Y29tcGF0aWJsZUNvbmZpZ0lkczsKKyAgICBXVEY6Okhhc2hNYXA8RUdMaW50LCBFR0xDb250ZXh0
PiBtX2NvbnRleHRzOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTFV0aWxzLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL29wZW52Zy9FR0xVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjBmMzczNWIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29w
ZW52Zy9FR0xVdGlscy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJl
c2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDksIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisK
KyNpZm5kZWYgRUdMVXRpbHNfaAorI2RlZmluZSBFR0xVdGlsc19oCisKKyNpbmNsdWRlIDxlZ2wu
aD4KKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNo
YXIqIHRvRUdMRXJyb3JDb25zdGFudChFR0xpbnQgZXJyb3IpCit7CisgICAgc3dpdGNoIChlcnJv
cikgeworICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDoKKyAgICAgICAgcmV0dXJuICJFR0xf
Tk9UX0lOSVRJQUxJWkVEIjsKKyAgICBjYXNlIEVHTF9CQURfQUNDRVNTOgorICAgICAgICByZXR1
cm4gIkVHTF9CQURfQUNDRVNTIjsKKyAgICBjYXNlIEVHTF9CQURfQUxMT0M6CisgICAgICAgIHJl
dHVybiAiRUdMX0JBRF9BTExPQyI7CisgICAgY2FzZSBFR0xfQkFEX0FUVFJJQlVURToKKyAgICAg
ICAgcmV0dXJuICJFR0xfQkFEX0FUVFJJQlVURSI7CisgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6
CisgICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05URVhUIjsKKyAgICBjYXNlIEVHTF9CQURfQ09O
RklHOgorICAgICAgICByZXR1cm4gIkVHTF9CQURfQ09ORklHIjsKKyAgICBjYXNlIEVHTF9CQURf
Q1VSUkVOVF9TVVJGQUNFOgorICAgICAgICByZXR1cm4gIkVHTF9CQURfQ1VSUkVOVF9TVVJGQUNF
IjsKKyAgICBjYXNlIEVHTF9CQURfRElTUExBWToKKyAgICAgICAgcmV0dXJuICJFR0xfQkFEX0RJ
U1BMQVkiOworICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOgorICAgICAgICByZXR1cm4gIkVHTF9C
QURfU1VSRkFDRSI7CisgICAgY2FzZSBFR0xfQkFEX01BVENIOgorICAgICAgICByZXR1cm4gIkVH
TF9CQURfTUFUQ0giOworICAgIGNhc2UgRUdMX0JBRF9QQVJBTUVURVI6CisgICAgICAgIHJldHVy
biAiRUdMX0JBRF9QQVJBTUVURVIiOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOgor
ICAgICAgICByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7CisgICAgY2FzZSBFR0xfQkFE
X05BVElWRV9XSU5ET1c6CisgICAgICAgIHJldHVybiAiRUdMX0JBRF9OQVRJVkVfV0lORE9XIjsK
KyAgICBjYXNlIEVHTF9DT05URVhUX0xPU1Q6CisgICAgICAgIHJldHVybiAiRUdMX0NPTlRFWFRf
TE9TVCI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVTktOT1dOX0VSUk9SIjsKKyAg
ICB9Cit9CisKKyNpZiBBU1NFUlRfRElTQUJMRUQKKyNkZWZpbmUgQVNTRVJUX0VHTF9OT19FUlJP
UigpICgodm9pZCkwKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUX0VHTF9OT19FUlJPUigpIFwKKyAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGVnbEdldEVycm9yKCkgPT0gVkdfTk9fRVJST1IsICJGb3Vu
ZCAlcyIsIHRvRUdMRXJyb3JDb25zdGFudChlZ2xHZXRFcnJvcigpKSkKKyNlbmRpZgorCisjZW5k
aWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VP
cGVuVkcuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5W
Ry5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiYjU4NwotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVu
VkcuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJ
biBNb3Rpb24gTGltaXRlZCAyMDA5LCAyMDEwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3VyZmFjZU9wZW5WRy5oIgorCisjaW5jbHVkZSAiSW50
U2l6ZS5oIgorI2luY2x1ZGUgIlBhaW50ZXJPcGVuVkcuaCIKKworI2lmIFBMQVRGT1JNKEVHTCkK
KyNpbmNsdWRlICJFR0xEaXNwbGF5T3BlblZHLmgiCisjaW5jbHVkZSAiRUdMVXRpbHMuaCIKKyNl
bmRpZgorCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitTdXJmYWNlT3BlblZHKiBTdXJmYWNlT3BlblZHOjpjdXJyZW50U3VyZmFjZSgpCit7Cisj
aWYgUExBVEZPUk0oRUdMKQorICAgIHJldHVybiBFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50U3Vy
ZmFjZSgpOworI2Vsc2UKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsK
KyNlbmRpZgorfQorCisjaWYgUExBVEZPUk0oRUdMKQorU3VyZmFjZU9wZW5WRzo6U3VyZmFjZU9w
ZW5WRyhjb25zdCBJbnRTaXplJiBzaXplLCBjb25zdCBFR0xEaXNwbGF5JiBkaXNwbGF5LCBFR0xD
b25maWcqIGNvbmZQdHIpCisgICAgOiBtX2VnbERpc3BsYXkoZGlzcGxheSkKKyAgICAsIG1fZWds
U3VyZmFjZShFR0xfTk9fU1VSRkFDRSkKKyAgICAsIG1fZWdsQ29udGV4dChFR0xfTk9fQ09OVEVY
VCkKK3sKKyAgICBBU1NFUlQobV9lZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKTsKKworICAg
IEVHTERpc3BsYXlPcGVuVkcqIGRpc3BsYXlNYW5hZ2VyID0gRUdMRGlzcGxheU9wZW5WRzo6Zm9y
RGlzcGxheShtX2VnbERpc3BsYXkpOworICAgIEVHTENvbmZpZyBjb25maWcgPSBjb25mUHRyID8g
KCpjb25mUHRyKSA6IGRpc3BsYXlNYW5hZ2VyLT5kZWZhdWx0UGJ1ZmZlckNvbmZpZygpOworICAg
IG1fZWdsU3VyZmFjZSA9IGRpc3BsYXlNYW5hZ2VyLT5jcmVhdGVQYnVmZmVyU3VyZmFjZShzaXpl
LCBjb25maWcpOworCisgICAgaWYgKG1fZWdsU3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9lZ2xDb250ZXh0ID0gZGlzcGxheU1hbmFnZXItPmNvbnRl
eHRGb3JTdXJmYWNlKG1fZWdsU3VyZmFjZSk7CisgICAgRUdMRGlzcGxheU9wZW5WRzo6cmVnaXN0
ZXJQbGF0Zm9ybVN1cmZhY2UodGhpcyk7Cit9CisKK1N1cmZhY2VPcGVuVkc6OlN1cmZhY2VPcGVu
VkcoRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3csIGNvbnN0IEVHTERpc3BsYXkmIGRpc3BsYXks
IEVHTENvbmZpZyogY29uZlB0cikKKyAgICA6IG1fZWdsRGlzcGxheShkaXNwbGF5KQorICAgICwg
bV9lZ2xTdXJmYWNlKEVHTF9OT19TVVJGQUNFKQorICAgICwgbV9lZ2xDb250ZXh0KEVHTF9OT19D
T05URVhUKQoreworICAgIEFTU0VSVChtX2VnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpOwor
CisgICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5T3BlblZH
Ojpmb3JEaXNwbGF5KG1fZWdsRGlzcGxheSk7CisgICAgRUdMQ29uZmlnIGNvbmZpZyA9IGNvbmZQ
dHIgPyAoKmNvbmZQdHIpIDogZGlzcGxheU1hbmFnZXItPmRlZmF1bHRXaW5kb3dDb25maWcoKTsK
KyAgICBtX2VnbFN1cmZhY2UgPSBkaXNwbGF5TWFuYWdlci0+c3VyZmFjZUZvcldpbmRvdyh3aW5k
b3csIGNvbmZpZyk7CisKKyAgICBpZiAobV9lZ2xTdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX2VnbENvbnRleHQgPSBkaXNwbGF5TWFuYWdlci0+Y29u
dGV4dEZvclN1cmZhY2UobV9lZ2xTdXJmYWNlKTsKKyAgICBFR0xEaXNwbGF5T3BlblZHOjpyZWdp
c3RlclBsYXRmb3JtU3VyZmFjZSh0aGlzKTsKK30KKworLy8gQ29uc3RydWN0b3Igb25seSBhY2Nl
c3NpYmxlIHRvIEVHTERpc3BsYXlPcGVuVkcgZm9yIHNoYXJlZCBjb250ZXh0CisvLyBpbml0aWFs
aXphdGlvbi4gVGhlIHBhcmFtZXRlciB0eXBlcyBtaWdodCBkZWZpbmUgdG8gdm9pZCogbGlrZSBp
biB0aGUKKy8vIHdpbmRvdyBzdXJmYWNlIGNvbnN0cnVjdG9yLCBzbyBpdCBjYW4ndCBiZSBvdmVy
bG9hZGVkIHdpdGggYWxsIHRoZSByZXF1aXJlZAorLy8gYXJndW1lbnRzIGFuZCBFR0xEaXNwbGF5
T3BlblZHIGJhc2ljYWxseSBpbXBsZW1lbnRzIHRoZSBjb25zdHJ1Y3RvcgorLy8gYnkgaXRzZWxm
LgorU3VyZmFjZU9wZW5WRzo6U3VyZmFjZU9wZW5WRygpCisgICAgOiBtX2VnbERpc3BsYXkoRUdM
X05PX0RJU1BMQVkpCisgICAgLCBtX2VnbFN1cmZhY2UoRUdMX05PX1NVUkZBQ0UpCisgICAgLCBt
X2VnbENvbnRleHQoRUdMX05PX0NPTlRFWFQpCit7Cit9CisjZW5kaWYKKworU3VyZmFjZU9wZW5W
Rzo6flN1cmZhY2VPcGVuVkcoKQoreworICAgIGlmICghaXNWYWxpZCgpKQorICAgICAgICByZXR1
cm47CisKKyNpZiBQTEFURk9STShFR0wpCisgICAgRUdMRGlzcGxheU9wZW5WRzo6Zm9yRGlzcGxh
eShtX2VnbERpc3BsYXkpLT5kZXN0cm95U3VyZmFjZShtX2VnbFN1cmZhY2UpOworICAgIEVHTERp
c3BsYXlPcGVuVkc6OnVucmVnaXN0ZXJQbGF0Zm9ybVN1cmZhY2UodGhpcyk7CisjZWxzZQorICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworI2VuZGlmCit9CisKK2Jvb2wgU3VyZmFjZU9wZW5WRzo6
aXNWYWxpZCgpIGNvbnN0Cit7CisjaWYgUExBVEZPUk0oRUdMKQorICAgIHJldHVybiAobV9lZ2xT
dXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKTsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKK2ludCBTdXJmYWNlT3BlblZHOjp3
aWR0aCgpIGNvbnN0Cit7CisjaWYgUExBVEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2VnbFN1cmZh
Y2UgIT0gRUdMX05PX1NVUkZBQ0UpOworCisgICAgRUdMaW50IHdpZHRoOworICAgIGVnbFF1ZXJ5
U3VyZmFjZShtX2VnbERpc3BsYXksIG1fZWdsU3VyZmFjZSwgRUdMX1dJRFRILCAmd2lkdGgpOwor
ICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyAgICByZXR1cm4gd2lkdGg7CisjZWxzZQorICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK2ludCBT
dXJmYWNlT3BlblZHOjpoZWlnaHQoKSBjb25zdAoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICBB
U1NFUlQobV9lZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKTsKKworICAgIEVHTGludCBoZWln
aHQ7CisgICAgZWdsUXVlcnlTdXJmYWNlKG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlLCBFR0xf
SEVJR0hULCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgcmV0dXJu
IGhlaWdodDsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7
CisjZW5kaWYKK30KKworU3VyZmFjZU9wZW5WRyogU3VyZmFjZU9wZW5WRzo6c2hhcmVkU3VyZmFj
ZSgpIGNvbnN0Cit7CisjaWYgUExBVEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2VnbFN1cmZhY2Ug
IT0gRUdMX05PX1NVUkZBQ0UpOworICAgIHJldHVybiBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNw
bGF5KG1fZWdsRGlzcGxheSktPnNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpOworI2Vsc2UKKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCit2b2lkIFN1
cmZhY2VPcGVuVkc6Om1ha2VDdXJyZW50KE1ha2VDdXJyZW50TW9kZSBtb2RlKQoreworI2lmIFBM
QVRGT1JNKEVHTCkKKyAgICBBU1NFUlQobV9lZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKTsK
KworICAgIGVnbEJpbmRBUEkoRUdMX09QRU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJS
T1IoKTsKKyAgICBFR0xTdXJmYWNlIGN1cnJlbnRTdXJmYWNlID0gZWdsR2V0Q3VycmVudFN1cmZh
Y2UoRUdMX0RSQVcpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIGlmIChjdXJy
ZW50U3VyZmFjZSAhPSBtX2VnbFN1cmZhY2UpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQobV9l
Z2xEaXNwbGF5LCBtX2VnbFN1cmZhY2UsIG1fZWdsU3VyZmFjZSwgbV9lZ2xDb250ZXh0KTsKKyAg
ICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIFN1
cmZhY2VPcGVuVkc6Om1ha2VDb21wYXRpYmxlQ3VycmVudCgpCit7CisjaWYgUExBVEZPUk0oRUdM
KQorICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpOworCisgICAgZWds
QmluZEFQSShFR0xfT1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAg
IEVHTFN1cmZhY2UgY3VycmVudFN1cmZhY2UgPSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJB
Vyk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAgaWYgKGN1cnJlbnRTdXJmYWNl
ICE9IG1fZWdsU3VyZmFjZQorICAgICAgICAmJiAhRUdMRGlzcGxheU9wZW5WRzo6Zm9yRGlzcGxh
eShtX2VnbERpc3BsYXkpLT5zdXJmYWNlc0NvbXBhdGlibGUoY3VycmVudFN1cmZhY2UsIG1fZWds
U3VyZmFjZSkpIHsKKyAgICAgICAgZWdsTWFrZUN1cnJlbnQobV9lZ2xEaXNwbGF5LCBtX2VnbFN1
cmZhY2UsIG1fZWdsU3VyZmFjZSwgbV9lZ2xDb250ZXh0KTsKKyAgICAgICAgQVNTRVJUX0VHTF9O
T19FUlJPUigpOworICAgIH0KKyAgICAvLyBlbHNlOiBzdXJmYWNlcyBjb21wYXRpYmxlLCBubyBu
ZWVkIHRvIHN3aXRjaCBjb250ZXh0cworI2VuZGlmCit9CisKK3ZvaWQgU3VyZmFjZU9wZW5WRzo6
Zmx1c2goKQoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICBBU1NFUlQobV9lZ2xTdXJmYWNlICE9
IEVHTF9OT19TVVJGQUNFKTsKKworICAgIGVnbFN3YXBCdWZmZXJzKG1fZWdsRGlzcGxheSwgbV9l
Z2xTdXJmYWNlKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisjZW5kaWYKK30KKworfQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5W
Ry5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5WRy5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZWNlNDkKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW52Zy9TdXJmYWNlT3BlblZHLmgKQEAg
LTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBM
aW1pdGVkIDIwMDksIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgU3VyZmFjZU9w
ZW5WR19oCisjZGVmaW5lIFN1cmZhY2VPcGVuVkdfaAorCisjaWYgUExBVEZPUk0oRUdMKQorI2lu
Y2x1ZGUgPGVnbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNp
bmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWYgUExB
VEZPUk0oRUdMKQorY2xhc3MgRUdMRGlzcGxheU9wZW5WRzsKKyNlbmRpZgorY2xhc3MgSW50U2l6
ZTsKKworLyoqCisgKiBTdXJmYWNlT3BlblZHIHByb3ZpZGVzIHRoZSBmdW5jdGlvbmFsaXR5IG9m
IHN1cmZhY2VzIGFuZCBjb250ZXh0cyB0aGF0IGFyZQorICogdW5kZXJseWluZyB0aGUgT3BlblZH
IGltcGxlbWVudGF0aW9uLiBJbiB0aGUgdmFzdCBtYWpvcml0eSBvZiBjYXNlcywgdGhhdAorICog
dW5kZXJseWluZyB0ZWNobm9sb2d5IGlzIEVHTCwgYnV0IE9wZW5WRyBkb2Vzbid0IGRlcGVuZCBv
biBFR0wgcGVyIHNlLgorICogV3JhcHBpbmcgc3VyZmFjZS9jb250ZXh0IGZ1bmN0aW9uYWxpdHkg
aW50byBhIHNlcGFyYXRlIGNsYXNzIGF2b2lkcyBsb3RzCisgKiBvZiAjaWZkZWZzIGFuZCBzaG91
bGQgbWFrZSBpdCBlYXN5IHRvIGFkZCBkaWZmZXJlbnQgc3VyZmFjZS9jb250ZXh0CisgKiBpbXBs
ZW1lbnRhdGlvbnMgdGhhbiBFR0wuCisgKi8KK2NsYXNzIFN1cmZhY2VPcGVuVkcgOiBwdWJsaWMg
Tm9uY29weWFibGUgeworcHVibGljOgorICAgIHN0YXRpYyBTdXJmYWNlT3BlblZHKiBjdXJyZW50
U3VyZmFjZSgpOworCisjaWYgUExBVEZPUk0oRUdMKQorICAgIGZyaWVuZCBjbGFzcyBFR0xEaXNw
bGF5T3BlblZHOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEVHTCBwYnVmZmVyIHN1
cmZhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGNvbmZpZyBvbgorICAgICAqIHRoZSBn
aXZlbiBkaXNwbGF5LiBJZiBjb25maWcgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRpc3BsYXkncyBk
ZWZhdWx0CisgICAgICogcGJ1ZmZlciBjb25maWcgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEZv
ciByZWFzb25zIG9mIHJlY292ZXJhYmlsaXR5IChlLmcuIEltYWdlQnVmZmVyJ3MgImJvb2wgc3Vj
Y2VzcyIKKyAgICAgKiByZXR1cm4gdmFsdWUpLCB0aGlzIGNvbnN0cnVjdG9yIHdvbid0IGFzc2Vy
dCBpZiBjcmVhdGlvbiBvZiB0aGUgc3VyZmFjZQorICAgICAqIGZhaWxzLiBNYWtlIHN1cmUgdG8g
Y2hlY2sgc3VjY2Vzc2Z1bCBzdXJmYWNlIGNyZWF0aW9uIHdpdGggZWl0aGVyCisgICAgICogQVNT
RVJUX0VHTF9OT19FUlJPUigpIG9yIHRoZSBzdXJmYWNlJ3MgaXNWYWxpZCgpIG1ldGhvZC4KKyAg
ICAgKi8KKyAgICBTdXJmYWNlT3BlblZHKGNvbnN0IEludFNpemUmIHNpemUsIGNvbnN0IEVHTERp
c3BsYXkmIGRpc3BsYXksIEVHTENvbmZpZyogY29uZmlnID0gMCk7CisKKyAgICAvKioKKyAgICAg
KiBDcmVhdGUgYSBuZXcgRUdMIHdpbmRvdyBzdXJmYWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYXRp
dmUgd2luZG93IGhhbmRsZQorICAgICAqIGFuZCBjb25maWcgb24gdGhlIGdpdmVuIGRpc3BsYXku
IElmIGNvbmZpZyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKKyAgICAgKiBkaXNwbGF5J3MgZGVmYXVs
dCB3aW5kb3cgY29uZmlnIGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBGb3IgcmVhc29ucyBvZiBy
ZWNvdmVyYWJpbGl0eSwgdGhpcyBjb25zdHJ1Y3RvciB3b24ndCBhc3NlcnQgaWYgY3JlYXRpb24K
KyAgICAgKiBvZiB0aGUgc3VyZmFjZSBmYWlscy4gTWFrZSBzdXJlIHRvIGNoZWNrIHN1Y2Nlc3Nm
dWwgc3VyZmFjZSBjcmVhdGlvbgorICAgICAqIHdpdGggZWl0aGVyIEFTU0VSVF9FR0xfTk9fRVJS
T1IoKSBvciB0aGUgc3VyZmFjZSdzIGlzVmFsaWQoKSBtZXRob2QuCisgICAgICovCisgICAgU3Vy
ZmFjZU9wZW5WRyhFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMRGlzcGxheSYg
ZGlzcGxheSwgRUdMQ29uZmlnKiBjb25maWcgPSAwKTsKKworICAgIEVHTERpc3BsYXkgZWdsRGlz
cGxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsRGlzcGxheTsgfQorICAgIEVHTFN1cmZhY2UgZWds
U3VyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsU3VyZmFjZTsgfQorICAgIEVHTENvbnRleHQg
ZWdsQ29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsQ29udGV4dDsgfQorI2VuZGlmCisKKyAg
ICB+U3VyZmFjZU9wZW5WRygpOworCisgICAgLyoqCisgICAgICogSWYgYSBzdXJmYWNlIGlzIGlu
dmFsaWQgKGNvdWxkIG5vdCBiZSBjcmVhdGVkKSwgYWxsIG1ldGhvZCBjYWxscyB3aWxsCisgICAg
ICogY3Jhc2ggaG9ycmlibHkuCisgICAgICovCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CisK
KyAgICBpbnQgd2lkdGgoKSBjb25zdDsKKyAgICBpbnQgaGVpZ2h0KCkgY29uc3Q7CisKKyAgICBT
dXJmYWNlT3BlblZHKiBzaGFyZWRTdXJmYWNlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBN
YWtlIHRoZSBhc3NvY2lhdGVkIEdML0VHTCBjb250ZXh0IHRoZSBjdXJyZW50IG9uZSwgc28gdGhh
dCBzdWJzZXF1ZW50CisgICAgICogT3BlblZHIGNvbW1hbmRzIGFwcGx5IHRvIGl0LgorICAgICAq
LworICAgIHZvaWQgbWFrZUN1cnJlbnQoKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBzdXJm
YWNlL2NvbnRleHQgY29tYmluYXRpb24gY3VycmVudCB0aGF0IGlzICJjb21wYXRpYmxlIgorICAg
ICAqIChpLmUuIGNhbiBhY2Nlc3MgaXRzIHNoYXJlZCByZXNvdXJjZXMpIHRvIHRoZSBnaXZlbiBv
bmUuIElmIG5vCisgICAgICogc3VyZmFjZS9jb250ZXh0IGlzIGN1cnJlbnQsIHRoZSBnaXZlbiBv
bmUgaXMgbWFkZSBjdXJyZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQg
dG8gYXZvaWQgY29udGV4dCBjaGFuZ2VzIGlmIHRoZXkncmUgbm90CisgICAgICogbmVjZXNzYXJ5
LCBwYXJ0aWN1bGFybHkgdGFpbG9yZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHNvbWV0aGluZworICAg
ICAqIGNvbXBhdGlibGUgdG8gdGhlIHNoYXJlZCBzdXJmYWNlIGlzIHJlcXVlc3RlZCB3aGlsZSBh
Y3R1YWwgcGFpbnRpbmcKKyAgICAgKiBoYXBwZW5zIG9uIGFub3RoZXIgc3VyZmFjZS4KKyAgICAg
Ki8KKyAgICB2b2lkIG1ha2VDb21wYXRpYmxlQ3VycmVudCgpOworCisgICAgLyoqCisgICAgICog
RW1wdHkgdGhlIE9wZW5WRyBwaXBlbGluZSBhbmQgbWFrZSBzdXJlIGFsbCB0aGUgcGVyZm9ybWVk
IHBhaW50CisgICAgICogb3BlcmF0aW9ucyBzaG93IHVwIG9uIHRoZSBzdXJmYWNlIGFzIGFjdHVh
bCBkcmF3biBwaXhlbHMuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCitwcml2YXRlOgor
I2lmIFBMQVRGT1JNKEVHTCkKKyAgICBTdXJmYWNlT3BlblZHKCk7IC8vIGZvciBFR0xEaXNwbGF5
T3BlblZHCisKKyAgICBFR0xEaXNwbGF5IG1fZWdsRGlzcGxheTsKKyAgICBFR0xTdXJmYWNlIG1f
ZWdsU3VyZmFjZTsKKyAgICBFR0xDb250ZXh0IG1fZWdsQ29udGV4dDsKKyNlbmRpZgorfTsKKwor
fQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZn
L1ZHVXRpbHMuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1ZHVXRpbHMuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM5Y2FjCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvVkdVdGlscy5oCkBAIC0wLDAg
KzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVk
IDIwMDksIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgVkdVdGlsc19oCisjZGVm
aW5lIFZHVXRpbHNfaAorCisjaW5jbHVkZSA8b3BlbnZnLmg+CisjaW5jbHVkZSA8d3RmL0Fzc2Vy
dGlvbnMuaD4KKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyKiB0b1ZHRXJyb3JDb25zdGFudChW
R0Vycm9yQ29kZSBlcnJvcikKK3sKKyAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgY2FzZSBWR19C
QURfSEFORExFX0VSUk9SOgorICAgICAgICByZXR1cm4gIlZHX0JBRF9IQU5ETEVfRVJST1IiOwor
ICAgIGNhc2UgVkdfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJWR19J
TExFR0FMX0FSR1VNRU5UX0VSUk9SIjsKKyAgICBjYXNlIFZHX09VVF9PRl9NRU1PUllfRVJST1I6
CisgICAgICAgIHJldHVybiAiVkdfT1VUX09GX01FTU9SWV9FUlJPUiI7CisgICAgY2FzZSBWR19Q
QVRIX0NBUEFCSUxJVFlfRVJST1I6CisgICAgICAgIHJldHVybiAiVkdfUEFUSF9DQVBBQklMSVRZ
X0VSUk9SIjsKKyAgICBjYXNlIFZHX1VOU1VQUE9SVEVEX0lNQUdFX0ZPUk1BVF9FUlJPUjoKKyAg
ICAgICAgcmV0dXJuICJWR19VTlNVUFBPUlRFRF9JTUFHRV9GT1JNQVRfRVJST1IiOworICAgIGNh
c2UgVkdfVU5TVVBQT1JURURfUEFUSF9GT1JNQVRfRVJST1I6CisgICAgICAgIHJldHVybiAiVkdf
VU5TVVBQT1JURURfUEFUSF9GT1JNQVRfRVJST1IiOworICAgIGNhc2UgVkdfSU1BR0VfSU5fVVNF
X0VSUk9SOgorICAgICAgICByZXR1cm4gIlZHX0lNQUdFX0lOX1VTRV9FUlJPUiI7CisgICAgY2Fz
ZSBWR19OT19DT05URVhUX0VSUk9SOgorICAgICAgICByZXR1cm4gIlZHX05PX0NPTlRFWFRfRVJS
T1IiOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiVU5LTk9XTl9FUlJPUiI7CisgICAg
fQorfQorCisjaWYgQVNTRVJUX0RJU0FCTEVECisjZGVmaW5lIEFTU0VSVF9WR19OT19FUlJPUigp
ICgodm9pZCkwKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUX1ZHX05PX0VSUk9SKCkgXAorICAgIEFT
U0VSVF9XSVRIX01FU1NBR0UodmdHZXRFcnJvcigpID09IFZHX05PX0VSUk9SLCAiRm91bmQgJXMi
LCB0b1ZHRXJyb3JDb25zdGFudCh2Z0dldEVycm9yKCkpKQorI2VuZGlmCisKKyNlbmRpZgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46930</attachid>
            <date>2010-01-19 11:33:51 -0800</date>
            <delta_ts>2010-01-19 12:02:31 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-33403-20100119143350.patch</filename>
            <type>text/plain</type>
            <size>37495</size>
            <attacher name="Jakob Petsovits">jpetsovits</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmQ4OTFiZC4uMjJmZjQzNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2NSBAQAorMjAxMC0wMS0xNSAgSmFrb2IgUGV0c292
aXRzICA8anBldHNvdml0c0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFtPcGVuVkddIEFkZCAoRUdMKSBzdXJmYWNlL2NvbnRleHQgbWFu
YWdlbWVudAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MzM0MDMKKworICAgICAgICBUaGUgZm91bmRhdGlvbnMgZm9yIGEgbmV3IE9wZW5WRyBwb3J0Lgor
CisgICAgICAgIE9wZW5WRyBpcyBub3QgdGllZCB0byBFR0wgcGVyIHNlLCBFR0wganVzdCBoYXBw
ZW5zIHRvIGJlCisgICAgICAgIHRoZSBvbmx5IHVzYWJsZSBiYWNrZW5kIGZvciBPcGVuVkcgc3Rh
dGUgYW5kIHBhaW50aW5nCisgICAgICAgIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcuCisKKyAgICAg
ICAgVGhlIHB1cnBvc2Ugb2YgdGhlIFN1cmZhY2VPcGVuVkcgY2xhc3MgaXMgdG8gcHJvdmlkZQor
ICAgICAgICBhbiBFR0wtaW5kZXBlbmRlbnQgaW50ZXJmYWNlIGZvciBPcGVuVkctc3BlY2lmaWMg
Y29kZS4KKyAgICAgICAgVGhlIEVHTERpc3BsYXlPcGVuVkcgY2xhc3MgdGFrZXMgY2FyZSBvZiBr
ZWVwaW5nIHRyYWNrCisgICAgICAgIG9mIEVHTCBkaXNwbGF5cywgc3VyZmFjZXMgYW5kIGNvbnRl
eHRzLiBJdCBhbHNvIG1ha2VzCisgICAgICAgIHN1cmUgdGhhdCBhbGwgY3JlYXRlZCBjb250ZXh0
cyBhcmUgaW50ZXJvcGVyYWJsZSwgYW5kCisgICAgICAgIHRoYXQgZGlmZmVyZW50IHN1cmZhY2Vz
IHVzZSBhIHNpbmdsZSBjb250ZXh0IGlmIHBvc3NpYmxlLgorCisgICAgICAgICogcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnZnL0VHTERpc3BsYXlPcGVuVkcuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OmRpc3BsYXlNYW5hZ2Vycyk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5T3Bl
blZHOjpjdXJyZW50U3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5T3BlblZH
OjpyZWdpc3RlclBsYXRmb3JtU3VyZmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5
T3BlblZHOjp1bnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OkVH
TERpc3BsYXlPcGVuVkc6OnNldEN1cnJlbnREaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OkVH
TERpc3BsYXlPcGVuVkc6OmN1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6RUdMRGlzcGxheU9w
ZW5WRzo6Zm9yRGlzcGxheSk6CisgICAgICAgIChXZWJDb3JlOjpFR0xEaXNwbGF5T3BlblZHOjpF
R0xEaXNwbGF5T3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlPcGVuVkc6On5F
R0xEaXNwbGF5T3BlblZHKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlPcGVuVkc6OnNl
dERlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlPcGVu
Vkc6OmRlZmF1bHRQYnVmZmVyQ29uZmlnKToKKyAgICAgICAgKFdlYkNvcmU6OkVHTERpc3BsYXlP
cGVuVkc6OnNldERlZmF1bHRXaW5kb3dDb25maWcpOgorICAgICAgICAoV2ViQ29yZTo6RUdMRGlz
cGxheU9wZW5WRzo6ZGVmYXVsdFdpbmRvd0NvbmZpZyk6CisgICAgICAgIChXZWJDb3JlOjpFR0xE
aXNwbGF5T3BlblZHOjpzaGFyZWRQbGF0Zm9ybVN1cmZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6
RUdMRGlzcGxheU9wZW5WRzo6Y3JlYXRlUGJ1ZmZlclN1cmZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6RUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZUZvcldpbmRvdyk6CisgICAgICAgIChXZWJDb3Jl
OjpFR0xEaXNwbGF5T3BlblZHOjpzdXJmYWNlc0NvbXBhdGlibGUpOgorICAgICAgICAoV2ViQ29y
ZTo6RUdMRGlzcGxheU9wZW5WRzo6ZGVzdHJveVN1cmZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6
RUdMRGlzcGxheU9wZW5WRzo6Y29udGV4dEZvclN1cmZhY2UpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6RUdMRGlzcGxheU9wZW5WRzo6ZGlzcGxheSk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL0VHTFV0aWxzLmg6IEFkZGVkLgorICAgICAgICAodG9FR0xFcnJvckNvbnN0
YW50KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5WRy5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6Y3VycmVudFN1cmZh
Y2UpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6U3VyZmFjZU9wZW5WRyk6Cisg
ICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjp+U3VyZmFjZU9wZW5WRyk6CisgICAgICAg
IChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjppc1ZhbGlkKToKKyAgICAgICAgKFdlYkNvcmU6OlN1
cmZhY2VPcGVuVkc6OndpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6Omhl
aWdodCk6CisgICAgICAgIChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjpzaGFyZWRTdXJmYWNlKToK
KyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6Om1ha2VDdXJyZW50KToKKyAgICAgICAg
KFdlYkNvcmU6OlN1cmZhY2VPcGVuVkc6Om1ha2VDb21wYXRpYmxlQ3VycmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpTdXJmYWNlT3BlblZHOjpmbHVzaCk6CisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpT
dXJmYWNlT3BlblZHOjplZ2xEaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OlN1cmZhY2VPcGVu
Vkc6OmVnbFN1cmZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6U3VyZmFjZU9wZW5WRzo6ZWdsQ29u
dGV4dCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1ZHVXRpbHMuaDogQWRk
ZWQuCisgICAgICAgICh0b1ZHRXJyb3JDb25zdGFudCk6CisKIDIwMTAtMDEtMDcgIENocmlzdGlh
biBTZWplcnNlbiAgPGNocmlzdGlhbi53ZWJraXRAZ21haWwuY29tPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IERhcmluIEFkbGVyLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9vcGVudmcvRUdMRGlzcGxheU9wZW5WRy5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW52Zy9FR0xEaXNwbGF5T3BlblZHLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi43NjljNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9vcGVudmcvRUdMRGlzcGxheU9wZW5WRy5jcHAKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDktMjAxMC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkVHTERpc3Bs
YXlPcGVuVkcuaCIKKworI2luY2x1ZGUgIkVHTFV0aWxzLmgiCisjaW5jbHVkZSAiSW50U2l6ZS5o
IgorI2luY2x1ZGUgIlN1cmZhY2VPcGVuVkcuaCIKKworI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25z
Lmg+CisjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKKy8vIE5lZWQgdG8gdHlwZWRlZiB0aGlzLCBvdGhlcndpc2UgREVGSU5FX1NUQVRJQ19MT0NB
TCgpIGRvZXNuJ3Qgc3dhbGxvdyBpdC4KK3R5cGVkZWYgSGFzaE1hcDxFR0xEaXNwbGF5LCBFR0xE
aXNwbGF5T3BlblZHKj4gRUdMRGlzcGxheU1hbmFnZXJNYXA7CisKKy8vIEZpbGUtc3RhdGljIHZh
cmlhYmxlcy4KK3N0YXRpYyBFR0xEaXNwbGF5TWFuYWdlck1hcCYgZGlzcGxheU1hbmFnZXJzKCkK
K3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEVHTERpc3BsYXlNYW5hZ2VyTWFwLCBtYW5hZ2Vy
cywgKCkpOworICAgIHJldHVybiBtYW5hZ2VyczsKK30KKworc3RhdGljIEVHTERpc3BsYXlPcGVu
VkcqIHNfY3VycmVudCA9IDA7CisKKy8vIFN0YXRpYyBjbGFzcyBtZW1iZXJzLgorCitTdXJmYWNl
T3BlblZHKiBFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50U3VyZmFjZSgpCit7CisgICAgRUdMRGlz
cGxheU1hbmFnZXJNYXAmIG1hbmFnZXJzID0gZGlzcGxheU1hbmFnZXJzKCk7CisgICAgRUdMRGlz
cGxheSBjdXJyZW50RGlzcGxheSA9IGVnbEdldEN1cnJlbnREaXNwbGF5KCk7CisKKyAgICBpZiAo
Y3VycmVudERpc3BsYXkgPT0gRUdMX05PX0RJU1BMQVkgfHwgIW1hbmFnZXJzLmNvbnRhaW5zKGN1
cnJlbnREaXNwbGF5KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBFR0xEaXNwbGF5T3BlblZH
KiBkaXNwbGF5TWFuYWdlciA9IG1hbmFnZXJzLmdldChjdXJyZW50RGlzcGxheSk7CisgICAgRUdM
U3VyZmFjZSBjdXJyZW50U3VyZmFjZSA9IGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsK
KworICAgIGlmIChjdXJyZW50U3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSB8fCAhZGlzcGxheU1h
bmFnZXItPm1fcGxhdGZvcm1TdXJmYWNlcy5jb250YWlucyhjdXJyZW50U3VyZmFjZSkpCisgICAg
ICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGRpc3BsYXlNYW5hZ2VyLT5tX3BsYXRmb3JtU3Vy
ZmFjZXMuZ2V0KGN1cnJlbnRTdXJmYWNlKTsKK30KKwordm9pZCBFR0xEaXNwbGF5T3BlblZHOjpy
ZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZHKiBwbGF0Zm9ybVN1cmZhY2UpCit7
CisgICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBFR0xEaXNwbGF5T3BlblZH
Ojpmb3JEaXNwbGF5KHBsYXRmb3JtU3VyZmFjZS0+ZWdsRGlzcGxheSgpKTsKKyAgICBkaXNwbGF5
TWFuYWdlci0+bV9wbGF0Zm9ybVN1cmZhY2VzLnNldChwbGF0Zm9ybVN1cmZhY2UtPmVnbFN1cmZh
Y2UoKSwgcGxhdGZvcm1TdXJmYWNlKTsKK30KKwordm9pZCBFR0xEaXNwbGF5T3BlblZHOjp1bnJl
Z2lzdGVyUGxhdGZvcm1TdXJmYWNlKFN1cmZhY2VPcGVuVkcqIHBsYXRmb3JtU3VyZmFjZSkKK3sK
KyAgICBFR0xEaXNwbGF5T3BlblZHKiBkaXNwbGF5TWFuYWdlciA9IEVHTERpc3BsYXlPcGVuVkc6
OmZvckRpc3BsYXkocGxhdGZvcm1TdXJmYWNlLT5lZ2xEaXNwbGF5KCkpOworICAgIGRpc3BsYXlN
YW5hZ2VyLT5tX3BsYXRmb3JtU3VyZmFjZXMucmVtb3ZlKHBsYXRmb3JtU3VyZmFjZS0+ZWdsU3Vy
ZmFjZSgpKTsKK30KKwordm9pZCBFR0xEaXNwbGF5T3BlblZHOjpzZXRDdXJyZW50RGlzcGxheShj
b25zdCBFR0xEaXNwbGF5JiBkaXNwbGF5KQoreworICAgIHNfY3VycmVudCA9IEVHTERpc3BsYXlP
cGVuVkc6OmZvckRpc3BsYXkoZGlzcGxheSk7Cit9CisKK0VHTERpc3BsYXlPcGVuVkcqIEVHTERp
c3BsYXlPcGVuVkc6OmN1cnJlbnQoKQoreworICAgIGlmICghc19jdXJyZW50KSB7CisgICAgICAg
IEVHTERpc3BsYXkgZGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7
CisgICAgICAgIGVnbEluaXRpYWxpemUoZGlzcGxheSwgMCwgMCk7CisgICAgICAgIEFTU0VSVF9F
R0xfTk9fRVJST1IoKTsKKworICAgICAgICBzX2N1cnJlbnQgPSBFR0xEaXNwbGF5T3BlblZHOjpm
b3JEaXNwbGF5KGRpc3BsYXkpOworICAgIH0KKyAgICByZXR1cm4gc19jdXJyZW50OworfQorCitF
R0xEaXNwbGF5T3BlblZHKiBFR0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KGNvbnN0IEVHTERp
c3BsYXkmIGRpc3BsYXkpCit7CisgICAgRUdMRGlzcGxheU1hbmFnZXJNYXAmIG1hbmFnZXJzID0g
ZGlzcGxheU1hbmFnZXJzKCk7CisKKyAgICBpZiAoIW1hbmFnZXJzLmNvbnRhaW5zKGRpc3BsYXkp
KQorICAgICAgICBtYW5hZ2Vycy5zZXQoZGlzcGxheSwgbmV3IEVHTERpc3BsYXlPcGVuVkcoZGlz
cGxheSkpOworCisgICAgcmV0dXJuIG1hbmFnZXJzLmdldChkaXNwbGF5KTsKK30KKworCisvLyBP
YmplY3QvaW5zdGFuY2UgbWVtYmVycy4KKworRUdMRGlzcGxheU9wZW5WRzo6RUdMRGlzcGxheU9w
ZW5WRyhjb25zdCBFR0xEaXNwbGF5JiBkaXNwbGF5KQorICAgIDogbV9kaXNwbGF5KGRpc3BsYXkp
CisgICAgLCBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZSgwKQorICAgICwgbV9wYnVmZmVyQ29uZmln
SWQoMCkKKyAgICAsIG1fd2luZG93Q29uZmlnSWQoMCkKK3sKKyAgICBlZ2xCaW5kQVBJKEVHTF9P
UEVOVkdfQVBJKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7Cit9CisKK0VHTERpc3BsYXlP
cGVuVkc6On5FR0xEaXNwbGF5T3BlblZHKCkKK3sKKyAgICBlZ2xNYWtlQ3VycmVudChtX2Rpc3Bs
YXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOworICAg
IEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIGRlbGV0ZSBtX3NoYXJlZFBsYXRmb3JtU3Vy
ZmFjZTsKKworICAgIEhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50Pjo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gbV9zdXJmYWNlQ29uZmlnSWRzLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDxFR0xTdXJm
YWNlLCBFR0xpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fc3VyZmFjZUNvbmZpZ0lkcy5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIGRlc3Ryb3lTdXJmYWNlKCgqaXQpLmZpcnN0
KTsKKworICAgIGVnbFRlcm1pbmF0ZShtX2Rpc3BsYXkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJS
T1IoKTsKK30KKwordm9pZCBFR0xEaXNwbGF5T3BlblZHOjpzZXREZWZhdWx0UGJ1ZmZlckNvbmZp
Zyhjb25zdCBFR0xDb25maWcmIGNvbmZpZykKK3sKKyAgICBFR0xpbnQgY29uZmlnSWQ7CisgICAg
RUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1fZGlzcGxheSwgY29uZmln
LCBFR0xfQ09ORklHX0lELCAmY29uZmlnSWQpOworICAgIEFTU0VSVChzdWNjZXNzID09IEVHTF9U
UlVFKTsKKyAgICBBU1NFUlQoY29uZmlnSWQgIT0gRUdMX0JBRF9BVFRSSUJVVEUpOworCisgICAg
bV9wYnVmZmVyQ29uZmlnSWQgPSBjb25maWdJZDsKK30KKworRUdMQ29uZmlnIEVHTERpc3BsYXlP
cGVuVkc6OmRlZmF1bHRQYnVmZmVyQ29uZmlnKCkKK3sKKyAgICBFR0xDb25maWcgY29uZmlnOwor
ICAgIEVHTGludCBudW1Db25maWdzOworCisgICAgLy8gSG9wZWZ1bGx5IHRoZSBjbGllbnQgd2ls
bCBoYXZlIHNldCB0aGUgcGJ1ZmZlciBjb25maWcgb2YgaXRzIGNob2ljZQorICAgIC8vIGJ5IG5v
dyAtIGlmIG5vdCwgdXNlIGEgMzItYml0IGdlbmVyaWMgb25lIGFzIGRlZmF1bHQuCisgICAgaWYg
KCFtX3BidWZmZXJDb25maWdJZCkgeworICAgICAgICBzdGF0aWMgY29uc3QgRUdMaW50IGNvbmZp
Z0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9SRURfU0laRSwgOCwKKyAgICAgICAgICAg
IEVHTF9HUkVFTl9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKKyAgICAg
ICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0FMUEhBX01BU0tfU0la
RSwgMSwKKyAgICAgICAgICAgIEVHTF9MVU1JTkFOQ0VfU0laRSwgRUdMX0RPTlRfQ0FSRSwKKyAg
ICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9QQlVGRkVSX0JJVCwKKyAgICAgICAgICAg
IEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOVkdfQklULAorICAgICAgICAgICAgRUdMX05P
TkUgfTsKKworICAgICAgICBlZ2xDaG9vc2VDb25maWcobV9kaXNwbGF5LCBjb25maWdBdHRyaWJz
LCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3Qg
RUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgICAgIEVHTF9DT05GSUdfSUQsIG1f
cGJ1ZmZlckNvbmZpZ0lkLAorICAgICAgICAgICAgRUdMX05PTkUgfTsKKworICAgICAgICBlZ2xD
aG9vc2VDb25maWcobV9kaXNwbGF5LCBjb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29u
Zmlncyk7CisgICAgfQorCisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIEFTU0VSVChu
dW1Db25maWdzID09IDEpOworICAgIHJldHVybiBjb25maWc7Cit9CisKK3ZvaWQgRUdMRGlzcGxh
eU9wZW5WRzo6c2V0RGVmYXVsdFdpbmRvd0NvbmZpZyhjb25zdCBFR0xDb25maWcmIGNvbmZpZykK
K3sKKyAgICBFR0xpbnQgY29uZmlnSWQ7CisgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsR2V0
Q29uZmlnQXR0cmliKG1fZGlzcGxheSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSWQp
OworICAgIEFTU0VSVChzdWNjZXNzID09IEVHTF9UUlVFKTsKKyAgICBBU1NFUlQoY29uZmlnSWQg
IT0gRUdMX0JBRF9BVFRSSUJVVEUpOworCisgICAgbV93aW5kb3dDb25maWdJZCA9IGNvbmZpZ0lk
OworfQorCitFR0xDb25maWcgRUdMRGlzcGxheU9wZW5WRzo6ZGVmYXVsdFdpbmRvd0NvbmZpZygp
Cit7CisgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICBFR0xpbnQgbnVtQ29uZmlnczsKKworICAg
IC8vIEhvcGVmdWxseSB0aGUgY2xpZW50IHdpbGwgaGF2ZSBzZXQgdGhlIHdpbmRvdyBjb25maWcg
b2YgaXRzIGNob2ljZQorICAgIC8vIGJ5IG5vdyAtIGlmIG5vdCwgdXNlIGEgMzItYml0IGdlbmVy
aWMgb25lIGFzIGRlZmF1bHQuCisgICAgaWYgKCFtX3dpbmRvd0NvbmZpZ0lkKSB7CisgICAgICAg
IHN0YXRpYyBjb25zdCBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgICAgRUdM
X1JFRF9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0dSRUVOX1NJWkUsIDgsCisgICAgICAgICAg
ICBFR0xfQkxVRV9TSVpFLCA4LAorICAgICAgICAgICAgRUdMX0FMUEhBX1NJWkUsIDgsCisgICAg
ICAgICAgICBFR0xfQUxQSEFfTUFTS19TSVpFLCAxLAorICAgICAgICAgICAgRUdMX0xVTUlOQU5D
RV9TSVpFLCBFR0xfRE9OVF9DQVJFLAorICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdM
X1dJTkRPV19CSVQsCisgICAgICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTlZH
X0JJVCwKKyAgICAgICAgICAgIEVHTF9OT05FIH07CisKKyAgICAgICAgZWdsQ2hvb3NlQ29uZmln
KG1fZGlzcGxheSwgY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGNvbnN0IEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7CisgICAg
ICAgICAgICBFR0xfQ09ORklHX0lELCBtX3dpbmRvd0NvbmZpZ0lkLAorICAgICAgICAgICAgRUdM
X05PTkUgfTsKKworICAgICAgICBlZ2xDaG9vc2VDb25maWcobV9kaXNwbGF5LCBjb25maWdBdHRy
aWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgfQorCisgICAgQVNTRVJUX0VHTF9O
T19FUlJPUigpOworICAgIEFTU0VSVChudW1Db25maWdzID09IDEpOworICAgIHJldHVybiBjb25m
aWc7Cit9CisKK1N1cmZhY2VPcGVuVkcqIEVHTERpc3BsYXlPcGVuVkc6OnNoYXJlZFBsYXRmb3Jt
U3VyZmFjZSgpCit7CisgICAgaWYgKCFtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZSkgeworICAgICAg
ICAvLyBUaGUgc2hhcmVkIHN1cmZhY2UgZG9lc24ndCBuZWVkIHRvIGJlIGRyYXduIG9uLCBpdCBq
dXN0IGV4aXN0cyBzbworICAgICAgICAvLyB0aGF0IHdlIGNhbiBhbHdheXMgbWFrZSB0aGUgc2hh
cmVkIGNvbnRleHQgY3VycmVudCAod2hpY2ggaW4gdHVybiBpcworICAgICAgICAvLyB0aGUgb3du
ZXIgb2YgbG9uZy1saXZpbmcgcmVzb3VyY2VzIHN1Y2ggYXMgaW1hZ2VzLCBwYXRocyBhbmQgZm9u
dHMpLgorICAgICAgICAvLyBXZSdsbCBqdXN0IG1ha2UgdGhlIHNoYXJlZCBzdXJmYWNlIGFzIHNt
YWxsIGFzIHBvc3NpYmxlOiAxeDEgcGl4ZWwuCisgICAgICAgIEVHTENvbmZpZyBjb25maWcgPSBk
ZWZhdWx0UGJ1ZmZlckNvbmZpZygpOworICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBjcmVh
dGVQYnVmZmVyU3VyZmFjZShJbnRTaXplKDEsIDEpLCBjb25maWcpOworICAgICAgICBBU1NFUlRf
RUdMX05PX0VSUk9SKCk7CisKKyAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsQ3JlYXRl
Q29udGV4dChtX2Rpc3BsYXksIGNvbmZpZywgRUdMX05PX0NPTlRFWFQsIDApOworICAgICAgICBB
U1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgICAgIG1fY29udGV4dHMuc2V0KG1fc3VyZmFjZUNv
bmZpZ0lkcy5nZXQoc3VyZmFjZSksIGNvbnRleHQpOworCisgICAgICAgIG1fc2hhcmVkUGxhdGZv
cm1TdXJmYWNlID0gbmV3IFN1cmZhY2VPcGVuVkc7CisgICAgICAgIG1fc2hhcmVkUGxhdGZvcm1T
dXJmYWNlLT5tX2VnbERpc3BsYXkgPSBtX2Rpc3BsYXk7CisgICAgICAgIG1fc2hhcmVkUGxhdGZv
cm1TdXJmYWNlLT5tX2VnbFN1cmZhY2UgPSBzdXJmYWNlOworICAgICAgICBtX3NoYXJlZFBsYXRm
b3JtU3VyZmFjZS0+bV9lZ2xDb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgbV9wbGF0Zm9ybVN1
cmZhY2VzLnNldChzdXJmYWNlLCBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZSk7IC8vIGEuay5hLiBy
ZWdpc3RlclBsYXRmb3JtU3VyZmFjZSgpCisgICAgfQorICAgIHJldHVybiBtX3NoYXJlZFBsYXRm
b3JtU3VyZmFjZTsKK30KKworRUdMU3VyZmFjZSBFR0xEaXNwbGF5T3BlblZHOjpjcmVhdGVQYnVm
ZmVyU3VyZmFjZShjb25zdCBJbnRTaXplJiBzaXplLCBjb25zdCBFR0xDb25maWcmIGNvbmZpZykK
K3sKKyAgICBjb25zdCBFR0xpbnQgYXR0cmliTGlzdFtdID0geworICAgICAgICBFR0xfV0lEVEgs
IHNpemUud2lkdGgoKSwKKyAgICAgICAgRUdMX0hFSUdIVCwgc2l6ZS5oZWlnaHQoKSwKKyAgICAg
ICAgRUdMX05PTkUgfTsKKworICAgIEVHTFN1cmZhY2Ugc3VyZmFjZSA9IGVnbENyZWF0ZVBidWZm
ZXJTdXJmYWNlKG1fZGlzcGxheSwgY29uZmlnLCBhdHRyaWJMaXN0KTsKKyAgICBpZiAoZWdsR2V0
RXJyb3IoKSAhPSBFR0xfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIEVHTF9OT19TVVJGQUNFOwor
CisgICAgRUdMaW50IHN1cmZhY2VDb25maWdJZDsKKyAgICBFR0xCb29sZWFuIHN1Y2Nlc3MgPSBl
Z2xHZXRDb25maWdBdHRyaWIobV9kaXNwbGF5LCBjb25maWcsIEVHTF9DT05GSUdfSUQsICZzdXJm
YWNlQ29uZmlnSWQpOworICAgIEFTU0VSVChzdWNjZXNzID09IEVHTF9UUlVFKTsKKyAgICBBU1NF
UlQoc3VyZmFjZUNvbmZpZ0lkICE9IEVHTF9CQURfQVRUUklCVVRFKTsKKworICAgIEFTU0VSVCgh
bV9zdXJmYWNlQ29uZmlnSWRzLmNvbnRhaW5zKHN1cmZhY2UpKTsKKyAgICBtX3N1cmZhY2VDb25m
aWdJZHMuc2V0KHN1cmZhY2UsIHN1cmZhY2VDb25maWdJZCk7CisgICAgcmV0dXJuIHN1cmZhY2U7
Cit9CisKK0VHTFN1cmZhY2UgRUdMRGlzcGxheU9wZW5WRzo6c3VyZmFjZUZvcldpbmRvdyhFR0xO
YXRpdmVXaW5kb3dUeXBlIHdJZCwgY29uc3QgRUdMQ29uZmlnJiBjb25maWcpCit7CisgICAgaWYg
KG1fd2luZG93U3VyZmFjZXMuY29udGFpbnMod0lkKSkKKyAgICAgICAgcmV0dXJuIG1fd2luZG93
U3VyZmFjZXMuZ2V0KHdJZCk7CisKKyAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBlZ2xDcmVhdGVX
aW5kb3dTdXJmYWNlKG1fZGlzcGxheSwgY29uZmlnLCB3SWQsIDApOworICAgIEFTU0VSVF9FR0xf
Tk9fRVJST1IoKTsKKworICAgIEVHTGludCBzdXJmYWNlQ29uZmlnSWQ7CisgICAgRUdMQm9vbGVh
biBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1fZGlzcGxheSwgY29uZmlnLCBFR0xfQ09O
RklHX0lELCAmc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICBBU1NFUlQoc3VjY2VzcyA9PSBFR0xfVFJV
RSk7CisgICAgQVNTRVJUKHN1cmZhY2VDb25maWdJZCAhPSBFR0xfQkFEX0FUVFJJQlVURSk7CisK
KyAgICBBU1NFUlQoIW1fc3VyZmFjZUNvbmZpZ0lkcy5jb250YWlucyhzdXJmYWNlKSk7CisgICAg
bV9zdXJmYWNlQ29uZmlnSWRzLnNldChzdXJmYWNlLCBzdXJmYWNlQ29uZmlnSWQpOworICAgIHJl
dHVybiBzdXJmYWNlOworfQorCitib29sIEVHTERpc3BsYXlPcGVuVkc6OnN1cmZhY2VzQ29tcGF0
aWJsZShjb25zdCBFR0xTdXJmYWNlJiBzdXJmYWNlLCBjb25zdCBFR0xTdXJmYWNlJiBvdGhlclN1
cmZhY2UpCit7CisgICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UgfHwgb3RoZXJTdXJm
YWNlID09IEVHTF9OT19TVVJGQUNFKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBD
dXJyZW50bHksIHdlIGFzc3VtZSB0aGF0IGFsbCBzdXJmYWNlcyBrbm93biB0byB0aGlzIG9iamVj
dCBhcmUKKyAgICAvLyBjb250ZXh0LWNvbXBhdGlibGUgdG8gZWFjaCBvdGhlciAod2hpY2ggaXMg
cmVhc29uYWJsZSB0byBhc3N1bWUsCisgICAgLy8gb3RoZXJ3aXNlIGVnbENyZWF0ZUNvbnRleHQo
KSB3b3VsZCBmYWlsIHdpdGggRUdMX0JBRF9NQVRDSCBmb3Igc2hhcmVkCisgICAgLy8gY29udGV4
dCBjb21wYXRpYmlsaXR5IGFueXdheXMuCisgICAgcmV0dXJuIG1fc3VyZmFjZUNvbmZpZ0lkcy5j
b250YWlucyhzdXJmYWNlKSAmJiBtX3N1cmZhY2VDb25maWdJZHMuY29udGFpbnMob3RoZXJTdXJm
YWNlKTsKK30KKwordm9pZCBFR0xEaXNwbGF5T3BlblZHOjpkZXN0cm95U3VyZmFjZShjb25zdCBF
R0xTdXJmYWNlJiBzdXJmYWNlKQoreworICAgIEFTU0VSVChzdXJmYWNlICE9IEVHTF9OT19TVVJG
QUNFKTsKKworICAgIGlmIChlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVykgPT0gc3VyZmFj
ZSkgeworICAgICAgICBlZ2xNYWtlQ3VycmVudChtX2Rpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBF
R0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VS
Uk9SKCk7CisgICAgfQorCisgICAgLy8gRGVzdHJveSB0aGUgY29udGV4dCBhc3NvY2lhdGVkIHRv
IHRoZSBzdXJmYWNlLCBpZiB3ZSBhbHJlYWR5IGNyZWF0ZWQgb25lLgorICAgIGlmIChtX3N1cmZh
Y2VDb25maWdJZHMuY29udGFpbnMoc3VyZmFjZSkpIHsKKyAgICAgICAgRUdMaW50IHN1cmZhY2VD
b25maWdJZCA9IG1fc3VyZmFjZUNvbmZpZ0lkcy50YWtlKHN1cmZhY2UpOyAvLyB0YWtlID0gZ2V0
IGFuZCByZW1vdmUKKyAgICAgICAgYm9vbCBpc0NvbnRleHRSZWZlcmVuY2VkID0gZmFsc2U7CisK
KyAgICAgICAgaWYgKG1fY29tcGF0aWJsZUNvbmZpZ0lkcy5jb250YWlucyhzdXJmYWNlQ29uZmln
SWQpKQorICAgICAgICAgICAgc3VyZmFjZUNvbmZpZ0lkID0gbV9jb21wYXRpYmxlQ29uZmlnSWRz
LmdldChzdXJmYWNlQ29uZmlnSWQpOworCisgICAgICAgIEhhc2hNYXA8RUdMU3VyZmFjZSwgRUdM
aW50Pjo6aXRlcmF0b3IgZW5kID0gbV9zdXJmYWNlQ29uZmlnSWRzLmVuZCgpOworCisgICAgICAg
IC8vIC4uLmJ1dCBvbmx5IGlmIHRoZXJlJ3Mgbm8gb3RoZXIgc3VyZmFjZXMgYXNzb2NpYXRlZCB0
byB0aGF0IGNvbnRleHQuCisgICAgICAgIGZvciAoSGFzaE1hcDxFR0xTdXJmYWNlLCBFR0xpbnQ+
OjppdGVyYXRvciBpdCA9IG1fc3VyZmFjZUNvbmZpZ0lkcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKKyAgICAgICAgICAgIGlmICgoKml0KS5zZWNvbmQgPT0gc3VyZmFjZUNvbmZpZ0lkKSB7
CisgICAgICAgICAgICAgICAgaXNDb250ZXh0UmVmZXJlbmNlZCA9IHRydWU7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc0Nv
bnRleHRSZWZlcmVuY2VkICYmIG1fY29udGV4dHMuY29udGFpbnMoc3VyZmFjZUNvbmZpZ0lkKSkg
eworICAgICAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gbV9jb250ZXh0cy50YWtlKHN1cmZh
Y2VDb25maWdJZCk7CisgICAgICAgICAgICBlZ2xEZXN0cm95Q29udGV4dChtX2Rpc3BsYXksIGNv
bnRleHQpOworICAgICAgICAgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgbV9wbGF0Zm9ybVN1cmZhY2VzLnJlbW92ZShzdXJmYWNlKTsKKworICAgIEhh
c2hNYXA8RUdMTmF0aXZlV2luZG93VHlwZSwgRUdMU3VyZmFjZT46Oml0ZXJhdG9yIGVuZCA9IG1f
d2luZG93U3VyZmFjZXMuZW5kKCk7CisgICAgZm9yIChIYXNoTWFwPEVHTE5hdGl2ZVdpbmRvd1R5
cGUsIEVHTFN1cmZhY2U+OjppdGVyYXRvciBpdCA9IG1fd2luZG93U3VyZmFjZXMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0KS5zZWNvbmQgPT0gc3VyZmFjZSkg
eworICAgICAgICAgICAgbV93aW5kb3dTdXJmYWNlcy5yZW1vdmUoaXQpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlZ2xEZXN0cm95U3VyZmFjZShtX2Rpc3Bs
YXksIHN1cmZhY2UpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKK30KKworRUdMQ29udGV4
dCBFR0xEaXNwbGF5T3BlblZHOjpjb250ZXh0Rm9yU3VyZmFjZShjb25zdCBFR0xTdXJmYWNlJiBz
dXJmYWNlKQoreworICAgIEFTU0VSVChzdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKTsKKworICAg
IGlmIChtX3BsYXRmb3JtU3VyZmFjZXMuY29udGFpbnMoc3VyZmFjZSkpCisgICAgICAgIHJldHVy
biBtX3BsYXRmb3JtU3VyZmFjZXMuZ2V0KHN1cmZhY2UpLT5lZ2xDb250ZXh0KCk7CisKKyAgICBl
Z2xCaW5kQVBJKEVHTF9PUEVOVkdfQVBJKTsKKyAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisK
KyAgICBFR0xpbnQgc3VyZmFjZUNvbmZpZ0lkOworCisgICAgaWYgKG1fc3VyZmFjZUNvbmZpZ0lk
cy5jb250YWlucyhzdXJmYWNlKSkKKyAgICAgICAgc3VyZmFjZUNvbmZpZ0lkID0gbV9zdXJmYWNl
Q29uZmlnSWRzLmdldChzdXJmYWNlKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gUmV0cmlldmUg
dGhlIHNhbWUgRUdMIGNvbmZpZyBmb3IgY29udGV4dCBjcmVhdGlvbiB0aGF0IHdhcyB1c2VkIHRv
CisgICAgICAgIC8vIGNyZWF0ZSB0aGUgdGhlIEVHTCBzdXJmYWNlLgorICAgICAgICBFR0xCb29s
ZWFuIHN1Y2Nlc3MgPSBlZ2xRdWVyeVN1cmZhY2UobV9kaXNwbGF5LCBzdXJmYWNlLCBFR0xfQ09O
RklHX0lELCAmc3VyZmFjZUNvbmZpZ0lkKTsKKyAgICAgICAgQVNTRVJUKHN1Y2Nlc3MgPT0gRUdM
X1RSVUUpOworICAgICAgICBBU1NFUlQoc3VyZmFjZUNvbmZpZ0lkICE9IEVHTF9CQURfQVRUUklC
VVRFKTsKKworICAgICAgICBtX3N1cmZhY2VDb25maWdJZHMuc2V0KHN1cmZhY2UsIHN1cmZhY2VD
b25maWdJZCk7CisgICAgfQorCisgICAgaWYgKG1fY29tcGF0aWJsZUNvbmZpZ0lkcy5jb250YWlu
cyhzdXJmYWNlQ29uZmlnSWQpKQorICAgICAgICBzdXJmYWNlQ29uZmlnSWQgPSBtX2NvbXBhdGli
bGVDb25maWdJZHMuZ2V0KHN1cmZhY2VDb25maWdJZCk7CisKKyAgICBpZiAobV9jb250ZXh0cy5j
b250YWlucyhzdXJmYWNlQ29uZmlnSWQpKQorICAgICAgICByZXR1cm4gbV9jb250ZXh0cy5nZXQo
c3VyZmFjZUNvbmZpZ0lkKTsKKworICAgIGlmICghbV9zaGFyZWRQbGF0Zm9ybVN1cmZhY2UpIC8v
IHNoYXJlZCBjb250ZXh0IGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAgICBzaGFyZWRQ
bGF0Zm9ybVN1cmZhY2UoKTsgLy8gY3JlYXRlcyB0aGUgc2hhcmVkIHN1cmZhY2UgJiBjb250ZXh0
CisKKyAgICBFR0xEaXNwbGF5IGN1cnJlbnREaXNwbGF5ID0gZWdsR2V0Q3VycmVudERpc3BsYXko
KTsKKyAgICBFR0xTdXJmYWNlIGN1cnJlbnRSZWFkU3VyZmFjZSA9IGVnbEdldEN1cnJlbnRTdXJm
YWNlKEVHTF9SRUFEKTsKKyAgICBFR0xTdXJmYWNlIGN1cnJlbnREcmF3U3VyZmFjZSA9IGVnbEdl
dEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKKyAgICBFR0xDb250ZXh0IGN1cnJlbnRDb250ZXh0
ID0gZWdsR2V0Q3VycmVudENvbnRleHQoKTsKKworICAgIC8vIEJlZm9yZSBjcmVhdGluZyBhIG5l
dyBjb250ZXh0LCBsZXQncyB0cnkgd2hldGhlciBhbiBleGlzdGluZyBvbmUKKyAgICAvLyBpcyBj
b21wYXRpYmxlIHdpdGggdGhlIHN1cmZhY2UuIEVHTCBkb2Vzbid0IGdpdmUgdXMgYSBkaWZmZXJl
bnQgd2F5CisgICAgLy8gdG8gY2hlY2sgY29udGV4dC9zdXJmYWNlIGNvbXBhdGliaWxpdHkgdGhh
biB0cnlpbmcgaXQgb3V0LCBzbyBsZXQncworICAgIC8vIGRvIGp1c3QgdGhhdC4KKyAgICBIYXNo
TWFwPEVHTGludCwgRUdMQ29udGV4dD46Oml0ZXJhdG9yIGVuZCA9IG1fY29udGV4dHMuZW5kKCk7
CisKKyAgICBmb3IgKEhhc2hNYXA8RUdMaW50LCBFR0xDb250ZXh0Pjo6aXRlcmF0b3IgaXQgPSBt
X2NvbnRleHRzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBlZ2xNYWtlQ3Vy
cmVudChtX2Rpc3BsYXksIHN1cmZhY2UsIHN1cmZhY2UsICgqaXQpLnNlY29uZCk7CisgICAgICAg
IGlmIChlZ2xHZXRFcnJvcigpID09IEVHTF9TVUNDRVNTKSB7CisgICAgICAgICAgICAvLyBSZXN0
b3JlIHByZXZpb3VzIHN1cmZhY2UvY29udGV4dC4KKyAgICAgICAgICAgIGlmIChjdXJyZW50Q29u
dGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgeworICAgICAgICAgICAgICAgIGVnbE1ha2VDdXJyZW50
KGN1cnJlbnREaXNwbGF5LCBjdXJyZW50UmVhZFN1cmZhY2UsIGN1cnJlbnREcmF3U3VyZmFjZSwg
Y3VycmVudENvbnRleHQpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvb2wsIHN1cmZhY2UgaXMgY29tcGF0aWJs
ZSB0byBvbmUgb2Ygb3VyIGV4aXN0aW5nIGNvbnRleHRzLgorICAgICAgICAgICAgbV9jb21wYXRp
YmxlQ29uZmlnSWRzLnNldChzdXJmYWNlQ29uZmlnSWQsICgqaXQpLmZpcnN0KTsKKyAgICAgICAg
ICAgIHJldHVybiAoKml0KS5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gUmVzdG9y
ZSBwcmV2aW91cyBzdXJmYWNlL2NvbnRleHQuCisgICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IEVH
TF9OT19DT05URVhUKSB7CisgICAgICAgIGVnbE1ha2VDdXJyZW50KGN1cnJlbnREaXNwbGF5LCBj
dXJyZW50UmVhZFN1cmZhY2UsIGN1cnJlbnREcmF3U3VyZmFjZSwgY3VycmVudENvbnRleHQpOwor
ICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgfQorCisgICAgRUdMQ29uZmlnIGNv
bmZpZzsKKyAgICBFR0xpbnQgbnVtQ29uZmlnczsKKworICAgIGNvbnN0IEVHTGludCBjb25maWdB
dHRyaWJzW10gPSB7CisgICAgICAgIEVHTF9DT05GSUdfSUQsIHN1cmZhY2VDb25maWdJZCwKKyAg
ICAgICAgRUdMX05PTkUgfTsKKworICAgIGVnbENob29zZUNvbmZpZyhtX2Rpc3BsYXksIGNvbmZp
Z0F0dHJpYnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKKyAgICBBU1NFUlRfRUdMX05PX0VS
Uk9SKCk7CisgICAgQVNTRVJUKG51bUNvbmZpZ3MgPT0gMSk7CisKKyAgICAvLyBXZSBzaGFyZSBh
bGwgb2YgdGhlIGltYWdlcyBhbmQgcGF0aHMgYW1vbmdzdCB0aGUgZGlmZmVyZW50IGNvbnRleHRz
LAorICAgIC8vIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBpbiBhbGwgb2YgdGhlbS4gUmVzb3Vy
Y2VzIHRoYXQgYXJlIGNyZWF0ZWQKKyAgICAvLyB3aGlsZSBtX3NoYXJlZFBsYXRmb3JtU3VyZmFj
ZS0+Y29udGV4dCgpIGlzIGN1cnJlbnQgd2lsbCBiZQorICAgIC8vIGFjY2Vzc2libGUgZnJvbSBh
bGwgb3RoZXIgY29udGV4dHMsIGJ1dCBhcmUgbm90IHJlc3RyaWN0ZWQgdG8gdGhlCisgICAgLy8g
bGlmZXRpbWUgb2YgdGhvc2UgY29udGV4dHMuCisgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWds
Q3JlYXRlQ29udGV4dChtX2Rpc3BsYXksIGNvbmZpZywgbV9zaGFyZWRQbGF0Zm9ybVN1cmZhY2Ut
PmVnbENvbnRleHQoKSwgMCk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAgQVNT
RVJUKCFtX2NvbnRleHRzLmNvbnRhaW5zKHN1cmZhY2VDb25maWdJZCkpOworICAgIG1fY29udGV4
dHMuc2V0KHN1cmZhY2VDb25maWdJZCwgY29udGV4dCk7CisgICAgcmV0dXJuIGNvbnRleHQ7Cit9
CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTERp
c3BsYXlPcGVuVkcuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL0VHTERpc3Bs
YXlPcGVuVkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZmODVhCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdMRGlz
cGxheU9wZW5WRy5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2Vh
cmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDktMjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lm
bmRlZiBFR0xEaXNwbGF5T3BlblZHX2gKKyNkZWZpbmUgRUdMRGlzcGxheU9wZW5WR19oCisKKyNp
bmNsdWRlIDxlZ2wuaD4KKyNpbmNsdWRlIDxvcGVudmcuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFNpemU7CitjbGFzcyBTdXJm
YWNlT3BlblZHOworCitjbGFzcyBFR0xEaXNwbGF5T3BlblZHIHsKK3B1YmxpYzoKKyAgICBmcmll
bmQgY2xhc3MgU3VyZmFjZU9wZW5WRzsKKworICAgIHN0YXRpYyBTdXJmYWNlT3BlblZHKiBjdXJy
ZW50U3VyZmFjZSgpOworICAgIHN0YXRpYyB2b2lkIHNldEN1cnJlbnREaXNwbGF5KGNvbnN0IEVH
TERpc3BsYXkmKTsKKyAgICBzdGF0aWMgRUdMRGlzcGxheU9wZW5WRyogY3VycmVudCgpOworICAg
IHN0YXRpYyBFR0xEaXNwbGF5T3BlblZHKiBmb3JEaXNwbGF5KGNvbnN0IEVHTERpc3BsYXkmKTsK
KworICAgIHZvaWQgc2V0RGVmYXVsdFBidWZmZXJDb25maWcoY29uc3QgRUdMQ29uZmlnJik7Cisg
ICAgRUdMQ29uZmlnIGRlZmF1bHRQYnVmZmVyQ29uZmlnKCk7CisgICAgdm9pZCBzZXREZWZhdWx0
V2luZG93Q29uZmlnKGNvbnN0IEVHTENvbmZpZyYpOworICAgIEVHTENvbmZpZyBkZWZhdWx0V2lu
ZG93Q29uZmlnKCk7CisKKyAgICBFR0xEaXNwbGF5IGRpc3BsYXkoKSBjb25zdCB7IHJldHVybiBt
X2Rpc3BsYXk7IH0KKyAgICBTdXJmYWNlT3BlblZHKiBzaGFyZWRQbGF0Zm9ybVN1cmZhY2UoKTsK
KworICAgIC8qKiBDcmVhdGVzIGEgcGJ1ZmZlciBzdXJmYWNlIHVzaW5nIHRoZSBnaXZlbiBjb25m
aWcuIElmIG5vIHN1cmZhY2UKKyAgICAgKiBjb3VsZCBiZSBjcmVhdGVkLCBFR0xfTk9fU1VSRkFD
RSBpcyByZXR1cm5lZCBhbmQgZXJyb3JzIGNhbiBiZQorICAgICAqIGNhdWdodCB3aXRoIGVnbEdl
dEVycm9yKCkgKHJlc3BlY3RpdmVseSBBU1NFUlRfRUdMX05PX0VSUk9SKCkpLiAqLworICAgIEVH
TFN1cmZhY2UgY3JlYXRlUGJ1ZmZlclN1cmZhY2UoY29uc3QgSW50U2l6ZSYgc2l6ZSwgY29uc3Qg
RUdMQ29uZmlnJiBjb25maWcpOworCisgICAgRUdMU3VyZmFjZSBzdXJmYWNlRm9yV2luZG93KEVH
TE5hdGl2ZVdpbmRvd1R5cGUgd0lkLCBjb25zdCBFR0xDb25maWcmIGNvbmZpZyk7CisKKyAgICBi
b29sIHN1cmZhY2VzQ29tcGF0aWJsZShjb25zdCBFR0xTdXJmYWNlJiBzdXJmYWNlLCBjb25zdCBF
R0xTdXJmYWNlJiBvdGhlclN1cmZhY2UpOworCisgICAgLyoqIERlc3Ryb3kgdGhlIHN1cmZhY2Ug
YW5kIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRleHQgKHVubGVzcyBhbm90aGVyCisgICAgICogc3Vy
ZmFjZSBpcyBzdGlsbCB1c2luZyB0aGUgc2FtZSBjb250ZXh0LCBpbiB3aGljaCBjYXNlIHRoZSBj
b250ZXh0CisgICAgICogaXMgbm90IGRlc3Ryb3llZCkuICovCisgICAgdm9pZCBkZXN0cm95U3Vy
ZmFjZShjb25zdCBFR0xTdXJmYWNlJik7CisKKyAgICAvKiogUmV0dXJuIHRoZSBjb250ZXh0IGNv
cnJlc3BvbmRpbmcgdG8gdGhlIHN1cmZhY2UuCisgICAgICogSWYgbm8gY29ycmVzcG9uZGluZyBj
b250ZXh0IGV4aXN0cywgb25lIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gKi8KKyAgICBFR0xD
b250ZXh0IGNvbnRleHRGb3JTdXJmYWNlKGNvbnN0IEVHTFN1cmZhY2UmKTsKKworcHJpdmF0ZToK
KyAgICBzdGF0aWMgdm9pZCByZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZHKik7
CisgICAgc3RhdGljIHZvaWQgdW5yZWdpc3RlclBsYXRmb3JtU3VyZmFjZShTdXJmYWNlT3BlblZH
Kik7CisKKyAgICBFR0xEaXNwbGF5T3BlblZHKGNvbnN0IEVHTERpc3BsYXkmIGRpc3BsYXkpOwor
ICAgIH5FR0xEaXNwbGF5T3BlblZHKCk7CisKKyAgICBFR0xEaXNwbGF5IG1fZGlzcGxheTsKKyAg
ICBTdXJmYWNlT3BlblZHKiBtX3NoYXJlZFBsYXRmb3JtU3VyZmFjZTsKKyAgICBFR0xpbnQgbV9w
YnVmZmVyQ29uZmlnSWQ7CisgICAgRUdMaW50IG1fd2luZG93Q29uZmlnSWQ7CisKKyAgICBXVEY6
Okhhc2hNYXA8RUdMU3VyZmFjZSwgU3VyZmFjZU9wZW5WRyo+IG1fcGxhdGZvcm1TdXJmYWNlczsK
KyAgICBXVEY6Okhhc2hNYXA8RUdMTmF0aXZlV2luZG93VHlwZSwgRUdMU3VyZmFjZT4gbV93aW5k
b3dTdXJmYWNlczsKKyAgICBXVEY6Okhhc2hNYXA8RUdMU3VyZmFjZSwgRUdMaW50PiBtX3N1cmZh
Y2VDb25maWdJZHM7CisgICAgV1RGOjpIYXNoTWFwPEVHTGludCwgRUdMaW50PiBtX2NvbXBhdGli
bGVDb25maWdJZHM7CisgICAgV1RGOjpIYXNoTWFwPEVHTGludCwgRUdMQ29udGV4dD4gbV9jb250
ZXh0czsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL29wZW52Zy9FR0xVdGlscy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVu
dmcvRUdMVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGUzMThl
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvRUdM
VXRpbHMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJ
biBNb3Rpb24gTGltaXRlZCAyMDA5LTIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYg
RUdMVXRpbHNfaAorI2RlZmluZSBFR0xVdGlsc19oCisKKyNpbmNsdWRlIDxlZ2wuaD4KKyNpbmNs
dWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHRvRUdM
RXJyb3JDb25zdGFudChFR0xpbnQgZXJyb3IpCit7CisgICAgc3dpdGNoIChlcnJvcikgeworICAg
IGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDoKKyAgICAgICAgcmV0dXJuICJFR0xfTk9UX0lOSVRJ
QUxJWkVEIjsKKyAgICBjYXNlIEVHTF9CQURfQUNDRVNTOgorICAgICAgICByZXR1cm4gIkVHTF9C
QURfQUNDRVNTIjsKKyAgICBjYXNlIEVHTF9CQURfQUxMT0M6CisgICAgICAgIHJldHVybiAiRUdM
X0JBRF9BTExPQyI7CisgICAgY2FzZSBFR0xfQkFEX0FUVFJJQlVURToKKyAgICAgICAgcmV0dXJu
ICJFR0xfQkFEX0FUVFJJQlVURSI7CisgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6CisgICAgICAg
IHJldHVybiAiRUdMX0JBRF9DT05URVhUIjsKKyAgICBjYXNlIEVHTF9CQURfQ09ORklHOgorICAg
ICAgICByZXR1cm4gIkVHTF9CQURfQ09ORklHIjsKKyAgICBjYXNlIEVHTF9CQURfQ1VSUkVOVF9T
VVJGQUNFOgorICAgICAgICByZXR1cm4gIkVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFIjsKKyAgICBj
YXNlIEVHTF9CQURfRElTUExBWToKKyAgICAgICAgcmV0dXJuICJFR0xfQkFEX0RJU1BMQVkiOwor
ICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOgorICAgICAgICByZXR1cm4gIkVHTF9CQURfU1VSRkFD
RSI7CisgICAgY2FzZSBFR0xfQkFEX01BVENIOgorICAgICAgICByZXR1cm4gIkVHTF9CQURfTUFU
Q0giOworICAgIGNhc2UgRUdMX0JBRF9QQVJBTUVURVI6CisgICAgICAgIHJldHVybiAiRUdMX0JB
RF9QQVJBTUVURVIiOworICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfUElYTUFQOgorICAgICAgICBy
ZXR1cm4gIkVHTF9CQURfTkFUSVZFX1BJWE1BUCI7CisgICAgY2FzZSBFR0xfQkFEX05BVElWRV9X
SU5ET1c6CisgICAgICAgIHJldHVybiAiRUdMX0JBRF9OQVRJVkVfV0lORE9XIjsKKyAgICBjYXNl
IEVHTF9DT05URVhUX0xPU1Q6CisgICAgICAgIHJldHVybiAiRUdMX0NPTlRFWFRfTE9TVCI7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVTktOT1dOX0VSUk9SIjsKKyAgICB9Cit9CisK
KyNpZiBBU1NFUlRfRElTQUJMRUQKKyNkZWZpbmUgQVNTRVJUX0VHTF9OT19FUlJPUigpICgodm9p
ZCkwKQorI2Vsc2UKKyNkZWZpbmUgQVNTRVJUX0VHTF9OT19FUlJPUigpIFwKKyAgICBBU1NFUlRf
V0lUSF9NRVNTQUdFKGVnbEdldEVycm9yKCkgPT0gVkdfTk9fRVJST1IsICJGb3VuZCAlcyIsIHRv
RUdMRXJyb3JDb25zdGFudChlZ2xHZXRFcnJvcigpKSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5WRy5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhOGY5MQotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuY3BwCkBA
IC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24g
TGltaXRlZCAyMDA5LTIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJTdXJmYWNlT3BlblZHLmgiCisKKyNpbmNsdWRlICJJbnRTaXplLmgiCisj
aW5jbHVkZSAiUGFpbnRlck9wZW5WRy5oIgorCisjaWYgUExBVEZPUk0oRUdMKQorI2luY2x1ZGUg
IkVHTERpc3BsYXlPcGVuVkcuaCIKKyNpbmNsdWRlICJFR0xVdGlscy5oIgorI2VuZGlmCisKKyNp
bmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJhbS5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1N1cmZhY2VPcGVuVkcqIFN1cmZhY2VPcGVuVkc6OmN1
cnJlbnRTdXJmYWNlKCkKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgcmV0dXJuIEVHTERpc3Bs
YXlPcGVuVkc6OmN1cnJlbnRTdXJmYWNlKCk7CisjZWxzZQorICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKKyNpZiBQTEFURk9STShFR0wpCitTdXJm
YWNlT3BlblZHOjpTdXJmYWNlT3BlblZHKGNvbnN0IEludFNpemUmIHNpemUsIGNvbnN0IEVHTERp
c3BsYXkmIGRpc3BsYXksIEVHTENvbmZpZyogY29uZlB0cikKKyAgICA6IG1fZWdsRGlzcGxheShk
aXNwbGF5KQorICAgICwgbV9lZ2xTdXJmYWNlKEVHTF9OT19TVVJGQUNFKQorICAgICwgbV9lZ2xD
b250ZXh0KEVHTF9OT19DT05URVhUKQoreworICAgIEFTU0VSVChtX2VnbERpc3BsYXkgIT0gRUdM
X05PX0RJU1BMQVkpOworCisgICAgRUdMRGlzcGxheU9wZW5WRyogZGlzcGxheU1hbmFnZXIgPSBF
R0xEaXNwbGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlzcGxheSk7CisgICAgRUdMQ29uZmln
IGNvbmZpZyA9IGNvbmZQdHIgPyAoKmNvbmZQdHIpIDogZGlzcGxheU1hbmFnZXItPmRlZmF1bHRQ
YnVmZmVyQ29uZmlnKCk7CisgICAgbV9lZ2xTdXJmYWNlID0gZGlzcGxheU1hbmFnZXItPmNyZWF0
ZVBidWZmZXJTdXJmYWNlKHNpemUsIGNvbmZpZyk7CisKKyAgICBpZiAobV9lZ2xTdXJmYWNlID09
IEVHTF9OT19TVVJGQUNFKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2VnbENvbnRleHQgPSBk
aXNwbGF5TWFuYWdlci0+Y29udGV4dEZvclN1cmZhY2UobV9lZ2xTdXJmYWNlKTsKKyAgICBFR0xE
aXNwbGF5T3BlblZHOjpyZWdpc3RlclBsYXRmb3JtU3VyZmFjZSh0aGlzKTsKK30KKworU3VyZmFj
ZU9wZW5WRzo6U3VyZmFjZU9wZW5WRyhFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3Qg
RUdMRGlzcGxheSYgZGlzcGxheSwgRUdMQ29uZmlnKiBjb25mUHRyKQorICAgIDogbV9lZ2xEaXNw
bGF5KGRpc3BsYXkpCisgICAgLCBtX2VnbFN1cmZhY2UoRUdMX05PX1NVUkZBQ0UpCisgICAgLCBt
X2VnbENvbnRleHQoRUdMX05PX0NPTlRFWFQpCit7CisgICAgQVNTRVJUKG1fZWdsRGlzcGxheSAh
PSBFR0xfTk9fRElTUExBWSk7CisKKyAgICBFR0xEaXNwbGF5T3BlblZHKiBkaXNwbGF5TWFuYWdl
ciA9IEVHTERpc3BsYXlPcGVuVkc6OmZvckRpc3BsYXkobV9lZ2xEaXNwbGF5KTsKKyAgICBFR0xD
b25maWcgY29uZmlnID0gY29uZlB0ciA/ICgqY29uZlB0cikgOiBkaXNwbGF5TWFuYWdlci0+ZGVm
YXVsdFdpbmRvd0NvbmZpZygpOworICAgIG1fZWdsU3VyZmFjZSA9IGRpc3BsYXlNYW5hZ2VyLT5z
dXJmYWNlRm9yV2luZG93KHdpbmRvdywgY29uZmlnKTsKKworICAgIGlmIChtX2VnbFN1cmZhY2Ug
PT0gRUdMX05PX1NVUkZBQ0UpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZWdsQ29udGV4dCA9
IGRpc3BsYXlNYW5hZ2VyLT5jb250ZXh0Rm9yU3VyZmFjZShtX2VnbFN1cmZhY2UpOworICAgIEVH
TERpc3BsYXlPcGVuVkc6OnJlZ2lzdGVyUGxhdGZvcm1TdXJmYWNlKHRoaXMpOworfQorCisvLyBD
b25zdHJ1Y3RvciBvbmx5IGFjY2Vzc2libGUgdG8gRUdMRGlzcGxheU9wZW5WRyBmb3Igc2hhcmVk
IGNvbnRleHQKKy8vIGluaXRpYWxpemF0aW9uLiBUaGUgcGFyYW1ldGVyIHR5cGVzIG1pZ2h0IGRl
ZmluZSB0byB2b2lkKiBsaWtlIGluIHRoZQorLy8gd2luZG93IHN1cmZhY2UgY29uc3RydWN0b3Is
IHNvIGl0IGNhbid0IGJlIG92ZXJsb2FkZWQgd2l0aCBhbGwgdGhlIHJlcXVpcmVkCisvLyBhcmd1
bWVudHMgYW5kIEVHTERpc3BsYXlPcGVuVkcgYmFzaWNhbGx5IGltcGxlbWVudHMgdGhlIGNvbnN0
cnVjdG9yCisvLyBieSBpdHNlbGYuCitTdXJmYWNlT3BlblZHOjpTdXJmYWNlT3BlblZHKCkKKyAg
ICA6IG1fZWdsRGlzcGxheShFR0xfTk9fRElTUExBWSkKKyAgICAsIG1fZWdsU3VyZmFjZShFR0xf
Tk9fU1VSRkFDRSkKKyAgICAsIG1fZWdsQ29udGV4dChFR0xfTk9fQ09OVEVYVCkKK3sKK30KKyNl
bmRpZgorCitTdXJmYWNlT3BlblZHOjp+U3VyZmFjZU9wZW5WRygpCit7CisgICAgaWYgKCFpc1Zh
bGlkKCkpCisgICAgICAgIHJldHVybjsKKworI2lmIFBMQVRGT1JNKEVHTCkKKyAgICBFR0xEaXNw
bGF5T3BlblZHOjpmb3JEaXNwbGF5KG1fZWdsRGlzcGxheSktPmRlc3Ryb3lTdXJmYWNlKG1fZWds
U3VyZmFjZSk7CisgICAgRUdMRGlzcGxheU9wZW5WRzo6dW5yZWdpc3RlclBsYXRmb3JtU3VyZmFj
ZSh0aGlzKTsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisjZW5kaWYKK30KKwor
Ym9vbCBTdXJmYWNlT3BlblZHOjppc1ZhbGlkKCkgY29uc3QKK3sKKyNpZiBQTEFURk9STShFR0wp
CisgICAgcmV0dXJuIChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpOworI2Vsc2UKKyAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwor
aW50IFN1cmZhY2VPcGVuVkc6OndpZHRoKCkgY29uc3QKK3sKKyNpZiBQTEFURk9STShFR0wpCisg
ICAgQVNTRVJUKG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisKKyAgICBFR0xpbnQg
d2lkdGg7CisgICAgZWdsUXVlcnlTdXJmYWNlKG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNlLCBF
R0xfV0lEVEgsICZ3aWR0aCk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIHJldHVy
biB3aWR0aDsKKyNlbHNlCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7
CisjZW5kaWYKK30KKworaW50IFN1cmZhY2VPcGVuVkc6OmhlaWdodCgpIGNvbnN0Cit7CisjaWYg
UExBVEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2VnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0Up
OworCisgICAgRUdMaW50IGhlaWdodDsKKyAgICBlZ2xRdWVyeVN1cmZhY2UobV9lZ2xEaXNwbGF5
LCBtX2VnbFN1cmZhY2UsIEVHTF9IRUlHSFQsICZoZWlnaHQpOworICAgIEFTU0VSVF9FR0xfTk9f
RVJST1IoKTsKKyAgICByZXR1cm4gaGVpZ2h0OworI2Vsc2UKKyAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitTdXJmYWNlT3BlblZHKiBTdXJmYWNl
T3BlblZHOjpzaGFyZWRTdXJmYWNlKCkgY29uc3QKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAg
QVNTRVJUKG1fZWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSk7CisgICAgcmV0dXJuIEVHTERp
c3BsYXlPcGVuVkc6OmZvckRpc3BsYXkobV9lZ2xEaXNwbGF5KS0+c2hhcmVkUGxhdGZvcm1TdXJm
YWNlKCk7CisjZWxzZQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOwor
I2VuZGlmCit9CisKK3ZvaWQgU3VyZmFjZU9wZW5WRzo6bWFrZUN1cnJlbnQoTWFrZUN1cnJlbnRN
b2RlIG1vZGUpCit7CisjaWYgUExBVEZPUk0oRUdMKQorICAgIEFTU0VSVChtX2VnbFN1cmZhY2Ug
IT0gRUdMX05PX1NVUkZBQ0UpOworCisgICAgZWdsQmluZEFQSShFR0xfT1BFTlZHX0FQSSk7Cisg
ICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworICAgIEVHTFN1cmZhY2UgY3VycmVudFN1cmZhY2Ug
PSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xfRFJBVyk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJP
UigpOworCisgICAgaWYgKGN1cnJlbnRTdXJmYWNlICE9IG1fZWdsU3VyZmFjZSkgeworICAgICAg
ICBlZ2xNYWtlQ3VycmVudChtX2VnbERpc3BsYXksIG1fZWdsU3VyZmFjZSwgbV9lZ2xTdXJmYWNl
LCBtX2VnbENvbnRleHQpOworICAgICAgICBBU1NFUlRfRUdMX05PX0VSUk9SKCk7CisgICAgfQor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0obW9kZSk7CisjZW5kaWYKK30KKwordm9pZCBTdXJmYWNl
T3BlblZHOjptYWtlQ29tcGF0aWJsZUN1cnJlbnQoKQoreworI2lmIFBMQVRGT1JNKEVHTCkKKyAg
ICBBU1NFUlQobV9lZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKTsKKworICAgIGVnbEJpbmRB
UEkoRUdMX09QRU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKyAgICBFR0xT
dXJmYWNlIGN1cnJlbnRTdXJmYWNlID0gZWdsR2V0Q3VycmVudFN1cmZhY2UoRUdMX0RSQVcpOwor
ICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIGlmIChjdXJyZW50U3VyZmFjZSAhPSBt
X2VnbFN1cmZhY2UKKyAgICAgICAgJiYgIUVHTERpc3BsYXlPcGVuVkc6OmZvckRpc3BsYXkobV9l
Z2xEaXNwbGF5KS0+c3VyZmFjZXNDb21wYXRpYmxlKGN1cnJlbnRTdXJmYWNlLCBtX2VnbFN1cmZh
Y2UpKSB7CisgICAgICAgIGVnbE1ha2VDdXJyZW50KG1fZWdsRGlzcGxheSwgbV9lZ2xTdXJmYWNl
LCBtX2VnbFN1cmZhY2UsIG1fZWdsQ29udGV4dCk7CisgICAgICAgIEFTU0VSVF9FR0xfTk9fRVJS
T1IoKTsKKyAgICB9CisgICAgLy8gZWxzZTogc3VyZmFjZXMgY29tcGF0aWJsZSwgbm8gbmVlZCB0
byBzd2l0Y2ggY29udGV4dHMKKyNlbmRpZgorfQorCit2b2lkIFN1cmZhY2VPcGVuVkc6OmZsdXNo
KCkKK3sKKyNpZiBQTEFURk9STShFR0wpCisgICAgQVNTRVJUKG1fZWdsU3VyZmFjZSAhPSBFR0xf
Tk9fU1VSRkFDRSk7CisKKyAgICBlZ2xTd2FwQnVmZmVycyhtX2VnbERpc3BsYXksIG1fZWdsU3Vy
ZmFjZSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworI2VuZGlmCit9CisKK30KZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuaCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1N1cmZhY2VPcGVuVkcuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2IxN2U3Ci0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvU3VyZmFjZU9wZW5WRy5oCkBAIC0wLDAg
KzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZCAyMDA5LTIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgU3VyZmFjZU9wZW5WR19o
CisjZGVmaW5lIFN1cmZhY2VPcGVuVkdfaAorCisjaWYgUExBVEZPUk0oRUdMKQorI2luY2x1ZGUg
PGVnbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRl
IDx3dGYvUGxhdGZvcm0uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWYgUExBVEZPUk0o
RUdMKQorY2xhc3MgRUdMRGlzcGxheU9wZW5WRzsKKyNlbmRpZgorY2xhc3MgSW50U2l6ZTsKKwor
LyoqCisgKiBTdXJmYWNlT3BlblZHIHByb3ZpZGVzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHN1cmZh
Y2VzIGFuZCBjb250ZXh0cyB0aGF0IGFyZQorICogdW5kZXJseWluZyB0aGUgT3BlblZHIGltcGxl
bWVudGF0aW9uLiBJbiB0aGUgdmFzdCBtYWpvcml0eSBvZiBjYXNlcywgdGhhdAorICogdW5kZXJs
eWluZyB0ZWNobm9sb2d5IGlzIEVHTCwgYnV0IE9wZW5WRyBkb2Vzbid0IGRlcGVuZCBvbiBFR0wg
cGVyIHNlLgorICogV3JhcHBpbmcgc3VyZmFjZS9jb250ZXh0IGZ1bmN0aW9uYWxpdHkgaW50byBh
IHNlcGFyYXRlIGNsYXNzIGF2b2lkcyBsb3RzCisgKiBvZiAjaWZkZWZzIGFuZCBzaG91bGQgbWFr
ZSBpdCBlYXN5IHRvIGFkZCBkaWZmZXJlbnQgc3VyZmFjZS9jb250ZXh0CisgKiBpbXBsZW1lbnRh
dGlvbnMgdGhhbiBFR0wuCisgKi8KK2NsYXNzIFN1cmZhY2VPcGVuVkcgOiBwdWJsaWMgTm9uY29w
eWFibGUgeworcHVibGljOgorICAgIHN0YXRpYyBTdXJmYWNlT3BlblZHKiBjdXJyZW50U3VyZmFj
ZSgpOworCisjaWYgUExBVEZPUk0oRUdMKQorICAgIGZyaWVuZCBjbGFzcyBFR0xEaXNwbGF5T3Bl
blZHOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEVHTCBwYnVmZmVyIHN1cmZhY2Ug
d2l0aCB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGNvbmZpZyBvbgorICAgICAqIHRoZSBnaXZlbiBk
aXNwbGF5LiBJZiBjb25maWcgaXMgbm90IHNwZWNpZmllZCwgdGhlIGRpc3BsYXkncyBkZWZhdWx0
CisgICAgICogcGJ1ZmZlciBjb25maWcgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEZvciByZWFz
b25zIG9mIHJlY292ZXJhYmlsaXR5IChlLmcuIEltYWdlQnVmZmVyJ3MgImJvb2wgc3VjY2VzcyIK
KyAgICAgKiByZXR1cm4gdmFsdWUpLCB0aGlzIGNvbnN0cnVjdG9yIHdvbid0IGFzc2VydCBpZiBj
cmVhdGlvbiBvZiB0aGUgc3VyZmFjZQorICAgICAqIGZhaWxzLiBNYWtlIHN1cmUgdG8gY2hlY2sg
c3VjY2Vzc2Z1bCBzdXJmYWNlIGNyZWF0aW9uIHdpdGggZWl0aGVyCisgICAgICogQVNTRVJUX0VH
TF9OT19FUlJPUigpIG9yIHRoZSBzdXJmYWNlJ3MgaXNWYWxpZCgpIG1ldGhvZC4KKyAgICAgKi8K
KyAgICBTdXJmYWNlT3BlblZHKGNvbnN0IEludFNpemUmIHNpemUsIGNvbnN0IEVHTERpc3BsYXkm
IGRpc3BsYXksIEVHTENvbmZpZyogY29uZmlnID0gMCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVh
dGUgYSBuZXcgRUdMIHdpbmRvdyBzdXJmYWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYXRpdmUgd2lu
ZG93IGhhbmRsZQorICAgICAqIGFuZCBjb25maWcgb24gdGhlIGdpdmVuIGRpc3BsYXkuIElmIGNv
bmZpZyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUKKyAgICAgKiBkaXNwbGF5J3MgZGVmYXVsdCB3aW5k
b3cgY29uZmlnIGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBGb3IgcmVhc29ucyBvZiByZWNvdmVy
YWJpbGl0eSwgdGhpcyBjb25zdHJ1Y3RvciB3b24ndCBhc3NlcnQgaWYgY3JlYXRpb24KKyAgICAg
KiBvZiB0aGUgc3VyZmFjZSBmYWlscy4gTWFrZSBzdXJlIHRvIGNoZWNrIHN1Y2Nlc3NmdWwgc3Vy
ZmFjZSBjcmVhdGlvbgorICAgICAqIHdpdGggZWl0aGVyIEFTU0VSVF9FR0xfTk9fRVJST1IoKSBv
ciB0aGUgc3VyZmFjZSdzIGlzVmFsaWQoKSBtZXRob2QuCisgICAgICovCisgICAgU3VyZmFjZU9w
ZW5WRyhFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMRGlzcGxheSYgZGlzcGxh
eSwgRUdMQ29uZmlnKiBjb25maWcgPSAwKTsKKworICAgIEVHTERpc3BsYXkgZWdsRGlzcGxheSgp
IGNvbnN0IHsgcmV0dXJuIG1fZWdsRGlzcGxheTsgfQorICAgIEVHTFN1cmZhY2UgZWdsU3VyZmFj
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsU3VyZmFjZTsgfQorICAgIEVHTENvbnRleHQgZWdsQ29u
dGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fZWdsQ29udGV4dDsgfQorI2VuZGlmCisKKyAgICB+U3Vy
ZmFjZU9wZW5WRygpOworCisgICAgLyoqCisgICAgICogSWYgYSBzdXJmYWNlIGlzIGludmFsaWQg
KGNvdWxkIG5vdCBiZSBjcmVhdGVkKSwgYWxsIG1ldGhvZCBjYWxscyB3aWxsCisgICAgICogY3Jh
c2ggaG9ycmlibHkuCisgICAgICovCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CisKKyAgICBp
bnQgd2lkdGgoKSBjb25zdDsKKyAgICBpbnQgaGVpZ2h0KCkgY29uc3Q7CisKKyAgICBTdXJmYWNl
T3BlblZHKiBzaGFyZWRTdXJmYWNlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRo
ZSBhc3NvY2lhdGVkIEdML0VHTCBjb250ZXh0IHRoZSBjdXJyZW50IG9uZSwgc28gdGhhdCBzdWJz
ZXF1ZW50CisgICAgICogT3BlblZHIGNvbW1hbmRzIGFwcGx5IHRvIGl0LgorICAgICAqLworICAg
IHZvaWQgbWFrZUN1cnJlbnQoKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBzdXJmYWNlL2Nv
bnRleHQgY29tYmluYXRpb24gY3VycmVudCB0aGF0IGlzICJjb21wYXRpYmxlIgorICAgICAqIChp
LmUuIGNhbiBhY2Nlc3MgaXRzIHNoYXJlZCByZXNvdXJjZXMpIHRvIHRoZSBnaXZlbiBvbmUuIElm
IG5vCisgICAgICogc3VyZmFjZS9jb250ZXh0IGlzIGN1cnJlbnQsIHRoZSBnaXZlbiBvbmUgaXMg
bWFkZSBjdXJyZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgbWVhbnQgdG8gYXZv
aWQgY29udGV4dCBjaGFuZ2VzIGlmIHRoZXkncmUgbm90CisgICAgICogbmVjZXNzYXJ5LCBwYXJ0
aWN1bGFybHkgdGFpbG9yZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHNvbWV0aGluZworICAgICAqIGNv
bXBhdGlibGUgdG8gdGhlIHNoYXJlZCBzdXJmYWNlIGlzIHJlcXVlc3RlZCB3aGlsZSBhY3R1YWwg
cGFpbnRpbmcKKyAgICAgKiBoYXBwZW5zIG9uIGFub3RoZXIgc3VyZmFjZS4KKyAgICAgKi8KKyAg
ICB2b2lkIG1ha2VDb21wYXRpYmxlQ3VycmVudCgpOworCisgICAgLyoqCisgICAgICogRW1wdHkg
dGhlIE9wZW5WRyBwaXBlbGluZSBhbmQgbWFrZSBzdXJlIGFsbCB0aGUgcGVyZm9ybWVkIHBhaW50
CisgICAgICogb3BlcmF0aW9ucyBzaG93IHVwIG9uIHRoZSBzdXJmYWNlIGFzIGFjdHVhbCBkcmF3
biBwaXhlbHMuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCitwcml2YXRlOgorI2lmIFBM
QVRGT1JNKEVHTCkKKyAgICBTdXJmYWNlT3BlblZHKCk7IC8vIGZvciBFR0xEaXNwbGF5T3BlblZH
CisKKyAgICBFR0xEaXNwbGF5IG1fZWdsRGlzcGxheTsKKyAgICBFR0xTdXJmYWNlIG1fZWdsU3Vy
ZmFjZTsKKyAgICBFR0xDb250ZXh0IG1fZWdsQ29udGV4dDsKKyNlbmRpZgorfTsKKworfQorCisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1ZHVXRp
bHMuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnZnL1ZHVXRpbHMuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDhlMDZlCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudmcvVkdVdGlscy5oCkBAIC0wLDAgKzEsNTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMDkt
MjAxMC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBWR1V0aWxzX2gKKyNkZWZpbmUgVkdV
dGlsc19oCisKKyNpbmNsdWRlIDxvcGVudmcuaD4KKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5o
PgorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIHRvVkdFcnJvckNvbnN0YW50KFZHRXJyb3JD
b2RlIGVycm9yKQoreworICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICBjYXNlIFZHX0JBRF9IQU5E
TEVfRVJST1I6CisgICAgICAgIHJldHVybiAiVkdfQkFEX0hBTkRMRV9FUlJPUiI7CisgICAgY2Fz
ZSBWR19JTExFR0FMX0FSR1VNRU5UX0VSUk9SOgorICAgICAgICByZXR1cm4gIlZHX0lMTEVHQUxf
QVJHVU1FTlRfRVJST1IiOworICAgIGNhc2UgVkdfT1VUX09GX01FTU9SWV9FUlJPUjoKKyAgICAg
ICAgcmV0dXJuICJWR19PVVRfT0ZfTUVNT1JZX0VSUk9SIjsKKyAgICBjYXNlIFZHX1BBVEhfQ0FQ
QUJJTElUWV9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJWR19QQVRIX0NBUEFCSUxJVFlfRVJST1Ii
OworICAgIGNhc2UgVkdfVU5TVVBQT1JURURfSU1BR0VfRk9STUFUX0VSUk9SOgorICAgICAgICBy
ZXR1cm4gIlZHX1VOU1VQUE9SVEVEX0lNQUdFX0ZPUk1BVF9FUlJPUiI7CisgICAgY2FzZSBWR19V
TlNVUFBPUlRFRF9QQVRIX0ZPUk1BVF9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJWR19VTlNVUFBP
UlRFRF9QQVRIX0ZPUk1BVF9FUlJPUiI7CisgICAgY2FzZSBWR19JTUFHRV9JTl9VU0VfRVJST1I6
CisgICAgICAgIHJldHVybiAiVkdfSU1BR0VfSU5fVVNFX0VSUk9SIjsKKyAgICBjYXNlIFZHX05P
X0NPTlRFWFRfRVJST1I6CisgICAgICAgIHJldHVybiAiVkdfTk9fQ09OVEVYVF9FUlJPUiI7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVTktOT1dOX0VSUk9SIjsKKyAgICB9Cit9CisK
KyNpZiBBU1NFUlRfRElTQUJMRUQKKyNkZWZpbmUgQVNTRVJUX1ZHX05PX0VSUk9SKCkgKCh2b2lk
KTApCisjZWxzZQorI2RlZmluZSBBU1NFUlRfVkdfTk9fRVJST1IoKSBcCisgICAgQVNTRVJUX1dJ
VEhfTUVTU0FHRSh2Z0dldEVycm9yKCkgPT0gVkdfTk9fRVJST1IsICJGb3VuZCAlcyIsIHRvVkdF
cnJvckNvbnN0YW50KHZnR2V0RXJyb3IoKSkpCisjZW5kaWYKKworI2VuZGlmCg==
</data>
<flag name="review"
          id="29274"
          type_id="1"
          status="+"
          setter="zimmermann"
    />
          </attachment>
      

    </bug>

</bugzilla>