<?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>145539</bug_id>
          
          <creation_ts>2015-06-01 17:57:06 -0700</creation_ts>
          <short_desc>[iOS] Uploading an animated GIF from the photo library uploads a JPEG</short_desc>
          <delta_ts>2017-07-21 13:59:00 -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>Forms</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>iOS 8.0</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=174723</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="Jon Honeycutt">jhoneycutt</reporter>
          <assigned_to name="Jon Honeycutt">jhoneycutt</assigned_to>
          <cc>aestes</cc>
    
    <cc>commit-queue</cc>
    
    <cc>enrica</cc>
    
    <cc>joepeck</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1098670</commentid>
    <comment_count>0</comment_count>
    <who name="Jon Honeycutt">jhoneycutt</who>
    <bug_when>2015-06-01 17:57:06 -0700</bug_when>
    <thetext>Uploading an animated GIF from the photo library uploads a JPEG version of the image.

To reproduce:

1. Go to &lt;http://i.imgur.com/I8HyAQD.gif&gt;
2. Long-press on the image, and select “Save Image”
3. Go to &lt;http://imgur.com&gt; and tap “upload” then “device”
4. Select the animated GIF from step 1, and select “start upload”

Image uploaded is a single frame JPEG.

&lt;rdar://problem/19760877&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1098891</commentid>
    <comment_count>1</comment_count>
      <attachid>254100</attachid>
    <who name="Jon Honeycutt">jhoneycutt</who>
    <bug_when>2015-06-02 14:12:13 -0700</bug_when>
    <thetext>Created attachment 254100
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1098894</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-06-02 14:14:45 -0700</bug_when>
    <thetext>Attachment 254100 did not pass style-queue:


ERROR: Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:838:  Place brace on its own line for function definitions.  [whitespace/braces] [4]
Total errors found: 1 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1098907</commentid>
    <comment_count>3</comment_count>
      <attachid>254100</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2015-06-02 14:46:06 -0700</bug_when>
    <thetext>Comment on attachment 254100
Patch

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

Overall looks good to me. I had some small comments / questions. Ultimately needs a WK2 owner.

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:786
&gt; +        // FIXME: Should we get the photo asset and get the actual filename for the photo instead of
&gt; +        // naming each of the individual uploads image.jpg? This won&apos;t work for photos taken with
&gt; +        // the camera, but would work for photos picked from the library.

See &lt;rdar://problem/12353008&gt;. Can we do this now in the asset URL path?

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:792
&gt; +static NSString *uploadImageNameFromUTI(NSString *uti)

This seems easy to trip up, if there is any UTI photo library supports that we don&apos;t support. We should be able to go from a UTI directly to a file extension with UTTypeCopyPreferredTagWithClass:
https://developer.apple.com/library/ios/documentation/MobileCoreServices/Reference/UTTypeRef/#//apple_ref/c/func/UTTypeCopyPreferredTagWithClass

Something like:

    CFStringRef extension = UTTypeCopyPreferredTagWithClass((CFStringRef)uti, kUTTagClassFilenameExtension);

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:829
&gt; +    PHFetchResult *result = [getPHAssetClass() fetchAssetsWithALAssetURLs:@[assetURL] options:nil];
&gt; +    if (!result.count) {
&gt; +        LOG_ERROR(&quot;WKFileUploadPanel: Failed to fetch asset with URL %@&quot;, assetURL);
&gt; +        [self _uploadItemForJPEGRepresentationOfImage:image successBlock:successBlock failureBlock:failureBlock];
&gt; +        return;
&gt; +    }

Should this fetch be done on the background queue as well, could it take a while?

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:846
&gt; +        PHImageManager *manager = (PHImageManager *)[getPHImageManagerClass() defaultManager];
&gt; +        [manager requestImageDataForAsset:result[0] options:options.get() resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation, NSDictionary *) {
&gt; +            if (!imageData) {
&gt; +                LOG_ERROR(&quot;WKFileUploadPanel: Failed to request image data for asset with URL %@&quot;, assetURL);
&gt; +                [self _uploadItemForJPEGRepresentationOfImage:image successBlock:successBlock failureBlock:failureBlock];
&gt; +                return;
&gt; +            }
&gt; +            NSString *imageName = uploadImageNameFromUTI(dataUTI);
&gt; +            [self _uploadItemForImageData:imageData originalImage:image imageName:imageName successBlock:successBlock failureBlock:failureBlock];
&gt; +        }];

In this case we don&apos;t do compressions (probably necessary). Do images of these types retain geolocation metadata? The JPEG case ends up not including the metadata.

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:888
&gt; +    // If we have an asset URL, try to upload the native image.
&gt; +    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
&gt; +    if (referenceURL) {
&gt; +        [self _uploadItemForImage:originalImage withAssetURL:referenceURL successBlock:successBlock failureBlock:failureBlock];
&gt;          return;
&gt;      }

As from the previous comment. Does this referenceURL contain a better name that we can use instead of &quot;image.ext&quot;? For instance, maybe we can get the actual name &quot;IMG_3373.PNG&quot;?

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:891
&gt; +    // Photos taken with the camera will not have an asset URL. Fall back to a JPEG representation.
&gt; +    [self _uploadItemForJPEGRepresentationOfImage:originalImage successBlock:successBlock failureBlock:failureBlock];

Ultimately it sounds like we will still need a generic name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1098979</commentid>
    <comment_count>4</comment_count>
    <who name="Jon Honeycutt">jhoneycutt</who>
    <bug_when>2015-06-02 17:13:55 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Comment on attachment 254100 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=254100&amp;action=review
&gt; 
&gt; Overall looks good to me. I had some small comments / questions. Ultimately
&gt; needs a WK2 owner.
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:786
&gt; &gt; +        // FIXME: Should we get the photo asset and get the actual filename for the photo instead of
&gt; &gt; +        // naming each of the individual uploads image.jpg? This won&apos;t work for photos taken with
&gt; &gt; +        // the camera, but would work for photos picked from the library.
&gt; 
&gt; See &lt;rdar://problem/12353008&gt;. Can we do this now in the asset URL path?

There’s SPI for this, but no API. I’ll look into this.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:792
&gt; &gt; +static NSString *uploadImageNameFromUTI(NSString *uti)
&gt; 
&gt; This seems easy to trip up, if there is any UTI photo library supports that
&gt; we don&apos;t support. We should be able to go from a UTI directly to a file
&gt; extension with UTTypeCopyPreferredTagWithClass:
&gt; https://developer.apple.com/library/ios/documentation/MobileCoreServices/
&gt; Reference/UTTypeRef/#//apple_ref/c/func/UTTypeCopyPreferredTagWithClass
&gt; 
&gt; Something like:
&gt; 
&gt;     CFStringRef extension =
&gt; UTTypeCopyPreferredTagWithClass((CFStringRef)uti,
&gt; kUTTagClassFilenameExtension);

Fixed.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:829
&gt; &gt; +    PHFetchResult *result = [getPHAssetClass() fetchAssetsWithALAssetURLs:@[assetURL] options:nil];
&gt; &gt; +    if (!result.count) {
&gt; &gt; +        LOG_ERROR(&quot;WKFileUploadPanel: Failed to fetch asset with URL %@&quot;, assetURL);
&gt; &gt; +        [self _uploadItemForJPEGRepresentationOfImage:image successBlock:successBlock failureBlock:failureBlock];
&gt; &gt; +        return;
&gt; &gt; +    }
&gt; 
&gt; Should this fetch be done on the background queue as well, could it take a
&gt; while?

I don’t think so, but there’s no particular reason not to move it into the block as well. Moved.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:846
&gt; &gt; +        PHImageManager *manager = (PHImageManager *)[getPHImageManagerClass() defaultManager];
&gt; &gt; +        [manager requestImageDataForAsset:result[0] options:options.get() resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation, NSDictionary *) {
&gt; &gt; +            if (!imageData) {
&gt; &gt; +                LOG_ERROR(&quot;WKFileUploadPanel: Failed to request image data for asset with URL %@&quot;, assetURL);
&gt; &gt; +                [self _uploadItemForJPEGRepresentationOfImage:image successBlock:successBlock failureBlock:failureBlock];
&gt; &gt; +                return;
&gt; &gt; +            }
&gt; &gt; +            NSString *imageName = uploadImageNameFromUTI(dataUTI);
&gt; &gt; +            [self _uploadItemForImageData:imageData originalImage:image imageName:imageName successBlock:successBlock failureBlock:failureBlock];
&gt; &gt; +        }];
&gt; 
&gt; In this case we don&apos;t do compressions (probably necessary). Do images of
&gt; these types retain geolocation metadata? The JPEG case ends up not including
&gt; the metadata.

Yes, all Exif data for the image is retained including GPS data.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:888
&gt; &gt; +    // If we have an asset URL, try to upload the native image.
&gt; &gt; +    NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL];
&gt; &gt; +    if (referenceURL) {
&gt; &gt; +        [self _uploadItemForImage:originalImage withAssetURL:referenceURL successBlock:successBlock failureBlock:failureBlock];
&gt; &gt;          return;
&gt; &gt;      }
&gt; 
&gt; As from the previous comment. Does this referenceURL contain a better name
&gt; that we can use instead of &quot;image.ext&quot;? For instance, maybe we can get the
&gt; actual name &quot;IMG_3373.PNG”?

No, it contains only the file extension and a UUID.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:891
&gt; &gt; +    // Photos taken with the camera will not have an asset URL. Fall back to a JPEG representation.
&gt; &gt; +    [self _uploadItemForJPEGRepresentationOfImage:originalImage successBlock:successBlock failureBlock:failureBlock];
&gt; 
&gt; Ultimately it sounds like we will still need a generic name.

Yeah. I’m not sure that IMG_0011 is any less generic than “image” though.

Thanks for looking at this!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1099334</commentid>
    <comment_count>5</comment_count>
      <attachid>254100</attachid>
    <who name="Andy Estes">aestes</who>
    <bug_when>2015-06-03 17:39:50 -0700</bug_when>
    <thetext>Comment on attachment 254100
Patch

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

r=me given that Joe has also looked at it.

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:65
&gt; +SOFT_LINK_CONSTANT(Photos, PHImageRequestOptionsVersionCurrent, NSString *);
&gt; +SOFT_LINK_CONSTANT(Photos, PHImageRequestOptionsResizeModeNone, NSString *);

V comes after R.

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:789
&gt; +    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&gt; +        // FIXME: Different compression for different devices?
&gt; +        // FIXME: Different compression for different UIImage sizes?
&gt; +        // FIXME: Should EXIF data be maintained?
&gt; +        const CGFloat compression = 0.8;
&gt; +        NSData *jpeg = UIImageJPEGRepresentation(image, compression);
&gt; +        if (!jpeg) {
&gt; +            LOG_ERROR(&quot;WKFileUploadPanel: Failed to create JPEG representation for image&quot;);
&gt; +            failureBlock();
&gt; +            return;
&gt; +        }
&gt; +
&gt; +        // FIXME: Should we get the photo asset and get the actual filename for the photo instead of
&gt; +        // naming each of the individual uploads image.jpg? This won&apos;t work for photos taken with
&gt; +        // the camera, but would work for photos picked from the library.
&gt; +        NSString * const kUploadImageName = @&quot;image.jpg&quot;;
&gt; +        [self _uploadItemForImageData:jpeg originalImage:image imageName:kUploadImageName successBlock:successBlock failureBlock:failureBlock];
&gt; +    });

You should use a C++ lambda instead of a block, since the lambda requires you to list the variables you capture.

Not at all new to this code, and I&apos;m not asking you to fix this right now, but I don&apos;t like that it&apos;s the responsibility of the caller of -_processMediaInfoDictionaries:successBlock:failureBlock: to dispatch back to the main thread in their success/failure blocks. I think the fact that we dispatch to a global concurrent queue should be kept an implementation detail, and the API should make the guarantee that blocks are called on the main thread.

&gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:847
&gt; +    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&gt; +        RetainPtr&lt;PHImageRequestOptions&gt; options = adoptNS([allocPHImageRequestOptionsInstance() init]);
&gt; +        [options setVersion:PHImageRequestOptionsVersionCurrent];
&gt; +        [options setSynchronous:YES];
&gt; +        [options setResizeMode:PHImageRequestOptionsResizeModeNone];
&gt; +
&gt; +        PHImageManager *manager = (PHImageManager *)[getPHImageManagerClass() defaultManager];
&gt; +        [manager requestImageDataForAsset:result[0] options:options.get() resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation, NSDictionary *) {
&gt; +            if (!imageData) {
&gt; +                LOG_ERROR(&quot;WKFileUploadPanel: Failed to request image data for asset with URL %@&quot;, assetURL);
&gt; +                [self _uploadItemForJPEGRepresentationOfImage:image successBlock:successBlock failureBlock:failureBlock];
&gt; +                return;
&gt; +            }
&gt; +            NSString *imageName = uploadImageNameFromUTI(dataUTI);
&gt; +            [self _uploadItemForImageData:imageData originalImage:image imageName:imageName successBlock:successBlock failureBlock:failureBlock];
&gt; +        }];
&gt; +    });

Same comment about C++ lambdas instead of blocks, both for the block passed to dispatch_async() and the one passed to -requestImageDataForAsset:options:resultHandler:.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1099773</commentid>
    <comment_count>6</comment_count>
    <who name="Jon Honeycutt">jhoneycutt</who>
    <bug_when>2015-06-04 23:46:03 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 254100 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=254100&amp;action=review
&gt; 
&gt; r=me given that Joe has also looked at it.
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:65
&gt; &gt; +SOFT_LINK_CONSTANT(Photos, PHImageRequestOptionsVersionCurrent, NSString *);
&gt; &gt; +SOFT_LINK_CONSTANT(Photos, PHImageRequestOptionsResizeModeNone, NSString *);
&gt; 
&gt; V comes after R.

Fixed.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:789
&gt; &gt; +    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&gt; &gt; +        // FIXME: Different compression for different devices?
&gt; &gt; +        // FIXME: Different compression for different UIImage sizes?
&gt; &gt; +        // FIXME: Should EXIF data be maintained?
&gt; &gt; +        const CGFloat compression = 0.8;
&gt; &gt; +        NSData *jpeg = UIImageJPEGRepresentation(image, compression);
&gt; &gt; +        if (!jpeg) {
&gt; &gt; +            LOG_ERROR(&quot;WKFileUploadPanel: Failed to create JPEG representation for image&quot;);
&gt; &gt; +            failureBlock();
&gt; &gt; +            return;
&gt; &gt; +        }
&gt; &gt; +
&gt; &gt; +        // FIXME: Should we get the photo asset and get the actual filename for the photo instead of
&gt; &gt; +        // naming each of the individual uploads image.jpg? This won&apos;t work for photos taken with
&gt; &gt; +        // the camera, but would work for photos picked from the library.
&gt; &gt; +        NSString * const kUploadImageName = @&quot;image.jpg&quot;;
&gt; &gt; +        [self _uploadItemForImageData:jpeg originalImage:image imageName:kUploadImageName successBlock:successBlock failureBlock:failureBlock];
&gt; &gt; +    });
&gt; 
&gt; You should use a C++ lambda instead of a block, since the lambda requires
&gt; you to list the variables you capture.

Any and I discussed this in person. I’m going to use blocks here, because the implicit behavior of having Obj-C types retained when captured is useful and makes the code more readable.

&gt; 
&gt; Not at all new to this code, and I&apos;m not asking you to fix this right now,
&gt; but I don&apos;t like that it&apos;s the responsibility of the caller of
&gt; -_processMediaInfoDictionaries:successBlock:failureBlock: to dispatch back
&gt; to the main thread in their success/failure blocks. I think the fact that we
&gt; dispatch to a global concurrent queue should be kept an implementation
&gt; detail, and the API should make the guarantee that blocks are called on the
&gt; main thread.

I agree. I’ll file a bug.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/ios/forms/WKFileUploadPanel.mm:847
&gt; &gt; +    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&gt; &gt; +        RetainPtr&lt;PHImageRequestOptions&gt; options = adoptNS([allocPHImageRequestOptionsInstance() init]);
&gt; &gt; +        [options setVersion:PHImageRequestOptionsVersionCurrent];
&gt; &gt; +        [options setSynchronous:YES];
&gt; &gt; +        [options setResizeMode:PHImageRequestOptionsResizeModeNone];
&gt; &gt; +
&gt; &gt; +        PHImageManager *manager = (PHImageManager *)[getPHImageManagerClass() defaultManager];
&gt; &gt; +        [manager requestImageDataForAsset:result[0] options:options.get() resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation, NSDictionary *) {
&gt; &gt; +            if (!imageData) {
&gt; &gt; +                LOG_ERROR(&quot;WKFileUploadPanel: Failed to request image data for asset with URL %@&quot;, assetURL);
&gt; &gt; +                [self _uploadItemForJPEGRepresentationOfImage:image successBlock:successBlock failureBlock:failureBlock];
&gt; &gt; +                return;
&gt; &gt; +            }
&gt; &gt; +            NSString *imageName = uploadImageNameFromUTI(dataUTI);
&gt; &gt; +            [self _uploadItemForImageData:imageData originalImage:image imageName:imageName successBlock:successBlock failureBlock:failureBlock];
&gt; &gt; +        }];
&gt; &gt; +    });
&gt; 
&gt; Same comment about C++ lambdas instead of blocks, both for the block passed
&gt; to dispatch_async() and the one passed to
&gt; -requestImageDataForAsset:options:resultHandler:.

Same comment. Thanks for the review!

Landed in &lt;http://trac.webkit.org/changeset/185241&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>254100</attachid>
            <date>2015-06-02 14:12:13 -0700</date>
            <delta_ts>2015-06-03 17:39:50 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>0001-iOS-Uploading-an-animated-GIF-from-the-photo-library.patch</filename>
            <type>text/plain</type>
            <size>15937</size>
            <attacher name="Jon Honeycutt">jhoneycutt</attacher>
            
              <data encoding="base64">RnJvbSBkNGUxNjM4MTAxNmM0ZTlmYWMzNTA4NDRkNDk5ODQwNWQwNGVlODU1IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKb24gSG9uZXljdXR0IDxqaG9uZXljdXR0QGFwcGxlLmNvbT4K
RGF0ZTogTW9uLCAxIEp1biAyMDE1IDE4OjI0OjU2IC0wNzAwClN1YmplY3Q6IFtQQVRDSF0gW2lP
U10gVXBsb2FkaW5nIGFuIGFuaW1hdGVkIEdJRiBmcm9tIHRoZSBwaG90byBsaWJyYXJ5CiB1cGxv
YWRzIGEgSlBFRwoKPGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDU1
Mzk+CjxyZGFyOi8vcHJvYmxlbS8xOTc2MDg3NwoKU2VsZWN0aW5nIGEgcGhvdG8gZnJvbSB0aGUg
cGhvdG8gbGlicmFyeSB1c2luZyBVSUltYWdlUGlja2VyQ29udHJvbGxlcgpyZXN1bHRzIGluIGFu
IE5TRGljdGlvbmFyeSB3aXRoIGltYWdlIGluZm8gYW5kIGEgVUlJbWFnZSB3aXRoIHRoZQppbWFn
ZS4gSXQncyBub3QgcG9zc2libGUgdG8gZ2V0IHRoZSBvcmlnaW5hbCBpbWFnZSBkYXRhIGZyb20g
dGhlClVJSW1hZ2UsIG9ubHkgYSBQTkcgb3IgSlBFRyByZXByZXNlbnRhdGlvbiwgc28gd2Ugd2Vy
ZSBnZXR0aW5nIGEgSlBFRwpyZXByZXNlbnRhdGlvbiBhbmQgdXBsb2FkaW5nIHRoYXQgdG8gdGhl
IHNlcnZlci4gRm9yIGFuaW1hdGVkIEdJRnMsCnRoaXMgbWVhbnQgYSBKUEVHIHJlcHJlc2VudGF0
aW9uIG9mIHRoZSBmaXJzdCBmcmFtZS4KClRvIGZpeCB0aGlzLCB3ZSdsbCBnZXQgdGhlIGFzc2V0
IFVSTCwgaWYgYXZhaWxhYmxlLCBhbmQgdXNlIHRoZSBQaG90b3MKQVBJIHRvIHF1ZXJ5IGZvciB0
aGUgb3JpZ2luYWwgaW1hZ2UgZGF0YS4KClJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgoKKiBV
SVByb2Nlc3MvaW9zL2Zvcm1zL1dLRmlsZVVwbG9hZFBhbmVsLm1tOgpTb2Z0IGxpbmsgdGhlIFBo
b3RvcyBmcmFtZXdvcmsuCgooLVtXS0ZpbGVVcGxvYWRQYW5lbCBfdXBsb2FkSXRlbUZvckltYWdl
RGF0YTpvcmlnaW5hbEltYWdlOmltYWdlTmFtZTpzdWNjZXNzQmxvY2s6ZmFpbHVyZUJsb2NrOl0p
OgpTYXZlIHRoZSBpbWFnZSdzIGRhdGEgdG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24sIGFuZCBjcmVh
dGUgYQpfV0tJbWFnZUZpbGVVcGxvYWRJdGVtLiBDb2RlIG1vdmVkIGZyb20KLV91cGxvYWRJdGVt
RnJvbU1lZGlhSW5mbzpzdWNjZXNzQmxvY2s6ZmFpbHVyZUJsb2NrOi4KCigtW1dLRmlsZVVwbG9h
ZFBhbmVsIF91cGxvYWRJdGVtRm9ySlBFR1JlcHJlc2VudGF0aW9uT2ZJbWFnZTpzdWNjZXNzQmxv
Y2s6ZmFpbHVyZUJsb2NrOl0pOgpHZXQgYSBKUEVHIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVSUlt
YWdlLCBhbmQgY3JlYXRlIGFuIHVwbG9hZCBpdGVtCmZyb20gdGhhdCBkYXRhLgoKKHVwbG9hZElt
YWdlTmFtZUZyb21VVEkpOgpSZXR1cm4gYSBmaWxlbmFtZSBmb3IgdGhlIHVwbG9hZGVkIGltYWdl
IGJhc2VkIG9uIHRoZSBVVEkuCgooLVtXS0ZpbGVVcGxvYWRQYW5lbCBfdXBsb2FkSXRlbUZvcklt
YWdlOndpdGhBc3NldFVSTDpzdWNjZXNzQmxvY2s6ZmFpbHVyZUJsb2NrOl0pOgpGZXRjaCB0aGUg
cGhvdG8gYXNzZXQgd2l0aCB0aGUgZ2l2ZW4gYXNzZXQgVVJMLiBDcmVhdGUgYW4gaW1hZ2UgbWFu
YWdlcgpvYmplY3QsIGFuZCByZXF1ZXN0IHRoZSBpbWFnZSBkYXRhIGZvciB0aGUgcGhvdG8gYXNz
ZXQuIENyZWF0ZSBhbgp1cGxvYWQgaXRlbSBmcm9tIHRoYXQgZGF0YS4gSWYgd2UgZmFpbCwgZmFs
bCBiYWNrIHRvIGEgSlBFRwpyZXByZXNlbnRhdGlvbi4KCigtW1dLRmlsZVVwbG9hZFBhbmVsIF91
cGxvYWRJdGVtRnJvbU1lZGlhSW5mbzpzdWNjZXNzQmxvY2s6ZmFpbHVyZUJsb2NrOl0pOgpSZXR1
cm4gZWFybHkgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgbm90IGFuIGltYWdlIHR5cGUuIElmIGl0IGlz
LCBhbmQgd2UKaGF2ZSBhbiBhc3NldCBVUkwsIHRyeSB0byBjcmVhdGUgYW4gdXBsb2FkIGl0ZW0g
Zm9yIHRoZSBuYXRpdmUgaW1hZ2UuCklmIHdlIGRvbid0IGhhdmUgYW4gYXNzZXQgVVJMLCB1c2Ug
YSBKUEVHIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbWFnZS4KLS0tCiBTb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA0NSArKysrKwogLi4uL1VJUHJv
Y2Vzcy9pb3MvZm9ybXMvV0tGaWxlVXBsb2FkUGFuZWwubW0gICAgICAgfCAxOTEgKysrKysrKysr
KysrKysrLS0tLS0tCiAyIGZpbGVzIGNoYW5nZWQsIDE4NSBpbnNlcnRpb25zKCspLCA1MSBkZWxl
dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cgYi9Tb3VyY2Uv
V2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggMjMzZjk3My4uNGZlNWFhNiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAt
MSwzICsxLDQ4IEBACisyMDE1LTA2LTAxICBKb24gSG9uZXljdXR0ICA8amhvbmV5Y3V0dEBhcHBs
ZS5jb20+CisKKyAgICAgICAgW2lPU10gVXBsb2FkaW5nIGFuIGFuaW1hdGVkIEdJRiBmcm9tIHRo
ZSBwaG90byBsaWJyYXJ5IHVwbG9hZHMgYSBKUEVHCisKKyAgICAgICAgPGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDU1Mzk+CisgICAgICAgIDxyZGFyOi8vcHJvYmxl
bS8xOTc2MDg3NworCisgICAgICAgIFNlbGVjdGluZyBhIHBob3RvIGZyb20gdGhlIHBob3RvIGxp
YnJhcnkgdXNpbmcgVUlJbWFnZVBpY2tlckNvbnRyb2xsZXIKKyAgICAgICAgcmVzdWx0cyBpbiBh
biBOU0RpY3Rpb25hcnkgd2l0aCBpbWFnZSBpbmZvIGFuZCBhIFVJSW1hZ2Ugd2l0aCB0aGUKKyAg
ICAgICAgaW1hZ2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGdldCB0aGUgb3JpZ2luYWwgaW1hZ2Ug
ZGF0YSBmcm9tIHRoZQorICAgICAgICBVSUltYWdlLCBvbmx5IGEgUE5HIG9yIEpQRUcgcmVwcmVz
ZW50YXRpb24sIHNvIHdlIHdlcmUgZ2V0dGluZyBhIEpQRUcKKyAgICAgICAgcmVwcmVzZW50YXRp
b24gYW5kIHVwbG9hZGluZyB0aGF0IHRvIHRoZSBzZXJ2ZXIuIEZvciBhbmltYXRlZCBHSUZzLAor
ICAgICAgICB0aGlzIG1lYW50IGEgSlBFRyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmlyc3QgZnJh
bWUuCisKKyAgICAgICAgVG8gZml4IHRoaXMsIHdlJ2xsIGdldCB0aGUgYXNzZXQgVVJMLCBpZiBh
dmFpbGFibGUsIGFuZCB1c2UgdGhlIFBob3RvcworICAgICAgICBBUEkgdG8gcXVlcnkgZm9yIHRo
ZSBvcmlnaW5hbCBpbWFnZSBkYXRhLgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogVUlQcm9jZXNzL2lvcy9mb3Jtcy9XS0ZpbGVVcGxvYWRQYW5lbC5t
bToKKyAgICAgICAgU29mdCBsaW5rIHRoZSBQaG90b3MgZnJhbWV3b3JrLgorCisgICAgICAgICgt
W1dLRmlsZVVwbG9hZFBhbmVsIF91cGxvYWRJdGVtRm9ySW1hZ2VEYXRhOm9yaWdpbmFsSW1hZ2U6
aW1hZ2VOYW1lOnN1Y2Nlc3NCbG9jazpmYWlsdXJlQmxvY2s6XSk6CisgICAgICAgIFNhdmUgdGhl
IGltYWdlJ3MgZGF0YSB0byBhIHRlbXBvcmFyeSBsb2NhdGlvbiwgYW5kIGNyZWF0ZSBhCisgICAg
ICAgIF9XS0ltYWdlRmlsZVVwbG9hZEl0ZW0uIENvZGUgbW92ZWQgZnJvbQorICAgICAgICAtX3Vw
bG9hZEl0ZW1Gcm9tTWVkaWFJbmZvOnN1Y2Nlc3NCbG9jazpmYWlsdXJlQmxvY2s6LgorCisgICAg
ICAgICgtW1dLRmlsZVVwbG9hZFBhbmVsIF91cGxvYWRJdGVtRm9ySlBFR1JlcHJlc2VudGF0aW9u
T2ZJbWFnZTpzdWNjZXNzQmxvY2s6ZmFpbHVyZUJsb2NrOl0pOgorICAgICAgICBHZXQgYSBKUEVH
IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVSUltYWdlLCBhbmQgY3JlYXRlIGFuIHVwbG9hZCBpdGVt
CisgICAgICAgIGZyb20gdGhhdCBkYXRhLgorCisgICAgICAgICh1cGxvYWRJbWFnZU5hbWVGcm9t
VVRJKToKKyAgICAgICAgUmV0dXJuIGEgZmlsZW5hbWUgZm9yIHRoZSB1cGxvYWRlZCBpbWFnZSBi
YXNlZCBvbiB0aGUgVVRJLgorCisgICAgICAgICgtW1dLRmlsZVVwbG9hZFBhbmVsIF91cGxvYWRJ
dGVtRm9ySW1hZ2U6d2l0aEFzc2V0VVJMOnN1Y2Nlc3NCbG9jazpmYWlsdXJlQmxvY2s6XSk6Cisg
ICAgICAgIEZldGNoIHRoZSBwaG90byBhc3NldCB3aXRoIHRoZSBnaXZlbiBhc3NldCBVUkwuIENy
ZWF0ZSBhbiBpbWFnZSBtYW5hZ2VyCisgICAgICAgIG9iamVjdCwgYW5kIHJlcXVlc3QgdGhlIGlt
YWdlIGRhdGEgZm9yIHRoZSBwaG90byBhc3NldC4gQ3JlYXRlIGFuCisgICAgICAgIHVwbG9hZCBp
dGVtIGZyb20gdGhhdCBkYXRhLiBJZiB3ZSBmYWlsLCBmYWxsIGJhY2sgdG8gYSBKUEVHCisgICAg
ICAgIHJlcHJlc2VudGF0aW9uLgorCisgICAgICAgICgtW1dLRmlsZVVwbG9hZFBhbmVsIF91cGxv
YWRJdGVtRnJvbU1lZGlhSW5mbzpzdWNjZXNzQmxvY2s6ZmFpbHVyZUJsb2NrOl0pOgorICAgICAg
ICBSZXR1cm4gZWFybHkgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgbm90IGFuIGltYWdlIHR5cGUuIElm
IGl0IGlzLCBhbmQgd2UKKyAgICAgICAgaGF2ZSBhbiBhc3NldCBVUkwsIHRyeSB0byBjcmVhdGUg
YW4gdXBsb2FkIGl0ZW0gZm9yIHRoZSBuYXRpdmUgaW1hZ2UuCisgICAgICAgIElmIHdlIGRvbid0
IGhhdmUgYW4gYXNzZXQgVVJMLCB1c2UgYSBKUEVHIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbWFn
ZS4KKwogMjAxNS0wNS0xOSAgSm9uIEhvbmV5Y3V0dCAgPGpob25leWN1dHRAYXBwbGUuY29tPgog
CiAgICAgICAgIFtpT1NdIFdoZW4gdmlld2luZyBhbiBNSlBFRyBzdHJlYW0gYXMgdGhlIG1haW4g
cmVzb3VyY2UsIG9ubHkgdGhlIGZpcnN0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvaW9zL2Zvcm1zL1dLRmlsZVVwbG9hZFBhbmVsLm1tIGIvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL2lvcy9mb3Jtcy9XS0ZpbGVVcGxvYWRQYW5lbC5tbQppbmRleCA5NDE5ODQxLi41OTA2
Yzg4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvaW9zL2Zvcm1zL1dLRmls
ZVVwbG9hZFBhbmVsLm1tCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9pb3MvZm9ybXMv
V0tGaWxlVXBsb2FkUGFuZWwubW0KQEAgLTQyLDYgKzQyLDcgQEAKICNpbXBvcnQgPEFWRm91bmRh
dGlvbi9BVkZvdW5kYXRpb24uaD4KICNpbXBvcnQgPENvcmVNZWRpYS9Db3JlTWVkaWEuaD4KICNp
bXBvcnQgPE1vYmlsZUNvcmVTZXJ2aWNlcy9Nb2JpbGVDb3JlU2VydmljZXMuaD4KKyNpbXBvcnQg
PFBob3Rvcy9QaG90b3MuaD4KICNpbXBvcnQgPFdlYkNvcmUvTG9jYWxpemVkU3RyaW5ncy5oPgog
I2ltcG9ydCA8V2ViQ29yZS9Tb2Z0TGlua2luZy5oPgogI2ltcG9ydCA8V2ViS2l0L1dlYk5TRmls
ZU1hbmFnZXJFeHRyYXMuaD4KQEAgLTU1LDYgKzU2LDE0IEBAIFNPRlRfTElOS19DTEFTUyhBVkZv
dW5kYXRpb24sIEFWVVJMQXNzZXQpOwogCiBTT0ZUX0xJTktfRlJBTUVXT1JLKENvcmVNZWRpYSk7
CiBTT0ZUX0xJTktfQ09OU1RBTlQoQ29yZU1lZGlhLCBrQ01UaW1lWmVybywgQ01UaW1lKTsKKwor
U09GVF9MSU5LX0ZSQU1FV09SSyhQaG90b3MpOworU09GVF9MSU5LX0NMQVNTKFBob3RvcywgUEhB
c3NldCk7CitTT0ZUX0xJTktfQ0xBU1MoUGhvdG9zLCBQSEltYWdlTWFuYWdlcik7CitTT0ZUX0xJ
TktfQ0xBU1MoUGhvdG9zLCBQSEltYWdlUmVxdWVzdE9wdGlvbnMpOworU09GVF9MSU5LX0NPTlNU
QU5UKFBob3RvcywgUEhJbWFnZVJlcXVlc3RPcHRpb25zVmVyc2lvbkN1cnJlbnQsIE5TU3RyaW5n
ICopOworU09GVF9MSU5LX0NPTlNUQU5UKFBob3RvcywgUEhJbWFnZVJlcXVlc3RPcHRpb25zUmVz
aXplTW9kZU5vbmUsIE5TU3RyaW5nICopOworCiAjZGVmaW5lIGtDTVRpbWVaZXJvIGdldGtDTVRp
bWVaZXJvKCkKIAogI3ByYWdtYSBtYXJrIC0gRG9jdW1lbnQgcGlja2VyIGljb25zCkBAIC03MjYs
NiArNzM1LDExOCBAQCAtICh2b2lkKV9wcm9jZXNzTWVkaWFJbmZvRGljdGlvbmFyaWVzOihOU0Fy
cmF5ICopaW5mb3MgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleAogICAgIFtzZWxmIF91cGxvYWRJ
dGVtRnJvbU1lZGlhSW5mbzppbmZvIHN1Y2Nlc3NCbG9jazp1cGxvYWRJdGVtU3VjY2Vzc0Jsb2Nr
IGZhaWx1cmVCbG9jazpmYWlsdXJlQmxvY2tdOwogfQogCistICh2b2lkKV91cGxvYWRJdGVtRm9y
SW1hZ2VEYXRhOihOU0RhdGEgKilpbWFnZURhdGEgb3JpZ2luYWxJbWFnZTooVUlJbWFnZSAqKW9y
aWdpbmFsSW1hZ2UgaW1hZ2VOYW1lOihOU1N0cmluZyAqKWltYWdlTmFtZSBzdWNjZXNzQmxvY2s6
KHZvaWQgKF4pKF9XS0ZpbGVVcGxvYWRJdGVtICopKXN1Y2Nlc3NCbG9jayBmYWlsdXJlQmxvY2s6
KHZvaWQgKF4pKHZvaWQpKWZhaWx1cmVCbG9jaworeworICAgIEFTU0VSVF9BUkcoaW1hZ2VEYXRh
LCBpbWFnZURhdGEpOworICAgIEFTU0VSVF9BUkcob3JpZ2luYWxJbWFnZSwgb3JpZ2luYWxJbWFn
ZSk7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBOU1N0cmluZyAqIGNvbnN0
IGtUZW1wb3JhcnlEaXJlY3RvcnlOYW1lID0gQCJXS1dlYkZpbGVVcGxvYWQiOworCisgICAgLy8g
QnVpbGQgdGVtcG9yYXJ5IGZpbGUgcGF0aC4KKyAgICBOU0ZpbGVNYW5hZ2VyICpmaWxlTWFuYWdl
ciA9IFtOU0ZpbGVNYW5hZ2VyIGRlZmF1bHRNYW5hZ2VyXTsKKyAgICBOU1N0cmluZyAqdGVtcG9y
YXJ5RGlyZWN0b3J5ID0gW2ZpbGVNYW5hZ2VyIF93ZWJraXRfY3JlYXRlVGVtcG9yYXJ5RGlyZWN0
b3J5V2l0aFRlbXBsYXRlUHJlZml4OmtUZW1wb3JhcnlEaXJlY3RvcnlOYW1lXTsKKyAgICBOU1N0
cmluZyAqZmlsZVBhdGggPSBbdGVtcG9yYXJ5RGlyZWN0b3J5IHN0cmluZ0J5QXBwZW5kaW5nUGF0
aENvbXBvbmVudDppbWFnZU5hbWVdOworICAgIGlmICghZmlsZVBhdGgpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJXS0ZpbGVVcGxvYWRQYW5lbDogRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZGly
ZWN0b3J5IHRvIHNhdmUgaW1hZ2UiKTsKKyAgICAgICAgZmFpbHVyZUJsb2NrKCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICAvLyBTYXZlIHRoZSBpbWFnZSB0byB0aGUgdGVtcG9yYXJ5
IGZpbGUuCisgICAgTlNFcnJvciAqZXJyb3IgPSBuaWw7CisgICAgW2ltYWdlRGF0YSB3cml0ZVRv
RmlsZTpmaWxlUGF0aCBvcHRpb25zOk5TRGF0YVdyaXRpbmdBdG9taWMgZXJyb3I6JmVycm9yXTsK
KyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJXS0ZpbGVVcGxvYWRQYW5lbDog
RXJyb3Igd3JpdGluZyBpbWFnZSBkYXRhIHRvIHRlbXBvcmFyeSBmaWxlOiAlQCIsIGVycm9yKTsK
KyAgICAgICAgZmFpbHVyZUJsb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBz
dWNjZXNzQmxvY2soYWRvcHROUyhbW19XS0ltYWdlRmlsZVVwbG9hZEl0ZW0gYWxsb2NdIGluaXRX
aXRoRmlsZVVSTDpbTlNVUkwgZmlsZVVSTFdpdGhQYXRoOmZpbGVQYXRoXSBvcmlnaW5hbEltYWdl
Om9yaWdpbmFsSW1hZ2VdKS5nZXQoKSk7Cit9CisKKy0gKHZvaWQpX3VwbG9hZEl0ZW1Gb3JKUEVH
UmVwcmVzZW50YXRpb25PZkltYWdlOihVSUltYWdlICopaW1hZ2Ugc3VjY2Vzc0Jsb2NrOih2b2lk
ICheKShfV0tGaWxlVXBsb2FkSXRlbSAqKSlzdWNjZXNzQmxvY2sgZmFpbHVyZUJsb2NrOih2b2lk
ICheKSh2b2lkKSlmYWlsdXJlQmxvY2sKK3sKKyAgICBBU1NFUlRfQVJHKGltYWdlLCBpbWFnZSk7
CisKKyAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfZ2xvYmFsX3F1ZXVlKERJU1BBVENI
X1FVRVVFX1BSSU9SSVRZX0RFRkFVTFQsIDApLCBeeworICAgICAgICAvLyBGSVhNRTogRGlmZmVy
ZW50IGNvbXByZXNzaW9uIGZvciBkaWZmZXJlbnQgZGV2aWNlcz8KKyAgICAgICAgLy8gRklYTUU6
IERpZmZlcmVudCBjb21wcmVzc2lvbiBmb3IgZGlmZmVyZW50IFVJSW1hZ2Ugc2l6ZXM/CisgICAg
ICAgIC8vIEZJWE1FOiBTaG91bGQgRVhJRiBkYXRhIGJlIG1haW50YWluZWQ/CisgICAgICAgIGNv
bnN0IENHRmxvYXQgY29tcHJlc3Npb24gPSAwLjg7CisgICAgICAgIE5TRGF0YSAqanBlZyA9IFVJ
SW1hZ2VKUEVHUmVwcmVzZW50YXRpb24oaW1hZ2UsIGNvbXByZXNzaW9uKTsKKyAgICAgICAgaWYg
KCFqcGVnKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIldLRmlsZVVwbG9hZFBhbmVsOiBGYWls
ZWQgdG8gY3JlYXRlIEpQRUcgcmVwcmVzZW50YXRpb24gZm9yIGltYWdlIik7CisgICAgICAgICAg
ICBmYWlsdXJlQmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgZ2V0IHRoZSBwaG90byBhc3NldCBhbmQgZ2V0IHRoZSBh
Y3R1YWwgZmlsZW5hbWUgZm9yIHRoZSBwaG90byBpbnN0ZWFkIG9mCisgICAgICAgIC8vIG5hbWlu
ZyBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsIHVwbG9hZHMgaW1hZ2UuanBnPyBUaGlzIHdvbid0IHdv
cmsgZm9yIHBob3RvcyB0YWtlbiB3aXRoCisgICAgICAgIC8vIHRoZSBjYW1lcmEsIGJ1dCB3b3Vs
ZCB3b3JrIGZvciBwaG90b3MgcGlja2VkIGZyb20gdGhlIGxpYnJhcnkuCisgICAgICAgIE5TU3Ry
aW5nICogY29uc3Qga1VwbG9hZEltYWdlTmFtZSA9IEAiaW1hZ2UuanBnIjsKKyAgICAgICAgW3Nl
bGYgX3VwbG9hZEl0ZW1Gb3JJbWFnZURhdGE6anBlZyBvcmlnaW5hbEltYWdlOmltYWdlIGltYWdl
TmFtZTprVXBsb2FkSW1hZ2VOYW1lIHN1Y2Nlc3NCbG9jazpzdWNjZXNzQmxvY2sgZmFpbHVyZUJs
b2NrOmZhaWx1cmVCbG9ja107CisgICAgfSk7Cit9CisKK3N0YXRpYyBOU1N0cmluZyAqdXBsb2Fk
SW1hZ2VOYW1lRnJvbVVUSShOU1N0cmluZyAqdXRpKQoreworICAgIGlmIChbdXRpIGlzRXF1YWxU
b1N0cmluZzooTlNTdHJpbmcgKilrVVRUeXBlSlBFRzIwMDBdKQorICAgICAgICByZXR1cm4gQCJp
bWFnZS5qcDIiOworICAgIGlmIChbdXRpIGlzRXF1YWxUb1N0cmluZzooTlNTdHJpbmcgKilrVVRU
eXBlVElGRl0pCisgICAgICAgIHJldHVybiBAImltYWdlLnRpZmYiOworICAgIGlmIChbdXRpIGlz
RXF1YWxUb1N0cmluZzooTlNTdHJpbmcgKilrVVRUeXBlUElDVF0pCisgICAgICAgIHJldHVybiBA
ImltYWdlLnBpY3QiOworICAgIGlmIChbdXRpIGlzRXF1YWxUb1N0cmluZzooTlNTdHJpbmcgKilr
VVRUeXBlR0lGXSkKKyAgICAgICAgcmV0dXJuIEAiaW1hZ2UuZ2lmIjsKKyAgICBpZiAoW3V0aSBp
c0VxdWFsVG9TdHJpbmc6KE5TU3RyaW5nICopa1VUVHlwZVBOR10pCisgICAgICAgIHJldHVybiBA
ImltYWdlLnBuZyI7CisgICAgaWYgKFt1dGkgaXNFcXVhbFRvU3RyaW5nOihOU1N0cmluZyAqKWtV
VFR5cGVRdWlja1RpbWVJbWFnZV0pCisgICAgICAgIHJldHVybiBAImltYWdlLnF0aWYiOworICAg
IGlmIChbdXRpIGlzRXF1YWxUb1N0cmluZzooTlNTdHJpbmcgKilrVVRUeXBlQXBwbGVJQ05TXSkK
KyAgICAgICAgcmV0dXJuIEAiaW1hZ2UuaWNucyI7CisgICAgaWYgKFt1dGkgaXNFcXVhbFRvU3Ry
aW5nOihOU1N0cmluZyAqKWtVVFR5cGVCTVBdKQorICAgICAgICByZXR1cm4gQCJpbWFnZS5ibXAi
OworICAgIGlmIChbdXRpIGlzRXF1YWxUb1N0cmluZzooTlNTdHJpbmcgKilrVVRUeXBlSUNPXSkK
KyAgICAgICAgcmV0dXJuIEAiaW1hZ2UuaWNvIjsKKyAgICBpZiAoW3V0aSBpc0VxdWFsVG9TdHJp
bmc6KE5TU3RyaW5nICopa1VUVHlwZVJhd0ltYWdlXSkKKyAgICAgICAgcmV0dXJuIEAiaW1hZ2Uu
cmF3IjsKKyAgICBpZiAoW3V0aSBpc0VxdWFsVG9TdHJpbmc6KE5TU3RyaW5nICopa1VUVHlwZVNj
YWxhYmxlVmVjdG9yR3JhcGhpY3NdKQorICAgICAgICByZXR1cm4gQCJpbWFnZS5zdmciOworICAg
IHJldHVybiBAImltYWdlLmpwZyI7Cit9CisKKy0gKHZvaWQpX3VwbG9hZEl0ZW1Gb3JJbWFnZToo
VUlJbWFnZSAqKWltYWdlIHdpdGhBc3NldFVSTDooTlNVUkwgKilhc3NldFVSTCBzdWNjZXNzQmxv
Y2s6KHZvaWQgKF4pKF9XS0ZpbGVVcGxvYWRJdGVtICopKXN1Y2Nlc3NCbG9jayBmYWlsdXJlQmxv
Y2s6KHZvaWQgKF4pKHZvaWQpKWZhaWx1cmVCbG9jaworeworICAgIEFTU0VSVF9BUkcoaW1hZ2Us
IGltYWdlKTsKKyAgICBBU1NFUlRfQVJHKGFzc2V0VVJMLCBhc3NldFVSTCk7CisKKyAgICBQSEZl
dGNoUmVzdWx0ICpyZXN1bHQgPSBbZ2V0UEhBc3NldENsYXNzKCkgZmV0Y2hBc3NldHNXaXRoQUxB
c3NldFVSTHM6QFthc3NldFVSTF0gb3B0aW9uczpuaWxdOworICAgIGlmICghcmVzdWx0LmNvdW50
KSB7CisgICAgICAgIExPR19FUlJPUigiV0tGaWxlVXBsb2FkUGFuZWw6IEZhaWxlZCB0byBmZXRj
aCBhc3NldCB3aXRoIFVSTCAlQCIsIGFzc2V0VVJMKTsKKyAgICAgICAgW3NlbGYgX3VwbG9hZEl0
ZW1Gb3JKUEVHUmVwcmVzZW50YXRpb25PZkltYWdlOmltYWdlIHN1Y2Nlc3NCbG9jazpzdWNjZXNz
QmxvY2sgZmFpbHVyZUJsb2NrOmZhaWx1cmVCbG9ja107CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfZ2xvYmFsX3F1ZXVlKERJU1BBVENI
X1FVRVVFX1BSSU9SSVRZX0RFRkFVTFQsIDApLCBeeworICAgICAgICBSZXRhaW5QdHI8UEhJbWFn
ZVJlcXVlc3RPcHRpb25zPiBvcHRpb25zID0gYWRvcHROUyhbYWxsb2NQSEltYWdlUmVxdWVzdE9w
dGlvbnNJbnN0YW5jZSgpIGluaXRdKTsKKyAgICAgICAgW29wdGlvbnMgc2V0VmVyc2lvbjpQSElt
YWdlUmVxdWVzdE9wdGlvbnNWZXJzaW9uQ3VycmVudF07CisgICAgICAgIFtvcHRpb25zIHNldFN5
bmNocm9ub3VzOllFU107CisgICAgICAgIFtvcHRpb25zIHNldFJlc2l6ZU1vZGU6UEhJbWFnZVJl
cXVlc3RPcHRpb25zUmVzaXplTW9kZU5vbmVdOworCisgICAgICAgIFBISW1hZ2VNYW5hZ2VyICpt
YW5hZ2VyID0gKFBISW1hZ2VNYW5hZ2VyICopW2dldFBISW1hZ2VNYW5hZ2VyQ2xhc3MoKSBkZWZh
dWx0TWFuYWdlcl07CisgICAgICAgIFttYW5hZ2VyIHJlcXVlc3RJbWFnZURhdGFGb3JBc3NldDpy
ZXN1bHRbMF0gb3B0aW9uczpvcHRpb25zLmdldCgpIHJlc3VsdEhhbmRsZXI6XihOU0RhdGEgKmlt
YWdlRGF0YSwgTlNTdHJpbmcgKmRhdGFVVEksIFVJSW1hZ2VPcmllbnRhdGlvbiwgTlNEaWN0aW9u
YXJ5ICopIHsKKyAgICAgICAgICAgIGlmICghaW1hZ2VEYXRhKSB7CisgICAgICAgICAgICAgICAg
TE9HX0VSUk9SKCJXS0ZpbGVVcGxvYWRQYW5lbDogRmFpbGVkIHRvIHJlcXVlc3QgaW1hZ2UgZGF0
YSBmb3IgYXNzZXQgd2l0aCBVUkwgJUAiLCBhc3NldFVSTCk7CisgICAgICAgICAgICAgICAgW3Nl
bGYgX3VwbG9hZEl0ZW1Gb3JKUEVHUmVwcmVzZW50YXRpb25PZkltYWdlOmltYWdlIHN1Y2Nlc3NC
bG9jazpzdWNjZXNzQmxvY2sgZmFpbHVyZUJsb2NrOmZhaWx1cmVCbG9ja107CisgICAgICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTlNTdHJpbmcgKmltYWdl
TmFtZSA9IHVwbG9hZEltYWdlTmFtZUZyb21VVEkoZGF0YVVUSSk7CisgICAgICAgICAgICBbc2Vs
ZiBfdXBsb2FkSXRlbUZvckltYWdlRGF0YTppbWFnZURhdGEgb3JpZ2luYWxJbWFnZTppbWFnZSBp
bWFnZU5hbWU6aW1hZ2VOYW1lIHN1Y2Nlc3NCbG9jazpzdWNjZXNzQmxvY2sgZmFpbHVyZUJsb2Nr
OmZhaWx1cmVCbG9ja107CisgICAgICAgIH1dOworICAgIH0pOworfQorCiAtICh2b2lkKV91cGxv
YWRJdGVtRnJvbU1lZGlhSW5mbzooTlNEaWN0aW9uYXJ5ICopaW5mbyBzdWNjZXNzQmxvY2s6KHZv
aWQgKF4pKF9XS0ZpbGVVcGxvYWRJdGVtICopKXN1Y2Nlc3NCbG9jayBmYWlsdXJlQmxvY2s6KHZv
aWQgKF4pKHZvaWQpKWZhaWx1cmVCbG9jawogewogICAgIE5TU3RyaW5nICptZWRpYVR5cGUgPSBb
aW5mbyBvYmplY3RGb3JLZXk6VUlJbWFnZVBpY2tlckNvbnRyb2xsZXJNZWRpYVR5cGVdOwpAQCAt
NzQ0LDYyICs4NjUsMzAgQEAgLSAodm9pZClfdXBsb2FkSXRlbUZyb21NZWRpYUluZm86KE5TRGlj
dGlvbmFyeSAqKWluZm8gc3VjY2Vzc0Jsb2NrOih2b2lkICheKShfV0sKICAgICAgICAgcmV0dXJu
OwogICAgIH0KIAotICAgIC8vIEZvciBpbWFnZXMsIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxl
IHBhdGggYW5kIHVzZSB0aGUgb3JpZ2luYWwgaW1hZ2UuCi0gICAgaWYgKFVUVHlwZUNvbmZvcm1z
VG8oKENGU3RyaW5nUmVmKW1lZGlhVHlwZSwga1VUVHlwZUltYWdlKSkgewotICAgICAgICBVSUlt
YWdlICpvcmlnaW5hbEltYWdlID0gW2luZm8gb2JqZWN0Rm9yS2V5OlVJSW1hZ2VQaWNrZXJDb250
cm9sbGVyT3JpZ2luYWxJbWFnZV07Ci0gICAgICAgIGlmICghb3JpZ2luYWxJbWFnZSkgewotICAg
ICAgICAgICAgTE9HX0VSUk9SKCJXS0ZpbGVVcGxvYWRQYW5lbDogRXhwZWN0ZWQgaW1hZ2UgZGF0
YSBidXQgdGhlcmUgd2FzIG5vbmUiKTsKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OwotICAgICAgICAgICAgZmFpbHVyZUJsb2NrKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgIH0KLQotICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfZ2xvYmFsX3F1ZXVl
KERJU1BBVENIX1FVRVVFX1BSSU9SSVRZX0RFRkFVTFQsIDApLCBeewotICAgICAgICAgICAgTlNT
dHJpbmcgKiBjb25zdCBrVGVtcG9yYXJ5RGlyZWN0b3J5TmFtZSA9IEAiV0tXZWJGaWxlVXBsb2Fk
IjsKLSAgICAgICAgICAgIE5TU3RyaW5nICogY29uc3Qga1VwbG9hZEltYWdlTmFtZSA9IEAiaW1h
Z2UuanBnIjsKLQotICAgICAgICAgICAgLy8gQnVpbGQgdGVtcG9yYXJ5IGZpbGUgcGF0aC4KLSAg
ICAgICAgICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgZ2V0IHRoZSBBTEFzc2V0IGZvciB0aGUgbWVk
aWFVUkwgYW5kIGdldCB0aGUgYWN0dWFsIGZpbGVuYW1lIGZvciB0aGUgcGhvdG8KLSAgICAgICAg
ICAgIC8vIGluc3RlYWQgb2YgbmFtaW5nIGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgdXBsb2FkcyBp
bWFnZS5qcGc/IFRoaXMgd29uJ3Qgd29yayBmb3IgcGhvdG9zCi0gICAgICAgICAgICAvLyB0YWtl
biB3aXRoIHRoZSBjYW1lcmEsIGJ1dCB3b3VsZCB3b3JrIGZvciBwaG90b3MgcGlja2VkIGZyb20g
dGhlIGxpYnJhcnkuCi0gICAgICAgICAgICBOU0ZpbGVNYW5hZ2VyICpmaWxlTWFuYWdlciA9IFtO
U0ZpbGVNYW5hZ2VyIGRlZmF1bHRNYW5hZ2VyXTsKLSAgICAgICAgICAgIE5TU3RyaW5nICp0ZW1w
b3JhcnlEaXJlY3RvcnkgPSBbZmlsZU1hbmFnZXIgX3dlYmtpdF9jcmVhdGVUZW1wb3JhcnlEaXJl
Y3RvcnlXaXRoVGVtcGxhdGVQcmVmaXg6a1RlbXBvcmFyeURpcmVjdG9yeU5hbWVdOwotICAgICAg
ICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gW3RlbXBvcmFyeURpcmVjdG9yeSBzdHJpbmdCeUFw
cGVuZGluZ1BhdGhDb21wb25lbnQ6a1VwbG9hZEltYWdlTmFtZV07Ci0gICAgICAgICAgICBpZiAo
IWZpbGVQYXRoKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJXS0ZpbGVVcGxvYWRQYW5l
bDogRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIHNhdmUgaW1hZ2UiKTsK
LSAgICAgICAgICAgICAgICBmYWlsdXJlQmxvY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvbXByZXNzIHRvIEpQRUcgZm9ybWF0
LgotICAgICAgICAgICAgLy8gRklYTUU6IERpZmZlcmVudCBjb21wcmVzc2lvbiBmb3IgZGlmZmVy
ZW50IGRldmljZXM/Ci0gICAgICAgICAgICAvLyBGSVhNRTogRGlmZmVyZW50IGNvbXByZXNzaW9u
IGZvciBkaWZmZXJlbnQgVUlJbWFnZSBzaXplcz8KLSAgICAgICAgICAgIC8vIEZJWE1FOiBTaG91
bGQgRVhJRiBkYXRhIGJlIG1haW50YWluZWQ/Ci0gICAgICAgICAgICBjb25zdCBDR0Zsb2F0IGNv
bXByZXNzaW9uID0gMC44OwotICAgICAgICAgICAgTlNEYXRhICpqcGVnID0gVUlJbWFnZUpQRUdS
ZXByZXNlbnRhdGlvbihvcmlnaW5hbEltYWdlLCBjb21wcmVzc2lvbik7Ci0gICAgICAgICAgICBp
ZiAoIWpwZWcpIHsKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIldLRmlsZVVwbG9hZFBhbmVs
OiBGYWlsZWQgdG8gY3JlYXRlIEpQRUcgcmVwcmVzZW50YXRpb24gZm9yIGltYWdlIik7Ci0gICAg
ICAgICAgICAgICAgZmFpbHVyZUJsb2NrKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICAgICAgfQorICAgIGlmICghVVRUeXBlQ29uZm9ybXNUbygoQ0ZTdHJpbmdSZWYpbWVkaWFU
eXBlLCBrVVRUeXBlSW1hZ2UpKSB7CisgICAgICAgIExPR19FUlJPUigiV0tGaWxlVXBsb2FkUGFu
ZWw6IFVuZXhwZWN0ZWQgbWVkaWEgdHlwZS4gRXhwZWN0ZWQgaW1hZ2Ugb3IgdmlkZW8sIGdvdDog
JUAiLCBtZWRpYVR5cGUpOworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAg
ZmFpbHVyZUJsb2NrKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICAgICAgICAgIC8v
IFNhdmUgdGhlIGltYWdlIHRvIHRoZSB0ZW1wb3JhcnkgZmlsZS4KLSAgICAgICAgICAgIE5TRXJy
b3IgKmVycm9yID0gbmlsOwotICAgICAgICAgICAgW2pwZWcgd3JpdGVUb0ZpbGU6ZmlsZVBhdGgg
b3B0aW9uczpOU0RhdGFXcml0aW5nQXRvbWljIGVycm9yOiZlcnJvcl07Ci0gICAgICAgICAgICBp
ZiAoZXJyb3IpIHsKLSAgICAgICAgICAgICAgICBMT0dfRVJST1IoIldLRmlsZVVwbG9hZFBhbmVs
OiBFcnJvciB3cml0aW5nIGltYWdlIGRhdGEgdG8gdGVtcG9yYXJ5IGZpbGU6ICVAIiwgZXJyb3Ip
OwotICAgICAgICAgICAgICAgIGZhaWx1cmVCbG9jaygpOwotICAgICAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgICAgIH0KKyAgICBVSUltYWdlICpvcmlnaW5hbEltYWdlID0gW2luZm8gb2Jq
ZWN0Rm9yS2V5OlVJSW1hZ2VQaWNrZXJDb250cm9sbGVyT3JpZ2luYWxJbWFnZV07CisgICAgaWYg
KCFvcmlnaW5hbEltYWdlKSB7CisgICAgICAgIExPR19FUlJPUigiV0tGaWxlVXBsb2FkUGFuZWw6
IEV4cGVjdGVkIGltYWdlIGRhdGEgYnV0IHRoZXJlIHdhcyBub25lIik7CisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBmYWlsdXJlQmxvY2soKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KIAotICAgICAgICAgICAgc3VjY2Vzc0Jsb2NrKGFkb3B0TlMoW1tfV0tJbWFnZUZp
bGVVcGxvYWRJdGVtIGFsbG9jXSBpbml0V2l0aEZpbGVVUkw6W05TVVJMIGZpbGVVUkxXaXRoUGF0
aDpmaWxlUGF0aF0gb3JpZ2luYWxJbWFnZTpvcmlnaW5hbEltYWdlXSkuZ2V0KCkpOwotICAgICAg
ICB9KTsKKyAgICAvLyBJZiB3ZSBoYXZlIGFuIGFzc2V0IFVSTCwgdHJ5IHRvIHVwbG9hZCB0aGUg
bmF0aXZlIGltYWdlLgorICAgIE5TVVJMICpyZWZlcmVuY2VVUkwgPSBbaW5mbyBvYmplY3RGb3JL
ZXk6VUlJbWFnZVBpY2tlckNvbnRyb2xsZXJSZWZlcmVuY2VVUkxdOworICAgIGlmIChyZWZlcmVu
Y2VVUkwpIHsKKyAgICAgICAgW3NlbGYgX3VwbG9hZEl0ZW1Gb3JJbWFnZTpvcmlnaW5hbEltYWdl
IHdpdGhBc3NldFVSTDpyZWZlcmVuY2VVUkwgc3VjY2Vzc0Jsb2NrOnN1Y2Nlc3NCbG9jayBmYWls
dXJlQmxvY2s6ZmFpbHVyZUJsb2NrXTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8v
IFVua25vd24gbWVkaWEgdHlwZS4KLSAgICBMT0dfRVJST1IoIldLRmlsZVVwbG9hZFBhbmVsOiBV
bmV4cGVjdGVkIG1lZGlhIHR5cGUuIEV4cGVjdGVkIGltYWdlIG9yIHZpZGVvLCBnb3Q6ICVAIiwg
bWVkaWFUeXBlKTsKLSAgICBmYWlsdXJlQmxvY2soKTsKKyAgICAvLyBQaG90b3MgdGFrZW4gd2l0
aCB0aGUgY2FtZXJhIHdpbGwgbm90IGhhdmUgYW4gYXNzZXQgVVJMLiBGYWxsIGJhY2sgdG8gYSBK
UEVHIHJlcHJlc2VudGF0aW9uLgorICAgIFtzZWxmIF91cGxvYWRJdGVtRm9ySlBFR1JlcHJlc2Vu
dGF0aW9uT2ZJbWFnZTpvcmlnaW5hbEltYWdlIHN1Y2Nlc3NCbG9jazpzdWNjZXNzQmxvY2sgZmFp
bHVyZUJsb2NrOmZhaWx1cmVCbG9ja107CiB9CiAKIC0gKE5TU3RyaW5nICopX2Rpc3BsYXlTdHJp
bmdGb3JQaG90b3M6KE5TVUludGVnZXIpaW1hZ2VDb3VudCB2aWRlb3M6KE5TVUludGVnZXIpdmlk
ZW9Db3VudAotLSAKMi4zLjQgKEFwcGxlIEdpdC01NikKCg==
</data>
<flag name="review"
          id="279078"
          type_id="1"
          status="+"
          setter="aestes"
    />
          </attachment>
      

    </bug>

</bugzilla>