diff options
Diffstat (limited to 'layout')
257 files changed, 1494 insertions, 1001 deletions
diff --git a/layout/base/MaskLayerImageCache.h b/layout/base/MaskLayerImageCache.h index b18fe5aa1..61881de83 100644 --- a/layout/base/MaskLayerImageCache.h +++ b/layout/base/MaskLayerImageCache.h @@ -10,6 +10,7 @@ #include "nsAutoPtr.h" #include "nsPresContext.h" #include "mozilla/gfx/Matrix.h" +#include "mozilla/layers/ShadowLayers.h" namespace mozilla { diff --git a/layout/base/MobileViewportManager.h b/layout/base/MobileViewportManager.h index 63128b281..6324a8645 100644 --- a/layout/base/MobileViewportManager.h +++ b/layout/base/MobileViewportManager.h @@ -7,8 +7,11 @@ #define MobileViewportManager_h_ #include "mozilla/Maybe.h" +#include "nsIDocument.h" #include "nsIDOMEventListener.h" +#include "nsIDOMEventTarget.h" #include "nsIObserver.h" +#include "nsViewportInfo.h" #include "Units.h" class nsIDOMEventTarget; diff --git a/layout/base/PositionedEventTargeting.cpp b/layout/base/PositionedEventTargeting.cpp index 8374ab9d2..668ff2938 100644 --- a/layout/base/PositionedEventTargeting.cpp +++ b/layout/base/PositionedEventTargeting.cpp @@ -8,6 +8,7 @@ #include "mozilla/EventStates.h" #include "mozilla/MouseEvents.h" #include "mozilla/Preferences.h" +#include "nsIContentInlines.h" #include "nsLayoutUtils.h" #include "nsGkAtoms.h" #include "nsFontMetrics.h" diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index 124b5535e..a5a4e1237 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -239,11 +239,6 @@ RestyleManager::AnimationsWithDestroyedFrame::StopAnimationsWithoutFrame( } } -static inline dom::Element* -ElementForStyleContext(nsIContent* aParentContent, - nsIFrame* aFrame, - CSSPseudoElementType aPseudoType); - // Forwarded nsIDocumentObserver method, to handle restyling (and // passing the notification to the frame). nsresult @@ -1008,7 +1003,7 @@ RestyleManager::TryInitiatingTransition(nsPresContext* aPresContext, return *aNewStyleContext != sc; } -static dom::Element* +dom::Element* ElementForStyleContext(nsIContent* aParentContent, nsIFrame* aFrame, CSSPseudoElementType aPseudoType) diff --git a/layout/base/RestyleManager.h b/layout/base/RestyleManager.h index e22fe9058..4886d77bc 100644 --- a/layout/base/RestyleManager.h +++ b/layout/base/RestyleManager.h @@ -191,6 +191,7 @@ public: MOZ_ASSERT(false, "unexpected aPseudoType"); return nullptr; } + private: RestyleManager* mRestyleManager; AutoRestore<ReframingStyleContexts*> mRestorePointer; @@ -880,6 +881,11 @@ private: AutoTArray<mozilla::dom::Element*, 4> mAncestors; }; +dom::Element* +ElementForStyleContext(nsIContent* aParentContent, + nsIFrame* aFrame, + CSSPseudoElementType aPseudoType); + } // namespace mozilla #endif /* mozilla_RestyleManager_h */ diff --git a/layout/base/RestyleManagerBase.cpp b/layout/base/RestyleManagerBase.cpp index 6ef048a19..e2145934b 100644 --- a/layout/base/RestyleManagerBase.cpp +++ b/layout/base/RestyleManagerBase.cpp @@ -5,8 +5,26 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "mozilla/RestyleManagerBase.h" +#include "mozilla/RestyleManager.h" #include "mozilla/StyleSetHandle.h" +#include "mozilla/StyleSetHandleInlines.h" // for Ptr::HasStateDependentStyle +#include "ActiveLayerTracker.h" +#include "nsCSSFrameConstructor.h" +#include "nsCSSRendering.h" #include "nsIFrame.h" +#include "nsIFrameInlines.h" // for IsAbsPosContainingBlock +#include "nsPlaceholderFrame.h" +#include "nsStyleChangeList.h" +#include "nsStyleStructInlines.h" // for HasTransform +#include "nsSVGEffects.h" +#include "nsSVGIntegrationUtils.h" +#include "nsSVGUtils.h" +#include "nsViewportFrame.h" +#include "StickyScrollContainer.h" +#include "SVGTextFrame.h" + +using namespace mozilla; +using namespace mozilla::layers; namespace mozilla { diff --git a/layout/base/ServoRestyleManager.cpp b/layout/base/ServoRestyleManager.cpp index 42ca23bb1..82c81ea46 100644 --- a/layout/base/ServoRestyleManager.cpp +++ b/layout/base/ServoRestyleManager.cpp @@ -9,6 +9,7 @@ #include "mozilla/ServoStyleSet.h" #include "mozilla/dom/ChildIterator.h" #include "nsContentUtils.h" +#include "nsCSSFrameConstructor.h" #include "nsPrintfCString.h" #include "nsStyleChangeList.h" diff --git a/layout/base/TouchManager.cpp b/layout/base/TouchManager.cpp index 5167ca588..e7972d5af 100644 --- a/layout/base/TouchManager.cpp +++ b/layout/base/TouchManager.cpp @@ -12,6 +12,8 @@ #include "nsPresShell.h" #include "nsView.h" +using namespace mozilla::dom; + namespace mozilla { nsDataHashtable<nsUint32HashKey, TouchManager::TouchInfo>* TouchManager::sCaptureTouchList; diff --git a/layout/base/moz.build b/layout/base/moz.build index afc683665..f115280ce 100644 --- a/layout/base/moz.build +++ b/layout/base/moz.build @@ -119,7 +119,7 @@ EXPORTS.mozilla += [ 'StaticPresData.h', ] -UNIFIED_SOURCES += [ +SOURCES += [ 'AccessibleCaret.cpp', 'AccessibleCaretEventHub.cpp', 'AccessibleCaretManager.cpp', @@ -151,9 +151,11 @@ UNIFIED_SOURCES += [ 'nsLayoutDebugger.cpp', 'nsLayoutHistoryState.cpp', 'nsLayoutUtils.cpp', + 'nsPresArena.cpp', 'nsPresContext.cpp', 'nsPresShell.cpp', 'nsQuoteList.cpp', + 'nsRefreshDriver.cpp', 'nsStyleChangeList.cpp', 'nsStyleSheetService.cpp', 'PaintTracker.cpp', @@ -169,13 +171,6 @@ UNIFIED_SOURCES += [ 'ZoomConstraintsClient.cpp', ] -# nsPresArena.cpp needs to be built separately because it uses plarena.h. -# nsRefreshDriver.cpp needs to be built separately because of name clashes in the OS X headers -SOURCES += [ - 'nsPresArena.cpp', - 'nsRefreshDriver.cpp', -] - if CONFIG['ENABLE_TESTS']: DIRS += ['gtest'] diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 119c6c8a2..9a827546f 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -1903,8 +1903,15 @@ nsCSSRendering::GetImageLayerClip(const nsStyleImageLayers::Layer& aLayer, nsRect clipBorderArea = ::BoxDecorationRectForBorder(aForFrame, aBorderArea, skipSides, &aBorder); - bool haveRoundedCorners = GetRadii(aForFrame, aBorder, aBorderArea, - clipBorderArea, aClipState->mRadii); + bool haveRoundedCorners = false; + nsIAtom* fType = aForFrame->GetType(); + if (fType != nsGkAtoms::tableColGroupFrame && + fType != nsGkAtoms::tableColFrame && + fType != nsGkAtoms::tableRowFrame && + fType != nsGkAtoms::tableRowGroupFrame) { + haveRoundedCorners = GetRadii(aForFrame, aBorder, aBorderArea, + clipBorderArea, aClipState->mRadii); + } bool isSolidBorder = aWillPaintBorder && IsOpaqueBorder(aBorder); diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp index 8a34d108f..73e991246 100644 --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -721,7 +721,6 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame, : mReferenceFrame(aReferenceFrame), mIgnoreScrollFrame(nullptr), mLayerEventRegions(nullptr), - mCurrentTableItem(nullptr), mCurrentFrame(aReferenceFrame), mCurrentReferenceFrame(aReferenceFrame), mCurrentAGR(&mRootAGR), @@ -731,6 +730,7 @@ nsDisplayListBuilder::nsDisplayListBuilder(nsIFrame* aReferenceFrame, mGlassDisplayItem(nullptr), mScrollInfoItemsForHoisting(nullptr), mMode(aMode), + mTableBackgroundSet(nullptr), mCurrentScrollParentId(FrameMetrics::NULL_SCROLL_ID), mCurrentScrollbarTarget(FrameMetrics::NULL_SCROLL_ID), mCurrentScrollbarFlags(0), @@ -864,10 +864,9 @@ nsDisplayListBuilder::FindAnimatedGeometryRootFor(nsDisplayItem* aItem) void nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, - nsIFrame* aFrame, - const nsRect& aDirtyRect) + nsIFrame* aFrame) { - nsRect dirtyRectRelativeToDirtyFrame = aDirtyRect; + nsRect dirtyRectRelativeToDirtyFrame = GetDirtyRect(); if (nsLayoutUtils::IsFixedPosFrameInDisplayPort(aFrame) && IsPaintingToWindow()) { NS_ASSERTION(aDirtyFrame == aFrame->GetParent(), "Dirty frame should be viewport frame"); @@ -882,6 +881,7 @@ void nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, dirtyRectRelativeToDirtyFrame.SizeTo(aDirtyFrame->GetSize()); } } + nsRect dirty = dirtyRectRelativeToDirtyFrame - aFrame->GetOffsetTo(aDirtyFrame); nsRect overflowRect = aFrame->GetVisualOverflowRect(); @@ -925,7 +925,6 @@ nsDisplayListBuilder::~nsDisplayListBuilder() { "All frames should have been unmarked"); NS_ASSERTION(mPresShellStates.Length() == 0, "All presshells should have been exited"); - NS_ASSERTION(!mCurrentTableItem, "No table item should be active"); nsCSSRendering::EndFrameTreesLocked(); @@ -1008,8 +1007,22 @@ nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame, } state->mInsidePointerEventsNoneDoc = pointerEventsNone; - if (!buildCaret) + state->mPresShellIgnoreScrollFrame = + state->mPresShell->IgnoringViewportScrolling() + ? state->mPresShell->GetRootScrollFrame() + : nullptr; + + nsPresContext* pc = aReferenceFrame->PresContext(); + nsCOMPtr<nsIDocShell> docShell = pc->GetDocShell(); + if (docShell) { + docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed); + } + + mIsInChromePresContext = pc->IsChrome(); + + if (!buildCaret) { return; + } RefPtr<nsCaret> caret = state->mPresShell->GetCaret(); state->mCaretFrame = caret->GetPaintGeometry(&state->mCaretRect); @@ -1017,13 +1030,6 @@ nsDisplayListBuilder::EnterPresShell(nsIFrame* aReferenceFrame, mFramesMarkedForDisplay.AppendElement(state->mCaretFrame); MarkFrameForDisplay(state->mCaretFrame, nullptr); } - - nsPresContext* pc = aReferenceFrame->PresContext(); - nsCOMPtr<nsIDocShell> docShell = pc->GetDocShell(); - if (docShell) { - docShell->GetWindowDraggingAllowed(&mWindowDraggingAllowed); - } - mIsInChromePresContext = pc->IsChrome(); } // A non-blank paint is a paint that does not just contain the canvas background. @@ -1094,8 +1100,7 @@ nsDisplayListBuilder::ResetMarkedFramesForDisplayList() void nsDisplayListBuilder::MarkFramesForDisplayList(nsIFrame* aDirtyFrame, - const nsFrameList& aFrames, - const nsRect& aDirtyRect) { + const nsFrameList& aFrames) { for (nsIFrame* e : aFrames) { // Skip the AccessibleCaret frame when building no caret. if (!IsBuildingCaret()) { @@ -1107,9 +1112,8 @@ nsDisplayListBuilder::MarkFramesForDisplayList(nsIFrame* aDirtyFrame, } } } - mFramesMarkedForDisplay.AppendElement(e); - MarkOutOfFlowFrameForDisplay(aDirtyFrame, e, aDirtyRect); + MarkOutOfFlowFrameForDisplay(aDirtyFrame, e); } } @@ -2573,8 +2577,7 @@ static nsStyleContext* GetBackgroundStyleContext(nsIFrame* aFrame) /* static */ void SetBackgroundClipRegion(DisplayListClipState::AutoSaveRestore& aClipState, - nsIFrame* aFrame, const nsPoint& aToReferenceFrame, - const nsStyleImageLayers::Layer& aLayer, + nsIFrame* aFrame, const nsStyleImageLayers::Layer& aLayer, const nsRect& aBackgroundRect, bool aWillPaintBorder) { @@ -2626,7 +2629,6 @@ SpecialCutoutRegionCase(nsDisplayListBuilder* aBuilder, return true; } - /*static*/ bool nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, @@ -2635,14 +2637,16 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil bool aAllowWillPaintBorderOptimization, nsStyleContext* aStyleContext, const nsRect& aBackgroundOriginRect, - nsIFrame* aSecondaryReferenceFrame) + nsIFrame* aSecondaryReferenceFrame, + Maybe<nsDisplayListBuilder::AutoBuildingDisplayList>* + aAutoBuildingDisplayList) { nsStyleContext* bgSC = aStyleContext; const nsStyleBackground* bg = nullptr; - nsRect bgRect = aBackgroundRect + aBuilder->ToReferenceFrame(aFrame); + nsRect bgRect = aBackgroundRect; nsRect bgOriginRect = bgRect; if (!aBackgroundOriginRect.IsEmpty()) { - bgOriginRect = aBackgroundOriginRect + aBuilder->ToReferenceFrame(aFrame); + bgOriginRect = aBackgroundOriginRect; } nsPresContext* presContext = aFrame->PresContext(); bool isThemed = aFrame->IsThemed(); @@ -2678,8 +2682,6 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil !isThemed && !hasInsetShadow && borderStyle->HasBorder(); - nsPoint toRef = aBuilder->ToReferenceFrame(aFrame); - // An auxiliary list is necessary in case we have background blending; if that // is the case, background items need to be wrapped by a blend container to // isolate blending to the background @@ -2688,6 +2690,9 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil // to create an item for hit testing. if ((drawBackgroundColor && color != NS_RGBA(0,0,0,0)) || aBuilder->IsForEventDelivery()) { + if (aAutoBuildingDisplayList && !*aAutoBuildingDisplayList) { + aAutoBuildingDisplayList->emplace(aBuilder, aFrame); + } DisplayListClipState::AutoSaveRestore clipState(aBuilder); if (bg && !aBuilder->IsForEventDelivery()) { // Disable the will-paint-border optimization for background @@ -2699,7 +2704,7 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil // artifacts along the rounded corners. bool useWillPaintBorderOptimization = willPaintBorder && nsLayoutUtils::HasNonZeroCorner(borderStyle->mBorderRadius); - SetBackgroundClipRegion(clipState, aFrame, toRef, + SetBackgroundClipRegion(clipState, aFrame, bg->BottomLayer(), bgRect, useWillPaintBorderOptimization); } @@ -2752,6 +2757,10 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil continue; } + if (aAutoBuildingDisplayList && !*aAutoBuildingDisplayList) { + aAutoBuildingDisplayList->emplace(aBuilder, aFrame); + } + if (bg->mImage.mLayers[i].mBlendMode != NS_STYLE_BLEND_NORMAL) { needBlendContainer = true; } @@ -2759,8 +2768,8 @@ nsDisplayBackgroundImage::AppendBackgroundItemsToTop(nsDisplayListBuilder* aBuil DisplayListClipState::AutoSaveRestore clipState(aBuilder); if (!aBuilder->IsForEventDelivery()) { const nsStyleImageLayers::Layer& layer = bg->mImage.mLayers[i]; - SetBackgroundClipRegion(clipState, aFrame, toRef, - layer, bgRect, willPaintBorder); + SetBackgroundClipRegion(clipState, aFrame, layer, bgRect, + willPaintBorder); } nsDisplayList thisItemList; diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h index 9cee7b517..9eac132fa 100644 --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -48,6 +48,7 @@ class nsISelection; class nsIScrollableFrame; class nsDisplayLayerEventRegions; class nsDisplayScrollInfoLayer; +class nsDisplayTableBackgroundSet; class nsCaret; namespace mozilla { @@ -444,6 +445,10 @@ public: * BuildDisplayList on right now). */ const nsRect& GetDirtyRect() { return mDirtyRect; } + + void SetDirtyRect(const nsRect& aDirtyRect) { mDirtyRect = aDirtyRect; } + void IntersectDirtyRect(const nsRect& aDirtyRect) { mDirtyRect.IntersectRect(mDirtyRect, aDirtyRect); } + const nsIFrame* GetCurrentFrame() { return mCurrentFrame; } const nsIFrame* GetCurrentReferenceFrame() { return mCurrentReferenceFrame; } const nsPoint& GetCurrentFrameOffsetToReferenceFrame() { return mCurrentOffsetToReferenceFrame; } @@ -493,11 +498,10 @@ public: /** * Display the caret if needed. */ - void DisplayCaret(nsIFrame* aFrame, const nsRect& aDirtyRect, - nsDisplayList* aList) { + void DisplayCaret(nsIFrame* aFrame, nsDisplayList* aList) { nsIFrame* frame = GetCaretFrame(); if (aFrame == frame) { - frame->DisplayCaret(this, aDirtyRect, aList); + frame->DisplayCaret(this, aList); } } /** @@ -517,6 +521,14 @@ public: * Get the caret associated with the current presshell. */ nsCaret* GetCaret(); + + /** + * Returns the root scroll frame for the current PresShell, if the PresShell + * is ignoring viewport scrolling. + */ + nsIFrame* GetPresShellIgnoreScrollFrame() { + return CurrentPresShellState()->mPresShellIgnoreScrollFrame; + } /** * Notify the display list builder that we're entering a presshell. * aReferenceFrame should be a frame in the new presshell. @@ -577,6 +589,16 @@ public: mSyncDecodeImages = aSyncDecodeImages; } + nsDisplayTableBackgroundSet* SetTableBackgroundSet( + nsDisplayTableBackgroundSet* aTableSet) { + nsDisplayTableBackgroundSet* old = mTableBackgroundSet; + mTableBackgroundSet = aTableSet; + return old; + } + nsDisplayTableBackgroundSet* GetTableBackgroundSet() const { + return mTableBackgroundSet; + } + /** * Helper method to generate background painting flags based on the * information available in the display list builder. Currently only @@ -602,8 +624,7 @@ public: * destroyed. */ void MarkFramesForDisplayList(nsIFrame* aDirtyFrame, - const nsFrameList& aFrames, - const nsRect& aDirtyRect); + const nsFrameList& aFrames); /** * Mark all child frames that Preserve3D() as needing display. * Because these frames include transforms set on their parent, dirty rects @@ -700,8 +721,12 @@ public: friend class AutoBuildingDisplayList; class AutoBuildingDisplayList { public: - AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, - nsIFrame* aForChild, + + AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild) + : AutoBuildingDisplayList( + aBuilder, aForChild, aBuilder->GetDirtyRect(), aForChild->IsTransformed()){} + + AutoBuildingDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* aForChild, const nsRect& aDirtyRect, bool aIsRoot) : mBuilder(aBuilder), mPrevFrame(aBuilder->mCurrentFrame), @@ -803,10 +828,11 @@ public: friend class AutoSaveRestorePerspectiveIndex; class AutoSaveRestorePerspectiveIndex { public: - AutoSaveRestorePerspectiveIndex(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) + AutoSaveRestorePerspectiveIndex(nsDisplayListBuilder* aBuilder, + const bool aChildrenHavePerspective) : mBuilder(nullptr) { - if (aFrame->ChildrenHavePerspective()) { + if (aChildrenHavePerspective) { mBuilder = aBuilder; mCachedItemIndex = aBuilder->mPerspectiveItemIndex; aBuilder->mPerspectiveItemIndex = 0; @@ -981,10 +1007,6 @@ public: return mPreserves3DCtx.mAccumulatedRectLevels; } - // Helpers for tables - nsDisplayTableItem* GetCurrentTableItem() { return mCurrentTableItem; } - void SetCurrentTableItem(nsDisplayTableItem* aTableItem) { mCurrentTableItem = aTableItem; } - struct OutOfFlowDisplayData { OutOfFlowDisplayData(const DisplayItemClip* aContainingBlockClip, const DisplayItemScrollClip* aContainingBlockScrollClip, @@ -1120,11 +1142,11 @@ public: Preserves3DContext mSavedCtx; }; - const nsRect GetPreserves3DDirtyRect(const nsIFrame *aFrame) const { + const nsRect GetPreserves3DRects() const { return mPreserves3DCtx.mDirtyRect; } - void SetPreserves3DDirtyRect(const nsRect &aDirtyRect) { - mPreserves3DCtx.mDirtyRect = aDirtyRect; + void SavePreserves3DRects() { + mPreserves3DCtx.mDirtyRect = mDirtyRect; } bool IsBuildingInvisibleItems() const { return mBuildingInvisibleItems; } @@ -1133,8 +1155,7 @@ public: } private: - void MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, nsIFrame* aFrame, - const nsRect& aDirtyRect); + void MarkOutOfFlowFrameForDisplay(nsIFrame* aDirtyFrame, nsIFrame* aFrame); /** * Returns whether a frame acts as an animated geometry root, optionally @@ -1178,6 +1199,7 @@ private: // in the document, and is set when we enter a subdocument for a pointer- // events:none frame. bool mInsidePointerEventsNoneDoc; + nsIFrame* mPresShellIgnoreScrollFrame; }; PresShellState* CurrentPresShellState() { @@ -1202,7 +1224,6 @@ private: AutoTArray<PresShellState,8> mPresShellStates; AutoTArray<nsIFrame*,400> mFramesMarkedForDisplay; AutoTArray<ThemeGeometry,2> mThemeGeometries; - nsDisplayTableItem* mCurrentTableItem; DisplayListClipState mClipState; // mCurrentFrame is the frame that we're currently calling (or about to call) // BuildDisplayList on. @@ -1245,6 +1266,7 @@ private: nsTArray<DisplayItemScrollClip*> mScrollClipsToDestroy; nsTArray<DisplayItemClip*> mDisplayItemClipsToDestroy; nsDisplayListBuilderMode mMode; + nsDisplayTableBackgroundSet* mTableBackgroundSet; ViewID mCurrentScrollParentId; ViewID mCurrentScrollbarTarget; uint32_t mCurrentScrollbarFlags; @@ -2287,12 +2309,13 @@ protected: * to the object, and all distinct. */ struct nsDisplayListCollection : public nsDisplayListSet { - nsDisplayListCollection() : - nsDisplayListSet(&mLists[0], &mLists[1], &mLists[2], &mLists[3], &mLists[4], - &mLists[5]) {} - explicit nsDisplayListCollection(nsDisplayList* aBorderBackground) : - nsDisplayListSet(aBorderBackground, &mLists[1], &mLists[2], &mLists[3], &mLists[4], + explicit nsDisplayListCollection(nsDisplayListBuilder* aBuilder) + : nsDisplayListSet(&mLists[0], &mLists[1], &mLists[2], &mLists[3], &mLists[4], &mLists[5]) {} + explicit nsDisplayListCollection(nsDisplayListBuilder* aBuilder, + nsDisplayList* aBorderBackground) + : nsDisplayListSet(aBorderBackground, &mLists[1], &mLists[2], &mLists[3], &mLists[4], + &mLists[5]) {} /** * Sort all lists by content order. @@ -2739,7 +2762,9 @@ public: bool aAllowWillPaintBorderOptimization = true, nsStyleContext* aStyleContext = nullptr, const nsRect& aBackgroundOriginRect = nsRect(), - nsIFrame* aSecondaryReferenceFrame = nullptr); + nsIFrame* aSecondaryReferenceFrame = nullptr, + mozilla::Maybe<nsDisplayListBuilder::AutoBuildingDisplayList>* + aAutoBuildingDisplayList = nullptr); virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder, LayerManager* aManager, diff --git a/layout/base/nsDocumentViewer.cpp b/layout/base/nsDocumentViewer.cpp index 8baf1a464..df0f1266d 100644 --- a/layout/base/nsDocumentViewer.cpp +++ b/layout/base/nsDocumentViewer.cpp @@ -544,10 +544,12 @@ nsDocumentViewer::~nsDocumentViewer() mDocument->Destroy(); } +#ifdef NS_PRINTING if (mPrintEngine) { mPrintEngine->Destroy(); mPrintEngine = nullptr; } +#endif MOZ_RELEASE_ASSERT(mDestroyRefCount == 0); NS_ASSERTION(!mPresShell && !mPresContext, diff --git a/layout/base/nsFrameTraversal.cpp b/layout/base/nsFrameTraversal.cpp index 40fb5ff30..ab07d07df 100644 --- a/layout/base/nsFrameTraversal.cpp +++ b/layout/base/nsFrameTraversal.cpp @@ -10,6 +10,7 @@ #include "nsPlaceholderFrame.h" #include "nsContainerFrame.h" +using namespace mozilla; class nsFrameIterator : public nsIFrameEnumerator { diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index 21d20c69f..fb0b42a6c 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -118,6 +118,7 @@ #include "mozilla/StyleSetHandleInlines.h" #include "RegionBuilder.h" #include "SVGSVGElement.h" +#include "nsDocument.h" #ifdef MOZ_XUL #include "nsXULPopupManager.h" @@ -3189,7 +3190,8 @@ nsLayoutUtils::GetFramesForArea(nsIFrame* aFrame, const nsRect& aRect, } builder.EnterPresShell(aFrame); - aFrame->BuildDisplayListForStackingContext(&builder, aRect, &list); + builder.SetDirtyRect(aRect); + aFrame->BuildDisplayListForStackingContext(&builder, &list); builder.LeavePresShell(aFrame, nullptr); #ifdef MOZ_DUMP_PAINTING @@ -3538,7 +3540,8 @@ nsLayoutUtils::PaintFrame(nsRenderingContext* aRenderingContext, nsIFrame* aFram PROFILER_LABEL("nsLayoutUtils", "PaintFrame::BuildDisplayList", js::ProfileEntry::Category::GRAPHICS); - aFrame->BuildDisplayListForStackingContext(&builder, dirtyRect, &list); + builder.SetDirtyRect(dirtyRect); + aFrame->BuildDisplayListForStackingContext(&builder, &list); } nsIAtom* frameType = aFrame->GetType(); diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 264b52b18..63f512af4 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -58,6 +58,7 @@ #include "nsNameSpaceManager.h" // for Pref-related rule management (bugs 22963,20760,31816) #include "nsFrame.h" #include "FrameLayerBuilder.h" +#include "FrameMetrics.h" // for ViewID #include "nsViewManager.h" #include "nsView.h" #include "nsCRTGlue.h" @@ -162,11 +163,12 @@ #endif -#include "mozilla/layers/CompositorBridgeChild.h" #include "GeckoProfiler.h" #include "gfxPlatform.h" #include "Layers.h" #include "LayerTreeInvalidation.h" +#include "ClientLayerManager.h" +#include "mozilla/layers/CompositorBridgeChild.h" #include "mozilla/css/ImageLoader.h" #include "mozilla/dom/DocumentTimeline.h" #include "mozilla/Preferences.h" @@ -221,6 +223,8 @@ using namespace mozilla::gfx; using namespace mozilla::layout; using PaintFrameFlags = nsLayoutUtils::PaintFrameFlags; +typedef FrameMetrics::ViewID ViewID; + CapturingContentInfo nsIPresShell::gCaptureInfo = { false /* mAllowed */, false /* mPointerLock */, false /* mRetargetToElement */, false /* mPreventDrag */ }; @@ -4894,8 +4898,8 @@ PresShell::CreateRangePaintInfo(nsIDOMRange* aRange, nsIFrame* frame = aNode->AsContent()->GetPrimaryFrame(); // XXX deal with frame being null due to display:contents for (; frame; frame = nsLayoutUtils::GetNextContinuationOrIBSplitSibling(frame)) { - frame->BuildDisplayListForStackingContext(&info->mBuilder, - frame->GetVisualOverflowRect(), &info->mList); + info->mBuilder.SetDirtyRect(frame->GetVisualOverflowRect()); + frame->BuildDisplayListForStackingContext(&info->mBuilder, &info->mList); } }; if (startParent->NodeType() == nsIDOMNode::TEXT_NODE) { diff --git a/layout/build/moz.build b/layout/build/moz.build index 360fe3c97..b98e8265a 100644 --- a/layout/build/moz.build +++ b/layout/build/moz.build @@ -76,16 +76,9 @@ elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android': if CONFIG['MOZ_WEBSPEECH']: LOCAL_INCLUDES += [ - '/dom/media/webspeech/recognition', '/dom/media/webspeech/synth', ] -if CONFIG['MOZ_WEBSPEECH_POCKETSPHINX']: - LOCAL_INCLUDES += [ - '/media/pocketsphinx', - '/media/sphinxbase', - ] - if CONFIG['MOZ_SECUREELEMENT']: LOCAL_INCLUDES += [ '/dom/secureelement', diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index 4455da122..8a078194c 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -91,12 +91,6 @@ #include "mozilla/OSFileConstants.h" #include "mozilla/Services.h" -#ifdef MOZ_WEBSPEECH_TEST_BACKEND -#include "mozilla/dom/FakeSpeechRecognitionService.h" -#endif -#ifdef MOZ_WEBSPEECH_POCKETSPHINX -#include "mozilla/dom/PocketSphinxSpeechRecognitionService.h" -#endif #ifdef MOZ_WEBSPEECH #include "mozilla/dom/nsSynthVoiceRegistry.h" #endif @@ -514,13 +508,6 @@ NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(AudioChannelService, AudioChannelServic NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(WebSocketEventService, WebSocketEventService::GetOrCreate) -#ifdef MOZ_WEBSPEECH_TEST_BACKEND -NS_GENERIC_FACTORY_CONSTRUCTOR(FakeSpeechRecognitionService) -#endif -#ifdef MOZ_WEBSPEECH_POCKETSPHINX -NS_GENERIC_FACTORY_CONSTRUCTOR(PocketSphinxSpeechRecognitionService) -#endif - NS_GENERIC_FACTORY_CONSTRUCTOR(nsContentSecurityManager) NS_GENERIC_FACTORY_CONSTRUCTOR(nsCSPContext) NS_GENERIC_FACTORY_CONSTRUCTOR(CSPService) @@ -676,12 +663,6 @@ NS_DEFINE_NAMED_CID(UDPSOCKETCHILD_CID); NS_DEFINE_NAMED_CID(NS_TIMESERVICE_CID); NS_DEFINE_NAMED_CID(NS_MEDIASTREAMCONTROLLERSERVICE_CID); NS_DEFINE_NAMED_CID(NS_MEDIAMANAGERSERVICE_CID); -#ifdef MOZ_WEBSPEECH_TEST_BACKEND -NS_DEFINE_NAMED_CID(NS_FAKE_SPEECH_RECOGNITION_SERVICE_CID); -#endif -#ifdef MOZ_WEBSPEECH_POCKETSPHINX -NS_DEFINE_NAMED_CID(NS_POCKETSPHINX_SPEECH_RECOGNITION_SERVICE_CID); -#endif #ifdef MOZ_WEBSPEECH NS_DEFINE_NAMED_CID(NS_SYNTHVOICEREGISTRY_CID); #endif @@ -912,12 +893,6 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = { { &kNS_AUDIOCHANNEL_SERVICE_CID, false, nullptr, AudioChannelServiceConstructor }, { &kNS_WEBSOCKETEVENT_SERVICE_CID, false, nullptr, WebSocketEventServiceConstructor }, { &kNS_FOCUSMANAGER_CID, false, nullptr, CreateFocusManager }, -#ifdef MOZ_WEBSPEECH_TEST_BACKEND - { &kNS_FAKE_SPEECH_RECOGNITION_SERVICE_CID, false, nullptr, FakeSpeechRecognitionServiceConstructor }, -#endif -#ifdef MOZ_WEBSPEECH_POCKETSPHINX - { &kNS_POCKETSPHINX_SPEECH_RECOGNITION_SERVICE_CID, false, nullptr, PocketSphinxSpeechRecognitionServiceConstructor }, -#endif #ifdef MOZ_WEBSPEECH { &kNS_SYNTHVOICEREGISTRY_CID, true, nullptr, nsSynthVoiceRegistryConstructor }, #endif @@ -1038,12 +1013,6 @@ static const mozilla::Module::ContractIDEntry kLayoutContracts[] = { { "@mozilla.org/audiochannel/service;1", &kNS_AUDIOCHANNEL_SERVICE_CID }, { "@mozilla.org/websocketevent/service;1", &kNS_WEBSOCKETEVENT_SERVICE_CID }, { "@mozilla.org/focus-manager;1", &kNS_FOCUSMANAGER_CID }, -#ifdef MOZ_WEBSPEECH_TEST_BACKEND - { NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX "fake", &kNS_FAKE_SPEECH_RECOGNITION_SERVICE_CID }, -#endif -#ifdef MOZ_WEBSPEECH_POCKETSPHINX - { NS_SPEECH_RECOGNITION_SERVICE_CONTRACTID_PREFIX "pocketsphinx-en-US", &kNS_POCKETSPHINX_SPEECH_RECOGNITION_SERVICE_CID }, -#endif #ifdef MOZ_WEBSPEECH { NS_SYNTHVOICEREGISTRY_CONTRACTID, &kNS_SYNTHVOICEREGISTRY_CID }, #endif diff --git a/layout/build/nsLayoutStatics.cpp b/layout/build/nsLayoutStatics.cpp index 124bcbf10..d71513268 100644 --- a/layout/build/nsLayoutStatics.cpp +++ b/layout/build/nsLayoutStatics.cpp @@ -273,7 +273,9 @@ nsLayoutStatics::Initialize() ProcessPriorityManager::Init(); +#ifdef MOZ_PERMISSIONS nsPermissionManager::ClearOriginDataObserverInit(); +#endif nsCookieService::AppClearDataObserverInit(); nsApplicationCacheService::AppClearDataObserverInit(); diff --git a/layout/forms/nsButtonFrameRenderer.cpp b/layout/forms/nsButtonFrameRenderer.cpp index 096031385..5372acb7f 100644 --- a/layout/forms/nsButtonFrameRenderer.cpp +++ b/layout/forms/nsButtonFrameRenderer.cpp @@ -263,8 +263,8 @@ nsButtonFrameRenderer::DisplayButton(nsDisplayListBuilder* aBuilder, nsDisplayButtonBoxShadowOuter(aBuilder, this)); } - nsRect buttonRect; - GetButtonRect(mFrame->GetRectRelativeToSelf(), buttonRect); + nsRect buttonRect = + mFrame->GetRectRelativeToSelf() + aBuilder->ToReferenceFrame(mFrame); nsDisplayBackgroundImage::AppendBackgroundItemsToTop( aBuilder, mFrame, buttonRect, aBackground); diff --git a/layout/forms/nsComboboxControlFrame.cpp b/layout/forms/nsComboboxControlFrame.cpp index 5a9438939..fd3db997a 100644 --- a/layout/forms/nsComboboxControlFrame.cpp +++ b/layout/forms/nsComboboxControlFrame.cpp @@ -1296,7 +1296,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; protected: @@ -1337,11 +1336,10 @@ nsComboboxDisplayFrame::Reflow(nsPresContext* aPresContext, void nsComboboxDisplayFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsDisplayListCollection set; - nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, set); + nsDisplayListCollection set(aBuilder); + nsBlockFrame::BuildDisplayList(aBuilder, set); // remove background items if parent frame is themed if (mComboBox->IsThemed()) { @@ -1549,13 +1547,8 @@ void nsDisplayComboboxFocus::Paint(nsDisplayListBuilder* aBuilder, void nsComboboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { -#ifdef NOISY - printf("%p paint at (%d, %d, %d, %d)\n", this, - aDirtyRect.x, aDirtyRect.y, aDirtyRect.width, aDirtyRect.height); -#endif if (aBuilder->IsForEventDelivery()) { // Don't allow children to receive events. @@ -1564,7 +1557,7 @@ nsComboboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } else { // REVIEW: Our in-flow child frames are inline-level so they will paint in our // content list, so we don't need to mess with layers. - nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsBlockFrame::BuildDisplayList(aBuilder, aLists); } // draw a focus indicator only when focus rings should be drawn diff --git a/layout/forms/nsComboboxControlFrame.h b/layout/forms/nsComboboxControlFrame.h index 22849e8d1..d83726d81 100644 --- a/layout/forms/nsComboboxControlFrame.h +++ b/layout/forms/nsComboboxControlFrame.h @@ -89,7 +89,6 @@ public: nsEventStatus* aEventStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; void PaintFocus(DrawTarget& aDrawTarget, nsPoint aPt); diff --git a/layout/forms/nsFieldSetFrame.cpp b/layout/forms/nsFieldSetFrame.cpp index fc9f0571b..a5177560d 100644 --- a/layout/forms/nsFieldSetFrame.cpp +++ b/layout/forms/nsFieldSetFrame.cpp @@ -153,7 +153,6 @@ nsDisplayFieldSetBorderBackground::ComputeInvalidationRegion(nsDisplayListBuilde void nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Paint our background and border in a special way. // REVIEW: We don't really need to check frame emptiness here; if it's empty, @@ -166,9 +165,11 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, nsDisplayBoxShadowOuter(aBuilder, this)); } + const nsRect rect = + VisualBorderRectRelativeToSelf() + aBuilder->ToReferenceFrame(this); + nsDisplayBackgroundImage::AppendBackgroundItemsToTop( - aBuilder, this, VisualBorderRectRelativeToSelf(), - aLists.BorderBackground(), + aBuilder, this, rect, aLists.BorderBackground(), /* aAllowWillPaintBorderOptimization = */ false); aLists.BorderBackground()->AppendNewToTop(new (aBuilder) @@ -180,10 +181,10 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } if (GetPrevInFlow()) { - DisplayOverflowContainers(aBuilder, aDirtyRect, aLists); + DisplayOverflowContainers(aBuilder, aLists); } - nsDisplayListCollection contentDisplayItems; + nsDisplayListCollection contentDisplayItems(aBuilder); if (nsIFrame* inner = GetInner()) { // Collect the inner frame's display items into their own collection. // We need to be calling BuildDisplayList on it before the legend in @@ -191,13 +192,13 @@ nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // legend. However, we want the inner frame's display items to be // after the legend's display items in z-order, so we need to save them // and append them later. - BuildDisplayListForChild(aBuilder, inner, aDirtyRect, contentDisplayItems); + BuildDisplayListForChild(aBuilder, inner, contentDisplayItems); } if (nsIFrame* legend = GetLegend()) { // The legend's background goes on our BlockBorderBackgrounds list because // it's a block child. nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds()); - BuildDisplayListForChild(aBuilder, legend, aDirtyRect, set); + BuildDisplayListForChild(aBuilder, legend, set); } // Put the inner frame's display items on the master list. Note that this // moves its border/background display items to our BorderBackground() list, diff --git a/layout/forms/nsFieldSetFrame.h b/layout/forms/nsFieldSetFrame.h index 5eb67c320..7c162515e 100644 --- a/layout/forms/nsFieldSetFrame.h +++ b/layout/forms/nsFieldSetFrame.h @@ -53,7 +53,6 @@ public: nscoord* aBaseline) const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; DrawResult PaintBorder(nsDisplayListBuilder* aBuilder, diff --git a/layout/forms/nsFileControlFrame.cpp b/layout/forms/nsFileControlFrame.cpp index 659371615..d60e4fb46 100644 --- a/layout/forms/nsFileControlFrame.cpp +++ b/layout/forms/nsFileControlFrame.cpp @@ -485,10 +485,9 @@ nsFileControlFrame::SetFormProperty(nsIAtom* aName, void nsFileControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInline(aBuilder, aLists); } #ifdef ACCESSIBILITY diff --git a/layout/forms/nsFileControlFrame.h b/layout/forms/nsFileControlFrame.h index 55c51d426..4f975af29 100644 --- a/layout/forms/nsFileControlFrame.h +++ b/layout/forms/nsFileControlFrame.h @@ -33,7 +33,6 @@ public: nsIFrame* aPrevInFlow) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; NS_DECL_QUERYFRAME diff --git a/layout/forms/nsFormControlFrame.h b/layout/forms/nsFormControlFrame.h index fd3e95d93..41bb1d9e8 100644 --- a/layout/forms/nsFormControlFrame.h +++ b/layout/forms/nsFormControlFrame.h @@ -40,7 +40,6 @@ public: // nsIFrame replacements virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override { DO_GLOBAL_REFLOW_COUNT_DSP("nsFormControlFrame"); DisplayBorderBackgroundOutline(aBuilder, aLists); diff --git a/layout/forms/nsGfxCheckboxControlFrame.cpp b/layout/forms/nsGfxCheckboxControlFrame.cpp index 061c92349..80009eff2 100644 --- a/layout/forms/nsGfxCheckboxControlFrame.cpp +++ b/layout/forms/nsGfxCheckboxControlFrame.cpp @@ -107,10 +107,9 @@ nsGfxCheckboxControlFrame::AccessibleType() //------------------------------------------------------------ void nsGfxCheckboxControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsFormControlFrame::BuildDisplayList(aBuilder, aLists); // Get current checked state through content model. if ((!IsChecked() && !IsIndeterminate()) || !IsVisibleForPainting(aBuilder)) diff --git a/layout/forms/nsGfxCheckboxControlFrame.h b/layout/forms/nsGfxCheckboxControlFrame.h index 70b8d8d6a..9234b5057 100644 --- a/layout/forms/nsGfxCheckboxControlFrame.h +++ b/layout/forms/nsGfxCheckboxControlFrame.h @@ -23,7 +23,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #ifdef ACCESSIBILITY diff --git a/layout/forms/nsGfxRadioControlFrame.cpp b/layout/forms/nsGfxRadioControlFrame.cpp index e4a35a998..9c1ec070b 100644 --- a/layout/forms/nsGfxRadioControlFrame.cpp +++ b/layout/forms/nsGfxRadioControlFrame.cpp @@ -70,10 +70,9 @@ PaintCheckedRadioButton(nsIFrame* aFrame, void nsGfxRadioControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsFormControlFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsFormControlFrame::BuildDisplayList(aBuilder, aLists); if (!IsVisibleForPainting(aBuilder)) return; diff --git a/layout/forms/nsGfxRadioControlFrame.h b/layout/forms/nsGfxRadioControlFrame.h index f91e6b94c..dd268dec1 100644 --- a/layout/forms/nsGfxRadioControlFrame.h +++ b/layout/forms/nsGfxRadioControlFrame.h @@ -25,7 +25,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; }; diff --git a/layout/forms/nsHTMLButtonControlFrame.cpp b/layout/forms/nsHTMLButtonControlFrame.cpp index c6d8e1c4f..495686cfc 100644 --- a/layout/forms/nsHTMLButtonControlFrame.cpp +++ b/layout/forms/nsHTMLButtonControlFrame.cpp @@ -98,7 +98,6 @@ nsHTMLButtonControlFrame::ShouldClipPaintingToBorderBox() void nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Clip to our border area for event hit testing. @@ -117,7 +116,7 @@ nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, mRenderer.DisplayButton(aBuilder, aLists.BorderBackground(), &onTop); } - nsDisplayListCollection set; + nsDisplayListCollection set(aBuilder); // Do not allow the child subtree to receive events. if (!isForEventDelivery) { @@ -132,7 +131,7 @@ nsHTMLButtonControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, clipState.ClipContainingBlockDescendants(rect, hasRadii ? radii : nullptr); } - BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), aDirtyRect, set, + BuildDisplayListForChild(aBuilder, mFrames.FirstChild(), set, DISPLAY_CHILD_FORCE_PSEUDO_STACKING_CONTEXT); // That should put the display items in set.Content() } diff --git a/layout/forms/nsHTMLButtonControlFrame.h b/layout/forms/nsHTMLButtonControlFrame.h index 432afa12c..8837daf74 100644 --- a/layout/forms/nsHTMLButtonControlFrame.h +++ b/layout/forms/nsHTMLButtonControlFrame.h @@ -27,7 +27,6 @@ public: NS_DECL_FRAMEARENA_HELPERS virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index cc5f37f9a..7bd356a22 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -155,7 +155,6 @@ nsListControlFrame::DestroyFrom(nsIFrame* aDestructRoot) void nsListControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // We allow visibility:hidden <select>s to contain visible options. @@ -180,7 +179,7 @@ nsListControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, mLastDropdownBackstopColor)); } - nsHTMLScrollFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsHTMLScrollFrame::BuildDisplayList(aBuilder, aLists); } /** diff --git a/layout/forms/nsListControlFrame.h b/layout/forms/nsListControlFrame.h index 47f033a9b..d8df9ebd6 100644 --- a/layout/forms/nsListControlFrame.h +++ b/layout/forms/nsListControlFrame.h @@ -81,7 +81,6 @@ public: virtual void DestroyFrom(nsIFrame* aDestructRoot) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsContainerFrame* GetContentInsertionFrame() override; diff --git a/layout/forms/nsProgressFrame.cpp b/layout/forms/nsProgressFrame.cpp index 2445defd3..1e3519f0e 100644 --- a/layout/forms/nsProgressFrame.cpp +++ b/layout/forms/nsProgressFrame.cpp @@ -101,10 +101,9 @@ NS_QUERYFRAME_TAIL_INHERITING(nsContainerFrame) void nsProgressFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInline(aBuilder, aLists); } void diff --git a/layout/forms/nsProgressFrame.h b/layout/forms/nsProgressFrame.h index 01465ff7c..9cc72612f 100644 --- a/layout/forms/nsProgressFrame.h +++ b/layout/forms/nsProgressFrame.h @@ -32,7 +32,6 @@ public: virtual void DestroyFrom(nsIFrame* aDestructRoot) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Reflow(nsPresContext* aCX, diff --git a/layout/forms/nsRangeFrame.cpp b/layout/forms/nsRangeFrame.cpp index 7590da066..9370acb87 100644 --- a/layout/forms/nsRangeFrame.cpp +++ b/layout/forms/nsRangeFrame.cpp @@ -259,7 +259,6 @@ nsDisplayRangeFocusRing::Paint(nsDisplayListBuilder* aBuilder, void nsRangeFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (IsThemed()) { @@ -274,10 +273,10 @@ nsRangeFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* thumb = mThumbDiv->GetPrimaryFrame(); if (thumb) { nsDisplayListSet set(aLists, aLists.Content()); - BuildDisplayListForChild(aBuilder, thumb, aDirtyRect, set, DISPLAY_CHILD_INLINE); + BuildDisplayListForChild(aBuilder, thumb, set, DISPLAY_CHILD_INLINE); } } else { - BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInline(aBuilder, aLists); } // Draw a focus outline if appropriate: diff --git a/layout/forms/nsRangeFrame.h b/layout/forms/nsRangeFrame.h index 8a2d34a40..b913b3002 100644 --- a/layout/forms/nsRangeFrame.h +++ b/layout/forms/nsRangeFrame.h @@ -43,7 +43,6 @@ public: virtual void DestroyFrom(nsIFrame* aDestructRoot) override; void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Reflow(nsPresContext* aPresContext, diff --git a/layout/forms/nsSelectsAreaFrame.cpp b/layout/forms/nsSelectsAreaFrame.cpp index dd613ae9f..d9ea7cd95 100644 --- a/layout/forms/nsSelectsAreaFrame.cpp +++ b/layout/forms/nsSelectsAreaFrame.cpp @@ -126,16 +126,15 @@ public: void nsSelectsAreaFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!aBuilder->IsForEventDelivery()) { - BuildDisplayListInternal(aBuilder, aDirtyRect, aLists); + BuildDisplayListInternal(aBuilder, aLists); return; } - nsDisplayListCollection set; - BuildDisplayListInternal(aBuilder, aDirtyRect, set); + nsDisplayListCollection set(aBuilder); + BuildDisplayListInternal(aBuilder, set); nsOptionEventGrabberWrapper wrapper; wrapper.WrapLists(aBuilder, this, set, aLists); @@ -143,10 +142,9 @@ nsSelectsAreaFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, void nsSelectsAreaFrame::BuildDisplayListInternal(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsBlockFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsBlockFrame::BuildDisplayList(aBuilder, aLists); nsListControlFrame* listFrame = GetEnclosingListFrame(this); if (listFrame && listFrame->IsFocused()) { diff --git a/layout/forms/nsSelectsAreaFrame.h b/layout/forms/nsSelectsAreaFrame.h index 3aac8a837..9b0a5b723 100644 --- a/layout/forms/nsSelectsAreaFrame.h +++ b/layout/forms/nsSelectsAreaFrame.h @@ -18,11 +18,9 @@ public: nsFrameState aFlags); virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; void BuildDisplayListInternal(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); virtual void Reflow(nsPresContext* aCX, diff --git a/layout/forms/nsTextControlFrame.cpp b/layout/forms/nsTextControlFrame.cpp index a65e5b972..fa64e3937 100644 --- a/layout/forms/nsTextControlFrame.cpp +++ b/layout/forms/nsTextControlFrame.cpp @@ -1434,7 +1434,6 @@ nsTextControlFrame::PeekOffset(nsPeekOffsetStruct *aPos) void nsTextControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { /* @@ -1462,7 +1461,7 @@ nsTextControlFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // placeholder has to be visible. if (kid->GetContent() != txtCtrl->GetPlaceholderNode() || txtCtrl->GetPlaceholderVisibility()) { - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, set, 0); + BuildDisplayListForChild(aBuilder, kid, set, 0); } kid = kid->GetNextSibling(); } diff --git a/layout/forms/nsTextControlFrame.h b/layout/forms/nsTextControlFrame.h index 7fa39c5fb..620cc92b9 100644 --- a/layout/forms/nsTextControlFrame.h +++ b/layout/forms/nsTextControlFrame.h @@ -127,7 +127,6 @@ public: nsFrameList& aChildList) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual mozilla::dom::Element* diff --git a/layout/generic/CSSAlignUtils.h b/layout/generic/CSSAlignUtils.h index 3693038b2..a258f4103 100644 --- a/layout/generic/CSSAlignUtils.h +++ b/layout/generic/CSSAlignUtils.h @@ -9,6 +9,7 @@ #define mozilla_CSSAlignUtils_h #include "mozilla/WritingModes.h" +#include "ReflowInput.h" namespace mozilla { diff --git a/layout/generic/ReflowOutput.cpp b/layout/generic/ReflowOutput.cpp index e64e41dc5..1c61484e7 100644 --- a/layout/generic/ReflowOutput.cpp +++ b/layout/generic/ReflowOutput.cpp @@ -8,6 +8,8 @@ #include "mozilla/ReflowOutput.h" #include "mozilla/ReflowInput.h" +using namespace mozilla; + void nsOverflowAreas::UnionWith(const nsOverflowAreas& aOther) { diff --git a/layout/generic/RubyUtils.h b/layout/generic/RubyUtils.h index 8c9545f70..9bba89d0b 100644 --- a/layout/generic/RubyUtils.h +++ b/layout/generic/RubyUtils.h @@ -10,6 +10,7 @@ #include "nsTArray.h" #include "nsGkAtoms.h" #include "nsCSSAnonBoxes.h" +#include "nsIFrame.h" #define RTC_ARRAY_SIZE 1 diff --git a/layout/generic/ScrollSnap.h b/layout/generic/ScrollSnap.h index a2877564d..37609017b 100644 --- a/layout/generic/ScrollSnap.h +++ b/layout/generic/ScrollSnap.h @@ -6,6 +6,8 @@ #ifndef mozilla_layout_ScrollSnap_h_ #define mozilla_layout_ScrollSnap_h_ +#include "nsIScrollableFrame.h" + namespace mozilla { namespace layers { diff --git a/layout/generic/moz.build b/layout/generic/moz.build index 0fe98afec..ad186ef7a 100644 --- a/layout/generic/moz.build +++ b/layout/generic/moz.build @@ -123,7 +123,7 @@ EXPORTS.mozilla.layout += [ 'FrameChildList.h', ] -UNIFIED_SOURCES += [ +SOURCES += [ 'AsyncScrollBase.cpp', 'BlockReflowInput.cpp', 'CSSAlignUtils.cpp', @@ -157,9 +157,11 @@ UNIFIED_SOURCES += [ 'nsIntervalSet.cpp', 'nsLeafFrame.cpp', 'nsLineBox.cpp', + 'nsLineLayout.cpp', 'nsPageContentFrame.cpp', 'nsPageFrame.cpp', 'nsPlaceholderFrame.cpp', + 'nsPluginFrame.cpp', 'nsRubyBaseContainerFrame.cpp', 'nsRubyBaseFrame.cpp', 'nsRubyContentFrame.cpp', @@ -185,13 +187,6 @@ UNIFIED_SOURCES += [ 'TextOverflow.cpp', ] -# nsLineLayout.cpp needs to be built separately because it uses plarena.h. -# nsPluginFrame.cpp needs to be built separately because of name clashes in the OS X headers. -SOURCES += [ - 'nsLineLayout.cpp', - 'nsPluginFrame.cpp', -] - include('/ipc/chromium/chromium-config.mozbuild') FINAL_LIBRARY = 'xul' diff --git a/layout/generic/nsAbsoluteContainingBlock.cpp b/layout/generic/nsAbsoluteContainingBlock.cpp index e3c847d01..068681692 100644 --- a/layout/generic/nsAbsoluteContainingBlock.cpp +++ b/layout/generic/nsAbsoluteContainingBlock.cpp @@ -18,6 +18,7 @@ #include "nsPresContext.h" #include "nsCSSFrameConstructor.h" #include "nsGridContainerFrame.h" +#include "nsPlaceholderFrame.h" #include "mozilla/Sprintf.h" diff --git a/layout/generic/nsBRFrame.cpp b/layout/generic/nsBRFrame.cpp index 057210350..08c0fe3dd 100644 --- a/layout/generic/nsBRFrame.cpp +++ b/layout/generic/nsBRFrame.cpp @@ -6,6 +6,7 @@ /* rendering object for HTML <br> elements */ #include "nsCOMPtr.h" +#include "nsContainerFrame.h" #include "nsFontMetrics.h" #include "nsFrame.h" #include "nsPresContext.h" diff --git a/layout/generic/nsBackdropFrame.cpp b/layout/generic/nsBackdropFrame.cpp index 687c5b2e3..ae847f460 100644 --- a/layout/generic/nsBackdropFrame.cpp +++ b/layout/generic/nsBackdropFrame.cpp @@ -39,7 +39,6 @@ nsBackdropFrame::GetParentStyleContext(nsIFrame** aProviderFrame) const /* virtual */ void nsBackdropFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DO_GLOBAL_REFLOW_COUNT_DSP("nsBackdropFrame"); diff --git a/layout/generic/nsBackdropFrame.h b/layout/generic/nsBackdropFrame.h index 74d366bef..f3159da31 100644 --- a/layout/generic/nsBackdropFrame.h +++ b/layout/generic/nsBackdropFrame.h @@ -27,7 +27,6 @@ public: virtual nsStyleContext* GetParentStyleContext(nsIFrame** aProviderFrame) const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual mozilla::LogicalSize ComputeAutoSize(nsRenderingContext* aRenderingContext, diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp index a37bfc06b..57838207d 100644 --- a/layout/generic/nsBlockFrame.cpp +++ b/layout/generic/nsBlockFrame.cpp @@ -6527,13 +6527,13 @@ static void DebugOutputDrawLine(int32_t aDepth, nsLineBox* aLine, bool aDrawn) { static void DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea, - const nsRect& aDirtyRect, nsBlockFrame::LineIterator& aLine, + nsBlockFrame::LineIterator& aLine, int32_t aDepth, int32_t& aDrawnLines, const nsDisplayListSet& aLists, nsBlockFrame* aFrame, TextOverflow* aTextOverflow) { // If the line's combined area (which includes child frames that // stick outside of the line's bounding box or our bounding box) // intersects the dirty rect then paint the line. - bool intersect = aLineArea.Intersects(aDirtyRect); + bool intersect = aLineArea.Intersects(aBuilder->GetDirtyRect()); #ifdef DEBUG if (nsBlockFrame::gLamePaintMetrics) { aDrawnLines++; @@ -6556,7 +6556,7 @@ DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea, // Collect our line's display items in a temporary nsDisplayListCollection, // so that we can apply any "text-overflow" clipping to the entire collection // without affecting previous lines. - nsDisplayListCollection collection; + nsDisplayListCollection collection(aBuilder); // Block-level child backgrounds go on the blockBorderBackgrounds list ... // Inline-level child backgrounds go on the regular child content list. @@ -6568,8 +6568,7 @@ DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea, nsIFrame* kid = aLine->mFirstChild; int32_t n = aLine->GetChildCount(); while (--n >= 0) { - aFrame->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, - childLists, flags); + aFrame->BuildDisplayListForChild(aBuilder, kid, childLists, flags); kid = kid->GetNextSibling(); } @@ -6582,13 +6581,13 @@ DisplayLine(nsDisplayListBuilder* aBuilder, const nsRect& aLineArea, void nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { int32_t drawnLines; // Will only be used if set (gLamePaintMetrics). int32_t depth = 0; #ifdef DEBUG if (gNoisyDamageRepair) { + nsRect dirty = aBuilder->GetDirtyRect(); depth = GetDepth(); nsRect ca; ::ComputeVisualOverflowArea(mLines, mRect.width, mRect.height, ca); @@ -6596,7 +6595,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, ListTag(stdout); printf(": bounds=%d,%d,%d,%d dirty(absolute)=%d,%d,%d,%d ca=%d,%d,%d,%d\n", mRect.x, mRect.y, mRect.width, mRect.height, - aDirtyRect.x, aDirtyRect.y, aDirtyRect.width, aDirtyRect.height, + dirty.x, dirty.y, dirty.width, dirty.height, ca.x, ca.y, ca.width, ca.height); } PRTime start = 0; // Initialize these variables to silence the compiler. @@ -6609,21 +6608,21 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, DisplayBorderBackgroundOutline(aBuilder, aLists); if (GetPrevInFlow()) { - DisplayOverflowContainers(aBuilder, aDirtyRect, aLists); + DisplayOverflowContainers(aBuilder, aLists); for (nsIFrame* f : mFloats) { if (f->GetStateBits() & NS_FRAME_IS_PUSHED_FLOAT) - BuildDisplayListForChild(aBuilder, f, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, f, aLists); } } - aBuilder->MarkFramesForDisplayList(this, mFloats, aDirtyRect); + aBuilder->MarkFramesForDisplayList(this, mFloats); // Prepare for text-overflow processing. UniquePtr<TextOverflow> textOverflow( TextOverflow::WillProcessLines(aBuilder, this)); // We'll collect our lines' display items here, & then append this to aLists. - nsDisplayListCollection linesDisplayListCollection; + nsDisplayListCollection linesDisplayListCollection(aBuilder); // Don't use the line cursor if we might have a descendant placeholder ... // it might skip lines that contain placeholders but don't themselves @@ -6633,7 +6632,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // approximate it by checking it on |this|; if it's true for any // frame in our child list, it's also true for |this|. nsLineBox* cursor = aBuilder->ShouldDescendIntoFrame(this) ? - nullptr : GetFirstLineContaining(aDirtyRect.y); + nullptr : GetFirstLineContaining(aBuilder->GetDirtyRect().y); LineIterator line_end = LinesEnd(); if (cursor) { @@ -6644,10 +6643,10 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, if (!lineArea.IsEmpty()) { // Because we have a cursor, the combinedArea.ys are non-decreasing. // Once we've passed aDirtyRect.YMost(), we can never see it again. - if (lineArea.y >= aDirtyRect.YMost()) { + if (lineArea.y >= aBuilder->GetDirtyRect().YMost()) { break; } - DisplayLine(aBuilder, lineArea, aDirtyRect, line, depth, drawnLines, + DisplayLine(aBuilder, lineArea, line, depth, drawnLines, linesDisplayListCollection, this, textOverflow.get()); } } @@ -6660,7 +6659,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, line != line_end; ++line) { nsRect lineArea = line->GetVisualOverflowArea(); - DisplayLine(aBuilder, lineArea, aDirtyRect, line, depth, drawnLines, + DisplayLine(aBuilder, lineArea, line, depth, drawnLines, linesDisplayListCollection, this, textOverflow.get()); if (!lineArea.IsEmpty()) { if (lineArea.y < lastY @@ -6690,7 +6689,7 @@ nsBlockFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, if (HasOutsideBullet()) { // Display outside bullets manually nsIFrame* bullet = GetOutsideBullet(); - BuildDisplayListForChild(aBuilder, bullet, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, bullet, aLists); } #ifdef DEBUG diff --git a/layout/generic/nsBlockFrame.h b/layout/generic/nsBlockFrame.h index f515cc26f..4775fa626 100644 --- a/layout/generic/nsBlockFrame.h +++ b/layout/generic/nsBlockFrame.h @@ -139,7 +139,6 @@ public: virtual nsSplittableType GetSplittableType() const override; virtual bool IsFloatContainingBlock() const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsIAtom* GetType() const override; virtual bool IsFrameOfType(uint32_t aFlags) const override diff --git a/layout/generic/nsBulletFrame.cpp b/layout/generic/nsBulletFrame.cpp index f6595e8f6..db9a70aff 100644 --- a/layout/generic/nsBulletFrame.cpp +++ b/layout/generic/nsBulletFrame.cpp @@ -274,7 +274,6 @@ void nsDisplayBullet::Paint(nsDisplayListBuilder* aBuilder, void nsBulletFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) diff --git a/layout/generic/nsBulletFrame.h b/layout/generic/nsBulletFrame.h index e35ed0923..30f4e23cd 100644 --- a/layout/generic/nsBulletFrame.h +++ b/layout/generic/nsBulletFrame.h @@ -68,7 +68,6 @@ public: // nsIFrame virtual void DestroyFrom(nsIFrame* aDestructRoot) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsIAtom* GetType() const override; virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) override; diff --git a/layout/generic/nsCanvasFrame.cpp b/layout/generic/nsCanvasFrame.cpp index 1a8812fb7..31baa040c 100644 --- a/layout/generic/nsCanvasFrame.cpp +++ b/layout/generic/nsCanvasFrame.cpp @@ -410,11 +410,10 @@ public: void nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (GetPrevInFlow()) { - DisplayOverflowContainers(aBuilder, aDirtyRect, aLists); + DisplayOverflowContainers(aBuilder, aLists); } // Force a background to be shown. We may have a background propagated to us, @@ -488,7 +487,7 @@ nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, for (nsIFrame* kid : PrincipalChildList()) { // Put our child into its own pseudo-stack. - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, kid, aLists); } #ifdef DEBUG_CANVAS_FOCUS @@ -504,7 +503,7 @@ nsCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, docShell->GetHasFocus(&hasFocus); printf("%p - nsCanvasFrame::Paint R:%d,%d,%d,%d DR: %d,%d,%d,%d\n", this, mRect.x, mRect.y, mRect.width, mRect.height, - aDirtyRect.x, aDirtyRect.y, aDirtyRect.width, aDirtyRect.height); + dirty.x, dirty.y, dirty.width, dirty.height); } printf("%p - Focus: %s c: %p DoPaint:%s\n", docShell.get(), hasFocus?"Y":"N", focusContent.get(), mDoPaintFocus?"Y":"N"); diff --git a/layout/generic/nsCanvasFrame.h b/layout/generic/nsCanvasFrame.h index 8bd9dbf79..8c59f18c0 100644 --- a/layout/generic/nsCanvasFrame.h +++ b/layout/generic/nsCanvasFrame.h @@ -107,7 +107,6 @@ public: NS_IMETHOD SetHasFocus(bool aHasFocus); virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; void PaintFocus(mozilla::gfx::DrawTarget* aRenderingContext, nsPoint aPt); diff --git a/layout/generic/nsColumnSetFrame.cpp b/layout/generic/nsColumnSetFrame.cpp index 6ea15d4d2..90d425ccf 100644 --- a/layout/generic/nsColumnSetFrame.cpp +++ b/layout/generic/nsColumnSetFrame.cpp @@ -1115,7 +1115,6 @@ nsColumnSetFrame::Reflow(nsPresContext* aPresContext, void nsColumnSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DisplayBorderBackgroundOutline(aBuilder, aLists); @@ -1128,7 +1127,7 @@ nsColumnSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // Our children won't have backgrounds so it doesn't matter where we put them. for (nsFrameList::Enumerator e(mFrames); !e.AtEnd(); e.Next()) { - BuildDisplayListForChild(aBuilder, e.get(), aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, e.get(), aLists); } } diff --git a/layout/generic/nsColumnSetFrame.h b/layout/generic/nsColumnSetFrame.h index db44183d6..4195742c2 100644 --- a/layout/generic/nsColumnSetFrame.h +++ b/layout/generic/nsColumnSetFrame.h @@ -67,7 +67,6 @@ public: } virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsIAtom* GetType() const override; diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp index 3ff6c9bf1..47afed9de 100644 --- a/layout/generic/nsContainerFrame.cpp +++ b/layout/generic/nsContainerFrame.cpp @@ -29,10 +29,12 @@ #include "nsBoxLayoutState.h" #include "nsCSSFrameConstructor.h" #include "nsBlockFrame.h" +#include "nsBulletFrame.h" #include "nsPlaceholderFrame.h" #include "mozilla/AutoRestore.h" #include "nsIFrameInlines.h" #include "nsPrintfCString.h" +#include "nsAttrValueInlines.h" #include <algorithm> using namespace mozilla; @@ -329,17 +331,15 @@ nsContainerFrame::GetChildLists(nsTArray<ChildList>* aLists) const void nsContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DisplayBorderBackgroundOutline(aBuilder, aLists); - BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists); + BuildDisplayListForNonBlockChildren(aBuilder, aLists); } void nsContainerFrame::BuildDisplayListForNonBlockChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists, uint32_t aFlags) { @@ -348,7 +348,7 @@ nsContainerFrame::BuildDisplayListForNonBlockChildren(nsDisplayListBuilder* aB nsDisplayListSet set(aLists, aLists.Content()); // The children should be in content order while (kid) { - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, set, aFlags); + BuildDisplayListForChild(aBuilder, kid, set, aFlags); kid = kid->GetNextSibling(); } } @@ -1338,13 +1338,12 @@ nsContainerFrame::ReflowOverflowContainerChildren(nsPresContext* aPres void nsContainerFrame::DisplayOverflowContainers(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { nsFrameList* overflowconts = GetPropTableFrames(OverflowContainersProperty()); if (overflowconts) { for (nsIFrame* frame : *overflowconts) { - BuildDisplayListForChild(aBuilder, frame, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, frame, aLists); } } } diff --git a/layout/generic/nsContainerFrame.h b/layout/generic/nsContainerFrame.h index ddf993d91..e3cc54b0b 100644 --- a/layout/generic/nsContainerFrame.h +++ b/layout/generic/nsContainerFrame.h @@ -437,7 +437,6 @@ public: * Add overflow containers to the display list */ void DisplayOverflowContainers(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); /** @@ -450,7 +449,6 @@ public: * to emulate what nsContainerFrame::Paint did. */ virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; static void PlaceFrameView(nsIFrame* aFrame) @@ -576,7 +574,6 @@ protected: * display items) go into the Content() list. */ void BuildDisplayListForNonBlockChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists, uint32_t aFlags = 0); @@ -585,11 +582,9 @@ protected: * Intended as a convenience for derived classes. */ void BuildDisplayListForInline(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DisplayBorderBackgroundOutline(aBuilder, aLists); - BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists, - DISPLAY_CHILD_INLINE); + BuildDisplayListForNonBlockChildren(aBuilder, aLists, DISPLAY_CHILD_INLINE); } diff --git a/layout/generic/nsFirstLetterFrame.cpp b/layout/generic/nsFirstLetterFrame.cpp index 980e1e9be..426e3caa7 100644 --- a/layout/generic/nsFirstLetterFrame.cpp +++ b/layout/generic/nsFirstLetterFrame.cpp @@ -50,10 +50,9 @@ nsFirstLetterFrame::GetType() const void nsFirstLetterFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInline(aBuilder, aLists); } void diff --git a/layout/generic/nsFirstLetterFrame.h b/layout/generic/nsFirstLetterFrame.h index 40e4ef0cf..c8d416a85 100644 --- a/layout/generic/nsFirstLetterFrame.h +++ b/layout/generic/nsFirstLetterFrame.h @@ -20,7 +20,6 @@ public: explicit nsFirstLetterFrame(nsStyleContext* aContext) : nsContainerFrame(aContext) {} virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Init(nsIContent* aContent, diff --git a/layout/generic/nsFlexContainerFrame.cpp b/layout/generic/nsFlexContainerFrame.cpp index 94bce1e7a..69200117b 100644 --- a/layout/generic/nsFlexContainerFrame.cpp +++ b/layout/generic/nsFlexContainerFrame.cpp @@ -2433,7 +2433,6 @@ GetDisplayFlagsForFlexItem(nsIFrame* aFrame) void nsFlexContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // XXXdholbert hacky temporary band-aid for bug 1059138: Trivially pass this @@ -2452,7 +2451,7 @@ nsFlexContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // the BlockBorderBackgrounds list. nsDisplayListSet childLists(aLists, aLists.BlockBorderBackgrounds()); for (nsIFrame* childFrame : mFrames) { - BuildDisplayListForChild(aBuilder, childFrame, aDirtyRect, childLists, + BuildDisplayListForChild(aBuilder, childFrame, childLists, GetDisplayFlagsForFlexItem(childFrame)); } } diff --git a/layout/generic/nsFlexContainerFrame.h b/layout/generic/nsFlexContainerFrame.h index 459ae8e20..ac2cc72f6 100644 --- a/layout/generic/nsFlexContainerFrame.h +++ b/layout/generic/nsFlexContainerFrame.h @@ -64,7 +64,6 @@ public: nsIFrame* aPrevInFlow) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; void MarkIntrinsicISizesDirty() override; diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index b8b1f312e..07cdbd7e3 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -53,6 +53,7 @@ #include "nsGkAtoms.h" #include "nsHtml5Atoms.h" #include "nsCSSAnonBoxes.h" +#include "nsGenericHTMLElement.h" #include "nsFrameTraversal.h" #include "nsRange.h" @@ -1794,6 +1795,13 @@ void nsFrame::DisplayOutlineUnconditional(nsDisplayListBuilder* aBuilder, const nsDisplayListSet& aLists) { + // Per https://drafts.csswg.org/css-tables-3/#global-style-overrides: + // "All css properties of table-column and table-column-group boxes are + // ignored, except when explicitly specified by this specification." + // CSS outlines fall into this category, so we skip them on these boxes. + + MOZ_ASSERT(GetType() != nsGkAtoms::tableColGroupFrame && GetType() != nsGkAtoms::tableColFrame); + if (StyleOutline()->mOutlineStyle == NS_STYLE_BORDER_STYLE_NONE) { return; } @@ -1814,7 +1822,7 @@ nsFrame::DisplayOutline(nsDisplayListBuilder* aBuilder, void nsIFrame::DisplayCaret(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, nsDisplayList* aList) + nsDisplayList* aList) { if (!IsVisibleForPainting(aBuilder)) return; @@ -1840,7 +1848,9 @@ nsFrame::DisplayBackgroundUnconditional(nsDisplayListBuilder* aBuilder, if (aBuilder->IsForEventDelivery() || aForceBackground || !StyleBackground()->IsTransparent() || StyleDisplay()->mAppearance) { return nsDisplayBackgroundImage::AppendBackgroundItemsToTop( - aBuilder, this, GetRectRelativeToSelf(), aLists.BorderBackground()); + aBuilder, this, + GetRectRelativeToSelf() + aBuilder->ToReferenceFrame(this), + aLists.BorderBackground()); } return false; } @@ -1873,7 +1883,9 @@ nsFrame::DisplayBorderBackgroundOutline(nsDisplayListBuilder* aBuilder, // If there's a themed background, we should not create a border item. // It won't be rendered. - if (!bgIsThemed && StyleBorder()->HasBorder()) { + // Don't paint borders for tables here, since they paint them in a different + // order. + if (!bgIsThemed && StyleBorder()->HasBorder() && GetType() != nsGkAtoms::tableFrame) { aLists.BorderBackground()->AppendNewToTop(new (aBuilder) nsDisplayBorder(aBuilder, this)); } @@ -2073,13 +2085,12 @@ ItemParticipatesIn3DContext(nsIFrame* aAncestor, nsDisplayItem* aItem) static void WrapSeparatorTransform(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, - nsRect& aDirtyRect, nsDisplayList* aSource, nsDisplayList* aTarget, int aIndex) { if (!aSource->IsEmpty()) { nsDisplayTransform *sepIdItem = new (aBuilder) nsDisplayTransform(aBuilder, aFrame, aSource, - aDirtyRect, Matrix4x4(), aIndex); + aBuilder->GetDirtyRect(), Matrix4x4(), aIndex); sepIdItem->SetNoExtendContext(); aTarget->AppendToTop(sepIdItem); } @@ -2087,7 +2098,6 @@ WrapSeparatorTransform(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, void nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, nsDisplayList* aList) { if (GetStateBits() & NS_FRAME_TOO_DEEP_IN_FRAME_TREE) return; @@ -2123,25 +2133,27 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, aBuilder->AddToWillChangeBudget(this, GetSize()); } - bool extend3DContext = Extend3DContext(); + const bool isTransformed = IsTransformed(); + const bool hasPerspective = isTransformed && HasPerspective(); + const bool extend3DContext = Extend3DContext(); + const bool combines3DTransformWithAncestors = + (extend3DContext || isTransformed) && Combines3DTransformWithAncestors(); + const bool childrenHavePerspective = ChildrenHavePerspective(); Maybe<nsDisplayListBuilder::AutoPreserves3DContext> autoPreserves3DContext; - if (extend3DContext && !Combines3DTransformWithAncestors()) { + if (extend3DContext && !combines3DTransformWithAncestors) { // Start a new preserves3d context to keep informations on // nsDisplayListBuilder. autoPreserves3DContext.emplace(aBuilder); // Save dirty rect on the builder to avoid being distorted for // multiple transforms along the chain. - aBuilder->SetPreserves3DDirtyRect(aDirtyRect); + aBuilder->SavePreserves3DRects(); } // For preserves3d, use the dirty rect already installed on the // builder, since aDirtyRect maybe distorted for transforms along // the chain. - nsRect dirtyRect = aDirtyRect; + nsRect dirtyRect = aBuilder->GetDirtyRect(); - bool inTransform = aBuilder->IsInTransform(); - bool isTransformed = IsTransformed(); - bool hasPerspective = HasPerspective(); // reset blend mode so we can keep track if this stacking context needs have // a nsDisplayBlendContainer. Set the blend mode back when the routine exits // so we keep track if the parent stacking context needs a container too. @@ -2149,6 +2161,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, aBuilder->SetContainsBlendMode(false); nsRect dirtyRectOutsideTransform = dirtyRect; + bool inTransform = aBuilder->IsInTransform(); if (isTransformed) { const nsRect overflow = GetVisualOverflowRectRelativeToSelf(); if (nsDisplayTransform::ShouldPrerenderTransformedContent(aBuilder, @@ -2161,8 +2174,8 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, // If we're in preserve-3d then grab the dirty rect that was given to the root // and transform using the combined transform. - if (Combines3DTransformWithAncestors()) { - dirtyRect = aBuilder->GetPreserves3DDirtyRect(this); + if (combines3DTransformWithAncestors) { + dirtyRect = aBuilder->GetPreserves3DRects(); } nsRect untransformedDirtyRect; @@ -2270,19 +2283,19 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, clipState.EnterStackingContextContents(clearClip); - nsDisplayListCollection set; + nsDisplayListCollection set(aBuilder); { DisplayListClipState::AutoSaveRestore nestedClipState(aBuilder); nsDisplayListBuilder::AutoInTransformSetter inTransformSetter(aBuilder, inTransform); nsDisplayListBuilder::AutoSaveRestorePerspectiveIndex - perspectiveIndex(aBuilder, this); + perspectiveIndex(aBuilder, childrenHavePerspective); CheckForApzAwareEventHandlers(aBuilder, this); Maybe<nsRect> clipPropClip = GetClipPropClipRect(disp, effects, GetSize()); if (clipPropClip) { - dirtyRect.IntersectRect(dirtyRect, *clipPropClip); + aBuilder->IntersectDirtyRect(*clipPropClip); nestedClipState.ClipContentDescendants( *clipPropClip + aBuilder->ToReferenceFrame(this)); } @@ -2295,7 +2308,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, aBuilder->MarkPreserve3DFramesForDisplayList(this); } - MarkAbsoluteFramesForDisplayList(aBuilder, dirtyRect); + MarkAbsoluteFramesForDisplayList(aBuilder); nsDisplayLayerEventRegions* eventRegions = nullptr; if (aBuilder->IsBuildingLayerEventRegions()) { @@ -2304,7 +2317,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, aBuilder->SetLayerEventRegions(eventRegions); } aBuilder->AdjustWindowDraggingRegion(this); - BuildDisplayList(aBuilder, dirtyRect, set); + BuildDisplayList(aBuilder, set); if (eventRegions) { // If the event regions item ended up empty, throw it away rather than // adding it to the display list. @@ -2410,7 +2423,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, clipState.ExitStackingContextContents(&containerItemScrollClip); } // Revert to the post-filter dirty rect. - buildingDisplayList.SetDirtyRect(dirtyRectOutsideSVGEffects); + aBuilder->SetDirtyRect(dirtyRectOutsideSVGEffects); // Skip all filter effects while generating glyph mask. if (usingFilter && !aBuilder->IsForGenerateGlyphMask()) { @@ -2475,8 +2488,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, while (nsDisplayItem* item = resultList.RemoveBottom()) { if (ItemParticipatesIn3DContext(this, item) && !item->GetClip().HasClip()) { // The frame of this item participates the same 3D context. - WrapSeparatorTransform(aBuilder, this, dirtyRect, - &nonparticipants, &participants, index++); + WrapSeparatorTransform(aBuilder, this, &nonparticipants, &participants, index++); participants.AppendToTop(item); } else { // The frame of the item doesn't participate the current @@ -2489,8 +2501,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, nonparticipants.AppendToTop(item); } } - WrapSeparatorTransform(aBuilder, this, dirtyRect, - &nonparticipants, &participants, index++); + WrapSeparatorTransform(aBuilder, this, &nonparticipants, &participants, index++); resultList.AppendToTop(&participants); } @@ -2501,7 +2512,7 @@ nsIFrame::BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, } // Revert to the dirtyrect coming in from the parent, without our transform // taken into account. - buildingDisplayList.SetDirtyRect(dirtyRectOutsideTransform); + aBuilder->SetDirtyRect(dirtyRectOutsideTransform); // Revert to the outer reference frame and offset because all display // items we create from now on are outside the transform. nsPoint toOuterReferenceFrame; @@ -2602,10 +2613,63 @@ WrapInWrapList(nsDisplayListBuilder* aBuilder, return item; } +static bool DescendIntoChild(nsDisplayListBuilder* aBuilder, + const nsIFrame* aChild, const nsRect& aDirty) { + if (aChild->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO) { + return true; + } + + // If the child is a scrollframe that we want to ignore, then we need + // to descend into it because its scrolled child may intersect the dirty + // area even if the scrollframe itself doesn't. + if (aChild == aBuilder->GetIgnoreScrollFrame()) { + return true; + } + + // There are cases where the "ignore scroll frame" on the builder is not set + // correctly, and so we additionally want to catch cases where the child is + // a root scrollframe and we are ignoring scrolling on the viewport. + if (aChild == aBuilder->GetPresShellIgnoreScrollFrame()) { + return true; + } + + const nsRect overflow = aChild->GetVisualOverflowRect(); + + if (aDirty.Intersects(overflow)) { + return true; + } + + if (aChild->IsFrameOfType(nsIFrame::eTablePart)) { + // Relative positioning and transforms can cause table parts to move, but we + // will still paint the backgrounds for their ancestor parts under them at + // their 'normal' position. That means that we must consider the overflow + // rects at both positions. + + // We convert the overflow rect into the nsTableFrame's coordinate + // space, applying the normal position offset at each step. Then we + // compare that against the builder's cached dirty rect in table + // coordinate space. + const nsIFrame* f = aChild; + nsRect normalPositionOverflowRelativeToTable = overflow; + + while (f->IsFrameOfType(nsIFrame::eTablePart)) { + normalPositionOverflowRelativeToTable += f->GetNormalPosition(); + f = f->GetParent(); + } + + nsDisplayTableBackgroundSet* tableBGs = aBuilder->GetTableBackgroundSet(); + if (tableBGs && + tableBGs->GetDirtyRect().Intersects(normalPositionOverflowRelativeToTable)) { + return true; + } + } + + return false; +} + void nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, nsIFrame* aChild, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists, uint32_t aFlags) { // If painting is restricted to just the background of the top level frame, @@ -2624,12 +2688,13 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, if (child->GetStateBits() & NS_FRAME_TOO_DEEP_IN_FRAME_TREE) return; - bool isSVG = (child->GetStateBits() & NS_FRAME_SVG_LAYOUT); + const bool isSVG = child->GetStateBits() & NS_FRAME_SVG_LAYOUT; // true if this is a real or pseudo stacking context bool pseudoStackingContext = (aFlags & DISPLAY_CHILD_FORCE_PSEUDO_STACKING_CONTEXT) != 0; - if (!isSVG && + if (!pseudoStackingContext && + !isSVG && (aFlags & DISPLAY_CHILD_INLINE) && !child->IsFrameOfType(eLineParticipant)) { // child is a non-inline frame in an inline context, i.e., @@ -2638,12 +2703,14 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, pseudoStackingContext = true; } - // dirty rect in child-relative coordinates - nsRect dirty = aDirtyRect - child->GetOffsetTo(this); - nsIAtom* childType = child->GetType(); nsDisplayListBuilder::OutOfFlowDisplayData* savedOutOfFlowData = nullptr; bool isPlaceholder = false; + + // dirty rect in child-relative coordinates + NS_ASSERTION(aBuilder->GetCurrentFrame() == this, "Wrong coord space!"); + nsRect dirty = aBuilder->GetDirtyRect() - child->GetOffsetTo(this); + if (childType == nsGkAtoms::placeholderFrame) { isPlaceholder = true; nsPlaceholderFrame* placeholder = static_cast<nsPlaceholderFrame*>(child); @@ -2690,35 +2757,10 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, !aChild->IsSelected()) { return; } - - if (aBuilder->GetIncludeAllOutOfFlows() && - (child->GetStateBits() & NS_FRAME_OUT_OF_FLOW)) { + if (aBuilder->GetIncludeAllOutOfFlows() && isPlaceholder) { dirty = child->GetVisualOverflowRect(); - } else if (!(child->GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO)) { - // No need to descend into child to catch placeholders for visible - // positioned stuff. So see if we can short-circuit frame traversal here. - - // We can stop if child's frame subtree's intersection with the - // dirty area is empty. - // If the child is a scrollframe that we want to ignore, then we need - // to descend into it because its scrolled child may intersect the dirty - // area even if the scrollframe itself doesn't. - // There are cases where the "ignore scroll frame" on the builder is not set - // correctly, and so we additionally want to catch cases where the child is - // a root scrollframe and we are ignoring scrolling on the viewport. - nsIPresShell* shell = PresContext()->PresShell(); - bool keepDescending = child == aBuilder->GetIgnoreScrollFrame() || - (shell->IgnoringViewportScrolling() && child == shell->GetRootScrollFrame()); - if (!keepDescending) { - nsRect childDirty; - if (!childDirty.IntersectRect(dirty, child->GetVisualOverflowRect())) - return; - // Usually we could set dirty to childDirty now but there's no - // benefit, and it can be confusing. It can especially confuse - // situations where we're going to ignore a scrollframe's clipping; - // we wouldn't want to clip the dirty area to the scrollframe's - // bounds in that case. - } + } else if (!DescendIntoChild(aBuilder, child, dirty)) { + return; } // XXX need to have inline-block and inline-table set pseudoStackingContext @@ -2742,7 +2784,7 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, const nsStyleDisplay* disp = child->StyleDisplay(); const nsStyleEffects* effects = child->StyleEffects(); const nsStylePosition* pos = child->StylePosition(); - bool isVisuallyAtomic = child->HasOpacity() + const bool isVisuallyAtomic = child->HasOpacity() || child->IsTransformed() // strictly speaking, 'perspective' doesn't require visual atomicity, // but the spec says it acts like the rest of these @@ -2750,28 +2792,28 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, || effects->mMixBlendMode != NS_STYLE_BLEND_NORMAL || nsSVGIntegrationUtils::UsingEffectsForFrame(child); - bool isPositioned = disp->IsAbsPosContainingBlock(child); - bool isStackingContext = + const bool isPositioned = disp->IsAbsPosContainingBlock(child); + const bool isStackingContext = (isPositioned && (disp->IsPositionForcingStackingContext() || pos->mZIndex.GetUnit() == eStyleUnit_Integer)) || (disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_STACKING_CONTEXT) || disp->mIsolation != NS_STYLE_ISOLATION_AUTO || isVisuallyAtomic || (aFlags & DISPLAY_CHILD_FORCE_STACKING_CONTEXT); - if (isVisuallyAtomic || isPositioned || (!isSVG && disp->IsFloating(child)) || - ((effects->mClipFlags & NS_STYLE_CLIP_RECT) && - IsSVGContentWithCSSClip(child)) || - disp->mIsolation != NS_STYLE_ISOLATION_AUTO || - (disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_STACKING_CONTEXT) || - (aFlags & DISPLAY_CHILD_FORCE_STACKING_CONTEXT)) { + if (pseudoStackingContext || isStackingContext || isPositioned || + (!isSVG && disp->IsFloating(child)) || + (isSVG && (effects->mClipFlags & NS_STYLE_CLIP_RECT) && + IsSVGContentWithCSSClip(child))) { // If you change this, also change IsPseudoStackingContextFromStyle() pseudoStackingContext = true; } + NS_ASSERTION(!isStackingContext || pseudoStackingContext, "Stacking contexts must also be pseudo-stacking-contexts"); nsDisplayListBuilder::AutoBuildingDisplayList buildingForChild(aBuilder, child, dirty, pseudoStackingContext); + DisplayListClipState::AutoClipMultiple clipState(aBuilder); CheckForApzAwareEventHandlers(aBuilder, child); @@ -2784,7 +2826,7 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, savedOutOfFlowData->mContainingBlockScrollClip); } else if (GetStateBits() & NS_FRAME_FORCE_DISPLAY_LIST_DESCEND_INTO && isPlaceholder) { - NS_ASSERTION(dirty.IsEmpty(), "should have empty dirty rect"); + NS_ASSERTION(dirty.IsEmpty(), "should have empty visible rect"); // Every item we build from now until we descent into an out of flow that // does have saved out of flow data should be invisible. This state gets // restored when AutoBuildingDisplayList gets out of scope. @@ -2820,18 +2862,18 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, // True stacking context. // For stacking contexts, BuildDisplayListForStackingContext handles // clipping and MarkAbsoluteFramesForDisplayList. - child->BuildDisplayListForStackingContext(aBuilder, dirty, &list); - aBuilder->DisplayCaret(child, dirty, &list); + child->BuildDisplayListForStackingContext(aBuilder, &list); + aBuilder->DisplayCaret(child, &list); } else { Maybe<nsRect> clipPropClip = child->GetClipPropClipRect(disp, effects, child->GetSize()); if (clipPropClip) { - dirty.IntersectRect(dirty, *clipPropClip); + aBuilder->IntersectDirtyRect(*clipPropClip); clipState.ClipContentDescendants( *clipPropClip + aBuilder->ToReferenceFrame(child)); } - child->MarkAbsoluteFramesForDisplayList(aBuilder, dirty); + child->MarkAbsoluteFramesForDisplayList(aBuilder); if (aBuilder->IsBuildingLayerEventRegions()) { // If this frame has a different animated geometry root than its parent, @@ -2863,8 +2905,8 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, // return early. aBuilder->AdjustWindowDraggingRegion(child); - child->BuildDisplayList(aBuilder, dirty, aLists); - aBuilder->DisplayCaret(child, dirty, aLists.Content()); + child->BuildDisplayList(aBuilder, aLists); + aBuilder->DisplayCaret(child, aLists.Content()); #ifdef DEBUG DisplayDebugBorders(aBuilder, child, aLists); #endif @@ -2875,10 +2917,10 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, // We allow positioned descendants of the child to escape to our parent // stacking context's positioned descendant list, because they might be // z-index:non-auto - nsDisplayListCollection pseudoStack; + nsDisplayListCollection pseudoStack(aBuilder); aBuilder->AdjustWindowDraggingRegion(child); - child->BuildDisplayList(aBuilder, dirty, pseudoStack); - aBuilder->DisplayCaret(child, dirty, pseudoStack.Content()); + child->BuildDisplayList(aBuilder, pseudoStack); + aBuilder->DisplayCaret(child, pseudoStack.Content()); list.AppendToTop(pseudoStack.BorderBackground()); list.AppendToTop(pseudoStack.BlockBorderBackgrounds()); @@ -2928,11 +2970,10 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, } void -nsIFrame::MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect) +nsIFrame::MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder) { if (IsAbsoluteContainer()) { - aBuilder->MarkFramesForDisplayList(this, GetAbsoluteContainingBlock()->GetChildList(), aDirtyRect); + aBuilder->MarkFramesForDisplayList(this, GetAbsoluteContainingBlock()->GetChildList()); } } diff --git a/layout/generic/nsFrameSetFrame.cpp b/layout/generic/nsFrameSetFrame.cpp index 87cb31fd0..4315b9b8a 100644 --- a/layout/generic/nsFrameSetFrame.cpp +++ b/layout/generic/nsFrameSetFrame.cpp @@ -100,7 +100,6 @@ public: nsIFrame::Cursor& aCursor) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Reflow(nsPresContext* aPresContext, @@ -149,7 +148,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Reflow(nsPresContext* aPresContext, @@ -672,10 +670,9 @@ nsHTMLFramesetFrame::GetCursor(const nsPoint& aPoint, void nsHTMLFramesetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInline(aBuilder, aLists); if (mDragger && aBuilder->IsForEventDelivery()) { aLists.Content()->AppendNewToTop( @@ -1429,7 +1426,6 @@ void nsDisplayFramesetBorder::Paint(nsDisplayListBuilder* aBuilder, void nsHTMLFramesetBorderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { aLists.Content()->AppendNewToTop( @@ -1640,7 +1636,6 @@ void nsDisplayFramesetBlank::Paint(nsDisplayListBuilder* aBuilder, void nsHTMLFramesetBlankFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { aLists.Content()->AppendNewToTop( diff --git a/layout/generic/nsFrameSetFrame.h b/layout/generic/nsFrameSetFrame.h index ac6ab07ce..b97d10c58 100644 --- a/layout/generic/nsFrameSetFrame.h +++ b/layout/generic/nsFrameSetFrame.h @@ -97,7 +97,6 @@ public: nsIFrame::Cursor& aCursor) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Reflow(nsPresContext* aPresContext, diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index 3ed3b0bb3..dd1b15f77 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -3031,7 +3031,6 @@ struct HoveredStateComparator void ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists, bool aCreateLayer, bool aPositioned) @@ -3093,23 +3092,25 @@ ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder, // zoomable, and where the scrollbar sizes are bounded by the widget. nsRect dirty = mIsRoot && mOuter->PresContext()->IsRootContentDocument() ? scrollParts[i]->GetVisualOverflowRectRelativeToParent() - : aDirtyRect; - nsDisplayListBuilder::AutoBuildingDisplayList - buildingForChild(aBuilder, scrollParts[i], - dirty + mOuter->GetOffsetTo(scrollParts[i]), true); + : aBuilder->GetDirtyRect(); // Always create layers for overlay scrollbars so that we don't create a // giant layer covering the whole scrollport if both scrollbars are visible. bool isOverlayScrollbar = (flags != 0) && overlayScrollbars; bool createLayer = aCreateLayer || isOverlayScrollbar; - nsDisplayListBuilder::AutoCurrentScrollbarInfoSetter - infoSetter(aBuilder, scrollTargetId, flags, createLayer); - nsDisplayListCollection partList; - mOuter->BuildDisplayListForChild( - aBuilder, scrollParts[i], dirty, partList, - nsIFrame::DISPLAY_CHILD_FORCE_STACKING_CONTEXT); - + nsDisplayListCollection partList(aBuilder); + { + nsDisplayListBuilder::AutoBuildingDisplayList + buildingForChild(aBuilder, mOuter, + dirty, true); + + nsDisplayListBuilder::AutoCurrentScrollbarInfoSetter + infoSetter(aBuilder, scrollTargetId, flags, createLayer); + mOuter->BuildDisplayListForChild( + aBuilder, scrollParts[i], partList, + nsIFrame::DISPLAY_CHILD_FORCE_STACKING_CONTEXT); + } if (createLayer) { appendToTopFlags |= APPEND_OWN_LAYER; } @@ -3117,11 +3118,18 @@ ScrollFrameHelper::AppendScrollPartsTo(nsDisplayListBuilder* aBuilder, appendToTopFlags |= APPEND_POSITIONED; } + { + nsDisplayListBuilder::AutoBuildingDisplayList + buildingForChild(aBuilder, scrollParts[i], + dirty + mOuter->GetOffsetTo(scrollParts[i]), true); + nsDisplayListBuilder::AutoCurrentScrollbarInfoSetter + infoSetter(aBuilder, scrollTargetId, flags, createLayer); // DISPLAY_CHILD_FORCE_STACKING_CONTEXT put everything into // partList.PositionedDescendants(). ::AppendToTop(aBuilder, aLists, partList.PositionedDescendants(), scrollParts[i], appendToTopFlags); + } } } @@ -3246,7 +3254,6 @@ ClipListsExceptCaret(nsDisplayListCollection* aLists, void ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (aBuilder->IsForFrameVisibility()) { @@ -3283,7 +3290,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, // had dirty rects saved for them by their parent frames calling // MarkOutOfFlowChildrenForDisplayList, so it's safe to restrict our // dirty rect here. - nsRect dirtyRect = aDirtyRect; + nsRect dirtyRect = aBuilder->GetDirtyRect(); if (!ignoringThisScrollFrame) { dirtyRect = dirtyRect.Intersect(mScrollPort); } @@ -3325,20 +3332,20 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, if (addScrollBars) { // Add classic scrollbars. - AppendScrollPartsTo(aBuilder, aDirtyRect, aLists, - createLayersForScrollbars, false); + AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, false); } + nsDisplayListBuilder::AutoBuildingDisplayList + building(aBuilder, mOuter, dirtyRect, aBuilder->IsAtRootOfPseudoStackingContext()); + // Don't clip the scrolled child, and don't paint scrollbars/scrollcorner. // The scrolled frame shouldn't have its own background/border, so we // can just pass aLists directly. - mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, - dirtyRect, aLists); + mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, aLists); if (addScrollBars) { // Add overlay scrollbars. - AppendScrollPartsTo(aBuilder, aDirtyRect, aLists, - createLayersForScrollbars, true); + AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, true); } return; @@ -3376,8 +3383,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, // Note that this does not apply for overlay scrollbars; those are drawn // in the positioned-elements layer on top of everything else by the call // to AppendScrollPartsTo(..., true) further down. - AppendScrollPartsTo(aBuilder, aDirtyRect, aLists, - createLayersForScrollbars, false); + AppendScrollPartsTo(aBuilder, aLists, createLayersForScrollbars, false); const nsStyleDisplay* disp = mOuter->StyleDisplay(); if (disp && (disp->mWillChangeBitField & NS_STYLE_WILL_CHANGE_SCROLL)) { @@ -3414,7 +3420,7 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, nsIScrollableFrame* sf = do_QueryFrame(mOuter); MOZ_ASSERT(sf); - nsDisplayListCollection scrolledContent; + nsDisplayListCollection scrolledContent(aBuilder); { // Note that setting the current scroll parent id here means that positioned children // of this scroll info layer will pick up the scroll info layer as their scroll handoff @@ -3506,7 +3512,10 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, scrolledRectClipState.ClipContainingBlockDescendants( scrolledRectClip + aBuilder->ToReferenceFrame(mOuter)); - mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, dirtyRect, scrolledContent); + nsDisplayListBuilder::AutoBuildingDisplayList + building(aBuilder, mOuter, dirtyRect, aBuilder->IsAtRootOfPseudoStackingContext()); + + mOuter->BuildDisplayListForChild(aBuilder, mScrolledFrame, scrolledContent); } if (contentBoxClipForNonCaretContent) { @@ -3593,8 +3602,8 @@ ScrollFrameHelper::BuildDisplayList(nsDisplayListBuilder* aBuilder, } } // Now display overlay scrollbars and the resizer, if we have one. - AppendScrollPartsTo(aBuilder, aDirtyRect, scrolledContent, - createLayersForScrollbars, true); + AppendScrollPartsTo(aBuilder, scrolledContent, createLayersForScrollbars, true); + scrolledContent.MoveTo(aLists); } @@ -6175,3 +6184,4 @@ ScrollFrameHelper::UsesContainerScrolling() const } return false; } + diff --git a/layout/generic/nsGfxScrollFrame.h b/layout/generic/nsGfxScrollFrame.h index 81bbb358f..296867856 100644 --- a/layout/generic/nsGfxScrollFrame.h +++ b/layout/generic/nsGfxScrollFrame.h @@ -70,11 +70,9 @@ public: void Destroy(); void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); void AppendScrollPartsTo(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists, bool aCreateLayer, bool aPositioned); @@ -687,9 +685,8 @@ public: } virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override { - mHelper.BuildDisplayList(aBuilder, aDirtyRect, aLists); + mHelper.BuildDisplayList(aBuilder, aLists); } bool TryLayout(ScrollReflowInput* aState, @@ -1105,9 +1102,8 @@ public: bool aClipAllDescendants); virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override { - mHelper.BuildDisplayList(aBuilder, aDirtyRect, aLists); + mHelper.BuildDisplayList(aBuilder, aLists); } // XXXldb Is this actually used? diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp index f771c9d7c..d7120d91e 100644 --- a/layout/generic/nsGridContainerFrame.cpp +++ b/layout/generic/nsGridContainerFrame.cpp @@ -6643,12 +6643,11 @@ nsGridContainerFrame::GetType() const void nsGridContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DisplayBorderBackgroundOutline(aBuilder, aLists); if (GetPrevInFlow()) { - DisplayOverflowContainers(aBuilder, aDirtyRect, aLists); + DisplayOverflowContainers(aBuilder, aLists); } // Our children are all grid-level boxes, which behave the same as @@ -6662,8 +6661,7 @@ nsGridContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, GridItemCSSOrderIterator::eIncludeAll, order); for (; !iter.AtEnd(); iter.Next()) { nsIFrame* child = *iter; - BuildDisplayListForChild(aBuilder, child, aDirtyRect, aLists, - ::GetDisplayFlagsForGridItem(child)); + BuildDisplayListForChild(aBuilder, child, aLists, ::GetDisplayFlagsForGridItem(child)); } } diff --git a/layout/generic/nsGridContainerFrame.h b/layout/generic/nsGridContainerFrame.h index 960558421..c9163b95c 100644 --- a/layout/generic/nsGridContainerFrame.h +++ b/layout/generic/nsGridContainerFrame.h @@ -98,7 +98,6 @@ public: } void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; nscoord GetLogicalBaseline(mozilla::WritingMode aWM) const override diff --git a/layout/generic/nsHTMLCanvasFrame.cpp b/layout/generic/nsHTMLCanvasFrame.cpp index bad3a710f..f86ec1136 100644 --- a/layout/generic/nsHTMLCanvasFrame.cpp +++ b/layout/generic/nsHTMLCanvasFrame.cpp @@ -367,7 +367,6 @@ nsHTMLCanvasFrame::BuildLayer(nsDisplayListBuilder* aBuilder, void nsHTMLCanvasFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) diff --git a/layout/generic/nsHTMLCanvasFrame.h b/layout/generic/nsHTMLCanvasFrame.h index e4235deae..b2d159627 100644 --- a/layout/generic/nsHTMLCanvasFrame.h +++ b/layout/generic/nsHTMLCanvasFrame.h @@ -45,7 +45,6 @@ public: nsIFrame* aPrevInFlow) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder, diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index 57f5c460c..82bcf563a 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -1435,21 +1435,14 @@ public: * BuildDisplayListForChild. * * See nsDisplayList.h for more information about display lists. - * - * @param aDirtyRect content outside this rectangle can be ignored; the - * rectangle is in frame coordinates */ virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) {} /** * Displays the caret onto the given display list builder. The caret is * painted on top of the rest of the display list items. - * - * @param aDirtyRect is the dirty rectangle that we're repainting. */ void DisplayCaret(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, nsDisplayList* aList); /** @@ -1483,11 +1476,8 @@ public: /** * Builds a display list for the content represented by this frame, * treating this frame as the root of a stacking context. - * @param aDirtyRect content outside this rectangle can be ignored; the - * rectangle is in frame coordinates */ void BuildDisplayListForStackingContext(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, nsDisplayList* aList); enum { @@ -1506,7 +1496,6 @@ public: */ void BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, nsIFrame* aChild, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists, uint32_t aFlags = 0); @@ -3530,7 +3519,7 @@ private: nsIFrame* mNextSibling; // doubly-linked list of frames nsIFrame* mPrevSibling; // Do not touch outside SetNextSibling! - void MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect); + void MarkAbsoluteFramesForDisplayList(nsDisplayListBuilder* aBuilder); static void DestroyPaintedPresShellList(nsTArray<nsWeakPtr>* list) { list->Clear(); diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp index c64520f2e..03fcbd8e3 100644 --- a/layout/generic/nsImageFrame.cpp +++ b/layout/generic/nsImageFrame.cpp @@ -116,7 +116,7 @@ static bool HaveSpecifiedSize(const nsStylePosition* aStylePosition) // Decide whether we can optimize away reflows that result from the // image's intrinsic size changing. -inline bool HaveFixedSize(const ReflowInput& aReflowInput) +static bool HaveFixedSize(const ReflowInput& aReflowInput) { NS_ASSERTION(aReflowInput.mStylePosition, "crappy reflowInput - null stylePosition"); // Don't try to make this optimization when an image has percentages @@ -430,66 +430,56 @@ nsImageFrame::SourceRectToDest(const nsIntRect& aRect) // that we'll construct image frames for them as needed if their display is // toggled from "none" (though we won't paint them, unless their visibility // is changed too). -#define BAD_STATES (NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED | \ - NS_EVENT_STATE_LOADING) +#define BAD_STATES (NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED) -// This is a macro so that we don't evaluate the boolean last arg -// unless we have to; it can be expensive -#define IMAGE_OK(_state, _loadingOK) \ - (!(_state).HasAtLeastOneOfStates(BAD_STATES) || \ - (!(_state).HasAtLeastOneOfStates(NS_EVENT_STATE_BROKEN | NS_EVENT_STATE_USERDISABLED) && \ - (_state).HasState(NS_EVENT_STATE_LOADING) && (_loadingOK))) +static bool ImageOk(EventStates aState) { + return !aState.HasAtLeastOneOfStates(BAD_STATES); +} -/* static */ -bool +static bool HasAltText(Element* aElement) +{ + // We always return some alternate text for <input>, see + // nsCSSFrameConstructor::GetAlternateTextFor. + if (aElement->IsHTMLElement(nsGkAtoms::input)) { + return true; + } + + MOZ_ASSERT(aElement->IsHTMLElement(nsGkAtoms::img)); + nsAutoString altText; + return aElement->GetAttr(kNameSpaceID_None, nsGkAtoms::alt, altText) && !altText.IsEmpty(); +} + +// Check if we want to use an image frame or just let the frame constructor make +// us into an inline. +/* static */ bool nsImageFrame::ShouldCreateImageFrameFor(Element* aElement, nsStyleContext* aStyleContext) { - EventStates state = aElement->State(); - if (IMAGE_OK(state, - HaveSpecifiedSize(aStyleContext->StylePosition()))) { - // Image is fine; do the image frame thing + if (ImageOk(aElement->State())) { + // Image is fine or loading; do the image frame thing return true; } - // Check if we want to use a placeholder box with an icon or just - // let the presShell make us into inline text. Decide as follows: - // - // - if our special "force icons" style is set, show an icon - // - else if our "do not show placeholders" pref is set, skip the icon - // - else: - // - if there is a src attribute, there is no alt attribute, - // and this is not an <object> (which could not possibly have - // such an attribute), show an icon. - // - if QuirksMode, and the IMG has a size show an icon. - // - otherwise, skip the icon - bool useSizedBox; - + // If our special "force icons" style is set, show an icon if (aStyleContext->StyleUIReset()->mForceBrokenImageIcon) { - useSizedBox = true; - } - else if (gIconLoad && gIconLoad->mPrefForceInlineAltText) { - useSizedBox = false; + return true; } - else if (aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::src) && - !aElement->HasAttr(kNameSpaceID_None, nsGkAtoms::alt) && - !aElement->IsHTMLElement(nsGkAtoms::object) && - !aElement->IsHTMLElement(nsGkAtoms::input)) { - // Use a sized box if we have no alt text. This means no alt attribute - // and the node is not an object or an input (since those always have alt - // text). - useSizedBox = true; + + // If our "do not show placeholders" pref is set, skip the icon + if (gIconLoad && gIconLoad->mPrefForceInlineAltText) { + return false; } - else if (aStyleContext->PresContext()->CompatibilityMode() != - eCompatibility_NavQuirks) { - useSizedBox = false; + + // If there is no Alt text, always create an image frame (regardless of src) + if (!HasAltText(aElement)) { + return true; } - else { - // check whether we have specified size - useSizedBox = HaveSpecifiedSize(aStyleContext->StylePosition()); + + if (aStyleContext->PresContext()->CompatibilityMode() == eCompatibility_NavQuirks) { + return HaveSpecifiedSize(aStyleContext->StylePosition()); } - - return useSizedBox; + + return false; } nsresult @@ -775,6 +765,25 @@ nsImageFrame::PredictedDestRect(const nsRect& aFrameContentBox) StylePosition()); } +bool nsImageFrame::ShouldShowBrokenImageIcon() const +{ + bool imageBroken = false; + // Check for broken images. valid null images (eg. img src="") are + // not considered broken because they have no image requests + nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(mContent); + if (imageLoader) { + nsCOMPtr<imgIRequest> currentRequest; + imageLoader->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST, + getter_AddRefs(currentRequest)); + uint32_t imageStatus; + imageBroken = + currentRequest && + NS_SUCCEEDED(currentRequest->GetImageStatus(&imageStatus)) && + (imageStatus & imgIRequest::STATUS_ERROR); + } + return imageBroken; +} + void nsImageFrame::EnsureIntrinsicSizeAndRatio() { @@ -789,25 +798,11 @@ nsImageFrame::EnsureIntrinsicSizeAndRatio() UpdateIntrinsicSize(mImage); UpdateIntrinsicRatio(mImage); } else { - // image request is null or image size not known, probably an - // invalid image specified + // Image request is null or image size not known. if (!(GetStateBits() & NS_FRAME_GENERATED_CONTENT)) { - bool imageBroken = false; - // check for broken images. valid null images (eg. img src="") are - // not considered broken because they have no image requests - nsCOMPtr<nsIImageLoadingContent> imageLoader = do_QueryInterface(mContent); - if (imageLoader) { - nsCOMPtr<imgIRequest> currentRequest; - imageLoader->GetRequest(nsIImageLoadingContent::CURRENT_REQUEST, - getter_AddRefs(currentRequest)); - uint32_t imageStatus; - imageBroken = - currentRequest && - NS_SUCCEEDED(currentRequest->GetImageStatus(&imageStatus)) && - (imageStatus & imgIRequest::STATUS_ERROR); - } - // invalid image specified. make the image big enough for the "broken" icon - if (imageBroken) { + // Likely an invalid image. Check if we should display it as broken. + if (ShouldShowBrokenImageIcon()) { + // Invalid image specified. make the image big enough for the "broken" icon nscoord edgeLengthToUse = nsPresContext::CSSPixelsToAppUnits( ICON_SIZE + (2 * (ICON_PADDING + ALT_BORDER_WIDTH))); @@ -1015,8 +1010,7 @@ nsImageFrame::Reflow(nsPresContext* aPresContext, } aMetrics.SetOverflowAreasToDesiredBounds(); - EventStates contentState = mContent->AsElement()->State(); - bool imageOK = IMAGE_OK(contentState, true); + bool imageOK = ImageOk(mContent->AsElement()->State()); // Determine if the size is available bool haveSize = false; @@ -1335,7 +1329,7 @@ nsImageFrame::DisplayAltFeedback(nsRenderingContext& aRenderingContext, MOZ_ASSERT(gIconLoad, "How did we succeed in Init then?"); // Whether we draw the broken or loading icon. - bool isLoading = IMAGE_OK(GetContent()->AsElement()->State(), true); + bool isLoading = ImageOk(mContent->AsElement()->State()); // Calculate the inner area nsRect inner = GetInnerArea() + aPt; @@ -1389,7 +1383,8 @@ nsImageFrame::DisplayAltFeedback(nsRenderingContext& aRenderingContext, DrawResult result = DrawResult::NOT_READY; // Check if we should display image placeholders - if (!gIconLoad->mPrefShowPlaceholders || + if (!ShouldShowBrokenImageIcon() || + !gIconLoad->mPrefShowPlaceholders || (isLoading && !gIconLoad->mPrefShowLoadingPlaceholder)) { result = DrawResult::SUCCESS; } else { @@ -1730,7 +1725,6 @@ nsImageFrame::PaintImage(nsRenderingContext& aRenderingContext, nsPoint aPt, void nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) @@ -1755,8 +1749,7 @@ nsImageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, getter_AddRefs(currentRequest)); } - EventStates contentState = mContent->AsElement()->State(); - bool imageOK = IMAGE_OK(contentState, true); + bool imageOK = ImageOk(mContent->AsElement()->State()); // XXX(seth): The SizeIsAvailable check here should not be necessary - the // intention is that a non-null mImage means we have a size, but there is diff --git a/layout/generic/nsImageFrame.h b/layout/generic/nsImageFrame.h index 5bc59c042..59af1be32 100644 --- a/layout/generic/nsImageFrame.h +++ b/layout/generic/nsImageFrame.h @@ -82,7 +82,6 @@ public: nsContainerFrame* aParent, nsIFrame* aPrevInFlow) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nscoord GetMinISize(nsRenderingContext *aRenderingContext) override; virtual nscoord GetPrefISize(nsRenderingContext *aRenderingContext) override; @@ -107,6 +106,8 @@ public: void OnVisibilityChange(Visibility aNewVisibility, Maybe<OnNonvisible> aNonvisibleAction = Nothing()) override; + bool ShouldShowBrokenImageIcon() const; + #ifdef ACCESSIBILITY virtual mozilla::a11y::AccType AccessibleType() override; #endif diff --git a/layout/generic/nsInlineFrame.cpp b/layout/generic/nsInlineFrame.cpp index 7e188c247..fb77422a3 100644 --- a/layout/generic/nsInlineFrame.cpp +++ b/layout/generic/nsInlineFrame.cpp @@ -243,10 +243,9 @@ nsInlineFrame::StealFrame(nsIFrame* aChild) void nsInlineFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - BuildDisplayListForInline(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInline(aBuilder, aLists); // The sole purpose of this is to trigger display of the selection // window for Named Anchors, which don't have any children and diff --git a/layout/generic/nsInlineFrame.h b/layout/generic/nsInlineFrame.h index 36df6be93..c1e0d7fe3 100644 --- a/layout/generic/nsInlineFrame.h +++ b/layout/generic/nsInlineFrame.h @@ -31,7 +31,6 @@ public: // nsIFrame overrides virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #ifdef ACCESSIBILITY diff --git a/layout/generic/nsLeafFrame.h b/layout/generic/nsLeafFrame.h index 407f9846d..7087fb6cf 100644 --- a/layout/generic/nsLeafFrame.h +++ b/layout/generic/nsLeafFrame.h @@ -24,7 +24,6 @@ public: // nsIFrame replacements virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override { DO_GLOBAL_REFLOW_COUNT_DSP("nsLeafFrame"); DisplayBorderBackgroundOutline(aBuilder, aLists); diff --git a/layout/generic/nsPageFrame.cpp b/layout/generic/nsPageFrame.cpp index ae3af6ef7..31a686e83 100644 --- a/layout/generic/nsPageFrame.cpp +++ b/layout/generic/nsPageFrame.cpp @@ -437,7 +437,7 @@ PruneDisplayListForExtraPage(nsDisplayListBuilder* aBuilder, static void BuildDisplayListForExtraPage(nsDisplayListBuilder* aBuilder, nsPageFrame* aPage, nsIFrame* aExtraPage, - const nsRect& aDirtyRect, nsDisplayList* aList) + nsDisplayList* aList) { // The only content in aExtraPage we care about is out-of-flow content whose // placeholders have occurred in aPage. If @@ -447,7 +447,7 @@ BuildDisplayListForExtraPage(nsDisplayListBuilder* aBuilder, return; } nsDisplayList list; - aExtraPage->BuildDisplayListForStackingContext(aBuilder, aDirtyRect, &list); + aExtraPage->BuildDisplayListForStackingContext(aBuilder, &list); PruneDisplayListForExtraPage(aBuilder, aPage, aExtraPage, &list); aList->AppendToTop(&list); } @@ -517,10 +517,9 @@ protected: //------------------------------------------------------------------------------ void nsPageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsDisplayListCollection set; + nsDisplayListCollection set(aBuilder); if (PresContext()->IsScreen()) { DisplayBorderBackgroundOutline(aBuilder, aLists); @@ -558,7 +557,10 @@ nsPageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, clipState.ClipContainingBlockDescendants(clipRect, nullptr); nsRect dirtyRect = child->GetVisualOverflowRectRelativeToSelf(); - child->BuildDisplayListForStackingContext(aBuilder, dirtyRect, &content); + nsDisplayListBuilder::AutoBuildingDisplayList + buildingForChild(aBuilder, child, dirtyRect, + aBuilder->IsAtRootOfPseudoStackingContext()); + child->BuildDisplayListForStackingContext(aBuilder, &content); // We may need to paint out-of-flow frames whose placeholders are // on other pages. Add those pages to our display list. Note that @@ -569,8 +571,12 @@ nsPageFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // following placeholders to their out-of-flows) end up on the list. nsIFrame* page = child; while ((page = GetNextPage(page)) != nullptr) { - BuildDisplayListForExtraPage(aBuilder, this, page, - dirtyRect + child->GetOffsetTo(page), &content); + nsRect childDirty = dirtyRect + child->GetOffsetTo(page); + + nsDisplayListBuilder::AutoBuildingDisplayList + buildingForChild(aBuilder, page, childDirty, + aBuilder->IsAtRootOfPseudoStackingContext()); + BuildDisplayListForExtraPage(aBuilder, this, page, &content); } // Invoke AutoBuildingDisplayList to ensure that the correct dirtyRect diff --git a/layout/generic/nsPageFrame.h b/layout/generic/nsPageFrame.h index aab2ac7b8..86516fe73 100644 --- a/layout/generic/nsPageFrame.h +++ b/layout/generic/nsPageFrame.h @@ -29,7 +29,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** diff --git a/layout/generic/nsPlaceholderFrame.cpp b/layout/generic/nsPlaceholderFrame.cpp index bd380a2d9..f234b2f2d 100644 --- a/layout/generic/nsPlaceholderFrame.cpp +++ b/layout/generic/nsPlaceholderFrame.cpp @@ -240,7 +240,6 @@ PaintDebugPlaceholder(nsIFrame* aFrame, DrawTarget* aDrawTarget, void nsPlaceholderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DO_GLOBAL_REFLOW_COUNT_DSP("nsPlaceholderFrame"); diff --git a/layout/generic/nsPlaceholderFrame.h b/layout/generic/nsPlaceholderFrame.h index 0c23a4f75..11cb98592 100644 --- a/layout/generic/nsPlaceholderFrame.h +++ b/layout/generic/nsPlaceholderFrame.h @@ -107,7 +107,6 @@ public: #if defined(DEBUG) || (defined(MOZ_REFLOW_PERF_DSP) && defined(MOZ_REFLOW_PERF)) virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #endif // DEBUG || (MOZ_REFLOW_PERF_DSP && MOZ_REFLOW_PERF) diff --git a/layout/generic/nsPluginFrame.cpp b/layout/generic/nsPluginFrame.cpp index 34ed12d44..6e9e072e7 100644 --- a/layout/generic/nsPluginFrame.cpp +++ b/layout/generic/nsPluginFrame.cpp @@ -1182,7 +1182,6 @@ nsPluginFrame::IsTransparentMode() const void nsPluginFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // XXX why are we painting collapsed object frames? diff --git a/layout/generic/nsPluginFrame.h b/layout/generic/nsPluginFrame.h index 5d9f9f475..57db78acc 100644 --- a/layout/generic/nsPluginFrame.h +++ b/layout/generic/nsPluginFrame.h @@ -81,7 +81,6 @@ public: const ReflowInput* aReflowInput, nsDidReflowStatus aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult HandleEvent(nsPresContext* aPresContext, diff --git a/layout/generic/nsRubyBaseContainerFrame.cpp b/layout/generic/nsRubyBaseContainerFrame.cpp index 401b7d576..566dee14f 100644 --- a/layout/generic/nsRubyBaseContainerFrame.cpp +++ b/layout/generic/nsRubyBaseContainerFrame.cpp @@ -22,6 +22,7 @@ #include "RubyUtils.h" using namespace mozilla; +using namespace mozilla::gfx; //---------------------------------------------------------------------- diff --git a/layout/generic/nsRubyTextFrame.cpp b/layout/generic/nsRubyTextFrame.cpp index b4a26ff33..2848cb6fc 100644 --- a/layout/generic/nsRubyTextFrame.cpp +++ b/layout/generic/nsRubyTextFrame.cpp @@ -63,14 +63,13 @@ nsRubyTextFrame::GetFrameName(nsAString& aResult) const /* virtual */ void nsRubyTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (IsAutoHidden()) { return; } - nsRubyContentFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsRubyContentFrame::BuildDisplayList(aBuilder, aLists); } /* virtual */ void diff --git a/layout/generic/nsRubyTextFrame.h b/layout/generic/nsRubyTextFrame.h index 841b5081f..83c24d49d 100644 --- a/layout/generic/nsRubyTextFrame.h +++ b/layout/generic/nsRubyTextFrame.h @@ -34,7 +34,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Reflow(nsPresContext* aPresContext, diff --git a/layout/generic/nsSimplePageSequenceFrame.cpp b/layout/generic/nsSimplePageSequenceFrame.cpp index 2e74afc3b..d8ec898a6 100644 --- a/layout/generic/nsSimplePageSequenceFrame.cpp +++ b/layout/generic/nsSimplePageSequenceFrame.cpp @@ -808,7 +808,6 @@ ComputePageSequenceTransform(nsIFrame* aFrame, float aAppUnitsPerPixel) void nsSimplePageSequenceFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DisplayBorderBackgroundOutline(aBuilder, aLists); @@ -822,13 +821,16 @@ nsSimplePageSequenceFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, clipState.Clear(); nsIFrame* child = PrincipalChildList().FirstChild(); - nsRect dirty = aDirtyRect; + nsRect dirty = aBuilder->GetDirtyRect(); dirty.ScaleInverseRoundOut(PresContext()->GetPrintPreviewScale()); while (child) { if (child->GetVisualOverflowRectRelativeToParent().Intersects(dirty)) { - child->BuildDisplayListForStackingContext(aBuilder, - dirty - child->GetPosition(), &content); + nsDisplayListBuilder::AutoBuildingDisplayList + buildingForChild(aBuilder, child, + dirty - child->GetPosition(), + aBuilder->IsAtRootOfPseudoStackingContext()); + child->BuildDisplayListForStackingContext(aBuilder, &content); aBuilder->ResetMarkedFramesForDisplayList(); } child = child->GetNextSibling(); diff --git a/layout/generic/nsSimplePageSequenceFrame.h b/layout/generic/nsSimplePageSequenceFrame.h index c4e1e84b6..4981c67a8 100644 --- a/layout/generic/nsSimplePageSequenceFrame.h +++ b/layout/generic/nsSimplePageSequenceFrame.h @@ -69,7 +69,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; // nsIPageSequenceFrame diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp index 47026b73c..fd9a7d32c 100644 --- a/layout/generic/nsSubDocumentFrame.cpp +++ b/layout/generic/nsSubDocumentFrame.cpp @@ -327,7 +327,6 @@ WrapBackgroundColorInOwnLayer(nsDisplayListBuilder* aBuilder, void nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) @@ -343,7 +342,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, bool pointerEventsNone = StyleUserInterface()->mPointerEvents == NS_STYLE_POINTER_EVENTS_NONE; if (!aBuilder->IsForEventDelivery() || !pointerEventsNone) { - nsDisplayListCollection decorations; + nsDisplayListCollection decorations(aBuilder); DisplayBorderBackgroundOutline(aBuilder, decorations); if (rfp) { // Wrap background colors of <iframe>s with remote subdocuments in their @@ -368,7 +367,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } if (rfp) { - rfp->BuildDisplayList(aBuilder, this, aDirtyRect, aLists); + rfp->BuildDisplayList(aBuilder, this, aLists); return; } @@ -393,17 +392,18 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, nsIFrame* savedIgnoreScrollFrame = nullptr; if (subdocRootFrame) { // get the dirty rect relative to the root frame of the subdoc - dirty = aDirtyRect + GetOffsetToCrossDoc(subdocRootFrame); + dirty = aBuilder->GetDirtyRect() + GetOffsetToCrossDoc(subdocRootFrame); // and convert into the appunits of the subdoc dirty = dirty.ScaleToOtherAppUnitsRoundOut(parentAPD, subdocAPD); if (nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame()) { nsIScrollableFrame* rootScrollableFrame = presShell->GetRootScrollFrameAsScrollable(); MOZ_ASSERT(rootScrollableFrame); - // Use a copy, so the dirty rect doesn't get modified to the display port. - nsRect copy = dirty; + // Use a copy, so the rects don't get modified. + nsRect copyOfDirty = dirty; haveDisplayPort = rootScrollableFrame->DecideScrollableLayer(aBuilder, - ©, /* aAllowCreateDisplayPort = */ true); + ©OfDirty, + /* aAllowCreateDisplayPort = */ true); if (!gfxPrefs::LayoutUseContainersForRootFrames()) { haveDisplayPort = false; } @@ -417,7 +417,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, aBuilder->EnterPresShell(subdocRootFrame, pointerEventsNone); } else { - dirty = aDirtyRect; + dirty = aBuilder->GetDirtyRect(); } DisplayListClipState::AutoSaveRestore clipState(aBuilder); @@ -456,6 +456,13 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, nestedClipState.EnterStackingContextContents(true); } + // Invoke AutoBuildingDisplayList to ensure that the correct dirty rect + // is used to compute the visible rect if AddCanvasBackgroundColorItem + // creates a display item. + nsIFrame* frame = subdocRootFrame ? subdocRootFrame : this; + nsDisplayListBuilder::AutoBuildingDisplayList + building(aBuilder, frame, dirty, true); + if (subdocRootFrame) { nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame(); nsDisplayListBuilder::AutoCurrentScrollParentIdSetter idSetter( @@ -466,7 +473,7 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, aBuilder->SetAncestorHasApzAwareEventHandler(false); subdocRootFrame-> - BuildDisplayListForStackingContext(aBuilder, dirty, &childItems); + BuildDisplayListForStackingContext(aBuilder, &childItems); } if (!aBuilder->IsForEventDelivery()) { @@ -485,15 +492,8 @@ nsSubDocumentFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // painted on the page itself. if (nsLayoutUtils::NeedsPrintPreviewBackground(presContext)) { presShell->AddPrintPreviewBackgroundItem( - *aBuilder, childItems, subdocRootFrame ? subdocRootFrame : this, - bounds); + *aBuilder, childItems, frame, bounds); } else { - // Invoke AutoBuildingDisplayList to ensure that the correct dirty rect - // is used to compute the visible rect if AddCanvasBackgroundColorItem - // creates a display item. - nsIFrame* frame = subdocRootFrame ? subdocRootFrame : this; - nsDisplayListBuilder::AutoBuildingDisplayList - building(aBuilder, frame, dirty, true); // Add the canvas background color to the bottom of the list. This // happens after we've built the list so that AddCanvasBackgroundColorItem // can monkey with the contents if necessary. diff --git a/layout/generic/nsSubDocumentFrame.h b/layout/generic/nsSubDocumentFrame.h index 54f08d4fe..93d908dcc 100644 --- a/layout/generic/nsSubDocumentFrame.h +++ b/layout/generic/nsSubDocumentFrame.h @@ -79,7 +79,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 59ef020ce..4bc542626 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -4998,7 +4998,6 @@ nsDisplayText::Paint(nsDisplayListBuilder* aBuilder, void nsTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) diff --git a/layout/generic/nsTextFrame.h b/layout/generic/nsTextFrame.h index 425dbb737..43a4f5f1c 100644 --- a/layout/generic/nsTextFrame.h +++ b/layout/generic/nsTextFrame.h @@ -65,7 +65,6 @@ public: // nsIFrame virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Init(nsIContent* aContent, diff --git a/layout/generic/nsTextFrameUtils.cpp b/layout/generic/nsTextFrameUtils.cpp index d07400f2b..8562839cc 100644 --- a/layout/generic/nsTextFrameUtils.cpp +++ b/layout/generic/nsTextFrameUtils.cpp @@ -13,6 +13,8 @@ #include "nsUnicharUtils.h" #include <algorithm> +using namespace mozilla; + static bool IsDiscardable(char16_t ch, uint32_t* aFlags) { // Unlike IS_DISCARDABLE, we don't discard \r. \r will be ignored by gfxTextRun diff --git a/layout/generic/nsTextRunTransformations.cpp b/layout/generic/nsTextRunTransformations.cpp index 84d669ed6..ac3edd0b9 100644 --- a/layout/generic/nsTextRunTransformations.cpp +++ b/layout/generic/nsTextRunTransformations.cpp @@ -20,6 +20,7 @@ #include "IrishCasing.h" using namespace mozilla; +using namespace mozilla::gfx; // Unicode characters needing special casing treatment in tr/az languages #define LATIN_CAPITAL_LETTER_I_WITH_DOT_ABOVE 0x0130 diff --git a/layout/generic/nsTextRunTransformations.h b/layout/generic/nsTextRunTransformations.h index 662a5d2f8..db29c7315 100644 --- a/layout/generic/nsTextRunTransformations.h +++ b/layout/generic/nsTextRunTransformations.h @@ -12,6 +12,8 @@ #include "gfxTextRun.h" #include "nsStyleContext.h" +using namespace mozilla; + class nsTransformedTextRun; struct nsTransformedCharStyle final { diff --git a/layout/generic/nsVideoFrame.cpp b/layout/generic/nsVideoFrame.cpp index 9f27684a7..cea209cb5 100644 --- a/layout/generic/nsVideoFrame.cpp +++ b/layout/generic/nsVideoFrame.cpp @@ -446,7 +446,6 @@ public: void nsVideoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) @@ -482,14 +481,15 @@ nsVideoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // but only want to draw mPosterImage conditionally. Others we // always add to the display list. for (nsIFrame* child : mFrames) { - if (child->GetContent() != mPosterImage || shouldDisplayPoster) { - child->BuildDisplayListForStackingContext(aBuilder, - aDirtyRect - child->GetOffsetTo(this), - aLists.Content()); - } else if (child->GetType() == nsGkAtoms::boxFrame) { - child->BuildDisplayListForStackingContext(aBuilder, - aDirtyRect - child->GetOffsetTo(this), - aLists.Content()); + if (child->GetContent() != mPosterImage || shouldDisplayPoster || + child->GetType() == nsGkAtoms::boxFrame) { + + nsDisplayListBuilder::AutoBuildingDisplayList + buildingForChild(aBuilder, child, + aBuilder->GetDirtyRect() - child->GetOffsetTo(this), + aBuilder->IsAtRootOfPseudoStackingContext()); + + child->BuildDisplayListForStackingContext(aBuilder, aLists.Content()); } } } diff --git a/layout/generic/nsVideoFrame.h b/layout/generic/nsVideoFrame.h index 36e9f9ac3..d624ae6b9 100644 --- a/layout/generic/nsVideoFrame.h +++ b/layout/generic/nsVideoFrame.h @@ -45,7 +45,6 @@ public: NS_DECL_FRAMEARENA_HELPERS virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/generic/nsViewportFrame.cpp b/layout/generic/nsViewportFrame.cpp index 39491a0ed..a37d2a5a7 100644 --- a/layout/generic/nsViewportFrame.cpp +++ b/layout/generic/nsViewportFrame.cpp @@ -16,6 +16,7 @@ #include "nsAbsoluteContainingBlock.h" #include "GeckoProfiler.h" #include "nsIMozBrowserFrame.h" +#include "nsPlaceholderFrame.h" using namespace mozilla; typedef nsAbsoluteContainingBlock::AbsPosReflowFlags AbsPosReflowFlags; @@ -48,7 +49,6 @@ ViewportFrame::Init(nsIContent* aContent, void ViewportFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { PROFILER_LABEL("ViewportFrame", "BuildDisplayList", @@ -58,7 +58,7 @@ ViewportFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // make the kid's BorderBackground our own. This ensures that the canvas // frame's background becomes our own background and therefore appears // below negative z-index elements. - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, kid, aLists); } nsDisplayList topLayerList; @@ -109,8 +109,12 @@ BuildDisplayListForTopLayerFrame(nsDisplayListBuilder* aBuilder, clipState.SetScrollClipForContainingBlockDescendants( aBuilder, savedOutOfFlowData->mContainingBlockScrollClip); } + nsDisplayListBuilder::AutoBuildingDisplayList + buildingForChild(aBuilder, aFrame, dirty, + aBuilder->IsAtRootOfPseudoStackingContext()); + nsDisplayList list; - aFrame->BuildDisplayListForStackingContext(aBuilder, dirty, &list); + aFrame->BuildDisplayListForStackingContext(aBuilder, &list); aList->AppendToTop(&list); } diff --git a/layout/generic/nsViewportFrame.h b/layout/generic/nsViewportFrame.h index 062de4054..3e5263093 100644 --- a/layout/generic/nsViewportFrame.h +++ b/layout/generic/nsViewportFrame.h @@ -56,7 +56,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; void BuildDisplayListForTopLayer(nsDisplayListBuilder* aBuilder, diff --git a/layout/ipc/RenderFrameParent.cpp b/layout/ipc/RenderFrameParent.cpp index 8162d02d7..0f4aa11bb 100644 --- a/layout/ipc/RenderFrameParent.cpp +++ b/layout/ipc/RenderFrameParent.cpp @@ -266,7 +266,6 @@ RenderFrameParent::GetLayerTreeId() const void RenderFrameParent::BuildDisplayList(nsDisplayListBuilder* aBuilder, nsSubDocumentFrame* aFrame, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // We're the subdoc for <browser remote="true"> and it has diff --git a/layout/ipc/RenderFrameParent.h b/layout/ipc/RenderFrameParent.h index 274f8ff6d..f91cfe614 100644 --- a/layout/ipc/RenderFrameParent.h +++ b/layout/ipc/RenderFrameParent.h @@ -64,7 +64,6 @@ public: void BuildDisplayList(nsDisplayListBuilder* aBuilder, nsSubDocumentFrame* aFrame, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder, diff --git a/layout/mathml/nsMathMLChar.cpp b/layout/mathml/nsMathMLChar.cpp index 507e32b22..4b02a52d8 100644 --- a/layout/mathml/nsMathMLChar.cpp +++ b/layout/mathml/nsMathMLChar.cpp @@ -1992,7 +1992,8 @@ nsMathMLChar::Display(nsDisplayListBuilder* aBuilder, if (styleContext != parentContext && NS_GET_A(backg->mBackgroundColor) > 0) { nsDisplayBackgroundImage::AppendBackgroundItemsToTop( - aBuilder, aForFrame, mRect, aLists.BorderBackground(), + aBuilder, aForFrame, mRect + aBuilder->ToReferenceFrame(aForFrame), + aLists.BorderBackground(), /* aAllowWillPaintBorderOptimization */ true, styleContext); } //else diff --git a/layout/mathml/nsMathMLContainerFrame.cpp b/layout/mathml/nsMathMLContainerFrame.cpp index 93b631c9d..8e22ba204 100644 --- a/layout/mathml/nsMathMLContainerFrame.cpp +++ b/layout/mathml/nsMathMLContainerFrame.cpp @@ -618,7 +618,6 @@ nsMathMLContainerFrame::PropagatePresentationDataFromChildAt(nsIFrame* aPa void nsMathMLContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // report an error if something wrong was found in this frame @@ -633,8 +632,7 @@ nsMathMLContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, DisplayBorderBackgroundOutline(aBuilder, aLists); - BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists, - DISPLAY_CHILD_INLINE); + BuildDisplayListForNonBlockChildren(aBuilder, aLists, DISPLAY_CHILD_INLINE); #if defined(DEBUG) && defined(SHOW_BOUNDING_BOX) // for visual debug diff --git a/layout/mathml/nsMathMLContainerFrame.h b/layout/mathml/nsMathMLContainerFrame.h index 94ccf70d2..61c59a4fe 100644 --- a/layout/mathml/nsMathMLContainerFrame.h +++ b/layout/mathml/nsMathMLContainerFrame.h @@ -126,7 +126,6 @@ public: } virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) override; diff --git a/layout/mathml/nsMathMLSelectedFrame.cpp b/layout/mathml/nsMathMLSelectedFrame.cpp index 2378d0763..11eb14d83 100644 --- a/layout/mathml/nsMathMLSelectedFrame.cpp +++ b/layout/mathml/nsMathMLSelectedFrame.cpp @@ -71,14 +71,13 @@ nsMathMLSelectedFrame::SetInitialChildList(ChildListID aListID, // Only paint the selected child... void nsMathMLSelectedFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Report an error if something wrong was found in this frame. // We can't call nsDisplayMathMLError from here, // so ask nsMathMLContainerFrame to do the work for us. if (NS_MATHML_HAS_ERROR(mPresentationData.flags)) { - nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists); return; } @@ -89,7 +88,7 @@ nsMathMLSelectedFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // Put the child's background directly onto the content list nsDisplayListSet set(aLists, aLists.Content()); // The children should be in content order - BuildDisplayListForChild(aBuilder, childFrame, aDirtyRect, set); + BuildDisplayListForChild(aBuilder, childFrame, set); } #if defined(DEBUG) && defined(SHOW_BOUNDING_BOX) diff --git a/layout/mathml/nsMathMLSelectedFrame.h b/layout/mathml/nsMathMLSelectedFrame.h index ad523a594..872351829 100644 --- a/layout/mathml/nsMathMLSelectedFrame.h +++ b/layout/mathml/nsMathMLSelectedFrame.h @@ -26,7 +26,6 @@ public: ChildListChanged(int32_t aModType) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult diff --git a/layout/mathml/nsMathMLmencloseFrame.cpp b/layout/mathml/nsMathMLmencloseFrame.cpp index 64277a92e..236a5ab07 100644 --- a/layout/mathml/nsMathMLmencloseFrame.cpp +++ b/layout/mathml/nsMathMLmencloseFrame.cpp @@ -201,12 +201,11 @@ nsMathMLmencloseFrame::TransmitAutomaticData() void nsMathMLmencloseFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { ///////////// // paint the menclosed content - nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists); if (NS_MATHML_HAS_ERROR(mPresentationData.flags)) return; diff --git a/layout/mathml/nsMathMLmencloseFrame.h b/layout/mathml/nsMathMLmencloseFrame.h index 82d73b2cf..e9e7a2b0a 100644 --- a/layout/mathml/nsMathMLmencloseFrame.h +++ b/layout/mathml/nsMathMLmencloseFrame.h @@ -70,7 +70,6 @@ public: GetAdditionalStyleContext(int32_t aIndex) const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; NS_IMETHOD diff --git a/layout/mathml/nsMathMLmfencedFrame.cpp b/layout/mathml/nsMathMLmfencedFrame.cpp index a5f5ed4d9..bc663a571 100644 --- a/layout/mathml/nsMathMLmfencedFrame.cpp +++ b/layout/mathml/nsMathMLmfencedFrame.cpp @@ -161,12 +161,11 @@ nsMathMLmfencedFrame::CreateFencesAndSeparators(nsPresContext* aPresContext) void nsMathMLmfencedFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { ///////////// // display the content - nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists); //////////// // display fences and separators diff --git a/layout/mathml/nsMathMLmfencedFrame.h b/layout/mathml/nsMathMLmfencedFrame.h index 2d7535d0c..472e5aed9 100644 --- a/layout/mathml/nsMathMLmfencedFrame.h +++ b/layout/mathml/nsMathMLmfencedFrame.h @@ -41,7 +41,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void diff --git a/layout/mathml/nsMathMLmfracFrame.cpp b/layout/mathml/nsMathMLmfracFrame.cpp index 4e74faea2..731cca7d0 100644 --- a/layout/mathml/nsMathMLmfracFrame.cpp +++ b/layout/mathml/nsMathMLmfracFrame.cpp @@ -149,12 +149,11 @@ nsMathMLmfracFrame::CalcLineThickness(nsPresContext* aPresContext, void nsMathMLmfracFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { ///////////// // paint the numerator and denominator - nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists); ///////////// // paint the fraction line diff --git a/layout/mathml/nsMathMLmfracFrame.h b/layout/mathml/nsMathMLmfracFrame.h index 330a31180..8ced03694 100644 --- a/layout/mathml/nsMathMLmfracFrame.h +++ b/layout/mathml/nsMathMLmfracFrame.h @@ -67,7 +67,6 @@ public: ReflowOutput& aDesiredSize) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult diff --git a/layout/mathml/nsMathMLmoFrame.cpp b/layout/mathml/nsMathMLmoFrame.cpp index 591b46309..3ef7b88d0 100644 --- a/layout/mathml/nsMathMLmoFrame.cpp +++ b/layout/mathml/nsMathMLmoFrame.cpp @@ -78,14 +78,13 @@ nsMathMLmoFrame::UseMathMLChar() void nsMathMLmoFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { bool useMathMLChar = UseMathMLChar(); if (!useMathMLChar) { // let the base class do everything - nsMathMLTokenFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsMathMLTokenFrame::BuildDisplayList(aBuilder, aLists); } else { DisplayBorderBackgroundOutline(aBuilder, aLists); diff --git a/layout/mathml/nsMathMLmoFrame.h b/layout/mathml/nsMathMLmoFrame.h index f25107a20..15df62ac2 100644 --- a/layout/mathml/nsMathMLmoFrame.h +++ b/layout/mathml/nsMathMLmoFrame.h @@ -29,7 +29,6 @@ public: GetAdditionalStyleContext(int32_t aIndex) const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; NS_IMETHOD diff --git a/layout/mathml/nsMathMLmrootFrame.cpp b/layout/mathml/nsMathMLmrootFrame.cpp index 4c81bde3d..300adcb91 100644 --- a/layout/mathml/nsMathMLmrootFrame.cpp +++ b/layout/mathml/nsMathMLmrootFrame.cpp @@ -77,12 +77,11 @@ nsMathMLmrootFrame::TransmitAutomaticData() void nsMathMLmrootFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { ///////////// // paint the content we are square-rooting - nsMathMLContainerFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsMathMLContainerFrame::BuildDisplayList(aBuilder, aLists); ///////////// // paint the sqrt symbol diff --git a/layout/mathml/nsMathMLmrootFrame.h b/layout/mathml/nsMathMLmrootFrame.h index 0996af26b..ddf6f89a6 100644 --- a/layout/mathml/nsMathMLmrootFrame.h +++ b/layout/mathml/nsMathMLmrootFrame.h @@ -51,7 +51,6 @@ public: ReflowOutput& aDesiredSize) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; uint8_t diff --git a/layout/printing/ipc/RemotePrintJobParent.cpp b/layout/printing/ipc/RemotePrintJobParent.cpp index 2f4dbd56e..d49927da3 100644 --- a/layout/printing/ipc/RemotePrintJobParent.cpp +++ b/layout/printing/ipc/RemotePrintJobParent.cpp @@ -18,7 +18,6 @@ #include "nsIDeviceContextSpec.h" #include "nsIPrintSettings.h" #include "nsIWebProgressListener.h" -#include "PrintTranslator.h" namespace mozilla { namespace layout { diff --git a/layout/printing/ipc/RemotePrintJobParent.h b/layout/printing/ipc/RemotePrintJobParent.h index a96cc7eaa..752ef601e 100644 --- a/layout/printing/ipc/RemotePrintJobParent.h +++ b/layout/printing/ipc/RemotePrintJobParent.h @@ -13,11 +13,11 @@ #include "nsCOMPtr.h" #include "mozilla/RefPtr.h" #include "mozilla/UniquePtr.h" +#include "mozilla/layout/PrintTranslator.h" class nsDeviceContext; class nsIPrintSettings; class nsIWebProgressListener; -class PrintTranslator; namespace mozilla { namespace layout { diff --git a/layout/printing/moz.build b/layout/printing/moz.build index 1a82d7cdb..745c45c4b 100644 --- a/layout/printing/moz.build +++ b/layout/printing/moz.build @@ -13,11 +13,12 @@ XPIDL_SOURCES += [ EXPORTS.mozilla.layout += [ 'ipc/RemotePrintJobChild.h', 'ipc/RemotePrintJobParent.h', + 'PrintTranslator.h', ] XPIDL_MODULE = 'layout_printing' -UNIFIED_SOURCES += [ +SOURCES += [ 'ipc/RemotePrintJobChild.cpp', 'ipc/RemotePrintJobParent.cpp', 'nsPagePrintTimer.cpp', diff --git a/layout/printing/nsPrintData.cpp b/layout/printing/nsPrintData.cpp index 1914f779b..d760f7f0a 100644 --- a/layout/printing/nsPrintData.cpp +++ b/layout/printing/nsPrintData.cpp @@ -7,9 +7,11 @@ #include "nsIStringBundle.h" #include "nsIServiceManager.h" +#include "nsPIDOMWindow.h" #include "nsPrintObject.h" #include "nsPrintPreviewListener.h" #include "nsIWebProgressListener.h" +#include "nsIWidget.h" #include "mozilla/Services.h" //----------------------------------------------------- diff --git a/layout/printing/nsPrintEngine.cpp b/layout/printing/nsPrintEngine.cpp index f2db53250..67208447a 100644 --- a/layout/printing/nsPrintEngine.cpp +++ b/layout/printing/nsPrintEngine.cpp @@ -16,6 +16,7 @@ #include "nsPIDOMWindow.h" #include "nsIDocShell.h" #include "nsIURI.h" +#include "nsIFile.h" #include "nsITextToSubURI.h" #include "nsError.h" @@ -143,7 +144,7 @@ using namespace mozilla::dom; #define DUMP_LAYOUT_LEVEL 9 // this turns on the dumping of each doucment's layout info #ifndef PR_PL -static mozilla::LazyLogModule gPrintingLog("printing") +static mozilla::LazyLogModule gPrintingLog("printing"); #define PR_PL(_p1) MOZ_LOG(gPrintingLog, mozilla::LogLevel::Debug, _p1); #endif diff --git a/layout/printing/nsPrintObject.cpp b/layout/printing/nsPrintObject.cpp index 9165374c2..fe9622a1c 100644 --- a/layout/printing/nsPrintObject.cpp +++ b/layout/printing/nsPrintObject.cpp @@ -6,6 +6,7 @@ #include "nsPrintObject.h" #include "nsIContentViewer.h" #include "nsIDOMDocument.h" +#include "nsIDOMElement.h" #include "nsContentUtils.h" // for nsAutoScriptBlocker #include "nsIInterfaceRequestorUtils.h" #include "nsPIDOMWindow.h" @@ -14,6 +15,9 @@ #include "nsIDocShellTreeItem.h" #include "nsIBaseWindow.h" #include "nsIDocument.h" +#include "nsIWidget.h" +#include "mozilla/Unused.h" +#include "mozilla/dom/Element.h" //--------------------------------------------------- //-- nsPrintObject Class Impl diff --git a/layout/reftests/backgrounds/really-big-background.html b/layout/reftests/backgrounds/really-big-background.html index fd33d573a..741a7cbfa 100644 --- a/layout/reftests/backgrounds/really-big-background.html +++ b/layout/reftests/backgrounds/really-big-background.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<img style="background-image: url(really-big-background.png); width: 1600px; height: 1200px; position: absolute;"></img> +<img alt=" " style="background-image: url(really-big-background.png); width: 1600px; height: 1200px; position: absolute;"></img> diff --git a/layout/reftests/bugs/521602.html b/layout/reftests/bugs/521602.html index fa07eb1cd..4ef57ea9c 100644 --- a/layout/reftests/bugs/521602.html +++ b/layout/reftests/bugs/521602.html @@ -1,4 +1,5 @@ <body onload="document.getElementById('i').removeAttribute('src');"> <div style="outline: 1px solid black"> -<img id="i" src="data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%C8%00%00%00%C8%04%03%00%00%00_v%B3%AD%00%00%000PLTE%9D%0B%08%1F%20%1E231%3F%40%3EOQNefdnpm%7F%81~%97%99%96%9F%A1%9E%AE%B0%AD%CC%CE%CB%DE%E0%DD%FE%FF%FC%00%01%00%0F%11%0Di%C4%2B%A9%00%00%00%01tRNS%00%40%E6%D8%0f%00%00%00%01bKGD%00%88%05%1DH%00%00%00%10acTl%00%00%00%0B%00%00%00%00_v%B3%ADi%C4%2B%A9%0D%7Biv%00%00%09RIDATx%9C%ED%9C%7Dl%1Bg%1D%C7%7F%8E%ED8%CE%F9r%99x%1B*k3%95n%7Ft%0D%A1%A1%A4UI%14Q%10%8C%0D%16%A6%F1%07bJ%B32%40%1A%D2%9A%B5%EB%3A%A8%D6%1A1i%7FtL%E9%10%FFP%91%1A%A11%ED%0F2%B7i%95i%DE%1C%0B%26U%02%AD%98l%EAx%99%8A%9Bvi%DAd%97g%0C%8DVE9%9E%B7%7B%B3%EF.%CFs%F6y%DA%C8%CF9%FB%9E%97%BB%CF%3Do%DF%E7wO%7C%06%A8%B6%0E%C7%FEO%BF%C0%3E%2B5%B9%EA4'%A4%D8%D3%18%88%5Em%B3%8E%C4%EE%9CO%269%0B%BC%80%D6%A5%7C%9DE%10%B0%89%BD%D1CR%FF%8AG%0Fi%D1%9BP%12(%9Ch%02%04%3A%1A%04%09%3CM%B1!%90'%E0p%D0y%8A%8D%60(w%C0%9B%D7%03%D2%CF%EC%2F%D5%0FI%E2b%7C%2B%20%3D%B1%3CR%3F%24%8E%B7%23%F5%9FfeHC%EA%3D%C8%12%B8%BA~%135%24%DD%03%E5%AFF%0DQ7%C0rO%E8%A3%DBG%C5%F2%BD%0Ec%A1%19%B0%7B%BBX%BEc0%18%9A%A1%5C%FF%7DI%24_r%00%A4j%EB~%A7%3C%A4%86~%FB5%91%83~%B2S%0A2%F3%C0%0F%1D%A1D%EE%D5%1D%02%07)%0B%EB%E1%AA%04%E4qx%C5%11Jf%D5%B7%04%0E%8A%0D-%C0%F4%9D%E2%90%EDp%0EZ%07%CDP%BA%A7mA%E0%A0%F1%3Fu%822%F0ia%C8%1Dp(%F3%99%9C%19%CA%CC%1D%12%E9%C3%3B%D2r%83%E4%E7Ss%CFo%B4B%F1%E1%1F%8B%1Ct)5%24%C3P%EF%D37%5C%B3%83%FB%9E%12%99%D2%94%2B)%C11%CB%2Cq%B1w%5B%D9%0E%F6%AC%13%19%C8%CA%A2%24d%D1%19j%BFsN%A4%1E%14%24%07%99%D0%9D%C3%24%F9%E8%8D%5D%02%07%A9y%0C)%BC%2C%CAP%8D%D3%CB%B7%DB%CD%10%7Bv%7BE%E8%B8%D4w%40_%1A%14%84%A4%16%E0%AFw%CD%DEk%06%3B%A6%FAE%86%09%40%9B%0E%1BAPK!F%DAy*k%06%8BS%5D%97%C4%0E%9C%04%ED%85M%82%90Iw%B08U%E9%15%3C%12%E2%FF.%AF%9C%89%DA%14%C0%1F%0F8%20%85%C5%DD%A2%90%E7%07Es%9E%84_%9F%DF%60%07%CF%E4%173%A2%87%BE%2B%DC%8B%13%BB%B6%E6%1DU%D6%D2%BF%BE%E4%97%F5%25%D5%99t%02%DE%10%86%A8%FB%B6%FCj%AF3b%E6%B2O%CEV%FD%9B%D9%87%0Ffy%E8%95K%10%CF%89B%C4%ED%E0%93kwe%E3%5C%0F%D2%E7%F3pN%B4%DD%25l%1E%BAg!1%C2%02%1D%FD%00%BFh%3C%03%DEV%DE%99-'x%3B%A4%AE%00%049%F5am%B1u%EF%DA%B1%E9%2C%0F%3D%9E%86%91%08%20%0B%DAk%5B%F4Y%AB%1D%C6%23%40%00%7C%F9%A1%13%07%E6%BB%CCP%E6%3F%91%40%5E%D7%F5%BE%CB%D6%B8Mv%06%DF3%86%B4%17t%5D_%3A%96%E5!%AD%0F%A4fyA%D37%8D%8F%8E%FFm%9E7J%FB%8E%DA%B5%99J%FD%90K%AFI%2C%E0%84%86t%E0%B9%1D%94R%24'7%EDZ%C7%CAy%EA%B7%F7%05%12E%C3C%BC%09%0D%BFj%AB%B6j%0D4%03Id%C6y5y%84%06%12%0C%24%93%B9%E9%10%8DT%17%02%03%0C%03%13I%5D%E0%18%12%89%0C%92%8Ew4%BE%917D3%19%B2%10zq%F8%94%1A%D28%84%9D%1C%0C%8D7%80%C1_%F4ZH6%E9%E2%D8%10%00%C4%20%C8%8C%E7%10D%03l%8Ff%0C%09%D1%B4*%08%AE%3B%D6%00%B8%9A%0C%C3%A0%9B%05%09Y%5D%1A%3D%BD%0D%D1%CC%92%D8E%05%1B%02%B2e%E1%10%DC%9E%B4U%C85%1A%24%D6%B0!%3C%CE%0D%91%C2%F0%1AF%B4%86p%BB%02%EF%5Df%9B%D0%9Ee%D0%8D%D4%1D%85%90%FD0%7DY%F6%98%10%C3%1E%B4p%83L%C0J%F6%AElw%11%B7f%FC%1B%EB%FD5%EFF%8D%AC%D5%82%20!%D4%25Z%88F%86%BA%C1%86%B2%C6D_%A3C%90%C9%B2)%F9d%18%D2%D1jP9%23%8A%AF%89O%A9%9A%25!H%B3%F4%98%08%3BW%19%A6%F1Ts%90%C6%B5%07%D84%20U%12%AE%E5%F4hS%CB5%06A%A6%B6%819%178%B4KfJ5%5C%10*%FAD%D8%11BL%E5%5D%10%83H%3F%92%87%A0*%88y%F1%A4%FAL%95w%96%C2%9A%D0%24%20%06%B2%9B%00%98%E8%5B%CD%C0%E7%5C%ABMX%B3%85%80h%5C%CF%11%BFLD%3D%056%BF%D0%1D%C4.%C5%EC%5Df_%94r%D8%C2%88%B6%B4E'%C0%B6E7%93%ACZc%8Du%5B%AA%87d%DC%D0%DE%1B%19%04%8F%15%EE%86%D7%D7%3FL%99%A7%E2M%AFY%A3%0A%C5%05%07%19a%9C%DF*%E3%9Aj%EB%06%D1s%AEW4%1E5%10%E2%D6r%13B%D5%98%EExs%F4%0Bb%14%03%F9%40%0C%26%C7%B8%26%03%D4Pt%BDK%F3%830q%C4%82%D8%18%88%E6~%01%9FGp%83%B0%3B%3D%FF%DE%25%061e%DE%D9%BB%D8%9D%22%A2%FD%8BBxl%1D%25%E1%C5%09%25%FA%A2%0D_%17D%CE%9A%02%F9%F0Xuu!%9F%FDp%0A%A3yA%D0%07%15%C2%E4%9Dm%40%BD-%B2P%C3g*%EEq%D9%DE%BF%E1%9C%14%C4%98%1Au%0F%C1!%F4%60.%D4P%7F%D1%99%60y%9An%87R%0C%E2%12G%C7B%0D_%C1%B1%12%98%B3_%E5%E0%87%80%B0%5B%1E%06%A1%F3%A3%E5%CB%23%B6%8Ac%03%88%C7%1A%16%82%1C%25%01%2B%91O%C6U%A5%90%818d%9EM%81%F6%8D%17XUop%1F%DF%D9%1E%C2%10%C3p%F6.v%1C%5D%A8%01%E6N%B0%DE%85%98%F7o%B8z%97puy%94%ACA%99%02L%C8%8B%AB%13%22%D6%F3%FF%7F'%05%E9%95%D1P%90%95%D3%EB%BF%17k%0A%C4%1C%8B%88%DF%C2k%C4%8F%A7%1B%5B%BC1%EF%B1%EB2%8D%2B%3DX%8B%CE%86%F5%0Av%1E%E5%20%96%04%3A%97s%EC%AD%B1%10%B3%BA%22%858%A7%26'%A4~%B3%17%CA%18%C4p%BD%04%20g%F5%AF%0B%40%2C%97%9D%2F%D6%BBz%17h%2B%F5%AE%BDpJ%A40Uf%FF'C%C8%AEC%98%C7J%24!%15h%ED%8C%1Cr%13%B4W%E4!%92%F6%BDr%BC'r%C8%99O%0C%0FE%0Ei%BF%B0%24%F2%DD%EB%FALYX%FC%C6H%E4%90%8BC%13b_%5D%0Dk*%FE%5B%CA%17%A3%AD%AF%C4%85%3C%5C%80%89%EEH%FF%A9%14%FF%E5%BB%E5%05%18%9E%0C1%1C%C5-14%BD%06%D4ee%3EJH%1A)7%40%EB%5B%B03J%88%BA%003%A3%E3%A3P%1C%8B%12%F2N%EF%E6%F7.%03%B4t%F1%88(%BEzu%9F%CCC%93am%DDp%B9%3DGv%A2%AC%AEO6%E3%EBpG%9A%019S%FD%80Y%14%0D%1F%FBn%13%1A%3E%CC%F4.m%99%2BM%80%C0%96f%40%8A%A5%26%40%E2%D1%3B%11%003%A2%0Fi%D4c%0F5%81%01%DB%9A%01%F9%F0%7Fcd%D5%3E%80%F6%CC%A9%B1%18%D0_%7B%88n%DESo%82%DBN%12H%E1eYH%06r%829%D3%230%F5m%FCyq%FD%E6%A7%24!%007%0B%8E%CEd%0E%E2X%F6T%3C%1F%3D(%0D%99%F8%AFX%3E%7C%5B%FEg%7C%3D%A9%0A%C09I%D5%98%06%5DP%95%139%20%B5%15%C7%90%8EQ9%C8fxR0gzP!%EEA%82%40%B2r%90%BE%C0TW%B5%7Cq%80%04%DB%B0%E7%D9%91%93%83%7C%3F(Quy6%CA%F1%DE%DE%CF%1F(%DC%06p%7C%AE%2C%059%1E%94X%F5Tp%9C%BE%17%BF%B2%E7%ED%3F%C8%3C%5BM%0E%1C%018%FD%A8%F7%95%25%DD%0D%DCB%DF%D5%FD%3F%C2%D7%B6%D1%2B%BF%9F%A9%F0%B1%F2%D9%8F%3F%5C%EB%F1%3D%87%B7%98%BB%AB%C6%1D%FB%87e%20%00g%AF%DER%F6x%B6%ED%9F%25x%E3%A0%BB%80%F1%9AL%C2%A6%90%DF%A3%F8TMtr%0C%EE%D9%D5%D5(%C8%F4Q%F2%94q-%BBS%E9T%DD%0FE%86%5E%DC%CC%C0%1A%FCn%3F%F3n%DB%B6%B6Q%F8%9C%2B%26%B4%C2%B7%02i%F3X%B66e%FA%F4(%B8%1E%F6%0C_%5D1z%EF%E8%E5%1F%A7o%1D%82%FB%DD%90%B0%DE%D44%7D%FF%92W%D2%D3%F3%2F%5EsE%C4%7F%F7%C4c%A1%20%CF%90%B7%CC%7C%C1%23IY%BB4%E2%8AH%AD%EB%DB%E7u%8E%A9%FD%3F%0B%86%3CBO%A7%EB%9E5%D1%EF%0Ef%0Aw%7B%3E%F5%DAW%B8'%B0%22'u%D8%EA%2Fv%0FTG%A4%0Fz%9D%AD%07%5E%AA%04A%D6%FF%03%F6%F8OZ%8FTG%24%1E%2Cyd%EB%F7%1Ag%0E%23%BF%0F%B0%D57%F5%E9%EA%88%9D%7B%BC%B2%1D%3F%BC3%87%3FR~7%8Ad)%F2%07%BE%90bUM%26%E7o%F7%CA%96%B9%FB%3C%F98r%D2%A7e%F4%1C%A8%FE%0F%FE%9E%CB%B9%C3%C3%A3%DE%F7%E73K%25%DC%7B%E6%8E%FA%2Ci%DF2%00%9F%F5%BF%87%8C%8D%B4%3B%2F%EE%E4u%C5%F34jw%1F%1E%D1%A9%8Ft%FB%2C%D1%1E*%C3%A4%7F%EFJl%DA%B0%DBNM%CD%96%DA%3C%2Fh%E6%BD%03%B8%84'%F2%99%81%C7%DE%F4J%FF%CB%10(%83%BE%90%D4%F9%7CK%D6%0AM%AC%81%96%8F%96js%FD%DD8z%F5%C6%C2%A99%DC%86K%9E%3F%13%82%FB%5E%CD%02%8E%FD%B5)%E52hlYl%A0%26%97%94%E1%CEQuu%B6%A2%AB%CBc%C7XuU%7CK%CB%EC%D9%15%D2k%CC9ml%E7%8FQ%AF%04Y%C1%FE%07o%F8A%AA-%A1%E6%92%00%00%00%19fcTl%00%00%00%00%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%94'%03%1A%00%00%00%07tIME%07%D7%03%10%13'06*4%98%00%00%09%FAfdAt%00%00%00%01x%9C%ED%9C%7Fl%13%E7%19%C7%1F%9C%B3%7D%B1%CF%17%CARu%A0%8C%98%B6%ACe%A2%FC%A82Z%AD%40L%E3B%60%2Cf%1B%9DhG%87)%EA4%8D%AC%09P%B6I%9D%C6%A5%FCJiJ%A2%89J%FC%01%E5%A0%D34ihN%A7%89U%FBc9%13%83%C2f%E2%AC%B4%1A%D3%D8r%10RX%D7.8%09%E4%97%C3%ED%CE%B1%E3_w%E7%E7%3D%E7%22M%CAW%89%7D%EF%FB%3E%EF%FBy%7D%AF%EF%7D%DF%7B%EE%7D%0D%90%AD%92%B4%E3c%DF%98x%BF%93cU%A0%D2!%11%CF%D4%40%A4l%0D%A4%25V%B6j%18%91I%B7%02%F6%A8P%E0G%40%A8%ED%80%F9%10%FA%0B%94%F9%90%22i%1A%3E%09%84%DB%A7%01%02%25S%04%D1-%262%25%90%E3pB%AF%9C%C8T0%98%AD%F0y%99NzwcW%E1%10%9B%00%F0%7D%9Dtky%7D%E1%10J%FE%3FSx1%F9!Sr%DE%F5d%15%00~o6%C4%E1%01%F1%05%B3!%EC%0A(%F7%18%CE%ED%E4pv%BD%C0%1Bf%C0%AE%8D8%BB%D3%B0%C90%83)%BB%82%BA%8Al%3E%F0%90%94%BBWH%0B%D0%FE%3F%7C%17%93%E9%17%DB%89%20%3D%AF%FF%2C-dm%FD%D7fD%26%26V%01s%09%20%EF%C0%C7i!%5B%0B%7B%0F%91%C9%E2%8FA%F0%25%3Cd%23%F4%81%7D%B2%11%1D%9E%E2%18%22S%E0%9A%1B%18%DFW%D1%90%AD%D0%E0Z%DE%9A%0C%B9%86%1A8D%A6%CD%F2%C5H%A2_v%0C%BD%BFr2D%D5%BD%85%C94L%FBI%18%ECni%C5%BCT%F0%D0)%01%91%89%19%A39%12%88%F5%AEw%83%98%0Az%16%F0%18%C88!d%3C%3D%E4%7Ci%C8%8F%81%CC%26%83%B4I%E9%97%89%ED%CDE%CB%10%99XA%86%84%3B%B1%0C%F6%81%AB%E5%2F%0A%93A%CB%07%1Bq%F3p%BA%16%A4(%B6%F7%A2c%F0%EFo%0E%FC(%19%2C%E9%A8%C1%5C%26%00%C5%12%AC%04d_%0A%16%5E~%E9hI%06%23%1D%CB%86q%19C0%EB%D2j%24%24%94%19%8Ct%DC%F1%22s%02%F5%A0%88%B4%EC%00%F8GS%1A%24%3C%BE%0B%0By%1F%3D%A0%5C%80%DF%F5%AFH%05%BB%85q%176k)%87%B5%B4%EEY%2F%A4%9D%B2%A2%9A%0A%CD1%EB2%9B%9E%D4%0E%B7%D1%10%F6%D0%DA%DF%1EH%8F%E8%19%D5%B0%B4K%2F%B7%1ClN~E%3E%1E%06%AAU%C3RE%CC%B6%91%8Cp%1D%AFn%D7%7Cr%E9%9E%16%CA%3F%11p%F4%0B%D0'%E2!%CA%A5%92%AEnN%D5%8A%1D%81%CA%01%B0%26f%B8%255%00%BF%22%60%00%9Dy%8D%2FW%3F%0B%CC%7Df%CE%80hM%D4%80%1E%03%D0%9B%D4%E7%C86%3B%3D%E4%A8%10%D4!%E3%F6%03K%F9%60%B2M%DEq%00%D1%B4%3D%E8I%0FY%02%EA%1066%EB%E6Zi%40L%86%03%24%08%B0%0FnI%2F%B6M%EBF%EC%3Bo%B47%8DLv%D1%AE%2F%12A%EA%3C%19%C1%DDZ7%04%BD%92T%3D%3Ay%DD%DA%DC%FA%F7%8C%99r%0C%8B%19a%AF%16%E4%92%24I%D1%D3%C96%99U%0D~%3C%C4%16%F5fT%E9%91%C8QU%BBbiu%80%0B%7C%3A%92%A8%92ss%AEoF%AD%FF%D6%F2%CCDU!%F4%F0%CD%7C%0E%9C%92%DC(%0DWT8%D4%A7%1A%EF%1C%96%CB%60%80%D1%99%8E%E3!%EA%B6%B2%E6i%C4O)D3%DETHA%0D%3F%A8%01%A1%08%3Cw3%9A%D1%8Cf4%A3%2C9%1B%09%26%C8%86!%DER%D1%7C%0A%04%B9i%80%D8%3D%D3%00%A1%DD%26%03%AE%5DZ%07%1F%1AwM%A2%C4%94zO%09%DB%04s!%96z%B0%BC%FA%A0%B9%0C%F9%D6%19l%D5%F3a%0A%9Ei%E8H%BE%E9%B0%97%B7%C2%9A%96%FC%A6%C6UR%0F%1F%0E%C9S-%A4%E3%C4%98%1C%83%87%97%0B%00%C3%CBE3)%17%7C%FDr%83%BC%10!%FF%16%B3%AF-F%DB%B6y%FD%F2%AD%B7%7D%24%AFa%B6%ECo%7F%0Bm%DB%F07%B9%FC%EB%FF%5Dpm3Y%E3%3B%7F%0D%01%1Ek%FC44%D7%82%7DYd%CD%A0%88'%1C%F0z%2Bc%40qHs%D7%7D%F9%AE%AF%C2%5B%E6(%F7%E3%190%B6M%AA%1D%03%3B%16R%2C%B7%F8%ED%A5%D1!%F8%8C%E4%82%F4%F5%BF%0D%83%C2u%01i%5E4%D1%12%01%A2%06q%CE%A9%07%B8W%8Ey%0C%11W%F7Dm%AC8_iB%96%A62%0E%C6%F0%F6%FB%26%DE%98%BB%24%90%12%08%B8a%1D%DE%FE%91%C4%7B%A5H%00)%E2%B7%FB%A1%01m%CE%0C%25%0E%EAH%A6%2C%CC%C2G%1F%96%AA%FCXs%F6d%E2%A0%99%23%80%C0%8D%C0%CE%F6W%7D%D5%24Y%14%B5%11A%E0e%A8%13%5CaRH%84%0C%F25%03%9D%1D)%84%99%7FZ0%1DB%BD%B5%CA%00C%07%C2%AE%C9%7DRq*%C4%1B%81%04j%B5R%EC%AD%B6%9C%B8%3A%A9T0%00i%93%BE%A4%91R%222%9Ff%C7%FD%FD%DD%E3%22%BE%EC%12%15G%0D%97i%12%01%B8%19%3F%A0Tl%F5%1C%3B)H%F2%80I%C5e%B9%A2%FA%00%0E%02%B3%CC%5C%7F%17%C5%7DR%E6%AC%AC7%17%C2H%2B%FE%D9%5C%ABS%D8T%40%AC%D1%CA%E8%CF%F5%0A%CB%0F%C9%DF%F0E%AB%98%CB%F1%03%C3%0D%8FP7%99%F7%DD%98%827%F13E%C3%0AA%F3%D7M%87%5C%01W%83%A9w%16%8A%A6aQ%A1%3C%C9%22%98%FB%18S%F8%CF%C30%CA%9B%CB%E8%ADx6%BA%F2%CENS%19%EC3%E0%DA10%FB%03S!%B4%3C%1B%BF%E1%F3%FF%D4D%82%DCc%08%F2%DBa%C1%DC%8BQY%E3I%BB%8B%3D%E6Bx%00%DB%9Dv%D1%5C%88%3C%F1%09%C5%B0%2B%1E%8CB%22%5B%F6%CF%8F%95%A2V%8F%19%87%B0%8DG%1Cf%3F%DCQ%C6%3C%B2u%3B3%90%19%C8%0C%E4%FF%19%12%EE4%1F%D2%5BQu%1C%01%B9%25%7D%AF%00%C83%00%BB%10%90%03p%B1%00%882%C6%23%20e%86g%80%891%9EB%40%EE%80%DDm%0C%02%133T%0A1%0F%5E%02N%E3%BB%95(%1E7%15%FE%B1Hy%8CC%9E%C0m%18%E9~%BC%CEo%1C%D2%BCe%FF%00%02%E2%1C%8C%A2%9D%9E%99%A2G%80%EAl%3C%829%5DLl%7C%9B%B1%1D%1F%3B%7B'%1A%1E%03%B9%EBo%23r%C7%26%E5%E4%E8%16%14%84%95%FF%A2B%C4%D0%F9%B2%8A%EC%12%14%C4%3A(%C0%20%B4U%E6%B3S%13%05%CC%7C%14%84%FAM%A9%18%83%BA%90%DB%00%C4%D6U%C4%E1%3E%89%3F%B8%18%D8r%C6%88S%92%AD%BC%87kx%C7l%E6a%B0%DF%83%ED%06%20%E0%9C%8F%83%B01%E8%E1%02%1CDx%03%90%9EE%13%90%1F46%EAC%E6x%AB%1E%1A%05(J.SD-%BDJ%E8%F4%93%22%0A%B2%3B%AB%C8%5C%0B%1D7%D2%B1%E7%9B%02%F5%F9O%17%B3%A0Nt%C6%1D%FD%BC%96%89%0E%24%D4.Uq%E1%CE%7C%90%E0W%0C9%D5%12%BA%02%9F%DC%DE%5BQu%2C%0Fd%EB%99B%20%96.%D7%C21%80%7Dy%20%7Cw%F6RO%92%86w%3E%06%ED%CA%18%9F%EF%C1%8A%E5%B5%7C%0D%AF%A7%F5%9B(%0E1%C6%170%BC%CB%3AW%AB%ACg%CE%3B%C6%BB%0A%F2%22Y%8E%2B%B3%C7%FC%E3%C9%DAB%20t5%8D%1A%E3%23%85%ACKp%C5h%1Ff%8CO.w7%24%FB%E3%F4Q%CC%18%DFS%88%CB%A2%3D%84k%937%0A%60%B8V%1D%C2A6%14%00%B1%09%1B%14%88%25o%B3%E6%AD%85%8E%FA%3AG%2Fr%08w%7FA%FAH%EE%22%FCfC%9C%7C%FC)%87%B9%10%BAe%1A%20v%C1l%08s%19%A8.%B3!%E7.%F2%160%19%C2.%81U%17%14H%B8%93%14%E2%02%EC%F2%01G%3Dt%FCP~%BF%5BQu%8A%10%02%F0%A4%80%B3%B3%B5%02%25w%7B%EC%D8%E4J%0D%02%B5i%3D%E0%CD%92%DCa%FDU%98%D8%15%D4%87%ACWRA%90%90%BD%B2%B5%15%94%B3E)%0D%CF%91A%AA%E0d~%A3%B8%1C%9B%18%B7%C2R%20%84%CF%B3%F4Wg%08%E9%81o%FB%94%601%2FC%08%97%C7%FED%2F%91u%A7%87%98%F3%5E%EF%BA%A6%F0*%80%F3C%22%11%E4%BC%5Eb%D6%AE%60*%FE%1A%D9%B2%FF%FEG%24%7B%AB%95%8C%F2%2C%FD%EA%9B%EA5%B3q%19%C1%A2%F8%2B%DBxD%AE%DBJ%15sM%B1%F0e%F1%D6c%07%DD9%09%7F%94%FF-BV%85R%3AA%02%01%B85%F7)Qeo%DB%F5.%B8%DD%2CjB%08%C5(%BFG%F1DN%B4%8D%87W%F6d%EE%EB-%00%12%3C%AB%EC2%CEe%BB%197%9B%B9)r%96Q%84%0B%94%E7l%A9%3D%EF)m(%E6%E0%B9%8C%18%C3%3D%BC%1D%DC%F2%ABE%E5%12%0E%5E%E5%20c%B3%A7%F1%D3e%89%DF%3B%AA%CD%8F%1DO%FBao%26D0%08%09%C6_%9FWKzo%E4%2F%F32%22%A8%3F%1DW%DF%2B%97O%E7%94%17%D7%88%DA%DA%2Ffi4%D3%2BF%2F%A8%3E%A4VFG%E3%BB%FA%90%C3%F1%E2%E2%8E%D8%5C%D5d%06%5D%E1%1D%AA%BB%5E%AB%C3%AF%A8fO*%24%C1z%B5%7C%13z%3D%3B%C2%D1%ACV%9A%07.%EBzg%2B%3E%83%FD%DA%83%D6%E1%EC%08%EB%3E%B5%A9v%8D%DAu%96%26%E5%F7%01%D6k%A6%BE%97%1D%B1%7D%BF%9A%D9%F9%13%DB%95%01%86%D6%BAQT%5C%91%DA%8F%D6%23bf%D86%F2%A2%9A%99kG%BF%F2v%E6%82%A0%5E%8C%D4%0A%AC%F6%C6%DF%BE%AC%11%B0%8Es%AB%DA%F5D%BB%945%9Ag%3D%EA%C5%3C%E5%83g%FD%9A%10K%BD3%BDr%17%CA%18%D5b%D8%CAj%5E%3E%5B%8FVj%B8h%1BD%08%89%9A%10%EB%EA%15%BBR%A9%F4%40W%B1j%85z%1Ejr%CB%B7%93%82%CBw%F4s%B5%F4%1B~%60%B4%17%9D%D3%FDBQ%AAWk%5B%0CE%0BU%BE%5D%FFy%E0%EC%DCE%E1%8BCr%1BFU%7F%26D%FE%EE%E9%2C%9BbFa%16%1F%3F%F2i%2C%B1BJ%FErd%D5.%D5%A3%B3%E5%FCi1~%94%EFQ%08%F1%0A%93%F4accb!W%81%BF%0E%F7%3FB%09%85%E9%1Cj%D9V%00%00%00%19fcTl%00%00%00%02%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%BAw%CA%9A%00%00%0A%13fdAt%00%00%00%03x%9C%ED%9Cml%14%C7%19%C7%1F%EE%D6%F7%BA%BBg%A5%14%C2K%B0!%B4%B4%89%83%1D%C5%16%B4%25p%0EN!%C1%C1(%15%C1m%1A%7C%A5m%40%0D%89%1D%88H%3E%B4b%C1%07v%89%5B%13%8A%E0K%80%B3jW%FD%80bS%C0%FD%12%D5k%03%09%A9%AE%9C%23%DA%A6%A9%D2%B0%60%14%91%C8*%18%1B%02%B6%F1v%F6%DE%7C%B7w%B3%FB%EC%9E%D7%AD*%FF%A5%BB%9D%9Byv%7F%BB%3B%3B%2F%CF%EC%CC%01%A8%E5K%86%5CB%22t%23%C3*G%A5%40%02%13%05%91%D5%1AL%26y%FDT%23c%D2%E2sc9%5E%00J%0FM%06%248%19%90%CB%22%17%7C%DAj%88%7Bqg%F8%98%D5%10x%F2%19%B8.Y%0D%E9%0B%8A%1B%ACf%00%F0%8B%16%5B%0F%81Z%D1z%06%7B%D3z%06%7CX%3BQG%E2%7F%22%D0RJ%7D%94%14%C3r%15%8FPR%F2%96G%26%0A%D2%FD%FE%5DJJm%E5)%AD%1D%CF%8Bx%C8%1F%A1%86b%7D%B0%E0%EB%1A%FBy%1E%5D%8B%874%C2%95u%94%24%F6%9B%1A%FB%F9%FA%9F3%02q%E6S%92%F8%7B%AA%88%FE%0BG%92%E1%AB%60%13%D1%90Np%15R%92%3C%25%AA%88%0D%DB%9B%85D%F8lJ%03%AD%AB%1E%F1%C4~J%12%A3N%A8%04G%B2%C1%BF%08N%DAm%CE%D4N%99z%E7%BB%25UD%1B%B0I%88%EDxw%08%CBp%0C%88%D4%B4%D5%19%C6K%EB%13g%CF5L_%85e%40%F3p%1D-%C9%3D%AA%8A%60W%0C%7C_%F2T%C6x%E5%F8%9B%C5%CD%CC%F7%D3%D2%9C%EA%8Bl%3F%B0)%E4)%0ED%C3%D3n%0Bh%88%7B%8B%9F%5E%A6%3EN%87%B0%A3%D7%8F%2F%5Cp4%F6%23%B2%10%0FaN%D5%ED%C3%DA%BA%96w%F5%F6'%B8%ED%15%06%20g%EB%DE%C3%DA%B2%C5%0B%C6%7Flz%CD%00%A4%CD%3FM%C2Sf%25%C3%8F%06%03h%88%AB%2C%3F%2F%84%B6~*%19%E2%E5%06%3Fz7%A8%1A%C9%A8%3C%E8%AAL%86X%B9%9AV%E3)%A9K%1B%D2%BA%20%9F%17%ACy%00%0D!%0Fb%7F%2C%E4%1E%A8T%D7%9E)%3A%D3%0Bei%11%C7B%7B%D1%90J%F8%2C%EE%090O.%1E%A6%DB%FD%0E%60wZ%84k%EEU4d%87%EB%AB%BB%E2%90g%EE%D0%CF%ED%DC%80%04%DB%D3%A3%9E%08%A1!%EE%07%3F%8D7%96%CE%B1M%7F%A1Z%C9%F3E%A7%AAJ%DA6%D4%8B%858%03%8Ex%06%F2G%18%EA%ED%3A%F6m%9B%3C%24%A6%C7%ED93%17%0B%E1%FD%5D%1D%890'%0B%D9%8D%B8%19%A0%BE%0E%C5%D9%D9%84%85%C0%E1%94%EA%FDG%94%A7%D2%B1%18%BCC%EA%C8%0Dp%85rN%99%B2%0D%04%92%E1%AE%17)6%A4%ED(8%9E%1E%C7%CF%06%8FF%B9J%97%E7%FE_%25%F7%7B%EC%20%05%12%20%F5%8F%9C%9E%CF%EEy%00%F8%E2X%94%0C1sfRN%E4fQ%D5%80%AA%AB%DE-%00%FC%0C%0D%19%2F%1C%5D%7B2r7%AE6%F9%8D%DA4%EF%9D%ED%1C%94%94%BE%17V%E3%BD%E3%9A.%3F%CD%E8%87'%E4gS%7F%17%CB%1B%C1%08%C4%96%7C%84%CB%BBB4%23%AF%BC%7BSG%CAo%B9I%F9%DE%FB%5BjoB%A5%BC%ADR%3C4%BDV%A2%19%D9n%AE%9A%99%DA%CD%A8%8A%9E%CE%EE%E7%91%0Cp%25%8A%20%2F%D3%FBR%5C%D5%CC%3B)%05%3Cc%B4%E5N%96%7Dh%233%19%25..Fo%00'%9BoE%1B%8A%A2%F9a%BA%FE%D9%14D%2B%FE%BF%93%F1S%9A%D2%94%A64%A5)%E5%AA%9E%8Awr%D9%9Do%C2X5%3F1(%E6%00%E9%3B%89%F1%D8%FA%E1%04%BE%7B%9F%A9%8D%9C%88%B2%F3%DEV%BE%3D!3%0C%B2%D7K8%CB*%E5%CBv%DB%0C%24O%84%3D8%CBf%91%7C%F9%0AD%13%10F%C4%BDj%F3%1E%8D%08dc%0B%FAM%40%1C%FBa3%C2%8C%DD%5E%DE%A3%F4%F8%99%26%9A%0F%A5%A1%FE%F3%0Fx%E7!%ECZ%BF%F8%F8%2B~P%DE%FAj%8D%D1g%D7%DF%0Bd%0D_%22EkH%C6%2B%10%B6%B0E2%C8p%DD%16%23%EB%2F%60%2C_!%19%AF%40%A0%E8r%C8%20%E4-%11J%BBQ%96%D7D%A8%89%BAu%87%9C%85%06!_%03%CF(%D3%A1oG%BC%B0%C7V%16oU%02%7D%DCp%D8%18%E4%1B%60%F7%BBq%A3%D1l%B8%BFf%E6%F1p%B8%FD%E5bT%26%8E%AB6t)%C4j%0C%E5%A5%C9%FB%CE%01%D2%D9%9F~h%FA%CB%86%18%E0%1Ai%97%E0~%AC%B1%00%5C%98%DC*%03%2Fyb%FA%D7%1E%F5%88%A0%06%24~_%0D%3F%5Ep0%0C%97E%24%C4%1F%DB%BA%D1%E3F%09%D9%E5%3A%2F%EA%F1%22%F5u%DC%3F%E4%D1%83y%09%B1%B4%81%BC%2C%A6%89%D9%17o%18%85%40%15%F2%3AHQIT%8D%7F5%0C%89%88h%D3%C4%10%A9%DD0%E4z%00m%9Axv%1D%A2QH%3B~%9E%CB%B1x%8F%C3m%18%B2%9E%F6%9E%3AS%97%84%D8%96%0D%19dp%23%F8%F9%14v%7F%1C%22%18%840%25%BFA%DB%26*y%EEM%D1%18%E4-%F1%92%84%B5u%C5K%23%2B%DF4Fi%BEyr%8B%80%B4%F5e%19%A8%A1%ED%CBd%B1%D5%1A%D8%19%87d%89C%0EEqB%F6%F8%09%85%E8%C6%FFoB%3E%C9%09%82%CBxvh%E3%2F~y%D6l%C6%23E%1A%C1%D2%83%E2%04%1D%8C%A6%C3%00%AB%B5%A6%82L%88%D6%00_%80%1D%DE7%A8q%9F%B0%12v%15i%18%E6%A2E%C9P%B0%FCK%C9%22%C8%C5%C7%13!%FB%BB%E8w%93%86%F5j(%1C%F3%0F%AA-C%90%E2q_%E9Je%C2%8C%13%FFv%DD%B8%F8%EF%00%EC%00C%3D%13%E3Rz%B1W%08%60%A9%85%8C%E8%3C(%D2'%7F%BF%D0J%88%2F%06%A9Aw%16MAB%A4G%16%80z%AB%0Ab%0CB%0AJ%E4.T%A3%A7%BA%98%82D%AA%EB%07%E7%FFi%EE%DF%2C%85%F0%8D%FB%98%0F%A6%E7%7F%D7R%08(%035%C1%86%5C%86%C5%90%10h%11%AD%87x%F0%5Dk%B3%10%1F%1C%0BM%02%A4%FC%05%EB!V%BF%3A%F4%01%A2W5%05%89%8A%25%99!N%C2%950b%F8%82%F5%90%D3%A5%2B%AD%5D%99%C0%EF%07f%0E%C0N%84)%5B%F1s%93%903%3F%00%86%B4%F1%D7E%7DS%DB%DB%A7i%D3%83u%B4%CC!2%02%C9xA%DF%D4%0Ep%D4%14%C3%13%80%E5y%0A%04q%8E%8C2%B5%D8%8CH%07%A2RYV%A5t%26%F4d3%FB%A4%BB%05X%ECz%24u%CA%92%C6%09%05%E0%B2)%08%B7%CE%1DpUU%D7cjGn%A8%A1L%DF*%9B%DA%07E%D7%AF%1B%F7a%EE%03%FB%D4%AEW%CDu%FB%D9%92%E8R7%14%24%FF%E4%B5%80)%88c%1D%0E%C2%92%CF%EC%22%97%89w0D%BE%19%BD(%88o%19%40M%C8%85%9F%F7%98%AA%C8%BE%19%9D%18%88%A3%ED%15%E8%07%FB%7B%82%19%C8%89u_%EC%F5%23%20%5C%E19%11%A0%95%C3%BE%1FHS%F0%E1%5E%16%03%81%87%A0%09%F8G%E053%90%86%ABC%2BQ%90Vpu8%04%E8%0B%99%804%C2'%1F%A0%20%B6%8A%8A%BB%07%C9S%96%98a%9D1%F8%92m%EAU%12%02%A8%DB%E5%5D%A17%F5J%E3%10-%15GQ%90%96.%3D%0B%8DCpKO%B1~D%1B%AF_%F1h%1987%B3e%886%BE)'%08lfG%10m%7C%C6%95%18%C9x%D2%00%2B%AB%87t%DB%F8%CE%9C%E6%DC9%C6%98%1B%B1%D1%60M3%BBd%EC%B0%E9%3A%EC%CF%BB%91e5%92Z%1E%FC%12%9BLyWu%B8oD%DD9%1Dm%C9%012%ED%7Be%9F%DE%C3%0C%DE8rXc%1B%CDO%E2%C7%EBB%E0u%F3%10Ec%C4%8F%D7%87%20g%7D%D0%84%CA%130%B0%3C%D0%3C%24%C7%B5%EE8H%8E%FA%3F%81%FC%3B%0A%B1Y7%22%AC%E8%CD(%C4b%9F%F1%5B%93%00%E1G'%01%E2%19%B3%1A%D2%2FA%5E%80%40%AC%F4%E3%F9%D5%0D%81K%E4%B1%BAe%A5%1F%EF%0Ap%A3%7B%09%0B%D3%C6%9B%16%23%40%E7%9C%D8%9Ba%8C%1Fo%1A%D2UH67p~%BC9%11'%BE%8A%1C%5Ci%E31~%BCI%AD%DF%A3%BC%A2t%87H%2B%2CZ%06ak%95%01g%FEqe%0D%B6u%90%19%D1M%A4%BA%1E3%7B%CF%A4%5C%3B%25e%C37%D6%5B%F4%0ESQ%DE%B9x~s%86g%19%E1e%FFga%3Ct%40%B2%0C%E2%E3%17%86b!%C6%EC%FDbu%E7%F1%9D%81%CF%0Bb%5D~S%F7%8B%0F%AE%BE%D0%B2b%96%8E%D5ir%26%8D%B1l9%60%02%C2%AC%09W%2F%E3%C7%FF%8B%20%BBRV%D7%B1%26%20%1F%91%82%BC%1F%D8y%E75%AD~j%E2%C8%E3%F2%06%08%84%E4%E5%8Fgk%9Au%97Vl%A5%24%B1%CF5J%DA%0CNY3%A9L%82%FB%87%A8m%F8%FB%BD2%C5%82%11%CF%0A%DA%FB%06%E5%00%F9V%5D%05%1F%7DJ%C3%AA%0E%D6%12%CA%B3%CB%80%23%A4%C9%E0f%0D%2F!%9B%F5%E9%B1%D1%09%A0%7D%AF%2B%CBo%9Db%D2t%99%3F%FB1%CE%C2%87%92%5B%0B%E2%DEV%12%E9%CD%F8%9F%23%5E%A9%04%9F%87V!%15%D2%F6g%8A%2F%D8%DA%F84%D4j%BD%0Dv%15%EFW%C6y%D5S%7DOJJ%EFG%19%E4%88%24%EE%D9g%82C%C8~%0C%F6V%80%1F.%D4%80xeI%81%A8%C7z%1Dk%A3%5D%AC%7C%F0%26%96%DD%B2E%F4%D6jt%98-%D1r%13%F9%5B%B0M%CA%D2a%7BV%84%22%F0%D6As%3C%B3%D9r%11.R%8E%C1%8D%95%E7%F5%EE%3ABIU%0CdY%99%A9%3FM%1D%EF%98%05%AD%E2%D5%DE%EEe%F1%DF-%95%00%B4%D2%EA%2Ci%DE%E1%91_%5C%24%D2%20%EC%BDp%0F%D90%19%15%E4%1F%1E%F6%CA%95m%C9%3F%AE%F9%92%7C%0EQjQ%7B%5D%E4%CE%EE3%FE%8F%EE%7B%A9%2F%FB%A3%E1%C9%07%3B%C9Zf0%23%E5%F4%92%F9%F2-)%F1k%C1%0B%00%ED%94%D1%8E%EB%1D%EE%81%8D%CE%DBp%AD%802%5DZc%DA%14%BB%B61%BEO%15e%8A%15R%D0%23%A8%A8%E3%8F%80%3BY%C0u%9CYR%2B%BF%ABm%A1%96%05%7FA%F7%1F%B0%1AU%A1%96%23%FD%A5%00%00%00%19fcTl%00%00%00%04%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%C8%86%90%1A%00%00%09%E3fdAt%00%00%00%05x%9C%ED%9C%7Fp%14g%19%C7%1F%92%FB%B1w%D9%DDcFPD0A%98%14%0A6%94FE%25%E4%0C%A9M-m%C8%B4NQ%DBr%AD%ADSmf%8E%AA0%C5q%9A%85%80%0D%90%9A%40%DB%992%83f%83%0C%A3%D3%D6%04A%FD%07%CDB%00%83%9E%5CZ%CB%F4%C7%3F%D9%90d%AC%8ECBr%F9E%92%AE%EF%DEBH%B2%EF%BE%EF%BB%BB%B7%94*%DF%3F.w%CF%FB%EC~v%EF%7D%EF%FD%F1%BC%CF%06%60%A6%22%26%0B%40%1F%C6%E6J%5E%40%B4%99%1A%60q%B2'%E2%05%F0%AA%CB%3B%20%EBo%06%E4%01O!%87%14%9Dq%E0%88%A7%10~%A9%0A%F0%2F%E8%F4%14%02%3D%CB%01%9E%C7%B6%B4Lj%DF%A3%B0%19z%3D%86%88%8FK%2Ba%8B%C7%10%10v.%7Da-%40B%C9%E09%FFn6%BD%D0%A6%FF%926d%8E!%2C%92M%B6Jt%1F%89%F6%CC1%20%10%BEb%B2%AD%CF%E0%F9%D3j%83%0Au%A6-%E3%7Do-t4%7B%0E%89B%B6d%1B%F2j%BD%5D%88%CF%04%B9%DF%C2%F7%F8%DDj%FAo%F6%D2%9F%D8%83%3C%02%B3%E4%99%B6%EF%AB9%B9cfW~%E4%9C%E1%FA%0A%F0%F6%20%07%60%9F%3A%D3%D6%94%DAu%E2%5BfWn3%ACL%BFy%14%7C%8A-%C8%C5%C4Z%93M%DC%B1%B8%CCl%05%BF%A4%D7%16j%26%B3%81%BF%C3%16%A4c%9Bj6%0AjR1%5B%031~6%F8c%3A%04~c%87!%AE%C2%9A%F9%5C%0C%84%1F%3D%13%E3%EFlN%F7%08mv%20%D9)%AC%F9%E4*L%AF%C2%17h%85%05E%E8%CD%5B%AAp%AF%1DH%D2%DC%A9%E8%FA%D2K%18c%BCp%F9Ce*z%F3%AE%A6%D9%AA%93%96%09%AC9%B5%C0l%E3%06%3A6%A7%EF%8F%5Bt%E0E%C2)%DB%24%D3%D5%E5a%1D%1B%9E7%DB%92k%9B%FE%3C%9C~S%2C%13%18%C1%2F%1FS%A6%5B%04-%86s%14o%C3%18%2B%D4%E2pz%BA%16%2F%97%08%90cjx%7C%06v%D5%40-%A6%8A%83%2B1G%8F%08%83%81%5C%FDMi%01i%3C%FB%01%C0%BA%E9%96%CE%C3%B5%F1!%D5%E4%D8%A4%98%0F%E6%C7%C3%23Y%F1p%19%C0%3DC%B3%09%90%EF%A0%C3%A7%5B%1A%03%92xx%B3%C9q%10s0%9F%0A%8E%F7%B6%C4Q%93%9F7%3A%8E)%BF%E6%B6%15%B5%A6i%16%F1%D3!3%01).c%8C%C7%DF%9E8%96%1C%FD%24%FA%DE%C6pUfH%D8tY%991%D7%09%E6%F1%B8o%1F8%EC%A5%FA%FA%B6%C5%13%A8w%1E%99%D7h%099%B9%E8%AF%A9%D2%85%D3L%DD%0A%AC%C0%FA%FE%09g%8CD%97h%DFD%D5%91%FF%DD%2C%D9%82%11%BE%7F5%2C%DEmjJ%C5)%C5%F2%B2f(%FB%5E%AD%E1%D9%18%C0%8E%8E%D7%F3%2C%5C%B6%C0%044%9A%9Bk%D7%FC%7BX!~%ED%CA%FBz%EF%DCu%E4C%EC%9D%A2%1B%99%40%FD%B4%CF%5C%03%E2%5DY%AC%10%40s%B1%1D%FA%DF%EE%01%05%EF%C0%8F%F1Q%FF%DCy%E6%82%AE%0Af%08%92q%DB%F1%CFZ%14%EF%E2%FA%5ENV%99%2FA%9Cc%83!%8E%A4%BF%F0%CEQ%2B%07n%7Ca%D3%19%D3%F7%F5%FE%93%C36%209Z%FA%C7%CE%8DX%3A%F4%7F%BB%BC%F6S%D3m%C2%8F%B4%C5%F8%CE%1E%2F%D1%98%EB%8B%96%10AK%A5*Z%94i6~%E8%0D.j%03rU3%FB%D9)%DA%9FH%A5%F4y%C0T%0Da%A6%5Dte%11%EE%9E%D3L%D3%CB9%D0%A8%DA%87%B4%60%3B%23CUkL%A6K%90o%9F%01%E5%8AeQ%8F%86%2B%1B%F8%ADmF%CE%90uY%1Dv%89v%16%17S%A1%400%13%E5kzWKM%E9%BBL%D1%16%5C%B3%B4%8A%CC%E0gkh4%A0%05p%EC%84%A2%AC%82%09%11%C81-%A9%3C%80P%F4%B1%85%7C4%15%7FK%B7tK%B7%F4%7F%A8s%AA%F7%8CP%05%26%BE%90i%1D1V%15%9E%8A%DF%00h%7D%94%C9X2F%BEv%04%09%10%96%DE%99P%2F%40R%AD%8B%91%5C%3E%A89%E8%12%D2%0AP%1D%26L%2C%D1r%23W%D3nw%07yS%11%E7%9F%8C%91%3C84%ED%2C%8F%BAa%B4U%CF)YM%B8%91%D3%A52%87f%3E%C1%81%7Fc69%18%F5%D6mm%C35%BB%15k%87%BAr)%BDpj%CCu%DE6%0E%A9%BE%3C%A2CEv%94%BF%2C%A3%D5%DEA%E7%AD%FC%1FkZ%C8%D1%FBD0%1A%EA'%B6%0B%BA%C4%1DZ%E1s%C4k%E4%A2%FEh%95%EC%8E%02%9F%AB%A9!BB%7D%BD%F5%1Dy%EE%18%02-%18%C0%F75%AAn%3B%04%1E%1F%5E%9Er%15%E3%B7%93%16%E6l%10%EA%F1%051%06'%0A%84%BAy%A4%EF%20%B8%84%88%CBX%AE%E4Cw%10%A8%AA%A4%FB%E4%90%22%BD%2Cj%AD%5BN%2C%0F%CD%F9%FA%DE%60%CC%25d%3B%1C*%22%95%A3a%F3%D9N%C5%25%A4%04%B8%85%A4%F2%9Dh%3D9%D7%25%03%86DB%BC%C5%80%C4%DD%26%5E%84%C6%BB%C8%BF%F9%93%EDP%F0%15%97%90%8E%BC'%88%91%88w%8A%E7%AC%1B.%C6%07%BA%99U~%8E%1Cd%7CB%DE4%A8%84%0B%247%0Ca%D0O%EC%BC%04%A3%F4%9F%98%5D%14v%05%26%F8%87I%E5%5C%9E%F1%F7%D4c.%20%9D1r%F9%AC%AB%15%26%7C%D1%05%A4%E1%11F%C7%8B%E4%40%15Q%174%89%CD1%DC%84%09%D4X%1D%EB%C3%F8%92%02%3B%93%FA%D8%C6%BB%FE%97!7%A2%E2o%0Aq7%02%E2u%F6%DAG%06%B9%E49Dh%B7%97%EF%C1%AC%E4%F9%EB%EF9%05%CEx%C1%E8)%5Cw%7D5%E5W%E0%B4%07%0C%F1%AB%00%5B'%3F%F9%00%FE%E2%01%84%DB%80%86%1Ce%0A%E4%D7%1E%40%F4%3C(N%BA%F6)R%DF%BE%D7s%C8%D9%E3%17%AC%F6%98%5DAd4)%B9%06%E17%408%CF%0B%C8%E7Q%23%9E%84H%10%C8x%F6%9F%0E%A9%DBX%3D%2CA87%3D%DF%90%C0%EDz%19%ABY%97j%F6%04d%98U%12%D5%3F%EDM%94%CB%1E%40%F4NE%AF%FC%60%1A%12(dX%BE9%87%08%E9%85%9FO%F5%821%09%81%9F%E9%9F%9E%F6%80%C0%1B%3BmiHNiY%E2%1869%C8%BD%26%EF%04%20%BB%86%94%A8%96!%88%CF%23%C44%88'%23%09%AA%93W%EA%A7%400%19%A5%99P%0F%E4%E9%10c%00%0Ea2J3%A1%B3%B0%FE*%24%BC%2CQ%ADx%03%D9%0D%D1%08%24%CE%23%08%3F%AFF%F6%86%01%AF%89%B1%08%1A%E3%1B%20%9D%FC%EA%91%82K%D4%08%1A%E3%AB%D0o2F%F6%14k%14%A7%10q%25D%D0%18%DFK%3F%01%F7%F4V%A7%14%1F%82%A0c%23%12%DDS%81%03%0E!%1D%F9%06%84%9E%84%EEk%87%1C%D9%19%E4%A5%C2%C7%22%E8P%1DDQ%B0%DEqZ%FE%C6%3D_%AB%D2%C7x%BA'%3F%1FDB~%0EIe%3D%1F%14%E7n%ACfH%AC%10%3FQ%AE-R%1CA*sb%11%B1f%0F%CB%0Ae%BB%CA%17%13%12%B3%08%3A%03%F7%5D%EF%BB%C8%EA%AD%FF%5D%2B%26G%91A%5C%F3%A9%24%0B%C4_%09%FEeW%7C%DB%1D%ED%C4%08%D5%CF%C4Y%20%D9w%CA%FC%A2%E6%AC%EE%A8%13%08%08%F9%0D%2C%90%C0%0A%7D%93%AF%95%B7%93%908E%EB%8BY%20%FCx%97%0C%F0%1C%7C%CF%11C%98%60%82%C0%12%F1%1B%00k%E1MG%95%C2%3D%D9%C4%04I*%AD2W%AF%3F%DF%E1%40%5D%FB%D9%9A%F0)MK%FD*%DDk%1B2%05_%2CSA%91v.%60%82%04si%A9W%A4S%94%DF%C1%049%9A%D4%1F%2B!y%10O%F1%60%D2%18%E3%C9%3A%E1(%A8vU%1C%BA%F5%DF%1Bc%3CQ%097%10%24%DFg%D0%18O%3B%05%E7(%E7n%0A%84e%8C%0Ft%D3*%9E%2C%7D%8AJ%1D%E3%05%9A%03%0B%84%3A%C6%B7%A9%EE%202%CB%18%2F%B0%06%ED-%20lc%FCEw%90%3A%A61%DE%EF%0Er%9Ei%8C%B7%F9P%DDL%88%02%90%E5utY%87%D8%7C%2C%EF%26%85%F8%9Bo%00D%0F%A8%DD%82%DC%7C%90%EC%1B%01%F1%7C%DF%81%93%18%C6x%E7%12%AA%EFF%E3%08%B7%85a%8Cw%AE%80%22%A2%A1%F7%F11%861%DE%B9%DE%01x%00%B8%2F%B0%AD%E3%B1z%88%FE%3C%7F%1B%C0%1A8%FA%B6%C4%B4%8E%C7)%24%BF%A7%D2%7CN%83%D0%C7%AF%F0KL%EBx%9C%DE%03%FC%B3%86S%E5%3B%D1%FA%DA%83JH%06%98%A58%82%1C%04a%98%B6%96%10_%EE%CF%FD9%88E%E0t%F3%A7%16%BA%86%E6%AA%14%A7%D0%FE%D7%91%CB%A6%8D%D5%0Ew3.%D4%14o%E8%A6%85%FB%BArJ%91%D6%0F%EFq%C6%00~%C7.%19%96R%9C%5EM%BF%3Ay2%ED%AA%3A%B2%148E%F11%9E%EE%B2%C8i%22%2FG%0C%EDB%FDQ6%D9%C5%D8%02%D0S%8E0%E2w2%3C%FA%BD%3C%0B-%C2%C8.%7CT%7F%15%F1)%DA%CF%C0%1F%A8%8C%40%9E%8F%BA%07nTF(%8A%2B%CB%891%B4%EB%A4%84%08%94%87L%0D%88%88%FD9%05%258L%85%FCP%15%A8%A3*%A9Y%05W%C2%7DTH%99%FE%E2%8B%91!%ABw%96ZuZ%E2S%BB%C8%07%EB%3A%91%86%FC%94%E8%C3k%DA%80%E5%B3%C1%E26*%C3P6m%AF8%D1%B0%C4%F2%0AX%9F%0B%E8%A4%FCP%D0%BDZ%E6%13_d%7D%E6%F2%B0%8F%D2%11%8Bu%96%5D%E3S%97%FF%A30A%1E%E6%C8YW%7C%FC%C7%92E%91pe%A8%CA%AAl%9A%C4%B10%D9%EF%D4%2FN%AA%16E%81%85%2B%06%A3%2C%90%F0l%9E8%D0%87%17%88%96%99%FD%BD%95Ec%A9_2%40%FC%92H%CC%B1m%92%02%96%17%D1%90%18.%E9%EFW%A8%0C%E1%A8%AA%FF%5B%06k%DD%05%B8%7FYb%A8%84%EF%DFW%DA%B4%94J%E1%D0Z%B3%89%10W%E1%B5m%DB-w%2FG%A1%BF%A8w%F8P%FE%1F-%1C%98%D2%A6%CA-R%AC%18e%3E%A1%93%7F%DCV%0FoP%3C2%00%A1%E8%BF%9A%1Ah%826%3A%E2E%00%00%00%19fcTl%00%00%00%06%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%E6%D6Y%9A%00%00%09%DFfdAt%00%00%00%07x%9C%ED%9C%7Dl%DC%E4%1D%C7%7FI%EE%FD%7C%BE%B6%8CV%5B%D2%5EV%3AVJ%A3%EB%D2j%82B%93k%12(%DB%BA%BE%20%D8%8AV%20%84%F4EZ%D7%04%08b%7F%C0%E2%D0v%0D%A5U%C2%84%A6j%AA%88%E9%0A%AA%26%B6t%1B%AD%F8%03-N%D2%D0%97%99%CB1%C8%A6I%95p%08%D9K%D5%A9%B9%BC%BF%E2%3D%BE%5C%12_%F3%7Bl%C7gWj%95%AF%14%9F%FD%FC~~%3E%8E%FD%D8%BF%E7%F9%DDs%06%B8Q%C1Y%25%00%3DHYZ%B2%03%22%DF%A8%3E%23NsS%9A%878%AFy%CD%EB%D6U%E0%C3%9B%00%E9%DA~%C6~%C8%8B%AE%5C%DB%19%81%A50f%3B%C4U%09%3F%B6%AE%B6%7F%1EE%8B%B3%CE%C0Ac%15%B0%1F%EB%BA%F8%96%1C%8Ea%E5%24%26%1EN)%B8F%AB%AB%B9%98%D7%83%B4%C4%BC%5Bp%08%BBzj%7D%3F%F9%F3%F7n%AC%C4kX%19%C8%99%5C9N%85%AD%02%B8%1F%2B%CFz%EA%CB%C8%D4%FA%B3%12%40%26%CF%E6%A0%150%3D%D0%24)%2B%EE%1D%CFR%18%CC%04%E0%E7%3E%10%EA%97%A6%D6%1D%05%00g%01%BE%8F%D7%B0%00%82%82%B2r%5D%F2%F0%14%C8W%00%EFc%86%BF%F5%CF%AC%B3k%01j%01~%88%D6%C0%8E'!m%C0PN%E8%FB%A3%E4%B6%C3%0C%8F%C5U%1B%CD%95p%F0%BD%B3%B9x%15%2FHu%E2!r%00%1F%01l%40%1D%98x%9F%C4~%1D%3B%BE%BC%01N%E56%20%D6%C9K%24%1C%E2T%3A%3A%A5%00%9D%12lF%1D%9A%07%E4%FB%0E%60%7C%DF%CE%F1e%AA%CDVy%E02%8E%00%B6lT%14%05%B2%E2.%20%97%07%D3%D6%B1%C1%F0%20v%84%AE%A3%3D%E5%EAmf%A2%8D%02q%AE%CFM%AEm%CF%170%07%7F%7F%0F%E5%01%E5xo%C2%A9%BE%7F%1C%5C%06%8F%7B%FE%AA%BB4%F1%D9%16%96%0BQ%87%AC%EC%9E%FB%F0%5D%83%E2(%3C%AF%AA%F6O%92o%F0%2F%A8%E7%EA%8AI%B7%D03%83%ED%A8%C3%E7%2F%F7%3CD%81D%07%81)%E2%A6%B7%F7%00%9C%0B%C9%C8%85e%BE%2B%0B%C0%9C%E7!Z%B1%E5U%B4%AA%06%B1%A7%86%02%E1%2Bb%C0%CE%3C%D5%EEM%2C%C5%D9%8E%9E%FE%0A%F0%87%E2%DB%EF%3E%24%FFo%10%AD%AA%8C%E9i%12p%08%D7%C9%A9%B7%C7%F1cQ%D4%CC%96%93%3A.%84%E2%CE%09%D4%FE03%91%85%DF%A5%0E%8E%E1S%20Lm%3D%05%F2Y%8B%2C%0F%82%7F%14%9Ax%D4%FE%3Dv%2CP%40%D9%D7%F7%23A%B55P%5E%F2%0D%8Ac%C6%B0X7%0E%9D%BC%9F%E2%B0%13%96P%F6%24w%CA%87%DBT%5BUb%80v%C6%5C%C2%BFe%1E~W%BE%91%DA%F1(%A3B2%EB%7F%A3%DA%BAZ%B8%22B%F3d%C2J%B3%A8%C0%23%81%A2%F6%C5%7F%A0X%3E%17R%EEq%A6%B0%94%E2%C8V'%CESw%9C%A7A%9C%FD%A1%1F%E0%96%C6X%A6z%D35%B2%9CR%85g%40J%7C%B6QG%AC%EC%DA%AB%85%02j)%02%87%DAP%C1_%C7%FD%C8%5D%F2%A4%F2%11%A8%C9%A5A%E0%93%CA%2C%B4m%92%26%99%12%E8%06%A1%5D%A2T%D12%A0%2C%DF%90y%8A%9D%9C%EB%EC%0A%F4%08%9B%D7%80%B7T%B5%FD%F4O%FB17El%94%2CZ%97%8FR%19%E4%DC%A3Ff!y%22%E5%AA%0A%DC!%8D%9B%9E%FC%E3%C3u%BC%86%B9b)V%FA%C7%9CD%3FdF%1Dq%CD%FEw%D3%09%FC%C1%95%DCY%C6%8E%B0%A3W%00%F0%AA%2C%07%E5%FDZ%0Ch%AC%8A%D0%8D%7F%97%EFG%3A%90%AC%FC%14Y%FA%0B%A7%BBw%9F%C9%B4%87JRY%F2%1A%AA%CD%DF%BB%08%2B%F6N%FE%EF%CC%91%A9%82%AB%FD%826%04%DE%A1%B6%0Bp%8C%0F%A97ge%5B%86%A7%2C%1F%08t%A7%A4h%14%87%5E%02g.%A9(%CC7Y.%0A%14%9B%95%10m%DD%B2%10%FA%85%D7rJ%F7%C2%CFk%5E%F3%9A%D7%BCni%097%81%D1%BD%F3%26%40%5Eg%F4s%87i%2B%17N%DB%CE%60%22J%9E%EC6%81%AC%B7%1D%02K%7D%F4~%B8U%F2%2F%2FF%93%CEV%8A%C9%DF%F8%1606c%DE%E6VpP-%D8%CA%F0%8D%07%C6%22%0C%7D%DCb%89%1C%95%DE-y%ED%B4%04%91E%F2%AEr%D4W%24%D3%15%F6%E9%7C8vM%40%CA%19%D1%CA%C6%D0%84~%A1%E1%0F%CB%B4%04%9D%19%05_%C3J%BD%2Fo%97%2C%8488%B4%98%5Dl!%03%7C%0F%A2%C5%1E%3C%23jV%CF%95%94%F0%B3K3%22%96B%A0e%EF%B6%D9%85A%04%9C%96%EA%90%ACx%B0%94%2C%FEZk%5D%3Bv%20%17%D99%22%8A%1F%ED*%D6%CCm%CDIMH%3A%8D-%96%E5%BE%1Cx%DC*%06%13B%AE%09%88%A2%18%3B)%18%FC%B2T_%5DX%26%C0%2B%CB%7B%05O%8Ee%90%E7%B0%7C%9Fg%F8pX%96%87%AD%820h%82%D3%3B%0A%CC%E9%DA%A3%BB%ADa%B0-r%1F%F6%2C%8C%26%8Cw%BEe%09%C45%7Ci%2352%3AW%DE%15%BB%5C%B5U%96%C3H%A2%86%A3%EC%E4%40%7C%B5%12%3Bo%C4%1A%8B%BE%F6%08ih%D7%11%A3E%F9.%DF%10%9C%1A%A1%3AX%04%E9%FC%098%EA%ED%86%FC%FA%08%B4%0BvC~%DEz%ED%EE%A4%83%7D%17~%8FSF%7B%00%96%AAY%B8b%3B%03%7C%3A%89%F9%14%05%CCR%1A%E7%D0%B7%EC%14LB%98%BB%8C%FBV%99d%00%7CZj%D4%93I%A3%7Bs%C2%98%9B%18up%E6!%C6%D4%BD%AE%F8Q%C9f%06%FB%00%C0.%9B%19%E0!%9D%84%2F%04%9B!%CAW%AA%1E%EEv%80d%F1%24%C2%DA%0D%09n%00h%B7%15%E2!O%F1%F6%1D%07%86l%85%10%05%D9%DA%23%B6_%13%25%E6%D9%0B%F1%3D%92%80%A4%CC%0C%B0%5C%AD%DD%9C%FD%90'%FD%B93%90%B6%90%95%23%F3i%05J%A1%40%F5%9F4Kv%40%FC%1ClQA%D0%AC%40%DA%F2%D4%B3kT%90%23%9A%CE%A6!B%8B0%0D%F1m%3Eg%0B%C4%BF%EE%C1%E9%26%EC_%98%93%A9%E7oN%1D0s%9FD%7F%EB.%9D*g%AC%84%3C%A1%40H%8CW%20%E0%BE%E7%A5d%AF%80%DC%A3%16%8A%8C-%82%24%C6%BF%99%80%C0%9F%E5E%11%E5%93%E9%B0%92%C1%F4%F2%10%241%BEZJ%16%B0%D9%CA%E2%F9e%1A%FB%CC%1D2%20%AF%A8%231~f%1ASK%8C%5C%A1%C3%7B%11%DF%0F%F0%C9%D5%06%20%3D%FB%12%B3k%83%DCT%89%2F%07%E0%DC%FAO%10%DFM%87L%0E%12%D8%89%7F%9DI%40f%1EZm%FB%A1%5C%C0%86%3C%118o%0E%02%C5%F0%D2u%1E%92s%85'u%AEv%01t%22%AE%9B%C1o%F2%F9%E9%FA%D6%CE%A7%95%18%9F2%ED!%07%B0%16%FCn%CC%8B%CF%24%D6Wk%5E%90%C4%F8%D4%89%15%0F%1F%C0%92B%9D%B9%19q%C1%1C%24%F0%95%12%E3S%AF%C1%15q%0F%92%8F%F3%C9%BD%BB%F1%A9%C4%BAr%E5(%80%1B%2F4%BBk%D3%AC%06%EB%A8l%F9Xk%1E%9B%86%DE%DD%87A%C8pb%D6%B7~%8E%D7%B3!%DF%1Cd%F3%02%1C2%5B%EEo%0A%EC%1D%E6~h%B2Q0%0A%09%1C%03%FFf%ACE%E8%2B%9Cg%14%02J%B7%F9%B8%19%86%D2M%15%0CC~%09%0E%C9%0Ce2%60%E9C%D8%E3%B5%92%2F%02%BER%3B!5%FD%F2%03%BB%24%60%A7%12%3F%86%A6%5E%CD%11%E2%0A%E9M%BD%D2%AE%C2%10%E4%02%96%FD%9B%13D%8C%EAB.%9B%9A%0E%A7%82%9C%5DW%DC%A0W%85%3B%5D%08%09%EB%D5zU%B8L%CD%B9SARb%3C%0D%F2%A5%DE%85%D7V%E2%C2s%3ANf%83b%0AD%B7%8EH%9A%10%3E5%C6%E3%DA%97%26%24%8F%C4x%5D%AF%B3iB%EAn%8C%F1%A8W%9A%90%E8%8D1%DE%06%88%F3%8C%91%07%A4%D9%8E%5DRJ%A2%40%1F%E2%BA%19%904GE%C6%20i%EA%F6%82d%D0%BF%B4%B2%0Ebo%02%C7%12%08%23%D9%0AI4lf%C71%03%90%A9q%FC%DC%E5%E0%C8%E2%1F%06%1C%3D%2FN%8F%E3%E7%0E%89%90%05%0F%20i%F8%9C%FA%85%02%193%10%E3)%F2(%BF%08%E1%20%C0%D1%5D%02%E3%FF!%0FG%B7%91%18OSu%BD%124%5D%F5%F4%A8%E6%8E%C0%D2%C9%F3%AA%1B%E3ib%F2O%88%BB%C5%E6%18%F8WS%3CH%E0%1DOBL%F7%13%7C%8F%95%D4%C8%2B%E1%BFa%DA%C8%85%B4%A9q%7F%EDV%02%C9%10%CCB%88%DA%2F%1C%BD%B82J%B3%BA%24%FFP8~lC%9A!%E9%10%9C~M%A2Z%3D%D1%EAM%85%3F%032%8EO'%2B%84On%98%96%FB%3B%D9%DEW%C8%F8%A66%AD%04%A73W%CB%CA%16%AD%93%1A%84t%EAO(%A89%22%EE%DA%BF%D8%3D%97%AFn)%D2%EE%B3%BD%7Duh%91%A0%5D%C1IZ%EB7%0Cy%B5%26%CEi%EF%CF%E4%B5%EAOz%D2n%FE%17%17%E2%BFf%9E%91%83%F7%A1%BF%C9K%91%A7T%CB%AA%D3%F6%20q%B7%EE%D0%85%B0%9A%F3%7C%95%F7%03h%CA%F3L%BD%91%E9%C8_%AC%D5%98%84%C3%8C%5C%AA*%114%F6n%18.%AA%BDG%1F%C2%EC%2B%A3%D7%C2%86%E3%B2%9CG%DF9%10Z%E5)1%92%16z%82%7D%85n%BC%22%B0%974f%B39z%2F%1A%20%10uj%7F%F1%C2%9E%D4%804%0Ci%FDNS%A5L%A0%FC%20xR-%7D%F4%17S1%0BG%B4%7F%2C%3A%25%F6%F1%80Vn%D2s%AF%8B%9E%25%CBz4%3F%1E1%02%E9*pr%1A%E6%0A%A1%93%A7%1Ak%DA%E5%B0%91%17p%B1k%A5%17%24%BA%D99%02eT33%DEpg%99%11HWA%AB%D6%DC%95%EB%DB4n%FA%AC%CA%86S%A7%0C%A4%1C%C9%3FR%F4%7B%0D%7B%BB%E4%1A%93(%B6%C0Z%A9%23%EBS%CAk%3ER%0Ef%19%BC%19%FE6%DD%5E%F7%D0%3Br.%ED%00I%CF%20%D8x%07%ED%18f'p%B0%A1%C7V%CA%14%2B%83%9A%A9%88I%BE%CC%C1%F4%8B%DB%18%FD%EE%FA%B4lx%3B%DC%FF%01%1C0w%1Fb%1D%1A%C7%00%00%00%19fcTl%00%00%00%08%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02-d%25%1A%00%00%0A%15fdAt%00%00%00%09x%9C%ED%9C%7Fl%13%E7%19%C7%1F%92%B3%7D%B6_%DF%01%0Bj%A1%94%98.%ABh%96%90%90Fm%B7%011!PJ%D3%26%AB%D8%94%AD%A9%F04%D6Ri(i%AB%22Vm%8A%93%00u%A1%5B%22%D6%7FZ!b%B6%96v%D2Z%D2%C1~I%D3r!)M%A9%89%1D%986mc%E2%E8%C8%CAVJ~%92%90%C4%F4v%E7%1F%18%DB%F7%BE%F7%CBg%A9%15_%25%8E%EF%9E%E7%F5%E7%F2%DE%DD%FB%BC%3F%9E3%40%BA%D8%8C%3D%00%A32%FB%0C%C9%0C%88%90%AE%095N%DAd%F0%10o%E9%96n%C9%88%BA%0A%7C%A63%98e%D0h%3A%04%D5%C3%99%80%D9%10%BB%0F%ACYo%BB%D3%E5l%06%BB%E9%10%E4%06z%BE%E9%90k%40y%09v%A6%E2Q%E3%10j%EC%D0%F7x%92%3D%B8%CB0%83i%89%D4%11%0F%F5%2C%7CK%F1CPe1%D1%EE%10%14%CE%FA%AF%E0BX%09Bu%DA%F7%90%ECyJ%90%1F%82%CDGtp%9D%86%100%23%3C%C1%A5g%82%00%F9%DF%3AA%98%05%9A%0C%E9%12jC%1C%88%3Fx5M%E2!%D6%05%2F%9C%14%E6%C0J%AE%AE%B6O%EB%B6%DE%16%EE%22%B9%14%CC%E2!!%1F%B4T%1D%A8y%9C%C8%80%1E%AFs%81%20%2C%25x0%D3%91%CF%B0%C6.%0EM%173A%9E%0Cq%DC%03%5D%EB%0F%DA%97%E0%3D%D0%B5H%04kl%0D%E7o%AA'%13b%AA%B6xC%CB%F1%95%8Af%E6%DE%C6%1A%AF%00%7B%98S%03%99b%EE%5D%FE%B1%17%0F%89%3C%40*%1D%0A%A9a%A0%19%B80%83%AEc%ED%CEH%3F%11%D2%A7%0A%12%81%D0S%CD%B7c%ED%B6%08%1B%20AzUBj%00%B6D%DF%0FJ%DB%7C%AA%9D%1A%A5H%A7vdP%15d%0E%DD%09%D0%11%7D%BF%5D%AC%9D%86%CET%BB%BD%9E%22%05%13%CA%93%BA%ED%E8%96u%AB%A8%10%F7%C7%EE%F9%5E%1E%FA%F8%D7%D2%ECaz%8Ex%8C%A9%DBC%F2%D7%E9%C7%D2(%E6%CCX%00%80%B7%D6C)%9CIw%A0%A7%09%10%A8%E6b%7F%99%D8%9F71n%7DbS%1F%BDk72%C5%C8%939%3Cs%8C%93%20%7D%0Bc%15%24%05%CF_l%E0Kp~%1D%F1%98t%C2%DB%FB%AA%072%AEX%24p%24%CA%B6%CA%A8%19%DD%0D%AE%D2%B3%AB%3D87%B4*V%91%CC%BDoW%AF%86%1FeB%7C%24%88%B5!v%F4%FF%F6%DA%7C%CC8%B6%E9pE%EF%92%2B%00%97%16%3E%2B%7CX%9E%01%99%C8%D8%95%A2%BBjcn3%14%97y%847D%B9%A5%D7%3E%B1n%3F%D9%7B%F5%25%3E%DDLO%E3%DB%03%F1%B3%9B%26%3D%B1wu'%A4(%89S%07'%BD%B2%B3b%85%B5vf%9A%A9R%7C3%0C%A8n%AC%3A%5EE%F9_z-%88%BF%A5VD_%AD%85%9B%FC%5B%E5.%8E%D0%11%C2%DD%D84%DE%968%04%A6U%A8%E1p~%CEhP%3Aw*RX%F4%5D9%7Bu%C8%8Be%5C%9C%3C%B7*%F9%C1%EF%E1%0F%C6%EA%11cl%8D%20%8C%97%C9FH%E7%ECr%1E%5B%B6enher%EB%05%3C%84-%05%B8vbbb%A3%FFe935y%0D_%B6%AA%3Bt0y%08w%E2%1Dm%C2%83p%3F%BB%ECo%98%3E%DEy%A1%91%97%B7%88*%EC%EE%17J%13%1Bb%CF%1C%AF%93%1B%E0%18%3D%C6%05%E5%ADH%10nn%EB3f%5B%26%B9%84%C9Q%8FuJ%08s%9DRJ%138%C9%B6.%D9%C7%C3u%A2%E4%A6%ADH%FBe%1C%2C%B9%80P%B9%81%F46g%07%92q.%93%178%E5%7F%DA%83qJ%5C%24%18%88%E2%89O%8A%5Eb%F5%91%ECY%91%EB%ABC%BC%9Er%9Fj%F2%EE%DD%A4%87%01%03%80%E4%FB8%B2%B2.%D3%09%E9%D0%00%C9%23%04%1E%82N%C2%8C%06%EF%03%BA%C6%DA%FF%DD%E3%D3pph%D6%AF%07%D2%C8%2C%D12%E1Q%F6%BA%0E%06*%87gU%0D%A4%E2%BA%DC%AE8%A0%97%81%F8%A0G%A6g%81U%3F%B9%EF%84%814C%0F%A7%DE%DD9%A6%C19%A9%95%F0%8C%06%EF!%D2(%1A%AF%F6%CE%BB5x%7FS%C7%19%11uQ%20u%1E%D3%D5%D1%AC%0Bb)%F2i%F1%D67%BF%97%FF'%5D%C5%B4I1%2CfC%F9%B9%80%10%E7%09%3EW%90Wr%01%D9%FD%85%81%B4%E5%02B%9C%9C%CC%96%88%D3%AC%D9%12%AB%25d%E9%95%C5%9B%03%08%5D%9B%03%08Z%94%03%08%94i%E8%3F%EAV%97%3B%07%90%0B%FAz%B7%DAd-%C8%01%84%DE%AA%AF%07%A2%0D%D2%96%833oi%0F%98%0F9%7F%D8%7C%06l%CBAlD%91%15%E6C%F2%1Asp%9Ft%FC%D5m%3A%03M%E5%F9L%87%D0%93%BD%BC%E9%10W%95%B4%18%A1%20Vf%A2%C6%87%F1%A5d%7CI%13%3BI%88%CC%3E%8DSQ%83J%1D%7B%E7%88q%88%E2%E8!t%3E%07%90%07%B3P%5DJ%10%C7%B2%1C%9C%F8%BC%00%D9%9E%15%E9%99M%D1*W.%FA%00%B1E%24%D34%B0%1F%E0%9F%7C%97%A9%D1%99.Z%B7%96%5EPD%CEF1%AA%EF%F3%F0%83%F6%CB%05%3C%D1%09q%E2KP%D5%12%B4l%F1%EB%E2%20%7F%25s%8C%EC5%D4%FE8%0CW%AE%D7%3B%FE%B0%94%8B%BF%CD%A0%B0%18%FF%01%F3%EE%95o%00%EC%04Fv%8DII%AC'%BA%92q%9C%EC5%08%B6%81z%80%8F%06%5Bu%0DAXN%FC%AD%87%CDd%AFn%B0%9E%10%1D%E9U%FA%869%F9%9D%AE%D3l%C1%1E%859G%1F%7C%24%1D%0D%BDZ%17%03hA%B8%C6%BE%FA%12%A0%17I%B7%BC%FFT%89%94%60%A1g-%C2%B6C%84%AC%0D%EE%B2x%60%A0L%F0%12%3C%877p%EC%9Ah2%90f%CD%BB%0AR%12%DEvW%A10%F94%B9%D3%EF%036%D4%D0%3E%AD%03%C2%0A%1C%E4%7B%E1%0E%B8%8CY4%BC!T%0F%2C%E3%DF%A7%90%99%25%AB%D0%B1%A5%D0%C2%11%F2in%C8%D2%1D%8Dyz%20%87Q%A1%B0%14%1Cne%CF%11%BF%BFC'%E4T%B4%9E(%15%25%7B%FE%FC%87%8Ep%F4%1F%D2%A9wye%9F%B6%95%D1%EA%A28%9D%0C%BB%9A%C5%9B%DD%CF%F1%86%20%A1Y5%10%EBm%1DF%20%CE%87T8%1D%80%DDu%BC%01%88*%85%C2%C6%CE%89*%E5%ED%7B%C7%7C%08%AA%7D%CB%7C%08%D8%B6%B3b%8C7%19%E2%9Ae%C5%18%FF%8A%B9%10(a%C5%18%DF%12%87%0C%9B%03%A3%23%AC%14%E3%E3%CD%0A%E5%C3%7B%FEe%A3%EE%B6%A7o%B5%14~%13%1FN%1AJ%9F%0C%FEX'%03%15%97G!%F1%8E%17K8%D8%F7%E1%22%AF%0Fbm%EB%96b%FC%3C.%B69%8F%E0J%01M%C8%DF!B%26b1%3E%BEIJ%FE%CC%0B3%3AG!.%E1%11)%C6%17%C67%CFpxW%E7%8A%3Dj%9A%5C%19IC%C4A%FF%BE%C4%B0%D3%E6!%F8%B6%D6%D4%E9%BE%BE%A4%BB%3D%0EA%FF%22%A4%25%C3%8A%7F%3C%A7%F3%A4%A4%40%9A%7C%A1%80%BC%13z%02%1CS%8B)%E5%F4%7CE%88u%91%CF%85%E9%3B%D3w%05%D0f~%5E%BF%DE%FA%8AB%A2%03u%CB%B0%07%8E%CA%3B%D9%1F%F9%9A%F8%3Ar%D9%AD%13b%0D%DC%A8.%BA%1C%EA%02%B2N.%F7%B0%17%C4q%08!%9D%8E(%A9%CF%15%87%B8f%3F%F8%BA%5B%DE%AB%16%9E%04h%80a%E3%10x%0F%9B%1F%FBK%7F%FBZT%0E4g%1C%22%EA%0DY'W%93%20%8C%EF%E6%81%F1%C6w%10R%AFT%40%F2%C2%7F%7F'%D3%E9%C2%3A%A5%D4%2B%F24R%1A%C4%B1%7F%E2%CB%7C%86%D3OY%A5%F1%81%12%24%982%F9W%F1%98%B0%26%C3%A9VC%3A%9C%2C%E4%F9%CA%F57%2F%89%FE%0EP%DD%CF%D2%9D%1E2%0A%99%13c%FCM%DBbs%FF%F2%1B%814%A7%BD%1Ar%EE%E4d%13c%FC%08%97%DC%CEo%0C%EE%80%F4%A9%83%DFh%C8%B9%93%13%E5%13%FFW_r%9B)%1B%CF%9C%05!%3E%C9%A3B%D2%9Ak%CA%E2%EE%1F%E5%9C8c%10%BB'6%7DqC6%3E%D3I%EF%9D%9E%10*M%C6%F8%98d%D2t%1C%3E%83%90%C2%86%F6%D4%13y%89%CFt2%0Ay4%19%E3cb~%92%E9%E45%08%F1%A8%C8%E3%91%9CL%87%D8s%01q%1AL%60P%051%AA%2F%0E%84%99%9F%8B%2C%B1%D1%5B%10uB%9D%9FH%90%A0%E2%02%9F%01%D9v.%3B*F%B9%AB%A91%3E%CB%F2%C3%E6m%D7%81I%8B%F1Y%D6J8%F0%157%D0%A3%A91%3E%CB%1A%85%D0%FD%5E%A0Fc%A3%3A%93%20%F3a%A4%2F%00%16%11%92g%5E%02%D7%13%D0%1F%E2%C1%1EH%8E%E3M%D0%EF%3F%5C%BCSlV%D6d%25%9B%12%9D%96%DFo%AFzs-%A0%A08%8E%C7%A6%F4%23%15%0BD%C7k%BE%C3%81%FD%01%5C%1Ec%EFF%1E%A4%3B%05%FF%10a%EFo%953%8C%DF%0A%06%9F%3F4%14%B6q%F2fi%C4%FC%A4%EBH%D9%1D%B8%F2L1%FCZ%11%22%E9%F8%16%C8%0F%C8%9B%A4%C7%05H%D3%03%60m%C6%3D%C8%99v0%5B%A6%E1%3C'o%13%AB%11%11%9F%B0%10%87%DF%F9%98%B2)%EA%5D%D4~%F0%DB%18%5B%9B%D8~y%F1E%1D%82%C0%C1Q%5E%05%A4%86G%15%B8y%84%AE0%B4r%F8%A2%3D%3F%AF%9Cz%91%F8%F8jB%0F%03%9C%C1%1D%CC%F9%A2%1A%B9o%FAI%E8%BE%91%E0.%BF%AA%89%8EZ%B1K%EE%C5%D8%9Ce%C2%C4%0ElI%D7gmHes%F3%14%9C%0Bb%9F%D1A%83%CE%AD%D8%92%8E%F2%7B%D4%F6%B3%87%AA%85%F1%FFx%F1v%16%7B%89%A2%E9%EBG%3C%EA%20%AE%C7%BA%F7%C2~%BC%BD%8B%C7%9A%8E.%D8%E2V%07%01t%1F%F6qbQ%8E)%BC%AD%A5R%E9%BB%23%92%0A%11%D6%7F%5DM%84%19%BFP%F8%AC%DA%F9S%87%10%C0%DA%DE%2F%9B%24%B4%1A%3D%CEB%B5%0B%CF%CFT%60M6%E1vR%CB%D4%BEu%FA%90%3A%C6%C5%12%FCs%EDU%F8%9BDR%97%E0%E5U1%06V8%B0%F5j%237%19L%D5bU%08%60%84n%8B%1Bgd%97%12%9Bq%EBB%8F%3A%084%95%B0%9Bq%1Fe%11%88%F3%E2%97%CA%04%FCZ%BE%AA%B4%A9%3AL%8A%95Je~%E0%E7%F5%DB%E1%FE%0F%95l%83%C1J%7D%EDy%00%00%00%19fcTl%00%00%00%0A%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%034%EC%9A%00%00%0A7fdAt%00%00%00%0Bx%9C%ED%9C%7Fl%14%C7%15%C7%9F%CF%EB%FB%B9%3BWJBi%A1%B6%95%D0%D4!%04%9B%E0%22%D2%108%FF%08%18J1%B4Ph%EB%D6GK%5BTQl%14%A8%92%06%85%0BN%E8%85%10%1FHP%A1%A8%09G%09%89%2B%91%18%08%10%A9%AD%F0%DA%1C%95)%17%9F%A1%FC%D1%FF%BC5%01%14)%8A%8Dm%82%81%C3%DB%5Dl%EC%BB%DB%9D%D9%99%DD%3D%AB%7F%F0%FD%8B%9B%F7f%3E%DE_%F3%DE%BC%9D%05%20S~M%0B%40%AFN%9B%25e%03%22g%AA%9F%C6%89M%16%FF%C4%07z%20%AD%D0%DF%A4%ECCr%3F%08f%1Fr%18%AE%8AY%87%FC%0C%7C%81%ACC%02%80%EE%8E%03%04%92%E3%00%11%86%B2%0E%99%0F%CE%FAl3%CEN%8A%FF%3A%DB%8C%D8%ED%1F%F4%1D%CD2%83%7F%F8%8B%89b%96%19%D0%15%F2%16%05%B2%0D%D9%07y%5B-%DF%C0%E8%DC%9BD%FB1%A9%E7%F4%A0U%08%F7%C2%2C%91d%CF%09%B5t%0EXCt%40%0CN%14%92%3C%5C%F9%9B%C0%1A%C4%F3T(%0C%9DSI.%C2%E4Jx%C4%12%C4%BDu%F6%3A%80%A5D%9F%C8%20%D4Z%82x%F3%AF%16%BC%CC%93%A7%D8%DCAh%16%AD%40%84A%A8%93%AF%93%9Fg%3E%09%DD%92n%E7w()eR%F9%D2O%0C%7C%92%20%E8%B6%0Bk%1B%E9%20%17B%EBf%18%F9%AC%C6%19%F8%B2%DDT%10%3E%D0pL2%F09%8E%EF%5D%1E%05%EFsF%FD%15%B5%E4-7%F0%D8%16%C4%18%C2%E1%ED%7D%1F%1EF%BF3%86%24%3A%E6%18x%CC%F9%8D%A4o%D8%5C!%CB%D7gB%5B%A7!%24'%DA%1A%24%3A%A0%5B%9F%3E%81%B3%F1'%E5%00%E4%8A%86%10~%DE%17%E4C%F1%25%85Y%18%93g%81%5C5G%DAn%7C%24%D0%3A%EF3%89dw%DD%5C%80%BB%01%23%8F%9D%06O1qV%1A%11%3FA%24%9A%D7%F6%2F%C1%FD%11%1FQ%0C%3F%A2%B6%7C%E5%9C%E0%0E%D9%5B%2C%87%B0%3D%2F%04%A9!%E8%97%1F%0A%A5_J%FAF%B7%5C%87%9Fu%F8%8A%CA%CA%DFR%5C%11U%DE%C1%83%C1%E3%B8%F3~%A0%40%24t%AD%ED%2B%1F%20%D9ST%B1%11%60OH%DF%96%2BK%84%9E%C2%F6%9Akw%A8%18%CE%89A%C5%7D%91rH%3A%87%8EH%0Bk%14%3F_%0A%DDT%90%BA%88%A4%CC%11MAp%88Z%23%AFW%0F%B8o%2B%96%E5%97%F9WhrX%E7%D4%E7%15%FF%2F%0B%DF%97%F4%8A%18%17%F0gC8%F4%AD%5D%E7_%95%9F%A6%60%40%AB%A8%B8u%D7%F4%FA%E7%FB%25%AD5%81%9F%CE%5D%FD%12W%F4%0F%91%86%01U%C2%CDF8%10O%E6%DC%F2%EBth%C5'%5D%BE%02%D1%19%A5B%00%9Ap%B2%EAMx%0Bns%93%F5%20hs%CA8%9Aj%CB%A0%CEq%E2*3jbU%94%BB%8E%0B%01%C4%DF%8E%8F%C5n%CE%A8%80%C3R%8AR%7DWr%09w%09%1C%9FV%F0pcZ%3BQ%AC%90wOq%1F%DC%E5%07%F9%94%E0q5a7%E4%E2b~%E6%EA%BCza%E6X%F3%5E%DB%8F%C4%99%0F%3B.%5E%12%E1%BD%B1%E6%A2%CC1%B4%17%5Eg0%D2%85W9%8B%D7*%AB%9EQo!ix%E1%D3%84%0C%EC%23%3A%BBV%84%9E%D1_%7C%D2%1D%A2%EB7%AC%5CJ%3FW%10%F5%8DAz%DDF%E9R%9A.R%FA%A1%D9%E5%CBF%7F%F8J%DC%01%16%C8%3EZG%3E%3E%F6%EF%83%CFpL%90%9F%B08%DF%E7M%85c%94%A7%0B%DD%0BDO%9A%80%B8%EB%A18D%ED%AA%E8%2B%26%20%B9%22%2F%8Bt%AE%BC%92%F0%B8%16%06L%40z%80%A7%AEi%BF%06%F0%07SU%9E%84%12.i%7Ds%A3B%907SSHHn%EA%82%1D%3F%D5s%14%D6%9B%80tu%14%D4%FB%DE%A0tnk%3F%0Aa%13%10%FF%B4A%E8%AE%0E%D19%F3O%04%0D%96%EA%98~%93D%08S%3F%8E%B1%D2%E7i%5DS%25%F4%02%9AO%0DA%2B%E2%C6NZyK%94%87%8C~b1%0Cp%BARfG%87H%0F%89%99%82(%E3w%01%17%CA%3A%E4%10%03%E4%3Dc%17%1D%B9za%9B%94K%0D1%F3%94(%D7%24%E9%91%03~%BA%CA%86i%88%20%CB%A5w%13%22%AD%FB%EB%A6%20pb%89%3By%E04%ADw%8D9%88z%C6%16%5C%17)%7D%CDL*%C3%90%3B%95%95%B4%90%C7i%1D5%10%86%10%B1ev4%FB%90%2B%DE%87(%97%F4%19r2%BC%F6v%89%D7%98R%C1Q9%18%BA%F1%F5%9E%A0)H%22%CA%E0%5C%12%11MA%CA%24%06%E7%A1%9B%A6%18.%A6%D7%0D%83%E6%DE%13F%E638%7B%E7%9A%DB%1CQ%BB%CC%D8gT%5CS%A1)%C8eB%5DE%A3%1Eg%C0%14%04%F63%3C%5E%EF%0A%8B%CDAXd%26%7Fd%16%B6xl%A3%F8%9B%D28P6%8B%E3%00y%A0%FF%13%F9u%0A5!%8C%2F%A7%E3%9BR%D8!%40t%DAH%A5(%96%F6%07%10%93%90%F1%B8%F0%A8%D0%C8%C3%0E%8D%0B%04%9Ff%C7%16%9AK(u%B4%15g%10f%C4%96%D8%05%D9%8538wC%7B%D6!%0E%80%7Ff%1D%C2%014%01%C4%3B%EC%80%04%08%90%EF%C3%95%D2%0A%EA%85-A%D8%F4%CF)y%EB%D13%00%BF%B7%CE8%23%071%16a%FD%8B%A0%D6%AE%BBE%AB%0C4%1D%A6%E3lNe%C6P%00l%95x%DD%81%EAa%15%D6V%03%EA%EB%2Bw%A1UH%8E%04%7F%C4%D9%B8O%C1%1Fe%5B%11%EA%2B%06%C27%B1%10O%D0%FF%AC%E2b%19%D2%16%BD%1C%C5B%D0B%7FbM%C3%90E%88%F0%0By%E0%DBXk%1E%5C%AEC%E1%9D%5E%E3%97%3BDm%BA%F1%97%1A%11ku%8B%D0%DCi%F9%EE%12n%88%11%C2l%EE%8B%DE%0B%AC%16!%7C%12%91%CA%EC(h%0B%A4%E0%3B%C4%F5%AE-%10%B8%24%CB%B7%09%E6%B2N%3B%20%D0u%E4%9C%88%B7%FEk%99-%90f%D8%F35%BC%F5%AF%A7l%81l%87%E9-%22%D6z%D6a%0B%A4%C1%5B%D8%83%1F%23%C6%25%EC%80D%1C%A2%03%3F%C6%89%E6.%3B%20%CD%DB%E3%1C%BE%22%F6%CA%14%BF%12%E3-C%12%B2%BC%A8%E8%E78k%B5%E4Wb%FC~%0A%88C%26d%02%8E%A9%F1%AFb%E3%2F%14%CF%EDQb%FC%26%0AH%D7'%84%CA%B5'%08%11%FC%AB%99%BBM%5Dj%8C%A7%81H%DE%20%DE%CA%D7%DE%C2%DA%DC%C31%9E%A3%808D%7C%FE%06%A8%F61bZ%C5%A9%10%8A%C4%CB%BD%1B%FE%835%5E6(%1Fr%D1a%90%91%84%99%E0%C2%1AW%18%0C%C0%3D%A9%DC%81%14%10%D8%01%9B%24%8C%897%AA%83r%915%0D%FD4%90%FFn%C0nU%13%FA%0C%F6%D9r%1D%E1%9D4%A7%0B%9A%DB%1E%C5%BE%9D%3EF%0A'0r%E1i%20%15%B3%3F7%BD%E3%9D%0A%12%DB%08P%B0%91%2F%97%B2%099%A0dUo%81wG(%9B%90%EE%B0%BA%FCp5bSQ%3B%20%DE%FC3Q%E5%A1%EF%FCS6!h2Z%25%C1%C7%90crENwwE%C2%0D%F3%F8gMG%B7%7B%90%F5%E1%94%D7%9Czs%F6%B6%87*%9F%3B%2B%01*%19%F9M%B5%F5%8A%04%B9%02%9A%AD%ED%BE%09F%5B%AF%C8e%24uoa%FA%E9%CA%EB%8461%DD%E9%C5%1E%A3%8BA%86%B8C%F1%8ET%08*~%A4%A9%E3%7B%19N%01SE%B5%14%C8%96%D2%8A%BD)%10%E7w%0F%CArf%FE%BC%D4*%E4%8ErYS%20%FF%96%CEj%9D%E6%99%DAs7%26%97%1A%E3S%F64%EF%87%CCs%A5h%88m%CF%9DF%5C(%3D%C6%FF%98%D7n%9C%12%AC.%5C%F3B%E91%BE%ED%E3%90%C6%C7%F2%07%86%EAC%9Cvw%ED%0Dj%7D%ACVx%DC%991%9E%0Fh%7C%A8%82%1A%11R%9D%11%E3u%20z%BB%AD%D9%20%8D%191%DE%A5M%CF%F5%B6%0F%B3AB%19%A7Cg%83%8A%FD%10%9D%11%3D%16%19%F7%20%8E%D4%E9%AF%D5%EA%88%99B%C3%90%B4I%23%06%ED%B6~%1A%89%B6)SD0%03%D2%EE%7Ba%9E%9D%90%3Cu%F3Go%E6%91%D4%D8W%2CV%D5%7C%BEP%0B%B9%B2U8%2C%D9%08Y%09w%B5%90%F6%F8%BE%9F%06%ECc%F8%A6%C0%12-d%17%F8N2%7C~c%A4%F7%E3%2F%855%10%F4%B8rYx%DB%18J~sH%85%C4%3BR!%DE%86%AA%F0%AF%EE%FF%B8V%19%B2%08%F1%84%20%B1%01%E0Fi%C5%81%94VGGSxt%05%FA%3A%B2%FAY%B4%F2%18%EE)%01%A4%C6%F8%94%D6%B4%07%BE%10%A2%AC%A3J%99%10T%10%05%B7rMz%C4%B1%D6%D7R%3C%94H%CCx%24he%C6%1EV~%EE%ABOI%12%A7%5E%F8%14Cj%DD%C1%13%60%DDv%E6%12%FF%5E%98%DE%D2%5E%7D%14%B6mQ!)%E15%F5%F3L%F7r%60%9Ca%9C%DA%B75%AB%00%CA%AFG%15%88%FE%8C%886m%F42n%0Bj%07M%B2%F34%C0%E2b%25%C6%B7%E9o%D08x%BD%AF%9A1%85%E0%A4%CB%19%3D%04e5%9B%8C%D4%ADi%18%BA%F4u%9D%0E%CE%81)%1B%18w%E5%FA%D6%CA%99%23%F1C%CA%C19%1E%1D%DC%A9%1C%8B%F6%DC%A3%B2%E3G%02%8C%8C%89%0Bn%C5%CF%95%A7%A5%AC%7C%2Fx%96%F3%C3%DF%13%FDY%DB%23%D9%AA%93%B8%90%84~tbF%7B8%FC%86%98%06%B9%0D%8E%85%95QL%97%9C%E0%5E%9E-%3D%FD(%3EI%D2%B6%D6%AD.%18(%C7%7D3%E0%ED%5C%CD%06%F1%E4%EB~%2F%C6%C9KQ%1D%FE%99%5E%C4%F8_S%08%B8%0AK%CB%14%7C%A7%95%40%F3%D5%E8%98%94%F5%85n%91%D0I%AAB%AD%90%AA%98%20-%2F%A1%B9%3A%CD%A8v%23%A1S%F5%FC%BDL%90%1Fv%9E%09%EA4s%FD%F8%E2%A5%F2%C4Wy%99%20%B1~%DDE%9DC%96%09%89%9C%03%FB%12TW%A8%60%81%A8%DB%1Eo%D2m%1F%96%8Fe%CF%A0Z2UWm%CC%AA%95X%BC%9D%CB%0D%3F~%D7SK%89%B1%CF%98P%19%DB%1D%3F%A2%3A%B6i%C5%115%C1%10d%A6%CD%C5%A7%BEa%82%01y%D3B%D4%BE%9FU%16%17%89f%20%CD%84%0Fd3%D5%10%3Eb%06%01%C2D%C2%1B%B7L%99%FB%F6%40%097%03%B3%24%9CMS%C0%E9%D3q%AA%C6l%B1%A2%94v%40%D3%FFq%DB%E7q%91%C6%CD%1A%04%AF%FF%01%D5%B3%93%8A%C0%85b%9C%00%00%00%19fcTl%00%00%00%0C%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02q%C5%B6%1A%00%00%09%E7fdAt%00%00%00%0Dx%9C%ED%9C%7Dp%14g%1D%C7%7F%09%7B%97%BB%BDg%F7(P%0A%92r%87Ti5%85T%228%25%90%0B9%C2%8B%91%0B%82%8AH%CB)%B5vF%A7%094Ef%7C%C9%A6I%3A%5BL%09%20%FA%8F%CCd%A1%C5Qg4%99%3A%3A8%83%C3%E6%A5j%86%2Bw%D2%81%EA%1F%CAB%A0%14eJ%5E%20%40%DE%D6%BD%23o%DE%EE%3E%CF%DE%ED%3E%FF%F1%9D!%EC%3E%BF%DF%3E%9F%BD%7Dn%9F%DF%F3%FC%F6%D9%03H%97_W%02%D0kPfK4%20j%BA%06%AC8e%26%9B%A7%F8P%0Fe%A8_%2B%F4%19%AE%C5%AB%E9Cj%94%13%D4%19h!%DCj%A3%0Dq%0B%E0%17hCr%12p%86%3AD%EBk%ABd%FA%10v%906%03r%5E%DA%B5%86%3A%C4%D7%B7A%A1%0Eq%A9%B2%ED%3A%D0%D7%08%0E%AD%25!%DB%90%AE%96(%DE%E1%89%B2%11%BB%0C%3E%3Fo%18%EB%80%86%D6%DF%25W%13K%E0%ACl5%FC%0C%7B8%3B%9A%7F%9B%C8x%A7v3%CE%CC%080%03%7B%BC%A7w%24Lbpk%7C%F7%B1%90j8O%82%EC%C5%99%B7%85%C3%1B~%DE%06%DBpux%E7w%3FJ%82%9C%C1%98%AF%865%95%C8%F0%22%AE%8E%8F%02%FD%12%16%E2%EE%1D%CE%C1%3Ah%B7%EB%3C%E9%3A%EE%DB%E3%9B%AB%3E%8F%AF!%B7%F0%9E%9B%00%D9%F3%7Cm%FF!%8C%BD%B5ix%B6%82%AD!%5Ey%8F%C0%B8%B6J%C0%DA%D1%10%3B%F3%FD%7C%AC%CB-a%03%9E%C1%2F%FF%8F%8Cu%98%11%F2%84%F8H5%CE%C5%A7%AC%C7C%DCk%3CxH%5Cv%87%80%7BQ%C1%3A%D5%E0!%DF%94%7DQ%ACC%030!%7C%15%DA%E5x%06k%F6%0E%01%7C%01%EB%B1%11%18%FCYh%E2%F0%0D%EF%2F%8EA%FB%CB8%8F%02%60%04%12%04%F5c%CD%1D%DA%CD%18y%06%D3%3Fr%020%07c%0A%1E%E2U%25%9CY%E4bGg%FF%0B%DB%09%03%A3%AA%95x%08%B3%18%E7%F0%CF%80%AA%CE%95%F15%00%BF%F7%2C%09R%8E%99l%EEU%D5%DB%3F%24%204%A1Y%841h%EE%1B%18%C8%E1%3E%85%8C%D0t)J%B0%9F%C6%40%F8y%96%18%D0%12%C2%DB%5Bob%20y%85%D6%20%CB%04%BC%BD%8C%C3%40%E2%B2%25%06%22%8CA%D1%7D0%1F%AD%F0%16%C6%18I%F5%10%12%15%AEQ%0C%C4%15%B2%06%A9%0A%E2%ED%ED!d%0E9%A2Xbx%07%87%B0v%14%90%D1%E0%9B%C66%97Z%60%89%01n%B5D%C0%D9%3D%EALxaQjS%97m%E9%1F%D4%F7%26f%99%19%93%B1%1B%EA%22%25p%FC%DB%F5ef-l%94%B6%D2%22%E2%B2f%13%7F%EC%81%99A%E2%C5%C6%E5NBNF%DA%A8C%7Ck%3EX%18O%2B%D35%A6Q%C8%CC%A4%E1g%24%E03%CD%B43w%5D%00%AF%8A%E0%0A%A8%D8%E1%92%7DH%D7%06%F0%EEZH%91%01%ED%1A%E4%A9%E4%EDN%13%92%D3%06%BF%1F%FD%5E%AB%C5n%23Ky%16%F2%25Qu%40%A1%0A%81%B5e%C57UuI%02hr%BC%0DA%A4%FEy%CF%3D4%9B%22%04%3C%23H%95P%A4%14%3B%02%CDX%C9Y%06%F7%DE%E4%AE%16%11%03%02%B0M%8E2%E0%C4%0B2%EC%9D%9A%C42AP%05g%09%9A%1A%7CCl%A5K%99%D8u%8DADr%1CR%07%9DoK%DCdj%8B%1D%86-%0A%C6%3D%1B%89b%95X%AF%B6%C1%8A%89%02~N7%3E%E9%92%85%3EY%AA%F6%AD%DF%25%C3%2B%CADI%7B%9F%E00%03%15A%AE%94%ECL%B6%2Cp%B8%E6I%B1M%97c%2F%BB%0B%C1%5D%C9%8E%1E%7F%8E%12%E4%CC%B7n%C3%3BgG%81%AFU%0Fq%BB%BEA%07%B2%D6%A7J%AE%E0%F8%40%11%95%D0%E9%7B%0F%5C%F9%C1%8A%7F%E7%EF%A4R%F7%94%EA%94%1B%25%23%F8%C9%A5mq%16%E7K%E6%F2%AE%93I.n%DB%A1%BC%FD%AF%F8q%BB%A6%CB%82%5D%C8%B7%A1%93%E4rX%B1%0By%0A%18%C2%24%9A%7F%D2.%E3%E4%20%5CQ%F0.h%CC%26%E3%84%FA)%11%9F)%82d%1E%C7%96.%A8%F9%3DspI%C8%94%08i3%82P%60K%1BO%FC%20p%C1%16%A4%FD%EEQm%12MH%CA%DA%14%17%906i_%9E%ADT%3B%8C%9E%BB%A9%89%BE%87%EA%90%B69%0A%A98%FD%AEL%11R%A6%E0%9F%068%A2%8F%B5n)%0A%A8T%A0%CCA%8B%CB%23%FB%B1OP%9C%10%5B%13%9E3%8B6%04%92%F9%13%E2%3Do_%F1%3F%3EN%9D%E1Y%C0%CF%A5%8C%60%1Bg'%A0%96.%C3%B7l%40%B2%9C%8F%CCV%F1%3B%C9%FA%E3ET!%17%D4d%A3_'%3C%CD%C9N~%83D%8D%60%E2%CBd%96%D1%9B%061(%CB%2C%A9f%5E%FE%10%92%25%C4%B4%E1%B9%7Dr%9Ao%D6%0Do%AE%8E%EE%AFg%7F%B0U%15%C3e%85%3A%A4%10%FC2uH%25%DC%A2%3C%A5%D2%14%02q%09u%C8%EB%DDK%DF%A7%BE%BC%0D%95%CA%B0G%8A%9D%A3K%D9%BD%5Dl%E8%2F*%A3%1B%F6%CB%F7%8BM%AB%00%F6Q%85%F4n%06O%25%C0%15%99%22%83%EB%EDTr5%80G%A0%08AAv%B3%9F6%C4%13%82%8B%CDRj%E5!%3DqZ%CC%F7k7J%9C%26%04%5E%87%9A%DA%F8%F6%FA%01%99%26d%C6%EC%0A%95%17%0F0N%40L%EB%F05%B6%95h%FF9%02Y%A0%7D%91%D6)F%16%24D%9C%82%BC%06%F0%D6)%C3%BE%C3%2B-s%0Ar%09%F8B%8F%E1s%7F%97%1C%00%0B%C3%04%2B%F2%CB%5E%09%89%DA%C6o%D3-%B9)%80%23%10%CF%1Aw%5B%F2!%DB%F5%D1tK%D7%03%88%13%8F%0E%F9rw%B5V_W%9F.%D9%F5%7D%E7%3E%09%5C%DD8%06%3B%D0bIg%88%0C%3B%07%81%23%03%8D%CF%D5%C8%06%86s%0EB%F8_%95%19%3C%FA%07%A45%86%EC%18%24921%16%23%C7%CE%D1%87%FC%A1%A8%AC%C5%C2%F1%FC%B6%1F%D9%80h%7D%8E%95%091Z%DDM%5EQo%0A%D1b%FC-%D9%02D%00%F2%F2%ED%A0%19D%00K%0B%F25%C8O%88N%DA%B4G1*w%25!%16%06%5E%1AD%B4%00a%EF%18%95'%07%11V%C6%F6%A8%12%0E%10%9Df%C2%E1%B7%0D!Ok1%9E%CC%004%88%C8%E9%CB%0Ao%FE%2F%0D!%91%ED%F5%96z%C7%06v%808%CF%D8%D4q%EEiC%C8A%F1%80%A5%9Bq_%5E%5D%94%E4%F3%EAc%8D%15%8A%11D%B0%D8%AD%CC%FB*%1B%24%F9%1C%17%9B%D7~)%5BH%DEA%40%7D%02%22%E6%2Fo%C0%C9%EEg%B3%850%B3%DA%B87%C1%BB%5B!%F8%F1G%03%FDF%FD%825H%C1%7C%ED%AF%FB7%84%B5%98%7C%5D%60%83a%DF%83B%16%20%ECh%8F%94%5C%EFS%8Cw%EB(h6%FE%02Z%82%C0%A7%F9%15Z%E4%83%0E%BCW%F3%B9Y%92%0DH%EB%E9%CE(_%40%1A%A0%9D%0F%F9%BE%98%3D%84%AFU%D5%BE.%01Pt%BC%C0d%E9%95%D99X%82tn%25-%BD%C2Wa%09R%E0%17%81Up%1E%24%089%C6%7B*%B3J%AAM%83%7C%9E%1C%E3%2F%CBv!%C3%E4%18_%A3%AB%C3%A4%E1%CD%E4%09%12c%BCo%24%3D%A3G8)%9D%98%DE%07IA%8C%CB%E5h%A6%95%A6%CB%95%84%E0c%7C%C4vR%CC%DBK%9Ai%DD%B0%B8%DA%18%23~%94%F0%20%02El%BE%9B%E5I%B6%22i%1E%DFe3SuQ%FB7%E6%D0%3C%DEL%D7%9F%94R%A3%3E%AA%90R1D%1D%C2%0E%AC%1C%A3%0E%B9%00%C7G%A8C~%01%F1%FB%D4!Q%C8y%F0Ir)%E6%B9C%C0%14%A6%20%86%FD4r%06%B2%19%98%C4%CD%84%19%24Wq%04%B2%1F%AEA%CB%981%E4F%B8Tr%04r%FEt%05l%196%84%A0E%C7%DE38%22%0B%A1%E5%87%E0%B1y%BDF1%3E%D7%89%B5%AE%1F%85%92%7F%8F%01w%7F%FD%1D%A3%18%FFw%E0m%7D%E38%B1%09%D0%13rr%B3B%8B%AC%AF%18%C6%F8.%E8%98%995%A1%23%BC%E4%A7%A7%EB%C2eRjo%04%5Cc%CD%BDF1%BE%91%2B%26%0C%AE1%EA9%BB%F7%1E%C4%BE2%5E%E9%10%5C%9A%99%84%E8%E7%F1%A7%18%A1br%E7%1F%A2%EE%24%B0%3A1'%BCN%EBF%C6%F7%EE%C2%F2%A5)%88.%2Cum%82I%88o~%F7%FCL%18%EE%C1M%E09vvb%F9%ECn%EF%C8%5B%BB%24%80%1C%DD%99%E6V%C3%E4%E5%D2%AC%F87u%D3%D4%12%FD%10%E0%DD%F0%EF%C6w%E3j5zdu%EA%1D%804%5D%92%A7%9E%DCvj%1FU%B1%CE%E0%E7%023%DD%9D%8B%01%B4Wm%AF%D7%AFJ%D4%C6%D7%C1%F1%CDS%DFI.R%B6.v%A1%EF%CB%E9%97%1F%E5%8B%5BuoJ%A0B%C8%1D%9F%F5%FB6%D6%2B%3E%E2%C2%C6i%F2%3C%BB%D3%A5%BB%C7Z%7F%FCY%DD%3B%B2%1D%09%B8%FA%A7%07%9B%3D%81Y%EA%A3r%06%10vk%DB5%7D%E1%23%C1%FF%7B%C5%CA%1B%DE1-%7F%EC%09%ECpe%82HJ%DC%A1%2F%BBX%C9L%BB%5E%1F%AC%8C%B5%DC%9E%AC%96%2F%A9%02W%A6%BF%81%E15%1C%E2sS%D7%EB%C3%BB%C5%E0%9D%A3L%EC%CE(%F6'%BC%A1%0C!%CCk%B2Q%F1%91%C9%AD%FA%C4K%00%E5%93I%A7%3A%D9%25p%83%8A%D11%18%88%F1%CF'L%85%DA%8F%A1g%E7_%F2'2c%FC%7C%E0%3E%01%7F%2B%FAn%2C%13%08%BF%92xV%7C%C3zy%E2W%05%7CA%ED%5E%94%015%86%0D%CF%CDD%17-E%89%FFN%B4%11%5B%14%5Eg%F2F%9E%B9%D0R%2B%5E%DC%B2%C9%3B%B6'%0A%26%E9%12s%E5%60%7F%18aB%ECT%8A%8F%2F%86%BCLg%0E%E8s%B2%05%2F%DF%B4%1BC%04%97%94!%24%E3%11%1BZ%85%1C%7F_C%A7%E6%A6*%BAKf5u%E6%9F%A1%BD%8C%1F%3C%03%09%FAk3%17%1D%82E%B4%AF%16%F3%B8%06%A2%F5v%C8%84%F2%EE%C9f%26K%CB%A6%22%26K%AC%2CJ_a%F6%3F%DC%86%14Kn%F6%20%A6%FA%1Fc%CAy%EBp%20Wn%00%00%00%19fcTl%00%00%00%0E%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02_%95%7F%9A%00%00%09%C3fdAt%00%00%00%0Fx%9C%ED%9C%7Fp%14%E5%19%C7%9F%E46%B9%CBfw%2FB%D4%A0%81%DC%20%12u%A2%80%0D%15%DB(Grc%22Pr%D5%B4%8D%9DTO%E9%20T%2C%88%80Lma%01%81%83A%2F%F2c%FAcl%B3%A0V%FFp%9A%03%87%D6N3%C3%9B%842%09%04.%22%C5a%C6iVB%D0q%18%F3%13BB%F0%BAw%094%3Fv%F7y%F7%EE%DE%FC%95%EFL2%B7%FB%3E%EF%FB%D9%BDw%F7%7D%DE%F7%D9g%0F%60%B4%9Cc%F6%00t%E8%EC%8BK%2C%20%E1%D1%EA%A61%B2%A68%0FqB%13%D2%95%D04%0E%90C%AF%FA%983%C4%3C!%9F9%24U%81%0B%845%24I%05Nf%0D%D1%C6%C1%0B%CA8%406%AB%AC!%B6%CA%C6%EB%AC%19%20%84%BB%14%E6%108%B8%C2%1Bg%0B%F6%E2f%C4B%C8%DB%FD%20EC%A2%C9%B8%F0%8F%E3w%23%B59o%C5%06%9C!%BD%E0)0%2C%DC%0D%87%90S9%A0%96%7C%AA%A2%90%14%1Fl1%2C%F4BJ%A5im%E9%01X%C8%C9(%A4E%853%C4%A8p%258%CC%5Bp%B8!%9B%9F%86BB%1A%C7%10%B2%13%83p%B9%CD%03%F0%04%82%F8%E6%B5UD%9AkT*%3DUS%174%AD%2F%AC%E9%EE%23!%F3~K%CF%E9%CE%EFY%F0%B8Q%B1%AD3%E7*r%94p%BE%DB%B3M6%B5%A8~%13%0A%9E%DF%A9%1A%15o%BE%86!4%0D%808%DB%D4%E0NHw%B5%FE%02x%FD%FBI%BC%D2C%05%01%F3%AFk%00%EC%5EiU8%EC%D2-M%C9%D2%9Bk%8E%96%F1%5D6%A4%B2fN%06%C1%EF%D7%3F%94%967J)%20%8B1%83%DAl%0Db%A8%EA%B3%ABT%1C%B2%103%10%7Fn%06y%81%0B%10%94!mWP%1B%BB%0F%F6%19%B5%E4q%3Cm%3E%A8D%F5%FE%0FP%13!%03%16%0C%18%94%15%0By%DF%C7!%A9%3F%C6%DC%01%C0%FDP2%DD%A0%A8D%BA~%06o%40%CA%F1%A16%B5%A7oT%11%FD%A2b1%E7%D7h%7D%80%C0w%A8%09%7F%5Be%BB%A2_%F4K%08u%1B%F0%87k%0F%DE)%B0'%98%EA%D3%2F%F9%04%F8I%A8%03o%3A%99%B5%D7%DCB*%26%20L%E3%5D%86%06%B5n%84%E1%88%AC%18%CD%3B.%AD%A7'%08OJ%C63%A7j%0C%12~)g%83%1F9%8E%8E%FA%AB%A4%04f%19%0D%E8b%8E%82%40%02%FF%C9F%2C%80%EF%80%BD%E1%3E(%DCiP%9E%8A%0E%C3%97J%B1%C3%00%A1%1F%E0%8B%D3%C6%E5!%A3%FB%F4%96%CE%F7c%16%00%2F%99%17o%F2%E9%EF'%B7%3EQ%DC%89%98rd%DD%DD%9F_Qo~%0C%D3%DC%AE%A6%12%C2%F7%A9z%BB%A7TU%F8%FD%A7%A2%9F%DF%EE%7C%2B%5E%CA%81%B0Og%AF%C3g%0F%CF%98%1F%8E%F2%C5%B5%AB%A3%FB%C6D%5B%F4%A6%07F%91%19%BD%CB%2B9X7%C0a%01%1C%2B%A1(%3D%DB%10%993%D0%BE%DA%A0B%A2%20%01xo%00%F5%99%F1B%3C%10r%CFB%18qC%0A%FD%B7%9D%1C%DD%0B%09%EF%F8%BAp%BF%BD%8By%E4.%E9%AA%CD5g%99%87A%CB%C3%C4%3D%B7%E9%C3%AE.t.%1E'd%FB%15%5BI%23%3Ax%C6'%FBl%C2%C9%17%EEQU%96%10%C7%0D%E0*_%A9%7D%9A%E9%B9%F0%7D%90%DCtM%C8%A1%98_%C6.%E9v%A8%E7%A6%01%CD%9C%3F%0EU%D7dW)%D0%C0%16%C2%E7%FCm%12%5BBT%A9%14%BE%3Dn%B5%F4%8E%03%A4a%962%0E%94%CB%F8%A2bB%13%9A%D0%84%10%7D%BDs%1C%86%92%E5%7F%7D%8C%3D%C4%05%3B%983%04%2F%1Cf%0A%90%F6y%3C%85r%24R%CDP%17%BB%96o%99%EF%86v%EB5%8F%D1_%2C%DA%9A'%A9fY%D3%3C%EB%10%E1Qj%D3%7Cm%A5B%C4%22%C5%3A%04%DA%D0p%EBM%95f%A9%1C%81%A31%DD'%076R%1A%D6%9D%CB%D6%20%C9%EEX%20%D2%E6JH%CF%FF)~%80%9CRn'%C0%DF%88%05%02%E2R%92%A2%A6%60%0F%AE%B4)c%EE%03%0E%19%A4%FBc%82%80%B8n%03%C0Z%CCJz%B7%9B%F0%3E%0AC%1D%C0%09%FF%0E%8FG%5B%95%9D%C5%2C%AB%BA3%40p%01%D4Z%87%B4%F4x%FC%BB%9B.%95o%C1%BE%AEK%FDv%1F%08%DFi3%60%EB%90Z%15%C4%FD%C5%CA%BFk%B0%8E%AF%F2~I%00b%7B%C6%FB%D5%5Dp%F4Z%7D%86%F4g%CC%D0%EE%5D%AF%FD%A7y%2C%A4%A3s%99%9D%CB%BFG%C0%F1%5B%CC0-%F2%94%EF%C9%D8%20p%99T%BD%E8y%86%B4%E5!v%D1p%CD%7Fc%84%88%87%0B%40%DA%D3%F9%0C%96%16R%1Cc%FB%11%09%83%09R%0D%9E%DF!%86%99%A7%2C%B7%ED%D4%09%D4%C8%06%B6%9C%8E%ADQ%60g%24Dg%DF%60(J*%AB%A0%B05%DBO%01q%B8%8F%9F%C6m%E3%84%D8%09%DFJXC4%9F%C1%25%0Ab%D8%F1%BCW%AD%1E9%C6%C4%DC%F1%C6%92%F2'%DF%15%7BmZq%25%25%1F5%19%A73%24F!R%5B%E2%0F0%86%2C%04!%1B%EF%D48%D5%01%D2%7C%95%3D%C4%11%C8c%0D%99%0A%B5%ED%5B%8E%9A%3C%80J%84%B6C%81%F3b~%11%D3%E0%22%D8%5E%ACt%FE%10%60%3DS%88%D6%BC3%03X%E7%EA%B5%92%E4%20%60y7%F1JpEFH%C6%10%E8%E0%14m%12%C7%18%92%C1%3D%A8%8D.l!%82%CC%05%CA%B7%F6%B2%85%B4%AAI%DF%FAw%A5*L!%EFG%87%C7Q%EE1%C1J%CF%1B%07%88%E3%DE%B7%C6%E1L%06%9F%B4%B1%85%00%8C%C3%D75%01%89%05%C2%DA%01'%1E%22%AAz%90%A6%D3%09%85%24%13%1DH%5B~Q%15Me%CF%E8%B5%8C%AE%048%A8%EA%404%1F%BFI%BB'u%F8%23%24f%1F%C6LR%9AAj%5C%F2%23%9D%12%A7%17%A0%1D%AB%1E9D7%92%C9%19m%A6%FE%BD.%97%1ED%038e%0A%88%0B%5EGLR%7CP%20U%E9%A5lD!%14%13%2F%E1%06%1CGL%C4%01%DE%07N%BD%A0%8AS%19%04%A1%EA%85c%98%C9V%BB%0C%87%F4%0A%9C%8F%01%5D%FC%B7%AB%7C%26fb%DB%26knP%0F%12*%DFJ%95X%D1%11%E8T%11%13if%D6%0E%DD%243%A7%E4%DFEu3%CE%16%9ER0%9B%BA%C2.%A2%0B%01%8AaE%D0%FE%96%AC%FF%1AM%11%17f%B9u%F7SA%9C%DA%1DV%B8%DAA%F1(%5B%3F%E7%88%0E2'%A8%9D%8D%BD%0Ce%08r%9A%5E%EC%99%0A%C2-%BAC%FBo%C3%E7g%82%7C%E6%F9%87%C7ZQA%F8%81%CF%9E%8DDa%97%E0%90%DF%B7%7F46fM%E7OfHKU%F8%15%1CS1%88wqu%E5%D8%D4%13%3AH%B5g%C1C%92%0B%1C%3E%0C%E2%EE%98%2B%C7%0A%09%F4x%8A%8E%13%90%A6%0Em%1B%A5%5EI%19%FD%BB*b%84%EC%5B%8A%A5%5E%DDl%22%AF'-olB1%15%E4%11%EAx%D7%F6%5C%A1ol%86%1A%8D%8F%17%5D%D4%90%B6%EB%D0U%40F%14%B5i%A7~%04%F7%F1%8EJ%2B%91%BBM3F%A66%17%11%E0%EE%D6v%23-%D8%C8h%88Q%C7G%D4%A2%8C0%15%F3%B2%81%A3%F0%F1u%A3%23z%A6%D6%81%91%BE%D1%E1%CD%8FNQ1%1Fo)%E2-M%1A%05%91%2F%90(%C4%DC%C7%8B%96%9Em%F1%B7w%8Fx%1D%A7~%A3%5D%89%AC%E3%11%1F%2FdX%81D%9E%3B%0C%DB%10%17%1FnP%A2%EBx%F3JB%3C%2FU%A7%06%F9%19%24%B2%8EG%7C%FCAw%1C%10%ED%BA%EC%04%EE4%E6%E3%C57%E3%60D%20W%A3WWr%5C%D1esq%CD%E9S%A3%10%96%2B-%E1%F5%CD%F5%3E%D6%10%98S%B1%A5%3C%25%C8%16%22%E5%C1%94C%91%80%1AKH%9A%2F%FDF%A8%811%C4.%DB%BD%CC!%C92%A7%84%D6%B2%84%88%05%DA%90%95%04-%9Dr%C4_0%82%D4%3E%0B%CEw%EA6%DA6%C8%EC%82%05%7C%96%B6%C6%0B%87s%B5%E1%3E%C1%EB%F8!%A5%97%AD%84%B7%23c~%D3%A9%10q%AC%A3%5C%C7%5B%94%ED%9DU%EB%86%DE%18%E4%DC%8E%EB%B8%8F%8FE%C7%E0_%7DC%1F%C5~%3B%E5%3A%DE%AA%1A%00nen%BDrQ%A6%5B%C7%5B%D5%B9%C8%802%A4%2F%D7%C9t%EBxk%92%D6%96%D6%7C%EC%BE%B9%95%D6%AB%00%24%91DCZk%E6%05z%D5%5B%9B%D3%B3%01%8F%02XV%7DhD%8E%C4%C7%9A%8F%C7_%7C%B6%AA%B6Q%EF%C4%8A%BD%BB%12%CE%00a%F2%7D%EA%FEa%DB%0Ew%E2%19%90*%9F%9F%5C4l%3B%92%08%93pi%97%D2%DC%23%C3%B6%DF%60%C0%D0%86%5C%BB%3C%EC%0D%3D%09%7D%AD%EF%96%3E%FC%8B%05%C8%D1%AB%C3%5E%2COs%D3V%3C%FB%9B%AD%D4%10%7B%FE%9D%9C%EF%FF%9B%12%5Db%DD%17%8D%FE%02%90%5E%A6%A6%FC)Xk%F9%B7%20%0E%86%F3%3D%DA%CAy%1F%7D%0D%E9Q%97E%86-%8B%80%D0%ADJ%DB%E8%AB%A4eZ%5C%0B%08%99eA%E0%97e.%A0%BFH%40%FC%E3Jk%90%B3%1D%E2OT%D1u%B2G%B5R%0B%0B%BE%8E%14%9F%1B%84%D4J%98%07%F5S%ACP%92%E9.%A9%C1%F7%BF%85%7B%9B%E1%AB%E9%04%AA%09%FC%FD%8A%7F%115%24-%C7%E4%A7%1C%A4%9B%E9_%8E%0Fd%ED%FF%F9%87%15%E0%EF%20%DA%B5%AF%B9%D3o%CA%F4B%F11h%CDkC%0D%7D%CE%3F%A4u%E0L%02%D2%1A%12%D9nLL%FB%11%09%8F%C3g%97%A3.%E7%89%A2%C9%04Z%23K%0Bw%E2%9A%1F%D4%FE%20%A4%AF8%E1%D3%FA%7Ba%F3%1F%16E%BD%E6%A7%8F%246%2F%5Dz%F7%08%01%FB%CF%88%02P%A7B%DBs%25%1FH%DAW%F6%89%92H%06%3F%FF%E54%1F%EC%FDv%FE%8A%A6%13%DA%FC%2F%7D%F7%AB%5Bu%93%8C%A9%D2%A6J%0DR%AC(5%B6%C1%18~%B8%ED%9F%96%FB%80%C1%AF%C3%FD%0F%BA%CCn%86%20%12%A6%14%00%00%00%19fcTl%00%00%00%10%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%3D%D0I%5B%00%00%09%92fdAt%00%00%00%11x%9C%ED%9Cml%14%C7%19%C7%1F%DBk%DF%FA%3C%B7G%12J%A1q%8C%8B%5CJh%08%A6qy)5%BE%D8n%E2%26%10(%B4*%8D%D2r%A9S%02%91%8D%5DAS%A9%85zi%EC%E8HL%0C%09Q%F8%105g%E2H%E9%07%DE%83%C4%87H%EC%81%A1%94%5C%7D%84%B4%A1j*y%C1%18%DAH%15%B1%8D%DF%C0t%3B%7BN%EB%BB%DDY%E6%B9%97%B9%AA%92%FF%92-%EF%B3%CF%CCo%BD3%BB3%F3%CC%CC%02X%E5%B5Y%00%3Ec%D8R%92%08%88a%D5%00%C6)1%A5x%89%93%9A%D4%FFR%E4e%F1%0C%CF%B7%9B_%11%0E%91T%F2%BAp%C8I%80N%E1%10JxG8%84%FE'%1B%85C%AEk%CA2%E1%10y%C6%E9C%A9%E5%B0%B7%95%EF%D3q35Fhk%B3%CEu%CA%1A%C3dE%02%3B%1C%B2%9A%0BW%FD%DC%E4%FBn%60%20%BB%8F%3F%EBPt%B4Q~%80%9B%7CZ%13%82A%C6%40%BB%9F%7D%AA%14%609%2F%B9%FB%7B%BF%D1%10%90b%80_%40%98u%AA%0E%94%FBx%C9s_%EB%08%22%20%3EP%1E%F70olg%B0%B3%91%97%DC%1B9%AB%F2!%CA7%C2G%FD%DB%99%F5%F0%9D%01%87%FB%18%A3%88%F7%03%04%04%FEa%7C%F5%D5%C1%F3%8C%13%05%83%A3%3A7%F5%D1%EE0%06B%3B%5DC%1A%CB~%E9'%B7%F8%89%9B%23%1A%06B*%C3%3A%F3D%DB%89%1A%14%84%9D%DA%02%A9v%F0%9A%F56%02%D2%11%D1%10%0C%20%8F%06%D9%F6%A1%E6G%F8%A9%3F%F1%A2%20%EE%E5%B4%12%97%3Dn%87%8C%AC%ADF%24%97P%2Fa%D97%17r%FC%1Dv%C8%CD%9Ag0%C9%FD8H%FB%F9Z%D8c%B3%2Bc5%DB%11%C9%F3%FF%85%81%B8%7C%D2%C2%22%B0%DF%19%F7%ED%EA%08%229%19%C5%40%24%9F%D2T%B5%D5%EE*%7F%D6%F01%06%C2%1A%EF0%20%40%60%BB%FDm%EF)%3DQ%8AH%AE%18%AC%B7%85U%B2%8F%FE%CA%F63%CE%14%0C%23%92%83%B1%0Bs)f%1D%CCc%16%9F%C1%AE%9ED%8B%3D%9A%E9%C7%5C%8A)%F7T%CDnTJ%D8%CDI%E8%EEX%E7%95%C5X%08TM%B1%DBr%8B%BE%CF%F4%ED%24%F3%26%0E%8E%0C%E1%87%CE%E5%0C%DBA%F5gL%DF%10%F4%B4%19%F5%E3%7F_%EDSQ%DD%15S%1E%D6%E5%AC%FBt%88%E9%9C%7D%DE%BB%89%7CW%8F%FE%5D%F1%0A%A0!%B4%1E%DB5%18awc%E4%5D%17%00r%A2%95%CAE%2B%E0%1C%2C%24%12%B4%DB%C8%F0%5D%1A%D3%D9c%D0%AC%AF%AB%D1t%AB%00%D6%60!%5E%BF%DD%D6k%14%B2%9D%E5%E1%16%80%86%E8%05%AC%D6i%D1a!%11F%07%AB%CD%08%B2%9D%B3%DAv%D7%9D%194!%C4%7C%5COt!!.F%9F%C85%B0%C2%E1%8A%5C%85%15%FD%FB%17%D4t%81%AB%9F%A2%0E%0E%DBc3%23%8CdN%91%19v%3F7%A27%F0%028%89%84%A2X%BE%F4v%05%B9mn%EA%10%D7%83l%7BZ!%B00%13%90H%83%C5%20%A0%E0A%EE%CF%40%E4%CE%3D2%DF%18%14%92s%8C%B2%7D%E4%CB%AAhHd%E7%CAz%D1%0Cxk%DD%AF%853%A0m~P%3Cd%7BhD%17%CDP%CA%3CM%F7%0Af%5C%9C%FF%18x%FE(%96q%ED%C6o%C5%02LET%F1%0C%90%B4%0C%40H0%03%90I%FD%9F%2B%3F%13%90Kj%06%20%F9%B73%00%81E%99%80%5C%C0%8C%8DSU%BE%F8%20%3B%D5%FAL%40rUb%0C%EB%82!%CA7%AF%E8!Lh%23%25%F5%EC%85%7F%CE%15%CCP%5E%2B%018%23%18rx(r%00N%8Be%F4%0E%9F%CF%5DP-%B6o%A3%3C%AD%81%BB%9E9%13%90%3E%C9%F7%01bVa%5C%24%DC%05%7F%A9%0E%26%01%F1%D3_%9Bq%8C%0A%A3o%C3%E8%19F%20%89%0B1%A7-z%FC%18%D7%AC_%85O%1AAH%A2%B6%13%F3V%91i%18W%3Atl8%B1%0B0ab%AB%9E6'%F8z%1C%A2%0Eq%8A%C0%955%DE%D9%CD%A8%0B%B2%884o%A3E%BF%C3j%DEo%F7%ECV%16gK%CF%F4oJ%02%02J%05%23%10*%AD%D7l%B6%DC5%8D%D7%25%BF%3D%9C%8FR%FE%B0%3D%C3'YW3%B3%FF%A1%AB%C5%1F%EAIA%3Cw%0F%04-%26%E20U%D64u%2C%CF%9F%0C%83%AC%2B%FF%B3%19K%8A%95%EB%3C%C8v%CFs%81Yw%8D%12T%E8%DF%22e%DDt%1D%3A-Ql%09%E0%3D%9Bg%A7a%DC%A8%AB%02%FE%5C%9D%5D%3D%D1%E8_%DBSZ%AC1%B7%F5%AC%3D(%B8Z%23%23%87B%DAO%93%804%2C%D1%C1%7Ce%F8c%8D%9E%E6G%EC%9D%98%FC%EA%B01%E6%5E%F6%09%3Eo%2F%23P%A3%FE%F7%AC%F2%86%1E%E3%2B%25%16%D8%89%810l%13%A1%A8%93%FD%B1%CF%8ES%5C%2B%B5x%97%7B%FA%D82%8Eo%EA%90%C3%A7%1B%03%A2!J%A1W%ED%D6%D2%01%B9C%C1%BB%7C%11M~p%C27%E9%82%BF%E3%05h%11%0Dj%F5T%B2%E0%8B%40%8E%1A%3E%3BG%13K%01%D7%2Cc%ECcV%2C4%9D%92%0E%C1%0F%E1%92%26%18%A2%C11%D8%22%96%019%1At%13%D1%A3%C9n%08%87%BE%AE%0A%86%AC%EF-%AB%EC%D7%C52%0A%C6%96%02%24%D3n%24%A2%D0%BB%AB%00.kB%19%9E%2F%98q9Y%15%0A%F9h%95x%88%E7%1E%C8%09%02%E4%09%85%90!%F0%96%8B%8E%97%CA%F4-%1EY%FB%C2%B0P%08%95W%09%BC%24%B8%E0%C7%DB%BC%8C%40%84%87%97'!%93%90I%08%06%12%EE%C2AR%88%2Fy%7B%CB%AA%F6%60%20%D2%E6%E4W%3C%7Bi%1B%DF%A4%23%1C%03%04%19%C6bAV%99%8B%BF%11%8E%2B%A0%25y%08%05xU%BE%9F%FB%09%DAEK%09%82X%7B%E6%FD%25d%25%0F%09%8E%83x%CA%3E%A2%E7%24%0F1%DBx%C4%B2%07%E9%DC%D2S%C9Ch%1B%8FYX!i%9DCj%D2%10%DA%C6s%87%9D%60%AE%F1%3A%D6P%944%04%10c%5B%13%D22%9A%B7P(D%DA%04%EE%BE%A0%DC%AC%09%85%D4j%9EV%90w%AEBdx1YH%DEV3D%9C%B3%EB%25%8E%9FF%7F%DA%ACFE%C3A%DC%B7%3F%0A%02%7C%A8K%FA%1D%DD%3C%E6%B0%F0%05%AB%B5%97%3E%20%1A%A6%E0%D7%2B%1B%CD%1D4D%E5%B8%D1%1F%DBz%CD%9A%23%D1%06%8B%0F%E9~%FF%B4J%7C%00%9CHqH%07%5B%EC%9D%14I%3A%0Er%D80F%3Ai%0E%7F%FD%FC%D8a%E9%95%D4x%AD%DA%BA%14%93%F8%24%0D%05%F9%FB%02%DE%D2%AB%F1%2C%3C%B77%9E%B3Af%B8p%90%A3%D7y%1E%9Fg%D1%EC%07k%5C%FC%F0%A9%D7)%24%DC%C5%85%1C%C7%06%D5%A4F%08X%CE%DCO%EE%D1%A4ceUo%F1%B2h%C5B%DCcn%CB.%032%05%1At%E9%5E%DA%C6%F3%B2%A8%B3B%1C%0A%1E%94%F9%86e%91%16%AD%93%DD%20a%DA%F8%15%12%AF%E0%FF%A3%02%EB%A6%22R%0A%9D%E3%CF%89%CA%81%14s%CE%C7%C86%0FVD%1F%CF(%84%D7%C6'%B0%17%D9%E6z%A4r%05HA~%1Bo%3E%EBX%15%2BK%E2%0D%9E%E7h%A5%9BgNa%A5%0DB%7C%B2uq~%2B%85%B4%F1%DB%F8%04F%C7%C4w%A9%5D%B7C%BA%F8m%FC%E5%20%1A%02%BE%E7O%2C%8D%B7%BC%0C%90%7B%88%FFZy%03%CF%80y%03%AB%2B%B48K%60%FCV%60%3A%12XM-%CC-%B3%40%C8%8F%D2%0D%D9%A2%C9%7Dz%9C%A5%E5rm%BA!%B4%EC%FB%AA%B7%C5%1Ew%2C%89%BC%9B~%C8%D4%0D%3Bc%8F%23%A5%DE%40%DA!%92%1A%7F%DC%7D(%C7%84d%A58w%11%2F%B3%A1%8F%95%17%24%13%92%DE%D1%EFW%2C%90%9C%A0%B46%DD%90%7Cc%5E%BCAY%2C%97%A4%1B%02ak%BF%A9%E7%C0j%15%3B%8EOZd%8A%FCs%E48%3E%05%DD%92o!%DA%F8%145%C7%85%1D%C7%A7%A0QI%C5%8D%E3S%90r3%0A%C1%EC!K%5E%9E%99%15%14%92%A5%09%CA%9ED%F7%DCx%16%EC%2C%17%F8%11%82Ef%9FUi%A8%07%3A%8EOz%E8%CC%11)%26O%D0%FE%DE%97((%C0%1B%09%26%0F%F1%C1%EF%00%5E%15%BB%FC%92B%CE%C2%9F~%2C%94%01%EER8~%8C%BF%E3%3E5%B5%F7W%97%B0%16%F88%09%F1%C5%04%9B%3A%8D%C4%D6%A9%9E%1A%D0%13f%90i%0B%12%2B%F2%A1%83%C1%84!%A1%F5%AC%3D%93%F1%F2%3E%FC%B7%89%03-%CB%9F(CY%B4%5B'%25%9C%FF%E5b%5E_L%E5%93%8B%80T%F4%D5%25%00%E990%0A%ED%BFw%0C%F9%EC%8D%E2%CF%16%DC%9E%1Dc%9C%0D%A7%1F%08%EF%F3%E3!%8F%C9%C5%05%83%C7%7D%0Eg%DD%3F%88n%BD%0C%9F%DC%3D%3F%E6%9F%0DU%CE%7D%16%94D%A6%A2%0B%0A%B7%04%E68A%24%B8b.%2C%7B%FF%3B%9E%EC%98%05fJ%D8%9C%87%CEnyNGS%F6l%82%19N%90%2B%E3%BB%5Cw%14%83%7Bz%DC%AE%7C%DA%DFp%7F%8B%7C%1ADS%40y%CA%09rA%8B%8Ev%DF%A6%99%BD%19%B7%073%5B%83%BC%F2%84%86%C2y%FB%9D%20%EE%2F%BEh~%85%E1y%DDz%A2%19%E0%D2%E6z%25%81%C5%A4%11%E7%2B%3AS%D9OK%7C%83%D5%EC)%04x%B1%B1%BD%D61%9D%5D%1Dw%18%9CK5%B4z%2F%B6Zs%1AA)%DAg%18%DC%2FsL%E8Ix%C8%F1%8B%24%EDG%DE%5B%EE%B1%EDS%AE%8D.%D4%0D%7FP%A2%A3!%2B%07%3B%B69%9C%DA7%40%BE%D6%5Bi%7DV%F3%87%5BA%DA%10h%85k%85%8C%00%0Ek%E8%B1%D2a%89%15R%F6%0C%13%FCp%5B%C1%0E%F39%FFC%82%0D%88%80%AF%C3%FD%1B_%F5Z%E6%C3%146%83%00%00%00%19fcTl%00%00%00%12%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%13%80%80%DB%00%00%09~fdAt%00%00%00%13x%9C%ED%9C%7Fl%13%E7%19%C7%9F%24%17%FBl%BF%3E%93%852%AA%04%C8%986h%C5fh%23F%5BJ%9C%C4PF%19A%5B%B61%86%16WC%A8%D3h%13%A4l%AB%04%5D%5C%02%AD%C9%10%89(%7F%A0%0E%81%5BZ%A9R%D7%25%AD%26TU%A3%9C%13%08t%F3r%01%FA%C7%26*%E5%08%23%AB%26%A4%C4%24)-%24%BB%BD%8E%A1%F1%FD%F2%3Dw%E7%8B%D4-_%C9I%FC%DC%F3%DE%E7%EE%DE%F7%DE%E7%7D%9F%7B%2F%00J%05T%16%80%11%0D%9B-9%01%91%94%1A%C58%99%93%CDC%9C%D5%AC%FE%0F%F4%F7%B8%F3%0C%AE%ECG%CEC%BC%9B%0B%9D%87%B0q%AF%F3%10%17%3F%03%90b%DEe%A78%89%89%08%2F%96%B7U'%FE%AAr%84%97%E7%F9%D7%EC%40%5C%3B%ABE%C4%A1%94%AE%B6%03%E9%85%C2.%84%5B%7D%C4%0Ed%2B0Q%84%DB%FC%10~%977%FA%95%96r%60%3A%8C%CB%91%F0r4%C3%5D%BFLa%E1%26%A1%40%05V%CB%D3%8C%1F%86%5C%86%17D%B9%85%8C%C0%EB%88%82%C5G%F0%90W%C0%BDYa*%23%98%26%5C%94%C0C%0E%A6%8F%5C%A6%E1%96%D18%A2%60%40%A8%40%22Hr'x%2B%FCI1%CB%D6%3E%86%A8%11%0A%09lDB%F6%EE%BF%05%EF%CE%AD%92%F8%2C%5B%B0%16U40%80%84pk%12%3F%D82Wn%F3I%02%EEL%84%9D8%88%E7%F8%A3%DCQ%C5%3D%E1%92%8A%E2(%C8%E0A%1C%C4%5B%DB%A4%B2%15J%8C%B2%B9iC%DC%BF%C0A%B8R%B5m8%F8%C9%1CL%D9b%EFz%1C%04%5E%7D%5Ee%12v%1D%9CD%95umEB%12%C1G%94%A63m%0B%CAPeY%F5%A5%D6V7%E1%95%A6%F6%BE%D5%CF%A1%CA%BAPW5%ED%B8'%A9%82%F0uaTY%E6%0E%12%02%8D%D2(%2F%B7%9C%E0%13%25%EA%9A%D2P%D1%A7X%C8%8D7R%13r%8B%C0%93%FB%EBxMg*%DFt%DF%19x%18%0B%A1%01e%5C%FE%DDO%DB%DC7u%BD%D9%87%C4%2F%20%9Dx%88%FFkq%A5)q%5B%D7%DB%B5%23r%EFO%A1%0A%0F%19%DA%BA%40%89-%7DU%C7%B7%7D%F4pr%9E%94%E9%87%FCu%F7%A3%19%E7J%F8%7D%0A%D3%D5%09%BD~x%99%B7%AE%FFaq%9B%98%FE%5B%90D%2C%83%95%9E%81%A2%A8%DC%D6%D0%A6w%B9%26%A0%FB%81%DB%F0n%FATH%C9%09%2C%03Z%9E%A1%FE%F2h%EB%19m%D4%1B%87L%C0%BE%A1%C5%C0%A6%0F%EA%E2m%01%CB%F0N%1D%B3%7C%DC%C0%A4R%A2.%E4%25%B2%82w%A5%CF%E4%CCr4%84%99%3A%09!v%3C%CBF%82%BA%8D%EB%BBd%15W%D9%D1%B9%9B%1E%84%2F*%7C%0F%09%F1%06%D3%B1%83%0D%1F%CA6%5E%D4%EB%94%C8%CD%A0%24%95%3CQvj%EE%01%9E~%3B%A4%CE%CD%7C%A6QJ%2F33%A6%0D%F1%18%26p%CC%A4%A2%B4%7C%E9i%97T%F5o%D3)%917%08%FBt%5DnD%3E%20%9Ep%8B%F3%10%08(%EF%3F'*%5E%F8h%062w%3Fwd%A"> +<!-- FIXME: alt=" " is a workaround for bug 1505657 --> +<img id="i" alt=" " src="data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%C8%00%00%00%C8%04%03%00%00%00_v%B3%AD%00%00%000PLTE%9D%0B%08%1F%20%1E231%3F%40%3EOQNefdnpm%7F%81~%97%99%96%9F%A1%9E%AE%B0%AD%CC%CE%CB%DE%E0%DD%FE%FF%FC%00%01%00%0F%11%0Di%C4%2B%A9%00%00%00%01tRNS%00%40%E6%D8%0f%00%00%00%01bKGD%00%88%05%1DH%00%00%00%10acTl%00%00%00%0B%00%00%00%00_v%B3%ADi%C4%2B%A9%0D%7Biv%00%00%09RIDATx%9C%ED%9C%7Dl%1Bg%1D%C7%7F%8E%ED8%CE%F9r%99x%1B*k3%95n%7Ft%0D%A1%A1%A4UI%14Q%10%8C%0D%16%A6%F1%07bJ%B32%40%1A%D2%9A%B5%EB%3A%A8%D6%1A1i%7FtL%E9%10%FFP%91%1A%A11%ED%0F2%B7i%95i%DE%1C%0B%26U%02%AD%98l%EAx%99%8A%9Bvi%DAd%97g%0C%8DVE9%9E%B7%7B%B3%EF.%CFs%F6y%DA%C8%CF9%FB%9E%97%BB%CF%3Do%DF%E7wO%7C%06%A8%B6%0E%C7%FEO%BF%C0%3E%2B5%B9%EA4'%A4%D8%D3%18%88%5Em%B3%8E%C4%EE%9CO%269%0B%BC%80%D6%A5%7C%9DE%10%B0%89%BD%D1CR%FF%8AG%0Fi%D1%9BP%12(%9Ch%02%04%3A%1A%04%09%3CM%B1!%90'%E0p%D0y%8A%8D%60(w%C0%9B%D7%03%D2%CF%EC%2F%D5%0FI%E2b%7C%2B%20%3D%B1%3CR%3F%24%8E%B7%23%F5%9FfeHC%EA%3D%C8%12%B8%BA~%135%24%DD%03%E5%AFF%0DQ7%C0rO%E8%A3%DBG%C5%F2%BD%0Ec%A1%19%B0%7B%BBX%BEc0%18%9A%A1%5C%FF%7DI%24_r%00%A4j%EB~%A7%3C%A4%86~%FB5%91%83~%B2S%0A2%F3%C0%0F%1D%A1D%EE%D5%1D%02%07)%0B%EB%E1%AA%04%E4qx%C5%11Jf%D5%B7%04%0E%8A%0D-%C0%F4%9D%E2%90%EDp%0EZ%07%CDP%BA%A7mA%E0%A0%F1%3Fu%822%F0ia%C8%1Dp(%F3%99%9C%19%CA%CC%1D%12%E9%C3%3B%D2r%83%E4%E7Ss%CFo%B4B%F1%E1%1F%8B%1Ct)5%24%C3P%EF%D37%5C%B3%83%FB%9E%12%99%D2%94%2B)%C11%CB%2Cq%B1w%5B%D9%0E%F6%AC%13%19%C8%CA%A2%24d%D1%19j%BFsN%A4%1E%14%24%07%99%D0%9D%C3%24%F9%E8%8D%5D%02%07%A9y%0C)%BC%2C%CAP%8D%D3%CB%B7%DB%CD%10%7Bv%7BE%E8%B8%D4w%40_%1A%14%84%A4%16%E0%AFw%CD%DEk%06%3B%A6%FAE%86%09%40%9B%0E%1BAPK!F%DAy*k%06%8BS%5D%97%C4%0E%9C%04%ED%85M%82%90Iw%B08U%E9%15%3C%12%E2%FF.%AF%9C%89%DA%14%C0%1F%0F8%20%85%C5%DD%A2%90%E7%07Es%9E%84_%9F%DF%60%07%CF%E4%173%A2%87%BE%2B%DC%8B%13%BB%B6%E6%1DU%D6%D2%BF%BE%E4%97%F5%25%D5%99t%02%DE%10%86%A8%FB%B6%FCj%AF3b%E6%B2O%CEV%FD%9B%D9%87%0Ffy%E8%95K%10%CF%89B%C4%ED%E0%93kwe%E3%5C%0F%D2%E7%F3pN%B4%DD%25l%1E%BAg!1%C2%02%1D%FD%00%BFh%3C%03%DEV%DE%99-'x%3B%A4%AE%00%049%F5am%B1u%EF%DA%B1%E9%2C%0F%3D%9E%86%91%08%20%0B%DAk%5B%F4Y%AB%1D%C6%23%40%00%7C%F9%A1%13%07%E6%BB%CCP%E6%3F%91%40%5E%D7%F5%BE%CB%D6%B8Mv%06%DF3%86%B4%17t%5D_%3A%96%E5!%AD%0F%A4fyA%D37%8D%8F%8E%FFm%9E7J%FB%8E%DA%B5%99J%FD%90K%AFI%2C%E0%84%86t%E0%B9%1D%94R%24'7%EDZ%C7%CAy%EA%B7%F7%05%12E%C3C%BC%09%0D%BFj%AB%B6j%0D4%03Id%C6y5y%84%06%12%0C%24%93%B9%E9%10%8DT%17%02%03%0C%03%13I%5D%E0%18%12%89%0C%92%8Ew4%BE%917D3%19%B2%10zq%F8%94%1A%D28%84%9D%1C%0C%8D7%80%C1_%F4ZH6%E9%E2%D8%10%00%C4%20%C8%8C%E7%10D%03l%8Ff%0C%09%D1%B4*%08%AE%3B%D6%00%B8%9A%0C%C3%A0%9B%05%09Y%5D%1A%3D%BD%0D%D1%CC%92%D8E%05%1B%02%B2e%E1%10%DC%9E%B4U%C85%1A%24%D6%B0!%3C%CE%0D%91%C2%F0%1AF%B4%86p%BB%02%EF%5Df%9B%D0%9Ee%D0%8D%D4%1D%85%90%FD0%7DY%F6%98%10%C3%1E%B4p%83L%C0J%F6%AElw%11%B7f%FC%1B%EB%FD5%EFF%8D%AC%D5%82%20!%D4%25Z%88F%86%BA%C1%86%B2%C6D_%A3C%90%C9%B2)%F9d%18%D2%D1jP9%23%8A%AF%89O%A9%9A%25!H%B3%F4%98%08%3BW%19%A6%F1Ts%90%C6%B5%07%D84%20U%12%AE%E5%F4hS%CB5%06A%A6%B6%819%178%B4KfJ5%5C%10*%FAD%D8%11BL%E5%5D%10%83H%3F%92%87%A0*%88y%F1%A4%FAL%95w%96%C2%9A%D0%24%20%06%B2%9B%00%98%E8%5B%CD%C0%E7%5C%ABMX%B3%85%80h%5C%CF%11%BFLD%3D%056%BF%D0%1D%C4.%C5%EC%5Df_%94r%D8%C2%88%B6%B4E'%C0%B6E7%93%ACZc%8Du%5B%AA%87d%DC%D0%DE%1B%19%04%8F%15%EE%86%D7%D7%3FL%99%A7%E2M%AFY%A3%0A%C5%05%07%19a%9C%DF*%E3%9Aj%EB%06%D1s%AEW4%1E5%10%E2%D6r%13B%D5%98%EExs%F4%0Bb%14%03%F9%40%0C%26%C7%B8%26%03%D4Pt%BDK%F3%830q%C4%82%D8%18%88%E6~%01%9FGp%83%B0%3B%3D%FF%DE%25%061e%DE%D9%BB%D8%9D%22%A2%FD%8BBxl%1D%25%E1%C5%09%25%FA%A2%0D_%17D%CE%9A%02%F9%F0Xuu!%9F%FDp%0A%A3yA%D0%07%15%C2%E4%9Dm%40%BD-%B2P%C3g*%EEq%D9%DE%BF%E1%9C%14%C4%98%1Au%0F%C1!%F4%60.%D4P%7F%D1%99%60y%9An%87R%0C%E2%12G%C7B%0D_%C1%B1%12%98%B3_%E5%E0%87%80%B0%5B%1E%06%A1%F3%A3%E5%CB%23%B6%8Ac%03%88%C7%1A%16%82%1C%25%01%2B%91O%C6U%A5%90%818d%9EM%81%F6%8D%17XUop%1F%DF%D9%1E%C2%10%C3p%F6.v%1C%5D%A8%01%E6N%B0%DE%85%98%F7o%B8z%97puy%94%ACA%99%02L%C8%8B%AB%13%22%D6%F3%FF%7F'%05%E9%95%D1P%90%95%D3%EB%BF%17k%0A%C4%1C%8B%88%DF%C2k%C4%8F%A7%1B%5B%BC1%EF%B1%EB2%8D%2B%3DX%8B%CE%86%F5%0Av%1E%E5%20%96%04%3A%97s%EC%AD%B1%10%B3%BA%22%858%A7%26'%A4~%B3%17%CA%18%C4p%BD%04%20g%F5%AF%0B%40%2C%97%9D%2F%D6%BBz%17h%2B%F5%AE%BDpJ%A40Uf%FF'C%C8%AEC%98%C7J%24!%15h%ED%8C%1Cr%13%B4W%E4!%92%F6%BDr%BC'r%C8%99O%0C%0FE%0Ei%BF%B0%24%F2%DD%EB%FALYX%FC%C6H%E4%90%8BC%13b_%5D%0Dk*%FE%5B%CA%17%A3%AD%AF%C4%85%3C%5C%80%89%EEH%FF%A9%14%FF%E5%BB%E5%05%18%9E%0C1%1C%C5-14%BD%06%D4ee%3EJH%1A)7%40%EB%5B%B03J%88%BA%003%A3%E3%A3P%1C%8B%12%F2N%EF%E6%F7.%03%B4t%F1%88(%BEzu%9F%CCC%93am%DDp%B9%3DGv%A2%AC%AEO6%E3%EBpG%9A%019S%FD%80Y%14%0D%1F%FBn%13%1A%3E%CC%F4.m%99%2BM%80%C0%96f%40%8A%A5%26%40%E2%D1%3B%11%003%A2%0Fi%D4c%0F5%81%01%DB%9A%01%F9%F0%7Fcd%D5%3E%80%F6%CC%A9%B1%18%D0_%7B%88n%DESo%82%DBN%12H%E1eYH%06r%829%D3%230%F5m%FCyq%FD%E6%A7%24!%007%0B%8E%CEd%0E%E2X%F6T%3C%1F%3D(%0D%99%F8%AFX%3E%7C%5B%FEg%7C%3D%A9%0A%C09I%D5%98%06%5DP%95%139%20%B5%15%C7%90%8EQ9%C8fxR0gzP!%EEA%82%40%B2r%90%BE%C0TW%B5%7Cq%80%04%DB%B0%E7%D9%91%93%83%7C%3F(Quy6%CA%F1%DE%DE%CF%1F(%DC%06p%7C%AE%2C%059%1E%94X%F5Tp%9C%BE%17%BF%B2%E7%ED%3F%C8%3C%5BM%0E%1C%018%FD%A8%F7%95%25%DD%0D%DCB%DF%D5%FD%3F%C2%D7%B6%D1%2B%BF%9F%A9%F0%B1%F2%D9%8F%3F%5C%EB%F1%3D%87%B7%98%BB%AB%C6%1D%FB%87e%20%00g%AF%DER%F6x%B6%ED%9F%25x%E3%A0%BB%80%F1%9AL%C2%A6%90%DF%A3%F8TMtr%0C%EE%D9%D5%D5(%C8%F4Q%F2%94q-%BBS%E9T%DD%0FE%86%5E%DC%CC%C0%1A%FCn%3F%F3n%DB%B6%B6Q%F8%9C%2B%26%B4%C2%B7%02i%F3X%B66e%FA%F4(%B8%1E%F6%0C_%5D1z%EF%E8%E5%1F%A7o%1D%82%FB%DD%90%B0%DE%D44%7D%FF%92W%D2%D3%F3%2F%5EsE%C4%7F%F7%C4c%A1%20%CF%90%B7%CC%7C%C1%23IY%BB4%E2%8AH%AD%EB%DB%E7u%8E%A9%FD%3F%0B%86%3CBO%A7%EB%9E5%D1%EF%0Ef%0Aw%7B%3E%F5%DAW%B8'%B0%22'u%D8%EA%2Fv%0FTG%A4%0Fz%9D%AD%07%5E%AA%04A%D6%FF%03%F6%F8OZ%8FTG%24%1E%2Cyd%EB%F7%1Ag%0E%23%BF%0F%B0%D57%F5%E9%EA%88%9D%7B%BC%B2%1D%3F%BC3%87%3FR~7%8Ad)%F2%07%BE%90bUM%26%E7o%F7%CA%96%B9%FB%3C%F98r%D2%A7e%F4%1C%A8%FE%0F%FE%9E%CB%B9%C3%C3%A3%DE%F7%E73K%25%DC%7B%E6%8E%FA%2Ci%DF2%00%9F%F5%BF%87%8C%8D%B4%3B%2F%EE%E4u%C5%F34jw%1F%1E%D1%A9%8Ft%FB%2C%D1%1E*%C3%A4%7F%EFJl%DA%B0%DBNM%CD%96%DA%3C%2Fh%E6%BD%03%B8%84'%F2%99%81%C7%DE%F4J%FF%CB%10(%83%BE%90%D4%F9%7CK%D6%0AM%AC%81%96%8F%96js%FD%DD8z%F5%C6%C2%A99%DC%86K%9E%3F%13%82%FB%5E%CD%02%8E%FD%B5)%E52hlYl%A0%26%97%94%E1%CEQuu%B6%A2%AB%CBc%C7XuU%7CK%CB%EC%D9%15%D2k%CC9ml%E7%8FQ%AF%04Y%C1%FE%07o%F8A%AA-%A1%E6%92%00%00%00%19fcTl%00%00%00%00%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%94'%03%1A%00%00%00%07tIME%07%D7%03%10%13'06*4%98%00%00%09%FAfdAt%00%00%00%01x%9C%ED%9C%7Fl%13%E7%19%C7%1F%9C%B3%7D%B1%CF%17%CARu%A0%8C%98%B6%ACe%A2%FC%A82Z%AD%40L%E3B%60%2Cf%1B%9DhG%87)%EA4%8D%AC%09P%B6I%9D%C6%A5%FCJiJ%A2%89J%FC%01%E5%A0%D34ihN%A7%89U%FBc9%13%83%C2f%E2%AC%B4%1A%D3%D8r%10RX%D7.8%09%E4%97%C3%ED%CE%B1%E3_w%E7%E7%3D%E7%22M%CAW%89%7D%EF%FB%3E%EF%FBy%7D%AF%EF%7D%DF%7B%EE%7D%0D%90%AD%92%B4%E3c%DF%98x%BF%93cU%A0%D2!%11%CF%D4%40%A4l%0D%A4%25V%B6j%18%91I%B7%02%F6%A8P%E0G%40%A8%ED%80%F9%10%FA%0B%94%F9%90%22i%1A%3E%09%84%DB%A7%01%02%25S%04%D1-%262%25%90%E3pB%AF%9C%C8T0%98%AD%F0y%99NzwcW%E1%10%9B%00%F0%7D%9Dtky%7D%E1%10J%FE%3FSx1%F9!Sr%DE%F5d%15%00~o6%C4%E1%01%F1%05%B3!%EC%0A(%F7%18%CE%ED%E4pv%BD%C0%1Bf%C0%AE%8D8%BB%D3%B0%C90%83)%BB%82%BA%8Al%3E%F0%90%94%BBWH%0B%D0%FE%3F%7C%17%93%E9%17%DB%89%20%3D%AF%FF%2C-dm%FD%D7fD%26%26V%01s%09%20%EF%C0%C7i!%5B%0B%7B%0F%91%C9%E2%8FA%F0%25%3Cd%23%F4%81%7D%B2%11%1D%9E%E2%18%22S%E0%9A%1B%18%DFW%D1%90%AD%D0%E0Z%DE%9A%0C%B9%86%1A8D%A6%CD%F2%C5H%A2_v%0C%BD%BFr2D%D5%BD%85%C94L%FBI%18%ECni%C5%BCT%F0%D0)%01%91%89%19%A39%12%88%F5%AEw%83%98%0Az%16%F0%18%C88!d%3C%3D%E4%7Ci%C8%8F%81%CC%26%83%B4I%E9%97%89%ED%CDE%CB%10%99XA%86%84%3B%B1%0C%F6%81%AB%E5%2F%0A%93A%CB%07%1Bq%F3p%BA%16%A4(%B6%F7%A2c%F0%EFo%0E%FC(%19%2C%E9%A8%C1%5C%26%00%C5%12%AC%04d_%0A%16%5E~%E9hI%06%23%1D%CB%86q%19C0%EB%D2j%24%24%94%19%8Ct%DC%F1%22s%02%F5%A0%88%B4%EC%00%F8GS%1A%24%3C%BE%0B%0By%1F%3D%A0%5C%80%DF%F5%AFH%05%BB%85q%176k)%87%B5%B4%EEY%2F%A4%9D%B2%A2%9A%0A%CD1%EB2%9B%9E%D4%0E%B7%D1%10%F6%D0%DA%DF%1EH%8F%E8%19%D5%B0%B4K%2F%B7%1ClN~E%3E%1E%06%AAU%C3RE%CC%B6%91%8Cp%1D%AFn%D7%7Cr%E9%9E%16%CA%3F%11p%F4%0B%D0'%E2!%CA%A5%92%AEnN%D5%8A%1D%81%CA%01%B0%26f%B8%255%00%BF%22%60%00%9Dy%8D%2FW%3F%0B%CC%7Df%CE%80hM%D4%80%1E%03%D0%9B%D4%E7%C86%3B%3D%E4%A8%10%D4!%E3%F6%03K%F9%60%B2M%DEq%00%D1%B4%3D%E8I%0FY%02%EA%1066%EB%E6Zi%40L%86%03%24%08%B0%0FnI%2F%B6M%EBF%EC%3Bo%B47%8DLv%D1%AE%2F%12A%EA%3C%19%C1%DDZ7%04%BD%92T%3D%3Ay%DD%DA%DC%FA%F7%8C%99r%0C%8B%19a%AF%16%E4%92%24I%D1%D3%C96%99U%0D~%3C%C4%16%F5fT%E9%91%C8QU%BBbiu%80%0B%7C%3A%92%A8%92ss%AEoF%AD%FF%D6%F2%CCDU!%F4%F0%CD%7C%0E%9C%92%DC(%0DWT8%D4%A7%1A%EF%1C%96%CB%60%80%D1%99%8E%E3!%EA%B6%B2%E6i%C4O)D3%DETHA%0D%3F%A8%01%A1%08%3Cw3%9A%D1%8Cf4%A3%2C9%1B%09%26%C8%86!%DER%D1%7C%0A%04%B9i%80%D8%3D%D3%00%A1%DD%26%03%AE%5DZ%07%1F%1AwM%A2%C4%94zO%09%DB%04s!%96z%B0%BC%FA%A0%B9%0C%F9%D6%19l%D5%F3a%0A%9Ei%E8H%BE%E9%B0%97%B7%C2%9A%96%FC%A6%C6UR%0F%1F%0E%C9S-%A4%E3%C4%98%1C%83%87%97%0B%00%C3%CBE3)%17%7C%FDr%83%BC%10!%FF%16%B3%AF-F%DB%B6y%FD%F2%AD%B7%7D%24%AFa%B6%ECo%7F%0Bm%DB%F07%B9%FC%EB%FF%5Dpm3Y%E3%3B%7F%0D%01%1Ek%FC44%D7%82%7DYd%CD%A0%88'%1C%F0z%2Bc%40qHs%D7%7D%F9%AE%AF%C2%5B%E6(%F7%E3%190%B6M%AA%1D%03%3B%16R%2C%B7%F8%ED%A5%D1!%F8%8C%E4%82%F4%F5%BF%0D%83%C2u%01i%5E4%D1%12%01%A2%06q%CE%A9%07%B8W%8Ey%0C%11W%F7Dm%AC8_iB%96%A62%0E%C6%F0%F6%FB%26%DE%98%BB%24%90%12%08%B8a%1D%DE%FE%91%C4%7B%A5H%00)%E2%B7%FB%A1%01m%CE%0C%25%0E%EAH%A6%2C%CC%C2G%1F%96%AA%FCXs%F6d%E2%A0%99%23%80%C0%8D%C0%CE%F6W%7D%D5%24Y%14%B5%11A%E0e%A8%13%5CaRH%84%0C%F25%03%9D%1D)%84%99%7FZ0%1DB%BD%B5%CA%00C%07%C2%AE%C9%7DRq*%C4%1B%81%04j%B5R%EC%AD%B6%9C%B8%3A%A9T0%00i%93%BE%A4%91R%222%9Ff%C7%FD%FD%DD%E3%22%BE%EC%12%15G%0D%97i%12%01%B8%19%3F%A0Tl%F5%1C%3B)H%F2%80I%C5e%B9%A2%FA%00%0E%02%B3%CC%5C%7F%17%C5%7DR%E6%AC%AC7%17%C2H%2B%FE%D9%5C%ABS%D8T%40%AC%D1%CA%E8%CF%F5%0A%CB%0F%C9%DF%F0E%AB%98%CB%F1%03%C3%0D%8FP7%99%F7%DD%98%827%F13E%C3%0AA%F3%D7M%87%5C%01W%83%A9w%16%8A%A6aQ%A1%3C%C9%22%98%FB%18S%F8%CF%C30%CA%9B%CB%E8%ADx6%BA%F2%CENS%19%EC3%E0%DA10%FB%03S!%B4%3C%1B%BF%E1%F3%FF%D4D%82%DCc%08%F2%DBa%C1%DC%8BQY%E3I%BB%8B%3D%E6Bx%00%DB%9Dv%D1%5C%88%3C%F1%09%C5%B0%2B%1E%8CB%22%5B%F6%CF%8F%95%A2V%8F%19%87%B0%8DG%1Cf%3F%DCQ%C6%3C%B2u%3B3%90%19%C8%0C%E4%FF%19%12%EE4%1F%D2%5BQu%1C%01%B9%25%7D%AF%00%C83%00%BB%10%90%03p%B1%00%882%C6%23%20e%86g%80%891%9EB%40%EE%80%DDm%0C%02%133T%0A1%0F%5E%02N%E3%BB%95(%1E7%15%FE%B1Hy%8CC%9E%C0m%18%E9~%BC%CEo%1C%D2%BCe%FF%00%02%E2%1C%8C%A2%9D%9E%99%A2G%80%EAl%3C%829%5DLl%7C%9B%B1%1D%1F%3B%7B'%1A%1E%03%B9%EBo%23r%C7%26%E5%E4%E8%16%14%84%95%FF%A2B%C4%D0%F9%B2%8A%EC%12%14%C4%3A(%C0%20%B4U%E6%B3S%13%05%CC%7C%14%84%FAM%A9%18%83%BA%90%DB%00%C4%D6U%C4%E1%3E%89%3F%B8%18%D8r%C6%88S%92%AD%BC%87kx%C7l%E6a%B0%DF%83%ED%06%20%E0%9C%8F%83%B01%E8%E1%02%1CDx%03%90%9EE%13%90%1F46%EAC%E6x%AB%1E%1A%05(J.SD-%BDJ%E8%F4%93%22%0A%B2%3B%AB%C8%5C%0B%1D7%D2%B1%E7%9B%02%F5%F9O%17%B3%A0Nt%C6%1D%FD%BC%96%89%0E%24%D4.Uq%E1%CE%7C%90%E0W%0C9%D5%12%BA%02%9F%DC%DE%5BQu%2C%0Fd%EB%99B%20%96.%D7%C21%80%7Dy%20%7Cw%F6RO%92%86w%3E%06%ED%CA%18%9F%EF%C1%8A%E5%B5%7C%0D%AF%A7%F5%9B(%0E1%C6%170%BC%CB%3AW%AB%ACg%CE%3B%C6%BB%0A%F2%22Y%8E%2B%B3%C7%FC%E3%C9%DAB%20t5%8D%1A%E3%23%85%ACKp%C5h%1Ff%8CO.w7%24%FB%E3%F4Q%CC%18%DFS%88%CB%A2%3D%84k%937%0A%60%B8V%1D%C2A6%14%00%B1%09%1B%14%88%25o%B3%E6%AD%85%8E%FA%3AG%2Fr%08w%7FA%FAH%EE%22%FCfC%9C%7C%FC)%87%B9%10%BAe%1A%20v%C1l%08s%19%A8.%B3!%E7.%F2%160%19%C2.%81U%17%14H%B8%93%14%E2%02%EC%F2%01G%3Dt%FCP~%BF%5BQu%8A%10%02%F0%A4%80%B3%B3%B5%02%25w%7B%EC%D8%E4J%0D%02%B5i%3D%E0%CD%92%DCa%FDU%98%D8%15%D4%87%ACWRA%90%90%BD%B2%B5%15%94%B3E)%0D%CF%91A%AA%E0d~%A3%B8%1C%9B%18%B7%C2R%20%84%CF%B3%F4Wg%08%E9%81o%FB%94%601%2FC%08%97%C7%FED%2F%91u%A7%87%98%F3%5E%EF%BA%A6%F0*%80%F3C%22%11%E4%BC%5Eb%D6%AE%60*%FE%1A%D9%B2%FF%FEG%24%7B%AB%95%8C%F2%2C%FD%EA%9B%EA5%B3q%19%C1%A2%F8%2B%DBxD%AE%DBJ%15sM%B1%F0e%F1%D6c%07%DD9%09%7F%94%FF-BV%85R%3AA%02%01%B85%F7)Qeo%DB%F5.%B8%DD%2CjB%08%C5(%BFG%F1DN%B4%8D%87W%F6d%EE%EB-%00%12%3C%AB%EC2%CEe%BB%197%9B%B9)r%96Q%84%0B%94%E7l%A9%3D%EF)m(%E6%E0%B9%8C%18%C3%3D%BC%1D%DC%F2%ABE%E5%12%0E%5E%E5%20c%B3%A7%F1%D3e%89%DF%3B%AA%CD%8F%1DO%FBao%26D0%08%09%C6_%9FWKzo%E4%2F%F32%22%A8%3F%1DW%DF%2B%97O%E7%94%17%D7%88%DA%DA%2Ffi4%D3%2BF%2F%A8%3E%A4VFG%E3%BB%FA%90%C3%F1%E2%E2%8E%D8%5C%D5d%06%5D%E1%1D%AA%BB%5E%AB%C3%AF%A8fO*%24%C1z%B5%7C%13z%3D%3B%C2%D1%ACV%9A%07.%EBzg%2B%3E%83%FD%DA%83%D6%E1%EC%08%EB%3E%B5%A9v%8D%DAu%96%26%E5%F7%01%D6k%A6%BE%97%1D%B1%7D%BF%9A%D9%F9%13%DB%95%01%86%D6%BAQT%5C%91%DA%8F%D6%23bf%D86%F2%A2%9A%99kG%BF%F2v%E6%82%A0%5E%8C%D4%0A%AC%F6%C6%DF%BE%AC%11%B0%8Es%AB%DA%F5D%BB%945%9Ag%3D%EA%C5%3C%E5%83g%FD%9A%10K%BD3%BDr%17%CA%18%D5b%D8%CAj%5E%3E%5B%8FVj%B8h%1BD%08%89%9A%10%EB%EA%15%BBR%A9%F4%40W%B1j%85z%1Ejr%CB%B7%93%82%CBw%F4s%B5%F4%1B~%60%B4%17%9D%D3%FDBQ%AAWk%5B%0CE%0BU%BE%5D%FFy%E0%EC%DCE%E1%8BCr%1BFU%7F%26D%FE%EE%E9%2C%9BbFa%16%1F%3F%F2i%2C%B1BJ%FErd%D5.%D5%A3%B3%E5%FCi1~%94%EFQ%08%F1%0A%93%F4accb!W%81%BF%0E%F7%3FB%09%85%E9%1Cj%D9V%00%00%00%19fcTl%00%00%00%02%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%BAw%CA%9A%00%00%0A%13fdAt%00%00%00%03x%9C%ED%9Cml%14%C7%19%C7%1F%EE%D6%F7%BA%BBg%A5%14%C2K%B0!%B4%B4%89%83%1D%C5%16%B4%25p%0EN!%C1%C1(%15%C1m%1A%7C%A5m%40%0D%89%1D%88H%3E%B4b%C1%07v%89%5B%13%8A%E0K%80%B3jW%FD%80bS%C0%FD%12%D5k%03%09%A9%AE%9C%23%DA%A6%A9%D2%B0%60%14%91%C8*%18%1B%02%B6%F1v%F6%DE%7C%B7w%B3%FB%EC%9E%D7%AD*%FF%A5%BB%9D%9Byv%7F%BB%3B%3B%2F%CF%EC%CC%01%A8%E5K%86%5CB%22t%23%C3*G%A5%40%02%13%05%91%D5%1AL%26y%FDT%23c%D2%E2sc9%5E%00J%0FM%06%248%19%90%CB%22%17%7C%DAj%88%7Bqg%F8%98%D5%10x%F2%19%B8.Y%0D%E9%0B%8A%1B%ACf%00%F0%8B%16%5B%0F%81Z%D1z%06%7B%D3z%06%7CX%3BQG%E2%7F%22%D0RJ%7D%94%14%C3r%15%8FPR%F2%96G%26%0A%D2%FD%FE%5DJJm%E5)%AD%1D%CF%8Bx%C8%1F%A1%86b%7D%B0%E0%EB%1A%FBy%1E%5D%8B%874%C2%95u%94%24%F6%9B%1A%FB%F9%FA%9F3%02q%E6S%92%F8%7B%AA%88%FE%0BG%92%E1%AB%60%13%D1%90Np%15R%92%3C%25%AA%88%0D%DB%9B%85D%F8lJ%03%AD%AB%1E%F1%C4~J%12%A3N%A8%04G%B2%C1%BF%08N%DAm%CE%D4N%99z%E7%BB%25UD%1B%B0I%88%EDxw%08%CBp%0C%88%D4%B4%D5%19%C6K%EB%13g%CF5L_%85e%40%F3p%1D-%C9%3D%AA%8A%60W%0C%7C_%F2T%C6x%E5%F8%9B%C5%CD%CC%F7%D3%D2%9C%EA%8Bl%3F%B0)%E4)%0ED%C3%D3n%0Bh%88%7B%8B%9F%5E%A6%3EN%87%B0%A3%D7%8F%2F%5Cp4%F6%23%B2%10%0FaN%D5%ED%C3%DA%BA%96w%F5%F6'%B8%ED%15%06%20g%EB%DE%C3%DA%B2%C5%0B%C6%7Flz%CD%00%A4%CD%3FM%C2Sf%25%C3%8F%06%03h%88%AB%2C%3F%2F%84%B6~*%19%E2%E5%06%3Fz7%A8%1A%C9%A8%3C%E8%AAL%86X%B9%9AV%E3)%A9K%1B%D2%BA%20%9F%17%ACy%00%0D!%0Fb%7F%2C%E4%1E%A8T%D7%9E)%3A%D3%0Bei%11%C7B%7B%D1%90J%F8%2C%EE%090O.%1E%A6%DB%FD%0E%60wZ%84k%EEU4d%87%EB%AB%BB%E2%90g%EE%D0%CF%ED%DC%80%04%DB%D3%A3%9E%08%A1!%EE%07%3F%8D7%96%CE%B1M%7F%A1Z%C9%F3E%A7%AAJ%DA6%D4%8B%858%03%8Ex%06%F2G%18%EA%ED%3A%F6m%9B%3C%24%A6%C7%ED93%17%0B%E1%FD%5D%1D%890'%0B%D9%8D%B8%19%A0%BE%0E%C5%D9%D9%84%85%C0%E1%94%EA%FDG%94%A7%D2%B1%18%BCC%EA%C8%0Dp%85rN%99%B2%0D%04%92%E1%AE%17)6%A4%ED(8%9E%1E%C7%CF%06%8FF%B9J%97%E7%FE_%25%F7%7B%EC%20%05%12%20%F5%8F%9C%9E%CF%EEy%00%F8%E2X%94%0C1sfRN%E4fQ%D5%80%AA%AB%DE-%00%FC%0C%0D%19%2F%1C%5D%7B2r7%AE6%F9%8D%DA4%EF%9D%ED%1C%94%94%BE%17V%E3%BD%E3%9A.%3F%CD%E8%87'%E4gS%7F%17%CB%1B%C1%08%C4%96%7C%84%CB%BBB4%23%AF%BC%7BSG%CAo%B9I%F9%DE%FB%5BjoB%A5%BC%ADR%3C4%BDV%A2%19%D9n%AE%9A%99%DA%CD%A8%8A%9E%CE%EE%E7%91%0Cp%25%8A%20%2F%D3%FBR%5C%D5%CC%3B)%05%3Cc%B4%E5N%96%7Dh%233%19%25..Fo%00'%9BoE%1B%8A%A2%F9a%BA%FE%D9%14D%2B%FE%BF%93%F1S%9A%D2%94%A64%A5)%E5%AA%9E%8Awr%D9%9Do%C2X5%3F1(%E6%00%E9%3B%89%F1%D8%FA%E1%04%BE%7B%9F%A9%8D%9C%88%B2%F3%DEV%BE%3D!3%0C%B2%D7K8%CB*%E5%CBv%DB%0C%24O%84%3D8%CBf%91%7C%F9%0AD%13%10F%C4%BDj%F3%1E%8D%08dc%0B%FAM%40%1C%FBa3%C2%8C%DD%5E%DE%A3%F4%F8%99%26%9A%0F%A5%A1%FE%F3%0Fx%E7!%ECZ%BF%F8%F8%2B~P%DE%FAj%8D%D1g%D7%DF%0Bd%0D_%22EkH%C6%2B%10%B6%B0E2%C8p%DD%16%23%EB%2F%60%2C_!%19%AF%40%A0%E8r%C8%20%E4-%11J%BBQ%96%D7D%A8%89%BAu%87%9C%85%06!_%03%CF(%D3%A1oG%BC%B0%C7V%16oU%02%7D%DCp%D8%18%E4%1B%60%F7%BBq%A3%D1l%B8%BFf%E6%F1p%B8%FD%E5bT%26%8E%AB6t)%C4j%0C%E5%A5%C9%FB%CE%01%D2%D9%9F~h%FA%CB%86%18%E0%1Ai%97%E0~%AC%B1%00%5C%98%DC*%03%2Fyb%FA%D7%1E%F5%88%A0%06%24~_%0D%3F%5Ep0%0C%97E%24%C4%1F%DB%BA%D1%E3F%09%D9%E5%3A%2F%EA%F1%22%F5u%DC%3F%E4%D1%83y%09%B1%B4%81%BC%2C%A6%89%D9%17o%18%85%40%15%F2%3AHQIT%8D%7F5%0C%89%88h%D3%C4%10%A9%DD0%E4z%00m%9Axv%1D%A2QH%3B~%9E%CB%B1x%8F%C3m%18%B2%9E%F6%9E%3AS%97%84%D8%96%0D%19dp%23%F8%F9%14v%7F%1C%22%18%840%25%BFA%DB%26*y%EEM%D1%18%E4-%F1%92%84%B5u%C5K%23%2B%DF4Fi%BEyr%8B%80%B4%F5e%19%A8%A1%ED%CBd%B1%D5%1A%D8%19%87d%89C%0EEqB%F6%F8%09%85%E8%C6%FFoB%3E%C9%09%82%CBxvh%E3%2F~y%D6l%C6%23E%1A%C1%D2%83%E2%04%1D%8C%A6%C3%00%AB%B5%A6%82L%88%D6%00_%80%1D%DE7%A8q%9F%B0%12v%15i%18%E6%A2E%C9P%B0%FCK%C9%22%C8%C5%C7%13!%FB%BB%E8w%93%86%F5j(%1C%F3%0F%AA-C%90%E2q_%E9Je%C2%8C%13%FFv%DD%B8%F8%EF%00%EC%00C%3D%13%E3Rz%B1W%08%60%A9%85%8C%E8%3C(%D2'%7F%BF%D0J%88%2F%06%A9Aw%16MAB%A4G%16%80z%AB%0Ab%0CB%0AJ%E4.T%A3%A7%BA%98%82D%AA%EB%07%E7%FFi%EE%DF%2C%85%F0%8D%FB%98%0F%A6%E7%7F%D7R%08(%035%C1%86%5C%86%C5%90%10h%11%AD%87x%F0%5Dk%B3%10%1F%1C%0BM%02%A4%FC%05%EB!V%BF%3A%F4%01%A2W5%05%89%8A%25%99!N%C2%950b%F8%82%F5%90%D3%A5%2B%AD%5D%99%C0%EF%07f%0E%C0N%84)%5B%F1s%93%903%3F%00%86%B4%F1%D7E%7DS%DB%DB%A7i%D3%83u%B4%CC!2%02%C9xA%DF%D4%0Ep%D4%14%C3%13%80%E5y%0A%04q%8E%8C2%B5%D8%8CH%07%A2RYV%A5t%26%F4d3%FB%A4%BB%05X%ECz%24u%CA%92%C6%09%05%E0%B2)%08%B7%CE%1DpUU%D7cjGn%A8%A1L%DF*%9B%DA%07E%D7%AF%1B%F7a%EE%03%FB%D4%AEW%CDu%FB%D9%92%E8R7%14%24%FF%E4%B5%80)%88c%1D%0E%C2%92%CF%EC%22%97%89w0D%BE%19%BD(%88o%19%40M%C8%85%9F%F7%98%AA%C8%BE%19%9D%18%88%A3%ED%15%E8%07%FB%7B%82%19%C8%89u_%EC%F5%23%20%5C%E19%11%A0%95%C3%BE%1FHS%F0%E1%5E%16%03%81%87%A0%09%F8G%E053%90%86%ABC%2BQ%90Vpu8%04%E8%0B%99%804%C2'%1F%A0%20%B6%8A%8A%BB%07%C9S%96%98a%9D1%F8%92m%EAU%12%02%A8%DB%E5%5D%A17%F5J%E3%10-%15GQ%90%96.%3D%0B%8DCpKO%B1~D%1B%AF_%F1h%1987%B3e%886%BE)'%08lfG%10m%7C%C6%95%18%C9x%D2%00%2B%AB%87t%DB%F8%CE%9C%E6%DC9%C6%98%1B%B1%D1%60M3%BBd%EC%B0%E9%3A%EC%CF%BB%91e5%92Z%1E%FC%12%9BLyWu%B8oD%DD9%1Dm%C9%012%ED%7Be%9F%DE%C3%0C%DE8rXc%1B%CDO%E2%C7%EBB%E0u%F3%10Ec%C4%8F%D7%87%20g%7D%D0%84%CA%130%B0%3C%D0%3C%24%C7%B5%EE8H%8E%FA%3F%81%FC%3B%0A%B1Y7%22%AC%E8%CD(%C4b%9F%F1%5B%93%00%E1G'%01%E2%19%B3%1A%D2%2FA%5E%80%40%AC%F4%E3%F9%D5%0D%81K%E4%B1%BAe%A5%1F%EF%0Ap%A3%7B%09%0B%D3%C6%9B%16%23%40%E7%9C%D8%9Ba%8C%1Fo%1A%D2UH67p~%BC9%11'%BE%8A%1C%5Ci%E31~%BCI%AD%DF%A3%BC%A2t%87H%2B%2CZ%06ak%95%01g%FEqe%0D%B6u%90%19%D1M%A4%BA%1E3%7B%CF%A4%5C%3B%25e%C37%D6%5B%F4%0ESQ%DE%B9x~s%86g%19%E1e%FFga%3Ct%40%B2%0C%E2%E3%17%86b!%C6%EC%FDbu%E7%F1%9D%81%CF%0Bb%5D~S%F7%8B%0F%AE%BE%D0%B2b%96%8E%D5ir%26%8D%B1l9%60%02%C2%AC%09W%2F%E3%C7%FF%8B%20%BBRV%D7%B1%26%20%1F%91%82%BC%1F%D8y%E75%AD~j%E2%C8%E3%F2%06%08%84%E4%E5%8Fgk%9Au%97Vl%A5%24%B1%CF5J%DA%0CNY3%A9L%82%FB%87%A8m%F8%FB%BD2%C5%82%11%CF%0A%DA%FB%06%E5%00%F9V%5D%05%1F%7DJ%C3%AA%0E%D6%12%CA%B3%CB%80%23%A4%C9%E0f%0D%2F!%9B%F5%E9%B1%D1%09%A0%7D%AF%2B%CBo%9Db%D2t%99%3F%FB1%CE%C2%87%92%5B%0B%E2%DEV%12%E9%CD%F8%9F%23%5E%A9%04%9F%87V!%15%D2%F6g%8A%2F%D8%DA%F84%D4j%BD%0Dv%15%EFW%C6y%D5S%7DOJJ%EFG%19%E4%88%24%EE%D9g%82C%C8~%0C%F6V%80%1F.%D4%80xeI%81%A8%C7z%1Dk%A3%5D%AC%7C%F0%26%96%DD%B2E%F4%D6jt%98-%D1r%13%F9%5B%B0M%CA%D2a%7BV%84%22%F0%D6As%3C%B3%D9r%11.R%8E%C1%8D%95%E7%F5%EE%3ABIU%0CdY%99%A9%3FM%1D%EF%98%05%AD%E2%D5%DE%EEe%F1%DF-%95%00%B4%D2%EA%2Ci%DE%E1%91_%5C%24%D2%20%EC%BDp%0F%D90%19%15%E4%1F%1E%F6%CA%95m%C9%3F%AE%F9%92%7C%0EQjQ%7B%5D%E4%CE%EE3%FE%8F%EE%7B%A9%2F%FB%A3%E1%C9%07%3B%C9Zf0%23%E5%F4%92%F9%F2-)%F1k%C1%0B%00%ED%94%D1%8E%EB%1D%EE%81%8D%CE%DBp%AD%802%5DZc%DA%14%BB%B61%BEO%15e%8A%15R%D0%23%A8%A8%E3%8F%80%3BY%C0u%9CYR%2B%BF%ABm%A1%96%05%7FA%F7%1F%B0%1AU%A1%96%23%FD%A5%00%00%00%19fcTl%00%00%00%04%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%C8%86%90%1A%00%00%09%E3fdAt%00%00%00%05x%9C%ED%9C%7Fp%14g%19%C7%1F%92%FB%B1w%D9%DDcFPD0A%98%14%0A6%94FE%25%E4%0C%A9M-m%C8%B4NQ%DBr%AD%ADSmf%8E%AA0%C5q%9A%85%80%0D%90%9A%40%DB%992%83f%83%0C%A3%D3%D6%04A%FD%07%CDB%00%83%9E%5CZ%CB%F4%C7%3F%D9%90d%AC%8ECBr%F9E%92%AE%EF%DEBH%B2%EF%BE%EF%BB%BB%B7%94*%DF%3F.w%CF%FB%EC~v%EF%7D%EF%FD%F1%BC%CF%06%60%A6%22%26%0B%40%1F%C6%E6J%5E%40%B4%99%1A%60q%B2'%E2%05%F0%AA%CB%3B%20%EBo%06%E4%01O!%87%14%9Dq%E0%88%A7%10~%A9%0A%F0%2F%E8%F4%14%02%3D%CB%01%9E%C7%B6%B4Lj%DF%A3%B0%19z%3D%86%88%8FK%2Ba%8B%C7%10%10v.%7Da-%40B%C9%E09%FFn6%BD%D0%A6%FF%926d%8E!%2C%92M%B6Jt%1F%89%F6%CC1%20%10%BEb%B2%AD%CF%E0%F9%D3j%83%0Au%A6-%E3%7Do-t4%7B%0E%89B%B6d%1B%F2j%BD%5D%88%CF%04%B9%DF%C2%F7%F8%DDj%FAo%F6%D2%9F%D8%83%3C%02%B3%E4%99%B6%EF%AB9%B9cfW~%E4%9C%E1%FA%0A%F0%F6%20%07%60%9F%3A%D3%D6%94%DAu%E2%5BfWn3%ACL%BFy%14%7C%8A-%C8%C5%C4Z%93M%DC%B1%B8%CCl%05%BF%A4%D7%16j%26%B3%81%BF%C3%16%A4c%9Bj6%0AjR1%5B%031~6%F8c%3A%04~c%87!%AE%C2%9A%F9%5C%0C%84%1F%3D%13%E3%EFlN%F7%08mv%20%D9)%AC%F9%E4*L%AF%C2%17h%85%05E%E8%CD%5B%AAp%AF%1DH%D2%DC%A9%E8%FA%D2K%18c%BCp%F9Ce*z%F3%AE%A6%D9%AA%93%96%09%AC9%B5%C0l%E3%06%3A6%A7%EF%8F%5Bt%E0E%C2)%DB%24%D3%D5%E5a%1D%1B%9E7%DB%92k%9B%FE%3C%9C~S%2C%13%18%C1%2F%1FS%A6%5B%04-%86s%14o%C3%18%2B%D4%E2pz%BA%16%2F%97%08%90cjx%7C%06v%D5%40-%A6%8A%83%2B1G%8F%08%83%81%5C%FDMi%01i%3C%FB%01%C0%BA%E9%96%CE%C3%B5%F1!%D5%E4%D8%A4%98%0F%E6%C7%C3%23Y%F1p%19%C0%3DC%B3%09%90%EF%A0%C3%A7%5B%1A%03%92xx%B3%C9q%10s0%9F%0A%8E%F7%B6%C4Q%93%9F7%3A%8E)%BF%E6%B6%15%B5%A6i%16%F1%D3!3%01).c%8C%C7%DF%9E8%96%1C%FD%24%FA%DE%C6pUfH%D8tY%991%D7%09%E6%F1%B8o%1F8%EC%A5%FA%FA%B6%C5%13%A8w%1E%99%D7h%099%B9%E8%AF%A9%D2%85%D3L%DD%0A%AC%C0%FA%FE%09g%8CD%97h%DFD%D5%91%FF%DD%2C%D9%82%11%BE%7F5%2C%DEmjJ%C5)%C5%F2%B2f(%FB%5E%AD%E1%D9%18%C0%8E%8E%D7%F3%2C%5C%B6%C0%044%9A%9Bk%D7%FC%7BX!~%ED%CA%FBz%EF%DCu%E4C%EC%9D%A2%1B%99%40%FD%B4%CF%5C%03%E2%5DY%AC%10%40s%B1%1D%FA%DF%EE%01%05%EF%C0%8F%F1Q%FF%DCy%E6%82%AE%0Af%08%92q%DB%F1%CFZ%14%EF%E2%FA%5ENV%99%2FA%9Cc%83!%8E%A4%BF%F0%CEQ%2B%07n%7Ca%D3%19%D3%F7%F5%FE%93%C36%209Z%FA%C7%CE%8DX%3A%F4%7F%BB%BC%F6S%D3m%C2%8F%B4%C5%F8%CE%1E%2F%D1%98%EB%8B%96%10AK%A5*Z%94i6~%E8%0D.j%03rU3%FB%D9)%DA%9FH%A5%F4y%C0T%0Da%A6%5Dte%11%EE%9E%D3L%D3%CB9%D0%A8%DA%87%B4%60%3B%23CUkL%A6K%90o%9F%01%E5%8AeQ%8F%86%2B%1B%F8%ADmF%CE%90uY%1Dv%89v%16%17S%A1%400%13%E5kzWKM%E9%BBL%D1%16%5C%B3%B4%8A%CC%E0gkh4%A0%05p%EC%84%A2%AC%82%09%11%C81-%A9%3C%80P%F4%B1%85%7C4%15%7FK%B7tK%B7%F4%7F%A8s%AA%F7%8CP%05%26%BE%90i%1D1V%15%9E%8A%DF%00h%7D%94%C9X2F%BEv%04%09%10%96%DE%99P%2F%40R%AD%8B%91%5C%3E%A89%E8%12%D2%0AP%1D%26L%2C%D1r%23W%D3nw%07yS%11%E7%9F%8C%91%3C84%ED%2C%8F%BAa%B4U%CF)YM%B8%91%D3%A52%87f%3E%C1%81%7Fc69%18%F5%D6mm%C35%BB%15k%87%BAr)%BDpj%CCu%DE6%0E%A9%BE%3C%A2CEv%94%BF%2C%A3%D5%DEA%E7%AD%FC%1FkZ%C8%D1%FBD0%1A%EA'%B6%0B%BA%C4%1DZ%E1s%C4k%E4%A2%FEh%95%EC%8E%02%9F%AB%A9!BB%7D%BD%F5%1Dy%EE%18%02-%18%C0%F75%AAn%3B%04%1E%1F%5E%9Er%15%E3%B7%93%16%E6l%10%EA%F1%051%06'%0A%84%BAy%A4%EF%20%B8%84%88%CBX%AE%E4Cw%10%A8%AA%A4%FB%E4%90%22%BD%2Cj%AD%5BN%2C%0F%CD%F9%FA%DE%60%CC%25d%3B%1C*%22%95%A3a%F3%D9N%C5%25%A4%04%B8%85%A4%F2%9Dh%3D9%D7%25%03%86DB%BC%C5%80%C4%DD%26%5E%84%C6%BB%C8%BF%F9%93%EDP%F0%15%97%90%8E%BC'%88%91%88w%8A%E7%AC%1B.%C6%07%BA%99U~%8E%1Cd%7CB%DE4%A8%84%0B%247%0Ca%D0O%EC%BC%04%A3%F4%9F%98%5D%14v%05%26%F8%87I%E5%5C%9E%F1%F7%D4c.%20%9D1r%F9%AC%AB%15%26%7C%D1%05%A4%E1%11F%C7%8B%E4%40%15Q%174%89%CD1%DC%84%09%D4X%1D%EB%C3%F8%92%02%3B%93%FA%D8%C6%BB%FE%97!7%A2%E2o%0Aq7%02%E2u%F6%DAG%06%B9%E49Dh%B7%97%EF%C1%AC%E4%F9%EB%EF9%05%CEx%C1%E8)%5Cw%7D5%E5W%E0%B4%07%0C%F1%AB%00%5B'%3F%F9%00%FE%E2%01%84%DB%80%86%1Ce%0A%E4%D7%1E%40%F4%3C(N%BA%F6)R%DF%BE%D7s%C8%D9%E3%17%AC%F6%98%5DAd4)%B9%06%E17%408%CF%0B%C8%E7Q%23%9E%84H%10%C8x%F6%9F%0E%A9%DBX%3D%2CA87%3D%DF%90%C0%EDz%19%ABY%97j%F6%04d%98U%12%D5%3F%EDM%94%CB%1E%40%F4NE%AF%FC%60%1A%12(dX%BE9%87%08%E9%85%9FO%F5%821%09%81%9F%E9%9F%9E%F6%80%C0%1B%3BmiHNiY%E2%1869%C8%BD%26%EF%04%20%BB%86%94%A8%96!%88%CF%23%C44%88'%23%09%AA%93W%EA%A7%400%19%A5%99P%0F%E4%E9%10c%00%0Ea2J3%A1%B3%B0%FE*%24%BC%2CQ%ADx%03%D9%0D%D1%08%24%CE%23%08%3F%AFF%F6%86%01%AF%89%B1%08%1A%E3%1B%20%9D%FC%EA%91%82K%D4%08%1A%E3%AB%D0o2F%F6%14k%14%A7%10q%25D%D0%18%DFK%3F%01%F7%F4V%A7%14%1F%82%A0c%23%12%DDS%81%03%0E!%1D%F9%06%84%9E%84%EEk%87%1C%D9%19%E4%A5%C2%C7%22%E8P%1DDQ%B0%DEqZ%FE%C6%3D_%AB%D2%C7x%BA'%3F%1FDB~%0EIe%3D%1F%14%E7n%ACfH%AC%10%3FQ%AE-R%1CA*sb%11%B1f%0F%CB%0Ae%BB%CA%17%13%12%B3%08%3A%03%F7%5D%EF%BB%C8%EA%AD%FF%5D%2B%26G%91A%5C%F3%A9%24%0B%C4_%09%FEeW%7C%DB%1D%ED%C4%08%D5%CF%C4Y%20%D9w%CA%FC%A2%E6%AC%EE%A8%13%08%08%F9%0D%2C%90%C0%0A%7D%93%AF%95%B7%93%908E%EB%8BY%20%FCx%97%0C%F0%1C%7C%CF%11C%98%60%82%C0%12%F1%1B%00k%E1MG%95%C2%3D%D9%C4%04I*%AD2W%AF%3F%DF%E1%40%5D%FB%D9%9A%F0)MK%FD*%DDk%1B2%05_%2CSA%91v.%60%82%04si%A9W%A4S%94%DF%C1%049%9A%D4%1F%2B!y%10O%F1%60%D2%18%E3%C9%3A%E1(%A8vU%1C%BA%F5%DF%1Bc%3CQ%097%10%24%DFg%D0%18O%3B%05%E7(%E7n%0A%84e%8C%0Ft%D3*%9E%2C%7D%8AJ%1D%E3%05%9A%03%0B%84%3A%C6%B7%A9%EE%202%CB%18%2F%B0%06%ED-%20lc%FCEw%90%3A%A61%DE%EF%0Er%9Ei%8C%B7%F9P%DDL%88%02%90%E5utY%87%D8%7C%2C%EF%26%85%F8%9Bo%00D%0F%A8%DD%82%DC%7C%90%EC%1B%01%F1%7C%DF%81%93%18%C6x%E7%12%AA%EFF%E3%08%B7%85a%8Cw%AE%80%22%A2%A1%F7%F11%861%DE%B9%DE%01x%00%B8%2F%B0%AD%E3%B1z%88%FE%3C%7F%1B%C0%1A8%FA%B6%C4%B4%8E%C7)%24%BF%A7%D2%7CN%83%D0%C7%AF%F0KL%EBx%9C%DE%03%FC%B3%86S%E5%3B%D1%FA%DA%83JH%06%98%A58%82%1C%04a%98%B6%96%10_%EE%CF%FD9%88E%E0t%F3%A7%16%BA%86%E6%AA%14%A7%D0%FE%D7%91%CB%A6%8D%D5%0Ew3.%D4%14o%E8%A6%85%FB%BArJ%91%D6%0F%EFq%C6%00~%C7.%19%96R%9C%5EM%BF%3Ay2%ED%AA%3A%B2%148E%F11%9E%EE%B2%C8i%22%2FG%0C%EDB%FDQ6%D9%C5%D8%02%D0S%8E0%E2w2%3C%FA%BD%3C%0B-%C2%C8.%7CT%7F%15%F1)%DA%CF%C0%1F%A8%8C%40%9E%8F%BA%07nTF(%8A%2B%CB%891%B4%EB%A4%84%08%94%87L%0D%88%88%FD9%05%258L%85%FCP%15%A8%A3*%A9Y%05W%C2%7DTH%99%FE%E2%8B%91!%ABw%96ZuZ%E2S%BB%C8%07%EB%3A%91%86%FC%94%E8%C3k%DA%80%E5%B3%C1%E26*%C3P6m%AF8%D1%B0%C4%F2%0AX%9F%0B%E8%A4%FCP%D0%BDZ%E6%13_d%7D%E6%F2%B0%8F%D2%11%8Bu%96%5D%E3S%97%FF%A30A%1E%E6%C8YW%7C%FC%C7%92E%91pe%A8%CA%AAl%9A%C4%B10%D9%EF%D4%2FN%AA%16E%81%85%2B%06%A3%2C%90%F0l%9E8%D0%87%17%88%96%99%FD%BD%95Ec%A9_2%40%FC%92H%CC%B1m%92%02%96%17%D1%90%18.%E9%EFW%A8%0C%E1%A8%AA%FF%5B%06k%DD%05%B8%7FYb%A8%84%EF%DFW%DA%B4%94J%E1%D0Z%B3%89%10W%E1%B5m%DB-w%2FG%A1%BF%A8w%F8P%FE%1F-%1C%98%D2%A6%CA-R%AC%18e%3E%A1%93%7F%DCV%0FoP%3C2%00%A1%E8%BF%9A%1Ah%826%3A%E2E%00%00%00%19fcTl%00%00%00%06%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%E6%D6Y%9A%00%00%09%DFfdAt%00%00%00%07x%9C%ED%9C%7Dl%DC%E4%1D%C7%7FI%EE%FD%7C%BE%B6%8CV%5B%D2%5EV%3AVJ%A3%EB%D2j%82B%93k%12(%DB%BA%BE%20%D8%8AV%20%84%F4EZ%D7%04%08b%7F%C0%E2%D0v%0D%A5U%C2%84%A6j%AA%88%E9%0A%AA%26%B6t%1B%AD%F8%03-N%D2%D0%97%99%CB1%C8%A6I%95p%08%D9K%D5%A9%B9%BC%BF%E2%3D%BE%5C%12_%F3%7Bl%C7gWj%95%AF%14%9F%FD%FC~~%3E%8E%FD%D8%BF%E7%F9%DDs%06%B8Q%C1Y%25%00%3DHYZ%B2%03%22%DF%A8%3E%23NsS%9A%878%AFy%CD%EB%D6U%E0%C3%9B%00%E9%DA~%C6~%C8%8B%AE%5C%DB%19%81%A50f%3B%C4U%09%3F%B6%AE%B6%7F%1EE%8B%B3%CE%C0Ac%15%B0%1F%EB%BA%F8%96%1C%8Ea%E5%24%26%1EN)%B8F%AB%AB%B9%98%D7%83%B4%C4%BC%5Bp%08%BBzj%7D%3F%F9%F3%F7n%AC%C4kX%19%C8%99%5C9N%85%AD%02%B8%1F%2B%CFz%EA%CB%C8%D4%FA%B3%12%40%26%CF%E6%A0%150%3D%D0%24)%2B%EE%1D%CFR%18%CC%04%E0%E7%3E%10%EA%97%A6%D6%1D%05%00g%01%BE%8F%D7%B0%00%82%82%B2r%5D%F2%F0%14%C8W%00%EFc%86%BF%F5%CF%AC%B3k%01j%01~%88%D6%C0%8E'!m%C0PN%E8%FB%A3%E4%B6%C3%0C%8F%C5U%1B%CD%95p%F0%BD%B3%B9x%15%2FHu%E2!r%00%1F%01l%40%1D%98x%9F%C4~%1D%3B%BE%BC%01N%E56%20%D6%C9K%24%1C%E2T%3A%3A%A5%00%9D%12lF%1D%9A%07%E4%FB%0E%60%7C%DF%CE%F1e%AA%CDVy%E02%8E%00%B6lT%14%05%B2%E2.%20%97%07%D3%D6%B1%C1%F0%20v%84%AE%A3%3D%E5%EAmf%A2%8D%02q%AE%CFM%AEm%CF%170%07%7F%7F%0F%E5%01%E5xo%C2%A9%BE%7F%1C%5C%06%8F%7B%FE%AA%BB4%F1%D9%16%96%0BQ%87%AC%EC%9E%FB%F0%5D%83%E2(%3C%AF%AA%F6O%92o%F0%2F%A8%E7%EA%8AI%B7%D03%83%ED%A8%C3%E7%2F%F7%3CD%81D%07%81)%E2%A6%B7%F7%00%9C%0B%C9%C8%85e%BE%2B%0B%C0%9C%E7!Z%B1%E5U%B4%AA%06%B1%A7%86%02%E1%2Bb%C0%CE%3C%D5%EEM%2C%C5%D9%8E%9E%FE%0A%F0%87%E2%DB%EF%3E%24%FFo%10%AD%AA%8C%E9i%12p%08%D7%C9%A9%B7%C7%F1cQ%D4%CC%96%93%3A.%84%E2%CE%09%D4%FE03%91%85%DF%A5%0E%8E%E1S%20Lm%3D%05%F2Y%8B%2C%0F%82%7F%14%9Ax%D4%FE%3Dv%2CP%40%D9%D7%F7%23A%B55P%5E%F2%0D%8Ac%C6%B0X7%0E%9D%BC%9F%E2%B0%13%96P%F6%24w%CA%87%DBT%5BUb%80v%C6%5C%C2%BFe%1E~W%BE%91%DA%F1(%A3B2%EB%7F%A3%DA%BAZ%B8%22B%F3d%C2J%B3%A8%C0%23%81%A2%F6%C5%7F%A0X%3E%17R%EEq%A6%B0%94%E2%C8V'%CESw%9C%A7A%9C%FD%A1%1F%E0%96%C6X%A6z%D35%B2%9CR%85g%40J%7C%B6QG%AC%EC%DA%AB%85%02j)%02%87%DAP%C1_%C7%FD%C8%5D%F2%A4%F2%11%A8%C9%A5A%E0%93%CA%2C%B4m%92%26%99%12%E8%06%A1%5D%A2T%D12%A0%2C%DF%90y%8A%9D%9C%EB%EC%0A%F4%08%9B%D7%80%B7T%B5%FD%F4O%FB17El%94%2CZ%97%8FR%19%E4%DC%A3Ff!y%22%E5%AA%0A%DC!%8D%9B%9E%FC%E3%C3u%BC%86%B9b)V%FA%C7%9CD%3FdF%1Dq%CD%FEw%D3%09%FC%C1%95%DCY%C6%8E%B0%A3W%00%F0%AA%2C%07%E5%FDZ%0Ch%AC%8A%D0%8D%7F%97%EFG%3A%90%AC%FC%14Y%FA%0B%A7%BBw%9F%C9%B4%87JRY%F2%1A%AA%CD%DF%BB%08%2B%F6N%FE%EF%CC%91%A9%82%AB%FD%826%04%DE%A1%B6%0Bp%8C%0F%A97ge%5B%86%A7%2C%1F%08t%A7%A4h%14%87%5E%02g.%A9(%CC7Y.%0A%14%9B%95%10m%DD%B2%10%FA%85%D7rJ%F7%C2%CFk%5E%F3%9A%D7%BCni%097%81%D1%BD%F3%26%40%5Eg%F4s%87i%2B%17N%DB%CE%60%22J%9E%EC6%81%AC%B7%1D%02K%7D%F4~%B8U%F2%2F%2FF%93%CEV%8A%C9%DF%F8%1606c%DE%E6VpP-%D8%CA%F0%8D%07%C6%22%0C%7D%DCb%89%1C%95%DE-y%ED%B4%04%91E%F2%AEr%D4W%24%D3%15%F6%E9%7C8vM%40%CA%19%D1%CA%C6%D0%84~%A1%E1%0F%CB%B4%04%9D%19%05_%C3J%BD%2Fo%97%2C%8488%B4%98%5Dl!%03%7C%0F%A2%C5%1E%3C%23jV%CF%95%94%F0%B3K3%22%96B%A0e%EF%B6%D9%85A%04%9C%96%EA%90%ACx%B0%94%2C%FEZk%5D%3Bv%20%17%D99%22%8A%1F%ED*%D6%CCm%CDIMH%3A%8D-%96%E5%BE%1Cx%DC*%06%13B%AE%09%88%A2%18%3B)%18%FC%B2T_%5DX%26%C0%2B%CB%7B%05O%8Ee%90%E7%B0%7C%9Fg%F8pX%96%87%AD%820h%82%D3%3B%0A%CC%E9%DA%A3%BB%ADa%B0-r%1F%F6%2C%8C%26%8Cw%BEe%09%C45%7Ci%2352%3AW%DE%15%BB%5C%B5U%96%C3H%A2%86%A3%EC%E4%40%7C%B5%12%3Bo%C4%1A%8B%BE%F6%08ih%D7%11%A3E%F9.%DF%10%9C%1A%A1%3AX%04%E9%FC%098%EA%ED%86%FC%FA%08%B4%0BvC~%DEz%ED%EE%A4%83%7D%17~%8FSF%7B%00%96%AAY%B8b%3B%03%7C%3A%89%F9%14%05%CCR%1A%E7%D0%B7%EC%14LB%98%BB%8C%FBV%99d%00%7CZj%D4%93I%A3%7Bs%C2%98%9B%18up%E6!%C6%D4%BD%AE%F8Q%C9f%06%FB%00%C0.%9B%19%E0!%9D%84%2F%04%9B!%CAW%AA%1E%EEv%80d%F1%24%C2%DA%0D%09n%00h%B7%15%E2!O%F1%F6%1D%07%86l%85%10%05%D9%DA%23%B6_%13%25%E6%D9%0B%F1%3D%92%80%A4%CC%0C%B0%5C%AD%DD%9C%FD%90'%FD%B93%90%B6%90%95%23%F3i%05J%A1%40%F5%9F4Kv%40%FC%1ClQA%D0%AC%40%DA%F2%D4%B3kT%90%23%9A%CE%A6!B%8B0%0D%F1m%3Eg%0B%C4%BF%EE%C1%E9%26%EC_%98%93%A9%E7oN%1D0s%9FD%7F%EB.%9D*g%AC%84%3C%A1%40H%8CW%20%E0%BE%E7%A5d%AF%80%DC%A3%16%8A%8C-%82%24%C6%BF%99%80%C0%9F%E5E%11%E5%93%E9%B0%92%C1%F4%F2%10%241%BEZJ%16%B0%D9%CA%E2%F9e%1A%FB%CC%1D2%20%AF%A8%231~f%1ASK%8C%5C%A1%C3%7B%11%DF%0F%F0%C9%D5%06%20%3D%FB%12%B3k%83%DCT%89%2F%07%E0%DC%FAO%10%DFM%87L%0E%12%D8%89%7F%9DI%40f%1EZm%FB%A1%5C%C0%86%3C%118o%0E%02%C5%F0%D2u%1E%92s%85'u%AEv%01t%22%AE%9B%C1o%F2%F9%E9%FA%D6%CE%A7%95%18%9F2%ED!%07%B0%16%FCn%CC%8B%CF%24%D6Wk%5E%90%C4%F8%D4%89%15%0F%1F%C0%92B%9D%B9%19q%C1%1C%24%F0%95%12%E3S%AF%C1%15q%0F%92%8F%F3%C9%BD%BB%F1%A9%C4%BAr%E5(%80%1B%2F4%BBk%D3%AC%06%EB%A8l%F9Xk%1E%9B%86%DE%DD%87A%C8pb%D6%B7~%8E%D7%B3!%DF%1Cd%F3%02%1C2%5B%EEo%0A%EC%1D%E6~h%B2Q0%0A%09%1C%03%FFf%ACE%E8%2B%9Cg%14%02J%B7%F9%B8%19%86%D2M%15%0CC~%09%0E%C9%0Ce2%60%E9C%D8%E3%B5%92%2F%02%BER%3B!5%FD%F2%03%BB%24%60%A7%12%3F%86%A6%5E%CD%11%E2%0A%E9M%BD%D2%AE%C2%10%E4%02%96%FD%9B%13D%8C%EAB.%9B%9A%0E%A7%82%9C%5DW%DC%A0W%85%3B%5D%08%09%EB%D5zU%B8L%CD%B9SARb%3C%0D%F2%A5%DE%85%D7V%E2%C2s%3ANf%83b%0AD%B7%8EH%9A%10%3E5%C6%E3%DA%97%26%24%8F%C4x%5D%AF%B3iB%EAn%8C%F1%A8W%9A%90%E8%8D1%DE%06%88%F3%8C%91%07%A4%D9%8E%5DRJ%A2%40%1F%E2%BA%19%904GE%C6%20i%EA%F6%82d%D0%BF%B4%B2%0Ebo%02%C7%12%08%23%D9%0AI4lf%C71%03%90%A9q%FC%DC%E5%E0%C8%E2%1F%06%1C%3D%2FN%8F%E3%E7%0E%89%90%05%0F%20i%F8%9C%FA%85%02%193%10%E3)%F2(%BF%08%E1%20%C0%D1%5D%02%E3%FF!%0FG%B7%91%18OSu%BD%124%5D%F5%F4%A8%E6%8E%C0%D2%C9%F3%AA%1B%E3ib%F2O%88%BB%C5%E6%18%F8WS%3CH%E0%1DOBL%F7%13%7C%8F%95%D4%C8%2B%E1%BFa%DA%C8%85%B4%A9q%7F%EDV%02%C9%10%CCB%88%DA%2F%1C%BD%B82J%B3%BA%24%FFP8~lC%9A!%E9%10%9C~M%A2Z%3D%D1%EAM%85%3F%032%8EO'%2B%84On%98%96%FB%3B%D9%DEW%C8%F8%A66%AD%04%A73W%CB%CA%16%AD%93%1A%84t%EAO(%A89%22%EE%DA%BF%D8%3D%97%AFn)%D2%EE%B3%BD%7Duh%91%A0%5D%C1IZ%EB7%0Cy%B5%26%CEi%EF%CF%E4%B5%EAOz%D2n%FE%17%17%E2%BFf%9E%91%83%F7%A1%BF%C9K%91%A7T%CB%AA%D3%F6%20q%B7%EE%D0%85%B0%9A%F3%7C%95%F7%03h%CA%F3L%BD%91%E9%C8_%AC%D5%98%84%C3%8C%5C%AA*%114%F6n%18.%AA%BDG%1F%C2%EC%2B%A3%D7%C2%86%E3%B2%9CG%DF9%10Z%E5)1%92%16z%82%7D%85n%BC%22%B0%974f%B39z%2F%1A%20%10uj%7F%F1%C2%9E%D4%804%0Ci%FDNS%A5L%A0%FC%20xR-%7D%F4%17S1%0BG%B4%7F%2C%3A%25%F6%F1%80Vn%D2s%AF%8B%9E%25%CBz4%3F%1E1%02%E9*pr%1A%E6%0A%A1%93%A7%1Ak%DA%E5%B0%91%17p%B1k%A5%17%24%BA%D99%02eT33%DEpg%99%11HWA%AB%D6%DC%95%EB%DB4n%FA%AC%CA%86S%A7%0C%A4%1C%C9%3FR%F4%7B%0D%7B%BB%E4%1A%93(%B6%C0Z%A9%23%EBS%CAk%3ER%0Ef%19%BC%19%FE6%DD%5E%F7%D0%3Br.%ED%00I%CF%20%D8x%07%ED%18f'p%B0%A1%C7V%CA%14%2B%83%9A%A9%88I%BE%CC%C1%F4%8B%DB%18%FD%EE%FA%B4lx%3B%DC%FF%01%1C0w%1Fb%1D%1A%C7%00%00%00%19fcTl%00%00%00%08%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02-d%25%1A%00%00%0A%15fdAt%00%00%00%09x%9C%ED%9C%7Fl%13%E7%19%C7%1F%92%B3%7D%B6_%DF%01%0Bj%A1%94%98.%ABh%96%90%90Fm%B7%011!PJ%D3%26%AB%D8%94%AD%A9%F04%D6Ri(i%AB%22Vm%8A%93%00u%A1%5B%22%D6%7FZ!b%B6%96v%D2Z%D2%C1~I%D3r!)M%A9%89%1D%986mc%E2%E8%C8%CAVJ~%92%90%C4%F4v%E7%1F%18%DB%F7%BE%F7%CBg%A9%15_%25%8E%EF%9E%E7%F5%E7%F2%DE%DD%FB%BC%3F%9E3%40%BA%D8%8C%3D%00%A32%FB%0C%C9%0C%88%90%AE%095N%DAd%F0%10o%E9%96n%C9%88%BA%0A%7C%A63%98e%D0h%3A%04%D5%C3%99%80%D9%10%BB%0F%ACYo%BB%D3%E5l%06%BB%E9%10%E4%06z%BE%E9%90k%40y%09v%A6%E2Q%E3%10j%EC%D0%F7x%92%3D%B8%CB0%83i%89%D4%11%0F%F5%2C%7CK%F1CPe1%D1%EE%10%14%CE%FA%AF%E0BX%09Bu%DA%F7%90%ECyJ%90%1F%82%CDGtp%9D%86%100%23%3C%C1%A5g%82%00%F9%DF%3AA%98%05%9A%0C%E9%12jC%1C%88%3Fx5M%E2!%D6%05%2F%9C%14%E6%C0J%AE%AE%B6O%EB%B6%DE%16%EE%22%B9%14%CC%E2!!%1F%B4T%1D%A8y%9C%C8%80%1E%AFs%81%20%2C%25x0%D3%91%CF%B0%C6.%0EM%173A%9E%0Cq%DC%03%5D%EB%0F%DA%97%E0%3D%D0%B5H%04kl%0D%E7o%AA'%13b%AA%B6xC%CB%F1%95%8Af%E6%DE%C6%1A%AF%00%7B%98S%03%99b%EE%5D%FE%B1%17%0F%89%3C%40*%1D%0A%A9a%A0%19%B80%83%AEc%ED%CEH%3F%11%D2%A7%0A%12%81%D0S%CD%B7c%ED%B6%08%1B%20AzUBj%00%B6D%DF%0FJ%DB%7C%AA%9D%1A%A5H%A7vdP%15d%0E%DD%09%D0%11%7D%BF%5D%AC%9D%86%CET%BB%BD%9E%22%05%13%CA%93%BA%ED%E8%96u%AB%A8%10%F7%C7%EE%F9%5E%1E%FA%F8%D7%D2%ECaz%8Ex%8C%A9%DBC%F2%D7%E9%C7%D2(%E6%CCX%00%80%B7%D6C)%9CIw%A0%A7%09%10%A8%E6b%7F%99%D8%9F71n%7DbS%1F%BDk72%C5%C8%939%3Cs%8C%93%20%7D%0Bc%15%24%05%CF_l%E0Kp~%1D%F1%98t%C2%DB%FB%AA%072%AEX%24p%24%CA%B6%CA%A8%19%DD%0D%AE%D2%B3%AB%3D87%B4*V%91%CC%BDoW%AF%86%1FeB%7C%24%88%B5!v%F4%FF%F6%DA%7C%CC8%B6%E9pE%EF%92%2B%00%97%16%3E%2B%7CX%9E%01%99%C8%D8%95%A2%BBjcn3%14%97y%847D%B9%A5%D7%3E%B1n%3F%D9%7B%F5%25%3E%DDLO%E3%DB%03%F1%B3%9B%26%3D%B1wu'%A4(%89S%07'%BD%B2%B3b%85%B5vf%9A%A9R%7C3%0C%A8n%AC%3A%5EE%F9_z-%88%BF%A5VD_%AD%85%9B%FC%5B%E5.%8E%D0%11%C2%DD%D84%DE%968%04%A6U%A8%E1p~%CEhP%3Aw*RX%F4%5D9%7Bu%C8%8Be%5C%9C%3C%B7*%F9%C1%EF%E1%0F%C6%EA%11cl%8D%20%8C%97%C9FH%E7%ECr%1E%5B%B6enher%EB%05%3C%84-%05%B8vbbb%A3%FFe935y%0D_%B6%AA%3Bt0y%08w%E2%1Dm%C2%83p%3F%BB%ECo%98%3E%DEy%A1%91%97%B7%88*%EC%EE%17J%13%1Bb%CF%1C%AF%93%1B%E0%18%3D%C6%05%E5%ADH%10nn%EB3f%5B%26%B9%84%C9Q%8FuJ%08s%9DRJ%138%C9%B6.%D9%C7%C3u%A2%E4%A6%ADH%FBe%1C%2C%B9%80P%B9%81%F46g%07%92q.%93%178%E5%7F%DA%83qJ%5C%24%18%88%E2%89O%8A%5Eb%F5%91%ECY%91%EB%ABC%BC%9Er%9Fj%F2%EE%DD%A4%87%01%03%80%E4%FB8%B2%B2.%D3%09%E9%D0%00%C9%23%04%1E%82N%C2%8C%06%EF%03%BA%C6%DA%FF%DD%E3%D3pph%D6%AF%07%D2%C8%2C%D12%E1Q%F6%BA%0E%06*%87gU%0D%A4%E2%BA%DC%AE8%A0%97%81%F8%A0G%A6g%81U%3F%B9%EF%84%814C%0F%A7%DE%DD9%A6%C19%A9%95%F0%8C%06%EF!%D2(%1A%AF%F6%CE%BB5x%7FS%C7%19%11uQ%20u%1E%D3%D5%D1%AC%0Bb)%F2i%F1%D67%BF%97%FF'%5D%C5%B4I1%2CfC%F9%B9%80%10%E7%09%3EW%90Wr%01%D9%FD%85%81%B4%E5%02B%9C%9C%CC%96%88%D3%AC%D9%12%AB%25d%E9%95%C5%9B%03%08%5D%9B%03%08Z%94%03%08%94i%E8%3F%EAV%97%3B%07%90%0B%FAz%B7%DAd-%C8%01%84%DE%AA%AF%07%A2%0D%D2%96%833oi%0F%98%0F9%7F%D8%7C%06l%CBAlD%91%15%E6C%F2%1Asp%9Ft%FC%D5m%3A%03M%E5%F9L%87%D0%93%BD%BC%E9%10W%95%B4%18%A1%20Vf%A2%C6%87%F1%A5d%7CI%13%3BI%88%CC%3E%8DSQ%83J%1D%7B%E7%88q%88%E2%E8!t%3E%07%90%07%B3P%5DJ%10%C7%B2%1C%9C%F8%BC%00%D9%9E%15%E9%99M%D1*W.%FA%00%B1E%24%D34%B0%1F%E0%9F%7C%97%A9%D1%99.Z%B7%96%5EPD%CEF1%AA%EF%F3%F0%83%F6%CB%05%3C%D1%09q%E2KP%D5%12%B4l%F1%EB%E2%20%7F%25s%8C%EC5%D4%FE8%0CW%AE%D7%3B%FE%B0%94%8B%BF%CD%A0%B0%18%FF%01%F3%EE%95o%00%EC%04Fv%8DII%AC'%BA%92q%9C%EC5%08%B6%81z%80%8F%06%5Bu%0DAXN%FC%AD%87%CDd%AFn%B0%9E%10%1D%E9U%FA%869%F9%9D%AE%D3l%C1%1E%859G%1F%7C%24%1D%0D%BDZ%17%03hA%B8%C6%BE%FA%12%A0%17I%B7%BC%FFT%89%94%60%A1g-%C2%B6C%84%AC%0D%EE%B2x%60%A0L%F0%12%3C%877p%EC%9Ah2%90f%CD%BB%0AR%12%DEvW%A10%F94%B9%D3%EF%036%D4%D0%3E%AD%03%C2%0A%1C%E4%7B%E1%0E%B8%8CY4%BC!T%0F%2C%E3%DF%A7%90%99%25%AB%D0%B1%A5%D0%C2%11%F2in%C8%D2%1D%8Dyz%20%87Q%A1%B0%14%1Cne%CF%11%BF%BFC'%E4T%B4%9E(%15%25%7B%FE%FC%87%8Ep%F4%1F%D2%A9wye%9F%B6%95%D1%EA%A28%9D%0C%BB%9A%C5%9B%DD%CF%F1%86%20%A1Y5%10%EBm%1DF%20%CE%87T8%1D%80%DDu%BC%01%88*%85%C2%C6%CE%89*%E5%ED%7B%C7%7C%08%AA%7D%CB%7C%08%D8%B6%B3b%8C7%19%E2%9Ae%C5%18%FF%8A%B9%10(a%C5%18%DF%12%87%0C%9B%03%A3%23%AC%14%E3%E3%CD%0A%E5%C3%7B%FEe%A3%EE%B6%A7o%B5%14~%13%1FN%1AJ%9F%0C%FEX'%03%15%97G!%F1%8E%17K8%D8%F7%E1%22%AF%0Fbm%EB%96b%FC%3C.%B69%8F%E0J%01M%C8%DF!B%26b1%3E%BEIJ%FE%CC%0B3%3AG!.%E1%11)%C6%17%C67%CFpxW%E7%8A%3Dj%9A%5C%19IC%C4A%FF%BE%C4%B0%D3%E6!%F8%B6%D6%D4%E9%BE%BE%A4%BB%3D%0EA%FF%22%A4%25%C3%8A%7F%3C%A7%F3%A4%A4%40%9A%7C%A1%80%BC%13z%02%1CS%8B)%E5%F4%7CE%88u%91%CF%85%E9%3B%D3w%05%D0f~%5E%BF%DE%FA%8AB%A2%03u%CB%B0%07%8E%CA%3B%D9%1F%F9%9A%F8%3Ar%D9%AD%13b%0D%DC%A8.%BA%1C%EA%02%B2N.%F7%B0%17%C4q%08!%9D%8E(%A9%CF%15%87%B8f%3F%F8%BA%5B%DE%AB%16%9E%04h%80a%E3%10x%0F%9B%1F%FBK%7F%FBZT%0E4g%1C%22%EA%0DY'W%93%20%8C%EF%E6%81%F1%C6w%10R%AFT%40%F2%C2%7F%7F'%D3%E9%C2%3A%A5%D4%2B%F24R%1A%C4%B1%7F%E2%CB%7C%86%D3OY%A5%F1%81%12%24%982%F9W%F1%98%B0%26%C3%A9VC%3A%9C%2C%E4%F9%CA%F57%2F%89%FE%0EP%DD%CF%D2%9D%1E2%0A%99%13c%FCM%DBbs%FF%F2%1B%814%A7%BD%1Ar%EE%E4d%13c%FC%08%97%DC%CEo%0C%EE%80%F4%A9%83%DFh%C8%B9%93%13%E5%13%FFW_r%9B)%1B%CF%9C%05!%3E%C9%A3B%D2%9Ak%CA%E2%EE%1F%E5%9C8c%10%BB'6%7DqC6%3E%D3I%EF%9D%9E%10*M%C6%F8%98d%D2t%1C%3E%83%90%C2%86%F6%D4%13y%89%CFt2%0Ay4%19%E3cb~%92%E9%E45%08%F1%A8%C8%E3%91%9CL%87%D8s%01q%1AL%60P%051%AA%2F%0E%84%99%9F%8B%2C%B1%D1%5B%10uB%9D%9FH%90%A0%E2%02%9F%01%D9v.%3B*F%B9%AB%A91%3E%CB%F2%C3%E6m%D7%81I%8B%F1Y%D6J8%F0%157%D0%A3%A91%3E%CB%1A%85%D0%FD%5E%A0Fc%A3%3A%93%20%F3a%A4%2F%00%16%11%92g%5E%02%D7%13%D0%1F%E2%C1%1EH%8E%E3M%D0%EF%3F%5C%BCSlV%D6d%25%9B%12%9D%96%DFo%AFzs-%A0%A08%8E%C7%A6%F4%23%15%0BD%C7k%BE%C3%81%FD%01%5C%1Ec%EFF%1E%A4%3B%05%FF%10a%EFo%953%8C%DF%0A%06%9F%3F4%14%B6q%F2fi%C4%FC%A4%EBH%D9%1D%B8%F2L1%FCZ%11%22%E9%F8%16%C8%0F%C8%9B%A4%C7%05H%D3%03%60m%C6%3D%C8%99v0%5B%A6%E1%3C'o%13%AB%11%11%9F%B0%10%87%DF%F9%98%B2)%EA%5D%D4~%F0%DB%18%5B%9B%D8~y%F1E%1D%82%C0%C1Q%5E%05%A4%86G%15%B8y%84%AE0%B4r%F8%A2%3D%3F%AF%9Cz%91%F8%F8jB%0F%03%9C%C1%1D%CC%F9%A2%1A%B9o%FAI%E8%BE%91%E0.%BF%AA%89%8EZ%B1K%EE%C5%D8%9Ce%C2%C4%0ElI%D7gmHes%F3%14%9C%0Bb%9F%D1A%83%CE%AD%D8%92%8E%F2%7B%D4%F6%B3%87%AA%85%F1%FFx%F1v%16%7B%89%A2%E9%EBG%3C%EA%20%AE%C7%BA%F7%C2~%BC%BD%8B%C7%9A%8E.%D8%E2V%07%01t%1F%F6qbQ%8E)%BC%AD%A5R%E9%BB%23%92%0A%11%D6%7F%5DM%84%19%BFP%F8%AC%DA%F9S%87%10%C0%DA%DE%2F%9B%24%B4%1A%3D%CEB%B5%0B%CF%CFT%60M6%E1vR%CB%D4%BEu%FA%90%3A%C6%C5%12%FCs%EDU%F8%9BDR%97%E0%E5U1%06V8%B0%F5j%237%19L%D5bU%08%60%84n%8B%1Bgd%97%12%9Bq%EBB%8F%3A%084%95%B0%9Bq%1Fe%11%88%F3%E2%97%CA%04%FCZ%BE%AA%B4%A9%3AL%8A%95Je~%E0%E7%F5%DB%E1%FE%0F%95l%83%C1J%7D%EDy%00%00%00%19fcTl%00%00%00%0A%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%034%EC%9A%00%00%0A7fdAt%00%00%00%0Bx%9C%ED%9C%7Fl%14%C7%15%C7%9F%CF%EB%FB%B9%3BWJBi%A1%B6%95%D0%D4!%04%9B%E0%22%D2%108%FF%08%18J1%B4Ph%EB%D6GK%5BTQl%14%A8%92%06%85%0BN%E8%85%10%1FHP%A1%A8%09G%09%89%2B%91%18%08%10%A9%AD%F0%DA%1C%95)%17%9F%A1%FC%D1%FF%BC5%01%14)%8A%8Dm%82%81%C3%DB%5Dl%EC%BB%DB%9D%D9%99%DD%3D%AB%7F%F0%FD%8B%9B%F7f%3E%DE_%F3%DE%BC%9D%05%20S~M%0B%40%AFN%9B%25e%03%22g%AA%9F%C6%89M%16%FF%C4%07z%20%AD%D0%DF%A4%ECCr%3F%08f%1Fr%18%AE%8AY%87%FC%0C%7C%81%ACC%02%80%EE%8E%03%04%92%E3%00%11%86%B2%0E%99%0F%CE%FAl3%CEN%8A%FF%3A%DB%8C%D8%ED%1F%F4%1D%CD2%83%7F%F8%8B%89b%96%19%D0%15%F2%16%05%B2%0D%D9%07y%5B-%DF%C0%E8%DC%9BD%FB1%A9%E7%F4%A0U%08%F7%C2%2C%91d%CF%09%B5t%0EXCt%40%0CN%14%92%3C%5C%F9%9B%C0%1A%C4%F3T(%0C%9DSI.%C2%E4Jx%C4%12%C4%BDu%F6%3A%80%A5D%9F%C8%20%D4Z%82x%F3%AF%16%BC%CC%93%A7%D8%DCAh%16%AD%40%84A%A8%93%AF%93%9Fg%3E%09%DD%92n%E7w()eR%F9%D2O%0C%7C%92%20%E8%B6%0Bk%1B%E9%20%17B%EBf%18%F9%AC%C6%19%F8%B2%DDT%10%3E%D0pL2%F09%8E%EF%5D%1E%05%EFsF%FD%15%B5%E4-7%F0%D8%16%C4%18%C2%E1%ED%7D%1F%1EF%BF3%86%24%3A%E6%18x%CC%F9%8D%A4o%D8%5C!%CB%D7gB%5B%A7!%24'%DA%1A%24%3A%A0%5B%9F%3E%81%B3%F1'%E5%00%E4%8A%86%10~%DE%17%E4C%F1%25%85Y%18%93g%81%5C5G%DAn%7C%24%D0%3A%EF3%89dw%DD%5C%80%BB%01%23%8F%9D%06O1qV%1A%11%3FA%24%9A%D7%F6%2F%C1%FD%11%1FQ%0C%3F%A2%B6%7C%E5%9C%E0%0E%D9%5B%2C%87%B0%3D%2F%04%A9!%E8%97%1F%0A%A5_J%FAF%B7%5C%87%9Fu%F8%8A%CA%CA%DFR%5C%11U%DE%C1%83%C1%E3%B8%F3~%A0%40%24t%AD%ED%2B%1F%20%D9ST%B1%11%60OH%DF%96%2BK%84%9E%C2%F6%9Akw%A8%18%CE%89A%C5%7D%91rH%3A%87%8EH%0Bk%14%3F_%0A%DDT%90%BA%88%A4%CC%11MAp%88Z%23%AFW%0F%B8o%2B%96%E5%97%F9WhrX%E7%D4%E7%15%FF%2F%0B%DF%97%F4%8A%18%17%F0gC8%F4%AD%5D%E7_%95%9F%A6%60%40%AB%A8%B8u%D7%F4%FA%E7%FB%25%AD5%81%9F%CE%5D%FD%12W%F4%0F%91%86%01U%C2%CDF8%10O%E6%DC%F2%EBth%C5'%5D%BE%02%D1%19%A5B%00%9Ap%B2%EAMx%0Bns%93%F5%20hs%CA8%9Aj%CB%A0%CEq%E2*3jbU%94%BB%8E%0B%01%C4%DF%8E%8F%C5n%CE%A8%80%C3R%8AR%7DWr%09w%09%1C%9FV%F0pcZ%3BQ%AC%90wOq%1F%DC%E5%07%F9%94%E0q5a7%E4%E2b~%E6%EA%BCza%E6X%F3%5E%DB%8F%C4%99%0F%3B.%5E%12%E1%BD%B1%E6%A2%CC1%B4%17%5Eg0%D2%85W9%8B%D7*%AB%9EQo!ix%E1%D3%84%0C%EC%23%3A%BBV%84%9E%D1_%7C%D2%1D%A2%EB7%AC%5CJ%3FW%10%F5%8DAz%DDF%E9R%9A.R%FA%A1%D9%E5%CBF%7F%F8J%DC%01%16%C8%3EZG%3E%3E%F6%EF%83%CFpL%90%9F%B08%DF%E7M%85c%94%A7%0B%DD%0BDO%9A%80%B8%EB%A18D%ED%AA%E8%2B%26%20%B9%22%2F%8Bt%AE%BC%92%F0%B8%16%06L%40z%80%A7%AEi%BF%06%F0%07SU%9E%84%12.i%7Ds%A3B%907SSHHn%EA%82%1D%3F%D5s%14%D6%9B%80tu%14%D4%FB%DE%A0tnk%3F%0Aa%13%10%FF%B4A%E8%AE%0E%D19%F3O%04%0D%96%EA%98~%93D%08S%3F%8E%B1%D2%E7i%5DS%25%F4%02%9AO%0DA%2B%E2%C6NZyK%94%87%8C~b1%0Cp%BARfG%87H%0F%89%99%82(%E3w%01%17%CA%3A%E4%10%03%E4%3Dc%17%1D%B9za%9B%94K%0D1%F3%94(%D7%24%E9%91%03~%BA%CA%86i%88%20%CB%A5w%13%22%AD%FB%EB%A6%20pb%89%3By%E04%ADw%8D9%88z%C6%16%5C%17)%7D%CDL*%C3%90%3B%95%95%B4%90%C7i%1D5%10%86%10%B1ev4%FB%90%2B%DE%87(%97%F4%19r2%BC%F6v%89%D7%98R%C1Q9%18%BA%F1%F5%9E%A0)H%22%CA%E0%5C%12%11MA%CA%24%06%E7%A1%9B%A6%18.%A6%D7%0D%83%E6%DE%13F%E638%7B%E7%9A%DB%1CQ%BB%CC%D8gT%5CS%A1)%C8eB%5DE%A3%1Eg%C0%14%04%F63%3C%5E%EF%0A%8B%CDAXd%26%7Fd%16%B6xl%A3%F8%9B%D28P6%8B%E3%00y%A0%FF%13%F9u%0A5!%8C%2F%A7%E3%9BR%D8!%40t%DAH%A5(%96%F6%07%10%93%90%F1%B8%F0%A8%D0%C8%C3%0E%8D%0B%04%9Ff%C7%16%9AK(u%B4%15g%10f%C4%96%D8%05%D9%8538wC%7B%D6!%0E%80%7Ff%1D%C2%014%01%C4%3B%EC%80%04%08%90%EF%C3%95%D2%0A%EA%85-A%D8%F4%CF)y%EB%D13%00%BF%B7%CE8%23%071%16a%FD%8B%A0%D6%AE%BBE%AB%0C4%1D%A6%E3lNe%C6P%00l%95x%DD%81%EAa%15%D6V%03%EA%EB%2Bw%A1UH%8E%04%7F%C4%D9%B8O%C1%1Fe%5B%11%EA%2B%06%C27%B1%10O%D0%FF%AC%E2b%19%D2%16%BD%1C%C5B%D0B%7FbM%C3%90E%88%F0%0By%E0%DBXk%1E%5C%AEC%E1%9D%5E%E3%97%3BDm%BA%F1%97%1A%11ku%8B%D0%DCi%F9%EE%12n%88%11%C2l%EE%8B%DE%0B%AC%16!%7C%12%91%CA%EC(h%0B%A4%E0%3B%C4%F5%AE-%10%B8%24%CB%B7%09%E6%B2N%3B%20%D0u%E4%9C%88%B7%FEk%99-%90f%D8%F35%BC%F5%AF%A7l%81l%87%E9-%22%D6z%D6a%0B%A4%C1%5B%D8%83%1F%23%C6%25%EC%80D%1C%A2%03%3F%C6%89%E6.%3B%20%CD%DB%E3%1C%BE%22%F6%CA%14%BF%12%E3-C%12%B2%BC%A8%E8%E78k%B5%E4Wb%FC~%0A%88C%26d%02%8E%A9%F1%AFb%E3%2F%14%CF%EDQb%FC%26%0AH%D7'%84%CA%B5'%08%11%FC%AB%99%BBM%5Dj%8C%A7%81H%DE%20%DE%CA%D7%DE%C2%DA%DC%C31%9E%A3%808D%7C%FE%06%A8%F61bZ%C5%A9%10%8A%C4%CB%BD%1B%FE%835%5E6(%1Fr%D1a%90%91%84%99%E0%C2%1AW%18%0C%C0%3D%A9%DC%81%14%10%D8%01%9B%24%8C%897%AA%83r%915%0D%FD4%90%FFn%C0nU%13%FA%0C%F6%D9r%1D%E1%9D4%A7%0B%9A%DB%1E%C5%BE%9D%3EF%0A'0r%E1i%20%15%B3%3F7%BD%E3%9D%0A%12%DB%08P%B0%91%2F%97%B2%099%A0dUo%81wG(%9B%90%EE%B0%BA%FCp5bSQ%3B%20%DE%FC3Q%E5%A1%EF%FCS6!h2Z%25%C1%C7%90crENwwE%C2%0D%F3%F8gMG%B7%7B%90%F5%E1%94%D7%9Czs%F6%B6%87*%9F%3B%2B%01*%19%F9M%B5%F5%8A%04%B9%02%9A%AD%ED%BE%09F%5B%AF%C8e%24uoa%FA%E9%CA%EB%8461%DD%E9%C5%1E%A3%8BA%86%B8C%F1%8ET%08*~%A4%A9%E3%7B%19N%01SE%B5%14%C8%96%D2%8A%BD)%10%E7w%0F%CArf%FE%BC%D4*%E4%8ErYS%20%FF%96%CEj%9D%E6%99%DAs7%26%97%1A%E3S%F64%EF%87%CCs%A5h%88m%CF%9DF%5C(%3D%C6%FF%98%D7n%9C%12%AC.%5C%F3B%E91%BE%ED%E3%90%C6%C7%F2%07%86%EAC%9Cvw%ED%0Dj%7D%ACVx%DC%991%9E%0Fh%7C%A8%82%1A%11R%9D%11%E3u%20z%BB%AD%D9%20%8D%191%DE%A5M%CF%F5%B6%0F%B3AB%19%A7Cg%83%8A%FD%10%9D%11%3D%16%19%F7%20%8E%D4%E9%AF%D5%EA%88%99B%C3%90%B4I%23%06%ED%B6~%1A%89%B6)SD0%03%D2%EE%7Ba%9E%9D%90%3Cu%F3Go%E6%91%D4%D8W%2CV%D5%7C%BEP%0B%B9%B2U8%2C%D9%08Y%09w%B5%90%F6%F8%BE%9F%06%ECc%F8%A6%C0%12-d%17%F8N2%7C~c%A4%F7%E3%2F%855%10%F4%B8rYx%DB%18J~sH%85%C4%3BR!%DE%86%AA%F0%AF%EE%FF%B8V%19%B2%08%F1%84%20%B1%01%E0Fi%C5%81%94VGGSxt%05%FA%3A%B2%FAY%B4%F2%18%EE)%01%A4%C6%F8%94%D6%B4%07%BE%10%A2%AC%A3J%99%10T%10%05%B7rMz%C4%B1%D6%D7R%3C%94H%CCx%24he%C6%1EV~%EE%ABOI%12%A7%5E%F8%14Cj%DD%C1%13%60%DDv%E6%12%FF%5E%98%DE%D2%5E%7D%14%B6mQ!)%E15%F5%F3L%F7r%60%9Ca%9C%DA%B75%AB%00%CA%AFG%15%88%FE%8C%886m%F42n%0Bj%07M%B2%F34%C0%E2b%25%C6%B7%E9o%D08x%BD%AF%9A1%85%E0%A4%CB%19%3D%04e5%9B%8C%D4%ADi%18%BA%F4u%9D%0E%CE%81)%1B%18w%E5%FA%D6%CA%99%23%F1C%CA%C19%1E%1D%DC%A9%1C%8B%F6%DC%A3%B2%E3G%02%8C%8C%89%0Bn%C5%CF%95%A7%A5%AC%7C%2Fx%96%F3%C3%DF%13%FDY%DB%23%D9%AA%93%B8%90%84~tbF%7B8%FC%86%98%06%B9%0D%8E%85%95QL%97%9C%E0%5E%9E-%3D%FD(%3EI%D2%B6%D6%AD.%18(%C7%7D3%E0%ED%5C%CD%06%F1%E4%EB~%2F%C6%C9KQ%1D%FE%99%5E%C4%F8_S%08%B8%0AK%CB%14%7C%A7%95%40%F3%D5%E8%98%94%F5%85n%91%D0I%AAB%AD%90%AA%98%20-%2F%A1%B9%3A%CD%A8v%23%A1S%F5%FC%BDL%90%1Fv%9E%09%EA4s%FD%F8%E2%A5%F2%C4Wy%99%20%B1~%DDE%9DC%96%09%89%9C%03%FB%12TW%A8%60%81%A8%DB%1Eo%D2m%1F%96%8Fe%CF%A0Z2UWm%CC%AA%95X%BC%9D%CB%0D%3F~%D7SK%89%B1%CF%98P%19%DB%1D%3F%A2%3A%B6i%C5%115%C1%10d%A6%CD%C5%A7%BEa%82%01y%D3B%D4%BE%9FU%16%17%89f%20%CD%84%0Fd3%D5%10%3Eb%06%01%C2D%C2%1B%B7L%99%FB%F6%40%097%03%B3%24%9CMS%C0%E9%D3q%AA%C6l%B1%A2%94v%40%D3%FFq%DB%E7q%91%C6%CD%1A%04%AF%FF%01%D5%B3%93%8A%C0%85b%9C%00%00%00%19fcTl%00%00%00%0C%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02q%C5%B6%1A%00%00%09%E7fdAt%00%00%00%0Dx%9C%ED%9C%7Dp%14g%1D%C7%7F%09%7B%97%BB%BDg%F7(P%0A%92r%87Ti5%85T%228%25%90%0B9%C2%8B%91%0B%82%8AH%CB)%B5vF%A7%094Ef%7C%C9%A6I%3A%5BL%09%20%FA%8F%CCd%A1%C5Qg4%99%3A%3A8%83%C3%E6%A5j%86%2Bw%D2%81%EA%1F%CAB%A0%14eJ%5E%20%40%DE%D6%BD%23o%DE%EE%3E%CF%DE%ED%3E%FF%F1%9D!%EC%3E%BF%DF%3E%9F%BD%7Dn%9F%DF%F3%FC%F6%D9%03H%97_W%02%D0kPfK4%20j%BA%06%AC8e%26%9B%A7%F8P%0Fe%A8_%2B%F4%19%AE%C5%AB%E9Cj%94%13%D4%19h!%DCj%A3%0Dq%0B%E0%17hCr%12p%86%3AD%EBk%ABd%FA%10v%906%03r%5E%DA%B5%86%3A%C4%D7%B7A%A1%0Eq%A9%B2%ED%3A%D0%D7%08%0E%AD%25!%DB%90%AE%96(%DE%E1%89%B2%11%BB%0C%3E%3Fo%18%EB%80%86%D6%DF%25W%13K%E0%ACl5%FC%0C%7B8%3B%9A%7F%9B%C8x%A7v3%CE%CC%080%03%7B%BC%A7w%24Lbpk%7C%F7%B1%90j8O%82%EC%C5%99%B7%85%C3%1B~%DE%06%DBpux%E7w%3FJ%82%9C%C1%98%AF%865%95%C8%F0%22%AE%8E%8F%02%FD%12%16%E2%EE%1D%CE%C1%3Ah%B7%EB%3C%E9%3A%EE%DB%E3%9B%AB%3E%8F%AF!%B7%F0%9E%9B%00%D9%F3%7Cm%FF!%8C%BD%B5ix%B6%82%AD!%5Ey%8F%C0%B8%B6J%C0%DA%D1%10%3B%F3%FD%7C%AC%CB-a%03%9E%C1%2F%FF%8F%8Cu%98%11%F2%84%F8H5%CE%C5%A7%AC%C7C%DCk%3CxH%5Cv%87%80%7BQ%C1%3A%D5%E0!%DF%94%7DQ%ACC%030!%7C%15%DA%E5x%06k%F6%0E%01%7C%01%EB%B1%11%18%FCYh%E2%F0%0D%EF%2F%8EA%FB%CB8%8F%02%60%04%12%04%F5c%CD%1D%DA%CD%18y%06%D3%3Fr%020%07c%0A%1E%E2U%25%9CY%E4bGg%FF%0B%DB%09%03%A3%AA%95x%08%B3%18%E7%F0%CF%80%AA%CE%95%F15%00%BF%F7%2C%09R%8E%99l%EEU%D5%DB%3F%24%204%A1Y%841h%EE%1B%18%C8%E1%3E%85%8C%D0t)J%B0%9F%C6%40%F8y%96%18%D0%12%C2%DB%5Bob%20y%85%D6%20%CB%04%BC%BD%8C%C3%40%E2%B2%25%06%22%8CA%D1%7D0%1F%AD%F0%16%C6%18I%F5%10%12%15%AEQ%0C%C4%15%B2%06%A9%0A%E2%ED%ED!d%0E9%A2Xbx%07%87%B0v%14%90%D1%E0%9B%C66%97Z%60%89%01n%B5D%C0%D9%3D%EALxaQjS%97m%E9%1F%D4%F7%26f%99%19%93%B1%1B%EA%22%25p%FC%DB%F5ef-l%94%B6%D2%22%E2%B2f%13%7F%EC%81%99A%E2%C5%C6%E5NBNF%DA%A8C%7Ck%3EX%18O%2B%D35%A6Q%C8%CC%A4%E1g%24%E03%CD%B43w%5D%00%AF%8A%E0%0A%A8%D8%E1%92%7DH%D7%06%F0%EEZH%91%01%ED%1A%E4%A9%E4%EDN%13%92%D3%06%BF%1F%FD%5E%AB%C5n%23Ky%16%F2%25Qu%40%A1%0A%81%B5e%C57UuI%02hr%BC%0DA%A4%FEy%CF%3D4%9B%22%04%3C%23H%95P%A4%14%3B%02%CDX%C9Y%06%F7%DE%E4%AE%16%11%03%02%B0M%8E2%E0%C4%0B2%EC%9D%9A%C42AP%05g%09%9A%1A%7CCl%A5K%99%D8u%8DADr%1CR%07%9DoK%DCdj%8B%1D%86-%0A%C6%3D%1B%89b%95X%AF%B6%C1%8A%89%02~N7%3E%E9%92%85%3EY%AA%F6%AD%DF%25%C3%2B%CADI%7B%9F%E00%03%15A%AE%94%ECL%B6%2Cp%B8%E6I%B1M%97c%2F%BB%0B%C1%5D%C9%8E%1E%7F%8E%12%E4%CC%B7n%C3%3BgG%81%AFU%0Fq%BB%BEA%07%B2%D6%A7J%AE%E0%F8%40%11%95%D0%E9%7B%0F%5C%F9%C1%8A%7F%E7%EF%A4R%F7%94%EA%94%1B%25%23%F8%C9%A5mq%16%E7K%E6%F2%AE%93I.n%DB%A1%BC%FD%AF%F8q%BB%A6%CB%82%5D%C8%B7%A1%93%E4rX%B1%0By%0A%18%C2%24%9A%7F%D2.%E3%E4%20%5CQ%F0.h%CC%26%E3%84%FA)%11%9F)%82d%1E%C7%96.%A8%F9%3DspI%C8%94%08i3%82P%60K%1BO%FC%20p%C1%16%A4%FD%EEQm%12MH%CA%DA%14%17%906i_%9E%ADT%3B%8C%9E%BB%A9%89%BE%87%EA%90%B69%0A%A98%FD%AEL%11R%A6%E0%9F%068%A2%8F%B5n)%0A%A8T%A0%CCA%8B%CB%23%FB%B1OP%9C%10%5B%13%9E3%8B6%04%92%F9%13%E2%3Do_%F1%3F%3EN%9D%E1Y%C0%CF%A5%8C%60%1Bg'%A0%96.%C3%B7l%40%B2%9C%8F%CCV%F1%3B%C9%FA%E3ET!%17%D4d%A3_'%3C%CD%C9N~%83D%8D%60%E2%CBd%96%D1%9B%061(%CB%2C%A9f%5E%FE%10%92%25%C4%B4%E1%B9%7Dr%9Ao%D6%0Do%AE%8E%EE%AFg%7F%B0U%15%C3e%85%3A%A4%10%FC2uH%25%DC%A2%3C%A5%D2%14%02q%09u%C8%EB%DDK%DF%A7%BE%BC%0D%95%CA%B0G%8A%9D%A3K%D9%BD%5Dl%E8%2F*%A3%1B%F6%CB%F7%8BM%AB%00%F6Q%85%F4n%06O%25%C0%15%99%22%83%EB%EDTr5%80G%A0%08AAv%B3%9F6%C4%13%82%8B%CDRj%E5!%3DqZ%CC%F7k7J%9C%26%04%5E%87%9A%DA%F8%F6%FA%01%99%26d%C6%EC%0A%95%17%0F0N%40L%EB%F05%B6%95h%FF9%02Y%A0%7D%91%D6)F%16%24D%9C%82%BC%06%F0%D6)%C3%BE%C3%2B-s%0Ar%09%F8B%8F%E1s%7F%97%1C%00%0B%C3%04%2B%F2%CB%5E%09%89%DA%C6o%D3-%B9)%80%23%10%CF%1Aw%5B%F2!%DB%F5%D1tK%D7%03%88%13%8F%0E%F9rw%B5V_W%9F.%D9%F5%7D%E7%3E%09%5C%DD8%06%3B%D0bIg%88%0C%3B%07%81%23%03%8D%CF%D5%C8%06%86s%0EB%F8_%95%19%3C%FA%07%A45%86%EC%18%24921%16%23%C7%CE%D1%87%FC%A1%A8%AC%C5%C2%F1%FC%B6%1F%D9%80h%7D%8E%95%091Z%DDM%5EQo%0A%D1b%FC-%D9%02D%00%F2%F2%ED%A0%19D%00K%0B%F25%C8O%88N%DA%B4G1*w%25!%16%06%5E%1AD%B4%00a%EF%18%95'%07%11V%C6%F6%A8%12%0E%10%9Df%C2%E1%B7%0D!Ok1%9E%CC%004%88%C8%E9%CB%0Ao%FE%2F%0D!%91%ED%F5%96z%C7%06v%808%CF%D8%D4q%EEiC%C8A%F1%80%A5%9Bq_%5E%5D%94%E4%F3%EAc%8D%15%8A%11D%B0%D8%AD%CC%FB*%1B%24%F9%1C%17%9B%D7~)%5BH%DEA%40%7D%02%22%E6%2Fo%C0%C9%EEg%B3%850%B3%DA%B87%C1%BB%5B!%F8%F1G%03%FDF%FD%825H%C1%7C%ED%AF%FB7%84%B5%98%7C%5D%60%83a%DF%83B%16%20%ECh%8F%94%5C%EFS%8Cw%EB(h6%FE%02Z%82%C0%A7%F9%15Z%E4%83%0E%BCW%F3%B9Y%92%0DH%EB%E9%CE(_%40%1A%A0%9D%0F%F9%BE%98%3D%84%AFU%D5%BE.%01Pt%BC%C0d%E9%95%D99X%82tn%25-%BD%C2Wa%09R%E0%17%81Up%1E%24%089%C6%7B*%B3J%AAM%83%7C%9E%1C%E3%2F%CBv!%C3%E4%18_%A3%AB%C3%A4%E1%CD%E4%09%12c%BCo%24%3D%A3G8)%9D%98%DE%07IA%8C%CB%E5h%A6%95%A6%CB%95%84%E0c%7C%C4vR%CC%DBK%9Ai%DD%B0%B8%DA%18%23~%94%F0%20%02El%BE%9B%E5I%B6%22i%1E%DFe3SuQ%FB7%E6%D0%3C%DEL%D7%9F%94R%A3%3E%AA%90R1D%1D%C2%0E%AC%1C%A3%0E%B9%00%C7G%A8C~%01%F1%FB%D4!Q%C8y%F0Ir)%E6%B9C%C0%14%A6%20%86%FD4r%06%B2%19%98%C4%CD%84%19%24Wq%04%B2%1F%AEA%CB%981%E4F%B8Tr%04r%FEt%05l%196%84%A0E%C7%DE38%22%0B%A1%E5%87%E0%B1y%BDF1%3E%D7%89%B5%AE%1F%85%92%7F%8F%01w%7F%FD%1D%A3%18%FFw%E0m%7D%E38%B1%09%D0%13rr%B3B%8B%AC%AF%18%C6%F8.%E8%98%995%A1%23%BC%E4%A7%A7%EB%C2eRjo%04%5Cc%CD%BDF1%BE%91%2B%26%0C%AE1%EA9%BB%F7%1E%C4%BE2%5E%E9%10%5C%9A%99%84%E8%E7%F1%A7%18%A1br%E7%1F%A2%EE%24%B0%3A1'%BCN%EBF%C6%F7%EE%C2%F2%A5)%88.%2Cum%82I%88o~%F7%FCL%18%EE%C1M%E09vvb%F9%ECn%EF%C8%5B%BB%24%80%1C%DD%99%E6V%C3%E4%E5%D2%AC%F87u%D3%D4%12%FD%10%E0%DD%F0%EF%C6w%E3j5zdu%EA%1D%804%5D%92%A7%9E%DCvj%1FU%B1%CE%E0%E7%023%DD%9D%8B%01%B4Wm%AF%D7%AFJ%D4%C6%D7%C1%F1%CDS%DFI.R%B6.v%A1%EF%CB%E9%97%1F%E5%8B%5BuoJ%A0B%C8%1D%9F%F5%FB6%D6%2B%3E%E2%C2%C6i%F2%3C%BB%D3%A5%BB%C7Z%7F%FCY%DD%3B%B2%1D%09%B8%FA%A7%07%9B%3D%81Y%EA%A3r%06%10vk%DB5%7D%E1%23%C1%FF%7B%C5%CA%1B%DE1-%7F%EC%09%ECpe%82HJ%DC%A1%2F%BBX%C9L%BB%5E%1F%AC%8C%B5%DC%9E%AC%96%2F%A9%02W%A6%BF%81%E15%1C%E2sS%D7%EB%C3%BB%C5%E0%9D%A3L%EC%CE(%F6'%BC%A1%0C!%CCk%B2Q%F1%91%C9%AD%FA%C4K%00%E5%93I%A7%3A%D9%25p%83%8A%D11%18%88%F1%CF'L%85%DA%8F%A1g%E7_%F2'2c%FC%7C%E0%3E%01%7F%2B%FAn%2C%13%08%BF%92xV%7C%C3zy%E2W%05%7CA%ED%5E%94%015%86%0D%CF%CDD%17-E%89%FFN%B4%11%5B%14%5Eg%F2F%9E%B9%D0R%2B%5E%DC%B2%C9%3B%B6'%0A%26%E9%12s%E5%60%7F%18aB%ECT%8A%8F%2F%86%BCLg%0E%E8s%B2%05%2F%DF%B4%1BC%04%97%94!%24%E3%11%1BZ%85%1C%7F_C%A7%E6%A6*%BAKf5u%E6%9F%A1%BD%8C%1F%3C%03%09%FAk3%17%1D%82E%B4%AF%16%F3%B8%06%A2%F5v%C8%84%F2%EE%C9f%26K%CB%A6%22%26K%AC%2CJ_a%F6%3F%DC%86%14Kn%F6%20%A6%FA%1Fc%CAy%EBp%20Wn%00%00%00%19fcTl%00%00%00%0E%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02_%95%7F%9A%00%00%09%C3fdAt%00%00%00%0Fx%9C%ED%9C%7Fp%14%E5%19%C7%9F%E46%B9%CBfw%2FB%D4%A0%81%DC%20%12u%A2%80%0D%15%DB(Grc%22Pr%D5%B4%8D%9DTO%E9%20T%2C%88%80Lma%01%81%83A%2F%F2c%FAcl%B3%A0V%FFp%9A%03%87%D6N3%C3%9B%842%09%04.%22%C5a%C6iVB%D0q%18%F3%13BB%F0%BAw%094%3Fv%F7y%F7%EE%DE%FC%95%EFL2%B7%FB%3E%EF%FB%D9%BDw%F7%7D%DE%F7%D9g%0F%60%B4%9Cc%F6%00t%E8%EC%8BK%2C%20%E1%D1%EA%A61%B2%A68%0FqB%13%D2%95%D04%0E%90C%AF%FA%983%C4%3C!%9F9%24U%81%0B%845%24I%05Nf%0D%D1%C6%C1%0B%CA8%406%AB%AC!%B6%CA%C6%EB%AC%19%20%84%BB%14%E6%108%B8%C2%1Bg%0B%F6%E2f%C4B%C8%DB%FD%20EC%A2%C9%B8%F0%8F%E3w%23%B59o%C5%06%9C!%BD%E0)0%2C%DC%0D%87%90S9%A0%96%7C%AA%A2%90%14%1Fl1%2C%F4BJ%A5im%E9%01X%C8%C9(%A4E%853%C4%A8p%258%CC%5Bp%B8!%9B%9F%86BB%1A%C7%10%B2%13%83p%B9%CD%03%F0%04%82%F8%E6%B5UD%9AkT*%3DUS%174%AD%2F%AC%E9%EE%23!%F3~K%CF%E9%CE%EFY%F0%B8Q%B1%AD3%E7*r%94p%BE%DB%B3M6%B5%A8~%13%0A%9E%DF%A9%1A%15o%BE%86!4%0D%808%DB%D4%E0NHw%B5%FE%02x%FD%FBI%BC%D2C%05%01%F3%AFk%00%EC%5EiU8%EC%D2-M%C9%D2%9Bk%8E%96%F1%5D6%A4%B2fN%06%C1%EF%D7%3F%94%967J)%20%8B1%83%DAl%0Db%A8%EA%B3%ABT%1C%B2%103%10%7Fn%06y%81%0B%10%94!mWP%1B%BB%0F%F6%19%B5%E4q%3Cm%3E%A8D%F5%FE%0FP%13!%03%16%0C%18%94%15%0By%DF%C7!%A9%3F%C6%DC%01%C0%FDP2%DD%A0%A8D%BA~%06o%40%CA%F1%A16%B5%A7oT%11%FD%A2b1%E7%D7h%7D%80%C0w%A8%09%7F%5Be%BB%A2_%F4K%08u%1B%F0%87k%0F%DE)%B0'%98%EA%D3%2F%F9%04%F8I%A8%03o%3A%99%B5%D7%DCB*%26%20L%E3%5D%86%06%B5n%84%E1%88%AC%18%CD%3B.%AD%A7'%08OJ%C63%A7j%0C%12~)g%83%1F9%8E%8E%FA%AB%A4%04f%19%0D%E8b%8E%82%40%02%FF%C9F%2C%80%EF%80%BD%E1%3E(%DCiP%9E%8A%0E%C3%97J%B1%C3%00%A1%1F%E0%8B%D3%C6%E5!%A3%FB%F4%96%CE%F7c%16%00%2F%99%17o%F2%E9%EF'%B7%3EQ%DC%89%98rd%DD%DD%9F_Qo~%0C%D3%DC%AE%A6%12%C2%F7%A9z%BB%A7TU%F8%FD%A7%A2%9F%DF%EE%7C%2B%5E%CA%81%B0Og%AF%C3g%0F%CF%98%1F%8E%F2%C5%B5%AB%A3%FB%C6D%5B%F4%A6%07F%91%19%BD%CB%2B9X7%C0a%01%1C%2B%A1(%3D%DB%10%993%D0%BE%DA%A0B%A2%20%01xo%00%F5%99%F1B%3C%10r%CFB%18qC%0A%FD%B7%9D%1C%DD%0B%09%EF%F8%BAp%BF%BD%8By%E4.%E9%AA%CD5g%99%87A%CB%C3%C4%3D%B7%E9%C3%AE.t.%1E'd%FB%15%5BI%23%3Ax%C6'%FBl%C2%C9%17%EEQU%96%10%C7%0D%E0*_%A9%7D%9A%E9%B9%F0%7D%90%DCtM%C8%A1%98_%C6.%E9v%A8%E7%A6%01%CD%9C%3F%0EU%D7dW)%D0%C0%16%C2%E7%FCm%12%5BBT%A9%14%BE%3Dn%B5%F4%8E%03%A4a%962%0E%94%CB%F8%A2bB%13%9A%D0%84%10%7D%BDs%1C%86%92%E5%7F%7D%8C%3D%C4%05%3B%983%04%2F%1Cf%0A%90%F6y%3C%85r%24R%CDP%17%BB%96o%99%EF%86v%EB5%8F%D1_%2C%DA%9A'%A9fY%D3%3C%EB%10%E1Qj%D3%7Cm%A5B%C4%22%C5%3A%04%DA%D0p%EBM%95f%A9%1C%81%A31%DD'%076R%1A%D6%9D%CB%D6%20%C9%EEX%20%D2%E6JH%CF%FF)~%80%9CRn'%C0%DF%88%05%02%E2R%92%A2%A6%60%0F%AE%B4)c%EE%03%0E%19%A4%FBc%82%80%B8n%03%C0Z%CCJz%B7%9B%F0%3E%0AC%1D%C0%09%FF%0E%8FG%5B%95%9D%C5%2C%AB%BA3%40p%01%D4Z%87%B4%F4x%FC%BB%9B.%95o%C1%BE%AEK%FDv%1F%08%DFi3%60%EB%90Z%15%C4%FD%C5%CA%BFk%B0%8E%AF%F2~I%00b%7B%C6%FB%D5%5Dp%F4Z%7D%86%F4g%CC%D0%EE%5D%AF%FD%A7y%2C%A4%A3s%99%9D%CB%BFG%C0%F1%5B%CC0-%F2%94%EF%C9%D8%20p%99T%BD%E8y%86%B4%E5!v%D1p%CD%7Fc%84%88%87%0B%40%DA%D3%F9%0C%96%16R%1Cc%FB%11%09%83%09R%0D%9E%DF!%86%99%A7%2C%B7%ED%D4%09%D4%C8%06%B6%9C%8E%ADQ%60g%24Dg%DF%60(J*%AB%A0%B05%DBO%01q%B8%8F%9F%C6m%E3%84%D8%09%DFJXC4%9F%C1%25%0Ab%D8%F1%BCW%AD%1E9%C6%C4%DC%F1%C6%92%F2'%DF%15%7BmZq%25%25%1F5%19%A73%24F!R%5B%E2%0F0%86%2C%04!%1B%EF%D48%D5%01%D2%7C%95%3D%C4%11%C8c%0D%99%0A%B5%ED%5B%8E%9A%3C%80J%84%B6C%81%F3b~%11%D3%E0%22%D8%5E%ACt%FE%10%60%3DS%88%D6%BC3%03X%E7%EA%B5%92%E4%20%60y7%F1JpEFH%C6%10%E8%E0%14m%12%C7%18%92%C1%3D%A8%8D.l!%82%CC%05%CA%B7%F6%B2%85%B4%AAI%DF%FAw%A5*L!%EFG%87%C7Q%EE1%C1J%CF%1B%07%88%E3%DE%B7%C6%E1L%06%9F%B4%B1%85%00%8C%C3%D75%01%89%05%C2%DA%01'%1E%22%AAz%90%A6%D3%09%85%24%13%1DH%5B~Q%15Me%CF%E8%B5%8C%AE%048%A8%EA%404%1F%BFI%BB'u%F8%23%24f%1F%C6LR%9AAj%5C%F2%23%9D%12%A7%17%A0%1D%AB%1E9D7%92%C9%19m%A6%FE%BD.%97%1ED%038e%0A%88%0B%5EGLR%7CP%20U%E9%A5lD!%14%13%2F%E1%06%1CGL%C4%01%DE%07N%BD%A0%8AS%19%04%A1%EA%85c%98%C9V%BB%0C%87%F4%0A%9C%8F%01%5D%FC%B7%AB%7C%26fb%DB%26knP%0F%12*%DFJ%95X%D1%11%E8T%11%13if%D6%0E%DD%243%A7%E4%DFEu3%CE%16%9ER0%9B%BA%C2.%A2%0B%01%8AaE%D0%FE%96%AC%FF%1AM%11%17f%B9u%F7SA%9C%DA%1DV%B8%DAA%F1(%5B%3F%E7%88%0E2'%A8%9D%8D%BD%0Ce%08r%9A%5E%EC%99%0A%C2-%BAC%FBo%C3%E7g%82%7C%E6%F9%87%C7ZQA%F8%81%CF%9E%8DDa%97%E0%90%DF%B7%7F46fM%E7OfHKU%F8%15%1CS1%88wqu%E5%D8%D4%13%3AH%B5g%C1C%92%0B%1C%3E%0C%E2%EE%98%2B%C7%0A%09%F4x%8A%8E%13%90%A6%0Em%1B%A5%5EI%19%FD%BB*b%84%EC%5B%8A%A5%5E%DDl%22%AF'-olB1%15%E4%11%EAx%D7%F6%5C%A1ol%86%1A%8D%8F%17%5D%D4%90%B6%EB%D0U%40F%14%B5i%A7~%04%F7%F1%8EJ%2B%91%BBM3F%A66%17%11%E0%EE%D6v%23-%D8%C8h%88Q%C7G%D4%A2%8C0%15%F3%B2%81%A3%F0%F1u%A3%23z%A6%D6%81%91%BE%D1%E1%CD%8FNQ1%1Fo)%E2-M%1A%05%91%2F%90(%C4%DC%C7%8B%96%9Em%F1%B7w%8Fx%1D%A7~%A3%5D%89%AC%E3%11%1F%2FdX%81D%9E%3B%0C%DB%10%17%1FnP%A2%EBx%F3JB%3C%2FU%A7%06%F9%19%24%B2%8EG%7C%FCAw%1C%10%ED%BA%EC%04%EE4%E6%E3%C57%E3%60D%20W%A3WWr%5C%D1esq%CD%E9S%A3%10%96%2B-%E1%F5%CD%F5%3E%D6%10%98S%B1%A5%3C%25%C8%16%22%E5%C1%94C%91%80%1AKH%9A%2F%FDF%A8%811%C4.%DB%BD%CC!%C92%A7%84%D6%B2%84%88%05%DA%90%95%04-%9Dr%C4_0%82%D4%3E%0B%CEw%EA6%DA6%C8%EC%82%05%7C%96%B6%C6%0B%87s%B5%E1%3E%C1%EB%F8!%A5%97%AD%84%B7%23c~%D3%A9%10q%AC%A3%5C%C7%5B%94%ED%9DU%EB%86%DE%18%E4%DC%8E%EB%B8%8F%8FE%C7%E0_%7DC%1F%C5~%3B%E5%3A%DE%AA%1A%00nen%BDrQ%A6%5B%C7%5B%D5%B9%C8%802%A4%2F%D7%C9t%EBxk%92%D6%96%D6%7C%EC%BE%B9%95%D6%AB%00%24%91DCZk%E6%05z%D5%5B%9B%D3%B3%01%8F%02XV%7DhD%8E%C4%C7%9A%8F%C7_%7C%B6%AA%B6Q%EF%C4%8A%BD%BB%12%CE%00a%F2%7D%EA%FEa%DB%0Ew%E2%19%90*%9F%9F%5C4l%3B%92%08%93pi%97%D2%DC%23%C3%B6%DF%60%C0%D0%86%5C%BB%3C%EC%0D%3D%09%7D%AD%EF%96%3E%FC%8B%05%C8%D1%AB%C3%5E%2COs%D3V%3C%FB%9B%AD%D4%10%7B%FE%9D%9C%EF%FF%9B%12%5Db%DD%17%8D%FE%02%90%5E%A6%A6%FC)Xk%F9%B7%20%0E%86%F3%3D%DA%CAy%1F%7D%0D%E9Q%97E%86-%8B%80%D0%ADJ%DB%E8%AB%A4eZ%5C%0B%08%99eA%E0%97e.%A0%BFH%40%FC%E3Jk%90%B3%1D%E2OT%D1u%B2G%B5R%0B%0B%BE%8E%14%9F%1B%84%D4J%98%07%F5S%ACP%92%E9.%A9%C1%F7%BF%85%7B%9B%E1%AB%E9%04%AA%09%FC%FD%8A%7F%115%24-%C7%E4%A7%1C%A4%9B%E9_%8E%0Fd%ED%FF%F9%87%15%E0%EF%20%DA%B5%AF%B9%D3o%CA%F4B%F11h%CDkC%0D%7D%CE%3F%A4u%E0L%02%D2%1A%12%D9nLL%FB%11%09%8F%C3g%97%A3.%E7%89%A2%C9%04Z%23K%0Bw%E2%9A%1F%D4%FE%20%A4%AF8%E1%D3%FA%7Ba%F3%1F%16E%BD%E6%A7%8F%246%2F%5Dz%F7%08%01%FB%CF%88%02P%A7B%DBs%25%1FH%DAW%F6%89%92H%06%3F%FF%E54%1F%EC%FDv%FE%8A%A6%13%DA%FC%2F%7D%F7%AB%5Bu%93%8C%A9%D2%A6J%0DR%AC(5%B6%C1%18~%B8%ED%9F%96%FB%80%C1%AF%C3%FD%0F%BA%CCn%86%20%12%A6%14%00%00%00%19fcTl%00%00%00%10%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%3D%D0I%5B%00%00%09%92fdAt%00%00%00%11x%9C%ED%9Cml%14%C7%19%C7%1F%DBk%DF%FA%3C%B7G%12J%A1q%8C%8B%5CJh%08%A6qy)5%BE%D8n%E2%26%10(%B4*%8D%D2r%A9S%02%91%8D%5DAS%A9%85zi%EC%E8HL%0C%09Q%F8%105g%E2H%E9%07%DE%83%C4%87H%EC%81%A1%94%5C%7D%84%B4%A1j*y%C1%18%DAH%15%B1%8D%DF%C0t%3B%7BN%EB%BB%DDY%E6%B9%97%B9%AA%92%FF%92-%EF%B3%CF%CCo%BD3%BB3%F3%CC%CC%02X%E5%B5Y%00%3Ec%D8R%92%08%88a%D5%00%C6)1%A5x%89%93%9A%D4%FFR%E4e%F1%0C%CF%B7%9B_%11%0E%91T%F2%BAp%C8I%80N%E1%10JxG8%84%FE'%1B%85C%AEk%CA2%E1%10y%C6%E9C%A9%E5%B0%B7%95%EF%D3q35Fhk%B3%CEu%CA%1A%C3dE%02%3B%1C%B2%9A%0BW%FD%DC%E4%FBn%60%20%BB%8F%3F%EBPt%B4Q~%80%9B%7CZ%13%82A%C6%40%BB%9F%7D%AA%14%609%2F%B9%FB%7B%BF%D1%10%90b%80_%40%98u%AA%0E%94%FBx%C9s_%EB%08%22%20%3EP%1E%F70olg%B0%B3%91%97%DC%1B9%AB%F2!%CA7%C2G%FD%DB%99%F5%F0%9D%01%87%FB%18%A3%88%F7%03%04%04%FEa%7C%F5%D5%C1%F3%8C%13%05%83%A3%3A7%F5%D1%EE0%06B%3B%5DC%1A%CB~%E9'%B7%F8%89%9B%23%1A%06B*%C3%3A%F3D%DB%89%1A%14%84%9D%DA%02%A9v%F0%9A%F56%02%D2%11%D1%10%0C%20%8F%06%D9%F6%A1%E6G%F8%A9%3F%F1%A2%20%EE%E5%B4%12%97%3Dn%87%8C%AC%ADF%24%97P%2Fa%D97%17r%FC%1Dv%C8%CD%9Ag0%C9%FD8H%FB%F9Z%D8c%B3%2Bc5%DB%11%C9%F3%FF%85%81%B8%7C%D2%C2%22%B0%DF%19%F7%ED%EA%08%229%19%C5%40%24%9F%D2T%B5%D5%EE*%7F%D6%F01%06%C2%1A%EF0%20%40%60%BB%FDm%EF)%3DQ%8AH%AE%18%AC%B7%85U%B2%8F%FE%CA%F63%CE%14%0C%23%92%83%B1%0Bs)f%1D%CCc%16%9F%C1%AE%9ED%8B%3D%9A%E9%C7%5C%8A)%F7T%CDnTJ%D8%CDI%E8%EEX%E7%95%C5X%08TM%B1%DBr%8B%BE%CF%F4%ED%24%F3%26%0E%8E%0C%E1%87%CE%E5%0C%DBA%F5gL%DF%10%F4%B4%19%F5%E3%7F_%EDSQ%DD%15S%1E%D6%E5%AC%FBt%88%E9%9C%7D%DE%BB%89%7CW%8F%FE%5D%F1%0A%A0!%B4%1E%DB5%18awc%E4%5D%17%00r%A2%95%CAE%2B%E0%1C%2C%24%12%B4%DB%C8%F0%5D%1A%D3%D9c%D0%AC%AF%AB%D1t%AB%00%D6%60!%5E%BF%DD%D6k%14%B2%9D%E5%E1%16%80%86%E8%05%AC%D6i%D1a!%11F%07%AB%CD%08%B2%9D%B3%DAv%D7%9D%194!%C4%7C%5COt!!.F%9F%C85%B0%C2%E1%8A%5C%85%15%FD%FB%17%D4t%81%AB%9F%A2%0E%0E%DBc3%23%8CdN%91%19v%3F7%A27%F0%028%89%84%A2X%BE%F4v%05%B9mn%EA%10%D7%83l%7BZ!%B00%13%90H%83%C5%20%A0%E0A%EE%CF%40%E4%CE%3D2%DF%18%14%92s%8C%B2%7D%E4%CB%AAhHd%E7%CAz%D1%0Cxk%DD%AF%853%A0m~P%3Cd%7BhD%17%CDP%CA%3CM%F7%0Af%5C%9C%FF%18x%FE(%96q%ED%C6o%C5%02LET%F1%0C%90%B4%0C%40H0%03%90I%FD%9F%2B%3F%13%90Kj%06%20%F9%B73%00%81E%99%80%5C%C0%8C%8DSU%BE%F8%20%3B%D5%FAL%40rUb%0C%EB%82!%CA7%AF%E8!Lh%23%25%F5%EC%85%7F%CE%15%CCP%5E%2B%018%23%18rx(r%00N%8Be%F4%0E%9F%CF%5DP-%B6o%A3%3C%AD%81%BB%9E9%13%90%3E%C9%F7%01bVa%5C%24%DC%05%7F%A9%0E%26%01%F1%D3_%9Bq%8C%0A%A3o%C3%E8%19F%20%89%0B1%A7-z%FC%18%D7%AC_%85O%1AAH%A2%B6%13%F3V%91i%18W%3Atl8%B1%0B0ab%AB%9E6'%F8z%1C%A2%0Eq%8A%C0%955%DE%D9%CD%A8%0B%B2%884o%A3E%BF%C3j%DEo%F7%ECV%16gK%CF%F4oJ%02%02J%05%23%10*%AD%D7l%B6%DC5%8D%D7%25%BF%3D%9C%8FR%FE%B0%3D%C3'YW3%B3%FF%A1%AB%C5%1F%EAIA%3Cw%0F%04-%26%E20U%D64u%2C%CF%9F%0C%83%AC%2B%FF%B3%19K%8A%95%EB%3C%C8v%CFs%81Yw%8D%12T%E8%DF%22e%DDt%1D%3A-Ql%09%E0%3D%9Bg%A7a%DC%A8%AB%02%FE%5C%9D%5D%3D%D1%E8_%DBSZ%AC1%B7%F5%AC%3D(%B8Z%23%23%87B%DAO%93%804%2C%D1%C1%7Ce%F8c%8D%9E%E6G%EC%9D%98%FC%EA%B01%E6%5E%F6%09%3Eo%2F%23P%A3%FE%F7%AC%F2%86%1E%E3%2B%25%16%D8%89%810l%13%A1%A8%93%FD%B1%CF%8ES%5C%2B%B5x%97%7B%FA%D82%8Eo%EA%90%C3%A7%1B%03%A2!J%A1W%ED%D6%D2%01%B9C%C1%BB%7C%11M~p%C27%E9%82%BF%E3%05h%11%0Dj%F5T%B2%E0%8B%40%8E%1A%3E%3BG%13K%01%D7%2Cc%ECcV%2C4%9D%92%0E%C1%0F%E1%92%26%18%A2%C11%D8%22%96%019%1At%13%D1%A3%C9n%08%87%BE%AE%0A%86%AC%EF-%AB%EC%D7%C52%0A%C6%96%02%24%D3n%24%A2%D0%BB%AB%00.kB%19%9E%2F%98q9Y%15%0A%F9h%95x%88%E7%1E%C8%09%02%E4%09%85%90!%F0%96%8B%8E%97%CA%F4-%1EY%FB%C2%B0P%08%95W%09%BC%24%B8%E0%C7%DB%BC%8C%40%84%87%97'!%93%90I%08%06%12%EE%C2AR%88%2Fy%7B%CB%AA%F6%60%20%D2%E6%E4W%3C%7Bi%1B%DF%A4%23%1C%03%04%19%C6bAV%99%8B%BF%11%8E%2B%A0%25y%08%05xU%BE%9F%FB%09%DAEK%09%82X%7B%E6%FD%25d%25%0F%09%8E%83x%CA%3E%A2%E7%24%0F1%DBx%C4%B2%07%E9%DC%D2S%C9Ch%1B%8FYX!i%9DCj%D2%10%DA%C6s%87%9D%60%AE%F1%3A%D6P%944%04%10c%5B%13%D22%9A%B7P(D%DA%04%EE%BE%A0%DC%AC%09%85%D4j%9EV%90w%AEBdx1YH%DEV3D%9C%B3%EB%25%8E%9FF%7F%DA%ACFE%C3A%DC%B7%3F%0A%02%7C%A8K%FA%1D%DD%3C%E6%B0%F0%05%AB%B5%97%3E%20%1A%A6%E0%D7%2B%1B%CD%1D4D%E5%B8%D1%1F%DBz%CD%9A%23%D1%06%8B%0F%E9~%FF%B4J%7C%00%9CHqH%07%5B%EC%9D%14I%3A%0Er%D80F%3Ai%0E%7F%FD%FC%D8a%E9%95%D4x%AD%DA%BA%14%93%F8%24%0D%05%F9%FB%02%DE%D2%AB%F1%2C%3C%B77%9E%B3Af%B8p%90%A3%D7y%1E%9Fg%D1%EC%07k%5C%FC%F0%A9%D7)%24%DC%C5%85%1C%C7%06%D5%A4F%08X%CE%DCO%EE%D1%A4ceUo%F1%B2h%C5B%DCcn%CB.%032%05%1At%E9%5E%DA%C6%F3%B2%A8%B3B%1C%0A%1E%94%F9%86e%91%16%AD%93%DD%20a%DA%F8%15%12%AF%E0%FF%A3%02%EB%A6%22R%0A%9D%E3%CF%89%CA%81%14s%CE%C7%C86%0FVD%1F%CF(%84%D7%C6'%B0%17%D9%E6z%A4r%05HA~%1Bo%3E%EBX%15%2BK%E2%0D%9E%E7h%A5%9BgNa%A5%0DB%7C%B2uq~%2B%85%B4%F1%DB%F8%04F%C7%C4w%A9%5D%B7C%BA%F8m%FC%E5%20%1A%02%BE%E7O%2C%8D%B7%BC%0C%90%7B%88%FFZy%03%CF%80y%03%AB%2B%B48K%60%FCV%60%3A%12XM-%CC-%B3%40%C8%8F%D2%0D%D9%A2%C9%7Dz%9C%A5%E5rm%BA!%B4%EC%FB%AA%B7%C5%1Ew%2C%89%BC%9B~%C8%D4%0D%3Bc%8F%23%A5%DE%40%DA!%92%1A%7F%DC%7D(%C7%84d%A58w%11%2F%B3%A1%8F%95%17%24%13%92%DE%D1%EFW%2C%90%9C%A0%B46%DD%90%7Cc%5E%BCAY%2C%97%A4%1B%02ak%BF%A9%E7%C0j%15%3B%8EOZd%8A%FCs%E48%3E%05%DD%92o!%DA%F8%145%C7%85%1D%C7%A7%A0QI%C5%8D%E3S%90r3%0A%C1%EC!K%5E%9E%99%15%14%92%A5%09%CA%9ED%F7%DCx%16%EC%2C%17%F8%11%82Ef%9FUi%A8%07%3A%8EOz%E8%CC%11)%26O%D0%FE%DE%97((%C0%1B%09%26%0F%F1%C1%EF%00%5E%15%BB%FC%92B%CE%C2%9F~%2C%94%01%EER8~%8C%BF%E3%3E5%B5%F7W%97%B0%16%F88%09%F1%C5%04%9B%3A%8D%C4%D6%A9%9E%1A%D0%13f%90i%0B%12%2B%F2%A1%83%C1%84!%A1%F5%AC%3D%93%F1%F2%3E%FC%B7%89%03-%CB%9F(CY%B4%5B'%25%9C%FF%E5b%5E_L%E5%93%8B%80T%F4%D5%25%00%E990%0A%ED%BFw%0C%F9%EC%8D%E2%CF%16%DC%9E%1Dc%9C%0D%A7%1F%08%EF%F3%E3!%8F%C9%C5%05%83%C7%7D%0Eg%DD%3F%88n%BD%0C%9F%DC%3D%3F%E6%9F%0DU%CE%7D%16%94D%A6%A2%0B%0A%B7%04%E68A%24%B8b.%2C%7B%FF%3B%9E%EC%98%05fJ%D8%9C%87%CEnyNGS%F6l%82%19N%90%2B%E3%BB%5Cw%14%83%7Bz%DC%AE%7C%DA%DFp%7F%8B%7C%1ADS%40y%CA%09rA%8B%8Ev%DF%A6%99%BD%19%B7%073%5B%83%BC%F2%84%86%C2y%FB%9D%20%EE%2F%BEh~%85%E1y%DDz%A2%19%E0%D2%E6z%25%81%C5%A4%11%E7%2B%3AS%D9OK%7C%83%D5%EC)%04x%B1%B1%BD%D61%9D%5D%1Dw%18%9CK5%B4z%2F%B6Zs%1AA)%DAg%18%DC%2FsL%E8Ix%C8%F1%8B%24%EDG%DE%5B%EE%B1%EDS%AE%8D.%D4%0D%7FP%A2%A3!%2B%07%3B%B69%9C%DA7%40%BE%D6%5Bi%7DV%F3%87%5BA%DA%10h%85k%85%8C%00%0Ek%E8%B1%D2a%89%15R%F6%0C%13%FCp%5B%C1%0E%F39%FFC%82%0D%88%80%AF%C3%FD%1B_%F5Z%E6%C3%146%83%00%00%00%19fcTl%00%00%00%12%00%00%00%C8%00%00%00%C8%00%00%00%00%00%00%00%00%00%01%00%0A%02%13%80%80%DB%00%00%09~fdAt%00%00%00%13x%9C%ED%9C%7Fl%13%E7%19%C7%9F%24%17%FBl%BF%3E%93%852%AA%04%C8%986h%C5fh%23F%5BJ%9C%C4PF%19A%5B%B61%86%16WC%A8%D3h%13%A4l%AB%04%5D%5C%02%AD%C9%10%89(%7F%A0%0E%81%5BZ%A9R%D7%25%AD%26TU%A3%9C%13%08t%F3r%01%FA%C7%26*%E5%08%23%AB%26%A4%C4%24)-%24%BB%BD%8E%A1%F1%FD%F2%3Dw%E7%8B%D4-_%C9I%FC%DC%F3%DE%E7%EE%DE%F7%DE%E7%7D%9F%7B%2F%00J%05T%16%80%11%0D%9B-9%01%91%94%1A%C58%99%93%CDC%9C%D5%AC%FE%0F%F4%F7%B8%F3%0C%AE%ECG%CEC%BC%9B%0B%9D%87%B0q%AF%F3%10%17%3F%03%90b%DEe%A78%89%89%08%2F%96%B7U'%FE%AAr%84%97%E7%F9%D7%EC%40%5C%3B%ABE%C4%A1%94%AE%B6%03%E9%85%C2.%84%5B%7D%C4%0Ed%2B0Q%84%DB%FC%10~%977%FA%95%96r%60%3A%8C%CB%91%F0r4%C3%5D%BFLa%E1%26%A1%40%05V%CB%D3%8C%1F%86%5C%86%17D%B9%85%8C%C0%EB%88%82%C5G%F0%90W%C0%BDYa*%23%98%26%5C%94%C0C%0E%A6%8F%5C%A6%E1%96%D18%A2%60%40%A8%40%22Hr'x%2B%FCI1%CB%D6%3E%86%A8%11%0A%09lDB%F6%EE%BF%05%EF%CE%AD%92%F8%2C%5B%B0%16U40%80%84pk%12%3F%D82Wn%F3I%02%EEL%84%9D8%88%E7%F8%A3%DCQ%C5%3D%E1%92%8A%E2(%C8%E0A%1C%C4%5B%DB%A4%B2%15J%8C%B2%B9iC%DC%BF%C0A%B8R%B5m8%F8%C9%1CL%D9b%EFz%1C%04%5E%7D%5Ee%12v%1D%9CD%95umEB%12%C1G%94%A63m%0B%CAPeY%F5%A5%D6V7%E1%95%A6%F6%BE%D5%CF%A1%CA%BAPW5%ED%B8'%A9%82%F0uaTY%E6%0E%12%02%8D%D2(%2F%B7%9C%E0%13%25%EA%9A%D2P%D1%A7X%C8%8D7R%13r%8B%C0%93%FB%EBxMg*%DFt%DF%19x%18%0B%A1%01e%5C%FE%DDO%DB%DC7u%BD%D9%87%C4%2F%20%9Dx%88%FFkq%A5)q%5B%D7%DB%B5%23r%EFO%A1%0A%0F%19%DA%BA%40%89-%7DU%C7%B7%7D%F4pr%9E%94%E9%87%FCu%F7%A3%19%E7J%F8%7D%0A%D3%D5%09%BD~x%99%B7%AE%FFaq%9B%98%FE%5B%90D%2C%83%95%9E%81%A2%A8%DC%D6%D0%A6w%B9%26%A0%FB%81%DB%F0n%FATH%C9%09%2C%03Z%9E%A1%FE%F2h%EB%19m%D4%1B%87L%C0%BE%A1%C5%C0%A6%0F%EA%E2m%01%CB%F0N%1D%B3%7C%DC%C0%A4R%A2.%E4%25%B2%82w%A5%CF%E4%CCr4%84%99%3A%09!v%3C%CBF%82%BA%8D%EB%BBd%15W%D9%D1%B9%9B%1E%84%2F*%7C%0F%09%F1%06%D3%B1%83%0D%1F%CA6%5E%D4%EB%94%C8%CD%A0%24%95%3CQvj%EE%01%9E~%3B%A4%CE%CD%7C%A6QJ%2F33%A6%0D%F1%18%26p%CC%A4%A2%B4%7C%E9i%97T%F5o%D3)%917%08%FBt%5DnD%3E%20%9Ep%8B%F3%10%08(%EF%3F'*%5E%F8h%062w%3Fwd%A"> </div> diff --git a/layout/reftests/position-relative/1409114-1-ref.html b/layout/reftests/position-relative/1409114-1-ref.html new file mode 100644 index 000000000..7668cbdef --- /dev/null +++ b/layout/reftests/position-relative/1409114-1-ref.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html> +<body> +<table> + <col style="background:green"> + <tr> + <td style="width:20px; height:20px"></td> + </tr> +</table> +</body> + +</html>
\ No newline at end of file diff --git a/layout/reftests/position-relative/1409114-1.html b/layout/reftests/position-relative/1409114-1.html new file mode 100644 index 000000000..1b984ab0c --- /dev/null +++ b/layout/reftests/position-relative/1409114-1.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html> +<body> +<table> + <col style="background:green"> + <tr> + <td style="position:relative; left:-100px; width:20px; height:20px"></td> + </tr> +</table> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/position-relative/1409114-2.html b/layout/reftests/position-relative/1409114-2.html new file mode 100644 index 000000000..de18ed40d --- /dev/null +++ b/layout/reftests/position-relative/1409114-2.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<body style="overflow:hidden"> +<table style="position:relative; top:-50px"> + <col style="background:green; width: 40px;"> + <tr style="position:relative; left:-100px; height: 40px"> + <td rowspan=2></td> + </tr> + <tr style="height: 40px"></tr> +</table> +</body> + +</html>
\ No newline at end of file diff --git a/layout/reftests/position-relative/1409114-3.html b/layout/reftests/position-relative/1409114-3.html new file mode 100644 index 000000000..3dc66122f --- /dev/null +++ b/layout/reftests/position-relative/1409114-3.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<body style="overflow:hidden"> +<table style="position:relative; top:-50px"> + <tbody style="background:green"> + <tr style="position:relative; left:-100px; height: 40px"> + <td rowspan=2 style="width: 40px;"></td> + </tr> + <tr style="height: 40px"></tr> + </tbody> +</table> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/position-relative/reftest.list b/layout/reftests/position-relative/reftest.list index 880a38e8d..495588ab7 100644 --- a/layout/reftests/position-relative/reftest.list +++ b/layout/reftests/position-relative/reftest.list @@ -7,3 +7,6 @@ == table-separate-3.html table-separate-3-ref.html == table-separate-4.html table-separate-4-ref.html == 1115999-1.html 1115999-1-ref.html +== 1409114-1.html 1409114-1-ref.html +!= 1409114-2.html about:blank +!= 1409114-3.html about:blank diff --git a/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html b/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html index bb03f1525..9ec969236 100644 --- a/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html +++ b/layout/reftests/table-background/border-collapse-opacity-table-column-group-ref.html @@ -10,8 +10,6 @@ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; } body { padding: 15px; } - .o { opacity: 0.5; } - /* table { margin: 0px 3px 2px 4px; @@ -55,8 +53,8 @@ </head> <body> -<div class="color o"></div> -<div class="imagetl o"></div> +<div class="color"></div> +<div class="imagetl"></div> <div class="imagebr"></div> </body> diff --git a/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html b/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html index 7b7df902e..82795ef8b 100644 --- a/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html +++ b/layout/reftests/table-background/border-collapse-opacity-table-column-ref.html @@ -10,8 +10,6 @@ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; } body { padding: 15px; } - .o { opacity: 0.5; } - /* table { margin: 0px 3px 2px 4px; @@ -55,8 +53,8 @@ </head> <body> -<div class="color o"></div> -<div class="imagetl o"></div> +<div class="color"></div> +<div class="imagetl"></div> <div class="imagebr"></div> </body> diff --git a/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html b/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html index ad6ca2453..6985dae64 100644 --- a/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html +++ b/layout/reftests/table-background/border-separate-opacity-table-column-group-ref.html @@ -10,8 +10,6 @@ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; } body { padding: 15px; } - .o { opacity: 0.5; } - /* table { margin: 0px 3px 2px 4px; @@ -65,8 +63,8 @@ <body> <div class="color"></div> -<div class="imagetl o"></div> -<div class="imagebr o"></div> +<div class="imagetl"></div> +<div class="imagebr"></div> <div class="hstripe" style="top: 46px"></div> <div class="hstripe" style="top: 70px"></div> diff --git a/layout/reftests/table-background/border-separate-opacity-table-column-ref.html b/layout/reftests/table-background/border-separate-opacity-table-column-ref.html index e00193dc3..a6629347d 100644 --- a/layout/reftests/table-background/border-separate-opacity-table-column-ref.html +++ b/layout/reftests/table-background/border-separate-opacity-table-column-ref.html @@ -10,8 +10,6 @@ html, body { margin: 0; padding: 0; border: 0; font-size: 16px; } body { padding: 15px; } - .o { opacity: 0.5; } - /* table { margin: 0px 3px 2px 4px; @@ -65,8 +63,8 @@ <body> <div class="color"></div> -<div class="imagetl o"></div> -<div class="imagebr o"></div> +<div class="imagetl"></div> +<div class="imagebr"></div> <div class="hstripe" style="top: 46px"></div> <div class="hstripe" style="top: 70px"></div> diff --git a/layout/reftests/table-background/reftest.list b/layout/reftests/table-background/reftest.list index 68dc43e95..a89115ef4 100644 --- a/layout/reftests/table-background/reftest.list +++ b/layout/reftests/table-background/reftest.list @@ -60,3 +60,6 @@ fuzzy-if(d2d||skiaContent,1,95000) == border-separate-opacity-table.html border- == empty-cells-default-2.html empty-cells-default-2-ref.html fuzzy-if(OSX,1,113) fuzzy-if(winWidget,1,12) fuzzy-if(Android,1,39) fuzzy-if(winWidget&&!layersGPUAccelerated,82,116) fuzzy-if(skiaContent,84,5500) == table-row-opacity-dynamic-1.html table-row-opacity-dynamic-1-ref.html == table-row-opacity-dynamic-2.html table-row-opacity-dynamic-2-ref.html + +== table-col-overlapping.html table-col-overlapping-ref.html +== table-col-span-1.html table-col-span-1-ref.html diff --git a/layout/reftests/table-background/table-col-overlapping-ref.html b/layout/reftests/table-background/table-col-overlapping-ref.html new file mode 100644 index 000000000..37515fa28 --- /dev/null +++ b/layout/reftests/table-background/table-col-overlapping-ref.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<head> +<style> + td { + width: 20px; + height: 20px; + background-color: green; + } + table { + border-collapse:separate; + border-spacing: 0px; + } +</style> +</head> +<body> +<table> + <tr> + <td></td> + <td style="background-color: blue"></td> + <tr> + <td></td> + <td></td> + </tr> +</table> +</body> + +</html>
\ No newline at end of file diff --git a/layout/reftests/table-background/table-col-overlapping.html b/layout/reftests/table-background/table-col-overlapping.html new file mode 100644 index 000000000..69acab789 --- /dev/null +++ b/layout/reftests/table-background/table-col-overlapping.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<head> +<style> + td { + width: 20px; + height: 20px; + } + table { + border-collapse:separate; + border-spacing: 0px; + } +</style> +</head> +<body> +<table> + <col style="background: green"></col> + <col style="background: blue"></col> + <tr> + <td></td> + <td rowspan=2></td> + <tr> + <td colspan=2></td> + </tr> +</table> +</body> + +</html>
\ No newline at end of file diff --git a/layout/reftests/table-background/table-col-span-1-ref.html b/layout/reftests/table-background/table-col-span-1-ref.html new file mode 100644 index 000000000..dfe953ea4 --- /dev/null +++ b/layout/reftests/table-background/table-col-span-1-ref.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> +<body> + <table border> + <col style="background:purple"></col> + <col style="background:purple"></col> + <col style="background:blue"></col> + <tr> + <td>x</td> + <td>y</td> + <td>z</td> + </tr> + </table> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-background/table-col-span-1.html b/layout/reftests/table-background/table-col-span-1.html new file mode 100644 index 000000000..ee9f62d7e --- /dev/null +++ b/layout/reftests/table-background/table-col-span-1.html @@ -0,0 +1,15 @@ +<!DOCTYPE html> +<html> +<body> + <table border> + <col span=2 style="background:purple"></col> + <col style="background:blue"></col> + <tr> + <td>x</td> + <td>y</td> + <td>z</td> + </tr> + </table> +</body> + +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1375518-2.html b/layout/reftests/table-bordercollapse/bug1375518-2.html new file mode 100644 index 000000000..c36737622 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518-2.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<head> +<title>Table border collapse</title> +<style> + div > span { + display: table-cell; + background-color: black; + height: 100px; + width: 100px; + border-radius: 50px; + } + div { + display: table; + border-collapse: collapse; + } +</style> +</head> +<body> + <div><span></span></div> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1375518-3.html b/layout/reftests/table-bordercollapse/bug1375518-3.html new file mode 100644 index 000000000..1d188e19f --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518-3.html @@ -0,0 +1,22 @@ +<!DOCTYPE html> +<html> +<head> +<title>Separated border model table</title> +<style> + div > span { + display: table-cell; + background-color: black; + height: 100px; + width: 100px; + border-radius: 50px; + } + div { + display: table; + border-collapse: separate; + } +</style> +</head> +<body> + <div><span></span></div> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1375518-4-ref.html b/layout/reftests/table-bordercollapse/bug1375518-4-ref.html new file mode 100644 index 000000000..f9a8f07d7 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518-4-ref.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<title>border-radius and separated border model tables</title> +<style> + +body { background: white; color: black } + +table { border-collapse: separate; margin: 1em 2px; } +table, td { border: 1px solid black; } + +.radius { border: 3px solid teal; background: aqua; color: black; } + +</style> + +<h1>border-radius and separated border model tables</h1> + +<table> + <tbody> + <tr><td>xx</td><td>xx</td><td>xx + </td></tr></tbody> + <tbody class="radius"> + <tr><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx + </td></tr></tbody> + <tbody> + <tr><td>xx</td><td>xx</td><td>xx + </td></tr></tbody> +</table> + +<table> + <tbody><tr class="radius"><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx +</td></tr></tbody></table> + +<table> + <colgroup class="radius"><col><col></colgroup><colgroup><col> + </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx +</td></tr></tbody></table> + +<table> + <colgroup><col><col class="radius"><col> + </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx +</td></tr></tbody></table>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1375518-4.html b/layout/reftests/table-bordercollapse/bug1375518-4.html new file mode 100644 index 000000000..97aebd456 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518-4.html @@ -0,0 +1,44 @@ +<!DOCTYPE html> +<title>border-radius and separated border model tables</title> +<style> + +body { background: white; color: black } + +table { border-collapse: separate; margin: 1em 2px; } +table, td { border: 1px solid black; } + +.radius { border: 3px solid teal; background: aqua; color: black; border-radius: 12px } + +</style> + +<h1>border-radius and separated border model tables</h1> + +<table> + <tbody> + <tr><td>xx</td><td>xx</td><td>xx + </td></tr></tbody> + <tbody class="radius"> + <tr><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx + </td></tr></tbody> + <tbody> + <tr><td>xx</td><td>xx</td><td>xx + </td></tr></tbody> +</table> + +<table> + <tbody><tr class="radius"><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx +</td></tr></tbody></table> + +<table> + <colgroup class="radius"><col><col></colgroup><colgroup><col> + </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx +</td></tr></tbody></table> + +<table> + <colgroup><col><col class="radius"><col> + </colgroup><tbody><tr><td>xx</td><td>xx</td><td>xx + </td></tr><tr><td>xx</td><td>xx</td><td>xx +</td></tr></tbody></table>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1375518-5-ref.html b/layout/reftests/table-bordercollapse/bug1375518-5-ref.html new file mode 100644 index 000000000..eaf1710bc --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518-5-ref.html @@ -0,0 +1,44 @@ +<!DOCTYPE HTML> +<title>border-radius and border-collapse tables</title> +<style> + +body { background: white; color: black } + +table { border-collapse: collapse; margin: 1em 2px; } +td { border: 1px solid black; } + +.radius { border: 3px solid teal; background: aqua; color: black; } + +</style> + +<h1>border-radius and border-collapse tables</h1> + +<table> + <tbody> + <tr><td>xx<td>xx<td>xx + </tbody> + <tbody class="radius"> + <tr><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx + </tbody> + <tbody> + <tr><td>xx<td>xx<td>xx + </tbody> +</table> + +<table> + <tr class="radius"><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx +</table> + +<table> + <colgroup class="radius"><col><col><colgroup><col> + <tr><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx +</table> + +<table> + <col><col class="radius"><col> + <tr><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx +</table> diff --git a/layout/reftests/table-bordercollapse/bug1375518-5.html b/layout/reftests/table-bordercollapse/bug1375518-5.html new file mode 100644 index 000000000..7f123cd42 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518-5.html @@ -0,0 +1,44 @@ +<!DOCTYPE HTML> +<title>border-radius and border-collapse tables</title> +<style> + +body { background: white; color: black } + +table { border-collapse: collapse; margin: 1em 2px; } +td { border: 1px solid black; } + +.radius { border: 3px solid teal; background: aqua; color: black; border-radius: 12px } + +</style> + +<h1>border-radius and border-collapse tables</h1> + +<table> + <tbody> + <tr><td>xx<td>xx<td>xx + </tbody> + <tbody class="radius"> + <tr><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx + </tbody> + <tbody> + <tr><td>xx<td>xx<td>xx + </tbody> +</table> + +<table> + <tr class="radius"><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx +</table> + +<table> + <colgroup class="radius"><col><col><colgroup><col> + <tr><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx +</table> + +<table> + <col><col class="radius"><col> + <tr><td>xx<td>xx<td>xx + <tr><td>xx<td>xx<td>xx +</table> diff --git a/layout/reftests/table-bordercollapse/bug1375518-ref.html b/layout/reftests/table-bordercollapse/bug1375518-ref.html new file mode 100644 index 000000000..5d58d6839 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518-ref.html @@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html> +<head> +<title>Table border collapse</title> +<style> + div { + background-color: black; + height: 100px; + width: 100px; + border-radius: 50px; + } +</style> +</head> +<body> + <div></div> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1375518.html b/layout/reftests/table-bordercollapse/bug1375518.html new file mode 100644 index 000000000..101d92548 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1375518.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<head> +<title>Table border collapse</title> +<style> + table { + border-collapse: collapse; + height: 100px; + width: 100px; + } + td { + background-color: black; + border-radius: 50px; + } +</style> +</head> +<body> + <table> + <tr> + <td></td> + </tr> + </table> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1394226-notref.html b/layout/reftests/table-bordercollapse/bug1394226-notref.html new file mode 100644 index 000000000..7c4b694a9 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1394226-notref.html @@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html> +<head> +<title>Table border collapse</title> +<style> + table { + border-collapse: collapse; + } + tr.odd { + background-color: LightCyan; + } + tr.even { + background-color: LightSkyBlue; + } + td { + border: 5px solid DarkBlue; + } + .inner td { + border: 5px solid red; + } + .inner tr:first-child td { + border-top: 5px solid DarkBlue; + } + .inner tr td:first-child { + border-left: 5px solid DarkBlue; + } + .inner tr:last-child td { + border-bottom: 5px solid DarkBlue; + } + .inner tr td:last-child { + border-right: 5px solid DarkBlue; + } + div { + height: 10px; + } +</style> +</head> +<body> + <div></div> + <table> + <caption></caption> + <tr class="odd"> + <td>Cell 1-1</td> + <td>Cell 1-2</td> + </tr> + <tr class="even"> + <td>Cell 2-1</td> + <td>Cell 2-2 + <table class="inner"> + <tr class="odd"> + <td>Cell 2-2/1-1</td> + <td>Cell 2-2/1-2</td> + </tr> + <tr class="even"> + <td>Cell 2-2/2-1</td> + <td>Cell 2-2/2-2</td> + </tr> + </table> + </td> + </tr> + </table> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1394226-ref.html b/layout/reftests/table-bordercollapse/bug1394226-ref.html new file mode 100644 index 000000000..11c72d4bb --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1394226-ref.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html> +<head> +<title>Table border collapse</title> +<style> + table { + border-collapse: collapse; + } + tr.odd { + background-color: LightCyan; + } + tr.even { + background-color: LightSkyBlue; + } + td { + border: 5px solid DarkBlue; + } + div { + height: 10px; + } +</style> +</head> +<body> + <div></div> + <table> + <tr class="odd"> + <td>Cell 1-1</td> + <td>Cell 1-2</td> + </tr> + <tr class="even"> + <td>Cell 2-1</td> + <td>Cell 2-2 + <table> + <tr class="odd"> + <td>Cell 2-2/1-1</td> + <td>Cell 2-2/1-2</td> + </tr> + <tr class="even"> + <td>Cell 2-2/2-1</td> + <td>Cell 2-2/2-2</td> + </tr> + </table> + </td> + </tr> + </table> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/bug1394226.html b/layout/reftests/table-bordercollapse/bug1394226.html new file mode 100644 index 000000000..04c8ab173 --- /dev/null +++ b/layout/reftests/table-bordercollapse/bug1394226.html @@ -0,0 +1,47 @@ +<!DOCTYPE html> +<html> +<head> +<title>Table border collapse</title> +<style> + table { + border-collapse: collapse; + } + tr.odd { + background-color: LightCyan; + } + tr.even { + background-color: LightSkyBlue; + } + td { + border: 5px solid DarkBlue; + } + caption { + height: 10px + } +</style> +</head> +<body> + <table> + <caption></caption> + <tr class="odd"> + <td>Cell 1-1</td> + <td>Cell 1-2</td> + </tr> + <tr class="even"> + <td>Cell 2-1</td> + <td>Cell 2-2 + <table> + <tr class="odd"> + <td>Cell 2-2/1-1</td> + <td>Cell 2-2/1-2</td> + </tr> + <tr class="even"> + <td>Cell 2-2/2-1</td> + <td>Cell 2-2/2-2</td> + </tr> + </table> + </td> + </tr> + </table> +</body> +</html>
\ No newline at end of file diff --git a/layout/reftests/table-bordercollapse/reftest.list b/layout/reftests/table-bordercollapse/reftest.list index 5ca6f305a..2610d202d 100644 --- a/layout/reftests/table-bordercollapse/reftest.list +++ b/layout/reftests/table-bordercollapse/reftest.list @@ -1,3 +1,10 @@ +== bug1375518.html bug1375518-ref.html +== bug1375518-2.html bug1375518-ref.html +== bug1375518-3.html bug1375518-ref.html +== bug1375518-4.html bug1375518-4-ref.html +== bug1375518-5.html bug1375518-5-ref.html +== bug1394226.html bug1394226-ref.html +!= bug1394226.html bug1394226-notref.html == bc_dyn_cell1.html bc_dyn_cell1_ref.html == bc_dyn_cell2.html bc_dyn_cell2_ref.html == bc_dyn_cell3.html bc_dyn_cell3_ref.html diff --git a/layout/style/CSSLexer.h b/layout/style/CSSLexer.h index 8b41d2778..4eff7a528 100644 --- a/layout/style/CSSLexer.h +++ b/layout/style/CSSLexer.h @@ -9,6 +9,7 @@ #include "mozilla/UniquePtr.h" #include "nsCSSScanner.h" #include "mozilla/dom/CSSLexerBinding.h" +#include "mozilla/dom/NonRefcountedDOMObject.h" namespace mozilla { namespace dom { diff --git a/layout/style/CSSStyleSheet.cpp b/layout/style/CSSStyleSheet.cpp index 71ca6e3f2..9404fa713 100644 --- a/layout/style/CSSStyleSheet.cpp +++ b/layout/style/CSSStyleSheet.cpp @@ -47,6 +47,7 @@ #include "mozilla/RuleProcessorCache.h" #include "nsIStyleSheetLinkingElement.h" #include "nsDOMWindowUtils.h" +#include "nsStyleSet.h" using namespace mozilla; using namespace mozilla::dom; diff --git a/layout/style/Declaration.cpp b/layout/style/Declaration.cpp index b2de159ed..9d7ca312c 100644 --- a/layout/style/Declaration.cpp +++ b/layout/style/Declaration.cpp @@ -14,6 +14,7 @@ #include "mozilla/css/Declaration.h" #include "nsPrintfCString.h" #include "gfxFontConstants.h" +#include "nsCSSRules.h" #include "nsStyleUtil.h" namespace mozilla { diff --git a/layout/style/RuleProcessorCache.cpp b/layout/style/RuleProcessorCache.cpp index 23832c230..e2e788c56 100644 --- a/layout/style/RuleProcessorCache.cpp +++ b/layout/style/RuleProcessorCache.cpp @@ -13,6 +13,7 @@ #include <algorithm> #include "nsCSSRuleProcessor.h" #include "nsThreadUtils.h" +#include "CSSStyleSheet.h" using namespace mozilla; diff --git a/layout/style/ServoStyleSet.cpp b/layout/style/ServoStyleSet.cpp index 519d17aa8..f0230b55b 100644 --- a/layout/style/ServoStyleSet.cpp +++ b/layout/style/ServoStyleSet.cpp @@ -6,6 +6,7 @@ #include "mozilla/ServoStyleSet.h" +#include "ServoBindings.h" #include "mozilla/ServoRestyleManager.h" #include "mozilla/dom/ChildIterator.h" #include "nsCSSAnonBoxes.h" diff --git a/layout/style/ServoStyleSheet.cpp b/layout/style/ServoStyleSheet.cpp index cfeae20d2..340ecc22a 100644 --- a/layout/style/ServoStyleSheet.cpp +++ b/layout/style/ServoStyleSheet.cpp @@ -4,8 +4,12 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "ServoBindings.h" #include "mozilla/ServoStyleSheet.h" #include "mozilla/StyleBackendType.h" +#include "CSSRuleList.h" + +using namespace mozilla::dom; namespace mozilla { diff --git a/layout/style/StyleRule.cpp b/layout/style/StyleRule.cpp index 598cb7c74..6c374404d 100644 --- a/layout/style/StyleRule.cpp +++ b/layout/style/StyleRule.cpp @@ -36,6 +36,7 @@ class nsIDOMCSSStyleDeclaration; class nsIDOMCSSStyleSheet; using namespace mozilla; +using namespace mozilla::dom; #define NS_IF_CLONE(member_) \ PR_BEGIN_MACRO \ diff --git a/layout/style/StyleSheet.cpp b/layout/style/StyleSheet.cpp index f307f3918..1a7178edb 100644 --- a/layout/style/StyleSheet.cpp +++ b/layout/style/StyleSheet.cpp @@ -6,14 +6,19 @@ #include "mozilla/StyleSheet.h" +#include "mozilla/dom/BindingDeclarations.h" // for Optional<> #include "mozilla/dom/CSSRuleList.h" #include "mozilla/dom/ShadowRoot.h" #include "mozilla/ServoStyleSheet.h" #include "mozilla/StyleSheetInlines.h" #include "mozilla/CSSStyleSheet.h" +#include "mozAutoDocUpdate.h" +#include "nsIMediaList.h" #include "nsNullPrincipal.h" +using namespace mozilla::dom; + namespace mozilla { StyleSheet::StyleSheet(StyleBackendType aType, css::SheetParsingMode aParsingMode) diff --git a/layout/style/moz.build b/layout/style/moz.build index 3dc2a19af..ff06b5101 100644 --- a/layout/style/moz.build +++ b/layout/style/moz.build @@ -139,7 +139,7 @@ EXPORTS.mozilla.css += [ 'StyleRule.h', ] -UNIFIED_SOURCES += [ +SOURCES += [ 'AnimationCollection.cpp', 'AnimationCommon.cpp', 'CounterStyleManager.cpp', @@ -169,6 +169,7 @@ UNIFIED_SOURCES += [ 'nsCSSProps.cpp', 'nsCSSPseudoClasses.cpp', 'nsCSSPseudoElements.cpp', + 'nsCSSRuleProcessor.cpp', 'nsCSSRules.cpp', 'nsCSSScanner.cpp', 'nsCSSValue.cpp', @@ -181,6 +182,7 @@ UNIFIED_SOURCES += [ 'nsFontFaceUtils.cpp', 'nsHTMLCSSStyleSheet.cpp', 'nsHTMLStyleSheet.cpp', + 'nsLayoutStylesheetCache.cpp', 'nsMediaFeatures.cpp', 'nsNthIndexCache.cpp', 'nsROCSSPrimitiveValue.cpp', @@ -206,14 +208,6 @@ UNIFIED_SOURCES += [ 'SVGAttrAnimationRuleProcessor.cpp', ] -# nsCSSRuleProcessor.cpp needs to be built separately because it uses plarena.h. -# nsLayoutStylesheetCache.cpp needs to be built separately because it uses -# nsExceptionHandler.h, which includes windows.h. -SOURCES += [ - 'nsCSSRuleProcessor.cpp', - 'nsLayoutStylesheetCache.cpp', -] - EXTRA_COMPONENTS += [ 'CSSUnprefixingService.js', 'CSSUnprefixingService.manifest', diff --git a/layout/style/nsAnimationManager.cpp b/layout/style/nsAnimationManager.cpp index aa1b6fe78..268117738 100644 --- a/layout/style/nsAnimationManager.cpp +++ b/layout/style/nsAnimationManager.cpp @@ -11,6 +11,7 @@ #include "mozilla/EffectSet.h" #include "mozilla/MemoryReporting.h" #include "mozilla/StyleAnimationValue.h" +#include "mozilla/dom/AnimationEffectReadOnly.h" #include "mozilla/dom/DocumentTimeline.h" #include "mozilla/dom/KeyframeEffectReadOnly.h" @@ -30,6 +31,7 @@ using namespace mozilla; using namespace mozilla::css; using mozilla::dom::Animation; using mozilla::dom::AnimationPlayState; +using mozilla::dom::AnimationEffectReadOnly; using mozilla::dom::KeyframeEffectReadOnly; using mozilla::dom::CSSAnimation; diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h index e67e1d41d..aabbac07a 100644 --- a/layout/style/nsCSSProps.h +++ b/layout/style/nsCSSProps.h @@ -345,7 +345,7 @@ public: // KTableEntry objects can be initialized either with an int16_t value // or a value of an enumeration type that can fit within an int16_t. - constexpr KTableEntry(nsCSSKeyword aKeyword, int16_t aValue) + KTableEntry(nsCSSKeyword aKeyword, int16_t aValue) : mKeyword(aKeyword) , mValue(aValue) { @@ -353,7 +353,7 @@ public: template<typename T, typename = typename std::enable_if<std::is_enum<T>::value>::type> - constexpr KTableEntry(nsCSSKeyword aKeyword, T aValue) + KTableEntry(nsCSSKeyword aKeyword, T aValue) : mKeyword(aKeyword) , mValue(static_cast<int16_t>(aValue)) { diff --git a/layout/style/nsCSSPseudoClassList.h b/layout/style/nsCSSPseudoClassList.h index 701578338..ec7bfcb77 100644 --- a/layout/style/nsCSSPseudoClassList.h +++ b/layout/style/nsCSSPseudoClassList.h @@ -38,6 +38,8 @@ * automatically defined to CSS_PSEUDO_CLASS. */ +#include "nsCSSPseudoElements.h" + // OUTPUT_CLASS=nsCSSPseudoClasses // MACRO_NAME=CSS_PSEUDO_CLASS diff --git a/layout/style/nsCSSPseudoClasses.cpp b/layout/style/nsCSSPseudoClasses.cpp index 9b26459dd..a174525b1 100644 --- a/layout/style/nsCSSPseudoClasses.cpp +++ b/layout/style/nsCSSPseudoClasses.cpp @@ -13,6 +13,7 @@ #include "nsString.h" using namespace mozilla; +using namespace mozilla::css; // define storage for all atoms #define CSS_PSEUDO_CLASS(_name, _value, _flags, _pref) \ diff --git a/layout/style/nsCSSPseudoClasses.h b/layout/style/nsCSSPseudoClasses.h index ca1cb2f39..55e5bf9d2 100644 --- a/layout/style/nsCSSPseudoClasses.h +++ b/layout/style/nsCSSPseudoClasses.h @@ -9,6 +9,8 @@ #define nsCSSPseudoClasses_h___ #include "nsStringFwd.h" +#include "mozilla/CSSEnabledState.h" +#include "nsStyleStruct.h" // The following two flags along with the pref defines where this pseudo // class can be used: diff --git a/layout/style/nsCSSScanner.cpp b/layout/style/nsCSSScanner.cpp index 2110be78c..b1524a3bb 100644 --- a/layout/style/nsCSSScanner.cpp +++ b/layout/style/nsCSSScanner.cpp @@ -14,6 +14,8 @@ #include "mozilla/Likely.h" #include <algorithm> +using mozilla::IsNaN; + /* Character class tables and related helper functions. */ static const uint8_t IS_HEX_DIGIT = 0x01; diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index baf5b7897..0a905a055 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -6,11 +6,12 @@ /* representation of simple property values within CSS declarations */ +#include "mozilla/ArrayUtils.h" + #include "nsCSSValue.h" #include "mozilla/StyleSheetInlines.h" #include "mozilla/Likely.h" -#include "mozilla/MemoryReporting.h" #include "mozilla/Move.h" #include "mozilla/css/ImageLoader.h" #include "CSSCalc.h" @@ -18,8 +19,6 @@ #include "imgIRequest.h" #include "imgRequestProxy.h" #include "nsIDocument.h" -#include "nsIPrincipal.h" -#include "nsCSSProps.h" #include "nsNetUtil.h" #include "nsPresContext.h" #include "nsStyleUtil.h" @@ -27,7 +26,9 @@ #include "nsStyleSet.h" #include "nsContentUtils.h" + using namespace mozilla; +using namespace mozilla::css; static bool IsLocalRefURL(nsStringBuffer* aString) diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 910c1de8a..db39ef727 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -54,6 +54,8 @@ using namespace mozilla; using namespace mozilla::dom; +typedef nsCSSProps::KTableEntry KTableEntry; + #if defined(DEBUG_bzbarsky) || defined(DEBUG_caillon) #define DEBUG_ComputedDOMStyle #endif diff --git a/layout/style/nsDOMCSSAttrDeclaration.cpp b/layout/style/nsDOMCSSAttrDeclaration.cpp index ce638a9c2..f94998478 100644 --- a/layout/style/nsDOMCSSAttrDeclaration.cpp +++ b/layout/style/nsDOMCSSAttrDeclaration.cpp @@ -10,6 +10,7 @@ #include "mozilla/css/Declaration.h" #include "mozilla/css/StyleRule.h" #include "mozilla/dom/Element.h" +#include "mozilla/dom/DocGroup.h" #include "nsIDocument.h" #include "nsIDOMMutationEvent.h" #include "nsIURI.h" @@ -17,8 +18,12 @@ #include "nsWrapperCacheInlines.h" #include "nsIFrame.h" #include "ActiveLayerTracker.h" +#include "ServoDeclarationBlock.h" +#include "StyleSetHandle.h" +#include "DeclarationBlockInlines.h" using namespace mozilla; +using namespace mozilla::dom; nsDOMCSSAttributeDeclaration::nsDOMCSSAttributeDeclaration(dom::Element* aElement, bool aIsSMILOverride) diff --git a/layout/style/nsMediaFeatures.cpp b/layout/style/nsMediaFeatures.cpp index 854236e51..f33f8dd33 100644 --- a/layout/style/nsMediaFeatures.cpp +++ b/layout/style/nsMediaFeatures.cpp @@ -19,6 +19,7 @@ #include "nsDeviceContext.h" #include "nsIBaseWindow.h" #include "nsIDocument.h" +#include "nsIWidget.h" #include "nsContentUtils.h" #include "mozilla/StyleSheet.h" #include "mozilla/StyleSheetInlines.h" diff --git a/layout/style/nsStyleContext.cpp b/layout/style/nsStyleContext.cpp index 7ad260f1b..4b1a14897 100644 --- a/layout/style/nsStyleContext.cpp +++ b/layout/style/nsStyleContext.cpp @@ -12,6 +12,8 @@ #include "nsCSSAnonBoxes.h" #include "nsCSSPseudoElements.h" #include "nsStyleConsts.h" +#include "nsStyleStruct.h" +#include "nsStyleStructInlines.h" #include "nsString.h" #include "nsPresContext.h" #include "nsIStyleRule.h" @@ -35,6 +37,7 @@ #include "mozilla/ReflowInput.h" #include "nsLayoutUtils.h" #include "nsCoord.h" +#include "nsFontMetrics.h" // Ensure the binding function declarations in nsStyleContext.h matches // those in ServoBindings.h. diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index 72c103724..200f934c5 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -40,6 +40,7 @@ #include <algorithm> using namespace mozilla; +using namespace mozilla::dom; static_assert((((1 << nsStyleStructID_Length) - 1) & ~(NS_STYLE_INHERIT_MASK)) == 0, diff --git a/layout/style/nsStyleUtil.cpp b/layout/style/nsStyleUtil.cpp index 840cd03c3..5f51192bd 100644 --- a/layout/style/nsStyleUtil.cpp +++ b/layout/style/nsStyleUtil.cpp @@ -15,6 +15,7 @@ #include "nsIContentSecurityPolicy.h" #include "nsIURI.h" #include "nsPrintfCString.h" +#include "nsContentUtils.h" using namespace mozilla; diff --git a/layout/style/res/html.css b/layout/style/res/html.css index 1f572467f..44e41c8d0 100644 --- a/layout/style/res/html.css +++ b/layout/style/res/html.css @@ -637,7 +637,6 @@ hr[size="1"] { img:-moz-broken::before, input:-moz-broken::before, img:-moz-user-disabled::before, input:-moz-user-disabled::before, -img:-moz-loading::before, input:-moz-loading::before, applet:-moz-empty-except-children-with-localname(param):-moz-broken::before, applet:-moz-empty-except-children-with-localname(param):-moz-user-disabled::before { content: -moz-alt-content !important; diff --git a/layout/svg/SVGFEUnstyledLeafFrame.cpp b/layout/svg/SVGFEUnstyledLeafFrame.cpp index 083c0f27d..bc9258527 100644 --- a/layout/svg/SVGFEUnstyledLeafFrame.cpp +++ b/layout/svg/SVGFEUnstyledLeafFrame.cpp @@ -25,7 +25,6 @@ public: NS_DECL_FRAMEARENA_HELPERS virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} virtual bool IsFrameOfType(uint32_t aFlags) const override diff --git a/layout/svg/SVGTextFrame.cpp b/layout/svg/SVGTextFrame.cpp index 6ba267ee8..fe4df3f4d 100644 --- a/layout/svg/SVGTextFrame.cpp +++ b/layout/svg/SVGTextFrame.cpp @@ -37,6 +37,7 @@ #include "nsTextNode.h" #include "SVGAnimatedNumberList.h" #include "SVGContentUtils.h" +#include "SVGContextPaint.h" #include "SVGLengthList.h" #include "SVGNumberList.h" #include "SVGPathElement.h" @@ -3161,7 +3162,6 @@ SVGTextFrame::Init(nsIContent* aContent, void SVGTextFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (NS_SUBTREE_DIRTY(this)) { diff --git a/layout/svg/SVGTextFrame.h b/layout/svg/SVGTextFrame.h index 9c672c6a5..508ed1724 100644 --- a/layout/svg/SVGTextFrame.h +++ b/layout/svg/SVGTextFrame.h @@ -224,7 +224,6 @@ public: } virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** diff --git a/layout/svg/moz.build b/layout/svg/moz.build index b1481f4ef..69d5d2a3b 100644 --- a/layout/svg/moz.build +++ b/layout/svg/moz.build @@ -21,7 +21,7 @@ EXPORTS.mozilla += [ 'SVGContextPaint.h', ] -UNIFIED_SOURCES += [ +SOURCES += [ 'nsCSSClipPathInstance.cpp', 'nsCSSFilterInstance.cpp', 'nsFilterInstance.cpp', diff --git a/layout/svg/nsFilterInstance.cpp b/layout/svg/nsFilterInstance.cpp index fe52b8a8f..0735807ce 100644 --- a/layout/svg/nsFilterInstance.cpp +++ b/layout/svg/nsFilterInstance.cpp @@ -28,6 +28,7 @@ using namespace mozilla; using namespace mozilla::dom; using namespace mozilla::gfx; +using namespace mozilla::image; FilterDescription nsFilterInstance::GetFilterDescription(nsIContent* aFilteredElement, diff --git a/layout/svg/nsISVGChildFrame.h b/layout/svg/nsISVGChildFrame.h index c9fd0f12a..f74ff89c0 100644 --- a/layout/svg/nsISVGChildFrame.h +++ b/layout/svg/nsISVGChildFrame.h @@ -8,6 +8,7 @@ #include "gfxRect.h" #include "nsQueryFrame.h" +#include "imgIContainer.h" class gfxContext; class gfxMatrix; diff --git a/layout/svg/nsSVGClipPathFrame.h b/layout/svg/nsSVGClipPathFrame.h index 42a8d16ff..046ebb169 100644 --- a/layout/svg/nsSVGClipPathFrame.h +++ b/layout/svg/nsSVGClipPathFrame.h @@ -37,7 +37,6 @@ public: // nsIFrame methods: virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} // nsSVGClipPathFrame methods: diff --git a/layout/svg/nsSVGContainerFrame.cpp b/layout/svg/nsSVGContainerFrame.cpp index 750dcc9da..5c18cad42 100644 --- a/layout/svg/nsSVGContainerFrame.cpp +++ b/layout/svg/nsSVGContainerFrame.cpp @@ -17,6 +17,7 @@ #include "SVGTextFrame.h" using namespace mozilla; +using namespace mozilla::image; NS_QUERYFRAME_HEAD(nsSVGContainerFrame) NS_QUERYFRAME_ENTRY(nsSVGContainerFrame) @@ -140,7 +141,6 @@ nsSVGDisplayContainerFrame::Init(nsIContent* aContent, void nsSVGDisplayContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // mContent could be a XUL element so check for an SVG element before casting @@ -149,7 +149,7 @@ nsSVGDisplayContainerFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, return; } DisplayOutline(aBuilder, aLists); - return BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists); + return BuildDisplayListForNonBlockChildren(aBuilder, aLists); } void diff --git a/layout/svg/nsSVGContainerFrame.h b/layout/svg/nsSVGContainerFrame.h index f4a01e155..8a6cdd7ce 100644 --- a/layout/svg/nsSVGContainerFrame.h +++ b/layout/svg/nsSVGContainerFrame.h @@ -83,7 +83,6 @@ public: } virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} virtual bool ComputeCustomOverflow(nsOverflowAreas& aOverflowAreas) override; @@ -133,7 +132,6 @@ public: nsIFrame* aPrevInFlow) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual bool IsSVGTransformed(Matrix *aOwnTransform = nullptr, diff --git a/layout/svg/nsSVGFilterFrame.h b/layout/svg/nsSVGFilterFrame.h index 223c787f6..f2f321522 100644 --- a/layout/svg/nsSVGFilterFrame.h +++ b/layout/svg/nsSVGFilterFrame.h @@ -45,7 +45,6 @@ public: // nsIFrame methods: virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/svg/nsSVGFilterInstance.cpp b/layout/svg/nsSVGFilterInstance.cpp index 59b5a27ba..462c0098b 100644 --- a/layout/svg/nsSVGFilterInstance.cpp +++ b/layout/svg/nsSVGFilterInstance.cpp @@ -13,6 +13,7 @@ #include "mozilla/dom/HTMLCanvasElement.h" #include "mozilla/dom/SVGFilterElement.h" #include "nsReferencedElement.h" +#include "nsSVGEffects.h" #include "nsSVGFilterFrame.h" #include "nsSVGUtils.h" #include "SVGContentUtils.h" diff --git a/layout/svg/nsSVGForeignObjectFrame.cpp b/layout/svg/nsSVGForeignObjectFrame.cpp index afa5912d2..f8584a4f1 100644 --- a/layout/svg/nsSVGForeignObjectFrame.cpp +++ b/layout/svg/nsSVGForeignObjectFrame.cpp @@ -163,14 +163,13 @@ nsSVGForeignObjectFrame::Reflow(nsPresContext* aPresContext, void nsSVGForeignObjectFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!static_cast<const nsSVGElement*>(mContent)->HasValidDimensions()) { return; } DisplayOutline(aBuilder, aLists); - BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, aLists); + BuildDisplayListForNonBlockChildren(aBuilder, aLists); } bool diff --git a/layout/svg/nsSVGForeignObjectFrame.h b/layout/svg/nsSVGForeignObjectFrame.h index 57df6d5b5..4bb94bdab 100644 --- a/layout/svg/nsSVGForeignObjectFrame.h +++ b/layout/svg/nsSVGForeignObjectFrame.h @@ -47,7 +47,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** diff --git a/layout/svg/nsSVGIntegrationUtils.h b/layout/svg/nsSVGIntegrationUtils.h index e3eb3c5f2..471e3fb04 100644 --- a/layout/svg/nsSVGIntegrationUtils.h +++ b/layout/svg/nsSVGIntegrationUtils.h @@ -10,6 +10,7 @@ #include "gfxRect.h" #include "nsRegionFwd.h" #include "mozilla/gfx/Rect.h" +#include "imgIContainer.h" class gfxContext; class gfxDrawable; diff --git a/layout/svg/nsSVGMarkerFrame.cpp b/layout/svg/nsSVGMarkerFrame.cpp index 93b76b17f..af19cc025 100644 --- a/layout/svg/nsSVGMarkerFrame.cpp +++ b/layout/svg/nsSVGMarkerFrame.cpp @@ -15,6 +15,7 @@ using namespace mozilla::dom; using namespace mozilla::gfx; +using namespace mozilla::image; nsContainerFrame* NS_NewSVGMarkerFrame(nsIPresShell* aPresShell, nsStyleContext* aContext) diff --git a/layout/svg/nsSVGMarkerFrame.h b/layout/svg/nsSVGMarkerFrame.h index 22ac01709..187aed140 100644 --- a/layout/svg/nsSVGMarkerFrame.h +++ b/layout/svg/nsSVGMarkerFrame.h @@ -52,7 +52,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/svg/nsSVGMaskFrame.h b/layout/svg/nsSVGMaskFrame.h index 380306a48..2a9486fa5 100644 --- a/layout/svg/nsSVGMaskFrame.h +++ b/layout/svg/nsSVGMaskFrame.h @@ -73,7 +73,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} /** diff --git a/layout/svg/nsSVGOuterSVGFrame.cpp b/layout/svg/nsSVGOuterSVGFrame.cpp index b1ee54eb9..16dfc2b37 100644 --- a/layout/svg/nsSVGOuterSVGFrame.cpp +++ b/layout/svg/nsSVGOuterSVGFrame.cpp @@ -18,9 +18,12 @@ #include "mozilla/dom/SVGSVGElement.h" #include "mozilla/dom/SVGViewElement.h" #include "nsSubDocumentFrame.h" +#include "gfxMatrix.h" using namespace mozilla; using namespace mozilla::dom; +using namespace mozilla::gfx; +using namespace mozilla::image; //---------------------------------------------------------------------- // Implementation helpers @@ -731,7 +734,6 @@ nsSVGOuterSVGFrame::AttributeChanged(int32_t aNameSpaceID, void nsSVGOuterSVGFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (GetStateBits() & NS_FRAME_IS_NONDISPLAY) { @@ -755,7 +757,7 @@ nsSVGOuterSVGFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, nsDisplayList *contentList = aLists.Content(); nsDisplayListSet set(contentList, contentList, contentList, contentList, contentList, contentList); - BuildDisplayListForNonBlockChildren(aBuilder, aDirtyRect, set); + BuildDisplayListForNonBlockChildren(aBuilder, set); } else if (IsVisibleForPainting(aBuilder) || !aBuilder->IsForPainting()) { aLists.Content()->AppendNewToTop( new (aBuilder) nsDisplayOuterSVG(aBuilder, this)); diff --git a/layout/svg/nsSVGOuterSVGFrame.h b/layout/svg/nsSVGOuterSVGFrame.h index 6d29234ac..ee59b7d1c 100644 --- a/layout/svg/nsSVGOuterSVGFrame.h +++ b/layout/svg/nsSVGOuterSVGFrame.h @@ -66,7 +66,6 @@ public: virtual void UnionChildOverflow(nsOverflowAreas& aOverflowAreas) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Init(nsIContent* aContent, diff --git a/layout/svg/nsSVGPaintServerFrame.h b/layout/svg/nsSVGPaintServerFrame.h index 6b568f872..ff2c6f8b4 100644 --- a/layout/svg/nsSVGPaintServerFrame.h +++ b/layout/svg/nsSVGPaintServerFrame.h @@ -58,7 +58,6 @@ public: // nsIFrame methods: virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} virtual bool IsFrameOfType(uint32_t aFlags) const override diff --git a/layout/svg/nsSVGPathGeometryFrame.cpp b/layout/svg/nsSVGPathGeometryFrame.cpp index 32cd0e496..50eec2b92 100644 --- a/layout/svg/nsSVGPathGeometryFrame.cpp +++ b/layout/svg/nsSVGPathGeometryFrame.cpp @@ -259,7 +259,6 @@ nsSVGPathGeometryFrame::IsSVGTransformed(gfx::Matrix *aOwnTransform, void nsSVGPathGeometryFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!static_cast<const nsSVGElement*>(mContent)->HasValidDimensions() || diff --git a/layout/svg/nsSVGPathGeometryFrame.h b/layout/svg/nsSVGPathGeometryFrame.h index 6b7c75d97..d2d63f043 100644 --- a/layout/svg/nsSVGPathGeometryFrame.h +++ b/layout/svg/nsSVGPathGeometryFrame.h @@ -88,7 +88,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; // nsSVGPathGeometryFrame methods diff --git a/layout/svg/nsSVGStopFrame.cpp b/layout/svg/nsSVGStopFrame.cpp index 1b75fa102..28875ad25 100644 --- a/layout/svg/nsSVGStopFrame.cpp +++ b/layout/svg/nsSVGStopFrame.cpp @@ -36,7 +36,6 @@ public: #endif void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override {} virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/svg/nsSVGSwitchFrame.cpp b/layout/svg/nsSVGSwitchFrame.cpp index 26e77071b..3b71ff3fb 100644 --- a/layout/svg/nsSVGSwitchFrame.cpp +++ b/layout/svg/nsSVGSwitchFrame.cpp @@ -11,6 +11,7 @@ #include "nsSVGUtils.h" using namespace mozilla::gfx; +using namespace mozilla::image; class nsSVGSwitchFrame : public nsSVGGFrame { @@ -44,7 +45,6 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; // nsISVGChildFrame interface: @@ -93,12 +93,11 @@ nsSVGSwitchFrame::GetType() const void nsSVGSwitchFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { nsIFrame* kid = GetActiveChildFrame(); if (kid) { - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, kid, aLists); } } diff --git a/layout/svg/nsSVGUtils.cpp b/layout/svg/nsSVGUtils.cpp index c3394e292..103a4ce1a 100644 --- a/layout/svg/nsSVGUtils.cpp +++ b/layout/svg/nsSVGUtils.cpp @@ -58,6 +58,7 @@ using namespace mozilla; using namespace mozilla::dom; using namespace mozilla::gfx; +using namespace mozilla::image; static bool sSVGPathCachingEnabled; static bool sSVGDisplayListHitTestingEnabled; diff --git a/layout/tables/FixedTableLayoutStrategy.cpp b/layout/tables/FixedTableLayoutStrategy.cpp index 427765795..d69946a33 100644 --- a/layout/tables/FixedTableLayoutStrategy.cpp +++ b/layout/tables/FixedTableLayoutStrategy.cpp @@ -15,6 +15,10 @@ #include "nsTableCellFrame.h" #include <algorithm> +#include "mozilla/WritingModes.h" + +using namespace mozilla; + FixedTableLayoutStrategy::FixedTableLayoutStrategy(nsTableFrame *aTableFrame) : nsITableLayoutStrategy(nsITableLayoutStrategy::Fixed) , mTableFrame(aTableFrame) diff --git a/layout/tables/SpanningCellSorter.cpp b/layout/tables/SpanningCellSorter.cpp index c67d784bb..686b02d89 100644 --- a/layout/tables/SpanningCellSorter.cpp +++ b/layout/tables/SpanningCellSorter.cpp @@ -12,6 +12,8 @@ #include "nsQuickSort.h" #include "nsIPresShell.h" +using mozilla::fallible; + //#define DEBUG_SPANNING_CELL_SORTER SpanningCellSorter::SpanningCellSorter() diff --git a/layout/tables/crashtests/crashtests.list b/layout/tables/crashtests/crashtests.list index f110053f1..40b1ba82e 100644 --- a/layout/tables/crashtests/crashtests.list +++ b/layout/tables/crashtests/crashtests.list @@ -109,7 +109,7 @@ asserts(8) load 420654-1.xhtml # bug 458238, bug 436123, bug 457397 load 423514-1.xhtml load 430374.html load 444431-1.html -load 444702-1.html +asserts(1) load 444702-1.html # nscoord overflow. load 448988-1.xhtml load 450311-1.html load 451170.html diff --git a/layout/tables/moz.build b/layout/tables/moz.build index e28e21ee0..554ffebec 100644 --- a/layout/tables/moz.build +++ b/layout/tables/moz.build @@ -13,7 +13,7 @@ EXPORTS += [ 'nsITableCellLayout.h', ] -UNIFIED_SOURCES += [ +SOURCES += [ 'BasicTableLayoutStrategy.cpp', 'FixedTableLayoutStrategy.cpp', 'nsCellMap.cpp', diff --git a/layout/tables/nsTableCellFrame.cpp b/layout/tables/nsTableCellFrame.cpp index 8b811df1e..ee05565a9 100644 --- a/layout/tables/nsTableCellFrame.cpp +++ b/layout/tables/nsTableCellFrame.cpp @@ -450,7 +450,6 @@ nsTableCellFrame::ShouldPaintBackground(nsDisplayListBuilder* aBuilder) void nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { DO_GLOBAL_REFLOW_COUNT_DSP("nsTableCellFrame"); @@ -462,14 +461,14 @@ nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, new (aBuilder) nsDisplayBoxShadowOuter(aBuilder, this)); } + nsRect bgRect = GetRectRelativeToSelf() + aBuilder->ToReferenceFrame(this); + // display background if we need to. if (aBuilder->IsForEventDelivery() || !StyleBackground()->IsTransparent() || StyleDisplay()->mAppearance) { - nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder, - this, - GetRectRelativeToSelf(), - aLists.BorderBackground()); + nsDisplayBackgroundImage::AppendBackgroundItemsToTop( + aBuilder, this, bgRect, aLists.BorderBackground()); } // display inset box-shadows if we need to. @@ -488,16 +487,49 @@ nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, "TableCellSelection", nsDisplayItem::TYPE_TABLE_CELL_SELECTION)); } + + // This can be null if display list building initiated in the middle + // of the table, which can happen with background-clip:text and + // -moz-element. + nsDisplayTableBackgroundSet* backgrounds = + aBuilder->GetTableBackgroundSet(); + if (backgrounds) { + // Compute bgRect relative to reference frame, but using the + // normal (without position:relative offsets) positions for the + // cell, row and row group. + bgRect = GetRectRelativeToSelf() + GetNormalPosition(); + + nsTableRowFrame* row = GetTableRowFrame(); + bgRect += row->GetNormalPosition(); + + nsTableRowGroupFrame* rowGroup = row->GetTableRowGroupFrame(); + bgRect += rowGroup->GetNormalPosition(); + + bgRect += backgrounds->TableToReferenceFrame(); + + // Create backgrounds items as needed for the column and column + // group that this cell occupies. + nsTableColFrame* col = backgrounds->GetColForIndex(ColIndex()); + nsTableColGroupFrame* colGroup = col->GetTableColGroupFrame(); + + Maybe<nsDisplayListBuilder::AutoBuildingDisplayList> buildingForColGroup; + nsDisplayBackgroundImage::AppendBackgroundItemsToTop( + aBuilder, colGroup, bgRect, backgrounds->ColGroupBackgrounds(), false, + nullptr, colGroup->GetRect() + backgrounds->TableToReferenceFrame(), + this, &buildingForColGroup); + + Maybe<nsDisplayListBuilder::AutoBuildingDisplayList> buildingForCol; + nsDisplayBackgroundImage::AppendBackgroundItemsToTop( + aBuilder, col, bgRect, backgrounds->ColBackgrounds(), false, nullptr, + col->GetRect() + colGroup->GetPosition() + + backgrounds->TableToReferenceFrame(), + this, &buildingForCol); + } } // the 'empty-cells' property has no effect on 'outline' DisplayOutline(aBuilder, aLists); - // Push a null 'current table item' so that descendant tables can't - // accidentally mess with our table - nsAutoPushCurrentTableItem pushTableItem; - pushTableItem.Push(aBuilder, nullptr); - nsIFrame* kid = mFrames.FirstChild(); NS_ASSERTION(kid && !kid->GetNextSibling(), "Table cells should have just one child"); // The child's background will go in our BorderBackground() list. @@ -506,7 +538,7 @@ nsTableCellFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // because that/ would put the child's background in the Content() list // which isn't right (e.g., would end up on top of our child floats for // event handling). - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, kid, aLists); } nsIFrame::LogicalSides @@ -1076,18 +1108,6 @@ nsBCTableCellFrame::GetUsedBorder() const return GetBorderWidth(wm).GetPhysicalMargin(wm); } -/* virtual */ bool -nsBCTableCellFrame::GetBorderRadii(const nsSize& aFrameSize, - const nsSize& aBorderArea, - Sides aSkipSides, - nscoord aRadii[8]) const -{ - NS_FOR_CSS_HALF_CORNERS(corner) { - aRadii[corner] = 0; - } - return false; -} - #ifdef DEBUG_FRAME_DUMP nsresult nsBCTableCellFrame::GetFrameName(nsAString& aResult) const diff --git a/layout/tables/nsTableCellFrame.h b/layout/tables/nsTableCellFrame.h index f626a45b0..2acd59667 100644 --- a/layout/tables/nsTableCellFrame.h +++ b/layout/tables/nsTableCellFrame.h @@ -104,7 +104,6 @@ public: virtual bool NeedsToObserve(const ReflowInput& aReflowInput) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult ProcessBorders(nsTableFrame* aFrame, @@ -341,10 +340,6 @@ public: virtual nsIAtom* GetType() const override; virtual nsMargin GetUsedBorder() const override; - virtual bool GetBorderRadii(const nsSize& aFrameSize, - const nsSize& aBorderArea, - Sides aSkipSides, - nscoord aRadii[8]) const override; // Get the *inner half of the border only*, in twips. virtual LogicalMargin GetBorderWidth(WritingMode aWM) const override; diff --git a/layout/tables/nsTableColFrame.cpp b/layout/tables/nsTableColFrame.cpp index 54b03522b..6723f4701 100644 --- a/layout/tables/nsTableColFrame.cpp +++ b/layout/tables/nsTableColFrame.cpp @@ -110,10 +110,15 @@ nsTableColFrame::Reflow(nsPresContext* aPresContext, void nsTableColFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists); + // Per https://drafts.csswg.org/css-tables-3/#global-style-overrides: + // "All css properties of table-column and table-column-group boxes are + // ignored, except when explicitly specified by this specification." + // CSS outlines and box-shadows fall into this category, so we skip them + // on these boxes. + + MOZ_ASSERT_UNREACHABLE("Cols don't paint themselves"); } int32_t nsTableColFrame::GetSpan() diff --git a/layout/tables/nsTableColFrame.h b/layout/tables/nsTableColFrame.h index fb989061f..ed6a843b6 100644 --- a/layout/tables/nsTableColFrame.h +++ b/layout/tables/nsTableColFrame.h @@ -60,7 +60,6 @@ public: nsReflowStatus& aStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** diff --git a/layout/tables/nsTableColGroupFrame.cpp b/layout/tables/nsTableColGroupFrame.cpp index 6ee7f0b24..be5b71bb2 100644 --- a/layout/tables/nsTableColGroupFrame.cpp +++ b/layout/tables/nsTableColGroupFrame.cpp @@ -385,10 +385,15 @@ nsTableColGroupFrame::Reflow(nsPresContext* aPresContext, void nsTableColGroupFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists); + // Per https://drafts.csswg.org/css-tables-3/#global-style-overrides: + // "All css properties of table-column and table-column-group boxes are + // ignored, except when explicitly specified by this specification." + // CSS outlines and box-shadows fall into this category, so we skip them + // on these boxes. + + MOZ_ASSERT_UNREACHABLE("Colgroups don't paint themselves"); } nsTableColFrame * nsTableColGroupFrame::GetFirstColumn() diff --git a/layout/tables/nsTableColGroupFrame.h b/layout/tables/nsTableColGroupFrame.h index b3dfb94e7..88ed67c2a 100644 --- a/layout/tables/nsTableColGroupFrame.h +++ b/layout/tables/nsTableColGroupFrame.h @@ -44,7 +44,6 @@ public: } virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** A colgroup can be caused by three things: diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index e5a48139a..59a6d0f1a 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -41,6 +41,7 @@ #include "nsCSSFrameConstructor.h" #include "mozilla/StyleSetHandle.h" #include "mozilla/StyleSetHandleInlines.h" +#include "mozilla/gfx/Helpers.h" #include "nsDisplayList.h" #include "nsIScrollableFrame.h" #include "nsCSSProps.h" @@ -48,6 +49,7 @@ #include <algorithm> using namespace mozilla; +using namespace mozilla::gfx; using namespace mozilla::image; using namespace mozilla::layout; @@ -174,6 +176,9 @@ nsTableFrame::Init(nsIContent* aContent, const nsStyleTableBorder* tableStyle = StyleTableBorder(); bool borderCollapse = (NS_STYLE_BORDER_COLLAPSE == tableStyle->mBorderCollapse); SetBorderCollapse(borderCollapse); + if (borderCollapse) { + SetNeedToCalcHasBCBorders(true); + } if (!aPrevInFlow) { // If we're the first-in-flow, we manage the cell map & layout strategy that @@ -1161,115 +1166,7 @@ nsDisplayTableBorderCollapse::Paint(nsDisplayListBuilder* aBuilder, static_cast<nsTableFrame*>(mFrame)->PaintBCBorders(*drawTarget, mVisibleRect - pt); } -/* static */ void -nsTableFrame::GenericTraversal(nsDisplayListBuilder* aBuilder, nsFrame* aFrame, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) -{ - // This is similar to what nsContainerFrame::BuildDisplayListForNonBlockChildren - // does, except that we allow the children's background and borders to go - // in our BorderBackground list. This doesn't really affect background - // painting --- the children won't actually draw their own backgrounds - // because the nsTableFrame already drew them, unless a child has its own - // stacking context, in which case the child won't use its passed-in - // BorderBackground list anyway. It does affect cell borders though; this - // lets us get cell borders into the nsTableFrame's BorderBackground list. - for (nsIFrame* kid : aFrame->GetChildList(kColGroupList)) { - aFrame->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); - } - - for (nsIFrame* kid : aFrame->PrincipalChildList()) { - aFrame->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); - } -} - -static void -PaintRowBackground(nsTableRowFrame* aRow, - nsIFrame* aFrame, - nsDisplayListBuilder* aBuilder, - const nsDisplayListSet& aLists, - const nsRect& aDirtyRect, - const nsPoint& aOffset = nsPoint()) -{ - // Compute background rect by iterating over all cell frames. - for (nsTableCellFrame* cell = aRow->GetFirstCell(); cell; cell = cell->GetNextCell()) { - if (!cell->ShouldPaintBackground(aBuilder)) { - continue; - } - - auto cellRect = cell->GetRectRelativeToSelf() + cell->GetNormalPosition() + aOffset; - if (!aDirtyRect.Intersects(cellRect)) { - continue; - } - nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder, aFrame, cellRect, - aLists.BorderBackground(), - true, nullptr, - aFrame->GetRectRelativeToSelf(), - cell); - } -} - -static void -PaintRowGroupBackground(nsTableRowGroupFrame* aRowGroup, - nsIFrame* aFrame, - nsDisplayListBuilder* aBuilder, - const nsDisplayListSet& aLists, - const nsRect& aDirtyRect) -{ - for (nsTableRowFrame* row = aRowGroup->GetFirstRow(); row; row = row->GetNextRow()) { - if (!aDirtyRect.Intersects(nsRect(row->GetNormalPosition(), row->GetSize()))) { - continue; - } - PaintRowBackground(row, aFrame, aBuilder, aLists, aDirtyRect, row->GetNormalPosition()); - } -} - -static void -PaintRowGroupBackgroundByColIdx(nsTableRowGroupFrame* aRowGroup, - nsIFrame* aFrame, - nsDisplayListBuilder* aBuilder, - const nsDisplayListSet& aLists, - const nsRect& aDirtyRect, - const nsTArray<uint32_t>& aColIdx, - const nsPoint& aOffset) -{ - MOZ_DIAGNOSTIC_ASSERT(!aColIdx.IsEmpty(), - "Must be painting backgrounds for something"); - for (nsTableRowFrame* row = aRowGroup->GetFirstRow(); row; row = row->GetNextRow()) { - auto rowPos = row->GetNormalPosition() + aOffset; - if (!aDirtyRect.Intersects(nsRect(rowPos, row->GetSize()))) { - continue; - } - for (nsTableCellFrame* cell = row->GetFirstCell(); cell; cell = cell->GetNextCell()) { - - uint32_t curColIdx = cell->ColIndex(); - if (!aColIdx.Contains(curColIdx)) { - if (curColIdx > aColIdx.LastElement()) { - // We can just stop looking at this row. - break; - } - continue; - } - - if (!cell->ShouldPaintBackground(aBuilder)) { - continue; - } - - auto cellPos = cell->GetNormalPosition() + rowPos; - auto cellRect = nsRect(cellPos, cell->GetSize()); - if (!aDirtyRect.Intersects(cellRect)) { - continue; - } - nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder, aFrame, cellRect, - aLists.BorderBackground(), - true, nullptr, - aFrame->GetRectRelativeToSelf(), - cell); - } - } -} - -static inline bool FrameHasBorder(nsIFrame* f) -{ +static inline bool FrameHasBorder(nsIFrame* f) { if (!f->StyleVisibility()->IsVisible()) { return false; } @@ -1281,8 +1178,7 @@ static inline bool FrameHasBorder(nsIFrame* f) return false; } -void nsTableFrame::CalcHasBCBorders() -{ +void nsTableFrame::CalcHasBCBorders() { if (!IsBorderCollapse()) { SetHasBCBorders(false); return; @@ -1300,8 +1196,9 @@ void nsTableFrame::CalcHasBCBorders() return; } - nsTableColGroupFrame *colGroup = static_cast<nsTableColGroupFrame*>(f); - for (nsTableColFrame* col = colGroup->GetFirstColumn(); col; col = col->GetNextCol()) { + nsTableColGroupFrame* colGroup = static_cast<nsTableColGroupFrame*>(f); + for (nsTableColFrame* col = colGroup->GetFirstColumn(); col; + col = col->GetNextCol()) { if (FrameHasBorder(col)) { SetHasBCBorders(true); return; @@ -1318,13 +1215,15 @@ void nsTableFrame::CalcHasBCBorders() return; } - for (nsTableRowFrame* row = rowGroup->GetFirstRow(); row; row = row->GetNextRow()) { + for (nsTableRowFrame* row = rowGroup->GetFirstRow(); row; + row = row->GetNextRow()) { if (FrameHasBorder(row)) { SetHasBCBorders(true); return; } - for (nsTableCellFrame* cell = row->GetFirstCell(); cell; cell = cell->GetNextCell()) { + for (nsTableCellFrame* cell = row->GetFirstCell(); cell; + cell = cell->GetNextCell()) { if (FrameHasBorder(cell)) { SetHasBCBorders(true); return; @@ -1336,140 +1235,58 @@ void nsTableFrame::CalcHasBCBorders() SetHasBCBorders(false); } -/* static */ void -nsTableFrame::DisplayGenericTablePart(nsDisplayListBuilder* aBuilder, - nsFrame* aFrame, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists, - DisplayGenericTablePartTraversal aTraversal) -{ - bool isVisible = aFrame->IsVisibleForPainting(aBuilder); - bool isTable = (aFrame->GetType() == nsGkAtoms::tableFrame); - - if (isVisible || !isTable) { - nsDisplayTableItem* currentItem = aBuilder->GetCurrentTableItem(); - // currentItem may be null, when none of the table parts have a - // background or border - if (currentItem) { - currentItem->UpdateForFrameBackground(aFrame); - } - } - - if (isVisible) { - // XXX: should box-shadow for rows/rowgroups/columns/colgroups get painted - // just because we're visible? Or should it depend on the cell visibility - // when we're not the whole table? - - // Paint the outset box-shadows for the table frames - if (aFrame->StyleEffects()->mBoxShadow) { - aLists.BorderBackground()->AppendNewToTop( - new (aBuilder) nsDisplayBoxShadowOuter(aBuilder, aFrame)); - } - } - - // Background visibility for rows, rowgroups, columns, colgroups depends on - // the visibility of the _cell_, not of the row/col(group). - // See spec at https://drafts.csswg.org/css-tables-3/#drawing-cell-backgrounds - if (aFrame->GetType() == nsGkAtoms::tableRowGroupFrame) { - nsTableRowGroupFrame* rowGroup = static_cast<nsTableRowGroupFrame*>(aFrame); - PaintRowGroupBackground(rowGroup, aFrame, aBuilder, aLists, aDirtyRect); - } else if (aFrame->GetType() == nsGkAtoms::tableRowFrame) { - nsTableRowFrame* row = static_cast<nsTableRowFrame*>(aFrame); - PaintRowBackground(row, aFrame, aBuilder, aLists, aDirtyRect); - } else if (aFrame->GetType() == nsGkAtoms::tableColGroupFrame) { - // Compute background rect by iterating all cell frame. - nsTableColGroupFrame* colGroup = static_cast<nsTableColGroupFrame*>(aFrame); - // Collecting column index. - AutoTArray<uint32_t, 1> colIdx; - for (nsTableColFrame* col = colGroup->GetFirstColumn(); col; col = col->GetNextCol()) { - MOZ_ASSERT(colIdx.IsEmpty() || - static_cast<uint32_t>(col->GetColIndex()) > colIdx.LastElement()); - colIdx.AppendElement(col->GetColIndex()); - } - - if (!colIdx.IsEmpty()) { - // We have some actual cells that live inside this rowgroup. - nsTableFrame* table = colGroup->GetTableFrame(); - RowGroupArray rowGroups; - table->OrderRowGroups(rowGroups); - for (nsTableRowGroupFrame* rowGroup : rowGroups) { - auto offset = rowGroup->GetNormalPosition() - colGroup->GetNormalPosition(); - if (!aDirtyRect.Intersects(nsRect(offset, rowGroup->GetSize()))) { - continue; - } - PaintRowGroupBackgroundByColIdx(rowGroup, aFrame, aBuilder, aLists, aDirtyRect, colIdx, offset); - } - } - } else if (aFrame->GetType() == nsGkAtoms::tableColFrame) { - // Compute background rect by iterating all cell frame. - nsTableColFrame* col = static_cast<nsTableColFrame*>(aFrame); - AutoTArray<uint32_t, 1> colIdx; - colIdx.AppendElement(col->GetColIndex()); +// table paint code is concerned primarily with borders and bg color +// SEC: TODO: adjust the rect for captions +void +nsTableFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, + const nsDisplayListSet& aLists) +{ + DO_GLOBAL_REFLOW_COUNT_DSP_COLOR("nsTableFrame", NS_RGB(255,128,255)); - nsTableFrame* table = col->GetTableFrame(); - RowGroupArray rowGroups; - table->OrderRowGroups(rowGroups); - for (nsTableRowGroupFrame* rowGroup : rowGroups) { - auto offset = rowGroup->GetNormalPosition() - - col->GetNormalPosition() - - col->GetTableColGroupFrame()->GetNormalPosition(); - if (!aDirtyRect.Intersects(nsRect(offset, rowGroup->GetSize()))) { - continue; - } - PaintRowGroupBackgroundByColIdx(rowGroup, aFrame, aBuilder, aLists, aDirtyRect, colIdx, offset); - } - } else if (isVisible) { - nsDisplayBackgroundImage::AppendBackgroundItemsToTop(aBuilder, aFrame, - aFrame->GetRectRelativeToSelf(), - aLists.BorderBackground()); - } + DisplayBorderBackgroundOutline(aBuilder, aLists); - if (isVisible) { - // XXX: should box-shadow for rows/rowgroups/columns/colgroups get painted - // just because we're visible? Or should it depend on the cell visibility - // when we're not the whole table? + nsDisplayTableBackgroundSet tableBGs(aBuilder, this); + nsDisplayListCollection lists(aBuilder); - // Paint the inset box-shadows for the table frames - if (aFrame->StyleEffects()->mBoxShadow) { - aLists.BorderBackground()->AppendNewToTop( - new (aBuilder) nsDisplayBoxShadowInner(aBuilder, aFrame)); +// This is similar to what + // nsContainerFrame::BuildDisplayListForNonBlockChildren does, except that we + // allow the children's background and borders to go in our BorderBackground + // list. This doesn't really affect background painting --- the children won't + // actually draw their own backgrounds because the nsTableFrame already drew + // them, unless a child has its own stacking context, in which case the child + // won't use its passed-in BorderBackground list anyway. It does affect cell + // borders though; this lets us get cell borders into the nsTableFrame's + // BorderBackground list. + for (nsIFrame* colGroup : FirstContinuation()->GetChildList(kColGroupList)) { + for (nsIFrame* col : colGroup->PrincipalChildList()) { + tableBGs.AddColumn((nsTableColFrame*)col); } } - aTraversal(aBuilder, aFrame, aDirtyRect, aLists); + for (nsIFrame* kid : PrincipalChildList()) { + BuildDisplayListForChild(aBuilder, kid, lists); + } - if (isVisible) { - if (isTable) { - nsTableFrame* table = static_cast<nsTableFrame*>(aFrame); - // In the collapsed border model, overlay all collapsed borders. - if (table->IsBorderCollapse()) { - if (table->HasBCBorders()) { - aLists.BorderBackground()->AppendNewToTop( - new (aBuilder) nsDisplayTableBorderCollapse(aBuilder, table)); - } - } else { - const nsStyleBorder* borderStyle = aFrame->StyleBorder(); - if (borderStyle->HasBorder()) { - aLists.BorderBackground()->AppendNewToTop( - new (aBuilder) nsDisplayBorder(aBuilder, table)); - } + tableBGs.MoveTo(aLists); + lists.MoveTo(aLists); + + if (IsVisibleForPainting(aBuilder)) { + // In the collapsed border model, overlay all collapsed borders. + if (IsBorderCollapse()) { + if (HasBCBorders()) { + aLists.BorderBackground()->AppendNewToTop( + new (aBuilder) nsDisplayTableBorderCollapse + (aBuilder, this)); + } + } else { + const nsStyleBorder* borderStyle = StyleBorder(); + if (borderStyle->HasBorder()) { + aLists.BorderBackground()->AppendNewToTop( + new (aBuilder) nsDisplayBorder + (aBuilder, this)); } } } - - aFrame->DisplayOutline(aBuilder, aLists); -} - -// table paint code is concerned primarily with borders and bg color -// SEC: TODO: adjust the rect for captions -void -nsTableFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists) -{ - DO_GLOBAL_REFLOW_COUNT_DSP_COLOR("nsTableFrame", NS_RGB(255,128,255)); - - DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists); } nsMargin diff --git a/layout/tables/nsTableFrame.h b/layout/tables/nsTableFrame.h index d739faa72..7fcdcb9d8 100644 --- a/layout/tables/nsTableFrame.h +++ b/layout/tables/nsTableFrame.h @@ -72,36 +72,59 @@ private: bool mDrawsBackground; }; -class nsAutoPushCurrentTableItem -{ -public: - nsAutoPushCurrentTableItem() : mBuilder(nullptr) {} +class nsDisplayTableBackgroundSet { + public: + nsDisplayList* ColGroupBackgrounds() { return &mColGroupBackgrounds; } + + nsDisplayList* ColBackgrounds() { return &mColBackgrounds; } + + nsDisplayTableBackgroundSet(nsDisplayListBuilder* aBuilder, nsIFrame* aTable) + : mBuilder(aBuilder) { + mPrevTableBackgroundSet = mBuilder->SetTableBackgroundSet(this); + mozilla::DebugOnly<const nsIFrame*> reference = + mBuilder->FindReferenceFrameFor(aTable, &mToReferenceFrame); + MOZ_ASSERT(nsLayoutUtils::IsAncestorFrameCrossDoc(reference, aTable)); + mDirtyRect = mBuilder->GetDirtyRect(); + } - void Push(nsDisplayListBuilder* aBuilder, nsDisplayTableItem* aPushItem) - { - mBuilder = aBuilder; - mOldCurrentItem = aBuilder->GetCurrentTableItem(); - aBuilder->SetCurrentTableItem(aPushItem); -#ifdef DEBUG - mPushedItem = aPushItem; -#endif + ~nsDisplayTableBackgroundSet() { + mozilla::DebugOnly<nsDisplayTableBackgroundSet*> result = + mBuilder->SetTableBackgroundSet(mPrevTableBackgroundSet); + MOZ_ASSERT(result == this); } - ~nsAutoPushCurrentTableItem() { - if (!mBuilder) - return; -#ifdef DEBUG - NS_ASSERTION(mBuilder->GetCurrentTableItem() == mPushedItem, - "Someone messed with the current table item behind our back!"); -#endif - mBuilder->SetCurrentTableItem(mOldCurrentItem); + + /** + * Move all display items in our lists to top of the corresponding lists in + * the destination. + */ + void MoveTo(const nsDisplayListSet& aDestination) { + aDestination.BorderBackground()->AppendToTop(ColGroupBackgrounds()); + aDestination.BorderBackground()->AppendToTop(ColBackgrounds()); } -private: + void AddColumn(nsTableColFrame* aFrame) { mColumns.AppendElement(aFrame); } + + nsTableColFrame* GetColForIndex(int32_t aIndex) { return mColumns[aIndex]; } + + const nsPoint& TableToReferenceFrame() { return mToReferenceFrame; } + + const nsRect& GetDirtyRect() { return mDirtyRect; } + + private: + // This class is only used on stack, so we don't have to worry about leaking + // it. Don't let us be heap-allocated! + void* operator new(size_t sz) CPP_THROW_NEW; + + protected: nsDisplayListBuilder* mBuilder; - nsDisplayTableItem* mOldCurrentItem; -#ifdef DEBUG - nsDisplayTableItem* mPushedItem; -#endif + nsDisplayTableBackgroundSet* mPrevTableBackgroundSet; + + nsDisplayList mColGroupBackgrounds; + nsDisplayList mColBackgrounds; + + nsTArray<nsTableColFrame*> mColumns; + nsPoint mToReferenceFrame; + nsRect mDirtyRect; }; /* ============================================================================ */ @@ -229,29 +252,6 @@ public: nsIFrame* aSourceFrame, bool* aDidPassThrough); - typedef void (* DisplayGenericTablePartTraversal) - (nsDisplayListBuilder* aBuilder, nsFrame* aFrame, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); - static void GenericTraversal(nsDisplayListBuilder* aBuilder, nsFrame* aFrame, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); - - /** - * Helper method to handle display common to table frames, rowgroup frames - * and row frames. It creates a background display item for handling events - * if necessary, an outline display item if necessary, and displays - * all the the frame's children. - * @param aDisplayItem the display item created for this part, or null - * if this part's border/background painting is delegated to an ancestor - * @param aTraversal a function that gets called to traverse the table - * part's child frames and add their display list items to a - * display list set. - */ - static void DisplayGenericTablePart(nsDisplayListBuilder* aBuilder, - nsFrame* aFrame, - const nsRect& aDirtyRect, - const nsDisplayListSet& aLists, - DisplayGenericTablePartTraversal aTraversal = GenericTraversal); - // Return the closest sibling of aPriorChildFrame (including aPriroChildFrame) // of type aChildType. static nsIFrame* GetFrameAtOrBefore(nsIFrame* aParentFrame, @@ -268,7 +268,6 @@ public: virtual void GetChildLists(nsTArray<ChildList>* aLists) const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** Get the outer half (i.e., the part outside the height and width of diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index 02b85a141..18f11f876 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -549,12 +549,66 @@ nsTableRowFrame::CalcBSize(const ReflowInput& aReflowInput) return GetInitialBSize(); } +void nsTableRowFrame::PaintCellBackgroundsForFrame( + nsIFrame* aFrame, nsDisplayListBuilder* aBuilder, + const nsDisplayListSet& aLists, const nsPoint& aOffset) { + // Compute background rect by iterating all cell frame. + const nsPoint toReferenceFrame = aBuilder->ToReferenceFrame(aFrame); + for (nsTableCellFrame* cell = GetFirstCell(); cell; + cell = cell->GetNextCell()) { + if (!cell->ShouldPaintBackground(aBuilder)) { + continue; + } + + auto cellRect = + cell->GetRectRelativeToSelf() + cell->GetNormalPosition() + aOffset; + if (!aBuilder->GetDirtyRect().Intersects(cellRect)) { + continue; + } + cellRect += toReferenceFrame; + nsDisplayBackgroundImage::AppendBackgroundItemsToTop( + aBuilder, aFrame, cellRect, aLists.BorderBackground(), true, nullptr, + aFrame->GetRectRelativeToSelf() + toReferenceFrame, cell); + } +} + void nsTableRowFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect, aLists); + if (IsVisibleForPainting(aBuilder)) { + // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted + // just because we're visible? Or should it depend on the cell visibility + // when we're not the whole table? + + // Paint the outset box-shadows for the table frames + if (StyleEffects()->mBoxShadow) { + aLists.BorderBackground()->AppendNewToTop( + new (aBuilder) nsDisplayBoxShadowOuter + (aBuilder, this)); + } + } + + PaintCellBackgroundsForFrame(this, aBuilder, aLists); + + if (IsVisibleForPainting(aBuilder)) { + // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted + // just because we're visible? Or should it depend on the cell visibility + // when we're not the whole table? + + // Paint the inset box-shadows for the table frames + if (StyleEffects()->mBoxShadow) { + aLists.BorderBackground()->AppendNewToTop( + new (aBuilder) nsDisplayBoxShadowInner + (aBuilder, this)); + } + } + + DisplayOutline(aBuilder, aLists); + + for (nsIFrame* kid : PrincipalChildList()) { + BuildDisplayListForChild(aBuilder, kid, aLists); + } } nsIFrame::LogicalSides diff --git a/layout/tables/nsTableRowFrame.h b/layout/tables/nsTableRowFrame.h index c53c81ff1..4b6dd2628 100644 --- a/layout/tables/nsTableRowFrame.h +++ b/layout/tables/nsTableRowFrame.h @@ -79,9 +79,13 @@ public: virtual nsMargin GetUsedPadding() const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; + void PaintCellBackgroundsForFrame(nsIFrame* aFrame, + nsDisplayListBuilder* aBuilder, + const nsDisplayListSet& aLists, + const nsPoint& aOffset = nsPoint()); + // Implemented in nsTableCellFrame.h, because it needs to know about the // nsTableCellFrame class, but we can't include nsTableCellFrame.h here. inline nsTableCellFrame* GetFirstCell() const; diff --git a/layout/tables/nsTableRowGroupFrame.cpp b/layout/tables/nsTableRowGroupFrame.cpp index 37f577f5c..b6d8a4364 100644 --- a/layout/tables/nsTableRowGroupFrame.cpp +++ b/layout/tables/nsTableRowGroupFrame.cpp @@ -156,7 +156,7 @@ nsTableRowGroupFrame::InitRepeatedFrame(nsTableRowGroupFrame* aHeaderFooterFrame // Handle the child-traversal part of DisplayGenericTablePart static void DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) + const nsDisplayListSet& aLists) { nscoord overflowAbove; nsTableRowGroupFrame* f = static_cast<nsTableRowGroupFrame*>(aFrame); @@ -169,15 +169,15 @@ DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame, // approximate it by checking it for |f|: if it's true for any row // in |f| then it's true for |f| itself. nsIFrame* kid = aBuilder->ShouldDescendIntoFrame(f) ? - nullptr : f->GetFirstRowContaining(aDirtyRect.y, &overflowAbove); + nullptr : f->GetFirstRowContaining(aBuilder->GetDirtyRect().y, &overflowAbove); if (kid) { // If we have a cursor, use it while (kid) { - if (kid->GetRect().y - overflowAbove >= aDirtyRect.YMost()) { + if (kid->GetRect().y - overflowAbove >= aBuilder->GetDirtyRect().YMost()) { break; } - f->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); + f->BuildDisplayListForChild(aBuilder, kid, aLists); kid = kid->GetNextSibling(); } return; @@ -187,7 +187,7 @@ DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame, nsTableRowGroupFrame::FrameCursorData* cursor = f->SetupRowCursor(); kid = f->PrincipalChildList().FirstChild(); while (kid) { - f->BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); + f->BuildDisplayListForChild(aBuilder, kid, aLists); if (cursor) { if (!cursor->AppendFrame(kid)) { @@ -205,11 +205,45 @@ DisplayRows(nsDisplayListBuilder* aBuilder, nsFrame* aFrame, void nsTableRowGroupFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsTableFrame::DisplayGenericTablePart(aBuilder, this, aDirtyRect, - aLists, DisplayRows); + if (IsVisibleForPainting(aBuilder)) { + // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted + // just because we're visible? Or should it depend on the cell visibility + // when we're not the whole table? + + // Paint the outset box-shadows for the table frames + if (StyleEffects()->mBoxShadow) { + aLists.BorderBackground()->AppendNewToTop( + new (aBuilder) nsDisplayBoxShadowOuter + (aBuilder, this)); + } + } + + for (nsTableRowFrame* row = GetFirstRow(); row; row = row->GetNextRow()) { + if (!aBuilder->GetDirtyRect().Intersects(row->GetVisualOverflowRect() + row->GetNormalPosition())) { + continue; + } + row->PaintCellBackgroundsForFrame(this, aBuilder, aLists, + row->GetNormalPosition()); + } + + if (IsVisibleForPainting(aBuilder)) { + // XXXbz should box-shadow for rows/rowgroups/columns/colgroups get painted + // just because we're visible? Or should it depend on the cell visibility + // when we're not the whole table? + + // Paint the inset box-shadows for the table frames + if (StyleEffects()->mBoxShadow) { + aLists.BorderBackground()->AppendNewToTop( + new (aBuilder) nsDisplayBoxShadowInner + (aBuilder, this)); + } + } + + DisplayOutline(aBuilder, aLists); + + DisplayRows(aBuilder, this, aLists); } nsIFrame::LogicalSides diff --git a/layout/tables/nsTableRowGroupFrame.h b/layout/tables/nsTableRowGroupFrame.h index 721d91046..eb9f6205e 100644 --- a/layout/tables/nsTableRowGroupFrame.h +++ b/layout/tables/nsTableRowGroupFrame.h @@ -75,7 +75,6 @@ public: virtual nsMargin GetUsedPadding() const override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** calls Reflow for all of its child rows. diff --git a/layout/tables/nsTableWrapperFrame.cpp b/layout/tables/nsTableWrapperFrame.cpp index da71375d5..86f032218 100644 --- a/layout/tables/nsTableWrapperFrame.cpp +++ b/layout/tables/nsTableWrapperFrame.cpp @@ -168,7 +168,6 @@ nsTableWrapperFrame::RemoveFrame(ChildListID aListID, void nsTableWrapperFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // No border, background or outline are painted because they all belong @@ -177,20 +176,22 @@ nsTableWrapperFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // If there's no caption, take a short cut to avoid having to create // the special display list set and then sort it. if (mCaptionFrames.IsEmpty()) { - BuildDisplayListForInnerTable(aBuilder, aDirtyRect, aLists); + BuildDisplayListForInnerTable(aBuilder, aLists); return; } - nsDisplayListCollection set; - BuildDisplayListForInnerTable(aBuilder, aDirtyRect, set); + nsDisplayListCollection set(aBuilder); + BuildDisplayListForInnerTable(aBuilder, set); nsDisplayListSet captionSet(set, set.BlockBorderBackgrounds()); - BuildDisplayListForChild(aBuilder, mCaptionFrames.FirstChild(), - aDirtyRect, captionSet); + BuildDisplayListForChild(aBuilder, mCaptionFrames.FirstChild(), captionSet); // Now we have to sort everything by content order, since the caption - // may be somewhere inside the table - set.BlockBorderBackgrounds()->SortByContentOrder(GetContent()); + // may be somewhere inside the table. + // We don't sort BlockBorderBackgrounds and BorderBackgrounds because the + // display items in those lists should stay out of content order in order to + // follow the rules in https://www.w3.org/TR/CSS21/zindex.html#painting-order + // and paint the caption background after all of the rest. set.Floats()->SortByContentOrder(GetContent()); set.Content()->SortByContentOrder(GetContent()); set.PositionedDescendants()->SortByContentOrder(GetContent()); @@ -200,7 +201,6 @@ nsTableWrapperFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, void nsTableWrapperFrame::BuildDisplayListForInnerTable(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Just paint the regular children, but the children's background is our @@ -208,7 +208,7 @@ nsTableWrapperFrame::BuildDisplayListForInnerTable(nsDisplayListBuilder* aBuil nsIFrame* kid = mFrames.FirstChild(); // The children should be in content order while (kid) { - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, aLists); + BuildDisplayListForChild(aBuilder, kid, aLists); kid = kid->GetNextSibling(); } } diff --git a/layout/tables/nsTableWrapperFrame.h b/layout/tables/nsTableWrapperFrame.h index 45d7c33e4..8095c7fc4 100644 --- a/layout/tables/nsTableWrapperFrame.h +++ b/layout/tables/nsTableWrapperFrame.h @@ -59,11 +59,9 @@ public: #endif virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; void BuildDisplayListForInnerTable(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); virtual nscoord GetLogicalBaseline(mozilla::WritingMode aWritingMode) const override; diff --git a/layout/xul/ContainerBoxObject.h b/layout/xul/ContainerBoxObject.h index b3da97991..d9da164ea 100644 --- a/layout/xul/ContainerBoxObject.h +++ b/layout/xul/ContainerBoxObject.h @@ -8,6 +8,7 @@ #define mozilla_dom_ContainerBoxObject_h #include "mozilla/dom/BoxObject.h" +#include "nsIDocShell.h" namespace mozilla { namespace dom { diff --git a/layout/xul/grid/moz.build b/layout/xul/grid/moz.build index 074985aaf..049489ab2 100644 --- a/layout/xul/grid/moz.build +++ b/layout/xul/grid/moz.build @@ -19,7 +19,7 @@ EXPORTS += [ 'nsIGridPart.h', ] -UNIFIED_SOURCES += [ +SOURCES += [ 'nsGrid.cpp', 'nsGridCell.cpp', 'nsGridLayout2.cpp', diff --git a/layout/xul/moz.build b/layout/xul/moz.build index 8ed304c9f..18b120b34 100644 --- a/layout/xul/moz.build +++ b/layout/xul/moz.build @@ -44,7 +44,7 @@ EXPORTS.mozilla.dom += [ 'ScrollBoxObject.h', ] -UNIFIED_SOURCES += [ +SOURCES += [ 'BoxObject.cpp', 'nsBox.cpp', 'nsBoxFrame.cpp', @@ -64,7 +64,7 @@ UNIFIED_SOURCES += [ ] if CONFIG['MOZ_XUL']: - UNIFIED_SOURCES += [ + SOURCES += [ 'ContainerBoxObject.cpp', 'ListBoxObject.cpp', 'MenuBoxObject.cpp', diff --git a/layout/xul/nsBoxFrame.cpp b/layout/xul/nsBoxFrame.cpp index 9ca351d94..09573fb96 100644 --- a/layout/xul/nsBoxFrame.cpp +++ b/layout/xul/nsBoxFrame.cpp @@ -1310,7 +1310,6 @@ PaintXULDebugBackground(nsIFrame* aFrame, DrawTarget* aDrawTarget, void nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { bool forceLayer = false; @@ -1329,7 +1328,7 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } } - nsDisplayListCollection tempLists; + nsDisplayListCollection tempLists(aBuilder); const nsDisplayListSet& destination = forceLayer ? tempLists : aLists; DisplayBorderBackgroundOutline(aBuilder, destination); @@ -1344,7 +1343,7 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, } #endif - BuildDisplayListForChildren(aBuilder, aDirtyRect, destination); + BuildDisplayListForChildren(aBuilder, destination); // see if we have to draw a selection frame around this container DisplaySelectionOverlay(aBuilder, destination.Content()); @@ -1370,7 +1369,6 @@ nsBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, void nsBoxFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { nsIFrame* kid = mFrames.FirstChild(); @@ -1379,7 +1377,7 @@ nsBoxFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds()); // The children should be in the right order while (kid) { - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, set); + BuildDisplayListForChild(aBuilder, kid, set); kid = kid->GetNextSibling(); } } diff --git a/layout/xul/nsBoxFrame.h b/layout/xul/nsBoxFrame.h index ad405222f..7b15f4f5e 100644 --- a/layout/xul/nsBoxFrame.h +++ b/layout/xul/nsBoxFrame.h @@ -148,11 +148,9 @@ public: // virtual so nsStackFrame, nsButtonBoxFrame, nsSliderFrame and nsMenuFrame // can override it virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists); virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #ifdef DEBUG_LAYOUT diff --git a/layout/xul/nsButtonBoxFrame.cpp b/layout/xul/nsButtonBoxFrame.cpp index 45d934516..ba0b7fb2a 100644 --- a/layout/xul/nsButtonBoxFrame.cpp +++ b/layout/xul/nsButtonBoxFrame.cpp @@ -12,6 +12,7 @@ #include "nsPresContext.h" #include "nsIPresShell.h" #include "nsIDOMElement.h" +#include "nsIDOMEvent.h" #include "nsDisplayList.h" #include "nsContentUtils.h" #include "mozilla/dom/Element.h" @@ -91,13 +92,12 @@ nsButtonBoxFrame::DestroyFrom(nsIFrame* aDestructRoot) void nsButtonBoxFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // override, since we don't want children to get events if (aBuilder->IsForEventDelivery()) return; - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists); } nsresult diff --git a/layout/xul/nsButtonBoxFrame.h b/layout/xul/nsButtonBoxFrame.h index e9bfd99a5..0dc8b517f 100644 --- a/layout/xul/nsButtonBoxFrame.h +++ b/layout/xul/nsButtonBoxFrame.h @@ -23,7 +23,6 @@ public: nsIFrame* aPrevInFlow) override; virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void DestroyFrom(nsIFrame* aDestructRoot) override; diff --git a/layout/xul/nsDeckFrame.cpp b/layout/xul/nsDeckFrame.cpp index b0c0296b2..91359c177 100644 --- a/layout/xul/nsDeckFrame.cpp +++ b/layout/xul/nsDeckFrame.cpp @@ -145,14 +145,13 @@ nsDeckFrame::GetSelectedBox() void nsDeckFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // if a tab is hidden all its children are too. if (!StyleVisibility()->mVisible) return; - nsBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayList(aBuilder, aLists); } void @@ -185,7 +184,6 @@ nsDeckFrame::RemoveFrame(ChildListID aListID, void nsDeckFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // only paint the selected box @@ -196,7 +194,7 @@ nsDeckFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, // Putting the child in the background list. This is a little weird but // it matches what we were doing before. nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds()); - BuildDisplayListForChild(aBuilder, box, aDirtyRect, set); + BuildDisplayListForChild(aBuilder, box, set); } NS_IMETHODIMP diff --git a/layout/xul/nsDeckFrame.h b/layout/xul/nsDeckFrame.h index 2c7ae1445..143745236 100644 --- a/layout/xul/nsDeckFrame.h +++ b/layout/xul/nsDeckFrame.h @@ -34,14 +34,12 @@ public: NS_IMETHOD DoXULLayout(nsBoxLayoutState& aState) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void RemoveFrame(ChildListID aListID, nsIFrame* aOldFrame) override; virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void Init(nsIContent* aContent, diff --git a/layout/xul/nsGroupBoxFrame.cpp b/layout/xul/nsGroupBoxFrame.cpp index 514287a24..df3955cf3 100644 --- a/layout/xul/nsGroupBoxFrame.cpp +++ b/layout/xul/nsGroupBoxFrame.cpp @@ -28,7 +28,6 @@ public: virtual nsresult GetXULBorderAndPadding(nsMargin& aBorderAndPadding) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; #ifdef DEBUG_FRAME_DUMP @@ -145,13 +144,13 @@ nsDisplayXULGroupBorder::Paint(nsDisplayListBuilder* aBuilder, void nsGroupBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // Paint our background and border if (IsVisibleForPainting(aBuilder)) { nsDisplayBackgroundImage::AppendBackgroundItemsToTop( - aBuilder, this, GetBackgroundRectRelativeToSelf(), + aBuilder, this, + GetBackgroundRectRelativeToSelf() + aBuilder->ToReferenceFrame(this), aLists.BorderBackground()); aLists.BorderBackground()->AppendNewToTop(new (aBuilder) nsDisplayXULGroupBorder(aBuilder, this)); @@ -159,7 +158,7 @@ nsGroupBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, DisplayOutline(aBuilder, aLists); } - BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + BuildDisplayListForChildren(aBuilder, aLists); } nsRect diff --git a/layout/xul/nsImageBoxFrame.cpp b/layout/xul/nsImageBoxFrame.cpp index fd7c7becf..e88b502ab 100644 --- a/layout/xul/nsImageBoxFrame.cpp +++ b/layout/xul/nsImageBoxFrame.cpp @@ -320,10 +320,9 @@ nsImageBoxFrame::UpdateLoadFlags() void nsImageBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsLeafBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsLeafBoxFrame::BuildDisplayList(aBuilder, aLists); if ((0 == mRect.width) || (0 == mRect.height)) { // Do not render when given a zero area. This avoids some useless diff --git a/layout/xul/nsImageBoxFrame.h b/layout/xul/nsImageBoxFrame.h index 7faccccae..46c8d5614 100644 --- a/layout/xul/nsImageBoxFrame.h +++ b/layout/xul/nsImageBoxFrame.h @@ -87,7 +87,6 @@ public: void UpdateLoadFlags(); virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual ~nsImageBoxFrame(); diff --git a/layout/xul/nsLeafBoxFrame.cpp b/layout/xul/nsLeafBoxFrame.cpp index 6d1783c11..8342b7485 100644 --- a/layout/xul/nsLeafBoxFrame.cpp +++ b/layout/xul/nsLeafBoxFrame.cpp @@ -106,7 +106,6 @@ void nsLeafBoxFrame::UpdateMouseThrough() void nsLeafBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // REVIEW: GetFrameForPoint used to not report events for the background diff --git a/layout/xul/nsLeafBoxFrame.h b/layout/xul/nsLeafBoxFrame.h index 8aea598c8..7a63d9a79 100644 --- a/layout/xul/nsLeafBoxFrame.h +++ b/layout/xul/nsLeafBoxFrame.h @@ -64,7 +64,6 @@ public: nsIFrame* asPrevInFlow) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/xul/nsListItemFrame.cpp b/layout/xul/nsListItemFrame.cpp index 1776f1b6c..720df3827 100644 --- a/layout/xul/nsListItemFrame.cpp +++ b/layout/xul/nsListItemFrame.cpp @@ -39,7 +39,6 @@ nsListItemFrame::GetXULPrefSize(nsBoxLayoutState& aState) void nsListItemFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (aBuilder->IsForEventDelivery()) { @@ -48,7 +47,7 @@ nsListItemFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, return; } - nsGridRowLeafFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + nsGridRowLeafFrame::BuildDisplayListForChildren(aBuilder, aLists); } // Creation Routine /////////////////////////////////////////////////////////////////////// diff --git a/layout/xul/nsListItemFrame.h b/layout/xul/nsListItemFrame.h index 40e731efa..aa41dbbbf 100644 --- a/layout/xul/nsListItemFrame.h +++ b/layout/xul/nsListItemFrame.h @@ -20,7 +20,6 @@ public: // overridden so that children of listitems don't handle mouse events, // unless allowevents="true" is specified on the listitem virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsSize GetXULPrefSize(nsBoxLayoutState& aState) override; diff --git a/layout/xul/nsMenuBarListener.cpp b/layout/xul/nsMenuBarListener.cpp index 0fce497b8..23df81937 100644 --- a/layout/xul/nsMenuBarListener.cpp +++ b/layout/xul/nsMenuBarListener.cpp @@ -21,6 +21,7 @@ #include "mozilla/BasicEvents.h" #include "mozilla/Preferences.h" #include "mozilla/TextEvents.h" +#include "mozilla/dom/Event.h" using namespace mozilla; diff --git a/layout/xul/nsMenuFrame.cpp b/layout/xul/nsMenuFrame.cpp index 67fcdbe43..a8e81adb5 100644 --- a/layout/xul/nsMenuFrame.cpp +++ b/layout/xul/nsMenuFrame.cpp @@ -48,6 +48,7 @@ #include <algorithm> using namespace mozilla; +using namespace mozilla::dom; #define NS_MENU_POPUP_LIST_INDEX 0 @@ -356,16 +357,15 @@ nsMenuFrame::DestroyFrom(nsIFrame* aDestructRoot) void nsMenuFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!aBuilder->IsForEventDelivery()) { - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists); return; } - nsDisplayListCollection set; - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, set); + nsDisplayListCollection set(aBuilder); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, set); WrapListsInRedirector(aBuilder, set, aLists); } diff --git a/layout/xul/nsMenuFrame.h b/layout/xul/nsMenuFrame.h index 1941ec69e..43cbd0a04 100644 --- a/layout/xul/nsMenuFrame.h +++ b/layout/xul/nsMenuFrame.h @@ -101,7 +101,6 @@ public: // Overridden to prevent events from going to children of the menu. virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; // this method can destroy the frame diff --git a/layout/xul/nsMenuPopupFrame.cpp b/layout/xul/nsMenuPopupFrame.cpp index 6e706e49c..3f934b208 100644 --- a/layout/xul/nsMenuPopupFrame.cpp +++ b/layout/xul/nsMenuPopupFrame.cpp @@ -18,6 +18,7 @@ #include "nsMenuBarFrame.h" #include "nsPopupSetFrame.h" #include "nsPIDOMWindow.h" +#include "nsIDOMEvent.h" #include "nsIDOMKeyEvent.h" #include "nsIDOMScreen.h" #include "nsIPresShell.h" @@ -45,6 +46,7 @@ #include "nsThemeConstants.h" #include "nsTransitionManager.h" #include "nsDisplayList.h" +#include "nsIDOMXULMenuListElement.h" #include "nsIDOMXULSelectCntrlItemEl.h" #include "mozilla/EventDispatcher.h" #include "mozilla/EventStateManager.h" @@ -53,6 +55,7 @@ #include "mozilla/LookAndFeel.h" #include "mozilla/MouseEvents.h" #include "mozilla/dom/Element.h" +#include "mozilla/dom/Event.h" #include "mozilla/dom/PopupBoxObject.h" #include <algorithm> diff --git a/layout/xul/nsResizerFrame.h b/layout/xul/nsResizerFrame.h index 92656bc76..41efa79a7 100644 --- a/layout/xul/nsResizerFrame.h +++ b/layout/xul/nsResizerFrame.h @@ -8,9 +8,12 @@ #include "mozilla/Attributes.h" #include "mozilla/EventForwards.h" #include "nsTitleBarFrame.h" +#include "Units.h" class nsIBaseWindow; +using namespace mozilla; + class nsResizerFrame : public nsTitleBarFrame { protected: diff --git a/layout/xul/nsRootBoxFrame.cpp b/layout/xul/nsRootBoxFrame.cpp index fe41dce52..3e7515ea8 100644 --- a/layout/xul/nsRootBoxFrame.cpp +++ b/layout/xul/nsRootBoxFrame.cpp @@ -8,6 +8,7 @@ #include "nsGkAtoms.h" #include "nsIPresShell.h" #include "nsBoxFrame.h" +#include "nsDisplayList.h" #include "nsStackLayout.h" #include "nsIRootBox.h" #include "nsIContent.h" @@ -75,7 +76,6 @@ public: nsEventStatus* aEventStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; /** @@ -176,14 +176,14 @@ nsRootBoxFrame::Reflow(nsPresContext* aPresContext, void nsRootBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (mContent && mContent->GetProperty(nsGkAtoms::DisplayPortMargins)) { // The XUL document's root element may have displayport margins set in // ChromeProcessController::InitializeRoot, and we should to supply the // base rect. - nsRect displayPortBase = aDirtyRect.Intersect(nsRect(nsPoint(0, 0), GetSize())); + nsRect displayPortBase = + aBuilder->GetDirtyRect().Intersect(nsRect(nsPoint(0, 0), GetSize())); nsLayoutUtils::SetDisplayPortBase(mContent, displayPortBase); } @@ -192,7 +192,7 @@ nsRootBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, // of a background display list element. DisplayBorderBackgroundOutline(aBuilder, aLists, true); - BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + BuildDisplayListForChildren(aBuilder, aLists); } nsresult diff --git a/layout/xul/nsSliderFrame.cpp b/layout/xul/nsSliderFrame.cpp index 3c1f9ef91..a9e513e2f 100644 --- a/layout/xul/nsSliderFrame.cpp +++ b/layout/xul/nsSliderFrame.cpp @@ -311,7 +311,6 @@ nsSliderFrame::AttributeChanged(int32_t aNameSpaceID, void nsSliderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (aBuilder->IsForEventDelivery() && isDraggingThumb()) { @@ -322,12 +321,11 @@ nsSliderFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, return; } - nsBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayList(aBuilder, aLists); } void nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // if we are too small to have a thumb don't paint it. @@ -360,8 +358,8 @@ nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, nsLayoutUtils::SetScrollbarThumbLayerization(thumb, thumbGetsLayer); if (thumbGetsLayer) { - nsDisplayListCollection tempLists; - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, tempLists); + nsDisplayListCollection tempLists(aBuilder); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, tempLists); // This is a bit of a hack. Collect up all descendant display items // and merge them into a single Content() list. @@ -382,7 +380,7 @@ nsSliderFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, } } - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists); } NS_IMETHODIMP diff --git a/layout/xul/nsSliderFrame.h b/layout/xul/nsSliderFrame.h index 832065a21..e4b68fc01 100644 --- a/layout/xul/nsSliderFrame.h +++ b/layout/xul/nsSliderFrame.h @@ -64,11 +64,9 @@ public: virtual void DestroyFrom(nsIFrame* aDestructRoot) override; virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult AttributeChanged(int32_t aNameSpaceID, diff --git a/layout/xul/nsSplitterFrame.cpp b/layout/xul/nsSplitterFrame.cpp index 7879a176d..468ccc682 100644 --- a/layout/xul/nsSplitterFrame.cpp +++ b/layout/xul/nsSplitterFrame.cpp @@ -358,10 +358,9 @@ nsSplitterFrame::HandleRelease(nsPresContext* aPresContext, void nsSplitterFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { - nsBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayList(aBuilder, aLists); // if the mouse is captured always return us as the frame. if (mInner->mDragging) diff --git a/layout/xul/nsSplitterFrame.h b/layout/xul/nsSplitterFrame.h index df8872255..fa1c7525f 100644 --- a/layout/xul/nsSplitterFrame.h +++ b/layout/xul/nsSplitterFrame.h @@ -68,7 +68,6 @@ public: nsEventStatus* aEventStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void GetInitialOrientation(bool& aIsHorizontal) override; diff --git a/layout/xul/nsStackFrame.cpp b/layout/xul/nsStackFrame.cpp index 437d558f9..a2ec57adc 100644 --- a/layout/xul/nsStackFrame.cpp +++ b/layout/xul/nsStackFrame.cpp @@ -45,7 +45,6 @@ nsStackFrame::nsStackFrame(nsStyleContext* aContext): // a bit more. void nsStackFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // BuildDisplayListForChild puts stacking contexts into the PositionedDescendants @@ -56,8 +55,7 @@ nsStackFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, nsIFrame* kid = mFrames.FirstChild(); while (kid) { // Force each child into its own true stacking context. - BuildDisplayListForChild(aBuilder, kid, aDirtyRect, kidLists, - DISPLAY_CHILD_FORCE_STACKING_CONTEXT); + BuildDisplayListForChild(aBuilder, kid, kidLists, DISPLAY_CHILD_FORCE_STACKING_CONTEXT); kid = kid->GetNextSibling(); } } diff --git a/layout/xul/nsStackFrame.h b/layout/xul/nsStackFrame.h index b90a16b21..a81a62281 100644 --- a/layout/xul/nsStackFrame.h +++ b/layout/xul/nsStackFrame.h @@ -33,7 +33,6 @@ public: #endif virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; protected: diff --git a/layout/xul/nsTextBoxFrame.cpp b/layout/xul/nsTextBoxFrame.cpp index c82d3d6b9..e1650e0d0 100644 --- a/layout/xul/nsTextBoxFrame.cpp +++ b/layout/xul/nsTextBoxFrame.cpp @@ -364,13 +364,12 @@ nsDisplayXULTextBox::GetComponentAlphaBounds(nsDisplayListBuilder* aBuilder) void nsTextBoxFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!IsVisibleForPainting(aBuilder)) return; - nsLeafBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsLeafBoxFrame::BuildDisplayList(aBuilder, aLists); aLists.Content()->AppendNewToTop(new (aBuilder) nsDisplayXULTextBox(aBuilder, this)); diff --git a/layout/xul/nsTextBoxFrame.h b/layout/xul/nsTextBoxFrame.h index ca1b88748..e12b97b32 100644 --- a/layout/xul/nsTextBoxFrame.h +++ b/layout/xul/nsTextBoxFrame.h @@ -48,7 +48,6 @@ public: bool& aRedraw); virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual ~nsTextBoxFrame(); diff --git a/layout/xul/nsTitleBarFrame.cpp b/layout/xul/nsTitleBarFrame.cpp index 2792403dc..2f58abecb 100644 --- a/layout/xul/nsTitleBarFrame.cpp +++ b/layout/xul/nsTitleBarFrame.cpp @@ -42,7 +42,6 @@ nsTitleBarFrame::nsTitleBarFrame(nsStyleContext* aContext) void nsTitleBarFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // override, since we don't want children to get events @@ -51,7 +50,7 @@ nsTitleBarFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, nsGkAtoms::_true, eCaseMatters)) return; } - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists); } nsresult diff --git a/layout/xul/nsTitleBarFrame.h b/layout/xul/nsTitleBarFrame.h index 17279c578..594d0978b 100644 --- a/layout/xul/nsTitleBarFrame.h +++ b/layout/xul/nsTitleBarFrame.h @@ -19,7 +19,6 @@ public: explicit nsTitleBarFrame(nsStyleContext* aContext); virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult HandleEvent(nsPresContext* aPresContext, diff --git a/layout/xul/tree/moz.build b/layout/xul/tree/moz.build index ccac5bde9..7d150881a 100644 --- a/layout/xul/tree/moz.build +++ b/layout/xul/tree/moz.build @@ -27,7 +27,7 @@ EXPORTS.mozilla.dom += [ 'TreeBoxObject.h' ] -UNIFIED_SOURCES += [ +SOURCES += [ 'nsTreeBodyFrame.cpp', 'nsTreeColFrame.cpp', 'nsTreeColumns.cpp', diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp index deba04a36..608d802ea 100644 --- a/layout/xul/tree/nsTreeBodyFrame.cpp +++ b/layout/xul/tree/nsTreeBodyFrame.cpp @@ -2824,7 +2824,6 @@ public: // Painting routines void nsTreeBodyFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { // REVIEW: why did we paint if we were collapsed? that makes no sense! @@ -2832,7 +2831,7 @@ nsTreeBodyFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, return; // We're invisible. Don't paint. // Handles painting our background, border, and outline. - nsLeafBoxFrame::BuildDisplayList(aBuilder, aDirtyRect, aLists); + nsLeafBoxFrame::BuildDisplayList(aBuilder, aLists); // Bail out now if there's no view or we can't run script because the // document is a zombie diff --git a/layout/xul/tree/nsTreeBodyFrame.h b/layout/xul/tree/nsTreeBodyFrame.h index 9620c8ccb..6838b0157 100644 --- a/layout/xul/tree/nsTreeBodyFrame.h +++ b/layout/xul/tree/nsTreeBodyFrame.h @@ -177,7 +177,6 @@ public: nsEventStatus* aEventStatus) override; virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) override; diff --git a/layout/xul/tree/nsTreeColFrame.cpp b/layout/xul/tree/nsTreeColFrame.cpp index 649c0b0b4..2ee2903f6 100644 --- a/layout/xul/tree/nsTreeColFrame.cpp +++ b/layout/xul/tree/nsTreeColFrame.cpp @@ -110,16 +110,15 @@ nsDisplayXULTreeColSplitterTarget::HitTest(nsDisplayListBuilder* aBuilder, const void nsTreeColFrame::BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) { if (!aBuilder->IsForEventDelivery()) { - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, aLists); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, aLists); return; } - nsDisplayListCollection set; - nsBoxFrame::BuildDisplayListForChildren(aBuilder, aDirtyRect, set); + nsDisplayListCollection set(aBuilder); + nsBoxFrame::BuildDisplayListForChildren(aBuilder, set); WrapListsInRedirector(aBuilder, set, aLists); diff --git a/layout/xul/tree/nsTreeColFrame.h b/layout/xul/tree/nsTreeColFrame.h index 8fc3219d5..ebd16fa52 100644 --- a/layout/xul/tree/nsTreeColFrame.h +++ b/layout/xul/tree/nsTreeColFrame.h @@ -26,7 +26,6 @@ public: virtual void DestroyFrom(nsIFrame* aDestructRoot) override; virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, - const nsRect& aDirtyRect, const nsDisplayListSet& aLists) override; virtual nsresult AttributeChanged(int32_t aNameSpaceID, |