From 1bd3474c7c7945e1182dfbaca89be05ea98dd3e8 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Fri, 11 Sep 2020 17:30:27 +0200 Subject: [PATCH] oox smartart: add support for syncing font heights of multiple shapes When 2 or more shapes have their text set to autofit and they have a constraint like: Then make sure that the automatic font size is the same for all shapes and all content fits, by using the smallest scaling factor from all relevant shapes. Some rework is needed, because normally oox::drawingml::Shapes don't have access to their parents, at the same time there can be multiple SmartArts on a single slide, so storing the grouping info in the filter is problematic, too. Solve this by storing the grouping in the toplevel oox::drawingml::Shape and exposing them in XmlFilterBase just during the time the children of the toplevel shape of the SmartArt are added. This works, because we know SmartArts can't be nested. Change-Id: I6c591eadc7166c7c42752650afdb7ee1e416cff6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102490 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- include/oox/core/xmlfilterbase.hxx | 12 ++++ include/oox/drawingml/shape.hxx | 8 +++ oox/source/core/xmlfilterbase.cxx | 8 +++ oox/source/drawingml/diagram/diagram.cxx | 9 ++- oox/source/drawingml/diagram/diagram.hxx | 14 +++-- .../drawingml/diagram/diagramlayoutatoms.cxx | 26 ++++++++- .../drawingml/diagram/diagramlayoutatoms.hxx | 12 ++-- oox/source/drawingml/shape.cxx | 55 ++++++++++++++++++ oox/source/ppt/pptshape.cxx | 13 +++++ .../unit/data/pptx/smartart-autofit-sync.pptx | Bin 0 -> 45546 bytes sd/qa/unit/import-tests-smartart.cxx | 30 ++++++++++ 11 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 sd/qa/unit/data/pptx/smartart-autofit-sync.pptx diff --git a/include/oox/core/xmlfilterbase.hxx b/include/oox/core/xmlfilterbase.hxx index bad90cc0d132..99b73e5b18bd 100644 --- a/include/oox/core/xmlfilterbase.hxx +++ b/include/oox/core/xmlfilterbase.hxx @@ -64,6 +64,11 @@ namespace sax_fastparser { namespace utl { class MediaDescriptor; } +namespace oox::drawingml +{ +class Shape; +} + namespace oox::core { class FragmentHandler; @@ -78,6 +83,10 @@ typedef std::vector< TextField > TextFieldStack; struct XmlFilterBaseImpl; +using ShapePairs + = std::map, css::uno::Reference>; +using NamedShapePairs = std::map; + class OOX_DLLPUBLIC XmlFilterBase : public FilterBase { public: @@ -241,6 +250,9 @@ public: /// user about it. void setMissingExtDrawing(); + void setDiagramFontHeights(NamedShapePairs* pDiagramFontHeights); + NamedShapePairs* getDiagramFontHeights(); + void checkDocumentProperties( const css::uno::Reference& xDocProps); diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index b1f15e5b6ece..fea94105b65d 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -29,6 +29,8 @@ #include #include #include + +#include #include #include #include @@ -239,6 +241,8 @@ public: void keepDiagramDrawing(::oox::core::XmlFilterBase& rFilterBase, const OUString& rFragmentPath); + oox::core::NamedShapePairs& getDiagramFontHeights() { return maDiagramFontHeights; } + protected: enum FrameType @@ -272,6 +276,7 @@ protected: const basegfx::B2DHomMatrix& aTransformation ); void keepDiagramCompatibilityInfo(); + void syncDiagramFontHeights(); void convertSmartArtToMetafile( ::oox::core::XmlFilterBase const& rFilterBase ); css::uno::Reference< css::drawing::XShape > @@ -377,6 +382,9 @@ private: /// The shape fill should be set to that of the slide background surface. bool mbUseBgFill = false; + + /// For SmartArt, this contains groups of shapes: automatic font size is the same in each group. + oox::core::NamedShapePairs maDiagramFontHeights; }; } diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx index eae0a4f615fc..adf132dded13 100644 --- a/oox/source/core/xmlfilterbase.cxx +++ b/oox/source/core/xmlfilterbase.cxx @@ -175,6 +175,7 @@ struct XmlFilterBaseImpl RelationsMap maRelationsMap; TextFieldStack maTextFieldStack; const NamespaceMap& mrNamespaceMap; + NamedShapePairs* mpDiagramFontHeights = nullptr; /// @throws RuntimeException explicit XmlFilterBaseImpl(); @@ -939,6 +940,13 @@ void XmlFilterBase::setMissingExtDrawing() mbMissingExtDrawing = true; } +void XmlFilterBase::setDiagramFontHeights(NamedShapePairs* pDiagramFontHeights) +{ + mxImpl->mpDiagramFontHeights = pDiagramFontHeights; +} + +NamedShapePairs* XmlFilterBase::getDiagramFontHeights() { return mxImpl->mpDiagramFontHeights; } + OUString XmlFilterBase::getNamespaceURL(sal_Int32 nNSID) const { auto itr = mxImpl->mrNamespaceMap.maTransitionalNamespaceMap.find(nNSID); diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx index 8265ae7b3a88..d9f35df42ebf 100644 --- a/oox/source/drawingml/diagram/diagram.cxx +++ b/oox/source/drawingml/diagram/diagram.cxx @@ -135,6 +135,11 @@ void Diagram::addTo( const ShapePtr & pParentShape ) aChildren.insert(aChildren.begin(), pBackground); } +Diagram::Diagram(const ShapePtr& pShape) + : mpShape(pShape) +{ +} + uno::Sequence Diagram::getDomsAsPropertyValues() const { sal_Int32 length = maMainDomMap.size(); @@ -245,7 +250,7 @@ void loadDiagram( ShapePtr const & pShape, const OUString& rColorStylePath, const oox::core::Relations& rRelations ) { - DiagramPtr pDiagram = std::make_shared(); + DiagramPtr pDiagram = std::make_shared(pShape); DiagramDataPtr pData = std::make_shared(); pDiagram->setData( pData ); @@ -365,7 +370,7 @@ void loadDiagram(ShapePtr const& pShape, const uno::Reference& colorDom, core::XmlFilterBase& rFilter) { - DiagramPtr pDiagram = std::make_shared(); + DiagramPtr pDiagram = std::make_shared(pShape); pDiagram->setData(pDiagramData); diff --git a/oox/source/drawingml/diagram/diagram.hxx b/oox/source/drawingml/diagram/diagram.hxx index e7f5cc68378b..25fa10ed0635 100644 --- a/oox/source/drawingml/diagram/diagram.hxx +++ b/oox/source/drawingml/diagram/diagram.hxx @@ -49,7 +49,10 @@ typedef std::map PresPointShapeMap; class DiagramLayout { public: - DiagramLayout(const Diagram& rDgm) : mrDgm(rDgm) {} + DiagramLayout(Diagram& rDgm) + : mrDgm(rDgm) + { + } void setDefStyle( const OUString & sDefStyle ) { msDefStyle = sDefStyle; } void setMinVer( const OUString & sMinVer ) @@ -60,8 +63,7 @@ public: { msTitle = sTitle; } void setDesc( const OUString & sDesc ) { msDesc = sDesc; } - const Diagram& getDiagram() const - { return mrDgm; } + Diagram& getDiagram() { return mrDgm; } LayoutNodePtr & getNode() { return mpNode; } const LayoutNodePtr & getNode() const @@ -80,7 +82,7 @@ public: { return maPresPointShapeMap; } private: - const Diagram& mrDgm; + Diagram& mrDgm; OUString msDefStyle; OUString msMinVer; OUString msUniqueId; @@ -128,6 +130,7 @@ typedef std::map DiagramColorMap; class Diagram { public: + explicit Diagram(const ShapePtr& pShape); void setData( const DiagramDataPtr & pData ) { mpData = pData; } const DiagramDataPtr& getData() const @@ -146,7 +149,10 @@ public: void addTo( const ShapePtr & pShape ); css::uno::Sequence getDomsAsPropertyValues() const; + ShapePtr getShape() { return mpShape; } + private: + ShapePtr mpShape; DiagramDataPtr mpData; DiagramLayoutPtr mpLayout; DiagramQStyleMap maStyles; diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx index f81aa774402b..f1278425bd87 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.cxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.cxx @@ -216,7 +216,7 @@ namespace * Takes the connection list from rLayoutNode, navigates from rFrom on an edge * of type nType, using a direction determined by bSourceToDestination. */ -OUString navigate(const LayoutNode& rLayoutNode, sal_Int32 nType, const OUString& rFrom, +OUString navigate(LayoutNode& rLayoutNode, sal_Int32 nType, const OUString& rFrom, bool bSourceToDestination) { for (const auto& rConnection : rLayoutNode.getDiagram().getData()->getConnections()) @@ -648,6 +648,16 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector& nVertMin = std::min(aPos.Y, nVertMin); nVertMax = std::max(aPos.Y + aSize.Height, nVertMax); + + NamedShapePairs& rDiagramFontHeights + = getLayoutNode().getDiagram().getShape()->getDiagramFontHeights(); + auto it = rDiagramFontHeights.find(aCurrShape->getInternalName()); + if (it != rDiagramFontHeights.end()) + { + // Internal name matches: put drawingml::Shape to the relevant group, for + // syncronized font height handling. + it->second.insert({ aCurrShape, {} }); + } } // See if all vertical space is used or we have to center the content. @@ -942,6 +952,20 @@ void AlgAtom::layoutShape(const ShapePtr& rShape, const std::vector& } } + if (rConstraint.mnType == XML_primFontSz && rConstraint.mnFor == XML_des + && rConstraint.mnOperator == XML_equ) + { + NamedShapePairs& rDiagramFontHeights + = getLayoutNode().getDiagram().getShape()->getDiagramFontHeights(); + auto it = rDiagramFontHeights.find(rConstraint.msForName); + if (it == rDiagramFontHeights.end()) + { + // Start tracking all shapes with this internal name: they'll have the same + // font height. + rDiagramFontHeights[rConstraint.msForName] = {}; + } + } + // TODO: get values from differently named constraints as well if (rConstraint.msForName == "sp" || rConstraint.msForName == "space" || rConstraint.msForName == "sibTrans") { diff --git a/oox/source/drawingml/diagram/diagramlayoutatoms.hxx b/oox/source/drawingml/diagram/diagramlayoutatoms.hxx index f36224f0f882..81b96c2207b8 100644 --- a/oox/source/drawingml/diagram/diagramlayoutatoms.hxx +++ b/oox/source/drawingml/diagram/diagramlayoutatoms.hxx @@ -259,9 +259,13 @@ class LayoutNode public: typedef std::map VarMap; - LayoutNode(const Diagram& rDgm) : LayoutAtom(*this), mrDgm(rDgm), mnChildOrder(0) {} - const Diagram& getDiagram() const - { return mrDgm; } + LayoutNode(Diagram& rDgm) + : LayoutAtom(*this) + , mrDgm(rDgm) + , mnChildOrder(0) + { + } + Diagram& getDiagram() { return mrDgm; } virtual void accept( LayoutAtomVisitor& ) override; VarMap & variables() { return mVariables; } @@ -288,7 +292,7 @@ public: const LayoutNode* getParentLayoutNode() const; private: - const Diagram& mrDgm; + Diagram& mrDgm; VarMap mVariables; OUString msMoveWith; OUString msStyleLabel; diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 35d44339f62a..99fa848741b3 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -185,6 +185,7 @@ Shape::Shape( const ShapePtr& pSourceShape ) , mnDataNodeType(pSourceShape->mnDataNodeType) , mfAspectRatio(pSourceShape->mfAspectRatio) , mbUseBgFill(pSourceShape->mbUseBgFill) +, maDiagramFontHeights(pSourceShape->maDiagramFontHeights) {} Shape::~Shape() @@ -295,6 +296,22 @@ void Shape::addShape( if( !SvtFilterOptions::Get().IsSmartArt2Shape() ) convertSmartArtToMetafile( rFilterBase ); } + + NamedShapePairs* pNamedShapePairs = rFilterBase.getDiagramFontHeights(); + if (xShape.is() && pNamedShapePairs) + { + auto itPairs = pNamedShapePairs->find(getInternalName()); + if (itPairs != pNamedShapePairs->end()) + { + auto it = itPairs->second.find(shared_from_this()); + if (it != itPairs->second.end()) + { + // Our drawingml::Shape is in the list of an internal name, remember the now + // inserted XShape. + it->second = xShape; + } + } + } } } catch( const Exception& ) @@ -1540,6 +1557,44 @@ void Shape::keepDiagramCompatibilityInfo() } } +void Shape::syncDiagramFontHeights() +{ + // Each name represents a group of shapes, for which the font height should have the same + // scaling. + for (const auto& rNameAndPairs : maDiagramFontHeights) + { + // Find out the minimum scale within this group. + const ShapePairs& rShapePairs = rNameAndPairs.second; + sal_Int16 nMinScale = 100; + for (const auto& rShapePair : rShapePairs) + { + uno::Reference xPropertySet(rShapePair.second, uno::UNO_QUERY); + if (xPropertySet.is()) + { + sal_Int16 nTextFitToSizeScale = 0; + xPropertySet->getPropertyValue("TextFitToSizeScale") >>= nTextFitToSizeScale; + if (nTextFitToSizeScale > 0 && nTextFitToSizeScale < nMinScale) + { + nMinScale = nTextFitToSizeScale; + } + } + } + + // Set that minimum scale for all members of the group. + if (nMinScale < 100) + { + for (const auto& rShapePair : rShapePairs) + { + uno::Reference xPropertySet(rShapePair.second, uno::UNO_QUERY); + if (xPropertySet.is()) + { + xPropertySet->setPropertyValue("TextFitToSizeScale", uno::makeAny(nMinScale)); + } + } + } + } +} + void Shape::convertSmartArtToMetafile(XmlFilterBase const & rFilterBase) { try diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx index d017b4348d93..96ca319f2a8e 100644 --- a/oox/source/ppt/pptshape.cxx +++ b/oox/source/ppt/pptshape.cxx @@ -409,10 +409,23 @@ void PPTShape::addShape( // if this is a group shape, we have to add also each child shape Reference xShapes(xShape, UNO_QUERY); if (xShapes.is()) + { + if (meFrameType == FRAMETYPE_DIAGRAM) + { + rFilterBase.setDiagramFontHeights(&getDiagramFontHeights()); + } addChildren( rFilterBase, *this, pTheme, xShapes, pShapeMap, aTransformation ); + if (meFrameType == FRAMETYPE_DIAGRAM) + { + rFilterBase.setDiagramFontHeights(nullptr); + } + } if (meFrameType == FRAMETYPE_DIAGRAM) + { keepDiagramCompatibilityInfo(); + syncDiagramFontHeights(); + } } } catch (const Exception&) diff --git a/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx b/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx new file mode 100644 index 0000000000000000000000000000000000000000..f682c143f584659db33c749f4099330ffd358c2d GIT binary patch literal 45546 zcmeFYV~{0Xw=KNOwrzH?%jmLg+je!?wq4a_+qT_hqsz8=>v<0Dd+vE7zI!9SU+0|t zBX_LK+&f~8oNMHqW6UKd2?B}=00%$<001I@pZYF#;1Q<2Gvyh{BIxF9^WRLBd?ta|Jb-!n0K` zkg<0l z6YT|>bg+tb+P<7^))Avebd`(ZPqFI->bI$1ksV?y(6Ew$bV0fqSU8YB?LOJ2eDCE~ zm=;n5ek#J2q~`JYZB85^ZSx`aSo`biG4{A2M2f(D#A#8m=obHbRIpdzOSbNf0N*j6 zn+~6EKR+}Cf|C$M@X%AZl_t{&$@}t0p6eftxAcfNo{uapy|AuIc?XiHTRc52k==)V z`O`Ju66G7X1v!_qF^Pd|b}=TGryKKX8<`|`y-`SQ#C8OAS*+2QZRepA1r@zoBDNUS zxl!A%SpWP40m%Ia!Z3Ss$_4o%jGZq&fcYW}T?b<;M|!%yj{idx|Bczs>?jJeEyh$I5^6<_IaXwI@{%E1WpWcdxXag%%ocIDVah=Gr)vi37ZZ&O764$D z4FI5j-C<|vL~mrSZ|b0L?MQE=@1)Q8*L!weThmr^G|pRB?=v9h5&!<(U;yeR98WJE z_9wZUIt_Y*(3*e~%;>1=&$!PnUHLj8iFxse1EfKSabj!yUu9KQFI{CPoZYYeDdQ3O zK2oN)x2NTg!#iBwp3I$`ojhFKFLxhL^t@~bF);@bqYEp0J1-V5A5YE4Z%+u_pN~GT z8!N@*E~W{CdofFZ8`TYx(NP?#4tMKr&Q0!wJnx)Vi>5faY-NA_ zA+KUUEG>&lUYyi8qFVeQ)34STotAl{_rvR%on{;{x1U}w_YU>hMG^TCr`gv$+J`AC z3+>~#b1V06FS|SKbEo48r!fT6vc)bw(k3u%B#t|>bmZOIpLOi5&wo6-VuxFVe$gC3 zW4L;G-aS5#S3f=KPRV|<>c0JC{E?QeyQw7wrhRx(*L;afkY!{4XYMrObmh&+!JV^H zBlI)QDXD#Yv(v@X>GpZY3LJ)mr&W34?O+(o`$wzt9e7arjwb8kcf3S{^w$Akmt=JU zBf7lMv3uU7hK{%J>@9-NrRh2Ph)?f3;k$2LCN~%T_bayJF65VV2NBuHCpj2wcZN-G z*Slv&1_I!3&lnE`J{&xpT-mhV9zGMt@hDnk9~XfidD-I#Qq@!5nG@unZlA5kXs_e4 zr`cTU-u((%FMIU{7!<8cL$$aqrmF)J@r~d=RU*xV)vDe*vo@qmc&Eu#9Vy?&7jAaf z*JuR9D}q25S_#us#hKH1luHEDLP)i66lw>mmneX7(_+vZ%%+mB%6Iq;PA0Ma($cR*y^$5J1D#1t z9AibXa(>g#=VAE+5;v>1Z#}rUliVMuNPX1@q|-7u?{v#?*hEiHBhv7vC=hKE2D36S zB&?2MI?9xINkNioc9dDKfA+dU(|Y+5-vS2BWLCkLh#h154-@w$j+*w0t5_V)ne2+0 zGcE4-7#btZ2;@qWO>nCxzJkDJxI(khx?sgwaW3@6F&ZxU%(^`AR_~1Jqu}9&KhP~X zNfT20CaDitr&f)ovlhLTz0^TOI5MjTq(Otjc(Gz=d>zCP2gYJkV)WXOwtCKz$|~y1 zx(&WSt9Hw}U@{0)%kg<&6_g;Xo`eeEmGS)qi%QbV7DyS)lu!CdV9TQQoatUGHMn!Z zl1^#gCM6Pnl>mGVg2WvUrOJ7f|J?Y(iCz>~_h_$x3a$9_CF35_1pm%6heu-T_FIsi zl+5Yx0Vam?CB`(Vp{s%HZ{WE(8w*I3wf>r!)jAkmkA(q4PY`hIFokUzb1x1V%y!}i zMl$AHaOZ3iiO}~`DP>n=AW_96o(iMRJ&GMPl< zt&J;f&W-0#ROC>$rL@mvc5Q)tC|Xii<)tU2THh@wY3&IWBqj@;REUNK0628phaD;h z@wBat*qZB_8UitCDZcHKT9_s+Aoz=YwcC;=#A*q~;6b(sR)?i_*K+iPFq&qXHUHMC-AGR)uoGPwvSpn;BmzNjA~7{zn1xyu zDjn>^Qosy@pl>I+PJosyP*)yY%yCGevpVZ}8cZU(YJ9+BVjmx{E8=D^7jMM{I8HPX zNDwJIJO7_@30F$QrxJ}MT6Jw{H%N}H6xP3Bsp)p8x ztHwB>=Y9mPG|H4Cb*3r89n|vkt~a~yh6f?q3*%af0c`#uz&Vg(P>bp28s>KBEJpnR zJ+g1#(&~XDe-L>J1Igw{1R%KR^m1+rLuB8***2cL(sX4ZO#JN61$LMGUKnfE#4aSwQP=z&BmKuxV<7{_6G1yJa*6n zTX<>tb4K%rUO%uaLpY%QH)k!7j9nrlOCWPerMl$v+w5>gEY5U;d{NdD57BT`S7Pz&K4q<2?8e9gDsG{{bIYeEhAUE`^UTM+piXFwJ_TvV7Gb+V z&0v}g?K8NAL_XMxhnUcPdcNj0Ru-qCYhHs;%FkXQ7`qM+etTwv)hldLkMfa9LsboYKr z)$^C65Spwg6p@?pt9DJfn$;M0<}bmccEGfHo(M3dL;jVVWN{a2Bn%w+)Z;8;+bfK< zYgM?pMP8aj$T?Ud>CasnN-R3{Ea(5lhm3ix>hCt0D7D0;WfDvm3!7rv?r3w75&O`_S8fivkyA90Tqgg@ak_)KJv8SUv+sYPIm;sa2r_n2iP`(kwJ+D@=qmX?<}L=F|Te z6op6f9c=o?#FNLd$3c;yk&PfHH_Q81Kv~3x#Z%W#d+hYbDyS|YGl295JJ#$)`u4(@ z_7Q7f7H8hQGVL(JObJlOrNdOL0Ds@6j8H@5=59U~SJb>3PT!E=pq zstQ|`xVI&`R|;awIgTn!1>T7&T8!OOYpk7LhfVnoi*>CpmIjt&XQW3oQ!AH&g4YB5 zIo}AL;n-kr3uek_5eyfZ%*F{QSLl7&17_#{rp%HTTh)*hQino~NCbW^+q2-SA0?bi zvWu?9gkwWmSoN^QlA9TYc0F_=aENPVLKP<~!w5oTm%1m|u@alb4oelqs@#Z9M3{wF zkYDaMySjY$qP*`0Th9QX(Nm(9rDhJl;>3JMSOBY1 zgkIaK6_&}FXqTY`gt!t63JdC8U%iVf9;xmq0&rM?9+aAL+NqccL#Ihmfv%FE96XOj z`lhKQtON$GZsH8w0;&eD*kLrStN z`d@^v{;hTP3&9n_qs zxu|P?Vk-qub`t(j6#TPp0Z1NJKXPmKLw9@PA58`fRnBO*#iKQ9PrQgW;n{)8fNi#E z^5X9c;ft2piB7RgJLFuc%oJ$4<4}8Q>m5) z$qm95EyD{+u&?KEi?zktbIgGa$nfd7ZYxw)ka2SkyrffP4p%Jq3O5=()p@|#Rilpk zmjz)~N^b+V!s5?WmysKPEim`s1{=QvQe~4M$3ZNtWHY1BMjCvD1z`rw6J!J-Uvf-) zs=CCI^jn7#xLdvgDOPd$(gSL+f`+^vA~dT`JwNz*E8(gJlBuFw=YSy`d!BBd_pUox z+c9F+Fwb7J z?sf5g^|vGuX=Qb}(ewfVZV zNCxrqG(?whnoZ@HvzT@y7O^yS`aIp_Mk}1MKO&URu~(ZlP0>hF(5KJM7SQE={QAI*jA(UE$3Q5C*6Nj+{+qRZI!6_(C6!Bb zk-`&)eT=_Bgx*c`Fy?{j70t<^Ts$7kXc%=bDqe&;U-!M|>GVEME-fKwJ>vg}-mVsFWr`jI88t1LaJ>vd6C&& zw;Y0_EV}g_Pd9jpj<8aa+7fH7M4Mxixzb_uJbA31Tw7vp&T~E!xd(|9mXJ7oMd3%<`hlkG>J>UEXH__cbrWI^Pl6V4Rz6YEHp$d zb7eljA0?SRH7Dsb4&OXx)vSlT*^oZBHeEUQF`l;1Bn6xsoj&Ciw z)}lO*jz{MK@Tl_XiCM5U>h#ALEjVE+^fom1)PAY*ZH=U%f!)dfmWGxi8QpS8b+epa zc8UGa*~wK~bz}AVk^D33ZnGrSq_)P+wx#QllnOwmhU=TMzzst-CviEC(tiX4$+dz- zf+eEc_|vlg$P&$!PyJ`lch2%l%j6l=@y&{~)cSs5B%`2QPIFM?!6kbvLrVss#_tEO zwZ=|kohaj&-^|n^YD$67;&WS6u|0!TLW$7E38h0G(caZ=T9n!{%k`Lqr7CjNnErYWCR=|!hqqdY!MlAV z0!T3e#OE?h4k7i|q0vgJB3t$~6VufN!;T*xM;3NI%aRs+Oj$p6Ez^%rdp51UGr9w* z_H5ISjyr(rQ3ETw1CNv%!0=ugzecN_lTVDqty=+r@2ALzz|@nz_e6JrkpnZh6#}go z{8(x%^X(FM=khx+w4dvG9@cz~>{?kv&@`mXm}8rAw>G_l3-KOeaF+?SK4;>5oa!_H zXPI-^xr}2w=iqJT07`|aSf^UtPOLF*3EHhsXW3pk@>HzlmdbbapJ1+f-IkMpT3XHdg-3mCxgn6JY68JIzK!@DJ{)UQojtDeoJUo zBB5-N=1!NraBq~I^)yktxYeuAY3Ykd+bD|`c&NtFt9!c5tvUNGrrNDl&)}2;=&riZFHN8M)1Ae(6rRb+DtBTsK5m6G54A1pUJm zg_5mpq`V)U)(LqJtKYR2WQ8YnvvKt7m#=eUm~B)&m)CHo{u9vnk=3hiePkE;%cL@j zXbd}%nNS!9-gluWXLVfP`X0{Yqy#xxPZNUc)ga?YFs9ccGHYGjBkToddV5S_J+J=i zMI5*`5piqyqO06euuzdnQO*L$i_jVxXV&Od(zBC#cLFRCQ+G#I+>md}?gxXeb?eY-hNQ4XFts*ef~oiR@@6*DW(|G~5wn4>Ugddu~Rz()6xghM{n> zRk13+X?4bVGh{+3;2wiX35yb9-B(YOy!xd(qJX)j!|lt*|&vPOob) zWx?*3n*__L9J0@|4Bo+EY*eI@mn_1+sf#fV&J`0E=Vd_lIsRF{r93TUF1*cLw0wcx zSGoau&15TMYUi^-phwD+xPc?ITA6y5a#UIRGrB>_G_1h4l`!0NX?lLDdnRt;%p+#= z73x2d&(oNT6MO{%B}=X8^%R9pc4)3-g2$8fyQYgl?9d6tqh0Z-2A^Ylckp2P<0U-sQOK}lsmw9)g!9)0wp5!ulNSm~)1~H_ zVCG{wmc*K~Opn@})E0MGRC-*r=|)bPS}7IFc7}oEJnE%y8`;lRbxF-mhUP7GwM#z~ zX(*T?uwSL5UAzV^9yZ)4SP>e8WeKvCv8kCGXa50e9=;*<6*`<_St*rC+ zZzty{%3hN_KfEHcVn}oqrMCJz**wy!zFetqMb#LG-t=&3Qin%x_o%K*gfFIJrB`oo zz$SuE`8{U|`3a#;$(zg;s88s#iz@|liZT^sZ4*gFznEk_uo&9=z*`(43BNS6UzEYC z@b)oRnadt6+Ij(ce{Sw#?Sv=a~8hD5;h1YUtWK;ri(@Ry0hztQkg)YMskt`OG{UOk@|qwNU}V1!T(^($C7}Zt~}e+jKC;Yc|ZXkLQp<3m5233n(H%&QNQhdXu-f#ZmsvF}}~j=05?) z9W_NG1TC558g3QUir!o2S>soI+hD82f0&taSTjVqkq&f#pQty4xTd5OKssxKs0+p& zP-XEOuWKHoqlWGQTSd;*l3YnLGLDm~N8Dg6`Kg&UR|GMkH|I$K&1ovgP5N7GNAdyW zAEHnqN|RAf8gTp7Rx^NvqxL25-;>#NaK?n4=b|H#W*{^ZnvV#;kd(8AkvZ4WcEjy& zF3)k)n6R_~%}#(&1S+}<)2oNTat7Tbc6Fy*2olX2-zxE+692wy9k}0{Zu}|rk16e0v{2@kN_Wa2;~0-@pRb<~|IFUp9|IL3`?5C? zKmh>4f3<2Ht;~ qIqY>HK@}w_o$O=h-kfBh$x#3cl@uvZa6AdCDhjK&d4rCDtK- z4J5N#KlA%xqN&8g;~Ta9Xp<{Z%Es3FyF=R~I>Dlm?NIDy9RaT7Vzz!J%nA1vBEDq<;QsY#}-Z=-PnVmIMACIBj62g%cIksAj17@i(1- zb%7vHEmV|?7_Q}xg|x~lYf8XxMQz|Jckt7r zP0p1Po;CZXA>^56y;-8}53H<)L3eQAKoH-;%zI=7X$}GjE2-ZgmPd8jGWkK_G+)27c$MUD{7jD#C0;BVa$^m?9 zUGZddEr}5HDQ5`5^sN|?!*Qy00&<7+yt}&RkHX-*k5B_Z0CO8 zYs~ArBZ?9BeMi7ld-aBQ?3sTM*as}kaQ%1{RaCsW0s1ebFo^(%x{Tg36K~9>GTeu= zfqQs5_ws7oWEhhNR-EHsI;`<_CMLiGN6wbz$C6KJuPhc4b8+K#|cY&ID$DyTmLaY>V$H5+&L49K020I-A%p?&}n(bw-an;aM z=Y6>BZ`<*iSSE8R;GY3wCS)%fhOb!gkIf2^Evyo(5D$8QMa=K_dLv39yMx>^=LUV|c^f%>YjMI{;}9-+02>1q5GMGziKQ02n{= zN^=ijM9$uK2S0~B6V}B^au7&@lP`G6PP|zOH%A>ojyWnsvaQgdTkG?E;O@eQDB0(W zVE!{#+4Z6Nm3@U)IXD1-_OGG!udjpu{UWGPvbN1&K>Xk_{{*_u^6zB_WvLYKEuC#r zv3LZb*(DY0aAlQNRDQkW!bvDH=W){L-X0FQ^qhWfZSUA@j;h~PSnz7Ln-SjT>@f6F zcF72OJg%)9l}0H2Xt{EN*23``1T*NfsH?m7l@x)cM0P**b!$`2868^GE@%ba}BN zG4^@je8E8iNfz}s-QV<7sA}?}9lMB|z_`;+ckKJbPTqhH)JQ*naA!r2V>N7k0i@|Z zb>s-ad6d`~DO+PVhZ$s?%jM#t)I*sr0!D>xC4d~SH-X4Xx!~5b7j*j8wd)Q#FfPOq z*JJ!UxDw5{dgh>89qh+)9pBWPh1yf{^&g~|Q+rp*P8ob~^-T`=ls`1n9W*i9T{P-$ z;tfJN;^79$!I+{%vmIc4=4+}DV>O?c#xuP3R4=O|_+ZKR(X23R;V7sif&K$>Oy<(3 zLe>)-V^?>DvZR>cNOygdRaogL0-I%w{Q3qTmPvz{WPuZBlZvF})g-BNe$kCDhm7)3 zWdSG38LUCx-KB}N1ehNr+Y~YQX)3W%9i;+M8JpW;yIW&=6^uCcR>rPMzjiyVmv`yz zV?t&);7nFB1Is~~L+zkWvZwjpNgu}8`&^UA#+8+%usxSNvWbLHbKJzl0*7WCRYK>q zjHBN82hXP__*$&C9gL*}*dAQ(?n4jYz5jV|FU-VWcYFmk+gIq*{$p@U>ATrFJN<`@ z=U+}S{_n&ma=H_`j{yDg>WQ8FYA(Jy=r&?9n|y=eRx~EKLhjO++jw`Y(Oj8)h zD6sz*M8OHIoebrxGx{6rU(M0~(y8?~(M#()IvG1S(*MKY@3nBIacZ;Mg#4kKb4hsg z#{FBPKukN*8CtvIr=JrJ^D)Q>GTy0BvQpU31X}cE(__udTlQB{Q?an7%z@2<4Zvm( zgPwf*y=f;^XT1evx%}6ewQ3Za?s&R-Jm2#b1lc)S(=2%hbtnZ8A>f7fF45 z&x{%Sip*n@#dS{JZzmOhRUh1P8_OqEC0Fca#Rj86LAoiMfyrY^s_iG@MWN*qJ z!!D-ipr^G=RkdI0u4s+dYu3b@6K{(RDSU^C5YeO<6w1~n@p5|jInVS+a&4!n%MuwT z-}+HoN`D$5()H*4B@ZZ#P+@7z2>7IF?Si|f&bE%k&k+25f1CT`nOa@l1if02vO=mGX=0-7d!Q#I+jmMs2 z-vL*~zgU$uC!aGKG#-BC<096G6u9u_UT0sU%7PfIiC8Ht5z>(dUvlK?bLO($dvP{; zz0|USA5~O2pyhj?cOs!uT6^gfvQ?_60MdI}`tAB>fWB4T3+%eEEJwh2+IM83DWr;VkqD8FNM1pbItq^g6zl`#}UATWt+4!X=3V+sG%h*0K=9yWx%&wmko&qz;_MSb7?D?M9@u1# zGZ5}YVi#)~7>6=Ek{fr(MSuALESDQ=x9WooHZnNRg9{FtY^i>69nxF>qZ?hOJ9%1S zCs!;L9)u55;>G7x46u$tcg;cb7GJ2GW)7xVzXOGQokFHVdvkCMY#hx+!%(FHr^~HQ z?B+k<>CLx&I}0gqPAc(agVq?$93=#q(S@@Tysr@}f}4Wv9Z1|Sh;(iB^bq@eV@|sJ zyTRKxiFB|-mSVQ`!-lh#mNNBDhbsurKpZ?yy2xY0gW6~0x{a@IDPaej6(mTB z)$mr=k8~nzz=4cZInLBx2Q`Md_pRyl%2nqkdPiqd}7Hh3}>M#AaHQ!$ml|WAdY1*XH#IR2EXm43|#nkJ&Wynx&m{)sZAovi` z`_FpM>^Fh|Pcl|dGD1mJZn{cLNPtE5v6J z?*54Ox{mYZCa+IBAE)3MmHy|*PWr2_3l2Z&_m1L%wJ-_IMu;eS+e`S(eBrJ}e&@)a zE!Unu`Pp`Qjx-8`vwF~+7$w|wC|Hu*>dkk)Xn0gGHkUS5;mD&7_#x#Y-gHQY{Q;9h zwcjJbmEMRY^ij0bL{cDg9afY)JCyx=U-~+{Lf|e6aE2dmeD3dK%pIJ z(}?D`MDU|X_|{RuvfdK(98*+pOB2(WjUipzkiXwQ7z|ECJiRU+M3h$!wSp1{Us9e% zm?&HTHHaEo8C6rB(2XvUL4(YkoOw-WdKsUAaXvV`fDlRwr`J6jl zqpgxel|*)E{Cj-_#L@mp_o11g(H9hG|HeSMNNYlJbl*7ZCm3C)*emXF+8Qp05#&JJ zJKZUHl8uRJ`J?g*UK4DcbMYRW<$x`v?Bsgq5mAa(yi}g!ks$d?cgiOt^yX6E-X^Hz z3)AbvrqJp`9l_*H`(m~6h6iBqyZIE5!8%L78`Lpwqy=T)HR0e|G#cE=CZM9lf2^f3 zdTS5LOq;@Zp^w(;4A_i2l&Z;f1A@45%B?Ll!B{8M1O)P!*j!_X?cSmZ+K+e?<^8s} zoAaaxuV$U7Bakccbv<|e5Po0ZC04K_X#HoY(g%)jCO*mzeKMencnA0Z-`+BU-O7ws z{}yF$I#3Jye1r&t{V_HHXb(`mE|W#*gT8m9IdTeoi0{Bjxlis)8c8vtOR)FX*aN^3 zWPJd2vjo-J(;Bjl#dpDx_3-akU0_;;YZzX>E<^r(8Hewp?V;4mqc9dGv)w1!X4?3~ zeh{N#C3Ch11tZJwuH3_wy~}vz$E+I?#q*-o+tW$893jDVm!}0*V;S>+3|*q zABMlonEz0F|69HF52nk%ociAi#K3~I#g`xsw(XVc!cZSW#ub*3IIXZ$^|8)f0bzuxs7G>k035Kr~dBE_4HisHlX)v*;}=75*M41;X8eQ8b~eIz%7uR4CTz6AA+9^kzK2iSGla? zPj=K{@W=w%r(xot0(vOud%I=c(XEr#c0t3JcE*x>#UV*OMtfP-y)dMr`i% zeMNSSITG+wvni5FQ=v{;Y9%<{`1yx9&-x(NiN~SoB;~L+)~7Wk1x`2>3D-A+G3dJb zmcqEoO2gSjBTH@z%gnk;gISeCD-6Y^*QDB&TTSnODqsG;(=N+@!65rb6#g%DE{6Yt zFx2-fq8EHQa=M5B0P#O+8~-Nv{jF{MqtG{@wq~=&j_CEZBaQzzPkl0Fe7rwrP*nuj zEV)|oYn6l(jZ$-=*^)U@PIu!g$9p`Ufo4MIX7@A}VU?2MESwk^ERm+`fWlIrk;vpQ`_5Qg** z%8ZO}RPFgI71OF6Q!i}R!#FL?R>E20EvOjv0!F%k_9~O*y5)+gu_4^Y2*HQuapSbx zmdPa++dTlWYm)d?w{DU)Z?1DljLdaO<^` zhGP6(CD8e!UxG1=)HruJthFuQP^4p5(rU%!6xgA~qLnwsMjjW6`(wyt8pD`CZWQH# zRR?4G@wiDoMSbTv#vC)(DxGkp$VhZ;RtDcr;Y(I2i(TJH$e?F)dbP}D?WF4HkHz|9 zpn4nxWqG)%4LAtdKWAjZWYSztv*V+Ujg*H6&CG*D(hB|xsYC`rpg~aA^5J;&y*AkT zA=;%ItXyMYOM&n5QhoI+cy*`WF|4=f_A@#vMHi%YKz><&zo}S%N3UBh9H@;wufs%g zCB9Jzjx!!+G-M7Ji>w}!@|~V5$xn^)i@{38JZ?{5{anY9hKZ!|hXAgo1y@;Et`w;i zPa>H!6NZY%ZD9NA61g`@dGknn)ROYF+@9B;AG<Wa$6ZRXtMp%i1HlS@s&Rfj4Ts zjGkigNP+36u|KoEmuBGXTj|~!n}W84k@Yeo1I1AFeSzOKfQJrT(+yYI_+uruvNu8j z`?6lgLI0>EcMuSMV<1))t^zXk)5dHXe=*BZ)rI=1o_hSbtPozAnLIAz%X5V;6Lmux8(ks3^`F{9xEVVWulOaVoHV4)3F9#>_yqgktLQgw`JA1D!w6%=EzOl{y8cbkJ)C%4h_mmwoBua&z%TG zXQ6dDXP@+7oN5{SQVb17F)Uajl29Krzu&%Gpcl*(T`K5&9({F7A!@+hhmI+*0$b@t zT=TG^(qo5Geb|YxGWz;cO%?Asl8i3ZpXA*k=4hxq(i^ zJNm1~tMpn<)}`GE)|QFW5>bx} zWuP1xHquI#i+RDLzc!}-6D{AD{J5{~i{rFV{tx~3pK#pY6~>v`hD|0rYL~A07EtXH z-4g_Ze1b)fNu$E55Z5t?+?CPtP4f_wxQ6nHr^)<)g zE03Y;$4*^oR%NW=Rte4SwvOE>aF18y*hZwDJ-?^c*li?{gF;sub2JZDgE?o zKrUU(ZMjW8?s+~Q{EeVXrIOFKn_w-vG!OTw`^<@HxeROTZ1c_fH)HQyFSf=IPu{!q z4vP)*u60xIW)0;aJ?&a^p>h!lh56RmYlPD>0u$SJo=tZu@bjUmkME?;3#V2K!Y(%l z^h>or9m+*>JPH))lbw$n-0~r&=r}3PH3~PDMFoAxgBUu0zP6vGyq7jG=~&AaDkcr} zGtb=@K_sMgS~oZCZlrqixZDPeCs|3AfBU0_--ccD&GCLBwM9vW5gxsL#=y%V#Jcvt zMa|Rq)BD^_Z?k6^7z-j1O;~->_ z`Rn}zg<}4wji(t`JGCs0T#C4=PMYxM(IWf-#C=ZkNg4V>5gP_h@I2pqYh1Zm@992d z6{o~$nd@oE6q0daX3BF;pwrol#`J20xSiCTkUpM!dr&9VO*Kf2={Cg!SFy8BsIzK{ zJJFqxxod?XT4UKM{$R)gV zv#=tXNSHs=pFW9z4_eSr4^`R@z*xlQ{G)9%!?=@Zxv6WD{lXCMGt-Kke7x}weBFkV zjii0|Z6Re_laoa)+C4u0Oh5kgV$%8+k@vFxqIH4B<$2uMpIVKL-K#ZH$%_OU@4WcJ zNWthv4gCoYLiI7AK`ijhLM)10S*XWP(NPT*uLL7O%-rns_tKTiIV%RsAVrP`qFIGm(uY5I1YiyCfXATMG7NyOa+#}gy8r0Pt=bDM*YFFEvS8xz7h5eQXF`>YEEekBvl8>kb2^k1pb1; zI-?0}05j<$qX>+##5Ji$XzlFuYQvDt^KrXY9P|0%yD`XmD;wK-(!^#@A-;oH$P5HU zn&!Fr{;a+>Ymiyi)HMh>GEVfeHOf^< z71Se3>zFwTEOGIsgrc-&R=-a*ROhJ~m#N1%&bwQTCFgysptJF&wDuz`C%lGt|AYP!0NpZU0W`Nz|Bt?ephTp5!up0p zk5^^qIS&h+792Tao_gWLw;ek*b&mKTssG_zl(V@BocQiPj8PYCIZ|_e%tZtnhV(zWnd(XBD$;*M(Q;xT(ve*jC0u3dM?6vMJ z1RCP@*WY7{*p0*`_{&6n`(phWa)HDc|3E#=L84sdUyE$2(*^DCFB!~Y+;nX>&^fL= zoJ;%|UvoztE?|_V$Ro)D-w#=q#S%vJ2NPz@2{l0Ei}3?3N_^rmViY161~!|RTQFh7 zxy3`t4n1m*VD;JJk}ePX-T~inP6PgZvQaZ8U7<)Mf8**m{DX2=ih&HGDTvERh@b3} zbrX_NsGD5@l4G#f&K8+t=tfrQX$`GSO!|L6ZGsmq zZzX&hE0+9R8H4(FyDG5f)SSFsV=wGs~?V4klGB%w& zte1&4NeU;1i@-&DS*pFLTflcAQ_lW?ho-0Ffni)z1X?mg+a2T65%bg`b3s?vdQx|Q z?}et|ZSSXMlx5-TfH(}Co?jbGoI`BiU17(P=zIdIWk+Ym&&99*8g&g@_TYDK{z9$> z;@E+MzjB}8oxC^U+uTaSyj#^hRn+ga8$sp_h;Xxnt8?D ziVZshVV@l^R1Z{$uffT&1`})tA(1OTgZR$Vu9FH4b4Xc*u!fFxforFHa$kG6!;6M+ z(nxyN)jUTqCNL&oLMT18P_lNu-*^A*t0yB87 zEDGNbdLSZMB(YseA?`c$)Zv)wmZbQAJ?||eg%lfwjqbbQPhsb+6bsut_fj^|FZP|k zyg;0iNxb?U|3n zg6=dJ%6NdtgBjelWI}hB%8l`2=cY#7{KG5$O6e5jSEiYfx?bGPJ^lGlr4`Ck{vd^~ zOjGQuC-MJ_c>h-JCR8{6BHk{78W+R{OA(*>Z24kDGJDKe*4|7W0Le_PiugR`YNIOX zzca5rwrMFFyP%CwIOm(|)N_|3X{TGewS}Ren{Mq-8&1FWqQUhOIx=#;i$E-{zkC)|OeOrXH9t8B6O9$R{>ni_MNe|~ZXFec{ zTz)K))t(wPoE@;u{TA^gvBkU98q%gYnKct9!KnHsuPA6TET;aAG@kXS-BPABy)h%( zt@)^`W%JS7aWJY(iGA054x1p-6II$m7Zz;loZJ_iN%*CP^Wdd4;g|<5}p(AtKceaR{{d7ek6RiTPkx^W#?zksT zdVl{AG-zZB7}PEh7r=z+k2wV2qqDcKgK9uA>|zL9@K^a>=H zy(GMl_NfMQ1ntmV8;t<27gj^1&sEf&zcqI{g^X5S$yYFS3@&^Pme^aV z+g>@rze-JeEMQ%gI)JcgcOV8=&$JaTXSbaYo*34FeoEdqmSA{Fax90s*&_jkGDmUG z_T)9sTL$S_kcd*C0se&|@Cs9l>y7)#A6@EaU%HK%7iiwA*TAXrU<|}v7eeStdc?v^ z=oRFE#WU=7_csdmBt;R>_oC#ErB#Iu%$Hg`KT;vc9&QOfD-R$sE7)9wIZ~;B6x-6m z*eyz*5izk&rRdTZ>`fyIs+vO2jZ-tG;oFV%2j2|QI>#1<*w*B8l2FHKY3`-*`ZJps zCrYxAJPXPyo25*hs)gd--0;XQBy(wT58bYv^+s)+WyYHP&b$JI^v9+S;>6DjAwknn(NC3_jvS8sfio(JRUVD<<8L~y8)IEaCd?`1PHFdg1ZHGnVsDG-1pJl=iT35``KoSo}TKiu5+r+x8$5tWk+-2s!W1w z0(9e*>5zGh4^v8dg6K28z6>4>Bu;MtFZOU&hvk_;JK_gt49!NP2odE6Z$hd2F_S7L zb5{j1d#7vmI$}n{$J6f9!{hE`Zdbs=G4!e=+U(>+lDi<`*H7<>TC9TsE?>-;BgNk$ z&A~0+y;V?2Dm18WoaH@#&+l@eBhtacW9I$cu7t=`g7=;`FrTQan=1F0crS)5X^6bdr8dy4oH7YqK|3mI{f6q zeqo*xgg@eD-x9|*HzPXG#&*IiNMsO6;UOXO0d6Ur!a~$ndGKn>GShu$51{;NT5>)a zmp|O^d&bL`zqeZv*;emSPdd`1y?h^Hs$2hkCEso$_4dh=4zr1~w34pA+Fv~3UR73m2G_v&4%o^=HF(Zz6SG+q{hZX-)PpA9JLi)$iS3i~OrQ8qt znn+tbekzvcrpm`pPnC`f$84$2nU1zgr5J^&z~Z;B#%dn@Q9oAUs*ZO7EEYF6adYNy zOXaG-nWnME063^cq0q4_AW%zDqrZn=uwMsgPBvbZ=erI zJP)Hd`PQV3Rgpb)e8LTfJ0*8=6}&*x>OxzHm=>-);eFd&HY63z3Va#K#cu5wZ3P zlHSLoGe^Vk=3d*3#a~eoM;<+@~~Psl3e?d$YkLSk(j2aa6~H{8ik0# z1954RMV@j`hAG;I9{Ca{&d`V3TT%uw#AMi?m4qZ3R__vL_2;wyfPmZ zudwQoDXY|aq?le@w(UQ=g!`zJQYW9b9rbLi@J0QaZ(GP>8+x2leQtY#QAqmamyCX} zy>ppnt|*cKxEpA_dB{)5S|M6BXHKOUsJW@6TsA?7)xFsqcf4-wbZ=|z+IieE&EX05 zHFtX)GMn$ur=Oi5C%g{ebSQ}d_XdTv%Dy>V(JtxkO+y_+pri1pvVHWV&gMl) zTxyn-vy889vZP@0F6MJj`@%ua`Y|RJZ&L{IBa0MWztDv~T*(^f%dD|4*Ae!|nIqpM z13J%e@o(JM5v|8QSwA&v4BuF1-_Q(Bj1&VjxmS<-1XsF(n$sY7rfOquibEAsPgK&6 zF^JE^^J)Z12pm5a`ySNcpoI=@q3dibPT8SFmxX=B62S9yB*oeYJ|!_iB6ow2?f>xs zi)-B!i#)1M096-CX>kprY3ShYy*Kgi3zOKYpzg>~+eHGWzFV}~R$ILn=S70^&qO|H z@sBd^ggtUlF<`h?hX^2WDV!4mS zmO}RxHL5K8Nf1EgrkMqM-1hT&c-oblrMC6atnRXqhw&0T=QbupHm8^aFTn{PFf#@& zN**@!0N~D?xlWFw?}JALatQalIm*`v`gBgs5>QeKl9+VI}yysbrcAd$HftjrdAYxPF>MG}SZXF5a}1maW^T>k5!cMd24rj&O> zT*rBC4M(rrS?B2Uf{gReN6#hQvz6Q{k0-F3zu2h+cFR&>^J0H;MD=KuPFZYIOkO?D z6_MTCh~M>3egZ;pwkKX)%-uFBQAnI@v7o3#QOM}DY}ArzL4Jl(*piSyhSOAHw~`|a z|J4P1wR^SR?f39JiPaKmy*K&NdQ{A9O@r*OM2?Y<-k=_6>q9Hk8u@{DF#kO?hGL@! z-dvKE0g9xuQPzqa;WNp;-*KYFOP39GO z^N)J#hVq};y_&aU3FfLr+TLyazJWv#LJiAIOtU;Sa;^OBai=HaYc<^+)t<`&tFg@G zKufx)`qj^#mZQ}bo_kkZ+9Tu+hQO~3^9_>o*v=&mnX}%@1D1&G!~4TcOC8}2E?i@d z#bY%%kqq&o$(4xO9)dCyS1oE_g-NA@bfXWV&g!s6Z`zWk;t`Y0uDz!QaV}{t5RN8r zoPoVXyTXBIMeUVF+S?}CIgjtTymXt|wqi!W`gmJPZk2waoBKw^e=!Z=>_=F1auI=1 z8c!w~TBz|}lV0ZF^YZm<9sXGsbB37Vyo1($JGB*vF`*c1q@pM8+5(ASX3O-yN30)Wct=QH_ zcw-WBnoA6e+#9=Lj|3?KgI5`8e^HN5v*hv_FE<$3yp^zzZzV0q|$z=J~B=qIxC zQuq%;dHYCmve`j>)rvE9+NcT&&?BTq(S`p1UAI zFN|~Yg&VsO3i=!lT-)+g=Po=p=Ugh%w9gn{lld1Wp5CS7u`87lytHh;S`T;-|2$cF z*^p){8<`u~)!D;BAKzPx_39YQIQ-C`=Sga$UX|g%iyyBbGKO;p2rwL;;kTu^)U%}# z%lZIAFDJVL32Bc8k5{%V``$2^>x#uQK;yK~^zID!lhz(>a|L&19jgnOZ#c`yQ&W{l zoOpvdc}||{MpgEOnV!zWkV-Pw+5)F5^6eY0@D?bD&7V+A#gM`AMtO>Yn9kR8$#e5| zcBr#(mfQU0WmR_1s*0WJYAeRaQO1M=*&Ub-C+UNgk0H+rWaSe%GQ zh$Nt%vC7LDk8R7U?%pm28g#LHj4zyhhG-g|U0VT|M2HbWVY?8bOQbE^MgUyJqXeRy z@St;t&>qXSYDW?A%}XkzNGkcnH{IW8+fP5VMvac1pWenr+Zna@>=8=R5h9&v808pKfCW8v5YAIC=o{6hHhC zJ7au);~e?1NVg;e4OjgH1m5T4H~HPFKcl&Wg7hi`m6Q_5sJ!)8V50h%p2=1F(>KTb zNW=WDZrjSLI)5vn-Vx@uG*K<*zpJ>lF%Rq*!)T}yy=dBTUx-NdNB{J4d%a+|c0HQM zG#)*|jBV8%r zFVXN*wc#$Ug`)XOSm;!pQ8pVN^8@B0be|u;0#jewy5j~nUS7p?fMvuAp-t?J3O0Mq ztC^o&C!cL{E_ZLFxO{?jv=-hGzU4otDKOvC(f&ru5Hn-q`x@?0H%>C`v4@hypLqmU zK9LlQ@3{@~9bBgIOu%wVHzv-Hyr%3^-Zo_A6Iq0}u}V5ii6>#jnw!Pb3?Ml)a-yb$ zV8bR0kEHAKczv)^ds9!?7R^W3W|2QQ#sa{aMNlB#jr`brEaawc|epU3N+GwtpiEtPfD<4813 zrokyaZh431lc>x>KxX*klTL*=dBe|aU!06$MifrtCe)G2-%8a&F>Z(Xbs!J1YEP1U#0a z|J(j%XdQQvAAZ?V3iHN(j_$fu>+K4(yDva0-!v~_7;JyDMlMqG)i*1rP+U%-O%`WZ z9P;{G;UN3Y*z+sN!}!Yflr9{7aZI%B3css;WDJUJ`-O#l;Pd-}fhKC%!IW#eLfa<^ zny1qTa0hd?Z5YKIMlVJgu-(<&5ObUy`=@VU!1pZ5C%{+p0)QU*S2YVV`6P; z@T+S%9J=_zJ@M(Buz{*#TLal91V?M=D@vi#(X0xWPm%^ZVWzKbL%UyJ^Ab?mi+>Mt zKTIA7bajax?Jdqqkg?IfDa_;l(X6gjF3VRGDVwo#o3FcKcto&o41_BUB}V)yAmaU| zuyim$b+d)3mUOk;idl#AqYYDFqm-e+b@<^F=SM}mcasEM3|lM&P+11G8|nyw;Pq)E z^|Hvh&ylc$jYBtnK+ikGEm&`9wuU*T8i-6-%maDk59QI26F(c)?#-G-Bd5^~u=nxD zrdQ}ZI83X*+r+)$Ru_A$l0)Y4Vu#qSI6KL2|RsNp zI~s!ggAVg?uM)WQ7uqHHy>p~mWL%PbA*SBV;+eZ+=kr~E`ZAnYdH$}5_!ms#&ANb*CSP-OM@Qp^%7Ansd&vv2cuuxc84?|0cv|sd+S8=2yz+%P*3UsSrD2nJt)m zCq8HSHr$|viSGYsVA7P`TUH0ww=&`WcNzY}L2^v%^!K#?%Wr+FSGTr2C6$V3V&5YH zY@t0%3ECGKw@RR4qSb=7%9on2f?xxa)FeFq7~6ISwVhaZMpBZCOQJRThusRGHlF;N zhqr!qY$fjA@CH!F(%aov$j6hIf{TqWUR_&t?u{_%>V?Dg(bj^Y0hgtIygs$(jTl~! zio50a2P-BCS1uCI!>m-rXT-?4ii zu2D6TABXun$p^AJ29%I{>*H6&vv%XGc8a6?UsMW6m1KW%#@YK{E!^0c(Q35^6aF}W zWK%AYv{08t;QrW#*<<84{Ou=vf)pE_!h&9N)@Z5D>l)YWUO7;FouNjDVv=%Rgp~kI z7@6hft4_I52j{a!*!LxyA1RlJ?@THuq~HF`ekL0A^`nYv>`t#fE52&xuRRo44k9^* zi{d7sZ#bg4;~}n`ZJm(pMQMF+Lz0?3#jex%@Ni&CWV#+>5@8aK&gmcV9PUFq7%aIM z4W*E!?9#ZKRRneze2%w{)t;cx9~H1auFm<4Ypst8J1qny%g84~Z~4HAN@ILtf@O^3 z70xy*-6bwALEB)mw-jUwmm3Q6f%mv##6)0+pRzjSAY+uze;psZjI^x2@9Hm%&a}(r zF*rknRw<}zkP6H(aE*?YB4;#hCT2OVKV@-%0uQShciKh4Rm4tiiJjZhWOrdHo5&wZ zGmfQf#v6tIym+61kM)fwjOImsZ771d-!09D_P`Bm+gslcQQWXxm*Ua3#_!{Y6Z+m= zJ1h%}>p@HAba6}ApEKYN9v5PDaLz4@j6-0`F3L|Oa?`^JdL~Z3hbUoF$fd#HMB^cTT8yDtyiViwmW$k5vO(cp%WnD>&bc^i%Jl74 z+?OvUvdA(?kk0kVBPA+-k7+d}@@z2E0XG-FPH*giV= ztJ@!6J>V-K(0#&c1&tPR9Cthnaqbu`3{k?ln!BzemLFDQs=5`c8QOCFMrPYaqCPTv zJ3~_ljd=-9u52TGH|}dOXmoPpNr@-vO`E($5731uy3^N}YtR<_&R&&cu)`;GMT9LP zF3rJ)kkNyJ?M32I77MkPuDrfszC=(a$gUibp0#XKyHG|}>q0^^v zNOI4xRn8GZ@l$i1ldNB%DHRL8Iip7;oYj@`1iG(EDGx!vJYyFjSohTIZIazkWPQ!P zmDrGnGWM<|cd_HUvL>c7WAgh?339pCvf0pBD=}%G`{M53t8OEh#MqNB7&C zAIjTMle|%{zgCB!snnX(hPwNHgDgF#r>~z;5O-A;v_KD?DOV2k-v#v;Lj}vkNWrZD9NSlGWFl~7IiO)G}&g|2-DNnxf zjkRve?r>|-UEkb=HEcBH1sN}+2pw^D$5S>Y*xzLJT?{sUhH8&`FY$sPH5TKKtwq9W zn)n!Wg(at;X;y2&&nfKW!CyARg0q~0rX8w*{&vJJLV#2b5|suAl>+Czt&5>GADuN! z1AkKwctY^Z(NG9<2UQ-~b`Z#ZQ(j?p9&_f4N>u5;ql-Q9GY^iC+rtifC3vRCGVz1N z41csFsV|%Z$$ob6YtKsY#Qb_!3h$z2`Ym%mX)XQMs`xWc1)|Sc zS`0{Hnh&5h;=p7LlxCy7r;L#fZ<5RU&LjHaS>uWKA;Ca(hQT1AjGgJ3t&k^Gx}#oBUEEJv@Df}FUjO*9SKxr`FYx6BzDbLZk4;{l2b7rG*b1r~GiF7%*05MxMQCt3LsHk6^!j#^#Vomn(`c;bJ zVeap&diL0nE} zuwK0vqmBKX863=KsP1@@WtKhl^EqCbpnrncpo083qbq$BS6eL_GTjX}$%IR_Ta?ykd*B(E$5XN-#zT#~j_YrKkD%i@# zo*b49xWpu-FUu)y`t!V`+RpO9AcFTsZ-Ucv%tN&D$xJO4Q*1Rz;za8QUY-2zho3pa z?o&J5<#)ccL4A!AI4G4pcTg5fqw?Nri28=fUPSMi_5#J6KnQD1lIzf=k4i%tF9!j{ zZuDyAboo+eOktkG4YdsQXrXq<@whWy*|(~0p*e)-L;#f!P%uzl6|QN6)w2&>w1<=< z*69XG*3>wP>HU$z?8#PJtphO>F%0h-F}6uc*`35o<5}DoxX-nouQ6ec)wZ=A3(#=O zqj|p-s0#jKGdX)V-^-+OIW1@YvuFa{Ib4-Ap+u!?J;yzC=j6SstqfSflr4woxLDO3R z>@XhnVFD)({a0zNG=M${V`>$`E#2Z5#s@@m=p9{=5Dy+Y-{0S_JpjZj{*-ixy8&o# z+yml0%8oonB}q*q>>AW6Zd#7RuhaR+k+xVa^kYn<{0E+SL`a(PF6&5JpxZS}V3g0o zM*AZ{HRRG$Je^G9}ChX}Zo;yGXbW_*&dv?S>KyRYS?_kv&iY1!qu5#>3VZqs{cY5|(vSMaT$qfLGa zQ@GVbOJ}GRUvEZ_hD3B6!ny3ElnRDPV)jy^P?`Qt5LQ6M;0ZQ2KspH1t)W__N0uyl?b*+ zxzHk+7h?-2EZ2Oys;35c(A~x;+3pbuc&S>QJWM@_OK@?` zXp^jmM@|DPb|%Jn*$WLi*M20|ZRRtt>@B***v)PzuHl%wdfRoif1zcGHmEN)0s3&gcy-R zv{y6Ot#kn!>RE?ww&HG1U9|TE?62I%33)%j8?YkW-c{5e(=`44^ZoE^A-2U!P&vRgv5Gw(?i&r zmCjqa3%+v?LDRQtUsrABQq)-q_EDJK_o+t;5O=s7BD0rw1RH(g#w!e%cB;1?^V9;D zks&116^fV~r`o@XR13(Kvw@6;e{4w7MRQlC>f!kW4%>^UprSg^zvKAg-cZM>@@l`e z`uU!p*C>E0?1Lg{=WCH^tMjn26?>7u93PgMEoBp?#Iflp)I=?+` z=B;S?M>i8VQ6($7>qC;vDtqX1MetN*yh1Gfgj?7XM(x`0 zMw)N<(~qS))~k;G+vbN~cM#U?I4#sl$N-%e3ez>Qk^8H){33xHpVjMHa%ALJ`xba?@mxD&4$ykQOH!g((&l%C zmF{CE42UMRq|Yer$N8W3Z2Wd$iT%TYg@V{OX)?4-KFF4zeaPc;7qQlIQ(5PaVX+4^ zd#bhCUv>qOs>iyj`C)uiW5!40*t<{Hn|_zz|X}m|KJh(H($N~ z-}ovbf;sa0AOipkm7s6InEg9|d)@#uN7MH%j!v%3ZdUI0CJx5dc1$)-=9ZvE&;|fq zPD)k^00993FarMpKq~-o02CzT?+^HZ27h4SVPK%4VG!ZqVBwJwk&%%Qk&sYOG0{;_ zF;J0^&~eZ)u(02}d4r6Gi-&`ahl%|L`*$J`P~c~vVGv+o5U^2@P_X}BAD|up20S1R z0ssX;4uHgffWm+P4S<(C1wg=nbNf5Pe>)%`!Fhy*gGWF_0^jfz9RLXd1qBHW^*h(# zyZyoO0B8&tOfptcSS%G|IC5ufwxIYtcnYz)-Z!e#=alRwE*}vPad7eQ38<)PXzA!V zIJvlac=^O7B&DQfWaZS%a5Q1{29y=DQOL)wdMk`h!6q(Z#17YMqdLNL4dO(5Fna#xykVA!4U)q)O@yS zH8f&W0S11x>)yXye|@dFpMI$@2LXgrK!CfOz`+>JMI?2g;i)e3!*eqT&|UG$5oog% zIJw*X@?v;VkbDa{|NoG>)vo`Cuadym`Fao_cQo+nv3pzkwkq}cRTl(Up9cX5c>h2D zb~W;J8pVsY;qEoHc;&LcvG*@F(*mmDhCEee%PFa1lZlK%P7|{-&MGE5EV#Xbp=M1q zl}NYAeTh0!h9^#+l4O++4tP9QrIAXI|z{ML*=y?8+9Do zD~YYi`b9+&8}L`q%=H?5m7)RxoZn5^PIiFnD+MM9(2_hGc0Zgml%^v2<}AnSubY3L zHHN}oPlx6MZ*7LEV$oh!V#`5*llg4r;L=~r;llH}fgK>g6Qilds}&rx)*#~=XxwcI%?DgHXj#|YYLQ<1-mA}yds z=pywwO8#|A^UFfc{ifV;It5^$FyQOoayzYiY4zh$W-?WOh)0$6xh!|l11uehSEQQ; z>y6U5?^q71CQtYS&%Qszo)E8UoKlly%=ZF*9t2 zog)S9ONG@nj)3cHZ!imj@byYhHlzSYQZ7hTND-q}_jhU&U=a zO>&x>#{U20?Iq0dNz$$zLbKw@R7#`$TDJ;84Q$8^1<(FXY$_WWOjc|d^8 zQUQw}0WMuR=4f9Fo(PRKp-|dAczN+|ONBSfI_wXNL4XZb5MZlf(rtJzv7aCYQzJx| zDo#P2G_@LaQmH^tumZN*KE^QEzQ(NaQdq#NQmnaa(g*|yExu?j&IAEI41oX<1+N5| zgKHU%uTZ3~^c?{avrqhRAb?QnPv&Y9;q07V5CBDS+fk7l1b~PI0p3VIb8<&_a;!hY z3O@tAUa$i#!3plqJbgM&i`}=Z4eVF*TA5V@0eVb9fNv`Q^00xhB@U^=#ld9tdy&JPWK(jdd4}O3k5+9Dqb=^Yb`GTY5h}9lC7}4k`92v&?%N`r<#*8slX3|5ux}J-*WcN@5%Y;{r&QqXH>NCu7E?MIi&~B>d>2$?&iU> zW{s(&KOH7q?PJ>~cPESda<>ka8GYQ{;t6et8xWxUdtWYfZyues&06#X?TG1s zAMMvQcd4z@G%J)bI1xCKyD6r@h4_ypRr)WyuOZFv1WWu0>GPwZ^Paye#`DQ7+P#e< zp^tU8pmD_WosHQ?4m?+)$Hjfrcjy<&NcLl}<$w7-ZOHUt3CEKhncC;^owirSZ`~4rm zP%p4oSa^qK+wpPR8U)CbH>6ltAU#)}d_cHgd2Lw^JWyQ-$_*TDsu=|V;Pf6!|Ct~91Jb%#Ewp>naRS_)NKK-jLS1zo?PnEidcV@TQaGzgj5@>N7w?+N zZpT3+&-0VIzOXLJ#F*Q)p$F2unq&dvl=y_H>0|jaXZB4O&(?1|6)Xly;2oPsp^5U%g0u3zxXYK?F%X z|8|Dk-o;iioU+{A{Kts@Lq4!e-`=m@o`vzVcaL?hL@!O)*WGzPw_evIKRY7zmw(%% z9M*xMn8f@jrA#qKxqb1?U-2m*aA>{1BM$cItOGlyY1PyD;o{hk-mA50A`f?IfJ{Q% zGk({8LfPw8)j8H@e>m``6$r4h{;0+|*1bmW*G*|WE&1kpKL%Sx67W|D=r|0#L~aBD zs_8(0FA-mXZru;CI)Mw|MsrG1r)K}qVRH8Wrl$Diw=sv4z|Fl9do{eD`l{>saqEYM zx`irq-Og#evb*sx=fuJ_Gz~$#+NUx03QPahm{A{ zZw6;U0I`%V>6)fMFfc(K`EY&OBE>LR>HL~gY7{X!riZT~xSJK&kP0BV=e+6=r8r&qVuUvct*DDMA2$K60IJ~`;tc~qUVR6HEUVS&rHC3xjm^%z) z@|5G$yaML&fefTo{*g}}UZiRlaKX>QHCnoz<6Y4V#~yXnTk#_lFPo&Rux}AgTQvKV zQ_(J!Arwn0y;HZAyh}Ko+1sX9F2NO~E9;`~FIpnrx%L{M%nSH$*%G5kH~D6+ltH4D z%ScW#twj_h*ig~-F{ygUI7cSRIs{bzGs{(0`WR2Q!imD?XlWKr3Tt{u_76vm@+0Vw z{}Rf-&f`A>xC^~LV{q!zkE+Q$NOm;KethAEiWmU_Li9H#AFNNn3)i zqIpo0?wiuOY-pAOK7)7_&J7`>M|^Ul93lUy+Q#ZINwBe#OfCtLI&v zFHaynZ|psA4H+!c(qbS$ubuF-BI$WW2R^ujVnV=0witMyad=Sh$NjapPOs{&{}%nP z@8g`EmTs`?aLtG%L>)!Ll=EKt&UeG4|)Gaqz7PxsPm3j z$@M;aL`7u@zK7*))Tdt9*46<0d$BF41Vcot1eqa*@e(mvp~BPZln4r5@l6l7H;mI` z|3VbF_Wv7OtWUvX7XGItp$XEF7}M7`o}YvdRHnMmb<+q*J5yIY&us=0aFng6+3bLOhj%I{quXikaA*JBH76-&wA z3aKL?D8es7wKOGa@p#m(s;&iiWWaKf^@fJVjJC>RE$s8~3aL}`Kw0WgQXBuqru&1a_ zwTDYg1F9z*1vJK9cr68R9F3x>;GgQ2MHBl4FVp8Ic16$%FJX60bbp@a1H|qJO*S+p zy<<ms4DRoUo#(ei1IDD-997e9fbRwoj!gmRkhf3z6O|tpJom17OOwj%OHiV(oOfJ&nH=Jj@igHI$3bO z(INg?g0jI)Q+SKXIah~WmX}i`gW}F8Xv1Qex+cary;M{p)1=tg1o+-WH-qzbiK|r> zTNX&l9?C4ul0qAmLx!sL^Z^|Xn`n&$3idMP&Ai#2nejHDfq0bmyNbXEh@hXw{_5aO zf@F+3{l=nH_ei?GLUI3+1h2ZUCj(!^$loAsa{3?ai}lz;!h$N1Z&#aHtx@{n(rL!%8Fo4+U3{@p?mswZFI9axsuMF9Z3 zf0ZRuM>|Is*FWVbOW$#s1v?ZhN5T?ahEV#t?xoiAv1GvVV%g*Bl26-|8pQk!C`F)v z3EYBG@E*#P?+qci_OtFkd)t#{>gkQE?Tv@4tDgf5qYm?iQmMq^2t`gn+qdxObns4K^2Aj! z=L?N)-)IeIv2-u%Yw5G&Xvwuwsemgt&v~yC`DPvAowSdS%k@qM+|P>0Jyv7g_&EJc z+Lb;>G16;{e3H|#4!vz>ST6upiVnJn4n(aK5p6#{JaxpcX3lRLFAbF$56@a=ckqPx zk$FS0!pI`dX7Bl-eyU4w?D`mTm=zd}hK^gX#ayGxDC>o-!B|Mr#A3Gabv1-ORK6L@ z96C~s3goH0ty3cU!BzVMlf@45YvAY=2zJhOR3{>cm37?I9o6|I$PvWyNp+cO9ub+z zQ`N|6=>z1aQCMs|JuZOxTSqKzwWCpT+XoM~av*=M>DP#QwN8G9q->i#vb>Y;lltgc$8Z4Ufb;rD|9X@e>mC z)2zs{_726ktRzMH%SyMJkLVca?)q)wj-t}57N~GO6EiIr9geGk8Xb?H- zS=tGu5+e-`G^{ohA|dE2O*Qemadv)u$?j<-Y?*Y$@w~g$7HH;C->}HaBwHibKSp;9 z^@=2_67Rs@V#I7fy`UZvNF4i-2a{^zP3Us(HcNDs@dSD1ZK)-Xl(o+D-8WbyrJQZJP@_ zU|-Ygy34tm!5p5S-+cBLa!9tA=Pj_#T(^qBn+hMYyQ_Y8F@=gBVG5buKWK;OkpC{y z<-$4<^9;f{2w(r>cPnH82`C&B0_I-By9zYR9xTimbWEvfOaU?oA^jY^U}qnt4Xn}K zHxU9bV&7Wx8AZv>J$^lr%e+VY7H%F+?=av6wr3tO72Y{l=`9(^jTtHl2sa)xMx;l- zhYZIyLF~xd%H@3|U=p1;^p1dyKEO;k?5e53NEXOu@HCOc}#)PIyOWm9C22uM?M zl}!UB1so{!-|XY&q_06rv(S7m#*8cTP3{m|iVS1(+qKJ39sghDrXu6|?`L6cwnEFv9jzWCYQGi~x>G)9OO5wtqqyul zVqAP%k$k>3$M6*OcM}~aC_Q|AZ^=~Z4aLbXMbcDX&FSPYM;6uzO@#0q6`;u;{WkB3cezIdQaqbW)f*+DWkjFzJsWkcgj6OD!q|JxfqNlw1+;>9 zI6HLts>*CJ@JTki>){uGC9SS<7@pf zhL@bMxuI%63!Q$)D-G&dg2Lg){HLR|_1O56FcqidQQ)try+|?v-e7L0No%CuYt1+O z{V6)JhI?=;=G#=_ctJbDs2aA$#pX0oe0i=Pbr3cyllY*`9lH%G3d5j>u3gb9@yJf< zc=!)@w6ibrk8QJ0GQMjo^$W+-e*y75ML#=+qb&7r7N4Y<17oH4urE$WHEvptN_0iD zJxqMoxmSg;6YYQcW>qgL)sW79f2|;zCuZSCYCNb6`Sf$u;;hZBhq9l=-kz);y`ZwXHL(H*N=tSZ z90^JF4~9l@>gk4GB9f^g&>U)6Uf#={TG=Nn+n25)JWAhORFu`^`;?d0)Q6TIe?TmN zns*mTn09dIyt1hybm_$1QNk+;N)s{)s-jjszH>%<$)e^D(hZGO_JrbZPRBV%QdBY) znBzoaoe8x`=gB+`J=Jx|l3UiD$m=4UYbH#{sRoW7dsJr_-;iWijx$L{pO(4L`o-Z@ zx+}pa7}DxtVIM`Co3!@&MBQ43G6xFK!^ky@gdE2e6H;4_ zG$%GZQW;hU&hqc3P@I0Sf2vZPGShk5Sd`qP zl00)`vgi5wu1L6SywOAMotJ+-&Wc=H5Oxqb-R_(b!>c<+uYYc|UHIm-{lR_i#GXU^zu47`?=9pA{)D@HVo z?&y4~dlnc2(btr?IFO^MU{Bq`(05u8j7dasn0pIx<~f$MD^oH#q5Eg8=NKk zs_j;|$s!Te5zuM8Iakz;Y_XAR7f~{m1_b$M=l?gJ8r#vT_!`gz`~+iSBUqP)|F3vz z=3?w=?O^$LK((;bH2fX@1yHl&#(ys)9DEjlSa+x6fJ%io+FI0%ZuJNdOL!A>(_ifb zHfO;ceLs`qleM%IyF`qd8(cR@|<-l)5U0SMN3%SNTR3gYS!e+%gWCZPp|FM4& zIYYHZB_N6DUARbRlR*#X{+z4QkxfS-7d6(1Tf~7m6DDJge866NweRM#Y~)NoY~D4} zR(79^^GH=h&XBdsh+P_?83;Zebg)^3#KIM|%3R2-cuBeu`?*c)B?uJME`1vNGh%AaY*tzDm)MD(>upg@bAEun)D3zCZW zMwPa(C{@f+Flj~v3Z?Tp7J;(ykaU_R`V@aDW6u@~QlEJ-Vec*{z~}7nuxhWb$d}bU zh7~uMin!UQdW(+-zm8S5FUI%SNz0}+CXN=LVg&Q2Gp<%kDpSDg5{#RH6we^)FwK_0 zQA>PM!_{s*UM~yg{vtBXxm}-E6s4QD7Ky7Hq>rgiHIP2qB}!(C4k0U;&WsCi&d#CkTref?yi0#>M`yDQ}E@o2Kg_Wkm8(|Nyf+!70%T;?mz+SylMf3x_#{Gytw*he&mrRj8dNX zq>v)~xUva6F0B1n9FTe+XnD5=mZ*%OgSf>JuvqlUfT78Jeig#X&5hF2-cc?yhf^|k zD0D(Gc+PBz#CP;o?yhmTlR1Kc_ty{o>$$={*Uy_Zqpi)m9`7;tb`4&x$AyLc4xhn_ zn;Mcp+o4E-*Ij1A&gbn(kSa5Z&bpxY!}a&bv+md9{UIE$)Pe$m=ePkao`s9gu8H4j zMMk0T!@IKwjDuwi@-u@Wsbs!uO+n$~9~>h|#KSD~7ZW?W%HVQs>^|s!Iu{+-Ptf|X zkiQ7{#VX|+rMuv!IG)_xCxCF8c;!vviIr!%^0PNI748auK(MY1ncQybXUT>O_7=3f zw4kY46r+hJJnKoDv{V)XSNsI=)-`%v#!eg&{&W(;X&l~jeJuubAYs!|`{^~_*Rr#1 zQ!E5uD3we(1r&AzDc8>??@Y001zd2y4@+Gd^-72KhCnNarLkGE42mt9Ih==x-Vqey zx3AnCkaNZBC6uAGM&gZ9JlPRQ(B^3KCQ^==)`Zgq)4JTIHzpYEp@J8xf|5gA_0Kfw zU#(eRX?}~c1SKJu?z)oFGxjqUiBEK~xMS3m;+qF=os_gA2|-?GB&#HiRaBkpaRkbw zMd&#Dj3&h}J^!LbX2oz6a9+9ggO2PQZk!=Z?aw%F{h*$?by?aPn}0 zUy{zeVT7*F{s$Mtw&~?zDwjWp@-1r?wPo_Sw)s_HrCr4BmA0U(#$?t!J84zUcR4(N zjK;QK(>hyy?YRhf*CI@`Yj4`_F>3FI#PQ~c85_H7G9;(;lq@&IV%%0X6#_)f+|cvz z71ZY0gH6i#uqUDrXmhV?fz3?adlw{xB?a?GM;=(vabtsd&pOfKb=0%dQta)6x)lqZ z?+u%);c1te$>KA|C{>!{tg2xR#l>n))U_HJ8Fb|Q$&g+et`UipP*riayHeRcI(>>G zc_&kVK~GXI&5g~obIVDyLIkMi9(%X!O|mo zmxinv1^3jz2`^3U{*h2AexCMFc8{>qRFvfxa>kD; zZLeuEW5jYM;Wr(GRte4(KQe5hb7@;Wc4r&1Ucd9>D^q(>B1zRV3CJgF<#y3%xi1pQ zkV{TQz|F8DW#2>2l4d7#m z3Nwg`vRzz77?Dd6aS@U|F}8`Z%~*#frp8vbEJfRmD5PwWeHSGm(%5r_nu;XkSN8gy z8Mn?j7axDXJwC(7hxdD)cX{6Pp67ku=i#zS-ZSTzT<=FTkSK+>`r^%<0?Tit87Yre z8xHiaxr?=iF#UP!=C{SEVfftc?0plva>$+4e~rD$wzlxqtNIaqDeanplM$dmol$ME zru#PgbmVFljzlYsci79jbum25lJfH$`>J@Tg6;BPxSQYcyGLc8eLgZLkYjr+<1h8N z2L&yvqtBH`%VwlVJ#20yqpYIEBTd=Ft0pZI-TF3zc^0gsV)8_nV34sRkHwPjXOYE1 z!yPT9GXZDEI7n5J#V=w`T02$1Ww7WamRc(*Qs@L{{_`bm_udDk#2Ayx*8dqB%?^#Hf{mMRz29$D5ksxdspnq zxsL>lZR^;Z+7&NdKP`m4OEGadz+Xy$4{$J(_R{5xK83^341;*8`xN_gU3ds`r}}Vp zB*EqTIcZH}F`jy1DZ)nv$txnG>Mm*AZwD}QU*ct3)$~%YpZw&g!1QB?fxF_sKsqZ+ z95K{Ez1w@h+qK9(e=D1R$>3cTZ$p24Hjl+vdxlG*7fTu*uMy#{bEi!8hULikS104Y z-OJh2QM1I3t75?)1R~!guyjTy*Zq+dBAiZ_S!_K zgx=X9t1o1iqoZ(@TbLPwX(EmXrzUWOVSHOM`8Vc7h^@@{I{Ku=ZB2gtd;c zoFoyXw?7@XD@O@$*D;#1GIv81Y)UF};Zq?38a}>qK0G+j; zuCu6_ihp%h4%yhVUzig%G^4wK*gnCGRE*74x+<{Sl`NQ%wZ!o3>6V*vn~(Nqehd`C zlO+cfGH-tK74~f;cqJxEsEQ-V{+Rdtmv~tslZf*7=Zr!ZDpjpRpRmdyPVFzusY8s` zwSJqv7n7TlVB2=&{Ehim@rUi7q>MuyHkW8To6*U`#FKRPHHCO6>)@gcbv)L3wejFPc$`U z@~aRw_4{GE)x$>NPGb6K)M;tQq;^J!ki?=hb5{)t+>B~=c+93Y0MS~uS~E{YiS`Mp zH4&2(&r(a|0jYqQfYU&n zK-%(OE{SL_FRGpir!xPSryOXxbTebXHq1#%Df(gmu6k!htogIDtoxh@jMi^OFFekQ zbVm#H31Vl)2oH7nS+Y7~cGOfZd>ME*t^Dad=3bLvl12Bi!k6|pxR4jFHskK~{hnfH z?firlo!;L4NP)O1Wnl6}N^f%?zqQfO7QLNnty!EOx7@9{Z!fV3YhjVP>vxC?>5Fn} zG2!)czL;_d8Egv=ci1Y+5Y6mwObD?wN&57-HcAhrFg@3}Sgftu=CkX3TNixxD{q=7 z7qQ@Y0BJ7f<@sKB8?1Rm5NYzRWYX6Xc8Z9ih|~hx-_4TSc8+g*$uZfhsy(f=JJ5vt z>@bWy&AAyTp45BL*dp_stRr?nr9~%NkaNL<={pCXL6G#7EB0{nV?qtM@+4RDMh&*U z3Qm3}m#wlFz6FtOLZsCdSZlbOMestu6ZeGpJ;@$CLwOsm!iI>s+JTcz;s)~8T?>iu z8xMVp$A(DkLd3t6;X|kNH-3x?jAUk>;7&LZON0rv3!YOy^h(EvS7G*tCs*i*=o^P{ z(~IHUFI1A`7O{hqN}2_SV(=H|E7WYmoiwtY@4e2xOf1f=w|t6jFl7JS-v1@x`{5L& zu9|5(Pyf8CmjNgb7ro**c=}-e(;Pr${<)&#k6<4Q?+lv= zT?!vkmD6n*(Kv0g``|hsgz~y#s^iW1G(aIWA->Q!v(})4P3dvF zIvd$CNu2L+A^aHD(_Z*G~29=?{OLXXK}ui<(DSvJDwF zUY<{6?tNr?enHIgwdmUlmE!4a7Qs1F-dX|nrbfyfrdVCfa9RQI{q!wqCjWM}BM;ft z^}R4()nL-l;l!~FEt2bQ=Jb@=dCX-Yplz4;xfmFwVc@QDFnYXf78sQM@Z~k(&pufG ziPH4+@Wpue+L`%#VemH8L29JG65ulHdk63ghP?qsH4x>8?vexS`^!%HGCmj_9$Jtq zS$-dZ4+e8dfx))Z6@$SrKoYDK8v>4KUo_1o17*BxX4V!5ZjJzMCA@;cDMFXDctr+p z8faCCcF7!IWd~^Oz^a7WUf_iX&P-7yTCNUtr2;ex+Sk?7gW4pk!s`6bDeMK>B$|EM z#00{gh%LjQ7-;3Z>Un~*075okr~;ze(_KOmD=J6JSF~#T&>y0pW_$v##l3WhwU1P+ z-B|Q!>iG=tVv^bj8q6IIt@qmGEx?Va-9W4GnnHv5xS?cdR%=jZ1kgIa$Uk$g(QZSR zZ4HWBTTmbf0Ek;tP%y#e#>vh=LhfIJu1N-yMsA$!{>MhhU?RqilkrL$AB^kJhJ|!v-FL(+H(~eh!w`Z(I82gO0734u5yW_=uOvWMcJ!74zUFm`<$ZF+;^pogbH+@RO`xMf{~ z^5`{q<)ibm-zq%1S!a2=fIgJhJ}wAKdj0g8hXuGr~iBBl%8H2523Hz zM+NY!?4d%N0J_silb-hNbHXwny6*@jK&`eQfpYU7!b%%16acl1f`GcjWxxtMDYQ7$ zRtFaMxV2n-h2;)fe5JVvEDVE50tDoClose(); } +void SdImportTestSmartArt::testAutofitSync() +{ + sd::DrawDocShellRef xDocShRef = loadURL( + m_directories.getURLFromSrc("/sd/qa/unit/data/pptx/smartart-autofit-sync.pptx"), PPTX); + + uno::Reference xDiagram(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY); + uno::Reference xMiddle = getChildShape(xDiagram, 2); + uno::Reference xFirstInner(getChildShape(getChildShape(xMiddle, 0), 0), + uno::UNO_QUERY); + sal_Int16 nFirstScale = 0; + CPPUNIT_ASSERT(xFirstInner->getPropertyValue("TextFitToSizeScale") >>= nFirstScale); + CPPUNIT_ASSERT_GREATER(static_cast(0), nFirstScale); + uno::Reference xSecondInner(getChildShape(getChildShape(xMiddle, 2), 0), + uno::UNO_QUERY); + sal_Int16 nSecondScale = 0; + CPPUNIT_ASSERT(xSecondInner->getPropertyValue("TextFitToSizeScale") >>= nSecondScale); + CPPUNIT_ASSERT_GREATER(static_cast(0), nSecondScale); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 56 + // - Actual : 100 + // i.e. the left shape had no scale-down and the right shape was scaled down, even if it was + // requested that their scaling matches. + CPPUNIT_ASSERT_EQUAL(nSecondScale, nFirstScale); + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTestSmartArt); CPPUNIT_PLUGIN_IMPLEMENT();