diff options
Diffstat (limited to 'src/3rdparty/webkit')
15 files changed, 390 insertions, 10 deletions
diff --git a/src/3rdparty/webkit/.tag b/src/3rdparty/webkit/.tag index 34446ae..12a28b8 100644 --- a/src/3rdparty/webkit/.tag +++ b/src/3rdparty/webkit/.tag @@ -1 +1 @@ -64cce100215c71575f19ca0b090c65fa97d4ba10 +52a11cec052aa40d3bbc06861be1177b649b4a99 diff --git a/src/3rdparty/webkit/ChangeLog b/src/3rdparty/webkit/ChangeLog index bc11b4d..bbaf26d 100644 --- a/src/3rdparty/webkit/ChangeLog +++ b/src/3rdparty/webkit/ChangeLog @@ -1,3 +1,34 @@ +2011-11-09 Zeno Albisser <zeno.albisser@nokia.com> + + [Qt] Unreviewed: Fix build on Mac. + https://bugreports.qt.nokia.com/browse/QTBUG-20619 + + This bug was introduced by the previous commit + for the same bugreport. + + * Source/WebKit.pri: + +2011-11-09 Zeno Albisser <zeno.albisser@nokia.com> + + [Qt] Unreviewed: Fix debug_and_release build on Windows. + https://bugreports.qt.nokia.com/browse/QTBUG-20619 + + This bug was introduced by the previous commit + for the same bugreport. + + * Source/WebKit.pri: + +2011-11-03 Zeno Albisser <zeno.albisser@nokia.com> + + [Qt] Unreviewed: Fix universal binary build on Mac. + https://bugreports.qt.nokia.com/browse/QTBUG-20619 + + When building a universal binary the debug version + exceeds the maximum size of a static library. + Therefore we do not allow this configuration. + + * Source/WebKit.pri: + 2011-08-06 Aron Rosenberg <arosenberg@logitech.com> Reviewed by Benjamin Poulain. diff --git a/src/3rdparty/webkit/Source/WebCore/ChangeLog b/src/3rdparty/webkit/Source/WebCore/ChangeLog index da9d1b2..ead97bd 100755 --- a/src/3rdparty/webkit/Source/WebCore/ChangeLog +++ b/src/3rdparty/webkit/Source/WebCore/ChangeLog @@ -1,3 +1,41 @@ +2011-11-01 Zeno Albisser <zeno.albisser@nokia.com> + + [Qt] bad codegen, pointer diff in JSC::JSCallbackConstructor::JSCallbackConstructor + https://bugs.webkit.org/show_bug.cgi?id=60951 + + Adjust symbols visibility for WebCore. + + Reviewed by Simon Hausmann. + + * WebCore.pro: + +2011-10-28 Zeno Albisser <zeno.albisser@nokia.com> + + [Qt] Unreviewed: Build fix for MSVC2005 + + Patch by Andy Shaw <andy.shaw@digia.com> + + * platform/win/SystemTimeWin.cpp: + +2011-10-13 Zeno Albisser <zeno.albisser@nokia.com> + + [Qt] QtWebKit build error for Mac 32bit + https://bugs.webkit.org/show_bug.cgi?id=69914 + + In WebCore.pro and QtWebKit.pro we define NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES + when compiling with ENABLE_VIDEO and with WTF_USE_QTKIT. + But this is meant to be defined in NSGeometry.h under certain preconditions. + Without setting NS_BUILD_32_LIKE_64 none of these preconditions is + met and therefore NSGeometry.h will create several conflicting type definitions. + + With this patch we create consistent definitions again. + Due to the order of include files we cannot remove + NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES from WebCore.pro. + + Reviewed by Andreas Kling. + + * WebCore.pro: + 2011-09-12 Adam Klein <adamk@chromium.org> Fix out-of-bounds access in Gradient::sortStopsIfNecessary diff --git a/src/3rdparty/webkit/Source/WebCore/WebCore.pro b/src/3rdparty/webkit/Source/WebCore/WebCore.pro index a305549..ceceee8 100644 --- a/src/3rdparty/webkit/Source/WebCore/WebCore.pro +++ b/src/3rdparty/webkit/Source/WebCore/WebCore.pro @@ -7,6 +7,8 @@ include($$PWD/../WebKit.pri) include($$PWD/WebCore.pri) include($$PWD/../JavaScriptCore/JavaScriptCore.pri) +contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols + TEMPLATE = lib TARGET = $$WEBCORE_TARGET CONFIG += staticlib @@ -2973,6 +2975,9 @@ contains(DEFINES, ENABLE_VIDEO=1) { platform/mac/WebWindowAnimation.mm DEFINES+=NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES + contains(CONFIG, "x86") { + DEFINES+=NS_BUILD_32_LIKE_64 + } } else: contains(DEFINES, WTF_USE_GSTREAMER=1) { HEADERS += \ diff --git a/src/3rdparty/webkit/Source/WebCore/bindings/js/JSExceptionBase.h b/src/3rdparty/webkit/Source/WebCore/bindings/js/JSExceptionBase.h index a9366ed..7713002 100644 --- a/src/3rdparty/webkit/Source/WebCore/bindings/js/JSExceptionBase.h +++ b/src/3rdparty/webkit/Source/WebCore/bindings/js/JSExceptionBase.h @@ -27,7 +27,7 @@ #define JSExceptionBase_h namespace JSC { - + class JSValue; } // namespace JSC diff --git a/src/3rdparty/webkit/Source/WebCore/platform/win/SystemTimeWin.cpp b/src/3rdparty/webkit/Source/WebCore/platform/win/SystemTimeWin.cpp index 547decc..c40a45a 100644 --- a/src/3rdparty/webkit/Source/WebCore/platform/win/SystemTimeWin.cpp +++ b/src/3rdparty/webkit/Source/WebCore/platform/win/SystemTimeWin.cpp @@ -27,6 +27,9 @@ #include "SystemTime.h" #include <limits> +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0500 +#endif #include <windows.h> namespace WebCore { diff --git a/src/3rdparty/webkit/Source/WebKit.pri b/src/3rdparty/webkit/Source/WebKit.pri index 5bd9577..c469d1a 100644 --- a/src/3rdparty/webkit/Source/WebKit.pri +++ b/src/3rdparty/webkit/Source/WebKit.pri @@ -10,6 +10,15 @@ CONFIG(QTDIR_build) { # Make sure we compile both debug and release on mac when inside Qt. # This line was extracted from qbase.pri instead of including the whole file win32|mac:!macx-xcode:CONFIG += debug_and_release + # In case we are building a universal binary for Qt, building debug is not + # possible because we would exceed the maximum library size for 32bit. + mac:contains(QT_CONFIG, x86):contains(QT_CONFIG, x86_64) { + CONFIG(debug_and_release)|CONFIG(debug, debug|release) { + message(Building a universal binary with debug symbols is not possible. Building release!) + CONFIG -= debug_and_release debug + CONFIG += release + } + } } else { !CONFIG(release, debug|release) { OBJECTS_DIR = obj/debug diff --git a/src/3rdparty/webkit/Source/WebKit/qt/Api/qwebpage.cpp b/src/3rdparty/webkit/Source/WebKit/qt/Api/qwebpage.cpp index b3efe0f..8f0f153 100644 --- a/src/3rdparty/webkit/Source/WebKit/qt/Api/qwebpage.cpp +++ b/src/3rdparty/webkit/Source/WebKit/qt/Api/qwebpage.cpp @@ -3972,7 +3972,7 @@ quint64 QWebPage::bytesReceived() const } /*! - \since 4.7 + \since 4.8 \fn void QWebPage::viewportChangeRequested() Page authors can provide the supplied values by using the viewport meta tag. More information diff --git a/src/3rdparty/webkit/Source/WebKit/qt/ChangeLog b/src/3rdparty/webkit/Source/WebKit/qt/ChangeLog index 32428f1..7ba98b8 100644 --- a/src/3rdparty/webkit/Source/WebKit/qt/ChangeLog +++ b/src/3rdparty/webkit/Source/WebKit/qt/ChangeLog @@ -1,3 +1,39 @@ +2011-11-03 Jesus Sanchez-Palencia <jesus@webkit.org> + + Reviewed by Kenneth Rohde Christiansen. + + [Qt] QtWebKit should have documentation clarifying its mobile features usage + https://bugs.webkit.org/show_bug.cgi?id=41465 + + Add "QtWebKit Goes Mobile" documentation + + * docs/qtwebkit-goes-mobile.qdoc: Added. + * docs/qtwebkit.qdoc: Linked to qtwebkit-goes-mobile documentation + * docs/webkitsnippets/qtwebkit_goes_mobile_snippets.cpp: Added. + +2011-11-01 Alexis Menard <alexis.menard@openbossa.org> + + Unreviewed Qt documentation fix. + + This signal is Qt 4.8 material. + + * Api/qwebpage.cpp: + +2011-10-21 Zeno Albisser <zeno.albisser@nokia.com> + + [Qt] WebKit build does not respect QMAKE_MAC_SDK variable. + https://bugs.webkit.org/show_bug.cgi?id=70596 + + Instead of only relying on DARWIN_MAJOR_VERSION we also + check QMAKE_MAC_SDK. In case QMAKE_MAC_SDK is not defined + we are still falling back to DARWIN_MAJOR_VERSION. + + Patch by Andy Shaw <andy.shaw@digia.com> + + Reviewed by Noam Rosenthal. + + * QtWebKit.pro: + 2011-09-06 Ademar de Souza Reis Jr. <ademar.reis@openbossa.org> [Qt][Symbian] REGRESSION[94105] DumpRenderTree.exe doesn't build on Symbian diff --git a/src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro b/src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro index 41b0d39..197aa98 100644 --- a/src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro +++ b/src/3rdparty/webkit/Source/WebKit/qt/QtWebKit.pro @@ -233,6 +233,9 @@ contains(DEFINES, ENABLE_VIDEO=1) { $$SOURCE_DIR/../WebKitLibraries/ DEFINES+=NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES + contains(CONFIG, "x86") { + DEFINES+=NS_BUILD_32_LIKE_64 + } HEADERS += $$PWD/WebCoreSupport/WebSystemInterface.h \ $$PWD/WebCoreSupport/QTKitFullScreenVideoHandler.h @@ -244,12 +247,12 @@ contains(DEFINES, ENABLE_VIDEO=1) { # We can know the Mac OS version by using the Darwin major version DARWIN_VERSION = $$split(QMAKE_HOST.version, ".") DARWIN_MAJOR_VERSION = $$first(DARWIN_VERSION) - equals(DARWIN_MAJOR_VERSION, "11") { - LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceLion.a - } else:equals(DARWIN_MAJOR_VERSION, "10") { - LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceSnowLeopard.a - } else:equals(DARWIN_MAJOR_VERSION, "9") { + equals(DARWIN_MAJOR_VERSION, "9") | contains(QMAKE_MAC_SDK, "/Developer/SDKs/MacOSX10.5.sdk") { LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceLeopard.a + } else: equals(DARWIN_MAJOR_VERSION, "10") | contains(QMAKE_MAC_SDK, "/Developer/SDKs/MacOSX10.6.sdk") { + LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceSnowLeopard.a + } else: equals(DARWIN_MAJOR_VERSION, "11") | contains(QMAKE_MAC_SDK, "/Developer/SDKs/MacOSX10.7.sdk") { + LIBS += $$SOURCE_DIR/../WebKitLibraries/libWebKitSystemInterfaceLion.a } } } diff --git a/src/3rdparty/webkit/Source/WebKit/qt/docs/qtwebkit-goes-mobile.qdoc b/src/3rdparty/webkit/Source/WebKit/qt/docs/qtwebkit-goes-mobile.qdoc new file mode 100644 index 0000000..40144d1 --- /dev/null +++ b/src/3rdparty/webkit/Source/WebKit/qt/docs/qtwebkit-goes-mobile.qdoc @@ -0,0 +1,191 @@ +/*! + \inmodule QtWebKit + \page qtwebkit-goes-mobile.html + \title QtWebKit Goes Mobile + \contentspage QtWebKit + \section1 Overview + + A lot of effort has been put into QtWebKit to make it attractive for + use on mobile devices. + + The goal of this tutorial is to help you understand the mobile + features and how to make the best of them, in other words, how to + create a good mobile web view that can be used on touch devices. + + If you want to target mobile devices you should consider using \l{QGraphicsWebView} + instead of \l{QWebView}. Since \l{QWebView} is based on the \l{QWidget} + system, it cannot easily support rotation, overlays, hardware accelerated + compositing and tiling. If you need a \l{QWidget} anyway, you can always + construct a \l{QGraphicsView} (which is a \l{QWidget}) with a \l{QGraphicsWebView} inside. + + So let's start with a very simple \l{QGraphicsWebView} based "browser": + + \snippet webkitsnippets/qtwebkit_goes_mobile_snippets.cpp 0 + + Here we set up a \l{QGraphicsView} application and add a + \l{QGraphicsWebView} to the scene. Notice + that we're disabling the scrollbars on the QGraphicsView because QtWebKit + handles scrolling and scrollbars automatically. This is to allow scrolling + optimizations and to enable web authors to interact with the scrollbars, + for instance, to style them differently. + + On touch-based mobile devices a feature known as tiling is often used. It + is used due to the interaction model (touch) as well as a scrolling + optimization. With this optimization we will have to deal with scrolling + ourselves, and we will have to disable features like scroll bar styling. + This is not usually a problem, since mobile browsers do not usually show + scroll bars, but use scroll indicators instead. + + Tiling basically means that the contents of the viewport is separated into + a grid of tiles, so that when you update an area, instead of just updating + the area, you actually update the whole tile or sub-regions of it. + This offers a few advantages for scrolling as, when you scroll, you do not need + to repaint the new visible area for each scroll step, but you simply update a row + of tiles each time; these tiles are often only partly on the screen. + This minimizes all the painting calls that we have to do and enables kinetic scrolling. + + Loading, rendering, and laying out are blocking operations. Though barely + noticeable on desktop machines, these operations can block for a long time + on a mobile device, letting the user believe the application has become + unresponsive. Additionally, scrolling will also stall when the user uses + his fingers to scroll, leading to a bad user experience. + + One way to overcome this issue, is to do all loading, laying out and + painting (basically all non-UI related work) in another thread or process, and + just blit the result from the web process/thread to the UI. There is research + in progress to enable this for a future version of QtWebKit, using WebKit2, but for now, + freezing the backing store can help when performing a zooming operation, for instance. + This will be discussed later, in the \l{#Enabling the Tiling}{Enabling the Tiling} section. + + When using tiles, you can blit any tile available when scrolling. When no tile is available you + can show a checkerboard tile instead, not letting the scrolling wait for the + tiles to be updated. This results in a responsive interface, with the only + disadvantage that you might see checkerboard tiles from time to time. + + The use of tiles also helps with zooming. Repainting at each zoom level change during + a zoom animation is basically impossible on a mobile device (or desktop for + that matter) and thus, with tiling, you can stop the tiles from being updated and + just scale the existing tiles. Then, at the end of the animation, update + tiles on top of the scaled ones. For now we will ignore the blocking + issue and concentrate on the tiling and the interaction model. + More information about Tiling can be found here: \l{http://doc.qt.nokia.com/4.7/qwebsettings.html#WebAttribute-enum} (see the entry for TiledBackingStoreEnabled). + + + \section1 Resize to Contents + + When using tiling, we want the \l{QGraphicsWebView} to act as our + content, as it supports tiling. In order for this we need to make it + resize itself to the size of its contents. For this we will use + \l{QGraphicsWebView::resizesToContents}. + + This setting removes the scroll bars for us on the main frame and + makes our \l{QGraphicsWebView} resize itself to the size of its content. + + Enabling it is as easy as setting the property: + + \snippet webkitsnippets/qtwebkit_goes_mobile_snippets.cpp 1 + + The property should be used in conjunction with the + QWebPage::preferredContentsSize property. If not explicitly set, + it is automatically set to a reasonable value. + + If we expand our mobile web view to the size of the contents + of its contained page, the view will be bigger than the device screen. + + + \section1 Using a View as the Window onto the Contents + + The idea is to have a custom widget which has a \l{QGraphicsWebView} as a + class member. Remember that the QGraphicsWebView will be as big as its + content's size, so this custom widget will serve as a viewport onto the + web view. + + The following code snippet illustrates this: + + \snippet webkitsnippets/qtwebkit_goes_mobile_snippets.cpp 2 + + In order to properly handle mouse events, you must install an event filter + on the web view or stack it behind its parent object + (\l{QGraphicsItem::ItemStacksBehindParent}). By doing this the mouse events will + reach a \c{MobileWebView} instance before they reach the member + \l{QGraphicsWebView}. Keep in mind that you'll need to add some logic in order + to distinguish between different mouse events and gestures, such as a + single click, double click and click-and-pan. Besides, scrolling and + zooming will have to be implemented manually. + + + \section1 Adjusting How Contents are Laid Out + + When testing the above on a device, you will notice that many pages are not + laid out very nicely. In particular, the width of the content may be larger + than the width of the device. This is due to the way web contents are laid + out. First, the viewport width is used for fitting the contents. If the + contents do not fit due to a non-flexible element with a width larger than + the viewport width, the minimum possible width will be used. As most pages + are written with a desktop browser in mind, that makes only very few sites + fit into the width of a mobile device. + + QtWebKit has a way to force a layout to a given width or height. What really + matters here is the width. If you lay out a page to a given width, it will get + that width and images might be cropped. The width or height is also used for + laying out fixed elements, but when we resize the \l{QGraphicsWebView} to the + size of the contents, fixed elements will not be relative to the view, which is + the behavior found on most mobile browsers. + + We saw that the QWebPage::preferredContentsSize property is automatically set + to a reasonable value when using \l{QGraphicsWebView::resizesToContents}. + + As you can imagine, laying out with a smaller viewport can cause pages to + break, therefore a default value has been chosen so that it almost breaks no + pages while still making pages fit. This value is 960x800. If the device + has a greater resolution, this value can be changed like this: + + \snippet webkitsnippets/qtwebkit_goes_mobile_snippets.cpp 3 + + You can play around with this and find a suitable size for your device, + but we will keep the default size for now. + + + \section1 The 'viewport' Meta-Tag + + As some sites do not work with 960 pixels width or want to have control of + how the page is laid out, QtWebKit, Android, Firefox Mobile and + the iPhone Safari browser support a meta-tag called \c viewport. This makes + it possible for a web page to let the browser know how it wants to be shown. + More info can be found in the + \l{http://developer.apple.com/safari/library/documentation/appleapplications/reference/safariwebcontent/usingtheviewport/usingtheviewport.html}{Safari Developer Library}. + + You must connect the signal \c{QWebPage::viewportChangeRequested(const + QWebPage::ViewportHints& hints)} to a slot of your mobile web view and use what + is provided by \l{QWebPage::ViewportHints} to update your viewport size, scale + range, and so on. + + + \section1 Enabling the Tiling + + We haven't actually enabled tiling yet, so let's go ahead and do that. That + is very simple as it is basically a setting: + + \snippet webkitsnippets/qtwebkit_goes_mobile_snippets.cpp 4 + + Note that, if you are going to add animations to your zooming or scaling + operations or want to implement fancy kinetic scrolling you might want to + take a look at \l{QGraphicsWebView::setTiledBackingStoreFrozen()}. With this, + you can avoid updates to your tiles during an animation, for instance. + + + \section1 Avoiding Scrollable Subelements + + One big issue with the above is that, iframes and sites using frames can + contain scrollable subelements. That doesn't work well with the touch + interaction model, as you want a finger swipe to scroll the whole page and not + end up just scrolling a subframe. Most mobile browsers work around this by + enabling something called frame flattening. Going straight to the point: + + \snippet webkitsnippets/qtwebkit_goes_mobile_snippets.cpp 5 + + This will make all frames from a web page expand themselves to the size of + their contents, keeping us free of scrollable subareas. + + +*/ diff --git a/src/3rdparty/webkit/Source/WebKit/qt/docs/qtwebkit.qdoc b/src/3rdparty/webkit/Source/WebKit/qt/docs/qtwebkit.qdoc index 1e76901..710d194 100644 --- a/src/3rdparty/webkit/Source/WebKit/qt/docs/qtwebkit.qdoc +++ b/src/3rdparty/webkit/Source/WebKit/qt/docs/qtwebkit.qdoc @@ -29,6 +29,9 @@ made fully editable to the user through the use of the \c{contenteditable} attribute on HTML elements. + QtWebKit has been enhanced to become more attractive on the mobile front as well. + For more information see \l{QtWebKit Goes Mobile}. + QtWebKit is based on the Open Source WebKit engine. More information about WebKit itself can be found on the \l{WebKit Open Source Project} Web site. diff --git a/src/3rdparty/webkit/Source/WebKit/qt/docs/webkitsnippets/qtwebkit_goes_mobile_snippets.cpp b/src/3rdparty/webkit/Source/WebKit/qt/docs/webkitsnippets/qtwebkit_goes_mobile_snippets.cpp new file mode 100644 index 0000000..8126fbf --- /dev/null +++ b/src/3rdparty/webkit/Source/WebKit/qt/docs/webkitsnippets/qtwebkit_goes_mobile_snippets.cpp @@ -0,0 +1,61 @@ +#if 0 +// ! [0] +int main(int argc, char **argv) +{ + QApplication app(argc, argv); + const int width = 640; + const int height = 480; + + QGraphicsScene scene; + + QGraphicsView view(&scene); + view.setFrameShape(QFrame::NoFrame); + view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + QGraphicsWebView webview; + webview.resize(width, height); + webview.load(QUrl("http://doc.qt.nokia.com/")); + + scene.addItem(&webview); + + view.resize(width, height); + view.show(); + + return app.exec(); +} +// ! [0] + + +// ! [1] +webview.setResizesToContents(true); +// ! [1] + +// ! [2] +class MobileWebView : public QGraphicsWidget { + Q_OBJECT +public: + MobileWebView(QGraphicsItem *parent = 0); + ~MobileWebView(); + + bool mousePress(const QPoint &value); + void mouseMove(const QPoint &value); + void mouseRelease(const QPoint &value); + +private: + QGraphicsWebView* webView; +}; +// ! [2] + +// ! [3] +webview.page()->setPreferredContentsSize(QSize(desiredWidth, desiredHeight)); +// ! [3] + +// ! [4] +QWebSettings::globalSettings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, true); +// ! [4] + +// ! [5] +QWebSettings::globalSettings()->setAttribute(QWebSettings::FrameFlatteningEnable, true); +// ! [5] +#endif diff --git a/src/3rdparty/webkit/Source/WebKit/qt/docs/webkitsnippets/webelement/main.cpp b/src/3rdparty/webkit/Source/WebKit/qt/docs/webkitsnippets/webelement/main.cpp index b1781a6..59c124c 100644 --- a/src/3rdparty/webkit/Source/WebKit/qt/docs/webkitsnippets/webelement/main.cpp +++ b/src/3rdparty/webkit/Source/WebKit/qt/docs/webkitsnippets/webelement/main.cpp @@ -57,7 +57,7 @@ static void findButtonAndClick() */ QWebElement button = document.findFirst("input[type=submit]"); - button.evaluateJavaScript("click()"); + button.evaluateJavaScript("this.click()"); //! [Calling a DOM element method] diff --git a/src/3rdparty/webkit/VERSION b/src/3rdparty/webkit/VERSION index 6a40345..750e7e7 100644 --- a/src/3rdparty/webkit/VERSION +++ b/src/3rdparty/webkit/VERSION @@ -4,4 +4,4 @@ This is a snapshot of the Qt port of WebKit from and has the sha1 checksum - 64cce100215c71575f19ca0b090c65fa97d4ba10 + 52a11cec052aa40d3bbc06861be1177b649b4a99 |