<?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>52775</bug_id>
          
          <creation_ts>2011-01-19 18:03:13 -0800</creation_ts>
          <short_desc>WebKit2: add support for drag and drop on Windows</short_desc>
          <delta_ts>2024-07-05 00:10:40 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows 7</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=276245</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar, PlatformOnly</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Enrica Casucci">enrica</reporter>
          <assigned_to name="Enrica Casucci">enrica</assigned_to>
          <cc>abarth</cc>
    
    <cc>andersca</cc>
    
    <cc>aroben</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>gustavo</cc>
    
    <cc>jberlin</cc>
    
    <cc>rniwa</cc>
    
    <cc>webkit-ews</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>337002</commentid>
    <comment_count>0</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-01-19 18:03:13 -0800</bug_when>
    <thetext>The equivalent work for Mac was tracked by 52343.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340471</commentid>
    <comment_count>1</comment_count>
      <attachid>80238</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-01-26 14:25:45 -0800</bug_when>
    <thetext>Created attachment 80238
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340512</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-26 15:18:24 -0800</bug_when>
    <thetext>Attachment 80238 did not build on chromium:
Build output: http://queues.webkit.org/results/7597358</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340549</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-26 16:08:22 -0800</bug_when>
    <thetext>Attachment 80238 did not build on gtk:
Build output: http://queues.webkit.org/results/7497343</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340563</commentid>
    <comment_count>4</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-01-26 16:25:02 -0800</bug_when>
    <thetext>Attachment 80238 did not build on qt:
Build output: http://queues.webkit.org/results/7598363</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340565</commentid>
    <comment_count>5</comment_count>
      <attachid>80260</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-01-26 16:25:21 -0800</bug_when>
    <thetext>Created attachment 80260
Patch2

Fixes build breaks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340581</commentid>
    <comment_count>6</comment_count>
      <attachid>80260</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-01-26 16:41:18 -0800</bug_when>
    <thetext>Comment on attachment 80260
Patch2

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

Looks good. I have a few style comments, but most were minor.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:133
&gt; +        *title = String((UChar*)filename);

You don’t need the explicit String() here. And I’m surprised you need the explicit cast to UChar*. If there’s a way to avoid it, I think we should.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:136
&gt; +    url = String((UChar*)urlBuffer);

Ditto.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:426
&gt; +    if (data-&gt;contains(urlWFormat()-&gt;cfFormat))
&gt; +        return extractURL(data-&gt;get(urlWFormat()-&gt;cfFormat)[0], title);
&gt; +    if (data-&gt;contains(urlFormat()-&gt;cfFormat))
&gt; +        return extractURL(data-&gt;get(urlFormat()-&gt;cfFormat)[0], title);

It’s not good for performance to do first contains and then get on the same key; that’s a double hash lookup. One alternative is to use find and then use iterator-&gt;second to get the value from the map.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:435
&gt; +    if (data-&gt;contains(filenameWFormat()-&gt;cfFormat))
&gt; +        stringData = data-&gt;get(filenameWFormat()-&gt;cfFormat)[0];
&gt; +    else if (data-&gt;contains(filenameFormat()-&gt;cfFormat))
&gt; +        stringData = data-&gt;get(filenameFormat()-&gt;cfFormat)[0];

Same issue as above.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:484
&gt; +    if (data-&gt;contains(plainTextWFormat()-&gt;cfFormat))
&gt; +        text = data-&gt;get(plainTextWFormat()-&gt;cfFormat)[0];
&gt; +    else if (data-&gt;contains(plainTextFormat()-&gt;cfFormat))
&gt; +        text = data-&gt;get(plainTextFormat()-&gt;cfFormat)[0];

Same again. You could probably make a helper function to factor out the code; these sequences are similar.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:587
&gt; +PassRefPtr&lt;DocumentFragment&gt; fragmentFromHTML(Document* doc, const DragDataMap* data) 

Please use document instead of doc.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:594
&gt; +    if (data-&gt;contains(htmlFormat()-&gt;cfFormat))
&gt; +        if (PassRefPtr&lt;DocumentFragment&gt; fragment = fragmentFromCFHTML(doc, data-&gt;get(htmlFormat()-&gt;cfFormat)[0]))
&gt; +            return fragment;

Need parentheses around the second if since it’s a multi-line if body.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:625
&gt; +        ReleaseStgMedium(&amp;store);
&gt; +    } else if (format == texthtmlFormat()-&gt;cfFormat) {

I personally would prefer returns rather than elses in this function.

&gt; Source/WebCore/platform/win/ClipboardWin.cpp:461
&gt; +        return (m_dataObject) ? getPlainText(m_dataObject.get(), success) : getPlainText(&amp;m_dragDataMap);

We normally don’t put parentheses around the predicate in a ? : like this in WebKit code.

&gt; Source/WebCore/platform/win/DragDataWin.cpp:179
&gt; +        if (containsFilenames(m_platformDragData))
&gt; +            if (PassRefPtr&lt;DocumentFragment&gt; fragment = fragmentFromFilenames(frame-&gt;document(), m_platformDragData))
&gt; +                return fragment;

Braces needed here.

&gt; Source/WebCore/platform/win/DragDataWin.cpp:183
&gt; +        if (containsHTML(m_platformDragData))
&gt; +            if (PassRefPtr&lt;DocumentFragment&gt; fragment = fragmentFromHTML(frame-&gt;document(), m_platformDragData))
&gt; +                return fragment;

And here.

&gt; Source/WebCore/platform/win/DragDataWin.cpp:187
&gt; +        if (containsFilenames(&amp;m_dragDataMap))
&gt; +            if (PassRefPtr&lt;DocumentFragment&gt; fragment = fragmentFromFilenames(frame-&gt;document(), &amp;m_dragDataMap))
&gt; +                return fragment;

And here.

&gt; Source/WebCore/platform/win/DragDataWin.cpp:191
&gt; +        if (containsHTML(&amp;m_dragDataMap))
&gt; +            if (PassRefPtr&lt;DocumentFragment&gt; fragment = fragmentFromHTML(frame-&gt;document(), &amp;m_dragDataMap))
&gt; +                return fragment;

And here.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:619
&gt; +        dragData-&gt;draggingSourceOperationMask(),
&gt; +        dragData-&gt;dragDataMap(),
&gt; +        dragData-&gt;flags()),
&gt; +        m_pageID);

These needn’t each be on a separate line.

&gt; Source/WebKit2/WebProcess/WebPage/WebPage.messages.in:109
&gt; +#endif
&gt; +#if !PLATFORM(WIN)

Why not use #else here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340582</commentid>
    <comment_count>7</comment_count>
      <attachid>80238</attachid>
    <who name="Alice Liu">alice.barraclough</who>
    <bug_when>2011-01-26 16:42:39 -0800</bug_when>
    <thetext>Comment on attachment 80238
Patch

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

Not a full review by me, since i&apos;m not an expert in Windows clipboard data.  Also compilation issues.

&gt; Source/WebCore/platform/DragData.cpp:28
&gt; +#include &lt;WTFString.h&gt;

Do you really need this if you didn&apos;t make any other changes to this file?

&gt; Source/WebCore/platform/DragData.h:87
&gt; +typedef HashMap&lt;UINT, Vector&lt;String&gt; &gt; DragDataMap;

Should we put this within a platform guard?

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:115
&gt; +{

maybe add an early return for invalid params?

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:418
&gt; +{

same comment about invalid params, especially data.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:478
&gt; +{

haven&apos;t null checked or asserted data

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:488
&gt; +}

it doesn&apos;t look like you actually need text if you just return the function call results.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:506
&gt; +{

haven&apos;t null checked or asserted data.  there are more but i&apos;ll stop talking about them.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:595
&gt; +

i think this outer if statement needs braces under our particular style guidelines.

&gt; Source/WebCore/platform/win/ClipboardWin.cpp:469
&gt;      }

it seems like we can have a smaller-looking, not as messy function if we have a local variable for either m_dataObject, or m_dragDataMap, which ever is available.

If you don&apos;t do that, do none of these additional calls need to pass success?

&gt; Source/WebCore/platform/win/DragDataWin.cpp:160
&gt; +            : (containsHTML(&amp;m_dragDataMap) || containsFilenames(&amp;m_dragDataMap)))

This is difficult to read.  can you use a local variable dragData = m_platformDragData ? m_platformDragData : &amp;m_dragDataMap;  to make this cleaner?  Or even better, provide a convenience function to provide you this platform drag data if available. you can use it elsewhere too.

&gt; Source/WebCore/platform/win/DragDataWin.cpp:193
&gt; +    return 0;

same comment as above</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340590</commentid>
    <comment_count>8</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-01-26 16:51:37 -0800</bug_when>
    <thetext>Thanks for the review. I&apos;ll address all your feedback. 
&gt; &gt; Source/WebKit2/WebProcess/WebPage/WebPage.messages.in:109
&gt; &gt; +#endif
&gt; &gt; +#if !PLATFORM(WIN)
&gt; 
&gt; Why not use #else here?
The python script doesn&apos;t handle #else correctly. I&apos;ll file a bug about this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340594</commentid>
    <comment_count>9</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-01-26 16:55:49 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/platform/DragData.cpp:28
&gt; &gt; +#include &lt;WTFString.h&gt;
&gt; 
&gt; Do you really need this if you didn&apos;t make any other changes to this file?

Yes, otherwise I get an error building for Windows.

&gt; &gt; Source/WebCore/platform/DragData.h:87
&gt; &gt; +typedef HashMap&lt;UINT, Vector&lt;String&gt; &gt; DragDataMap;
&gt; 
&gt; Should we put this within a platform guard?

I did that already in the patch that fixes the build break.

thanks for the rest of the feedback, I&apos;ll address your comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340613</commentid>
    <comment_count>10</comment_count>
      <attachid>80260</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-01-26 17:16:16 -0800</bug_when>
    <thetext>Comment on attachment 80260
Patch2

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

&gt; Source/WebCore/platform/DragData.h:55
&gt; +#include &lt;WTFString.h&gt;

This should be wtf/text/WTFString.h. I don&apos;t think it needs to be in the PLATFORM(WIN) block, even though it&apos;s only used there.

&gt; Source/WebCore/platform/DragData.h:89
&gt; +typedef HashMap&lt;UINT, Vector&lt;String&gt; &gt; DragDataMap;

Would it be better for this to be DragData::Map instead?

Storing the Vector&lt;String&gt; by value means that whenever the map has to be rehashed it will copy all the Vectors. Better would be to allocate the Vectors on the heap and just store pointers. You might need a wrapper class to handle deleting the Vectors before the map gets destroyed, though.

&gt; Source/WebCore/platform/DragData.h:100
&gt; +    DragData::DragData(const DragDataMap&amp;, const IntPoint&amp; clientPosition, const IntPoint&amp; globalPosition, DragOperation sourceOperationMask, DragApplicationFlags = DragApplicationNone);

The &quot;DragData::&quot; here seems like a mistake.

&gt; Source/WebCore/platform/DragData.h:101
&gt; +    DragDataMap dragDataMap();

This will return a copy of the map. Better would be:

const DragDataMap&amp; dragDataMap() const { return m_dragDataMap; }

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:119
&gt; +    WCHAR filename[MAX_PATH];
&gt; +    WCHAR urlBuffer[INTERNET_MAX_URL_LENGTH];

If you use Vector&lt;UChar&gt; instead for these, you can use String::adopt when you have to convert to Strings, which will avoid a memcpy.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:124
&gt; +    if (!dataObject-&gt;contains(cfHDropFormat()-&gt;cfFormat))
&gt; +        return false;
&gt; +
&gt; +    wcscpy(filename, dataObject-&gt;get(cfHDropFormat()-&gt;cfFormat)[0].characters());

You&apos;re doing two hash lookups here when you could use one instead by using HashMap::find.

You need to use charactersWithNullTermination() instead of characters() here. WTF::Strings are not null-terminated by default.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:125
&gt; +    if (_wcsicmp(PathFindExtensionW(filename), L&quot;.url&quot;))

Would String::endsWith be enough? Would it be better or worse for any reason?

If we will fairly commonly bail out here you could avoid copying the filename until after we do this check, and just pass dataObject-&gt;get(cfHDropFormat()-&gt;cfFormat)[0].charactersWithNullTermination() here. (You would probably want to store the String in a local if you were doing that for readability purposes.) In fact, it looks like you would only need to copy the string just before calling PathRemoveExtension.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:139
&gt; +    succeeded = true;
&gt; +#endif
&gt; +    return succeeded;

The succeeded variable doesn&apos;t seem very helpful. You could do something like:

#if PLATFORM(CF)
...
return true;
#else
return false;
#endif

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:437
&gt; +    if (!stringData.isEmpty() &amp;&amp; (PathFileExists(stringData.characters()) || PathIsUNC(stringData.characters()))) {

Can this become an early return instead?

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:438
&gt; +        RetainPtr&lt;CFStringRef&gt; pathAsCFString(AdoptCF, CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar *)stringData.characters(), stringData.length() - 1));

Why are you cutting off the last character? You can use String::createCFString to get a CFStringRef from a WTF::String.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:440
&gt; +        if (urlFromPath(pathAsCFString.get(), url)) {
&gt; +            if (title)

You can use &amp;&amp; here instead of a nested if.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:487
&gt; +    if (data-&gt;contains(plainTextWFormat()-&gt;cfFormat))
&gt; +        text = data-&gt;get(plainTextWFormat()-&gt;cfFormat)[0];
&gt; +    else if (data-&gt;contains(plainTextFormat()-&gt;cfFormat))
&gt; +        text = data-&gt;get(plainTextFormat()-&gt;cfFormat)[0];
&gt; +    else
&gt; +        text = getURL(data, DragData::DoNotConvertFilenames);
&gt; +    return text;

You could use early returns here instead of elses.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:594
&gt; +    if (data-&gt;contains(htmlFormat()-&gt;cfFormat))
&gt; +        if (PassRefPtr&lt;DocumentFragment&gt; fragment = fragmentFromCFHTML(doc, data-&gt;get(htmlFormat()-&gt;cfFormat)[0]))
&gt; +            return fragment;

The outer if needs braces, since its body is more than a single line.

Normally we use RefPtr for local variables. Then you would return fragment.release().

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:613
&gt; +void getClipboardData(IDataObject *dataObject, UINT format, Vector&lt;String&gt;&amp; dataStrings)

Throughout this function you can use early returns instead of chaining elses.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:622
&gt; +        char* dataBlob = static_cast&lt;char*&gt;(GlobalLock(store.hGlobal));
&gt; +        SIZE_T dataSize = ::GlobalSize(store.hGlobal);
&gt; +        dataStrings.append(String(UTF8Encoding().decode(dataBlob, dataSize)));

Why put :: on GlobalSize but not the other functions?

How do we know UTF-8 is the right encoding? You can use String::fromUTF8 instead of invoking UTF8Encoding directly.

Why store dataBlob in a local here but not in the other cases?

There&apos;s a lot of copy-and-pasted code in this function. We should come up with a way to make it more concise and less repetitious. One thing that would help would be to have a function like:

template &lt;typename Char&gt; bool getString(IDataObject*, FORMATETC*, String&amp;)

That function would do all the GlobalLock/GlobalUnlock/ReleaseStgMedium work. (You would need a separate getUTF8String function to handle the HTML case, and another function to handle the HDROP case.)

Doing that would reduce the amount of code inside each case. Then we could get rid of the long if/else if chain by doing something like:

typedef bool (*GetStringFunction)(IDataObject*, FORMATETC*, String&amp;);
typedef HashMap&lt;UINT, pair&lt;FORMATETC*, GetStringFunction&gt; &gt; FormatMap;
FormatMap formatMap;

(You&apos;d want to use better names here.)

At some point early on we&apos;d initialize formatMap like this:

formatMap.add(htmlFormat()-&gt;cfFormat, make_pair(htmlFormat(), getUTF8String));
formatMap.add(texthtmlFormat()-&gt;cfFormat, make_pair(texthtmlFormat(), getString&lt;UChar&gt;));
formatMap.add(plainTextFormat()-&gt;cfFormat, make_pair(plainTextFormat(), getString&lt;char&gt;));

Then getClipboardData would become:

FormatMap::iterator found = formatMap.find(format);
if (found == formatMap.end())
    return;
FORMATETC* formatETC = found-&gt;second.first;
GetStringFunction getString = found-&gt;second.second;
String string;
if (!getString(dataObject, formatETC, string))
    return;
dataStrings.append(string);

Sooooooooo much shorter, with many fewer opportunities for typos.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340695</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-26 19:06:12 -0800</bug_when>
    <thetext>Attachment 80238 did not build on chromium:
Build output: http://queues.webkit.org/results/7639124</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340698</commentid>
    <comment_count>12</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-01-26 19:25:24 -0800</bug_when>
    <thetext>&gt; This should be wtf/text/WTFString.h. I don&apos;t think it needs to be in the PLATFORM(WIN) block, even though it&apos;s only used there.
Done.

&gt; &gt; +    DragData::DragData(const DragDataMap&amp;, const IntPoint&amp; clientPosition, const IntPoint&amp; globalPosition, DragOperation sourceOperationMask, DragApplicationFlags = DragApplicationNone);
&gt; 
&gt; The &quot;DragData::&quot; here seems like a mistake.

Fixed.

&gt; You&apos;re doing two hash lookups here when you could use one instead by using HashMap::find.

If fixed this everywhere and I have a helper function to extract the value.
 
&gt; You need to use charactersWithNullTermination() instead of characters() here. WTF::Strings are not null-terminated by default.

That explains some weird behavior I had seen :-)
 
 
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:139
&gt; &gt; +    succeeded = true;
&gt; &gt; +#endif
&gt; &gt; +    return succeeded;
&gt; 
&gt; The succeeded variable doesn&apos;t seem very helpful. You could do something like:

Fixed. 

&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:437
&gt; &gt; +    if (!stringData.isEmpty() &amp;&amp; (PathFileExists(stringData.characters()) || PathIsUNC(stringData.characters()))) {
&gt; 
&gt; Can this become an early return instead?

Yes, done.
 
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:438
&gt; &gt; +        RetainPtr&lt;CFStringRef&gt; pathAsCFString(AdoptCF, CFStringCreateWithCharacters(kCFAllocatorDefault, (const UniChar *)stringData.characters(), stringData.length() - 1));
&gt; 
&gt; Why are you cutting off the last character? You can use String::createCFString to get a CFStringRef from a WTF::String.

Problems arising from not using charactersWithNull. Fixed.
 
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:440
&gt; &gt; +        if (urlFromPath(pathAsCFString.get(), url)) {
&gt; &gt; +            if (title)
&gt; 
&gt; You can use &amp;&amp; here instead of a nested if.
&gt;
Done.

&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:487
&gt; &gt; +    if (data-&gt;contains(plainTextWFormat()-&gt;cfFormat))
&gt; &gt; +        text = data-&gt;get(plainTextWFormat()-&gt;cfFormat)[0];
&gt; &gt; +    else if (data-&gt;contains(plainTextFormat()-&gt;cfFormat))
&gt; &gt; +        text = data-&gt;get(plainTextFormat()-&gt;cfFormat)[0];
&gt; &gt; +    else
&gt; &gt; +        text = getURL(data, DragData::DoNotConvertFilenames);
&gt; &gt; +    return text;
&gt; 
&gt; You could use early returns here instead of elses.
&gt; 

Done
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:594
&gt; &gt; +    if (data-&gt;contains(htmlFormat()-&gt;cfFormat))
&gt; &gt; +        if (PassRefPtr&lt;DocumentFragment&gt; fragment = fragmentFromCFHTML(doc, data-&gt;get(htmlFormat()-&gt;cfFormat)[0]))
&gt; &gt; +            return fragment;
&gt; 
&gt; The outer if needs braces, since its body is more than a single line.

Done.
 
&gt; Normally we use RefPtr for local variables. Then you would return fragment.release().
&gt; 
Fixed also in the function I copied from.

&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:613
&gt; &gt; +void getClipboardData(IDataObject *dataObject, UINT format, Vector&lt;String&gt;&amp; dataStrings)
&gt; 
&gt; Throughout this function you can use early returns instead of chaining elses.

Done.
&gt; 
&gt; How do we know UTF-8 is the right encoding? You can use String::fromUTF8 instead of invoking UTF8Encoding directly.
&gt; 
I assumed it was since it was like this in the function that operates on IDataObject.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340707</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-26 20:29:22 -0800</bug_when>
    <thetext>Attachment 80238 did not build on mac:
Build output: http://queues.webkit.org/results/7552324</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>340977</commentid>
    <comment_count>14</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-01-27 11:52:17 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/76824</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>341455</commentid>
    <comment_count>15</comment_count>
    <who name="Jessie Berlin">jberlin</who>
    <bug_when>2011-01-28 08:33:28 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; http://trac.webkit.org/changeset/76824

I think r76824 broke a couple of editing/pasteboard tests on the Windows 7 Release bot:

https://bugs.webkit.org/show_bug.cgi?id=53304</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>344837</commentid>
    <comment_count>16</comment_count>
      <attachid>81082</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-02-03 10:47:06 -0800</bug_when>
    <thetext>Created attachment 81082
FinalPatch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>344862</commentid>
    <comment_count>17</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-02-03 11:13:29 -0800</bug_when>
    <thetext>This was resolved by mistake. The current patch contains the final work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345071</commentid>
    <comment_count>18</comment_count>
      <attachid>81082</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-02-03 15:42:17 -0800</bug_when>
    <thetext>Comment on attachment 81082
FinalPatch

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

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:177
&gt; -    HGLOBAL cbData = ::GlobalAlloc(GPTR, size * sizeof(UChar));
&gt; +    HGLOBAL cbData = GlobalAlloc(GPTR, size * sizeof(UChar));

We&apos;ve actually been going the other direction in WebKit2 code, so I&apos;d just leave this alone.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:631
&gt; +class ClipboardDataItem {
&gt; +public:
&gt; +    FORMATETC* format;
&gt; +    GetStringFunction getString;
&gt; +    SetStringFunction setString;
&gt; +
&gt; +    ClipboardDataItem(FORMATETC* fmt, GetStringFunction f1, SetStringFunction f2): format(fmt), getString(f1), setString(f2) {};
&gt; +};

We normally list function members before data members, and use struct instead of class when using public data members.

You can use the names &quot;format&quot;, &quot;getString&quot;, and &quot;setString&quot; for the constructor arguments, even though they match the names of the data members.

You&apos;re missing a space between the constructor&apos;s braces, and have an unnecessary semicolon.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:688
&gt; +    medium.hGlobal = createGlobalData(dataStrings[0]);

I tend to prefer .first() to [0].

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:691
&gt; +    if (medium.hGlobal)
&gt; +        data-&gt;SetData(format, &amp;medium, FALSE);
&gt; +    GlobalFree(medium.hGlobal);

Is calling GlobalFree(0) OK?

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:699
&gt; +    CString asciiString = dataStrings[0].utf8();

I&apos;d move this closer to where it&apos;s first used.

&quot;asciiString&quot; isn&apos;t a good name for this; it&apos;s UTF-8, not ASCII! Is it OK to use UTF-8 for all the formats that end up calling this function? Maybe this function should be called setUtf8Data to match getUtf8Data (though I wish they were both &quot;UTF8&quot; instead of &quot;Utf8&quot;).

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:715
&gt; +void setCfData(IDataObject* data, FORMATETC* format, const Vector&lt;String&gt;&amp; dataStrings)
&gt; +{
&gt; +}

Do we expect this ever to be called? If not, adding an ASSERT_NOT_REACHED(), or just using a function pointer of 0, would be better.

This should really be named setCFData (and the getter should be named accordingly).

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:739
&gt; +    ClipboardFormatMap formatMap = getClipboardMap();

This copies the map. You should declare formatMap as a const ClipboardFormatMap&amp;.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:740
&gt;      ClipboardFormatMap::iterator found = formatMap.find(format-&gt;cfFormat);

You&apos;ll have to use const_iterator here once you make the above change.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:748
&gt; +    ClipboardFormatMap formatMap = getClipboardMap();

Same comment here about copying the map.

&gt; Source/WebCore/platform/win/WCDataObject.cpp:165
&gt; +HRESULT WCDataObject::createInstance(WCDataObject** result, const DragDataMap* dataMap)

We typically use references instead of pointers when the argument cannot be null, so I&apos;d suggest const DragDataMap&amp; for the second argument.

&gt; Source/WebCore/platform/win/WCDataObject.cpp:169
&gt; +    *result = new WCDataObject();

No need for the parentheses here.

&gt; Source/WebCore/platform/win/WCDataObject.cpp:171
&gt; +    if (!*result)
&gt; +        return E_OUTOFMEMORY;

Our FastMalloc implementation will make operator new crash if it fails to allocate memory, so this code is unreachable and should be removed.

&gt; Source/WebKit2/ChangeLog:20
&gt; +        platforms other than Window and Mac.

Typo: Window

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:74
&gt; +#include &lt;shlObj.h&gt;

We typically use all lowercase for headers like shlobj.h.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:661
&gt; +void WebPageProxy::startDragDrop(const WebCore::IntPoint&amp; imageOrigin, const WebCore::IntPoint&amp; dragPoint, uint64_t okEffect, 
&gt; +    HashMap&lt;UINT, Vector&lt;String&gt;&gt; dataMap, const WebCore::IntSize&amp; dragImageSize, const SharedMemory::Handle&amp; dragImageHandle, bool isLinkDrag)

There shouldn&apos;t be any &quot;WebCore::&quot; in here.

We normally leave a space in between &quot;&gt;&gt;&quot;. MSVC doesn&apos;t require it, but GCC does, so it&apos;s a good habit to get into.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:666
&gt; +    RefPtr&lt;SharedMemory&gt; memoryBuffer = SharedMemory::create(dragImageHandle, SharedMemory::ReadWrite);

Don&apos;t we only need Read access here?

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:671
&gt; +    RefPtr&lt;WebDragSource&gt; source;
&gt; +    source = WebDragSource::createInstance(m_pageClient-&gt;nativeWindow());

This can be done in one line.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:677
&gt; +    COMPtr&lt;IDragSourceHelper&gt; helper;
&gt; +    if (FAILED(CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, IID_IDragSourceHelper, (LPVOID*)&amp;helper)))
&gt; +        return;

COMPtr has a special constructor that can do this for you:

COMPtr&lt;IDragSourceHelper&gt; helper(Create, CLSID_DragDropHelper);
if (!helper)
    return;

This will only work if __uuidof(IDragSourceHelper) compiles, which it may not depending on how that interface is defined.

You should use a C++ cast instead of (LPVOID*).

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:681
&gt; +    void* bits;
&gt; +    HBITMAP hbmp = CreateDIBSection(0, &amp;bitmapInfo, DIB_RGB_COLORS, static_cast&lt;void**&gt;(&amp;bits), 0, 0);

Is the static_cast really necessary here?

Please prefix Win32 API calls in WebKit2 with ::.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:687
&gt; +    sdi.crColorKey = 0xffffffff;

Please use the RGB macro here.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:710
&gt; +    POINTL pt;
&gt; +    ::GetCursorPos((LPPOINT)&amp;pt);
&gt; +    POINTL localpt = pt;
&gt; +    ::ScreenToClient(m_pageClient-&gt;nativeWindow(), (LPPOINT)&amp;localpt);

If you really want a POINT, why not just use a POINT?

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:712
&gt; +    dragEnded(IntPoint(localpt.x, localpt.y), IntPoint(pt.x, pt.y), operation);

If you use POINT above, I don&apos;t think you&apos;ll need these IntPoint constructors. You can convert from POINT to IntPoint implicitly.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragClientWin.cpp:1
&gt; +/*

I&apos;d really like to see this code shared with WebKit1. This is a lot of code to copy!

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.cpp:52
&gt; +STDMETHODIMP WebDragSource::QueryInterface(REFIID riid, void** ppvObject)

We normally just use the return type instead of any of the STDMETHODIMP* macros.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.cpp:81
&gt; +    if (fEscapePressed || !(grfKeyState &amp; (MK_LBUTTON | MK_RBUTTON))) {
&gt; +        m_dropped = !fEscapePressed;
&gt; +        return fEscapePressed? DRAGDROP_S_CANCEL : DRAGDROP_S_DROP;

Missing space before ?.

I think this would be clearer if we didn&apos;t test fEscapePressed three times:

if (fEscapePressed) {
    m_dropped = false;
    return DRAGDROP_S_CANCEL;
}

m_dropped = true;

if (grfKeyState &amp; (MK_LBUTTON | MK_RBUTTON))
    return S_OK;

return DRAGDROP_S_DROP;

grfKeyState is confusing. It has &quot;key&quot; in the name, which makes it sound like it&apos;s about the keyboard, but we&apos;re using it to check whether the left or right mouse button is pressed. MSDN even says it represents the &quot;current state of the keyboard modifier keys on the keyboard.&quot; It sure doesn&apos;t seem like the mouse buttons should be included in that! But then it says that MK_LBUTTON/MK_MBUTTON/MK_RBUTTON may be included. Is MSDN just wrong about it only representing the keyboard state?

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:33
&gt; +class WebDragSource : public IDropSource, public RefCounted&lt;WebDragSource&gt; {

We&apos;ve tended not to use RefCounted for implementing COM classes, but doing so seems OK.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:35
&gt; +    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);        

You should make all the IDropSource members private, since we never expect them to be called on a pointer with static type WebDragSource*.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:37
&gt; +    virtual ULONG STDMETHODCALLTYPE AddRef(void);
&gt; +    virtual ULONG STDMETHODCALLTYPE Release(void);

Please remove the &quot;void&quot;s.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:41
&gt; +    static PassRefPtr&lt;WebDragSource&gt; createInstance(HWND hWnd);

&quot;hWnd&quot; is unnecessary.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:43
&gt; +    ~WebDragSource() {};
&gt; +private:

Missing a space in here.

There&apos;s no need to declare this destructor at all. The compiler will do the same thing for you automatically.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:44
&gt; +    WebDragSource(HWND hWnd);

Unnecessary &quot;hWnd&quot;.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:46
&gt; +    long m_ref;
&gt; +    bool m_dropped;

These members are unused.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:49
&gt; +    HWND m_window;
&gt; +
&gt; +};

Extra space in there.

&gt; Source/WebKit2/win/WebKit2.vcproj:21
&gt; -			InheritedPropertySheets=&quot;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\FeatureDefines.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;$(WebKitVSPropsRedirectionDir)..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;.\WebKit2Common.vsprops;.\WebKit2DirectX.vsprops;.\WebKit2Apple.vsprops&quot;
&gt; +			InheritedPropertySheets=&quot;..\..\..\WebKitLibraries\win\tools\vsprops\FeatureDefines.vsprops;..\..\..\WebKitLibraries\win\tools\vsprops\common.vsprops;..\..\..\WebKitLibraries\win\tools\vsprops\debug.vsprops;.\WebKit2Common.vsprops;.\WebKit2DirectX.vsprops;.\WebKit2Apple.vsprops&quot;

Please undo these changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345107</commentid>
    <comment_count>19</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-02-03 16:19:13 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; (From update of attachment 81082 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81082&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:177
&gt; &gt; -    HGLOBAL cbData = ::GlobalAlloc(GPTR, size * sizeof(UChar));
&gt; &gt; +    HGLOBAL cbData = GlobalAlloc(GPTR, size * sizeof(UChar));
&gt; 
&gt; We&apos;ve actually been going the other direction in WebKit2 code, so I&apos;d just leave this alone.
&gt;

I must have misunderstood a comment you made in a previous patch. I thought you  suggested not using ::.
 
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:631
&gt; &gt; +class ClipboardDataItem {
&gt; &gt; +public:
&gt; &gt; +    FORMATETC* format;
&gt; &gt; +    GetStringFunction getString;
&gt; &gt; +    SetStringFunction setString;
&gt; &gt; +
&gt; &gt; +    ClipboardDataItem(FORMATETC* fmt, GetStringFunction f1, SetStringFunction f2): format(fmt), getString(f1), setString(f2) {};
&gt; &gt; +};
&gt; 
&gt; Is calling GlobalFree(0) OK?

yes, because passing FALSE makes a copy of the data.
 
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:699
&gt; &gt; +    CString asciiString = dataStrings[0].utf8();
&gt; 
&gt; I&apos;d move this closer to where it&apos;s first used.
&gt; 
&gt; &quot;asciiString&quot; isn&apos;t a good name for this; it&apos;s UTF-8, not ASCII! Is it OK to use UTF-8 for all the formats that end up calling this function? Maybe this function should be called setUtf8Data to match getUtf8Data (though I wish they were both &quot;UTF8&quot; instead of &quot;Utf8&quot;).
&gt;
Sure.

&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:715
&gt; &gt; +void setCfData(IDataObject* data, FORMATETC* format, const Vector&lt;String&gt;&amp; dataStrings)
&gt; &gt; +{
&gt; &gt; +}
&gt; 
&gt; Do we expect this ever to be called? If not, adding an ASSERT_NOT_REACHED(), or just using a function pointer of 0, would be better.

I&apos;ll add that.

&gt; This should really be named setCFData (and the getter should be named accordingly).
&gt; 
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:739
&gt; &gt; +    ClipboardFormatMap formatMap = getClipboardMap();
&gt; 
&gt; This copies the map. You should declare formatMap as a const ClipboardFormatMap&amp;.

Overlooked.

&gt; Don&apos;t we only need Read access here?

Yes.
 
&gt; &gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:671
&gt; &gt; +    RefPtr&lt;WebDragSource&gt; source;
&gt; &gt; +    source = WebDragSource::createInstance(m_pageClient-&gt;nativeWindow());
&gt; 
&gt; This can be done in one line.
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:677
&gt; &gt; +    COMPtr&lt;IDragSourceHelper&gt; helper;
&gt; &gt; +    if (FAILED(CoCreateInstance(CLSID_DragDropHelper, 0, CLSCTX_INPROC_SERVER, IID_IDragSourceHelper, (LPVOID*)&amp;helper)))
&gt; &gt; +        return;
&gt; 
&gt; COMPtr has a special constructor that can do this for you:
&gt; 
&gt; COMPtr&lt;IDragSourceHelper&gt; helper(Create, CLSID_DragDropHelper);
&gt; if (!helper)
&gt;     return;
&gt; 
&gt; This will only work if __uuidof(IDragSourceHelper) compiles, which it may not depending on how that interface is defined.
&gt; 
&gt; If you use POINT above, I don&apos;t think you&apos;ll need these IntPoint constructors. You can convert from POINT to IntPoint implicitly.
I didn&apos;t know.
 
&gt; &gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragClientWin.cpp:1
&gt; &gt; +/*
&gt; 
&gt; I&apos;d really like to see this code shared with WebKit1. This is a lot of code to copy!

Is there a good way to share code with WebKit1? Probably the only reasonable solution is to place it in WebCore.
 
&gt; We&apos;ve tended not to use RefCounted for implementing COM classes, but doing so seems OK.

Why implementing refcounting when we have a class that does that? I did this on purpose.
The WebKit1 implementation did not.

Even though I agree with most of your comments I honestly don&apos;t understand the r-.
I&apos;ll make the changes and submit a new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>345125</commentid>
    <comment_count>20</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-02-03 16:31:23 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; (In reply to comment #18)
&gt; &gt; (From update of attachment 81082 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81082&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:631
&gt; &gt; &gt; +class ClipboardDataItem {
&gt; &gt; &gt; +public:
&gt; &gt; &gt; +    FORMATETC* format;
&gt; &gt; &gt; +    GetStringFunction getString;
&gt; &gt; &gt; +    SetStringFunction setString;
&gt; &gt; &gt; +
&gt; &gt; &gt; +    ClipboardDataItem(FORMATETC* fmt, GetStringFunction f1, SetStringFunction f2): format(fmt), getString(f1), setString(f2) {};
&gt; &gt; &gt; +};
&gt; &gt; 
&gt; &gt; Is calling GlobalFree(0) OK?
&gt; 
&gt; yes, because passing FALSE makes a copy of the data.

(Looks like the wrong part of the patch got quoted here.)

Why does copying the data or not matter? I&apos;m asking what happens if you pass null to GlobalFree, which your code could do in some cases.

&gt; 
&gt; &gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:699
&gt; &gt; &gt; +    CString asciiString = dataStrings[0].utf8();
&gt; &gt; 
&gt; &gt; I&apos;d move this closer to where it&apos;s first used.
&gt; &gt; 
&gt; &gt; &quot;asciiString&quot; isn&apos;t a good name for this; it&apos;s UTF-8, not ASCII! Is it OK to use UTF-8 for all the formats that end up calling this function? Maybe this function should be called setUtf8Data to match getUtf8Data (though I wish they were both &quot;UTF8&quot; instead of &quot;Utf8&quot;).
&gt; &gt;
&gt; Sure.

…So is it OK to use UTF-8 for all the formats that end up calling this function? Is that what Windows expects?

&gt; &gt; &gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragClientWin.cpp:1
&gt; &gt; &gt; +/*
&gt; &gt; 
&gt; &gt; I&apos;d really like to see this code shared with WebKit1. This is a lot of code to copy!
&gt; 
&gt; Is there a good way to share code with WebKit1? Probably the only reasonable solution is to place it in WebCore.

Moving the code to WebCore seems like the right option. You can just take the code that WebKit1&apos;s WebDragClient.cpp uses to draw the images, put it in some new functions in WebCore, and make both WebKit1 and WebKit2 call those new functions. Those seem like pretty small changes to me.

&gt; &gt; We&apos;ve tended not to use RefCounted for implementing COM classes, but doing so seems OK.
&gt; 
&gt; Why implementing refcounting when we have a class that does that? I did this on purpose.
&gt; The WebKit1 implementation did not.

Right, I was pointing out that this was a change from how we&apos;ve historically done things. But I think it&apos;s probably a good change. :-)

&gt; Even though I agree with most of your comments I honestly don&apos;t understand the r-.
&gt; I&apos;ll make the changes and submit a new patch.

The r- was because of all the copied code. We don&apos;t want to have to maintain two implementations of the same thing, and copying code makes for many opportunities for bugs to creep in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346713</commentid>
    <comment_count>21</comment_count>
      <attachid>81503</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-02-07 12:21:08 -0800</bug_when>
    <thetext>Created attachment 81503
Patch3

Addressing all the comments and adding refactoring to avoid duplicate code for WebKit 1 and 2.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346728</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-07 12:46:22 -0800</bug_when>
    <thetext>Attachment 81503 did not build on chromium:
Build output: http://queues.webkit.org/results/7705752</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346729</commentid>
    <comment_count>23</comment_count>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-02-07 12:47:55 -0800</bug_when>
    <thetext>Attachment 81503 did not build on qt:
Build output: http://queues.webkit.org/results/7708458</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346756</commentid>
    <comment_count>24</comment_count>
      <attachid>81503</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-02-07 13:11:53 -0800</bug_when>
    <thetext>Comment on attachment 81503
Patch3

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

One way to break this patch up into smaller pieces (which would make it easier to review would be):

1) Move the implementation of WebChromeClient::createDragImageForLink on Windows into the new WebCore::createDragImageForLink function, and make WebChromeClient::createDragImageForLink call it in WebKit1 on Windows.
2) Make WebChromeClient::createDragImagForLink call WebCore::createDragImageForLink in WebKit2 on Windows.
3) Repeat (1) for Mac.
4) Repeat (2) for Mac.
5) Wait for other platforms to do the same…
6) Remove DragClient::createDragImageForLink and change all callers to call WebCore::createDragImageForLink instead.

Doing it this way would not require all platforms to change at once, which would make your life easier, as well as the life of your friendly reviewer. :-)

Presumably this is going to require some non-trivial changes for Qt and Chromium (and probably other ports like GTK, too), so I guess I should wait until that&apos;s done. Or you could take the approach I outlined above and avoid all that extra work.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:93
&gt; -    HDROP hdrop = static_cast&lt;HDROP&gt;(GlobalLock(medium.hGlobal));
&gt; +    HDROP hdrop = static_cast&lt;HDROP&gt;(::GlobalLock(medium.hGlobal));

We generally like to make style-only changes like this separately from substantive code changes. We do like to fix up old code&apos;s style as we go, but we don&apos;t normally do it for a whole file when we&apos;re just touching a couple of functions. It can be easy to get lost in all the style changes and miss the important code changes when reviewing.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:705
&gt; +    CString charString = dataStrings.first().utf8();
&gt; +    size_t stringLength = charString.length();
&gt; +    medium.hGlobal = ::GlobalAlloc(GPTR, stringLength + 1);
&gt; +    if (!medium.hGlobal)
&gt; +        return;
&gt; +    char* buffer = static_cast&lt;char*&gt;(::GlobalLock(medium.hGlobal));
&gt; +    memcpy(buffer, charString.data(), stringLength);

I&apos;m still curious whether Windows apps expect to get a string encoded with UTF-8, rather than something encoded with the current code page. Have you tried dragging a non-ASCII string to another Windows app and seeing what happens?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346757</commentid>
    <comment_count>25</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-02-07 13:12:46 -0800</bug_when>
    <thetext>(In reply to comment #24)
&gt; (From update of attachment 81503 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81503&amp;action=review
&gt; 
&gt; One way to break this patch up into smaller pieces (which would make it easier to review would be):
&gt; 
&gt; 1) Move the implementation of WebChromeClient::createDragImageForLink on Windows into the new WebCore::createDragImageForLink function, and make WebChromeClient::createDragImageForLink call it in WebKit1 on Windows.
&gt; 2) Make WebChromeClient::createDragImagForLink call WebCore::createDragImageForLink in WebKit2 on Windows.
&gt; 3) Repeat (1) for Mac.
&gt; 4) Repeat (2) for Mac.
&gt; 5) Wait for other platforms to do the same…
&gt; 6) Remove DragClient::createDragImageForLink and change all callers to call WebCore::createDragImageForLink instead.
&gt; 
&gt; Doing it this way would not require all platforms to change at once, which would make your life easier, as well as the life of your friendly reviewer. :-)

To be clear, I meant that each step would be a separate patch (except for (5), which of course would require multiple patches, but other people would take care of that).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346800</commentid>
    <comment_count>26</comment_count>
      <attachid>81503</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-02-07 14:35:28 -0800</bug_when>
    <thetext>Comment on attachment 81503
Patch3

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

I didn&apos;t look at the code that was just moved from WebKit to WebCore very carefully.

&gt; Source/WebCore/platform/mac/DragImageMac.mm:164
&gt; +        } else
&gt; +              imageSize.width = max(labelSize.width + DragLabelBorderX * 2, urlStringSize.width + DragLabelBorderX * 2);

Funky indentation here.

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:694
&gt; +void setCharData(IDataObject* data, FORMATETC* format, const Vector&lt;String&gt;&amp; dataStrings)

I think it would be more honest to call this setUTF8Data, even though we&apos;re hoping that treating it as UTF-8 doesn&apos;t matter.

&gt;&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:705
&gt;&gt; +    memcpy(buffer, charString.data(), stringLength);
&gt; 
&gt; I&apos;m still curious whether Windows apps expect to get a string encoded with UTF-8, rather than something encoded with the current code page. Have you tried dragging a non-ASCII string to another Windows app and seeing what happens?

Enrica explained to me that her new code matches the behavior of the existing code that was already in this function. If we&apos;re dealing with ANSI text incorrectly, we&apos;re dealing with it incorrectly everywhere, not just in this new code. Clearly it isn&apos;t a big issue, since we haven&apos;t had bugs filed about it in all the time the old code has been in use.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:694
&gt; +    HBITMAP hbmp = ::CreateDIBSection(0, &amp;bitmapInfo, DIB_RGB_COLORS, &amp;bits, 0, 0);

It would be slightly better to use an OwnPtr&lt;HBITMAP&gt; here…

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:701
&gt; +    sdi.hbmpDragImage = hbmp;

…and then to use hbmp.leakPtr() here. That makes the memory management a little more explicit.

&gt; Source/WebKit2/UIProcess/WebPageProxy.cpp:723
&gt; +    ::GetCursorPos((LPPOINT)&amp;globalPoint);
&gt; +    POINT localPoint = globalPoint;
&gt; +    ::ScreenToClient(m_pageClient-&gt;nativeWindow(), (LPPOINT)&amp;localPoint);

I don&apos;t think these casts are needed.

&gt; Source/WebKit2/UIProcess/WebPageProxy.h:311
&gt; +    void startDragDrop(const WebCore::IntPoint&amp; imagePoint, const WebCore::IntPoint&amp; dragPoint, uint64_t okEffect, HashMap&lt;UINT, Vector&lt;String&gt;&gt; dataMap, const WebCore::IntSize&amp; dragImageSize, const SharedMemory::Handle&amp; dragImageHandle, bool isLinkDrag);

You should add a space in between &quot;&gt;&gt;&quot;. And dataMap should be a reference to const, to avoid copying the map.

&gt; Source/WebKit2/UIProcess/WebPageProxy.messages.in:203
&gt; +    StartDragDrop(WebCore::IntPoint imagePoint, WebCore::IntPoint dragPoint, uint64_t okEffect, HashMap&lt;UINT,Vector&lt;String&gt;&gt; dataMap, WebCore::IntSize dragImageSize, WebKit::SharedMemory::Handle dragImage, bool linkDrag)

Ditto about &quot;&gt;&gt;&quot;.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragClientWin.cpp:69
&gt; +    HDC bitmapDC = CreateCompatibleDC(0);

You should use OwnPtr&lt;HDC&gt; here and remove the call to DeleteDC. Please prefix with ::, too.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.cpp:84
&gt; +HRESULT WebDragSource::GiveFeedback(DWORD dwEffect)

You should remove the unused parameter name here.

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:37
&gt; +    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);        
&gt; +    virtual ULONG STDMETHODCALLTYPE AddRef();
&gt; +    virtual ULONG STDMETHODCALLTYPE Release();

Can these be private, too?

&gt; Source/WebKit2/WebProcess/WebCoreSupport/win/WebDragSource.h:40
&gt; +    static PassRefPtr&lt;WebDragSource&gt; createInstance();
&gt; +private:

Missing a blank line before &quot;private&quot;.

&gt; Source/WebKit2/win/WebKit2.vcproj:1450
&gt; +          &lt;File
&gt; +            RelativePath=&quot;..\WebProcess\WebCoreSupport\win\WebDragClientWin.cpp&quot;
&gt; +            &gt;
&gt; +          &lt;/File&gt;
&gt; +          &lt;File
&gt; +            RelativePath=&quot;..\WebProcess\WebCoreSupport\win\WebDragSource.cpp&quot;
&gt; +            &gt;
&gt; +          &lt;/File&gt;
&gt; +          &lt;File
&gt; +            RelativePath=&quot;..\WebProcess\WebCoreSupport\win\WebDragSource.h&quot;
&gt; +            &gt;
&gt; +          &lt;/File&gt;

Looks like this is using spaces instead of tabs (which VS prefers).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346910</commentid>
    <comment_count>27</comment_count>
      <attachid>81546</attachid>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-02-07 15:56:21 -0800</bug_when>
    <thetext>Created attachment 81546
Patch4

This patch fixes the build breaks. I want to verify that before I submit.
I&apos;m requesting another review because I found a problem with the code that has been already reviewed.
I&apos;ve added the implementation of setCFData in ClipboardUtilitiesWin.cpp.
The rest of the code has been reviewed and r+ already, but I don&apos;t want to check in code that has not been reviewed 100%.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346951</commentid>
    <comment_count>28</comment_count>
      <attachid>81546</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-02-07 16:49:31 -0800</bug_when>
    <thetext>Comment on attachment 81546
Patch4

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

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:714
&gt; +void setCFData(IDataObject* data, FORMATETC* format, const Vector&lt;String&gt;&amp; dataStrings)

What guarantees the dataStrings vector is not empty?

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:717
&gt; +    SIZE_T dropFilesSize = sizeof(DROPFILES) + (sizeof(WCHAR) * (dataStrings.first().length() + 2));

+2? Why not +1?

&gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:726
&gt; +    String filename = dataStrings[0];
&gt; +    wcscpy(reinterpret_cast&lt;LPWSTR&gt;(dropFiles + 1), filename.charactersWithNullTermination());    

No need for the local variable here for dataStrings[0]. Also, other functions call this dataStrings.first() but here you used dataStrings[0].</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346971</commentid>
    <comment_count>29</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-02-07 17:24:32 -0800</bug_when>
    <thetext>(In reply to comment #28)
&gt; (From update of attachment 81546 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=81546&amp;action=review
&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:714
&gt; &gt; +void setCFData(IDataObject* data, FORMATETC* format, const Vector&lt;String&gt;&amp; dataStrings)
&gt; What guarantees the dataStrings vector is not empty?
This function is called to recreate an IDataObject from the serialized data and we call it only if there is data to deserialize, that is the vector is not empty.

&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:717
&gt; &gt; +    SIZE_T dropFilesSize = sizeof(DROPFILES) + (sizeof(WCHAR) * (dataStrings.first().length() + 2));
&gt; +2? Why not +1?
I took this code from ClipboardWin.cpp (line 240 etc.) and didn&apos;t make too much sense to me either. I didn&apos;t want to change it because sometimes in Windows when dealing with an array of null terminated strings the double 0 indicates the end of the series. That is the only possible explanation I have.

&gt; &gt; Source/WebCore/platform/win/ClipboardUtilitiesWin.cpp:726
&gt; &gt; +    String filename = dataStrings[0];
&gt; &gt; +    wcscpy(reinterpret_cast&lt;LPWSTR&gt;(dropFiles + 1), filename.charactersWithNullTermination());    
&gt; No need for the local variable here for dataStrings[0]. Also, other functions call this dataStrings.first() but here you used dataStrings[0].
You&apos;re right about the use of first.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346975</commentid>
    <comment_count>30</comment_count>
    <who name="Enrica Casucci">enrica</who>
    <bug_when>2011-02-07 17:34:52 -0800</bug_when>
    <thetext>Committed revision 77870.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>346996</commentid>
    <comment_count>31</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-02-07 18:11:26 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/77870 might have broken Leopard Intel Release (Build)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>347041</commentid>
    <comment_count>32</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-07 20:29:42 -0800</bug_when>
    <thetext>Build fix in http://trac.webkit.org/changeset/77888.

I still don&apos;t understand why we added webkit_CGCeiling when there&apos;s an identical ceilCGFloat in ComplexTestController.cpp</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80238</attachid>
            <date>2011-01-26 14:25:45 -0800</date>
            <delta_ts>2011-01-26 16:42:39 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>dropwin.txt</filename>
            <type>text/plain</type>
            <size>31719</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NzE2KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTcgQEAKKzIwMTEtMDEtMjYgIEVucmljYSBD
YXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWJLaXQyOiBhZGQgc3VwcG9ydCBmb3IgZHJhZyBhbmQgZHJv
cCBvbiBXaW5kb3dzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD01Mjc3NQorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODUxNDQwOT4KKyAgICAgICAgCisg
ICAgICAgIE9uIFdpbmRvd3MgdGhlIGFjY2VzcyB0byB0aGUgY29udGVudCBiZWluZyBkcmFnZ2Vk
IGlzCisgICAgICAgIHByb3ZpZGVkIHZpYSB0aGUgSURhdGFPYmplY3QgaW50ZXJmYWNlIHRoYXQg
aXMgbWFkZSBhdmFpbGFibGUKKyAgICAgICAgdG8gdGhlIHdpbmRvdyB0aGF0IHJlZ2lzdGVycyBp
dHNlbGYgYXMgZHJvcCB0YXJnZXQuCisgICAgICAgIFNpbmNlIHRoaXMgaW50ZXJmYWNlIGNhbm5v
dCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBXZWJQcm9jZXNzLAorICAgICAgICBpbiBldmVyeSBjYWxs
IHRvIG9uZSBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgSURyb3BUYXJnZXQgaW50ZXJmYWNlCisgICAg
ICAgIHdlIHNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgZHJhZyBjbGlwYm9hcmQgYW5kIHNl
bmQgaXQgb3ZlciB0bworICAgICAgICB0aGUgV2ViUHJvY2Vzcy4KKyAgICAgICAgVGhlIGJ1bGsg
b2YgdGhpcyBwYXRjaCBjb25zaXN0cyBpbiB0aGUgcmVmYWN0b3JpbmcgbmVlZGVkIGluIERyYWdE
YXRhCisgICAgICAgIGFuZCBDbGlwYm9hcmRXaW4gY2xhc3NlcyB0byBleHRyYWN0IHRoZSBkYXRh
IGZyb20gdGhlIHNlcmlhbGl6ZWQgb2JqZWN0LgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9y
bS9EcmFnRGF0YS5jcHA6CisgICAgICAgICogcGxhdGZvcm0vRHJhZ0RhdGEuaDoKKyAgICAgICAg
KiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OmdldFdlYkxvY0RhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0VVJMKToKKyAgICAgICAg
KFdlYkNvcmU6OmdldFBsYWluVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRUZXh0SFRNTCk6
CisgICAgICAgIChXZWJDb3JlOjpnZXRDRkhUTUwpOgorICAgICAgICAoV2ViQ29yZTo6ZnJhZ21l
bnRGcm9tRmlsZW5hbWVzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbnRhaW5zRmlsZW5hbWVzKToK
KyAgICAgICAgKFdlYkNvcmU6OmZyYWdtZW50RnJvbUhUTUwpOgorICAgICAgICAoV2ViQ29yZTo6
Y29udGFpbnNIVE1MKToKKyAgICAgICAgKFdlYkNvcmU6OmdldENsaXBib2FyZERhdGEpOgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2Fy
ZDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2lu
KToKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZFdpbjo6Z2V0RGF0YSk6CisgICAgICAgIChX
ZWJDb3JlOjpDbGlwYm9hcmRXaW46OnR5cGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2Fy
ZFdpbjo6ZmlsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q2xpcGJvYXJkV2luOjpoYXNEYXRhKToK
KyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmg6CisgICAgICAgIChXZWJDb3Jl
OjpDbGlwYm9hcmRXaW46OmNyZWF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdEYXRh
V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjpEcmFnRGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpEcmFnRGF0YTo6Y29udGFpbnNVUkwpOgorICAgICAgICAoV2ViQ29yZTo6RHJh
Z0RhdGE6OmRyYWdEYXRhTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjphc1VSTCk6
CisgICAgICAgIChXZWJDb3JlOjpEcmFnRGF0YTo6Y29udGFpbnNGaWxlcyk6CisgICAgICAgIChX
ZWJDb3JlOjpEcmFnRGF0YTo6YXNGaWxlbmFtZXMpOgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0Rh
dGE6OmNvbnRhaW5zUGxhaW5UZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjphc1Bs
YWluVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpEcmFnRGF0YTo6Y2FuU21hcnRSZXBsYWNlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjpjb250YWluc0NvbXBhdGlibGVDb250ZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjphc0ZyYWdtZW50KToKKwogMjAxMS0wMS0yNiAg
VG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQuCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9EcmFnRGF0YS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0RhdGEuY3BwCShyZXZpc2lvbiA3NjY5MSkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0RyYWdEYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiRHJhZ0RhdGEu
aCIKKyNpbmNsdWRlIDxXVEZTdHJpbmcuaD4KIAogI2lmIEVOQUJMRShEUkFHX1NVUFBPUlQpCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9EcmFnRGF0
YS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0RyYWdEYXRhLmgJKHJl
dmlzaW9uIDc2NjkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0RhdGEuaAkod29y
a2luZyBjb3B5KQpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkludFBvaW50LmgiCiAKICNp
bmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CiAjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgogCiAjaWYgUExBVEZPUk0oTUFDKQpAQCAtODMsNiArODQsOCBAQCBl
bnVtIERyYWdBcHBsaWNhdGlvbkZsYWdzIHsKICAgICBEcmFnQXBwbGljYXRpb25Jc0NvcHlLZXlE
b3duID0gOAogfTsKICAgICAKK3R5cGVkZWYgSGFzaE1hcDxVSU5ULCBWZWN0b3I8U3RyaW5nPiA+
IERyYWdEYXRhTWFwOworCiBjbGFzcyBEcmFnRGF0YSB7CiBwdWJsaWM6CiAgICAgZW51bSBGaWxl
bmFtZUNvbnZlcnNpb25Qb2xpY3kgeyBEb05vdENvbnZlcnRGaWxlbmFtZXMsIENvbnZlcnRGaWxl
bmFtZXMgfTsKQEAgLTkwLDcgKzkzLDEwIEBAIHB1YmxpYzoKICAgICAvLyBjbGllbnRQb3NpdGlv
biBpcyB0YWtlbiB0byBiZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRyYWcgZXZlbnQgd2l0aGluIHRo
ZSB0YXJnZXQgd2luZG93LCB3aXRoICgwLDApIGF0IHRoZSB0b3AgbGVmdAogICAgIERyYWdEYXRh
KERyYWdEYXRhUmVmLCBjb25zdCBJbnRQb2ludCYgY2xpZW50UG9zaXRpb24sIGNvbnN0IEludFBv
aW50JiBnbG9iYWxQb3NpdGlvbiwgRHJhZ09wZXJhdGlvbiwgRHJhZ0FwcGxpY2F0aW9uRmxhZ3Mg
PSBEcmFnQXBwbGljYXRpb25Ob25lKTsKICAgICBEcmFnRGF0YShjb25zdCBTdHJpbmcmIGRyYWdT
dG9yYWdlTmFtZSwgY29uc3QgSW50UG9pbnQmIGNsaWVudFBvc2l0aW9uLCBjb25zdCBJbnRQb2lu
dCYgZ2xvYmFsUG9zaXRpb24sIERyYWdPcGVyYXRpb24sIERyYWdBcHBsaWNhdGlvbkZsYWdzID0g
RHJhZ0FwcGxpY2F0aW9uTm9uZSk7Ci0KKyNpZiBQTEFURk9STShXSU4pCisgICAgRHJhZ0RhdGE6
OkRyYWdEYXRhKGNvbnN0IERyYWdEYXRhTWFwJiwgY29uc3QgSW50UG9pbnQmIGNsaWVudFBvc2l0
aW9uLCBjb25zdCBJbnRQb2ludCYgZ2xvYmFsUG9zaXRpb24sIERyYWdPcGVyYXRpb24gc291cmNl
T3BlcmF0aW9uTWFzaywgRHJhZ0FwcGxpY2F0aW9uRmxhZ3MgPSBEcmFnQXBwbGljYXRpb25Ob25l
KTsKKyAgICBEcmFnRGF0YU1hcCBkcmFnRGF0YU1hcCgpOworI2VuZGlmCiAgICAgY29uc3QgSW50
UG9pbnQmIGNsaWVudFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9jbGllbnRQb3NpdGlvbjsg
fQogICAgIGNvbnN0IEludFBvaW50JiBnbG9iYWxQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1f
Z2xvYmFsUG9zaXRpb247IH0KICAgICBEcmFnQXBwbGljYXRpb25GbGFncyBmbGFncygpIHsgcmV0
dXJuIG1fYXBwbGljYXRpb25GbGFnczsgfQpAQCAtMTE3LDYgKzEyMyw5IEBAIHByaXZhdGU6CiAj
aWYgUExBVEZPUk0oTUFDKQogICAgIFJldGFpblB0cjxOU1Bhc3RlYm9hcmQ+IG1fcGFzdGVib2Fy
ZDsKICNlbmRpZgorI2lmIFBMQVRGT1JNKFdJTikKKyAgICBEcmFnRGF0YU1hcCBtX2RyYWdEYXRh
TWFwOworI2VuZGlmCiB9OwogICAgIAogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
d2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5jcHAJKHJldmlzaW9uIDc2Njkx
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTExMSw2ICsxMTEsMzQgQEAgZXhpdDoKICAgICByZXR1cm4g
c3VjY2VlZGVkOwogfQogCitzdGF0aWMgYm9vbCBnZXRXZWJMb2NEYXRhKGNvbnN0IERyYWdEYXRh
TWFwKiBkYXRhT2JqZWN0LCBTdHJpbmcmIHVybCwgU3RyaW5nKiB0aXRsZSkgCit7CisgICAgYm9v
bCBzdWNjZWVkZWQgPSBmYWxzZTsKKyNpZiBQTEFURk9STShDRikKKyAgICBXQ0hBUiBmaWxlbmFt
ZVtNQVhfUEFUSF07CisgICAgV0NIQVIgdXJsQnVmZmVyW0lOVEVSTkVUX01BWF9VUkxfTEVOR1RI
XTsKKworICAgIGlmICghZGF0YU9iamVjdC0+Y29udGFpbnMoY2ZIRHJvcEZvcm1hdCgpLT5jZkZv
cm1hdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHdjc2NweShmaWxlbmFtZSwgZGF0
YU9iamVjdC0+Z2V0KGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpWzBdLmNoYXJhY3RlcnMoKSk7
CisgICAgaWYgKF93Y3NpY21wKFBhdGhGaW5kRXh0ZW5zaW9uVyhmaWxlbmFtZSksIEwiLnVybCIp
KQorICAgICAgICByZXR1cm4gZmFsc2U7ICAgIAorCisgICAgaWYgKCFHZXRQcml2YXRlUHJvZmls
ZVN0cmluZ1coTCJJbnRlcm5ldFNob3J0Y3V0IiwgTCJ1cmwiLCAwLCB1cmxCdWZmZXIsIFdURl9B
UlJBWV9MRU5HVEgodXJsQnVmZmVyKSwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBpZiAodGl0bGUpIHsKKyAgICAgICAgUGF0aFJlbW92ZUV4dGVuc2lvbihmaWxlbmFt
ZSk7CisgICAgICAgICp0aXRsZSA9IFN0cmluZygoVUNoYXIqKWZpbGVuYW1lKTsKKyAgICB9Cisg
ICAgCisgICAgdXJsID0gU3RyaW5nKChVQ2hhciopdXJsQnVmZmVyKTsKKyAgICBzdWNjZWVkZWQg
PSB0cnVlOworI2VuZGlmCisgICAgcmV0dXJuIHN1Y2NlZWRlZDsKK30KKwogc3RhdGljIFN0cmlu
ZyBleHRyYWN0VVJMKGNvbnN0IFN0cmluZyAmaW5VUkwsIFN0cmluZyogdGl0bGUpCiB7CiAgICAg
U3RyaW5nIHVybCA9IGluVVJMOwpAQCAtMzg2LDYgKzQxNCwzNyBAQCBTdHJpbmcgZ2V0VVJMKElE
YXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBECiAgICAgcmV0dXJuIHVybDsKIH0KIAorU3RyaW5nIGdl
dFVSTChjb25zdCBEcmFnRGF0YU1hcCogZGF0YSwgRHJhZ0RhdGE6OkZpbGVuYW1lQ29udmVyc2lv
blBvbGljeSBmaWxlbmFtZVBvbGljeSwgU3RyaW5nKiB0aXRsZSkKK3sKKyAgICBTdHJpbmcgdXJs
OworCisgICAgaWYgKGdldFdlYkxvY0RhdGEoZGF0YSwgdXJsLCB0aXRsZSkpCisgICAgICAgIHJl
dHVybiB1cmw7CisgICAgaWYgKGRhdGEtPmNvbnRhaW5zKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQp
KQorICAgICAgICByZXR1cm4gZXh0cmFjdFVSTChkYXRhLT5nZXQodXJsV0Zvcm1hdCgpLT5jZkZv
cm1hdClbMF0sIHRpdGxlKTsKKyAgICBpZiAoZGF0YS0+Y29udGFpbnModXJsRm9ybWF0KCktPmNm
Rm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIGV4dHJhY3RVUkwoZGF0YS0+Z2V0KHVybEZvcm1hdCgp
LT5jZkZvcm1hdClbMF0sIHRpdGxlKTsKKyNpZiBQTEFURk9STShDRikKKyAgICBpZiAoZmlsZW5h
bWVQb2xpY3kgIT0gRHJhZ0RhdGE6OkNvbnZlcnRGaWxlbmFtZXMpCisgICAgICAgIHJldHVybiB1
cmw7CisKKyAgICBTdHJpbmcgc3RyaW5nRGF0YTsKKyAgICBpZiAoZGF0YS0+Y29udGFpbnMoZmls
ZW5hbWVXRm9ybWF0KCktPmNmRm9ybWF0KSkKKyAgICAgICAgc3RyaW5nRGF0YSA9IGRhdGEtPmdl
dChmaWxlbmFtZVdGb3JtYXQoKS0+Y2ZGb3JtYXQpWzBdOworICAgIGVsc2UgaWYgKGRhdGEtPmNv
bnRhaW5zKGZpbGVuYW1lRm9ybWF0KCktPmNmRm9ybWF0KSkKKyAgICAgICAgc3RyaW5nRGF0YSA9
IGRhdGEtPmdldChmaWxlbmFtZUZvcm1hdCgpLT5jZkZvcm1hdClbMF07CisKKyAgICBpZiAoIXN0
cmluZ0RhdGEuaXNFbXB0eSgpICYmIChQYXRoRmlsZUV4aXN0cyhzdHJpbmdEYXRhLmNoYXJhY3Rl
cnMoKSkgfHwgUGF0aElzVU5DKHN0cmluZ0RhdGEuY2hhcmFjdGVycygpKSkpIHsKKyAgICAgICAg
UmV0YWluUHRyPENGU3RyaW5nUmVmPiBwYXRoQXNDRlN0cmluZyhBZG9wdENGLCBDRlN0cmluZ0Ny
ZWF0ZVdpdGhDaGFyYWN0ZXJzKGtDRkFsbG9jYXRvckRlZmF1bHQsIChjb25zdCBVbmlDaGFyICop
c3RyaW5nRGF0YS5jaGFyYWN0ZXJzKCksIHN0cmluZ0RhdGEubGVuZ3RoKCkgLSAxKSk7CisgICAg
ICAgIGlmICh1cmxGcm9tUGF0aChwYXRoQXNDRlN0cmluZy5nZXQoKSwgdXJsKSkgeworICAgICAg
ICAgICAgaWYgKHRpdGxlKQorICAgICAgICAgICAgICAgICp0aXRsZSA9IHVybDsKKyAgICAgICAg
fQorICAgIH0KKyNlbmRpZgorICAgIHJldHVybiB1cmw7Cit9CisKIFN0cmluZyBnZXRQbGFpblRl
eHQoSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIGJvb2wmIHN1Y2Nlc3MpCiB7CiAgICAgU1RHTUVE
SVVNIHN0b3JlOwpAQCAtNDE1LDYgKzQ3NCwxOSBAQCBTdHJpbmcgZ2V0UGxhaW5UZXh0KElEYXRh
T2JqZWN0KiBkYXRhT2JqCiAgICAgcmV0dXJuIHRleHQ7CiB9CiAKK1N0cmluZyBnZXRQbGFpblRl
eHQoY29uc3QgRHJhZ0RhdGFNYXAqIGRhdGEpCit7CisgICAgU3RyaW5nIHRleHQ7CisgICAgCisg
ICAgaWYgKGRhdGEtPmNvbnRhaW5zKHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpKQorICAg
ICAgICB0ZXh0ID0gZGF0YS0+Z2V0KHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpWzBdOwor
ICAgIGVsc2UgaWYgKGRhdGEtPmNvbnRhaW5zKHBsYWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCkp
CisgICAgICAgIHRleHQgPSBkYXRhLT5nZXQocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KVsw
XTsKKyAgICBlbHNlCisgICAgICAgIHRleHQgPSBnZXRVUkwoZGF0YSwgRHJhZ0RhdGE6OkRvTm90
Q29udmVydEZpbGVuYW1lcyk7CisgICAgcmV0dXJuIHRleHQ7Cit9CisKIFN0cmluZyBnZXRUZXh0
SFRNTChJRGF0YU9iamVjdCogZGF0YSwgYm9vbCYgc3VjY2VzcykKIHsKICAgICBTVEdNRURJVU0g
c3RvcmU7CkBAIC00MzAsNiArNTAyLDExIEBAIFN0cmluZyBnZXRUZXh0SFRNTChJRGF0YU9iamVj
dCogZGF0YSwgYm8KICAgICByZXR1cm4gaHRtbDsKIH0KIAorU3RyaW5nIGdldFRleHRIVE1MKGNv
bnN0IERyYWdEYXRhTWFwKiBkYXRhKQoreworICAgIHJldHVybiBkYXRhLT5nZXQodGV4dGh0bWxG
b3JtYXQoKS0+Y2ZGb3JtYXQpWzBdOworfQorCiBTdHJpbmcgZ2V0Q0ZIVE1MKElEYXRhT2JqZWN0
KiBkYXRhLCBib29sJiBzdWNjZXNzKQogewogICAgIFN0cmluZyBjZmh0bWwgPSBnZXRGdWxsQ0ZI
VE1MKGRhdGEsIHN1Y2Nlc3MpOwpAQCAtNDM4LDE4ICs1MTUsMzYgQEAgU3RyaW5nIGdldENGSFRN
TChJRGF0YU9iamVjdCogZGF0YSwgYm9vbAogICAgIHJldHVybiBTdHJpbmcoKTsKIH0KIAorU3Ry
aW5nIGdldENGSFRNTChjb25zdCBEcmFnRGF0YU1hcCogZGF0YU1hcCkKK3sKKyAgICBTdHJpbmcg
Y2ZodG1sID0gZGF0YU1hcC0+Z2V0KGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQpWzBdOworICAgIHJl
dHVybiBleHRyYWN0TWFya3VwRnJvbUNGSFRNTChjZmh0bWwpOworfQorCiBQYXNzUmVmUHRyPERv
Y3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUZpbGVuYW1lcyhEb2N1bWVudCosIGNvbnN0IElE
YXRhT2JqZWN0KikKIHsKICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRl
IGZyYWdtZW50cyBmcm9tIGZpbGVzCiAgICAgcmV0dXJuIDA7CiB9CiAKK1Bhc3NSZWZQdHI8RG9j
dW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tRmlsZW5hbWVzKERvY3VtZW50KiwgY29uc3QgRHJh
Z0RhdGFNYXAqKQoreworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUg
ZnJhZ21lbnRzIGZyb20gZmlsZXMKKyAgICByZXR1cm4gMDsKK30KKwogYm9vbCBjb250YWluc0Zp
bGVuYW1lcyhjb25zdCBJRGF0YU9iamVjdCopCiB7CiAgICAgLy8gRklYTUU6IFdlJ2xsIHdhbnQg
dG8gdXBkYXRlIHRoaXMgb25jZSB3ZSBjYW4gcHJvZHVjZSBmcmFnbWVudHMgZnJvbSBmaWxlcwog
ICAgIHJldHVybiBmYWxzZTsKIH0KIAorYm9vbCBjb250YWluc0ZpbGVuYW1lcyhjb25zdCBEcmFn
RGF0YU1hcCopCit7CisgICAgLy8gRklYTUU6IFdlJ2xsIHdhbnQgdG8gdXBkYXRlIHRoaXMgb25j
ZSB3ZSBjYW4gcHJvZHVjZSBmcmFnbWVudHMgZnJvbSBmaWxlcworICAgIHJldHVybiBmYWxzZTsK
K30KKwogLy8gQ29udmVydCBhIFN0cmluZyBjb250YWluaW5nIENGX0hUTUwgZm9ybWF0dGVkIHRl
eHQgdG8gYSBEb2N1bWVudEZyYWdtZW50CiBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZy
YWdtZW50RnJvbUNGSFRNTChEb2N1bWVudCogZG9jLCBjb25zdCBTdHJpbmcmIGNmaHRtbCkKIHsK
QEAgLTQ4OSw5ICs1ODQsMTA3IEBAIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21l
bnRGcm8KICAgICByZXR1cm4gMDsKIH0KIAorUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBm
cmFnbWVudEZyb21IVE1MKERvY3VtZW50KiBkb2MsIGNvbnN0IERyYWdEYXRhTWFwKiBkYXRhKSAK
K3sKKyAgICBpZiAoIWRvYyB8fCAhZGF0YSB8fCBkYXRhLT5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgaWYgKGRhdGEtPmNvbnRhaW5zKGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQp
KQorICAgICAgICBpZiAoUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZy
YWdtZW50RnJvbUNGSFRNTChkb2MsIGRhdGEtPmdldChodG1sRm9ybWF0KCktPmNmRm9ybWF0KVsw
XSkpCisgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisKKyAgICBTdHJpbmcgc3JjVVJMOwor
ICAgIGlmIChkYXRhLT5jb250YWlucyh0ZXh0aHRtbEZvcm1hdCgpLT5jZkZvcm1hdCkpCisgICAg
ICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21NYXJrdXAoZG9jLCBkYXRhLT5nZXQodGV4dGh0
bWxGb3JtYXQoKS0+Y2ZGb3JtYXQpWzBdLCBzcmNVUkwsIEZyYWdtZW50U2NyaXB0aW5nTm90QWxs
b3dlZCk7CisKKyAgICByZXR1cm4gMDsKK30KKwogYm9vbCBjb250YWluc0hUTUwoSURhdGFPYmpl
Y3QqIGRhdGEpCiB7CiAgICAgcmV0dXJuIFNVQ0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEodGV4
dGh0bWxGb3JtYXQoKSkpIHx8IFNVQ0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEoaHRtbEZvcm1h
dCgpKSk7CiB9CiAKK2Jvb2wgY29udGFpbnNIVE1MKGNvbnN0IERyYWdEYXRhTWFwKiBkYXRhKQor
eworICAgIHJldHVybiBkYXRhLT5jb250YWlucyh0ZXh0aHRtbEZvcm1hdCgpLT5jZkZvcm1hdCkg
fHwgZGF0YS0+Y29udGFpbnMoaHRtbEZvcm1hdCgpLT5jZkZvcm1hdCk7Cit9CisKK3ZvaWQgZ2V0
Q2xpcGJvYXJkRGF0YShJRGF0YU9iamVjdCAqZGF0YU9iamVjdCwgVUlOVCBmb3JtYXQsIFZlY3Rv
cjxTdHJpbmc+JiBkYXRhU3RyaW5ncykKK3sKKyAgICBTVEdNRURJVU0gc3RvcmU7CisgICAgaWYg
KGZvcm1hdCA9PSBodG1sRm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAgIGlmIChGQUlMRUQo
ZGF0YU9iamVjdC0+R2V0RGF0YShodG1sRm9ybWF0KCksICZzdG9yZSkpKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAvLyBNUyBIVE1MIEZvcm1hdCBwYXJzaW5nCisgICAgICAgIGNoYXIq
IGRhdGFCbG9iID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkp
OworICAgICAgICBTSVpFX1QgZGF0YVNpemUgPSA6Okdsb2JhbFNpemUoc3RvcmUuaEdsb2JhbCk7
CisgICAgICAgIGRhdGFTdHJpbmdzLmFwcGVuZChTdHJpbmcoVVRGOEVuY29kaW5nKCkuZGVjb2Rl
KGRhdGFCbG9iLCBkYXRhU2l6ZSkpKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9i
YWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgfSBlbHNlIGlmIChm
b3JtYXQgPT0gdGV4dGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKKyAgICAgICAgaWYgKEZBSUxF
RChkYXRhT2JqZWN0LT5HZXREYXRhKHRleHRodG1sRm9ybWF0KCksICZzdG9yZSkpKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3RyaW5nKHN0YXRpY19j
YXN0PFVDaGFyKj4oR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKSksIDo6R2xvYmFsU2l6ZShzdG9y
ZS5oR2xvYmFsKSAvIHNpemVvZihVQ2hhcikpKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3Jl
LmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgfSBlbHNl
IGlmIChmb3JtYXQgPT0gcGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAgIGlm
IChGQUlMRUQoZGF0YU9iamVjdC0+R2V0RGF0YShwbGFpblRleHRGb3JtYXQoKSwgJnN0b3JlKSkp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRhdGFTdHJpbmdzLmFwcGVuZChTdHJpbmco
c3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpKSk7CisgICAgICAg
IEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgm
c3RvcmUpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZG
b3JtYXQpIHsKKyAgICAgICAgaWYgKEZBSUxFRChkYXRhT2JqZWN0LT5HZXREYXRhKHBsYWluVGV4
dFdGb3JtYXQoKSwgJnN0b3JlKSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRhdGFT
dHJpbmdzLmFwcGVuZChTdHJpbmcoc3RhdGljX2Nhc3Q8VUNoYXIqPihHbG9iYWxMb2NrKHN0b3Jl
LmhHbG9iYWwpKSwgOjpHbG9iYWxTaXplKHN0b3JlLmhHbG9iYWwpIC8gc2l6ZW9mKFVDaGFyKSkp
OworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VT
dGdNZWRpdW0oJnN0b3JlKTsKKyNpZiBQTEFURk9STShDRikKKyAgICB9IGVsc2UgaWYgKGZvcm1h
dCA9PSBjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAgIGlmIChGQUlMRUQoZGF0
YU9iamVjdC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZzdG9yZSkpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnByZXRfY2FzdDxIRFJPUD4o
R2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKSk7CisgICAgICAgIGlmICghaGRyb3ApCisgICAgICAg
ICAgICByZXR1cm47CisKKyAgICAgICAgV0NIQVIgZmlsZW5hbWVbTUFYX1BBVEhdOworICAgICAg
ICBVSU5UIGZpbGVDb3VudCA9IERyYWdRdWVyeUZpbGVXKGhkcm9wLCAweEZGRkZGRkZGLCAwLCAw
KTsKKyAgICAgICAgZm9yIChVSU5UIGkgPSAwOyBpIDwgZmlsZUNvdW50OyBpKyspIHsKKyAgICAg
ICAgICAgIGlmICghRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIGksIGZpbGVuYW1lLCBXVEZfQVJSQVlf
TEVOR1RIKGZpbGVuYW1lKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICBkYXRhU3RyaW5ncy5hcHBlbmQoc3RhdGljX2Nhc3Q8VUNoYXIqPihmaWxlbmFtZSkpOworICAg
ICAgICB9CisKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBS
ZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9
PSBmaWxlbmFtZUZvcm1hdCgpLT5jZkZvcm1hdCkgeworICAgICAgICBpZiAoRkFJTEVEKGRhdGFP
YmplY3QtPkdldERhdGEoZmlsZW5hbWVGb3JtYXQoKSwgJnN0b3JlKSkpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIGRhdGFTdHJpbmdzLmFwcGVuZChTdHJpbmcoc3RhdGljX2Nhc3Q8Y2hh
cio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpKSk7CisgICAgICAgIEdsb2JhbFVubG9jayhz
dG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgIH0g
ZWxzZSBpZiAoZm9ybWF0ID09IGZpbGVuYW1lV0Zvcm1hdCgpLT5jZkZvcm1hdCkgeworICAgICAg
ICBpZiAoRkFJTEVEKGRhdGFPYmplY3QtPkdldERhdGEoZmlsZW5hbWVXRm9ybWF0KCksICZzdG9y
ZSkpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3Ry
aW5nKHN0YXRpY19jYXN0PFVDaGFyKj4oR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKSksIDo6R2xv
YmFsU2l6ZShzdG9yZS5oR2xvYmFsKSAvIHNpemVvZihVQ2hhcikpKTsKKyAgICAgICAgR2xvYmFs
VW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7
CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gdXJsRm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAg
ICAgIGlmIChGQUlMRUQoZGF0YU9iamVjdC0+R2V0RGF0YSh1cmxGb3JtYXQoKSwgJnN0b3JlKSkp
CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRhdGFTdHJpbmdzLmFwcGVuZChTdHJpbmco
c3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpKSk7CisgICAgICAg
IEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgm
c3RvcmUpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQp
IHsKKyAgICAgICAgaWYgKEZBSUxFRChkYXRhT2JqZWN0LT5HZXREYXRhKHVybFdGb3JtYXQoKSwg
JnN0b3JlKSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRhdGFTdHJpbmdzLmFwcGVu
ZChTdHJpbmcoc3RhdGljX2Nhc3Q8VUNoYXIqPihHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKSwg
OjpHbG9iYWxTaXplKHN0b3JlLmhHbG9iYWwpIC8gc2l6ZW9mKFVDaGFyKSkpOworICAgICAgICBH
bG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0
b3JlKTsKKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmgJKHJl
dmlzaW9uIDc2NjkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0
aWxpdGllc1dpbi5oCSh3b3JraW5nIGNvcHkpCkBAIC01NSwxNiArNTUsMjYgQEAgdm9pZCByZXBs
YWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bAogdm9pZCByZXBsYWNlTkJTUFdpdGhTcGFj
ZShTdHJpbmcmKTsKIAogYm9vbCBjb250YWluc0ZpbGVuYW1lcyhjb25zdCBJRGF0YU9iamVjdCop
OworYm9vbCBjb250YWluc0ZpbGVuYW1lcyhjb25zdCBEcmFnRGF0YU1hcCopOwogYm9vbCBjb250
YWluc0hUTUwoSURhdGFPYmplY3QqKTsKK2Jvb2wgY29udGFpbnNIVE1MKGNvbnN0IERyYWdEYXRh
TWFwKik7CiAKIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tRmlsZW5h
bWVzKERvY3VtZW50KiwgY29uc3QgSURhdGFPYmplY3QqKTsKK1Bhc3NSZWZQdHI8RG9jdW1lbnRG
cmFnbWVudD4gZnJhZ21lbnRGcm9tRmlsZW5hbWVzKERvY3VtZW50KiwgY29uc3QgRHJhZ0RhdGFN
YXAqKTsKIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tSFRNTChEb2N1
bWVudCosIElEYXRhT2JqZWN0Kik7CitQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdt
ZW50RnJvbUhUTUwoRG9jdW1lbnQqLCBjb25zdCBEcmFnRGF0YU1hcCopOwogUGFzc1JlZlB0cjxE
b2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21DRkhUTUwoRG9jdW1lbnQqLCBjb25zdCBTdHJp
bmcmIGNmaHRtbCk7CiAKIFN0cmluZyBnZXRVUkwoSURhdGFPYmplY3QqLCBEcmFnRGF0YTo6Rmls
ZW5hbWVDb252ZXJzaW9uUG9saWN5LCBib29sJiBzdWNjZXNzLCBTdHJpbmcqIHRpdGxlID0gMCk7
CitTdHJpbmcgZ2V0VVJMKGNvbnN0IERyYWdEYXRhTWFwKiwgRHJhZ0RhdGE6OkZpbGVuYW1lQ29u
dmVyc2lvblBvbGljeSwgU3RyaW5nKiB0aXRsZSA9IDApOwogU3RyaW5nIGdldFBsYWluVGV4dChJ
RGF0YU9iamVjdCosIGJvb2wmIHN1Y2Nlc3MpOworU3RyaW5nIGdldFBsYWluVGV4dChjb25zdCBE
cmFnRGF0YU1hcCopOwogU3RyaW5nIGdldFRleHRIVE1MKElEYXRhT2JqZWN0KiwgYm9vbCYgc3Vj
Y2Vzcyk7CitTdHJpbmcgZ2V0VGV4dEhUTUwoY29uc3QgRHJhZ0RhdGFNYXAqKTsKIFN0cmluZyBn
ZXRDRkhUTUwoSURhdGFPYmplY3QqLCBib29sJiBzdWNjZXNzKTsKK1N0cmluZyBnZXRDRkhUTUwo
Y29uc3QgRHJhZ0RhdGFNYXAqKTsKKwordm9pZCBnZXRDbGlwYm9hcmREYXRhKElEYXRhT2JqZWN0
KiwgVUlOVCBmb3JtYXQsIFZlY3RvcjxTdHJpbmc+JiBkYXRhU3RyaW5ncyk7CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBi
b2FyZFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0Ns
aXBib2FyZFdpbi5jcHAJKHJldmlzaW9uIDc2NjkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vd2luL0NsaXBib2FyZFdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0MCw3ICszNDAsOSBA
QCBleGl0OgogCiBQYXNzUmVmUHRyPENsaXBib2FyZD4gQ2xpcGJvYXJkOjpjcmVhdGUoQ2xpcGJv
YXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRHJhZ0RhdGEqIGRyYWdEYXRhLCBGcmFtZSogZnJhbWUp
CiB7Ci0gICAgcmV0dXJuIENsaXBib2FyZFdpbjo6Y3JlYXRlKERyYWdBbmREcm9wLCBkcmFnRGF0
YS0+cGxhdGZvcm1EYXRhKCksIHBvbGljeSwgZnJhbWUpOworICAgIGlmIChkcmFnRGF0YS0+cGxh
dGZvcm1EYXRhKCkpCisgICAgICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShEcmFnQW5k
RHJvcCwgZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpLCBwb2xpY3ksIGZyYW1lKTsKKyAgICByZXR1
cm4gQ2xpcGJvYXJkV2luOjpjcmVhdGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5kcmFnRGF0YU1h
cCgpLCBwb2xpY3ksIGZyYW1lKTsKIH0KIAogQ2xpcGJvYXJkV2luOjpDbGlwYm9hcmRXaW4oQ2xp
cGJvYXJkVHlwZSBjbGlwYm9hcmRUeXBlLCBJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgQ2xpcGJv
YXJkQWNjZXNzUG9saWN5IHBvbGljeSwgRnJhbWUqIGZyYW1lKQpAQCAtMzU5LDYgKzM2MSwxNSBA
QCBDbGlwYm9hcmRXaW46OkNsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlCiB7CiB9CiAKK0NsaXBi
b2FyZFdpbjo6Q2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgY29uc3Qg
RHJhZ0RhdGFNYXAmIGRhdGFNYXAsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1l
KiBmcmFtZSkKKyAgICA6IENsaXBib2FyZChwb2xpY3ksIGNsaXBib2FyZFR5cGUpCisgICAgLCBt
X2RhdGFPYmplY3QoMCkKKyAgICAsIG1fd3JpdGFibGVEYXRhT2JqZWN0KDApCisgICAgLCBtX2Zy
YW1lKGZyYW1lKQorICAgICwgbV9kcmFnRGF0YU1hcChkYXRhTWFwKQoreworfQorCiBDbGlwYm9h
cmRXaW46On5DbGlwYm9hcmRXaW4oKQogewogfQpAQCAtNDQyLDE5ICs0NTMsMTkgQEAgdm9pZCBD
bGlwYm9hcmRXaW46OmNsZWFyQWxsRGF0YSgpCiBTdHJpbmcgQ2xpcGJvYXJkV2luOjpnZXREYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSwgYm9vbCYgc3VjY2VzcykgY29uc3QKIHsgICAgIAogICAgIHN1
Y2Nlc3MgPSBmYWxzZTsKLSAgICBpZiAocG9saWN5KCkgIT0gQ2xpcGJvYXJkUmVhZGFibGUgfHwg
IW1fZGF0YU9iamVjdCkKKyAgICBpZiAocG9saWN5KCkgIT0gQ2xpcGJvYXJkUmVhZGFibGUgfHwg
IW1fZGF0YU9iamVjdCB8fCBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJu
ICIiOwogCiAgICAgQ2xpcGJvYXJkRGF0YVR5cGUgZGF0YVR5cGUgPSBjbGlwYm9hcmRUeXBlRnJv
bU1JTUVUeXBlKHR5cGUpOwogICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVRl
eHQpCi0gICAgICAgIHJldHVybiBnZXRQbGFpblRleHQobV9kYXRhT2JqZWN0LmdldCgpLCBzdWNj
ZXNzKTsKKyAgICAgICAgcmV0dXJuIChtX2RhdGFPYmplY3QpID8gZ2V0UGxhaW5UZXh0KG1fZGF0
YU9iamVjdC5nZXQoKSwgc3VjY2VzcykgOiBnZXRQbGFpblRleHQoJm1fZHJhZ0RhdGFNYXApOwog
ICAgIGlmIChkYXRhVHlwZSA9PSBDbGlwYm9hcmREYXRhVHlwZVVSTCkKLSAgICAgICAgcmV0dXJu
IGdldFVSTChtX2RhdGFPYmplY3QuZ2V0KCksIERyYWdEYXRhOjpEb05vdENvbnZlcnRGaWxlbmFt
ZXMsIHN1Y2Nlc3MpOworICAgICAgICByZXR1cm4gKG1fZGF0YU9iamVjdCkgPyBnZXRVUkwobV9k
YXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252ZXJ0RmlsZW5hbWVzLCBzdWNjZXNz
KSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZpbGVuYW1l
cyk7CiAgICAgZWxzZSBpZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVUZXh0SFRNTCkg
ewotICAgICAgICBTdHJpbmcgZGF0YSA9IGdldFRleHRIVE1MKG1fZGF0YU9iamVjdC5nZXQoKSwg
c3VjY2Vzcyk7CisgICAgICAgIFN0cmluZyBkYXRhID0gKG1fZGF0YU9iamVjdCkgPyBnZXRUZXh0
SFRNTChtX2RhdGFPYmplY3QuZ2V0KCksIHN1Y2Nlc3MpIDogZ2V0VGV4dEhUTUwoJm1fZHJhZ0Rh
dGFNYXApOwogICAgICAgICBpZiAoc3VjY2VzcykKICAgICAgICAgICAgIHJldHVybiBkYXRhOwot
ICAgICAgICByZXR1cm4gZ2V0Q0ZIVE1MKG1fZGF0YU9iamVjdC5nZXQoKSwgc3VjY2Vzcyk7Cisg
ICAgICAgIHJldHVybiAobV9kYXRhT2JqZWN0KSA/IGdldENGSFRNTChtX2RhdGFPYmplY3QuZ2V0
KCksIHN1Y2Nlc3MpIDogZ2V0Q0ZIVE1MKCZtX2RyYWdEYXRhTWFwKTsKICAgICB9CiAgICAgCiAg
ICAgcmV0dXJuICIiOwpAQCAtNTEwLDIyICs1MjEsMzAgQEAgSGFzaFNldDxTdHJpbmc+IENsaXBi
b2FyZFdpbjo6dHlwZXMoKSBjbwogICAgIGlmIChwb2xpY3koKSAhPSBDbGlwYm9hcmRSZWFkYWJs
ZSAmJiBwb2xpY3koKSAhPSBDbGlwYm9hcmRUeXBlc1JlYWRhYmxlKQogICAgICAgICByZXR1cm4g
cmVzdWx0czsKIAotICAgIGlmICghbV9kYXRhT2JqZWN0KQorICAgIGlmICghbV9kYXRhT2JqZWN0
IHx8IG1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gcmVzdWx0czsKIAot
ICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOworICAgIGlmIChtX2RhdGFPYmplY3QpIHsK
KyAgICAgICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7CiAKLSAgICBpZiAoRkFJTEVEKG1f
ZGF0YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikpKQotICAgICAgICBy
ZXR1cm4gcmVzdWx0czsKKyAgICAgICAgaWYgKEZBSUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3Jt
YXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwog
Ci0gICAgaWYgKCFpdHIpCi0gICAgICAgIHJldHVybiByZXN1bHRzOwotCi0gICAgRk9STUFURVRD
IGRhdGE7CisgICAgICAgIGlmICghaXRyKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAK
LSAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJl
IG5vIG1vcmUgaXRlbXMuCi0gICAgd2hpbGUgKGl0ci0+TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19P
SykKLSAgICAgICAgYWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAgICAg
ICBGT1JNQVRFVEMgZGF0YTsKKworICAgICAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1
cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaXRlbXMuCisgICAgICAgIHdoaWxlIChp
dHItPk5leHQoMSwgJmRhdGEsIDApID09IFNfT0spCisgICAgICAgICAgICBhZGRNaW1lVHlwZXNG
b3JGb3JtYXQocmVzdWx0cywgZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChEcmFn
RGF0YU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2RyYWdEYXRhTWFwLmJlZ2luKCk7IGl0ICE9
IG1fZHJhZ0RhdGFNYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIEZPUk1BVEVUQyBkYXRh
OworICAgICAgICAgICAgZGF0YS5jZkZvcm1hdCA9ICgqaXQpLmZpcnN0OworICAgICAgICAgICAg
YWRkTWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAgICAgICB9CisgICAgfQog
CiAgICAgcmV0dXJuIHJlc3VsdHM7CiB9CkBAIC01NDAsMjcgKzU1OSwzNSBAQCBQYXNzUmVmUHRy
PEZpbGVMaXN0PiBDbGlwYm9hcmRXaW46OmZpbGVzCiAgICAgaWYgKHBvbGljeSgpICE9IENsaXBi
b2FyZFJlYWRhYmxlICYmIHBvbGljeSgpICE9IENsaXBib2FyZFR5cGVzUmVhZGFibGUpCiAgICAg
ICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7CiAKLSAgICBpZiAoIW1fZGF0YU9iamVjdCkKKyAg
ICBpZiAoIW1fZGF0YU9iamVjdCB8fCBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKICAgICAgICAg
cmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKIAotICAgIFNUR01FRElVTSBtZWRpdW07Ci0gICAgaWYg
KEZBSUxFRChtX2RhdGFPYmplY3QtPkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkp
Ci0gICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7CisgICAgaWYgKG1fZGF0YU9iamVjdCkg
eworICAgICAgICBTVEdNRURJVU0gbWVkaXVtOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0YU9i
amVjdC0+R2V0RGF0YShjZkhEcm9wRm9ybWF0KCksICZtZWRpdW0pKSkKKyAgICAgICAgICAgIHJl
dHVybiBmaWxlcy5yZWxlYXNlKCk7CisKKyAgICAgICAgSERST1AgaGRyb3AgPSByZWludGVycHJl
dF9jYXN0PEhEUk9QPihHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7CisgICAgICAgIGlmICgh
aGRyb3ApCisgICAgICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOworCisgICAgICAgIFdD
SEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKKyAgICAgICAgVUlOVCBmaWxlQ291bnQgPSBEcmFnUXVl
cnlGaWxlVyhoZHJvcCwgMHhGRkZGRkZGRiwgMCwgMCk7CisgICAgICAgIGZvciAoVUlOVCBpID0g
MDsgaSA8IGZpbGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVX
KGhkcm9wLCBpLCBmaWxlbmFtZSwgV1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZmlsZXMtPmFwcGVuZChGaWxlOjpjcmVh
dGUocmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KGZpbGVuYW1lKSkpOworICAgICAgICB9CiAKLSAg
ICBIRFJPUCBoZHJvcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8SERST1A+KEdsb2JhbExvY2sobWVkaXVt
LmhHbG9iYWwpKTsKLSAgICBpZiAoIWhkcm9wKQorICAgICAgICBHbG9iYWxVbmxvY2sobWVkaXVt
LmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZtZWRpdW0pOwogICAgICAgICBy
ZXR1cm4gZmlsZXMucmVsZWFzZSgpOwotCi0gICAgV0NIQVIgZmlsZW5hbWVbTUFYX1BBVEhdOwot
ICAgIFVJTlQgZmlsZUNvdW50ID0gRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIDB4RkZGRkZGRkYsIDAs
IDApOwotICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3VudDsgaSsrKSB7Ci0gICAgICAg
IGlmICghRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIGksIGZpbGVuYW1lLCBXVEZfQVJSQVlfTEVOR1RI
KGZpbGVuYW1lKSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZmlsZXMtPmFwcGVu
ZChGaWxlOjpjcmVhdGUocmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KGZpbGVuYW1lKSkpOwogICAg
IH0KLQotICAgIEdsb2JhbFVubG9jayhtZWRpdW0uaEdsb2JhbCk7Ci0gICAgUmVsZWFzZVN0Z01l
ZGl1bSgmbWVkaXVtKTsKKyAgICBpZiAoIW1fZHJhZ0RhdGFNYXAuY29udGFpbnMoY2ZIRHJvcEZv
cm1hdCgpLT5jZkZvcm1hdCkpCisgICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7CisgICAg
VmVjdG9yPFN0cmluZz4gZmlsZXNWZWN0b3IgPSBtX2RyYWdEYXRhTWFwLmdldChjZkhEcm9wRm9y
bWF0KCktPmNmRm9ybWF0KTsKKyAgICBmb3IgKFZlY3RvcjxTdHJpbmc+OjppdGVyYXRvciBpdCA9
IGZpbGVzVmVjdG9yLmJlZ2luKCk7IGl0ICE9IGZpbGVzVmVjdG9yLmVuZCgpOyArK2l0KQorICAg
ICAgICBmaWxlcy0+YXBwZW5kKEZpbGU6OmNyZWF0ZSgoKml0KS5jaGFyYWN0ZXJzKCkpKTsKICAg
ICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwogI2VuZGlmCiB9CkBAIC03NzgsMjUgKzgwNSwyOCBA
QCB2b2lkIENsaXBib2FyZFdpbjo6d3JpdGVQbGFpblRleHQoY29uc3QKICAgICAKIGJvb2wgQ2xp
cGJvYXJkV2luOjpoYXNEYXRhKCkKIHsKLSAgICBpZiAoIW1fZGF0YU9iamVjdCkKKyAgICBpZiAo
IW1fZGF0YU9iamVjdCAmJiBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJu
IGZhbHNlOwogCi0gICAgQ09NUHRyPElFbnVtRk9STUFURVRDPiBpdHI7Ci0gICAgaWYgKEZBSUxF
RChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChtX2RhdGFPYmplY3QpIHsKKyAgICAgICAgQ09NUHRy
PElFbnVtRk9STUFURVRDPiBpdHI7CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5F
bnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CiAKLSAgICBpZiAoIWl0cikKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAo
IWl0cikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIEZPUk1BVEVUQyBkYXRhOwor
ICAgICAgICBGT1JNQVRFVEMgZGF0YTsKIAotICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJl
dHVybnMgU19GQUxTRSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcy4KLSAgICBpZiAoaXRyLT5O
ZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKSB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0
IG9uZSBpdGVtIGluIHRoZSBJRGF0YU9iamVjdAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
CisgICAgICAgIC8vIElFbnVtRk9STUFURVRDOjpOZXh0IHJldHVybnMgU19GQUxTRSBpZiB0aGVy
ZSBhcmUgbm8gbW9yZSBpdGVtcy4KKyAgICAgICAgaWYgKGl0ci0+TmV4dCgxLCAmZGF0YSwgMCkg
PT0gU19PSykgeworICAgICAgICAgICAgLy8gVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGl0ZW0gaW4g
dGhlIElEYXRhT2JqZWN0CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQogCi0g
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVy
biAhbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCk7CiB9CiAKIHZvaWQgQ2xpcGJvYXJkV2luOjpzZXRF
eHRlcm5hbERhdGFPYmplY3QoSURhdGFPYmplY3QgKmRhdGFPYmplY3QpCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oCShyZXZpc2lvbiA3NjY5MSkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uaAkod29ya2luZyBjb3B5
KQpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgIkNPTVB0ci5oIgogI2luY2x1ZGUgIkNhY2hl
ZFJlc291cmNlQ2xpZW50LmgiCiAjaW5jbHVkZSAiQ2xpcGJvYXJkLmgiCisjaW5jbHVkZSAiRHJh
Z0RhdGEuaCIKIAogc3RydWN0IElEYXRhT2JqZWN0OwogCkBAIC01MSw2ICs1MiwxMCBAQCBwdWJs
aWM6CiAgICAgewogICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlw
Ym9hcmRUeXBlLCBkYXRhT2JqZWN0LCBwb2xpY3ksIGZyYW1lKSk7CiAgICAgfQorICAgIHN0YXRp
YyBQYXNzUmVmUHRyPENsaXBib2FyZFdpbj4gY3JlYXRlKENsaXBib2FyZFR5cGUgY2xpcGJvYXJk
VHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmIGRhdGFNYXAsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBw
b2xpY3ksIEZyYW1lKiBmcmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcg
Q2xpcGJvYXJkV2luKGNsaXBib2FyZFR5cGUsIGRhdGFNYXAsIHBvbGljeSwgZnJhbWUpKTsKKyAg
ICB9CiAgICAgfkNsaXBib2FyZFdpbigpOwogCiAgICAgdm9pZCBjbGVhckRhdGEoY29uc3QgU3Ry
aW5nJiB0eXBlKTsKQEAgLTgwLDEyICs4NSwxNCBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIENs
aXBib2FyZFdpbihDbGlwYm9hcmRUeXBlLCBJRGF0YU9iamVjdCosIENsaXBib2FyZEFjY2Vzc1Bv
bGljeSwgRnJhbWUqKTsKICAgICBDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSwgV0NEYXRhT2Jq
ZWN0KiwgQ2xpcGJvYXJkQWNjZXNzUG9saWN5LCBGcmFtZSopOworICAgIENsaXBib2FyZFdpbihD
bGlwYm9hcmRUeXBlLCBjb25zdCBEcmFnRGF0YU1hcCYsIENsaXBib2FyZEFjY2Vzc1BvbGljeSwg
RnJhbWUqKTsKIAogICAgIHZvaWQgcmVzZXRGcm9tQ2xpcGJvYXJkKCk7CiAgICAgdm9pZCBzZXRE
cmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqLCBOb2RlKiwgY29uc3QgSW50UG9pbnQmKTsKIAogICAgIENP
TVB0cjxJRGF0YU9iamVjdD4gbV9kYXRhT2JqZWN0OwogICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+
IG1fd3JpdGFibGVEYXRhT2JqZWN0OworICAgIERyYWdEYXRhTWFwIG1fZHJhZ0RhdGFNYXA7CiAg
ICAgRnJhbWUqIG1fZnJhbWU7CiB9OwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93
aW4vRHJhZ0RhdGFXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L3dpbi9EcmFnRGF0YVdpbi5jcHAJKHJldmlzaW9uIDc2NjkxKQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdEYXRhV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNiArMjYs
NyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkRyYWdEYXRhLmgiCiAKKyNpbmNs
dWRlICJDT01QdHIuaCIKICNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKICNpbmNs
dWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKQEAgLTM1LDY1ICsz
NiwxMDkgQEAKICNpbmNsdWRlIDxvYmppZGwuaD4KICNpbmNsdWRlIDxzaGx3YXBpLmg+CiAjaW5j
bHVkZSA8d2luaW5ldC5oPgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3Rm
L0hhc2htYXAuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9S
ZWZQdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitEcmFnRGF0YTo6RHJhZ0RhdGEoY29u
c3QgRHJhZ0RhdGFNYXAmIGRhdGEsIGNvbnN0IEludFBvaW50JiBjbGllbnRQb3NpdGlvbiwgY29u
c3QgSW50UG9pbnQmIGdsb2JhbFBvc2l0aW9uLAorICAgIERyYWdPcGVyYXRpb24gc291cmNlT3Bl
cmF0aW9uTWFzaywgRHJhZ0FwcGxpY2F0aW9uRmxhZ3MgZmxhZ3MpCisgICAgOiBtX2NsaWVudFBv
c2l0aW9uKGNsaWVudFBvc2l0aW9uKQorICAgICwgbV9nbG9iYWxQb3NpdGlvbihnbG9iYWxQb3Np
dGlvbikKKyAgICAsIG1fcGxhdGZvcm1EcmFnRGF0YSgwKQorICAgICwgbV9kcmFnZ2luZ1NvdXJj
ZU9wZXJhdGlvbk1hc2soc291cmNlT3BlcmF0aW9uTWFzaykKKyAgICAsIG1fYXBwbGljYXRpb25G
bGFncyhmbGFncykKKyAgICAsIG1fZHJhZ0RhdGFNYXAoZGF0YSkKK3sKK30KKwogYm9vbCBEcmFn
RGF0YTo6Y29udGFpbnNVUkwoRnJhbWUqLCBGaWxlbmFtZUNvbnZlcnNpb25Qb2xpY3kgZmlsZW5h
bWVQb2xpY3kpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIFNVQ0NFRURFRChtX3BsYXRmb3JtRHJhZ0Rh
dGEtPlF1ZXJ5R2V0RGF0YSh1cmxXRm9ybWF0KCkpKSAKLSAgICAgICAgfHwgU1VDQ0VFREVEKG1f
cGxhdGZvcm1EcmFnRGF0YS0+UXVlcnlHZXREYXRhKHVybEZvcm1hdCgpKSkKLSAgICAgICAgfHwg
KGZpbGVuYW1lUG9saWN5ID09IENvbnZlcnRGaWxlbmFtZXMKLSAgICAgICAgICAgICYmIChTVUND
RUVERUQobV9wbGF0Zm9ybURyYWdEYXRhLT5RdWVyeUdldERhdGEoZmlsZW5hbWVXRm9ybWF0KCkp
KQotICAgICAgICAgICAgICAgIHx8IFNVQ0NFRURFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5
R2V0RGF0YShmaWxlbmFtZUZvcm1hdCgpKSkpKTsKKyAgICBpZiAobV9wbGF0Zm9ybURyYWdEYXRh
KQorICAgICAgICByZXR1cm4gU1VDQ0VFREVEKG1fcGxhdGZvcm1EcmFnRGF0YS0+UXVlcnlHZXRE
YXRhKHVybFdGb3JtYXQoKSkpIAorICAgICAgICAgICAgfHwgU1VDQ0VFREVEKG1fcGxhdGZvcm1E
cmFnRGF0YS0+UXVlcnlHZXREYXRhKHVybEZvcm1hdCgpKSkKKyAgICAgICAgICAgIHx8IChmaWxl
bmFtZVBvbGljeSA9PSBDb252ZXJ0RmlsZW5hbWVzCisgICAgICAgICAgICAgICAgJiYgKFNVQ0NF
RURFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YShmaWxlbmFtZVdGb3JtYXQoKSkp
CisgICAgICAgICAgICAgICAgICAgIHx8IFNVQ0NFRURFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1
ZXJ5R2V0RGF0YShmaWxlbmFtZUZvcm1hdCgpKSkpKTsKKyAgICByZXR1cm4gbV9kcmFnRGF0YU1h
cC5jb250YWlucyh1cmxXRm9ybWF0KCktPmNmRm9ybWF0KSB8fCBtX2RyYWdEYXRhTWFwLmNvbnRh
aW5zKHVybEZvcm1hdCgpLT5jZkZvcm1hdCkKKyAgICAgICAgfHwgKGZpbGVuYW1lUG9saWN5ID09
IENvbnZlcnRGaWxlbmFtZXMgJiYgKG1fZHJhZ0RhdGFNYXAuY29udGFpbnMoZmlsZW5hbWVXRm9y
bWF0KCktPmNmRm9ybWF0KSB8fCBtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGZpbGVuYW1lRm9ybWF0
KCktPmNmRm9ybWF0KSkpOworfQorCitEcmFnRGF0YU1hcCBEcmFnRGF0YTo6ZHJhZ0RhdGFNYXAo
KQoreworICAgIGlmICghbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkgfHwgIW1fcGxhdGZvcm1EcmFn
RGF0YSkKKyAgICAgICAgcmV0dXJuIG1fZHJhZ0RhdGFNYXA7CisgICAgLy8gRW51bWVyYXRlIGNs
aXBib2FyZCBjb250ZW50IGFuZCBsb2FkIGl0IGluIHRoZSBtYXAuCisgICAgQ09NUHRyPElFbnVt
Rk9STUFURVRDPiBpdHI7CisKKyAgICBpZiAoRkFJTEVEKG1fcGxhdGZvcm1EcmFnRGF0YS0+RW51
bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikpIHx8ICFpdHIpCisgICAgICAgIHJldHVybiBt
X2RyYWdEYXRhTWFwOworCisgICAgRk9STUFURVRDIGRhdGFGb3JtYXQ7CisgICAgd2hpbGUgKGl0
ci0+TmV4dCgxLCAmZGF0YUZvcm1hdCwgMCkgPT0gU19PSykgeworICAgICAgICBWZWN0b3I8U3Ry
aW5nPiBkYXRhU3RyaW5nczsKKyAgICAgICAgZ2V0Q2xpcGJvYXJkRGF0YShtX3BsYXRmb3JtRHJh
Z0RhdGEsIGRhdGFGb3JtYXQuY2ZGb3JtYXQsIGRhdGFTdHJpbmdzKTsKKyAgICAgICAgaWYgKCFk
YXRhU3RyaW5ncy5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2RyYWdEYXRhTWFwLnNldChkYXRh
Rm9ybWF0LmNmRm9ybWF0LCBkYXRhU3RyaW5ncyk7IAorICAgIH0KKyAgICByZXR1cm4gbV9kcmFn
RGF0YU1hcDsKIH0KIAogU3RyaW5nIERyYWdEYXRhOjphc1VSTChGcmFtZSosIEZpbGVuYW1lQ29u
dmVyc2lvblBvbGljeSBmaWxlbmFtZVBvbGljeSwgU3RyaW5nKiB0aXRsZSkgY29uc3QKIHsKICAg
ICBib29sIHN1Y2Nlc3M7Ci0gICAgcmV0dXJuIGdldFVSTChtX3BsYXRmb3JtRHJhZ0RhdGEsIGZp
bGVuYW1lUG9saWN5LCBzdWNjZXNzLCB0aXRsZSk7CisgICAgcmV0dXJuIChtX3BsYXRmb3JtRHJh
Z0RhdGEpID8gZ2V0VVJMKG1fcGxhdGZvcm1EcmFnRGF0YSwgZmlsZW5hbWVQb2xpY3ksIHN1Y2Nl
c3MsIHRpdGxlKSA6IGdldFVSTCgmbV9kcmFnRGF0YU1hcCwgZmlsZW5hbWVQb2xpY3ksIHRpdGxl
KTsKIH0KIAogYm9vbCBEcmFnRGF0YTo6Y29udGFpbnNGaWxlcygpIGNvbnN0CiB7Ci0gICAgcmV0
dXJuIFNVQ0NFRURFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YShjZkhEcm9wRm9y
bWF0KCkpKTsKKyAgICByZXR1cm4gKG1fcGxhdGZvcm1EcmFnRGF0YSkgPyBTVUNDRUVERUQobV9w
bGF0Zm9ybURyYWdEYXRhLT5RdWVyeUdldERhdGEoY2ZIRHJvcEZvcm1hdCgpKSkgOiBtX2RyYWdE
YXRhTWFwLmNvbnRhaW5zKGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpOwogfQogCiB2b2lkIERy
YWdEYXRhOjphc0ZpbGVuYW1lcyhWZWN0b3I8U3RyaW5nPiYgcmVzdWx0KSBjb25zdAogewotICAg
IFdDSEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKLSAgICAKLSAgICBTVEdNRURJVU0gbWVkaXVtOwot
ICAgIGlmIChGQUlMRUQobV9wbGF0Zm9ybURyYWdEYXRhLT5HZXREYXRhKGNmSERyb3BGb3JtYXQo
KSwgJm1lZGl1bSkpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgSERST1AgaGRyb3AgPSAo
SERST1ApR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCk7Ci0gICAgCi0gICAgaWYgKCFoZHJvcCkK
LSAgICAgICAgcmV0dXJuOworICAgIGlmIChtX3BsYXRmb3JtRHJhZ0RhdGEpIHsKKyAgICAgICAg
V0NIQVIgZmlsZW5hbWVbTUFYX1BBVEhdOworICAgICAgICAKKyAgICAgICAgU1RHTUVESVVNIG1l
ZGl1bTsKKyAgICAgICAgaWYgKEZBSUxFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPkdldERhdGEoY2ZI
RHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAor
ICAgICAgICBIRFJPUCBoZHJvcCA9IChIRFJPUClHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKTsK
KyAgICAgICAgCisgICAgICAgIGlmICghaGRyb3ApCisgICAgICAgICAgICByZXR1cm47CiAKLSAg
ICBjb25zdCB1bnNpZ25lZCBudW1GaWxlcyA9IERyYWdRdWVyeUZpbGVXKGhkcm9wLCAweEZGRkZG
RkZGLCAwLCAwKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtRmlsZXM7IGkrKykg
ewotICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCAwLCBmaWxlbmFtZSwgV1RGX0FS
UkFZX0xFTkdUSChmaWxlbmFtZSkpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHJl
c3VsdC5hcHBlbmQoKFVDaGFyKilmaWxlbmFtZSk7Ci0gICAgfQorICAgICAgICBjb25zdCB1bnNp
Z25lZCBudW1GaWxlcyA9IERyYWdRdWVyeUZpbGVXKGhkcm9wLCAweEZGRkZGRkZGLCAwLCAwKTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUZpbGVzOyBpKyspIHsKKyAgICAg
ICAgICAgIGlmICghRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIDAsIGZpbGVuYW1lLCBXVEZfQVJSQVlf
TEVOR1RIKGZpbGVuYW1lKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICByZXN1bHQuYXBwZW5kKChVQ2hhciopZmlsZW5hbWUpOworICAgICAgICB9CiAKLSAgICAvLyBG
cmVlIHVwIG1lbW9yeSBmcm9tIGRyYWcKLSAgICBEcmFnRmluaXNoKGhkcm9wKTsKKyAgICAgICAg
Ly8gRnJlZSB1cCBtZW1vcnkgZnJvbSBkcmFnCisgICAgICAgIERyYWdGaW5pc2goaGRyb3ApOwog
Ci0gICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgR2xvYmFsVW5sb2Nr
KG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXN1bHQgPSBt
X2RyYWdEYXRhTWFwLmdldChjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KTsKIH0KIAogYm9vbCBE
cmFnRGF0YTo6Y29udGFpbnNQbGFpblRleHQoKSBjb25zdAogewotICAgIHJldHVybiBTVUNDRUVE
RUQobV9wbGF0Zm9ybURyYWdEYXRhLT5RdWVyeUdldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpKSkK
LSAgICAgICAgfHwgU1VDQ0VFREVEKG1fcGxhdGZvcm1EcmFnRGF0YS0+UXVlcnlHZXREYXRhKHBs
YWluVGV4dEZvcm1hdCgpKSk7CisgICAgaWYgKG1fcGxhdGZvcm1EcmFnRGF0YSkKKyAgICAgICAg
cmV0dXJuIFNVQ0NFRURFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YShwbGFpblRl
eHRXRm9ybWF0KCkpKQorICAgICAgICAgICAgfHwgU1VDQ0VFREVEKG1fcGxhdGZvcm1EcmFnRGF0
YS0+UXVlcnlHZXREYXRhKHBsYWluVGV4dEZvcm1hdCgpKSk7CisgICAgcmV0dXJuIG1fZHJhZ0Rh
dGFNYXAuY29udGFpbnMocGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1hdCkgfHwgbV9kcmFnRGF0
YU1hcC5jb250YWlucyhwbGFpblRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQpOwogfQogCiBTdHJpbmcg
RHJhZ0RhdGE6OmFzUGxhaW5UZXh0KEZyYW1lKikgY29uc3QKIHsKICAgICBib29sIHN1Y2Nlc3M7
Ci0gICAgcmV0dXJuIGdldFBsYWluVGV4dChtX3BsYXRmb3JtRHJhZ0RhdGEsIHN1Y2Nlc3MpOwor
ICAgIHJldHVybiAobV9wbGF0Zm9ybURyYWdEYXRhKSA/IGdldFBsYWluVGV4dChtX3BsYXRmb3Jt
RHJhZ0RhdGEsIHN1Y2Nlc3MpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdEYXRhTWFwKTsKIH0KIAog
Ym9vbCBEcmFnRGF0YTo6Y29udGFpbnNDb2xvcigpIGNvbnN0CkBAIC0xMDMsMTQgKzE0OCwxNiBA
QCBib29sIERyYWdEYXRhOjpjb250YWluc0NvbG9yKCkgY29uc3QKIAogYm9vbCBEcmFnRGF0YTo6
Y2FuU21hcnRSZXBsYWNlKCkgY29uc3QKIHsKLSAgICByZXR1cm4gU1VDQ0VFREVEKG1fcGxhdGZv
cm1EcmFnRGF0YS0+UXVlcnlHZXREYXRhKHNtYXJ0UGFzdGVGb3JtYXQoKSkpOyAKKyAgICBpZiAo
bV9wbGF0Zm9ybURyYWdEYXRhKQorICAgICAgICByZXR1cm4gU1VDQ0VFREVEKG1fcGxhdGZvcm1E
cmFnRGF0YS0+UXVlcnlHZXREYXRhKHNtYXJ0UGFzdGVGb3JtYXQoKSkpOworICAgIHJldHVybiBt
X2RyYWdEYXRhTWFwLmNvbnRhaW5zKHNtYXJ0UGFzdGVGb3JtYXQoKS0+Y2ZGb3JtYXQpOwogfQog
CiBib29sIERyYWdEYXRhOjpjb250YWluc0NvbXBhdGlibGVDb250ZW50KCkgY29uc3QKIHsKICAg
ICByZXR1cm4gY29udGFpbnNQbGFpblRleHQoKSB8fCBjb250YWluc1VSTCgwKSAKLSAgICAgICAg
fHwgY29udGFpbnNIVE1MKG1fcGxhdGZvcm1EcmFnRGF0YSkgCi0gICAgICAgIHx8IGNvbnRhaW5z
RmlsZW5hbWVzKG1fcGxhdGZvcm1EcmFnRGF0YSkgCisgICAgICAgIHx8ICgobV9wbGF0Zm9ybURy
YWdEYXRhKSA/IChjb250YWluc0hUTUwobV9wbGF0Zm9ybURyYWdEYXRhKSB8fCBjb250YWluc0Zp
bGVuYW1lcyhtX3BsYXRmb3JtRHJhZ0RhdGEpKQorICAgICAgICAgICAgOiAoY29udGFpbnNIVE1M
KCZtX2RyYWdEYXRhTWFwKSB8fCBjb250YWluc0ZpbGVuYW1lcygmbV9kcmFnRGF0YU1hcCkpKQog
ICAgICAgICB8fCBjb250YWluc0NvbG9yKCk7CiB9CiAKQEAgLTEyNSwxNiArMTcyLDI1IEBAIFBh
c3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gRHJhZ0RhdGE6OmEKICAgICAgKiAqIFRJRkYKICAg
ICAgKiAqIFBJQ1QKICAgICAgKi8KLSAgICAgICAgCi0gICAgIGlmIChjb250YWluc0ZpbGVuYW1l
cyhtX3BsYXRmb3JtRHJhZ0RhdGEpKQotICAgICAgICAgaWYgKFBhc3NSZWZQdHI8RG9jdW1lbnRG
cmFnbWVudD4gZnJhZ21lbnQgPSBmcmFnbWVudEZyb21GaWxlbmFtZXMoZnJhbWUtPmRvY3VtZW50
KCksIG1fcGxhdGZvcm1EcmFnRGF0YSkpCi0gICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50Owot
Ci0gICAgIGlmIChjb250YWluc0hUTUwobV9wbGF0Zm9ybURyYWdEYXRhKSkKLSAgICAgICAgIGlm
IChQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gZnJhZ21lbnRGcm9tSFRN
TChmcmFtZS0+ZG9jdW1lbnQoKSwgbV9wbGF0Zm9ybURyYWdEYXRhKSkKLSAgICAgICAgICAgICBy
ZXR1cm4gZnJhZ21lbnQ7Ci0KLSAgICAgcmV0dXJuIDA7CisgICAgIAorICAgIGlmIChtX3BsYXRm
b3JtRHJhZ0RhdGEpIHsKKyAgICAgICAgaWYgKGNvbnRhaW5zRmlsZW5hbWVzKG1fcGxhdGZvcm1E
cmFnRGF0YSkpCisgICAgICAgICAgICBpZiAoUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBm
cmFnbWVudCA9IGZyYWdtZW50RnJvbUZpbGVuYW1lcyhmcmFtZS0+ZG9jdW1lbnQoKSwgbV9wbGF0
Zm9ybURyYWdEYXRhKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisKKyAgICAg
ICAgaWYgKGNvbnRhaW5zSFRNTChtX3BsYXRmb3JtRHJhZ0RhdGEpKQorICAgICAgICAgICAgaWYg
KFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBmcmFnbWVudEZyb21IVE1M
KGZyYW1lLT5kb2N1bWVudCgpLCBtX3BsYXRmb3JtRHJhZ0RhdGEpKQorICAgICAgICAgICAgICAg
IHJldHVybiBmcmFnbWVudDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY29udGFpbnNGaWxl
bmFtZXMoJm1fZHJhZ0RhdGFNYXApKQorICAgICAgICAgICAgaWYgKFBhc3NSZWZQdHI8RG9jdW1l
bnRGcmFnbWVudD4gZnJhZ21lbnQgPSBmcmFnbWVudEZyb21GaWxlbmFtZXMoZnJhbWUtPmRvY3Vt
ZW50KCksICZtX2RyYWdEYXRhTWFwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7
CisKKyAgICAgICAgaWYgKGNvbnRhaW5zSFRNTCgmbV9kcmFnRGF0YU1hcCkpCisgICAgICAgICAg
ICBpZiAoUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJv
bUhUTUwoZnJhbWUtPmRvY3VtZW50KCksICZtX2RyYWdEYXRhTWFwKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZnJhZ21lbnQ7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBDb2xvciBEcmFn
RGF0YTo6YXNDb2xvcigpIGNvbnN0CkBAIC0xNDMsNCArMTk5LDMgQEAgQ29sb3IgRHJhZ0RhdGE6
OmFzQ29sb3IoKSBjb25zdAogfQogCiB9Ci0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>80260</attachid>
            <date>2011-01-26 16:25:21 -0800</date>
            <delta_ts>2011-01-26 17:16:16 -0800</delta_ts>
            <desc>Patch2</desc>
            <filename>dropwin.txt</filename>
            <type>text/plain</type>
            <size>48414</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NzE2KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTcgQEAKKzIwMTEtMDEtMjYgIEVucmljYSBD
YXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWJLaXQyOiBhZGQgc3VwcG9ydCBmb3IgZHJhZyBhbmQgZHJv
cCBvbiBXaW5kb3dzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD01Mjc3NQorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODUxNDQwOT4KKyAgICAgICAgCisg
ICAgICAgIE9uIFdpbmRvd3MgdGhlIGFjY2VzcyB0byB0aGUgY29udGVudCBiZWluZyBkcmFnZ2Vk
IGlzCisgICAgICAgIHByb3ZpZGVkIHZpYSB0aGUgSURhdGFPYmplY3QgaW50ZXJmYWNlIHRoYXQg
aXMgbWFkZSBhdmFpbGFibGUKKyAgICAgICAgdG8gdGhlIHdpbmRvdyB0aGF0IHJlZ2lzdGVycyBp
dHNlbGYgYXMgZHJvcCB0YXJnZXQuCisgICAgICAgIFNpbmNlIHRoaXMgaW50ZXJmYWNlIGNhbm5v
dCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBXZWJQcm9jZXNzLAorICAgICAgICBpbiBldmVyeSBjYWxs
IHRvIG9uZSBvZiB0aGUgbWV0aG9kcyBvZiB0aGUgSURyb3BUYXJnZXQgaW50ZXJmYWNlCisgICAg
ICAgIHdlIHNlcmlhbGl6ZSB0aGUgY29udGVudCBvZiB0aGUgZHJhZyBjbGlwYm9hcmQgYW5kIHNl
bmQgaXQgb3ZlciB0bworICAgICAgICB0aGUgV2ViUHJvY2Vzcy4KKyAgICAgICAgVGhlIGJ1bGsg
b2YgdGhpcyBwYXRjaCBjb25zaXN0cyBpbiB0aGUgcmVmYWN0b3JpbmcgbmVlZGVkIGluIERyYWdE
YXRhCisgICAgICAgIGFuZCBDbGlwYm9hcmRXaW4gY2xhc3NlcyB0byBleHRyYWN0IHRoZSBkYXRh
IGZyb20gdGhlIHNlcmlhbGl6ZWQgb2JqZWN0LgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9y
bS9EcmFnRGF0YS5jcHA6CisgICAgICAgICogcGxhdGZvcm0vRHJhZ0RhdGEuaDoKKyAgICAgICAg
KiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OmdldFdlYkxvY0RhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0VVJMKToKKyAgICAgICAg
KFdlYkNvcmU6OmdldFBsYWluVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRUZXh0SFRNTCk6
CisgICAgICAgIChXZWJDb3JlOjpnZXRDRkhUTUwpOgorICAgICAgICAoV2ViQ29yZTo6ZnJhZ21l
bnRGcm9tRmlsZW5hbWVzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbnRhaW5zRmlsZW5hbWVzKToK
KyAgICAgICAgKFdlYkNvcmU6OmZyYWdtZW50RnJvbUhUTUwpOgorICAgICAgICAoV2ViQ29yZTo6
Y29udGFpbnNIVE1MKToKKyAgICAgICAgKFdlYkNvcmU6OmdldENsaXBib2FyZERhdGEpOgorICAg
ICAgICAqIHBsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2Fy
ZDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZFdpbjo6Q2xpcGJvYXJkV2lu
KToKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2FyZFdpbjo6Z2V0RGF0YSk6CisgICAgICAgIChX
ZWJDb3JlOjpDbGlwYm9hcmRXaW46OnR5cGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNsaXBib2Fy
ZFdpbjo6ZmlsZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q2xpcGJvYXJkV2luOjpoYXNEYXRhKToK
KyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmg6CisgICAgICAgIChXZWJDb3Jl
OjpDbGlwYm9hcmRXaW46OmNyZWF0ZSk6CisgICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdEYXRh
V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjpEcmFnRGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpEcmFnRGF0YTo6Y29udGFpbnNVUkwpOgorICAgICAgICAoV2ViQ29yZTo6RHJh
Z0RhdGE6OmRyYWdEYXRhTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjphc1VSTCk6
CisgICAgICAgIChXZWJDb3JlOjpEcmFnRGF0YTo6Y29udGFpbnNGaWxlcyk6CisgICAgICAgIChX
ZWJDb3JlOjpEcmFnRGF0YTo6YXNGaWxlbmFtZXMpOgorICAgICAgICAoV2ViQ29yZTo6RHJhZ0Rh
dGE6OmNvbnRhaW5zUGxhaW5UZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjphc1Bs
YWluVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpEcmFnRGF0YTo6Y2FuU21hcnRSZXBsYWNlKToK
KyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjpjb250YWluc0NvbXBhdGlibGVDb250ZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OkRyYWdEYXRhOjphc0ZyYWdtZW50KToKKwogMjAxMS0wMS0yNiAg
VG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQuCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9EcmFnRGF0YS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL0RyYWdEYXRhLmgJKHJldmlzaW9uIDc2NjkxKQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0RhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtMzEsNiAr
MzEsNyBAQAogI2luY2x1ZGUgIkludFBvaW50LmgiCiAKICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5o
PgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiAj
aWYgUExBVEZPUk0oTUFDKQpAQCAtNTEsNiArNTIsNyBAQCBRVF9FTkRfTkFNRVNQQUNFCiB0eXBl
ZGVmIGNvbnN0IFFNaW1lRGF0YSogRHJhZ0RhdGFSZWY7CiAjZWxpZiBQTEFURk9STShXSU4pCiB0
eXBlZGVmIHN0cnVjdCBJRGF0YU9iamVjdCogRHJhZ0RhdGFSZWY7CisjaW5jbHVkZSA8V1RGU3Ry
aW5nLmg+CiAjZWxpZiBQTEFURk9STShXWCkKIHR5cGVkZWYgY2xhc3Mgd3hEYXRhT2JqZWN0KiBE
cmFnRGF0YVJlZjsKICNlbGlmIFBMQVRGT1JNKEdUSykKQEAgLTgyLDcgKzg0LDExIEBAIGVudW0g
RHJhZ0FwcGxpY2F0aW9uRmxhZ3MgewogICAgIERyYWdBcHBsaWNhdGlvbkhhc0F0dGFjaGVkU2hl
ZXQgPSA0LAogICAgIERyYWdBcHBsaWNhdGlvbklzQ29weUtleURvd24gPSA4CiB9OwotICAgIAor
CisjaWYgUExBVEZPUk0oV0lOKQordHlwZWRlZiBIYXNoTWFwPFVJTlQsIFZlY3RvcjxTdHJpbmc+
ID4gRHJhZ0RhdGFNYXA7CisjZW5kaWYKKwogY2xhc3MgRHJhZ0RhdGEgewogcHVibGljOgogICAg
IGVudW0gRmlsZW5hbWVDb252ZXJzaW9uUG9saWN5IHsgRG9Ob3RDb252ZXJ0RmlsZW5hbWVzLCBD
b252ZXJ0RmlsZW5hbWVzIH07CkBAIC05MCw3ICs5NiwxMCBAQCBwdWJsaWM6CiAgICAgLy8gY2xp
ZW50UG9zaXRpb24gaXMgdGFrZW4gdG8gYmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnIGV2ZW50
IHdpdGhpbiB0aGUgdGFyZ2V0IHdpbmRvdywgd2l0aCAoMCwwKSBhdCB0aGUgdG9wIGxlZnQKICAg
ICBEcmFnRGF0YShEcmFnRGF0YVJlZiwgY29uc3QgSW50UG9pbnQmIGNsaWVudFBvc2l0aW9uLCBj
b25zdCBJbnRQb2ludCYgZ2xvYmFsUG9zaXRpb24sIERyYWdPcGVyYXRpb24sIERyYWdBcHBsaWNh
dGlvbkZsYWdzID0gRHJhZ0FwcGxpY2F0aW9uTm9uZSk7CiAgICAgRHJhZ0RhdGEoY29uc3QgU3Ry
aW5nJiBkcmFnU3RvcmFnZU5hbWUsIGNvbnN0IEludFBvaW50JiBjbGllbnRQb3NpdGlvbiwgY29u
c3QgSW50UG9pbnQmIGdsb2JhbFBvc2l0aW9uLCBEcmFnT3BlcmF0aW9uLCBEcmFnQXBwbGljYXRp
b25GbGFncyA9IERyYWdBcHBsaWNhdGlvbk5vbmUpOwotCisjaWYgUExBVEZPUk0oV0lOKQorICAg
IERyYWdEYXRhOjpEcmFnRGF0YShjb25zdCBEcmFnRGF0YU1hcCYsIGNvbnN0IEludFBvaW50JiBj
bGllbnRQb3NpdGlvbiwgY29uc3QgSW50UG9pbnQmIGdsb2JhbFBvc2l0aW9uLCBEcmFnT3BlcmF0
aW9uIHNvdXJjZU9wZXJhdGlvbk1hc2ssIERyYWdBcHBsaWNhdGlvbkZsYWdzID0gRHJhZ0FwcGxp
Y2F0aW9uTm9uZSk7CisgICAgRHJhZ0RhdGFNYXAgZHJhZ0RhdGFNYXAoKTsKKyNlbmRpZgogICAg
IGNvbnN0IEludFBvaW50JiBjbGllbnRQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fY2xpZW50
UG9zaXRpb247IH0KICAgICBjb25zdCBJbnRQb2ludCYgZ2xvYmFsUG9zaXRpb24oKSBjb25zdCB7
IHJldHVybiBtX2dsb2JhbFBvc2l0aW9uOyB9CiAgICAgRHJhZ0FwcGxpY2F0aW9uRmxhZ3MgZmxh
Z3MoKSB7IHJldHVybiBtX2FwcGxpY2F0aW9uRmxhZ3M7IH0KQEAgLTExNyw2ICsxMjYsOSBAQCBw
cml2YXRlOgogI2lmIFBMQVRGT1JNKE1BQykKICAgICBSZXRhaW5QdHI8TlNQYXN0ZWJvYXJkPiBt
X3Bhc3RlYm9hcmQ7CiAjZW5kaWYKKyNpZiBQTEFURk9STShXSU4pCisgICAgRHJhZ0RhdGFNYXAg
bV9kcmFnRGF0YU1hcDsKKyNlbmRpZgogfTsKICAgICAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uY3BwCShyZXZp
c2lvbiA3NjY5MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGls
aXRpZXNXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTEsNiArMTExLDM0IEBAIGV4aXQ6CiAg
ICAgcmV0dXJuIHN1Y2NlZWRlZDsKIH0KIAorc3RhdGljIGJvb2wgZ2V0V2ViTG9jRGF0YShjb25z
dCBEcmFnRGF0YU1hcCogZGF0YU9iamVjdCwgU3RyaW5nJiB1cmwsIFN0cmluZyogdGl0bGUpIAor
eworICAgIGJvb2wgc3VjY2VlZGVkID0gZmFsc2U7CisjaWYgUExBVEZPUk0oQ0YpCisgICAgV0NI
QVIgZmlsZW5hbWVbTUFYX1BBVEhdOworICAgIFdDSEFSIHVybEJ1ZmZlcltJTlRFUk5FVF9NQVhf
VVJMX0xFTkdUSF07CisKKyAgICBpZiAoIWRhdGFPYmplY3QtPmNvbnRhaW5zKGNmSERyb3BGb3Jt
YXQoKS0+Y2ZGb3JtYXQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3Y3NjcHkoZmls
ZW5hbWUsIGRhdGFPYmplY3QtPmdldChjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KVswXS5jaGFy
YWN0ZXJzKCkpOworICAgIGlmIChfd2NzaWNtcChQYXRoRmluZEV4dGVuc2lvblcoZmlsZW5hbWUp
LCBMIi51cmwiKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAKKworICAgIGlmICghR2V0UHJp
dmF0ZVByb2ZpbGVTdHJpbmdXKEwiSW50ZXJuZXRTaG9ydGN1dCIsIEwidXJsIiwgMCwgdXJsQnVm
ZmVyLCBXVEZfQVJSQVlfTEVOR1RIKHVybEJ1ZmZlciksIGZpbGVuYW1lKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKHRpdGxlKSB7CisgICAgICAgIFBhdGhSZW1vdmVFeHRlbnNp
b24oZmlsZW5hbWUpOworICAgICAgICAqdGl0bGUgPSBTdHJpbmcoKFVDaGFyKilmaWxlbmFtZSk7
CisgICAgfQorICAgIAorICAgIHVybCA9IFN0cmluZygoVUNoYXIqKXVybEJ1ZmZlcik7CisgICAg
c3VjY2VlZGVkID0gdHJ1ZTsKKyNlbmRpZgorICAgIHJldHVybiBzdWNjZWVkZWQ7Cit9CisKIHN0
YXRpYyBTdHJpbmcgZXh0cmFjdFVSTChjb25zdCBTdHJpbmcgJmluVVJMLCBTdHJpbmcqIHRpdGxl
KQogewogICAgIFN0cmluZyB1cmwgPSBpblVSTDsKQEAgLTM4Niw2ICs0MTQsMzcgQEAgU3RyaW5n
IGdldFVSTChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgRAogICAgIHJldHVybiB1cmw7CiB9CiAK
K1N0cmluZyBnZXRVUkwoY29uc3QgRHJhZ0RhdGFNYXAqIGRhdGEsIERyYWdEYXRhOjpGaWxlbmFt
ZUNvbnZlcnNpb25Qb2xpY3kgZmlsZW5hbWVQb2xpY3ksIFN0cmluZyogdGl0bGUpCit7CisgICAg
U3RyaW5nIHVybDsKKworICAgIGlmIChnZXRXZWJMb2NEYXRhKGRhdGEsIHVybCwgdGl0bGUpKQor
ICAgICAgICByZXR1cm4gdXJsOworICAgIGlmIChkYXRhLT5jb250YWlucyh1cmxXRm9ybWF0KCkt
PmNmRm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIGV4dHJhY3RVUkwoZGF0YS0+Z2V0KHVybFdGb3Jt
YXQoKS0+Y2ZGb3JtYXQpWzBdLCB0aXRsZSk7CisgICAgaWYgKGRhdGEtPmNvbnRhaW5zKHVybEZv
cm1hdCgpLT5jZkZvcm1hdCkpCisgICAgICAgIHJldHVybiBleHRyYWN0VVJMKGRhdGEtPmdldCh1
cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpWzBdLCB0aXRsZSk7CisjaWYgUExBVEZPUk0oQ0YpCisgICAg
aWYgKGZpbGVuYW1lUG9saWN5ICE9IERyYWdEYXRhOjpDb252ZXJ0RmlsZW5hbWVzKQorICAgICAg
ICByZXR1cm4gdXJsOworCisgICAgU3RyaW5nIHN0cmluZ0RhdGE7CisgICAgaWYgKGRhdGEtPmNv
bnRhaW5zKGZpbGVuYW1lV0Zvcm1hdCgpLT5jZkZvcm1hdCkpCisgICAgICAgIHN0cmluZ0RhdGEg
PSBkYXRhLT5nZXQoZmlsZW5hbWVXRm9ybWF0KCktPmNmRm9ybWF0KVswXTsKKyAgICBlbHNlIGlm
IChkYXRhLT5jb250YWlucyhmaWxlbmFtZUZvcm1hdCgpLT5jZkZvcm1hdCkpCisgICAgICAgIHN0
cmluZ0RhdGEgPSBkYXRhLT5nZXQoZmlsZW5hbWVGb3JtYXQoKS0+Y2ZGb3JtYXQpWzBdOworCisg
ICAgaWYgKCFzdHJpbmdEYXRhLmlzRW1wdHkoKSAmJiAoUGF0aEZpbGVFeGlzdHMoc3RyaW5nRGF0
YS5jaGFyYWN0ZXJzKCkpIHx8IFBhdGhJc1VOQyhzdHJpbmdEYXRhLmNoYXJhY3RlcnMoKSkpKSB7
CisgICAgICAgIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gcGF0aEFzQ0ZTdHJpbmcoQWRvcHRDRiwg
Q0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoY29uc3Qg
VW5pQ2hhciAqKXN0cmluZ0RhdGEuY2hhcmFjdGVycygpLCBzdHJpbmdEYXRhLmxlbmd0aCgpIC0g
MSkpOworICAgICAgICBpZiAodXJsRnJvbVBhdGgocGF0aEFzQ0ZTdHJpbmcuZ2V0KCksIHVybCkp
IHsKKyAgICAgICAgICAgIGlmICh0aXRsZSkKKyAgICAgICAgICAgICAgICAqdGl0bGUgPSB1cmw7
CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gdXJsOworfQorCiBTdHJpbmcg
Z2V0UGxhaW5UZXh0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBib29sJiBzdWNjZXNzKQogewog
ICAgIFNUR01FRElVTSBzdG9yZTsKQEAgLTQxNSw2ICs0NzQsMTkgQEAgU3RyaW5nIGdldFBsYWlu
VGV4dChJRGF0YU9iamVjdCogZGF0YU9iagogICAgIHJldHVybiB0ZXh0OwogfQogCitTdHJpbmcg
Z2V0UGxhaW5UZXh0KGNvbnN0IERyYWdEYXRhTWFwKiBkYXRhKQoreworICAgIFN0cmluZyB0ZXh0
OworICAgIAorICAgIGlmIChkYXRhLT5jb250YWlucyhwbGFpblRleHRXRm9ybWF0KCktPmNmRm9y
bWF0KSkKKyAgICAgICAgdGV4dCA9IGRhdGEtPmdldChwbGFpblRleHRXRm9ybWF0KCktPmNmRm9y
bWF0KVswXTsKKyAgICBlbHNlIGlmIChkYXRhLT5jb250YWlucyhwbGFpblRleHRGb3JtYXQoKS0+
Y2ZGb3JtYXQpKQorICAgICAgICB0ZXh0ID0gZGF0YS0+Z2V0KHBsYWluVGV4dEZvcm1hdCgpLT5j
ZkZvcm1hdClbMF07CisgICAgZWxzZQorICAgICAgICB0ZXh0ID0gZ2V0VVJMKGRhdGEsIERyYWdE
YXRhOjpEb05vdENvbnZlcnRGaWxlbmFtZXMpOworICAgIHJldHVybiB0ZXh0OworfQorCiBTdHJp
bmcgZ2V0VGV4dEhUTUwoSURhdGFPYmplY3QqIGRhdGEsIGJvb2wmIHN1Y2Nlc3MpCiB7CiAgICAg
U1RHTUVESVVNIHN0b3JlOwpAQCAtNDMwLDYgKzUwMiwxMSBAQCBTdHJpbmcgZ2V0VGV4dEhUTUwo
SURhdGFPYmplY3QqIGRhdGEsIGJvCiAgICAgcmV0dXJuIGh0bWw7CiB9CiAKK1N0cmluZyBnZXRU
ZXh0SFRNTChjb25zdCBEcmFnRGF0YU1hcCogZGF0YSkKK3sKKyAgICByZXR1cm4gZGF0YS0+Z2V0
KHRleHRodG1sRm9ybWF0KCktPmNmRm9ybWF0KVswXTsKK30KKwogU3RyaW5nIGdldENGSFRNTChJ
RGF0YU9iamVjdCogZGF0YSwgYm9vbCYgc3VjY2VzcykKIHsKICAgICBTdHJpbmcgY2ZodG1sID0g
Z2V0RnVsbENGSFRNTChkYXRhLCBzdWNjZXNzKTsKQEAgLTQzOCwxOCArNTE1LDM2IEBAIFN0cmlu
ZyBnZXRDRkhUTUwoSURhdGFPYmplY3QqIGRhdGEsIGJvb2wKICAgICByZXR1cm4gU3RyaW5nKCk7
CiB9CiAKK1N0cmluZyBnZXRDRkhUTUwoY29uc3QgRHJhZ0RhdGFNYXAqIGRhdGFNYXApCit7Cisg
ICAgU3RyaW5nIGNmaHRtbCA9IGRhdGFNYXAtPmdldChodG1sRm9ybWF0KCktPmNmRm9ybWF0KVsw
XTsKKyAgICByZXR1cm4gZXh0cmFjdE1hcmt1cEZyb21DRkhUTUwoY2ZodG1sKTsKK30KKwogUGFz
c1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21GaWxlbmFtZXMoRG9jdW1lbnQq
LCBjb25zdCBJRGF0YU9iamVjdCopCiB7CiAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBiZSBhYmxl
IHRvIGNyZWF0ZSBmcmFnbWVudHMgZnJvbSBmaWxlcwogICAgIHJldHVybiAwOwogfQogCitQYXNz
UmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUZpbGVuYW1lcyhEb2N1bWVudCos
IGNvbnN0IERyYWdEYXRhTWFwKikKK3sKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUg
dG8gY3JlYXRlIGZyYWdtZW50cyBmcm9tIGZpbGVzCisgICAgcmV0dXJuIDA7Cit9CisKIGJvb2wg
Y29udGFpbnNGaWxlbmFtZXMoY29uc3QgSURhdGFPYmplY3QqKQogewogICAgIC8vIEZJWE1FOiBX
ZSdsbCB3YW50IHRvIHVwZGF0ZSB0aGlzIG9uY2Ugd2UgY2FuIHByb2R1Y2UgZnJhZ21lbnRzIGZy
b20gZmlsZXMKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgY29udGFpbnNGaWxlbmFtZXMo
Y29uc3QgRHJhZ0RhdGFNYXAqKQoreworICAgIC8vIEZJWE1FOiBXZSdsbCB3YW50IHRvIHVwZGF0
ZSB0aGlzIG9uY2Ugd2UgY2FuIHByb2R1Y2UgZnJhZ21lbnRzIGZyb20gZmlsZXMKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKIC8vIENvbnZlcnQgYSBTdHJpbmcgY29udGFpbmluZyBDRl9IVE1MIGZv
cm1hdHRlZCB0ZXh0IHRvIGEgRG9jdW1lbnRGcmFnbWVudAogUGFzc1JlZlB0cjxEb2N1bWVudEZy
YWdtZW50PiBmcmFnbWVudEZyb21DRkhUTUwoRG9jdW1lbnQqIGRvYywgY29uc3QgU3RyaW5nJiBj
Zmh0bWwpCiB7CkBAIC00ODksOSArNTg0LDEwNyBAQCBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21l
bnQ+IGZyYWdtZW50RnJvCiAgICAgcmV0dXJuIDA7CiB9CiAKK1Bhc3NSZWZQdHI8RG9jdW1lbnRG
cmFnbWVudD4gZnJhZ21lbnRGcm9tSFRNTChEb2N1bWVudCogZG9jLCBjb25zdCBEcmFnRGF0YU1h
cCogZGF0YSkgCit7CisgICAgaWYgKCFkb2MgfHwgIWRhdGEgfHwgZGF0YS0+aXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChkYXRhLT5jb250YWlucyhodG1sRm9ybWF0KCkt
PmNmRm9ybWF0KSkKKyAgICAgICAgaWYgKFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJh
Z21lbnQgPSBmcmFnbWVudEZyb21DRkhUTUwoZG9jLCBkYXRhLT5nZXQoaHRtbEZvcm1hdCgpLT5j
ZkZvcm1hdClbMF0pKQorICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50OworCisgICAgU3RyaW5n
IHNyY1VSTDsKKyAgICBpZiAoZGF0YS0+Y29udGFpbnModGV4dGh0bWxGb3JtYXQoKS0+Y2ZGb3Jt
YXQpKQorICAgICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tTWFya3VwKGRvYywgZGF0YS0+
Z2V0KHRleHRodG1sRm9ybWF0KCktPmNmRm9ybWF0KVswXSwgc3JjVVJMLCBGcmFnbWVudFNjcmlw
dGluZ05vdEFsbG93ZWQpOworCisgICAgcmV0dXJuIDA7Cit9CisKIGJvb2wgY29udGFpbnNIVE1M
KElEYXRhT2JqZWN0KiBkYXRhKQogewogICAgIHJldHVybiBTVUNDRUVERUQoZGF0YS0+UXVlcnlH
ZXREYXRhKHRleHRodG1sRm9ybWF0KCkpKSB8fCBTVUNDRUVERUQoZGF0YS0+UXVlcnlHZXREYXRh
KGh0bWxGb3JtYXQoKSkpOwogfQogCitib29sIGNvbnRhaW5zSFRNTChjb25zdCBEcmFnRGF0YU1h
cCogZGF0YSkKK3sKKyAgICByZXR1cm4gZGF0YS0+Y29udGFpbnModGV4dGh0bWxGb3JtYXQoKS0+
Y2ZGb3JtYXQpIHx8IGRhdGEtPmNvbnRhaW5zKGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQpOworfQor
Cit2b2lkIGdldENsaXBib2FyZERhdGEoSURhdGFPYmplY3QgKmRhdGFPYmplY3QsIFVJTlQgZm9y
bWF0LCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7CisgICAgU1RHTUVESVVNIHN0b3Jl
OworICAgIGlmIChmb3JtYXQgPT0gaHRtbEZvcm1hdCgpLT5jZkZvcm1hdCkgeworICAgICAgICBp
ZiAoRkFJTEVEKGRhdGFPYmplY3QtPkdldERhdGEoaHRtbEZvcm1hdCgpLCAmc3RvcmUpKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gTVMgSFRNTCBGb3JtYXQgcGFyc2luZworICAg
ICAgICBjaGFyKiBkYXRhQmxvYiA9IHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKHN0b3Jl
LmhHbG9iYWwpKTsKKyAgICAgICAgU0laRV9UIGRhdGFTaXplID0gOjpHbG9iYWxTaXplKHN0b3Jl
LmhHbG9iYWwpOworICAgICAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3RyaW5nKFVURjhFbmNvZGlu
ZygpLmRlY29kZShkYXRhQmxvYiwgZGF0YVNpemUpKSk7CisgICAgICAgIEdsb2JhbFVubG9jayhz
dG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgIH0g
ZWxzZSBpZiAoZm9ybWF0ID09IHRleHRodG1sRm9ybWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAg
IGlmIChGQUlMRUQoZGF0YU9iamVjdC0+R2V0RGF0YSh0ZXh0aHRtbEZvcm1hdCgpLCAmc3RvcmUp
KSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGF0YVN0cmluZ3MuYXBwZW5kKFN0cmlu
ZyhzdGF0aWNfY2FzdDxVQ2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpLCA6Okdsb2Jh
bFNpemUoc3RvcmUuaEdsb2JhbCkgLyBzaXplb2YoVUNoYXIpKSk7CisgICAgICAgIEdsb2JhbFVu
bG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOwor
ICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IHBsYWluVGV4dEZvcm1hdCgpLT5jZkZvcm1hdCkgewor
ICAgICAgICBpZiAoRkFJTEVEKGRhdGFPYmplY3QtPkdldERhdGEocGxhaW5UZXh0Rm9ybWF0KCks
ICZzdG9yZSkpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkYXRhU3RyaW5ncy5hcHBl
bmQoU3RyaW5nKHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKSkp
OworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VT
dGdNZWRpdW0oJnN0b3JlKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBwbGFpblRleHRXRm9y
bWF0KCktPmNmRm9ybWF0KSB7CisgICAgICAgIGlmIChGQUlMRUQoZGF0YU9iamVjdC0+R2V0RGF0
YShwbGFpblRleHRXRm9ybWF0KCksICZzdG9yZSkpKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3RyaW5nKHN0YXRpY19jYXN0PFVDaGFyKj4oR2xvYmFs
TG9jayhzdG9yZS5oR2xvYmFsKSksIDo6R2xvYmFsU2l6ZShzdG9yZS5oR2xvYmFsKSAvIHNpemVv
ZihVQ2hhcikpKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAg
ICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisjaWYgUExBVEZPUk0oQ0YpCisgICAgfSBlbHNl
IGlmIChmb3JtYXQgPT0gY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCkgeworICAgICAgICBpZiAo
RkFJTEVEKGRhdGFPYmplY3QtPkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmc3RvcmUpKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICBIRFJPUCBoZHJvcCA9IHJlaW50ZXJwcmV0X2Nh
c3Q8SERST1A+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOworICAgICAgICBpZiAoIWhkcm9w
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFdDSEFSIGZpbGVuYW1lW01BWF9QQVRI
XTsKKyAgICAgICAgVUlOVCBmaWxlQ291bnQgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwgMHhGRkZG
RkZGRiwgMCwgMCk7CisgICAgICAgIGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3VudDsgaSsr
KSB7CisgICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxlbmFtZSwg
V1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgZGF0YVN0cmluZ3MuYXBwZW5kKHN0YXRpY19jYXN0PFVDaGFyKj4oZmlsZW5h
bWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsK
KyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworI2VuZGlmCisgICAgfSBlbHNlIGlm
IChmb3JtYXQgPT0gZmlsZW5hbWVGb3JtYXQoKS0+Y2ZGb3JtYXQpIHsKKyAgICAgICAgaWYgKEZB
SUxFRChkYXRhT2JqZWN0LT5HZXREYXRhKGZpbGVuYW1lRm9ybWF0KCksICZzdG9yZSkpKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3RyaW5nKHN0YXRp
Y19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKSkpOworICAgICAgICBHbG9i
YWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3Jl
KTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBmaWxlbmFtZVdGb3JtYXQoKS0+Y2ZGb3JtYXQp
IHsKKyAgICAgICAgaWYgKEZBSUxFRChkYXRhT2JqZWN0LT5HZXREYXRhKGZpbGVuYW1lV0Zvcm1h
dCgpLCAmc3RvcmUpKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGF0YVN0cmluZ3Mu
YXBwZW5kKFN0cmluZyhzdGF0aWNfY2FzdDxVQ2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2Jh
bCkpLCA6Okdsb2JhbFNpemUoc3RvcmUuaEdsb2JhbCkgLyBzaXplb2YoVUNoYXIpKSk7CisgICAg
ICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1
bSgmc3RvcmUpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IHVybEZvcm1hdCgpLT5jZkZvcm1h
dCkgeworICAgICAgICBpZiAoRkFJTEVEKGRhdGFPYmplY3QtPkdldERhdGEodXJsRm9ybWF0KCks
ICZzdG9yZSkpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkYXRhU3RyaW5ncy5hcHBl
bmQoU3RyaW5nKHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKSkp
OworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VT
dGdNZWRpdW0oJnN0b3JlKTsKKyAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSB1cmxXRm9ybWF0KCkt
PmNmRm9ybWF0KSB7CisgICAgICAgIGlmIChGQUlMRUQoZGF0YU9iamVjdC0+R2V0RGF0YSh1cmxX
Rm9ybWF0KCksICZzdG9yZSkpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkYXRhU3Ry
aW5ncy5hcHBlbmQoU3RyaW5nKHN0YXRpY19jYXN0PFVDaGFyKj4oR2xvYmFsTG9jayhzdG9yZS5o
R2xvYmFsKSksIDo6R2xvYmFsU2l6ZShzdG9yZS5oR2xvYmFsKSAvIHNpemVvZihVQ2hhcikpKTsK
KyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3Rn
TWVkaXVtKCZzdG9yZSk7CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGll
c1dpbi5oCShyZXZpc2lvbiA3NjY5MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9D
bGlwYm9hcmRVdGlsaXRpZXNXaW4uaAkod29ya2luZyBjb3B5KQpAQCAtNTUsMTYgKzU1LDI2IEBA
IHZvaWQgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2wKIHZvaWQgcmVwbGFjZU5C
U1BXaXRoU3BhY2UoU3RyaW5nJik7CiAKIGJvb2wgY29udGFpbnNGaWxlbmFtZXMoY29uc3QgSURh
dGFPYmplY3QqKTsKK2Jvb2wgY29udGFpbnNGaWxlbmFtZXMoY29uc3QgRHJhZ0RhdGFNYXAqKTsK
IGJvb2wgY29udGFpbnNIVE1MKElEYXRhT2JqZWN0Kik7Citib29sIGNvbnRhaW5zSFRNTChjb25z
dCBEcmFnRGF0YU1hcCopOwogCiBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50
RnJvbUZpbGVuYW1lcyhEb2N1bWVudCosIGNvbnN0IElEYXRhT2JqZWN0Kik7CitQYXNzUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUZpbGVuYW1lcyhEb2N1bWVudCosIGNvbnN0
IERyYWdEYXRhTWFwKik7CiBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJv
bUhUTUwoRG9jdW1lbnQqLCBJRGF0YU9iamVjdCopOworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdt
ZW50PiBmcmFnbWVudEZyb21IVE1MKERvY3VtZW50KiwgY29uc3QgRHJhZ0RhdGFNYXAqKTsKIFBh
c3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tQ0ZIVE1MKERvY3VtZW50Kiwg
Y29uc3QgU3RyaW5nJiBjZmh0bWwpOwogCiBTdHJpbmcgZ2V0VVJMKElEYXRhT2JqZWN0KiwgRHJh
Z0RhdGE6OkZpbGVuYW1lQ29udmVyc2lvblBvbGljeSwgYm9vbCYgc3VjY2VzcywgU3RyaW5nKiB0
aXRsZSA9IDApOworU3RyaW5nIGdldFVSTChjb25zdCBEcmFnRGF0YU1hcCosIERyYWdEYXRhOjpG
aWxlbmFtZUNvbnZlcnNpb25Qb2xpY3ksIFN0cmluZyogdGl0bGUgPSAwKTsKIFN0cmluZyBnZXRQ
bGFpblRleHQoSURhdGFPYmplY3QqLCBib29sJiBzdWNjZXNzKTsKK1N0cmluZyBnZXRQbGFpblRl
eHQoY29uc3QgRHJhZ0RhdGFNYXAqKTsKIFN0cmluZyBnZXRUZXh0SFRNTChJRGF0YU9iamVjdCos
IGJvb2wmIHN1Y2Nlc3MpOworU3RyaW5nIGdldFRleHRIVE1MKGNvbnN0IERyYWdEYXRhTWFwKik7
CiBTdHJpbmcgZ2V0Q0ZIVE1MKElEYXRhT2JqZWN0KiwgYm9vbCYgc3VjY2Vzcyk7CitTdHJpbmcg
Z2V0Q0ZIVE1MKGNvbnN0IERyYWdEYXRhTWFwKik7CisKK3ZvaWQgZ2V0Q2xpcGJvYXJkRGF0YShJ
RGF0YU9iamVjdCosIFVJTlQgZm9ybWF0LCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpOwog
CiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L3dpbi9DbGlwYm9hcmRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwCShyZXZpc2lvbiA3NjY5MSkKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNDAs
NyArMzQwLDkgQEAgZXhpdDoKIAogUGFzc1JlZlB0cjxDbGlwYm9hcmQ+IENsaXBib2FyZDo6Y3Jl
YXRlKENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIERyYWdEYXRhKiBkcmFnRGF0YSwgRnJh
bWUqIGZyYW1lKQogewotICAgIHJldHVybiBDbGlwYm9hcmRXaW46OmNyZWF0ZShEcmFnQW5kRHJv
cCwgZHJhZ0RhdGEtPnBsYXRmb3JtRGF0YSgpLCBwb2xpY3ksIGZyYW1lKTsKKyAgICBpZiAoZHJh
Z0RhdGEtPnBsYXRmb3JtRGF0YSgpKQorICAgICAgICByZXR1cm4gQ2xpcGJvYXJkV2luOjpjcmVh
dGUoRHJhZ0FuZERyb3AsIGRyYWdEYXRhLT5wbGF0Zm9ybURhdGEoKSwgcG9saWN5LCBmcmFtZSk7
CisgICAgcmV0dXJuIENsaXBib2FyZFdpbjo6Y3JlYXRlKERyYWdBbmREcm9wLCBkcmFnRGF0YS0+
ZHJhZ0RhdGFNYXAoKSwgcG9saWN5LCBmcmFtZSk7CiB9CiAKIENsaXBib2FyZFdpbjo6Q2xpcGJv
YXJkV2luKENsaXBib2FyZFR5cGUgY2xpcGJvYXJkVHlwZSwgSURhdGFPYmplY3QqIGRhdGFPYmpl
Y3QsIENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIEZyYW1lKiBmcmFtZSkKQEAgLTM1OSw2
ICszNjEsMTUgQEAgQ2xpcGJvYXJkV2luOjpDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZQogewog
fQogCitDbGlwYm9hcmRXaW46OkNsaXBib2FyZFdpbihDbGlwYm9hcmRUeXBlIGNsaXBib2FyZFR5
cGUsIGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwLCBDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9s
aWN5LCBGcmFtZSogZnJhbWUpCisgICAgOiBDbGlwYm9hcmQocG9saWN5LCBjbGlwYm9hcmRUeXBl
KQorICAgICwgbV9kYXRhT2JqZWN0KDApCisgICAgLCBtX3dyaXRhYmxlRGF0YU9iamVjdCgwKQor
ICAgICwgbV9mcmFtZShmcmFtZSkKKyAgICAsIG1fZHJhZ0RhdGFNYXAoZGF0YU1hcCkKK3sKK30K
KwogQ2xpcGJvYXJkV2luOjp+Q2xpcGJvYXJkV2luKCkKIHsKIH0KQEAgLTQ0MiwxOSArNDUzLDE5
IEBAIHZvaWQgQ2xpcGJvYXJkV2luOjpjbGVhckFsbERhdGEoKQogU3RyaW5nIENsaXBib2FyZFdp
bjo6Z2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUsIGJvb2wmIHN1Y2Nlc3MpIGNvbnN0CiB7ICAg
ICAKICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgaWYgKHBvbGljeSgpICE9IENsaXBib2FyZFJl
YWRhYmxlIHx8ICFtX2RhdGFPYmplY3QpCisgICAgaWYgKHBvbGljeSgpICE9IENsaXBib2FyZFJl
YWRhYmxlIHx8ICFtX2RhdGFPYmplY3QgfHwgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCiAgICAg
ICAgIHJldHVybiAiIjsKIAogICAgIENsaXBib2FyZERhdGFUeXBlIGRhdGFUeXBlID0gY2xpcGJv
YXJkVHlwZUZyb21NSU1FVHlwZSh0eXBlKTsKICAgICBpZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJk
RGF0YVR5cGVUZXh0KQotICAgICAgICByZXR1cm4gZ2V0UGxhaW5UZXh0KG1fZGF0YU9iamVjdC5n
ZXQoKSwgc3VjY2Vzcyk7CisgICAgICAgIHJldHVybiAobV9kYXRhT2JqZWN0KSA/IGdldFBsYWlu
VGV4dChtX2RhdGFPYmplY3QuZ2V0KCksIHN1Y2Nlc3MpIDogZ2V0UGxhaW5UZXh0KCZtX2RyYWdE
YXRhTWFwKTsKICAgICBpZiAoZGF0YVR5cGUgPT0gQ2xpcGJvYXJkRGF0YVR5cGVVUkwpCi0gICAg
ICAgIHJldHVybiBnZXRVUkwobV9kYXRhT2JqZWN0LmdldCgpLCBEcmFnRGF0YTo6RG9Ob3RDb252
ZXJ0RmlsZW5hbWVzLCBzdWNjZXNzKTsKKyAgICAgICAgcmV0dXJuIChtX2RhdGFPYmplY3QpID8g
Z2V0VVJMKG1fZGF0YU9iamVjdC5nZXQoKSwgRHJhZ0RhdGE6OkRvTm90Q29udmVydEZpbGVuYW1l
cywgc3VjY2VzcykgOiBnZXRVUkwoJm1fZHJhZ0RhdGFNYXAsIERyYWdEYXRhOjpEb05vdENvbnZl
cnRGaWxlbmFtZXMpOwogICAgIGVsc2UgaWYgKGRhdGFUeXBlID09IENsaXBib2FyZERhdGFUeXBl
VGV4dEhUTUwpIHsKLSAgICAgICAgU3RyaW5nIGRhdGEgPSBnZXRUZXh0SFRNTChtX2RhdGFPYmpl
Y3QuZ2V0KCksIHN1Y2Nlc3MpOworICAgICAgICBTdHJpbmcgZGF0YSA9IChtX2RhdGFPYmplY3Qp
ID8gZ2V0VGV4dEhUTUwobV9kYXRhT2JqZWN0LmdldCgpLCBzdWNjZXNzKSA6IGdldFRleHRIVE1M
KCZtX2RyYWdEYXRhTWFwKTsKICAgICAgICAgaWYgKHN1Y2Nlc3MpCiAgICAgICAgICAgICByZXR1
cm4gZGF0YTsKLSAgICAgICAgcmV0dXJuIGdldENGSFRNTChtX2RhdGFPYmplY3QuZ2V0KCksIHN1
Y2Nlc3MpOworICAgICAgICByZXR1cm4gKG1fZGF0YU9iamVjdCkgPyBnZXRDRkhUTUwobV9kYXRh
T2JqZWN0LmdldCgpLCBzdWNjZXNzKSA6IGdldENGSFRNTCgmbV9kcmFnRGF0YU1hcCk7CiAgICAg
fQogICAgIAogICAgIHJldHVybiAiIjsKQEAgLTUxMCwyMiArNTIxLDMwIEBAIEhhc2hTZXQ8U3Ry
aW5nPiBDbGlwYm9hcmRXaW46OnR5cGVzKCkgY28KICAgICBpZiAocG9saWN5KCkgIT0gQ2xpcGJv
YXJkUmVhZGFibGUgJiYgcG9saWN5KCkgIT0gQ2xpcGJvYXJkVHlwZXNSZWFkYWJsZSkKICAgICAg
ICAgcmV0dXJuIHJlc3VsdHM7CiAKLSAgICBpZiAoIW1fZGF0YU9iamVjdCkKKyAgICBpZiAoIW1f
ZGF0YU9iamVjdCB8fCBtX2RyYWdEYXRhTWFwLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIHJl
c3VsdHM7CiAKLSAgICBDT01QdHI8SUVudW1GT1JNQVRFVEM+IGl0cjsKKyAgICBpZiAobV9kYXRh
T2JqZWN0KSB7CisgICAgICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOwogCi0gICAgaWYg
KEZBSUxFRChtX2RhdGFPYmplY3QtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSkK
LSAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0
LT5FbnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRyKSkpCisgICAgICAgICAgICByZXR1cm4g
cmVzdWx0czsKIAotICAgIGlmICghaXRyKQotICAgICAgICByZXR1cm4gcmVzdWx0czsKLQotICAg
IEZPUk1BVEVUQyBkYXRhOworICAgICAgICBpZiAoIWl0cikKKyAgICAgICAgICAgIHJldHVybiBy
ZXN1bHRzOwogCi0gICAgLy8gSUVudW1GT1JNQVRFVEM6Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlm
IHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgotICAgIHdoaWxlIChpdHItPk5leHQoMSwgJmRhdGEs
IDApID09IFNfT0spCi0gICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1bHRzLCBkYXRh
KTsKKyAgICAgICAgRk9STUFURVRDIGRhdGE7CisKKyAgICAgICAgLy8gSUVudW1GT1JNQVRFVEM6
Ok5leHQgcmV0dXJucyBTX0ZBTFNFIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgorICAgICAg
ICB3aGlsZSAoaXRyLT5OZXh0KDEsICZkYXRhLCAwKSA9PSBTX09LKQorICAgICAgICAgICAgYWRk
TWltZVR5cGVzRm9yRm9ybWF0KHJlc3VsdHMsIGRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAg
IGZvciAoRHJhZ0RhdGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9kcmFnRGF0YU1hcC5iZWdp
bigpOyBpdCAhPSBtX2RyYWdEYXRhTWFwLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBGT1JN
QVRFVEMgZGF0YTsKKyAgICAgICAgICAgIGRhdGEuY2ZGb3JtYXQgPSAoKml0KS5maXJzdDsKKyAg
ICAgICAgICAgIGFkZE1pbWVUeXBlc0ZvckZvcm1hdChyZXN1bHRzLCBkYXRhKTsKKyAgICAgICAg
fQorICAgIH0KIAogICAgIHJldHVybiByZXN1bHRzOwogfQpAQCAtNTQwLDI3ICs1NTksMzUgQEAg
UGFzc1JlZlB0cjxGaWxlTGlzdD4gQ2xpcGJvYXJkV2luOjpmaWxlcwogICAgIGlmIChwb2xpY3ko
KSAhPSBDbGlwYm9hcmRSZWFkYWJsZSAmJiBwb2xpY3koKSAhPSBDbGlwYm9hcmRUeXBlc1JlYWRh
YmxlKQogICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOwogCi0gICAgaWYgKCFtX2RhdGFP
YmplY3QpCisgICAgaWYgKCFtX2RhdGFPYmplY3QgfHwgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkp
CiAgICAgICAgIHJldHVybiBmaWxlcy5yZWxlYXNlKCk7CiAKLSAgICBTVEdNRURJVU0gbWVkaXVt
OwotICAgIGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5HZXREYXRhKGNmSERyb3BGb3JtYXQoKSwg
Jm1lZGl1bSkpKQotICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOworICAgIGlmIChtX2Rh
dGFPYmplY3QpIHsKKyAgICAgICAgU1RHTUVESVVNIG1lZGl1bTsKKyAgICAgICAgaWYgKEZBSUxF
RChtX2RhdGFPYmplY3QtPkdldERhdGEoY2ZIRHJvcEZvcm1hdCgpLCAmbWVkaXVtKSkpCisgICAg
ICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFzZSgpOworCisgICAgICAgIEhEUk9QIGhkcm9wID0g
cmVpbnRlcnByZXRfY2FzdDxIRFJPUD4oR2xvYmFsTG9jayhtZWRpdW0uaEdsb2JhbCkpOworICAg
ICAgICBpZiAoIWhkcm9wKQorICAgICAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKKwor
ICAgICAgICBXQ0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07CisgICAgICAgIFVJTlQgZmlsZUNvdW50
ID0gRHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIDB4RkZGRkZGRkYsIDAsIDApOworICAgICAgICBmb3Ig
KFVJTlQgaSA9IDA7IGkgPCBmaWxlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKCFEcmFn
UXVlcnlGaWxlVyhoZHJvcCwgaSwgZmlsZW5hbWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUp
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZpbGVzLT5hcHBlbmQo
RmlsZTo6Y3JlYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihmaWxlbmFtZSkpKTsKKyAgICAg
ICAgfQogCi0gICAgSERST1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhEUk9QPihHbG9iYWxM
b2NrKG1lZGl1bS5oR2xvYmFsKSk7Ci0gICAgaWYgKCFoZHJvcCkKKyAgICAgICAgR2xvYmFsVW5s
b2NrKG1lZGl1bS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmbWVkaXVtKTsK
ICAgICAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKLQotICAgIFdDSEFSIGZpbGVuYW1lW01B
WF9QQVRIXTsKLSAgICBVSU5UIGZpbGVDb3VudCA9IERyYWdRdWVyeUZpbGVXKGhkcm9wLCAweEZG
RkZGRkZGLCAwLCAwKTsKLSAgICBmb3IgKFVJTlQgaSA9IDA7IGkgPCBmaWxlQ291bnQ7IGkrKykg
ewotICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCBpLCBmaWxlbmFtZSwgV1RGX0FS
UkFZX0xFTkdUSChmaWxlbmFtZSkpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGZp
bGVzLT5hcHBlbmQoRmlsZTo6Y3JlYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihmaWxlbmFt
ZSkpKTsKICAgICB9Ci0KLSAgICBHbG9iYWxVbmxvY2sobWVkaXVtLmhHbG9iYWwpOwotICAgIFJl
bGVhc2VTdGdNZWRpdW0oJm1lZGl1bSk7CisgICAgaWYgKCFtX2RyYWdEYXRhTWFwLmNvbnRhaW5z
KGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQpKQorICAgICAgICByZXR1cm4gZmlsZXMucmVsZWFz
ZSgpOworICAgIFZlY3RvcjxTdHJpbmc+IGZpbGVzVmVjdG9yID0gbV9kcmFnRGF0YU1hcC5nZXQo
Y2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7CisgICAgZm9yIChWZWN0b3I8U3RyaW5nPjo6aXRl
cmF0b3IgaXQgPSBmaWxlc1ZlY3Rvci5iZWdpbigpOyBpdCAhPSBmaWxlc1ZlY3Rvci5lbmQoKTsg
KytpdCkKKyAgICAgICAgZmlsZXMtPmFwcGVuZChGaWxlOjpjcmVhdGUoKCppdCkuY2hhcmFjdGVy
cygpKSk7CiAgICAgcmV0dXJuIGZpbGVzLnJlbGVhc2UoKTsKICNlbmRpZgogfQpAQCAtNzc4LDI1
ICs4MDUsMjggQEAgdm9pZCBDbGlwYm9hcmRXaW46OndyaXRlUGxhaW5UZXh0KGNvbnN0CiAgICAg
CiBib29sIENsaXBib2FyZFdpbjo6aGFzRGF0YSgpCiB7Ci0gICAgaWYgKCFtX2RhdGFPYmplY3Qp
CisgICAgaWYgKCFtX2RhdGFPYmplY3QgJiYgbV9kcmFnRGF0YU1hcC5pc0VtcHR5KCkpCiAgICAg
ICAgIHJldHVybiBmYWxzZTsKIAotICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOwotICAg
IGlmIChGQUlMRUQobV9kYXRhT2JqZWN0LT5FbnVtRm9ybWF0RXRjKERBVEFESVJfR0VULCAmaXRy
KSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobV9kYXRhT2JqZWN0KSB7CisgICAg
ICAgIENPTVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOworICAgICAgICBpZiAoRkFJTEVEKG1fZGF0
YU9iamVjdC0+RW51bUZvcm1hdEV0YyhEQVRBRElSX0dFVCwgJml0cikpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKCFpdHIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgaWYgKCFpdHIpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBGT1JNQVRF
VEMgZGF0YTsKKyAgICAgICAgRk9STUFURVRDIGRhdGE7CiAKLSAgICAvLyBJRW51bUZPUk1BVEVU
Qzo6TmV4dCByZXR1cm5zIFNfRkFMU0UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaXRlbXMuCi0gICAg
aWYgKGl0ci0+TmV4dCgxLCAmZGF0YSwgMCkgPT0gU19PSykgewotICAgICAgICAvLyBUaGVyZSBp
cyBhdCBsZWFzdCBvbmUgaXRlbSBpbiB0aGUgSURhdGFPYmplY3QKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQorICAgICAgICAvLyBJRW51bUZPUk1BVEVUQzo6TmV4dCByZXR1cm5zIFNfRkFM
U0UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgaXRlbXMuCisgICAgICAgIGlmIChpdHItPk5leHQoMSwg
JmRhdGEsIDApID09IFNfT0spIHsKKyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IG9u
ZSBpdGVtIGluIHRoZSBJRGF0YU9iamVjdAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KIAotICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KyAgICByZXR1cm4gIW1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpOwogfQogCiB2b2lkIENsaXBib2Fy
ZFdpbjo6c2V0RXh0ZXJuYWxEYXRhT2JqZWN0KElEYXRhT2JqZWN0ICpkYXRhT2JqZWN0KQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFdpbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRXaW4uaAkocmV2aXNpb24g
NzY2OTEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkV2luLmgJKHdv
cmtpbmcgY29weSkKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJDT01QdHIuaCIKICNpbmNs
dWRlICJDYWNoZWRSZXNvdXJjZUNsaWVudC5oIgogI2luY2x1ZGUgIkNsaXBib2FyZC5oIgorI2lu
Y2x1ZGUgIkRyYWdEYXRhLmgiCiAKIHN0cnVjdCBJRGF0YU9iamVjdDsKIApAQCAtNTEsNiArNTIs
MTAgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDbGlwYm9h
cmRXaW4oY2xpcGJvYXJkVHlwZSwgZGF0YU9iamVjdCwgcG9saWN5LCBmcmFtZSkpOwogICAgIH0K
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxDbGlwYm9hcmRXaW4+IGNyZWF0ZShDbGlwYm9hcmRUeXBl
IGNsaXBib2FyZFR5cGUsIGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhTWFwLCBDbGlwYm9hcmRBY2Nl
c3NQb2xpY3kgcG9saWN5LCBGcmFtZSogZnJhbWUpCisgICAgeworICAgICAgICByZXR1cm4gYWRv
cHRSZWYobmV3IENsaXBib2FyZFdpbihjbGlwYm9hcmRUeXBlLCBkYXRhTWFwLCBwb2xpY3ksIGZy
YW1lKSk7CisgICAgfQogICAgIH5DbGlwYm9hcmRXaW4oKTsKIAogICAgIHZvaWQgY2xlYXJEYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSk7CkBAIC04MCwxMiArODUsMTQgQEAgcHVibGljOgogcHJpdmF0
ZToKICAgICBDbGlwYm9hcmRXaW4oQ2xpcGJvYXJkVHlwZSwgSURhdGFPYmplY3QqLCBDbGlwYm9h
cmRBY2Nlc3NQb2xpY3ksIEZyYW1lKik7CiAgICAgQ2xpcGJvYXJkV2luKENsaXBib2FyZFR5cGUs
IFdDRGF0YU9iamVjdCosIENsaXBib2FyZEFjY2Vzc1BvbGljeSwgRnJhbWUqKTsKKyAgICBDbGlw
Ym9hcmRXaW4oQ2xpcGJvYXJkVHlwZSwgY29uc3QgRHJhZ0RhdGFNYXAmLCBDbGlwYm9hcmRBY2Nl
c3NQb2xpY3ksIEZyYW1lKik7CiAKICAgICB2b2lkIHJlc2V0RnJvbUNsaXBib2FyZCgpOwogICAg
IHZvaWQgc2V0RHJhZ0ltYWdlKENhY2hlZEltYWdlKiwgTm9kZSosIGNvbnN0IEludFBvaW50Jik7
CiAKICAgICBDT01QdHI8SURhdGFPYmplY3Q+IG1fZGF0YU9iamVjdDsKICAgICBDT01QdHI8V0NE
YXRhT2JqZWN0PiBtX3dyaXRhYmxlRGF0YU9iamVjdDsKKyAgICBEcmFnRGF0YU1hcCBtX2RyYWdE
YXRhTWFwOwogICAgIEZyYW1lKiBtX2ZyYW1lOwogfTsKIApJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vd2luL0RyYWdEYXRhV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vRHJhZ0RhdGFXaW4uY3BwCShyZXZpc2lvbiA3NjY5MSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFnRGF0YVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJEcmFnRGF0YS5o
IgogCisjaW5jbHVkZSAiQ09NUHRyLmgiCiAjaW5jbHVkZSAiQ2xpcGJvYXJkVXRpbGl0aWVzV2lu
LmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCkBA
IC0zNSw2NSArMzYsMTA5IEBACiAjaW5jbHVkZSA8b2JqaWRsLmg+CiAjaW5jbHVkZSA8c2hsd2Fw
aS5oPgogI2luY2x1ZGUgPHdpbmluZXQuaD4KKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2lu
Y2x1ZGUgPHd0Zi9IYXNobWFwLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNs
dWRlIDx3dGYvUmVmUHRyLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorRHJhZ0RhdGE6OkRy
YWdEYXRhKGNvbnN0IERyYWdEYXRhTWFwJiBkYXRhLCBjb25zdCBJbnRQb2ludCYgY2xpZW50UG9z
aXRpb24sIGNvbnN0IEludFBvaW50JiBnbG9iYWxQb3NpdGlvbiwKKyAgICBEcmFnT3BlcmF0aW9u
IHNvdXJjZU9wZXJhdGlvbk1hc2ssIERyYWdBcHBsaWNhdGlvbkZsYWdzIGZsYWdzKQorICAgIDog
bV9jbGllbnRQb3NpdGlvbihjbGllbnRQb3NpdGlvbikKKyAgICAsIG1fZ2xvYmFsUG9zaXRpb24o
Z2xvYmFsUG9zaXRpb24pCisgICAgLCBtX3BsYXRmb3JtRHJhZ0RhdGEoMCkKKyAgICAsIG1fZHJh
Z2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrKHNvdXJjZU9wZXJhdGlvbk1hc2spCisgICAgLCBtX2Fw
cGxpY2F0aW9uRmxhZ3MoZmxhZ3MpCisgICAgLCBtX2RyYWdEYXRhTWFwKGRhdGEpCit7Cit9CisK
IGJvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zVVJMKEZyYW1lKiwgRmlsZW5hbWVDb252ZXJzaW9uUG9s
aWN5IGZpbGVuYW1lUG9saWN5KSBjb25zdAogewotICAgIHJldHVybiBTVUNDRUVERUQobV9wbGF0
Zm9ybURyYWdEYXRhLT5RdWVyeUdldERhdGEodXJsV0Zvcm1hdCgpKSkgCi0gICAgICAgIHx8IFNV
Q0NFRURFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YSh1cmxGb3JtYXQoKSkpCi0g
ICAgICAgIHx8IChmaWxlbmFtZVBvbGljeSA9PSBDb252ZXJ0RmlsZW5hbWVzCi0gICAgICAgICAg
ICAmJiAoU1VDQ0VFREVEKG1fcGxhdGZvcm1EcmFnRGF0YS0+UXVlcnlHZXREYXRhKGZpbGVuYW1l
V0Zvcm1hdCgpKSkKLSAgICAgICAgICAgICAgICB8fCBTVUNDRUVERUQobV9wbGF0Zm9ybURyYWdE
YXRhLT5RdWVyeUdldERhdGEoZmlsZW5hbWVGb3JtYXQoKSkpKSk7CisgICAgaWYgKG1fcGxhdGZv
cm1EcmFnRGF0YSkKKyAgICAgICAgcmV0dXJuIFNVQ0NFRURFRChtX3BsYXRmb3JtRHJhZ0RhdGEt
PlF1ZXJ5R2V0RGF0YSh1cmxXRm9ybWF0KCkpKSAKKyAgICAgICAgICAgIHx8IFNVQ0NFRURFRCht
X3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YSh1cmxGb3JtYXQoKSkpCisgICAgICAgICAg
ICB8fCAoZmlsZW5hbWVQb2xpY3kgPT0gQ29udmVydEZpbGVuYW1lcworICAgICAgICAgICAgICAg
ICYmIChTVUNDRUVERUQobV9wbGF0Zm9ybURyYWdEYXRhLT5RdWVyeUdldERhdGEoZmlsZW5hbWVX
Rm9ybWF0KCkpKQorICAgICAgICAgICAgICAgICAgICB8fCBTVUNDRUVERUQobV9wbGF0Zm9ybURy
YWdEYXRhLT5RdWVyeUdldERhdGEoZmlsZW5hbWVGb3JtYXQoKSkpKSk7CisgICAgcmV0dXJuIG1f
ZHJhZ0RhdGFNYXAuY29udGFpbnModXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCkgfHwgbV9kcmFnRGF0
YU1hcC5jb250YWlucyh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQpCisgICAgICAgIHx8IChmaWxlbmFt
ZVBvbGljeSA9PSBDb252ZXJ0RmlsZW5hbWVzICYmIChtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKGZp
bGVuYW1lV0Zvcm1hdCgpLT5jZkZvcm1hdCkgfHwgbV9kcmFnRGF0YU1hcC5jb250YWlucyhmaWxl
bmFtZUZvcm1hdCgpLT5jZkZvcm1hdCkpKTsKK30KKworRHJhZ0RhdGFNYXAgRHJhZ0RhdGE6OmRy
YWdEYXRhTWFwKCkKK3sKKyAgICBpZiAoIW1fZHJhZ0RhdGFNYXAuaXNFbXB0eSgpIHx8ICFtX3Bs
YXRmb3JtRHJhZ0RhdGEpCisgICAgICAgIHJldHVybiBtX2RyYWdEYXRhTWFwOworICAgIC8vIEVu
dW1lcmF0ZSBjbGlwYm9hcmQgY29udGVudCBhbmQgbG9hZCBpdCBpbiB0aGUgbWFwLgorICAgIENP
TVB0cjxJRW51bUZPUk1BVEVUQz4gaXRyOworCisgICAgaWYgKEZBSUxFRChtX3BsYXRmb3JtRHJh
Z0RhdGEtPkVudW1Gb3JtYXRFdGMoREFUQURJUl9HRVQsICZpdHIpKSB8fCAhaXRyKQorICAgICAg
ICByZXR1cm4gbV9kcmFnRGF0YU1hcDsKKworICAgIEZPUk1BVEVUQyBkYXRhRm9ybWF0OworICAg
IHdoaWxlIChpdHItPk5leHQoMSwgJmRhdGFGb3JtYXQsIDApID09IFNfT0spIHsKKyAgICAgICAg
VmVjdG9yPFN0cmluZz4gZGF0YVN0cmluZ3M7CisgICAgICAgIGdldENsaXBib2FyZERhdGEobV9w
bGF0Zm9ybURyYWdEYXRhLCBkYXRhRm9ybWF0LmNmRm9ybWF0LCBkYXRhU3RyaW5ncyk7CisgICAg
ICAgIGlmICghZGF0YVN0cmluZ3MuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9kcmFnRGF0YU1h
cC5zZXQoZGF0YUZvcm1hdC5jZkZvcm1hdCwgZGF0YVN0cmluZ3MpOyAKKyAgICB9CisgICAgcmV0
dXJuIG1fZHJhZ0RhdGFNYXA7CiB9CiAKIFN0cmluZyBEcmFnRGF0YTo6YXNVUkwoRnJhbWUqLCBG
aWxlbmFtZUNvbnZlcnNpb25Qb2xpY3kgZmlsZW5hbWVQb2xpY3ksIFN0cmluZyogdGl0bGUpIGNv
bnN0CiB7CiAgICAgYm9vbCBzdWNjZXNzOwotICAgIHJldHVybiBnZXRVUkwobV9wbGF0Zm9ybURy
YWdEYXRhLCBmaWxlbmFtZVBvbGljeSwgc3VjY2VzcywgdGl0bGUpOworICAgIHJldHVybiAobV9w
bGF0Zm9ybURyYWdEYXRhKSA/IGdldFVSTChtX3BsYXRmb3JtRHJhZ0RhdGEsIGZpbGVuYW1lUG9s
aWN5LCBzdWNjZXNzLCB0aXRsZSkgOiBnZXRVUkwoJm1fZHJhZ0RhdGFNYXAsIGZpbGVuYW1lUG9s
aWN5LCB0aXRsZSk7CiB9CiAKIGJvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zRmlsZXMoKSBjb25zdAog
ewotICAgIHJldHVybiBTVUNDRUVERUQobV9wbGF0Zm9ybURyYWdEYXRhLT5RdWVyeUdldERhdGEo
Y2ZIRHJvcEZvcm1hdCgpKSk7CisgICAgcmV0dXJuIChtX3BsYXRmb3JtRHJhZ0RhdGEpID8gU1VD
Q0VFREVEKG1fcGxhdGZvcm1EcmFnRGF0YS0+UXVlcnlHZXREYXRhKGNmSERyb3BGb3JtYXQoKSkp
IDogbV9kcmFnRGF0YU1hcC5jb250YWlucyhjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0KTsKIH0K
IAogdm9pZCBEcmFnRGF0YTo6YXNGaWxlbmFtZXMoVmVjdG9yPFN0cmluZz4mIHJlc3VsdCkgY29u
c3QKIHsKLSAgICBXQ0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07Ci0gICAgCi0gICAgU1RHTUVESVVN
IG1lZGl1bTsKLSAgICBpZiAoRkFJTEVEKG1fcGxhdGZvcm1EcmFnRGF0YS0+R2V0RGF0YShjZkhE
cm9wRm9ybWF0KCksICZtZWRpdW0pKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIEhEUk9Q
IGhkcm9wID0gKEhEUk9QKUdsb2JhbExvY2sobWVkaXVtLmhHbG9iYWwpOwotICAgIAotICAgIGlm
ICghaGRyb3ApCi0gICAgICAgIHJldHVybjsKKyAgICBpZiAobV9wbGF0Zm9ybURyYWdEYXRhKSB7
CisgICAgICAgIFdDSEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKKyAgICAgICAgCisgICAgICAgIFNU
R01FRElVTSBtZWRpdW07CisgICAgICAgIGlmIChGQUlMRUQobV9wbGF0Zm9ybURyYWdEYXRhLT5H
ZXREYXRhKGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSkpKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICAgICAgSERST1AgaGRyb3AgPSAoSERST1ApR2xvYmFsTG9jayhtZWRpdW0u
aEdsb2JhbCk7CisgICAgICAgIAorICAgICAgICBpZiAoIWhkcm9wKQorICAgICAgICAgICAgcmV0
dXJuOwogCi0gICAgY29uc3QgdW5zaWduZWQgbnVtRmlsZXMgPSBEcmFnUXVlcnlGaWxlVyhoZHJv
cCwgMHhGRkZGRkZGRiwgMCwgMCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bUZp
bGVzOyBpKyspIHsKLSAgICAgICAgaWYgKCFEcmFnUXVlcnlGaWxlVyhoZHJvcCwgMCwgZmlsZW5h
bWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICByZXN1bHQuYXBwZW5kKChVQ2hhciopZmlsZW5hbWUpOwotICAgIH0KKyAgICAgICAg
Y29uc3QgdW5zaWduZWQgbnVtRmlsZXMgPSBEcmFnUXVlcnlGaWxlVyhoZHJvcCwgMHhGRkZGRkZG
RiwgMCwgMCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1GaWxlczsgaSsr
KSB7CisgICAgICAgICAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCAwLCBmaWxlbmFtZSwg
V1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoVUNoYXIqKWZpbGVuYW1lKTsKKyAgICAgICAgfQog
Ci0gICAgLy8gRnJlZSB1cCBtZW1vcnkgZnJvbSBkcmFnCi0gICAgRHJhZ0ZpbmlzaChoZHJvcCk7
CisgICAgICAgIC8vIEZyZWUgdXAgbWVtb3J5IGZyb20gZHJhZworICAgICAgICBEcmFnRmluaXNo
KGhkcm9wKTsKIAotICAgIEdsb2JhbFVubG9jayhtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgIEds
b2JhbFVubG9jayhtZWRpdW0uaEdsb2JhbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
cmVzdWx0ID0gbV9kcmFnRGF0YU1hcC5nZXQoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCk7CiB9
CiAKIGJvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zUGxhaW5UZXh0KCkgY29uc3QKIHsKLSAgICByZXR1
cm4gU1VDQ0VFREVEKG1fcGxhdGZvcm1EcmFnRGF0YS0+UXVlcnlHZXREYXRhKHBsYWluVGV4dFdG
b3JtYXQoKSkpCi0gICAgICAgIHx8IFNVQ0NFRURFRChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5
R2V0RGF0YShwbGFpblRleHRGb3JtYXQoKSkpOworICAgIGlmIChtX3BsYXRmb3JtRHJhZ0RhdGEp
CisgICAgICAgIHJldHVybiBTVUNDRUVERUQobV9wbGF0Zm9ybURyYWdEYXRhLT5RdWVyeUdldERh
dGEocGxhaW5UZXh0V0Zvcm1hdCgpKSkKKyAgICAgICAgICAgIHx8IFNVQ0NFRURFRChtX3BsYXRm
b3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YShwbGFpblRleHRGb3JtYXQoKSkpOworICAgIHJldHVy
biBtX2RyYWdEYXRhTWFwLmNvbnRhaW5zKHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3JtYXQpIHx8
IG1fZHJhZ0RhdGFNYXAuY29udGFpbnMocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0KTsKIH0K
IAogU3RyaW5nIERyYWdEYXRhOjphc1BsYWluVGV4dChGcmFtZSopIGNvbnN0CiB7CiAgICAgYm9v
bCBzdWNjZXNzOwotICAgIHJldHVybiBnZXRQbGFpblRleHQobV9wbGF0Zm9ybURyYWdEYXRhLCBz
dWNjZXNzKTsKKyAgICByZXR1cm4gKG1fcGxhdGZvcm1EcmFnRGF0YSkgPyBnZXRQbGFpblRleHQo
bV9wbGF0Zm9ybURyYWdEYXRhLCBzdWNjZXNzKSA6IGdldFBsYWluVGV4dCgmbV9kcmFnRGF0YU1h
cCk7CiB9CiAKIGJvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zQ29sb3IoKSBjb25zdApAQCAtMTAzLDE0
ICsxNDgsMTYgQEAgYm9vbCBEcmFnRGF0YTo6Y29udGFpbnNDb2xvcigpIGNvbnN0CiAKIGJvb2wg
RHJhZ0RhdGE6OmNhblNtYXJ0UmVwbGFjZSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIFNVQ0NFRURF
RChtX3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YShzbWFydFBhc3RlRm9ybWF0KCkpKTsg
CisgICAgaWYgKG1fcGxhdGZvcm1EcmFnRGF0YSkKKyAgICAgICAgcmV0dXJuIFNVQ0NFRURFRCht
X3BsYXRmb3JtRHJhZ0RhdGEtPlF1ZXJ5R2V0RGF0YShzbWFydFBhc3RlRm9ybWF0KCkpKTsKKyAg
ICByZXR1cm4gbV9kcmFnRGF0YU1hcC5jb250YWlucyhzbWFydFBhc3RlRm9ybWF0KCktPmNmRm9y
bWF0KTsKIH0KIAogYm9vbCBEcmFnRGF0YTo6Y29udGFpbnNDb21wYXRpYmxlQ29udGVudCgpIGNv
bnN0CiB7CiAgICAgcmV0dXJuIGNvbnRhaW5zUGxhaW5UZXh0KCkgfHwgY29udGFpbnNVUkwoMCkg
Ci0gICAgICAgIHx8IGNvbnRhaW5zSFRNTChtX3BsYXRmb3JtRHJhZ0RhdGEpIAotICAgICAgICB8
fCBjb250YWluc0ZpbGVuYW1lcyhtX3BsYXRmb3JtRHJhZ0RhdGEpIAorICAgICAgICB8fCAoKG1f
cGxhdGZvcm1EcmFnRGF0YSkgPyAoY29udGFpbnNIVE1MKG1fcGxhdGZvcm1EcmFnRGF0YSkgfHwg
Y29udGFpbnNGaWxlbmFtZXMobV9wbGF0Zm9ybURyYWdEYXRhKSkKKyAgICAgICAgICAgIDogKGNv
bnRhaW5zSFRNTCgmbV9kcmFnRGF0YU1hcCkgfHwgY29udGFpbnNGaWxlbmFtZXMoJm1fZHJhZ0Rh
dGFNYXApKSkKICAgICAgICAgfHwgY29udGFpbnNDb2xvcigpOwogfQogCkBAIC0xMjUsMTYgKzE3
MiwyNSBAQCBQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IERyYWdEYXRhOjphCiAgICAgICog
KiBUSUZGCiAgICAgICogKiBQSUNUCiAgICAgICovCi0gICAgICAgIAotICAgICBpZiAoY29udGFp
bnNGaWxlbmFtZXMobV9wbGF0Zm9ybURyYWdEYXRhKSkKLSAgICAgICAgIGlmIChQYXNzUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gZnJhZ21lbnRGcm9tRmlsZW5hbWVzKGZyYW1l
LT5kb2N1bWVudCgpLCBtX3BsYXRmb3JtRHJhZ0RhdGEpKQotICAgICAgICAgICAgIHJldHVybiBm
cmFnbWVudDsKLQotICAgICBpZiAoY29udGFpbnNIVE1MKG1fcGxhdGZvcm1EcmFnRGF0YSkpCi0g
ICAgICAgICBpZiAoUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdt
ZW50RnJvbUhUTUwoZnJhbWUtPmRvY3VtZW50KCksIG1fcGxhdGZvcm1EcmFnRGF0YSkpCi0gICAg
ICAgICAgICAgcmV0dXJuIGZyYWdtZW50OwotCi0gICAgIHJldHVybiAwOworICAgICAKKyAgICBp
ZiAobV9wbGF0Zm9ybURyYWdEYXRhKSB7CisgICAgICAgIGlmIChjb250YWluc0ZpbGVuYW1lcyht
X3BsYXRmb3JtRHJhZ0RhdGEpKQorICAgICAgICAgICAgaWYgKFBhc3NSZWZQdHI8RG9jdW1lbnRG
cmFnbWVudD4gZnJhZ21lbnQgPSBmcmFnbWVudEZyb21GaWxlbmFtZXMoZnJhbWUtPmRvY3VtZW50
KCksIG1fcGxhdGZvcm1EcmFnRGF0YSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50
OworCisgICAgICAgIGlmIChjb250YWluc0hUTUwobV9wbGF0Zm9ybURyYWdEYXRhKSkKKyAgICAg
ICAgICAgIGlmIChQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gZnJhZ21l
bnRGcm9tSFRNTChmcmFtZS0+ZG9jdW1lbnQoKSwgbV9wbGF0Zm9ybURyYWdEYXRhKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNv
bnRhaW5zRmlsZW5hbWVzKCZtX2RyYWdEYXRhTWFwKSkKKyAgICAgICAgICAgIGlmIChQYXNzUmVm
UHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gZnJhZ21lbnRGcm9tRmlsZW5hbWVzKGZy
YW1lLT5kb2N1bWVudCgpLCAmbV9kcmFnRGF0YU1hcCkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZyYWdtZW50OworCisgICAgICAgIGlmIChjb250YWluc0hUTUwoJm1fZHJhZ0RhdGFNYXApKQor
ICAgICAgICAgICAgaWYgKFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBm
cmFnbWVudEZyb21IVE1MKGZyYW1lLT5kb2N1bWVudCgpLCAmbV9kcmFnRGF0YU1hcCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50OworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAog
Q29sb3IgRHJhZ0RhdGE6OmFzQ29sb3IoKSBjb25zdApAQCAtMTQzLDQgKzE5OSwzIEBAIENvbG9y
IERyYWdEYXRhOjphc0NvbG9yKCkgY29uc3QKIH0KIAogfQotCkluZGV4OiBTb3VyY2UvV2ViS2l0
Mi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCShyZXZp
c2lvbiA3NjcxNikKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDQ3IEBACisyMDExLTAxLTI2ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBs
ZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
V2ViS2l0MjogYWRkIHN1cHBvcnQgZm9yIGRyYWcgYW5kIGRyb3Agb24gV2luZG93cworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTI3NzUKKyAgICAgICAg
PHJkYXI6Ly9wcm9ibGVtLzg1MTQ0MDk+CisKKyAgICAgICAgT24gV2luZG93cyB0aGUgYWNjZXNz
IHRvIHRoZSBjb250ZW50IGJlaW5nIGRyYWdnZWQgaXMKKyAgICAgICAgcHJvdmlkZWQgdmlhIHRo
ZSBJRGF0YU9iamVjdCBpbnRlcmZhY2UgdGhhdCBpcyBtYWRlIGF2YWlsYWJsZQorICAgICAgICB0
byB0aGUgd2luZG93IHRoYXQgcmVnaXN0ZXJzIGl0c2VsZiBhcyBkcm9wIHRhcmdldC4KKyAgICAg
ICAgU2luY2UgdGhpcyBpbnRlcmZhY2UgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gdGhlIFdlYlBy
b2Nlc3MsCisgICAgICAgIGluIGV2ZXJ5IGNhbGwgdG8gb25lIG9mIHRoZSBtZXRob2RzIG9mIHRo
ZSBJRHJvcFRhcmdldCBpbnRlcmZhY2UKKyAgICAgICAgd2Ugc2VyaWFsaXplIHRoZSBjb250ZW50
IG9mIHRoZSBkcmFnIGNsaXBib2FyZCBhbmQgc2VuZCBpdCBvdmVyIHRvCisgICAgICAgIHRoZSBX
ZWJQcm9jZXNzLiBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgc2FtZSBtZXNzYWdlcyBhcyB0
aGUKKyAgICAgICAgTWFjIG9uZSwgd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgcGFyYW1ldGVycyB0
byBwYXNzIHRoZSBzZXJpYWxpemVkCisgICAgICAgIGNsaXBib2FyZC4KKworICAgICAgICAqIFVJ
UHJvY2Vzcy9XZWJQYWdlUHJveHkuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdlUHJveHk6
OnBlcmZvcm1EcmFnQ29udHJvbGxlckFjdGlvbik6IEFkZGVkIFdpbmRvd3MKKyAgICAgICAgc3Bl
Y2lmaWMgaW1wbGVtZW50YXRpb24uCisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5o
OgorICAgICAgICAqIFVJUHJvY2Vzcy93aW4vV2ViVmlldy5jcHA6CisgICAgICAgIChXZWJLaXQ6
OldlYlZpZXc6OldlYlZpZXcpOiBBZGRlZCBkcm9wVGFyZ2V0SGVscGVyIG9iamVjdCBjcmVhdGlv
bi4KKyAgICAgICAgKFdlYktpdDo6V2ViVmlldzo6aW5pdGlhbGl6ZSk6IEFkZGVkIHRvIHJlZ2lz
dGVyIGZvciBkcmFnL2Ryb3Agd2l0aCBvdXQKKyAgICAgICAgcmVmY291bnQgaXNzdWVzLgorICAg
ICAgICAoV2ViS2l0OjpXZWJWaWV3OjpjbG9zZSk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXc6
OndpbmRvd1JlY2VpdmVkTWVzc2FnZSk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXc6OlF1ZXJ5
SW50ZXJmYWNlKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlldzo6QWRkUmVmKToKKyAgICAgICAg
KFdlYktpdDo6V2ViVmlldzo6UmVsZWFzZSk6CisgICAgICAgIChXZWJLaXQ6OmRyYWdPcGVyYXRp
b25Ub0RyYWdDdXJzb3IpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3OjprZXlTdGF0ZVRvRHJh
Z09wZXJhdGlvbik6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXc6OkRyYWdFbnRlcik6CisgICAg
ICAgIChXZWJLaXQ6OldlYlZpZXc6OkRyYWdPdmVyKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmll
dzo6RHJhZ0xlYXZlKToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlldzo6RHJvcCk6CisgICAgICAg
ICogVUlQcm9jZXNzL3dpbi9XZWJWaWV3Lmg6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXc6OmNy
ZWF0ZSk6CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3BwOgorICAgICAg
ICAoV2ViS2l0OjpXZWJQYWdlOjpwZXJmb3JtRHJhZ0NvbnRyb2xsZXJBY3Rpb24pOgorICAgICAg
ICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmg6CisgICAgICAgICogV2ViUHJvY2Vzcy9X
ZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW46CisKIDIwMTEtMDEtMjUgIEJyaWFuIFdlaW5zdGVp
biAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFudHRpIEtv
aXZpc3RvLgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHAJ
KHJldmlzaW9uIDc2NjkxKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94
eS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYxMCw3ICs2MTAsMTYgQEAgdm9pZCBXZWJQYWdlUHJv
eHk6OnBlcmZvcm1EcmFnQ29udHJvbGxlcgogewogICAgIGlmICghaXNWYWxpZCgpKQogICAgICAg
ICByZXR1cm47CisjaWYgUExBVEZPUk0oV0lOKQorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcGFz
cyB0aGUgZHJhZyBkYXRhIG1hcCBvbmx5IG9uIERyYWdFbnRlci4KKyAgICBwcm9jZXNzKCktPnNl
bmQoTWVzc2FnZXM6OldlYlBhZ2U6OlBlcmZvcm1EcmFnQ29udHJvbGxlckFjdGlvbihhY3Rpb24s
IGRyYWdEYXRhLT5jbGllbnRQb3NpdGlvbigpLCBkcmFnRGF0YS0+Z2xvYmFsUG9zaXRpb24oKSwK
KyAgICAgICAgZHJhZ0RhdGEtPmRyYWdnaW5nU291cmNlT3BlcmF0aW9uTWFzaygpLAorICAgICAg
ICBkcmFnRGF0YS0+ZHJhZ0RhdGFNYXAoKSwKKyAgICAgICAgZHJhZ0RhdGEtPmZsYWdzKCkpLAor
ICAgICAgICBtX3BhZ2VJRCk7CisjZWxzZQogICAgIHByb2Nlc3MoKS0+c2VuZChNZXNzYWdlczo6
V2ViUGFnZTo6UGVyZm9ybURyYWdDb250cm9sbGVyQWN0aW9uKGFjdGlvbiwgZHJhZ0RhdGEtPmNs
aWVudFBvc2l0aW9uKCksIGRyYWdEYXRhLT5nbG9iYWxQb3NpdGlvbigpLCBkcmFnRGF0YS0+ZHJh
Z2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrKCksIGRyYWdTdG9yYWdlTmFtZSwgZHJhZ0RhdGEtPmZs
YWdzKCkpLCBtX3BhZ2VJRCk7CisjZW5kaWYKIH0KIAogdm9pZCBXZWJQYWdlUHJveHk6OmRpZFBl
cmZvcm1EcmFnQ29udHJvbGxlckFjdGlvbih1aW50NjRfdCByZXN1bHRPcGVyYXRpb24pCkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCShyZXZpc2lvbiA3NjY5MSkK
KysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAkod29ya2luZyBjb3B5
KQpAQCAtMjg3LDcgKzI4Nyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGJhY2tGb3J3YXJkUmVtb3Zl
ZEl0ZW0odWludDY0X3QgaXRlbUlEKTsKIAogICAgIC8vIERyYWcgYW5kIGRyb3Agc3VwcG9ydC4K
LSAgICB2b2lkIHBlcmZvcm1EcmFnQ29udHJvbGxlckFjdGlvbihEcmFnQ29udHJvbGxlckFjdGlv
biwgV2ViQ29yZTo6RHJhZ0RhdGEqLCBjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIHBlcmZvcm1E
cmFnQ29udHJvbGxlckFjdGlvbihEcmFnQ29udHJvbGxlckFjdGlvbiwgV2ViQ29yZTo6RHJhZ0Rh
dGEqLCBjb25zdCBTdHJpbmcmID0gU3RyaW5nKCkpOwogICAgIHZvaWQgZGlkUGVyZm9ybURyYWdD
b250cm9sbGVyQWN0aW9uKHVpbnQ2NF90IHJlc3VsdE9wZXJhdGlvbik7CiAgICAgdm9pZCBkcmFn
RW5kZWQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGNsaWVudFBvc2l0aW9uLCBjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgZ2xvYmFsUG9zaXRpb24sIHVpbnQ2NF90IG9wZXJhdGlvbik7CiAjaWYg
UExBVEZPUk0oTUFDKQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3dpbi9XZWJWaWV3
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mvd2luL1dlYlZpZXcu
Y3BwCShyZXZpc2lvbiA3NjY5MSkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy93aW4vV2Vi
Vmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI0Myw2ICsyNDMsOCBAQCBXZWJWaWV3OjpXZWJW
aWV3KFJFQ1QgcmVjdCwgV2ViQ29udGV4dCoKIAogICAgIG1fcGFnZS0+aW5pdGlhbGl6ZVdlYlBh
Z2UoKTsKIAorICAgIENvQ3JlYXRlSW5zdGFuY2UoQ0xTSURfRHJhZ0Ryb3BIZWxwZXIsIDAsIENM
U0NUWF9JTlBST0NfU0VSVkVSLCBJSURfSURyb3BUYXJnZXRIZWxwZXIsICh2b2lkKiopJm1fZHJv
cFRhcmdldEhlbHBlcik7CisKICAgICA6OlNob3dXaW5kb3cobV93aW5kb3csIFNXX1NIT1cpOwog
CiAgICAgLy8gRklYTUU6IEluaXRpYWxpemluZyB0aGUgdG9vbHRpcCB3aW5kb3cgaGVyZSBtYXRj
aGVzIFdlYktpdCB3aW4sIGJ1dCBzZWVtcyBsaWtlIHNvbWV0aGluZwpAQCAtMjYwLDYgKzI2Miwx
MSBAQCBXZWJWaWV3Ojp+V2ViVmlldygpCiAgICAgICAgIDo6RGVzdHJveVdpbmRvdyhtX3Rvb2xU
aXBXaW5kb3cpOwogfQogCit2b2lkIFdlYlZpZXc6OmluaXRpYWxpemUoKQoreworICAgIDo6UmVn
aXN0ZXJEcmFnRHJvcChtX3dpbmRvdywgdGhpcyk7Cit9CisKIHZvaWQgV2ViVmlldzo6c2V0UGFy
ZW50V2luZG93KEhXTkQgcGFyZW50V2luZG93KQogewogICAgIGlmIChtX3dpbmRvdykgewpAQCAt
NTY5LDYgKzU3Niw3IEBAIHZvaWQgV2ViVmlldzo6c3RvcFRyYWNraW5nTW91c2VMZWF2ZSgpCiAK
IHZvaWQgV2ViVmlldzo6Y2xvc2UoKQogeworICAgIDo6UmV2b2tlRHJhZ0Ryb3AobV93aW5kb3cp
OwogICAgIHNldFBhcmVudFdpbmRvdygwKTsKICAgICBtX3BhZ2UtPmNsb3NlKCk7CiB9CkBAIC0x
MDkyLDQgKzExMDAsMTMxIEBAIHZvaWQgV2ViVmlldzo6d2luZG93UmVjZWl2ZWRNZXNzYWdlKEhX
TkQKICAgICB9CiB9CiAKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6UXVlcnlJ
bnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZPYmplY3QpCit7CisgICAgKnBwdk9iamVj
dCA9IDA7CisgICAgaWYgKElzRXF1YWxHVUlEKHJpaWQsIElJRF9JVW5rbm93bikpCisgICAgICAg
ICpwcHZPYmplY3QgPSBzdGF0aWNfY2FzdDxJVW5rbm93bio+KHRoaXMpOworICAgIGVsc2UgaWYg
KElzRXF1YWxHVUlEKHJpaWQsIElJRF9JRHJvcFRhcmdldCkpCisgICAgICAgICpwcHZPYmplY3Qg
PSBzdGF0aWNfY2FzdDxJRHJvcFRhcmdldCo+KHRoaXMpOworICAgIGVsc2UKKyAgICAgICAgcmV0
dXJuIEVfTk9JTlRFUkZBQ0U7CisKKyAgICBBZGRSZWYoKTsKKyAgICByZXR1cm4gU19PSzsKK30K
KworVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6QWRkUmVmKHZvaWQpCit7CisgICAg
cmVmKCk7CisgICAgcmV0dXJuIHJlZkNvdW50KCk7Cit9CisKK1VMT05HIFNURE1FVEhPRENBTExU
WVBFIFdlYlZpZXc6OlJlbGVhc2Uodm9pZCkKK3sKKyAgICBkZXJlZigpOworICAgIHJldHVybiBy
ZWZDb3VudCgpOworfQorCitzdGF0aWMgRFdPUkQgZHJhZ09wZXJhdGlvblRvRHJhZ0N1cnNvcihE
cmFnT3BlcmF0aW9uIG9wKQoreworICAgIERXT1JEIHJlcyA9IERST1BFRkZFQ1RfTk9ORTsKKyAg
ICBpZiAob3AgJiBEcmFnT3BlcmF0aW9uQ29weSkgCisgICAgICAgIHJlcyA9IERST1BFRkZFQ1Rf
Q09QWTsKKyAgICBlbHNlIGlmIChvcCAmIERyYWdPcGVyYXRpb25MaW5rKSAKKyAgICAgICAgcmVz
ID0gRFJPUEVGRkVDVF9MSU5LOworICAgIGVsc2UgaWYgKG9wICYgRHJhZ09wZXJhdGlvbk1vdmUp
IAorICAgICAgICByZXMgPSBEUk9QRUZGRUNUX01PVkU7CisgICAgZWxzZSBpZiAob3AgJiBEcmFn
T3BlcmF0aW9uR2VuZXJpYykgCisgICAgICAgIHJlcyA9IERST1BFRkZFQ1RfTU9WRTsgLy8gVGhp
cyBhcHBlYXJzIHRvIGJlIHRoZSBGaXJlZm94IGJlaGF2aW91cgorICAgIHJldHVybiByZXM7Cit9
CisKK1dlYkNvcmU6OkRyYWdPcGVyYXRpb24gV2ViVmlldzo6a2V5U3RhdGVUb0RyYWdPcGVyYXRp
b24oRFdPUkQgZ3JmS2V5U3RhdGUpIGNvbnN0Cit7CisgICAgaWYgKCFtX3BhZ2UpCisgICAgICAg
IHJldHVybiBEcmFnT3BlcmF0aW9uTm9uZTsKKworICAgIC8vIENvbmZvcm1zIHRvIE1pY3Jvc29m
dCdzIGtleSBjb21iaW5hdGlvbnMgYXMgZG9jdW1lbnRlZCBmb3IgCisgICAgLy8gSURyb3BUYXJn
ZXQ6OkRyYWdPdmVyLiBOb3RlLCBncmZLZXlTdGF0ZSBpcyB0aGUgY3VycmVudCAKKyAgICAvLyBz
dGF0ZSBvZiB0aGUga2V5Ym9hcmQgbW9kaWZpZXIga2V5cyBvbiB0aGUga2V5Ym9hcmQuIFNlZToK
KyAgICAvLyA8aHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNjgwMTI5
KFZTLjg1KS5hc3B4Pi4KKyAgICBEcmFnT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG1fcGFnZS0+ZHJh
Z09wZXJhdGlvbigpOworCisgICAgaWYgKChncmZLZXlTdGF0ZSAmIChNS19DT05UUk9MIHwgTUtf
U0hJRlQpKSA9PSAoTUtfQ09OVFJPTCB8IE1LX1NISUZUKSkKKyAgICAgICAgb3BlcmF0aW9uID0g
RHJhZ09wZXJhdGlvbkxpbms7CisgICAgZWxzZSBpZiAoKGdyZktleVN0YXRlICYgTUtfQ09OVFJP
TCkgPT0gTUtfQ09OVFJPTCkKKyAgICAgICAgb3BlcmF0aW9uID0gRHJhZ09wZXJhdGlvbkNvcHk7
CisgICAgZWxzZSBpZiAoKGdyZktleVN0YXRlICYgTUtfU0hJRlQpID09IE1LX1NISUZUKQorICAg
ICAgICBvcGVyYXRpb24gPSBEcmFnT3BlcmF0aW9uR2VuZXJpYzsKKworICAgIHJldHVybiBvcGVy
YXRpb247Cit9CisKK0hSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6RHJhZ0VudGVy
KElEYXRhT2JqZWN0KiBwRGF0YU9iamVjdCwgRFdPUkQgZ3JmS2V5U3RhdGUsIFBPSU5UTCBwdCwg
RFdPUkQqIHBkd0VmZmVjdCkKK3sKKyAgICBtX2RyYWdEYXRhID0gMDsKKyAgICBtX3BhZ2UtPnJl
c2V0RHJhZ09wZXJhdGlvbigpOworCisgICAgaWYgKG1fZHJvcFRhcmdldEhlbHBlcikKKyAgICAg
ICAgbV9kcm9wVGFyZ2V0SGVscGVyLT5EcmFnRW50ZXIobV93aW5kb3csIHBEYXRhT2JqZWN0LCAo
UE9JTlQqKSZwdCwgKnBkd0VmZmVjdCk7CisKKyAgICBQT0lOVEwgbG9jYWxwdCA9IHB0OworICAg
IDo6U2NyZWVuVG9DbGllbnQobV93aW5kb3csIChMUFBPSU5UKSZsb2NhbHB0KTsKKyAgICBEcmFn
RGF0YSBkYXRhKHBEYXRhT2JqZWN0LCBJbnRQb2ludChsb2NhbHB0LngsIGxvY2FscHQueSksIElu
dFBvaW50KHB0LngsIHB0LnkpLCBrZXlTdGF0ZVRvRHJhZ09wZXJhdGlvbihncmZLZXlTdGF0ZSkp
OworICAgIG1fcGFnZS0+cGVyZm9ybURyYWdDb250cm9sbGVyQWN0aW9uKERyYWdDb250cm9sbGVy
QWN0aW9uRW50ZXJlZCwgJmRhdGEpOworICAgICpwZHdFZmZlY3QgPSBkcmFnT3BlcmF0aW9uVG9E
cmFnQ3Vyc29yKG1fcGFnZS0+ZHJhZ09wZXJhdGlvbigpKTsKKworICAgIG1fbGFzdERyb3BFZmZl
Y3QgPSAqcGR3RWZmZWN0OworICAgIG1fZHJhZ0RhdGEgPSBwRGF0YU9iamVjdDsKKworICAgIHJl
dHVybiBTX09LOworfQorCitIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFdlYlZpZXc6OkRyYWdP
dmVyKERXT1JEIGdyZktleVN0YXRlLCBQT0lOVEwgcHQsIERXT1JEKiBwZHdFZmZlY3QpCit7Cisg
ICAgaWYgKG1fZHJvcFRhcmdldEhlbHBlcikKKyAgICAgICAgbV9kcm9wVGFyZ2V0SGVscGVyLT5E
cmFnT3ZlcigoUE9JTlQqKSZwdCwgKnBkd0VmZmVjdCk7CisKKyAgICBpZiAobV9kcmFnRGF0YSkg
eworICAgICAgICBQT0lOVEwgbG9jYWxwdCA9IHB0OworICAgICAgICA6OlNjcmVlblRvQ2xpZW50
KG1fd2luZG93LCAoTFBQT0lOVCkmbG9jYWxwdCk7CisgICAgICAgIERyYWdEYXRhIGRhdGEobV9k
cmFnRGF0YS5nZXQoKSwgSW50UG9pbnQobG9jYWxwdC54LCBsb2NhbHB0LnkpLCBJbnRQb2ludChw
dC54LCBwdC55KSwga2V5U3RhdGVUb0RyYWdPcGVyYXRpb24oZ3JmS2V5U3RhdGUpKTsKKyAgICAg
ICAgbV9wYWdlLT5wZXJmb3JtRHJhZ0NvbnRyb2xsZXJBY3Rpb24oRHJhZ0NvbnRyb2xsZXJBY3Rp
b25VcGRhdGVkLCAmZGF0YSk7CisgICAgICAgICpwZHdFZmZlY3QgPSBkcmFnT3BlcmF0aW9uVG9E
cmFnQ3Vyc29yKG1fcGFnZS0+ZHJhZ09wZXJhdGlvbigpKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
KnBkd0VmZmVjdCA9IERST1BFRkZFQ1RfTk9ORTsKKworICAgIG1fbGFzdERyb3BFZmZlY3QgPSAq
cGR3RWZmZWN0OworICAgIHJldHVybiBTX09LOworfQorCitIUkVTVUxUIFNURE1FVEhPRENBTExU
WVBFIFdlYlZpZXc6OkRyYWdMZWF2ZSgpCit7CisgICAgaWYgKG1fZHJvcFRhcmdldEhlbHBlcikK
KyAgICAgICAgbV9kcm9wVGFyZ2V0SGVscGVyLT5EcmFnTGVhdmUoKTsKKworICAgIGlmIChtX2Ry
YWdEYXRhKSB7CisgICAgICAgIERyYWdEYXRhIGRhdGEobV9kcmFnRGF0YS5nZXQoKSwgSW50UG9p
bnQoKSwgSW50UG9pbnQoKSwgRHJhZ09wZXJhdGlvbk5vbmUpOworICAgICAgICBtX3BhZ2UtPnBl
cmZvcm1EcmFnQ29udHJvbGxlckFjdGlvbihEcmFnQ29udHJvbGxlckFjdGlvbkV4aXRlZCwgJmRh
dGEpOworICAgICAgICBtX2RyYWdEYXRhID0gMDsKKyAgICAgICAgbV9wYWdlLT5yZXNldERyYWdP
cGVyYXRpb24oKTsKKyAgICB9CisgICAgcmV0dXJuIFNfT0s7Cit9CisKK0hSRVNVTFQgU1RETUVU
SE9EQ0FMTFRZUEUgV2ViVmlldzo6RHJvcChJRGF0YU9iamVjdCogcERhdGFPYmplY3QsIERXT1JE
IGdyZktleVN0YXRlLCBQT0lOVEwgcHQsIERXT1JEKiBwZHdFZmZlY3QpCit7CisgICAgaWYgKG1f
ZHJvcFRhcmdldEhlbHBlcikKKyAgICAgICAgbV9kcm9wVGFyZ2V0SGVscGVyLT5Ecm9wKHBEYXRh
T2JqZWN0LCAoUE9JTlQqKSZwdCwgKnBkd0VmZmVjdCk7CisKKyAgICBtX2RyYWdEYXRhID0gMDsK
KyAgICAqcGR3RWZmZWN0ID0gbV9sYXN0RHJvcEVmZmVjdDsKKyAgICBQT0lOVEwgbG9jYWxwdCA9
IHB0OworICAgIDo6U2NyZWVuVG9DbGllbnQobV93aW5kb3csIChMUFBPSU5UKSZsb2NhbHB0KTsK
KyAgICBEcmFnRGF0YSBkYXRhKHBEYXRhT2JqZWN0LCBJbnRQb2ludChsb2NhbHB0LngsIGxvY2Fs
cHQueSksIEludFBvaW50KHB0LngsIHB0LnkpLCBrZXlTdGF0ZVRvRHJhZ09wZXJhdGlvbihncmZL
ZXlTdGF0ZSkpOworICAgIG1fcGFnZS0+cGVyZm9ybURyYWdDb250cm9sbGVyQWN0aW9uKERyYWdD
b250cm9sbGVyQWN0aW9uUGVyZm9ybURyYWcsICZkYXRhKTsKKyAgICByZXR1cm4gU19PSzsKK30K
KwogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
d2luL1dlYlZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mvd2lu
L1dlYlZpZXcuaAkocmV2aXNpb24gNzY2OTEpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
d2luL1dlYlZpZXcuaAkod29ya2luZyBjb3B5KQpAQCAtMjksMjAgKzI5LDI4IEBACiAjaW5jbHVk
ZSAiQVBJT2JqZWN0LmgiCiAjaW5jbHVkZSAiUGFnZUNsaWVudC5oIgogI2luY2x1ZGUgIldlYlBh
Z2VQcm94eS5oIgorI2luY2x1ZGUgPFdlYkNvcmUvQ09NUHRyLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9EcmFnQWN0aW9ucy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRl
IDxXZWJDb3JlL1dpbmRvd01lc3NhZ2VMaXN0ZW5lci5oPgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJk
Lmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CisjaW5jbHVkZSA8U2hsT2JqLmg+CisKK2ludGVyZmFjZSBJRHJvcFRhcmdldEhlbHBlcjsKIAog
bmFtZXNwYWNlIFdlYktpdCB7CiAKIGNsYXNzIERyYXdpbmdBcmVhUHJveHk7CiAKLWNsYXNzIFdl
YlZpZXcgOiBwdWJsaWMgQVBJT2JqZWN0LCBwdWJsaWMgUGFnZUNsaWVudCwgV2ViQ29yZTo6V2lu
ZG93TWVzc2FnZUxpc3RlbmVyIHsKK2NsYXNzIFdlYlZpZXcgOiBwdWJsaWMgQVBJT2JqZWN0LCBw
dWJsaWMgUGFnZUNsaWVudCwgV2ViQ29yZTo6V2luZG93TWVzc2FnZUxpc3RlbmVyLCBwdWJsaWMg
SURyb3BUYXJnZXQgewogcHVibGljOgogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFdlYlZpZXc+IGNy
ZWF0ZShSRUNUIHJlY3QsIFdlYkNvbnRleHQqIGNvbnRleHQsIFdlYlBhZ2VHcm91cCogcGFnZUdy
b3VwLCBIV05EIHBhcmVudFdpbmRvdykKICAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgV2ViVmlldyhyZWN0LCBjb250ZXh0LCBwYWdlR3JvdXAsIHBhcmVudFdpbmRvdykpOworICAg
ICAgICBSZWZQdHI8V2ViVmlldz4gd2ViVmlldyA9IGFkb3B0UmVmKG5ldyBXZWJWaWV3KHJlY3Qs
IGNvbnRleHQsIHBhZ2VHcm91cCwgcGFyZW50V2luZG93KSk7CisgICAgICAgIHdlYlZpZXctPmlu
aXRpYWxpemUoKTsKKyAgICAgICAgcmV0dXJuIHdlYlZpZXc7CiAgICAgfQogICAgIH5XZWJWaWV3
KCk7CiAKQEAgLTUyLDYgKzYwLDE4IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldElzSW5XaW5kb3co
Ym9vbCk7CiAgICAgdm9pZCBzZXRPdmVycmlkZUN1cnNvcihIQ1VSU09SIG92ZXJyaWRlQ3Vyc29y
KTsKICAgICB2b2lkIHNldEluaXRpYWxGb2N1cyhib29sIGZvcndhcmQpOworICAgIHZvaWQgaW5p
dGlhbGl6ZSgpOworCisgICAgLy8gSVVua25vd24KKyAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVU
SE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZPYmplY3Qp
OworICAgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKHZvaWQpOworICAg
IHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZSh2b2lkKTsKKworICAgIC8v
IElEcm9wVGFyZ2V0CisgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIERyYWdF
bnRlcihJRGF0YU9iamVjdCogcERhdGFPYmplY3QsIERXT1JEIGdyZktleVN0YXRlLCBQT0lOVEwg
cHQsIERXT1JEKiBwZHdFZmZlY3QpOworICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxM
VFlQRSBEcmFnT3ZlcihEV09SRCBncmZLZXlTdGF0ZSwgUE9JTlRMIHB0LCBEV09SRCogcGR3RWZm
ZWN0KTsKKyAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgRHJhZ0xlYXZlKCk7
CisgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIERyb3AoSURhdGFPYmplY3Qq
IHBEYXRhT2JqZWN0LCBEV09SRCBncmZLZXlTdGF0ZSwgUE9JTlRMIHB0LCBEV09SRCogcGR3RWZm
ZWN0KTsKIAogICAgIFdlYlBhZ2VQcm94eSogcGFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFnZS5n
ZXQoKTsgfQogCkBAIC0xNDIsNiArMTYyLDcgQEAgcHJpdmF0ZToKICAgICB2b2lkIGRpZEZpbmlz
aExvYWRpbmdEYXRhRm9yQ3VzdG9tUmVwcmVzZW50YXRpb24oY29uc3QgQ29yZUlQQzo6RGF0YVJl
ZmVyZW5jZSYpOwogICAgIHZpcnR1YWwgZG91YmxlIGN1c3RvbVJlcHJlc2VudGF0aW9uWm9vbUZh
Y3RvcigpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRDdXN0b21SZXByZXNlbnRhdGlvblpvb21GYWN0
b3IoZG91YmxlKTsKKyAgICBXZWJDb3JlOjpEcmFnT3BlcmF0aW9uIGtleVN0YXRlVG9EcmFnT3Bl
cmF0aW9uKERXT1JEIGdyZktleVN0YXRlKSBjb25zdDsKIAogICAgIHZpcnR1YWwgSFdORCBuYXRp
dmVXaW5kb3coKTsKIApAQCAtMTY1LDYgKzE4NiwxMyBAQCBwcml2YXRlOgogICAgIFJlZlB0cjxX
ZWJQYWdlUHJveHk+IG1fcGFnZTsKIAogICAgIHVuc2lnbmVkIG1faW5JTUVDb21wb3NpdGlvbjsK
KyAgICBDT01QdHI8SURhdGFPYmplY3Q+IG1fZHJhZ0RhdGE7CisgICAgQ09NUHRyPElEcm9wVGFy
Z2V0SGVscGVyPiBtX2Ryb3BUYXJnZXRIZWxwZXI7CisgICAgLy8gRklYTUU6IFRoaXMgdmFyaWFi
bGUgaXMgcGFydCBvZiBhIHdvcmthcm91bmQuIFRoZSBkcm9wIGVmZmVjdCAocGR3RWZmZWN0KSBw
YXNzZWQgdG8gRHJvcCBpcyBpbmNvcnJlY3QuIAorICAgIC8vIFdlIHNldCB0aGlzIHZhcmlhYmxl
IGluIERyYWdFbnRlciBhbmQgRHJhZ092ZXIgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBEcm9w
IHRvIHNldCB0aGUgY29ycmVjdCBkcm9wIGVmZmVjdC4gCisgICAgLy8gVGh1cywgb24gcmV0dXJu
IGZyb20gRG9EcmFnRHJvcCB3ZSBoYXZlIHRoZSBjb3JyZWN0IHBkd0VmZmVjdCBmb3IgdGhlIGRy
YWctYW5kLWRyb3Agb3BlcmF0aW9uLgorICAgIC8vIChzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTI5MjY0KQorICAgIERXT1JEIG1fbGFzdERyb3BFZmZlY3Q7CiB9
OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nl
c3MvV2ViUGFnZS9XZWJQYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQ
cm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHAJKHJldmlzaW9uIDc2NjkxKQorKysgU291cmNlL1dl
YktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MzExLDYgKzEzMTEsMzcgQEAgYm9vbCBXZWJQYWdlOjpoYW5kbGVFZGl0aW5nS2V5Ym9hcmRFdmVu
dAogfQogI2VuZGlmCiAKKyNpZiBQTEFURk9STShXSU4pCit2b2lkIFdlYlBhZ2U6OnBlcmZvcm1E
cmFnQ29udHJvbGxlckFjdGlvbih1aW50NjRfdCBhY3Rpb24sIFdlYkNvcmU6OkludFBvaW50IGNs
aWVudFBvc2l0aW9uLCBXZWJDb3JlOjpJbnRQb2ludCBnbG9iYWxQb3NpdGlvbiwgdWludDY0X3Qg
ZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrLCBjb25zdCBXZWJDb3JlOjpEcmFnRGF0YU1hcCYg
ZGF0YU1hcCwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgaWYgKCFtX3BhZ2UpIHsKKyAgICAgICAg
c2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpEaWRQZXJmb3JtRHJhZ0NvbnRyb2xsZXJBY3Rp
b24oRHJhZ09wZXJhdGlvbk5vbmUpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERy
YWdEYXRhIGRyYWdEYXRhKGRhdGFNYXAsIGNsaWVudFBvc2l0aW9uLCBnbG9iYWxQb3NpdGlvbiwg
c3RhdGljX2Nhc3Q8RHJhZ09wZXJhdGlvbj4oZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrKSwg
c3RhdGljX2Nhc3Q8RHJhZ0FwcGxpY2F0aW9uRmxhZ3M+KGZsYWdzKSk7CisgICAgc3dpdGNoIChh
Y3Rpb24pIHsKKyAgICBjYXNlIERyYWdDb250cm9sbGVyQWN0aW9uRW50ZXJlZDoKKyAgICAgICAg
c2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpEaWRQZXJmb3JtRHJhZ0NvbnRyb2xsZXJBY3Rp
b24obV9wYWdlLT5kcmFnQ29udHJvbGxlcigpLT5kcmFnRW50ZXJlZCgmZHJhZ0RhdGEpKSk7Cisg
ICAgICAgIGJyZWFrOworCisgICAgY2FzZSBEcmFnQ29udHJvbGxlckFjdGlvblVwZGF0ZWQ6Cisg
ICAgICAgIHNlbmQoTWVzc2FnZXM6OldlYlBhZ2VQcm94eTo6RGlkUGVyZm9ybURyYWdDb250cm9s
bGVyQWN0aW9uKG1fcGFnZS0+ZHJhZ0NvbnRyb2xsZXIoKS0+ZHJhZ1VwZGF0ZWQoJmRyYWdEYXRh
KSkpOworICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgY2FzZSBEcmFnQ29udHJvbGxlckFj
dGlvbkV4aXRlZDoKKyAgICAgICAgbV9wYWdlLT5kcmFnQ29udHJvbGxlcigpLT5kcmFnRXhpdGVk
KCZkcmFnRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBjYXNlIERyYWdDb250
cm9sbGVyQWN0aW9uUGVyZm9ybURyYWc6CisgICAgICAgIG1fcGFnZS0+ZHJhZ0NvbnRyb2xsZXIo
KS0+cGVyZm9ybURyYWcoJmRyYWdEYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAg
IGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKyNlbHNl
CiB2b2lkIFdlYlBhZ2U6OnBlcmZvcm1EcmFnQ29udHJvbGxlckFjdGlvbih1aW50NjRfdCBhY3Rp
b24sIFdlYkNvcmU6OkludFBvaW50IGNsaWVudFBvc2l0aW9uLCBXZWJDb3JlOjpJbnRQb2ludCBn
bG9iYWxQb3NpdGlvbiwgdWludDY0X3QgZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrLCBjb25z
dCBTdHJpbmcmIGRyYWdTdG9yYWdlTmFtZSwgdWludDMyX3QgZmxhZ3MpCiB7CiAgICAgaWYgKCFt
X3BhZ2UpIHsKQEAgLTEzNDAsNiArMTM3MSw3IEBAIHZvaWQgV2ViUGFnZTo6cGVyZm9ybURyYWdD
b250cm9sbGVyQWN0aW8KICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgfQogfQor
I2VuZGlmCiAKIHZvaWQgV2ViUGFnZTo6ZHJhZ0VuZGVkKFdlYkNvcmU6OkludFBvaW50IGNsaWVu
dFBvc2l0aW9uLCBXZWJDb3JlOjpJbnRQb2ludCBnbG9iYWxQb3NpdGlvbiwgdWludDY0X3Qgb3Bl
cmF0aW9uKQogewpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBh
Z2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2Vi
UGFnZS5oCShyZXZpc2lvbiA3NjY5MSkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2Vi
UGFnZS9XZWJQYWdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRl
ICJQbHVnaW4uaCIKICNpbmNsdWRlICJTYW5kYm94RXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiV2Vi
RWRpdENvbW1hbmQuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0RyYWdEYXRhLmg+CiAjaW5jbHVkZSA8
V2ViQ29yZS9FZGl0b3IuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lTG9hZGVyVHlwZXMuaD4K
ICNpbmNsdWRlIDxXZWJDb3JlL0ludFJlY3QuaD4KQEAgLTMwMCw3ICszMDEsMTEgQEAgcHVibGlj
OgogI2VuZGlmCiAKICAgICB2b2lkIHJlcGxhY2VTZWxlY3Rpb25XaXRoVGV4dChXZWJDb3JlOjpG
cmFtZSosIGNvbnN0IFN0cmluZyYpOworI2lmIFBMQVRGT1JNKFdJTikKKyAgICB2b2lkIHBlcmZv
cm1EcmFnQ29udHJvbGxlckFjdGlvbih1aW50NjRfdCBhY3Rpb24sIFdlYkNvcmU6OkludFBvaW50
IGNsaWVudFBvc2l0aW9uLCBXZWJDb3JlOjpJbnRQb2ludCBnbG9iYWxQb3NpdGlvbiwgdWludDY0
X3QgZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrLCBjb25zdCBXZWJDb3JlOjpEcmFnRGF0YU1h
cCYsIHVpbnQzMl90IGZsYWdzKTsKKyNlbHNlCiAgICAgdm9pZCBwZXJmb3JtRHJhZ0NvbnRyb2xs
ZXJBY3Rpb24odWludDY0X3QgYWN0aW9uLCBXZWJDb3JlOjpJbnRQb2ludCBjbGllbnRQb3NpdGlv
biwgV2ViQ29yZTo6SW50UG9pbnQgZ2xvYmFsUG9zaXRpb24sIHVpbnQ2NF90IGRyYWdnaW5nU291
cmNlT3BlcmF0aW9uTWFzaywgY29uc3QgV1RGOjpTdHJpbmcmIGRyYWdTdG9yYWdlTmFtZSwgdWlu
dDMyX3QgZmxhZ3MpOworI2VuZGlmCiAgICAgdm9pZCBkcmFnRW5kZWQoV2ViQ29yZTo6SW50UG9p
bnQgY2xpZW50UG9zaXRpb24sIFdlYkNvcmU6OkludFBvaW50IGdsb2JhbFBvc2l0aW9uLCB1aW50
NjRfdCBvcGVyYXRpb24pOwogCiAgICAgdm9pZCBiZWdpblByaW50aW5nKHVpbnQ2NF90IGZyYW1l
SUQsIGNvbnN0IFByaW50SW5mbyYpOwpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9X
ZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIv
V2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4JKHJldmlzaW9uIDc2NjkxKQor
KysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UubWVzc2FnZXMuaW4J
KHdvcmtpbmcgY29weSkKQEAgLTEwMyw3ICsxMDMsMTIgQEAgbWVzc2FnZXMgLT4gV2ViUGFnZSB7
CiAgICAgQ291bnRTdHJpbmdNYXRjaGVzKFdURjo6U3RyaW5nIHN0cmluZywgdWludDMyX3QgZmlu
ZE9wdGlvbnMsIHVuc2lnbmVkIG1heE1hdGNoQ291bnQpCiAKICAgICAjIERyYWcgYW5kIGRyb3Au
CisjaWYgUExBVEZPUk0oV0lOKQorICAgIFBlcmZvcm1EcmFnQ29udHJvbGxlckFjdGlvbih1aW50
NjRfdCBhY3Rpb24sIFdlYkNvcmU6OkludFBvaW50IGNsaWVudFBvc2l0aW9uLCBXZWJDb3JlOjpJ
bnRQb2ludCBnbG9iYWxQb3NpdGlvbiwgdWludDY0X3QgZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25N
YXNrLCBIYXNoTWFwPFVJTlQsVmVjdG9yPFN0cmluZz4+IGRhdGFNYXAsIHVpbnQzMl90IGZsYWdz
KQorI2VuZGlmCisjaWYgIVBMQVRGT1JNKFdJTikKICAgICBQZXJmb3JtRHJhZ0NvbnRyb2xsZXJB
Y3Rpb24odWludDY0X3QgYWN0aW9uLCBXZWJDb3JlOjpJbnRQb2ludCBjbGllbnRQb3NpdGlvbiwg
V2ViQ29yZTo6SW50UG9pbnQgZ2xvYmFsUG9zaXRpb24sIHVpbnQ2NF90IGRyYWdnaW5nU291cmNl
T3BlcmF0aW9uTWFzaywgV1RGOjpTdHJpbmcgZHJhZ1N0b3JhZ2VOYW1lLCB1aW50MzJfdCBmbGFn
cykKKyNlbmRpZgogICAgIERyYWdFbmRlZChXZWJDb3JlOjpJbnRQb2ludCBjbGllbnRQb3NpdGlv
biwgV2ViQ29yZTo6SW50UG9pbnQgZ2xvYmFsUG9zaXRpb24sIHVpbnQ2NF90IG9wZXJhdGlvbikK
IAogICAgICMgUG9wdXAgbWVudS4K
</data>
<flag name="review"
          id="71728"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81082</attachid>
            <date>2011-02-03 10:47:06 -0800</date>
            <delta_ts>2011-02-07 12:21:08 -0800</delta_ts>
            <desc>FinalPatch</desc>
            <filename>dragsourcewin.txt</filename>
            <type>text/plain</type>
            <size>40348</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc3NTEzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjkgQEAKKzIwMTEtMDItMDMgIEVucmljYSBD
YXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWJLaXQyOiBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgb24gV2lu
ZG93cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUy
Nzc1CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS84NTE0NDA5PgorCisgICAgICAgICogcGxhdGZv
cm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5jcHA6IEFkZGVkIGEgc2VyaWVzIG9mIGZ1bmN0
aW9ucworICAgICAgICB0byBkZS1zZXJpYWxpemUgdGhlIGRyYWcgZGF0YSBmcm9tIHRoZSBtYXAg
aW50byBhbiBJRGF0YU9iamVjdC4KKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZUdsb2JhbERhdGEp
OgorICAgICAgICAoV2ViQ29yZTo6Z2V0RnVsbENGSFRNTCk6CisgICAgICAgIChXZWJDb3JlOjpD
bGlwYm9hcmREYXRhSXRlbTo6Q2xpcGJvYXJkRGF0YUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6
Z2V0U3RyaW5nRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpzZXRVQ2hhckRhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6c2V0Q2hhckRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6c2V0Q2ZEYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OmdldENsaXBib2FyZE1hcCk6CisgICAgICAgIChXZWJDb3JlOjpn
ZXRDbGlwYm9hcmREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OnNldENsaXBib2FyZERhdGEpOgor
ICAgICAgICAqIHBsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uaDoKKyAgICAgICAg
KiBwbGF0Zm9ybS93aW4vV0NEYXRhT2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldDRGF0
YU9iamVjdDo6Y3JlYXRlSW5zdGFuY2UpOiBBZGRlZCBuZXcgd2F5IHRvCisgICAgICAgIGNvbnN0
cnVjdCBhIFdDRGF0YU9iamVjdCBmcm9tIGEgRHJhZ0RhdGFNYXAuCisgICAgICAgICogcGxhdGZv
cm0vd2luL1dDRGF0YU9iamVjdC5oOgorCiAyMDExLTAyLTAzICBQYXZlbCBQb2Rpdmlsb3YgIDxw
b2Rpdmlsb3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFBhdmVsIEZlbGRt
YW4uCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVz
V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJv
YXJkVXRpbGl0aWVzV2luLmNwcAkocmV2aXNpb24gNzcyNTUpCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTc0LDcgKzE3NCw3IEBAIEhHTE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBLVVJMJiB1cmwK
ICAgICBTdHJpbmcgbXV0YWJsZVVSTCh1cmwuc3RyaW5nKCkpOwogICAgIFN0cmluZyBtdXRhYmxl
VGl0bGUodGl0bGUpOwogICAgIFNJWkVfVCBzaXplID0gbXV0YWJsZVVSTC5sZW5ndGgoKSArIG11
dGFibGVUaXRsZS5sZW5ndGgoKSArIDI7IC8vICsxIGZvciAiXG4iIGFuZCArMSBmb3IgbnVsbCB0
ZXJtaW5hdG9yCi0gICAgSEdMT0JBTCBjYkRhdGEgPSA6Okdsb2JhbEFsbG9jKEdQVFIsIHNpemUg
KiBzaXplb2YoVUNoYXIpKTsKKyAgICBIR0xPQkFMIGNiRGF0YSA9IEdsb2JhbEFsbG9jKEdQVFIs
IHNpemUgKiBzaXplb2YoVUNoYXIpKTsKIAogICAgIGlmIChjYkRhdGEpIHsKICAgICAgICAgUFdT
VFIgYnVmZmVyID0gc3RhdGljX2Nhc3Q8UFdTVFI+KEdsb2JhbExvY2soY2JEYXRhKSk7CkBAIC0x
ODYsNyArMTg2LDcgQEAgSEdMT0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IEtVUkwmIHVybAog
CiBIR0xPQkFMIGNyZWF0ZUdsb2JhbERhdGEoY29uc3QgU3RyaW5nJiBzdHIpCiB7Ci0gICAgSEdM
T0JBTCBnbG9iYWxEYXRhID0gOjpHbG9iYWxBbGxvYyhHUFRSLCAoc3RyLmxlbmd0aCgpICsgMSkg
KiBzaXplb2YoVUNoYXIpKTsKKyAgICBIR0xPQkFMIGdsb2JhbERhdGEgPSBHbG9iYWxBbGxvYyhH
UFRSLCAoc3RyLmxlbmd0aCgpICsgMSkgKiBzaXplb2YoVUNoYXIpKTsKICAgICBpZiAoIWdsb2Jh
bERhdGEpCiAgICAgICAgIHJldHVybiAwOwogICAgIFVDaGFyKiBidWZmZXIgPSBzdGF0aWNfY2Fz
dDxVQ2hhcio+KEdsb2JhbExvY2soZ2xvYmFsRGF0YSkpOwpAQCAtMTk4LDcgKzE5OCw3IEBAIEhH
TE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBTdHJpbmcmIHMKIAogSEdMT0JBTCBjcmVhdGVH
bG9iYWxEYXRhKGNvbnN0IFZlY3RvcjxjaGFyPiYgdmVjdG9yKQogewotICAgIEhHTE9CQUwgZ2xv
YmFsRGF0YSA9IDo6R2xvYmFsQWxsb2MoR1BUUiwgdmVjdG9yLnNpemUoKSArIDEpOworICAgIEhH
TE9CQUwgZ2xvYmFsRGF0YSA9IEdsb2JhbEFsbG9jKEdQVFIsIHZlY3Rvci5zaXplKCkgKyAxKTsK
ICAgICBpZiAoIWdsb2JhbERhdGEpCiAgICAgICAgIHJldHVybiAwOwogICAgIGNoYXIqIGJ1ZmZl
ciA9IHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKGdsb2JhbERhdGEpKTsKQEAgLTIxNCw3
ICsyMTQsNyBAQCBzdGF0aWMgU3RyaW5nIGdldEZ1bGxDRkhUTUwoSURhdGFPYmplY3QqCiAgICAg
aWYgKFNVQ0NFRURFRChkYXRhLT5HZXREYXRhKGh0bWxGb3JtYXQoKSwgJnN0b3JlKSkpIHsKICAg
ICAgICAgLy8gTVMgSFRNTCBGb3JtYXQgcGFyc2luZwogICAgICAgICBjaGFyKiBkYXRhID0gc3Rh
dGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOwotICAgICAgICBTSVpF
X1QgZGF0YVNpemUgPSA6Okdsb2JhbFNpemUoc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFNJWkVf
VCBkYXRhU2l6ZSA9IEdsb2JhbFNpemUoc3RvcmUuaEdsb2JhbCk7CiAgICAgICAgIFN0cmluZyBj
Zmh0bWwoVVRGOEVuY29kaW5nKCkuZGVjb2RlKGRhdGEsIGRhdGFTaXplKSk7CiAgICAgICAgIEds
b2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKICAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3Rv
cmUpOwpAQCAtNjE5LDE0ICs2MTksMjcgQEAgYm9vbCBjb250YWluc0hUTUwoY29uc3QgRHJhZ0Rh
dGFNYXAqIGRhdAogfQogCiB0eXBlZGVmIHZvaWQgKCpHZXRTdHJpbmdGdW5jdGlvbikoSURhdGFP
YmplY3QqLCBGT1JNQVRFVEMqLCBWZWN0b3I8U3RyaW5nPiYpOwotdHlwZWRlZiBIYXNoTWFwPFVJ
TlQsIEdldFN0cmluZ0Z1bmN0aW9uPiBDbGlwYm9hcmRGb3JtYXRNYXA7Cit0eXBlZGVmIHZvaWQg
KCpTZXRTdHJpbmdGdW5jdGlvbikoSURhdGFPYmplY3QqLCBGT1JNQVRFVEMqLCBjb25zdCBWZWN0
b3I8U3RyaW5nPiYpOworCitjbGFzcyBDbGlwYm9hcmREYXRhSXRlbSB7CitwdWJsaWM6CisgICAg
Rk9STUFURVRDKiBmb3JtYXQ7CisgICAgR2V0U3RyaW5nRnVuY3Rpb24gZ2V0U3RyaW5nOworICAg
IFNldFN0cmluZ0Z1bmN0aW9uIHNldFN0cmluZzsKKworICAgIENsaXBib2FyZERhdGFJdGVtKEZP
Uk1BVEVUQyogZm10LCBHZXRTdHJpbmdGdW5jdGlvbiBmMSwgU2V0U3RyaW5nRnVuY3Rpb24gZjIp
OiBmb3JtYXQoZm10KSwgZ2V0U3RyaW5nKGYxKSwgc2V0U3RyaW5nKGYyKSB7fTsKK307CisKK3R5
cGVkZWYgSGFzaE1hcDxVSU5ULCBDbGlwYm9hcmREYXRhSXRlbSo+IENsaXBib2FyZEZvcm1hdE1h
cDsKKworLy8gR2V0dGVyIGZ1bmN0aW9ucy4KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBn
ZXRTdHJpbmdEYXRhKElEYXRhT2JqZWN0KiBkYXRhLCBGT1JNQVRFVEMqIGZvcm1hdCwgVmVjdG9y
PFN0cmluZz4mIGRhdGFTdHJpbmdzKQogewogICAgIFNUR01FRElVTSBzdG9yZTsKICAgICBpZiAo
RkFJTEVEKGRhdGEtPkdldERhdGEoZm9ybWF0LCAmc3RvcmUpKSkKICAgICAgICAgcmV0dXJuOwot
ICAgIGRhdGFTdHJpbmdzLmFwcGVuZChTdHJpbmcoc3RhdGljX2Nhc3Q8VCo+KEdsb2JhbExvY2so
c3RvcmUuaEdsb2JhbCkpLCA6Okdsb2JhbFNpemUoc3RvcmUuaEdsb2JhbCkgLyBzaXplb2YoVCkp
KTsKKyAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3RyaW5nKHN0YXRpY19jYXN0PFQqPihHbG9iYWxM
b2NrKHN0b3JlLmhHbG9iYWwpKSwgR2xvYmFsU2l6ZShzdG9yZS5oR2xvYmFsKSAvIHNpemVvZihU
KSkpOwogICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKICAgICBSZWxlYXNlU3RnTWVk
aXVtKCZzdG9yZSk7CiB9CkBAIC02NjUsMjYgKzY3OCw3OCBAQCB2b2lkIGdldENmRGF0YShJRGF0
YU9iamVjdCogZGF0YSwgRk9STUFUCiB9CiAjZW5kaWYKIAotdm9pZCBnZXRDbGlwYm9hcmREYXRh
KElEYXRhT2JqZWN0ICpkYXRhT2JqZWN0LCBGT1JNQVRFVEMqIGZvcm1hdCwgVmVjdG9yPFN0cmlu
Zz4mIGRhdGFTdHJpbmdzKQorLy8gU2V0dGVyIGZ1bmN0aW9ucy4KKwordm9pZCBzZXRVQ2hhckRh
dGEoSURhdGFPYmplY3QqIGRhdGEsIEZPUk1BVEVUQyogZm9ybWF0LCBjb25zdCBWZWN0b3I8U3Ry
aW5nPiYgZGF0YVN0cmluZ3MpCit7CisgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBt
ZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOworCisgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVh
dGVHbG9iYWxEYXRhKGRhdGFTdHJpbmdzWzBdKTsKKyAgICBpZiAobWVkaXVtLmhHbG9iYWwpCisg
ICAgICAgIGRhdGEtPlNldERhdGEoZm9ybWF0LCAmbWVkaXVtLCBGQUxTRSk7CisgICAgR2xvYmFs
RnJlZShtZWRpdW0uaEdsb2JhbCk7Cit9CisKK3ZvaWQgc2V0Q2hhckRhdGEoSURhdGFPYmplY3Qq
IGRhdGEsIEZPUk1BVEVUQyogZm9ybWF0LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmlu
Z3MpCit7CisgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBtZWRpdW0udHltZWQgPSBU
WU1FRF9IR0xPQkFMOworCisgICAgQ1N0cmluZyBhc2NpaVN0cmluZyA9IGRhdGFTdHJpbmdzWzBd
LnV0ZjgoKTsKKyAgICBzaXplX3Qgc3RyaW5nTGVuZ3RoID0gYXNjaWlTdHJpbmcubGVuZ3RoKCk7
CisgICAgbWVkaXVtLmhHbG9iYWwgPSBHbG9iYWxBbGxvYyhHUFRSLCBzdHJpbmdMZW5ndGggKyAx
KTsKKyAgICBpZiAoIW1lZGl1bS5oR2xvYmFsKQorICAgICAgICByZXR1cm47CisgICAgY2hhciog
YnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2sobWVkaXVtLmhHbG9iYWwpKTsK
KyAgICBtZW1jcHkoYnVmZmVyLCBhc2NpaVN0cmluZy5kYXRhKCksIHN0cmluZ0xlbmd0aCk7Cisg
ICAgYnVmZmVyW3N0cmluZ0xlbmd0aF0gPSAwOworICAgIEdsb2JhbFVubG9jayhtZWRpdW0uaEds
b2JhbCk7CisgICAgZGF0YS0+U2V0RGF0YShmb3JtYXQsICZtZWRpdW0sIEZBTFNFKTsKKyAgICBH
bG9iYWxGcmVlKG1lZGl1bS5oR2xvYmFsKTsKK30KKworI2lmIFBMQVRGT1JNKENGKQordm9pZCBz
ZXRDZkRhdGEoSURhdGFPYmplY3QqIGRhdGEsIEZPUk1BVEVUQyogZm9ybWF0LCBjb25zdCBWZWN0
b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IENs
aXBib2FyZEZvcm1hdE1hcCYgZ2V0Q2xpcGJvYXJkTWFwKCkKIHsKICAgICBzdGF0aWMgQ2xpcGJv
YXJkRm9ybWF0TWFwIGZvcm1hdE1hcDsKICAgICBpZiAoZm9ybWF0TWFwLmlzRW1wdHkoKSkgewot
ICAgICAgICBmb3JtYXRNYXAuYWRkKGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQsIGdldFV0ZjhEYXRh
KTsKLSAgICAgICAgZm9ybWF0TWFwLmFkZCh0ZXh0aHRtbEZvcm1hdCgpLT5jZkZvcm1hdCwgZ2V0
U3RyaW5nRGF0YTxVQ2hhcj4pOwotICAgICAgICBmb3JtYXRNYXAuYWRkKHBsYWluVGV4dEZvcm1h
dCgpLT5jZkZvcm1hdCwgZ2V0U3RyaW5nRGF0YTxjaGFyPik7Ci0gICAgICAgIGZvcm1hdE1hcC5h
ZGQocGxhaW5UZXh0V0Zvcm1hdCgpLT5jZkZvcm1hdCwgZ2V0U3RyaW5nRGF0YTxVQ2hhcj4pOwor
ICAgICAgICBmb3JtYXRNYXAuYWRkKGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQsIG5ldyBDbGlwYm9h
cmREYXRhSXRlbShodG1sRm9ybWF0KCksIGdldFV0ZjhEYXRhLCBzZXRDaGFyRGF0YSkpOworICAg
ICAgICBmb3JtYXRNYXAuYWRkKHRleHRodG1sRm9ybWF0KCktPmNmRm9ybWF0LCBuZXcgQ2xpcGJv
YXJkRGF0YUl0ZW0odGV4dGh0bWxGb3JtYXQoKSwgZ2V0U3RyaW5nRGF0YTxVQ2hhcj4sIHNldFVD
aGFyRGF0YSkpOworICAgICAgICBmb3JtYXRNYXAuYWRkKHBsYWluVGV4dEZvcm1hdCgpLT5jZkZv
cm1hdCwgIG5ldyBDbGlwYm9hcmREYXRhSXRlbShwbGFpblRleHRGb3JtYXQoKSwgZ2V0U3RyaW5n
RGF0YTxjaGFyPiwgc2V0Q2hhckRhdGEpKTsKKyAgICAgICAgZm9ybWF0TWFwLmFkZChwbGFpblRl
eHRXRm9ybWF0KCktPmNmRm9ybWF0LCAgbmV3IENsaXBib2FyZERhdGFJdGVtKHBsYWluVGV4dFdG
b3JtYXQoKSwgZ2V0U3RyaW5nRGF0YTxVQ2hhcj4sIHNldFVDaGFyRGF0YSkpOwogI2lmIFBMQVRG
T1JNKENGKQotICAgICAgICBmb3JtYXRNYXAuYWRkKGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQs
IGdldENmRGF0YSk7CisgICAgICAgIGZvcm1hdE1hcC5hZGQoY2ZIRHJvcEZvcm1hdCgpLT5jZkZv
cm1hdCwgIG5ldyBDbGlwYm9hcmREYXRhSXRlbShjZkhEcm9wRm9ybWF0KCksIGdldENmRGF0YSwg
c2V0Q2ZEYXRhKSk7CiAjZW5kaWYKLSAgICAgICAgZm9ybWF0TWFwLmFkZChmaWxlbmFtZUZvcm1h
dCgpLT5jZkZvcm1hdCwgZ2V0U3RyaW5nRGF0YTxjaGFyPik7Ci0gICAgICAgIGZvcm1hdE1hcC5h
ZGQoZmlsZW5hbWVXRm9ybWF0KCktPmNmRm9ybWF0LCBnZXRTdHJpbmdEYXRhPFVDaGFyPik7Ci0g
ICAgICAgIGZvcm1hdE1hcC5hZGQodXJsRm9ybWF0KCktPmNmRm9ybWF0LCBnZXRTdHJpbmdEYXRh
PGNoYXI+KTsKLSAgICAgICAgZm9ybWF0TWFwLmFkZCh1cmxXRm9ybWF0KCktPmNmRm9ybWF0LCBn
ZXRTdHJpbmdEYXRhPFVDaGFyPik7CisgICAgICAgIGZvcm1hdE1hcC5hZGQoZmlsZW5hbWVGb3Jt
YXQoKS0+Y2ZGb3JtYXQsICBuZXcgQ2xpcGJvYXJkRGF0YUl0ZW0oZmlsZW5hbWVGb3JtYXQoKSwg
Z2V0U3RyaW5nRGF0YTxjaGFyPiwgc2V0Q2hhckRhdGEpKTsKKyAgICAgICAgZm9ybWF0TWFwLmFk
ZChmaWxlbmFtZVdGb3JtYXQoKS0+Y2ZGb3JtYXQsICBuZXcgQ2xpcGJvYXJkRGF0YUl0ZW0oZmls
ZW5hbWVXRm9ybWF0KCksIGdldFN0cmluZ0RhdGE8VUNoYXI+LCBzZXRVQ2hhckRhdGEpKTsKKyAg
ICAgICAgZm9ybWF0TWFwLmFkZCh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQsICBuZXcgQ2xpcGJvYXJk
RGF0YUl0ZW0odXJsRm9ybWF0KCksIGdldFN0cmluZ0RhdGE8Y2hhcj4sIHNldENoYXJEYXRhKSk7
CisgICAgICAgIGZvcm1hdE1hcC5hZGQodXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCwgIG5ldyBDbGlw
Ym9hcmREYXRhSXRlbSh1cmxXRm9ybWF0KCksIGdldFN0cmluZ0RhdGE8VUNoYXI+LCBzZXRVQ2hh
ckRhdGEpKTsKICAgICB9CisgICAgcmV0dXJuIGZvcm1hdE1hcDsKK30KKwordm9pZCBnZXRDbGlw
Ym9hcmREYXRhKElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBGT1JNQVRFVEMqIGZvcm1hdCwgVmVj
dG9yPFN0cmluZz4mIGRhdGFTdHJpbmdzKQoreworICAgIENsaXBib2FyZEZvcm1hdE1hcCBmb3Jt
YXRNYXAgPSBnZXRDbGlwYm9hcmRNYXAoKTsKICAgICBDbGlwYm9hcmRGb3JtYXRNYXA6Oml0ZXJh
dG9yIGZvdW5kID0gZm9ybWF0TWFwLmZpbmQoZm9ybWF0LT5jZkZvcm1hdCk7CiAgICAgaWYgKGZv
dW5kID09IGZvcm1hdE1hcC5lbmQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIGZvdW5kLT5zZWNv
bmQoZGF0YU9iamVjdCwgZm9ybWF0LCBkYXRhU3RyaW5ncyk7CisgICAgZm91bmQtPnNlY29uZC0+
Z2V0U3RyaW5nKGRhdGFPYmplY3QsIGZvdW5kLT5zZWNvbmQtPmZvcm1hdCwgZGF0YVN0cmluZ3Mp
OworfQorCit2b2lkIHNldENsaXBib2FyZERhdGEoSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIFVJ
TlQgZm9ybWF0LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7CisgICAgQ2xp
cGJvYXJkRm9ybWF0TWFwIGZvcm1hdE1hcCA9IGdldENsaXBib2FyZE1hcCgpOworICAgIENsaXBi
b2FyZEZvcm1hdE1hcDo6aXRlcmF0b3IgZm91bmQgPSBmb3JtYXRNYXAuZmluZChmb3JtYXQpOwor
ICAgIGlmIChmb3VuZCA9PSBmb3JtYXRNYXAuZW5kKCkpCisgICAgICAgIHJldHVybjsKKyAgICBm
b3VuZC0+c2Vjb25kLT5zZXRTdHJpbmcoZGF0YU9iamVjdCwgZm91bmQtPnNlY29uZC0+Zm9ybWF0
LCBkYXRhU3RyaW5ncyk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmgJ
KHJldmlzaW9uIDc3MjU1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2Fy
ZFV0aWxpdGllc1dpbi5oCSh3b3JraW5nIGNvcHkpCkBAIC03NSw2ICs3NSw3IEBAIFN0cmluZyBn
ZXRDRkhUTUwoSURhdGFPYmplY3QqLCBib29sJiBzdWMKIFN0cmluZyBnZXRDRkhUTUwoY29uc3Qg
RHJhZ0RhdGFNYXAqKTsKIAogdm9pZCBnZXRDbGlwYm9hcmREYXRhKElEYXRhT2JqZWN0KiwgRk9S
TUFURVRDKiBmZXRjLCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpOwordm9pZCBzZXRDbGlw
Ym9hcmREYXRhKElEYXRhT2JqZWN0KiwgVUlOVCBmb3JtYXQsIGNvbnN0IFZlY3RvcjxTdHJpbmc+
JiBkYXRhU3RyaW5ncyk7CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5jcHAJKHJldmlzaW9uIDc3MjU1
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJXQ0RhdGFPYmplY3QuaCIKIAorI2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGllc1dpbi5oIgor
I2luY2x1ZGUgIkRyYWdEYXRhLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewpAQCAtMTYwLDYgKzE2MiwxOSBAQCBIUkVTVUxUIFdDRGF0YU9iamVj
dDo6Y3JlYXRlSW5zdGFuY2UoV0NECiAgICAgcmV0dXJuIFNfT0s7CiB9CiAKK0hSRVNVTFQgV0NE
YXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZShXQ0RhdGFPYmplY3QqKiByZXN1bHQsIGNvbnN0IERy
YWdEYXRhTWFwKiBkYXRhTWFwKQoreworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4g
RV9QT0lOVEVSOworICAgICpyZXN1bHQgPSBuZXcgV0NEYXRhT2JqZWN0KCk7CisgICAgaWYgKCEq
cmVzdWx0KQorICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKKworICAgIGZvciAoRHJhZ0Rh
dGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZGF0YU1hcC0+YmVnaW4oKTsgaXQgIT0gZGF0YU1h
cC0+ZW5kKCk7ICsraXQpCisgICAgICAgIHNldENsaXBib2FyZERhdGEoKnJlc3VsdCwgaXQtPmZp
cnN0LCBpdC0+c2Vjb25kKTsKKyAgICByZXR1cm4gU19PSzsKK30KKwogV0NEYXRhT2JqZWN0OjpX
Q0RhdGFPYmplY3QoKQogOiBtX3JlZigxKQogewpAQCAtMzgwLDUgKzM5NSw0IEBAIHZvaWQgV0NE
YXRhT2JqZWN0OjpjbGVhckRhdGEoQ0xJUEZPUk1BVAogICAgIH0KIH0KIAotCiB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vV0NEYXRhT2JqZWN0LmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5oCShyZXZpc2lvbiA3NzI1
NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9XQ0RhdGFPYmplY3QuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMjYsMTAgKzI2LDExIEBACiAjaWZuZGVmIFdDRGF0YU9iamVjdF9oCiAjZGVm
aW5lIFdDRGF0YU9iamVjdF9oCiAKLSNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgotI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlICJEcmFnRGF0YS5oIgogI2luY2x1ZGUgPFNobE9iai5o
PgogI2luY2x1ZGUgPG9iamlkbC5oPgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVk
ZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTU2LDYgKzU3LDcg
QEAgcHVibGljOgogICAgIHZvaWQgY2xlYXJEYXRhKENMSVBGT1JNQVQpOwogICAgIAogICAgIHN0
YXRpYyBIUkVTVUxUIGNyZWF0ZUluc3RhbmNlKFdDRGF0YU9iamVjdCoqKTsKKyAgICBzdGF0aWMg
SFJFU1VMVCBjcmVhdGVJbnN0YW5jZShXQ0RhdGFPYmplY3QqKiwgY29uc3QgRHJhZ0RhdGFNYXAq
KTsKIHByaXZhdGU6CiAgICAgV0NEYXRhT2JqZWN0KCk7CiAgICAgdmlydHVhbCB+V0NEYXRhT2Jq
ZWN0KCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvQ2hhbmdlTG9nCShyZXZpc2lvbiA3NzUxMykKKysrIFNvdXJjZS9XZWJLaXQy
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQxIEBACisyMDExLTAyLTAzICBF
bnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0
IG9uIFdpbmRvd3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD01Mjc3NQorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODUxNDQwOT4KKyAgICAgICAgCisg
ICAgICAgIFRoaXMgcGF0Y2ggY29udGFpbnMgdGhlIHJlbWFpbmluZyB3b3JrIHRvIHN1cHBvcnQK
KyAgICAgICAgYSBXZWJLaXQgd2luZG93IGFzIGRyYWcgc291cmNlIG9uIFdpbmRvd3MuCisgICAg
ICAgIEkndmUgYWRkZWQgdGhlIGNvZGUgdG8gZ2VuZXJhdGUgdGhlIGltYWdlIGZvciBkcmFnZ2lu
ZyBhIGxpbmsgYXMKKyAgICAgICAgd2VsbCBhcyB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIHBhY2th
Z2UgdGhlIEhCSVRNQVAgaW50byBhIFNoYXJlZE1lbW9yeQorICAgICAgICBvYmplY3QgYW5kIHNl
bmQgaXQgb3ZlciB0byB0aGUgVUkgcHJvY2VzcyB3aGVyZSBEb0RyYWdEcm9wIGlzIHBlcmZvcm1l
ZC4KKyAgICAgICAgCisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHA6CisgICAg
ICAgIChXZWJLaXQ6OldlYlBhZ2VQcm94eTo6c3RhcnREcmFnRHJvcCk6IEFkZGVkLgorICAgICAg
ICAqIFVJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaDoKKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFn
ZVByb3h5Lm1lc3NhZ2VzLmluOgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQv
V2ViRHJhZ0NsaWVudC5jcHA6IE1hZGUgc3RhcnREcmFnIGZvcgorICAgICAgICBwbGF0Zm9ybXMg
b3RoZXIgdGhhbiBXaW5kb3cgYW5kIE1hYy4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYkNvcmVT
dXBwb3J0L3dpbi9XZWJEcmFnQ2xpZW50V2luLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6
OmRyYWdnaW5nU291cmNlT3BlcmF0aW9uTWFza1RvRHJhZ0N1cnNvcnMpOgorICAgICAgICAoV2Vi
S2l0OjpXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcpOgorICAgICAgICAoV2ViS2l0OjpkcmFnTGFi
ZWxGb250KToKKyAgICAgICAgKFdlYktpdDo6V2ViRHJhZ0NsaWVudDo6Y3JlYXRlRHJhZ0ltYWdl
Rm9yTGluayk6CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJh
Z1NvdXJjZS5jcHA6IEFkZGVkLgorICAgICAgICBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBJ
RHJvcFNvdXJjZSBpbnRlcmZhY2UuCisgICAgICAgIChXZWJEcmFnU291cmNlOjpjcmVhdGVJbnN0
YW5jZSk6CisgICAgICAgIChXZWJEcmFnU291cmNlOjpXZWJEcmFnU291cmNlKToKKyAgICAgICAg
KFdlYkRyYWdTb3VyY2U6OlF1ZXJ5SW50ZXJmYWNlKToKKyAgICAgICAgKFdlYkRyYWdTb3VyY2U6
OkFkZFJlZik6CisgICAgICAgIChXZWJEcmFnU291cmNlOjpSZWxlYXNlKToKKyAgICAgICAgKFdl
YkRyYWdTb3VyY2U6OlF1ZXJ5Q29udGludWVEcmFnKToKKyAgICAgICAgKFdlYkRyYWdTb3VyY2U6
OkdpdmVGZWVkYmFjayk6CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4v
V2ViRHJhZ1NvdXJjZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkRyYWdTb3VyY2U6On5XZWJEcmFn
U291cmNlKToKKyAgICAgICAgKiB3aW4vV2ViS2l0Mi52Y3Byb2o6CisKIDIwMTEtMDItMDMgIFNh
bSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBGaXggUXQgYnVpbGQuCkluZGV4
OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkocmV2aXNpb24gNzcy
NTUpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNjYsNiArNjYsMTMgQEAKICNpbmNsdWRlICJXZWJQcm90ZWN0aW9uU3BhY2Uu
aCIKICNpbmNsdWRlICJXZWJTZWN1cml0eU9yaWdpbi5oIgogI2luY2x1ZGUgIldlYlVSTFJlcXVl
c3QuaCIKKyNpZiBQTEFURk9STShXSU4pCisjaW5jbHVkZSAiV2ViRHJhZ1NvdXJjZS5oIgorI2lu
Y2x1ZGUgPFdlYkNvcmUvQml0bWFwSW5mby5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQ09NUHRyLmg+
CisjaW5jbHVkZSA8V2ViQ29yZS9XQ0RhdGFPYmplY3QuaD4KKyNpbmNsdWRlIDxzaGxPYmouaD4K
KyNlbmRpZgogI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3Jl
L0Zsb2F0UmVjdC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvTUlNRVR5cGVSZWdpc3RyeS5oPgpAQCAt
NjQ4LDYgKzY1NSw2NCBAQCB2b2lkIFdlYlBhZ2VQcm94eTo6c2V0RHJhZ0ltYWdlKGNvbnN0IFdl
CiB9CiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKFdJTikKKwordm9pZCBXZWJQYWdlUHJveHk6OnN0
YXJ0RHJhZ0Ryb3AoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGltYWdlT3JpZ2luLCBjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYgZHJhZ1BvaW50LCB1aW50NjRfdCBva0VmZmVjdCwgCisgICAgSGFz
aE1hcDxVSU5ULCBWZWN0b3I8U3RyaW5nPj4gZGF0YU1hcCwgY29uc3QgV2ViQ29yZTo6SW50U2l6
ZSYgZHJhZ0ltYWdlU2l6ZSwgY29uc3QgU2hhcmVkTWVtb3J5OjpIYW5kbGUmIGRyYWdJbWFnZUhh
bmRsZSwgYm9vbCBpc0xpbmtEcmFnKQoreworICAgIENPTVB0cjxXQ0RhdGFPYmplY3Q+IGRhdGFP
YmplY3Q7CisgICAgV0NEYXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZSgmZGF0YU9iamVjdCwgJmRh
dGFNYXApOworCisgICAgUmVmUHRyPFNoYXJlZE1lbW9yeT4gbWVtb3J5QnVmZmVyID0gU2hhcmVk
TWVtb3J5OjpjcmVhdGUoZHJhZ0ltYWdlSGFuZGxlLCBTaGFyZWRNZW1vcnk6OlJlYWRXcml0ZSk7
CisgICAgaWYgKCFtZW1vcnlCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworICAgIFJlZlB0cjxX
ZWJEcmFnU291cmNlPiBzb3VyY2U7CisgICAgc291cmNlID0gV2ViRHJhZ1NvdXJjZTo6Y3JlYXRl
SW5zdGFuY2UobV9wYWdlQ2xpZW50LT5uYXRpdmVXaW5kb3coKSk7CisgICAgaWYgKCFzb3VyY2Up
CisgICAgICAgIHJldHVybjsKKworICAgIENPTVB0cjxJRHJhZ1NvdXJjZUhlbHBlcj4gaGVscGVy
OworICAgIGlmIChGQUlMRUQoQ29DcmVhdGVJbnN0YW5jZShDTFNJRF9EcmFnRHJvcEhlbHBlciwg
MCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsIElJRF9JRHJhZ1NvdXJjZUhlbHBlciwgKExQVk9JRCop
JmhlbHBlcikpKQorICAgICAgICByZXR1cm47CisKKyAgICBCaXRtYXBJbmZvIGJpdG1hcEluZm8g
PSBCaXRtYXBJbmZvOjpjcmVhdGUoZHJhZ0ltYWdlU2l6ZSk7CisgICAgdm9pZCogYml0czsKKyAg
ICBIQklUTUFQIGhibXAgPSBDcmVhdGVESUJTZWN0aW9uKDAsICZiaXRtYXBJbmZvLCBESUJfUkdC
X0NPTE9SUywgc3RhdGljX2Nhc3Q8dm9pZCoqPigmYml0cyksIDAsIDApOworICAgIG1lbWNweShi
aXRzLCBtZW1vcnlCdWZmZXItPmRhdGEoKSwgbWVtb3J5QnVmZmVyLT5zaXplKCkpOworCisgICAg
U0hEUkFHSU1BR0Ugc2RpOworICAgIHNkaS5zaXplRHJhZ0ltYWdlLmN4ID0gYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlXaWR0aDsKKyAgICBzZGkuc2l6ZURyYWdJbWFnZS5jeSA9IGJpdG1hcEluZm8u
Ym1pSGVhZGVyLmJpSGVpZ2h0OworICAgIHNkaS5jckNvbG9yS2V5ID0gMHhmZmZmZmZmZjsKKyAg
ICBzZGkuaGJtcERyYWdJbWFnZSA9IGhibXA7CisgICAgc2RpLnB0T2Zmc2V0LnggPSBkcmFnUG9p
bnQueCgpIC0gaW1hZ2VPcmlnaW4ueCgpOworICAgIHNkaS5wdE9mZnNldC55ID0gZHJhZ1BvaW50
LnkoKSAtIGltYWdlT3JpZ2luLnkoKTsKKyAgICBpZiAoaXNMaW5rRHJhZykKKyAgICAgICAgc2Rp
LnB0T2Zmc2V0LnkgPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAtIHNkaS5wdE9mZnNl
dC55OworCisgICAgaGVscGVyLT5Jbml0aWFsaXplRnJvbUJpdG1hcCgmc2RpLCBkYXRhT2JqZWN0
LmdldCgpKTsKKworICAgIERXT1JEIGVmZmVjdCA9IERST1BFRkZFQ1RfTk9ORTsKKworICAgIERy
YWdPcGVyYXRpb24gb3BlcmF0aW9uID0gRHJhZ09wZXJhdGlvbk5vbmU7CisgICAgaWYgKERvRHJh
Z0Ryb3AoZGF0YU9iamVjdC5nZXQoKSwgc291cmNlLmdldCgpLCBva0VmZmVjdCwgJmVmZmVjdCkg
PT0gRFJBR0RST1BfU19EUk9QKSB7CisgICAgICAgIGlmIChlZmZlY3QgJiBEUk9QRUZGRUNUX0NP
UFkpCisgICAgICAgICAgICBvcGVyYXRpb24gPSBEcmFnT3BlcmF0aW9uQ29weTsKKyAgICAgICAg
ZWxzZSBpZiAoZWZmZWN0ICYgRFJPUEVGRkVDVF9MSU5LKQorICAgICAgICAgICAgb3BlcmF0aW9u
ID0gRHJhZ09wZXJhdGlvbkxpbms7CisgICAgICAgIGVsc2UgaWYgKGVmZmVjdCAmIERST1BFRkZF
Q1RfTU9WRSkKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IERyYWdPcGVyYXRpb25Nb3ZlOworICAg
IH0KKyAgICBQT0lOVEwgcHQ7CisgICAgOjpHZXRDdXJzb3JQb3MoKExQUE9JTlQpJnB0KTsKKyAg
ICBQT0lOVEwgbG9jYWxwdCA9IHB0OworICAgIDo6U2NyZWVuVG9DbGllbnQobV9wYWdlQ2xpZW50
LT5uYXRpdmVXaW5kb3coKSwgKExQUE9JTlQpJmxvY2FscHQpOworCisgICAgZHJhZ0VuZGVkKElu
dFBvaW50KGxvY2FscHQueCwgbG9jYWxwdC55KSwgSW50UG9pbnQocHQueCwgcHQueSksIG9wZXJh
dGlvbik7Cit9CisjZW5kaWYKKwogdm9pZCBXZWJQYWdlUHJveHk6OmRyYWdFbmRlZChjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYgY2xpZW50UG9zaXRpb24sIGNvbnN0IFdlYkNvcmU6OkludFBvaW50
JiBnbG9iYWxQb3NpdGlvbiwgdWludDY0X3Qgb3BlcmF0aW9uKQogewogICAgIGlmICghaXNWYWxp
ZCgpKQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAkocmV2aXNp
b24gNzcyNTUpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHdv
cmtpbmcgY29weSkKQEAgLTMwMCw2ICszMDAsOSBAQCBwdWJsaWM6CiAjaWYgUExBVEZPUk0oTUFD
KQogICAgIHZvaWQgc2V0RHJhZ0ltYWdlKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBjbGllbnRQ
b3NpdGlvbiwgY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYgaW1hZ2VTaXplLCBjb25zdCBTaGFyZWRN
ZW1vcnk6OkhhbmRsZSYgZHJhZ0ltYWdlSGFuZGxlLCBib29sIGlzTGlua0RyYWcpOwogI2VuZGlm
CisjaWYgUExBVEZPUk0oV0lOKQorICAgIHZvaWQgc3RhcnREcmFnRHJvcChjb25zdCBXZWJDb3Jl
OjpJbnRQb2ludCYgaW1hZ2VQb2ludCwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGRyYWdQb2lu
dCwgdWludDY0X3Qgb2tFZmZlY3QsIEhhc2hNYXA8VUlOVCwgVmVjdG9yPFN0cmluZz4+IGRhdGFN
YXAsIGNvbnN0IFdlYkNvcmU6OkludFNpemUmIGRyYWdJbWFnZVNpemUsIGNvbnN0IFNoYXJlZE1l
bW9yeTo6SGFuZGxlJiBkcmFnSW1hZ2VIYW5kbGUsIGJvb2wgaXNMaW5rRHJhZyk7CisjZW5kaWYK
ICAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKENvcmVJUEM6OkNvbm5lY3Rpb24qLCBDb3JlSVBD
OjpNZXNzYWdlSUQsIENvcmVJUEM6OkFyZ3VtZW50RGVjb2RlciopOwogICAgIHZvaWQgZGlkUmVj
ZWl2ZVN5bmNNZXNzYWdlKENvcmVJUEM6OkNvbm5lY3Rpb24qLCBDb3JlSVBDOjpNZXNzYWdlSUQs
IENvcmVJUEM6OkFyZ3VtZW50RGVjb2RlciosIENvcmVJUEM6OkFyZ3VtZW50RW5jb2RlciopOwog
CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmlu
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkubWVz
c2FnZXMuaW4JKHJldmlzaW9uIDc3MjU1KQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dl
YlBhZ2VQcm94eS5tZXNzYWdlcy5pbgkod29ya2luZyBjb3B5KQpAQCAtMTk4LDQgKzE5OCw3IEBA
IG1lc3NhZ2VzIC0+IFdlYlBhZ2VQcm94eSB7CiAjaWYgUExBVEZPUk0oTUFDKQogICAgIFNldERy
YWdJbWFnZShXZWJDb3JlOjpJbnRQb2ludCBjbGllbnRQb3NpdGlvbiwgV2ViQ29yZTo6SW50U2l6
ZSBpbWFnZVNpemUsIFdlYktpdDo6U2hhcmVkTWVtb3J5OjpIYW5kbGUgZHJhZ0ltYWdlLCBib29s
IGxpbmtEcmFnKQogI2VuZGlmCisjaWYgUExBVEZPUk0oV0lOKQorICAgIFN0YXJ0RHJhZ0Ryb3Ao
V2ViQ29yZTo6SW50UG9pbnQgaW1hZ2VQb2ludCwgV2ViQ29yZTo6SW50UG9pbnQgZHJhZ1BvaW50
LCB1aW50NjRfdCBva0VmZmVjdCwgSGFzaE1hcDxVSU5ULFZlY3RvcjxTdHJpbmc+PiBkYXRhTWFw
LCBXZWJDb3JlOjpJbnRTaXplIGRyYWdJbWFnZVNpemUsIFdlYktpdDo6U2hhcmVkTWVtb3J5OjpI
YW5kbGUgZHJhZ0ltYWdlLCBib29sIGxpbmtEcmFnKQorI2VuZGlmCiB9CkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViRHJh
Z0NsaWVudC5jcHAJKHJldmlzaW9uIDc3MjU1KQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vz
cy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTEs
NyArNTEsNyBAQCBEcmFnU291cmNlQWN0aW9uIFdlYkRyYWdDbGllbnQ6OmRyYWdTb3VyCiAgICAg
cmV0dXJuIERyYWdTb3VyY2VBY3Rpb25Bbnk7CiB9CiAKLSNpZiAhUExBVEZPUk0oTUFDKQorI2lm
ICFQTEFURk9STShNQUMpICYmICFQTEFURk9STShXSU4pCiB2b2lkIFdlYkRyYWdDbGllbnQ6OnN0
YXJ0RHJhZyhEcmFnSW1hZ2VSZWYsIGNvbnN0IEludFBvaW50JiwgY29uc3QgSW50UG9pbnQmLCBD
bGlwYm9hcmQqLCBGcmFtZSosIGJvb2wpCiB7CiB9CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQ
cm9jZXNzL1dlYkNvcmVTdXBwb3J0L3dpbi9XZWJEcmFnQ2xpZW50V2luLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L3dpbi9XZWJEcmFn
Q2xpZW50V2luLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3Mv
V2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdDbGllbnRXaW4uY3BwCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJXZWJEcmFnQ2xpZW50LmgiCisKKyNpbmNsdWRlICJTaGFyZWFibGVCaXRtYXAuaCIKKyNpbmNs
dWRlICJXZWJDb3JlQXJndW1lbnRDb2RlcnMuaCIKKyNpbmNsdWRlICJXZWJQYWdlLmgiCisjaW5j
bHVkZSAiV2ViUGFnZVByb3h5TWVzc2FnZXMuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0JpdG1hcElu
Zm8uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0NPTVB0ci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQ2xp
cGJvYXJkV2luLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5oPgorI2luY2x1
ZGUgPFdlYkNvcmUvRm9udC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRm9udERlc2NyaXB0aW9uLmg+
CisjaW5jbHVkZSA8V2ViQ29yZS9Gb250U2VsZWN0b3IuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0Zy
YW1lLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0NvbnRleHQuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL1BhZ2UuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NldHRpbmdzLmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9TdHJpbmdUcnVuY2F0b3IuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RleHRSdW4uaD4K
KyNpbmNsdWRlIDxXZWJDb3JlL1dlYkNvcmVUZXh0UmVuZGVyZXIuaD4KKyNpbmNsdWRlIDxzaGxv
YmouaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K0hCSVRNQVAgYWxsb2NJbWFnZShIREMsIEludFNpemUsIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
KiogdGFyZ2V0UmVmKTsKK3ZvaWQgZGVhbGxvY0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0NvbnRl
eHQqIHRhcmdldCk7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjb25zdCBmbG9hdCBEcmFn
TGFiZWxCb3JkZXJYID0gNDsKKy8vIEtlZXAgYm9yZGVyX3kgaW4gc3luY2ggd2l0aCBEcmFnQ29u
dHJvbGxlcjo6TGlua0RyYWdCb3JkZXJJbnNldC4KK2NvbnN0IGZsb2F0IERyYWdMYWJlbEJvcmRl
clkgPSAyOworY29uc3QgZmxvYXQgRHJhZ0xhYmVsUmFkaXVzID0gNTsKK2NvbnN0IGZsb2F0IExh
YmVsQm9yZGVyWU9mZnNldCA9IDI7CisKK2NvbnN0IGZsb2F0IE1pbkRyYWdMYWJlbFdpZHRoQmVm
b3JlQ2xpcCA9IDEyMDsKK2NvbnN0IGZsb2F0IE1heERyYWdMYWJlbFdpZHRoID0gMjAwOworY29u
c3QgZmxvYXQgTWF4RHJhZ0xhYmVsU3RyaW5nV2lkdGggPSAoTWF4RHJhZ0xhYmVsV2lkdGggLSAy
ICogRHJhZ0xhYmVsQm9yZGVyWCk7CisKK2NvbnN0IGZsb2F0IERyYWdMaW5rTGFiZWxGb250c2l6
ZSA9IDExOworY29uc3QgZmxvYXQgRHJhZ0xpbmtVcmxGb250U2l6ZSA9IDEwOworCitzdGF0aWMg
RFdPUkQgZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrVG9EcmFnQ3Vyc29ycyhEcmFnT3BlcmF0
aW9uIG9wKQoreworICAgIERXT1JEIHJlc3VsdCA9IERST1BFRkZFQ1RfTk9ORTsKKyAgICBpZiAo
b3AgPT0gRHJhZ09wZXJhdGlvbkV2ZXJ5KQorICAgICAgICByZXR1cm4gRFJPUEVGRkVDVF9DT1BZ
IHwgRFJPUEVGRkVDVF9MSU5LIHwgRFJPUEVGRkVDVF9NT1ZFOyAKKyAgICBpZiAob3AgJiBEcmFn
T3BlcmF0aW9uQ29weSkKKyAgICAgICAgcmVzdWx0IHw9IERST1BFRkZFQ1RfQ09QWTsgCisgICAg
aWYgKG9wICYgRHJhZ09wZXJhdGlvbkxpbmspCisgICAgICAgIHJlc3VsdCB8PSBEUk9QRUZGRUNU
X0xJTks7IAorICAgIGlmIChvcCAmIERyYWdPcGVyYXRpb25Nb3ZlKQorICAgICAgICByZXN1bHQg
fD0gRFJPUEVGRkVDVF9NT1ZFOworICAgIGlmIChvcCAmIERyYWdPcGVyYXRpb25HZW5lcmljKQor
ICAgICAgICByZXN1bHQgfD0gRFJPUEVGRkVDVF9NT1ZFOworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3ZvaWQgV2ViRHJhZ0NsaWVudDo6c3RhcnREcmFnKERyYWdJbWFnZVJlZiBpbWFnZSwgY29u
c3QgSW50UG9pbnQmIGltYWdlT3JpZ2luLCBjb25zdCBJbnRQb2ludCYgZHJhZ1BvaW50LCBDbGlw
Ym9hcmQqIGNsaXBib2FyZCwgRnJhbWUqIGZyYW1lLCBib29sIGlzTGluaykKK3sKKyAgICBDT01Q
dHI8SURhdGFPYmplY3Q+IGRhdGFPYmplY3QgPSBzdGF0aWNfY2FzdDxDbGlwYm9hcmRXaW4qPihj
bGlwYm9hcmQpLT5kYXRhT2JqZWN0KCk7CisKKyAgICBpZiAoIWRhdGFPYmplY3QpCisgICAgICAg
IHJldHVybjsKKworICAgIEhEQyBiaXRtYXBEQyA9IENyZWF0ZUNvbXBhdGlibGVEQygwKTsKKyAg
ICBCSVRNQVBJTkZPIGJpdG1hcEluZm87CisgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXpl
ID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICAgIEdldERJQml0cyhiaXRtYXBEQywgaW1h
Z2UsIDAsIDAsIDAsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NPTE9SUyk7CisgICAgaWYgKGJpdG1h
cEluZm8uYm1pSGVhZGVyLmJpU2l6ZUltYWdlIDw9IDApCisgICAgICAgIGJpdG1hcEluZm8uYm1p
SGVhZGVyLmJpU2l6ZUltYWdlID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAqIGFicyhi
aXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCkgKiAoYml0bWFwSW5mby5ibWlIZWFkZXIuYmlC
aXRDb3VudCArIDcpIC8gODsKKyAgICAKKyAgICBSZWZQdHI8U2hhcmVkTWVtb3J5PiBtZW1vcnlC
dWZmZXIgPSBTaGFyZWRNZW1vcnk6OmNyZWF0ZShiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVNpemVJ
bWFnZSk7CisKKyAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdC
OworICAgIEdldERJQml0cyhiaXRtYXBEQywgaW1hZ2UsIDAsIGJpdG1hcEluZm8uYm1pSGVhZGVy
LmJpSGVpZ2h0LCBtZW1vcnlCdWZmZXItPmRhdGEoKSwgJmJpdG1hcEluZm8sIERJQl9SR0JfQ09M
T1JTKTsgICAgICAgCisgICAgRGVsZXRlREMoYml0bWFwREMpOworCisgICAgU2hhcmVkTWVtb3J5
OjpIYW5kbGUgaGFuZGxlOworICAgIGlmICghbWVtb3J5QnVmZmVyLT5jcmVhdGVIYW5kbGUoaGFu
ZGxlLCBTaGFyZWRNZW1vcnk6OlJlYWRXcml0ZSkpCisgICAgICAgIHJldHVybjsKKyAgICBEV09S
RCBva0VmZmVjdCA9IGRyYWdnaW5nU291cmNlT3BlcmF0aW9uTWFza1RvRHJhZ0N1cnNvcnMobV9w
YWdlLT5jb3JlUGFnZSgpLT5kcmFnQ29udHJvbGxlcigpLT5zb3VyY2VEcmFnT3BlcmF0aW9uKCkp
OworICAgIERyYWdEYXRhIGRyYWdEYXRhKGRhdGFPYmplY3QuZ2V0KCksIEludFBvaW50KCksIElu
dFBvaW50KCksIERyYWdPcGVyYXRpb25Ob25lKTsKKyAgICBtX3BhZ2UtPnNlbmQoTWVzc2FnZXM6
OldlYlBhZ2VQcm94eTo6U3RhcnREcmFnRHJvcChpbWFnZU9yaWdpbiwgZHJhZ1BvaW50LCBva0Vm
ZmVjdCwgZHJhZ0RhdGEuZHJhZ0RhdGFNYXAoKSwgSW50U2l6ZShiaXRtYXBJbmZvLmJtaUhlYWRl
ci5iaVdpZHRoLCBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCksIGhhbmRsZSwgaXNMaW5r
KSwgbV9wYWdlLT5wYWdlSUQoKSk7Cit9CisKK3N0YXRpYyBGb250IGRyYWdMYWJlbEZvbnQoaW50
IHNpemUsIGJvb2wgYm9sZCwgRm9udFJlbmRlcmluZ01vZGUgcmVuZGVyaW5nTW9kZSkKK3sKKyAg
ICBOT05DTElFTlRNRVRSSUNTIG1ldHJpY3M7CisgICAgbWV0cmljcy5jYlNpemUgPSBzaXplb2Yo
bWV0cmljcyk7CisgICAgU3lzdGVtUGFyYW1ldGVyc0luZm8oU1BJX0dFVE5PTkNMSUVOVE1FVFJJ
Q1MsIG1ldHJpY3MuY2JTaXplLCAmbWV0cmljcywgMCk7CisKKyAgICBGb250RGVzY3JpcHRpb24g
ZGVzY3JpcHRpb247CisgICAgZGVzY3JpcHRpb24uc2V0V2VpZ2h0KGJvbGQgPyBGb250V2VpZ2h0
Qm9sZCA6IEZvbnRXZWlnaHROb3JtYWwpOworCisgICAgRm9udEZhbWlseSBmYW1pbHk7CisgICAg
ZmFtaWx5LnNldEZhbWlseShtZXRyaWNzLmxmU21DYXB0aW9uRm9udC5sZkZhY2VOYW1lKTsKKyAg
ICBkZXNjcmlwdGlvbi5zZXRGYW1pbHkoZmFtaWx5KTsKKyAgICBkZXNjcmlwdGlvbi5zZXRTcGVj
aWZpZWRTaXplKChmbG9hdClzaXplKTsKKyAgICBkZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUo
KGZsb2F0KXNpemUpOworICAgIGRlc2NyaXB0aW9uLnNldFJlbmRlcmluZ01vZGUocmVuZGVyaW5n
TW9kZSk7CisgICAgRm9udCByZXN1bHQgPSBGb250KGRlc2NyaXB0aW9uLCAwLCAwKTsgCisgICAg
cmVzdWx0LnVwZGF0ZSgwKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitEcmFnSW1hZ2VSZWYg
V2ViRHJhZ0NsaWVudDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiB1cmwsIGNvbnN0IFN0
cmluZyYgaW5MYWJlbCwgRnJhbWUqIGZyYW1lKQoreworICAgIC8vIFRoaXMgaXMgbW9yZSBvciBs
ZXNzIGFuIGV4YWN0IG1hdGNoIGZvciB0aGUgTWFjIE9TIFggY29kZS4KKworICAgIGNvbnN0IEZv
bnQqIGxhYmVsRm9udDsKKyAgICBjb25zdCBGb250KiB1cmxGb250OworCisgICAgaWYgKGZyYW1l
LT5zZXR0aW5ncygpICYmIGZyYW1lLT5zZXR0aW5ncygpLT5mb250UmVuZGVyaW5nTW9kZSgpID09
IEFsdGVybmF0ZVJlbmRlcmluZ01vZGUpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgYWx0
ZXJuYXRlUmVuZGVyaW5nTW9kZUxhYmVsRm9udCA9IGRyYWdMYWJlbEZvbnQoRHJhZ0xpbmtMYWJl
bEZvbnRzaXplLCB0cnVlLCBBbHRlcm5hdGVSZW5kZXJpbmdNb2RlKTsKKyAgICAgICAgc3RhdGlj
IGNvbnN0IEZvbnQgYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZVVSTEZvbnQgPSBkcmFnTGFiZWxGb250
KERyYWdMaW5rVXJsRm9udFNpemUsIGZhbHNlLCBBbHRlcm5hdGVSZW5kZXJpbmdNb2RlKTsKKyAg
ICAgICAgbGFiZWxGb250ID0gJmFsdGVybmF0ZVJlbmRlcmluZ01vZGVMYWJlbEZvbnQ7CisgICAg
ICAgIHVybEZvbnQgPSAmYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZVVSTEZvbnQ7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgbm9ybWFsUmVuZGVyaW5nTW9kZUxhYmVsRm9u
dCA9IGRyYWdMYWJlbEZvbnQoRHJhZ0xpbmtMYWJlbEZvbnRzaXplLCB0cnVlLCBOb3JtYWxSZW5k
ZXJpbmdNb2RlKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgbm9ybWFsUmVuZGVyaW5nTW9k
ZVVSTEZvbnQgPSBkcmFnTGFiZWxGb250KERyYWdMaW5rVXJsRm9udFNpemUsIGZhbHNlLCBOb3Jt
YWxSZW5kZXJpbmdNb2RlKTsKKyAgICAgICAgbGFiZWxGb250ID0gJm5vcm1hbFJlbmRlcmluZ01v
ZGVMYWJlbEZvbnQ7CisgICAgICAgIHVybEZvbnQgPSAmbm9ybWFsUmVuZGVyaW5nTW9kZVVSTEZv
bnQ7CisgICAgfQorCisgICAgYm9vbCBkcmF3VVJMU3RyaW5nID0gdHJ1ZTsKKyAgICBib29sIGNs
aXBVUkxTdHJpbmcgPSBmYWxzZTsKKyAgICBib29sIGNsaXBMYWJlbFN0cmluZyA9IGZhbHNlOwor
CisgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC5zdHJpbmcoKTsgCisgICAgU3RyaW5nIGxhYmVs
ID0gaW5MYWJlbDsKKyAgICBpZiAobGFiZWwuaXNFbXB0eSgpKSB7CisgICAgICAgIGRyYXdVUkxT
dHJpbmcgPSBmYWxzZTsKKyAgICAgICAgbGFiZWwgPSB1cmxTdHJpbmc7CisgICAgfQorCisgICAg
Ly8gRmlyc3Qgc3RlcCBpbiBkcmF3aW5nIHRoZSBsaW5rIGRyYWcgaW1hZ2Ugd2lkdGguCisgICAg
VGV4dFJ1biBsYWJlbFJ1bihsYWJlbC5pbXBsKCkpOworICAgIFRleHRSdW4gdXJsUnVuKHVybFN0
cmluZy5pbXBsKCkpOworICAgIEludFNpemUgbGFiZWxTaXplKGxhYmVsRm9udC0+d2lkdGgobGFi
ZWxSdW4pLCBsYWJlbEZvbnQtPmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgKyBsYWJlbEZvbnQtPmZv
bnRNZXRyaWNzKCkuZGVzY2VudCgpKTsKKworICAgIGlmIChsYWJlbFNpemUud2lkdGgoKSA+IE1h
eERyYWdMYWJlbFN0cmluZ1dpZHRoKSB7CisgICAgICAgIGxhYmVsU2l6ZS5zZXRXaWR0aChNYXhE
cmFnTGFiZWxTdHJpbmdXaWR0aCk7CisgICAgICAgIGNsaXBMYWJlbFN0cmluZyA9IHRydWU7Cisg
ICAgfQorICAgIAorICAgIEludFNpemUgdXJsU3RyaW5nU2l6ZTsKKyAgICBJbnRTaXplIGltYWdl
U2l6ZShsYWJlbFNpemUud2lkdGgoKSArIERyYWdMYWJlbEJvcmRlclggKiAyLCBsYWJlbFNpemUu
aGVpZ2h0KCkgKyBEcmFnTGFiZWxCb3JkZXJZICogMik7CisKKyAgICBpZiAoZHJhd1VSTFN0cmlu
ZykgeworICAgICAgICB1cmxTdHJpbmdTaXplLnNldFdpZHRoKHVybEZvbnQtPndpZHRoKHVybFJ1
bikpOworICAgICAgICB1cmxTdHJpbmdTaXplLnNldEhlaWdodCh1cmxGb250LT5mb250TWV0cmlj
cygpLmFzY2VudCgpICsgdXJsRm9udC0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCkpOyAKKyAgICAg
ICAgaW1hZ2VTaXplLnNldEhlaWdodChpbWFnZVNpemUuaGVpZ2h0KCkgKyB1cmxTdHJpbmdTaXpl
LmhlaWdodCgpKTsKKyAgICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGgoKSA+IE1heERyYWdM
YWJlbFN0cmluZ1dpZHRoKSB7CisgICAgICAgICAgICBpbWFnZVNpemUuc2V0V2lkdGgoTWF4RHJh
Z0xhYmVsV2lkdGgpOworICAgICAgICAgICAgY2xpcFVSTFN0cmluZyA9IHRydWU7CisgICAgICAg
IH0gZWxzZQorICAgICAgICAgICAgaW1hZ2VTaXplLnNldFdpZHRoKHN0ZDo6bWF4KGxhYmVsU2l6
ZS53aWR0aCgpLCB1cmxTdHJpbmdTaXplLndpZHRoKCkpICsgRHJhZ0xhYmVsQm9yZGVyWCAqIDIp
OworICAgIH0KKworICAgIC8vIFdlIG5vdyBrbm93IGhvdyBiaWcgdGhlIGltYWdlIG5lZWRzIHRv
IGJlLCBzbyB3ZSBjcmVhdGUgYW5kCisgICAgLy8gZmlsbCB0aGUgYmFja2dyb3VuZAorICAgIEhC
SVRNQVAgaW1hZ2UgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhEQyB3b3JraW5n
REMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOworICAgIGlmICghd29ya2luZ0RDKSB7CisgICAg
ICAgIFJlbGVhc2VEQygwLCBkYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFBs
YXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0UmVmOworICAgIGltYWdlID0gYWxsb2NJbWFn
ZSh3b3JraW5nREMsIGltYWdlU2l6ZSwgJmNvbnRleHRSZWYpOworICAgIGlmICghaW1hZ2UpIHsK
KyAgICAgICAgRGVsZXRlREMod29ya2luZ0RDKTsKKyAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICAgICAKKyAgICBTZWxlY3RPYmplY3Qod29y
a2luZ0RDLCBpbWFnZSk7CisgICAgR3JhcGhpY3NDb250ZXh0IGNvbnRleHQoY29udGV4dFJlZik7
CisgICAgLy8gT24gTWFjIGFscGhhIGlzIHswLjcsIDAuNywgMC43LCAwLjh9LCBob3dldmVyIHdl
IGNhbid0IGNvbnRyb2wgYWxwaGEKKyAgICAvLyBmb3IgZHJhZyBpbWFnZXMgb24gd2luLCBzbyB3
ZSB1c2UgMQorICAgIHN0YXRpYyBjb25zdCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoMTQwLCAxNDAs
IDE0MCk7CisgICAgc3RhdGljIGNvbnN0IEludFNpemUgcmFkaWkoRHJhZ0xhYmVsUmFkaXVzLCBE
cmFnTGFiZWxSYWRpdXMpOworICAgIEludFJlY3QgcmVjdCgwLCAwLCBpbWFnZVNpemUud2lkdGgo
KSwgaW1hZ2VTaXplLmhlaWdodCgpKTsKKyAgICBjb250ZXh0LmZpbGxSb3VuZGVkUmVjdChyZWN0
LCByYWRpaSwgcmFkaWksIHJhZGlpLCByYWRpaSwgYmFja2dyb3VuZENvbG9yLCBDb2xvclNwYWNl
RGV2aWNlUkdCKTsKKyAKKyAgICAvLyBEcmF3IHRoZSB0ZXh0CisgICAgc3RhdGljIGNvbnN0IENv
bG9yIHRvcENvbG9yKDAsIDAsIDAsIDI1NSk7IC8vIG9yaWdpbmFsIGFscGhhID0gMC43NQorICAg
IHN0YXRpYyBjb25zdCBDb2xvciBib3R0b21Db2xvcigyNTUsIDI1NSwgMjU1LCAxMjcpOyAvLyBv
cmlnaW5hbCBhbHBoYSA9IDAuNQorICAgIGlmIChkcmF3VVJMU3RyaW5nKSB7CisgICAgICAgIGlm
IChjbGlwVVJMU3RyaW5nKQorICAgICAgICAgICAgdXJsU3RyaW5nID0gU3RyaW5nVHJ1bmNhdG9y
OjpyaWdodFRydW5jYXRlKHVybFN0cmluZywgaW1hZ2VTaXplLndpZHRoKCkgLSAoRHJhZ0xhYmVs
Qm9yZGVyWCAqIDIuMGYpLCAqdXJsRm9udCwgZmFsc2UpOworICAgICAgICBJbnRQb2ludCB0ZXh0
UG9zKERyYWdMYWJlbEJvcmRlclgsIGltYWdlU2l6ZS5oZWlnaHQoKSAtIChMYWJlbEJvcmRlcllP
ZmZzZXQgKyB1cmxGb250LT5mb250TWV0cmljcygpLmRlc2NlbnQoKSkpOworICAgICAgICBXZWJD
b3JlRHJhd0RvdWJsZWRUZXh0QXRQb2ludChjb250ZXh0LCB1cmxTdHJpbmcsIHRleHRQb3MsICp1
cmxGb250LCB0b3BDb2xvciwgYm90dG9tQ29sb3IpOworICAgIH0KKyAgICAKKyAgICBpZiAoY2xp
cExhYmVsU3RyaW5nKQorICAgICAgICBsYWJlbCA9IFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVu
Y2F0ZShsYWJlbCwgaW1hZ2VTaXplLndpZHRoKCkgLSAoRHJhZ0xhYmVsQm9yZGVyWCAqIDIuMGYp
LCAqbGFiZWxGb250LCBmYWxzZSk7CisKKyAgICBJbnRQb2ludCB0ZXh0UG9zKERyYWdMYWJlbEJv
cmRlclgsIERyYWdMYWJlbEJvcmRlclkgKyBsYWJlbEZvbnQtPnBpeGVsU2l6ZSgpKTsKKyAgICBX
ZWJDb3JlRHJhd0RvdWJsZWRUZXh0QXRQb2ludChjb250ZXh0LCBsYWJlbCwgdGV4dFBvcywgKmxh
YmVsRm9udCwgdG9wQ29sb3IsIGJvdHRvbUNvbG9yKTsKKworICAgIGRlYWxsb2NDb250ZXh0KGNv
bnRleHRSZWYpOworICAgIERlbGV0ZURDKHdvcmtpbmdEQyk7CisgICAgUmVsZWFzZURDKDAsIGRj
KTsKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApJbmRleDog
U291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJj
ZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3Vw
cG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5jcHAJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViS2l0
Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L3dpbi9XZWJEcmFnU291cmNlLmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBcHBsZSBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiV2ViRHJhZ1NvdXJjZS5oIgorCisjaW5jbHVkZSA8V2ViQ29yZS9DdXJzb3IuaD4K
KyNpbmNsdWRlIDxXZWJDb3JlL0RyYWdBY3Rpb25zLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9FdmVu
dEhhbmRsZXIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9QYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybU1vdXNlRXZlbnQuaD4KKyNpbmNs
dWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK1Bh
c3NSZWZQdHI8V2ViRHJhZ1NvdXJjZT4gV2ViRHJhZ1NvdXJjZTo6Y3JlYXRlSW5zdGFuY2UoSFdO
RCBoV25kKQoreworICAgIGlmICghaFduZCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBXZWJEcmFnU291cmNlKGhXbmQpKTsKK30KKworV2ViRHJhZ1NvdXJjZTo6
V2ViRHJhZ1NvdXJjZShIV05EIGhXbmQpCisgICAgOiBtX2Ryb3BwZWQoZmFsc2UpIAorICAgICwg
bV93aW5kb3coaFduZCkKK3sKK30KKworU1RETUVUSE9ESU1QIFdlYkRyYWdTb3VyY2U6OlF1ZXJ5
SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqZWN0KQoreworICAgICpwcHZPYmpl
Y3QgPSAwOworICAgIGlmIChJc0VxdWFsSUlEKHJpaWQsIElJRF9JVW5rbm93bikgfHwgSXNFcXVh
bElJRChyaWlkLCBJSURfSURyb3BTb3VyY2UpKSB7CisgICAgICAgICpwcHZPYmplY3QgPSB0aGlz
OworICAgICAgICBBZGRSZWYoKTsKKworICAgICAgICByZXR1cm4gU19PSzsKKyAgICB9CisKKyAg
ICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKK30KKworU1RETUVUSE9ESU1QXyhVTE9ORykgV2ViRHJh
Z1NvdXJjZTo6QWRkUmVmKHZvaWQpCit7CisgICAgcmVmKCk7CisgICAgcmV0dXJuIHJlZkNvdW50
KCk7Cit9CisKK1NURE1FVEhPRElNUF8oVUxPTkcpIFdlYkRyYWdTb3VyY2U6OlJlbGVhc2Uodm9p
ZCkKK3sKKyAgICBkZXJlZigpOworICAgIHJldHVybiByZWZDb3VudCgpOworfQorCitTVERNRVRI
T0RJTVAgV2ViRHJhZ1NvdXJjZTo6UXVlcnlDb250aW51ZURyYWcoQk9PTCBmRXNjYXBlUHJlc3Nl
ZCwgRFdPUkQgZ3JmS2V5U3RhdGUpCit7CisgICAgaWYgKGZFc2NhcGVQcmVzc2VkIHx8ICEoZ3Jm
S2V5U3RhdGUgJiAoTUtfTEJVVFRPTiB8IE1LX1JCVVRUT04pKSkgeworICAgICAgICBtX2Ryb3Bw
ZWQgPSAhZkVzY2FwZVByZXNzZWQ7CisgICAgICAgIHJldHVybiBmRXNjYXBlUHJlc3NlZD8gRFJB
R0RST1BfU19DQU5DRUwgOiBEUkFHRFJPUF9TX0RST1A7CisgICAgfQorCisgICAgcmV0dXJuIFNf
T0s7Cit9CisKK1NURE1FVEhPRElNUCBXZWJEcmFnU291cmNlOjpHaXZlRmVlZGJhY2soRFdPUkQg
ZHdFZmZlY3QpCit7CisgICAgcmV0dXJuIERSQUdEUk9QX1NfVVNFREVGQVVMVENVUlNPUlM7Cit9
CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L3dpbi9XZWJE
cmFnU291cmNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJD
b3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dl
YktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5oCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEFwcGxl
IEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgV2ViRHJhZ1NvdXJj
ZV9oCisjZGVmaW5lIFdlYkRyYWdTb3VyY2VfaAorCisjaW5jbHVkZSA8V1RGL1JlZkNvdW50ZWQu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL0NPTVB0ci5oPgorI2luY2x1ZGUgPG9iamlkbC5oPgorCitj
bGFzcyBXZWJEcmFnU291cmNlIDogcHVibGljIElEcm9wU291cmNlLCBwdWJsaWMgUmVmQ291bnRl
ZDxXZWJEcmFnU291cmNlPiB7CitwdWJsaWM6CisgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhP
RENBTExUWVBFIFF1ZXJ5SW50ZXJmYWNlKFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqZWN0KTsg
ICAgICAgIAorICAgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgQWRkUmVmKHZvaWQp
OworICAgIHZpcnR1YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZSh2b2lkKTsKKyAg
ICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlDb250aW51ZURyYWcoQk9P
TCBmRXNjYXBlUHJlc3NlZCwgRFdPUkQgZ3JmS2V5U3RhdGUpOworICAgIHZpcnR1YWwgSFJFU1VM
VCBTVERNRVRIT0RDQUxMVFlQRSBHaXZlRmVlZGJhY2soRFdPUkQgZHdFZmZlY3QpOworCisgICAg
c3RhdGljIFBhc3NSZWZQdHI8V2ViRHJhZ1NvdXJjZT4gY3JlYXRlSW5zdGFuY2UoSFdORCBoV25k
KTsKKyAgICB+V2ViRHJhZ1NvdXJjZSgpIHt9OworcHJpdmF0ZToKKyAgICBXZWJEcmFnU291cmNl
KEhXTkQgaFduZCk7CisgICAgbG9uZyBtX3JlZjsKKyAgICBib29sIG1fZHJvcHBlZDsKKyAgICBI
V05EIG1fd2luZG93OworCit9OworCisjZW5kaWYgLy8gIVdlYkRyYWdTb3VyY2VfaApJbmRleDog
U291cmNlL1dlYktpdDIvd2luL1dlYktpdDIudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJLaXQyL3dpbi9XZWJLaXQyLnZjcHJvagkocmV2aXNpb24gNzcyNTUpCisrKyBTb3VyY2UvV2Vi
S2l0Mi93aW4vV2ViS2l0Mi52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTE4LDcgKzE4LDcgQEAK
IAkJPENvbmZpZ3VyYXRpb24KIAkJCU5hbWU9IkRlYnVnfFdpbjMyIgogCQkJQ29uZmlndXJhdGlv
blR5cGU9IjIiCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChXZWJLaXRWU1Byb3BzUmVk
aXJlY3Rpb25EaXIpLi5cLi5cLi5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXEZl
YXR1cmVEZWZpbmVzLnZzcHJvcHM7JChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rpb25EaXIpLi5cLi5c
Li5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXGNvbW1vbi52c3Byb3BzOyQoV2Vi
S2l0VlNQcm9wc1JlZGlyZWN0aW9uRGlyKS4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9v
bHNcdnNwcm9wc1xkZWJ1Zy52c3Byb3BzOy5cV2ViS2l0MkNvbW1vbi52c3Byb3BzOy5cV2ViS2l0
MkRpcmVjdFgudnNwcm9wczsuXFdlYktpdDJBcHBsZS52c3Byb3BzIgorCQkJSW5oZXJpdGVkUHJv
cGVydHlTaGVldHM9Ii4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xG
ZWF0dXJlRGVmaW5lcy52c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNc
dnNwcm9wc1xjb21tb24udnNwcm9wczsuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xz
XHZzcHJvcHNcZGVidWcudnNwcm9wczsuXFdlYktpdDJDb21tb24udnNwcm9wczsuXFdlYktpdDJE
aXJlY3RYLnZzcHJvcHM7LlxXZWJLaXQyQXBwbGUudnNwcm9wcyIKIAkJCUNoYXJhY3RlclNldD0i
MSIKIAkJCT4KIAkJCTxUb29sCkBAIC03OSw3ICs3OSw3IEBACiAJCTxDb25maWd1cmF0aW9uCiAJ
CQlOYW1lPSJSZWxlYXNlfFdpbjMyIgogCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiCi0JCQlJbmhl
cml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rpb25EaXIpLi5cLi5c
Li5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXEZlYXR1cmVEZWZpbmVzLnZzcHJv
cHM7JChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rpb25EaXIpLi5cLi5cLi5cV2ViS2l0TGlicmFyaWVz
XHdpblx0b29sc1x2c3Byb3BzXGNvbW1vbi52c3Byb3BzOyQoV2ViS2l0VlNQcm9wc1JlZGlyZWN0
aW9uRGlyKS4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xyZWxlYXNl
LnZzcHJvcHM7LlxXZWJLaXQyQ29tbW9uLnZzcHJvcHM7LlxXZWJLaXQyRGlyZWN0WC52c3Byb3Bz
Oy5cV2ViS2l0MkFwcGxlLnZzcHJvcHMiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iLi5c
Li5cLi5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXEZlYXR1cmVEZWZpbmVzLnZz
cHJvcHM7Li5cLi5cLi5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXGNvbW1vbi52
c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xyZWxlYXNl
LnZzcHJvcHM7LlxXZWJLaXQyQ29tbW9uLnZzcHJvcHM7LlxXZWJLaXQyRGlyZWN0WC52c3Byb3Bz
Oy5cV2ViS2l0MkFwcGxlLnZzcHJvcHMiCiAJCQlDaGFyYWN0ZXJTZXQ9IjEiCiAJCQk+CiAJCQk8
VG9vbApAQCAtMTQwLDcgKzE0MCw3IEBACiAJCTxDb25maWd1cmF0aW9uCiAJCQlOYW1lPSJEZWJ1
Z19DYWlyb19DRkxpdGV8V2luMzIiCiAJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKLQkJCUluaGVy
aXRlZFByb3BlcnR5U2hlZXRzPSIkKFdlYktpdFZTUHJvcHNSZWRpcmVjdGlvbkRpcikuLlwuLlwu
LlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcRmVhdHVyZURlZmluZXNDYWlyby52
c3Byb3BzOyQoV2ViS2l0VlNQcm9wc1JlZGlyZWN0aW9uRGlyKS4uXC4uXC4uXFdlYktpdExpYnJh
cmllc1x3aW5cdG9vbHNcdnNwcm9wc1xjb21tb24udnNwcm9wczskKFdlYktpdFZTUHJvcHNSZWRp
cmVjdGlvbkRpcikuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcZGVi
dWcudnNwcm9wczskKFdlYktpdFZTUHJvcHNSZWRpcmVjdGlvbkRpcikuLlwuLlwuLlxXZWJLaXRM
aWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcZGVidWdfd2luY2Fpcm8udnNwcm9wczskKFdlYktp
dFZTUHJvcHNSZWRpcmVjdGlvbkRpcikuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xz
XHZzcHJvcHNcY1VSTC52c3Byb3BzOy5cV2ViS2l0MkNvbW1vbi52c3Byb3BzOy5cV2ViS2l0MkNG
TGl0ZS52c3Byb3BzOyQoV2ViS2l0VlNQcm9wc1JlZGlyZWN0aW9uRGlyKS4uXC4uXC4uXFdlYktp
dExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xXaW5DYWlyby52c3Byb3BzIgorCQkJSW5oZXJp
dGVkUHJvcGVydHlTaGVldHM9Ii4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNw
cm9wc1xGZWF0dXJlRGVmaW5lc0NhaXJvLnZzcHJvcHM7Li5cLi5cLi5cV2ViS2l0TGlicmFyaWVz
XHdpblx0b29sc1x2c3Byb3BzXGNvbW1vbi52c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmll
c1x3aW5cdG9vbHNcdnNwcm9wc1xkZWJ1Zy52c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmll
c1x3aW5cdG9vbHNcdnNwcm9wc1xkZWJ1Z193aW5jYWlyby52c3Byb3BzOy4uXC4uXC4uXFdlYktp
dExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xjVVJMLnZzcHJvcHM7LlxXZWJLaXQyQ29tbW9u
LnZzcHJvcHM7LlxXZWJLaXQyQ0ZMaXRlLnZzcHJvcHM7Li5cLi5cLi5cV2ViS2l0TGlicmFyaWVz
XHdpblx0b29sc1x2c3Byb3BzXFdpbkNhaXJvLnZzcHJvcHMiCiAJCQlDaGFyYWN0ZXJTZXQ9IjEi
CiAJCQk+CiAJCQk8VG9vbApAQCAtMjAyLDcgKzIwMiw3IEBACiAJCTxDb25maWd1cmF0aW9uCiAJ
CQlOYW1lPSJSZWxlYXNlX0NhaXJvX0NGTGl0ZXxXaW4zMiIKIAkJCUNvbmZpZ3VyYXRpb25UeXBl
PSIyIgotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoV2ViS2l0VlNQcm9wc1JlZGlyZWN0
aW9uRGlyKS4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xGZWF0dXJl
RGVmaW5lc0NhaXJvLnZzcHJvcHM7JChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rpb25EaXIpLi5cLi5c
Li5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXGNvbW1vbi52c3Byb3BzOyQoV2Vi
S2l0VlNQcm9wc1JlZGlyZWN0aW9uRGlyKS4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9v
bHNcdnNwcm9wc1xyZWxlYXNlLnZzcHJvcHM7JChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rpb25EaXIp
Li5cLi5cLi5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXFdpbkNhaXJvLnZzcHJv
cHM7JChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rpb25EaXIpLi5cLi5cLi5cV2ViS2l0TGlicmFyaWVz
XHdpblx0b29sc1x2c3Byb3BzXGNVUkwudnNwcm9wczsuXFdlYktpdDJDb21tb24udnNwcm9wczsu
XFdlYktpdDJDRkxpdGUudnNwcm9wcyIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwu
LlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcRmVhdHVyZURlZmluZXNDYWly
by52c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xjb21t
b24udnNwcm9wczsuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNccmVs
ZWFzZS52c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xX
aW5DYWlyby52c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9w
c1xjVVJMLnZzcHJvcHM7LlxXZWJLaXQyQ29tbW9uLnZzcHJvcHM7LlxXZWJLaXQyQ0ZMaXRlLnZz
cHJvcHMiCiAJCQlDaGFyYWN0ZXJTZXQ9IjEiCiAJCQk+CiAJCQk8VG9vbApAQCAtMjYzLDcgKzI2
Myw3IEBACiAJCTxDb25maWd1cmF0aW9uCiAJCQlOYW1lPSJEZWJ1Z19BbGx8V2luMzIiCiAJCQlD
b25maWd1cmF0aW9uVHlwZT0iMiIKLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFdlYktp
dFZTUHJvcHNSZWRpcmVjdGlvbkRpcikuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xz
XHZzcHJvcHNcRmVhdHVyZURlZmluZXMudnNwcm9wczskKFdlYktpdFZTUHJvcHNSZWRpcmVjdGlv
bkRpcikuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcY29tbW9uLnZz
cHJvcHM7JChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rpb25EaXIpLi5cLi5cLi5cV2ViS2l0TGlicmFy
aWVzXHdpblx0b29sc1x2c3Byb3BzXGRlYnVnLnZzcHJvcHM7JChXZWJLaXRWU1Byb3BzUmVkaXJl
Y3Rpb25EaXIpLi5cLi5cLi5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXGRlYnVn
X2FsbC52c3Byb3BzOy5cV2ViS2l0MkNvbW1vbi52c3Byb3BzOy5cV2ViS2l0MkRpcmVjdFgudnNw
cm9wczsuXFdlYktpdDJBcHBsZS52c3Byb3BzIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9
Ii4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xGZWF0dXJlRGVmaW5l
cy52c3Byb3BzOy4uXC4uXC4uXFdlYktpdExpYnJhcmllc1x3aW5cdG9vbHNcdnNwcm9wc1xjb21t
b24udnNwcm9wczsuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcZGVi
dWcudnNwcm9wczsuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcZGVi
dWdfYWxsLnZzcHJvcHM7LlxXZWJLaXQyQ29tbW9uLnZzcHJvcHM7LlxXZWJLaXQyRGlyZWN0WC52
c3Byb3BzOy5cV2ViS2l0MkFwcGxlLnZzcHJvcHMiCiAJCQlDaGFyYWN0ZXJTZXQ9IjEiCiAJCQk+
CiAJCQk8VG9vbApAQCAtMzI0LDcgKzMyNCw3IEBACiAJCTxDb25maWd1cmF0aW9uCiAJCQlOYW1l
PSJSZWxlYXNlX0xUQ0d8V2luMzIiCiAJCQlDb25maWd1cmF0aW9uVHlwZT0iMiIKLQkJCUluaGVy
aXRlZFByb3BlcnR5U2hlZXRzPSIkKFdlYktpdFZTUHJvcHNSZWRpcmVjdGlvbkRpcikuLlwuLlwu
LlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcRmVhdHVyZURlZmluZXMudnNwcm9w
czskKFdlYktpdFZTUHJvcHNSZWRpcmVjdGlvbkRpcikuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNc
d2luXHRvb2xzXHZzcHJvcHNcY29tbW9uLnZzcHJvcHM7JChXZWJLaXRWU1Byb3BzUmVkaXJlY3Rp
b25EaXIpLi5cLi5cLi5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXHJlbGVhc2Uu
dnNwcm9wczsuXFdlYktpdDJDb21tb24udnNwcm9wczsuXFdlYktpdDJEaXJlY3RYLnZzcHJvcHM7
LlxXZWJLaXQyQXBwbGUudnNwcm9wcyIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIuLlwu
LlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcRmVhdHVyZURlZmluZXMudnNw
cm9wczsuLlwuLlwuLlxXZWJLaXRMaWJyYXJpZXNcd2luXHRvb2xzXHZzcHJvcHNcY29tbW9uLnZz
cHJvcHM7Li5cLi5cLi5cV2ViS2l0TGlicmFyaWVzXHdpblx0b29sc1x2c3Byb3BzXHJlbGVhc2Uu
dnNwcm9wczsuXFdlYktpdDJDb21tb24udnNwcm9wczsuXFdlYktpdDJEaXJlY3RYLnZzcHJvcHM7
LlxXZWJLaXQyQXBwbGUudnNwcm9wcyIKIAkJCUNoYXJhY3RlclNldD0iMSIKIAkJCVdob2xlUHJv
Z3JhbU9wdGltaXphdGlvbj0iMSIKIAkJCT4KQEAgLTE0MDEsNiArMTQwMSwxOCBAQAogCQkJCQkJ
PgogCQkJCQk8L0ZpbGU+CiAJCQkJCTxGaWxlCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlBy
b2Nlc3NcV2ViQ29yZVN1cHBvcnRcd2luXFdlYkRyYWdDbGllbnRXaW4uY3BwIgorCQkJCQkJPgor
CQkJCQk8L0ZpbGU+CisJCQkJCTxGaWxlCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlByb2Nl
c3NcV2ViQ29yZVN1cHBvcnRcd2luXFdlYkRyYWdTb3VyY2UuY3BwIgorCQkJCQkJPgorCQkJCQk8
L0ZpbGU+CisJCQkJCTxGaWxlCisJCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXFdlYlByb2Nlc3NcV2Vi
Q29yZVN1cHBvcnRcd2luXFdlYkRyYWdTb3VyY2UuaCIKKwkJCQkJCT4KKwkJCQkJPC9GaWxlPgor
CQkJCQk8RmlsZQogCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxXZWJQcm9jZXNzXFdlYkNvcmVTdXBw
b3J0XHdpblxXZWJFcnJvcnNXaW4uY3BwIgogCQkJCQkJPgogCQkJCQk8L0ZpbGU+Cg==
</data>
<flag name="review"
          id="72620"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81503</attachid>
            <date>2011-02-07 12:21:08 -0800</date>
            <delta_ts>2011-02-07 15:56:21 -0800</delta_ts>
            <desc>Patch3</desc>
            <filename>dragsourcewin.txt</filename>
            <type>text/plain</type>
            <size>91539</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc3ODMzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTYgQEAKKzIwMTEtMDItMDcgIEVucmljYSBD
YXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWJLaXQyOiBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgb24gV2lu
ZG93cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUy
Nzc1CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS84NTE0NDA5PgorCisgICAgICAgICogbG9hZGVy
L0VtcHR5Q2xpZW50cy5oOiBSZW1vdmVkIGNyZWF0ZURyYWdJbWFnZUZyb21MaW5rLgorICAgICAg
ICAqIHBhZ2UvRHJhZ0NsaWVudC5oOiBEaXR0by4KKyAgICAgICAgKiBwYWdlL0RyYWdDb250cm9s
bGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDb250cm9sbGVyOjpzdGFydERyYWcpOiBj
aGFuZ2VkIGNhbGwgdG8gY3JlYXRlRHJhZ0ltYWdlRnJvbUxpbmsuCisgICAgICAgICogcGxhdGZv
cm0vRHJhZ0ltYWdlLmg6CisgICAgICAgICogcGxhdGZvcm0vbWFjL0RyYWdJbWFnZU1hYy5tbToK
KyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURyYWdJbWFnZUZvckxpbmspOiBNb3ZlZCBmcm9tIERy
YWdDbGllbnQuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5j
cHA6IEFkZGVkIGEgc2VyaWVzIG9mIGZ1bmN0aW9ucworICAgICAgICB0byBkZS1zZXJpYWxpemUg
dGhlIGRyYWcgZGF0YSBmcm9tIHRoZSBtYXAgaW50byBhbiBJRGF0YU9iamVjdC4KKyAgICAgICAg
KFdlYkNvcmU6OmdldFdlYkxvY0RhdGEpOgorICAgICAgICAoV2ViQ29yZTo6dGV4dGh0bWxGb3Jt
YXQpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xvYmFsRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpnZXRGdWxsQ0ZIVE1MKToKKyAgICAgICAgKFdlYkNvcmU6OnVybFdGb3JtYXQpOgorICAg
ICAgICAoV2ViQ29yZTo6dXJsRm9ybWF0KToKKyAgICAgICAgKFdlYkNvcmU6OmZpbGVuYW1lV0Zv
cm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpmaWxlbmFtZUZvcm1hdCk6CisgICAgICAgIChXZWJD
b3JlOjpodG1sRm9ybWF0KToKKyAgICAgICAgKFdlYkNvcmU6OnNtYXJ0UGFzdGVGb3JtYXQpOgor
ICAgICAgICAoV2ViQ29yZTo6Z2V0VVJMKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFBsYWluVGV4
dCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRUZXh0SFRNTCk6CisgICAgICAgIChXZWJDb3JlOjpD
bGlwYm9hcmREYXRhSXRlbTo6Q2xpcGJvYXJkRGF0YUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6
Z2V0U3RyaW5nRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpnZXRVdGY4RGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpnZXRDRkRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6c2V0VUNoYXJEYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OnNldENoYXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OnNldENG
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpnZXRDbGlwYm9hcmRNYXApOgorICAgICAgICAoV2Vi
Q29yZTo6Z2V0Q2xpcGJvYXJkRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpzZXRDbGlwYm9hcmRE
YXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmg6Cisg
ICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHA6IE1vdmVkIGNyZWF0ZURyYWdJ
bWFnZUZvckxpbmsgZnJvbSBEcmFnQ2xpZW50CisgICAgICAgIHRvIGEgcGxhdGZvcm0gc3BlY2lm
aWMgZmlsZSBpbiBXZWJDb3JlLiBJdCBtYWtlcyBhIGxvdCBtb3JlIHNlbnNlIGhlcmUsIHNpbmNl
CisgICAgICAgIHRoZSBkcmFnIGltYWdlIGlzIGFsd2F5cyBjcmVhdGVkIGluIFdlYkNvcmUgZm9y
IGFsbCB0aGUgb3RoZXIgY29udGVudCB0eXBlcworICAgICAgICBleGNlcHQgZm9yIGxpbmtzLgor
ICAgICAgICAoV2ViQ29yZTo6ZHJhZ0xhYmVsRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpjcmVh
dGVEcmFnSW1hZ2VGb3JMaW5rKToKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vV0NEYXRhT2JqZWN0
LmNwcDogQWRkZWQgbmV3IHdheSB0bworICAgICAgICBjb25zdHJ1Y3QgYSBXQ0RhdGFPYmplY3Qg
ZnJvbSBhIERyYWdEYXRhTWFwLgorICAgICAgICAoV2ViQ29yZTo6V0NEYXRhT2JqZWN0OjpjcmVh
dGVJbnN0YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpXQ0RhdGFPYmplY3Q6OmNsZWFyRGF0YSk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5oOgorCiAyMDExLTAyLTA3ICBE
YXJpbiBBZGxlciAgPGRhcmluQGFwcGxlLmNvbT4KIAogICAgICAgICBUdXJuIFVURi04IGRlY29k
ZXIgb2ZmIGZvciBub3cgc28gd2UgY2FuIGxvb2sgaW50byBmYWlsaW5nIHRlc3RzCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9sb2FkZXIvRW1wdHlDbGllbnRzLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJj
ZS9XZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAkod29ya2luZyBjb3B5KQpAQCAtNTUyLDcg
KzU1Miw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIERyYWdEZXN0aW5hdGlvbkFjdGlvbiBhY3Rp
b25NYXNrRm9yRHJhZyhEcmFnRGF0YSopIHsgcmV0dXJuIERyYWdEZXN0aW5hdGlvbkFjdGlvbk5v
bmU7IH0KICAgICB2aXJ0dWFsIERyYWdTb3VyY2VBY3Rpb24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tG
b3JQb2ludChjb25zdCBJbnRQb2ludCYpIHsgcmV0dXJuIERyYWdTb3VyY2VBY3Rpb25Ob25lOyB9
CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhEcmFnSW1hZ2VSZWYsIGNvbnN0IEludFBvaW50
JiwgY29uc3QgSW50UG9pbnQmLCBDbGlwYm9hcmQqLCBGcmFtZSosIGJvb2wpIHsgfQotICAgIHZp
cnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsoS1VSTCYsIGNvbnN0IFN0
cmluZyYsIEZyYW1lKikgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgdm9pZCBkcmFnQ29udHJv
bGxlckRlc3Ryb3llZCgpIHsgfQogfTsKICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9EcmFnQ2xpZW50LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGFnZS9EcmFnQ2xpZW50LmgJKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNl
L1dlYkNvcmUvcGFnZS9EcmFnQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTYyLDcgKzYyLDYg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2aXJ0dWFsIERyYWdTb3VyY2VBY3Rpb24g
ZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBJbnRQb2ludCYgd2luZG93UG9pbnQp
ID0gMDsKICAgICAgICAgCiAgICAgICAgIHZpcnR1YWwgdm9pZCBzdGFydERyYWcoRHJhZ0ltYWdl
UmVmIGRyYWdJbWFnZSwgY29uc3QgSW50UG9pbnQmIGRyYWdJbWFnZU9yaWdpbiwgY29uc3QgSW50
UG9pbnQmIGV2ZW50UG9zLCBDbGlwYm9hcmQqLCBGcmFtZSosIGJvb2wgbGlua0RyYWcgPSBmYWxz
ZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGb3JM
aW5rKEtVUkwmLCBjb25zdCBTdHJpbmcmIGxhYmVsLCBGcmFtZSopID0gMDsKICAgICAgICAgCiAg
ICAgICAgIHZpcnR1YWwgdm9pZCBkcmFnQ29udHJvbGxlckRlc3Ryb3llZCgpID0gMDsKICNpZiBQ
TEFURk9STShNQUMpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdDb250cm9sbGVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdDb250cm9sbGVyLmNwcAko
cmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdDb250cm9sbGVyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNzM5LDcgKzczOSw3IEBAIGJvb2wgRHJhZ0NvbnRyb2xsZXI6
OnN0YXJ0RHJhZyhGcmFtZSogc3IKIAogICAgICAgICBtX2NsaWVudC0+d2lsbFBlcmZvcm1EcmFn
U291cmNlQWN0aW9uKERyYWdTb3VyY2VBY3Rpb25MaW5rLCBkcmFnT3JpZ2luLCBjbGlwYm9hcmQp
OwogICAgICAgICBpZiAoIWRyYWdJbWFnZSkgewotICAgICAgICAgICAgZHJhZ0ltYWdlID0gbV9j
bGllbnQtPmNyZWF0ZURyYWdJbWFnZUZvckxpbmsobGlua1VSTCwgZHJhZ1NvdXJjZS50ZXh0Q29u
dGVudCgpLCBzcmMpOworICAgICAgICAgICAgZHJhZ0ltYWdlID0gY3JlYXRlRHJhZ0ltYWdlRm9y
TGluayhsaW5rVVJMLCBkcmFnU291cmNlLnRleHRDb250ZW50KCksIHNyYyk7CiAgICAgICAgICAg
ICBJbnRTaXplIHNpemUgPSBkcmFnSW1hZ2VTaXplKGRyYWdJbWFnZSk7CiAgICAgICAgICAgICBt
X2RyYWdPZmZzZXQgPSBJbnRQb2ludCgtc2l6ZS53aWR0aCgpIC8gMiwgLUxpbmtEcmFnQm9yZGVy
SW5zZXQpOwogICAgICAgICAgICAgZHJhZ0xvYyA9IEludFBvaW50KG1vdXNlRHJhZ2dlZFBvaW50
LngoKSArIG1fZHJhZ09mZnNldC54KCksIG1vdXNlRHJhZ2dlZFBvaW50LnkoKSArIG1fZHJhZ09m
ZnNldC55KCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0ltYWdlLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0ltYWdlLmgJKHJldmlzaW9u
IDc3ODI0KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0ltYWdlLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTk2LDYgKzk2LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIERyYWdJbWFn
ZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqKTsKICAgICBEcmFnSW1hZ2VSZWYg
Y3JlYXRlRHJhZ0ltYWdlRm9yU2VsZWN0aW9uKEZyYW1lKik7ICAgIAogICAgIERyYWdJbWFnZVJl
ZiBjcmVhdGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKTsKKyAgICBE
cmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiBs
YWJlbCwgRnJhbWUqKTsKICAgICB2b2lkIGRlbGV0ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYpOwog
fQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvRHJhZ0ltYWdlTWFjLm1tCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9EcmFnSW1hZ2VNYWMubW0J
KHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL0RyYWdJbWFn
ZU1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMjgsOSArMjgsMTYgQEAKIAogI2lmIEVOQUJMRShE
UkFHX1NVUFBPUlQpCiAjaW1wb3J0ICJDYWNoZWRJbWFnZS5oIgorI2ltcG9ydCAiRm9udC5oIgor
I2ltcG9ydCAiRm9udERlc2NyaXB0aW9uLmgiCisjaW1wb3J0ICJGb250U2VsZWN0b3IuaCIKICNp
bXBvcnQgIkltYWdlLmgiCiAjaW1wb3J0ICJLVVJMLmgiCiAjaW1wb3J0ICJSZXNvdXJjZVJlc3Bv
bnNlLmgiCisjaW1wb3J0ICJTZXR0aW5ncy5oIgorI2ltcG9ydCAiU3RyaW5nVHJ1bmNhdG9yLmgi
CisjaW1wb3J0ICJUZXh0UnVuLmgiCisjaW1wb3J0ICJXZWJDb3JlVGV4dFJlbmRlcmVyLmgiCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtOTgsNyArMTA1LDEwMSBAQCBSZXRhaW5QdHI8TlNJ
bWFnZT4gY3JlYXRlRHJhZ0ltYWdlSWNvbkZvCiAgICAgCiAgICAgcmV0dXJuIFtbTlNXb3Jrc3Bh
Y2Ugc2hhcmVkV29ya3NwYWNlXSBpY29uRm9yRmlsZVR5cGU6ZXh0ZW5zaW9uXTsKIH0KLSAgICAK
KworCitjb25zdCBmbG9hdCBEcmFnTGFiZWxCb3JkZXJYID0gNDsKKy8vS2VlcCBib3JkZXJfeSBp
biBzeW5jaCB3aXRoIERyYWdDb250cm9sbGVyOjpMaW5rRHJhZ0JvcmRlckluc2V0Citjb25zdCBm
bG9hdCBEcmFnTGFiZWxCb3JkZXJZID0gMjsKK2NvbnN0IGZsb2F0IERyYWdMYWJlbFJhZGl1cyA9
IDU7Citjb25zdCBmbG9hdCBMYWJlbEJvcmRlcllPZmZzZXQgPSAyOworCitjb25zdCBmbG9hdCBN
aW5EcmFnTGFiZWxXaWR0aEJlZm9yZUNsaXAgPSAxMjA7Citjb25zdCBmbG9hdCBNYXhEcmFnTGFi
ZWxXaWR0aCA9IDMyMDsKKworY29uc3QgZmxvYXQgRHJhZ0xpbmtMYWJlbEZvbnRzaXplID0gMTE7
Citjb25zdCBmbG9hdCBEcmFnTGlua1VybEZvbnRTaXplID0gMTA7CisKK0RyYWdJbWFnZVJlZiBj
cmVhdGVEcmFnSW1hZ2VGb3JMaW5rKEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJh
bWUqIGZyYW1lKQoreworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAg
TlNTdHJpbmcgKmxhYmVsID0gMDsKKyAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAg
bGFiZWwgPSB0aXRsZTsKKyAgICBOU1VSTCAqY29jb2FVUkwgPSB1cmw7CisgICAgTlNTdHJpbmcg
KnVybFN0cmluZyA9IFtjb2NvYVVSTCBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nXTsKKworICAgIEJP
T0wgZHJhd1VSTFN0cmluZyA9IFlFUzsKKyAgICBCT09MIGNsaXBVUkxTdHJpbmcgPSBOTzsKKyAg
ICBCT09MIGNsaXBMYWJlbFN0cmluZyA9IE5POworCisgICAgaWYgKCFsYWJlbCkgeworICAgICAg
ICBkcmF3VVJMU3RyaW5nID0gTk87CisgICAgICAgIGxhYmVsID0gdXJsU3RyaW5nOworICAgIH0K
KworICAgIE5TRm9udCAqbGFiZWxGb250ID0gW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5h
Z2VyXSBjb252ZXJ0Rm9udDpbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6RHJhZ0xpbmtMYWJlbEZv
bnRzaXplXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0b0hhdmVUcmFpdDpOU0JvbGRGb250TWFza107CisgICAgTlNGb250ICp1cmxG
b250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOkRyYWdMaW5rVXJsRm9udFNpemVdOworICAg
IE5TU2l6ZSBsYWJlbFNpemU7CisgICAgbGFiZWxTaXplLndpZHRoID0gW2xhYmVsIF93ZWJfd2lk
dGhXaXRoRm9udDogbGFiZWxGb250XTsKKyAgICBsYWJlbFNpemUuaGVpZ2h0ID0gW2xhYmVsRm9u
dCBhc2NlbmRlcl0gLSBbbGFiZWxGb250IGRlc2NlbmRlcl07CisgICAgaWYgKGxhYmVsU2l6ZS53
aWR0aCA+IE1heERyYWdMYWJlbFdpZHRoKXsKKyAgICAgICAgbGFiZWxTaXplLndpZHRoID0gTWF4
RHJhZ0xhYmVsV2lkdGg7CisgICAgICAgIGNsaXBMYWJlbFN0cmluZyA9IFlFUzsKKyAgICB9CisK
KyAgICBOU1NpemUgaW1hZ2VTaXplOworICAgIGltYWdlU2l6ZS53aWR0aCA9IGxhYmVsU2l6ZS53
aWR0aCArIERyYWdMYWJlbEJvcmRlclggKiAyOworICAgIGltYWdlU2l6ZS5oZWlnaHQgPSBsYWJl
bFNpemUuaGVpZ2h0ICsgRHJhZ0xhYmVsQm9yZGVyWSAqIDI7CisgICAgaWYgKGRyYXdVUkxTdHJp
bmcpIHsKKyAgICAgICAgTlNTaXplIHVybFN0cmluZ1NpemU7CisgICAgICAgIHVybFN0cmluZ1Np
emUud2lkdGggPSBbdXJsU3RyaW5nIF93ZWJfd2lkdGhXaXRoRm9udDogdXJsRm9udF07CisgICAg
ICAgIHVybFN0cmluZ1NpemUuaGVpZ2h0ID0gW3VybEZvbnQgYXNjZW5kZXJdIC0gW3VybEZvbnQg
ZGVzY2VuZGVyXTsKKyAgICAgICAgaW1hZ2VTaXplLmhlaWdodCArPSB1cmxTdHJpbmdTaXplLmhl
aWdodDsKKyAgICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGggPiBNYXhEcmFnTGFiZWxXaWR0
aCkgeworICAgICAgICAgICAgaW1hZ2VTaXplLndpZHRoID0gbWF4KE1heERyYWdMYWJlbFdpZHRo
ICsgRHJhZ0xhYmVsQm9yZGVyWSAqIDIsIE1pbkRyYWdMYWJlbFdpZHRoQmVmb3JlQ2xpcCk7Cisg
ICAgICAgICAgICBjbGlwVVJMU3RyaW5nID0gWUVTOworICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgICAgaW1hZ2VTaXplLndpZHRoID0gbWF4KGxhYmVsU2l6ZS53aWR0aCArIERyYWdMYWJlbEJv
cmRlclggKiAyLCB1cmxTdHJpbmdTaXplLndpZHRoICsgRHJhZ0xhYmVsQm9yZGVyWCAqIDIpOwor
ICAgIH0KKyAgICBOU0ltYWdlICpkcmFnSW1hZ2UgPSBbW1tOU0ltYWdlIGFsbG9jXSBpbml0V2l0
aFNpemU6IGltYWdlU2l6ZV0gYXV0b3JlbGVhc2VdOworICAgIFtkcmFnSW1hZ2UgbG9ja0ZvY3Vz
XTsKKworICAgIFtbTlNDb2xvciBjb2xvcldpdGhEZXZpY2VSZWQ6IDAuN2YgZ3JlZW46IDAuN2Yg
Ymx1ZTogMC43ZiBhbHBoYTogMC44Zl0gc2V0XTsKKworICAgIC8vIERyYWcgYSByZWN0YW5nbGUg
d2l0aCByb3VuZGVkIGNvcm5lcnMKKyAgICBOU0JlemllclBhdGggKnBhdGggPSBbTlNCZXppZXJQ
YXRoIGJlemllclBhdGhdOworICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoT3ZhbEluUmVj
dDogTlNNYWtlUmVjdCgwLCAwLCBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMg
KiAyKV07CisgICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VS
ZWN0KDAsIGltYWdlU2l6ZS5oZWlnaHQgLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxS
YWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07CisgICAgW3BhdGggYXBwZW5kQmV6aWVy
UGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJl
bFJhZGl1cyAqIDIsIGltYWdlU2l6ZS5oZWlnaHQgLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFn
TGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07CisgICAgW3BhdGggYXBwZW5k
QmV6aWVyUGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERy
YWdMYWJlbFJhZGl1cyAqIDIsIDAsIERyYWdMYWJlbFJhZGl1cyAqIDIsIERyYWdMYWJlbFJhZGl1
cyAqIDIpXTsKKworICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoUmVjdDogTlNNYWtlUmVj
dChEcmFnTGFiZWxSYWRpdXMsIDAsIGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1cyAq
IDIsIGltYWdlU2l6ZS5oZWlnaHQpXTsKKyAgICBbcGF0aCBhcHBlbmRCZXppZXJQYXRoV2l0aFJl
Y3Q6IE5TTWFrZVJlY3QoMCwgRHJhZ0xhYmVsUmFkaXVzLCBEcmFnTGFiZWxSYWRpdXMgKyAxMCwg
aW1hZ2VTaXplLmhlaWdodCAtIDIgKiBEcmFnTGFiZWxSYWRpdXMpXTsKKyAgICBbcGF0aCBhcHBl
bmRCZXppZXJQYXRoV2l0aFJlY3Q6IE5TTWFrZVJlY3QoaW1hZ2VTaXplLndpZHRoIC0gRHJhZ0xh
YmVsUmFkaXVzIC0gMjAsIERyYWdMYWJlbFJhZGl1cywgRHJhZ0xhYmVsUmFkaXVzICsgMjAsIGlt
YWdlU2l6ZS5oZWlnaHQgLSAyICogRHJhZ0xhYmVsUmFkaXVzKV07CisgICAgW3BhdGggZmlsbF07
CisKKyAgICBOU0NvbG9yICp0b3BDb2xvciA9IFtOU0NvbG9yIGNvbG9yV2l0aERldmljZVdoaXRl
OjAuMGYgYWxwaGE6MC43NWZdOworICAgIE5TQ29sb3IgKmJvdHRvbUNvbG9yID0gW05TQ29sb3Ig
Y29sb3JXaXRoRGV2aWNlV2hpdGU6MS4wZiBhbHBoYTowLjVmXTsKKyAgICBpZiAoZHJhd1VSTFN0
cmluZykgeworICAgICAgICBpZiAoY2xpcFVSTFN0cmluZykKKyAgICAgICAgICAgIHVybFN0cmlu
ZyA9IFtXZWJTdHJpbmdUcnVuY2F0b3IgY2VudGVyVHJ1bmNhdGVTdHJpbmc6IHVybFN0cmluZyB0
b1dpZHRoOmltYWdlU2l6ZS53aWR0aCAtIChEcmFnTGFiZWxCb3JkZXJYICogMikgd2l0aEZvbnQ6
dXJsRm9udF07CisKKyAgICAgICBbdXJsU3RyaW5nIF93ZWJfZHJhd0RvdWJsZWRBdFBvaW50Ok5T
TWFrZVBvaW50KERyYWdMYWJlbEJvcmRlclgsIERyYWdMYWJlbEJvcmRlclkgLSBbdXJsRm9udCBk
ZXNjZW5kZXJdKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFRvcENvbG9yOnRv
cENvbG9yIGJvdHRvbUNvbG9yOmJvdHRvbUNvbG9yIGZvbnQ6dXJsRm9udF07CisgICAgfQorCisg
ICAgaWYgKGNsaXBMYWJlbFN0cmluZykKKyAgICAgICAgbGFiZWwgPSBbV2ViU3RyaW5nVHJ1bmNh
dG9yIHJpZ2h0VHJ1bmNhdGVTdHJpbmc6IGxhYmVsIHRvV2lkdGg6aW1hZ2VTaXplLndpZHRoIC0g
KERyYWdMYWJlbEJvcmRlclggKiAyKSB3aXRoRm9udDpsYWJlbEZvbnRdOworICAgIFtsYWJlbCBf
d2ViX2RyYXdEb3VibGVkQXRQb2ludDpOU01ha2VQb2ludCAoRHJhZ0xhYmVsQm9yZGVyWCwgaW1h
Z2VTaXplLmhlaWdodCAtIExhYmVsQm9yZGVyWU9mZnNldCAtIFtsYWJlbEZvbnQgcG9pbnRTaXpl
XSkKKyAgICAgICAgICAgICAgICAgICAgICB3aXRoVG9wQ29sb3I6dG9wQ29sb3IgYm90dG9tQ29s
b3I6Ym90dG9tQ29sb3IgZm9udDpsYWJlbEZvbnRdOworCisgICAgW2RyYWdJbWFnZSB1bmxvY2tG
b2N1c107CisKKyAgICByZXR1cm4gZHJhZ0ltYWdlOworfQorICAgCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5jcHAJ
KHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2Fy
ZFV0aWxpdGllc1dpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkwLDIyICs5MCwyMiBAQCBzdGF0
aWMgYm9vbCBnZXRXZWJMb2NEYXRhKElEYXRhT2JqZWN0KiBkCiAgICAgaWYgKEZBSUxFRChkYXRh
T2JqZWN0LT5HZXREYXRhKGNmSERyb3BGb3JtYXQoKSwgJm1lZGl1bSkpKQogICAgICAgICByZXR1
cm4gZmFsc2U7CiAKLSAgICBIRFJPUCBoZHJvcCA9IHN0YXRpY19jYXN0PEhEUk9QPihHbG9iYWxM
b2NrKG1lZGl1bS5oR2xvYmFsKSk7CisgICAgSERST1AgaGRyb3AgPSBzdGF0aWNfY2FzdDxIRFJP
UD4oOjpHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7CiAKICAgICBpZiAoIWhkcm9wKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBpZiAoIURyYWdRdWVyeUZpbGVXKGhkcm9wLCAwLCBm
aWxlbmFtZSwgV1RGX0FSUkFZX0xFTkdUSChmaWxlbmFtZSkpKQorICAgIGlmICghOjpEcmFnUXVl
cnlGaWxlVyhoZHJvcCwgMCwgZmlsZW5hbWUsIFdURl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkK
ICAgICAgICAgZ290byBleGl0OwogCiAgICAgaWYgKF93Y3NpY21wKFBhdGhGaW5kRXh0ZW5zaW9u
VyhmaWxlbmFtZSksIEwiLnVybCIpKQogICAgICAgICBnb3RvIGV4aXQ7ICAgIAogICAgIAotICAg
IGlmICghR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmdXKEwiSW50ZXJuZXRTaG9ydGN1dCIsIEwidXJs
IiwgMCwgdXJsQnVmZmVyLCBXVEZfQVJSQVlfTEVOR1RIKHVybEJ1ZmZlciksIGZpbGVuYW1lKSkK
KyAgICBpZiAoITo6R2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmdXKEwiSW50ZXJuZXRTaG9ydGN1dCIs
IEwidXJsIiwgMCwgdXJsQnVmZmVyLCBXVEZfQVJSQVlfTEVOR1RIKHVybEJ1ZmZlciksIGZpbGVu
YW1lKSkKICAgICAgICAgZ290byBleGl0OwogICAgIAogICAgIGlmICh0aXRsZSkgewotICAgICAg
ICBQYXRoUmVtb3ZlRXh0ZW5zaW9uKGZpbGVuYW1lKTsKKyAgICAgICAgOjpQYXRoUmVtb3ZlRXh0
ZW5zaW9uKGZpbGVuYW1lKTsKICAgICAgICAgKnRpdGxlID0gU3RyaW5nKChVQ2hhciopZmlsZW5h
bWUpOwogICAgIH0KICAgICAKQEAgLTExNCw4ICsxMTQsOCBAQCBzdGF0aWMgYm9vbCBnZXRXZWJM
b2NEYXRhKElEYXRhT2JqZWN0KiBkCiAKIGV4aXQ6CiAgICAgLy8gRnJlZSB1cCBtZW1vcnkuCi0g
ICAgRHJhZ0ZpbmlzaChoZHJvcCk7Ci0gICAgR2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFsKTsK
KyAgICA6OkRyYWdGaW5pc2goaGRyb3ApOworICAgIDo6R2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xv
YmFsKTsKICNlbmRpZgogICAgIHJldHVybiBzdWNjZWVkZWQ7CiB9CkBAIC0xMzMsMTEgKzEzMywx
MSBAQCBzdGF0aWMgYm9vbCBnZXRXZWJMb2NEYXRhKGNvbnN0IERyYWdEYXRhCiAgICAgaWYgKF93
Y3NpY21wKFBhdGhGaW5kRXh0ZW5zaW9uVyhmaWxlbmFtZSksIEwiLnVybCIpKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7ICAgIAogCi0gICAgaWYgKCFHZXRQcml2YXRlUHJvZmlsZVN0cmluZ1coTCJJ
bnRlcm5ldFNob3J0Y3V0IiwgTCJ1cmwiLCAwLCB1cmxCdWZmZXIsIFdURl9BUlJBWV9MRU5HVEgo
dXJsQnVmZmVyKSwgZmlsZW5hbWUpKQorICAgIGlmICghOjpHZXRQcml2YXRlUHJvZmlsZVN0cmlu
Z1coTCJJbnRlcm5ldFNob3J0Y3V0IiwgTCJ1cmwiLCAwLCB1cmxCdWZmZXIsIFdURl9BUlJBWV9M
RU5HVEgodXJsQnVmZmVyKSwgZmlsZW5hbWUpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAg
ICBpZiAodGl0bGUpIHsKLSAgICAgICAgUGF0aFJlbW92ZUV4dGVuc2lvbihmaWxlbmFtZSk7Cisg
ICAgICAgIDo6UGF0aFJlbW92ZUV4dGVuc2lvbihmaWxlbmFtZSk7CiAgICAgICAgICp0aXRsZSA9
IGZpbGVuYW1lOwogICAgIH0KICAgICAKQEAgLTE2NCw3ICsxNjQsNyBAQCBzdGF0aWMgU3RyaW5n
IGV4dHJhY3RVUkwoY29uc3QgU3RyaW5nICZpCiAvLyBGaXJlZm94IHRleHQvaHRtbAogc3RhdGlj
IEZPUk1BVEVUQyogdGV4dGh0bWxGb3JtYXQoKSAKIHsKLSAgICBzdGF0aWMgVUlOVCBjZiA9IFJl
Z2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwidGV4dC9odG1sIik7CisgICAgc3RhdGljIFVJTlQgY2Yg
PSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwidGV4dC9odG1sIik7CiAgICAgc3RhdGljIEZP
Uk1BVEVUQyB0ZXh0aHRtbEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZ
TUVEX0hHTE9CQUx9OwogICAgIHJldHVybiAmdGV4dGh0bWxGb3JtYXQ7CiB9CkBAIC0xNzcsOSAr
MTc3LDkgQEAgSEdMT0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IEtVUkwmIHVybAogICAgIEhH
TE9CQUwgY2JEYXRhID0gOjpHbG9iYWxBbGxvYyhHUFRSLCBzaXplICogc2l6ZW9mKFVDaGFyKSk7
CiAKICAgICBpZiAoY2JEYXRhKSB7Ci0gICAgICAgIFBXU1RSIGJ1ZmZlciA9IHN0YXRpY19jYXN0
PFBXU1RSPihHbG9iYWxMb2NrKGNiRGF0YSkpOworICAgICAgICBQV1NUUiBidWZmZXIgPSBzdGF0
aWNfY2FzdDxQV1NUUj4oOjpHbG9iYWxMb2NrKGNiRGF0YSkpOwogICAgICAgICBfc253cHJpbnRm
KGJ1ZmZlciwgc2l6ZSwgTCIlc1xuJXMiLCBtdXRhYmxlVVJMLmNoYXJhY3RlcnNXaXRoTnVsbFRl
cm1pbmF0aW9uKCksIG11dGFibGVUaXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigp
KTsKLSAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgIDo6R2xvYmFsVW5sb2Nr
KGNiRGF0YSk7CiAgICAgfQogICAgIHJldHVybiBjYkRhdGE7CiB9CkBAIC0xODksMTAgKzE4OSwx
MCBAQCBIR0xPQkFMIGNyZWF0ZUdsb2JhbERhdGEoY29uc3QgU3RyaW5nJiBzCiAgICAgSEdMT0JB
TCBnbG9iYWxEYXRhID0gOjpHbG9iYWxBbGxvYyhHUFRSLCAoc3RyLmxlbmd0aCgpICsgMSkgKiBz
aXplb2YoVUNoYXIpKTsKICAgICBpZiAoIWdsb2JhbERhdGEpCiAgICAgICAgIHJldHVybiAwOwot
ICAgIFVDaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxVQ2hhcio+KEdsb2JhbExvY2soZ2xvYmFs
RGF0YSkpOworICAgIFVDaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxVQ2hhcio+KDo6R2xvYmFs
TG9jayhnbG9iYWxEYXRhKSk7CiAgICAgbWVtY3B5KGJ1ZmZlciwgc3RyLmNoYXJhY3RlcnMoKSwg
c3RyLmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSk7CiAgICAgYnVmZmVyW3N0ci5sZW5ndGgoKV0g
PSAwOwotICAgIEdsb2JhbFVubG9jayhnbG9iYWxEYXRhKTsKKyAgICA6Okdsb2JhbFVubG9jayhn
bG9iYWxEYXRhKTsKICAgICByZXR1cm4gZ2xvYmFsRGF0YTsKIH0KIApAQCAtMjAxLDEwICsyMDEs
MTAgQEAgSEdMT0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IFZlY3RvcjxjaAogICAgIEhHTE9C
QUwgZ2xvYmFsRGF0YSA9IDo6R2xvYmFsQWxsb2MoR1BUUiwgdmVjdG9yLnNpemUoKSArIDEpOwog
ICAgIGlmICghZ2xvYmFsRGF0YSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2hhciogYnVmZmVy
ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soZ2xvYmFsRGF0YSkpOworICAgIGNoYXIq
IGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPig6Okdsb2JhbExvY2soZ2xvYmFsRGF0YSkpOwog
ICAgIG1lbWNweShidWZmZXIsIHZlY3Rvci5kYXRhKCksIHZlY3Rvci5zaXplKCkpOwogICAgIGJ1
ZmZlclt2ZWN0b3Iuc2l6ZSgpXSA9IDA7Ci0gICAgR2xvYmFsVW5sb2NrKGdsb2JhbERhdGEpOwor
ICAgIDo6R2xvYmFsVW5sb2NrKGdsb2JhbERhdGEpOwogICAgIHJldHVybiBnbG9iYWxEYXRhOwog
fQogCkBAIC0yMTMsMTEgKzIxMywxMSBAQCBzdGF0aWMgU3RyaW5nIGdldEZ1bGxDRkhUTUwoSURh
dGFPYmplY3QqCiAgICAgU1RHTUVESVVNIHN0b3JlOwogICAgIGlmIChTVUNDRUVERUQoZGF0YS0+
R2V0RGF0YShodG1sRm9ybWF0KCksICZzdG9yZSkpKSB7CiAgICAgICAgIC8vIE1TIEhUTUwgRm9y
bWF0IHBhcnNpbmcKLSAgICAgICAgY2hhciogZGF0YSA9IHN0YXRpY19jYXN0PGNoYXIqPihHbG9i
YWxMb2NrKHN0b3JlLmhHbG9iYWwpKTsKKyAgICAgICAgY2hhciogZGF0YSA9IHN0YXRpY19jYXN0
PGNoYXIqPig6Okdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOwogICAgICAgICBTSVpFX1QgZGF0
YVNpemUgPSA6Okdsb2JhbFNpemUoc3RvcmUuaEdsb2JhbCk7CiAgICAgICAgIFN0cmluZyBjZmh0
bWwoVVRGOEVuY29kaW5nKCkuZGVjb2RlKGRhdGEsIGRhdGFTaXplKSk7Ci0gICAgICAgIEdsb2Jh
bFVubG9jayhzdG9yZS5oR2xvYmFsKTsKLSAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUp
OworICAgICAgICA6Okdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgOjpSZWxl
YXNlU3RnTWVkaXVtKCZzdG9yZSk7CiAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgICAgICBy
ZXR1cm4gY2ZodG1sOwogICAgIH0KQEAgLTMxNCwxNCArMzE0LDE0IEBAIHZvaWQgcmVwbGFjZU5C
U1BXaXRoU3BhY2UoU3RyaW5nJiBzdHIpCiAKIEZPUk1BVEVUQyogdXJsV0Zvcm1hdCgpCiB7Ci0g
ICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIlVuaWZvcm1SZXNv
dXJjZUxvY2F0b3JXIik7CisgICAgc3RhdGljIFVJTlQgY2YgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJk
Rm9ybWF0KEwiVW5pZm9ybVJlc291cmNlTG9jYXRvclciKTsKICAgICBzdGF0aWMgRk9STUFURVRD
IHVybEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9
OwogICAgIHJldHVybiAmdXJsRm9ybWF0OwogfQogCiBGT1JNQVRFVEMqIHVybEZvcm1hdCgpCiB7
Ci0gICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIlVuaWZvcm1S
ZXNvdXJjZUxvY2F0b3IiKTsKKyAgICBzdGF0aWMgVUlOVCBjZiA9IDo6UmVnaXN0ZXJDbGlwYm9h
cmRGb3JtYXQoTCJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yIik7CiAgICAgc3RhdGljIEZPUk1BVEVU
QyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFM
fTsKICAgICByZXR1cm4gJnVybEZvcm1hdDsKIH0KQEAgLTM0MCwxNCArMzQwLDE0IEBAIEZPUk1B
VEVUQyogcGxhaW5UZXh0V0Zvcm1hdCgpCiAKIEZPUk1BVEVUQyogZmlsZW5hbWVXRm9ybWF0KCkK
IHsKLSAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiRmlsZU5h
bWVXIik7CisgICAgc3RhdGljIFVJTlQgY2YgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwi
RmlsZU5hbWVXIik7CiAgICAgc3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERW
QVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKICAgICByZXR1cm4gJnVybEZvcm1h
dDsKIH0KIAogRk9STUFURVRDKiBmaWxlbmFtZUZvcm1hdCgpCiB7Ci0gICAgc3RhdGljIFVJTlQg
Y2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIkZpbGVOYW1lIik7CisgICAgc3RhdGljIFVJ
TlQgY2YgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiRmlsZU5hbWUiKTsKICAgICBzdGF0
aWMgRk9STUFURVRDIHVybEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZ
TUVEX0hHTE9CQUx9OwogICAgIHJldHVybiAmdXJsRm9ybWF0OwogfQpAQCAtMzU1LDE0ICszNTUs
MTQgQEAgRk9STUFURVRDKiBmaWxlbmFtZUZvcm1hdCgpCiAvLyBNU0lFIEhUTUwgRm9ybWF0CiBG
T1JNQVRFVEMqIGh0bWxGb3JtYXQoKSAKIHsKLSAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVy
Q2xpcGJvYXJkRm9ybWF0KEwiSFRNTCBGb3JtYXQiKTsKKyAgICBzdGF0aWMgVUlOVCBjZiA9IDo6
UmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJIVE1MIEZvcm1hdCIpOwogICAgIHN0YXRpYyBGT1JN
QVRFVEMgaHRtbEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hH
TE9CQUx9OwogICAgIHJldHVybiAmaHRtbEZvcm1hdDsKIH0KIAogRk9STUFURVRDKiBzbWFydFBh
c3RlRm9ybWF0KCkKIHsKLSAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9y
bWF0KEwiV2ViS2l0IFNtYXJ0IFBhc3RlIEZvcm1hdCIpOworICAgIHN0YXRpYyBVSU5UIGNmID0g
OjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIldlYktpdCBTbWFydCBQYXN0ZSBGb3JtYXQiKTsK
ICAgICBzdGF0aWMgRk9STUFURVRDIGh0bWxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRF
TlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKICAgICByZXR1cm4gJmh0bWxGb3JtYXQ7CiB9CkBAIC0z
NzYsMjUgKzM3NiwyNSBAQCBTdHJpbmcgZ2V0VVJMKElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBE
CiAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgIGVsc2UgaWYgKFNVQ0NFRURFRChkYXRhT2Jq
ZWN0LT5HZXREYXRhKHVybFdGb3JtYXQoKSwgJnN0b3JlKSkpIHsKICAgICAgICAgLy8gVVJMIHVz
aW5nIFVuaWNvZGUKLSAgICAgICAgVUNoYXIqIGRhdGEgPSBzdGF0aWNfY2FzdDxVQ2hhcio+KEds
b2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOworICAgICAgICBVQ2hhciogZGF0YSA9IHN0YXRpY19j
YXN0PFVDaGFyKj4oOjpHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKTsKICAgICAgICAgdXJsID0g
ZXh0cmFjdFVSTChTdHJpbmcoZGF0YSksIHRpdGxlKTsKLSAgICAgICAgR2xvYmFsVW5sb2NrKHN0
b3JlLmhHbG9iYWwpOwotICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgICAg
IDo6R2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICA6OlJlbGVhc2VTdGdNZWRp
dW0oJnN0b3JlKTsKICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgfSBlbHNlIGlmIChTVUND
RUVERUQoZGF0YU9iamVjdC0+R2V0RGF0YSh1cmxGb3JtYXQoKSwgJnN0b3JlKSkpIHsKICAgICAg
ICAgLy8gVVJMIHVzaW5nIEFTQ0lJCi0gICAgICAgIGNoYXIqIGRhdGEgPSBzdGF0aWNfY2FzdDxj
aGFyKj4oR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKSk7CisgICAgICAgIGNoYXIqIGRhdGEgPSBz
dGF0aWNfY2FzdDxjaGFyKj4oOjpHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKTsKICAgICAgICAg
dXJsID0gZXh0cmFjdFVSTChTdHJpbmcoZGF0YSksIHRpdGxlKTsKLSAgICAgICAgR2xvYmFsVW5s
b2NrKHN0b3JlLmhHbG9iYWwpOwotICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7Cisg
ICAgICAgIDo6R2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICA6OlJlbGVhc2VT
dGdNZWRpdW0oJnN0b3JlKTsKICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgfQogI2lmIFBM
QVRGT1JNKENGKQogICAgIGVsc2UgaWYgKGZpbGVuYW1lUG9saWN5ID09IERyYWdEYXRhOjpDb252
ZXJ0RmlsZW5hbWVzKSB7CiAgICAgICAgIGlmIChTVUNDRUVERUQoZGF0YU9iamVjdC0+R2V0RGF0
YShmaWxlbmFtZVdGb3JtYXQoKSwgJnN0b3JlKSkpIHsKICAgICAgICAgICAgIC8vIGZpbGUgdXNp
bmcgdW5pY29kZQotICAgICAgICAgICAgd2NoYXJfdCogZGF0YSA9IHN0YXRpY19jYXN0PHdjaGFy
X3QqPihHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKTsKLSAgICAgICAgICAgIGlmIChkYXRhICYm
IGRhdGFbMF0gJiYgKFBhdGhGaWxlRXhpc3RzKGRhdGEpIHx8IFBhdGhJc1VOQyhkYXRhKSkpIHsK
KyAgICAgICAgICAgIHdjaGFyX3QqIGRhdGEgPSBzdGF0aWNfY2FzdDx3Y2hhcl90Kj4oOjpHbG9i
YWxMb2NrKHN0b3JlLmhHbG9iYWwpKTsKKyAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGFbMF0g
JiYgKDo6UGF0aEZpbGVFeGlzdHMoZGF0YSkgfHwgOjpQYXRoSXNVTkMoZGF0YSkpKSB7CiAgICAg
ICAgICAgICAgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBwYXRoQXNDRlN0cmluZyhBZG9wdENG
LCBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKGtDRkFsbG9jYXRvckRlZmF1bHQsIChjb25z
dCBVbmlDaGFyKilkYXRhLCB3Y3NsZW4oZGF0YSkpKTsKICAgICAgICAgICAgICAgICBpZiAodXJs
RnJvbVBhdGgocGF0aEFzQ0ZTdHJpbmcuZ2V0KCksIHVybCkpIHsKICAgICAgICAgICAgICAgICAg
ICAgaWYgKHRpdGxlKQpAQCAtNDAyLDEyICs0MDIsMTIgQEAgU3RyaW5nIGdldFVSTChJRGF0YU9i
amVjdCogZGF0YU9iamVjdCwgRAogICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsK
ICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBHbG9iYWxVbmxv
Y2soc3RvcmUuaEdsb2JhbCk7Ci0gICAgICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7
CisgICAgICAgICAgICA6Okdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgICAg
IDo6UmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOwogICAgICAgICB9IGVsc2UgaWYgKFNVQ0NFRURF
RChkYXRhT2JqZWN0LT5HZXREYXRhKGZpbGVuYW1lRm9ybWF0KCksICZzdG9yZSkpKSB7CiAgICAg
ICAgICAgICAvLyBmaWxlbmFtZSB1c2luZyBhc2NpaQotICAgICAgICAgICAgY2hhciogZGF0YSA9
IHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKTsKLSAgICAgICAg
ICAgIGlmIChkYXRhICYmIGRhdGFbMF0gJiYgKFBhdGhGaWxlRXhpc3RzQShkYXRhKSB8fCBQYXRo
SXNVTkNBKGRhdGEpKSkgeworICAgICAgICAgICAgY2hhciogZGF0YSA9IHN0YXRpY19jYXN0PGNo
YXIqPig6Okdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOworICAgICAgICAgICAgaWYgKGRhdGEg
JiYgZGF0YVswXSAmJiAoOjpQYXRoRmlsZUV4aXN0c0EoZGF0YSkgfHwgOjpQYXRoSXNVTkNBKGRh
dGEpKSkgewogICAgICAgICAgICAgICAgIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gcGF0aEFzQ0ZT
dHJpbmcoQWRvcHRDRiwgQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhrQ0ZBbGxvY2F0b3JEZWZh
dWx0LCBkYXRhLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKSk7CiAgICAgICAgICAgICAgICAgaWYg
KHVybEZyb21QYXRoKHBhdGhBc0NGU3RyaW5nLmdldCgpLCB1cmwpKSB7CiAgICAgICAgICAgICAg
ICAgICAgIGlmICh0aXRsZSkKQEAgLTQxNSw4ICs0MTUsOCBAQCBTdHJpbmcgZ2V0VVJMKElEYXRh
T2JqZWN0KiBkYXRhT2JqZWN0LCBECiAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVl
OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEdsb2JhbFVu
bG9jayhzdG9yZS5oR2xvYmFsKTsKLSAgICAgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3Jl
KTsKKyAgICAgICAgICAgIDo6R2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICAg
ICAgOjpSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CiAgICAgICAgIH0KICAgICB9CiAjZW5kaWYK
QEAgLTQ0MSw3ICs0NDEsNyBAQCBTdHJpbmcgZ2V0VVJMKGNvbnN0IERyYWdEYXRhTWFwKiBkYXRh
LCBECiAgICAgaWYgKCFnZXREYXRhTWFwSXRlbShkYXRhLCBmaWxlbmFtZVdGb3JtYXQoKSwgc3Ry
aW5nRGF0YSkpCiAgICAgICAgIGdldERhdGFNYXBJdGVtKGRhdGEsIGZpbGVuYW1lRm9ybWF0KCks
IHN0cmluZ0RhdGEpOwogCi0gICAgaWYgKHN0cmluZ0RhdGEuaXNFbXB0eSgpIHx8ICghUGF0aEZp
bGVFeGlzdHMoc3RyaW5nRGF0YS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKSAmJiAh
UGF0aElzVU5DKHN0cmluZ0RhdGEuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSkpKQor
ICAgIGlmIChzdHJpbmdEYXRhLmlzRW1wdHkoKSB8fCAoITo6UGF0aEZpbGVFeGlzdHMoc3RyaW5n
RGF0YS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKSAmJiAhOjpQYXRoSXNVTkMoc3Ry
aW5nRGF0YS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKSkpCiAgICAgICAgIHJldHVy
biB1cmw7CiAgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBwYXRoQXNDRlN0cmluZyhBZG9wdENG
LCBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKGtDRkFsbG9jYXRvckRlZmF1bHQsIChjb25z
dCBVbmlDaGFyICopc3RyaW5nRGF0YS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBz
dHJpbmdEYXRhLmxlbmd0aCgpKSk7CiAgICAgaWYgKHVybEZyb21QYXRoKHBhdGhBc0NGU3RyaW5n
LmdldCgpLCB1cmwpICYmIHRpdGxlKQpAQCAtNDU3LDE3ICs0NTcsMTcgQEAgU3RyaW5nIGdldFBs
YWluVGV4dChJRGF0YU9iamVjdCogZGF0YU9iagogICAgIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICBp
ZiAoU1VDQ0VFREVEKGRhdGFPYmplY3QtPkdldERhdGEocGxhaW5UZXh0V0Zvcm1hdCgpLCAmc3Rv
cmUpKSkgewogICAgICAgICAvLyBVbmljb2RlIHRleHQKLSAgICAgICAgVUNoYXIqIGRhdGEgPSBz
dGF0aWNfY2FzdDxVQ2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOworICAgICAgICBV
Q2hhciogZGF0YSA9IHN0YXRpY19jYXN0PFVDaGFyKj4oOjpHbG9iYWxMb2NrKHN0b3JlLmhHbG9i
YWwpKTsKICAgICAgICAgdGV4dCA9IFN0cmluZyhkYXRhKTsKLSAgICAgICAgR2xvYmFsVW5sb2Nr
KHN0b3JlLmhHbG9iYWwpOwotICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAg
ICAgIDo6R2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICA6OlJlbGVhc2VTdGdN
ZWRpdW0oJnN0b3JlKTsKICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgfSBlbHNlIGlmIChT
VUNDRUVERUQoZGF0YU9iamVjdC0+R2V0RGF0YShwbGFpblRleHRGb3JtYXQoKSwgJnN0b3JlKSkp
IHsKICAgICAgICAgLy8gQVNDSUkgdGV4dAotICAgICAgICBjaGFyKiBkYXRhID0gc3RhdGljX2Nh
c3Q8Y2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOworICAgICAgICBjaGFyKiBkYXRh
ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KDo6R2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKSk7CiAgICAg
ICAgIHRleHQgPSBTdHJpbmcoZGF0YSk7Ci0gICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xv
YmFsKTsKLSAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICA6Okdsb2Jh
bFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgOjpSZWxlYXNlU3RnTWVkaXVtKCZzdG9y
ZSk7CiAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEZJ
WE1FOiBPcmlnaW5hbGx5LCB3ZSBjYWxsZWQgZ2V0VVJMKCkgaGVyZSBiZWNhdXNlIGRyYWdnaW5n
IGFuZCBkcm9wcGluZyBmaWxlcyBkb2Vzbid0CkBAIC00OTYsMTAgKzQ5NiwxMCBAQCBTdHJpbmcg
Z2V0VGV4dEhUTUwoSURhdGFPYmplY3QqIGRhdGEsIGJvCiAgICAgU3RyaW5nIGh0bWw7CiAgICAg
c3VjY2VzcyA9IGZhbHNlOwogICAgIGlmIChTVUNDRUVERUQoZGF0YS0+R2V0RGF0YSh0ZXh0aHRt
bEZvcm1hdCgpLCAmc3RvcmUpKSkgewotICAgICAgICBVQ2hhciogZGF0YSA9IHN0YXRpY19jYXN0
PFVDaGFyKj4oR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKSk7CisgICAgICAgIFVDaGFyKiBkYXRh
ID0gc3RhdGljX2Nhc3Q8VUNoYXIqPig6Okdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOwogICAg
ICAgICBodG1sID0gU3RyaW5nKGRhdGEpOwotICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEds
b2JhbCk7Ci0gICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKKyAgICAgICAgOjpHbG9i
YWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIDo6UmVsZWFzZVN0Z01lZGl1bSgmc3Rv
cmUpOwogICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGh0bWw7CkBA
IC02MTksMTYgKzYxOSwyOCBAQCBib29sIGNvbnRhaW5zSFRNTChjb25zdCBEcmFnRGF0YU1hcCog
ZGF0CiB9CiAKIHR5cGVkZWYgdm9pZCAoKkdldFN0cmluZ0Z1bmN0aW9uKShJRGF0YU9iamVjdCos
IEZPUk1BVEVUQyosIFZlY3RvcjxTdHJpbmc+Jik7Ci10eXBlZGVmIEhhc2hNYXA8VUlOVCwgR2V0
U3RyaW5nRnVuY3Rpb24+IENsaXBib2FyZEZvcm1hdE1hcDsKK3R5cGVkZWYgdm9pZCAoKlNldFN0
cmluZ0Z1bmN0aW9uKShJRGF0YU9iamVjdCosIEZPUk1BVEVUQyosIGNvbnN0IFZlY3RvcjxTdHJp
bmc+Jik7CisKK3N0cnVjdCBDbGlwYm9hcmREYXRhSXRlbSB7CisgICAgR2V0U3RyaW5nRnVuY3Rp
b24gZ2V0U3RyaW5nOworICAgIFNldFN0cmluZ0Z1bmN0aW9uIHNldFN0cmluZzsKKyAgICBGT1JN
QVRFVEMqIGZvcm1hdDsKKworICAgIENsaXBib2FyZERhdGFJdGVtKEZPUk1BVEVUQyogZm9ybWF0
LCBHZXRTdHJpbmdGdW5jdGlvbiBnZXRTdHJpbmcsIFNldFN0cmluZ0Z1bmN0aW9uIHNldFN0cmlu
Zyk6IGZvcm1hdChmb3JtYXQpLCBnZXRTdHJpbmcoZ2V0U3RyaW5nKSwgc2V0U3RyaW5nKHNldFN0
cmluZykgeyB9Cit9OworCit0eXBlZGVmIEhhc2hNYXA8VUlOVCwgQ2xpcGJvYXJkRGF0YUl0ZW0q
PiBDbGlwYm9hcmRGb3JtYXRNYXA7CisKKy8vIEdldHRlciBmdW5jdGlvbnMuCiAKIHRlbXBsYXRl
PHR5cGVuYW1lIFQ+IHZvaWQgZ2V0U3RyaW5nRGF0YShJRGF0YU9iamVjdCogZGF0YSwgRk9STUFU
RVRDKiBmb3JtYXQsIFZlY3RvcjxTdHJpbmc+JiBkYXRhU3RyaW5ncykKIHsKICAgICBTVEdNRURJ
VU0gc3RvcmU7CiAgICAgaWYgKEZBSUxFRChkYXRhLT5HZXREYXRhKGZvcm1hdCwgJnN0b3JlKSkp
CiAgICAgICAgIHJldHVybjsKLSAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3RyaW5nKHN0YXRpY19j
YXN0PFQqPihHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpKSwgOjpHbG9iYWxTaXplKHN0b3JlLmhH
bG9iYWwpIC8gc2l6ZW9mKFQpKSk7Ci0gICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOwot
ICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKKyAgICBkYXRhU3RyaW5ncy5hcHBlbmQoU3Ry
aW5nKHN0YXRpY19jYXN0PFQqPig6Okdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpLCA6Okdsb2Jh
bFNpemUoc3RvcmUuaEdsb2JhbCkgLyBzaXplb2YoVCkpKTsKKyAgICA6Okdsb2JhbFVubG9jayhz
dG9yZS5oR2xvYmFsKTsKKyAgICA6OlJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKIH0KIAogdm9p
ZCBnZXRVdGY4RGF0YShJRGF0YU9iamVjdCogZGF0YSwgRk9STUFURVRDKiBmb3JtYXQsIFZlY3Rv
cjxTdHJpbmc+JiBkYXRhU3RyaW5ncykKQEAgLTYzNiw1NSArNjQ4LDExMCBAQCB2b2lkIGdldFV0
ZjhEYXRhKElEYXRhT2JqZWN0KiBkYXRhLCBGT1JNCiAgICAgU1RHTUVESVVNIHN0b3JlOwogICAg
IGlmIChGQUlMRUQoZGF0YS0+R2V0RGF0YShmb3JtYXQsICZzdG9yZSkpKQogICAgICAgICByZXR1
cm47Ci0gICAgZGF0YVN0cmluZ3MuYXBwZW5kKFN0cmluZyhVVEY4RW5jb2RpbmcoKS5kZWNvZGUo
c3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpLCBHbG9iYWxTaXpl
KHN0b3JlLmhHbG9iYWwpKSkpOwotICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKLSAg
ICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgZGF0YVN0cmluZ3MuYXBwZW5kKFN0cmlu
ZyhVVEY4RW5jb2RpbmcoKS5kZWNvZGUoc3RhdGljX2Nhc3Q8Y2hhcio+KDo6R2xvYmFsTG9jayhz
dG9yZS5oR2xvYmFsKSksIDo6R2xvYmFsU2l6ZShzdG9yZS5oR2xvYmFsKSkpKTsKKyAgICA6Okds
b2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICA6OlJlbGVhc2VTdGdNZWRpdW0oJnN0b3Jl
KTsKIH0KIAogI2lmIFBMQVRGT1JNKENGKQotdm9pZCBnZXRDZkRhdGEoSURhdGFPYmplY3QqIGRh
dGEsIEZPUk1BVEVUQyogZm9ybWF0LCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit2b2lk
IGdldENGRGF0YShJRGF0YU9iamVjdCogZGF0YSwgRk9STUFURVRDKiBmb3JtYXQsIFZlY3RvcjxT
dHJpbmc+JiBkYXRhU3RyaW5ncykKIHsKICAgICBTVEdNRURJVU0gc3RvcmU7CiAgICAgaWYgKEZB
SUxFRChkYXRhLT5HZXREYXRhKGZvcm1hdCwgJnN0b3JlKSkpCiAgICAgICAgIHJldHVybjsKIAot
ICAgIEhEUk9QIGhkcm9wID0gcmVpbnRlcnByZXRfY2FzdDxIRFJPUD4oR2xvYmFsTG9jayhzdG9y
ZS5oR2xvYmFsKSk7CisgICAgSERST1AgaGRyb3AgPSByZWludGVycHJldF9jYXN0PEhEUk9QPig6
Okdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCkpOwogICAgIGlmICghaGRyb3ApCiAgICAgICAgIHJl
dHVybjsKIAogICAgIFdDSEFSIGZpbGVuYW1lW01BWF9QQVRIXTsKLSAgICBVSU5UIGZpbGVDb3Vu
dCA9IERyYWdRdWVyeUZpbGVXKGhkcm9wLCAweEZGRkZGRkZGLCAwLCAwKTsKKyAgICBVSU5UIGZp
bGVDb3VudCA9IDo6RHJhZ1F1ZXJ5RmlsZVcoaGRyb3AsIDB4RkZGRkZGRkYsIDAsIDApOwogICAg
IGZvciAoVUlOVCBpID0gMDsgaSA8IGZpbGVDb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmICghRHJh
Z1F1ZXJ5RmlsZVcoaGRyb3AsIGksIGZpbGVuYW1lLCBXVEZfQVJSQVlfTEVOR1RIKGZpbGVuYW1l
KSkpCisgICAgICAgIGlmICghOjpEcmFnUXVlcnlGaWxlVyhoZHJvcCwgaSwgZmlsZW5hbWUsIFdU
Rl9BUlJBWV9MRU5HVEgoZmlsZW5hbWUpKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAg
ICBkYXRhU3RyaW5ncy5hcHBlbmQoc3RhdGljX2Nhc3Q8VUNoYXIqPihmaWxlbmFtZSkpOwogICAg
IH0KIAotICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKLSAgICBSZWxlYXNlU3RnTWVk
aXVtKCZzdG9yZSk7CisgICAgOjpHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgOjpS
ZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7Cit9CisjZW5kaWYKKworLy8gU2V0dGVyIGZ1bmN0aW9u
cy4KKwordm9pZCBzZXRVQ2hhckRhdGEoSURhdGFPYmplY3QqIGRhdGEsIEZPUk1BVEVUQyogZm9y
bWF0LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7CisgICAgU1RHTUVESVVN
IG1lZGl1bSA9IHswfTsKKyAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOworCisgICAg
bWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGFTdHJpbmdzLmZpcnN0KCkpOwor
ICAgIGlmICghbWVkaXVtLmhHbG9iYWwpCisgICAgICAgIHJldHVybjsKKyAgICBkYXRhLT5TZXRE
YXRhKGZvcm1hdCwgJm1lZGl1bSwgRkFMU0UpOworICAgIDo6R2xvYmFsRnJlZShtZWRpdW0uaEds
b2JhbCk7Cit9CisKK3ZvaWQgc2V0Q2hhckRhdGEoSURhdGFPYmplY3QqIGRhdGEsIEZPUk1BVEVU
QyogZm9ybWF0LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7CisgICAgU1RH
TUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFMOwor
CisgICAgQ1N0cmluZyBjaGFyU3RyaW5nID0gZGF0YVN0cmluZ3MuZmlyc3QoKS51dGY4KCk7Cisg
ICAgc2l6ZV90IHN0cmluZ0xlbmd0aCA9IGNoYXJTdHJpbmcubGVuZ3RoKCk7CisgICAgbWVkaXVt
LmhHbG9iYWwgPSA6Okdsb2JhbEFsbG9jKEdQVFIsIHN0cmluZ0xlbmd0aCArIDEpOworICAgIGlm
ICghbWVkaXVtLmhHbG9iYWwpCisgICAgICAgIHJldHVybjsKKyAgICBjaGFyKiBidWZmZXIgPSBz
dGF0aWNfY2FzdDxjaGFyKj4oOjpHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7CisgICAgbWVt
Y3B5KGJ1ZmZlciwgY2hhclN0cmluZy5kYXRhKCksIHN0cmluZ0xlbmd0aCk7CisgICAgYnVmZmVy
W3N0cmluZ0xlbmd0aF0gPSAwOworICAgIDo6R2xvYmFsVW5sb2NrKG1lZGl1bS5oR2xvYmFsKTsK
KyAgICBkYXRhLT5TZXREYXRhKGZvcm1hdCwgJm1lZGl1bSwgRkFMU0UpOworICAgIDo6R2xvYmFs
RnJlZShtZWRpdW0uaEdsb2JhbCk7Cit9CisKKyNpZiBQTEFURk9STShDRikKK3ZvaWQgc2V0Q0ZE
YXRhKElEYXRhT2JqZWN0KiBkYXRhLCBGT1JNQVRFVEMqIGZvcm1hdCwgY29uc3QgVmVjdG9yPFN0
cmluZz4mIGRhdGFTdHJpbmdzKQoreworICAgIC8vIFdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4K
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKIH0KICNlbmRpZgogCi12b2lkIGdldENsaXBib2Fy
ZERhdGEoSURhdGFPYmplY3QgKmRhdGFPYmplY3QsIEZPUk1BVEVUQyogZm9ybWF0LCBWZWN0b3I8
U3RyaW5nPiYgZGF0YVN0cmluZ3MpCitzdGF0aWMgY29uc3QgQ2xpcGJvYXJkRm9ybWF0TWFwJiBn
ZXRDbGlwYm9hcmRNYXAoKQogewogICAgIHN0YXRpYyBDbGlwYm9hcmRGb3JtYXRNYXAgZm9ybWF0
TWFwOwogICAgIGlmIChmb3JtYXRNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGZvcm1hdE1hcC5h
ZGQoaHRtbEZvcm1hdCgpLT5jZkZvcm1hdCwgZ2V0VXRmOERhdGEpOwotICAgICAgICBmb3JtYXRN
YXAuYWRkKHRleHRodG1sRm9ybWF0KCktPmNmRm9ybWF0LCBnZXRTdHJpbmdEYXRhPFVDaGFyPik7
Ci0gICAgICAgIGZvcm1hdE1hcC5hZGQocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0LCBnZXRT
dHJpbmdEYXRhPGNoYXI+KTsKLSAgICAgICAgZm9ybWF0TWFwLmFkZChwbGFpblRleHRXRm9ybWF0
KCktPmNmRm9ybWF0LCBnZXRTdHJpbmdEYXRhPFVDaGFyPik7CisgICAgICAgIGZvcm1hdE1hcC5h
ZGQoaHRtbEZvcm1hdCgpLT5jZkZvcm1hdCwgbmV3IENsaXBib2FyZERhdGFJdGVtKGh0bWxGb3Jt
YXQoKSwgZ2V0VXRmOERhdGEsIHNldENoYXJEYXRhKSk7CisgICAgICAgIGZvcm1hdE1hcC5hZGQo
dGV4dGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQsIG5ldyBDbGlwYm9hcmREYXRhSXRlbSh0ZXh0aHRt
bEZvcm1hdCgpLCBnZXRTdHJpbmdEYXRhPFVDaGFyPiwgc2V0VUNoYXJEYXRhKSk7CisgICAgICAg
IGZvcm1hdE1hcC5hZGQocGxhaW5UZXh0Rm9ybWF0KCktPmNmRm9ybWF0LCAgbmV3IENsaXBib2Fy
ZERhdGFJdGVtKHBsYWluVGV4dEZvcm1hdCgpLCBnZXRTdHJpbmdEYXRhPGNoYXI+LCBzZXRDaGFy
RGF0YSkpOworICAgICAgICBmb3JtYXRNYXAuYWRkKHBsYWluVGV4dFdGb3JtYXQoKS0+Y2ZGb3Jt
YXQsICBuZXcgQ2xpcGJvYXJkRGF0YUl0ZW0ocGxhaW5UZXh0V0Zvcm1hdCgpLCBnZXRTdHJpbmdE
YXRhPFVDaGFyPiwgc2V0VUNoYXJEYXRhKSk7CiAjaWYgUExBVEZPUk0oQ0YpCi0gICAgICAgIGZv
cm1hdE1hcC5hZGQoY2ZIRHJvcEZvcm1hdCgpLT5jZkZvcm1hdCwgZ2V0Q2ZEYXRhKTsKKyAgICAg
ICAgZm9ybWF0TWFwLmFkZChjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0LCAgbmV3IENsaXBib2Fy
ZERhdGFJdGVtKGNmSERyb3BGb3JtYXQoKSwgZ2V0Q0ZEYXRhLCBzZXRDRkRhdGEpKTsKICNlbmRp
ZgotICAgICAgICBmb3JtYXRNYXAuYWRkKGZpbGVuYW1lRm9ybWF0KCktPmNmRm9ybWF0LCBnZXRT
dHJpbmdEYXRhPGNoYXI+KTsKLSAgICAgICAgZm9ybWF0TWFwLmFkZChmaWxlbmFtZVdGb3JtYXQo
KS0+Y2ZGb3JtYXQsIGdldFN0cmluZ0RhdGE8VUNoYXI+KTsKLSAgICAgICAgZm9ybWF0TWFwLmFk
ZCh1cmxGb3JtYXQoKS0+Y2ZGb3JtYXQsIGdldFN0cmluZ0RhdGE8Y2hhcj4pOwotICAgICAgICBm
b3JtYXRNYXAuYWRkKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQsIGdldFN0cmluZ0RhdGE8VUNoYXI+
KTsKKyAgICAgICAgZm9ybWF0TWFwLmFkZChmaWxlbmFtZUZvcm1hdCgpLT5jZkZvcm1hdCwgIG5l
dyBDbGlwYm9hcmREYXRhSXRlbShmaWxlbmFtZUZvcm1hdCgpLCBnZXRTdHJpbmdEYXRhPGNoYXI+
LCBzZXRDaGFyRGF0YSkpOworICAgICAgICBmb3JtYXRNYXAuYWRkKGZpbGVuYW1lV0Zvcm1hdCgp
LT5jZkZvcm1hdCwgIG5ldyBDbGlwYm9hcmREYXRhSXRlbShmaWxlbmFtZVdGb3JtYXQoKSwgZ2V0
U3RyaW5nRGF0YTxVQ2hhcj4sIHNldFVDaGFyRGF0YSkpOworICAgICAgICBmb3JtYXRNYXAuYWRk
KHVybEZvcm1hdCgpLT5jZkZvcm1hdCwgIG5ldyBDbGlwYm9hcmREYXRhSXRlbSh1cmxGb3JtYXQo
KSwgZ2V0U3RyaW5nRGF0YTxjaGFyPiwgc2V0Q2hhckRhdGEpKTsKKyAgICAgICAgZm9ybWF0TWFw
LmFkZCh1cmxXRm9ybWF0KCktPmNmRm9ybWF0LCAgbmV3IENsaXBib2FyZERhdGFJdGVtKHVybFdG
b3JtYXQoKSwgZ2V0U3RyaW5nRGF0YTxVQ2hhcj4sIHNldFVDaGFyRGF0YSkpOwogICAgIH0KLSAg
ICBDbGlwYm9hcmRGb3JtYXRNYXA6Oml0ZXJhdG9yIGZvdW5kID0gZm9ybWF0TWFwLmZpbmQoZm9y
bWF0LT5jZkZvcm1hdCk7CisgICAgcmV0dXJuIGZvcm1hdE1hcDsKK30KKwordm9pZCBnZXRDbGlw
Ym9hcmREYXRhKElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBGT1JNQVRFVEMqIGZvcm1hdCwgVmVj
dG9yPFN0cmluZz4mIGRhdGFTdHJpbmdzKQoreworICAgIGNvbnN0IENsaXBib2FyZEZvcm1hdE1h
cCYgZm9ybWF0TWFwID0gZ2V0Q2xpcGJvYXJkTWFwKCk7CisgICAgQ2xpcGJvYXJkRm9ybWF0TWFw
Ojpjb25zdF9pdGVyYXRvciBmb3VuZCA9IGZvcm1hdE1hcC5maW5kKGZvcm1hdC0+Y2ZGb3JtYXQp
OworICAgIGlmIChmb3VuZCA9PSBmb3JtYXRNYXAuZW5kKCkpCisgICAgICAgIHJldHVybjsKKyAg
ICBmb3VuZC0+c2Vjb25kLT5nZXRTdHJpbmcoZGF0YU9iamVjdCwgZm91bmQtPnNlY29uZC0+Zm9y
bWF0LCBkYXRhU3RyaW5ncyk7Cit9CisKK3ZvaWQgc2V0Q2xpcGJvYXJkRGF0YShJRGF0YU9iamVj
dCogZGF0YU9iamVjdCwgVUlOVCBmb3JtYXQsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBkYXRhU3Ry
aW5ncykKK3sKKyAgICBjb25zdCBDbGlwYm9hcmRGb3JtYXRNYXAmIGZvcm1hdE1hcCA9IGdldENs
aXBib2FyZE1hcCgpOworICAgIENsaXBib2FyZEZvcm1hdE1hcDo6Y29uc3RfaXRlcmF0b3IgZm91
bmQgPSBmb3JtYXRNYXAuZmluZChmb3JtYXQpOwogICAgIGlmIChmb3VuZCA9PSBmb3JtYXRNYXAu
ZW5kKCkpCiAgICAgICAgIHJldHVybjsKLSAgICBmb3VuZC0+c2Vjb25kKGRhdGFPYmplY3QsIGZv
cm1hdCwgZGF0YVN0cmluZ3MpOworICAgIGZvdW5kLT5zZWNvbmQtPnNldFN0cmluZyhkYXRhT2Jq
ZWN0LCBmb3VuZC0+c2Vjb25kLT5mb3JtYXQsIGRhdGFTdHJpbmdzKTsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL0NsaXBib2Fy
ZFV0aWxpdGllc1dpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dp
bi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uaAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmgJKHdvcmtpbmcgY29weSkK
QEAgLTc1LDYgKzc1LDcgQEAgU3RyaW5nIGdldENGSFRNTChJRGF0YU9iamVjdCosIGJvb2wmIHN1
YwogU3RyaW5nIGdldENGSFRNTChjb25zdCBEcmFnRGF0YU1hcCopOwogCiB2b2lkIGdldENsaXBi
b2FyZERhdGEoSURhdGFPYmplY3QqLCBGT1JNQVRFVEMqIGZldGMsIFZlY3RvcjxTdHJpbmc+JiBk
YXRhU3RyaW5ncyk7Cit2b2lkIHNldENsaXBib2FyZERhdGEoSURhdGFPYmplY3QqLCBVSU5UIGZv
cm1hdCwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGRhdGFTdHJpbmdzKTsKIAogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0ltYWdl
V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vRHJhZ0lt
YWdlV2luLmNwcAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93
aW4vRHJhZ0ltYWdlV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsMTQgKzI3LDI1IEBACiAj
aW5jbHVkZSAiRHJhZ0ltYWdlLmgiCiAKICNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1
ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJGb250
U2VsZWN0b3IuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgogI2luY2x1ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiUmV0YWluUHRyLmgiCisjaW5jbHVk
ZSAiU2V0dGluZ3MuaCIKKyNpbmNsdWRlICJTdHJpbmdUcnVuY2F0b3IuaCIKKyNpbmNsdWRlICJU
ZXh0UnVuLmgiCisjaW5jbHVkZSAiV2ViQ29yZVRleHRSZW5kZXJlci5oIgogCiAjaW5jbHVkZSA8
d2luZG93cy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK0hCSVRNQVAgYWxsb2NJbWFnZShI
REMsIEludFNpemUsIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiogdGFyZ2V0UmVmKTsKK3ZvaWQg
ZGVhbGxvY0NvbnRleHQoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIHRhcmdldCk7CisKIEludFNp
emUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYgaW1hZ2UpCiB7CiAgICAgaWYgKCFpbWFnZSkK
QEAgLTc5LDUgKzkwLDE0MSBAQCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlSWNvbkZvckNh
Y2hlCiAKICAgICByZXR1cm4gaWNvbkluZm8uaGJtQ29sb3I7CiB9CisKK2NvbnN0IGZsb2F0IERy
YWdMYWJlbEJvcmRlclggPSA0OworLy8gS2VlcCBib3JkZXJfeSBpbiBzeW5jaCB3aXRoIERyYWdD
b250cm9sbGVyOjpMaW5rRHJhZ0JvcmRlckluc2V0LgorY29uc3QgZmxvYXQgRHJhZ0xhYmVsQm9y
ZGVyWSA9IDI7Citjb25zdCBmbG9hdCBEcmFnTGFiZWxSYWRpdXMgPSA1OworY29uc3QgZmxvYXQg
TGFiZWxCb3JkZXJZT2Zmc2V0ID0gMjsKKworY29uc3QgZmxvYXQgTWluRHJhZ0xhYmVsV2lkdGhC
ZWZvcmVDbGlwID0gMTIwOworY29uc3QgZmxvYXQgTWF4RHJhZ0xhYmVsV2lkdGggPSAyMDA7Citj
b25zdCBmbG9hdCBNYXhEcmFnTGFiZWxTdHJpbmdXaWR0aCA9IChNYXhEcmFnTGFiZWxXaWR0aCAt
IDIgKiBEcmFnTGFiZWxCb3JkZXJYKTsKKworY29uc3QgZmxvYXQgRHJhZ0xpbmtMYWJlbEZvbnRz
aXplID0gMTE7Citjb25zdCBmbG9hdCBEcmFnTGlua1VybEZvbnRTaXplID0gMTA7CisKK3N0YXRp
YyBGb250IGRyYWdMYWJlbEZvbnQoaW50IHNpemUsIGJvb2wgYm9sZCwgRm9udFJlbmRlcmluZ01v
ZGUgcmVuZGVyaW5nTW9kZSkKK3sKKyAgICBOT05DTElFTlRNRVRSSUNTIG1ldHJpY3M7CisgICAg
bWV0cmljcy5jYlNpemUgPSBzaXplb2YobWV0cmljcyk7CisgICAgU3lzdGVtUGFyYW1ldGVyc0lu
Zm8oU1BJX0dFVE5PTkNMSUVOVE1FVFJJQ1MsIG1ldHJpY3MuY2JTaXplLCAmbWV0cmljcywgMCk7
CisKKyAgICBGb250RGVzY3JpcHRpb24gZGVzY3JpcHRpb247CisgICAgZGVzY3JpcHRpb24uc2V0
V2VpZ2h0KGJvbGQgPyBGb250V2VpZ2h0Qm9sZCA6IEZvbnRXZWlnaHROb3JtYWwpOworCisgICAg
Rm9udEZhbWlseSBmYW1pbHk7CisgICAgZmFtaWx5LnNldEZhbWlseShtZXRyaWNzLmxmU21DYXB0
aW9uRm9udC5sZkZhY2VOYW1lKTsKKyAgICBkZXNjcmlwdGlvbi5zZXRGYW1pbHkoZmFtaWx5KTsK
KyAgICBkZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKChmbG9hdClzaXplKTsKKyAgICBkZXNj
cmlwdGlvbi5zZXRDb21wdXRlZFNpemUoKGZsb2F0KXNpemUpOworICAgIGRlc2NyaXB0aW9uLnNl
dFJlbmRlcmluZ01vZGUocmVuZGVyaW5nTW9kZSk7CisgICAgRm9udCByZXN1bHQgPSBGb250KGRl
c2NyaXB0aW9uLCAwLCAwKTsgCisgICAgcmVzdWx0LnVwZGF0ZSgwKTsKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCitEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiB1cmws
IGNvbnN0IFN0cmluZyYgaW5MYWJlbCwgRnJhbWUqIGZyYW1lKQoreworICAgIC8vIFRoaXMgaXMg
bW9yZSBvciBsZXNzIGFuIGV4YWN0IG1hdGNoIGZvciB0aGUgTWFjIE9TIFggY29kZS4KKworICAg
IGNvbnN0IEZvbnQqIGxhYmVsRm9udDsKKyAgICBjb25zdCBGb250KiB1cmxGb250OworCisgICAg
aWYgKGZyYW1lLT5zZXR0aW5ncygpICYmIGZyYW1lLT5zZXR0aW5ncygpLT5mb250UmVuZGVyaW5n
TW9kZSgpID09IEFsdGVybmF0ZVJlbmRlcmluZ01vZGUpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0
IEZvbnQgYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZUxhYmVsRm9udCA9IGRyYWdMYWJlbEZvbnQoRHJh
Z0xpbmtMYWJlbEZvbnRzaXplLCB0cnVlLCBBbHRlcm5hdGVSZW5kZXJpbmdNb2RlKTsKKyAgICAg
ICAgc3RhdGljIGNvbnN0IEZvbnQgYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZVVSTEZvbnQgPSBkcmFn
TGFiZWxGb250KERyYWdMaW5rVXJsRm9udFNpemUsIGZhbHNlLCBBbHRlcm5hdGVSZW5kZXJpbmdN
b2RlKTsKKyAgICAgICAgbGFiZWxGb250ID0gJmFsdGVybmF0ZVJlbmRlcmluZ01vZGVMYWJlbEZv
bnQ7CisgICAgICAgIHVybEZvbnQgPSAmYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZVVSTEZvbnQ7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgbm9ybWFsUmVuZGVyaW5nTW9k
ZUxhYmVsRm9udCA9IGRyYWdMYWJlbEZvbnQoRHJhZ0xpbmtMYWJlbEZvbnRzaXplLCB0cnVlLCBO
b3JtYWxSZW5kZXJpbmdNb2RlKTsKKyAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgbm9ybWFsUmVu
ZGVyaW5nTW9kZVVSTEZvbnQgPSBkcmFnTGFiZWxGb250KERyYWdMaW5rVXJsRm9udFNpemUsIGZh
bHNlLCBOb3JtYWxSZW5kZXJpbmdNb2RlKTsKKyAgICAgICAgbGFiZWxGb250ID0gJm5vcm1hbFJl
bmRlcmluZ01vZGVMYWJlbEZvbnQ7CisgICAgICAgIHVybEZvbnQgPSAmbm9ybWFsUmVuZGVyaW5n
TW9kZVVSTEZvbnQ7CisgICAgfQorCisgICAgYm9vbCBkcmF3VVJMU3RyaW5nID0gdHJ1ZTsKKyAg
ICBib29sIGNsaXBVUkxTdHJpbmcgPSBmYWxzZTsKKyAgICBib29sIGNsaXBMYWJlbFN0cmluZyA9
IGZhbHNlOworCisgICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC5zdHJpbmcoKTsgCisgICAgU3Ry
aW5nIGxhYmVsID0gaW5MYWJlbDsKKyAgICBpZiAobGFiZWwuaXNFbXB0eSgpKSB7CisgICAgICAg
IGRyYXdVUkxTdHJpbmcgPSBmYWxzZTsKKyAgICAgICAgbGFiZWwgPSB1cmxTdHJpbmc7CisgICAg
fQorCisgICAgLy8gRmlyc3Qgc3RlcCBpbiBkcmF3aW5nIHRoZSBsaW5rIGRyYWcgaW1hZ2Ugd2lk
dGguCisgICAgVGV4dFJ1biBsYWJlbFJ1bihsYWJlbC5pbXBsKCkpOworICAgIFRleHRSdW4gdXJs
UnVuKHVybFN0cmluZy5pbXBsKCkpOworICAgIEludFNpemUgbGFiZWxTaXplKGxhYmVsRm9udC0+
d2lkdGgobGFiZWxSdW4pLCBsYWJlbEZvbnQtPmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgKyBsYWJl
bEZvbnQtPmZvbnRNZXRyaWNzKCkuZGVzY2VudCgpKTsKKworICAgIGlmIChsYWJlbFNpemUud2lk
dGgoKSA+IE1heERyYWdMYWJlbFN0cmluZ1dpZHRoKSB7CisgICAgICAgIGxhYmVsU2l6ZS5zZXRX
aWR0aChNYXhEcmFnTGFiZWxTdHJpbmdXaWR0aCk7CisgICAgICAgIGNsaXBMYWJlbFN0cmluZyA9
IHRydWU7CisgICAgfQogICAgIAorICAgIEludFNpemUgdXJsU3RyaW5nU2l6ZTsKKyAgICBJbnRT
aXplIGltYWdlU2l6ZShsYWJlbFNpemUud2lkdGgoKSArIERyYWdMYWJlbEJvcmRlclggKiAyLCBs
YWJlbFNpemUuaGVpZ2h0KCkgKyBEcmFnTGFiZWxCb3JkZXJZICogMik7CisKKyAgICBpZiAoZHJh
d1VSTFN0cmluZykgeworICAgICAgICB1cmxTdHJpbmdTaXplLnNldFdpZHRoKHVybEZvbnQtPndp
ZHRoKHVybFJ1bikpOworICAgICAgICB1cmxTdHJpbmdTaXplLnNldEhlaWdodCh1cmxGb250LT5m
b250TWV0cmljcygpLmFzY2VudCgpICsgdXJsRm9udC0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCkp
OyAKKyAgICAgICAgaW1hZ2VTaXplLnNldEhlaWdodChpbWFnZVNpemUuaGVpZ2h0KCkgKyB1cmxT
dHJpbmdTaXplLmhlaWdodCgpKTsKKyAgICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGgoKSA+
IE1heERyYWdMYWJlbFN0cmluZ1dpZHRoKSB7CisgICAgICAgICAgICBpbWFnZVNpemUuc2V0V2lk
dGgoTWF4RHJhZ0xhYmVsV2lkdGgpOworICAgICAgICAgICAgY2xpcFVSTFN0cmluZyA9IHRydWU7
CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaW1hZ2VTaXplLnNldFdpZHRoKHN0ZDo6bWF4
KGxhYmVsU2l6ZS53aWR0aCgpLCB1cmxTdHJpbmdTaXplLndpZHRoKCkpICsgRHJhZ0xhYmVsQm9y
ZGVyWCAqIDIpOworICAgIH0KKworICAgIC8vIFdlIG5vdyBrbm93IGhvdyBiaWcgdGhlIGltYWdl
IG5lZWRzIHRvIGJlLCBzbyB3ZSBjcmVhdGUgYW5kCisgICAgLy8gZmlsbCB0aGUgYmFja2dyb3Vu
ZAorICAgIEhCSVRNQVAgaW1hZ2UgPSAwOworICAgIEhEQyBkYyA9IEdldERDKDApOworICAgIEhE
QyB3b3JraW5nREMgPSBDcmVhdGVDb21wYXRpYmxlREMoZGMpOworICAgIGlmICghd29ya2luZ0RD
KSB7CisgICAgICAgIFJlbGVhc2VEQygwLCBkYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0UmVmOworICAgIGltYWdlID0g
YWxsb2NJbWFnZSh3b3JraW5nREMsIGltYWdlU2l6ZSwgJmNvbnRleHRSZWYpOworICAgIGlmICgh
aW1hZ2UpIHsKKyAgICAgICAgRGVsZXRlREMod29ya2luZ0RDKTsKKyAgICAgICAgUmVsZWFzZURD
KDAsIGRjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICAgICAKKyAgICBTZWxlY3RP
YmplY3Qod29ya2luZ0RDLCBpbWFnZSk7CisgICAgR3JhcGhpY3NDb250ZXh0IGNvbnRleHQoY29u
dGV4dFJlZik7CisgICAgLy8gT24gTWFjIGFscGhhIGlzIHswLjcsIDAuNywgMC43LCAwLjh9LCBo
b3dldmVyIHdlIGNhbid0IGNvbnRyb2wgYWxwaGEKKyAgICAvLyBmb3IgZHJhZyBpbWFnZXMgb24g
d2luLCBzbyB3ZSB1c2UgMQorICAgIHN0YXRpYyBjb25zdCBDb2xvciBiYWNrZ3JvdW5kQ29sb3Io
MTQwLCAxNDAsIDE0MCk7CisgICAgc3RhdGljIGNvbnN0IEludFNpemUgcmFkaWkoRHJhZ0xhYmVs
UmFkaXVzLCBEcmFnTGFiZWxSYWRpdXMpOworICAgIEludFJlY3QgcmVjdCgwLCAwLCBpbWFnZVNp
emUud2lkdGgoKSwgaW1hZ2VTaXplLmhlaWdodCgpKTsKKyAgICBjb250ZXh0LmZpbGxSb3VuZGVk
UmVjdChyZWN0LCByYWRpaSwgcmFkaWksIHJhZGlpLCByYWRpaSwgYmFja2dyb3VuZENvbG9yLCBD
b2xvclNwYWNlRGV2aWNlUkdCKTsKKyAKKyAgICAvLyBEcmF3IHRoZSB0ZXh0CisgICAgc3RhdGlj
IGNvbnN0IENvbG9yIHRvcENvbG9yKDAsIDAsIDAsIDI1NSk7IC8vIG9yaWdpbmFsIGFscGhhID0g
MC43NQorICAgIHN0YXRpYyBjb25zdCBDb2xvciBib3R0b21Db2xvcigyNTUsIDI1NSwgMjU1LCAx
MjcpOyAvLyBvcmlnaW5hbCBhbHBoYSA9IDAuNQorICAgIGlmIChkcmF3VVJMU3RyaW5nKSB7Cisg
ICAgICAgIGlmIChjbGlwVVJMU3RyaW5nKQorICAgICAgICAgICAgdXJsU3RyaW5nID0gU3RyaW5n
VHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKHVybFN0cmluZywgaW1hZ2VTaXplLndpZHRoKCkgLSAo
RHJhZ0xhYmVsQm9yZGVyWCAqIDIuMGYpLCAqdXJsRm9udCwgZmFsc2UpOworICAgICAgICBJbnRQ
b2ludCB0ZXh0UG9zKERyYWdMYWJlbEJvcmRlclgsIGltYWdlU2l6ZS5oZWlnaHQoKSAtIChMYWJl
bEJvcmRlcllPZmZzZXQgKyB1cmxGb250LT5mb250TWV0cmljcygpLmRlc2NlbnQoKSkpOworICAg
ICAgICBXZWJDb3JlRHJhd0RvdWJsZWRUZXh0QXRQb2ludChjb250ZXh0LCB1cmxTdHJpbmcsIHRl
eHRQb3MsICp1cmxGb250LCB0b3BDb2xvciwgYm90dG9tQ29sb3IpOworICAgIH0KKyAgICAKKyAg
ICBpZiAoY2xpcExhYmVsU3RyaW5nKQorICAgICAgICBsYWJlbCA9IFN0cmluZ1RydW5jYXRvcjo6
cmlnaHRUcnVuY2F0ZShsYWJlbCwgaW1hZ2VTaXplLndpZHRoKCkgLSAoRHJhZ0xhYmVsQm9yZGVy
WCAqIDIuMGYpLCAqbGFiZWxGb250LCBmYWxzZSk7CisKKyAgICBJbnRQb2ludCB0ZXh0UG9zKERy
YWdMYWJlbEJvcmRlclgsIERyYWdMYWJlbEJvcmRlclkgKyBsYWJlbEZvbnQtPnBpeGVsU2l6ZSgp
KTsKKyAgICBXZWJDb3JlRHJhd0RvdWJsZWRUZXh0QXRQb2ludChjb250ZXh0LCBsYWJlbCwgdGV4
dFBvcywgKmxhYmVsRm9udCwgdG9wQ29sb3IsIGJvdHRvbUNvbG9yKTsKKworICAgIGRlYWxsb2ND
b250ZXh0KGNvbnRleHRSZWYpOworICAgIERlbGV0ZURDKHdvcmtpbmdEQyk7CisgICAgUmVsZWFz
ZURDKDAsIGRjKTsKKyAgICByZXR1cm4gaW1hZ2U7Cit9CisKIH0KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL3dpbi9XQ0RhdGFPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL3dpbi9XQ0RhdGFPYmplY3QuY3BwCShyZXZpc2lvbiA3NzgyNCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9XQ0RhdGFPYmplY3QuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiV0NE
YXRhT2JqZWN0LmgiCiAKKyNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKKyNpbmNs
dWRlICJEcmFnRGF0YS5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKQEAgLTE2MCw2ICsxNjIsMTcgQEAgSFJFU1VMVCBXQ0RhdGFPYmplY3Q6OmNy
ZWF0ZUluc3RhbmNlKFdDRAogICAgIHJldHVybiBTX09LOwogfQogCitIUkVTVUxUIFdDRGF0YU9i
amVjdDo6Y3JlYXRlSW5zdGFuY2UoV0NEYXRhT2JqZWN0KiogcmVzdWx0LCBjb25zdCBEcmFnRGF0
YU1hcCYgZGF0YU1hcCkKK3sKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIEVfUE9J
TlRFUjsKKyAgICAqcmVzdWx0ID0gbmV3IFdDRGF0YU9iamVjdDsKKworICAgIGZvciAoRHJhZ0Rh
dGFNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZGF0YU1hcC5iZWdpbigpOyBpdCAhPSBkYXRhTWFw
LmVuZCgpOyArK2l0KQorICAgICAgICBzZXRDbGlwYm9hcmREYXRhKCpyZXN1bHQsIGl0LT5maXJz
dCwgaXQtPnNlY29uZCk7CisgICAgcmV0dXJuIFNfT0s7Cit9CisKIFdDRGF0YU9iamVjdDo6V0NE
YXRhT2JqZWN0KCkKIDogbV9yZWYoMSkKIHsKQEAgLTM4MCw1ICszOTMsNCBAQCB2b2lkIFdDRGF0
YU9iamVjdDo6Y2xlYXJEYXRhKENMSVBGT1JNQVQKICAgICB9CiB9CiAKLQogfQpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9XQ0RhdGFPYmplY3QuaAkocmV2aXNpb24gNzc4MjQp
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vV0NEYXRhT2JqZWN0LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI2LDEwICsyNiwxMSBAQAogI2lmbmRlZiBXQ0RhdGFPYmplY3RfaAogI2RlZmlu
ZSBXQ0RhdGFPYmplY3RfaAogCi0jaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KLSNpbmNsdWRlIDx3
dGYvVmVjdG9yLmg+CisjaW5jbHVkZSAiRHJhZ0RhdGEuaCIKICNpbmNsdWRlIDxTaGxPYmouaD4K
ICNpbmNsdWRlIDxvYmppZGwuaD4KKyNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC01Niw2ICs1Nyw3IEBA
IHB1YmxpYzoKICAgICB2b2lkIGNsZWFyRGF0YShDTElQRk9STUFUKTsKICAgICAKICAgICBzdGF0
aWMgSFJFU1VMVCBjcmVhdGVJbnN0YW5jZShXQ0RhdGFPYmplY3QqKik7CisgICAgc3RhdGljIEhS
RVNVTFQgY3JlYXRlSW5zdGFuY2UoV0NEYXRhT2JqZWN0KiosIGNvbnN0IERyYWdEYXRhTWFwJik7
CiBwcml2YXRlOgogICAgIFdDRGF0YU9iamVjdCgpOwogICAgIHZpcnR1YWwgfldDRGF0YU9iamVj
dCgpOwpJbmRleDogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJLaXQyL0NoYW5nZUxvZwkocmV2aXNpb24gNzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSw0MyBAQAorMjAxMS0wMi0wNyAgRW5y
aWNhIENhc3VjY2kgIDxlbnJpY2FAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFdlYktpdDI6IGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBv
biBXaW5kb3dzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NTI3NzUKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzg1MTQ0MDk+CisgICAgICAgIAorICAg
ICAgICBUaGlzIHBhdGNoIGNvbnRhaW5zIHRoZSByZW1haW5pbmcgd29yayB0byBzdXBwb3J0Cisg
ICAgICAgIGEgV2ViS2l0IHdpbmRvdyBhcyBkcmFnIHNvdXJjZSBvbiBXaW5kb3dzLgorICAgICAg
ICBJJ3ZlIGFkZGVkIHRoZSBjb2RlIHRvIGdlbmVyYXRlIHRoZSBpbWFnZSBmb3IgZHJhZ2dpbmcg
YSBsaW5rIGFzCisgICAgICAgIHdlbGwgYXMgdGhlIHN0ZXBzIG5lY2Vzc2FyeSB0byBwYWNrYWdl
IHRoZSBIQklUTUFQIGludG8gYSBTaGFyZWRNZW1vcnkKKyAgICAgICAgb2JqZWN0IGFuZCBzZW5k
IGl0IG92ZXIgdG8gdGhlIFVJIHByb2Nlc3Mgd2hlcmUgRG9EcmFnRHJvcCBpcyBwZXJmb3JtZWQu
CisKKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcDoKKyAgICAgICAgKFdlYktp
dDo6V2ViUGFnZVByb3h5OjpzZXREcmFnSW1hZ2UpOgorICAgICAgICAoV2ViS2l0OjpXZWJQYWdl
UHJveHk6OnN0YXJ0RHJhZ0Ryb3ApOgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJQYWdlUHJveHku
aDoKKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluOgorICAgICAg
ICAqIFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHA6CisgICAgICAg
IChXZWJLaXQ6OldlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyk6IE1hZGUgc3RhcnREcmFnIGZvcgor
ICAgICAgICBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBXaW5kb3dzIGFuZCBNYWMuCisgICAgICAgICog
V2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50Lmg6CisgICAgICAgICogV2Vi
UHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9tYWMvV2ViRHJhZ0NsaWVudE1hYy5tbToKKyAgICAgICAg
KFdlYktpdDo6V2ViRHJhZ0NsaWVudDo6c3RhcnREcmFnKToKKyAgICAgICAgKiBXZWJQcm9jZXNz
L1dlYkNvcmVTdXBwb3J0L3dpbi9XZWJEcmFnQ2xpZW50V2luLmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJLaXQ6OmRyYWdnaW5nU291cmNlT3BlcmF0aW9uTWFza1RvRHJhZ0N1cnNvcnMpOgorICAg
ICAgICAoV2ViS2l0OjpXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcpOgorICAgICAgICAqIFdlYlBy
b2Nlc3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdTb3VyY2UuY3BwOiBBZGRlZC4KKyAgICAg
ICAgVGhpcyBvYmplY3QgaW1wbGVtZW50cyB0aGUgSURyb3BTb3VyY2UgaW50ZXJmYWNlLgorICAg
ICAgICAoV2ViRHJhZ1NvdXJjZTo6Y3JlYXRlSW5zdGFuY2UpOgorICAgICAgICAoV2ViRHJhZ1Nv
dXJjZTo6V2ViRHJhZ1NvdXJjZSk6CisgICAgICAgIChXZWJEcmFnU291cmNlOjpRdWVyeUludGVy
ZmFjZSk6CisgICAgICAgIChXZWJEcmFnU291cmNlOjpBZGRSZWYpOgorICAgICAgICAoV2ViRHJh
Z1NvdXJjZTo6UmVsZWFzZSk6CisgICAgICAgIChXZWJEcmFnU291cmNlOjpRdWVyeUNvbnRpbnVl
RHJhZyk6CisgICAgICAgIChXZWJEcmFnU291cmNlOjpHaXZlRmVlZGJhY2spOgorICAgICAgICAq
IFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdTb3VyY2UuaDogQWRkZWQuCisg
ICAgICAgICogd2luL1dlYktpdDIudmNwcm9qOgorCiAyMDExLTAyLTA3ICBBZGFtIFJvYmVuICA8
YXJvYmVuQGFwcGxlLmNvbT4KIAogICAgICAgICBVc2UgdGhlIHJpZ2h0IGNhbGxpbmcgY29udmVu
dGlvbiB3aGVuIGNhbGxpbmcgV2ViS2l0TWFpbgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL1dlYlBhZ2VQcm94eS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL1dlYlBhZ2VQcm94eS5jcHAJKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY2LDYgKzY2LDEz
IEBACiAjaW5jbHVkZSAiV2ViUHJvdGVjdGlvblNwYWNlLmgiCiAjaW5jbHVkZSAiV2ViU2VjdXJp
dHlPcmlnaW4uaCIKICNpbmNsdWRlICJXZWJVUkxSZXF1ZXN0LmgiCisjaWYgUExBVEZPUk0oV0lO
KQorI2luY2x1ZGUgIldlYkRyYWdTb3VyY2UuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0JpdG1hcElu
Zm8uaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0NPTVB0ci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvV0NE
YXRhT2JqZWN0Lmg+CisjaW5jbHVkZSA8c2hsb2JqLmg+CisjZW5kaWYKICNpbmNsdWRlIDxXZWJD
b3JlL0RyYWdEYXRhLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GbG9hdFJlY3QuaD4KICNpbmNsdWRl
IDxXZWJDb3JlL01JTUVUeXBlUmVnaXN0cnkuaD4KQEAgLTY2Miw2ICs2NjksNjMgQEAgdm9pZCBX
ZWJQYWdlUHJveHk6OnNldERyYWdJbWFnZShjb25zdCBXZQogfQogI2VuZGlmCiAKKyNpZiBQTEFU
Rk9STShXSU4pCisKK3ZvaWQgV2ViUGFnZVByb3h5OjpzdGFydERyYWdEcm9wKGNvbnN0IEludFBv
aW50JiBpbWFnZU9yaWdpbiwgY29uc3QgSW50UG9pbnQmIGRyYWdQb2ludCwgdWludDY0X3Qgb2tF
ZmZlY3QsIAorICAgIEhhc2hNYXA8VUlOVCwgVmVjdG9yPFN0cmluZz4gPiBkYXRhTWFwLCBjb25z
dCBJbnRTaXplJiBkcmFnSW1hZ2VTaXplLCBjb25zdCBTaGFyZWRNZW1vcnk6OkhhbmRsZSYgZHJh
Z0ltYWdlSGFuZGxlLCBib29sIGlzTGlua0RyYWcpCit7CisgICAgQ09NUHRyPFdDRGF0YU9iamVj
dD4gZGF0YU9iamVjdDsKKyAgICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3RhbmNlKCZkYXRhT2Jq
ZWN0LCBkYXRhTWFwKTsKKworICAgIFJlZlB0cjxTaGFyZWRNZW1vcnk+IG1lbW9yeUJ1ZmZlciA9
IFNoYXJlZE1lbW9yeTo6Y3JlYXRlKGRyYWdJbWFnZUhhbmRsZSwgU2hhcmVkTWVtb3J5OjpSZWFk
T25seSk7CisgICAgaWYgKCFtZW1vcnlCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworICAgIFJl
ZlB0cjxXZWJEcmFnU291cmNlPiBzb3VyY2UgPSBXZWJEcmFnU291cmNlOjpjcmVhdGVJbnN0YW5j
ZSgpOworICAgIGlmICghc291cmNlKQorICAgICAgICByZXR1cm47CisKKyAgICBDT01QdHI8SURy
YWdTb3VyY2VIZWxwZXI+IGhlbHBlcjsKKyAgICBpZiAoRkFJTEVEKDo6Q29DcmVhdGVJbnN0YW5j
ZShDTFNJRF9EcmFnRHJvcEhlbHBlciwgMCwgQ0xTQ1RYX0lOUFJPQ19TRVJWRVIsIElJRF9JRHJh
Z1NvdXJjZUhlbHBlciwgcmVpbnRlcnByZXRfY2FzdDxMUFZPSUQqPigmaGVscGVyKSkpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBCaXRtYXBJbmZvOjpj
cmVhdGUoZHJhZ0ltYWdlU2l6ZSk7CisgICAgdm9pZCogYml0czsKKyAgICBIQklUTUFQIGhibXAg
PSA6OkNyZWF0ZURJQlNlY3Rpb24oMCwgJmJpdG1hcEluZm8sIERJQl9SR0JfQ09MT1JTLCAmYml0
cywgMCwgMCk7CisgICAgbWVtY3B5KGJpdHMsIG1lbW9yeUJ1ZmZlci0+ZGF0YSgpLCBtZW1vcnlC
dWZmZXItPnNpemUoKSk7CisKKyAgICBTSERSQUdJTUFHRSBzZGk7CisgICAgc2RpLnNpemVEcmFn
SW1hZ2UuY3ggPSBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVdpZHRoOworICAgIHNkaS5zaXplRHJh
Z0ltYWdlLmN5ID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQ7CisgICAgc2RpLmNyQ29s
b3JLZXkgPSAweGZmZmZmZmZmOworICAgIHNkaS5oYm1wRHJhZ0ltYWdlID0gaGJtcDsKKyAgICBz
ZGkucHRPZmZzZXQueCA9IGRyYWdQb2ludC54KCkgLSBpbWFnZU9yaWdpbi54KCk7CisgICAgc2Rp
LnB0T2Zmc2V0LnkgPSBkcmFnUG9pbnQueSgpIC0gaW1hZ2VPcmlnaW4ueSgpOworICAgIGlmIChp
c0xpbmtEcmFnKQorICAgICAgICBzZGkucHRPZmZzZXQueSA9IGJpdG1hcEluZm8uYm1pSGVhZGVy
LmJpSGVpZ2h0IC0gc2RpLnB0T2Zmc2V0Lnk7CisKKyAgICBoZWxwZXItPkluaXRpYWxpemVGcm9t
Qml0bWFwKCZzZGksIGRhdGFPYmplY3QuZ2V0KCkpOworCisgICAgRFdPUkQgZWZmZWN0ID0gRFJP
UEVGRkVDVF9OT05FOworCisgICAgRHJhZ09wZXJhdGlvbiBvcGVyYXRpb24gPSBEcmFnT3BlcmF0
aW9uTm9uZTsKKyAgICBpZiAoOjpEb0RyYWdEcm9wKGRhdGFPYmplY3QuZ2V0KCksIHNvdXJjZS5n
ZXQoKSwgb2tFZmZlY3QsICZlZmZlY3QpID09IERSQUdEUk9QX1NfRFJPUCkgeworICAgICAgICBp
ZiAoZWZmZWN0ICYgRFJPUEVGRkVDVF9DT1BZKQorICAgICAgICAgICAgb3BlcmF0aW9uID0gRHJh
Z09wZXJhdGlvbkNvcHk7CisgICAgICAgIGVsc2UgaWYgKGVmZmVjdCAmIERST1BFRkZFQ1RfTElO
SykKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IERyYWdPcGVyYXRpb25MaW5rOworICAgICAgICBl
bHNlIGlmIChlZmZlY3QgJiBEUk9QRUZGRUNUX01PVkUpCisgICAgICAgICAgICBvcGVyYXRpb24g
PSBEcmFnT3BlcmF0aW9uTW92ZTsKKyAgICB9CisgICAgUE9JTlQgZ2xvYmFsUG9pbnQ7CisgICAg
OjpHZXRDdXJzb3JQb3MoKExQUE9JTlQpJmdsb2JhbFBvaW50KTsKKyAgICBQT0lOVCBsb2NhbFBv
aW50ID0gZ2xvYmFsUG9pbnQ7CisgICAgOjpTY3JlZW5Ub0NsaWVudChtX3BhZ2VDbGllbnQtPm5h
dGl2ZVdpbmRvdygpLCAoTFBQT0lOVCkmbG9jYWxQb2ludCk7CisKKyAgICBkcmFnRW5kZWQobG9j
YWxQb2ludCwgZ2xvYmFsUG9pbnQsIG9wZXJhdGlvbik7Cit9CisjZW5kaWYKKwogdm9pZCBXZWJQ
YWdlUHJveHk6OmRyYWdFbmRlZChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgY2xpZW50UG9zaXRp
b24sIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBnbG9iYWxQb3NpdGlvbiwgdWludDY0X3Qgb3Bl
cmF0aW9uKQogewogICAgIGlmICghaXNWYWxpZCgpKQpJbmRleDogU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL1dlYlBhZ2VQcm94eS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9XZWJQYWdlUHJveHkuaAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvV2ViUGFnZVByb3h5LmgJKHdvcmtpbmcgY29weSkKQEAgLTMwNyw2ICszMDcsOSBA
QCBwdWJsaWM6CiAjaWYgUExBVEZPUk0oTUFDKQogICAgIHZvaWQgc2V0RHJhZ0ltYWdlKGNvbnN0
IFdlYkNvcmU6OkludFBvaW50JiBjbGllbnRQb3NpdGlvbiwgY29uc3QgV2ViQ29yZTo6SW50U2l6
ZSYgaW1hZ2VTaXplLCBjb25zdCBTaGFyZWRNZW1vcnk6OkhhbmRsZSYgZHJhZ0ltYWdlSGFuZGxl
LCBib29sIGlzTGlua0RyYWcpOwogI2VuZGlmCisjaWYgUExBVEZPUk0oV0lOKQorICAgIHZvaWQg
c3RhcnREcmFnRHJvcChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgaW1hZ2VQb2ludCwgY29uc3Qg
V2ViQ29yZTo6SW50UG9pbnQmIGRyYWdQb2ludCwgdWludDY0X3Qgb2tFZmZlY3QsIEhhc2hNYXA8
VUlOVCwgVmVjdG9yPFN0cmluZz4+IGRhdGFNYXAsIGNvbnN0IFdlYkNvcmU6OkludFNpemUmIGRy
YWdJbWFnZVNpemUsIGNvbnN0IFNoYXJlZE1lbW9yeTo6SGFuZGxlJiBkcmFnSW1hZ2VIYW5kbGUs
IGJvb2wgaXNMaW5rRHJhZyk7CisjZW5kaWYKICAgICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKENv
cmVJUEM6OkNvbm5lY3Rpb24qLCBDb3JlSVBDOjpNZXNzYWdlSUQsIENvcmVJUEM6OkFyZ3VtZW50
RGVjb2RlciopOwogICAgIHZvaWQgZGlkUmVjZWl2ZVN5bmNNZXNzYWdlKENvcmVJUEM6OkNvbm5l
Y3Rpb24qLCBDb3JlSVBDOjpNZXNzYWdlSUQsIENvcmVJUEM6OkFyZ3VtZW50RGVjb2RlciosIENv
cmVJUEM6OkFyZ3VtZW50RW5jb2RlciopOwogCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkubWVzc2FnZXMuaW4JKHJldmlzaW9uIDc3ODI0KQorKysg
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5pbgkod29ya2lu
ZyBjb3B5KQpAQCAtMTk5LDQgKzE5OSw3IEBAIG1lc3NhZ2VzIC0+IFdlYlBhZ2VQcm94eSB7CiAj
aWYgUExBVEZPUk0oTUFDKQogICAgIFNldERyYWdJbWFnZShXZWJDb3JlOjpJbnRQb2ludCBjbGll
bnRQb3NpdGlvbiwgV2ViQ29yZTo6SW50U2l6ZSBpbWFnZVNpemUsIFdlYktpdDo6U2hhcmVkTWVt
b3J5OjpIYW5kbGUgZHJhZ0ltYWdlLCBib29sIGxpbmtEcmFnKQogI2VuZGlmCisjaWYgUExBVEZP
Uk0oV0lOKQorICAgIFN0YXJ0RHJhZ0Ryb3AoV2ViQ29yZTo6SW50UG9pbnQgaW1hZ2VQb2ludCwg
V2ViQ29yZTo6SW50UG9pbnQgZHJhZ1BvaW50LCB1aW50NjRfdCBva0VmZmVjdCwgSGFzaE1hcDxV
SU5ULFZlY3RvcjxTdHJpbmc+PiBkYXRhTWFwLCBXZWJDb3JlOjpJbnRTaXplIGRyYWdJbWFnZVNp
emUsIFdlYktpdDo6U2hhcmVkTWVtb3J5OjpIYW5kbGUgZHJhZ0ltYWdlLCBib29sIGxpbmtEcmFn
KQorI2VuZGlmCiB9CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBw
b3J0L1dlYkRyYWdDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlBy
b2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHAJKHJldmlzaW9uIDc3ODI0KQor
KysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTEsMTYgKzUxLDEwIEBAIERyYWdTb3VyY2VBY3Rpb24g
V2ViRHJhZ0NsaWVudDo6ZHJhZ1NvdXIKICAgICByZXR1cm4gRHJhZ1NvdXJjZUFjdGlvbkFueTsK
IH0KIAotI2lmICFQTEFURk9STShNQUMpCisjaWYgIVBMQVRGT1JNKE1BQykgJiYgIVBMQVRGT1JN
KFdJTikKIHZvaWQgV2ViRHJhZ0NsaWVudDo6c3RhcnREcmFnKERyYWdJbWFnZVJlZiwgY29uc3Qg
SW50UG9pbnQmLCBjb25zdCBJbnRQb2ludCYsIENsaXBib2FyZCosIEZyYW1lKiwgYm9vbCkKIHsK
IH0KLQotRHJhZ0ltYWdlUmVmIFdlYkRyYWdDbGllbnQ6OmNyZWF0ZURyYWdJbWFnZUZvckxpbmso
S1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwot
ICAgIHJldHVybiAwOwotfQogI2VuZGlmCiAKIHZvaWQgV2ViRHJhZ0NsaWVudDo6ZHJhZ0NvbnRy
b2xsZXJEZXN0cm95ZWQoKQpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3Jl
U3VwcG9ydC9XZWJEcmFnQ2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2Vi
UHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmgJKHJldmlzaW9uIDc3ODI0KQor
KysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDcgKzQ2LDYgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFs
IFdlYkNvcmU6OkRyYWdTb3VyY2VBY3Rpb24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChj
b25zdCBXZWJDb3JlOjpJbnRQb2ludCYgd2luZG93UG9pbnQpOwogCiAgICAgdmlydHVhbCB2b2lk
IHN0YXJ0RHJhZyhXZWJDb3JlOjpEcmFnSW1hZ2VSZWYgZHJhZ0ltYWdlLCBjb25zdCBXZWJDb3Jl
OjpJbnRQb2ludCYgZHJhZ0ltYWdlT3JpZ2luLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZXZl
bnRQb3MsIFdlYkNvcmU6OkNsaXBib2FyZCosIFdlYkNvcmU6OkZyYW1lKiwgYm9vbCBsaW5rRHJh
ZyA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdJbWFnZVJlZiBjcmVhdGVEcmFn
SW1hZ2VGb3JMaW5rKFdlYkNvcmU6OktVUkwmLCBjb25zdCBTdHJpbmcmIGxhYmVsLCBXZWJDb3Jl
OjpGcmFtZSopOwogCiAjaWYgUExBVEZPUk0oTUFDKQogICAgIHZpcnR1YWwgdm9pZCBkZWNsYXJl
QW5kV3JpdGVEcmFnSW1hZ2UoTlNQYXN0ZWJvYXJkKiwgRE9NRWxlbWVudCosIE5TVVJMKiwgTlNT
dHJpbmcqLCBXZWJDb3JlOjpGcmFtZSopOwpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vz
cy9XZWJDb3JlU3VwcG9ydC9tYWMvV2ViRHJhZ0NsaWVudE1hYy5tbQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L21hYy9XZWJEcmFnQ2xpZW50
TWFjLm1tCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2Vi
Q29yZVN1cHBvcnQvbWFjL1dlYkRyYWdDbGllbnRNYWMubW0JKHdvcmtpbmcgY29weSkKQEAgLTQ3
LDE4ICs0Nyw2IEBAIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBuYW1lc3BhY2UgV2ViS2l0
IHsKIAotY29uc3QgZmxvYXQgRHJhZ0xhYmVsQm9yZGVyWCA9IDQ7Ci0vL0tlZXAgYm9yZGVyX3kg
aW4gc3luY2ggd2l0aCBEcmFnQ29udHJvbGxlcjo6TGlua0RyYWdCb3JkZXJJbnNldAotY29uc3Qg
ZmxvYXQgRHJhZ0xhYmVsQm9yZGVyWSA9IDI7Ci1jb25zdCBmbG9hdCBEcmFnTGFiZWxSYWRpdXMg
PSA1OwotY29uc3QgZmxvYXQgTGFiZWxCb3JkZXJZT2Zmc2V0ID0gMjsKLQotY29uc3QgZmxvYXQg
TWluRHJhZ0xhYmVsV2lkdGhCZWZvcmVDbGlwID0gMTIwOwotY29uc3QgZmxvYXQgTWF4RHJhZ0xh
YmVsV2lkdGggPSAzMjA7Ci0KLWNvbnN0IGZsb2F0IERyYWdMaW5rTGFiZWxGb250c2l6ZSA9IDEx
OwotY29uc3QgZmxvYXQgRHJhZ0xpbmtVcmxGb250U2l6ZSA9IDEwOwotCiB1c2luZyBuYW1lc3Bh
Y2UgV2ViQ29yZTsKIAogc3RhdGljIEZvbnQmIGZvbnRGcm9tTlNGb250KE5TRm9udCAqZm9udCkK
QEAgLTEwMCw4OCArODgsNiBAQCB2b2lkIFdlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyhEcmFnSW1h
Z2VSCiAgICAgbV9wYWdlLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6OlNldERyYWdJbWFn
ZShjbGllbnRQb2ludCwgSW50U2l6ZShbZHJhZ05TSW1hZ2Ugc2l6ZV0pLCBoYW5kbGUsIGxpbmtE
cmFnKSk7CiB9CiAKLURyYWdJbWFnZVJlZiBXZWJEcmFnQ2xpZW50OjpjcmVhdGVEcmFnSW1hZ2VG
b3JMaW5rKEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqIGZyYW1lKQotewot
ICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiBuaWw7Ci0gICAgTlNTdHJpbmcgKmxhYmVs
ID0gMDsKLSAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkKLSAgICAgICAgbGFiZWwgPSB0aXRsZTsK
LSAgICBOU1VSTCAqY29jb2FVUkwgPSB1cmw7Ci0gICAgTlNTdHJpbmcgKnVybFN0cmluZyA9IFtj
b2NvYVVSTCBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nXTsKLSAgICAKLSAgICBCT09MIGRyYXdVUkxT
dHJpbmcgPSBZRVM7Ci0gICAgQk9PTCBjbGlwVVJMU3RyaW5nID0gTk87Ci0gICAgQk9PTCBjbGlw
TGFiZWxTdHJpbmcgPSBOTzsKLSAgICAKLSAgICBpZiAoIWxhYmVsKSB7Ci0gICAgICAgIGRyYXdV
UkxTdHJpbmcgPSBOTzsKLSAgICAgICAgbGFiZWwgPSB1cmxTdHJpbmc7Ci0gICAgfQotICAgIAot
ICAgIE5TRm9udCAqbGFiZWxGb250ID0gW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2Vy
XSBjb252ZXJ0Rm9udDpbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6RHJhZ0xpbmtMYWJlbEZvbnRz
aXplXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0b0hhdmVUcmFpdDpOU0JvbGRGb250TWFza107Ci0gICAgTlNGb250ICp1cmxGb250
ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOkRyYWdMaW5rVXJsRm9udFNpemVdOwotICAgIE5T
U2l6ZSBsYWJlbFNpemU7Ci0gICAgbGFiZWxTaXplLndpZHRoID0gW2xhYmVsIF93ZWJfd2lkdGhX
aXRoRm9udDogbGFiZWxGb250XTsKLSAgICBsYWJlbFNpemUuaGVpZ2h0ID0gW2xhYmVsRm9udCBh
c2NlbmRlcl0gLSBbbGFiZWxGb250IGRlc2NlbmRlcl07Ci0gICAgaWYgKGxhYmVsU2l6ZS53aWR0
aCA+IE1heERyYWdMYWJlbFdpZHRoKXsKLSAgICAgICAgbGFiZWxTaXplLndpZHRoID0gTWF4RHJh
Z0xhYmVsV2lkdGg7Ci0gICAgICAgIGNsaXBMYWJlbFN0cmluZyA9IFlFUzsKLSAgICB9Ci0gICAg
Ci0gICAgTlNTaXplIGltYWdlU2l6ZTsKLSAgICBpbWFnZVNpemUud2lkdGggPSBsYWJlbFNpemUu
d2lkdGggKyBEcmFnTGFiZWxCb3JkZXJYICogMjsKLSAgICBpbWFnZVNpemUuaGVpZ2h0ID0gbGFi
ZWxTaXplLmhlaWdodCArIERyYWdMYWJlbEJvcmRlclkgKiAyOwotICAgIGlmIChkcmF3VVJMU3Ry
aW5nKSB7Ci0gICAgICAgIE5TU2l6ZSB1cmxTdHJpbmdTaXplOwotICAgICAgICB1cmxTdHJpbmdT
aXplLndpZHRoID0gW3VybFN0cmluZyBfd2ViX3dpZHRoV2l0aEZvbnQ6IHVybEZvbnRdOwotICAg
ICAgICB1cmxTdHJpbmdTaXplLmhlaWdodCA9IFt1cmxGb250IGFzY2VuZGVyXSAtIFt1cmxGb250
IGRlc2NlbmRlcl07Ci0gICAgICAgIGltYWdlU2l6ZS5oZWlnaHQgKz0gdXJsU3RyaW5nU2l6ZS5o
ZWlnaHQ7Ci0gICAgICAgIGlmICh1cmxTdHJpbmdTaXplLndpZHRoID4gTWF4RHJhZ0xhYmVsV2lk
dGgpIHsKLSAgICAgICAgICAgIGltYWdlU2l6ZS53aWR0aCA9IG1heChNYXhEcmFnTGFiZWxXaWR0
aCArIERyYWdMYWJlbEJvcmRlclkgKiAyLCBNaW5EcmFnTGFiZWxXaWR0aEJlZm9yZUNsaXApOwot
ICAgICAgICAgICAgY2xpcFVSTFN0cmluZyA9IFlFUzsKLSAgICAgICAgfSBlbHNlCi0gICAgICAg
ICAgICBpbWFnZVNpemUud2lkdGggPSBtYXgobGFiZWxTaXplLndpZHRoICsgRHJhZ0xhYmVsQm9y
ZGVyWCAqIDIsIHVybFN0cmluZ1NpemUud2lkdGggKyBEcmFnTGFiZWxCb3JkZXJYICogMik7Ci0g
ICAgfQotICAgIE5TSW1hZ2UgKmRyYWdJbWFnZSA9IFtbW05TSW1hZ2UgYWxsb2NdIGluaXRXaXRo
U2l6ZTogaW1hZ2VTaXplXSBhdXRvcmVsZWFzZV07Ci0gICAgW2RyYWdJbWFnZSBsb2NrRm9jdXNd
OwotICAgIAotICAgIFtbTlNDb2xvciBjb2xvcldpdGhEZXZpY2VSZWQ6IDAuN2YgZ3JlZW46IDAu
N2YgYmx1ZTogMC43ZiBhbHBoYTogMC44Zl0gc2V0XTsKLSAgICAKLSAgICAvLyBEcmFnIGEgcmVj
dGFuZ2xlIHdpdGggcm91bmRlZCBjb3JuZXJzCi0gICAgTlNCZXppZXJQYXRoICpwYXRoID0gW05T
QmV6aWVyUGF0aCBiZXppZXJQYXRoXTsKLSAgICBbcGF0aCBhcHBlbmRCZXppZXJQYXRoV2l0aE92
YWxJblJlY3Q6IE5TTWFrZVJlY3QoMCwgMCwgRHJhZ0xhYmVsUmFkaXVzICogMiwgRHJhZ0xhYmVs
UmFkaXVzICogMildOwotICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoT3ZhbEluUmVjdDog
TlNNYWtlUmVjdCgwLCBpbWFnZVNpemUuaGVpZ2h0IC0gRHJhZ0xhYmVsUmFkaXVzICogMiwgRHJh
Z0xhYmVsUmFkaXVzICogMiwgRHJhZ0xhYmVsUmFkaXVzICogMildOwotICAgIFtwYXRoIGFwcGVu
ZEJlemllclBhdGhXaXRoT3ZhbEluUmVjdDogTlNNYWtlUmVjdChpbWFnZVNpemUud2lkdGggLSBE
cmFnTGFiZWxSYWRpdXMgKiAyLCBpbWFnZVNpemUuaGVpZ2h0IC0gRHJhZ0xhYmVsUmFkaXVzICog
MiwgRHJhZ0xhYmVsUmFkaXVzICogMiwgRHJhZ0xhYmVsUmFkaXVzICogMildOwotICAgIFtwYXRo
IGFwcGVuZEJlemllclBhdGhXaXRoT3ZhbEluUmVjdDogTlNNYWtlUmVjdChpbWFnZVNpemUud2lk
dGggLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCAwLCBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFi
ZWxSYWRpdXMgKiAyKV07Ci0gICAgCi0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhSZWN0
OiBOU01ha2VSZWN0KERyYWdMYWJlbFJhZGl1cywgMCwgaW1hZ2VTaXplLndpZHRoIC0gRHJhZ0xh
YmVsUmFkaXVzICogMiwgaW1hZ2VTaXplLmhlaWdodCldOwotICAgIFtwYXRoIGFwcGVuZEJlemll
clBhdGhXaXRoUmVjdDogTlNNYWtlUmVjdCgwLCBEcmFnTGFiZWxSYWRpdXMsIERyYWdMYWJlbFJh
ZGl1cyArIDEwLCBpbWFnZVNpemUuaGVpZ2h0IC0gMiAqIERyYWdMYWJlbFJhZGl1cyldOwotICAg
IFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoUmVjdDogTlNNYWtlUmVjdChpbWFnZVNpemUud2lk
dGggLSBEcmFnTGFiZWxSYWRpdXMgLSAyMCwgRHJhZ0xhYmVsUmFkaXVzLCBEcmFnTGFiZWxSYWRp
dXMgKyAyMCwgaW1hZ2VTaXplLmhlaWdodCAtIDIgKiBEcmFnTGFiZWxSYWRpdXMpXTsKLSAgICBb
cGF0aCBmaWxsXTsKLSAgICAKLSAgICBOU0NvbG9yICp0b3BDb2xvciA9IFtOU0NvbG9yIGNvbG9y
V2l0aERldmljZVdoaXRlOjAuMGYgYWxwaGE6MC43NWZdOwotICAgIE5TQ29sb3IgKmJvdHRvbUNv
bG9yID0gW05TQ29sb3IgY29sb3JXaXRoRGV2aWNlV2hpdGU6MS4wZiBhbHBoYTowLjVmXTsKLSAg
ICBpZiAoZHJhd1VSTFN0cmluZykgewotICAgICAgICBpZiAoY2xpcFVSTFN0cmluZykKLSAgICAg
ICAgICAgIC8vdXJsU3RyaW5nID0gW1dlYlN0cmluZ1RydW5jYXRvciBjZW50ZXJUcnVuY2F0ZVN0
cmluZzogdXJsU3RyaW5nIHRvV2lkdGg6aW1hZ2VTaXplLndpZHRoIC0gKERyYWdMYWJlbEJvcmRl
clggKiAyKSB3aXRoRm9udDp1cmxGb250XTsKLSAgICAgICAgICAgIHVybFN0cmluZyA9IFN0cmlu
Z1RydW5jYXRvcjo6Y2VudGVyVHJ1bmNhdGUodXJsU3RyaW5nLCBpbWFnZVNpemUud2lkdGggLSAo
RHJhZ0xhYmVsQm9yZGVyWCAqIDIpLCBmb250RnJvbU5TRm9udCh1cmxGb250KSk7ICAgICAgIAot
ICAgICAgICBbdXJsU3RyaW5nIF93ZWJfZHJhd0RvdWJsZWRBdFBvaW50Ok5TTWFrZVBvaW50KERy
YWdMYWJlbEJvcmRlclgsIERyYWdMYWJlbEJvcmRlclkgLSBbdXJsRm9udCBkZXNjZW5kZXJdKSAK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhUb3BDb2xvcjp0b3BDb2xvciBib3R0
b21Db2xvcjpib3R0b21Db2xvciBmb250OnVybEZvbnRdOwotICAgIH0KLSAgICAKLSAgICBpZiAo
Y2xpcExhYmVsU3RyaW5nKQotICAgICAgICAvL2xhYmVsID0gW1dlYlN0cmluZ1RydW5jYXRvciBy
aWdodFRydW5jYXRlU3RyaW5nOiBsYWJlbCB0b1dpZHRoOmltYWdlU2l6ZS53aWR0aCAtIChEcmFn
TGFiZWxCb3JkZXJYICogMikgd2l0aEZvbnQ6bGFiZWxGb250XTsKLSAgICAgICAgbGFiZWwgPSBT
dHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUobGFiZWwsIGltYWdlU2l6ZS53aWR0aCAtIChE
cmFnTGFiZWxCb3JkZXJYICogMiksIGZvbnRGcm9tTlNGb250KGxhYmVsRm9udCkpOwotICAgIFts
YWJlbCBfd2ViX2RyYXdEb3VibGVkQXRQb2ludDpOU01ha2VQb2ludCAoRHJhZ0xhYmVsQm9yZGVy
WCwgaW1hZ2VTaXplLmhlaWdodCAtIExhYmVsQm9yZGVyWU9mZnNldCAtIFtsYWJlbEZvbnQgcG9p
bnRTaXplXSkKLSAgICAgICAgICAgICAgICAgICAgICB3aXRoVG9wQ29sb3I6dG9wQ29sb3IgYm90
dG9tQ29sb3I6Ym90dG9tQ29sb3IgZm9udDpsYWJlbEZvbnRdOwotICAgIAotICAgIFtkcmFnSW1h
Z2UgdW5sb2NrRm9jdXNdOwotICAgIAotICAgIHJldHVybiBkcmFnSW1hZ2U7Ci19Ci0KIHN0YXRp
YyB2b2lkIHdyaXRlVVJMKE5TUGFzdGVib2FyZCogcGFzdGVib2FyZCwgTlNVUkwqIFVSTCwgTlNT
dHJpbmcqIHRpdGxlLCBOU0FycmF5KiB0eXBlcykKIHsKICAgICBBU1NFUlQoVVJMKTsKSW5kZXg6
IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdDbGll
bnRXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29y
ZVN1cHBvcnQvd2luL1dlYkRyYWdDbGllbnRXaW4uY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNl
L1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ0NsaWVudFdpbi5j
cHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO
RVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiV2ViRHJhZ0NsaWVudC5oIgorCisjaW5jbHVkZSAiU2hhcmVh
YmxlQml0bWFwLmgiCisjaW5jbHVkZSAiV2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgiCisjaW5jbHVk
ZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VQcm94eU1lc3NhZ2VzLmgiCisjaW5jbHVk
ZSA8V2ViQ29yZS9CaXRtYXBJbmZvLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL0NsaXBib2FyZFdpbi5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0Nv
bnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ZyYW1lLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9HcmFwaGljc0NvbnRleHQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BhZ2UuaD4KKyNpbmNsdWRl
IDxzaGxvYmouaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJL
aXQgeworCitzdGF0aWMgRFdPUkQgZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrVG9EcmFnQ3Vy
c29ycyhEcmFnT3BlcmF0aW9uIG9wKQoreworICAgIERXT1JEIHJlc3VsdCA9IERST1BFRkZFQ1Rf
Tk9ORTsKKyAgICBpZiAob3AgPT0gRHJhZ09wZXJhdGlvbkV2ZXJ5KQorICAgICAgICByZXR1cm4g
RFJPUEVGRkVDVF9DT1BZIHwgRFJPUEVGRkVDVF9MSU5LIHwgRFJPUEVGRkVDVF9NT1ZFOyAKKyAg
ICBpZiAob3AgJiBEcmFnT3BlcmF0aW9uQ29weSkKKyAgICAgICAgcmVzdWx0IHw9IERST1BFRkZF
Q1RfQ09QWTsgCisgICAgaWYgKG9wICYgRHJhZ09wZXJhdGlvbkxpbmspCisgICAgICAgIHJlc3Vs
dCB8PSBEUk9QRUZGRUNUX0xJTks7IAorICAgIGlmIChvcCAmIERyYWdPcGVyYXRpb25Nb3ZlKQor
ICAgICAgICByZXN1bHQgfD0gRFJPUEVGRkVDVF9NT1ZFOworICAgIGlmIChvcCAmIERyYWdPcGVy
YXRpb25HZW5lcmljKQorICAgICAgICByZXN1bHQgfD0gRFJPUEVGRkVDVF9NT1ZFOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgV2ViRHJhZ0NsaWVudDo6c3RhcnREcmFnKERyYWdJbWFn
ZVJlZiBpbWFnZSwgY29uc3QgSW50UG9pbnQmIGltYWdlT3JpZ2luLCBjb25zdCBJbnRQb2ludCYg
ZHJhZ1BvaW50LCBDbGlwYm9hcmQqIGNsaXBib2FyZCwgRnJhbWUqIGZyYW1lLCBib29sIGlzTGlu
aykKK3sKKyAgICBDT01QdHI8SURhdGFPYmplY3Q+IGRhdGFPYmplY3QgPSBzdGF0aWNfY2FzdDxD
bGlwYm9hcmRXaW4qPihjbGlwYm9hcmQpLT5kYXRhT2JqZWN0KCk7CisKKyAgICBpZiAoIWRhdGFP
YmplY3QpCisgICAgICAgIHJldHVybjsKKworICAgIEhEQyBiaXRtYXBEQyA9IENyZWF0ZUNvbXBh
dGlibGVEQygwKTsKKyAgICBCSVRNQVBJTkZPIGJpdG1hcEluZm8gPSB7MH07CisgICAgYml0bWFw
SW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOworICAgIEdl
dERJQml0cyhiaXRtYXBEQywgaW1hZ2UsIDAsIDAsIDAsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NP
TE9SUyk7CisgICAgaWYgKGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZUltYWdlIDw9IDApCisg
ICAgICAgIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpU2l6ZUltYWdlID0gYml0bWFwSW5mby5ibWlI
ZWFkZXIuYmlXaWR0aCAqIGFicyhiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCkgKiAoYml0
bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDcpIC8gODsKKyAgICAKKyAgICBSZWZQdHI8
U2hhcmVkTWVtb3J5PiBtZW1vcnlCdWZmZXIgPSBTaGFyZWRNZW1vcnk6OmNyZWF0ZShiaXRtYXBJ
bmZvLmJtaUhlYWRlci5iaVNpemVJbWFnZSk7CisKKyAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5i
aUNvbXByZXNzaW9uID0gQklfUkdCOworICAgIEdldERJQml0cyhiaXRtYXBEQywgaW1hZ2UsIDAs
IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0LCBtZW1vcnlCdWZmZXItPmRhdGEoKSwgJmJp
dG1hcEluZm8sIERJQl9SR0JfQ09MT1JTKTsgICAgICAgCisgICAgRGVsZXRlREMoYml0bWFwREMp
OworCisgICAgU2hhcmVkTWVtb3J5OjpIYW5kbGUgaGFuZGxlOworICAgIGlmICghbWVtb3J5QnVm
ZmVyLT5jcmVhdGVIYW5kbGUoaGFuZGxlLCBTaGFyZWRNZW1vcnk6OlJlYWRPbmx5KSkKKyAgICAg
ICAgcmV0dXJuOworICAgIERXT1JEIG9rRWZmZWN0ID0gZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25N
YXNrVG9EcmFnQ3Vyc29ycyhtX3BhZ2UtPmNvcmVQYWdlKCktPmRyYWdDb250cm9sbGVyKCktPnNv
dXJjZURyYWdPcGVyYXRpb24oKSk7CisgICAgRHJhZ0RhdGEgZHJhZ0RhdGEoZGF0YU9iamVjdC5n
ZXQoKSwgSW50UG9pbnQoKSwgSW50UG9pbnQoKSwgRHJhZ09wZXJhdGlvbk5vbmUpOworICAgIG1f
cGFnZS0+c2VuZChNZXNzYWdlczo6V2ViUGFnZVByb3h5OjpTdGFydERyYWdEcm9wKGltYWdlT3Jp
Z2luLCBkcmFnUG9pbnQsIG9rRWZmZWN0LCBkcmFnRGF0YS5kcmFnRGF0YU1hcCgpLCBJbnRTaXpl
KGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpV2lkdGgsIGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVp
Z2h0KSwgaGFuZGxlLCBpc0xpbmspLCBtX3BhZ2UtPnBhZ2VJRCgpKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViS2l0CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBw
b3J0L3dpbi9XZWJEcmFnU291cmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9X
ZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L3dpbi9XZWJEcmFnU291cmNlLmNwcAkocmV2aXNpb24g
MCkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRy
YWdTb3VyY2UuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDExIEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJEcmFnU291cmNlLmgiCisKKyNpbmNsdWRl
IDxXZWJDb3JlL0N1cnNvci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0FjdGlvbnMuaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL0V2ZW50SGFuZGxlci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWUu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BhZ2UuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3Jt
TW91c2VFdmVudC5oPgorI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgorCit1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKKworUGFzc1JlZlB0cjxXZWJEcmFnU291cmNlPiBXZWJEcmFnU291cmNl
OjpjcmVhdGVJbnN0YW5jZSgpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBXZWJEcmFnU291
cmNlKTsKK30KKworV2ViRHJhZ1NvdXJjZTo6V2ViRHJhZ1NvdXJjZSgpCit7Cit9CisKK0hSRVNV
TFQgV2ViRHJhZ1NvdXJjZTo6UXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZP
YmplY3QpCit7CisgICAgKnBwdk9iamVjdCA9IDA7CisgICAgaWYgKElzRXF1YWxJSUQocmlpZCwg
SUlEX0lVbmtub3duKSB8fCBJc0VxdWFsSUlEKHJpaWQsIElJRF9JRHJvcFNvdXJjZSkpIHsKKyAg
ICAgICAgKnBwdk9iamVjdCA9IHRoaXM7CisgICAgICAgIEFkZFJlZigpOworCisgICAgICAgIHJl
dHVybiBTX09LOworICAgIH0KKworICAgIHJldHVybiBFX05PSU5URVJGQUNFOworfQorCitVTE9O
RyBXZWJEcmFnU291cmNlOjpBZGRSZWYodm9pZCkKK3sKKyAgICByZWYoKTsKKyAgICByZXR1cm4g
cmVmQ291bnQoKTsKK30KKworVUxPTkcgV2ViRHJhZ1NvdXJjZTo6UmVsZWFzZSh2b2lkKQorewor
ICAgIGRlcmVmKCk7CisgICAgcmV0dXJuIHJlZkNvdW50KCk7Cit9CisKK0hSRVNVTFQgV2ViRHJh
Z1NvdXJjZTo6UXVlcnlDb250aW51ZURyYWcoQk9PTCBmRXNjYXBlUHJlc3NlZCwgRFdPUkQgZ3Jm
U3RhdGUpCit7CisgICAgaWYgKGZFc2NhcGVQcmVzc2VkKQorICAgICAgICByZXR1cm4gRFJBR0RS
T1BfU19DQU5DRUw7CisKKyAgICBpZiAoZ3JmU3RhdGUgJiAoTUtfTEJVVFRPTiB8IE1LX1JCVVRU
T04pKQorICAgICAgICByZXR1cm4gU19PSzsKKworICAgIHJldHVybiBEUkFHRFJPUF9TX0RST1A7
Cit9CisKK0hSRVNVTFQgV2ViRHJhZ1NvdXJjZTo6R2l2ZUZlZWRiYWNrKERXT1JEIGR3RWZmZWN0
KQoreworICAgIHJldHVybiBEUkFHRFJPUF9TX1VTRURFRkFVTFRDVVJTT1JTOworfQpJbmRleDog
U291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJj
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBv
cnQvd2luL1dlYkRyYWdTb3VyY2UuaAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJLaXQyL1dl
YlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdTb3VyY2UuaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBcHBsZSBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFdlYkRyYWdTb3VyY2VfaAorI2Rl
ZmluZSBXZWJEcmFnU291cmNlX2gKKworI2luY2x1ZGUgPFdURi9SZWZDb3VudGVkLmg+CisjaW5j
bHVkZSA8V2ViQ29yZS9DT01QdHIuaD4KKyNpbmNsdWRlIDxvYmppZGwuaD4KKworY2xhc3MgV2Vi
RHJhZ1NvdXJjZSA6IHB1YmxpYyBJRHJvcFNvdXJjZSwgcHVibGljIFJlZkNvdW50ZWQ8V2ViRHJh
Z1NvdXJjZT4geworcHVibGljOgorICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQ
RSBRdWVyeUludGVyZmFjZShSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iamVjdCk7ICAgICAgICAK
KyAgICB2aXJ0dWFsIFVMT05HIFNURE1FVEhPRENBTExUWVBFIEFkZFJlZigpOworICAgIHZpcnR1
YWwgVUxPTkcgU1RETUVUSE9EQ0FMTFRZUEUgUmVsZWFzZSgpOworCisgICAgc3RhdGljIFBhc3NS
ZWZQdHI8V2ViRHJhZ1NvdXJjZT4gY3JlYXRlSW5zdGFuY2UoKTsKK3ByaXZhdGU6CisgICAgdmly
dHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFF1ZXJ5Q29udGludWVEcmFnKEJPT0wgZkVz
Y2FwZVByZXNzZWQsIERXT1JEIGdyZlN0YXRlKTsKKyAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVU
SE9EQ0FMTFRZUEUgR2l2ZUZlZWRiYWNrKERXT1JEIGR3RWZmZWN0KTsKKyAgICBXZWJEcmFnU291
cmNlKCk7Cit9OworCisjZW5kaWYgLy8gIVdlYkRyYWdTb3VyY2VfaApJbmRleDogU291cmNlL1dl
YktpdDIvd2luL1dlYktpdDIudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL3dp
bi9XZWJLaXQyLnZjcHJvagkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0Mi93aW4v
V2ViS2l0Mi52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTE0MzYsNiArMTQzNiwxOCBAQAogCQkJ
CTxGaWx0ZXIKIAkJCQkJTmFtZT0id2luIgogCQkJCQk+CisgICAgICAgICAgPEZpbGUKKyAgICAg
ICAgICAgIFJlbGF0aXZlUGF0aD0iLi5cV2ViUHJvY2Vzc1xXZWJDb3JlU3VwcG9ydFx3aW5cV2Vi
RHJhZ0NsaWVudFdpbi5jcHAiCisgICAgICAgICAgICA+CisgICAgICAgICAgPC9GaWxlPgorICAg
ICAgICAgIDxGaWxlCisgICAgICAgICAgICBSZWxhdGl2ZVBhdGg9Ii4uXFdlYlByb2Nlc3NcV2Vi
Q29yZVN1cHBvcnRcd2luXFdlYkRyYWdTb3VyY2UuY3BwIgorICAgICAgICAgICAgPgorICAgICAg
ICAgIDwvRmlsZT4KKyAgICAgICAgICA8RmlsZQorICAgICAgICAgICAgUmVsYXRpdmVQYXRoPSIu
LlxXZWJQcm9jZXNzXFdlYkNvcmVTdXBwb3J0XHdpblxXZWJEcmFnU291cmNlLmgiCisgICAgICAg
ICAgICA+CisgICAgICAgICAgPC9GaWxlPgogCQkJCQk8RmlsZQogCQkJCQkJUmVsYXRpdmVQYXRo
PSIuLlxXZWJQcm9jZXNzXFdlYkNvcmVTdXBwb3J0XHdpblxXZWJDb250ZXh0TWVudUNsaWVudFdp
bi5jcHAiCiAJCQkJCQk+CkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24g
Nzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5
KQpAQCAtMSwzICsxLDE1IEBACisyMDExLTAyLTA3ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBh
cHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0IG9uIFdpbmRvd3MuCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01Mjc3NQorCisgICAgICAgIFJl
bW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBmcm9tIERyYWdDbGllbnQuCisgICAgICAgIAor
ICAgICAgICAqIHNyYy9EcmFnQ2xpZW50SW1wbC5jcHA6CisgICAgICAgICogc3JjL0RyYWdDbGll
bnRJbXBsLmg6CisKIDIwMTEtMDItMDQgIENoYXJsaWUgUmVpcyAgPGNyZWlzQGNocm9taXVtLm9y
Zz4KIAogICAgICAgICBSZXZpZXdlZCBieSBNaWhhaSBQYXJwYXJpdGEuCkluZGV4OiBTb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3NyYy9EcmFnQ2xpZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvRHJhZ0NsaWVudEltcGwuY3BwCShyZXZpc2lvbiA3Nzgy
NCkKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0RyYWdDbGllbnRJbXBsLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtOTYsMTIgKzk2LDYgQEAgdm9pZCBEcmFnQ2xpZW50SW1wbDo6c3RhcnRE
cmFnKERyYWdJbWFnZQogICAgICAgICBvZmZzZXRQb2ludCk7CiB9CiAKLURyYWdJbWFnZVJlZiBE
cmFnQ2xpZW50SW1wbDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5n
JiBsYWJlbCwgRnJhbWUqKQotewotICAgIC8vIEZJWE1FCi0gICAgcmV0dXJuIDA7Ci19Ci0KIHZv
aWQgRHJhZ0NsaWVudEltcGw6OmRyYWdDb250cm9sbGVyRGVzdHJveWVkKCkKIHsKICAgICAvLyBP
dXIgbGlmZXRpbWUgaXMgYm91bmQgdG8gdGhlIFdlYlZpZXdJbXBsLgpJbmRleDogU291cmNlL1dl
YktpdC9jaHJvbWl1bS9zcmMvRHJhZ0NsaWVudEltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3NyYy9EcmFnQ2xpZW50SW1wbC5oCShyZXZpc2lvbiA3NzgyNCkKKysr
IFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0RyYWdDbGllbnRJbXBsLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTYyLDggKzYyLDYgQEAgcHVibGljOgogICAgICAgICBXZWJDb3JlOjpDbGlwYm9hcmQq
IGNsaXBib2FyZCwKICAgICAgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lLAogICAgICAgICBib29s
IGlzTGlua0RyYWcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnSW1hZ2VSZWYg
Y3JlYXRlRHJhZ0ltYWdlRm9yTGluaygKLSAgICAgICAgV2ViQ29yZTo6S1VSTCYsIGNvbnN0IFdU
Rjo6U3RyaW5nJiBsYWJlbCwgV2ViQ29yZTo6RnJhbWUqKTsKICAgICB2aXJ0dWFsIHZvaWQgZHJh
Z0NvbnRyb2xsZXJEZXN0cm95ZWQoKTsKIAogcHJpdmF0ZToKSW5kZXg6IFNvdXJjZS9XZWJLaXQv
ZWZsL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2VmbC9DaGFuZ2VMb2cJ
KHJldmlzaW9uIDc3ODMzKQorKysgU291cmNlL1dlYktpdC9lZmwvQ2hhbmdlTG9nCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTEtMDItMDcgIEVucmljYSBDYXN1Y2NpICA8ZW5y
aWNhQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBXZWJLaXQyOiBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgb24gV2luZG93cy4KKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyNzc1CisKKyAgICAg
ICAgUmVtb3ZlZCBjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rIGZyb20gRHJhZ0NsaWVudC4KKworICAg
ICAgICAqIFdlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRFZmwuY3BwOgorICAgICAgICAqIFdlYkNv
cmVTdXBwb3J0L0RyYWdDbGllbnRFZmwuaDoKKwogMjAxMS0wMi0wNyAgUGF0cmljayBHYW5zdGVy
ZXIgIDxwYXJvZ2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRyZWFzIEts
aW5nLgpJbmRleDogU291cmNlL1dlYktpdC9lZmwvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEVm
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9lZmwvV2ViQ29yZVN1cHBvcnQvRHJh
Z0NsaWVudEVmbC5jcHAJKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYktpdC9lZmwvV2Vi
Q29yZVN1cHBvcnQvRHJhZ0NsaWVudEVmbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDExICs2
MCw2IEBAIHZvaWQgRHJhZ0NsaWVudEVmbDo6c3RhcnREcmFnKERyYWdJbWFnZVIKICAgICBub3RJ
bXBsZW1lbnRlZCgpOwogfQogCi1EcmFnSW1hZ2VSZWYgRHJhZ0NsaWVudEVmbDo6Y3JlYXRlRHJh
Z0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiBsYWJlbCwgRnJhbWUqKQotewotICAg
IHJldHVybiAwOwotfQotCiB2b2lkIERyYWdDbGllbnRFZmw6OmRyYWdDb250cm9sbGVyRGVzdHJv
eWVkKCkKIHsKICAgICBkZWxldGUgdGhpczsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvZWZsL1dlYkNv
cmVTdXBwb3J0L0RyYWdDbGllbnRFZmwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Vm
bC9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50RWZsLmgJKHJldmlzaW9uIDc3ODI0KQorKysgU291
cmNlL1dlYktpdC9lZmwvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEVmbC5oCSh3b3JraW5nIGNv
cHkpCkBAIC00NSw3ICs0NSw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdT
b3VyY2VBY3Rpb24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJ
bnRQb2ludCYgd2luZG93UG9pbnQpOwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhXZWJD
b3JlOjpEcmFnSW1hZ2VSZWYgZHJhZ0ltYWdlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZHJh
Z0ltYWdlT3JpZ2luLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZXZlbnRQb3MsIFdlYkNvcmU6
OkNsaXBib2FyZCosIFdlYkNvcmU6OkZyYW1lKiwgYm9vbCBsaW5rRHJhZyA9IGZhbHNlKTsKLSAg
ICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rKFdl
YkNvcmU6OktVUkwmLCBjb25zdCBXVEY6OlN0cmluZyYgbGFiZWwsIFdlYkNvcmU6OkZyYW1lKik7
CiAKICAgICB2aXJ0dWFsIHZvaWQgZHJhZ0NvbnRyb2xsZXJEZXN0cm95ZWQoKTsKIH07CkluZGV4
OiBTb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktp
dC9ndGsvQ2hhbmdlTG9nCShyZXZpc2lvbiA3NzgzMykKKysrIFNvdXJjZS9XZWJLaXQvZ3RrL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDExLTAyLTA3ICBFbnJp
Y2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0IG9u
IFdpbmRvd3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD01Mjc3NQorCisgICAgICAgIFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBmcm9tIERy
YWdDbGllbnQuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50R3RrLmNwcDoK
KyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50R3RrLmg6CisKIDIwMTEtMDItMDcg
IE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgogCiAgICAgICAgIFJldmll
d2VkIGJ5IERhbmllbCBCYXRlcy4KSW5kZXg6IFNvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBw
b3J0L0RyYWdDbGllbnRHdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvZ3RrL1dl
YkNvcmVTdXBwb3J0L0RyYWdDbGllbnRHdGsuY3BwCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJj
ZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRHdGsuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xNTEsMTIgKzE1MSw2IEBAIHZvaWQgRHJhZ0NsaWVudDo6ZHJhd0RyYWdJY29uV2lu
ZG93KEd0a1cKICAgICBjYWlyb19maWxsKGNvbnRleHQpOwogfQogCi1EcmFnSW1hZ2VSZWYgRHJh
Z0NsaWVudDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiwgRnJh
bWUqKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIHZvaWQg
RHJhZ0NsaWVudDo6ZHJhZ0NvbnRyb2xsZXJEZXN0cm95ZWQoKQogewogICAgIGRlbGV0ZSB0aGlz
OwpJbmRleDogU291cmNlL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEd0ay5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGll
bnRHdGsuaAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L2d0ay9XZWJDb3JlU3Vw
cG9ydC9EcmFnQ2xpZW50R3RrLmgJKHdvcmtpbmcgY29weSkKQEAgLTUwLDcgKzUwLDYgQEAgbmFt
ZXNwYWNlIFdlYktpdCB7CiAgICAgICAgIHZpcnR1YWwgV2ViQ29yZTo6RHJhZ1NvdXJjZUFjdGlv
biBkcmFnU291cmNlQWN0aW9uTWFza0ZvclBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiB3
aW5kb3dQb2ludCk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhXZWJDb3JlOjpE
cmFnSW1hZ2VSZWYgZHJhZ0ltYWdlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZHJhZ0ltYWdl
T3JpZ2luLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZXZlbnRQb3MsIFdlYkNvcmU6OkNsaXBi
b2FyZCosIFdlYkNvcmU6OkZyYW1lKiwgYm9vbCBsaW5rRHJhZyA9IGZhbHNlKTsKLSAgICAgICAg
dmlydHVhbCBXZWJDb3JlOjpEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhXZWJD
b3JlOjpLVVJMJiwgY29uc3QgV1RGOjpTdHJpbmcmIGxhYmVsLCBXZWJDb3JlOjpGcmFtZSopOwog
CiAgICAgICAgIHZpcnR1YWwgdm9pZCBkcmFnQ29udHJvbGxlckRlc3Ryb3llZCgpOwogCkluZGV4
OiBTb3VyY2UvV2ViS2l0L2hhaWt1L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0L2hhaWt1L0NoYW5nZUxvZwkocmV2aXNpb24gNzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0L2hh
aWt1L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDExLTAyLTA3
ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBw
b3J0IG9uIFdpbmRvd3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD01Mjc3NQorCisgICAgICAgIFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBm
cm9tIERyYWdDbGllbnQuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50SGFp
a3UuY3BwOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRIYWlrdS5oOgorCiAy
MDExLTAyLTA3ICBQYXRyaWNrIEdhbnN0ZXJlciAgPHBhcm9nYUB3ZWJraXQub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IEFuZHJlYXMgS2xpbmcuCkluZGV4OiBTb3VyY2UvV2ViS2l0L2hhaWt1
L1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRIYWlrdS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdC9oYWlrdS9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50SGFpa3UuY3BwCShyZXZpc2lv
biA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQvaGFpa3UvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVu
dEhhaWt1LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjQsMTEgKzY0LDUgQEAgdm9pZCBEcmFnQ2xp
ZW50SGFpa3U6OnN0YXJ0RHJhZyhEcmFnSW1hZwogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAK
LURyYWdJbWFnZVJlZiBEcmFnQ2xpZW50SGFpa3U6OmNyZWF0ZURyYWdJbWFnZUZvckxpbmsoS1VS
TCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAg
IHJldHVybiAwOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IFNvdXJjZS9X
ZWJLaXQvaGFpa3UvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEhhaWt1LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdC9oYWlrdS9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50SGFpa3UuaAko
cmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L2hhaWt1L1dlYkNvcmVTdXBwb3J0L0Ry
YWdDbGllbnRIYWlrdS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw2IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKICAgICAgICAgdmlydHVhbCB2b2lkIHdpbGxQZXJmb3JtRHJhZ1NvdXJjZUFj
dGlvbihEcmFnU291cmNlQWN0aW9uLCBjb25zdCBJbnRQb2ludCYsIENsaXBib2FyZCopOwogICAg
ICAgICB2aXJ0dWFsIHZvaWQgc3RhcnREcmFnKERyYWdJbWFnZVJlZiBkcmFnSW1hZ2UsIGNvbnN0
IEludFBvaW50JiBkcmFnSW1hZ2VPcmlnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgSW50UG9pbnQmIGV2ZW50UG9zLCBDbGlwYm9hcmQqLCBGcmFtZSosIGJvb2wgbGlu
a0RyYWcgPSBmYWxzZSk7Ci0gICAgICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJ
bWFnZUZvckxpbmsoS1VSTCYsIGNvbnN0IFN0cmluZyYgbGFiZWwsIEZyYW1lKik7CiAgICAgfTsK
IAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYktpdC9tYWMvQ2hhbmdl
TG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwkocmV2aXNpb24g
Nzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAg
LTEsMyArMSwxNiBAQAorMjAxMS0wMi0wNyAgRW5yaWNhIENhc3VjY2kgIDxlbnJpY2FAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdl
YktpdDI6IGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBvbiBXaW5kb3dzLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTI3NzUKKworICAgICAgICBSZW1vdmVk
IGNyZWF0ZURyYWdJbWFnZUZvckxpbmsgZnJvbSBEcmFnQ2xpZW50LgorCisgICAgICAgICogV2Vi
Q29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5oOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L1dl
YkRyYWdDbGllbnQubW06CisgICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcpOgorCiAy
MDExLTAyLTAzICBZdXJ5IFNlbWlraGF0c2t5ICA8eXVyeXNAY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IFBhdmVsIEZlbGRtYW4uCkluZGV4OiBTb3VyY2UvV2ViS2l0L21hYy9X
ZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktp
dC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5oCShyZXZpc2lvbiA3NzgyNCkKKysr
IFNvdXJjZS9XZWJLaXQvbWFjL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMzYsNyArMzYsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGRyYWdD
b250cm9sbGVyRGVzdHJveWVkKCk7CiAgICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnU291cmNlQWN0
aW9uIGRyYWdTb3VyY2VBY3Rpb25NYXNrRm9yUG9pbnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQm
IHdpbmRvd1BvaW50KTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnREcmFnKFdlYkNvcmU6OkRyYWdJ
bWFnZVJlZiBkcmFnSW1hZ2UsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBkcmFnUG9zLCBjb25z
dCBXZWJDb3JlOjpJbnRQb2ludCYgZXZlbnRQb3MsIFdlYkNvcmU6OkNsaXBib2FyZCosIFdlYkNv
cmU6OkZyYW1lKiwgYm9vbCBsaW5rRHJhZyk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnSW1h
Z2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhXZWJDb3JlOjpLVVJMJiB1cmwsIGNvbnN0IFdU
Rjo6U3RyaW5nJiBsYWJlbCwgV2ViQ29yZTo6RnJhbWUqKTsKICAgICB2aXJ0dWFsIHZvaWQgZGVj
bGFyZUFuZFdyaXRlRHJhZ0ltYWdlKE5TUGFzdGVib2FyZCosIERPTUVsZW1lbnQqLCBOU1VSTCos
IE5TU3RyaW5nKiwgV2ViQ29yZTo6RnJhbWUqKTsKIHByaXZhdGU6CiAgICAgV2ViVmlldyogbV93
ZWJWaWV3OwpJbmRleDogU291cmNlL1dlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0Ns
aWVudC5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L21hYy9XZWJDb3JlU3VwcG9ydC9X
ZWJEcmFnQ2xpZW50Lm1tCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQvbWFjL1dl
YkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQubW0JKHdvcmtpbmcgY29weSkKQEAgLTUxLDE4ICs1
MSw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCi1jb25zdCBmbG9hdCBEcmFnTGFi
ZWxCb3JkZXJYID0gNDsKLS8vS2VlcCBib3JkZXJfeSBpbiBzeW5jaCB3aXRoIERyYWdDb250cm9s
bGVyOjpMaW5rRHJhZ0JvcmRlckluc2V0Ci1jb25zdCBmbG9hdCBEcmFnTGFiZWxCb3JkZXJZID0g
MjsKLWNvbnN0IGZsb2F0IERyYWdMYWJlbFJhZGl1cyA9IDU7Ci1jb25zdCBmbG9hdCBMYWJlbEJv
cmRlcllPZmZzZXQgPSAyOwotCi1jb25zdCBmbG9hdCBNaW5EcmFnTGFiZWxXaWR0aEJlZm9yZUNs
aXAgPSAxMjA7Ci1jb25zdCBmbG9hdCBNYXhEcmFnTGFiZWxXaWR0aCA9IDMyMDsKLQotY29uc3Qg
ZmxvYXQgRHJhZ0xpbmtMYWJlbEZvbnRzaXplID0gMTE7Ci1jb25zdCBmbG9hdCBEcmFnTGlua1Vy
bEZvbnRTaXplID0gMTA7Ci0KIFdlYkRyYWdDbGllbnQ6OldlYkRyYWdDbGllbnQoV2ViVmlldyog
d2ViVmlldykKICAgICA6IG1fd2ViVmlldyh3ZWJWaWV3KSAKIHsKQEAgLTEzMiw4NyArMTIwLDYg
QEAgdm9pZCBXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcoRHJhZ0ltYWdlUgogICAgICAgICBbdG9w
SFRNTFZpZXcgZHJhZ0ltYWdlOmRyYWdOU0ltYWdlIGF0OmF0IG9mZnNldDpOU1plcm9TaXplIGV2
ZW50OmV2ZW50IHBhc3RlYm9hcmQ6cGFzdGVib2FyZCBzb3VyY2U6c291cmNlSFRNTFZpZXcgc2xp
ZGVCYWNrOllFU107CiB9CiAKLURyYWdJbWFnZVJlZiBXZWJEcmFnQ2xpZW50OjpjcmVhdGVEcmFn
SW1hZ2VGb3JMaW5rKEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqIGZyYW1l
KQotewotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiBuaWw7Ci0gICAgTlNTdHJpbmcg
KmxhYmVsID0gMDsKLSAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkKLSAgICAgICAgbGFiZWwgPSB0
aXRsZTsKLSAgICBOU1VSTCAqY29jb2FVUkwgPSB1cmw7Ci0gICAgTlNTdHJpbmcgKnVybFN0cmlu
ZyA9IFtjb2NvYVVSTCBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nXTsKLQotICAgIEJPT0wgZHJhd1VS
TFN0cmluZyA9IFlFUzsKLSAgICBCT09MIGNsaXBVUkxTdHJpbmcgPSBOTzsKLSAgICBCT09MIGNs
aXBMYWJlbFN0cmluZyA9IE5POwotCi0gICAgaWYgKCFsYWJlbCkgewotICAgICAgICBkcmF3VVJM
U3RyaW5nID0gTk87Ci0gICAgICAgIGxhYmVsID0gdXJsU3RyaW5nOwotICAgIH0KLQotICAgIE5T
Rm9udCAqbGFiZWxGb250ID0gW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2VyXSBjb252
ZXJ0Rm9udDpbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6RHJhZ0xpbmtMYWJlbEZvbnRzaXplXQot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0b0hhdmVUcmFpdDpOU0JvbGRGb250TWFza107Ci0gICAgTlNGb250ICp1cmxGb250ID0gW05T
Rm9udCBzeXN0ZW1Gb250T2ZTaXplOkRyYWdMaW5rVXJsRm9udFNpemVdOwotICAgIE5TU2l6ZSBs
YWJlbFNpemU7Ci0gICAgbGFiZWxTaXplLndpZHRoID0gW2xhYmVsIF93ZWJfd2lkdGhXaXRoRm9u
dDogbGFiZWxGb250XTsKLSAgICBsYWJlbFNpemUuaGVpZ2h0ID0gW2xhYmVsRm9udCBhc2NlbmRl
cl0gLSBbbGFiZWxGb250IGRlc2NlbmRlcl07Ci0gICAgaWYgKGxhYmVsU2l6ZS53aWR0aCA+IE1h
eERyYWdMYWJlbFdpZHRoKXsKLSAgICAgICAgbGFiZWxTaXplLndpZHRoID0gTWF4RHJhZ0xhYmVs
V2lkdGg7Ci0gICAgICAgIGNsaXBMYWJlbFN0cmluZyA9IFlFUzsKLSAgICB9Ci0KLSAgICBOU1Np
emUgaW1hZ2VTaXplOwotICAgIGltYWdlU2l6ZS53aWR0aCA9IGxhYmVsU2l6ZS53aWR0aCArIERy
YWdMYWJlbEJvcmRlclggKiAyOwotICAgIGltYWdlU2l6ZS5oZWlnaHQgPSBsYWJlbFNpemUuaGVp
Z2h0ICsgRHJhZ0xhYmVsQm9yZGVyWSAqIDI7Ci0gICAgaWYgKGRyYXdVUkxTdHJpbmcpIHsKLSAg
ICAgICAgTlNTaXplIHVybFN0cmluZ1NpemU7Ci0gICAgICAgIHVybFN0cmluZ1NpemUud2lkdGgg
PSBbdXJsU3RyaW5nIF93ZWJfd2lkdGhXaXRoRm9udDogdXJsRm9udF07Ci0gICAgICAgIHVybFN0
cmluZ1NpemUuaGVpZ2h0ID0gW3VybEZvbnQgYXNjZW5kZXJdIC0gW3VybEZvbnQgZGVzY2VuZGVy
XTsKLSAgICAgICAgaW1hZ2VTaXplLmhlaWdodCArPSB1cmxTdHJpbmdTaXplLmhlaWdodDsKLSAg
ICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGggPiBNYXhEcmFnTGFiZWxXaWR0aCkgewotICAg
ICAgICAgICAgaW1hZ2VTaXplLndpZHRoID0gbWF4KE1heERyYWdMYWJlbFdpZHRoICsgRHJhZ0xh
YmVsQm9yZGVyWSAqIDIsIE1pbkRyYWdMYWJlbFdpZHRoQmVmb3JlQ2xpcCk7Ci0gICAgICAgICAg
ICBjbGlwVVJMU3RyaW5nID0gWUVTOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgaW1h
Z2VTaXplLndpZHRoID0gbWF4KGxhYmVsU2l6ZS53aWR0aCArIERyYWdMYWJlbEJvcmRlclggKiAy
LCB1cmxTdHJpbmdTaXplLndpZHRoICsgRHJhZ0xhYmVsQm9yZGVyWCAqIDIpOwotICAgIH0KLSAg
ICBOU0ltYWdlICpkcmFnSW1hZ2UgPSBbW1tOU0ltYWdlIGFsbG9jXSBpbml0V2l0aFNpemU6IGlt
YWdlU2l6ZV0gYXV0b3JlbGVhc2VdOwotICAgIFtkcmFnSW1hZ2UgbG9ja0ZvY3VzXTsKLQotICAg
IFtbTlNDb2xvciBjb2xvcldpdGhEZXZpY2VSZWQ6IDAuN2YgZ3JlZW46IDAuN2YgYmx1ZTogMC43
ZiBhbHBoYTogMC44Zl0gc2V0XTsKLQotICAgIC8vIERyYWcgYSByZWN0YW5nbGUgd2l0aCByb3Vu
ZGVkIGNvcm5lcnMKLSAgICBOU0JlemllclBhdGggKnBhdGggPSBbTlNCZXppZXJQYXRoIGJlemll
clBhdGhdOwotICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoT3ZhbEluUmVjdDogTlNNYWtl
UmVjdCgwLCAwLCBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07Ci0g
ICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0KDAsIGlt
YWdlU2l6ZS5oZWlnaHQgLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAy
LCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhP
dmFsSW5SZWN0OiBOU01ha2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1cyAq
IDIsIGltYWdlU2l6ZS5oZWlnaHQgLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRp
dXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0
aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJh
ZGl1cyAqIDIsIDAsIERyYWdMYWJlbFJhZGl1cyAqIDIsIERyYWdMYWJlbFJhZGl1cyAqIDIpXTsK
LQotICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoUmVjdDogTlNNYWtlUmVjdChEcmFnTGFi
ZWxSYWRpdXMsIDAsIGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1cyAqIDIsIGltYWdl
U2l6ZS5oZWlnaHQpXTsKLSAgICBbcGF0aCBhcHBlbmRCZXppZXJQYXRoV2l0aFJlY3Q6IE5TTWFr
ZVJlY3QoMCwgRHJhZ0xhYmVsUmFkaXVzLCBEcmFnTGFiZWxSYWRpdXMgKyAxMCwgaW1hZ2VTaXpl
LmhlaWdodCAtIDIgKiBEcmFnTGFiZWxSYWRpdXMpXTsKLSAgICBbcGF0aCBhcHBlbmRCZXppZXJQ
YXRoV2l0aFJlY3Q6IE5TTWFrZVJlY3QoaW1hZ2VTaXplLndpZHRoIC0gRHJhZ0xhYmVsUmFkaXVz
IC0gMjAsIERyYWdMYWJlbFJhZGl1cywgRHJhZ0xhYmVsUmFkaXVzICsgMjAsIGltYWdlU2l6ZS5o
ZWlnaHQgLSAyICogRHJhZ0xhYmVsUmFkaXVzKV07Ci0gICAgW3BhdGggZmlsbF07Ci0KLSAgICBO
U0NvbG9yICp0b3BDb2xvciA9IFtOU0NvbG9yIGNvbG9yV2l0aERldmljZVdoaXRlOjAuMGYgYWxw
aGE6MC43NWZdOwotICAgIE5TQ29sb3IgKmJvdHRvbUNvbG9yID0gW05TQ29sb3IgY29sb3JXaXRo
RGV2aWNlV2hpdGU6MS4wZiBhbHBoYTowLjVmXTsKLSAgICBpZiAoZHJhd1VSTFN0cmluZykgewot
ICAgICAgICBpZiAoY2xpcFVSTFN0cmluZykKLSAgICAgICAgICAgIHVybFN0cmluZyA9IFtXZWJT
dHJpbmdUcnVuY2F0b3IgY2VudGVyVHJ1bmNhdGVTdHJpbmc6IHVybFN0cmluZyB0b1dpZHRoOmlt
YWdlU2l6ZS53aWR0aCAtIChEcmFnTGFiZWxCb3JkZXJYICogMikgd2l0aEZvbnQ6dXJsRm9udF07
Ci0KLSAgICAgICBbdXJsU3RyaW5nIF93ZWJfZHJhd0RvdWJsZWRBdFBvaW50Ok5TTWFrZVBvaW50
KERyYWdMYWJlbEJvcmRlclgsIERyYWdMYWJlbEJvcmRlclkgLSBbdXJsRm9udCBkZXNjZW5kZXJd
KSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFRvcENvbG9yOnRvcENvbG9yIGJv
dHRvbUNvbG9yOmJvdHRvbUNvbG9yIGZvbnQ6dXJsRm9udF07Ci0gICAgfQotCi0gICAgaWYgKGNs
aXBMYWJlbFN0cmluZykKLSAgICAgICAgbGFiZWwgPSBbV2ViU3RyaW5nVHJ1bmNhdG9yIHJpZ2h0
VHJ1bmNhdGVTdHJpbmc6IGxhYmVsIHRvV2lkdGg6aW1hZ2VTaXplLndpZHRoIC0gKERyYWdMYWJl
bEJvcmRlclggKiAyKSB3aXRoRm9udDpsYWJlbEZvbnRdOwotICAgIFtsYWJlbCBfd2ViX2RyYXdE
b3VibGVkQXRQb2ludDpOU01ha2VQb2ludCAoRHJhZ0xhYmVsQm9yZGVyWCwgaW1hZ2VTaXplLmhl
aWdodCAtIExhYmVsQm9yZGVyWU9mZnNldCAtIFtsYWJlbEZvbnQgcG9pbnRTaXplXSkKLSAgICAg
ICAgICAgICAgICAgICAgICB3aXRoVG9wQ29sb3I6dG9wQ29sb3IgYm90dG9tQ29sb3I6Ym90dG9t
Q29sb3IgZm9udDpsYWJlbEZvbnRdOwotCi0gICAgW2RyYWdJbWFnZSB1bmxvY2tGb2N1c107Ci0K
LSAgICByZXR1cm4gZHJhZ0ltYWdlOwotfQotCiB2b2lkIFdlYkRyYWdDbGllbnQ6OmRlY2xhcmVB
bmRXcml0ZURyYWdJbWFnZShOU1Bhc3RlYm9hcmQqIHBhc3RlYm9hcmQsIERPTUVsZW1lbnQqIGVs
ZW1lbnQsIE5TVVJMKiBVUkwsIE5TU3RyaW5nKiB0aXRsZSwgV2ViQ29yZTo6RnJhbWUqIGZyYW1l
KSAKIHsKICAgICBBU1NFUlQocGFzdGVib2FyZCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0L3F0L0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L3F0L0NoYW5nZUxvZwkocmV2aXNp
b24gNzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0L3F0L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDE1IEBACisyMDExLTAyLTA3ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBs
ZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
V2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0IG9uIFdpbmRvd3MuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01Mjc3NQorCisgICAgICAgIFJlbW92
ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBmcm9tIERyYWdDbGllbnQuCisKKyAgICAgICAgKiBX
ZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50UXQuY3BwOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0
L0RyYWdDbGllbnRRdC5oOgorCiAyMDExLTAyLTA2ICBSb2JlcnQgSG9nYW4gIDxyb2JlcnRAd2Vi
a2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRyZWFzIEtsaW5nLgpJbmRleDogU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50UXQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudFF0LmNwcAkocmV2
aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0RyYWdDbGll
bnRRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExMCw5ICsxMTAsNCBAQCB2b2lkIERyYWdDbGll
bnRRdDo6c3RhcnREcmFnKERyYWdJbWFnZVJlCiB9CiAKIAotRHJhZ0ltYWdlUmVmIERyYWdDbGll
bnRRdDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiwgRnJhbWUq
KQotewotICAgIHJldHVybiAwOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBT
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRRdC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudFF0LmgJKHJldmlz
aW9uIDc3ODI0KQorKysgU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50
UXQuaAkod29ya2luZyBjb3B5KQpAQCAtMzcsNyArMzcsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVh
bCBEcmFnU291cmNlQWN0aW9uIGRyYWdTb3VyY2VBY3Rpb25NYXNrRm9yUG9pbnQoY29uc3QgSW50
UG9pbnQmKTsKICAgICB2aXJ0dWFsIHZvaWQgd2lsbFBlcmZvcm1EcmFnU291cmNlQWN0aW9uKERy
YWdTb3VyY2VBY3Rpb24sIGNvbnN0IEludFBvaW50JiwgQ2xpcGJvYXJkKik7ICAgIAogICAgIHZp
cnR1YWwgdm9pZCBzdGFydERyYWcoRHJhZ0ltYWdlUmVmIGRyYWdJbWFnZSwgY29uc3QgSW50UG9p
bnQmIGRyYWdJbWFnZU9yaWdpbiwgY29uc3QgSW50UG9pbnQmIGV2ZW50UG9zLCBDbGlwYm9hcmQq
LCBGcmFtZSosIGJvb2wgbGlua0RyYWcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBEcmFnSW1hZ2VS
ZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiBsYWJlbCwgRnJh
bWUqKTsKIHByaXZhdGU6CiAgICAgUVdlYlBhZ2UqIG1fd2ViUGFnZTsKIH07CkluZGV4OiBTb3Vy
Y2UvV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC93aW4v
Q2hhbmdlTG9nCShyZXZpc2lvbiA3NzgzMykKKysrIFNvdXJjZS9XZWJLaXQvd2luL0NoYW5nZUxv
Zwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDExLTAyLTA3ICBFbnJpY2EgQ2Fz
dWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0IG9uIFdpbmRv
d3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01Mjc3
NQorCisgICAgICAgIFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBmcm9tIERyYWdDbGll
bnQuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcDoKKyAgICAg
ICAgKFdlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyk6CisgICAgICAgICogV2ViQ29yZVN1cHBvcnQv
V2ViRHJhZ0NsaWVudC5oOgorCiAyMDExLTAyLTA2ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJr
aXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogU291cmNl
L1dlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHAJKHJl
dmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViRHJh
Z0NsaWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDM5ICszNSwxMSBAQAogI2luY2x1ZGUg
PFdlYkNvcmUvQ2xpcGJvYXJkV2luLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxl
ci5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0Zv
bnQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0ZvbnREZXNjcmlwdGlvbi5oPgotI2luY2x1ZGUgPFdl
YkNvcmUvRm9udFNlbGVjdG9yLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KICNp
bmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPgogI2luY2x1ZGUgPFdlYkNvcmUvUGFn
ZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1N0
cmluZ1RydW5jYXRvci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvVGV4dFJ1bi5oPgotI2luY2x1ZGUg
PFdlYkNvcmUvV2ViQ29yZVRleHRSZW5kZXJlci5oPgogI3ByYWdtYSB3YXJuaW5nKHBvcCkgCiAK
LW5hbWVzcGFjZSBXZWJDb3JlIHsKLSAgICBIQklUTUFQIGFsbG9jSW1hZ2UoSERDIGRjLCBJbnRT
aXplIHNpemUsIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiogdGFyZ2V0UmVmKTsKLSAgICB2b2lk
IGRlYWxsb2NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiB0YXJnZXQpOwotfQotCi0K
LSNkZWZpbmUgRFJBR19MQUJFTF9CT1JERVJfWCAgICAgICAgICAgICA0Ci0vLyBLZWVwIGJvcmRl
cl95IGluIHN5bmNoIHdpdGggRHJhZ0NvbnRyb2xsZXI6OkxpbmtEcmFnQm9yZGVySW5zZXQKLSNk
ZWZpbmUgRFJBR19MQUJFTF9CT1JERVJfWSAgICAgICAgICAgICAyCi0jZGVmaW5lIERSQUdfTEFC
RUxfUkFESVVTICAgICAgICAgICAgICAgNQotI2RlZmluZSBEUkFHX0xBQkVMX0JPUkRFUl9ZX09G
RlNFVCAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIE1JTl9EUkFHX0xBQkVMX1dJRFRIX0JFRk9S
RV9DTElQICAgICAgICAxMjAKLQotLy8gT2JzZXJ2YXRpb24gc2F5cyBtYXggc2l6ZSBpcyAyMDB4
MjAwCi0jZGVmaW5lIE1BWF9EUkFHX0xBQkVMX1dJRFRIICAgICAgICAgICAgICAgICAgICAyMDAK
LSNkZWZpbmUgTUFYX0RSQUdfTEFCRUxfU1RSSU5HX1dJRFRIICAgICAgICAgICAgIChNQVhfRFJB
R19MQUJFTF9XSURUSCAtIDIgKiBEUkFHX0xBQkVMX0JPUkRFUl9YKQotCi0jZGVmaW5lIERSQUdf
TElOS19MQUJFTF9GT05UX1NJWkUgICAxMQotI2RlZmluZSBEUkFHX0xJTktfVVJMX0ZPTlRfU0la
RSAgIDEwCi0KIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBzdGF0aWMgRFdPUkQgZHJhZ2dp
bmdTb3VyY2VPcGVyYXRpb25NYXNrVG9EcmFnQ3Vyc29ycyhEcmFnT3BlcmF0aW9uIG9wKQpAQCAt
MTk3LDEyOSArMTY5LDYgQEAgdm9pZCBXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcoRHJhZ0ltYWdl
UgogICAgIH0KIH0KIAotc3RhdGljIEZvbnQgZHJhZ0xhYmVsRm9udChpbnQgc2l6ZSwgYm9vbCBi
b2xkLCBGb250UmVuZGVyaW5nTW9kZSByZW5kZXJpbmdNb2RlKQotewotICAgIE5PTkNMSUVOVE1F
VFJJQ1MgbWV0cmljczsKLSAgICBtZXRyaWNzLmNiU2l6ZSA9IHNpemVvZihtZXRyaWNzKTsKLSAg
ICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbyhTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgbWV0cmljcy5j
YlNpemUsICZtZXRyaWNzLCAwKTsKLSAgICBGb250RGVzY3JpcHRpb24gZGVzYzsKLSAgICBkZXNj
LnNldFdlaWdodChib2xkID8gRm9udFdlaWdodEJvbGQgOiBGb250V2VpZ2h0Tm9ybWFsKTsKLSAg
ICBGb250RmFtaWx5IGZhbWlseTsKLSAgICBmYW1pbHkuc2V0RmFtaWx5KG1ldHJpY3MubGZTbUNh
cHRpb25Gb250LmxmRmFjZU5hbWUpOwotICAgIGRlc2Muc2V0RmFtaWx5KGZhbWlseSk7Ci0gICAg
ZGVzYy5zZXRTcGVjaWZpZWRTaXplKChmbG9hdClzaXplKTsKLSAgICBkZXNjLnNldENvbXB1dGVk
U2l6ZSgoZmxvYXQpc2l6ZSk7Ci0gICAgZGVzYy5zZXRSZW5kZXJpbmdNb2RlKHJlbmRlcmluZ01v
ZGUpOwotICAgIEZvbnQgcmVzdWx0ID0gRm9udChkZXNjLCAwLCAwKTsgCi0gICAgcmVzdWx0LnVw
ZGF0ZSgwKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1EcmFnSW1hZ2VSZWYgV2ViRHJhZ0Ns
aWVudDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgaW5M
YWJlbCwgRnJhbWUqIGZyYW1lKQotewotICAgIC8vIFRoaXMgaXMgbW9yZSBvciBsZXNzIGFuIGV4
YWN0IG1hdGNoIGZvciB0aGUgTWFjIE9TIFggY29kZS4KLQotICAgIGNvbnN0IEZvbnQqIGxhYmVs
Rm9udDsKLSAgICBjb25zdCBGb250KiB1cmxGb250OwotCi0gICAgaWYgKGZyYW1lLT5zZXR0aW5n
cygpICYmIGZyYW1lLT5zZXR0aW5ncygpLT5mb250UmVuZGVyaW5nTW9kZSgpID09IEFsdGVybmF0
ZVJlbmRlcmluZ01vZGUpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgYWx0ZXJuYXRlUmVu
ZGVyaW5nTW9kZUxhYmVsRm9udCA9IGRyYWdMYWJlbEZvbnQoRFJBR19MSU5LX0xBQkVMX0ZPTlRf
U0laRSwgdHJ1ZSwgQWx0ZXJuYXRlUmVuZGVyaW5nTW9kZSk7Ci0gICAgICAgIHN0YXRpYyBjb25z
dCBGb250IGFsdGVybmF0ZVJlbmRlcmluZ01vZGVVUkxGb250ID0gZHJhZ0xhYmVsRm9udChEUkFH
X0xJTktfVVJMX0ZPTlRfU0laRSwgZmFsc2UsIEFsdGVybmF0ZVJlbmRlcmluZ01vZGUpOwotICAg
ICAgICBsYWJlbEZvbnQgPSAmYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZUxhYmVsRm9udDsKLSAgICAg
ICAgdXJsRm9udCA9ICZhbHRlcm5hdGVSZW5kZXJpbmdNb2RlVVJMRm9udDsKLSAgICB9IGVsc2Ug
ewotICAgICAgICBzdGF0aWMgY29uc3QgRm9udCBub3JtYWxSZW5kZXJpbmdNb2RlTGFiZWxGb250
ID0gZHJhZ0xhYmVsRm9udChEUkFHX0xJTktfTEFCRUxfRk9OVF9TSVpFLCB0cnVlLCBOb3JtYWxS
ZW5kZXJpbmdNb2RlKTsKLSAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgbm9ybWFsUmVuZGVyaW5n
TW9kZVVSTEZvbnQgPSBkcmFnTGFiZWxGb250KERSQUdfTElOS19VUkxfRk9OVF9TSVpFLCBmYWxz
ZSwgTm9ybWFsUmVuZGVyaW5nTW9kZSk7Ci0gICAgICAgIGxhYmVsRm9udCA9ICZub3JtYWxSZW5k
ZXJpbmdNb2RlTGFiZWxGb250OwotICAgICAgICB1cmxGb250ID0gJm5vcm1hbFJlbmRlcmluZ01v
ZGVVUkxGb250OwotICAgIH0KLQotICAgIGJvb2wgZHJhd1VSTFN0cmluZyA9IHRydWU7Ci0gICAg
Ym9vbCBjbGlwVVJMU3RyaW5nID0gZmFsc2U7Ci0gICAgYm9vbCBjbGlwTGFiZWxTdHJpbmcgPSBm
YWxzZTsKLQotICAgIFN0cmluZyB1cmxTdHJpbmcgPSB1cmwuc3RyaW5nKCk7IAotICAgIFN0cmlu
ZyBsYWJlbCA9IGluTGFiZWw7Ci0gICAgaWYgKGxhYmVsLmlzRW1wdHkoKSkgewotICAgICAgICBk
cmF3VVJMU3RyaW5nID0gZmFsc2U7Ci0gICAgICAgIGxhYmVsID0gdXJsU3RyaW5nOwotICAgIH0K
LQotICAgIC8vRmlyc3Qgc3RlcCBpbiBkcmF3aW5nIHRoZSBsaW5rIGRyYWcgaW1hZ2Ugd2lkdGgK
LSAgICBUZXh0UnVuIGxhYmVsUnVuKGxhYmVsLmltcGwoKSk7Ci0gICAgVGV4dFJ1biB1cmxSdW4o
dXJsU3RyaW5nLmltcGwoKSk7Ci0gICAgSW50U2l6ZSBsYWJlbFNpemUobGFiZWxGb250LT53aWR0
aChsYWJlbFJ1biksIGxhYmVsRm9udC0+Zm9udE1ldHJpY3MoKS5hc2NlbnQoKSArIGxhYmVsRm9u
dC0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCkpOwotCi0gICAgaWYgKGxhYmVsU2l6ZS53aWR0aCgp
ID4gTUFYX0RSQUdfTEFCRUxfU1RSSU5HX1dJRFRIKXsKLSAgICAgICAgbGFiZWxTaXplLnNldFdp
ZHRoKE1BWF9EUkFHX0xBQkVMX1NUUklOR19XSURUSCk7Ci0gICAgICAgIGNsaXBMYWJlbFN0cmlu
ZyA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIEludFNpemUgdXJsU3RyaW5nU2l6ZTsKLSAgICBJ
bnRTaXplIGltYWdlU2l6ZShsYWJlbFNpemUud2lkdGgoKSArIERSQUdfTEFCRUxfQk9SREVSX1gg
KiAyLCAKLSAgICAgICAgICAgICAgICAgICAgICBsYWJlbFNpemUuaGVpZ2h0KCkgKyBEUkFHX0xB
QkVMX0JPUkRFUl9ZICogMik7Ci0KLSAgICBpZiAoZHJhd1VSTFN0cmluZykgewotICAgICAgICB1
cmxTdHJpbmdTaXplLnNldFdpZHRoKHVybEZvbnQtPndpZHRoKHVybFJ1bikpOwotICAgICAgICB1
cmxTdHJpbmdTaXplLnNldEhlaWdodCh1cmxGb250LT5mb250TWV0cmljcygpLmFzY2VudCgpICsg
dXJsRm9udC0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCkpOyAKLSAgICAgICAgaW1hZ2VTaXplLnNl
dEhlaWdodChpbWFnZVNpemUuaGVpZ2h0KCkgKyB1cmxTdHJpbmdTaXplLmhlaWdodCgpKTsKLSAg
ICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGgoKSA+IE1BWF9EUkFHX0xBQkVMX1NUUklOR19X
SURUSCkgewotICAgICAgICAgICAgaW1hZ2VTaXplLnNldFdpZHRoKE1BWF9EUkFHX0xBQkVMX1dJ
RFRIKTsKLSAgICAgICAgICAgIGNsaXBVUkxTdHJpbmcgPSB0cnVlOwotICAgICAgICB9IGVsc2Ug
ewotICAgICAgICAgICAgaW1hZ2VTaXplLnNldFdpZHRoKHN0ZDo6bWF4KGxhYmVsU2l6ZS53aWR0
aCgpLCB1cmxTdHJpbmdTaXplLndpZHRoKCkpICsgRFJBR19MQUJFTF9CT1JERVJfWCAqIDIpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2Ugbm93IGtub3cgaG93IGJpZyB0aGUgaW1hZ2Ug
bmVlZHMgdG8gYmUsIHNvIHdlIGNyZWF0ZSBhbmQKLSAgICAvLyBmaWxsIHRoZSBiYWNrZ3JvdW5k
Ci0gICAgSEJJVE1BUCBpbWFnZSA9IDA7Ci0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0gICAgSERD
IHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhkYyk7Ci0gICAgaWYgKCF3b3JraW5nREMp
IHsKLSAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQot
Ci0gICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGNvbnRleHRSZWY7Ci0gICAgaW1hZ2UgPSBh
bGxvY0ltYWdlKHdvcmtpbmdEQywgaW1hZ2VTaXplLCAmY29udGV4dFJlZik7Ci0gICAgaWYgKCFp
bWFnZSkgewotICAgICAgICBEZWxldGVEQyh3b3JraW5nREMpOwotICAgICAgICBSZWxlYXNlREMo
MCwgZGMpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgICAgIAotICAgIDo6U2VsZWN0
T2JqZWN0KHdvcmtpbmdEQywgaW1hZ2UpOwotICAgIEdyYXBoaWNzQ29udGV4dCBjb250ZXh0KGNv
bnRleHRSZWYpOwotICAgIC8vIE9uIE1hYyBhbHBoYSBpcyB7MC43LCAwLjcsIDAuNywgMC44fSwg
aG93ZXZlciB3ZSBjYW4ndCBjb250cm9sIGFscGhhCi0gICAgLy8gZm9yIGRyYWcgaW1hZ2VzIG9u
IHdpbiwgc28gd2UgdXNlIDEKLSAgICBzdGF0aWMgY29uc3QgQ29sb3IgYmFja2dyb3VuZENvbG9y
KDE0MCwgMTQwLCAxNDApOwotICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHJhZGlpKERSQUdfTEFC
RUxfUkFESVVTLCBEUkFHX0xBQkVMX1JBRElVUyk7Ci0gICAgSW50UmVjdCByZWN0KDAsIDAsIGlt
YWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpOwotICAgIGNvbnRleHQuZmlsbFJv
dW5kZWRSZWN0KHJlY3QsIHJhZGlpLCByYWRpaSwgcmFkaWksIHJhZGlpLCBiYWNrZ3JvdW5kQ29s
b3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotIAotICAgIC8vIERyYXcgdGhlIHRleHQKLSAgICBz
dGF0aWMgY29uc3QgQ29sb3IgdG9wQ29sb3IoMCwgMCwgMCwgMjU1KTsgLy9vcmlnaW5hbCBhbHBo
YSA9IDAuNzUKLSAgICBzdGF0aWMgY29uc3QgQ29sb3IgYm90dG9tQ29sb3IoMjU1LCAyNTUsIDI1
NSwgMTI3KTsgLy9vcmlnaW5hbCBhbHBoYSA9IDAuNQotICAgIGlmIChkcmF3VVJMU3RyaW5nKSB7
Ci0gICAgICAgIGlmIChjbGlwVVJMU3RyaW5nKQotICAgICAgICAgICAgdXJsU3RyaW5nID0gU3Ry
aW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKHVybFN0cmluZywgaW1hZ2VTaXplLndpZHRoKCkg
LSAoRFJBR19MQUJFTF9CT1JERVJfWCAqIDIuMGYpLCAqdXJsRm9udCwgZmFsc2UpOwotICAgICAg
ICBJbnRQb2ludCB0ZXh0UG9zKERSQUdfTEFCRUxfQk9SREVSX1gsIGltYWdlU2l6ZS5oZWlnaHQo
KSAtIChEUkFHX0xBQkVMX0JPUkRFUl9ZX09GRlNFVCArIHVybEZvbnQtPmZvbnRNZXRyaWNzKCku
ZGVzY2VudCgpKSk7Ci0gICAgICAgIFdlYkNvcmVEcmF3RG91YmxlZFRleHRBdFBvaW50KGNvbnRl
eHQsIHVybFN0cmluZywgdGV4dFBvcywgKnVybEZvbnQsIHRvcENvbG9yLCBib3R0b21Db2xvcik7
Ci0gICAgfQotICAgIAotICAgIGlmIChjbGlwTGFiZWxTdHJpbmcpCi0gICAgICAgIGxhYmVsID0g
U3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGxhYmVsLCBpbWFnZVNpemUud2lkdGgoKSAt
IChEUkFHX0xBQkVMX0JPUkRFUl9YICogMi4wZiksICpsYWJlbEZvbnQsIGZhbHNlKTsKLQotICAg
IEludFBvaW50IHRleHRQb3MoRFJBR19MQUJFTF9CT1JERVJfWCwgRFJBR19MQUJFTF9CT1JERVJf
WSArIGxhYmVsRm9udC0+cGl4ZWxTaXplKCkpOwotICAgIFdlYkNvcmVEcmF3RG91YmxlZFRleHRB
dFBvaW50KGNvbnRleHQsIGxhYmVsLCB0ZXh0UG9zLCAqbGFiZWxGb250LCB0b3BDb2xvciwgYm90
dG9tQ29sb3IpOwotCi0gICAgZGVhbGxvY0NvbnRleHQoY29udGV4dFJlZik7Ci0gICAgRGVsZXRl
REMod29ya2luZ0RDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBpbWFnZTsK
LX0KLQogdm9pZCBXZWJEcmFnQ2xpZW50OjpkcmFnQ29udHJvbGxlckRlc3Ryb3llZCgpCiB7CiAg
ICAgZGVsZXRlIHRoaXM7CkluZGV4OiBTb3VyY2UvV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9X
ZWJEcmFnQ2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1
cHBvcnQvV2ViRHJhZ0NsaWVudC5oCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQv
d2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMzks
NyArMzksNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnU291cmNlQWN0aW9u
IGRyYWdTb3VyY2VBY3Rpb25NYXNrRm9yUG9pbnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKTsK
ICAgICB2aXJ0dWFsIHZvaWQgd2lsbFBlcmZvcm1EcmFnU291cmNlQWN0aW9uKFdlYkNvcmU6OkRy
YWdTb3VyY2VBY3Rpb24sIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgV2ViQ29yZTo6Q2xpcGJv
YXJkKik7CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhXZWJDb3JlOjpEcmFnSW1hZ2VSZWYs
IGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmLCBXZWJD
b3JlOjpDbGlwYm9hcmQqLCBXZWJDb3JlOjpGcmFtZSosIGJvb2wpOwotICAgIHZpcnR1YWwgV2Vi
Q29yZTo6RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsoV2ViQ29yZTo6S1VSTCYs
IGNvbnN0IFdURjo6U3RyaW5nJiwgV2ViQ29yZTo6RnJhbWUqKTsKIHByaXZhdGU6CiAgICAgV2Vi
VmlldyogbV93ZWJWaWV3OwogfTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luY2UvQ2hhbmdlTG9n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvd2luY2UvQ2hhbmdlTG9nCShyZXZpc2lvbiA3
NzgzMykKKysrIFNvdXJjZS9XZWJLaXQvd2luY2UvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMTEtMDItMDcgIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNhQGFwcGxl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBX
ZWJLaXQyOiBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgb24gV2luZG93cy4KKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyNzc1CisKKyAgICAgICAgUmVtb3Zl
ZCBjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rIGZyb20gRHJhZ0NsaWVudC4KKworICAgICAgICAqIFdl
YkNvcmVTdXBwb3J0L0RyYWdDbGllbnRXaW5DRS5jcHA6CisgICAgICAgICogV2ViQ29yZVN1cHBv
cnQvRHJhZ0NsaWVudFdpbkNFLmg6CisKIDIwMTEtMDItMDYgIFBhdHJpY2sgR2Fuc3RlcmVyICA8
cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFydGluIFJvYmluc29u
LgpJbmRleDogU291cmNlL1dlYktpdC93aW5jZS9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50V2lu
Q0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvd2luY2UvV2ViQ29yZVN1cHBvcnQv
RHJhZ0NsaWVudFdpbkNFLmNwcAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L3dp
bmNlL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRXaW5DRS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTU4LDEyICs1OCw2IEBAIHZvaWQgRHJhZ0NsaWVudFdpbkNFOjpzdGFydERyYWcoRHJhZ0ltYWcK
ICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi1EcmFnSW1hZ2VSZWYgRHJhZ0NsaWVudFdpbkNF
OjpjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rKEtVUkwmLCBjb25zdCBTdHJpbmcmIGxhYmVsLCBGcmFt
ZSopCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQogdm9pZCBE
cmFnQ2xpZW50V2luQ0U6OmRyYWdDb250cm9sbGVyRGVzdHJveWVkKCkKIHsKICAgICBkZWxldGUg
dGhpczsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luY2UvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVu
dFdpbkNFLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC93aW5jZS9XZWJDb3JlU3VwcG9y
dC9EcmFnQ2xpZW50V2luQ0UuaAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L3dp
bmNlL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRXaW5DRS5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
OCw3ICszOCw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdTb3VyY2VBY3Rp
b24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYp
OwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhXZWJDb3JlOjpEcmFnSW1hZ2VSZWYsIGNv
bnN0IFdlYkNvcmU6OkludFBvaW50JiwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmLCBXZWJDb3Jl
OjpDbGlwYm9hcmQqLCBXZWJDb3JlOjpGcmFtZSosIGJvb2wgPSBmYWxzZSk7Ci0gICAgdmlydHVh
bCBXZWJDb3JlOjpEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhXZWJDb3JlOjpL
VVJMJiwgY29uc3QgV1RGOjpTdHJpbmcmLCBXZWJDb3JlOjpGcmFtZSopOwogCiAgICAgdmlydHVh
bCB2b2lkIGRyYWdDb250cm9sbGVyRGVzdHJveWVkKCk7CiB9OwpJbmRleDogU291cmNlL1dlYktp
dC93eC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC93eC9DaGFuZ2VMb2cJ
KHJldmlzaW9uIDc3ODMzKQorKysgU291cmNlL1dlYktpdC93eC9DaGFuZ2VMb2cJKHdvcmtpbmcg
Y29weSkKQEAgLTEsMyArMSwxNSBAQAorMjAxMS0wMi0wNyAgRW5yaWNhIENhc3VjY2kgIDxlbnJp
Y2FAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIFdlYktpdDI6IGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBvbiBXaW5kb3dzLgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTI3NzUKKworICAgICAg
ICBSZW1vdmVkIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsgZnJvbSBEcmFnQ2xpZW50LgorCisgICAg
ICAgICogV2ViS2l0U3VwcG9ydC9EcmFnQ2xpZW50V3guY3BwOgorICAgICAgICAqIFdlYktpdFN1
cHBvcnQvRHJhZ0NsaWVudFd4Lmg6CisKIDIwMTEtMDItMDcgIFBhdHJpY2sgR2Fuc3RlcmVyICA8
cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQW5kcmVhcyBLbGluZy4K
SW5kZXg6IFNvdXJjZS9XZWJLaXQvd3gvV2ViS2l0U3VwcG9ydC9EcmFnQ2xpZW50V3guY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvd3gvV2ViS2l0U3VwcG9ydC9EcmFnQ2xpZW50V3gu
Y3BwCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQvd3gvV2ViS2l0U3VwcG9ydC9E
cmFnQ2xpZW50V3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02OCwxMCArNjgsNCBAQCB2b2lkIERy
YWdDbGllbnRXeDo6c3RhcnREcmFnKERyYWdJbWFnZVJlCiAgICAgbm90SW1wbGVtZW50ZWQoKTsK
IH0KIAotRHJhZ0ltYWdlUmVmIERyYWdDbGllbnRXeDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhL
VVJMJiwgY29uc3QgU3RyaW5nJiBsYWJlbCwgRnJhbWUqKQotewotICAgIG5vdEltcGxlbWVudGVk
KCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQvd3gvV2ViS2l0
U3VwcG9ydC9EcmFnQ2xpZW50V3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L3d4L1dl
YktpdFN1cHBvcnQvRHJhZ0NsaWVudFd4LmgJKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dl
YktpdC93eC9XZWJLaXRTdXBwb3J0L0RyYWdDbGllbnRXeC5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
OSw3ICszOSw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdTb3VyY2VBY3Rp
b24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYp
OwogICAgICAgICAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnREcmFnKFdlYkNvcmU6OkRyYWdJbWFn
ZVJlZiBkcmFnSW1hZ2UsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBkcmFnSW1hZ2VPcmlnaW4s
IGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBldmVudFBvcywgV2ViQ29yZTo6Q2xpcGJvYXJkKiwg
V2ViQ29yZTo6RnJhbWUqLCBib29sIGxpbmtEcmFnID0gZmFsc2UpOwotICAgIHZpcnR1YWwgV2Vi
Q29yZTo6RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsoV2ViQ29yZTo6S1VSTCYs
IGNvbnN0IFdURjo6U3RyaW5nJiBsYWJlbCwgV2ViQ29yZTo6RnJhbWUqKTsKIH07CiAKIH0K
</data>
<flag name="review"
          id="73096"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>81546</attachid>
            <date>2011-02-07 15:56:21 -0800</date>
            <delta_ts>2011-02-07 16:49:31 -0800</delta_ts>
            <desc>Patch4</desc>
            <filename>dragsourcewin.txt</filename>
            <type>text/plain</type>
            <size>79404</size>
            <attacher name="Enrica Casucci">enrica</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc3ODMzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTYgQEAKKzIwMTEtMDItMDcgIEVucmljYSBD
YXN1Y2NpICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWJLaXQyOiBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgb24gV2lu
ZG93cy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUy
Nzc1CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS84NTE0NDA5PgorCisgICAgICAgICogbG9hZGVy
L0VtcHR5Q2xpZW50cy5oOiBSZW1vdmVkIGNyZWF0ZURyYWdJbWFnZUZyb21MaW5rLgorICAgICAg
ICAqIHBhZ2UvRHJhZ0NsaWVudC5oOiBEaXR0by4KKyAgICAgICAgKiBwYWdlL0RyYWdDb250cm9s
bGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkRyYWdDb250cm9sbGVyOjpzdGFydERyYWcpOiBj
aGFuZ2VkIGNhbGwgdG8gY3JlYXRlRHJhZ0ltYWdlRnJvbUxpbmsuCisgICAgICAgICogcGxhdGZv
cm0vRHJhZ0ltYWdlLmg6CisgICAgICAgICogcGxhdGZvcm0vbWFjL0RyYWdJbWFnZU1hYy5tbToK
KyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZURyYWdJbWFnZUZvckxpbmspOiBNb3ZlZCBmcm9tIERy
YWdDbGllbnQuCisgICAgICAgICogcGxhdGZvcm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5j
cHA6IEFkZGVkIGEgc2VyaWVzIG9mIGZ1bmN0aW9ucworICAgICAgICB0byBkZS1zZXJpYWxpemUg
dGhlIGRyYWcgZGF0YSBmcm9tIHRoZSBtYXAgaW50byBhbiBJRGF0YU9iamVjdC4KKyAgICAgICAg
KFdlYkNvcmU6OmdldFdlYkxvY0RhdGEpOgorICAgICAgICAoV2ViQ29yZTo6dGV4dGh0bWxGb3Jt
YXQpOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlR2xvYmFsRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpnZXRGdWxsQ0ZIVE1MKToKKyAgICAgICAgKFdlYkNvcmU6OnVybFdGb3JtYXQpOgorICAg
ICAgICAoV2ViQ29yZTo6dXJsRm9ybWF0KToKKyAgICAgICAgKFdlYkNvcmU6OmZpbGVuYW1lV0Zv
cm1hdCk6CisgICAgICAgIChXZWJDb3JlOjpmaWxlbmFtZUZvcm1hdCk6CisgICAgICAgIChXZWJD
b3JlOjpodG1sRm9ybWF0KToKKyAgICAgICAgKFdlYkNvcmU6OnNtYXJ0UGFzdGVGb3JtYXQpOgor
ICAgICAgICAoV2ViQ29yZTo6Z2V0VVJMKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFBsYWluVGV4
dCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRUZXh0SFRNTCk6CisgICAgICAgIChXZWJDb3JlOjpD
bGlwYm9hcmREYXRhSXRlbTo6Q2xpcGJvYXJkRGF0YUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6
Z2V0U3RyaW5nRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpnZXRVdGY4RGF0YSk6CisgICAgICAg
IChXZWJDb3JlOjpnZXRDRkRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6c2V0VUNoYXJEYXRhKToK
KyAgICAgICAgKFdlYkNvcmU6OnNldENoYXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OnNldENG
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpnZXRDbGlwYm9hcmRNYXApOgorICAgICAgICAoV2Vi
Q29yZTo6Z2V0Q2xpcGJvYXJkRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpzZXRDbGlwYm9hcmRE
YXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmg6Cisg
ICAgICAgICogcGxhdGZvcm0vd2luL0RyYWdJbWFnZVdpbi5jcHA6IE1vdmVkIGNyZWF0ZURyYWdJ
bWFnZUZvckxpbmsgZnJvbSBEcmFnQ2xpZW50CisgICAgICAgIHRvIGEgcGxhdGZvcm0gc3BlY2lm
aWMgZmlsZSBpbiBXZWJDb3JlLiBJdCBtYWtlcyBhIGxvdCBtb3JlIHNlbnNlIGhlcmUsIHNpbmNl
CisgICAgICAgIHRoZSBkcmFnIGltYWdlIGlzIGFsd2F5cyBjcmVhdGVkIGluIFdlYkNvcmUgZm9y
IGFsbCB0aGUgb3RoZXIgY29udGVudCB0eXBlcworICAgICAgICBleGNlcHQgZm9yIGxpbmtzLgor
ICAgICAgICAoV2ViQ29yZTo6ZHJhZ0xhYmVsRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpjcmVh
dGVEcmFnSW1hZ2VGb3JMaW5rKToKKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vV0NEYXRhT2JqZWN0
LmNwcDogQWRkZWQgbmV3IHdheSB0bworICAgICAgICBjb25zdHJ1Y3QgYSBXQ0RhdGFPYmplY3Qg
ZnJvbSBhIERyYWdEYXRhTWFwLgorICAgICAgICAoV2ViQ29yZTo6V0NEYXRhT2JqZWN0OjpjcmVh
dGVJbnN0YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpXQ0RhdGFPYmplY3Q6OmNsZWFyRGF0YSk6
CisgICAgICAgICogcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5oOgorCiAyMDExLTAyLTA3ICBE
YXJpbiBBZGxlciAgPGRhcmluQGFwcGxlLmNvbT4KIAogICAgICAgICBUdXJuIFVURi04IGRlY29k
ZXIgb2ZmIGZvciBub3cgc28gd2UgY2FuIGxvb2sgaW50byBmYWlsaW5nIHRlc3RzCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9sb2FkZXIvRW1wdHlDbGllbnRzLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJj
ZS9XZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAkod29ya2luZyBjb3B5KQpAQCAtNTUyLDcg
KzU1Miw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIERyYWdEZXN0aW5hdGlvbkFjdGlvbiBhY3Rp
b25NYXNrRm9yRHJhZyhEcmFnRGF0YSopIHsgcmV0dXJuIERyYWdEZXN0aW5hdGlvbkFjdGlvbk5v
bmU7IH0KICAgICB2aXJ0dWFsIERyYWdTb3VyY2VBY3Rpb24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tG
b3JQb2ludChjb25zdCBJbnRQb2ludCYpIHsgcmV0dXJuIERyYWdTb3VyY2VBY3Rpb25Ob25lOyB9
CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhEcmFnSW1hZ2VSZWYsIGNvbnN0IEludFBvaW50
JiwgY29uc3QgSW50UG9pbnQmLCBDbGlwYm9hcmQqLCBGcmFtZSosIGJvb2wpIHsgfQotICAgIHZp
cnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsoS1VSTCYsIGNvbnN0IFN0
cmluZyYsIEZyYW1lKikgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgdm9pZCBkcmFnQ29udHJv
bGxlckRlc3Ryb3llZCgpIHsgfQogfTsKICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9EcmFnQ2xpZW50LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGFnZS9EcmFnQ2xpZW50LmgJKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNl
L1dlYkNvcmUvcGFnZS9EcmFnQ2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTYyLDcgKzYyLDYg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2aXJ0dWFsIERyYWdTb3VyY2VBY3Rpb24g
ZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBJbnRQb2ludCYgd2luZG93UG9pbnQp
ID0gMDsKICAgICAgICAgCiAgICAgICAgIHZpcnR1YWwgdm9pZCBzdGFydERyYWcoRHJhZ0ltYWdl
UmVmIGRyYWdJbWFnZSwgY29uc3QgSW50UG9pbnQmIGRyYWdJbWFnZU9yaWdpbiwgY29uc3QgSW50
UG9pbnQmIGV2ZW50UG9zLCBDbGlwYm9hcmQqLCBGcmFtZSosIGJvb2wgbGlua0RyYWcgPSBmYWxz
ZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGb3JM
aW5rKEtVUkwmLCBjb25zdCBTdHJpbmcmIGxhYmVsLCBGcmFtZSopID0gMDsKICAgICAgICAgCiAg
ICAgICAgIHZpcnR1YWwgdm9pZCBkcmFnQ29udHJvbGxlckRlc3Ryb3llZCgpID0gMDsKICNpZiBQ
TEFURk9STShNQUMpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdDb250cm9sbGVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdDb250cm9sbGVyLmNwcAko
cmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0RyYWdDb250cm9sbGVyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNzM5LDcgKzczOSw3IEBAIGJvb2wgRHJhZ0NvbnRyb2xsZXI6
OnN0YXJ0RHJhZyhGcmFtZSogc3IKIAogICAgICAgICBtX2NsaWVudC0+d2lsbFBlcmZvcm1EcmFn
U291cmNlQWN0aW9uKERyYWdTb3VyY2VBY3Rpb25MaW5rLCBkcmFnT3JpZ2luLCBjbGlwYm9hcmQp
OwogICAgICAgICBpZiAoIWRyYWdJbWFnZSkgewotICAgICAgICAgICAgZHJhZ0ltYWdlID0gbV9j
bGllbnQtPmNyZWF0ZURyYWdJbWFnZUZvckxpbmsobGlua1VSTCwgZHJhZ1NvdXJjZS50ZXh0Q29u
dGVudCgpLCBzcmMpOworICAgICAgICAgICAgZHJhZ0ltYWdlID0gY3JlYXRlRHJhZ0ltYWdlRm9y
TGluayhsaW5rVVJMLCBkcmFnU291cmNlLnRleHRDb250ZW50KCksIHNyYyk7CiAgICAgICAgICAg
ICBJbnRTaXplIHNpemUgPSBkcmFnSW1hZ2VTaXplKGRyYWdJbWFnZSk7CiAgICAgICAgICAgICBt
X2RyYWdPZmZzZXQgPSBJbnRQb2ludCgtc2l6ZS53aWR0aCgpIC8gMiwgLUxpbmtEcmFnQm9yZGVy
SW5zZXQpOwogICAgICAgICAgICAgZHJhZ0xvYyA9IEludFBvaW50KG1vdXNlRHJhZ2dlZFBvaW50
LngoKSArIG1fZHJhZ09mZnNldC54KCksIG1vdXNlRHJhZ2dlZFBvaW50LnkoKSArIG1fZHJhZ09m
ZnNldC55KCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0ltYWdlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9EcmFnSW1hZ2UuY3BwCShyZXZp
c2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL0RyYWdJbWFnZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTczLDYgKzczLDEzIEBAIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1h
Z2VGb3JTZWxlY3Rpb24KICAgICByZXR1cm4gaW1hZ2U7CiB9CiAKKyNpZiAhUExBVEZPUk0oTUFD
KSAmJiAhUExBVEZPUk0oV0lOKQorRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmso
S1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKikKK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbmRp
ZgorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQ
T1JUKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0ltYWdlLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0ltYWdlLmgJKHJldmlzaW9uIDc3ODI0
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vRHJhZ0ltYWdlLmgJKHdvcmtpbmcgY29weSkK
QEAgLTk2LDYgKzk2LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIERyYWdJbWFnZVJlZiBj
cmVhdGVEcmFnSW1hZ2VGcm9tSW1hZ2UoSW1hZ2UqKTsKICAgICBEcmFnSW1hZ2VSZWYgY3JlYXRl
RHJhZ0ltYWdlRm9yU2VsZWN0aW9uKEZyYW1lKik7ICAgIAogICAgIERyYWdJbWFnZVJlZiBjcmVh
dGVEcmFnSW1hZ2VJY29uRm9yQ2FjaGVkSW1hZ2UoQ2FjaGVkSW1hZ2UqKTsKKyAgICBEcmFnSW1h
Z2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiBsYWJlbCwg
RnJhbWUqKTsKICAgICB2b2lkIGRlbGV0ZURyYWdJbWFnZShEcmFnSW1hZ2VSZWYpOwogfQogCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvRHJhZ0ltYWdlTWFjLm1tCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9EcmFnSW1hZ2VNYWMubW0JKHJldmlz
aW9uIDc3ODI0KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL0RyYWdJbWFnZU1hYy5t
bQkod29ya2luZyBjb3B5KQpAQCAtMjgsOSArMjgsMTYgQEAKIAogI2lmIEVOQUJMRShEUkFHX1NV
UFBPUlQpCiAjaW1wb3J0ICJDYWNoZWRJbWFnZS5oIgorI2ltcG9ydCAiRm9udC5oIgorI2ltcG9y
dCAiRm9udERlc2NyaXB0aW9uLmgiCisjaW1wb3J0ICJGb250U2VsZWN0b3IuaCIKICNpbXBvcnQg
IkltYWdlLmgiCiAjaW1wb3J0ICJLVVJMLmgiCiAjaW1wb3J0ICJSZXNvdXJjZVJlc3BvbnNlLmgi
CisjaW1wb3J0ICJTZXR0aW5ncy5oIgorI2ltcG9ydCAiU3RyaW5nVHJ1bmNhdG9yLmgiCisjaW1w
b3J0ICJUZXh0UnVuLmgiCisjaW1wb3J0ICJXZWJDb3JlVGV4dFJlbmRlcmVyLmgiCiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIApAQCAtOTgsNyArMTA1LDEwMSBAQCBSZXRhaW5QdHI8TlNJbWFnZT4g
Y3JlYXRlRHJhZ0ltYWdlSWNvbkZvCiAgICAgCiAgICAgcmV0dXJuIFtbTlNXb3Jrc3BhY2Ugc2hh
cmVkV29ya3NwYWNlXSBpY29uRm9yRmlsZVR5cGU6ZXh0ZW5zaW9uXTsKIH0KLSAgICAKKworCitj
b25zdCBmbG9hdCBEcmFnTGFiZWxCb3JkZXJYID0gNDsKKy8vS2VlcCBib3JkZXJfeSBpbiBzeW5j
aCB3aXRoIERyYWdDb250cm9sbGVyOjpMaW5rRHJhZ0JvcmRlckluc2V0Citjb25zdCBmbG9hdCBE
cmFnTGFiZWxCb3JkZXJZID0gMjsKK2NvbnN0IGZsb2F0IERyYWdMYWJlbFJhZGl1cyA9IDU7Citj
b25zdCBmbG9hdCBMYWJlbEJvcmRlcllPZmZzZXQgPSAyOworCitjb25zdCBmbG9hdCBNaW5EcmFn
TGFiZWxXaWR0aEJlZm9yZUNsaXAgPSAxMjA7Citjb25zdCBmbG9hdCBNYXhEcmFnTGFiZWxXaWR0
aCA9IDMyMDsKKworY29uc3QgZmxvYXQgRHJhZ0xpbmtMYWJlbEZvbnRzaXplID0gMTE7Citjb25z
dCBmbG9hdCBEcmFnTGlua1VybEZvbnRTaXplID0gMTA7CisKK0RyYWdJbWFnZVJlZiBjcmVhdGVE
cmFnSW1hZ2VGb3JMaW5rKEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqIGZy
YW1lKQoreworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBuaWw7CisgICAgTlNTdHJp
bmcgKmxhYmVsID0gMDsKKyAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkKKyAgICAgICAgbGFiZWwg
PSB0aXRsZTsKKyAgICBOU1VSTCAqY29jb2FVUkwgPSB1cmw7CisgICAgTlNTdHJpbmcgKnVybFN0
cmluZyA9IFtjb2NvYVVSTCBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nXTsKKworICAgIEJPT0wgZHJh
d1VSTFN0cmluZyA9IFlFUzsKKyAgICBCT09MIGNsaXBVUkxTdHJpbmcgPSBOTzsKKyAgICBCT09M
IGNsaXBMYWJlbFN0cmluZyA9IE5POworCisgICAgaWYgKCFsYWJlbCkgeworICAgICAgICBkcmF3
VVJMU3RyaW5nID0gTk87CisgICAgICAgIGxhYmVsID0gdXJsU3RyaW5nOworICAgIH0KKworICAg
IE5TRm9udCAqbGFiZWxGb250ID0gW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2VyXSBj
b252ZXJ0Rm9udDpbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6RHJhZ0xpbmtMYWJlbEZvbnRzaXpl
XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB0b0hhdmVUcmFpdDpOU0JvbGRGb250TWFza107CisgICAgTlNGb250ICp1cmxGb250ID0g
W05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOkRyYWdMaW5rVXJsRm9udFNpemVdOworICAgIE5TU2l6
ZSBsYWJlbFNpemU7CisgICAgbGFiZWxTaXplLndpZHRoID0gW2xhYmVsIF93ZWJfd2lkdGhXaXRo
Rm9udDogbGFiZWxGb250XTsKKyAgICBsYWJlbFNpemUuaGVpZ2h0ID0gW2xhYmVsRm9udCBhc2Nl
bmRlcl0gLSBbbGFiZWxGb250IGRlc2NlbmRlcl07CisgICAgaWYgKGxhYmVsU2l6ZS53aWR0aCA+
IE1heERyYWdMYWJlbFdpZHRoKXsKKyAgICAgICAgbGFiZWxTaXplLndpZHRoID0gTWF4RHJhZ0xh
YmVsV2lkdGg7CisgICAgICAgIGNsaXBMYWJlbFN0cmluZyA9IFlFUzsKKyAgICB9CisKKyAgICBO
U1NpemUgaW1hZ2VTaXplOworICAgIGltYWdlU2l6ZS53aWR0aCA9IGxhYmVsU2l6ZS53aWR0aCAr
IERyYWdMYWJlbEJvcmRlclggKiAyOworICAgIGltYWdlU2l6ZS5oZWlnaHQgPSBsYWJlbFNpemUu
aGVpZ2h0ICsgRHJhZ0xhYmVsQm9yZGVyWSAqIDI7CisgICAgaWYgKGRyYXdVUkxTdHJpbmcpIHsK
KyAgICAgICAgTlNTaXplIHVybFN0cmluZ1NpemU7CisgICAgICAgIHVybFN0cmluZ1NpemUud2lk
dGggPSBbdXJsU3RyaW5nIF93ZWJfd2lkdGhXaXRoRm9udDogdXJsRm9udF07CisgICAgICAgIHVy
bFN0cmluZ1NpemUuaGVpZ2h0ID0gW3VybEZvbnQgYXNjZW5kZXJdIC0gW3VybEZvbnQgZGVzY2Vu
ZGVyXTsKKyAgICAgICAgaW1hZ2VTaXplLmhlaWdodCArPSB1cmxTdHJpbmdTaXplLmhlaWdodDsK
KyAgICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGggPiBNYXhEcmFnTGFiZWxXaWR0aCkgewor
ICAgICAgICAgICAgaW1hZ2VTaXplLndpZHRoID0gbWF4KE1heERyYWdMYWJlbFdpZHRoICsgRHJh
Z0xhYmVsQm9yZGVyWSAqIDIsIE1pbkRyYWdMYWJlbFdpZHRoQmVmb3JlQ2xpcCk7CisgICAgICAg
ICAgICBjbGlwVVJMU3RyaW5nID0gWUVTOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGlt
YWdlU2l6ZS53aWR0aCA9IG1heChsYWJlbFNpemUud2lkdGggKyBEcmFnTGFiZWxCb3JkZXJYICog
MiwgdXJsU3RyaW5nU2l6ZS53aWR0aCArIERyYWdMYWJlbEJvcmRlclggKiAyKTsKKyAgICB9Cisg
ICAgTlNJbWFnZSAqZHJhZ0ltYWdlID0gW1tbTlNJbWFnZSBhbGxvY10gaW5pdFdpdGhTaXplOiBp
bWFnZVNpemVdIGF1dG9yZWxlYXNlXTsKKyAgICBbZHJhZ0ltYWdlIGxvY2tGb2N1c107CisKKyAg
ICBbW05TQ29sb3IgY29sb3JXaXRoRGV2aWNlUmVkOiAwLjdmIGdyZWVuOiAwLjdmIGJsdWU6IDAu
N2YgYWxwaGE6IDAuOGZdIHNldF07CisKKyAgICAvLyBEcmFnIGEgcmVjdGFuZ2xlIHdpdGggcm91
bmRlZCBjb3JuZXJzCisgICAgTlNCZXppZXJQYXRoICpwYXRoID0gW05TQmV6aWVyUGF0aCBiZXpp
ZXJQYXRoXTsKKyAgICBbcGF0aCBhcHBlbmRCZXppZXJQYXRoV2l0aE92YWxJblJlY3Q6IE5TTWFr
ZVJlY3QoMCwgMCwgRHJhZ0xhYmVsUmFkaXVzICogMiwgRHJhZ0xhYmVsUmFkaXVzICogMildOwor
ICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoT3ZhbEluUmVjdDogTlNNYWtlUmVjdCgwLCBp
bWFnZVNpemUuaGVpZ2h0IC0gRHJhZ0xhYmVsUmFkaXVzICogMiwgRHJhZ0xhYmVsUmFkaXVzICog
MiwgRHJhZ0xhYmVsUmFkaXVzICogMildOworICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRo
T3ZhbEluUmVjdDogTlNNYWtlUmVjdChpbWFnZVNpemUud2lkdGggLSBEcmFnTGFiZWxSYWRpdXMg
KiAyLCBpbWFnZVNpemUuaGVpZ2h0IC0gRHJhZ0xhYmVsUmFkaXVzICogMiwgRHJhZ0xhYmVsUmFk
aXVzICogMiwgRHJhZ0xhYmVsUmFkaXVzICogMildOworICAgIFtwYXRoIGFwcGVuZEJlemllclBh
dGhXaXRoT3ZhbEluUmVjdDogTlNNYWtlUmVjdChpbWFnZVNpemUud2lkdGggLSBEcmFnTGFiZWxS
YWRpdXMgKiAyLCAwLCBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07
CisKKyAgICBbcGF0aCBhcHBlbmRCZXppZXJQYXRoV2l0aFJlY3Q6IE5TTWFrZVJlY3QoRHJhZ0xh
YmVsUmFkaXVzLCAwLCBpbWFnZVNpemUud2lkdGggLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBpbWFn
ZVNpemUuaGVpZ2h0KV07CisgICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhSZWN0OiBOU01h
a2VSZWN0KDAsIERyYWdMYWJlbFJhZGl1cywgRHJhZ0xhYmVsUmFkaXVzICsgMTAsIGltYWdlU2l6
ZS5oZWlnaHQgLSAyICogRHJhZ0xhYmVsUmFkaXVzKV07CisgICAgW3BhdGggYXBwZW5kQmV6aWVy
UGF0aFdpdGhSZWN0OiBOU01ha2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1
cyAtIDIwLCBEcmFnTGFiZWxSYWRpdXMsIERyYWdMYWJlbFJhZGl1cyArIDIwLCBpbWFnZVNpemUu
aGVpZ2h0IC0gMiAqIERyYWdMYWJlbFJhZGl1cyldOworICAgIFtwYXRoIGZpbGxdOworCisgICAg
TlNDb2xvciAqdG9wQ29sb3IgPSBbTlNDb2xvciBjb2xvcldpdGhEZXZpY2VXaGl0ZTowLjBmIGFs
cGhhOjAuNzVmXTsKKyAgICBOU0NvbG9yICpib3R0b21Db2xvciA9IFtOU0NvbG9yIGNvbG9yV2l0
aERldmljZVdoaXRlOjEuMGYgYWxwaGE6MC41Zl07CisgICAgaWYgKGRyYXdVUkxTdHJpbmcpIHsK
KyAgICAgICAgaWYgKGNsaXBVUkxTdHJpbmcpCisgICAgICAgICAgICB1cmxTdHJpbmcgPSBbV2Vi
U3RyaW5nVHJ1bmNhdG9yIGNlbnRlclRydW5jYXRlU3RyaW5nOiB1cmxTdHJpbmcgdG9XaWR0aDpp
bWFnZVNpemUud2lkdGggLSAoRHJhZ0xhYmVsQm9yZGVyWCAqIDIpIHdpdGhGb250OnVybEZvbnRd
OworCisgICAgICAgW3VybFN0cmluZyBfd2ViX2RyYXdEb3VibGVkQXRQb2ludDpOU01ha2VQb2lu
dChEcmFnTGFiZWxCb3JkZXJYLCBEcmFnTGFiZWxCb3JkZXJZIC0gW3VybEZvbnQgZGVzY2VuZGVy
XSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhUb3BDb2xvcjp0b3BDb2xvciBi
b3R0b21Db2xvcjpib3R0b21Db2xvciBmb250OnVybEZvbnRdOworICAgIH0KKworICAgIGlmIChj
bGlwTGFiZWxTdHJpbmcpCisgICAgICAgIGxhYmVsID0gW1dlYlN0cmluZ1RydW5jYXRvciByaWdo
dFRydW5jYXRlU3RyaW5nOiBsYWJlbCB0b1dpZHRoOmltYWdlU2l6ZS53aWR0aCAtIChEcmFnTGFi
ZWxCb3JkZXJYICogMikgd2l0aEZvbnQ6bGFiZWxGb250XTsKKyAgICBbbGFiZWwgX3dlYl9kcmF3
RG91YmxlZEF0UG9pbnQ6TlNNYWtlUG9pbnQgKERyYWdMYWJlbEJvcmRlclgsIGltYWdlU2l6ZS5o
ZWlnaHQgLSBMYWJlbEJvcmRlcllPZmZzZXQgLSBbbGFiZWxGb250IHBvaW50U2l6ZV0pCisgICAg
ICAgICAgICAgICAgICAgICAgd2l0aFRvcENvbG9yOnRvcENvbG9yIGJvdHRvbUNvbG9yOmJvdHRv
bUNvbG9yIGZvbnQ6bGFiZWxGb250XTsKKworICAgIFtkcmFnSW1hZ2UgdW5sb2NrRm9jdXNdOwor
CisgICAgcmV0dXJuIGRyYWdJbWFnZTsKK30KKyAgIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQog
CiAjZW5kaWYgLy8gRU5BQkxFKERSQUdfU1VQUE9SVCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uY3BwCShyZXZpc2lv
biA3NzgyNCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRp
ZXNXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKICNpbmNsdWRlICJtYXJr
dXAuaCIKKyNpbmNsdWRlIDxzaGxvYmouaD4KICNpbmNsdWRlIDxzaGx3YXBpLmg+CiAjaW5jbHVk
ZSA8d2luaW5ldC5oPiAvLyBmb3IgSU5URVJORVRfTUFYX1VSTF9MRU5HVEgKICNpbmNsdWRlIDx3
dGYvU3RyaW5nRXh0cmFzLmg+CkBAIC02MTksNyArNjIwLDE5IEBAIGJvb2wgY29udGFpbnNIVE1M
KGNvbnN0IERyYWdEYXRhTWFwKiBkYXQKIH0KIAogdHlwZWRlZiB2b2lkICgqR2V0U3RyaW5nRnVu
Y3Rpb24pKElEYXRhT2JqZWN0KiwgRk9STUFURVRDKiwgVmVjdG9yPFN0cmluZz4mKTsKLXR5cGVk
ZWYgSGFzaE1hcDxVSU5ULCBHZXRTdHJpbmdGdW5jdGlvbj4gQ2xpcGJvYXJkRm9ybWF0TWFwOwor
dHlwZWRlZiB2b2lkICgqU2V0U3RyaW5nRnVuY3Rpb24pKElEYXRhT2JqZWN0KiwgRk9STUFURVRD
KiwgY29uc3QgVmVjdG9yPFN0cmluZz4mKTsKKworc3RydWN0IENsaXBib2FyZERhdGFJdGVtIHsK
KyAgICBHZXRTdHJpbmdGdW5jdGlvbiBnZXRTdHJpbmc7CisgICAgU2V0U3RyaW5nRnVuY3Rpb24g
c2V0U3RyaW5nOworICAgIEZPUk1BVEVUQyogZm9ybWF0OworCisgICAgQ2xpcGJvYXJkRGF0YUl0
ZW0oRk9STUFURVRDKiBmb3JtYXQsIEdldFN0cmluZ0Z1bmN0aW9uIGdldFN0cmluZywgU2V0U3Ry
aW5nRnVuY3Rpb24gc2V0U3RyaW5nKTogZm9ybWF0KGZvcm1hdCksIGdldFN0cmluZyhnZXRTdHJp
bmcpLCBzZXRTdHJpbmcoc2V0U3RyaW5nKSB7IH0KK307CisKK3R5cGVkZWYgSGFzaE1hcDxVSU5U
LCBDbGlwYm9hcmREYXRhSXRlbSo+IENsaXBib2FyZEZvcm1hdE1hcDsKKworLy8gR2V0dGVyIGZ1
bmN0aW9ucy4KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBnZXRTdHJpbmdEYXRhKElEYXRh
T2JqZWN0KiBkYXRhLCBGT1JNQVRFVEMqIGZvcm1hdCwgVmVjdG9yPFN0cmluZz4mIGRhdGFTdHJp
bmdzKQogewpAQCAtNjQyLDcgKzY1NSw3IEBAIHZvaWQgZ2V0VXRmOERhdGEoSURhdGFPYmplY3Qq
IGRhdGEsIEZPUk0KIH0KIAogI2lmIFBMQVRGT1JNKENGKQotdm9pZCBnZXRDZkRhdGEoSURhdGFP
YmplY3QqIGRhdGEsIEZPUk1BVEVUQyogZm9ybWF0LCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmlu
Z3MpCit2b2lkIGdldENGRGF0YShJRGF0YU9iamVjdCogZGF0YSwgRk9STUFURVRDKiBmb3JtYXQs
IFZlY3RvcjxTdHJpbmc+JiBkYXRhU3RyaW5ncykKIHsKICAgICBTVEdNRURJVU0gc3RvcmU7CiAg
ICAgaWYgKEZBSUxFRChkYXRhLT5HZXREYXRhKGZvcm1hdCwgJnN0b3JlKSkpCkBAIC02NjUsMjYg
KzY3OCw5MyBAQCB2b2lkIGdldENmRGF0YShJRGF0YU9iamVjdCogZGF0YSwgRk9STUFUCiB9CiAj
ZW5kaWYKIAotdm9pZCBnZXRDbGlwYm9hcmREYXRhKElEYXRhT2JqZWN0ICpkYXRhT2JqZWN0LCBG
T1JNQVRFVEMqIGZvcm1hdCwgVmVjdG9yPFN0cmluZz4mIGRhdGFTdHJpbmdzKQorLy8gU2V0dGVy
IGZ1bmN0aW9ucy4KKwordm9pZCBzZXRVQ2hhckRhdGEoSURhdGFPYmplY3QqIGRhdGEsIEZPUk1B
VEVUQyogZm9ybWF0LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7CisgICAg
U1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9IR0xPQkFM
OworCisgICAgbWVkaXVtLmhHbG9iYWwgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGFTdHJpbmdzLmZp
cnN0KCkpOworICAgIGlmICghbWVkaXVtLmhHbG9iYWwpCisgICAgICAgIHJldHVybjsKKyAgICBk
YXRhLT5TZXREYXRhKGZvcm1hdCwgJm1lZGl1bSwgRkFMU0UpOworICAgIDo6R2xvYmFsRnJlZSht
ZWRpdW0uaEdsb2JhbCk7Cit9CisKK3ZvaWQgc2V0VXRmOERhdGEoSURhdGFPYmplY3QqIGRhdGEs
IEZPUk1BVEVUQyogZm9ybWF0LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7
CisgICAgU1RHTUVESVVNIG1lZGl1bSA9IHswfTsKKyAgICBtZWRpdW0udHltZWQgPSBUWU1FRF9I
R0xPQkFMOworCisgICAgQ1N0cmluZyBjaGFyU3RyaW5nID0gZGF0YVN0cmluZ3MuZmlyc3QoKS51
dGY4KCk7CisgICAgc2l6ZV90IHN0cmluZ0xlbmd0aCA9IGNoYXJTdHJpbmcubGVuZ3RoKCk7Cisg
ICAgbWVkaXVtLmhHbG9iYWwgPSA6Okdsb2JhbEFsbG9jKEdQVFIsIHN0cmluZ0xlbmd0aCArIDEp
OworICAgIGlmICghbWVkaXVtLmhHbG9iYWwpCisgICAgICAgIHJldHVybjsKKyAgICBjaGFyKiBi
dWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oOjpHbG9iYWxMb2NrKG1lZGl1bS5oR2xvYmFsKSk7
CisgICAgbWVtY3B5KGJ1ZmZlciwgY2hhclN0cmluZy5kYXRhKCksIHN0cmluZ0xlbmd0aCk7Cisg
ICAgYnVmZmVyW3N0cmluZ0xlbmd0aF0gPSAwOworICAgIDo6R2xvYmFsVW5sb2NrKG1lZGl1bS5o
R2xvYmFsKTsKKyAgICBkYXRhLT5TZXREYXRhKGZvcm1hdCwgJm1lZGl1bSwgRkFMU0UpOworICAg
IDo6R2xvYmFsRnJlZShtZWRpdW0uaEdsb2JhbCk7Cit9CisKKyNpZiBQTEFURk9STShDRikKK3Zv
aWQgc2V0Q0ZEYXRhKElEYXRhT2JqZWN0KiBkYXRhLCBGT1JNQVRFVEMqIGZvcm1hdCwgY29uc3Qg
VmVjdG9yPFN0cmluZz4mIGRhdGFTdHJpbmdzKQoreworICAgIFNUR01FRElVTSBtZWRpdW0gPSB7
MH07CisgICAgU0laRV9UIGRyb3BGaWxlc1NpemUgPSBzaXplb2YoRFJPUEZJTEVTKSArIChzaXpl
b2YoV0NIQVIpICogKGRhdGFTdHJpbmdzLmZpcnN0KCkubGVuZ3RoKCkgKyAyKSk7CisgICAgbWVk
aXVtLmhHbG9iYWwgPSA6Okdsb2JhbEFsbG9jKEdITkQgfCBHTUVNX1NIQVJFLCBkcm9wRmlsZXNT
aXplKTsKKyAgICBpZiAoIW1lZGl1bS5oR2xvYmFsKSAKKyAgICAgICAgcmV0dXJuOworCisgICAg
RFJPUEZJTEVTKiBkcm9wRmlsZXMgPSByZWludGVycHJldF9jYXN0PERST1BGSUxFUyAqPig6Okds
b2JhbExvY2sobWVkaXVtLmhHbG9iYWwpKTsKKyAgICBkcm9wRmlsZXMtPnBGaWxlcyA9IHNpemVv
ZihEUk9QRklMRVMpOworICAgIGRyb3BGaWxlcy0+ZldpZGUgPSBUUlVFOworICAgIFN0cmluZyBm
aWxlbmFtZSA9IGRhdGFTdHJpbmdzWzBdOworICAgIHdjc2NweShyZWludGVycHJldF9jYXN0PExQ
V1NUUj4oZHJvcEZpbGVzICsgMSksIGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0
aW9uKCkpOyAgICAKKyAgICA6Okdsb2JhbFVubG9jayhtZWRpdW0uaEdsb2JhbCk7CisgICAgZGF0
YS0+U2V0RGF0YShmb3JtYXQsICZtZWRpdW0sIEZBTFNFKTsKKyAgICA6Okdsb2JhbEZyZWUobWVk
aXVtLmhHbG9iYWwpOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBDbGlwYm9hcmRGb3JtYXRN
YXAmIGdldENsaXBib2FyZE1hcCgpCiB7CiAgICAgc3RhdGljIENsaXBib2FyZEZvcm1hdE1hcCBm
b3JtYXRNYXA7CiAgICAgaWYgKGZvcm1hdE1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgZm9ybWF0
TWFwLmFkZChodG1sRm9ybWF0KCktPmNmRm9ybWF0LCBnZXRVdGY4RGF0YSk7Ci0gICAgICAgIGZv
cm1hdE1hcC5hZGQodGV4dGh0bWxGb3JtYXQoKS0+Y2ZGb3JtYXQsIGdldFN0cmluZ0RhdGE8VUNo
YXI+KTsKLSAgICAgICAgZm9ybWF0TWFwLmFkZChwbGFpblRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQs
IGdldFN0cmluZ0RhdGE8Y2hhcj4pOwotICAgICAgICBmb3JtYXRNYXAuYWRkKHBsYWluVGV4dFdG
b3JtYXQoKS0+Y2ZGb3JtYXQsIGdldFN0cmluZ0RhdGE8VUNoYXI+KTsKKyAgICAgICAgZm9ybWF0
TWFwLmFkZChodG1sRm9ybWF0KCktPmNmRm9ybWF0LCBuZXcgQ2xpcGJvYXJkRGF0YUl0ZW0oaHRt
bEZvcm1hdCgpLCBnZXRVdGY4RGF0YSwgc2V0VXRmOERhdGEpKTsKKyAgICAgICAgZm9ybWF0TWFw
LmFkZCh0ZXh0aHRtbEZvcm1hdCgpLT5jZkZvcm1hdCwgbmV3IENsaXBib2FyZERhdGFJdGVtKHRl
eHRodG1sRm9ybWF0KCksIGdldFN0cmluZ0RhdGE8VUNoYXI+LCBzZXRVQ2hhckRhdGEpKTsKKyAg
ICAgICAgZm9ybWF0TWFwLmFkZChwbGFpblRleHRGb3JtYXQoKS0+Y2ZGb3JtYXQsICBuZXcgQ2xp
cGJvYXJkRGF0YUl0ZW0ocGxhaW5UZXh0Rm9ybWF0KCksIGdldFN0cmluZ0RhdGE8Y2hhcj4sIHNl
dFV0ZjhEYXRhKSk7CisgICAgICAgIGZvcm1hdE1hcC5hZGQocGxhaW5UZXh0V0Zvcm1hdCgpLT5j
ZkZvcm1hdCwgIG5ldyBDbGlwYm9hcmREYXRhSXRlbShwbGFpblRleHRXRm9ybWF0KCksIGdldFN0
cmluZ0RhdGE8VUNoYXI+LCBzZXRVQ2hhckRhdGEpKTsKICNpZiBQTEFURk9STShDRikKLSAgICAg
ICAgZm9ybWF0TWFwLmFkZChjZkhEcm9wRm9ybWF0KCktPmNmRm9ybWF0LCBnZXRDZkRhdGEpOwor
ICAgICAgICBmb3JtYXRNYXAuYWRkKGNmSERyb3BGb3JtYXQoKS0+Y2ZGb3JtYXQsICBuZXcgQ2xp
cGJvYXJkRGF0YUl0ZW0oY2ZIRHJvcEZvcm1hdCgpLCBnZXRDRkRhdGEsIHNldENGRGF0YSkpOwog
I2VuZGlmCi0gICAgICAgIGZvcm1hdE1hcC5hZGQoZmlsZW5hbWVGb3JtYXQoKS0+Y2ZGb3JtYXQs
IGdldFN0cmluZ0RhdGE8Y2hhcj4pOwotICAgICAgICBmb3JtYXRNYXAuYWRkKGZpbGVuYW1lV0Zv
cm1hdCgpLT5jZkZvcm1hdCwgZ2V0U3RyaW5nRGF0YTxVQ2hhcj4pOwotICAgICAgICBmb3JtYXRN
YXAuYWRkKHVybEZvcm1hdCgpLT5jZkZvcm1hdCwgZ2V0U3RyaW5nRGF0YTxjaGFyPik7Ci0gICAg
ICAgIGZvcm1hdE1hcC5hZGQodXJsV0Zvcm1hdCgpLT5jZkZvcm1hdCwgZ2V0U3RyaW5nRGF0YTxV
Q2hhcj4pOworICAgICAgICBmb3JtYXRNYXAuYWRkKGZpbGVuYW1lRm9ybWF0KCktPmNmRm9ybWF0
LCAgbmV3IENsaXBib2FyZERhdGFJdGVtKGZpbGVuYW1lRm9ybWF0KCksIGdldFN0cmluZ0RhdGE8
Y2hhcj4sIHNldFV0ZjhEYXRhKSk7CisgICAgICAgIGZvcm1hdE1hcC5hZGQoZmlsZW5hbWVXRm9y
bWF0KCktPmNmRm9ybWF0LCAgbmV3IENsaXBib2FyZERhdGFJdGVtKGZpbGVuYW1lV0Zvcm1hdCgp
LCBnZXRTdHJpbmdEYXRhPFVDaGFyPiwgc2V0VUNoYXJEYXRhKSk7CisgICAgICAgIGZvcm1hdE1h
cC5hZGQodXJsRm9ybWF0KCktPmNmRm9ybWF0LCAgbmV3IENsaXBib2FyZERhdGFJdGVtKHVybEZv
cm1hdCgpLCBnZXRTdHJpbmdEYXRhPGNoYXI+LCBzZXRVdGY4RGF0YSkpOworICAgICAgICBmb3Jt
YXRNYXAuYWRkKHVybFdGb3JtYXQoKS0+Y2ZGb3JtYXQsICBuZXcgQ2xpcGJvYXJkRGF0YUl0ZW0o
dXJsV0Zvcm1hdCgpLCBnZXRTdHJpbmdEYXRhPFVDaGFyPiwgc2V0VUNoYXJEYXRhKSk7CiAgICAg
fQotICAgIENsaXBib2FyZEZvcm1hdE1hcDo6aXRlcmF0b3IgZm91bmQgPSBmb3JtYXRNYXAuZmlu
ZChmb3JtYXQtPmNmRm9ybWF0KTsKKyAgICByZXR1cm4gZm9ybWF0TWFwOworfQorCit2b2lkIGdl
dENsaXBib2FyZERhdGEoSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIEZPUk1BVEVUQyogZm9ybWF0
LCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpCit7CisgICAgY29uc3QgQ2xpcGJvYXJkRm9y
bWF0TWFwJiBmb3JtYXRNYXAgPSBnZXRDbGlwYm9hcmRNYXAoKTsKKyAgICBDbGlwYm9hcmRGb3Jt
YXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGZvdW5kID0gZm9ybWF0TWFwLmZpbmQoZm9ybWF0LT5jZkZv
cm1hdCk7CisgICAgaWYgKGZvdW5kID09IGZvcm1hdE1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIGZvdW5kLT5zZWNvbmQtPmdldFN0cmluZyhkYXRhT2JqZWN0LCBmb3VuZC0+c2Vjb25k
LT5mb3JtYXQsIGRhdGFTdHJpbmdzKTsKK30KKwordm9pZCBzZXRDbGlwYm9hcmREYXRhKElEYXRh
T2JqZWN0KiBkYXRhT2JqZWN0LCBVSU5UIGZvcm1hdCwgY29uc3QgVmVjdG9yPFN0cmluZz4mIGRh
dGFTdHJpbmdzKQoreworICAgIGNvbnN0IENsaXBib2FyZEZvcm1hdE1hcCYgZm9ybWF0TWFwID0g
Z2V0Q2xpcGJvYXJkTWFwKCk7CisgICAgQ2xpcGJvYXJkRm9ybWF0TWFwOjpjb25zdF9pdGVyYXRv
ciBmb3VuZCA9IGZvcm1hdE1hcC5maW5kKGZvcm1hdCk7CiAgICAgaWYgKGZvdW5kID09IGZvcm1h
dE1hcC5lbmQoKSkKICAgICAgICAgcmV0dXJuOwotICAgIGZvdW5kLT5zZWNvbmQoZGF0YU9iamVj
dCwgZm9ybWF0LCBkYXRhU3RyaW5ncyk7CisgICAgZm91bmQtPnNlY29uZC0+c2V0U3RyaW5nKGRh
dGFPYmplY3QsIGZvdW5kLT5zZWNvbmQtPmZvcm1hdCwgZGF0YVN0cmluZ3MpOwogfQogCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ2xp
cGJvYXJkVXRpbGl0aWVzV2luLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vd2luL0NsaXBib2FyZFV0aWxpdGllc1dpbi5oCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9DbGlwYm9hcmRVdGlsaXRpZXNXaW4uaAkod29ya2luZyBj
b3B5KQpAQCAtNzUsNiArNzUsNyBAQCBTdHJpbmcgZ2V0Q0ZIVE1MKElEYXRhT2JqZWN0KiwgYm9v
bCYgc3VjCiBTdHJpbmcgZ2V0Q0ZIVE1MKGNvbnN0IERyYWdEYXRhTWFwKik7CiAKIHZvaWQgZ2V0
Q2xpcGJvYXJkRGF0YShJRGF0YU9iamVjdCosIEZPUk1BVEVUQyogZmV0YywgVmVjdG9yPFN0cmlu
Zz4mIGRhdGFTdHJpbmdzKTsKK3ZvaWQgc2V0Q2xpcGJvYXJkRGF0YShJRGF0YU9iamVjdCosIFVJ
TlQgZm9ybWF0LCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgZGF0YVN0cmluZ3MpOwogCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9EcmFn
SW1hZ2VXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9E
cmFnSW1hZ2VXaW4uY3BwCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3dpbi9EcmFnSW1hZ2VXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNywxNCArMjcsMjUg
QEAKICNpbmNsdWRlICJEcmFnSW1hZ2UuaCIKIAogI2luY2x1ZGUgIkNhY2hlZEltYWdlLmgiCisj
aW5jbHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUg
IkZvbnRTZWxlY3Rvci5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJSZXRhaW5QdHIuaCIKKyNp
bmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIlN0cmluZ1RydW5jYXRvci5oIgorI2luY2x1
ZGUgIlRleHRSdW4uaCIKKyNpbmNsdWRlICJXZWJDb3JlVGV4dFJlbmRlcmVyLmgiCiAKICNpbmNs
dWRlIDx3aW5kb3dzLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorSEJJVE1BUCBhbGxvY0lt
YWdlKEhEQywgSW50U2l6ZSwgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqKiB0YXJnZXRSZWYpOwor
dm9pZCBkZWFsbG9jQ29udGV4dChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogdGFyZ2V0KTsKKwog
SW50U2l6ZSBkcmFnSW1hZ2VTaXplKERyYWdJbWFnZVJlZiBpbWFnZSkKIHsKICAgICBpZiAoIWlt
YWdlKQpAQCAtNzksNSArOTAsMTQxIEBAIERyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VJY29u
Rm9yQ2FjaGUKIAogICAgIHJldHVybiBpY29uSW5mby5oYm1Db2xvcjsKIH0KKworY29uc3QgZmxv
YXQgRHJhZ0xhYmVsQm9yZGVyWCA9IDQ7CisvLyBLZWVwIGJvcmRlcl95IGluIHN5bmNoIHdpdGgg
RHJhZ0NvbnRyb2xsZXI6OkxpbmtEcmFnQm9yZGVySW5zZXQuCitjb25zdCBmbG9hdCBEcmFnTGFi
ZWxCb3JkZXJZID0gMjsKK2NvbnN0IGZsb2F0IERyYWdMYWJlbFJhZGl1cyA9IDU7Citjb25zdCBm
bG9hdCBMYWJlbEJvcmRlcllPZmZzZXQgPSAyOworCitjb25zdCBmbG9hdCBNaW5EcmFnTGFiZWxX
aWR0aEJlZm9yZUNsaXAgPSAxMjA7Citjb25zdCBmbG9hdCBNYXhEcmFnTGFiZWxXaWR0aCA9IDIw
MDsKK2NvbnN0IGZsb2F0IE1heERyYWdMYWJlbFN0cmluZ1dpZHRoID0gKE1heERyYWdMYWJlbFdp
ZHRoIC0gMiAqIERyYWdMYWJlbEJvcmRlclgpOworCitjb25zdCBmbG9hdCBEcmFnTGlua0xhYmVs
Rm9udHNpemUgPSAxMTsKK2NvbnN0IGZsb2F0IERyYWdMaW5rVXJsRm9udFNpemUgPSAxMDsKKwor
c3RhdGljIEZvbnQgZHJhZ0xhYmVsRm9udChpbnQgc2l6ZSwgYm9vbCBib2xkLCBGb250UmVuZGVy
aW5nTW9kZSByZW5kZXJpbmdNb2RlKQoreworICAgIE5PTkNMSUVOVE1FVFJJQ1MgbWV0cmljczsK
KyAgICBtZXRyaWNzLmNiU2l6ZSA9IHNpemVvZihtZXRyaWNzKTsKKyAgICBTeXN0ZW1QYXJhbWV0
ZXJzSW5mbyhTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgbWV0cmljcy5jYlNpemUsICZtZXRyaWNz
LCAwKTsKKworICAgIEZvbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbjsKKyAgICBkZXNjcmlwdGlv
bi5zZXRXZWlnaHQoYm9sZCA/IEZvbnRXZWlnaHRCb2xkIDogRm9udFdlaWdodE5vcm1hbCk7CisK
KyAgICBGb250RmFtaWx5IGZhbWlseTsKKyAgICBmYW1pbHkuc2V0RmFtaWx5KG1ldHJpY3MubGZT
bUNhcHRpb25Gb250LmxmRmFjZU5hbWUpOworICAgIGRlc2NyaXB0aW9uLnNldEZhbWlseShmYW1p
bHkpOworICAgIGRlc2NyaXB0aW9uLnNldFNwZWNpZmllZFNpemUoKGZsb2F0KXNpemUpOworICAg
IGRlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZSgoZmxvYXQpc2l6ZSk7CisgICAgZGVzY3JpcHRp
b24uc2V0UmVuZGVyaW5nTW9kZShyZW5kZXJpbmdNb2RlKTsKKyAgICBGb250IHJlc3VsdCA9IEZv
bnQoZGVzY3JpcHRpb24sIDAsIDApOyAKKyAgICByZXN1bHQudXBkYXRlKDApOworICAgIHJldHVy
biByZXN1bHQ7Cit9CisKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rKEtVUkwm
IHVybCwgY29uc3QgU3RyaW5nJiBpbkxhYmVsLCBGcmFtZSogZnJhbWUpCit7CisgICAgLy8gVGhp
cyBpcyBtb3JlIG9yIGxlc3MgYW4gZXhhY3QgbWF0Y2ggZm9yIHRoZSBNYWMgT1MgWCBjb2RlLgor
CisgICAgY29uc3QgRm9udCogbGFiZWxGb250OworICAgIGNvbnN0IEZvbnQqIHVybEZvbnQ7CisK
KyAgICBpZiAoZnJhbWUtPnNldHRpbmdzKCkgJiYgZnJhbWUtPnNldHRpbmdzKCktPmZvbnRSZW5k
ZXJpbmdNb2RlKCkgPT0gQWx0ZXJuYXRlUmVuZGVyaW5nTW9kZSkgeworICAgICAgICBzdGF0aWMg
Y29uc3QgRm9udCBhbHRlcm5hdGVSZW5kZXJpbmdNb2RlTGFiZWxGb250ID0gZHJhZ0xhYmVsRm9u
dChEcmFnTGlua0xhYmVsRm9udHNpemUsIHRydWUsIEFsdGVybmF0ZVJlbmRlcmluZ01vZGUpOwor
ICAgICAgICBzdGF0aWMgY29uc3QgRm9udCBhbHRlcm5hdGVSZW5kZXJpbmdNb2RlVVJMRm9udCA9
IGRyYWdMYWJlbEZvbnQoRHJhZ0xpbmtVcmxGb250U2l6ZSwgZmFsc2UsIEFsdGVybmF0ZVJlbmRl
cmluZ01vZGUpOworICAgICAgICBsYWJlbEZvbnQgPSAmYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZUxh
YmVsRm9udDsKKyAgICAgICAgdXJsRm9udCA9ICZhbHRlcm5hdGVSZW5kZXJpbmdNb2RlVVJMRm9u
dDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgY29uc3QgRm9udCBub3JtYWxSZW5kZXJp
bmdNb2RlTGFiZWxGb250ID0gZHJhZ0xhYmVsRm9udChEcmFnTGlua0xhYmVsRm9udHNpemUsIHRy
dWUsIE5vcm1hbFJlbmRlcmluZ01vZGUpOworICAgICAgICBzdGF0aWMgY29uc3QgRm9udCBub3Jt
YWxSZW5kZXJpbmdNb2RlVVJMRm9udCA9IGRyYWdMYWJlbEZvbnQoRHJhZ0xpbmtVcmxGb250U2l6
ZSwgZmFsc2UsIE5vcm1hbFJlbmRlcmluZ01vZGUpOworICAgICAgICBsYWJlbEZvbnQgPSAmbm9y
bWFsUmVuZGVyaW5nTW9kZUxhYmVsRm9udDsKKyAgICAgICAgdXJsRm9udCA9ICZub3JtYWxSZW5k
ZXJpbmdNb2RlVVJMRm9udDsKKyAgICB9CisKKyAgICBib29sIGRyYXdVUkxTdHJpbmcgPSB0cnVl
OworICAgIGJvb2wgY2xpcFVSTFN0cmluZyA9IGZhbHNlOworICAgIGJvb2wgY2xpcExhYmVsU3Ry
aW5nID0gZmFsc2U7CisKKyAgICBTdHJpbmcgdXJsU3RyaW5nID0gdXJsLnN0cmluZygpOyAKKyAg
ICBTdHJpbmcgbGFiZWwgPSBpbkxhYmVsOworICAgIGlmIChsYWJlbC5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgZHJhd1VSTFN0cmluZyA9IGZhbHNlOworICAgICAgICBsYWJlbCA9IHVybFN0cmluZzsK
KyAgICB9CisKKyAgICAvLyBGaXJzdCBzdGVwIGluIGRyYXdpbmcgdGhlIGxpbmsgZHJhZyBpbWFn
ZSB3aWR0aC4KKyAgICBUZXh0UnVuIGxhYmVsUnVuKGxhYmVsLmltcGwoKSk7CisgICAgVGV4dFJ1
biB1cmxSdW4odXJsU3RyaW5nLmltcGwoKSk7CisgICAgSW50U2l6ZSBsYWJlbFNpemUobGFiZWxG
b250LT53aWR0aChsYWJlbFJ1biksIGxhYmVsRm9udC0+Zm9udE1ldHJpY3MoKS5hc2NlbnQoKSAr
IGxhYmVsRm9udC0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCkpOworCisgICAgaWYgKGxhYmVsU2l6
ZS53aWR0aCgpID4gTWF4RHJhZ0xhYmVsU3RyaW5nV2lkdGgpIHsKKyAgICAgICAgbGFiZWxTaXpl
LnNldFdpZHRoKE1heERyYWdMYWJlbFN0cmluZ1dpZHRoKTsKKyAgICAgICAgY2xpcExhYmVsU3Ry
aW5nID0gdHJ1ZTsKKyAgICB9CiAgICAgCisgICAgSW50U2l6ZSB1cmxTdHJpbmdTaXplOworICAg
IEludFNpemUgaW1hZ2VTaXplKGxhYmVsU2l6ZS53aWR0aCgpICsgRHJhZ0xhYmVsQm9yZGVyWCAq
IDIsIGxhYmVsU2l6ZS5oZWlnaHQoKSArIERyYWdMYWJlbEJvcmRlclkgKiAyKTsKKworICAgIGlm
IChkcmF3VVJMU3RyaW5nKSB7CisgICAgICAgIHVybFN0cmluZ1NpemUuc2V0V2lkdGgodXJsRm9u
dC0+d2lkdGgodXJsUnVuKSk7CisgICAgICAgIHVybFN0cmluZ1NpemUuc2V0SGVpZ2h0KHVybEZv
bnQtPmZvbnRNZXRyaWNzKCkuYXNjZW50KCkgKyB1cmxGb250LT5mb250TWV0cmljcygpLmRlc2Nl
bnQoKSk7IAorICAgICAgICBpbWFnZVNpemUuc2V0SGVpZ2h0KGltYWdlU2l6ZS5oZWlnaHQoKSAr
IHVybFN0cmluZ1NpemUuaGVpZ2h0KCkpOworICAgICAgICBpZiAodXJsU3RyaW5nU2l6ZS53aWR0
aCgpID4gTWF4RHJhZ0xhYmVsU3RyaW5nV2lkdGgpIHsKKyAgICAgICAgICAgIGltYWdlU2l6ZS5z
ZXRXaWR0aChNYXhEcmFnTGFiZWxXaWR0aCk7CisgICAgICAgICAgICBjbGlwVVJMU3RyaW5nID0g
dHJ1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpbWFnZVNpemUuc2V0V2lkdGgoc3Rk
OjptYXgobGFiZWxTaXplLndpZHRoKCksIHVybFN0cmluZ1NpemUud2lkdGgoKSkgKyBEcmFnTGFi
ZWxCb3JkZXJYICogMik7CisgICAgfQorCisgICAgLy8gV2Ugbm93IGtub3cgaG93IGJpZyB0aGUg
aW1hZ2UgbmVlZHMgdG8gYmUsIHNvIHdlIGNyZWF0ZSBhbmQKKyAgICAvLyBmaWxsIHRoZSBiYWNr
Z3JvdW5kCisgICAgSEJJVE1BUCBpbWFnZSA9IDA7CisgICAgSERDIGRjID0gR2V0REMoMCk7Cisg
ICAgSERDIHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhkYyk7CisgICAgaWYgKCF3b3Jr
aW5nREMpIHsKKyAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGNvbnRleHRSZWY7CisgICAgaW1h
Z2UgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1hZ2VTaXplLCAmY29udGV4dFJlZik7CisgICAg
aWYgKCFpbWFnZSkgeworICAgICAgICBEZWxldGVEQyh3b3JraW5nREMpOworICAgICAgICBSZWxl
YXNlREMoMCwgZGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgICAgIAorICAgIFNl
bGVjdE9iamVjdCh3b3JraW5nREMsIGltYWdlKTsKKyAgICBHcmFwaGljc0NvbnRleHQgY29udGV4
dChjb250ZXh0UmVmKTsKKyAgICAvLyBPbiBNYWMgYWxwaGEgaXMgezAuNywgMC43LCAwLjcsIDAu
OH0sIGhvd2V2ZXIgd2UgY2FuJ3QgY29udHJvbCBhbHBoYQorICAgIC8vIGZvciBkcmFnIGltYWdl
cyBvbiB3aW4sIHNvIHdlIHVzZSAxCisgICAgc3RhdGljIGNvbnN0IENvbG9yIGJhY2tncm91bmRD
b2xvcigxNDAsIDE0MCwgMTQwKTsKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSByYWRpaShEcmFn
TGFiZWxSYWRpdXMsIERyYWdMYWJlbFJhZGl1cyk7CisgICAgSW50UmVjdCByZWN0KDAsIDAsIGlt
YWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpOworICAgIGNvbnRleHQuZmlsbFJv
dW5kZWRSZWN0KHJlY3QsIHJhZGlpLCByYWRpaSwgcmFkaWksIHJhZGlpLCBiYWNrZ3JvdW5kQ29s
b3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOworIAorICAgIC8vIERyYXcgdGhlIHRleHQKKyAgICBz
dGF0aWMgY29uc3QgQ29sb3IgdG9wQ29sb3IoMCwgMCwgMCwgMjU1KTsgLy8gb3JpZ2luYWwgYWxw
aGEgPSAwLjc1CisgICAgc3RhdGljIGNvbnN0IENvbG9yIGJvdHRvbUNvbG9yKDI1NSwgMjU1LCAy
NTUsIDEyNyk7IC8vIG9yaWdpbmFsIGFscGhhID0gMC41CisgICAgaWYgKGRyYXdVUkxTdHJpbmcp
IHsKKyAgICAgICAgaWYgKGNsaXBVUkxTdHJpbmcpCisgICAgICAgICAgICB1cmxTdHJpbmcgPSBT
dHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUodXJsU3RyaW5nLCBpbWFnZVNpemUud2lkdGgo
KSAtIChEcmFnTGFiZWxCb3JkZXJYICogMi4wZiksICp1cmxGb250LCBmYWxzZSk7CisgICAgICAg
IEludFBvaW50IHRleHRQb3MoRHJhZ0xhYmVsQm9yZGVyWCwgaW1hZ2VTaXplLmhlaWdodCgpIC0g
KExhYmVsQm9yZGVyWU9mZnNldCArIHVybEZvbnQtPmZvbnRNZXRyaWNzKCkuZGVzY2VudCgpKSk7
CisgICAgICAgIFdlYkNvcmVEcmF3RG91YmxlZFRleHRBdFBvaW50KGNvbnRleHQsIHVybFN0cmlu
ZywgdGV4dFBvcywgKnVybEZvbnQsIHRvcENvbG9yLCBib3R0b21Db2xvcik7CisgICAgfQorICAg
IAorICAgIGlmIChjbGlwTGFiZWxTdHJpbmcpCisgICAgICAgIGxhYmVsID0gU3RyaW5nVHJ1bmNh
dG9yOjpyaWdodFRydW5jYXRlKGxhYmVsLCBpbWFnZVNpemUud2lkdGgoKSAtIChEcmFnTGFiZWxC
b3JkZXJYICogMi4wZiksICpsYWJlbEZvbnQsIGZhbHNlKTsKKworICAgIEludFBvaW50IHRleHRQ
b3MoRHJhZ0xhYmVsQm9yZGVyWCwgRHJhZ0xhYmVsQm9yZGVyWSArIGxhYmVsRm9udC0+cGl4ZWxT
aXplKCkpOworICAgIFdlYkNvcmVEcmF3RG91YmxlZFRleHRBdFBvaW50KGNvbnRleHQsIGxhYmVs
LCB0ZXh0UG9zLCAqbGFiZWxGb250LCB0b3BDb2xvciwgYm90dG9tQ29sb3IpOworCisgICAgZGVh
bGxvY0NvbnRleHQoY29udGV4dFJlZik7CisgICAgRGVsZXRlREMod29ya2luZ0RDKTsKKyAgICBS
ZWxlYXNlREMoMCwgZGMpOworICAgIHJldHVybiBpbWFnZTsKK30KKwogfQpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5jcHAJKHJldmlzaW9uIDc3ODI0
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJXQ0RhdGFPYmplY3QuaCIKIAorI2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGllc1dpbi5oIgor
I2luY2x1ZGUgIkRyYWdEYXRhLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewpAQCAtMTYwLDYgKzE2MiwxNyBAQCBIUkVTVUxUIFdDRGF0YU9iamVj
dDo6Y3JlYXRlSW5zdGFuY2UoV0NECiAgICAgcmV0dXJuIFNfT0s7CiB9CiAKK0hSRVNVTFQgV0NE
YXRhT2JqZWN0OjpjcmVhdGVJbnN0YW5jZShXQ0RhdGFPYmplY3QqKiByZXN1bHQsIGNvbnN0IERy
YWdEYXRhTWFwJiBkYXRhTWFwKQoreworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4g
RV9QT0lOVEVSOworICAgICpyZXN1bHQgPSBuZXcgV0NEYXRhT2JqZWN0OworCisgICAgZm9yIChE
cmFnRGF0YU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkYXRhTWFwLmJlZ2luKCk7IGl0ICE9IGRh
dGFNYXAuZW5kKCk7ICsraXQpCisgICAgICAgIHNldENsaXBib2FyZERhdGEoKnJlc3VsdCwgaXQt
PmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICByZXR1cm4gU19PSzsKK30KKwogV0NEYXRhT2JqZWN0
OjpXQ0RhdGFPYmplY3QoKQogOiBtX3JlZigxKQogewpAQCAtMzgwLDUgKzM5Myw0IEBAIHZvaWQg
V0NEYXRhT2JqZWN0OjpjbGVhckRhdGEoQ0xJUEZPUk1BVAogICAgIH0KIH0KIAotCiB9CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS93aW4vV0NEYXRhT2JqZWN0LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vd2luL1dDRGF0YU9iamVjdC5oCShyZXZpc2lvbiA3
NzgyNCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3dpbi9XQ0RhdGFPYmplY3QuaAkod29y
a2luZyBjb3B5KQpAQCAtMjYsMTAgKzI2LDExIEBACiAjaWZuZGVmIFdDRGF0YU9iamVjdF9oCiAj
ZGVmaW5lIFdDRGF0YU9iamVjdF9oCiAKLSNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgotI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlICJEcmFnRGF0YS5oIgogI2luY2x1ZGUgPFNobE9i
ai5oPgogI2luY2x1ZGUgPG9iamlkbC5oPgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTU2LDYgKzU3
LDcgQEAgcHVibGljOgogICAgIHZvaWQgY2xlYXJEYXRhKENMSVBGT1JNQVQpOwogICAgIAogICAg
IHN0YXRpYyBIUkVTVUxUIGNyZWF0ZUluc3RhbmNlKFdDRGF0YU9iamVjdCoqKTsKKyAgICBzdGF0
aWMgSFJFU1VMVCBjcmVhdGVJbnN0YW5jZShXQ0RhdGFPYmplY3QqKiwgY29uc3QgRHJhZ0RhdGFN
YXAmKTsKIHByaXZhdGU6CiAgICAgV0NEYXRhT2JqZWN0KCk7CiAgICAgdmlydHVhbCB+V0NEYXRh
T2JqZWN0KCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCShyZXZpc2lvbiA3NzgzMykKKysrIFNvdXJjZS9XZWJL
aXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQzIEBACisyMDExLTAyLTA3
ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBw
b3J0IG9uIFdpbmRvd3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD01Mjc3NQorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODUxNDQwOT4KKyAgICAgICAg
CisgICAgICAgIFRoaXMgcGF0Y2ggY29udGFpbnMgdGhlIHJlbWFpbmluZyB3b3JrIHRvIHN1cHBv
cnQKKyAgICAgICAgYSBXZWJLaXQgd2luZG93IGFzIGRyYWcgc291cmNlIG9uIFdpbmRvd3MuCisg
ICAgICAgIEkndmUgYWRkZWQgdGhlIGNvZGUgdG8gZ2VuZXJhdGUgdGhlIGltYWdlIGZvciBkcmFn
Z2luZyBhIGxpbmsgYXMKKyAgICAgICAgd2VsbCBhcyB0aGUgc3RlcHMgbmVjZXNzYXJ5IHRvIHBh
Y2thZ2UgdGhlIEhCSVRNQVAgaW50byBhIFNoYXJlZE1lbW9yeQorICAgICAgICBvYmplY3QgYW5k
IHNlbmQgaXQgb3ZlciB0byB0aGUgVUkgcHJvY2VzcyB3aGVyZSBEb0RyYWdEcm9wIGlzIHBlcmZv
cm1lZC4KKworICAgICAgICAqIFVJUHJvY2Vzcy9XZWJQYWdlUHJveHkuY3BwOgorICAgICAgICAo
V2ViS2l0OjpXZWJQYWdlUHJveHk6OnNldERyYWdJbWFnZSk6CisgICAgICAgIChXZWJLaXQ6Oldl
YlBhZ2VQcm94eTo6c3RhcnREcmFnRHJvcCk6CisgICAgICAgICogVUlQcm9jZXNzL1dlYlBhZ2VQ
cm94eS5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9XZWJQYWdlUHJveHkubWVzc2FnZXMuaW46Cisg
ICAgICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcDoKKyAg
ICAgICAgKFdlYktpdDo6V2ViRHJhZ0NsaWVudDo6c3RhcnREcmFnKTogTWFkZSBzdGFydERyYWcg
Zm9yCisgICAgICAgIHBsYXRmb3JtcyBvdGhlciB0aGFuIFdpbmRvd3MgYW5kIE1hYy4KKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuaDoKKyAgICAgICAg
KiBXZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L21hYy9XZWJEcmFnQ2xpZW50TWFjLm1tOgorICAg
ICAgICAoV2ViS2l0OjpXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcpOgorICAgICAgICAqIFdlYlBy
b2Nlc3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdDbGllbnRXaW4uY3BwOiBBZGRlZC4KKyAg
ICAgICAgKFdlYktpdDo6ZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrVG9EcmFnQ3Vyc29ycyk6
CisgICAgICAgIChXZWJLaXQ6OldlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyk6CisgICAgICAgICog
V2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5jcHA6IEFkZGVkLgor
ICAgICAgICBUaGlzIG9iamVjdCBpbXBsZW1lbnRzIHRoZSBJRHJvcFNvdXJjZSBpbnRlcmZhY2Uu
CisgICAgICAgIChXZWJEcmFnU291cmNlOjpjcmVhdGVJbnN0YW5jZSk6CisgICAgICAgIChXZWJE
cmFnU291cmNlOjpXZWJEcmFnU291cmNlKToKKyAgICAgICAgKFdlYkRyYWdTb3VyY2U6OlF1ZXJ5
SW50ZXJmYWNlKToKKyAgICAgICAgKFdlYkRyYWdTb3VyY2U6OkFkZFJlZik6CisgICAgICAgIChX
ZWJEcmFnU291cmNlOjpSZWxlYXNlKToKKyAgICAgICAgKFdlYkRyYWdTb3VyY2U6OlF1ZXJ5Q29u
dGludWVEcmFnKToKKyAgICAgICAgKFdlYkRyYWdTb3VyY2U6OkdpdmVGZWVkYmFjayk6CisgICAg
ICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5oOiBBZGRl
ZC4KKyAgICAgICAgKiB3aW4vV2ViS2l0Mi52Y3Byb2o6CisKIDIwMTEtMDItMDcgIEFkYW0gUm9i
ZW4gIDxhcm9iZW5AYXBwbGUuY29tPgogCiAgICAgICAgIFVzZSB0aGUgcmlnaHQgY2FsbGluZyBj
b252ZW50aW9uIHdoZW4gY2FsbGluZyBXZWJLaXRNYWluCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjYsNiAr
NjYsMTMgQEAKICNpbmNsdWRlICJXZWJQcm90ZWN0aW9uU3BhY2UuaCIKICNpbmNsdWRlICJXZWJT
ZWN1cml0eU9yaWdpbi5oIgogI2luY2x1ZGUgIldlYlVSTFJlcXVlc3QuaCIKKyNpZiBQTEFURk9S
TShXSU4pCisjaW5jbHVkZSAiV2ViRHJhZ1NvdXJjZS5oIgorI2luY2x1ZGUgPFdlYkNvcmUvQml0
bWFwSW5mby5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQ09NUHRyLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9XQ0RhdGFPYmplY3QuaD4KKyNpbmNsdWRlIDxzaGxvYmouaD4KKyNlbmRpZgogI2luY2x1ZGUg
PFdlYkNvcmUvRHJhZ0RhdGEuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0Zsb2F0UmVjdC5oPgogI2lu
Y2x1ZGUgPFdlYkNvcmUvTUlNRVR5cGVSZWdpc3RyeS5oPgpAQCAtNjYyLDYgKzY2OSw2MyBAQCB2
b2lkIFdlYlBhZ2VQcm94eTo6c2V0RHJhZ0ltYWdlKGNvbnN0IFdlCiB9CiAjZW5kaWYKIAorI2lm
IFBMQVRGT1JNKFdJTikKKwordm9pZCBXZWJQYWdlUHJveHk6OnN0YXJ0RHJhZ0Ryb3AoY29uc3Qg
SW50UG9pbnQmIGltYWdlT3JpZ2luLCBjb25zdCBJbnRQb2ludCYgZHJhZ1BvaW50LCB1aW50NjRf
dCBva0VmZmVjdCwgCisgICAgY29uc3QgSGFzaE1hcDxVSU5ULCBWZWN0b3I8U3RyaW5nPiA+JiBk
YXRhTWFwLCBjb25zdCBJbnRTaXplJiBkcmFnSW1hZ2VTaXplLCBjb25zdCBTaGFyZWRNZW1vcnk6
OkhhbmRsZSYgZHJhZ0ltYWdlSGFuZGxlLCBib29sIGlzTGlua0RyYWcpCit7CisgICAgQ09NUHRy
PFdDRGF0YU9iamVjdD4gZGF0YU9iamVjdDsKKyAgICBXQ0RhdGFPYmplY3Q6OmNyZWF0ZUluc3Rh
bmNlKCZkYXRhT2JqZWN0LCBkYXRhTWFwKTsKKworICAgIFJlZlB0cjxTaGFyZWRNZW1vcnk+IG1l
bW9yeUJ1ZmZlciA9IFNoYXJlZE1lbW9yeTo6Y3JlYXRlKGRyYWdJbWFnZUhhbmRsZSwgU2hhcmVk
TWVtb3J5OjpSZWFkT25seSk7CisgICAgaWYgKCFtZW1vcnlCdWZmZXIpCisgICAgICAgIHJldHVy
bjsKKworICAgIFJlZlB0cjxXZWJEcmFnU291cmNlPiBzb3VyY2UgPSBXZWJEcmFnU291cmNlOjpj
cmVhdGVJbnN0YW5jZSgpOworICAgIGlmICghc291cmNlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBDT01QdHI8SURyYWdTb3VyY2VIZWxwZXI+IGhlbHBlcjsKKyAgICBpZiAoRkFJTEVEKDo6Q29D
cmVhdGVJbnN0YW5jZShDTFNJRF9EcmFnRHJvcEhlbHBlciwgMCwgQ0xTQ1RYX0lOUFJPQ19TRVJW
RVIsIElJRF9JRHJhZ1NvdXJjZUhlbHBlciwgcmVpbnRlcnByZXRfY2FzdDxMUFZPSUQqPigmaGVs
cGVyKSkpKQorICAgICAgICByZXR1cm47CisKKyAgICBCaXRtYXBJbmZvIGJpdG1hcEluZm8gPSBC
aXRtYXBJbmZvOjpjcmVhdGUoZHJhZ0ltYWdlU2l6ZSk7CisgICAgdm9pZCogYml0czsKKyAgICBP
d25QdHI8SEJJVE1BUD4gaGJtcCg6OkNyZWF0ZURJQlNlY3Rpb24oMCwgJmJpdG1hcEluZm8sIERJ
Ql9SR0JfQ09MT1JTLCAmYml0cywgMCwgMCkpOworICAgIG1lbWNweShiaXRzLCBtZW1vcnlCdWZm
ZXItPmRhdGEoKSwgbWVtb3J5QnVmZmVyLT5zaXplKCkpOworCisgICAgU0hEUkFHSU1BR0Ugc2Rp
OworICAgIHNkaS5zaXplRHJhZ0ltYWdlLmN4ID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0
aDsKKyAgICBzZGkuc2l6ZURyYWdJbWFnZS5jeSA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVp
Z2h0OworICAgIHNkaS5jckNvbG9yS2V5ID0gMHhmZmZmZmZmZjsKKyAgICBzZGkuaGJtcERyYWdJ
bWFnZSA9IGhibXAubGVha1B0cigpOworICAgIHNkaS5wdE9mZnNldC54ID0gZHJhZ1BvaW50Lngo
KSAtIGltYWdlT3JpZ2luLngoKTsKKyAgICBzZGkucHRPZmZzZXQueSA9IGRyYWdQb2ludC55KCkg
LSBpbWFnZU9yaWdpbi55KCk7CisgICAgaWYgKGlzTGlua0RyYWcpCisgICAgICAgIHNkaS5wdE9m
ZnNldC55ID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlIZWlnaHQgLSBzZGkucHRPZmZzZXQueTsK
KworICAgIGhlbHBlci0+SW5pdGlhbGl6ZUZyb21CaXRtYXAoJnNkaSwgZGF0YU9iamVjdC5nZXQo
KSk7CisKKyAgICBEV09SRCBlZmZlY3QgPSBEUk9QRUZGRUNUX05PTkU7CisKKyAgICBEcmFnT3Bl
cmF0aW9uIG9wZXJhdGlvbiA9IERyYWdPcGVyYXRpb25Ob25lOworICAgIGlmICg6OkRvRHJhZ0Ry
b3AoZGF0YU9iamVjdC5nZXQoKSwgc291cmNlLmdldCgpLCBva0VmZmVjdCwgJmVmZmVjdCkgPT0g
RFJBR0RST1BfU19EUk9QKSB7CisgICAgICAgIGlmIChlZmZlY3QgJiBEUk9QRUZGRUNUX0NPUFkp
CisgICAgICAgICAgICBvcGVyYXRpb24gPSBEcmFnT3BlcmF0aW9uQ29weTsKKyAgICAgICAgZWxz
ZSBpZiAoZWZmZWN0ICYgRFJPUEVGRkVDVF9MSU5LKQorICAgICAgICAgICAgb3BlcmF0aW9uID0g
RHJhZ09wZXJhdGlvbkxpbms7CisgICAgICAgIGVsc2UgaWYgKGVmZmVjdCAmIERST1BFRkZFQ1Rf
TU9WRSkKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IERyYWdPcGVyYXRpb25Nb3ZlOworICAgIH0K
KyAgICBQT0lOVCBnbG9iYWxQb2ludDsKKyAgICA6OkdldEN1cnNvclBvcygmZ2xvYmFsUG9pbnQp
OworICAgIFBPSU5UIGxvY2FsUG9pbnQgPSBnbG9iYWxQb2ludDsKKyAgICA6OlNjcmVlblRvQ2xp
ZW50KG1fcGFnZUNsaWVudC0+bmF0aXZlV2luZG93KCksICZsb2NhbFBvaW50KTsKKworICAgIGRy
YWdFbmRlZChsb2NhbFBvaW50LCBnbG9iYWxQb2ludCwgb3BlcmF0aW9uKTsKK30KKyNlbmRpZgor
CiB2b2lkIFdlYlBhZ2VQcm94eTo6ZHJhZ0VuZGVkKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBj
bGllbnRQb3NpdGlvbiwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGdsb2JhbFBvc2l0aW9uLCB1
aW50NjRfdCBvcGVyYXRpb24pCiB7CiAgICAgaWYgKCFpc1ZhbGlkKCkpCkluZGV4OiBTb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5oCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHkuaAkod29ya2luZyBjb3B5KQpAQCAtMzA3
LDYgKzMwNyw5IEBAIHB1YmxpYzoKICNpZiBQTEFURk9STShNQUMpCiAgICAgdm9pZCBzZXREcmFn
SW1hZ2UoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGNsaWVudFBvc2l0aW9uLCBjb25zdCBXZWJD
b3JlOjpJbnRTaXplJiBpbWFnZVNpemUsIGNvbnN0IFNoYXJlZE1lbW9yeTo6SGFuZGxlJiBkcmFn
SW1hZ2VIYW5kbGUsIGJvb2wgaXNMaW5rRHJhZyk7CiAjZW5kaWYKKyNpZiBQTEFURk9STShXSU4p
CisgICAgdm9pZCBzdGFydERyYWdEcm9wKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBpbWFnZVBv
aW50LCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZHJhZ1BvaW50LCB1aW50NjRfdCBva0VmZmVj
dCwgY29uc3QgSGFzaE1hcDxVSU5ULCBWZWN0b3I8U3RyaW5nPiA+JiBkYXRhTWFwLCBjb25zdCBX
ZWJDb3JlOjpJbnRTaXplJiBkcmFnSW1hZ2VTaXplLCBjb25zdCBTaGFyZWRNZW1vcnk6OkhhbmRs
ZSYgZHJhZ0ltYWdlSGFuZGxlLCBib29sIGlzTGlua0RyYWcpOworI2VuZGlmCiAgICAgdm9pZCBk
aWRSZWNlaXZlTWVzc2FnZShDb3JlSVBDOjpDb25uZWN0aW9uKiwgQ29yZUlQQzo6TWVzc2FnZUlE
LCBDb3JlSVBDOjpBcmd1bWVudERlY29kZXIqKTsKICAgICB2b2lkIGRpZFJlY2VpdmVTeW5jTWVz
c2FnZShDb3JlSVBDOjpDb25uZWN0aW9uKiwgQ29yZUlQQzo6TWVzc2FnZUlELCBDb3JlSVBDOjpB
cmd1bWVudERlY29kZXIqLCBDb3JlSVBDOjpBcmd1bWVudEVuY29kZXIqKTsKIApJbmRleDogU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBhZ2VQcm94eS5tZXNzYWdlcy5pbgo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUGFnZVByb3h5Lm1lc3NhZ2VzLmluCShy
ZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9XZWJQYWdlUHJveHku
bWVzc2FnZXMuaW4JKHdvcmtpbmcgY29weSkKQEAgLTE5OSw0ICsxOTksNyBAQCBtZXNzYWdlcyAt
PiBXZWJQYWdlUHJveHkgewogI2lmIFBMQVRGT1JNKE1BQykKICAgICBTZXREcmFnSW1hZ2UoV2Vi
Q29yZTo6SW50UG9pbnQgY2xpZW50UG9zaXRpb24sIFdlYkNvcmU6OkludFNpemUgaW1hZ2VTaXpl
LCBXZWJLaXQ6OlNoYXJlZE1lbW9yeTo6SGFuZGxlIGRyYWdJbWFnZSwgYm9vbCBsaW5rRHJhZykK
ICNlbmRpZgorI2lmIFBMQVRGT1JNKFdJTikKKyAgICBTdGFydERyYWdEcm9wKFdlYkNvcmU6Oklu
dFBvaW50IGltYWdlUG9pbnQsIFdlYkNvcmU6OkludFBvaW50IGRyYWdQb2ludCwgdWludDY0X3Qg
b2tFZmZlY3QsIEhhc2hNYXA8VUlOVCxWZWN0b3I8U3RyaW5nPiA+IGRhdGFNYXAsIFdlYkNvcmU6
OkludFNpemUgZHJhZ0ltYWdlU2l6ZSwgV2ViS2l0OjpTaGFyZWRNZW1vcnk6OkhhbmRsZSBkcmFn
SW1hZ2UsIGJvb2wgbGlua0RyYWcpCisjZW5kaWYKIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dl
YlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNw
cAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVT
dXBwb3J0L1dlYkRyYWdDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MSwxNiArNTEsMTAg
QEAgRHJhZ1NvdXJjZUFjdGlvbiBXZWJEcmFnQ2xpZW50OjpkcmFnU291cgogICAgIHJldHVybiBE
cmFnU291cmNlQWN0aW9uQW55OwogfQogCi0jaWYgIVBMQVRGT1JNKE1BQykKKyNpZiAhUExBVEZP
Uk0oTUFDKSAmJiAhUExBVEZPUk0oV0lOKQogdm9pZCBXZWJEcmFnQ2xpZW50OjpzdGFydERyYWco
RHJhZ0ltYWdlUmVmLCBjb25zdCBJbnRQb2ludCYsIGNvbnN0IEludFBvaW50JiwgQ2xpcGJvYXJk
KiwgRnJhbWUqLCBib29sKQogewogfQotCi1EcmFnSW1hZ2VSZWYgV2ViRHJhZ0NsaWVudDo6Y3Jl
YXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiwgRnJhbWUqKQotewotICAg
IG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7Ci19CiAjZW5kaWYKIAogdm9pZCBXZWJE
cmFnQ2xpZW50OjpkcmFnQ29udHJvbGxlckRlc3Ryb3llZCgpCkluZGV4OiBTb3VyY2UvV2ViS2l0
Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQu
aAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVT
dXBwb3J0L1dlYkRyYWdDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNDYsNyArNDYsNiBAQCBw
cml2YXRlOgogICAgIHZpcnR1YWwgV2ViQ29yZTo6RHJhZ1NvdXJjZUFjdGlvbiBkcmFnU291cmNl
QWN0aW9uTWFza0ZvclBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiB3aW5kb3dQb2ludCk7
CiAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnREcmFnKFdlYkNvcmU6OkRyYWdJbWFnZVJlZiBkcmFn
SW1hZ2UsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBkcmFnSW1hZ2VPcmlnaW4sIGNvbnN0IFdl
YkNvcmU6OkludFBvaW50JiBldmVudFBvcywgV2ViQ29yZTo6Q2xpcGJvYXJkKiwgV2ViQ29yZTo6
RnJhbWUqLCBib29sIGxpbmtEcmFnID0gZmFsc2UpOwotICAgIHZpcnR1YWwgV2ViQ29yZTo6RHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsoV2ViQ29yZTo6S1VSTCYsIGNvbnN0IFN0
cmluZyYgbGFiZWwsIFdlYkNvcmU6OkZyYW1lKik7CiAKICNpZiBQTEFURk9STShNQUMpCiAgICAg
dmlydHVhbCB2b2lkIGRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZShOU1Bhc3RlYm9hcmQqLCBET01F
bGVtZW50KiwgTlNVUkwqLCBOU1N0cmluZyosIFdlYkNvcmU6OkZyYW1lKik7CkluZGV4OiBTb3Vy
Y2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L21hYy9XZWJEcmFnQ2xpZW50TWFj
Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBv
cnQvbWFjL1dlYkRyYWdDbGllbnRNYWMubW0JKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dl
YktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9tYWMvV2ViRHJhZ0NsaWVudE1hYy5tbQko
d29ya2luZyBjb3B5KQpAQCAtNDcsMTggKzQ3LDYgQEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
CiAKIG5hbWVzcGFjZSBXZWJLaXQgewogCi1jb25zdCBmbG9hdCBEcmFnTGFiZWxCb3JkZXJYID0g
NDsKLS8vS2VlcCBib3JkZXJfeSBpbiBzeW5jaCB3aXRoIERyYWdDb250cm9sbGVyOjpMaW5rRHJh
Z0JvcmRlckluc2V0Ci1jb25zdCBmbG9hdCBEcmFnTGFiZWxCb3JkZXJZID0gMjsKLWNvbnN0IGZs
b2F0IERyYWdMYWJlbFJhZGl1cyA9IDU7Ci1jb25zdCBmbG9hdCBMYWJlbEJvcmRlcllPZmZzZXQg
PSAyOwotCi1jb25zdCBmbG9hdCBNaW5EcmFnTGFiZWxXaWR0aEJlZm9yZUNsaXAgPSAxMjA7Ci1j
b25zdCBmbG9hdCBNYXhEcmFnTGFiZWxXaWR0aCA9IDMyMDsKLQotY29uc3QgZmxvYXQgRHJhZ0xp
bmtMYWJlbEZvbnRzaXplID0gMTE7Ci1jb25zdCBmbG9hdCBEcmFnTGlua1VybEZvbnRTaXplID0g
MTA7Ci0KIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBzdGF0aWMgRm9udCYgZm9udEZyb21O
U0ZvbnQoTlNGb250ICpmb250KQpAQCAtMTAwLDg4ICs4OCw2IEBAIHZvaWQgV2ViRHJhZ0NsaWVu
dDo6c3RhcnREcmFnKERyYWdJbWFnZVIKICAgICBtX3BhZ2UtPnNlbmQoTWVzc2FnZXM6OldlYlBh
Z2VQcm94eTo6U2V0RHJhZ0ltYWdlKGNsaWVudFBvaW50LCBJbnRTaXplKFtkcmFnTlNJbWFnZSBz
aXplXSksIGhhbmRsZSwgbGlua0RyYWcpKTsKIH0KIAotRHJhZ0ltYWdlUmVmIFdlYkRyYWdDbGll
bnQ6OmNyZWF0ZURyYWdJbWFnZUZvckxpbmsoS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxl
LCBGcmFtZSogZnJhbWUpCi17Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIG5pbDsK
LSAgICBOU1N0cmluZyAqbGFiZWwgPSAwOwotICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKQotICAg
ICAgICBsYWJlbCA9IHRpdGxlOwotICAgIE5TVVJMICpjb2NvYVVSTCA9IHVybDsKLSAgICBOU1N0
cmluZyAqdXJsU3RyaW5nID0gW2NvY29hVVJMIF93ZWJfdXNlclZpc2libGVTdHJpbmddOwotICAg
IAotICAgIEJPT0wgZHJhd1VSTFN0cmluZyA9IFlFUzsKLSAgICBCT09MIGNsaXBVUkxTdHJpbmcg
PSBOTzsKLSAgICBCT09MIGNsaXBMYWJlbFN0cmluZyA9IE5POwotICAgIAotICAgIGlmICghbGFi
ZWwpIHsKLSAgICAgICAgZHJhd1VSTFN0cmluZyA9IE5POwotICAgICAgICBsYWJlbCA9IHVybFN0
cmluZzsKLSAgICB9Ci0gICAgCi0gICAgTlNGb250ICpsYWJlbEZvbnQgPSBbW05TRm9udE1hbmFn
ZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250OltOU0ZvbnQgc3lzdGVtRm9udE9mU2l6
ZTpEcmFnTGlua0xhYmVsRm9udHNpemVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvSGF2ZVRyYWl0Ok5TQm9sZEZvbnRNYXNrXTsK
LSAgICBOU0ZvbnQgKnVybEZvbnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6RHJhZ0xpbmtV
cmxGb250U2l6ZV07Ci0gICAgTlNTaXplIGxhYmVsU2l6ZTsKLSAgICBsYWJlbFNpemUud2lkdGgg
PSBbbGFiZWwgX3dlYl93aWR0aFdpdGhGb250OiBsYWJlbEZvbnRdOwotICAgIGxhYmVsU2l6ZS5o
ZWlnaHQgPSBbbGFiZWxGb250IGFzY2VuZGVyXSAtIFtsYWJlbEZvbnQgZGVzY2VuZGVyXTsKLSAg
ICBpZiAobGFiZWxTaXplLndpZHRoID4gTWF4RHJhZ0xhYmVsV2lkdGgpewotICAgICAgICBsYWJl
bFNpemUud2lkdGggPSBNYXhEcmFnTGFiZWxXaWR0aDsKLSAgICAgICAgY2xpcExhYmVsU3RyaW5n
ID0gWUVTOwotICAgIH0KLSAgICAKLSAgICBOU1NpemUgaW1hZ2VTaXplOwotICAgIGltYWdlU2l6
ZS53aWR0aCA9IGxhYmVsU2l6ZS53aWR0aCArIERyYWdMYWJlbEJvcmRlclggKiAyOwotICAgIGlt
YWdlU2l6ZS5oZWlnaHQgPSBsYWJlbFNpemUuaGVpZ2h0ICsgRHJhZ0xhYmVsQm9yZGVyWSAqIDI7
Ci0gICAgaWYgKGRyYXdVUkxTdHJpbmcpIHsKLSAgICAgICAgTlNTaXplIHVybFN0cmluZ1NpemU7
Ci0gICAgICAgIHVybFN0cmluZ1NpemUud2lkdGggPSBbdXJsU3RyaW5nIF93ZWJfd2lkdGhXaXRo
Rm9udDogdXJsRm9udF07Ci0gICAgICAgIHVybFN0cmluZ1NpemUuaGVpZ2h0ID0gW3VybEZvbnQg
YXNjZW5kZXJdIC0gW3VybEZvbnQgZGVzY2VuZGVyXTsKLSAgICAgICAgaW1hZ2VTaXplLmhlaWdo
dCArPSB1cmxTdHJpbmdTaXplLmhlaWdodDsKLSAgICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lk
dGggPiBNYXhEcmFnTGFiZWxXaWR0aCkgewotICAgICAgICAgICAgaW1hZ2VTaXplLndpZHRoID0g
bWF4KE1heERyYWdMYWJlbFdpZHRoICsgRHJhZ0xhYmVsQm9yZGVyWSAqIDIsIE1pbkRyYWdMYWJl
bFdpZHRoQmVmb3JlQ2xpcCk7Ci0gICAgICAgICAgICBjbGlwVVJMU3RyaW5nID0gWUVTOwotICAg
ICAgICB9IGVsc2UKLSAgICAgICAgICAgIGltYWdlU2l6ZS53aWR0aCA9IG1heChsYWJlbFNpemUu
d2lkdGggKyBEcmFnTGFiZWxCb3JkZXJYICogMiwgdXJsU3RyaW5nU2l6ZS53aWR0aCArIERyYWdM
YWJlbEJvcmRlclggKiAyKTsKLSAgICB9Ci0gICAgTlNJbWFnZSAqZHJhZ0ltYWdlID0gW1tbTlNJ
bWFnZSBhbGxvY10gaW5pdFdpdGhTaXplOiBpbWFnZVNpemVdIGF1dG9yZWxlYXNlXTsKLSAgICBb
ZHJhZ0ltYWdlIGxvY2tGb2N1c107Ci0gICAgCi0gICAgW1tOU0NvbG9yIGNvbG9yV2l0aERldmlj
ZVJlZDogMC43ZiBncmVlbjogMC43ZiBibHVlOiAwLjdmIGFscGhhOiAwLjhmXSBzZXRdOwotICAg
IAotICAgIC8vIERyYWcgYSByZWN0YW5nbGUgd2l0aCByb3VuZGVkIGNvcm5lcnMKLSAgICBOU0Jl
emllclBhdGggKnBhdGggPSBbTlNCZXppZXJQYXRoIGJlemllclBhdGhdOwotICAgIFtwYXRoIGFw
cGVuZEJlemllclBhdGhXaXRoT3ZhbEluUmVjdDogTlNNYWtlUmVjdCgwLCAwLCBEcmFnTGFiZWxS
YWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVy
UGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0KDAsIGltYWdlU2l6ZS5oZWlnaHQgLSBEcmFn
TGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAy
KV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0
KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1cyAqIDIsIGltYWdlU2l6ZS5oZWlnaHQg
LSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRp
dXMgKiAyKV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhPdmFsSW5SZWN0OiBOU01h
a2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1cyAqIDIsIDAsIERyYWdMYWJl
bFJhZGl1cyAqIDIsIERyYWdMYWJlbFJhZGl1cyAqIDIpXTsKLSAgICAKLSAgICBbcGF0aCBhcHBl
bmRCZXppZXJQYXRoV2l0aFJlY3Q6IE5TTWFrZVJlY3QoRHJhZ0xhYmVsUmFkaXVzLCAwLCBpbWFn
ZVNpemUud2lkdGggLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBpbWFnZVNpemUuaGVpZ2h0KV07Ci0g
ICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhSZWN0OiBOU01ha2VSZWN0KDAsIERyYWdMYWJl
bFJhZGl1cywgRHJhZ0xhYmVsUmFkaXVzICsgMTAsIGltYWdlU2l6ZS5oZWlnaHQgLSAyICogRHJh
Z0xhYmVsUmFkaXVzKV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhSZWN0OiBOU01h
a2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1cyAtIDIwLCBEcmFnTGFiZWxS
YWRpdXMsIERyYWdMYWJlbFJhZGl1cyArIDIwLCBpbWFnZVNpemUuaGVpZ2h0IC0gMiAqIERyYWdM
YWJlbFJhZGl1cyldOwotICAgIFtwYXRoIGZpbGxdOwotICAgIAotICAgIE5TQ29sb3IgKnRvcENv
bG9yID0gW05TQ29sb3IgY29sb3JXaXRoRGV2aWNlV2hpdGU6MC4wZiBhbHBoYTowLjc1Zl07Ci0g
ICAgTlNDb2xvciAqYm90dG9tQ29sb3IgPSBbTlNDb2xvciBjb2xvcldpdGhEZXZpY2VXaGl0ZTox
LjBmIGFscGhhOjAuNWZdOwotICAgIGlmIChkcmF3VVJMU3RyaW5nKSB7Ci0gICAgICAgIGlmIChj
bGlwVVJMU3RyaW5nKQotICAgICAgICAgICAgLy91cmxTdHJpbmcgPSBbV2ViU3RyaW5nVHJ1bmNh
dG9yIGNlbnRlclRydW5jYXRlU3RyaW5nOiB1cmxTdHJpbmcgdG9XaWR0aDppbWFnZVNpemUud2lk
dGggLSAoRHJhZ0xhYmVsQm9yZGVyWCAqIDIpIHdpdGhGb250OnVybEZvbnRdOwotICAgICAgICAg
ICAgdXJsU3RyaW5nID0gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZSh1cmxTdHJpbmcs
IGltYWdlU2l6ZS53aWR0aCAtIChEcmFnTGFiZWxCb3JkZXJYICogMiksIGZvbnRGcm9tTlNGb250
KHVybEZvbnQpKTsgICAgICAgCi0gICAgICAgIFt1cmxTdHJpbmcgX3dlYl9kcmF3RG91YmxlZEF0
UG9pbnQ6TlNNYWtlUG9pbnQoRHJhZ0xhYmVsQm9yZGVyWCwgRHJhZ0xhYmVsQm9yZGVyWSAtIFt1
cmxGb250IGRlc2NlbmRlcl0pIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFRv
cENvbG9yOnRvcENvbG9yIGJvdHRvbUNvbG9yOmJvdHRvbUNvbG9yIGZvbnQ6dXJsRm9udF07Ci0g
ICAgfQotICAgIAotICAgIGlmIChjbGlwTGFiZWxTdHJpbmcpCi0gICAgICAgIC8vbGFiZWwgPSBb
V2ViU3RyaW5nVHJ1bmNhdG9yIHJpZ2h0VHJ1bmNhdGVTdHJpbmc6IGxhYmVsIHRvV2lkdGg6aW1h
Z2VTaXplLndpZHRoIC0gKERyYWdMYWJlbEJvcmRlclggKiAyKSB3aXRoRm9udDpsYWJlbEZvbnRd
OwotICAgICAgICBsYWJlbCA9IFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVuY2F0ZShsYWJlbCwg
aW1hZ2VTaXplLndpZHRoIC0gKERyYWdMYWJlbEJvcmRlclggKiAyKSwgZm9udEZyb21OU0ZvbnQo
bGFiZWxGb250KSk7Ci0gICAgW2xhYmVsIF93ZWJfZHJhd0RvdWJsZWRBdFBvaW50Ok5TTWFrZVBv
aW50IChEcmFnTGFiZWxCb3JkZXJYLCBpbWFnZVNpemUuaGVpZ2h0IC0gTGFiZWxCb3JkZXJZT2Zm
c2V0IC0gW2xhYmVsRm9udCBwb2ludFNpemVdKQotICAgICAgICAgICAgICAgICAgICAgIHdpdGhU
b3BDb2xvcjp0b3BDb2xvciBib3R0b21Db2xvcjpib3R0b21Db2xvciBmb250OmxhYmVsRm9udF07
Ci0gICAgCi0gICAgW2RyYWdJbWFnZSB1bmxvY2tGb2N1c107Ci0gICAgCi0gICAgcmV0dXJuIGRy
YWdJbWFnZTsKLX0KLQogc3RhdGljIHZvaWQgd3JpdGVVUkwoTlNQYXN0ZWJvYXJkKiBwYXN0ZWJv
YXJkLCBOU1VSTCogVVJMLCBOU1N0cmluZyogdGl0bGUsIE5TQXJyYXkqIHR5cGVzKQogewogICAg
IEFTU0VSVChVUkwpOwpJbmRleDogU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3Vw
cG9ydC93aW4vV2ViRHJhZ0NsaWVudFdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktp
dDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ0NsaWVudFdpbi5jcHAJKHJl
dmlzaW9uIDApCisrKyBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L3dp
bi9XZWJEcmFnQ2xpZW50V2luLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4OSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFO
RCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJEcmFnQ2xpZW50Lmgi
CisKKyNpbmNsdWRlICJTaGFyZWFibGVCaXRtYXAuaCIKKyNpbmNsdWRlICJXZWJDb3JlQXJndW1l
bnRDb2RlcnMuaCIKKyNpbmNsdWRlICJXZWJQYWdlLmgiCisjaW5jbHVkZSAiV2ViUGFnZVByb3h5
TWVzc2FnZXMuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0JpdG1hcEluZm8uaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL0NPTVB0ci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvQ2xpcGJvYXJkV2luLmg+CisjaW5j
bHVkZSA8V2ViQ29yZS9EcmFnQ29udHJvbGxlci5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRnJhbWUu
aD4KKyNpbmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPgorI2luY2x1ZGUgPFdlYkNv
cmUvUGFnZS5oPgorI2luY2x1ZGUgPHNobG9iai5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29y
ZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3N0YXRpYyBEV09SRCBkcmFnZ2luZ1NvdXJjZU9w
ZXJhdGlvbk1hc2tUb0RyYWdDdXJzb3JzKERyYWdPcGVyYXRpb24gb3ApCit7CisgICAgRFdPUkQg
cmVzdWx0ID0gRFJPUEVGRkVDVF9OT05FOworICAgIGlmIChvcCA9PSBEcmFnT3BlcmF0aW9uRXZl
cnkpCisgICAgICAgIHJldHVybiBEUk9QRUZGRUNUX0NPUFkgfCBEUk9QRUZGRUNUX0xJTksgfCBE
Uk9QRUZGRUNUX01PVkU7IAorICAgIGlmIChvcCAmIERyYWdPcGVyYXRpb25Db3B5KQorICAgICAg
ICByZXN1bHQgfD0gRFJPUEVGRkVDVF9DT1BZOyAKKyAgICBpZiAob3AgJiBEcmFnT3BlcmF0aW9u
TGluaykKKyAgICAgICAgcmVzdWx0IHw9IERST1BFRkZFQ1RfTElOSzsgCisgICAgaWYgKG9wICYg
RHJhZ09wZXJhdGlvbk1vdmUpCisgICAgICAgIHJlc3VsdCB8PSBEUk9QRUZGRUNUX01PVkU7Cisg
ICAgaWYgKG9wICYgRHJhZ09wZXJhdGlvbkdlbmVyaWMpCisgICAgICAgIHJlc3VsdCB8PSBEUk9Q
RUZGRUNUX01PVkU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBXZWJEcmFnQ2xpZW50
OjpzdGFydERyYWcoRHJhZ0ltYWdlUmVmIGltYWdlLCBjb25zdCBJbnRQb2ludCYgaW1hZ2VPcmln
aW4sIGNvbnN0IEludFBvaW50JiBkcmFnUG9pbnQsIENsaXBib2FyZCogY2xpcGJvYXJkLCBGcmFt
ZSogZnJhbWUsIGJvb2wgaXNMaW5rKQoreworICAgIENPTVB0cjxJRGF0YU9iamVjdD4gZGF0YU9i
amVjdCA9IHN0YXRpY19jYXN0PENsaXBib2FyZFdpbio+KGNsaXBib2FyZCktPmRhdGFPYmplY3Qo
KTsKKworICAgIGlmICghZGF0YU9iamVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgT3duUHRy
PEhEQz4gYml0bWFwREMoQ3JlYXRlQ29tcGF0aWJsZURDKDApKTsKKyAgICBCSVRNQVBJTkZPIGJp
dG1hcEluZm8gPSB7MH07CisgICAgYml0bWFwSW5mby5ibWlIZWFkZXIuYmlTaXplID0gc2l6ZW9m
KEJJVE1BUElORk9IRUFERVIpOworICAgIEdldERJQml0cyhiaXRtYXBEQy5nZXQoKSwgaW1hZ2Us
IDAsIDAsIDAsICZiaXRtYXBJbmZvLCBESUJfUkdCX0NPTE9SUyk7CisgICAgaWYgKGJpdG1hcElu
Zm8uYm1pSGVhZGVyLmJpU2l6ZUltYWdlIDw9IDApCisgICAgICAgIGJpdG1hcEluZm8uYm1pSGVh
ZGVyLmJpU2l6ZUltYWdlID0gYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCAqIGFicyhiaXRt
YXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCkgKiAoYml0bWFwSW5mby5ibWlIZWFkZXIuYmlCaXRD
b3VudCArIDcpIC8gODsKKyAgICAKKyAgICBSZWZQdHI8U2hhcmVkTWVtb3J5PiBtZW1vcnlCdWZm
ZXIgPSBTaGFyZWRNZW1vcnk6OmNyZWF0ZShiaXRtYXBJbmZvLmJtaUhlYWRlci5iaVNpemVJbWFn
ZSk7CisKKyAgICBiaXRtYXBJbmZvLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOwor
ICAgIEdldERJQml0cyhiaXRtYXBEQy5nZXQoKSwgaW1hZ2UsIDAsIGJpdG1hcEluZm8uYm1pSGVh
ZGVyLmJpSGVpZ2h0LCBtZW1vcnlCdWZmZXItPmRhdGEoKSwgJmJpdG1hcEluZm8sIERJQl9SR0Jf
Q09MT1JTKTsgICAgICAgCisKKyAgICBTaGFyZWRNZW1vcnk6OkhhbmRsZSBoYW5kbGU7CisgICAg
aWYgKCFtZW1vcnlCdWZmZXItPmNyZWF0ZUhhbmRsZShoYW5kbGUsIFNoYXJlZE1lbW9yeTo6UmVh
ZE9ubHkpKQorICAgICAgICByZXR1cm47CisgICAgRFdPUkQgb2tFZmZlY3QgPSBkcmFnZ2luZ1Nv
dXJjZU9wZXJhdGlvbk1hc2tUb0RyYWdDdXJzb3JzKG1fcGFnZS0+Y29yZVBhZ2UoKS0+ZHJhZ0Nv
bnRyb2xsZXIoKS0+c291cmNlRHJhZ09wZXJhdGlvbigpKTsKKyAgICBEcmFnRGF0YSBkcmFnRGF0
YShkYXRhT2JqZWN0LmdldCgpLCBJbnRQb2ludCgpLCBJbnRQb2ludCgpLCBEcmFnT3BlcmF0aW9u
Tm9uZSk7CisgICAgbV9wYWdlLT5zZW5kKE1lc3NhZ2VzOjpXZWJQYWdlUHJveHk6OlN0YXJ0RHJh
Z0Ryb3AoaW1hZ2VPcmlnaW4sIGRyYWdQb2ludCwgb2tFZmZlY3QsIGRyYWdEYXRhLmRyYWdEYXRh
TWFwKCksIEludFNpemUoYml0bWFwSW5mby5ibWlIZWFkZXIuYmlXaWR0aCwgYml0bWFwSW5mby5i
bWlIZWFkZXIuYmlIZWlnaHQpLCBoYW5kbGUsIGlzTGluayksIG1fcGFnZS0+cGFnZUlEKCkpOwor
fQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL1dlYlByb2Nl
c3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdTb3VyY2UuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvd2luL1dlYkRyYWdTb3VyY2Uu
Y3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3Vw
cG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYkRyYWdTb3VyY2Uu
aCIKKworI2luY2x1ZGUgPFdlYkNvcmUvQ3Vyc29yLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9EcmFn
QWN0aW9ucy5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRXZlbnRIYW5kbGVyLmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9GcmFtZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGFnZS5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvUGxhdGZvcm1Nb3VzZUV2ZW50Lmg+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+
CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCitQYXNzUmVmUHRyPFdlYkRyYWdTb3VyY2U+
IFdlYkRyYWdTb3VyY2U6OmNyZWF0ZUluc3RhbmNlKCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFdlYkRyYWdTb3VyY2UpOworfQorCitXZWJEcmFnU291cmNlOjpXZWJEcmFnU291cmNlKCkK
K3sKK30KKworSFJFU1VMVCBXZWJEcmFnU291cmNlOjpRdWVyeUludGVyZmFjZShSRUZJSUQgcmlp
ZCwgdm9pZCoqIHBwdk9iamVjdCkKK3sKKyAgICAqcHB2T2JqZWN0ID0gMDsKKyAgICBpZiAoSXNF
cXVhbElJRChyaWlkLCBJSURfSVVua25vd24pIHx8IElzRXF1YWxJSUQocmlpZCwgSUlEX0lEcm9w
U291cmNlKSkgeworICAgICAgICAqcHB2T2JqZWN0ID0gdGhpczsKKyAgICAgICAgQWRkUmVmKCk7
CisKKyAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgfQorCisgICAgcmV0dXJuIEVfTk9JTlRFUkZB
Q0U7Cit9CisKK1VMT05HIFdlYkRyYWdTb3VyY2U6OkFkZFJlZih2b2lkKQoreworICAgIHJlZigp
OworICAgIHJldHVybiByZWZDb3VudCgpOworfQorCitVTE9ORyBXZWJEcmFnU291cmNlOjpSZWxl
YXNlKHZvaWQpCit7CisgICAgZGVyZWYoKTsKKyAgICByZXR1cm4gcmVmQ291bnQoKTsKK30KKwor
SFJFU1VMVCBXZWJEcmFnU291cmNlOjpRdWVyeUNvbnRpbnVlRHJhZyhCT09MIGZFc2NhcGVQcmVz
c2VkLCBEV09SRCBncmZTdGF0ZSkKK3sKKyAgICBpZiAoZkVzY2FwZVByZXNzZWQpCisgICAgICAg
IHJldHVybiBEUkFHRFJPUF9TX0NBTkNFTDsKKworICAgIGlmIChncmZTdGF0ZSAmIChNS19MQlVU
VE9OIHwgTUtfUkJVVFRPTikpCisgICAgICAgIHJldHVybiBTX09LOworCisgICAgcmV0dXJuIERS
QUdEUk9QX1NfRFJPUDsKK30KKworSFJFU1VMVCBXZWJEcmFnU291cmNlOjpHaXZlRmVlZGJhY2so
RFdPUkQgZHdFZmZlY3QpCit7CisgICAgcmV0dXJuIERSQUdEUk9QX1NfVVNFREVGQVVMVENVUlNP
UlM7Cit9CkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L3dp
bi9XZWJEcmFnU291cmNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViUHJvY2Vz
cy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5oCShyZXZpc2lvbiAwKQorKysgU291
cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC93aW4vV2ViRHJhZ1NvdXJjZS5o
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEx
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgV2ViRHJh
Z1NvdXJjZV9oCisjZGVmaW5lIFdlYkRyYWdTb3VyY2VfaAorCisjaW5jbHVkZSA8V1RGL1JlZkNv
dW50ZWQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0NPTVB0ci5oPgorI2luY2x1ZGUgPG9iamlkbC5o
PgorCitjbGFzcyBXZWJEcmFnU291cmNlIDogcHVibGljIElEcm9wU291cmNlLCBwdWJsaWMgUmVm
Q291bnRlZDxXZWJEcmFnU291cmNlPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8
V2ViRHJhZ1NvdXJjZT4gY3JlYXRlSW5zdGFuY2UoKTsKKworcHJpdmF0ZToKKyAgICB2aXJ0dWFs
IEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlJbnRlcmZhY2UoUkVGSUlEIHJpaWQsIHZv
aWQqKiBwcHZPYmplY3QpOyAgICAgICAgCisgICAgdmlydHVhbCBVTE9ORyBTVERNRVRIT0RDQUxM
VFlQRSBBZGRSZWYoKTsKKyAgICB2aXJ0dWFsIFVMT05HIFNURE1FVEhPRENBTExUWVBFIFJlbGVh
c2UoKTsKKyAgICB2aXJ0dWFsIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgUXVlcnlDb250aW51
ZURyYWcoQk9PTCBmRXNjYXBlUHJlc3NlZCwgRFdPUkQgZ3JmU3RhdGUpOworICAgIHZpcnR1YWwg
SFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBHaXZlRmVlZGJhY2soRFdPUkQgZHdFZmZlY3QpOwor
ICAgIFdlYkRyYWdTb3VyY2UoKTsKK307CisKKyNlbmRpZiAvLyAhV2ViRHJhZ1NvdXJjZV9oCklu
ZGV4OiBTb3VyY2UvV2ViS2l0Mi93aW4vV2ViS2l0Mi52Y3Byb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvd2luL1dlYktpdDIudmNwcm9qCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJj
ZS9XZWJLaXQyL3dpbi9XZWJLaXQyLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMTQzNyw2ICsx
NDM3LDE4IEBACiAJCQkJCU5hbWU9IndpbiIKIAkJCQkJPgogCQkJCQk8RmlsZQorCQkJCQkJUmVs
YXRpdmVQYXRoPSIuLlxXZWJQcm9jZXNzXFdlYkNvcmVTdXBwb3J0XHdpblxXZWJEcmFnQ2xpZW50
V2luLmNwcCIKKwkJCQkJCT4KKwkJCQkJPC9GaWxlPgorCQkJCQk8RmlsZQorCQkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxXZWJQcm9jZXNzXFdlYkNvcmVTdXBwb3J0XHdpblxXZWJEcmFnU291cmNlLmNw
cCIKKwkJCQkJCT4KKwkJCQkJPC9GaWxlPgorCQkJCQk8RmlsZQorCQkJCQkJUmVsYXRpdmVQYXRo
PSIuLlxXZWJQcm9jZXNzXFdlYkNvcmVTdXBwb3J0XHdpblxXZWJEcmFnU291cmNlLmgiCisJCQkJ
CQk+CisJCQkJCTwvRmlsZT4KKwkJCQkJPEZpbGUKIAkJCQkJCVJlbGF0aXZlUGF0aD0iLi5cV2Vi
UHJvY2Vzc1xXZWJDb3JlU3VwcG9ydFx3aW5cV2ViQ29udGV4dE1lbnVDbGllbnRXaW4uY3BwIgog
CQkJCQkJPgogCQkJCQk8L0ZpbGU+CkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5n
ZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2
aXNpb24gNzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDExLTAyLTA3ICBFbnJpY2EgQ2FzdWNjaSAgPGVu
cmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0IG9uIFdpbmRvd3MuCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01Mjc3NQorCisgICAg
ICAgIFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBmcm9tIERyYWdDbGllbnQuCisgICAg
ICAgIAorICAgICAgICAqIHNyYy9EcmFnQ2xpZW50SW1wbC5jcHA6CisgICAgICAgICogc3JjL0Ry
YWdDbGllbnRJbXBsLmg6CisKIDIwMTEtMDItMDQgIENoYXJsaWUgUmVpcyAgPGNyZWlzQGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBNaWhhaSBQYXJwYXJpdGEuCkluZGV4OiBT
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9EcmFnQ2xpZW50SW1wbC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvRHJhZ0NsaWVudEltcGwuY3BwCShyZXZpc2lv
biA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0RyYWdDbGllbnRJbXBsLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtOTYsMTIgKzk2LDYgQEAgdm9pZCBEcmFnQ2xpZW50SW1wbDo6
c3RhcnREcmFnKERyYWdJbWFnZQogICAgICAgICBvZmZzZXRQb2ludCk7CiB9CiAKLURyYWdJbWFn
ZVJlZiBEcmFnQ2xpZW50SW1wbDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3Qg
U3RyaW5nJiBsYWJlbCwgRnJhbWUqKQotewotICAgIC8vIEZJWE1FCi0gICAgcmV0dXJuIDA7Ci19
Ci0KIHZvaWQgRHJhZ0NsaWVudEltcGw6OmRyYWdDb250cm9sbGVyRGVzdHJveWVkKCkKIHsKICAg
ICAvLyBPdXIgbGlmZXRpbWUgaXMgYm91bmQgdG8gdGhlIFdlYlZpZXdJbXBsLgpJbmRleDogU291
cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvRHJhZ0NsaWVudEltcGwuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9EcmFnQ2xpZW50SW1wbC5oCShyZXZpc2lvbiA3Nzgy
NCkKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0RyYWdDbGllbnRJbXBsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTYyLDggKzYyLDYgQEAgcHVibGljOgogICAgICAgICBXZWJDb3JlOjpDbGlw
Ym9hcmQqIGNsaXBib2FyZCwKICAgICAgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lLAogICAgICAg
ICBib29sIGlzTGlua0RyYWcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnSW1h
Z2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluaygKLSAgICAgICAgV2ViQ29yZTo6S1VSTCYsIGNv
bnN0IFdURjo6U3RyaW5nJiBsYWJlbCwgV2ViQ29yZTo6RnJhbWUqKTsKICAgICB2aXJ0dWFsIHZv
aWQgZHJhZ0NvbnRyb2xsZXJEZXN0cm95ZWQoKTsKIAogcHJpdmF0ZToKSW5kZXg6IFNvdXJjZS9X
ZWJLaXQvZWZsL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2VmbC9DaGFu
Z2VMb2cJKHJldmlzaW9uIDc3ODMzKQorKysgU291cmNlL1dlYktpdC9lZmwvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTEtMDItMDcgIEVucmljYSBDYXN1Y2Np
ICA8ZW5yaWNhQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBXZWJLaXQyOiBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgb24gV2luZG93cy4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyNzc1CisK
KyAgICAgICAgUmVtb3ZlZCBjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rIGZyb20gRHJhZ0NsaWVudC4K
KworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRFZmwuY3BwOgorICAgICAgICAq
IFdlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRFZmwuaDoKKwogMjAxMS0wMi0wNyAgUGF0cmljayBH
YW5zdGVyZXIgIDxwYXJvZ2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRy
ZWFzIEtsaW5nLgpJbmRleDogU291cmNlL1dlYktpdC9lZmwvV2ViQ29yZVN1cHBvcnQvRHJhZ0Ns
aWVudEVmbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9lZmwvV2ViQ29yZVN1cHBv
cnQvRHJhZ0NsaWVudEVmbC5jcHAJKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYktpdC9l
ZmwvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEVmbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYw
LDExICs2MCw2IEBAIHZvaWQgRHJhZ0NsaWVudEVmbDo6c3RhcnREcmFnKERyYWdJbWFnZVIKICAg
ICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi1EcmFnSW1hZ2VSZWYgRHJhZ0NsaWVudEVmbDo6Y3Jl
YXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiBsYWJlbCwgRnJhbWUqKQot
ewotICAgIHJldHVybiAwOwotfQotCiB2b2lkIERyYWdDbGllbnRFZmw6OmRyYWdDb250cm9sbGVy
RGVzdHJveWVkKCkKIHsKICAgICBkZWxldGUgdGhpczsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvZWZs
L1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRFZmwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0L2VmbC9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50RWZsLmgJKHJldmlzaW9uIDc3ODI0KQor
KysgU291cmNlL1dlYktpdC9lZmwvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEVmbC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00NSw3ICs0NSw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFdlYkNvcmU6
OkRyYWdTb3VyY2VBY3Rpb24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgd2luZG93UG9pbnQpOwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJh
ZyhXZWJDb3JlOjpEcmFnSW1hZ2VSZWYgZHJhZ0ltYWdlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2lu
dCYgZHJhZ0ltYWdlT3JpZ2luLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZXZlbnRQb3MsIFdl
YkNvcmU6OkNsaXBib2FyZCosIFdlYkNvcmU6OkZyYW1lKiwgYm9vbCBsaW5rRHJhZyA9IGZhbHNl
KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGb3JM
aW5rKFdlYkNvcmU6OktVUkwmLCBjb25zdCBXVEY6OlN0cmluZyYgbGFiZWwsIFdlYkNvcmU6OkZy
YW1lKik7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHJhZ0NvbnRyb2xsZXJEZXN0cm95ZWQoKTsKIH07
CkluZGV4OiBTb3VyY2UvV2ViS2l0L2d0ay9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdC9ndGsvQ2hhbmdlTG9nCShyZXZpc2lvbiA3NzgzMykKKysrIFNvdXJjZS9XZWJLaXQv
Z3RrL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDExLTAyLTA3
ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBw
b3J0IG9uIFdpbmRvd3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD01Mjc3NQorCisgICAgICAgIFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBm
cm9tIERyYWdDbGllbnQuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50R3Rr
LmNwcDoKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50R3RrLmg6CisKIDIwMTEt
MDItMDcgIE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IERhbmllbCBCYXRlcy4KSW5kZXg6IFNvdXJjZS9XZWJLaXQvZ3RrL1dlYkNv
cmVTdXBwb3J0L0RyYWdDbGllbnRHdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQv
Z3RrL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRHdGsuY3BwCShyZXZpc2lvbiA3NzgyNCkKKysr
IFNvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRHdGsuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xNTEsMTIgKzE1MSw2IEBAIHZvaWQgRHJhZ0NsaWVudDo6ZHJhd0RyYWdJ
Y29uV2luZG93KEd0a1cKICAgICBjYWlyb19maWxsKGNvbnRleHQpOwogfQogCi1EcmFnSW1hZ2VS
ZWYgRHJhZ0NsaWVudDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5n
JiwgRnJhbWUqKQotewotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0K
IHZvaWQgRHJhZ0NsaWVudDo6ZHJhZ0NvbnRyb2xsZXJEZXN0cm95ZWQoKQogewogICAgIGRlbGV0
ZSB0aGlzOwpJbmRleDogU291cmNlL1dlYktpdC9ndGsvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVu
dEd0ay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvZ3RrL1dlYkNvcmVTdXBwb3J0L0Ry
YWdDbGllbnRHdGsuaAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L2d0ay9XZWJD
b3JlU3VwcG9ydC9EcmFnQ2xpZW50R3RrLmgJKHdvcmtpbmcgY29weSkKQEAgLTUwLDcgKzUwLDYg
QEAgbmFtZXNwYWNlIFdlYktpdCB7CiAgICAgICAgIHZpcnR1YWwgV2ViQ29yZTo6RHJhZ1NvdXJj
ZUFjdGlvbiBkcmFnU291cmNlQWN0aW9uTWFza0ZvclBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBv
aW50JiB3aW5kb3dQb2ludCk7CiAKICAgICAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhXZWJD
b3JlOjpEcmFnSW1hZ2VSZWYgZHJhZ0ltYWdlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZHJh
Z0ltYWdlT3JpZ2luLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZXZlbnRQb3MsIFdlYkNvcmU6
OkNsaXBib2FyZCosIFdlYkNvcmU6OkZyYW1lKiwgYm9vbCBsaW5rRHJhZyA9IGZhbHNlKTsKLSAg
ICAgICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGlu
ayhXZWJDb3JlOjpLVVJMJiwgY29uc3QgV1RGOjpTdHJpbmcmIGxhYmVsLCBXZWJDb3JlOjpGcmFt
ZSopOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkcmFnQ29udHJvbGxlckRlc3Ryb3llZCgpOwog
CkluZGV4OiBTb3VyY2UvV2ViS2l0L2hhaWt1L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViS2l0L2hhaWt1L0NoYW5nZUxvZwkocmV2aXNpb24gNzc4MzMpCisrKyBTb3VyY2UvV2Vi
S2l0L2hhaWt1L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDEx
LTAyLTA3ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJv
cCBzdXBwb3J0IG9uIFdpbmRvd3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01Mjc3NQorCisgICAgICAgIFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9y
TGluayBmcm9tIERyYWdDbGllbnQuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9EcmFnQ2xp
ZW50SGFpa3UuY3BwOgorICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRIYWlrdS5o
OgorCiAyMDExLTAyLTA3ICBQYXRyaWNrIEdhbnN0ZXJlciAgPHBhcm9nYUB3ZWJraXQub3JnPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IEFuZHJlYXMgS2xpbmcuCkluZGV4OiBTb3VyY2UvV2ViS2l0
L2hhaWt1L1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRIYWlrdS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdC9oYWlrdS9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50SGFpa3UuY3BwCShy
ZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQvaGFpa3UvV2ViQ29yZVN1cHBvcnQvRHJh
Z0NsaWVudEhhaWt1LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjQsMTEgKzY0LDUgQEAgdm9pZCBE
cmFnQ2xpZW50SGFpa3U6OnN0YXJ0RHJhZyhEcmFnSW1hZwogICAgIG5vdEltcGxlbWVudGVkKCk7
CiB9CiAKLURyYWdJbWFnZVJlZiBEcmFnQ2xpZW50SGFpa3U6OmNyZWF0ZURyYWdJbWFnZUZvckxp
bmsoS1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKikKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgp
OwotICAgIHJldHVybiAwOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKSW5kZXg6IFNv
dXJjZS9XZWJLaXQvaGFpa3UvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudEhhaWt1LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdC9oYWlrdS9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50SGFp
a3UuaAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L2hhaWt1L1dlYkNvcmVTdXBw
b3J0L0RyYWdDbGllbnRIYWlrdS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw2IEBAIG5h
bWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdmlydHVhbCB2b2lkIHdpbGxQZXJmb3JtRHJhZ1Nv
dXJjZUFjdGlvbihEcmFnU291cmNlQWN0aW9uLCBjb25zdCBJbnRQb2ludCYsIENsaXBib2FyZCop
OwogICAgICAgICB2aXJ0dWFsIHZvaWQgc3RhcnREcmFnKERyYWdJbWFnZVJlZiBkcmFnSW1hZ2Us
IGNvbnN0IEludFBvaW50JiBkcmFnSW1hZ2VPcmlnaW4sCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgSW50UG9pbnQmIGV2ZW50UG9zLCBDbGlwYm9hcmQqLCBGcmFtZSosIGJv
b2wgbGlua0RyYWcgPSBmYWxzZSk7Ci0gICAgICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0
ZURyYWdJbWFnZUZvckxpbmsoS1VSTCYsIGNvbnN0IFN0cmluZyYgbGFiZWwsIEZyYW1lKik7CiAg
ICAgfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYktpdC9tYWMv
Q2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvbWFjL0NoYW5nZUxvZwkocmV2
aXNpb24gNzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0L21hYy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMyArMSwxNiBAQAorMjAxMS0wMi0wNyAgRW5yaWNhIENhc3VjY2kgIDxlbnJpY2FA
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFdlYktpdDI6IGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBvbiBXaW5kb3dzLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTI3NzUKKworICAgICAgICBS
ZW1vdmVkIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsgZnJvbSBEcmFnQ2xpZW50LgorCisgICAgICAg
ICogV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5oOgorICAgICAgICAqIFdlYkNvcmVTdXBw
b3J0L1dlYkRyYWdDbGllbnQubW06CisgICAgICAgIChXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcp
OgorCiAyMDExLTAyLTAzICBZdXJ5IFNlbWlraGF0c2t5ICA8eXVyeXNAY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IFBhdmVsIEZlbGRtYW4uCkluZGV4OiBTb3VyY2UvV2ViS2l0
L21hYy9XZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5oCShyZXZpc2lvbiA3Nzgy
NCkKKysrIFNvdXJjZS9XZWJLaXQvbWFjL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuaAko
d29ya2luZyBjb3B5KQpAQCAtMzYsNyArMzYsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lk
IGRyYWdDb250cm9sbGVyRGVzdHJveWVkKCk7CiAgICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnU291
cmNlQWN0aW9uIGRyYWdTb3VyY2VBY3Rpb25NYXNrRm9yUG9pbnQoY29uc3QgV2ViQ29yZTo6SW50
UG9pbnQmIHdpbmRvd1BvaW50KTsKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnREcmFnKFdlYkNvcmU6
OkRyYWdJbWFnZVJlZiBkcmFnSW1hZ2UsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBkcmFnUG9z
LCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgZXZlbnRQb3MsIFdlYkNvcmU6OkNsaXBib2FyZCos
IFdlYkNvcmU6OkZyYW1lKiwgYm9vbCBsaW5rRHJhZyk7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpE
cmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhXZWJDb3JlOjpLVVJMJiB1cmwsIGNv
bnN0IFdURjo6U3RyaW5nJiBsYWJlbCwgV2ViQ29yZTo6RnJhbWUqKTsKICAgICB2aXJ0dWFsIHZv
aWQgZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdlKE5TUGFzdGVib2FyZCosIERPTUVsZW1lbnQqLCBO
U1VSTCosIE5TU3RyaW5nKiwgV2ViQ29yZTo6RnJhbWUqKTsKIHByaXZhdGU6CiAgICAgV2ViVmll
dyogbV93ZWJWaWV3OwpJbmRleDogU291cmNlL1dlYktpdC9tYWMvV2ViQ29yZVN1cHBvcnQvV2Vi
RHJhZ0NsaWVudC5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L21hYy9XZWJDb3JlU3Vw
cG9ydC9XZWJEcmFnQ2xpZW50Lm1tCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQv
bWFjL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQubW0JKHdvcmtpbmcgY29weSkKQEAgLTUx
LDE4ICs1MSw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCi1jb25zdCBmbG9hdCBE
cmFnTGFiZWxCb3JkZXJYID0gNDsKLS8vS2VlcCBib3JkZXJfeSBpbiBzeW5jaCB3aXRoIERyYWdD
b250cm9sbGVyOjpMaW5rRHJhZ0JvcmRlckluc2V0Ci1jb25zdCBmbG9hdCBEcmFnTGFiZWxCb3Jk
ZXJZID0gMjsKLWNvbnN0IGZsb2F0IERyYWdMYWJlbFJhZGl1cyA9IDU7Ci1jb25zdCBmbG9hdCBM
YWJlbEJvcmRlcllPZmZzZXQgPSAyOwotCi1jb25zdCBmbG9hdCBNaW5EcmFnTGFiZWxXaWR0aEJl
Zm9yZUNsaXAgPSAxMjA7Ci1jb25zdCBmbG9hdCBNYXhEcmFnTGFiZWxXaWR0aCA9IDMyMDsKLQot
Y29uc3QgZmxvYXQgRHJhZ0xpbmtMYWJlbEZvbnRzaXplID0gMTE7Ci1jb25zdCBmbG9hdCBEcmFn
TGlua1VybEZvbnRTaXplID0gMTA7Ci0KIFdlYkRyYWdDbGllbnQ6OldlYkRyYWdDbGllbnQoV2Vi
Vmlldyogd2ViVmlldykKICAgICA6IG1fd2ViVmlldyh3ZWJWaWV3KSAKIHsKQEAgLTEzMiw4NyAr
MTIwLDYgQEAgdm9pZCBXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcoRHJhZ0ltYWdlUgogICAgICAg
ICBbdG9wSFRNTFZpZXcgZHJhZ0ltYWdlOmRyYWdOU0ltYWdlIGF0OmF0IG9mZnNldDpOU1plcm9T
aXplIGV2ZW50OmV2ZW50IHBhc3RlYm9hcmQ6cGFzdGVib2FyZCBzb3VyY2U6c291cmNlSFRNTFZp
ZXcgc2xpZGVCYWNrOllFU107CiB9CiAKLURyYWdJbWFnZVJlZiBXZWJEcmFnQ2xpZW50OjpjcmVh
dGVEcmFnSW1hZ2VGb3JMaW5rKEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUq
IGZyYW1lKQotewotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiBuaWw7Ci0gICAgTlNT
dHJpbmcgKmxhYmVsID0gMDsKLSAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSkKLSAgICAgICAgbGFi
ZWwgPSB0aXRsZTsKLSAgICBOU1VSTCAqY29jb2FVUkwgPSB1cmw7Ci0gICAgTlNTdHJpbmcgKnVy
bFN0cmluZyA9IFtjb2NvYVVSTCBfd2ViX3VzZXJWaXNpYmxlU3RyaW5nXTsKLQotICAgIEJPT0wg
ZHJhd1VSTFN0cmluZyA9IFlFUzsKLSAgICBCT09MIGNsaXBVUkxTdHJpbmcgPSBOTzsKLSAgICBC
T09MIGNsaXBMYWJlbFN0cmluZyA9IE5POwotCi0gICAgaWYgKCFsYWJlbCkgewotICAgICAgICBk
cmF3VVJMU3RyaW5nID0gTk87Ci0gICAgICAgIGxhYmVsID0gdXJsU3RyaW5nOwotICAgIH0KLQot
ICAgIE5TRm9udCAqbGFiZWxGb250ID0gW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2Vy
XSBjb252ZXJ0Rm9udDpbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6RHJhZ0xpbmtMYWJlbEZvbnRz
aXplXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0b0hhdmVUcmFpdDpOU0JvbGRGb250TWFza107Ci0gICAgTlNGb250ICp1cmxGb250
ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOkRyYWdMaW5rVXJsRm9udFNpemVdOwotICAgIE5T
U2l6ZSBsYWJlbFNpemU7Ci0gICAgbGFiZWxTaXplLndpZHRoID0gW2xhYmVsIF93ZWJfd2lkdGhX
aXRoRm9udDogbGFiZWxGb250XTsKLSAgICBsYWJlbFNpemUuaGVpZ2h0ID0gW2xhYmVsRm9udCBh
c2NlbmRlcl0gLSBbbGFiZWxGb250IGRlc2NlbmRlcl07Ci0gICAgaWYgKGxhYmVsU2l6ZS53aWR0
aCA+IE1heERyYWdMYWJlbFdpZHRoKXsKLSAgICAgICAgbGFiZWxTaXplLndpZHRoID0gTWF4RHJh
Z0xhYmVsV2lkdGg7Ci0gICAgICAgIGNsaXBMYWJlbFN0cmluZyA9IFlFUzsKLSAgICB9Ci0KLSAg
ICBOU1NpemUgaW1hZ2VTaXplOwotICAgIGltYWdlU2l6ZS53aWR0aCA9IGxhYmVsU2l6ZS53aWR0
aCArIERyYWdMYWJlbEJvcmRlclggKiAyOwotICAgIGltYWdlU2l6ZS5oZWlnaHQgPSBsYWJlbFNp
emUuaGVpZ2h0ICsgRHJhZ0xhYmVsQm9yZGVyWSAqIDI7Ci0gICAgaWYgKGRyYXdVUkxTdHJpbmcp
IHsKLSAgICAgICAgTlNTaXplIHVybFN0cmluZ1NpemU7Ci0gICAgICAgIHVybFN0cmluZ1NpemUu
d2lkdGggPSBbdXJsU3RyaW5nIF93ZWJfd2lkdGhXaXRoRm9udDogdXJsRm9udF07Ci0gICAgICAg
IHVybFN0cmluZ1NpemUuaGVpZ2h0ID0gW3VybEZvbnQgYXNjZW5kZXJdIC0gW3VybEZvbnQgZGVz
Y2VuZGVyXTsKLSAgICAgICAgaW1hZ2VTaXplLmhlaWdodCArPSB1cmxTdHJpbmdTaXplLmhlaWdo
dDsKLSAgICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGggPiBNYXhEcmFnTGFiZWxXaWR0aCkg
ewotICAgICAgICAgICAgaW1hZ2VTaXplLndpZHRoID0gbWF4KE1heERyYWdMYWJlbFdpZHRoICsg
RHJhZ0xhYmVsQm9yZGVyWSAqIDIsIE1pbkRyYWdMYWJlbFdpZHRoQmVmb3JlQ2xpcCk7Ci0gICAg
ICAgICAgICBjbGlwVVJMU3RyaW5nID0gWUVTOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAg
ICAgaW1hZ2VTaXplLndpZHRoID0gbWF4KGxhYmVsU2l6ZS53aWR0aCArIERyYWdMYWJlbEJvcmRl
clggKiAyLCB1cmxTdHJpbmdTaXplLndpZHRoICsgRHJhZ0xhYmVsQm9yZGVyWCAqIDIpOwotICAg
IH0KLSAgICBOU0ltYWdlICpkcmFnSW1hZ2UgPSBbW1tOU0ltYWdlIGFsbG9jXSBpbml0V2l0aFNp
emU6IGltYWdlU2l6ZV0gYXV0b3JlbGVhc2VdOwotICAgIFtkcmFnSW1hZ2UgbG9ja0ZvY3VzXTsK
LQotICAgIFtbTlNDb2xvciBjb2xvcldpdGhEZXZpY2VSZWQ6IDAuN2YgZ3JlZW46IDAuN2YgYmx1
ZTogMC43ZiBhbHBoYTogMC44Zl0gc2V0XTsKLQotICAgIC8vIERyYWcgYSByZWN0YW5nbGUgd2l0
aCByb3VuZGVkIGNvcm5lcnMKLSAgICBOU0JlemllclBhdGggKnBhdGggPSBbTlNCZXppZXJQYXRo
IGJlemllclBhdGhdOwotICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoT3ZhbEluUmVjdDog
TlNNYWtlUmVjdCgwLCAwLCBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAy
KV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0
KDAsIGltYWdlU2l6ZS5oZWlnaHQgLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRp
dXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07Ci0gICAgW3BhdGggYXBwZW5kQmV6aWVyUGF0
aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJh
ZGl1cyAqIDIsIGltYWdlU2l6ZS5oZWlnaHQgLSBEcmFnTGFiZWxSYWRpdXMgKiAyLCBEcmFnTGFi
ZWxSYWRpdXMgKiAyLCBEcmFnTGFiZWxSYWRpdXMgKiAyKV07Ci0gICAgW3BhdGggYXBwZW5kQmV6
aWVyUGF0aFdpdGhPdmFsSW5SZWN0OiBOU01ha2VSZWN0KGltYWdlU2l6ZS53aWR0aCAtIERyYWdM
YWJlbFJhZGl1cyAqIDIsIDAsIERyYWdMYWJlbFJhZGl1cyAqIDIsIERyYWdMYWJlbFJhZGl1cyAq
IDIpXTsKLQotICAgIFtwYXRoIGFwcGVuZEJlemllclBhdGhXaXRoUmVjdDogTlNNYWtlUmVjdChE
cmFnTGFiZWxSYWRpdXMsIDAsIGltYWdlU2l6ZS53aWR0aCAtIERyYWdMYWJlbFJhZGl1cyAqIDIs
IGltYWdlU2l6ZS5oZWlnaHQpXTsKLSAgICBbcGF0aCBhcHBlbmRCZXppZXJQYXRoV2l0aFJlY3Q6
IE5TTWFrZVJlY3QoMCwgRHJhZ0xhYmVsUmFkaXVzLCBEcmFnTGFiZWxSYWRpdXMgKyAxMCwgaW1h
Z2VTaXplLmhlaWdodCAtIDIgKiBEcmFnTGFiZWxSYWRpdXMpXTsKLSAgICBbcGF0aCBhcHBlbmRC
ZXppZXJQYXRoV2l0aFJlY3Q6IE5TTWFrZVJlY3QoaW1hZ2VTaXplLndpZHRoIC0gRHJhZ0xhYmVs
UmFkaXVzIC0gMjAsIERyYWdMYWJlbFJhZGl1cywgRHJhZ0xhYmVsUmFkaXVzICsgMjAsIGltYWdl
U2l6ZS5oZWlnaHQgLSAyICogRHJhZ0xhYmVsUmFkaXVzKV07Ci0gICAgW3BhdGggZmlsbF07Ci0K
LSAgICBOU0NvbG9yICp0b3BDb2xvciA9IFtOU0NvbG9yIGNvbG9yV2l0aERldmljZVdoaXRlOjAu
MGYgYWxwaGE6MC43NWZdOwotICAgIE5TQ29sb3IgKmJvdHRvbUNvbG9yID0gW05TQ29sb3IgY29s
b3JXaXRoRGV2aWNlV2hpdGU6MS4wZiBhbHBoYTowLjVmXTsKLSAgICBpZiAoZHJhd1VSTFN0cmlu
ZykgewotICAgICAgICBpZiAoY2xpcFVSTFN0cmluZykKLSAgICAgICAgICAgIHVybFN0cmluZyA9
IFtXZWJTdHJpbmdUcnVuY2F0b3IgY2VudGVyVHJ1bmNhdGVTdHJpbmc6IHVybFN0cmluZyB0b1dp
ZHRoOmltYWdlU2l6ZS53aWR0aCAtIChEcmFnTGFiZWxCb3JkZXJYICogMikgd2l0aEZvbnQ6dXJs
Rm9udF07Ci0KLSAgICAgICBbdXJsU3RyaW5nIF93ZWJfZHJhd0RvdWJsZWRBdFBvaW50Ok5TTWFr
ZVBvaW50KERyYWdMYWJlbEJvcmRlclgsIERyYWdMYWJlbEJvcmRlclkgLSBbdXJsRm9udCBkZXNj
ZW5kZXJdKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFRvcENvbG9yOnRvcENv
bG9yIGJvdHRvbUNvbG9yOmJvdHRvbUNvbG9yIGZvbnQ6dXJsRm9udF07Ci0gICAgfQotCi0gICAg
aWYgKGNsaXBMYWJlbFN0cmluZykKLSAgICAgICAgbGFiZWwgPSBbV2ViU3RyaW5nVHJ1bmNhdG9y
IHJpZ2h0VHJ1bmNhdGVTdHJpbmc6IGxhYmVsIHRvV2lkdGg6aW1hZ2VTaXplLndpZHRoIC0gKERy
YWdMYWJlbEJvcmRlclggKiAyKSB3aXRoRm9udDpsYWJlbEZvbnRdOwotICAgIFtsYWJlbCBfd2Vi
X2RyYXdEb3VibGVkQXRQb2ludDpOU01ha2VQb2ludCAoRHJhZ0xhYmVsQm9yZGVyWCwgaW1hZ2VT
aXplLmhlaWdodCAtIExhYmVsQm9yZGVyWU9mZnNldCAtIFtsYWJlbEZvbnQgcG9pbnRTaXplXSkK
LSAgICAgICAgICAgICAgICAgICAgICB3aXRoVG9wQ29sb3I6dG9wQ29sb3IgYm90dG9tQ29sb3I6
Ym90dG9tQ29sb3IgZm9udDpsYWJlbEZvbnRdOwotCi0gICAgW2RyYWdJbWFnZSB1bmxvY2tGb2N1
c107Ci0KLSAgICByZXR1cm4gZHJhZ0ltYWdlOwotfQotCiB2b2lkIFdlYkRyYWdDbGllbnQ6OmRl
Y2xhcmVBbmRXcml0ZURyYWdJbWFnZShOU1Bhc3RlYm9hcmQqIHBhc3RlYm9hcmQsIERPTUVsZW1l
bnQqIGVsZW1lbnQsIE5TVVJMKiBVUkwsIE5TU3RyaW5nKiB0aXRsZSwgV2ViQ29yZTo6RnJhbWUq
IGZyYW1lKSAKIHsKICAgICBBU1NFUlQocGFzdGVib2FyZCk7CkluZGV4OiBTb3VyY2UvV2ViS2l0
L3F0L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L3F0L0NoYW5nZUxvZwko
cmV2aXNpb24gNzc4MzMpCisrKyBTb3VyY2UvV2ViS2l0L3F0L0NoYW5nZUxvZwkod29ya2luZyBj
b3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDExLTAyLTA3ICBFbnJpY2EgQ2FzdWNjaSAgPGVucmlj
YUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0IG9uIFdpbmRvd3MuCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01Mjc3NQorCisgICAgICAg
IFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBmcm9tIERyYWdDbGllbnQuCisKKyAgICAg
ICAgKiBXZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50UXQuY3BwOgorICAgICAgICAqIFdlYkNvcmVT
dXBwb3J0L0RyYWdDbGllbnRRdC5oOgorCiAyMDExLTAyLTA2ICBSb2JlcnQgSG9nYW4gIDxyb2Jl
cnRAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbmRyZWFzIEtsaW5nLgpJbmRl
eDogU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xpZW50UXQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudFF0LmNw
cAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Ry
YWdDbGllbnRRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExMCw5ICsxMTAsNCBAQCB2b2lkIERy
YWdDbGllbnRRdDo6c3RhcnREcmFnKERyYWdJbWFnZVJlCiB9CiAKIAotRHJhZ0ltYWdlUmVmIERy
YWdDbGllbnRRdDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiwg
RnJhbWUqKQotewotICAgIHJldHVybiAwOwotfQotCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCklu
ZGV4OiBTb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRRdC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudFF0LmgJ
KHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EcmFn
Q2xpZW50UXQuaAkod29ya2luZyBjb3B5KQpAQCAtMzcsNyArMzcsNiBAQCBwdWJsaWM6CiAgICAg
dmlydHVhbCBEcmFnU291cmNlQWN0aW9uIGRyYWdTb3VyY2VBY3Rpb25NYXNrRm9yUG9pbnQoY29u
c3QgSW50UG9pbnQmKTsKICAgICB2aXJ0dWFsIHZvaWQgd2lsbFBlcmZvcm1EcmFnU291cmNlQWN0
aW9uKERyYWdTb3VyY2VBY3Rpb24sIGNvbnN0IEludFBvaW50JiwgQ2xpcGJvYXJkKik7ICAgIAog
ICAgIHZpcnR1YWwgdm9pZCBzdGFydERyYWcoRHJhZ0ltYWdlUmVmIGRyYWdJbWFnZSwgY29uc3Qg
SW50UG9pbnQmIGRyYWdJbWFnZU9yaWdpbiwgY29uc3QgSW50UG9pbnQmIGV2ZW50UG9zLCBDbGlw
Ym9hcmQqLCBGcmFtZSosIGJvb2wgbGlua0RyYWcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBEcmFn
SW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiBsYWJl
bCwgRnJhbWUqKTsKIHByaXZhdGU6CiAgICAgUVdlYlBhZ2UqIG1fd2ViUGFnZTsKIH07CkluZGV4
OiBTb3VyY2UvV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktp
dC93aW4vQ2hhbmdlTG9nCShyZXZpc2lvbiA3NzgzMykKKysrIFNvdXJjZS9XZWJLaXQvd2luL0No
YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDExLTAyLTA3ICBFbnJp
Y2EgQ2FzdWNjaSAgPGVucmljYUBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgV2ViS2l0MjogZHJhZyBhbmQgZHJvcCBzdXBwb3J0IG9u
IFdpbmRvd3MuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD01Mjc3NQorCisgICAgICAgIFJlbW92ZWQgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayBmcm9tIERy
YWdDbGllbnQuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJEcmFnQ2xpZW50LmNwcDoK
KyAgICAgICAgKFdlYkRyYWdDbGllbnQ6OnN0YXJ0RHJhZyk6CisgICAgICAgICogV2ViQ29yZVN1
cHBvcnQvV2ViRHJhZ0NsaWVudC5oOgorCiAyMDExLTAyLTA2ICBSeW9zdWtlIE5pd2EgIDxybml3
YUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDog
U291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5j
cHAJKHJldmlzaW9uIDc3ODI0KQorKysgU291cmNlL1dlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQv
V2ViRHJhZ0NsaWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDM5ICszNSwxMSBAQAogI2lu
Y2x1ZGUgPFdlYkNvcmUvQ2xpcGJvYXJkV2luLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9EcmFnQ29u
dHJvbGxlci5oPgogI2luY2x1ZGUgPFdlYkNvcmUvRHJhZ0RhdGEuaD4KLSNpbmNsdWRlIDxXZWJD
b3JlL0ZvbnQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL0ZvbnREZXNjcmlwdGlvbi5oPgotI2luY2x1
ZGUgPFdlYkNvcmUvRm9udFNlbGVjdG9yLmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9GcmFtZVZpZXcu
aD4KICNpbmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPgogI2luY2x1ZGUgPFdlYkNv
cmUvUGFnZS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxXZWJD
b3JlL1N0cmluZ1RydW5jYXRvci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvVGV4dFJ1bi5oPgotI2lu
Y2x1ZGUgPFdlYkNvcmUvV2ViQ29yZVRleHRSZW5kZXJlci5oPgogI3ByYWdtYSB3YXJuaW5nKHBv
cCkgCiAKLW5hbWVzcGFjZSBXZWJDb3JlIHsKLSAgICBIQklUTUFQIGFsbG9jSW1hZ2UoSERDIGRj
LCBJbnRTaXplIHNpemUsIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiogdGFyZ2V0UmVmKTsKLSAg
ICB2b2lkIGRlYWxsb2NDb250ZXh0KFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiB0YXJnZXQpOwot
fQotCi0KLSNkZWZpbmUgRFJBR19MQUJFTF9CT1JERVJfWCAgICAgICAgICAgICA0Ci0vLyBLZWVw
IGJvcmRlcl95IGluIHN5bmNoIHdpdGggRHJhZ0NvbnRyb2xsZXI6OkxpbmtEcmFnQm9yZGVySW5z
ZXQKLSNkZWZpbmUgRFJBR19MQUJFTF9CT1JERVJfWSAgICAgICAgICAgICAyCi0jZGVmaW5lIERS
QUdfTEFCRUxfUkFESVVTICAgICAgICAgICAgICAgNQotI2RlZmluZSBEUkFHX0xBQkVMX0JPUkRF
Ul9ZX09GRlNFVCAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIE1JTl9EUkFHX0xBQkVMX1dJRFRI
X0JFRk9SRV9DTElQICAgICAgICAxMjAKLQotLy8gT2JzZXJ2YXRpb24gc2F5cyBtYXggc2l6ZSBp
cyAyMDB4MjAwCi0jZGVmaW5lIE1BWF9EUkFHX0xBQkVMX1dJRFRIICAgICAgICAgICAgICAgICAg
ICAyMDAKLSNkZWZpbmUgTUFYX0RSQUdfTEFCRUxfU1RSSU5HX1dJRFRIICAgICAgICAgICAgIChN
QVhfRFJBR19MQUJFTF9XSURUSCAtIDIgKiBEUkFHX0xBQkVMX0JPUkRFUl9YKQotCi0jZGVmaW5l
IERSQUdfTElOS19MQUJFTF9GT05UX1NJWkUgICAxMQotI2RlZmluZSBEUkFHX0xJTktfVVJMX0ZP
TlRfU0laRSAgIDEwCi0KIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBzdGF0aWMgRFdPUkQg
ZHJhZ2dpbmdTb3VyY2VPcGVyYXRpb25NYXNrVG9EcmFnQ3Vyc29ycyhEcmFnT3BlcmF0aW9uIG9w
KQpAQCAtMTk3LDEyOSArMTY5LDYgQEAgdm9pZCBXZWJEcmFnQ2xpZW50OjpzdGFydERyYWcoRHJh
Z0ltYWdlUgogICAgIH0KIH0KIAotc3RhdGljIEZvbnQgZHJhZ0xhYmVsRm9udChpbnQgc2l6ZSwg
Ym9vbCBib2xkLCBGb250UmVuZGVyaW5nTW9kZSByZW5kZXJpbmdNb2RlKQotewotICAgIE5PTkNM
SUVOVE1FVFJJQ1MgbWV0cmljczsKLSAgICBtZXRyaWNzLmNiU2l6ZSA9IHNpemVvZihtZXRyaWNz
KTsKLSAgICBTeXN0ZW1QYXJhbWV0ZXJzSW5mbyhTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgbWV0
cmljcy5jYlNpemUsICZtZXRyaWNzLCAwKTsKLSAgICBGb250RGVzY3JpcHRpb24gZGVzYzsKLSAg
ICBkZXNjLnNldFdlaWdodChib2xkID8gRm9udFdlaWdodEJvbGQgOiBGb250V2VpZ2h0Tm9ybWFs
KTsKLSAgICBGb250RmFtaWx5IGZhbWlseTsKLSAgICBmYW1pbHkuc2V0RmFtaWx5KG1ldHJpY3Mu
bGZTbUNhcHRpb25Gb250LmxmRmFjZU5hbWUpOwotICAgIGRlc2Muc2V0RmFtaWx5KGZhbWlseSk7
Ci0gICAgZGVzYy5zZXRTcGVjaWZpZWRTaXplKChmbG9hdClzaXplKTsKLSAgICBkZXNjLnNldENv
bXB1dGVkU2l6ZSgoZmxvYXQpc2l6ZSk7Ci0gICAgZGVzYy5zZXRSZW5kZXJpbmdNb2RlKHJlbmRl
cmluZ01vZGUpOwotICAgIEZvbnQgcmVzdWx0ID0gRm9udChkZXNjLCAwLCAwKTsgCi0gICAgcmVz
dWx0LnVwZGF0ZSgwKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1EcmFnSW1hZ2VSZWYgV2Vi
RHJhZ0NsaWVudDo6Y3JlYXRlRHJhZ0ltYWdlRm9yTGluayhLVVJMJiB1cmwsIGNvbnN0IFN0cmlu
ZyYgaW5MYWJlbCwgRnJhbWUqIGZyYW1lKQotewotICAgIC8vIFRoaXMgaXMgbW9yZSBvciBsZXNz
IGFuIGV4YWN0IG1hdGNoIGZvciB0aGUgTWFjIE9TIFggY29kZS4KLQotICAgIGNvbnN0IEZvbnQq
IGxhYmVsRm9udDsKLSAgICBjb25zdCBGb250KiB1cmxGb250OwotCi0gICAgaWYgKGZyYW1lLT5z
ZXR0aW5ncygpICYmIGZyYW1lLT5zZXR0aW5ncygpLT5mb250UmVuZGVyaW5nTW9kZSgpID09IEFs
dGVybmF0ZVJlbmRlcmluZ01vZGUpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgYWx0ZXJu
YXRlUmVuZGVyaW5nTW9kZUxhYmVsRm9udCA9IGRyYWdMYWJlbEZvbnQoRFJBR19MSU5LX0xBQkVM
X0ZPTlRfU0laRSwgdHJ1ZSwgQWx0ZXJuYXRlUmVuZGVyaW5nTW9kZSk7Ci0gICAgICAgIHN0YXRp
YyBjb25zdCBGb250IGFsdGVybmF0ZVJlbmRlcmluZ01vZGVVUkxGb250ID0gZHJhZ0xhYmVsRm9u
dChEUkFHX0xJTktfVVJMX0ZPTlRfU0laRSwgZmFsc2UsIEFsdGVybmF0ZVJlbmRlcmluZ01vZGUp
OwotICAgICAgICBsYWJlbEZvbnQgPSAmYWx0ZXJuYXRlUmVuZGVyaW5nTW9kZUxhYmVsRm9udDsK
LSAgICAgICAgdXJsRm9udCA9ICZhbHRlcm5hdGVSZW5kZXJpbmdNb2RlVVJMRm9udDsKLSAgICB9
IGVsc2UgewotICAgICAgICBzdGF0aWMgY29uc3QgRm9udCBub3JtYWxSZW5kZXJpbmdNb2RlTGFi
ZWxGb250ID0gZHJhZ0xhYmVsRm9udChEUkFHX0xJTktfTEFCRUxfRk9OVF9TSVpFLCB0cnVlLCBO
b3JtYWxSZW5kZXJpbmdNb2RlKTsKLSAgICAgICAgc3RhdGljIGNvbnN0IEZvbnQgbm9ybWFsUmVu
ZGVyaW5nTW9kZVVSTEZvbnQgPSBkcmFnTGFiZWxGb250KERSQUdfTElOS19VUkxfRk9OVF9TSVpF
LCBmYWxzZSwgTm9ybWFsUmVuZGVyaW5nTW9kZSk7Ci0gICAgICAgIGxhYmVsRm9udCA9ICZub3Jt
YWxSZW5kZXJpbmdNb2RlTGFiZWxGb250OwotICAgICAgICB1cmxGb250ID0gJm5vcm1hbFJlbmRl
cmluZ01vZGVVUkxGb250OwotICAgIH0KLQotICAgIGJvb2wgZHJhd1VSTFN0cmluZyA9IHRydWU7
Ci0gICAgYm9vbCBjbGlwVVJMU3RyaW5nID0gZmFsc2U7Ci0gICAgYm9vbCBjbGlwTGFiZWxTdHJp
bmcgPSBmYWxzZTsKLQotICAgIFN0cmluZyB1cmxTdHJpbmcgPSB1cmwuc3RyaW5nKCk7IAotICAg
IFN0cmluZyBsYWJlbCA9IGluTGFiZWw7Ci0gICAgaWYgKGxhYmVsLmlzRW1wdHkoKSkgewotICAg
ICAgICBkcmF3VVJMU3RyaW5nID0gZmFsc2U7Ci0gICAgICAgIGxhYmVsID0gdXJsU3RyaW5nOwot
ICAgIH0KLQotICAgIC8vRmlyc3Qgc3RlcCBpbiBkcmF3aW5nIHRoZSBsaW5rIGRyYWcgaW1hZ2Ug
d2lkdGgKLSAgICBUZXh0UnVuIGxhYmVsUnVuKGxhYmVsLmltcGwoKSk7Ci0gICAgVGV4dFJ1biB1
cmxSdW4odXJsU3RyaW5nLmltcGwoKSk7Ci0gICAgSW50U2l6ZSBsYWJlbFNpemUobGFiZWxGb250
LT53aWR0aChsYWJlbFJ1biksIGxhYmVsRm9udC0+Zm9udE1ldHJpY3MoKS5hc2NlbnQoKSArIGxh
YmVsRm9udC0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCkpOwotCi0gICAgaWYgKGxhYmVsU2l6ZS53
aWR0aCgpID4gTUFYX0RSQUdfTEFCRUxfU1RSSU5HX1dJRFRIKXsKLSAgICAgICAgbGFiZWxTaXpl
LnNldFdpZHRoKE1BWF9EUkFHX0xBQkVMX1NUUklOR19XSURUSCk7Ci0gICAgICAgIGNsaXBMYWJl
bFN0cmluZyA9IHRydWU7Ci0gICAgfQotICAgIAotICAgIEludFNpemUgdXJsU3RyaW5nU2l6ZTsK
LSAgICBJbnRTaXplIGltYWdlU2l6ZShsYWJlbFNpemUud2lkdGgoKSArIERSQUdfTEFCRUxfQk9S
REVSX1ggKiAyLCAKLSAgICAgICAgICAgICAgICAgICAgICBsYWJlbFNpemUuaGVpZ2h0KCkgKyBE
UkFHX0xBQkVMX0JPUkRFUl9ZICogMik7Ci0KLSAgICBpZiAoZHJhd1VSTFN0cmluZykgewotICAg
ICAgICB1cmxTdHJpbmdTaXplLnNldFdpZHRoKHVybEZvbnQtPndpZHRoKHVybFJ1bikpOwotICAg
ICAgICB1cmxTdHJpbmdTaXplLnNldEhlaWdodCh1cmxGb250LT5mb250TWV0cmljcygpLmFzY2Vu
dCgpICsgdXJsRm9udC0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCkpOyAKLSAgICAgICAgaW1hZ2VT
aXplLnNldEhlaWdodChpbWFnZVNpemUuaGVpZ2h0KCkgKyB1cmxTdHJpbmdTaXplLmhlaWdodCgp
KTsKLSAgICAgICAgaWYgKHVybFN0cmluZ1NpemUud2lkdGgoKSA+IE1BWF9EUkFHX0xBQkVMX1NU
UklOR19XSURUSCkgewotICAgICAgICAgICAgaW1hZ2VTaXplLnNldFdpZHRoKE1BWF9EUkFHX0xB
QkVMX1dJRFRIKTsKLSAgICAgICAgICAgIGNsaXBVUkxTdHJpbmcgPSB0cnVlOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgaW1hZ2VTaXplLnNldFdpZHRoKHN0ZDo6bWF4KGxhYmVsU2l6
ZS53aWR0aCgpLCB1cmxTdHJpbmdTaXplLndpZHRoKCkpICsgRFJBR19MQUJFTF9CT1JERVJfWCAq
IDIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gV2Ugbm93IGtub3cgaG93IGJpZyB0aGUg
aW1hZ2UgbmVlZHMgdG8gYmUsIHNvIHdlIGNyZWF0ZSBhbmQKLSAgICAvLyBmaWxsIHRoZSBiYWNr
Z3JvdW5kCi0gICAgSEJJVE1BUCBpbWFnZSA9IDA7Ci0gICAgSERDIGRjID0gR2V0REMoMCk7Ci0g
ICAgSERDIHdvcmtpbmdEQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhkYyk7Ci0gICAgaWYgKCF3b3Jr
aW5nREMpIHsKLSAgICAgICAgUmVsZWFzZURDKDAsIGRjKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotCi0gICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGNvbnRleHRSZWY7Ci0gICAgaW1h
Z2UgPSBhbGxvY0ltYWdlKHdvcmtpbmdEQywgaW1hZ2VTaXplLCAmY29udGV4dFJlZik7Ci0gICAg
aWYgKCFpbWFnZSkgewotICAgICAgICBEZWxldGVEQyh3b3JraW5nREMpOwotICAgICAgICBSZWxl
YXNlREMoMCwgZGMpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgICAgIAotICAgIDo6
U2VsZWN0T2JqZWN0KHdvcmtpbmdEQywgaW1hZ2UpOwotICAgIEdyYXBoaWNzQ29udGV4dCBjb250
ZXh0KGNvbnRleHRSZWYpOwotICAgIC8vIE9uIE1hYyBhbHBoYSBpcyB7MC43LCAwLjcsIDAuNywg
MC44fSwgaG93ZXZlciB3ZSBjYW4ndCBjb250cm9sIGFscGhhCi0gICAgLy8gZm9yIGRyYWcgaW1h
Z2VzIG9uIHdpbiwgc28gd2UgdXNlIDEKLSAgICBzdGF0aWMgY29uc3QgQ29sb3IgYmFja2dyb3Vu
ZENvbG9yKDE0MCwgMTQwLCAxNDApOwotICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHJhZGlpKERS
QUdfTEFCRUxfUkFESVVTLCBEUkFHX0xBQkVMX1JBRElVUyk7Ci0gICAgSW50UmVjdCByZWN0KDAs
IDAsIGltYWdlU2l6ZS53aWR0aCgpLCBpbWFnZVNpemUuaGVpZ2h0KCkpOwotICAgIGNvbnRleHQu
ZmlsbFJvdW5kZWRSZWN0KHJlY3QsIHJhZGlpLCByYWRpaSwgcmFkaWksIHJhZGlpLCBiYWNrZ3Jv
dW5kQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotIAotICAgIC8vIERyYXcgdGhlIHRleHQK
LSAgICBzdGF0aWMgY29uc3QgQ29sb3IgdG9wQ29sb3IoMCwgMCwgMCwgMjU1KTsgLy9vcmlnaW5h
bCBhbHBoYSA9IDAuNzUKLSAgICBzdGF0aWMgY29uc3QgQ29sb3IgYm90dG9tQ29sb3IoMjU1LCAy
NTUsIDI1NSwgMTI3KTsgLy9vcmlnaW5hbCBhbHBoYSA9IDAuNQotICAgIGlmIChkcmF3VVJMU3Ry
aW5nKSB7Ci0gICAgICAgIGlmIChjbGlwVVJMU3RyaW5nKQotICAgICAgICAgICAgdXJsU3RyaW5n
ID0gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKHVybFN0cmluZywgaW1hZ2VTaXplLndp
ZHRoKCkgLSAoRFJBR19MQUJFTF9CT1JERVJfWCAqIDIuMGYpLCAqdXJsRm9udCwgZmFsc2UpOwot
ICAgICAgICBJbnRQb2ludCB0ZXh0UG9zKERSQUdfTEFCRUxfQk9SREVSX1gsIGltYWdlU2l6ZS5o
ZWlnaHQoKSAtIChEUkFHX0xBQkVMX0JPUkRFUl9ZX09GRlNFVCArIHVybEZvbnQtPmZvbnRNZXRy
aWNzKCkuZGVzY2VudCgpKSk7Ci0gICAgICAgIFdlYkNvcmVEcmF3RG91YmxlZFRleHRBdFBvaW50
KGNvbnRleHQsIHVybFN0cmluZywgdGV4dFBvcywgKnVybEZvbnQsIHRvcENvbG9yLCBib3R0b21D
b2xvcik7Ci0gICAgfQotICAgIAotICAgIGlmIChjbGlwTGFiZWxTdHJpbmcpCi0gICAgICAgIGxh
YmVsID0gU3RyaW5nVHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKGxhYmVsLCBpbWFnZVNpemUud2lk
dGgoKSAtIChEUkFHX0xBQkVMX0JPUkRFUl9YICogMi4wZiksICpsYWJlbEZvbnQsIGZhbHNlKTsK
LQotICAgIEludFBvaW50IHRleHRQb3MoRFJBR19MQUJFTF9CT1JERVJfWCwgRFJBR19MQUJFTF9C
T1JERVJfWSArIGxhYmVsRm9udC0+cGl4ZWxTaXplKCkpOwotICAgIFdlYkNvcmVEcmF3RG91Ymxl
ZFRleHRBdFBvaW50KGNvbnRleHQsIGxhYmVsLCB0ZXh0UG9zLCAqbGFiZWxGb250LCB0b3BDb2xv
ciwgYm90dG9tQ29sb3IpOwotCi0gICAgZGVhbGxvY0NvbnRleHQoY29udGV4dFJlZik7Ci0gICAg
RGVsZXRlREMod29ya2luZ0RDKTsKLSAgICBSZWxlYXNlREMoMCwgZGMpOwotICAgIHJldHVybiBp
bWFnZTsKLX0KLQogdm9pZCBXZWJEcmFnQ2xpZW50OjpkcmFnQ29udHJvbGxlckRlc3Ryb3llZCgp
CiB7CiAgICAgZGVsZXRlIHRoaXM7CkluZGV4OiBTb3VyY2UvV2ViS2l0L3dpbi9XZWJDb3JlU3Vw
cG9ydC9XZWJEcmFnQ2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC93aW4vV2Vi
Q29yZVN1cHBvcnQvV2ViRHJhZ0NsaWVudC5oCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9X
ZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkRyYWdDbGllbnQuaAkod29ya2luZyBjb3B5KQpA
QCAtMzksNyArMzksNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBXZWJDb3JlOjpEcmFnU291cmNl
QWN0aW9uIGRyYWdTb3VyY2VBY3Rpb25NYXNrRm9yUG9pbnQoY29uc3QgV2ViQ29yZTo6SW50UG9p
bnQmKTsKICAgICB2aXJ0dWFsIHZvaWQgd2lsbFBlcmZvcm1EcmFnU291cmNlQWN0aW9uKFdlYkNv
cmU6OkRyYWdTb3VyY2VBY3Rpb24sIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgV2ViQ29yZTo6
Q2xpcGJvYXJkKik7CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhXZWJDb3JlOjpEcmFnSW1h
Z2VSZWYsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQm
LCBXZWJDb3JlOjpDbGlwYm9hcmQqLCBXZWJDb3JlOjpGcmFtZSosIGJvb2wpOwotICAgIHZpcnR1
YWwgV2ViQ29yZTo6RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsoV2ViQ29yZTo6
S1VSTCYsIGNvbnN0IFdURjo6U3RyaW5nJiwgV2ViQ29yZTo6RnJhbWUqKTsKIHByaXZhdGU6CiAg
ICAgV2ViVmlldyogbV93ZWJWaWV3OwogfTsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luY2UvQ2hh
bmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvd2luY2UvQ2hhbmdlTG9nCShyZXZp
c2lvbiA3NzgzMykKKysrIFNvdXJjZS9XZWJLaXQvd2luY2UvQ2hhbmdlTG9nCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTEtMDItMDcgIEVucmljYSBDYXN1Y2NpICA8ZW5yaWNh
QGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBXZWJLaXQyOiBkcmFnIGFuZCBkcm9wIHN1cHBvcnQgb24gV2luZG93cy4KKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyNzc1CisKKyAgICAgICAg
UmVtb3ZlZCBjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rIGZyb20gRHJhZ0NsaWVudC4KKworICAgICAg
ICAqIFdlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRXaW5DRS5jcHA6CisgICAgICAgICogV2ViQ29y
ZVN1cHBvcnQvRHJhZ0NsaWVudFdpbkNFLmg6CisKIDIwMTEtMDItMDYgIFBhdHJpY2sgR2Fuc3Rl
cmVyICA8cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFydGluIFJv
Ymluc29uLgpJbmRleDogU291cmNlL1dlYktpdC93aW5jZS9XZWJDb3JlU3VwcG9ydC9EcmFnQ2xp
ZW50V2luQ0UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvd2luY2UvV2ViQ29yZVN1
cHBvcnQvRHJhZ0NsaWVudFdpbkNFLmNwcAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2Vi
S2l0L3dpbmNlL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRXaW5DRS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTU4LDEyICs1OCw2IEBAIHZvaWQgRHJhZ0NsaWVudFdpbkNFOjpzdGFydERyYWcoRHJh
Z0ltYWcKICAgICBub3RJbXBsZW1lbnRlZCgpOwogfQogCi1EcmFnSW1hZ2VSZWYgRHJhZ0NsaWVu
dFdpbkNFOjpjcmVhdGVEcmFnSW1hZ2VGb3JMaW5rKEtVUkwmLCBjb25zdCBTdHJpbmcmIGxhYmVs
LCBGcmFtZSopCi17Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQog
dm9pZCBEcmFnQ2xpZW50V2luQ0U6OmRyYWdDb250cm9sbGVyRGVzdHJveWVkKCkKIHsKICAgICBk
ZWxldGUgdGhpczsKSW5kZXg6IFNvdXJjZS9XZWJLaXQvd2luY2UvV2ViQ29yZVN1cHBvcnQvRHJh
Z0NsaWVudFdpbkNFLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC93aW5jZS9XZWJDb3Jl
U3VwcG9ydC9EcmFnQ2xpZW50V2luQ0UuaAkocmV2aXNpb24gNzc4MjQpCisrKyBTb3VyY2UvV2Vi
S2l0L3dpbmNlL1dlYkNvcmVTdXBwb3J0L0RyYWdDbGllbnRXaW5DRS5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zOCw3ICszOCw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdTb3Vy
Y2VBY3Rpb24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYpOwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0RHJhZyhXZWJDb3JlOjpEcmFnSW1hZ2VS
ZWYsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmLCBX
ZWJDb3JlOjpDbGlwYm9hcmQqLCBXZWJDb3JlOjpGcmFtZSosIGJvb2wgPSBmYWxzZSk7Ci0gICAg
dmlydHVhbCBXZWJDb3JlOjpEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRm9yTGluayhXZWJD
b3JlOjpLVVJMJiwgY29uc3QgV1RGOjpTdHJpbmcmLCBXZWJDb3JlOjpGcmFtZSopOwogCiAgICAg
dmlydHVhbCB2b2lkIGRyYWdDb250cm9sbGVyRGVzdHJveWVkKCk7CiB9OwpJbmRleDogU291cmNl
L1dlYktpdC93eC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC93eC9DaGFu
Z2VMb2cJKHJldmlzaW9uIDc3ODMzKQorKysgU291cmNlL1dlYktpdC93eC9DaGFuZ2VMb2cJKHdv
cmtpbmcgY29weSkKQEAgLTEsMyArMSwxNSBAQAorMjAxMS0wMi0wNyAgRW5yaWNhIENhc3VjY2kg
IDxlbnJpY2FAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFdlYktpdDI6IGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBvbiBXaW5kb3dzLgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTI3NzUKKwor
ICAgICAgICBSZW1vdmVkIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsgZnJvbSBEcmFnQ2xpZW50Lgor
CisgICAgICAgICogV2ViS2l0U3VwcG9ydC9EcmFnQ2xpZW50V3guY3BwOgorICAgICAgICAqIFdl
YktpdFN1cHBvcnQvRHJhZ0NsaWVudFd4Lmg6CisKIDIwMTEtMDItMDcgIFBhdHJpY2sgR2Fuc3Rl
cmVyICA8cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQW5kcmVhcyBL
bGluZy4KSW5kZXg6IFNvdXJjZS9XZWJLaXQvd3gvV2ViS2l0U3VwcG9ydC9EcmFnQ2xpZW50V3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvd3gvV2ViS2l0U3VwcG9ydC9EcmFnQ2xp
ZW50V3guY3BwCShyZXZpc2lvbiA3NzgyNCkKKysrIFNvdXJjZS9XZWJLaXQvd3gvV2ViS2l0U3Vw
cG9ydC9EcmFnQ2xpZW50V3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02OCwxMCArNjgsNCBAQCB2
b2lkIERyYWdDbGllbnRXeDo6c3RhcnREcmFnKERyYWdJbWFnZVJlCiAgICAgbm90SW1wbGVtZW50
ZWQoKTsKIH0KIAotRHJhZ0ltYWdlUmVmIERyYWdDbGllbnRXeDo6Y3JlYXRlRHJhZ0ltYWdlRm9y
TGluayhLVVJMJiwgY29uc3QgU3RyaW5nJiBsYWJlbCwgRnJhbWUqKQotewotICAgIG5vdEltcGxl
bWVudGVkKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIH0KSW5kZXg6IFNvdXJjZS9XZWJLaXQvd3gv
V2ViS2l0U3VwcG9ydC9EcmFnQ2xpZW50V3guaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
L3d4L1dlYktpdFN1cHBvcnQvRHJhZ0NsaWVudFd4LmgJKHJldmlzaW9uIDc3ODI0KQorKysgU291
cmNlL1dlYktpdC93eC9XZWJLaXRTdXBwb3J0L0RyYWdDbGllbnRXeC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zOSw3ICszOSw2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIFdlYkNvcmU6OkRyYWdTb3Vy
Y2VBY3Rpb24gZHJhZ1NvdXJjZUFjdGlvbk1hc2tGb3JQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYpOwogICAgICAgICAKICAgICB2aXJ0dWFsIHZvaWQgc3RhcnREcmFnKFdlYkNvcmU6OkRy
YWdJbWFnZVJlZiBkcmFnSW1hZ2UsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBkcmFnSW1hZ2VP
cmlnaW4sIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBldmVudFBvcywgV2ViQ29yZTo6Q2xpcGJv
YXJkKiwgV2ViQ29yZTo6RnJhbWUqLCBib29sIGxpbmtEcmFnID0gZmFsc2UpOwotICAgIHZpcnR1
YWwgV2ViQ29yZTo6RHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUZvckxpbmsoV2ViQ29yZTo6
S1VSTCYsIGNvbnN0IFdURjo6U3RyaW5nJiBsYWJlbCwgV2ViQ29yZTo6RnJhbWUqKTsKIH07CiAK
IH0K
</data>
<flag name="review"
          id="73144"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>