From 9a6959ca220fc7a0842fbb0b0cab25ee050e5215 Mon Sep 17 00:00:00 2001 From: Martin Stransky Date: Wed, 6 Oct 2021 09:22:57 +0200 Subject: [PATCH] Updated to Firefox 93.0 --- .gitignore | 2 + firefox-mozconfig | 1 + firefox.spec | 15 ++- mozilla-1669639.patch | 5 +- mozilla-1708709.patch | 240 ------------------------------------------ mozilla-1725828.patch | 23 ++-- mozilla-1728749.patch | 16 --- sources | 2 + 8 files changed, 25 insertions(+), 279 deletions(-) delete mode 100644 mozilla-1708709.patch delete mode 100644 mozilla-1728749.patch diff --git a/.gitignore b/.gitignore index 6d1a579..250647c 100644 --- a/.gitignore +++ b/.gitignore @@ -475,3 +475,5 @@ firefox-3.6.4.source.tar.bz2 /firefox-92.0.source.tar.xz /firefox-92.0.1.source.tar.xz /firefox-langpacks-92.0.1-20210927.tar.xz +/firefox-93.0.source.tar.xz +/firefox-langpacks-93.0-20210929.tar.xz diff --git a/firefox-mozconfig b/firefox-mozconfig index 469d5c1..103bf15 100644 --- a/firefox-mozconfig +++ b/firefox-mozconfig @@ -15,6 +15,7 @@ ac_add_options --allow-addon-sideload ac_add_options --with-system-fdk-aac ac_add_options --enable-js-shell ac_add_options --with-unsigned-addon-scopes=app,system +ac_add_options --without-sysroot export BUILD_OFFICIAL=1 export MOZILLA_OFFICIAL=1 diff --git a/firefox.spec b/firefox.spec index a9eb3f6..39a0bc2 100644 --- a/firefox.spec +++ b/firefox.spec @@ -156,13 +156,13 @@ ExcludeArch: armv7hl Summary: Mozilla Firefox Web browser Name: firefox -Version: 92.0.1 +Version: 93.0 Release: 1%{?pre_tag}%{?dist} URL: https://www.mozilla.org/firefox/ License: MPLv1.1 or GPLv2+ or LGPLv2+ Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz %if %{with langpacks} -Source1: firefox-langpacks-%{version}%{?pre_version}-20210927.tar.xz +Source1: firefox-langpacks-%{version}%{?pre_version}-20210929.tar.xz %endif Source2: cbindgen-vendor.tar.xz Source10: firefox-mozconfig @@ -237,8 +237,6 @@ Patch407: mozilla-1667096.patch Patch408: mozilla-1663844.patch Patch415: mozilla-1670333.patch Patch420: mochitest-wayland-workaround.patch -Patch422: mozilla-1728749.patch -Patch423: mozilla-1708709.patch Patch424: mozilla-1725828.patch # PGO/LTO patches @@ -480,8 +478,6 @@ This package contains results of tests executed during build. %patch408 -p1 -b .1663844 %patch415 -p1 -b .1670333 %patch420 -p1 -b .mochitest-wayland-workaround -%patch422 -p1 -b .1728749 -%patch423 -p1 -b .1708709 %patch424 -p1 -b .1725828 # PGO patches @@ -583,8 +579,8 @@ echo 'export NODEJS="%{_buildrootdir}/bin/node-stdout-nonblocking-wrapper"' >> . # Remove executable bit to make brp-mangle-shebangs happy. chmod -x third_party/rust/itertools/src/lib.rs -chmod a-x third_party/rust/gfx-backend-vulkan/src/*.rs -chmod a-x third_party/rust/gfx-hal/src/*.rs +#chmod a-x third_party/rust/gfx-backend-vulkan/src/*.rs +#chmod a-x third_party/rust/gfx-hal/src/*.rs chmod a-x third_party/rust/ash/src/extensions/ext/*.rs chmod a-x third_party/rust/ash/src/extensions/khr/*.rs chmod a-x third_party/rust/ash/src/extensions/nv/*.rs @@ -1052,6 +1048,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : #--------------------------------------------------------------------- %changelog +* Wed Sep 29 2021 Martin Stransky - 93.0-1 +- Updated to 93.0 + * Mon Sep 27 2021 Martin Stransky - 92.0.1-1 - Updated to 92.0.1 diff --git a/mozilla-1669639.patch b/mozilla-1669639.patch index 2d79542..cd04aab 100644 --- a/mozilla-1669639.patch +++ b/mozilla-1669639.patch @@ -1,6 +1,5 @@ -diff -up firefox-81.0.1/build/mach_bootstrap.py.old firefox-81.0.1/build/mach_bootstrap.py ---- firefox-81.0.1/build/mach_bootstrap.py.old 2020-10-06 14:16:06.212974910 +0200 -+++ firefox-81.0.1/build/mach_bootstrap.py 2020-10-06 14:19:03.313179557 +0200 +--- firefox-81.0.1/build/mach_initialize.py.old 2020-10-06 14:16:06.212974910 +0200 ++++ firefox-81.0.1/build/mach_initialize.py 2020-10-06 14:19:03.313179557 +0200 @@ -507,7 +507,10 @@ class ImportHook(object): # doesn't happen or because it doesn't matter). if not os.path.exists(module.__file__[:-1]): diff --git a/mozilla-1708709.patch b/mozilla-1708709.patch deleted file mode 100644 index 8ee1b35..0000000 --- a/mozilla-1708709.patch +++ /dev/null @@ -1,240 +0,0 @@ -diff -up firefox-92.0/dom/xul/XULPopupElement.cpp.1708709 firefox-92.0/dom/xul/XULPopupElement.cpp ---- firefox-92.0/dom/xul/XULPopupElement.cpp.1708709 2021-09-01 19:14:41.000000000 +0200 -+++ firefox-92.0/dom/xul/XULPopupElement.cpp 2021-09-07 10:33:55.686223973 +0200 -@@ -271,8 +271,7 @@ already_AddRefed XULPopupElemen - // For native menus we can't query the true size. Use the anchor rect - // instead, which at least has the position at which we were intending to - // open the menu. -- screenRect = Some(CSSRect( -- CSSIntRect::FromUnknownRect(menuPopupFrame->GetScreenAnchorRect()))); -+ screenRect = Some(CSSRect(menuPopupFrame->GetScreenAnchorRect())); - } else { - // For non-native menus, query the bounds from the widget. - if (nsView* view = menuPopupFrame->GetView()) { -diff -up firefox-92.0/layout/xul/nsMenuPopupFrame.cpp.1708709 firefox-92.0/layout/xul/nsMenuPopupFrame.cpp ---- firefox-92.0/layout/xul/nsMenuPopupFrame.cpp.1708709 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/xul/nsMenuPopupFrame.cpp 2021-09-07 10:33:55.686223973 +0200 -@@ -868,8 +868,9 @@ void nsMenuPopupFrame::InitializePopup(n - InitPositionFromAnchorAlign(anchor, align); - } - } -- -- mScreenRect = nsIntRect(-1, -1, 0, 0); -+ // When converted back to CSSIntRect it is (-1, -1, 0, 0) - as expected in -+ // nsXULPopupManager::Rollup -+ mScreenRect = nsRect(-AppUnitsPerCSSPixel(), -AppUnitsPerCSSPixel(), 0, 0); - - if (aAttributesOverride) { - // Use |left| and |top| dimension attributes to position the popup if -@@ -881,11 +882,15 @@ void nsMenuPopupFrame::InitializePopup(n - nsresult err; - if (!left.IsEmpty()) { - int32_t x = left.ToInteger(&err); -- if (NS_SUCCEEDED(err)) mScreenRect.x = x; -+ if (NS_SUCCEEDED(err)) { -+ mScreenRect.x = CSSPixel::ToAppUnits(x); -+ } - } - if (!top.IsEmpty()) { - int32_t y = top.ToInteger(&err); -- if (NS_SUCCEEDED(err)) mScreenRect.y = y; -+ if (NS_SUCCEEDED(err)) { -+ mScreenRect.y = CSSPixel::ToAppUnits(y); -+ } - } - } - } -@@ -900,7 +905,8 @@ void nsMenuPopupFrame::InitializePopupAt - mPopupState = ePopupShowing; - mAnchorContent = nullptr; - mTriggerContent = aTriggerContent; -- mScreenRect = nsIntRect(aXPos, aYPos, 0, 0); -+ mScreenRect = -+ nsRect(CSSPixel::ToAppUnits(aXPos), CSSPixel::ToAppUnits(aYPos), 0, 0); - mXPos = 0; - mYPos = 0; - mFlip = FlipType_Default; -@@ -920,7 +926,8 @@ void nsMenuPopupFrame::InitializePopupAs - mTriggerContent = aTriggerContent; - mPopupState = ePopupShowing; - mAnchorContent = nullptr; -- mScreenRect = nsIntRect(aXPos, aYPos, 0, 0); -+ mScreenRect = -+ nsRect(CSSPixel::ToAppUnits(aXPos), CSSPixel::ToAppUnits(aYPos), 0, 0); - mXPos = 0; - mYPos = 0; - mFlip = FlipType_Default; -@@ -941,7 +948,7 @@ void nsMenuPopupFrame::InitializePopupAt - bool aAttributesOverride) { - InitializePopup(nullptr, aTriggerContent, aPosition, 0, 0, - MenuPopupAnchorType_Rect, aAttributesOverride); -- mScreenRect = aRect; -+ mScreenRect = ToAppUnits(aRect, AppUnitsPerCSSPixel()); - } - - void nsMenuPopupFrame::ShowPopup(bool aIsContextMenu) { -@@ -1430,7 +1437,7 @@ nsresult nsMenuPopupFrame::SetPopupPosit - // If anchored to a rectangle, use that rectangle. Otherwise, determine the - // rectangle from the anchor. - if (mAnchorType == MenuPopupAnchorType_Rect) { -- anchorRect = ToAppUnits(mScreenRect, AppUnitsPerCSSPixel()); -+ anchorRect = mScreenRect; - } else { - // if the frame is not specified, use the anchor node passed to OpenPopup. - // If that wasn't specified either, use the root frame. Note that -@@ -1517,7 +1524,7 @@ nsresult nsMenuPopupFrame::SetPopupPosit - // mXPos and mYPos specify an additonal offset passed to OpenPopup that - // should be added to the position. We also add the offset to the anchor - // pos so a later flip/resize takes the offset into account. -- nscoord anchorXOffset = nsPresContext::CSSPixelsToAppUnits(mXPos); -+ nscoord anchorXOffset = CSSPixel::ToAppUnits(mXPos); - if (IsDirectionRTL()) { - screenPoint.x -= anchorXOffset; - anchorRect.x -= anchorXOffset; -@@ -1525,7 +1532,7 @@ nsresult nsMenuPopupFrame::SetPopupPosit - screenPoint.x += anchorXOffset; - anchorRect.x += anchorXOffset; - } -- nscoord anchorYOffset = nsPresContext::CSSPixelsToAppUnits(mYPos); -+ nscoord anchorYOffset = CSSPixel::ToAppUnits(mYPos); - screenPoint.y += anchorYOffset; - anchorRect.y += anchorYOffset; - -@@ -1539,10 +1546,8 @@ nsresult nsMenuPopupFrame::SetPopupPosit - // Account for the margin that will end up being added to the screen - // coordinate the next time SetPopupPosition is called. - mAnchorType = MenuPopupAnchorType_Point; -- mScreenRect.x = -- nsPresContext::AppUnitsToIntCSSPixels(screenPoint.x - margin.left); -- mScreenRect.y = -- nsPresContext::AppUnitsToIntCSSPixels(screenPoint.y - margin.top); -+ mScreenRect.x = screenPoint.x - margin.left; -+ mScreenRect.y = screenPoint.y - margin.top; - } - } else { - // The popup is positioned at a screen coordinate. -@@ -1557,11 +1562,11 @@ nsresult nsMenuPopupFrame::SetPopupPosit - if (mAdjustOffsetForContextMenu) { - nsPoint offsetForContextMenuDev; - offsetForContextMenuDev.x = -- nsPresContext::CSSPixelsToAppUnits(LookAndFeel::GetInt( -+ CSSPixel::ToAppUnits(LookAndFeel::GetInt( - LookAndFeel::IntID::ContextMenuOffsetHorizontal)) / - factor; - offsetForContextMenuDev.y = -- nsPresContext::CSSPixelsToAppUnits(LookAndFeel::GetInt( -+ CSSPixel::ToAppUnits(LookAndFeel::GetInt( - LookAndFeel::IntID::ContextMenuOffsetVertical)) / - factor; - offsetForContextMenu.x = -@@ -1571,10 +1576,8 @@ nsresult nsMenuPopupFrame::SetPopupPosit - } - - // next, convert into app units accounting for the zoom -- screenPoint.x = presContext->DevPixelsToAppUnits( -- nsPresContext::CSSPixelsToAppUnits(mScreenRect.x) / factor); -- screenPoint.y = presContext->DevPixelsToAppUnits( -- nsPresContext::CSSPixelsToAppUnits(mScreenRect.y) / factor); -+ screenPoint.x = presContext->DevPixelsToAppUnits(mScreenRect.x / factor); -+ screenPoint.y = presContext->DevPixelsToAppUnits(mScreenRect.y / factor); - anchorRect = nsRect(screenPoint, nsSize(0, 0)); - - // add the margins on the popup -@@ -2377,9 +2380,10 @@ void nsMenuPopupFrame::DestroyFrom(nsIFr - nsBoxFrame::DestroyFrom(aDestructRoot, aPostDestroyData); - } - --void nsMenuPopupFrame::MoveTo(const CSSIntPoint& aPos, bool aUpdateAttrs) { -+void nsMenuPopupFrame::MoveTo(const CSSPoint& aPos, bool aUpdateAttrs) { - nsIWidget* widget = GetWidget(); -- if ((mScreenRect.x == aPos.x && mScreenRect.y == aPos.y) && -+ nsPoint appUnitsPos = CSSPixel::ToAppUnits(aPos); -+ if ((mScreenRect.x == appUnitsPos.x && mScreenRect.y == appUnitsPos.y) && - (!widget || widget->GetClientOffset() == mLastClientOffset)) { - return; - } -@@ -2393,15 +2397,15 @@ void nsMenuPopupFrame::MoveTo(const CSSI - - // Workaround for bug 788189. See also bug 708278 comment #25 and following. - if (mAdjustOffsetForContextMenu) { -- margin.left += nsPresContext::CSSPixelsToAppUnits( -+ margin.left += CSSPixel::ToAppUnits( - LookAndFeel::GetInt(LookAndFeel::IntID::ContextMenuOffsetHorizontal)); -- margin.top += nsPresContext::CSSPixelsToAppUnits( -+ margin.top += CSSPixel::ToAppUnits( - LookAndFeel::GetInt(LookAndFeel::IntID::ContextMenuOffsetVertical)); - } - - mAnchorType = MenuPopupAnchorType_Point; -- mScreenRect.x = aPos.x - nsPresContext::AppUnitsToIntCSSPixels(margin.left); -- mScreenRect.y = aPos.y - nsPresContext::AppUnitsToIntCSSPixels(margin.top); -+ mScreenRect.x = appUnitsPos.x - margin.left; -+ mScreenRect.y = appUnitsPos.y - margin.top; - - SetPopupPosition(nullptr, true, false); - -@@ -2409,8 +2413,8 @@ void nsMenuPopupFrame::MoveTo(const CSSI - if (aUpdateAttrs && (popup->HasAttr(kNameSpaceID_None, nsGkAtoms::left) || - popup->HasAttr(kNameSpaceID_None, nsGkAtoms::top))) { - nsAutoString left, top; -- left.AppendInt(aPos.x); -- top.AppendInt(aPos.y); -+ left.AppendInt(RoundedToInt(aPos).x); -+ top.AppendInt(RoundedToInt(aPos).y); - popup->SetAttr(kNameSpaceID_None, nsGkAtoms::left, left, false); - popup->SetAttr(kNameSpaceID_None, nsGkAtoms::top, top, false); - } -diff -up firefox-92.0/layout/xul/nsMenuPopupFrame.h.1708709 firefox-92.0/layout/xul/nsMenuPopupFrame.h ---- firefox-92.0/layout/xul/nsMenuPopupFrame.h.1708709 2021-09-01 19:15:06.000000000 +0200 -+++ firefox-92.0/layout/xul/nsMenuPopupFrame.h 2021-09-07 10:46:10.360036429 +0200 -@@ -321,7 +321,7 @@ class nsMenuPopupFrame final : public ns - // If aUpdateAttrs is true, and the popup already has left or top attributes, - // then those attributes are updated to the new location. - // The frame may be destroyed by this method. -- void MoveTo(const mozilla::CSSIntPoint& aPos, bool aUpdateAttrs); -+ void MoveTo(const mozilla::CSSPoint& aPos, bool aUpdateAttrs); - - void MoveToAnchor(nsIContent* aAnchorContent, const nsAString& aPosition, - int32_t aXPos, int32_t aYPos, bool aAttributesOverride); -@@ -370,7 +370,9 @@ class nsMenuPopupFrame final : public ns - - // Return the screen coordinates in CSS pixels of the popup, - // or (-1, -1, 0, 0) if anchored. -- nsIntRect GetScreenAnchorRect() const { return mScreenRect; } -+ mozilla::CSSIntRect GetScreenAnchorRect() const { -+ return mozilla::CSSRect::FromAppUnitsRounded(mScreenRect); -+ } - - mozilla::LayoutDeviceIntPoint GetLastClientOffset() const { - return mLastClientOffset; -@@ -557,7 +559,7 @@ class nsMenuPopupFrame final : public ns - // override mXPos and mYPos. - int32_t mXPos; - int32_t mYPos; -- nsIntRect mScreenRect; -+ nsRect mScreenRect; - // Used for store rectangle which the popup is going to be anchored to, - // we need that for Wayland - #ifdef MOZ_WAYLAND -diff -up firefox-92.0/layout/xul/nsXULPopupManager.cpp.1708709 firefox-92.0/layout/xul/nsXULPopupManager.cpp ---- firefox-92.0/layout/xul/nsXULPopupManager.cpp.1708709 2021-09-01 19:15:01.000000000 +0200 -+++ firefox-92.0/layout/xul/nsXULPopupManager.cpp 2021-09-07 10:33:55.686223973 +0200 -@@ -343,8 +343,7 @@ bool nsXULPopupManager::Rollup(uint32_t - if (popupFrame->IsAnchored()) { - // Check if the popup has a screen anchor rectangle. If not, get the - // rectangle from the anchor element. -- anchorRect = -- CSSIntRect::FromUnknownRect(popupFrame->GetScreenAnchorRect()); -+ anchorRect = popupFrame->GetScreenAnchorRect(); - if (anchorRect.x == -1 || anchorRect.y == -1) { - nsCOMPtr anchor = popupFrame->GetAnchor(); - -@@ -581,7 +580,7 @@ void nsXULPopupManager::PopupMoved(nsIFr - } else { - CSSPoint cssPos = LayoutDeviceIntPoint::FromUnknownPoint(aPnt) / - menuPopupFrame->PresContext()->CSSToDevPixelScale(); -- menuPopupFrame->MoveTo(RoundedToInt(cssPos), false); -+ menuPopupFrame->MoveTo(cssPos, false); - } - } - diff --git a/mozilla-1725828.patch b/mozilla-1725828.patch index c891ab6..eed100a 100644 --- a/mozilla-1725828.patch +++ b/mozilla-1725828.patch @@ -1,7 +1,7 @@ -diff -up firefox-92.0/dom/media/gmp/GMPChild.cpp.1725828 firefox-92.0/dom/media/gmp/GMPChild.cpp ---- firefox-92.0/dom/media/gmp/GMPChild.cpp.1725828 2021-09-01 19:14:40.000000000 +0200 -+++ firefox-92.0/dom/media/gmp/GMPChild.cpp 2021-09-13 17:32:01.606739188 +0200 -@@ -232,8 +232,14 @@ mozilla::ipc::IPCResult GMPChild::RecvPr +diff --git a/dom/media/gmp/GMPChild.cpp b/dom/media/gmp/GMPChild.cpp +--- a/dom/media/gmp/GMPChild.cpp ++++ b/dom/media/gmp/GMPChild.cpp +@@ -232,8 +232,14 @@ } #elif defined(XP_LINUX) constexpr static const char* whitelist[] = { @@ -16,7 +16,7 @@ diff -up firefox-92.0/dom/media/gmp/GMPChild.cpp.1725828 firefox-92.0/dom/media/ }; nsTArray libs; -@@ -256,7 +262,7 @@ mozilla::ipc::IPCResult GMPChild::RecvPr +@@ -256,7 +262,7 @@ } // End bug 1698718 logging. @@ -25,14 +25,13 @@ diff -up firefox-92.0/dom/media/gmp/GMPChild.cpp.1725828 firefox-92.0/dom/media/ } } } -diff -up firefox-92.0/dom/media/gmp/GMPParent.cpp.1725828 firefox-92.0/dom/media/gmp/GMPParent.cpp ---- firefox-92.0/dom/media/gmp/GMPParent.cpp.1725828 2021-09-13 17:32:01.606739188 +0200 -+++ firefox-92.0/dom/media/gmp/GMPParent.cpp 2021-09-13 17:55:54.902965506 +0200 -@@ -873,8 +873,21 @@ RefPtr GMPParent::ParseC +diff --git a/dom/media/gmp/GMPParent.cpp b/dom/media/gmp/GMPParent.cpp +--- a/dom/media/gmp/GMPParent.cpp ++++ b/dom/media/gmp/GMPParent.cpp +@@ -876,6 +876,20 @@ return GenericPromise::CreateAndReject(NS_ERROR_FAILURE, __func__); } -- GMPCapability video; +#ifdef XP_LINUX + // These glibc libraries were merged into libc.so.6 as of glibc + // 2.34; they now exist only as stub libraries for compatibility and @@ -46,8 +45,8 @@ diff -up firefox-92.0/dom/media/gmp/GMPParent.cpp.1725828 firefox-92.0/dom/media + mLibs.AppendLiteral("libdl.so.2, libpthread.so.0, librt.so.1"); + } +#endif - -+ GMPCapability video; ++ nsCString codecsString = NS_ConvertUTF16toUTF8(m.mX_cdm_codecs); nsTArray codecs; SplitAt(",", codecsString, codecs); + diff --git a/mozilla-1728749.patch b/mozilla-1728749.patch deleted file mode 100644 index 08f6217..0000000 --- a/mozilla-1728749.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/browser/actors/WebRTCParent.jsm b/browser/actors/WebRTCParent.jsm ---- a/browser/actors/WebRTCParent.jsm -+++ b/browser/actors/WebRTCParent.jsm -@@ -870,6 +870,11 @@ - ); - item.deviceId = device.id; - item.mediaSource = type; -+ -+ // In this case the OS sharing dialog will be the only option and -+ // can be safely pre-selected. -+ menupopup.parentNode.selectedItem = item; -+ menupopup.parentNode.disabled = true; - break; - } - if (type == "application") { - diff --git a/sources b/sources index acc6f09..8131dcb 100644 --- a/sources +++ b/sources @@ -2,3 +2,5 @@ SHA512 (cbindgen-vendor.tar.xz) = b9ab1498be90ecf60822df7021f8812f124550d97f8cd6 SHA512 (mochitest-python.tar.gz) = 18e1aeb475df5fbf1fe3838897d5ac2f3114aa349030713fc2be27af087b1b12f57642621b87bd052f324a7cb7fbae5f36b21502191d85692f62c8cdd69c8bf2 SHA512 (firefox-92.0.1.source.tar.xz) = 53361c231a4ac93a1808c9ccb29893d85b5e516fe939a770aac7f178abb4f43cbe3571097e5c5bf91b11fd95fc62b61f2aa215a45048357bfc9dad9eabdee9ef SHA512 (firefox-langpacks-92.0.1-20210927.tar.xz) = 60719e4efe3a9ebf7e80caf79c77b9f01b2fbd380977eefaec02f7a863a6a9d88563a827a2816065522909ebecd944afb97c26278440bded9a6dadaf491ef89c +SHA512 (firefox-93.0.source.tar.xz) = b29890e331819d47201b599b9feaaa7eaa0b02088fcbf980efc4f289d43da4f73970bf35ba2f763a2a892fd5318deb68cb9a66e71e9bc0c603642434c7e32e91 +SHA512 (firefox-langpacks-93.0-20210929.tar.xz) = 24872b6a6e7be04b8ee39f2d51787e3d016ef8a731f1c763d486acc4e63a48e0ea876bda718c5939318d18ec56d6f3e18855e0fd520ec7d04fc4d2f3cbc6dd3d