<?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>239484</bug_id>
          
          <creation_ts>2022-04-18 23:39:51 -0700</creation_ts>
          <short_desc>[GPU Process] Vertical text is incorrectly displaced</short_desc>
          <delta_ts>2022-06-29 23:16:30 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>232917</dependson>
    
    <dependson>239480</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Myles C. Maxfield">mmaxfield</assigned_to>
          <cc>sabouhallawa</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1862440</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-04-18 23:39:51 -0700</bug_when>
    <thetext>[GPU Process] Vertical text is incorrectly displaced</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1862441</commentid>
    <comment_count>1</comment_count>
      <attachid>457860</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-04-18 23:40:28 -0700</bug_when>
    <thetext>Created attachment 457860
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1862442</commentid>
    <comment_count>2</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-04-18 23:40:31 -0700</bug_when>
    <thetext>&lt;rdar://problem/91187123&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1862728</commentid>
    <comment_count>3</comment_count>
      <attachid>457936</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-04-19 14:37:29 -0700</bug_when>
    <thetext>Created attachment 457936
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1862979</commentid>
    <comment_count>4</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-04-20 10:44:04 -0700</bug_when>
    <thetext>Removing r? to investigate test failures.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1863188</commentid>
    <comment_count>5</comment_count>
      <attachid>458034</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-04-20 20:44:03 -0700</bug_when>
    <thetext>Created attachment 458034
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1863408</commentid>
    <comment_count>6</comment_count>
      <attachid>458034</attachid>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2022-04-21 14:15:24 -0700</bug_when>
    <thetext>Comment on attachment 458034
Patch

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

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:218
&gt; +static Vector&lt;CGSize&gt; computeHorizontalAdvancesFromPositions(const CGPoint positions[], size_t count, const CGAffineTransform&amp; textMatrix)

I think this function should return AdvancesAndInitialPosition also. The initialPenPosition is calculated in DrawGlyphsRecorder::recordDrawGlyphs() for the horizontal case like this:

    initialPenPosition = textMatrix.mapPoint(positions[0]);

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:223
&gt;      Vector&lt;CGSize&gt; result;
&gt; +    result.reserveInitialCapacity(count);

Can&apos;t this written like the one below:

   Vector&lt;CGSize, 256&gt; result(count);

I honestly do not understand the difference between setting the initialCapcity of the Vector, passing the size in the constructor and calling reserveInitialCapacity()? What is the most efficient way to create a fixed length Vector?

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:230
&gt; +    result.uncheckedConstructAndAppend(CGSizeMake(0, 0));

Should this append CGSizeZero like what computeVerticalAdvancesFromPositions does?

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:234
&gt; +struct AdvancesAndInitialPosition {

Should this struct have a constructor which takes the size of the advances and initializes its capacity?

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:244
&gt; +    if (!count)
&gt; +        return { { }, CGPointZero };

This special case is already handled by the caller DrawGlyphsRecorder::recordDrawGlyphs()? I do not think we should be drawing anything if count is zero. So this function should not be called in this case. I think we can add an ASSERT(count) here and in computeHorizontalAdvancesFromPositions() as well.

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:251
&gt; +        auto translationInUserCoordinates = CGSizeApplyAffineTransform(translation, syntheticObliqueLessTextMatrix);
&gt; +        return CGPointMake(positionInUserCoordinates.x - translationInUserCoordinates.width, positionInUserCoordinates.y - translationInUserCoordinates.height);

I am not sure if this would be clear/clean or not, but are these statements equivalent to?

    return CGPointMake(positionInUserCoordinates.x + translation.height, positionInUserCoordinates.y + translation.width);

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:262
&gt; +        result.advances.uncheckedConstructAndAppend(CGSizeMake(nextPosition.x - previousPosition.x, nextPosition.y - previousPosition.y));

I find It diffract to read this code which says &quot;currentAdvance = nextPosition - previousPosition&quot;. The question is: what is the current position then?

Since I starts with 1, I would suggest using &quot;currentPosition&quot; instead of nextPosition.

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:319
&gt; +    FloatPoint initialPenPosition;
&gt;  
&gt; +    Vector&lt;CGSize&gt; advances;

These can replaced by the following statement if computeHorizontalAdvancesFromPositions returns AdvancesAndInitialPosition:

    AdvancesAndInitialPosition result;

&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:321
&gt; +        Vector&lt;CGSize, 256&gt; translations(count);

Is there a reason for setting the initialCapacity and the size of a fixed-size vector?

&gt; Source/WebCore/platform/graphics/coretext/FontCascadeCoreText.cpp:266
&gt; +    auto syntheticObliqueLessTextMatrix = computeBaseVerticalTextMatrix(computeBaseOverallTextMatrix(std::nullopt));

I am confused by the name and the calculation of this matrix.

computeBaseOverallTextMatrix(std::nullopt) returns AffineTransform().flipyY() = AffineTransform(1, 0, 0, -1, 0, 0)
computeBaseVerticalTextMatrix(computeBaseOverallTextMatrix(std::nullopt)) returns rotateLeftTransform() * computeBaseOverallTextMatrix(std::nullopt) = AffineTransform(0, -1, 1, 0, 0, 0) * AffineTransform(1, 0, 0, -1, 0, 0)

So everything here is constant. Can&apos;t this be a &quot;static constexpr&quot;? Can&apos;t we choose a better name which reflects it is constant matrix?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1864199</commentid>
    <comment_count>7</comment_count>
      <attachid>458034</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-04-25 13:03:16 -0700</bug_when>
    <thetext>Comment on attachment 458034
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:218
&gt;&gt; +static Vector&lt;CGSize&gt; computeHorizontalAdvancesFromPositions(const CGPoint positions[], size_t count, const CGAffineTransform&amp; textMatrix)
&gt; 
&gt; I think this function should return AdvancesAndInitialPosition also. The initialPenPosition is calculated in DrawGlyphsRecorder::recordDrawGlyphs() for the horizontal case like this:
&gt; 
&gt;     initialPenPosition = textMatrix.mapPoint(positions[0]);

Good idea.

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:223
&gt;&gt; +    result.reserveInitialCapacity(count);
&gt; 
&gt; Can&apos;t this written like the one below:
&gt; 
&gt;    Vector&lt;CGSize, 256&gt; result(count);
&gt; 
&gt; I honestly do not understand the difference between setting the initialCapcity of the Vector, passing the size in the constructor and calling reserveInitialCapacity()? What is the most efficient way to create a fixed length Vector?

Passing the size in the constructor causes the constructor to actually create a bunch of default items inside the vector. The Vector constructor is smart enough to either call T() or use memset() if possible, when initializing. In the case of CGSize, it will call memset(). If you then overwrite every item in the vector, then that initialization was wasted. It matters more for complex types which do nontrivial work in their constructors.

On the other hand, reserveInitialCapacity() doesn&apos;t actually construct any items - it just allocates the storage for where the items will be constructed later when you call uncheckedAppend().

If you&apos;re going to scatter a bunch of writes throughout the vector, rather than filling it in beginning-to-end, then that&apos;s a situation where you would pass the size to the constructor.

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:230
&gt;&gt; +    result.uncheckedConstructAndAppend(CGSizeMake(0, 0));
&gt; 
&gt; Should this append CGSizeZero like what computeVerticalAdvancesFromPositions does?

Yes! Good catch.

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:244
&gt;&gt; +        return { { }, CGPointZero };
&gt; 
&gt; This special case is already handled by the caller DrawGlyphsRecorder::recordDrawGlyphs()? I do not think we should be drawing anything if count is zero. So this function should not be called in this case. I think we can add an ASSERT(count) here and in computeHorizontalAdvancesFromPositions() as well.

Right. Good catch.

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:251
&gt;&gt; +        return CGPointMake(positionInUserCoordinates.x - translationInUserCoordinates.width, positionInUserCoordinates.y - translationInUserCoordinates.height);
&gt; 
&gt; I am not sure if this would be clear/clean or not, but are these statements equivalent to?
&gt; 
&gt;     return CGPointMake(positionInUserCoordinates.x + translation.height, positionInUserCoordinates.y + translation.width);

I think it&apos;s important for clarity to use the same functions that fillVectorWithVerticalGlyphPositions() uses. However, CGSizeApplyAffineTransform() is slower than the math that you&apos;re proposing. I guess I should run an A/B test to make sure this isn&apos;t causing a performance regression. If it is, then this patch should use the simpler math as you suggest.

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:262
&gt;&gt; +        result.advances.uncheckedConstructAndAppend(CGSizeMake(nextPosition.x - previousPosition.x, nextPosition.y - previousPosition.y));
&gt; 
&gt; I find It diffract to read this code which says &quot;currentAdvance = nextPosition - previousPosition&quot;. The question is: what is the current position then?
&gt; 
&gt; Since I starts with 1, I would suggest using &quot;currentPosition&quot; instead of nextPosition.

Yes, that&apos;s a good improvement.

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:319
&gt;&gt; +    Vector&lt;CGSize&gt; advances;
&gt; 
&gt; These can replaced by the following statement if computeHorizontalAdvancesFromPositions returns AdvancesAndInitialPosition:
&gt; 
&gt;     AdvancesAndInitialPosition result;

Right, yes!

&gt;&gt; Source/WebCore/platform/graphics/coretext/DrawGlyphsRecorderCoreText.cpp:321
&gt;&gt; +        Vector&lt;CGSize, 256&gt; translations(count);
&gt; 
&gt; Is there a reason for setting the initialCapacity and the size of a fixed-size vector?

We&apos;re passing in the size to the Vector constructor here because the data in the vector is populated by CTFontGetVerticalTranslationsForGlyphs(), which accepts a CGSize* rather than a Vector&lt;CGSize&gt;&amp;.

If we used reserveInitialCapacity() instead, then as soon as we use operator[] to access any of the values, we&apos;d get an ASSERT inside Vector.

The &quot;256&quot; is inline capacity, rather than initial capacity. If count &lt;= 256, then the translations will lie on the stack, inside the vector object itself, rather than in heap malloc()&apos;ed storage. sizeof(Vector&lt;CGSize, 256&gt;) is (close to) sizeof(CGSize) * 256.

&gt;&gt; Source/WebCore/platform/graphics/coretext/FontCascadeCoreText.cpp:266
&gt;&gt; +    auto syntheticObliqueLessTextMatrix = computeBaseVerticalTextMatrix(computeBaseOverallTextMatrix(std::nullopt));
&gt; 
&gt; I am confused by the name and the calculation of this matrix.
&gt; 
&gt; computeBaseOverallTextMatrix(std::nullopt) returns AffineTransform().flipyY() = AffineTransform(1, 0, 0, -1, 0, 0)
&gt; computeBaseVerticalTextMatrix(computeBaseOverallTextMatrix(std::nullopt)) returns rotateLeftTransform() * computeBaseOverallTextMatrix(std::nullopt) = AffineTransform(0, -1, 1, 0, 0, 0) * AffineTransform(1, 0, 0, -1, 0, 0)
&gt; 
&gt; So everything here is constant. Can&apos;t this be a &quot;static constexpr&quot;? Can&apos;t we choose a better name which reflects it is constant matrix?

It can be static, but I can&apos;t make it constexpr because:

error: constexpr variable cannot have non-literal type &apos;const WebCore::AffineTransform&apos;

Maybe I should try to refactor this to use CGAffineTransform, so that it *can* be constexpr...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1878961</commentid>
    <comment_count>8</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2022-06-28 22:46:17 -0700</bug_when>
    <thetext>Pull request: https://github.com/WebKit/WebKit/pull/1885</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1879272</commentid>
    <comment_count>9</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2022-06-29 23:16:28 -0700</bug_when>
    <thetext>Committed 251981@main (d6a262142655): &lt;https://commits.webkit.org/251981@main&gt;

Reviewed commits have been landed. Closing PR #1885 and removing active labels.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>457860</attachid>
            <date>2022-04-18 23:40:28 -0700</date>
            <delta_ts>2022-04-19 14:37:28 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-239484-20220418234028.patch</filename>
            <type>text/plain</type>
            <size>20022</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjkzMDA3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTQwODhjMmZhY2RlNTIw
YjM0MjE4NDBlYzUxMWZjMDBjOGViZDZjOS4uYmFmMGJlMGQxZjA1OWQ4YjM1MGQ2YzIzN2NjY2E1
ZTBjNjQyNDIxMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI3IEBACisyMDIyLTA0LTE4ICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgW0dQVSBQcm9j
ZXNzXSBWZXJ0aWNhbCB0ZXh0IGlzIGluY29ycmVjdGx5IGRpc3BsYWNlZAorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NDg0CisgICAgICAgIDxyZGFy
Oi8vcHJvYmxlbS85MTE4NzEyMz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBObyBuZXcgdGVzdHMgKE9PUFMhKS4KKworICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY29y
ZXRleHQvRHJhd0dseXBoc1JlY29yZGVyQ29yZVRleHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Y29tcHV0ZUhvcml6b250YWxBZHZhbmNlc0Zyb21Qb3NpdGlvbnMpOgorICAgICAgICAoV2ViQ29y
ZTo6Y29tcHV0ZVZlcnRpY2FsQWR2YW5jZXNGcm9tUG9zaXRpb25zKToKKyAgICAgICAgKFdlYkNv
cmU6OkRyYXdHbHlwaHNSZWNvcmRlcjo6cmVjb3JkRHJhd0dseXBocyk6CisgICAgICAgIChXZWJD
b3JlOjpjb21wdXRlQWR2YW5jZXNGcm9tUG9zaXRpb25zKTogRGVsZXRlZC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9Gb250Q2FzY2FkZUNvcmVUZXh0LmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OmNvbXB1dGVCYXNlT3ZlcmFsbFRleHRNYXRyaXgpOgorICAgICAgICAoV2Vi
Q29yZTo6Y29tcHV0ZU92ZXJhbGxUZXh0TWF0cml4KToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXB1
dGVCYXNlVmVydGljYWxUZXh0TWF0cml4KToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXB1dGVWZXJ0
aWNhbFRleHRNYXRyaXgpOgorICAgICAgICAoV2ViQ29yZTo6ZmlsbFZlY3RvcldpdGhWZXJ0aWNh
bEdseXBoUG9zaXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OnNob3dHbHlwaHNXaXRoQWR2YW5j
ZXMpOgorCiAyMDIyLTA0LTE4ICBUeWxlciBXaWxjb2NrICA8dHlsZXJfd0BhcHBsZS5jb20+CiAK
ICAgICAgICAgQVg6IFVwZGF0ZSB0aGUgaXNvbGF0ZWQgdHJlZSBpbiByZXNwb25zZSB0byBBWEVs
ZW1lbnRCdXN5Q2hhbmdlZCBhbmQgQVhUZXh0Q2hhbmdlZCBub3RpZmljYXRpb25zCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5oIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuaAppbmRleCAwOWY0MWQ2
MDFkNjBjYjEwZmI5OTY1NDAxNDlhMWJjNjUyZmNlODM1Li5lZTYzNzY0NjkzYmIwOGI3MGE0ZWU2
YzU0YmY1NjZmNTE0MzE4MmNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9Gb250Q2FzY2FkZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRDYXNjYWRlLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJGb250Q2FzY2Fk
ZURlc2NyaXB0aW9uLmgiCiAjaW5jbHVkZSAiRm9udENhc2NhZGVGb250cy5oIgogI2luY2x1ZGUg
IlBhdGguaCIKKyNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgog
I2luY2x1ZGUgPHd0Zi9XZWFrUHRyLmg+CiAjaW5jbHVkZSA8d3RmL3VuaWNvZGUvQ2hhcmFjdGVy
TmFtZXMuaD4KQEAgLTkxLDcgKzkyLDkgQEAgc3RydWN0IEdseXBoT3ZlcmZsb3cgewogfTsKIAog
I2lmIFVTRShDT1JFX1RFWFQpCitBZmZpbmVUcmFuc2Zvcm0gY29tcHV0ZUJhc2VPdmVyYWxsVGV4
dE1hdHJpeChjb25zdCBzdGQ6Om9wdGlvbmFsPEFmZmluZVRyYW5zZm9ybT4mIHN5bnRoZXRpY09i
bGlxdWUpOwogQWZmaW5lVHJhbnNmb3JtIGNvbXB1dGVPdmVyYWxsVGV4dE1hdHJpeChjb25zdCBG
b250Jik7CitBZmZpbmVUcmFuc2Zvcm0gY29tcHV0ZUJhc2VWZXJ0aWNhbFRleHRNYXRyaXgoY29u
c3QgQWZmaW5lVHJhbnNmb3JtJiBwcmV2aW91c1RleHRNYXRyaXgpOwogQWZmaW5lVHJhbnNmb3Jt
IGNvbXB1dGVWZXJ0aWNhbFRleHRNYXRyaXgoY29uc3QgRm9udCYsIGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYgcHJldmlvdXNUZXh0TWF0cml4KTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9EcmF3R2x5cGhzUmVjb3JkZXJDb3Jl
VGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9EcmF3
R2x5cGhzUmVjb3JkZXJDb3JlVGV4dC5jcHAKaW5kZXggZjIzYzU0NTIwYmEzOWE5MjljYWFlYjk4
OTkxNmMwYjkxZWNmMTQ2Yy4uMjc5OWYxNWE2NzE4MTNkMDUzM2Y4ZDk5NTEzZWE5MDFkMzI5NTg2
NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY29yZXRleHQv
RHJhd0dseXBoc1JlY29yZGVyQ29yZVRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2NvcmV0ZXh0L0RyYXdHbHlwaHNSZWNvcmRlckNvcmVUZXh0LmNwcApAQCAt
MjE1LDE2ICsyMTUsMzUgQEAgdm9pZCBEcmF3R2x5cGhzUmVjb3JkZXI6OnJlY29yZEVuZExheWVy
KENHUmVuZGVyaW5nU3RhdGVSZWYsIENHR1N0YXRlUmVmIGdzdGF0ZSkKICAgICBtX293bmVyLmVu
ZFRyYW5zcGFyZW5jeUxheWVyKCk7CiB9CiAKLXN0YXRpYyBWZWN0b3I8Q0dTaXplPiBjb21wdXRl
QWR2YW5jZXNGcm9tUG9zaXRpb25zKGNvbnN0IENHUG9pbnQgcG9zaXRpb25zW10sIHNpemVfdCBj
b3VudCwgY29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0mIHRleHRNYXRyaXgpCitzdGF0aWMgVmVjdG9y
PENHU2l6ZT4gY29tcHV0ZUhvcml6b250YWxBZHZhbmNlc0Zyb21Qb3NpdGlvbnMoY29uc3QgQ0dQ
b2ludCBwb3NpdGlvbnNbXSwgc2l6ZV90IGNvdW50LCBjb25zdCBDR0FmZmluZVRyYW5zZm9ybSYg
dGV4dE1hdHJpeCkKIHsKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHRoZSBpbnZl
cnNlIG9mIGZpbGxWZWN0b3JXaXRoSG9yaXpvbnRhbEdseXBoUG9zaXRpb25zKCkuCiAgICAgVmVj
dG9yPENHU2l6ZT4gcmVzdWx0OworICAgIHJlc3VsdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNv
dW50KTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50IC0gMTsgKytpKSB7CiAgICAg
ICAgIGF1dG8gbmV4dFBvc2l0aW9uID0gcG9zaXRpb25zW2kgKyAxXTsKICAgICAgICAgYXV0byBj
dXJyZW50UG9zaXRpb24gPSBwb3NpdGlvbnNbaV07CiAgICAgICAgIGF1dG8gYWR2YW5jZSA9IENH
U2l6ZU1ha2UobmV4dFBvc2l0aW9uLnggLSBjdXJyZW50UG9zaXRpb24ueCwgbmV4dFBvc2l0aW9u
LnkgLSBjdXJyZW50UG9zaXRpb24ueSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoQ0dTaXplQXBw
bHlBZmZpbmVUcmFuc2Zvcm0oYWR2YW5jZSwgdGV4dE1hdHJpeCkpOworICAgICAgICByZXN1bHQu
dW5jaGVja2VkQXBwZW5kKENHU2l6ZUFwcGx5QWZmaW5lVHJhbnNmb3JtKGFkdmFuY2UsIHRleHRN
YXRyaXgpKTsKICAgICB9Ci0gICAgcmVzdWx0LmNvbnN0cnVjdEFuZEFwcGVuZChDR1NpemVNYWtl
KDAsIDApKTsKKyAgICByZXN1bHQudW5jaGVja2VkQ29uc3RydWN0QW5kQXBwZW5kKENHU2l6ZU1h
a2UoMCwgMCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBWZWN0b3I8Q0dTaXpl
PiBjb21wdXRlVmVydGljYWxBZHZhbmNlc0Zyb21Qb3NpdGlvbnMoY29uc3QgQ0dTaXplIHRyYW5z
bGF0aW9uc1tdLCBjb25zdCBDR1BvaW50IHBvc2l0aW9uc1tdLCB1bnNpZ25lZCBjb3VudCwgQWZm
aW5lVHJhbnNmb3JtIHRleHRNYXRyaXgpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBuZWVkcyB0
byBiZSB0aGUgaW52ZXJzZSBvZiBmaWxsVmVjdG9yV2l0aFZlcnRpY2FsR2x5cGhQb3NpdGlvbnMo
KS4KKyAgICBWZWN0b3I8Q0dTaXplPiByZXN1bHQ7CisgICAgcmVzdWx0LnJlc2VydmVJbml0aWFs
Q2FwYWNpdHkoY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQgLSAxOyAr
K2kpIHsKKyAgICAgICAgYXV0byBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbnNbaSArIDFdOworICAg
ICAgICBhdXRvIGN1cnJlbnRQb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKKyAgICAgICAgYXV0byBh
ZHZhbmNlID0gQ0dTaXplTWFrZShuZXh0UG9zaXRpb24ueCAtIGN1cnJlbnRQb3NpdGlvbi54LCBu
ZXh0UG9zaXRpb24ueSAtIGN1cnJlbnRQb3NpdGlvbi55KTsKKyAgICAgICAgYXV0byBhZHZhbmNl
SW5Vc2VyQ29vcmRpbmF0ZXMgPSBDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybShhZHZhbmNlLCB0
ZXh0TWF0cml4KTsKKyAgICAgICAgYXV0byB0cmFuc2xhdGlvbiA9IENHU2l6ZUFwcGx5QWZmaW5l
VHJhbnNmb3JtKHRyYW5zbGF0aW9uc1tpXSwgY29tcHV0ZUJhc2VWZXJ0aWNhbFRleHRNYXRyaXgo
Y29tcHV0ZUJhc2VPdmVyYWxsVGV4dE1hdHJpeChzdGQ6Om51bGxvcHQpKSk7CisgICAgICAgIHJl
c3VsdC51bmNoZWNrZWRDb25zdHJ1Y3RBbmRBcHBlbmQoQ0dTaXplTWFrZShhZHZhbmNlSW5Vc2Vy
Q29vcmRpbmF0ZXMud2lkdGggLSB0cmFuc2xhdGlvbi53aWR0aCwgYWR2YW5jZUluVXNlckNvb3Jk
aW5hdGVzLmhlaWdodCAtIHRyYW5zbGF0aW9uLmhlaWdodCkpOworICAgIH0KKyAgICByZXN1bHQu
dW5jaGVja2VkQ29uc3RydWN0QW5kQXBwZW5kKENHU2l6ZU1ha2UoMCwgMCkpOwogICAgIHJldHVy
biByZXN1bHQ7CiB9CiAKQEAgLTI3OCwxOSArMjk3LDE1IEBAIHZvaWQgRHJhd0dseXBoc1JlY29y
ZGVyOjpyZWNvcmREcmF3R2x5cGhzKENHUmVuZGVyaW5nU3RhdGVSZWYsIENHR1N0YXRlUmVmIGdz
dGF0CiAgICAgYXV0byB0ZXh0TWF0cml4ID0gbV9vcmlnaW5hbFRleHRNYXRyaXg7CiAgICAgYXV0
byBpbml0aWFsUGVuUG9zaXRpb24gPSB0ZXh0TWF0cml4Lm1hcFBvaW50KHBvc2l0aW9uc1swXSk7
CiAKKyAgICBWZWN0b3I8Q0dTaXplPiBhZHZhbmNlczsKICAgICBpZiAoZm9udC0+cGxhdGZvcm1E
YXRhKCkub3JpZW50YXRpb24oKSA9PSBGb250T3JpZW50YXRpb246OlZlcnRpY2FsKSB7Ci0gICAg
ICAgIC8vIEtlZXAgdGhpcyBpbiBzeW5jIGFzIHRoZSBpbnZlcnNlIG9mIGBmaWxsVmVjdG9yV2l0
aFZlcnRpY2FsR2x5cGhQb3NpdGlvbnNgLgotICAgICAgICAvLyBGSVhNRTogVXNlIHJvdGF0ZUxl
ZnRUcmFuc2Zvcm0oKSwgYXMgZmlsbFZlY3RvcldpdGhWZXJ0aWNhbEdseXBoUG9zaXRpb25zKCkg
ZG9lcywgaW5zdGVhZCBvZiB1c2luZyB0cmFuc3Bvc2VkU2l6ZSgpLgotICAgICAgICBDR1NpemUg
dHJhbnNsYXRpb247Ci0gICAgICAgIENURm9udEdldFZlcnRpY2FsVHJhbnNsYXRpb25zRm9yR2x5
cGhzKGZvbnQtPnBsYXRmb3JtRGF0YSgpLmN0Rm9udCgpLCBnbHlwaHMsICZ0cmFuc2xhdGlvbiwg
MSk7Ci0KLSAgICAgICAgaW5pdGlhbFBlblBvc2l0aW9uICs9IEZsb2F0U2l6ZSh0cmFuc2xhdGlv
bikudHJhbnNwb3NlZFNpemUoKTsKLQotICAgICAgICBhdXRvIGFzY2VudERlbHRhID0gZm9udC0+
Zm9udE1ldHJpY3MoKS5mbG9hdEFzY2VudChJZGVvZ3JhcGhpY0Jhc2VsaW5lKSAtIGZvbnQtPmZv
bnRNZXRyaWNzKCkuZmxvYXRBc2NlbnQoKTsKLSAgICAgICAgaW5pdGlhbFBlblBvc2l0aW9uLm1v
dmUoMCwgLWFzY2VudERlbHRhKTsKLSAgICB9CisgICAgICAgIFZlY3RvcjxDR1NpemUsIDI1Nj4g
dHJhbnNsYXRpb25zKGNvdW50KTsKKyAgICAgICAgQ1RGb250R2V0VmVydGljYWxUcmFuc2xhdGlv
bnNGb3JHbHlwaHMoZm9udC0+cGxhdGZvcm1EYXRhKCkuY3RGb250KCksIGdseXBocywgdHJhbnNs
YXRpb25zLmRhdGEoKSwgY291bnQpOworICAgICAgICBhZHZhbmNlcyA9IGNvbXB1dGVWZXJ0aWNh
bEFkdmFuY2VzRnJvbVBvc2l0aW9ucyh0cmFuc2xhdGlvbnMuZGF0YSgpLCBwb3NpdGlvbnMsIGNv
dW50LCB0ZXh0TWF0cml4KTsKKyAgICB9IGVsc2UKKyAgICAgICAgYWR2YW5jZXMgPSBjb21wdXRl
SG9yaXpvbnRhbEFkdmFuY2VzRnJvbVBvc2l0aW9ucyhwb3NpdGlvbnMsIGNvdW50LCB0ZXh0TWF0
cml4KTsKIAotICAgIG1fb3duZXIuZHJhd0dseXBoc0FuZENhY2hlRm9udChmb250LCBnbHlwaHMs
IGNvbXB1dGVBZHZhbmNlc0Zyb21Qb3NpdGlvbnMocG9zaXRpb25zLCBjb3VudCwgdGV4dE1hdHJp
eCkuZGF0YSgpLCBjb3VudCwgaW5pdGlhbFBlblBvc2l0aW9uLCBtX3Ntb290aGluZ01vZGUpOwor
ICAgIG1fb3duZXIuZHJhd0dseXBoc0FuZENhY2hlRm9udChmb250LCBnbHlwaHMsIGFkdmFuY2Vz
LmRhdGEoKSwgY291bnQsIGluaXRpYWxQZW5Qb3NpdGlvbiwgbV9zbW9vdGhpbmdNb2RlKTsKIAog
ICAgIG1fb3duZXIuY29uY2F0Q1RNKGludmVyc2VDVE1GaXh1cCk7CiB9CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9Gb250Q2FzY2FkZUNvcmVU
ZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NvcmV0ZXh0L0ZvbnRD
YXNjYWRlQ29yZVRleHQuY3BwCmluZGV4IDFlODQ0MjcwNDJiMDk5ZGRiM2U0MWVlZmY2Y2U4YTNm
MGNjZWE1MTcuLmY1MDEwODhlYjE1MjIwNWJkNGE1YjU3ZGY4M2FhYWMzM2U0MTlhOWQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NvcmV0ZXh0L0ZvbnRDYXNj
YWRlQ29yZVRleHQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nv
cmV0ZXh0L0ZvbnRDYXNjYWRlQ29yZVRleHQuY3BwCkBAIC02MCw0NCArNjAsNTUgQEAgc3RhdGlj
IGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcm90YXRlTGVmdFRyYW5zZm9ybSgpCiAgICAgcmV0dXJu
IHJlc3VsdDsKIH0KIAotQWZmaW5lVHJhbnNmb3JtIGNvbXB1dGVPdmVyYWxsVGV4dE1hdHJpeChj
b25zdCBGb250JiBmb250KQorQWZmaW5lVHJhbnNmb3JtIGNvbXB1dGVCYXNlT3ZlcmFsbFRleHRN
YXRyaXgoY29uc3Qgc3RkOjpvcHRpb25hbDxBZmZpbmVUcmFuc2Zvcm0+JiBzeW50aGV0aWNPYmxp
cXVlKQogewotICAgIGF1dG8mIHBsYXRmb3JtRGF0YSA9IGZvbnQucGxhdGZvcm1EYXRhKCk7CiAg
ICAgQWZmaW5lVHJhbnNmb3JtIHJlc3VsdDsKLSAgICBpZiAoIXBsYXRmb3JtRGF0YS5pc0NvbG9y
Qml0bWFwRm9udCgpKQotICAgICAgICByZXN1bHQgPSBDVEZvbnRHZXRNYXRyaXgocGxhdGZvcm1E
YXRhLmN0Rm9udCgpKTsKKwogICAgIHJlc3VsdC5zZXRCKC1yZXN1bHQuYigpKTsKICAgICByZXN1
bHQuc2V0RCgtcmVzdWx0LmQoKSk7CisKKyAgICBpZiAoc3ludGhldGljT2JsaXF1ZSkKKyAgICAg
ICAgcmVzdWx0ID0gKnN5bnRoZXRpY09ibGlxdWUgKiByZXN1bHQ7CisKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCitBZmZpbmVUcmFuc2Zvcm0gY29tcHV0ZU92ZXJhbGxUZXh0TWF0cml4KGNvbnN0
IEZvbnQmIGZvbnQpCit7CisgICAgc3RkOjpvcHRpb25hbDxBZmZpbmVUcmFuc2Zvcm0+IHN5bnRo
ZXRpY09ibGlxdWU7CisgICAgYXV0byYgcGxhdGZvcm1EYXRhID0gZm9udC5wbGF0Zm9ybURhdGEo
KTsKICAgICBpZiAocGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUoKSkgewogICAgICAgICBm
bG9hdCBvYmxpcXVlU2tldyA9IHRhbmYoZGVnMnJhZChGb250Q2FzY2FkZTo6c3ludGhldGljT2Js
aXF1ZUFuZ2xlKCkpKTsKICAgICAgICAgaWYgKHBsYXRmb3JtRGF0YS5vcmllbnRhdGlvbigpID09
IEZvbnRPcmllbnRhdGlvbjo6VmVydGljYWwpIHsKICAgICAgICAgICAgIGlmIChmb250LmlzVGV4
dE9yaWVudGF0aW9uRmFsbGJhY2soKSkKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBBZmZpbmVU
cmFuc2Zvcm0oMSwgb2JsaXF1ZVNrZXcsIDAsIDEsIDAsIDApICogcmVzdWx0OworICAgICAgICAg
ICAgICAgIHN5bnRoZXRpY09ibGlxdWUgPSBBZmZpbmVUcmFuc2Zvcm0oMSwgb2JsaXF1ZVNrZXcs
IDAsIDEsIDAsIDApOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdCA9
IEFmZmluZVRyYW5zZm9ybSgxLCAtb2JsaXF1ZVNrZXcsIDAsIDEsIDAsIDApICogcmVzdWx0Owor
ICAgICAgICAgICAgICAgIHN5bnRoZXRpY09ibGlxdWUgPSBBZmZpbmVUcmFuc2Zvcm0oMSwgLW9i
bGlxdWVTa2V3LCAwLCAxLCAwLCAwKTsKICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXN1
bHQgPSBBZmZpbmVUcmFuc2Zvcm0oMSwgMCwgLW9ibGlxdWVTa2V3LCAxLCAwLCAwKSAqIHJlc3Vs
dDsKKyAgICAgICAgICAgIHN5bnRoZXRpY09ibGlxdWUgPSBBZmZpbmVUcmFuc2Zvcm0oMSwgMCwg
LW9ibGlxdWVTa2V3LCAxLCAwLCAwKTsKICAgICB9CiAKLSAgICAvLyBXZSdyZSBlbXVsYXRpbmcg
dGhlIGJlaGF2aW9yIG9mIENHQ29udGV4dFNldFRleHRQb3NpdGlvbigpIGJ5IGFkZGluZyBjb25z
dGFudCBhbW91bnRzIHRvIGVhY2ggZ2x5cGgncyBwb3NpdGlvbgotICAgIC8vIChzZWUgZmlsbFZl
Y3RvcldpdGhIb3Jpem9udGFsR2x5cGhQb3NpdGlvbnMoKSBhbmQgZmlsbFZlY3RvcldpdGhWZXJ0
aWNhbEdseXBoUG9zaXRpb25zKCkpLgotICAgIC8vIENHQ29udGV4dFNldFRleHRQb3NpdGlvbigp
IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY2xvYmJlcmluZyB0aGUgRSBhbmQgRiBmaWVsZHMgb2Yg
dGhlIHRleHQgbWF0cml4LAotICAgIC8vIHNvIHdlIGRvIHRoYXQgZXhwbGljaXRseSBoZXJlLgot
ICAgIHJlc3VsdC5zZXRFKDApOwotICAgIHJlc3VsdC5zZXRGKDApOwotICAgIHJldHVybiByZXN1
bHQ7CisgICAgcmV0dXJuIGNvbXB1dGVCYXNlT3ZlcmFsbFRleHRNYXRyaXgoc3ludGhldGljT2Js
aXF1ZSk7CiB9CiAKLUFmZmluZVRyYW5zZm9ybSBjb21wdXRlVmVydGljYWxUZXh0TWF0cml4KGNv
bnN0IEZvbnQmIGZvbnQsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcHJldmlvdXNUZXh0TWF0cml4
KQorQWZmaW5lVHJhbnNmb3JtIGNvbXB1dGVCYXNlVmVydGljYWxUZXh0TWF0cml4KGNvbnN0IEFm
ZmluZVRyYW5zZm9ybSYgcHJldmlvdXNUZXh0TWF0cml4KQogewotICAgIEFTU0VSVF9VTlVTRUQo
Zm9udCwgZm9udC5wbGF0Zm9ybURhdGEoKS5vcmllbnRhdGlvbigpID09IEZvbnRPcmllbnRhdGlv
bjo6VmVydGljYWwpOwogICAgIC8vIFRoZSB0cmFuc2xhdGlvbiBoZXJlICgiZSIgYW5kICJmIiBm
aWVsZHMpIGFyZSBpcnJlbGV2YW50LCBiZWNhdXNlCiAgICAgLy8gdGhpcyBtYXRyaXggaXMgaW52
ZXJ0ZWQgaW4gZmlsbFZlY3RvcldpdGhWZXJ0aWNhbEdseXBoUG9zaXRpb25zIHRvIHBsYWNlIHRo
ZSBnbHlwaHMgaW4gdGhlIENUTSdzIGNvb3JkaW5hdGUgc3lzdGVtLgogICAgIC8vIEFsbCB3ZSdy
ZSB0cnlpbmcgdG8gZG8gaGVyZSBpcyByb3RhdGUgdGhlIHRleHQgbWF0cml4IHNvIGdseXBocyBh
cHBlYXIgdmlzdWFsbHkgdXByaWdodC4KICAgICAvLyBXZSBoYXZlIHRvIGluY2x1ZGUgdGhlIHBy
ZXZpb3VzIHRleHQgbWF0cml4IGJlY2F1c2UgaXQgaW5jbHVkZXMgdGhpbmdzIGxpa2Ugc3ludGhl
dGljIG9ibGlxdWUuCisgICAgLy8KKyAgICAvLyBCZWNhdXNlIHRoaXMgaXMgYSBsZWZ0LW11bHRp
cGx5LCB3ZSdyZSB0YWtpbmcgdGhlIHBvaW50cyBmcm9tIHVzZXIgY29vcmRpbmF0ZXMsIHdoaWNo
IGFyZSBpbmNyZWFzaW5nLVktZ29lcy1kb3duLAorICAgIC8vIGFuZCB3ZSdyZSByb3RhdGluZyB0
aGUgcG9pbnRzIHRvIHRoZSBsZWZ0IGluIHRoYXQgY29vcmRpbmF0ZSBzeXN0ZW0sIHRvIHB1dCB0
aGVtIHBoeXNpY2FsbHkgdXByaWdodC4KICAgICByZXR1cm4gcm90YXRlTGVmdFRyYW5zZm9ybSgp
ICogcHJldmlvdXNUZXh0TWF0cml4OwogfQogCitBZmZpbmVUcmFuc2Zvcm0gY29tcHV0ZVZlcnRp
Y2FsVGV4dE1hdHJpeChjb25zdCBGb250JiBmb250LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBy
ZXZpb3VzVGV4dE1hdHJpeCkKK3sKKyAgICBBU1NFUlRfVU5VU0VEKGZvbnQsIGZvbnQucGxhdGZv
cm1EYXRhKCkub3JpZW50YXRpb24oKSA9PSBGb250T3JpZW50YXRpb246OlZlcnRpY2FsKTsKKyAg
ICByZXR1cm4gY29tcHV0ZUJhc2VWZXJ0aWNhbFRleHRNYXRyaXgocHJldmlvdXNUZXh0TWF0cml4
KTsKK30KKwogI2lmICFQTEFURk9STShXSU4pCiAKIC8vIENvbmZ1c2luZ2x5LCBldmVuIHdoZW4g
Q0dGb250UmVuZGVyaW5nR2V0Rm9udFNtb290aGluZ0Rpc2FibGVkKCkgcmV0dXJucyB0cnVlLCBD
R0NvbnRleHRTZXRTaG91bGRTbW9vdGhGb250cygpIHN0aWxsIGltcGFjdHMgdGV4dApAQCAtMTM4
LDE1ICsxNDksMTMyIEBAIHN0YXRpYyB2b2lkIGZpbGxWZWN0b3JXaXRoSG9yaXpvbnRhbEdseXBo
UG9zaXRpb25zKFZlY3RvcjxDR1BvaW50LCAyNTY+JiBwb3NpdGlvCiAgICAgfQogfQogCi1zdGF0
aWMgdm9pZCBmaWxsVmVjdG9yV2l0aFZlcnRpY2FsR2x5cGhQb3NpdGlvbnMoVmVjdG9yPENHUG9p
bnQsIDI1Nj4mIHBvc2l0aW9ucywgQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENHU2l6ZSog
dHJhbnNsYXRpb25zLCBjb25zdCBDR1NpemUqIGFkdmFuY2VzLCB1bnNpZ25lZCBjb3VudCwgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQsIGZsb2F0IGFzY2VudERlbHRhKQorc3RhdGljIHZvaWQgZmls
bFZlY3RvcldpdGhWZXJ0aWNhbEdseXBoUG9zaXRpb25zKFZlY3RvcjxDR1BvaW50LCAyNTY+JiBw
b3NpdGlvbnMsIGNvbnN0IENHU2l6ZSB0cmFuc2xhdGlvbnNbXSwgY29uc3QgQ0dTaXplIGFkdmFu
Y2VzW10sIHVuc2lnbmVkIGNvdW50LCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgZmxvYXQgYXNj
ZW50RGVsdGEsIENHQWZmaW5lVHJhbnNmb3JtIHRleHRNYXRyaXgpCiB7Ci0gICAgLy8gS2VlcCB0
aGlzIGluIHN5bmMgYXMgdGhlIGludmVyc2Ugb2YgYERyYXdHbHlwaHNSZWNvcmRlcjo6cmVjb3Jk
RHJhd0dseXBoc2AuCi0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gQ0dBZmZpbmVU
cmFuc2Zvcm1JbnZlcnQoQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChjb250ZXh0KSk7Ci0KKyAgICAv
LyBLZWVwIHRoaXMgZnVuY3Rpb24gaW4gc3luYyBhcyB0aGUgaW52ZXJzZSBvZiBgRHJhd0dseXBo
c1JlY29yZGVyOjpyZWNvcmREcmF3R2x5cGhzYC4KKworICAgIC8vIEl0J3MgaW1wb3J0YW50IHRv
IHJlYWxpemUgd2UncmUgZGVhbGluZyB3aXRoIDQgY29vcmRpbmF0ZSBzeXN0ZW1zIGhlcmU6Cisg
ICAgLy8gMS4gUGh5c2ljYWwgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoaXMgaXMgd2hhdCB0aGUgdXNl
ciBzZWVzLgorICAgIC8vIDIuIFVzZXIgY29vcmRpbmF0ZSBzeXN0ZW0uIFRoaXMgaXMgdGhlIGNv
b3JkaW5hdGUgc3lzdGVtIG9mIGp1c3QgdGhlIENUTS4gRm9yIHZlcnRpY2FsIHRleHQsIHRoaXMg
aXMganVzdCBsaWtlIHRoZSBub3JtYWwgV2ViS2l0IGluY3JlYXNpbmctWS1kb3duCisgICAgLy8g
ICAgICAgIGNvb3JkaW5hdGUgc3lzdGVtLCBleGNlcHQgd2UncmUgcm90YXRlZCByaWdodCwgc28g
bG9naWNhbCByaWdodCBpcyBwaHlzaWNhbCBkb3duLiAoV2UgZG8gdGhpcyBzbyBsb2dpY2FsIGlu
bGluZSBwcm9ncmVzc2lvbiBwcm9jZWVkcyBpbiB0aGUKKyAgICAvLyAgICAgICAgbG9naWNhbGx5
IGluY3JlYXNpbmctWCBkaW1lbnNpb24sIGp1c3QgYXMgaXQgd291bGQgaWYgd2Ugd2VyZW4ndCBk
b2luZyB2ZXJ0aWNhbCBzdHVmZi4pCisgICAgLy8gMy4gVGV4dCBjb29yZGluYXRlIHN5c3RlbS4g
VGhpcyBpcyB0aGUgY29vcmRpbmF0ZSBvZiB0aGUgdGV4dCBtYXRyaXggY29uY2F0ZW5hdGVkIHdp
dGggdGhlIENUTS4gRm9yIHZlcnRpY2FsIHRleHQsIHRoaXMgaXMgcm90YXRlZCBzdWNoIHRoYXQK
KyAgICAvLyAgICAgICAgaW5jcmVhc2luZyBZIGdvZXMgcGh5c2ljYWxseSB1cCwgYW5kIGluY3Jl
YXNpbmcgWCBnb2VzIHBoeXNpY2FsbHkgcmlnaHQuIFRoZSBjb250cm9sIHBvaW50cyBpbiBmb250
IGNvbnRvdXJzIGFyZSBhdXRob3JlZCBhY2NvcmRpbmcgdG8gdGhpcworICAgIC8vICAgICAgICBp
bmNyZWFzaW5nLVktdXAgY29vcmRpbmF0ZSBzeXN0ZW0uCisgICAgLy8gNC4gU3ludGhldGljLW9i
bGlxdWUtbGVzcyB0ZXh0IGNvb3JkaW5hdGUgc3lzdGVtLiBUaGlzIHdvdWxkIGJlIGlkZW50aWNh
bCB0byB0aGUgdGV4dCBjb29yZGluYXRlIHN5c3RlbSBpZiBzeW50aGV0aWMgb2JsaXF1ZSB3YXMg
bm90IGluIGVmZmVjdC4gVGhpcworICAgIC8vICAgICAgICBpcyB1c2VmdWwgYmVjYXVzZSwgd2hl
biB3ZSdyZSBtb3ZpbmcgZ2x5cGhzIGFyb3VuZCwgd2UgdXN1YWxseSBkb24ndCB3YW50IHRvIGNv
bnNpZGVyIHN5bnRoZXRpYyBvYmxpcXVlLiBJbnN0ZWFkLCBzeW50aGV0aWMgb2JsaXF1ZSBpcyBq
dXN0CisgICAgLy8gICAgICAgIGEgcmFzdGVyaXphdGlvbi10aW1lIGVmZmVjdCwgYW5kIG5vdCB1
c2VkIGZvciBnbHlwaCBwb3NpdGlvbmluZy9sYXlvdXQuCisgICAgLy8gICAgICAgIEZJWE1FOiBE
b2VzIHRoaXMgbWVhbiB0aGF0IHN5bnRoZXRpYyBvYmxpcXVlIHNob3VsZCBhbHdheXMgYmUgYXBw
bGllZCBvbiB0aGUgcmVzdWx0IG9mIHJvdGF0ZUxlZnRUcmFuc2Zvcm0oKSBpbiBjb21wdXRlVmVy
dGljYWxUZXh0TWF0cml4KCksCisgICAgLy8gICAgICAgIHJhdGhlciB0aGFuIHRoZSBvdGhlciB3
YXkgYXJvdW5kPworCisgICAgLy8gSW1hZ2luZSBhbiB2ZXJ0aWNhbCB1cHJpZ2h0IGdseXBoOgor
ICAgIC8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAvLyB8ICAgICAgX19fICAg
ICAgIF9fXyAgICAgICB8CisgICAgLy8gfCAgICAgIFwgIFwgICAgIC8gIC8gICAgICAgfAorICAg
IC8vIHwgICAgICAgXCAgXCAgIC8gIC8gICAgICAgIHwKKyAgICAvLyB8ICAgICAgICBcICBcIC8g
IC8gICAgICAgICB8CisgICAgLy8gfCAgICAgICAgIFwgIFYgIC8gICAgICAgICAgfAorICAgIC8v
IHwgICAgICAgICAgXCAgIC8gICAgICAgICAgIHwKKyAgICAvLyB8ICAgICAgICAgIHwgICB8ICAg
ICAgICAgICB8CisgICAgLy8gfCAgICAgICAgICB8ICAgfCAgICAgICAgICAgfAorICAgIC8vIHwg
ICAgICAgICAgfCAgIHwgICAgICAgICAgIHwKKyAgICAvLyB8ICAgICAgICAgIHwgICB8ICAgICAg
ICAgICB8CisgICAgLy8gfCAgICAgICAgICB8X19ffCAgICAgICAgICAgfAorICAgIC8vIHwgICAg
ICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAvLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0rCisgICAgLy8KKyAgICAvLyBUaGUgaWRlb2dyYXBoaWMgYmFzZWxpbmUgbGllcyBpbiB0aGUg
Y2VudGVyIG9mIHRoZSBnbHlwaCwgYW5kIHRoZSBhbHBoYWJldGljIGJhc2VsaW5lIGxpZXMgdG8g
dGhlIGxlZnQgb2YgaXQ6CisgICAgLy8gICAgIHwgICAgICAgIHwKKyAgICAvLyArLS0tfC0tLS0t
LS0tfC0tLS0tLS0tLS0tLS0rCisgICAgLy8gfCAgIHwgIF9fXyAgIHwgICBfX18gICAgICAgfAor
ICAgIC8vIHwgICB8ICBcICBcICB8ICAvICAvICAgICAgIHwKKyAgICAvLyB8ICAgfCAgIFwgIFwg
fCAvICAvICAgICAgICB8CisgICAgLy8gfCAgIHwgICAgXCAgXHwvICAvICAgICAgICAgfAorICAg
IC8vIHwgICB8ICAgICBcICB8ICAvICAgICAgICAgIHwKKyAgICAvLyB8ICAgfCAgICAgIFwgfCAv
ICAgICAgICAgICB8CisgICAgLy8gfCAgIHwgICAgICB8IHwgfCAgICAgICAgICAgfAorICAgIC8v
IHwgICB8ICAgICAgfCB8IHwgICAgICAgICAgIHwKKyAgICAvLyB8ICAgfCAgICAgIHwgfCB8ICAg
ICAgICAgICB8CisgICAgLy8gfCAgIHwgICAgICB8IHwgfCAgICAgICAgICAgfAorICAgIC8vIHwg
ICB8ICAgICAgfF98X3wgICAgICAgICAgIHwKKyAgICAvLyB8ICAgfCAgICAgICAgfCAgICAgICAg
ICAgICB8CisgICAgLy8gKy0tLXwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tKworICAgIC8vICAgICB8
ICAgICAgICB8IDw9PSBpZGVvZ3JhcGhpYyBiYXNlbGluZQorICAgIC8vICAgICB8IDw9PSBhbHBo
YWJldGljIGJhc2VsaW5lCisgICAgLy8KKyAgICAvLyBUaGUgZ2x5cGggaXRzZWxmIGhhcyBhIGxv
Y2FsIG9yaWdpbiwgd2hpY2ggaXMgdGhlIHBvc2l0aW9uIHNlbnQgdG8gQ29yZSBUZXh0LiBUaGUg
Y29udHJvbCBwb2ludHMgb2YgdGhlIGNvbnRvdXJzIGFyZSBkZWZpbmVkIHJlbGF0aXZlIHRvIHRo
aXMgcG9pbnQuCisgICAgLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIC8vIHwg
ICAgICBfX18gICAgICAgX19fICAgICAgIHwKKyAgICAvLyB8ICAgICAgXCAgXCAgICAgLyAgLyAg
ICAgICB8CisgICAgLy8gfCAgICAgICBcICBcICAgLyAgLyAgICAgICAgfAorICAgIC8vIHwgICAg
ICAgIFwgIFwgLyAgLyAgICAgICAgIHwKKyAgICAvLyB8ICAgICAgICAgXCAgViAgLyAgICAgICAg
ICB8CisgICAgLy8gfCAgICAgICAgICBcICAgLyAgICAgICAgICAgfAorICAgIC8vIHwgICAgICAg
ICAgfCAgIHwgICAgICAgICAgIHwKKyAgICAvLyB8ICAgICAgICAgIHwgICB8ICAgICAgICAgICB8
CisgICAgLy8gfCAgICAgICAgICB8ICAgfCAgICAgICAgICAgfAorICAgIC8vICogPD0gaGVyZSAg
fCAgIHwgICAgICAgICAgIHwKKyAgICAvLyB8ICAgICAgICAgIHxfX198ICAgICAgICAgICB8Cisg
ICAgLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSsKKyAgICAvLworICAgIC8vIE5vdywgZm9yIGhvcml6b250YWwgdGV4dCwg
d2UgY2FuIGRvIHRoZSBzaW1wbGUgdGhpbmcgb2YganVzdDoKKyAgICAvLyAxLiBQbGFjZSB0aGUg
cGVuIGF0IGEgcG9zaXRpb24uIFJlY29yZCB0aGlzIHBvc2l0aW9uIGFzIHRoZSBsb2NhbCBvcmln
aW4gb2YgdGhlIGZpcnN0IGdseXBoCisgICAgLy8gMi4gTW92ZSB0aGUgcGVuIGFjY29yZGluZyB0
byB0aGUgZ2x5cGgncyBhZHZhbmNlCisgICAgLy8gMy4gUmVjb3JkIGEgbmV3IHBvc2l0aW9uIGFz
IHRoZSBsb2NhbCBvcmlnaW4gb2YgdGhlIG5leHQgZ2x5cGgKKyAgICAvLyA0LiBHbyB0byAyCisg
ICAgLy8gSG93ZXZlciwgZm9yIHZlcnRpY2FsIHRleHQsIHdlIGNhbid0IGdldCBhd2F5IHdpdGgg
dGhpcyBiZWNhdXNlIHRoZSBnbHlwaCBvcmlnaW5zIGFyZSBub3Qgb24gdGhlIGJhc2VsaW5lLgor
ICAgIC8vIFRoaXMgaXMgd2hhdCB0aGUgInZlcnRpY2FsIHRyYW5zbGF0aW9uIGZvciBhIGdseXBo
IiBpcy4gSXQgY29udGFpbnMgdGhpcyB2ZWN0b3I6CisgICAgLy8gKy0tLS0tLS0tLS0tLUEtLS0t
LS0tLS0tLS0tKworICAgIC8vIHwgICAgICAgICAgIC8gICAgICAgICAgICAgIHwKKyAgICAvLyB8
ICAgICAgICAgIC8gICAgICAgICAgICAgICB8CisgICAgLy8gfCAgICAgICAgLS0gICAgICAgICAg
ICAgICAgfAorICAgIC8vIHwgICAgICAgLyAgICAgICAgICAgICAgICAgIHwKKyAgICAvLyB8ICAg
ICAgLyAgICAgICAgICAgICAgICAgICB8CisgICAgLy8gfCAgICAtLSAgICAgICAgICAgICAgICAg
ICAgfAorICAgIC8vIHwgICAvICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAvLyB8ICAvICAg
ICAgICAgICAgICAgICAgICAgICB8CisgICAgLy8gfHxfICAgICAgICAgICAgICAgICAgICAgICAg
fAorICAgIC8vIEIgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAvLyB8ICAgICAgICAg
ICAgICAgICAgICAgICAgICB8CisgICAgLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAgfAor
ICAgIC8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAvLyBJdCBwb2ludHMgZnJv
bSB0aGUgcGVuIHBvc2l0aW9uIG9uIHRoZSBpZGVvZ3JhcGhpYyBiYXNlbGluZSB0byB0aGUgZ2x5
cGgncyBsb2NhbCBvcmlnaW4uIFRoaXMgaXMgKHVzdWFsbHkpIHBoeXNpY2FsbHkKKyAgICAvLyBk
b3duLWFuZC10by10aGUtbGVmdC4gQ29yZSBUZXh0IGdpdmVzIHVzIHRoZXNlIHZlY3RvcnMgaW4g
dGhlIHRleHQgY29vcmRpbmF0ZSBzeXN0ZW0sIGFuZCBzbyB0aGVyZWZvcmUgdGhlc2UgdmVjdG9y
cyAodXN1YWxseSkgaGF2ZQorICAgIC8vIGJvdGggWCBhbmQgWSBjb21wb25lbnRzIG5lZ2F0aXZl
LgorCisgICAgLy8gVGhlIGdvYWwgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBwcm9kdWNlIGdseXBo
IG9yaWdpbnMgaW4gdGhlIHRleHQgY29vcmRpbmF0ZSBzeXN0ZW0sIGJlY2F1c2UgdGhhdCdzIHdo
YXQgQ29yZSBUZXh0IGV4cGVjdHMuIFRoZSAiYWR2YW5jZXMiCisgICAgLy8gYW5kICJwb2ludCIg
cGFyYW1ldGVycyB0byB0aGlzIGZ1bmN0aW9uIGFyZSBpbiB0aGUgdXNlciBjb29yZGluYXRlIHN5
c3RlbS4gVGhlICJ0cmFuc2xhdGlvbnMiIHBhcmFtZXRlciBpcyBpbiB0aGUgInN5bnRoZXRpYy1v
YmxpcXVlLWxlc3MKKyAgICAvLyB0ZXh0IGNvb3JkaW5hdGUgc3lzdGVtLiIKKworICAgIC8vIENH
Q29udGV4dEdldFRleHRNYXRyaXgoKSB0cmFuc2Zvcm1zIHBvaW50cyBmcm9tIHRleHQgY29vcmRp
bmF0ZXMgdG8gdXNlciBjb29yZGluYXRlcy4gSG93ZXZlciwgd2UncmUgdHJ5aW5nIHRvIHByb2R1
Y2UgdGV4dCBjb29yZGluYXRlcyBmcm9tCisgICAgLy8gdXNlciBjb29yZGluYXRlcywgc28gd2Ug
aW52ZXJ0IGl0LgorICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IENHQWZmaW5lVHJh
bnNmb3JtSW52ZXJ0KHRleHRNYXRyaXgpOworCisgICAgLy8gQmVjYXVzZSB0aGUgInZlcnRpY2Fs
IHRyYW5zbGF0aW9uIGZvciBhIGdseXBoIiB2ZWN0b3Igc3RhcnRzIGF0IHRoZSBpZGVvZ3JhcGhp
YyBiYXNlbGluZSAodGhlIHBvaW50IEEgaW4gdGhlIGFib3ZlIGRpYWdyYW0pLCB3ZSBoYXZlIHRv
CisgICAgLy8gYWRqdXN0IHRoZSBwZW4gcG9zaXRpb24gdG8gc3RhcnQgdGhlcmUuIFdlYktpdCdz
IHRleHQgcm91dGluZXMgc3RhcnQgb3V0IHVzaW5nIHRoZSBhbHBoYWJldGljIGJhc2VsaW5lIHNv
IHdlIGFkanVzdCB0aGUgc3RhcnQgcG9zaXRpb24KKyAgICAvLyBoZXJlLCB3aGljaCBoYXMgdGhl
IGVmZmVjdCBvZiBzaGlmdGluZyB0aGUgd2hvbGUgcnVuIGFsdG9nZXRoZXIuCisgICAgLy8KKyAg
ICAvLyBhc2NlbnREZWx0YSBpcyAodXN1YWxseSkgYSBuZWdhdGl2ZSBudW1iZXIsIGFuZCByZXBy
ZXNlbnRzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBpZGVvZ3JhcGhpYyBiYXNlbGluZSB0byB0
aGUgYWxwaGFiZXRpYyBiYXNlbGluZS4KKyAgICAvLyBJbiB1c2VyIGNvb3JkaW5hdGVzLCB3ZSB3
YW50IHRvIGFkanVzdCB0aGUgWSBjb21wb25lbnQgdG8gbWFrZSBhIGhvcml6b250YWwgcGh5c2lj
YWwgY2hhbmdlLiBBbmQsIGJlY2F1c2UgdGhlIHVzZXIgY29vcmRpbmF0ZSBzeXN0ZW0gaXMKKyAg
ICAvLyBsb2dpY2FsbHkgaW5jcmVhc2luZy1ZLWRvd24sIHdlIGFkZCB0aGUgdmFsdWUsIHdoaWNo
IGlzIG5lZ2F0aXZlLCB0byBtb3ZlIHVzIGxvZ2ljYWxseSB1cCwgd2hpY2ggaXMgcGh5c2ljYWxs
eSB0byB0aGUgcmlnaHQuIE5vdyBvdXIgcG9zaXRpb24KKyAgICAvLyBpcyBhdCB0aGUgcG9pbnQg
bGFiZWxsZWQgQSBpbiB0aGUgYWJvdmUgZGlhZ3JhbSwgaW4gdXNlciBjb29yZGluYXRlcy4KICAg
ICBhdXRvIHBvc2l0aW9uID0gQ0dQb2ludE1ha2UocG9pbnQueCgpLCBwb2ludC55KCkgKyBhc2Nl
bnREZWx0YSk7CisKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewot
ICAgICAgICBDR1NpemUgdHJhbnNsYXRpb24gPSBDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybSh0
cmFuc2xhdGlvbnNbaV0sIHJvdGF0ZUxlZnRUcmFuc2Zvcm0oKSk7Ci0gICAgICAgIHBvc2l0aW9u
c1tpXSA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShDR1BvaW50TWFrZShwb3NpdGlvbi54
IC0gdHJhbnNsYXRpb24ud2lkdGgsIHBvc2l0aW9uLnkgKyB0cmFuc2xhdGlvbi5oZWlnaHQpLCB0
cmFuc2Zvcm0pOworICAgICAgICAvLyBUaGUgInRyYW5zbGF0aW9ucyIgcGFyYW1ldGVyIGlzIGlu
IHRoZSAic3ludGhldGljLW9ibGlxdWUtbGVzcyB0ZXh0IGNvb3JkaW5hdGUgc3lzdGVtIiBhbmQg
d2Ugd2FudCB0byBhZGQgaXQgdG8gdGhlIHBvc2l0aW9uIGluIHRoZSB1c2VyCisgICAgICAgIC8v
IGNvb3JkaW5hdGUgc3lzdGVtLiBMdWNraWx5LCB0aGUgdGV4dCBtYXRyaXggKG9yLCBhdCBsZWFz
dCB0aGUgdmVyc2lvbiBvZiB0aGUgdGV4dCBtYXRyaXggdGhhdCBkb2Vzbid0IGluY2x1ZGUgc3lu
dGhldGljIG9ibGlxdWUpIGRvZXMgZXhhY3RseQorICAgICAgICAvLyB0aGlzLiBTbywgd2UganVz
dCBjcmVhdGUgdGhlIHN5bnRoZXRpYy1vYmxpcXVlLWxlc3MgdGV4dCBtYXRyaXgsIGFuZCBydW4g
dGhlIHRyYW5zbGF0aW9uIHRocm91Z2ggaXQuIFRoaXMgZ2l2ZXMgdXMgdGhlIHRyYW5zbGF0aW9u
IGluIHVzZXIKKyAgICAgICAgLy8gY29vcmRpbmF0ZXMuCisgICAgICAgIGF1dG8gdHJhbnNsYXRp
b24gPSBDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybSh0cmFuc2xhdGlvbnNbaV0sIGNvbXB1dGVC
YXNlVmVydGljYWxUZXh0TWF0cml4KGNvbXB1dGVCYXNlT3ZlcmFsbFRleHRNYXRyaXgoc3RkOjpu
dWxsb3B0KSkpOworCisgICAgICAgIC8vIE5vdyB3ZSBjYW4gYWRkIHRoZSBwb3NpdGlvbiBpbiB1
c2VyIGNvb3JkaW5hdGVzIHdpdGggdGhlIHRyYW5zbGF0aW9uIGluIHVzZXIgY29vcmRpbmF0ZXMu
CisgICAgICAgIGF1dG8gcG9zaXRpb25JblVzZXJDb29yZGluYXRlcyA9IENHUG9pbnRNYWtlKHBv
c2l0aW9uLnggKyB0cmFuc2xhdGlvbi53aWR0aCwgcG9zaXRpb24ueSArIHRyYW5zbGF0aW9uLmhl
aWdodCk7CisKKyAgICAgICAgLy8gQW5kIHRoZW4gcHV0IGl0IGJhY2sgaW4gZm9udCBjb29yZGlu
YXRlcyBmb3Igc3VibWlzc2lvbiB0byBDb3JlIFRleHQuIFlheSEKKyAgICAgICAgcG9zaXRpb25z
W2ldID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNmb3JtKHBvc2l0aW9uSW5Vc2VyQ29vcmRpbmF0
ZXMsIHRyYW5zZm9ybSk7CisKKyAgICAgICAgLy8gQWR2YW5jZSB0aGUgcG9zaXRpb24gdG8gdGhl
IG5leHQgcG9zaXRpb24gaW4gdXNlciBjb29yZGluYXRlcy4gQm90aCB0aGUgYWR2YW5jZXMgYW5k
IHBvc2l0aW9uIGFyZSBpbiB1c2VyIGNvb3JkaW5hdGVzLgogICAgICAgICBwb3NpdGlvbi54ICs9
IGFkdmFuY2VzW2ldLndpZHRoOwogICAgICAgICBwb3NpdGlvbi55ICs9IGFkdmFuY2VzW2ldLmhl
aWdodDsKICAgICB9CkBAIC0xNjYsNyArMjk0LDcgQEAgc3RhdGljIHZvaWQgc2hvd0dseXBoc1dp
dGhBZHZhbmNlcyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgY29uc3QgRm9udCYgZm9udCwgQ0cK
ICAgICAgICAgQ1RGb250R2V0VmVydGljYWxUcmFuc2xhdGlvbnNGb3JHbHlwaHMocGxhdGZvcm1E
YXRhLmN0Rm9udCgpLCBnbHlwaHMsIHRyYW5zbGF0aW9ucy5kYXRhKCksIGNvdW50KTsKIAogICAg
ICAgICBhdXRvIGFzY2VudERlbHRhID0gZm9udC5mb250TWV0cmljcygpLmZsb2F0QXNjZW50KElk
ZW9ncmFwaGljQmFzZWxpbmUpIC0gZm9udC5mb250TWV0cmljcygpLmZsb2F0QXNjZW50KCk7Ci0g
ICAgICAgIGZpbGxWZWN0b3JXaXRoVmVydGljYWxHbHlwaFBvc2l0aW9ucyhwb3NpdGlvbnMsIGNv
bnRleHQsIHRyYW5zbGF0aW9ucy5kYXRhKCksIGFkdmFuY2VzLCBjb3VudCwgcG9pbnQsIGFzY2Vu
dERlbHRhKTsKKyAgICAgICAgZmlsbFZlY3RvcldpdGhWZXJ0aWNhbEdseXBoUG9zaXRpb25zKHBv
c2l0aW9ucywgdHJhbnNsYXRpb25zLmRhdGEoKSwgYWR2YW5jZXMsIGNvdW50LCBwb2ludCwgYXNj
ZW50RGVsdGEsIENHQ29udGV4dEdldFRleHRNYXRyaXgoY29udGV4dCkpOwogICAgICAgICBDVEZv
bnREcmF3R2x5cGhzKHBsYXRmb3JtRGF0YS5jdEZvbnQoKSwgZ2x5cGhzLCBwb3NpdGlvbnMuZGF0
YSgpLCBjb3VudCwgY29udGV4dCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmlsbFZlY3Rvcldp
dGhIb3Jpem9udGFsR2x5cGhQb3NpdGlvbnMocG9zaXRpb25zLCBjb250ZXh0LCBhZHZhbmNlcywg
Y291bnQsIHBvaW50KTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>457936</attachid>
            <date>2022-04-19 14:37:29 -0700</date>
            <delta_ts>2022-04-20 20:44:01 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-239484-20220419143728.patch</filename>
            <type>text/plain</type>
            <size>6530</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjkzMDM2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTYzMTk5ODU3ODk3ZmNj
NWVlMzQyOGMzZDQyMWI0YTIwZWE3MDg3Ny4uYzViOTIzNzkwZjI5Y2ZlYjZkNTFiYmExMDU0OGU4
ODdkOTM0MjEzZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDIyLTA0LTE5ICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgW0dQVSBQcm9j
ZXNzXSBWZXJ0aWNhbCB0ZXh0IGlzIGluY29ycmVjdGx5IGRpc3BsYWNlZAorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NDg0CisgICAgICAgIDxyZGFy
Oi8vcHJvYmxlbS85MTE4NzEyMz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBJbXBsZW1lbnQgY29tcHV0ZVZlcnRpY2FsQWR2YW5jZXNGcm9tUG9zaXRp
b25zKCkgYXMgdGhlIG1hdGhlbWF0aWNhbCBpbnZlcnNlIG9mCisgICAgICAgIGZpbGxWZWN0b3JX
aXRoVmVydGljYWxHbHlwaFBvc2l0aW9ucygpLgorCisgICAgICAgIENvdmVyZWQgYnkgZXhpc3Rp
bmcgdGVzdHMgKHdpdGggdGhlIEdQVSBwcm9jZXNzIGVuYWJsZWQpLgorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY29yZXRleHQvRHJhd0dseXBoc1JlY29yZGVyQ29yZVRleHQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZUhvcml6b250YWxBZHZhbmNlc0Zyb21Qb3NpdGlvbnMp
OgorICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZVZlcnRpY2FsQWR2YW5jZXNGcm9tUG9zaXRpb25z
KToKKyAgICAgICAgKFdlYkNvcmU6OkRyYXdHbHlwaHNSZWNvcmRlcjo6cmVjb3JkRHJhd0dseXBo
cyk6CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlQWR2YW5jZXNGcm9tUG9zaXRpb25zKTogRGVs
ZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9Gb250Q2FzY2FkZUNv
cmVUZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmZpbGxWZWN0b3JXaXRoVmVydGljYWxHbHlw
aFBvc2l0aW9ucyk6CisKIDIwMjItMDQtMTkgIEFkYSBDaGFuICA8YWRhY2hhbkBhcHBsZS5jb20+
CiAKICAgICAgICAgW1dlYlhSXSBVcGRhdGUgRGV2aWNlOjppbml0aWFsaXplVHJhY2tpbmdBbmRS
ZW5kZXJpbmcoKSB0byB0YWtlIGluIG1vcmUgcGFyYW1ldGVycyByZWdhcmRpbmcgdGhlIHNlc3Np
b24gc2V0dXAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nv
cmV0ZXh0L0RyYXdHbHlwaHNSZWNvcmRlckNvcmVUZXh0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2NvcmV0ZXh0L0RyYXdHbHlwaHNSZWNvcmRlckNvcmVUZXh0LmNwcApp
bmRleCBmMjNjNTQ1MjBiYTM5YTkyOWNhYWViOTg5OTE2YzBiOTFlY2YxNDZjLi4yNzk5ZjE1YTY3
MTgxM2QwNTMzZjhkOTk1MTNlYTkwMWQzMjk1ODY3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9EcmF3R2x5cGhzUmVjb3JkZXJDb3JlVGV4dC5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY29yZXRleHQvRHJhd0ds
eXBoc1JlY29yZGVyQ29yZVRleHQuY3BwCkBAIC0yMTUsMTYgKzIxNSwzNSBAQCB2b2lkIERyYXdH
bHlwaHNSZWNvcmRlcjo6cmVjb3JkRW5kTGF5ZXIoQ0dSZW5kZXJpbmdTdGF0ZVJlZiwgQ0dHU3Rh
dGVSZWYgZ3N0YXRlKQogICAgIG1fb3duZXIuZW5kVHJhbnNwYXJlbmN5TGF5ZXIoKTsKIH0KIAot
c3RhdGljIFZlY3RvcjxDR1NpemU+IGNvbXB1dGVBZHZhbmNlc0Zyb21Qb3NpdGlvbnMoY29uc3Qg
Q0dQb2ludCBwb3NpdGlvbnNbXSwgc2l6ZV90IGNvdW50LCBjb25zdCBDR0FmZmluZVRyYW5zZm9y
bSYgdGV4dE1hdHJpeCkKK3N0YXRpYyBWZWN0b3I8Q0dTaXplPiBjb21wdXRlSG9yaXpvbnRhbEFk
dmFuY2VzRnJvbVBvc2l0aW9ucyhjb25zdCBDR1BvaW50IHBvc2l0aW9uc1tdLCBzaXplX3QgY291
bnQsIGNvbnN0IENHQWZmaW5lVHJhbnNmb3JtJiB0ZXh0TWF0cml4KQogeworICAgIC8vIFRoaXMg
ZnVuY3Rpb24gbmVlZHMgdG8gYmUgdGhlIGludmVyc2Ugb2YgZmlsbFZlY3RvcldpdGhIb3Jpem9u
dGFsR2x5cGhQb3NpdGlvbnMoKS4KICAgICBWZWN0b3I8Q0dTaXplPiByZXN1bHQ7CisgICAgcmVz
dWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoY291bnQpOwogICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgY291bnQgLSAxOyArK2kpIHsKICAgICAgICAgYXV0byBuZXh0UG9zaXRpb24gPSBwb3Np
dGlvbnNbaSArIDFdOwogICAgICAgICBhdXRvIGN1cnJlbnRQb3NpdGlvbiA9IHBvc2l0aW9uc1tp
XTsKICAgICAgICAgYXV0byBhZHZhbmNlID0gQ0dTaXplTWFrZShuZXh0UG9zaXRpb24ueCAtIGN1
cnJlbnRQb3NpdGlvbi54LCBuZXh0UG9zaXRpb24ueSAtIGN1cnJlbnRQb3NpdGlvbi55KTsKLSAg
ICAgICAgcmVzdWx0LmFwcGVuZChDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybShhZHZhbmNlLCB0
ZXh0TWF0cml4KSk7CisgICAgICAgIHJlc3VsdC51bmNoZWNrZWRBcHBlbmQoQ0dTaXplQXBwbHlB
ZmZpbmVUcmFuc2Zvcm0oYWR2YW5jZSwgdGV4dE1hdHJpeCkpOwogICAgIH0KLSAgICByZXN1bHQu
Y29uc3RydWN0QW5kQXBwZW5kKENHU2l6ZU1ha2UoMCwgMCkpOworICAgIHJlc3VsdC51bmNoZWNr
ZWRDb25zdHJ1Y3RBbmRBcHBlbmQoQ0dTaXplTWFrZSgwLCAwKSk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKworc3RhdGljIFZlY3RvcjxDR1NpemU+IGNvbXB1dGVWZXJ0aWNhbEFkdmFuY2VzRnJv
bVBvc2l0aW9ucyhjb25zdCBDR1NpemUgdHJhbnNsYXRpb25zW10sIGNvbnN0IENHUG9pbnQgcG9z
aXRpb25zW10sIHVuc2lnbmVkIGNvdW50LCBBZmZpbmVUcmFuc2Zvcm0gdGV4dE1hdHJpeCkKK3sK
KyAgICAvLyBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHRoZSBpbnZlcnNlIG9mIGZpbGxWZWN0
b3JXaXRoVmVydGljYWxHbHlwaFBvc2l0aW9ucygpLgorICAgIFZlY3RvcjxDR1NpemU+IHJlc3Vs
dDsKKyAgICByZXN1bHQucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eShjb3VudCk7CisgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBjb3VudCAtIDE7ICsraSkgeworICAgICAgICBhdXRvIG5leHRQb3Np
dGlvbiA9IHBvc2l0aW9uc1tpICsgMV07CisgICAgICAgIGF1dG8gY3VycmVudFBvc2l0aW9uID0g
cG9zaXRpb25zW2ldOworICAgICAgICBhdXRvIGFkdmFuY2UgPSBDR1NpemVNYWtlKG5leHRQb3Np
dGlvbi54IC0gY3VycmVudFBvc2l0aW9uLngsIG5leHRQb3NpdGlvbi55IC0gY3VycmVudFBvc2l0
aW9uLnkpOworICAgICAgICBhdXRvIGFkdmFuY2VJblVzZXJDb29yZGluYXRlcyA9IENHU2l6ZUFw
cGx5QWZmaW5lVHJhbnNmb3JtKGFkdmFuY2UsIHRleHRNYXRyaXgpOworICAgICAgICBhdXRvIHRy
YW5zbGF0aW9uID0gQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0odHJhbnNsYXRpb25zW2ldLCBj
b21wdXRlQmFzZVZlcnRpY2FsVGV4dE1hdHJpeChjb21wdXRlQmFzZU92ZXJhbGxUZXh0TWF0cml4
KHN0ZDo6bnVsbG9wdCkpKTsKKyAgICAgICAgcmVzdWx0LnVuY2hlY2tlZENvbnN0cnVjdEFuZEFw
cGVuZChDR1NpemVNYWtlKGFkdmFuY2VJblVzZXJDb29yZGluYXRlcy53aWR0aCAtIHRyYW5zbGF0
aW9uLndpZHRoLCBhZHZhbmNlSW5Vc2VyQ29vcmRpbmF0ZXMuaGVpZ2h0IC0gdHJhbnNsYXRpb24u
aGVpZ2h0KSk7CisgICAgfQorICAgIHJlc3VsdC51bmNoZWNrZWRDb25zdHJ1Y3RBbmRBcHBlbmQo
Q0dTaXplTWFrZSgwLCAwKSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjc4LDE5ICsy
OTcsMTUgQEAgdm9pZCBEcmF3R2x5cGhzUmVjb3JkZXI6OnJlY29yZERyYXdHbHlwaHMoQ0dSZW5k
ZXJpbmdTdGF0ZVJlZiwgQ0dHU3RhdGVSZWYgZ3N0YXQKICAgICBhdXRvIHRleHRNYXRyaXggPSBt
X29yaWdpbmFsVGV4dE1hdHJpeDsKICAgICBhdXRvIGluaXRpYWxQZW5Qb3NpdGlvbiA9IHRleHRN
YXRyaXgubWFwUG9pbnQocG9zaXRpb25zWzBdKTsKIAorICAgIFZlY3RvcjxDR1NpemU+IGFkdmFu
Y2VzOwogICAgIGlmIChmb250LT5wbGF0Zm9ybURhdGEoKS5vcmllbnRhdGlvbigpID09IEZvbnRP
cmllbnRhdGlvbjo6VmVydGljYWwpIHsKLSAgICAgICAgLy8gS2VlcCB0aGlzIGluIHN5bmMgYXMg
dGhlIGludmVyc2Ugb2YgYGZpbGxWZWN0b3JXaXRoVmVydGljYWxHbHlwaFBvc2l0aW9uc2AuCi0g
ICAgICAgIC8vIEZJWE1FOiBVc2Ugcm90YXRlTGVmdFRyYW5zZm9ybSgpLCBhcyBmaWxsVmVjdG9y
V2l0aFZlcnRpY2FsR2x5cGhQb3NpdGlvbnMoKSBkb2VzLCBpbnN0ZWFkIG9mIHVzaW5nIHRyYW5z
cG9zZWRTaXplKCkuCi0gICAgICAgIENHU2l6ZSB0cmFuc2xhdGlvbjsKLSAgICAgICAgQ1RGb250
R2V0VmVydGljYWxUcmFuc2xhdGlvbnNGb3JHbHlwaHMoZm9udC0+cGxhdGZvcm1EYXRhKCkuY3RG
b250KCksIGdseXBocywgJnRyYW5zbGF0aW9uLCAxKTsKLQotICAgICAgICBpbml0aWFsUGVuUG9z
aXRpb24gKz0gRmxvYXRTaXplKHRyYW5zbGF0aW9uKS50cmFuc3Bvc2VkU2l6ZSgpOwotCi0gICAg
ICAgIGF1dG8gYXNjZW50RGVsdGEgPSBmb250LT5mb250TWV0cmljcygpLmZsb2F0QXNjZW50KElk
ZW9ncmFwaGljQmFzZWxpbmUpIC0gZm9udC0+Zm9udE1ldHJpY3MoKS5mbG9hdEFzY2VudCgpOwot
ICAgICAgICBpbml0aWFsUGVuUG9zaXRpb24ubW92ZSgwLCAtYXNjZW50RGVsdGEpOwotICAgIH0K
KyAgICAgICAgVmVjdG9yPENHU2l6ZSwgMjU2PiB0cmFuc2xhdGlvbnMoY291bnQpOworICAgICAg
ICBDVEZvbnRHZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhmb250LT5wbGF0Zm9ybURh
dGEoKS5jdEZvbnQoKSwgZ2x5cGhzLCB0cmFuc2xhdGlvbnMuZGF0YSgpLCBjb3VudCk7CisgICAg
ICAgIGFkdmFuY2VzID0gY29tcHV0ZVZlcnRpY2FsQWR2YW5jZXNGcm9tUG9zaXRpb25zKHRyYW5z
bGF0aW9ucy5kYXRhKCksIHBvc2l0aW9ucywgY291bnQsIHRleHRNYXRyaXgpOworICAgIH0gZWxz
ZQorICAgICAgICBhZHZhbmNlcyA9IGNvbXB1dGVIb3Jpem9udGFsQWR2YW5jZXNGcm9tUG9zaXRp
b25zKHBvc2l0aW9ucywgY291bnQsIHRleHRNYXRyaXgpOwogCi0gICAgbV9vd25lci5kcmF3R2x5
cGhzQW5kQ2FjaGVGb250KGZvbnQsIGdseXBocywgY29tcHV0ZUFkdmFuY2VzRnJvbVBvc2l0aW9u
cyhwb3NpdGlvbnMsIGNvdW50LCB0ZXh0TWF0cml4KS5kYXRhKCksIGNvdW50LCBpbml0aWFsUGVu
UG9zaXRpb24sIG1fc21vb3RoaW5nTW9kZSk7CisgICAgbV9vd25lci5kcmF3R2x5cGhzQW5kQ2Fj
aGVGb250KGZvbnQsIGdseXBocywgYWR2YW5jZXMuZGF0YSgpLCBjb3VudCwgaW5pdGlhbFBlblBv
c2l0aW9uLCBtX3Ntb290aGluZ01vZGUpOwogCiAgICAgbV9vd25lci5jb25jYXRDVE0oaW52ZXJz
ZUNUTUZpeHVwKTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NvcmV0ZXh0L0ZvbnRDYXNjYWRlQ29yZVRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY29yZXRleHQvRm9udENhc2NhZGVDb3JlVGV4dC5jcHAKaW5kZXggMDE3
NWViNzFhYTU3MmFhOTViOWJlZDQ4MTQzNTdlYTM0YjdhMzhhZS4uMDFmYmQ5Yzk2OTQzOGQyNTJi
YmY3YTgwYTJiYmVmZTFlMjAwZTdhNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY29yZXRleHQvRm9udENhc2NhZGVDb3JlVGV4dC5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY29yZXRleHQvRm9udENhc2NhZGVDb3JlVGV4dC5j
cHAKQEAgLTIyNiw3ICsyMjYsNyBAQCBzdGF0aWMgdm9pZCBmaWxsVmVjdG9yV2l0aFZlcnRpY2Fs
R2x5cGhQb3NpdGlvbnMoVmVjdG9yPENHUG9pbnQsIDI1Nj4mIHBvc2l0aW9ucwogICAgIC8vIDMu
IFJlY29yZCBhIG5ldyBwb3NpdGlvbiBhcyB0aGUgbG9jYWwgb3JpZ2luIG9mIHRoZSBuZXh0IGds
eXBoCiAgICAgLy8gNC4gR28gdG8gMgogICAgIC8vIEhvd2V2ZXIsIGZvciB2ZXJ0aWNhbCB0ZXh0
LCB3ZSBjYW4ndCBnZXQgYXdheSB3aXRoIHRoaXMgYmVjYXVzZSB0aGUgZ2x5cGggb3JpZ2lucyBh
cmUgbm90IG9uIHRoZSBiYXNlbGluZS4KLSAgICAvLyBUaGlzIGlzIHdoYXQgdGhlICJ2ZXJ0aWNh
bCB0cmFuc2xhdGlvbiBmb3IgYSBnbHlwaCIgaXMuIEl0IGNvbnRhaW5zIHRoaXMgdmVjdG9yOgor
ICAgIC8vIFRoaXMgaXMgd2hhdCB0aGUgInZlcnRpY2FsIHRyYW5zbGF0aW9uIGZvciBhIGdseXBo
IiBpcyBmb3IuIEl0IGNvbnRhaW5zIHRoaXMgdmVjdG9yOgogICAgIC8vICstLS1BLS0tLS0tLS1C
LS0tLS0tLS0tLS0tLSsKICAgICAvLyB8ICAgICAgICAgICAvICAgICAgICAgICAgICB8CiAgICAg
Ly8gfCAgICAgICAgICAvICAgICAgICAgICAgICAgfAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>458034</attachid>
            <date>2022-04-20 20:44:03 -0700</date>
            <delta_ts>2022-04-21 14:20:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-239484-20220420204402.patch</filename>
            <type>text/plain</type>
            <size>9368</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjkzMTIzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMjcyNGU5ZjQ1NjQ5NzQ3
YTJhZTZhZjAzOGM4MmU5NDZiODViYTNjOS4uZjM1Y2M0MmI3YmMzOTY1ZmEwNDBlOWE3MGY2MzQy
NzAzMDE4NjQ4YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDIyLTA0LTIwICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgW0dQVSBQcm9j
ZXNzXSBWZXJ0aWNhbCB0ZXh0IGlzIGluY29ycmVjdGx5IGRpc3BsYWNlZAorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjM5NDg0CisgICAgICAgIDxyZGFy
Oi8vcHJvYmxlbS85MTE4NzEyMz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBJbXBsZW1lbnQgY29tcHV0ZVZlcnRpY2FsQWR2YW5jZXNGcm9tUG9zaXRp
b25zKCkgYXMgdGhlIG1hdGhlbWF0aWNhbCBpbnZlcnNlIG9mCisgICAgICAgIGZpbGxWZWN0b3JX
aXRoVmVydGljYWxHbHlwaFBvc2l0aW9ucygpLgorCisgICAgICAgIENvdmVyZWQgYnkgZXhpc3Rp
bmcgdGVzdHMgKHdpdGggdGhlIEdQVSBwcm9jZXNzIGVuYWJsZWQpLgorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY29yZXRleHQvRHJhd0dseXBoc1JlY29yZGVyQ29yZVRleHQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZUhvcml6b250YWxBZHZhbmNlc0Zyb21Qb3NpdGlvbnMp
OgorICAgICAgICAoV2ViQ29yZTo6Y29tcHV0ZVZlcnRpY2FsQWR2YW5jZXNGcm9tUG9zaXRpb25z
KToKKyAgICAgICAgKFdlYkNvcmU6OkRyYXdHbHlwaHNSZWNvcmRlcjo6cmVjb3JkRHJhd0dseXBo
cyk6CisgICAgICAgIChXZWJDb3JlOjpjb21wdXRlQWR2YW5jZXNGcm9tUG9zaXRpb25zKTogRGVs
ZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9Gb250Q2FzY2FkZUNv
cmVUZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmZpbGxWZWN0b3JXaXRoVmVydGljYWxHbHlw
aFBvc2l0aW9ucyk6CisKIDIwMjItMDQtMjAgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNv
bT4KIAogICAgICAgICBBdm9pZCBjYWxsIHRvIGNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCkgaW4g
U2VsZWN0b3JGaWx0ZXI6OmNvbGxlY3RFbGVtZW50SWRlbnRpZmllckhhc2hlcygpIGluIHRoZSBj
b21tb24gY2FzZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y29yZXRleHQvRHJhd0dseXBoc1JlY29yZGVyQ29yZVRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY29yZXRleHQvRHJhd0dseXBoc1JlY29yZGVyQ29yZVRleHQuY3Bw
CmluZGV4IGYyM2M1NDUyMGJhMzlhOTI5Y2FhZWI5ODk5MTZjMGI5MWVjZjE0NmMuLjYzODE0MDhh
MjhiNzI5Mjk2YWEzZThjZmEzYjNiMzAzM2ZiZGFmZjYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NvcmV0ZXh0L0RyYXdHbHlwaHNSZWNvcmRlckNvcmVUZXh0
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9EcmF3
R2x5cGhzUmVjb3JkZXJDb3JlVGV4dC5jcHAKQEAgLTIxNSwxNiArMjE1LDU0IEBAIHZvaWQgRHJh
d0dseXBoc1JlY29yZGVyOjpyZWNvcmRFbmRMYXllcihDR1JlbmRlcmluZ1N0YXRlUmVmLCBDR0dT
dGF0ZVJlZiBnc3RhdGUpCiAgICAgbV9vd25lci5lbmRUcmFuc3BhcmVuY3lMYXllcigpOwogfQog
Ci1zdGF0aWMgVmVjdG9yPENHU2l6ZT4gY29tcHV0ZUFkdmFuY2VzRnJvbVBvc2l0aW9ucyhjb25z
dCBDR1BvaW50IHBvc2l0aW9uc1tdLCBzaXplX3QgY291bnQsIGNvbnN0IENHQWZmaW5lVHJhbnNm
b3JtJiB0ZXh0TWF0cml4KQorc3RhdGljIFZlY3RvcjxDR1NpemU+IGNvbXB1dGVIb3Jpem9udGFs
QWR2YW5jZXNGcm9tUG9zaXRpb25zKGNvbnN0IENHUG9pbnQgcG9zaXRpb25zW10sIHNpemVfdCBj
b3VudCwgY29uc3QgQ0dBZmZpbmVUcmFuc2Zvcm0mIHRleHRNYXRyaXgpCiB7CisgICAgLy8gVGhp
cyBmdW5jdGlvbiBuZWVkcyB0byBiZSB0aGUgaW52ZXJzZSBvZiBmaWxsVmVjdG9yV2l0aEhvcml6
b250YWxHbHlwaFBvc2l0aW9ucygpLgorCiAgICAgVmVjdG9yPENHU2l6ZT4gcmVzdWx0OworICAg
IHJlc3VsdC5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNvdW50KTsKICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGNvdW50IC0gMTsgKytpKSB7CiAgICAgICAgIGF1dG8gbmV4dFBvc2l0aW9uID0g
cG9zaXRpb25zW2kgKyAxXTsKICAgICAgICAgYXV0byBjdXJyZW50UG9zaXRpb24gPSBwb3NpdGlv
bnNbaV07CiAgICAgICAgIGF1dG8gYWR2YW5jZSA9IENHU2l6ZU1ha2UobmV4dFBvc2l0aW9uLngg
LSBjdXJyZW50UG9zaXRpb24ueCwgbmV4dFBvc2l0aW9uLnkgLSBjdXJyZW50UG9zaXRpb24ueSk7
Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0oYWR2YW5j
ZSwgdGV4dE1hdHJpeCkpOworICAgICAgICByZXN1bHQudW5jaGVja2VkQXBwZW5kKENHU2l6ZUFw
cGx5QWZmaW5lVHJhbnNmb3JtKGFkdmFuY2UsIHRleHRNYXRyaXgpKTsKKyAgICB9CisgICAgcmVz
dWx0LnVuY2hlY2tlZENvbnN0cnVjdEFuZEFwcGVuZChDR1NpemVNYWtlKDAsIDApKTsKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgQWR2YW5jZXNBbmRJbml0aWFsUG9zaXRpb24gewor
ICAgIFZlY3RvcjxDR1NpemU+IGFkdmFuY2VzOworICAgIENHUG9pbnQgaW5pdGlhbFBvc2l0aW9u
OworfTsKKworc3RhdGljIEFkdmFuY2VzQW5kSW5pdGlhbFBvc2l0aW9uIGNvbXB1dGVWZXJ0aWNh
bEFkdmFuY2VzRnJvbVBvc2l0aW9ucyhjb25zdCBDR1NpemUgdHJhbnNsYXRpb25zW10sIGNvbnN0
IENHUG9pbnQgcG9zaXRpb25zW10sIHVuc2lnbmVkIGNvdW50LCBmbG9hdCBhc2NlbnREZWx0YSwg
QWZmaW5lVHJhbnNmb3JtIHRleHRNYXRyaXgpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBuZWVk
cyB0byBiZSB0aGUgaW52ZXJzZSBvZiBmaWxsVmVjdG9yV2l0aFZlcnRpY2FsR2x5cGhQb3NpdGlv
bnMoKS4KKworICAgIGlmICghY291bnQpCisgICAgICAgIHJldHVybiB7IHsgfSwgQ0dQb2ludFpl
cm8gfTsKKworICAgIGF1dG8gc3ludGhldGljT2JsaXF1ZUxlc3NUZXh0TWF0cml4ID0gY29tcHV0
ZUJhc2VWZXJ0aWNhbFRleHRNYXRyaXgoY29tcHV0ZUJhc2VPdmVyYWxsVGV4dE1hdHJpeChzdGQ6
Om51bGxvcHQpKTsgLy8gU2VlIGZpbGxWZWN0b3JXaXRoVmVydGljYWxHbHlwaFBvc2l0aW9ucygp
LCB3aGljaCBkZXNjcmliZXMgd2hhdCB0aGlzIGlzLgorCisgICAgYXV0byB0cmFuc2Zvcm1Qb2lu
dCA9IFsmXShjb25zdCBDR1BvaW50JiBwb3NpdGlvbiwgY29uc3QgQ0dTaXplJiB0cmFuc2xhdGlv
bikgLT4gQ0dQb2ludCB7CisgICAgICAgIGF1dG8gcG9zaXRpb25JblVzZXJDb29yZGluYXRlcyA9
IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShwb3NpdGlvbiwgdGV4dE1hdHJpeCk7CisgICAg
ICAgIGF1dG8gdHJhbnNsYXRpb25JblVzZXJDb29yZGluYXRlcyA9IENHU2l6ZUFwcGx5QWZmaW5l
VHJhbnNmb3JtKHRyYW5zbGF0aW9uLCBzeW50aGV0aWNPYmxpcXVlTGVzc1RleHRNYXRyaXgpOwor
ICAgICAgICByZXR1cm4gQ0dQb2ludE1ha2UocG9zaXRpb25JblVzZXJDb29yZGluYXRlcy54IC0g
dHJhbnNsYXRpb25JblVzZXJDb29yZGluYXRlcy53aWR0aCwgcG9zaXRpb25JblVzZXJDb29yZGlu
YXRlcy55IC0gdHJhbnNsYXRpb25JblVzZXJDb29yZGluYXRlcy5oZWlnaHQpOworICAgIH07CisK
KyAgICBBZHZhbmNlc0FuZEluaXRpYWxQb3NpdGlvbiByZXN1bHQ7CisgICAgcmVzdWx0LmFkdmFu
Y2VzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoY291bnQpOworICAgIHJlc3VsdC5pbml0aWFsUG9z
aXRpb24gPSB0cmFuc2Zvcm1Qb2ludChwb3NpdGlvbnNbMF0sIHRyYW5zbGF0aW9uc1swXSk7Cisg
ICAgQ0dQb2ludCBwcmV2aW91c1Bvc2l0aW9uID0gcmVzdWx0LmluaXRpYWxQb3NpdGlvbjsKKyAg
ICByZXN1bHQuaW5pdGlhbFBvc2l0aW9uLnkgLT0gYXNjZW50RGVsdGE7CisKKyAgICBmb3IgKHNp
emVfdCBpID0gMTsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgYXV0byBuZXh0UG9zaXRpb24g
PSB0cmFuc2Zvcm1Qb2ludChwb3NpdGlvbnNbaV0sIHRyYW5zbGF0aW9uc1tpXSk7CisgICAgICAg
IHJlc3VsdC5hZHZhbmNlcy51bmNoZWNrZWRDb25zdHJ1Y3RBbmRBcHBlbmQoQ0dTaXplTWFrZShu
ZXh0UG9zaXRpb24ueCAtIHByZXZpb3VzUG9zaXRpb24ueCwgbmV4dFBvc2l0aW9uLnkgLSBwcmV2
aW91c1Bvc2l0aW9uLnkpKTsKKyAgICAgICAgcHJldmlvdXNQb3NpdGlvbiA9IG5leHRQb3NpdGlv
bjsKICAgICB9Ci0gICAgcmVzdWx0LmNvbnN0cnVjdEFuZEFwcGVuZChDR1NpemVNYWtlKDAsIDAp
KTsKKyAgICByZXN1bHQuYWR2YW5jZXMudW5jaGVja2VkQXBwZW5kKENHU2l6ZVplcm8pOwogICAg
IHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI3NiwyMSArMzE0LDIyIEBAIHZvaWQgRHJhd0dseXBo
c1JlY29yZGVyOjpyZWNvcmREcmF3R2x5cGhzKENHUmVuZGVyaW5nU3RhdGVSZWYsIENHR1N0YXRl
UmVmIGdzdGF0CiAgICAgLy8gYEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhzYCB3ZSBuZWVkIHRvIHJl
Y2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBhZHZhbmNlcyBmcm9tIHRoZSByZXN1bHRpbmcKICAgICAv
LyBwb3NpdGlvbnMgYnkgaW52ZXJ0aW5nIHRoZSBvcGVyYXRpb25zIGFwcGxpZWQgdG8gdGhlIG9y
aWdpbmFsIGFkdmFuY2VzLgogICAgIGF1dG8gdGV4dE1hdHJpeCA9IG1fb3JpZ2luYWxUZXh0TWF0
cml4OwotICAgIGF1dG8gaW5pdGlhbFBlblBvc2l0aW9uID0gdGV4dE1hdHJpeC5tYXBQb2ludChw
b3NpdGlvbnNbMF0pOworICAgIEZsb2F0UG9pbnQgaW5pdGlhbFBlblBvc2l0aW9uOwogCisgICAg
VmVjdG9yPENHU2l6ZT4gYWR2YW5jZXM7CiAgICAgaWYgKGZvbnQtPnBsYXRmb3JtRGF0YSgpLm9y
aWVudGF0aW9uKCkgPT0gRm9udE9yaWVudGF0aW9uOjpWZXJ0aWNhbCkgewotICAgICAgICAvLyBL
ZWVwIHRoaXMgaW4gc3luYyBhcyB0aGUgaW52ZXJzZSBvZiBgZmlsbFZlY3RvcldpdGhWZXJ0aWNh
bEdseXBoUG9zaXRpb25zYC4KLSAgICAgICAgLy8gRklYTUU6IFVzZSByb3RhdGVMZWZ0VHJhbnNm
b3JtKCksIGFzIGZpbGxWZWN0b3JXaXRoVmVydGljYWxHbHlwaFBvc2l0aW9ucygpIGRvZXMsIGlu
c3RlYWQgb2YgdXNpbmcgdHJhbnNwb3NlZFNpemUoKS4KLSAgICAgICAgQ0dTaXplIHRyYW5zbGF0
aW9uOwotICAgICAgICBDVEZvbnRHZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhmb250
LT5wbGF0Zm9ybURhdGEoKS5jdEZvbnQoKSwgZ2x5cGhzLCAmdHJhbnNsYXRpb24sIDEpOwotCi0g
ICAgICAgIGluaXRpYWxQZW5Qb3NpdGlvbiArPSBGbG9hdFNpemUodHJhbnNsYXRpb24pLnRyYW5z
cG9zZWRTaXplKCk7Ci0KKyAgICAgICAgVmVjdG9yPENHU2l6ZSwgMjU2PiB0cmFuc2xhdGlvbnMo
Y291bnQpOworICAgICAgICBDVEZvbnRHZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhm
b250LT5wbGF0Zm9ybURhdGEoKS5jdEZvbnQoKSwgZ2x5cGhzLCB0cmFuc2xhdGlvbnMuZGF0YSgp
LCBjb3VudCk7CiAgICAgICAgIGF1dG8gYXNjZW50RGVsdGEgPSBmb250LT5mb250TWV0cmljcygp
LmZsb2F0QXNjZW50KElkZW9ncmFwaGljQmFzZWxpbmUpIC0gZm9udC0+Zm9udE1ldHJpY3MoKS5m
bG9hdEFzY2VudCgpOwotICAgICAgICBpbml0aWFsUGVuUG9zaXRpb24ubW92ZSgwLCAtYXNjZW50
RGVsdGEpOworICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbXB1dGVWZXJ0aWNhbEFkdmFuY2VzRnJv
bVBvc2l0aW9ucyh0cmFuc2xhdGlvbnMuZGF0YSgpLCBwb3NpdGlvbnMsIGNvdW50LCBhc2NlbnRE
ZWx0YSwgdGV4dE1hdHJpeCk7CisgICAgICAgIGFkdmFuY2VzID0gV1RGTW92ZShyZXN1bHQuYWR2
YW5jZXMpOworICAgICAgICBpbml0aWFsUGVuUG9zaXRpb24gPSByZXN1bHQuaW5pdGlhbFBvc2l0
aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGFkdmFuY2VzID0gY29tcHV0ZUhvcml6b250YWxB
ZHZhbmNlc0Zyb21Qb3NpdGlvbnMocG9zaXRpb25zLCBjb3VudCwgdGV4dE1hdHJpeCk7CisgICAg
ICAgIGluaXRpYWxQZW5Qb3NpdGlvbiA9IHRleHRNYXRyaXgubWFwUG9pbnQocG9zaXRpb25zWzBd
KTsKICAgICB9CiAKLSAgICBtX293bmVyLmRyYXdHbHlwaHNBbmRDYWNoZUZvbnQoZm9udCwgZ2x5
cGhzLCBjb21wdXRlQWR2YW5jZXNGcm9tUG9zaXRpb25zKHBvc2l0aW9ucywgY291bnQsIHRleHRN
YXRyaXgpLmRhdGEoKSwgY291bnQsIGluaXRpYWxQZW5Qb3NpdGlvbiwgbV9zbW9vdGhpbmdNb2Rl
KTsKKyAgICBtX293bmVyLmRyYXdHbHlwaHNBbmRDYWNoZUZvbnQoZm9udCwgZ2x5cGhzLCBhZHZh
bmNlcy5kYXRhKCksIGNvdW50LCBpbml0aWFsUGVuUG9zaXRpb24sIG1fc21vb3RoaW5nTW9kZSk7
CiAKICAgICBtX293bmVyLmNvbmNhdENUTShpbnZlcnNlQ1RNRml4dXApOwogfQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY29yZXRleHQvRm9udENhc2NhZGVD
b3JlVGV4dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9G
b250Q2FzY2FkZUNvcmVUZXh0LmNwcAppbmRleCAwMTc1ZWI3MWFhNTcyYWE5NWI5YmVkNDgxNDM1
N2VhMzRiN2EzOGFlLi5lZWMwYzQyYzUzNzY1NDJmMzBlNjkyNGJjMDc4YjU0NmVlMDMxOWM2IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb3JldGV4dC9Gb250
Q2FzY2FkZUNvcmVUZXh0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jb3JldGV4dC9Gb250Q2FzY2FkZUNvcmVUZXh0LmNwcApAQCAtMjI2LDcgKzIyNiw3IEBAIHN0
YXRpYyB2b2lkIGZpbGxWZWN0b3JXaXRoVmVydGljYWxHbHlwaFBvc2l0aW9ucyhWZWN0b3I8Q0dQ
b2ludCwgMjU2PiYgcG9zaXRpb25zCiAgICAgLy8gMy4gUmVjb3JkIGEgbmV3IHBvc2l0aW9uIGFz
IHRoZSBsb2NhbCBvcmlnaW4gb2YgdGhlIG5leHQgZ2x5cGgKICAgICAvLyA0LiBHbyB0byAyCiAg
ICAgLy8gSG93ZXZlciwgZm9yIHZlcnRpY2FsIHRleHQsIHdlIGNhbid0IGdldCBhd2F5IHdpdGgg
dGhpcyBiZWNhdXNlIHRoZSBnbHlwaCBvcmlnaW5zIGFyZSBub3Qgb24gdGhlIGJhc2VsaW5lLgot
ICAgIC8vIFRoaXMgaXMgd2hhdCB0aGUgInZlcnRpY2FsIHRyYW5zbGF0aW9uIGZvciBhIGdseXBo
IiBpcy4gSXQgY29udGFpbnMgdGhpcyB2ZWN0b3I6CisgICAgLy8gVGhpcyBpcyB3aGF0IHRoZSAi
dmVydGljYWwgdHJhbnNsYXRpb24gZm9yIGEgZ2x5cGgiIGlzIGZvci4gSXQgY29udGFpbnMgdGhp
cyB2ZWN0b3I6CiAgICAgLy8gKy0tLUEtLS0tLS0tLUItLS0tLS0tLS0tLS0tKwogICAgIC8vIHwg
ICAgICAgICAgIC8gICAgICAgICAgICAgIHwKICAgICAvLyB8ICAgICAgICAgIC8gICAgICAgICAg
ICAgICB8CkBAIC0yNjMsMTUgKzI2MywxNyBAQCBzdGF0aWMgdm9pZCBmaWxsVmVjdG9yV2l0aFZl
cnRpY2FsR2x5cGhQb3NpdGlvbnMoVmVjdG9yPENHUG9pbnQsIDI1Nj4mIHBvc2l0aW9ucwogICAg
IC8vIGlzIGF0IHRoZSBwb2ludCBsYWJlbGVkIEIgaW4gdGhlIGFib3ZlIGRpYWdyYW0sIGluIHVz
ZXIgY29vcmRpbmF0ZXMuCiAgICAgYXV0byBwb3NpdGlvbiA9IENHUG9pbnRNYWtlKHBvaW50Lngo
KSwgcG9pbnQueSgpICsgYXNjZW50RGVsdGEpOwogCisgICAgYXV0byBzeW50aGV0aWNPYmxpcXVl
TGVzc1RleHRNYXRyaXggPSBjb21wdXRlQmFzZVZlcnRpY2FsVGV4dE1hdHJpeChjb21wdXRlQmFz
ZU92ZXJhbGxUZXh0TWF0cml4KHN0ZDo6bnVsbG9wdCkpOworCiAgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGNvdW50OyArK2kpIHsKICAgICAgICAgLy8gVGhlICJ0cmFuc2xhdGlvbnMiIHBh
cmFtZXRlciBpcyBpbiB0aGUgInN5bnRoZXRpYy1vYmxpcXVlLWxlc3MgdGV4dCBjb29yZGluYXRl
IHN5c3RlbSIgYW5kIHdlIHdhbnQgdG8gYWRkIGl0IHRvIHRoZSBwb3NpdGlvbiBpbiB0aGUgdXNl
cgogICAgICAgICAvLyBjb29yZGluYXRlIHN5c3RlbS4gTHVja2lseSwgdGhlIHRleHQgbWF0cml4
IChvciwgYXQgbGVhc3QgdGhlIHZlcnNpb24gb2YgdGhlIHRleHQgbWF0cml4IHRoYXQgZG9lc24n
dCBpbmNsdWRlIHN5bnRoZXRpYyBvYmxpcXVlKSBkb2VzIGV4YWN0bHkKICAgICAgICAgLy8gdGhp
cy4gU28sIHdlIGp1c3QgY3JlYXRlIHRoZSBzeW50aGV0aWMtb2JsaXF1ZS1sZXNzIHRleHQgbWF0
cml4LCBhbmQgcnVuIHRoZSB0cmFuc2xhdGlvbiB0aHJvdWdoIGl0LiBUaGlzIGdpdmVzIHVzIHRo
ZSB0cmFuc2xhdGlvbiBpbiB1c2VyCiAgICAgICAgIC8vIGNvb3JkaW5hdGVzLgotICAgICAgICBh
dXRvIHRyYW5zbGF0aW9uID0gQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0odHJhbnNsYXRpb25z
W2ldLCBjb21wdXRlQmFzZVZlcnRpY2FsVGV4dE1hdHJpeChjb21wdXRlQmFzZU92ZXJhbGxUZXh0
TWF0cml4KHN0ZDo6bnVsbG9wdCkpKTsKKyAgICAgICAgYXV0byB0cmFuc2xhdGlvbkluVXNlckNv
b3JkaW5hdGVzID0gQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0odHJhbnNsYXRpb25zW2ldLCBz
eW50aGV0aWNPYmxpcXVlTGVzc1RleHRNYXRyaXgpOwogCiAgICAgICAgIC8vIE5vdyB3ZSBjYW4g
YWRkIHRoZSBwb3NpdGlvbiBpbiB1c2VyIGNvb3JkaW5hdGVzIHdpdGggdGhlIHRyYW5zbGF0aW9u
IGluIHVzZXIgY29vcmRpbmF0ZXMuCi0gICAgICAgIGF1dG8gcG9zaXRpb25JblVzZXJDb29yZGlu
YXRlcyA9IENHUG9pbnRNYWtlKHBvc2l0aW9uLnggKyB0cmFuc2xhdGlvbi53aWR0aCwgcG9zaXRp
b24ueSArIHRyYW5zbGF0aW9uLmhlaWdodCk7CisgICAgICAgIGF1dG8gcG9zaXRpb25JblVzZXJD
b29yZGluYXRlcyA9IENHUG9pbnRNYWtlKHBvc2l0aW9uLnggKyB0cmFuc2xhdGlvbkluVXNlckNv
b3JkaW5hdGVzLndpZHRoLCBwb3NpdGlvbi55ICsgdHJhbnNsYXRpb25JblVzZXJDb29yZGluYXRl
cy5oZWlnaHQpOwogCiAgICAgICAgIC8vIEFuZCB0aGVuIHB1dCBpdCBiYWNrIGluIGZvbnQgY29v
cmRpbmF0ZXMgZm9yIHN1Ym1pc3Npb24gdG8gQ29yZSBUZXh0LiBZYXkhCiAgICAgICAgIHBvc2l0
aW9uc1tpXSA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybShwb3NpdGlvbkluVXNlckNvb3Jk
aW5hdGVzLCB0cmFuc2Zvcm0pOwo=
</data>
<flag name="review"
          id="486795"
          type_id="1"
          status="+"
          setter="sabouhallawa"
    />
    <flag name="commit-queue"
          id="486877"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
      

    </bug>

</bugzilla>