From 8e6eff67fc8565998844c311fc0653295d67d96b Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Thu, 24 Nov 2011 16:13:42 +0000 Subject: [PATCH] more progress with XSLF: made some methods publis as suggested on poi-dev, more tests git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1205902 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xslf/usermodel/RenderableShape.java | 50 ++- .../poi/xslf/usermodel/XMLSlideShow.java | 13 + .../poi/xslf/usermodel/XSLFBackground.java | 13 + .../poi/xslf/usermodel/XSLFImageRendener.java | 18 +- .../apache/poi/xslf/usermodel/XSLFShadow.java | 6 +- .../apache/poi/xslf/usermodel/XSLFSheet.java | 8 + .../poi/xslf/usermodel/XSLFSimpleShape.java | 27 +- .../apache/poi/xslf/usermodel/XSLFSlide.java | 21 +- .../poi/xslf/usermodel/XSLFSlideLayout.java | 12 + .../poi/xslf/usermodel/XSLFSlideMaster.java | 11 + .../poi/xslf/usermodel/XSLFTextParagraph.java | 51 ++-- .../poi/xslf/usermodel/XSLFTextRun.java | 23 +- .../poi/xslf/usermodel/XSLFTextShape.java | 17 +- .../apache/poi/xslf/usermodel/XSLFTheme.java | 14 + .../poi/xslf/usermodel/TestXSLFTextBox.java | 29 ++ .../xslf/usermodel/TestXSLFTextParagraph.java | 36 ++- .../poi/xslf/usermodel/TestXSLFTextShape.java | 287 ++++++++++++++++++ .../org/apache/poi/xslf/usermodel/empty.pptx | Bin 29356 -> 24151 bytes test-data/slideshow/prProps.pptx | Bin 0 -> 30976 bytes 19 files changed, 547 insertions(+), 89 deletions(-) create mode 100644 test-data/slideshow/prProps.pptx diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java index 21ab67124..67af3a179 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/RenderableShape.java @@ -65,6 +65,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; +import java.util.List; /** * Encapsulates logic to translate DrawingML objects to Java2D @@ -125,6 +126,8 @@ class RenderableShape { CTPathShadeProperties ps = gradFill.getPath(); if(ps.getPath() == STPathShadeType.CIRCLE){ paint = createRadialGradientPaint(gradFill, anchor, theme, phClr); + } else if (ps.getPath() == STPathShadeType.SHAPE){ + paint = toRadialGradientPaint(gradFill, anchor, theme, phClr); } } } @@ -165,7 +168,7 @@ class RenderableShape { return paint; } - private static Paint createLinearGradientPaint( + private Paint createLinearGradientPaint( Graphics2D graphics, CTGradientFillProperties gradFill, Rectangle2D anchor, XSLFTheme theme, CTSchemeColor phClr) { @@ -205,15 +208,16 @@ class RenderableShape { fractions[i] = stop.getPos() / 100000.f; } - AffineTransform grAt; - if(gradFill.getRotWithShape()) grAt = new AffineTransform(); - else { - // gradient fill is not rotated with the shape - try { - grAt = graphics.getTransform().createInverse(); - } catch (Exception e){ - // should not happen. - grAt = new AffineTransform(); + AffineTransform grAt = new AffineTransform(); + if(gradFill.isSetRotWithShape() || !gradFill.getRotWithShape()) { + double rotation = _shape.getRotation(); + if (rotation != 0.) { + double centerX = anchor.getX() + anchor.getWidth() / 2; + double centerY = anchor.getY() + anchor.getHeight() / 2; + + grAt.translate(centerX, centerY); + grAt.rotate(Math.toRadians(-rotation)); + grAt.translate(-centerX, -centerY); } } @@ -237,6 +241,30 @@ class RenderableShape { return paint; } + /** + * gradients with type=shape are enot supported by Java graphics. + * We approximate it with a radial gradient. + */ + private static Paint toRadialGradientPaint( + CTGradientFillProperties gradFill, Rectangle2D anchor, + XSLFTheme theme, CTSchemeColor phClr) { + + CTGradientStop[] gs = gradFill.getGsLst().getGsArray(); + Arrays.sort(gs, new Comparator() { + public int compare(CTGradientStop o1, CTGradientStop o2) { + Integer pos1 = o1.getPos(); + Integer pos2 = o2.getPos(); + return pos1.compareTo(pos2); + } + }); + gs[1].setPos(50000); + + CTGradientFillProperties g = CTGradientFillProperties.Factory.newInstance(); + g.set(gradFill); + g.getGsLst().setGsArray(new CTGradientStop[]{gs[0], gs[1]}); + return createRadialGradientPaint(g, anchor, theme, phClr); + } + private static Paint createRadialGradientPaint( CTGradientFillProperties gradFill, Rectangle2D anchor, XSLFTheme theme, CTSchemeColor phClr) { @@ -498,7 +526,7 @@ class RenderableShape { if(shadow != null) for(Outline o : elems){ if(o.getPath().isFilled()){ if(fill != null) shadow.fill(graphics, o.getOutline()); - if(line != null) shadow.draw(graphics, o.getOutline()); + else if(line != null) shadow.draw(graphics, o.getOutline()); } } // then fill the shape interior diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index 9de0c7493..9ffcee684 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -32,7 +32,9 @@ import org.apache.poi.util.PackageHelper; import org.apache.poi.util.Units; import org.apache.poi.xslf.XSLFSlideShow; import org.apache.xmlbeans.XmlException; +import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlOptions; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId; import org.openxmlformats.schemas.presentationml.x2006.main.CTPresentation; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdList; @@ -355,4 +357,15 @@ public class XMLSlideShow extends POIXMLDocument { return _tableStyles; } + CTTextParagraphProperties getDefaultParagraphStyle(int level) { + XmlObject[] o = _presentation.selectPath( + "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + + "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " + + ".//p:defaultTextStyle/a:lvl" +(level+1)+ "pPr"); + if(o.length == 1){ + return (CTTextParagraphProperties)o[0]; + } + return null; + } + } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java index 7d8cb061e..0c60ec604 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFBackground.java @@ -20,7 +20,9 @@ package org.apache.poi.xslf.usermodel; import org.apache.xmlbeans.XmlObject; import org.openxmlformats.schemas.drawingml.x2006.main.CTBackgroundFillStyleList; import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor; +import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties; import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D; import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; import java.awt.Color; @@ -91,4 +93,15 @@ public class XSLFBackground extends XSLFSimpleShape { } return null; } + + /** + * background does not have a associated transform. + * we return a dummy transform object to prevent exceptions in inherited methods. + * + * @return dummy CTTransform2D bean + */ + @Override + CTTransform2D getXfrm() { + return CTTransform2D.Factory.newInstance(); + } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java index a8bbe8b6a..3c3d49bfc 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFImageRendener.java @@ -24,6 +24,8 @@ import org.apache.poi.util.Beta; import javax.imageio.ImageIO; import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -78,9 +80,19 @@ public class XSLFImageRendener { Rectangle2D anchor) { try { BufferedImage img = ImageIO.read(data.getPackagePart().getInputStream()); - graphics.drawImage(img, - (int) anchor.getX(), (int) anchor.getY(), - (int) anchor.getWidth(), (int) anchor.getHeight(), null); + Number groupScale = (Number)graphics.getRenderingHint(XSLFRenderingHint.GROUP_SCALE); + if(groupScale != null) { + double sx = anchor.getWidth()/img.getWidth(); + double sy = anchor.getHeight()/img.getHeight(); + double tx = anchor.getX(); + double ty = anchor.getY(); + AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ; + graphics.drawRenderedImage(img, at); + } else { + graphics.drawImage(img, + (int) anchor.getX(), (int) anchor.getY(), + (int) anchor.getWidth(), (int) anchor.getHeight(), null); + } return true; } catch (Exception e) { return false; diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java index 7c2128e8f..42dc360cd 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFShadow.java @@ -44,7 +44,11 @@ public class XSLFShadow extends XSLFSimpleShape { public void fill(Graphics2D graphics, Shape outline) { - double angle = getAngle(); + double shapeRotation = _parent.getRotation(); + if(_parent.getFlipVertical()){ + shapeRotation += 180; + } + double angle = getAngle() - shapeRotation; double dist = getDistance(); double dx = dist * Math.cos(Math.toRadians(angle)); double dy = dist * Math.sin(Math.toRadians(angle)); diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java index 8a74e2d0f..fb8da22e1 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSheet.java @@ -413,6 +413,14 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements Iterable fetcher = new PropertyFetcher() { public boolean fetch(XSLFSimpleShape shape) { CTShapeProperties pr = shape.getSpPr(); @@ -561,7 +561,7 @@ public abstract class XSLFSimpleShape extends XSLFShape { * * The following order of inheritance is assumed: *

- * slide <-- slideLayout <-- slideMaster <-- default styles in the slideMaster + * slide <-- slideLayout <-- slideMaster *

* * @param visitor the object that collects the desired property @@ -571,24 +571,21 @@ public abstract class XSLFSimpleShape extends XSLFShape { boolean ok = visitor.fetch(this); XSLFSimpleShape masterShape; - XSLFSheet layout = getSheet().getMasterSheet(); - if (layout != null) { + XSLFSheet masterSheet = getSheet().getMasterSheet(); + CTPlaceholder ph = getCTPlaceholder(); + + if (masterSheet != null && ph != null) { if (!ok) { - // first try to fetch from the slide layout - CTPlaceholder ph = getCTPlaceholder(); - if (ph != null) { - masterShape = layout.getPlaceholder(ph); - if (masterShape != null) { - ok = visitor.fetch(masterShape); - } + masterShape = masterSheet.getPlaceholder(ph); + if (masterShape != null) { + ok = visitor.fetch(masterShape); } } // try slide master - if (!ok) { + if (!ok ) { int textType; - CTPlaceholder ph = getCTPlaceholder(); - if (ph == null || !ph.isSetType()) textType = STPlaceholderType.INT_BODY; + if ( !ph.isSetType()) textType = STPlaceholderType.INT_BODY; else { switch (ph.getType().intValue()) { case STPlaceholderType.INT_TITLE: @@ -605,7 +602,7 @@ public abstract class XSLFSimpleShape extends XSLFShape { break; } } - XSLFSheet master = layout.getMasterSheet(); + XSLFSheet master = masterSheet.getMasterSheet(); if (master != null) { masterShape = master.getPlaceholderByType(textType); if (masterShape != null) { diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index aee9ef002..91566cb09 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -184,23 +184,14 @@ public final class XSLFSlide extends XSLFSheet { * * @return the information about background appearance of this slide */ + @Override public XSLFBackground getBackground() { - - - if(_slide.getCSld().isSetBg()) { - return new XSLFBackground(_slide.getCSld().getBg(), this); + CTBackground bg = _slide.getCSld().getBg(); + if(bg != null) { + return new XSLFBackground(bg, this); + } else { + return getMasterSheet().getBackground(); } - - XSLFSlideLayout layout = getMasterSheet(); - if(layout.getXmlObject().getCSld().isSetBg()) { - return new XSLFBackground(layout.getXmlObject().getCSld().getBg(), this); - } - - XSLFSlideMaster master = layout.getMasterSheet(); - if(master.getXmlObject().getCSld().isSetBg()) { - return new XSLFBackground(master.getXmlObject().getCSld().getBg(), this); - } - return null; } /** diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java index 4a505972d..f8cd23ccd 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideLayout.java @@ -22,6 +22,7 @@ import org.apache.poi.openxml4j.opc.PackageRelationship; import org.apache.poi.util.Beta; import org.apache.poi.util.Internal; import org.apache.xmlbeans.XmlException; +import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideLayout; import org.openxmlformats.schemas.presentationml.x2006.main.SldLayoutDocument; @@ -115,6 +116,17 @@ public class XSLFSlideLayout extends XSLFSheet { return true; } + + @Override + public XSLFBackground getBackground() { + CTBackground bg = _layout.getCSld().getBg(); + if(bg != null) { + return new XSLFBackground(bg, this); + } else { + return getMasterSheet().getBackground(); + } + } + /** * Copy placeholders from this layout to the destination slide * diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java index e73ee7a4c..d4383c4d9 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlideMaster.java @@ -23,6 +23,7 @@ import org.apache.poi.util.Beta; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle; +import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMaster; import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideMasterTextStyles; @@ -167,4 +168,14 @@ import java.util.Map; return true; } + @Override + public XSLFBackground getBackground() { + CTBackground bg = _slide.getCSld().getBg(); + if(bg != null) { + return new XSLFBackground(bg, this); + } else { + return null; + } + } + } \ No newline at end of file diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java index dcca92fbf..67a5013c8 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextParagraph.java @@ -570,7 +570,7 @@ public class XSLFTextParagraph implements Iterable{ /** * - * @return the text level of this paragraph. Default is 0. + * @return the text level of this paragraph (0-based). Default is 0. */ public int getLevel(){ CTTextParagraphProperties pr = _p.getPPr(); @@ -823,7 +823,7 @@ public class XSLFTextParagraph implements Iterable{ AttributedString at = getAttributedString(graphics); AttributedCharacterIterator it = at.getIterator(); - LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext()); + LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext()) ; for (;;) { int startIndex = measurer.getPosition(); @@ -898,29 +898,27 @@ public class XSLFTextParagraph implements Iterable{ return _lines; } - CTTextParagraphProperties getDefaultStyle(){ + CTTextParagraphProperties getDefaultMasterStyle(){ CTPlaceholder ph = _shape.getCTPlaceholder(); String defaultStyleSelector; - if(ph == null) defaultStyleSelector = "otherStyle"; - else { - switch(ph.getType().intValue()){ - case STPlaceholderType.INT_TITLE: - case STPlaceholderType.INT_CTR_TITLE: - defaultStyleSelector = "titleStyle"; - break; - case STPlaceholderType.INT_FTR: - case STPlaceholderType.INT_SLD_NUM: - case STPlaceholderType.INT_DT: - defaultStyleSelector = "otherStyle"; - break; - default: - defaultStyleSelector = "bodyStyle"; - break; - } + switch(ph.getType().intValue()){ + case STPlaceholderType.INT_TITLE: + case STPlaceholderType.INT_CTR_TITLE: + defaultStyleSelector = "titleStyle"; + break; + case STPlaceholderType.INT_FTR: + case STPlaceholderType.INT_SLD_NUM: + case STPlaceholderType.INT_DT: + defaultStyleSelector = "otherStyle"; + break; + default: + defaultStyleSelector = "bodyStyle"; + break; } int level = getLevel(); + // wind up and find the root master sheet which must be slide master XSLFSheet masterSheet = _shape.getSheet(); while (masterSheet.getMasterSheet() != null){ masterSheet = masterSheet.getMasterSheet(); @@ -946,9 +944,18 @@ public class XSLFTextParagraph implements Iterable{ if(!ok) { XSLFTextShape shape = getParentShape(); ok = shape.fetchShapeProperty(visitor); - if(!ok) { - CTTextParagraphProperties defaultProps = getDefaultStyle(); - if(defaultProps != null) ok = visitor.fetch(defaultProps); + if(!ok){ + CTPlaceholder ph = shape.getCTPlaceholder(); + if(ph == null){ + // if it is a plain text box then take defaults from presentation.xml + XMLSlideShow ppt = getParentShape().getSheet().getSlideShow(); + CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(getLevel()); + if(themeProps != null) ok = visitor.fetch(themeProps); + } else { + // defaults for placeholders are defined in the slide master + CTTextParagraphProperties defaultProps = getDefaultMasterStyle(); + if(defaultProps != null) ok = visitor.fetch(defaultProps); + } } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java index f67fde8ae..cb7e5fc12 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextRun.java @@ -30,6 +30,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType; import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; import org.openxmlformats.schemas.drawingml.x2006.main.STSchemeColorVal; +import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import java.awt.Color; import java.awt.font.FontRenderContext; @@ -467,11 +468,23 @@ public class XSLFTextRun { if(!ok) { XSLFTextShape shape = _p.getParentShape(); ok = shape.fetchShapeProperty(fetcher); - if(!ok) { - CTTextParagraphProperties defaultProps = _p.getDefaultStyle(); - if(defaultProps != null) { - fetcher.isFetchingFromMaster = true; - ok = fetcher.fetch(defaultProps); + if(!ok){ + CTPlaceholder ph = shape.getCTPlaceholder(); + if(ph == null){ + // if it is a plain text box then take defaults from presentation.xml + XMLSlideShow ppt = shape.getSheet().getSlideShow(); + CTTextParagraphProperties themeProps = ppt.getDefaultParagraphStyle(_p.getLevel()); + if(themeProps != null) { + fetcher.isFetchingFromMaster = true; + ok = fetcher.fetch(themeProps); + } + } else { + // defaults for placeholders are defined in the slide master + CTTextParagraphProperties defaultProps = _p.getDefaultMasterStyle(); + if(defaultProps != null) { + fetcher.isFetchingFromMaster = true; + ok = fetcher.fetch(defaultProps); + } } } } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java index 2aabbd2b1..c54d74e1f 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTextShape.java @@ -51,6 +51,11 @@ import java.util.List; public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable{ private final List _paragraphs; + /** + * whether the text was broken into lines. + */ + private boolean _isTextBroken; + /*package*/ XSLFTextShape(XmlObject shape, XSLFSheet sheet) { super(shape, sheet); @@ -441,17 +446,23 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable< /** * Compute the cumulative height occupied by the text */ - private double getTextHeight(){ + public double getTextHeight(){ // dry-run in a 1x1 image and return the vertical advance BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB); - return drawParagraphs(img.createGraphics(), 0, 0); + Graphics2D graphics = img.createGraphics(); + breakText(graphics); + return drawParagraphs(graphics, 0, 0); } /** * break the contained text into lines */ private void breakText(Graphics2D graphics){ - for(XSLFTextParagraph p : _paragraphs) p.breakText(graphics); + if(!_isTextBroken) { + for(XSLFTextParagraph p : _paragraphs) p.breakText(graphics); + + _isTextBroken = true; + } } @Override diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTheme.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTheme.java index b996dd5fb..41f2109fc 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTheme.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFTheme.java @@ -29,6 +29,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTColor; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping; import org.openxmlformats.schemas.drawingml.x2006.main.CTColorScheme; import org.openxmlformats.schemas.drawingml.x2006.main.CTOfficeStyleSheet; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; import org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument; import javax.xml.namespace.QName; @@ -150,4 +151,17 @@ public class XSLFTheme extends POIXMLDocumentPart { public String getMinorFont(){ return _theme.getThemeElements().getFontScheme().getMinorFont().getLatin().getTypeface(); } + + + CTTextParagraphProperties getDefaultParagraphStyle(){ + XmlObject[] o = _theme.selectPath( + "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " + + "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' " + + ".//a:objectDefaults/a:spDef/a:lstStyle/a:defPPr"); + if(o.length == 1){ + return (CTTextParagraphProperties)o[0]; + } + return null; + } + } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java index 06b5f1b9a..4f921ac05 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextBox.java @@ -17,6 +17,7 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; /** * @author Yegor Kozlov @@ -33,5 +34,33 @@ public class TestXSLFTextBox extends TestCase { assertEquals(Placeholder.TITLE, shape.getTextType()); shape.setPlaceholder(null); assertNull(shape.getTextType()); + shape.setText("Apache POI"); + } + + /** + * text box inherits default text proeprties from presentation.xml + */ + public void testDefaultTextStyle() { + XMLSlideShow ppt = new XMLSlideShow(); + XSLFSlide slide = ppt.createSlide(); + + // default character properties for paragraphs with level=1 + CTTextCharacterProperties pPr = ppt.getCTPresentation().getDefaultTextStyle().getLvl1PPr().getDefRPr(); + + XSLFTextBox shape = slide.createTextBox(); + shape.setText("Apache POI"); + assertEquals(1, shape.getTextParagraphs().size()); + assertEquals(1, shape.getTextParagraphs().get(0).getTextRuns().size()); + + XSLFTextRun r = shape.getTextParagraphs().get(0).getTextRuns().get(0); + + assertEquals(1800, pPr.getSz()); + assertEquals(18.0, r.getFontSize()); + assertEquals("Calibri", r.getFontFamily()); + + pPr.setSz(900); + pPr.getLatin().setTypeface("Arial"); + assertEquals(9.0, r.getFontSize()); + assertEquals("Arial", r.getFontFamily()); } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java index 2974dd69f..62d3c5239 100755 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java @@ -3,6 +3,7 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; +import org.apache.poi.xslf.XSLFTestDataSamples; import java.awt.*; import java.awt.geom.Rectangle2D; @@ -105,22 +106,13 @@ public class TestXSLFTextParagraph extends TestCase { /** * test breaking test into lines. - * This test is platform-dependent and will run only if the test fonr (Arial) - * is present in local graphics environment + * This test requires that the Arial font is available and will run only on windows */ public void testBreakLines(){ - GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); - String testFont = "Arial"; - boolean testFontAvailable = false; - for(String family : env.getAvailableFontFamilyNames()) { - if(family.equals(testFont)) { - testFontAvailable = true; - break; - } - } - - if(!testFontAvailable) { - _logger.log(POILogger.WARN, "the Arial font family is not available in local graphics environment"); + String os = System.getProperty("os.name"); + if(os == null || !os.contains("Windows")) { + _logger.log(POILogger.WARN, "Skipping testBreakLines(), it is executed only on Windows machines"); + return; } XMLSlideShow ppt = new XMLSlideShow(); @@ -198,4 +190,20 @@ public class TestXSLFTextParagraph extends TestCase { assertTrue(lines.get(0).getHeight() > lines.get(1).getHeight()*2); } + + public void testThemeInheritance(){ + XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("prProps.pptx"); + XSLFShape[] shapes = ppt.getSlides()[0].getShapes(); + XSLFTextShape sh1 = (XSLFTextShape)shapes[0]; + assertEquals("Apache", sh1.getText()); + assertEquals(TextAlign.CENTER, sh1.getTextParagraphs().get(0).getTextAlign()); + XSLFTextShape sh2 = (XSLFTextShape)shapes[1]; + assertEquals("Software", sh2.getText()); + assertEquals(TextAlign.CENTER, sh2.getTextParagraphs().get(0).getTextAlign()); + XSLFTextShape sh3 = (XSLFTextShape)shapes[2]; + assertEquals("Foundation", sh3.getText()); + assertEquals(TextAlign.CENTER, sh3.getTextParagraphs().get(0).getTextAlign()); + + + } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java index 07e64de1e..79063a308 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextShape.java @@ -19,6 +19,9 @@ package org.apache.poi.xslf.usermodel; import junit.framework.TestCase; import org.apache.poi.xslf.XSLFTestDataSamples; import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; +import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType; import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder; import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType; @@ -606,4 +609,288 @@ public class TestXSLFTextShape extends TestCase { XSLFTextShape sldNum = (XSLFTextShape)slide.getPlaceholderByType(STPlaceholderType.INT_SLD_NUM); assertEquals("10", sldNum.getText()); } + + + public void testTitleStyles(){ + XMLSlideShow ppt = new XMLSlideShow(); + + XSLFSlideMaster master = ppt.getSlideMasters()[0]; + XSLFTheme theme = master.getTheme(); + XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE); + XSLFSlide slide = ppt.createSlide(layout) ; + assertSame(layout, slide.getSlideLayout()); + assertSame(master, slide.getSlideMaster()); + + XSLFTextShape titleShape = (XSLFTextShape)slide.getPlaceholder(0); + titleShape.setText("Apache POI"); + XSLFTextParagraph paragraph = titleShape.getTextParagraphs().get(0); + XSLFTextRun textRun = paragraph.getTextRuns().get(0); + + // level 1 : default title style on the master slide + // /p:sldMaster/p:txStyles/p:titleStyle/a:lvl1pPr + CTTextParagraphProperties lv1PPr = master.getXmlObject().getTxStyles().getTitleStyle().getLvl1PPr(); + CTTextCharacterProperties lv1CPr = lv1PPr.getDefRPr(); + assertEquals(4400, lv1CPr.getSz()); + assertEquals(44.0, textRun.getFontSize()); + assertEquals("+mj-lt", lv1CPr.getLatin().getTypeface()); + assertEquals("Calibri", theme.getMajorFont()); + assertEquals("Calibri", textRun.getFontFamily()); + lv1CPr.setSz(3200); + assertEquals(32.0, textRun.getFontSize()); + lv1CPr.getLatin().setTypeface("Arial"); + assertEquals("Arial", textRun.getFontFamily()); + assertEquals(STTextAlignType.CTR, lv1PPr.getAlgn()); + assertEquals(TextAlign.CENTER, paragraph.getTextAlign()); + lv1PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, paragraph.getTextAlign()); + + // level 2: title placeholder on the master slide + // /p:sldMaster/p:cSld/p:spTree/p:sp/p:nvPr/p:ph[@type="title"] + XSLFTextShape tx2 = master.getPlaceholder(0); + CTTextParagraphProperties lv2PPr = tx2.getTextBody(true).getLstStyle().addNewLvl1PPr(); + CTTextCharacterProperties lv2CPr = lv2PPr.addNewDefRPr(); + lv2CPr.setSz(3300); + assertEquals(33.0, textRun.getFontSize()); + lv2CPr.addNewLatin().setTypeface("Times"); + assertEquals("Times", textRun.getFontFamily()); + lv2PPr.setAlgn(STTextAlignType.R); + assertEquals(TextAlign.RIGHT, paragraph.getTextAlign()); + + + // level 3: title placeholder on the slide layout + // /p:sldLayout /p:cSld/p:spTree/p:sp/p:nvPr/p:ph[@type="ctrTitle"] + XSLFTextShape tx3 = layout.getPlaceholder(0); + CTTextParagraphProperties lv3PPr = tx3.getTextBody(true).getLstStyle().addNewLvl1PPr(); + CTTextCharacterProperties lv3CPr = lv3PPr.addNewDefRPr(); + lv3CPr.setSz(3400); + assertEquals(34.0, textRun.getFontSize()); + lv3CPr.addNewLatin().setTypeface("Courier New"); + assertEquals("Courier New", textRun.getFontFamily()); + lv3PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, paragraph.getTextAlign()); + + // level 4: default text properties in the shape itself + // ./p:sp/p:txBody/a:lstStyle/a:lvl1pPr + CTTextParagraphProperties lv4PPr = titleShape.getTextBody(true).getLstStyle().addNewLvl1PPr(); + CTTextCharacterProperties lv4CPr = lv4PPr.addNewDefRPr(); + lv4CPr.setSz(3500); + assertEquals(35.0, textRun.getFontSize()); + lv4CPr.addNewLatin().setTypeface("Arial"); + assertEquals("Arial", textRun.getFontFamily()); + lv4PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, paragraph.getTextAlign()); + + // level 5: text properties are defined in the text run + CTTextParagraphProperties lv5PPr = paragraph.getXmlObject().addNewPPr(); + CTTextCharacterProperties lv5CPr = textRun.getXmlObject().getRPr(); + lv5CPr.setSz(3600); + assertEquals(36.0, textRun.getFontSize()); + lv5CPr.addNewLatin().setTypeface("Calibri"); + assertEquals("Calibri", textRun.getFontFamily()); + lv5PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, paragraph.getTextAlign()); + } + + public void testBodyStyles(){ + XMLSlideShow ppt = new XMLSlideShow(); + + XSLFSlideMaster master = ppt.getSlideMasters()[0]; + XSLFTheme theme = master.getTheme(); + XSLFSlideLayout layout = master.getLayout(SlideLayout.TITLE_AND_CONTENT); + XSLFSlide slide = ppt.createSlide(layout) ; + assertSame(layout, slide.getSlideLayout()); + assertSame(master, slide.getSlideMaster()); + + XSLFTextShape tx1 = (XSLFTextShape)slide.getPlaceholder(1); + tx1.clearText(); + + XSLFTextParagraph p1 = tx1.addNewTextParagraph(); + assertEquals(0, p1.getLevel()); + XSLFTextRun r1 = p1.addNewTextRun(); + r1.setText("Apache POI"); + + XSLFTextParagraph p2 = tx1.addNewTextParagraph(); + p2.setLevel(1); + assertEquals(1, p2.getLevel()); + XSLFTextRun r2 = p2.addNewTextRun(); + r2.setText("HSLF"); + + XSLFTextParagraph p3 = tx1.addNewTextParagraph(); + p3.setLevel(2); + assertEquals(2, p3.getLevel()); + XSLFTextRun r3 = p3.addNewTextRun(); + r3.setText("XSLF"); + + // level 1 : default title style on the master slide + // /p:sldMaster/p:txStyles/p:bodyStyle/a:lvl1pPr + CTTextParagraphProperties lv1PPr = master.getXmlObject().getTxStyles().getBodyStyle().getLvl1PPr(); + CTTextCharacterProperties lv1CPr = lv1PPr.getDefRPr(); + CTTextParagraphProperties lv2PPr = master.getXmlObject().getTxStyles().getBodyStyle().getLvl2PPr(); + CTTextCharacterProperties lv2CPr = lv2PPr.getDefRPr(); + CTTextParagraphProperties lv3PPr = master.getXmlObject().getTxStyles().getBodyStyle().getLvl3PPr(); + CTTextCharacterProperties lv3CPr = lv3PPr.getDefRPr(); + // lv1 + assertEquals(3200, lv1CPr.getSz()); + assertEquals(32.0, r1.getFontSize()); + assertEquals("+mn-lt", lv1CPr.getLatin().getTypeface()); + assertEquals("Calibri", theme.getMinorFont()); + assertEquals("Calibri", r1.getFontFamily()); + lv1CPr.setSz(3300); + assertEquals(33.0, r1.getFontSize()); + lv1CPr.getLatin().setTypeface("Arial"); + assertEquals("Arial", r1.getFontFamily()); + assertEquals(STTextAlignType.L, lv1PPr.getAlgn()); + assertEquals(TextAlign.LEFT, p1.getTextAlign()); + lv1PPr.setAlgn(STTextAlignType.R); + assertEquals(TextAlign.RIGHT, p1.getTextAlign()); + //lv2 + assertEquals(2800, lv2CPr.getSz()); + assertEquals(28.0, r2.getFontSize()); + lv2CPr.setSz(3300); + assertEquals(33.0, r2.getFontSize()); + lv2CPr.getLatin().setTypeface("Times"); + assertEquals("Times", r2.getFontFamily()); + assertEquals(STTextAlignType.L, lv2PPr.getAlgn()); + assertEquals(TextAlign.LEFT, p2.getTextAlign()); + lv2PPr.setAlgn(STTextAlignType.R); + assertEquals(TextAlign.RIGHT, p2.getTextAlign()); + //lv3 + assertEquals(2400, lv3CPr.getSz()); + assertEquals(24.0, r3.getFontSize()); + lv3CPr.setSz(2500); + assertEquals(25.0, r3.getFontSize()); + lv3CPr.getLatin().setTypeface("Courier New"); + assertEquals("Courier New", r3.getFontFamily()); + assertEquals(STTextAlignType.L, lv3PPr.getAlgn()); + assertEquals(TextAlign.LEFT, p3.getTextAlign()); + lv3PPr.setAlgn(STTextAlignType.R); + assertEquals(TextAlign.RIGHT, p3.getTextAlign()); + + + // level 2: body placeholder on the master slide + // /p:sldMaster/p:cSld/p:spTree/p:sp/p:nvPr/p:ph[@type="body"] + XSLFTextShape tx2 = master.getPlaceholder(1); + assertEquals(Placeholder.BODY, tx2.getTextType()); + + lv1PPr = tx2.getTextBody(true).getLstStyle().addNewLvl1PPr(); + lv1CPr = lv1PPr.addNewDefRPr(); + lv2PPr = tx2.getTextBody(true).getLstStyle().addNewLvl2PPr(); + lv2CPr = lv2PPr.addNewDefRPr(); + lv3PPr = tx2.getTextBody(true).getLstStyle().addNewLvl3PPr(); + lv3CPr = lv3PPr.addNewDefRPr(); + + lv1CPr.setSz(3300); + assertEquals(33.0, r1.getFontSize()); + lv1CPr.addNewLatin().setTypeface("Times"); + assertEquals("Times", r1.getFontFamily()); + lv1PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, p1.getTextAlign()); + + lv2CPr.setSz(3300); + assertEquals(33.0, r2.getFontSize()); + lv2CPr.addNewLatin().setTypeface("Times"); + assertEquals("Times", r2.getFontFamily()); + lv2PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, p2.getTextAlign()); + + lv3CPr.setSz(3300); + assertEquals(33.0, r3.getFontSize()); + lv3CPr.addNewLatin().setTypeface("Times"); + assertEquals("Times", r3.getFontFamily()); + lv3PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, p3.getTextAlign()); + + // level 3: body placeholder on the slide layout + // /p:sldLayout /p:cSld/p:spTree/p:sp/p:nvPr/p:ph[@type="ctrTitle"] + XSLFTextShape tx3 = layout.getPlaceholder(1); + assertEquals(Placeholder.BODY, tx2.getTextType()); + lv1PPr = tx3.getTextBody(true).getLstStyle().addNewLvl1PPr(); + lv1CPr = lv1PPr.addNewDefRPr(); + lv2PPr = tx3.getTextBody(true).getLstStyle().addNewLvl2PPr(); + lv2CPr = lv2PPr.addNewDefRPr(); + lv3PPr = tx3.getTextBody(true).getLstStyle().addNewLvl3PPr(); + lv3CPr = lv3PPr.addNewDefRPr(); + + lv1CPr.setSz(3400); + assertEquals(34.0, r1.getFontSize()); + lv1CPr.addNewLatin().setTypeface("Courier New"); + assertEquals("Courier New", r1.getFontFamily()); + lv1PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, p1.getTextAlign()); + + lv2CPr.setSz(3400); + assertEquals(34.0, r2.getFontSize()); + lv2CPr.addNewLatin().setTypeface("Courier New"); + assertEquals("Courier New", r2.getFontFamily()); + lv2PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, p2.getTextAlign()); + + lv3CPr.setSz(3400); + assertEquals(34.0, r3.getFontSize()); + lv3CPr.addNewLatin().setTypeface("Courier New"); + assertEquals("Courier New", r3.getFontFamily()); + lv3PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, p3.getTextAlign()); + + // level 4: default text properties in the shape itself + // ./p:sp/p:txBody/a:lstStyle/a:lvl1pPr + lv1PPr = tx1.getTextBody(true).getLstStyle().addNewLvl1PPr(); + lv1CPr = lv1PPr.addNewDefRPr(); + lv2PPr = tx1.getTextBody(true).getLstStyle().addNewLvl2PPr(); + lv2CPr = lv2PPr.addNewDefRPr(); + lv3PPr = tx1.getTextBody(true).getLstStyle().addNewLvl3PPr(); + lv3CPr = lv3PPr.addNewDefRPr(); + + lv1CPr.setSz(3500); + assertEquals(35.0, r1.getFontSize()); + lv1CPr.addNewLatin().setTypeface("Arial"); + assertEquals("Arial", r1.getFontFamily()); + lv1PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, p1.getTextAlign()); + + lv2CPr.setSz(3500); + assertEquals(35.0, r2.getFontSize()); + lv2CPr.addNewLatin().setTypeface("Arial"); + assertEquals("Arial", r2.getFontFamily()); + lv2PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, p2.getTextAlign()); + + lv3CPr.setSz(3500); + assertEquals(35.0, r3.getFontSize()); + lv3CPr.addNewLatin().setTypeface("Arial"); + assertEquals("Arial", r3.getFontFamily()); + lv3PPr.setAlgn(STTextAlignType.L); + assertEquals(TextAlign.LEFT, p3.getTextAlign()); + + // level 5: text properties are defined in the text run + lv1PPr = p1.getXmlObject().isSetPPr() ? p1.getXmlObject().getPPr() : p1.getXmlObject().addNewPPr(); + lv1CPr = r1.getXmlObject().getRPr(); + lv2PPr = p2.getXmlObject().isSetPPr() ? p2.getXmlObject().getPPr() : p2.getXmlObject().addNewPPr(); + lv2CPr = r2.getXmlObject().getRPr(); + lv3PPr = p3.getXmlObject().isSetPPr() ? p3.getXmlObject().getPPr() : p3.getXmlObject().addNewPPr(); + lv3CPr = r3.getXmlObject().getRPr(); + + lv1CPr.setSz(3600); + assertEquals(36.0, r1.getFontSize()); + lv1CPr.addNewLatin().setTypeface("Calibri"); + assertEquals("Calibri", r1.getFontFamily()); + lv1PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, p1.getTextAlign()); + + lv2CPr.setSz(3600); + assertEquals(36.0, r2.getFontSize()); + lv2CPr.addNewLatin().setTypeface("Calibri"); + assertEquals("Calibri", r2.getFontFamily()); + lv2PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, p2.getTextAlign()); + + lv3CPr.setSz(3600); + assertEquals(36.0, r3.getFontSize()); + lv3CPr.addNewLatin().setTypeface("Calibri"); + assertEquals("Calibri", r3.getFontFamily()); + lv3PPr.setAlgn(STTextAlignType.CTR); + assertEquals(TextAlign.CENTER, p3.getTextAlign()); + + } + } \ No newline at end of file diff --git a/src/resources/ooxml/org/apache/poi/xslf/usermodel/empty.pptx b/src/resources/ooxml/org/apache/poi/xslf/usermodel/empty.pptx index eea1e064e93d56146d6b196ecc9c4f8fcba8f1b1..ababa9379101da3043aa5d798574476094d1e6b9 100755 GIT binary patch literal 24151 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 MYLWbiB6qHeCti+@S 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

aUN)@@TxMi3xI_3)`k`Cd_$TKr-kZTq0R;NW(pc zec&l!>SNOO2kN`C)2v5a4xB>EgOSu5HLmsRm|I{xkZ30Jc|ubWJ{wx2_OPZ5rIvnl4~Df-TsbM*>W zBL%Wc>n`1Y6;0Gb?mH;g>}%Qe=;oDK38`?6;%^5KOPy+*ss)^j2{2>R+= z$rc7C4OpgHp|Q=`efTOwh~+RV`^!eh4*JPN7dz98UB1d?vj;N+oj38Z_c=YD<1bSQ z?zYS*$U_s1G-qm(*@+cg_mb(t>{Ry;^>o(=~z0Zu+x}_YHSr9`l%PAa-Hr`!fwqQ+_IDAN;64)oFbP+ zH)dXP_@!gs#*LIddrD^7VXV>Q72yX0)mc@Mk=${6>}vQf`nOWVc@^5tIod)`u!&l4 zZ;IPTk5Jh-Fe}iYS*+ZR8#B`ubKiZ+d+2uMMZZvmyTyztElP~;A}*bjq>neb&t48o zk{>6x$w^=B*E`B%C@OWFxqfy%RgCTPHm^a4z>sq~@50jVU$e@Sb+MqF30Kz5vJE|X z##L$nH&?9dyPY-r&TFG0uH$hbMd7%Z5>rZndUrzBHsYzAb~qKoUavBjoog{!w%+FS z2gP`s@B_6qHG@-feCvAk1AZQ0Xs2pEEw`0Y%Td^=XMNX*ymN+b_NrL?{B7Rw-1+>W z$Riz+GC?N>)NzW^zR_+mog3|Lm{jZM;>&RpK`I-I{a|< z@gvau7|@RYp?D3P;-N|Q9)JL1Q$KoUef{JvJDj+nz9U~)4?`4T z(<`0kC&?bj1l@9nOcY;mQn9!Xxip~ANTw{5k+~!$NNl@zDKUNA*5XC#7|ULG?G~4K zK9V8!4hh!$UT+sJ_qkB#Vk3BRQ8=ihabeB(+XpKcm$ktnUA6D{;<(Kf1RaIK|d;aMF5B0Yv zQNF)#@Tuo~I(*%RD*MHjMT9<3R@G7yeWzj~jk#u%H;QelbSSI*)JNH>8cD0m7-T}r zmW$&_iT>79!Crir-XTTzc=)`CIdAllRF`u}!~VKk8#ylUu%Dk#e+f*|{?#38AFCdF z54a;Og^?AIWB=-ojwI3#Zv@=%&ys0r`Ug;RjxS4C4#}1`6sAcU`)J%h;SyIyB*&uZM0k$g%1PRlbjTdk=GkC4Z!_ z`s_YJBf5~zO1D8mCGufm&rDD$sX3C7UA3OG_j>VGR8=e4UY_Eou2ZgS;(>y4bL(x)2~t=_NU?En0MG@)a?NWQqQY*e9;ovRxyCS=i^4n_PNhq0+tGWJfCldV2d2;px9;9G`H*GhpAyigUx<`= za$H2ni4aCAXymBtdutGQWS~eUm2qbR95ct4?$<=r7mq^B$Ff&Ad%n?$IcMnX^qvei zkFh%`xo*R!^n{7%Ya;UIX(pm%e6*Nk*UY8cy``zcLdxgb6|NkbQnAh8<9D#`QPQ7e z4iXs6=lvoY=}iJs!1TMAAEQ~dTMclBW+sPlb+6-wn9d(~jeKlR9c?MO1sv?fQv{CK z2CQg&dvBj5msooL#!f$`1}gz8w+dORNPGVXJiI@+}yk1n9ySNO%d%wb7chEZcd7yzOE(G$@F^cJezwwDJ37P-1-T4Pg$)JGl+Q}z? zaq#!a3#o$tW^W{OuZ0YXyh7Uy6-otvQ-1lm{g|irngUT|2xJ|;#a7zvgbyX-1Dg^=JK1(jcEqUqk-lIKgL2=L& zZxH8$T^+aJlu#TrO%=pV?^qqT;E7NiG+hkD)hn)!TW~)p4w@?h;y8X@9k&o#0mVUM znL*rbt<`Z0wa{y0XFoL@gf--?y*St`_(p(aAnWmuDwB<0iAsVAoJxWMpc6D8K*eDZuwuFfT7Bh^AFK?6i8(FngQW=oX!VstwB^;yU6xh z!wl-ij-x$3#|b0?T*f@$dJp^E+?wp|V<1|E_!CG{=+Wsx|3V4E%EFHcU&DbAgKI>N z07HvnZ*?@N9Bu^6qAY`Po|A1Ja2ivqfpdZAO;#$vX$z0WWC7K%nPSey2vaMVmqCy> z%ZXu3N5!1)AwHBQ_x5n3PIL>U-k5fxa?YADG+B3sZkIM_K!O&#S7_T1_JWnZ(roKz zet3@?(1v0m;=T0z%%y(X&F-DUn(ReTr^7|5OYEY@HOs57*HvnzEqX71|9(4yWl%dr zhz(cFuc!M#QHIQ@)7~CjYS?>imo+gLxdMaV3e;{URWj!kY@HC`tQ!3#;ia``$)q-; z&6R`J57j(F^jbJB4~LQVPu)*tR|Pth94`5euPwPEY~CN~ml`JUKsv+-V*O2@O^sER zL{FRhu<-6=3)$GHio@>74#YMxO**3uDdYE6%-&!C0H2@00J8t)8AQ6VW{|%;gA*_S z0Q8q<(6KkNbfBgAq%zIMug@1Yf7e~aZWgH3(S;(vYG z+B(uYSeh9cIne%NJN-GJ|0Bx&xv?r@d(HdlV1lm#Is<0Cl;;F6^QCF?Wlzj5zV)n# z>nE)Y*$>}7I?xXK_0hEdN}ef(Z&?4Fh<`2`pm7DQwB(Ip?dAAE_S}J^t<7hJQy_$QKnfs($#rX2R1M(UZIvroHSi%9DfGVoi*jlEcwgHG| z(fC<9$eJIo-N#(rQO09{dTHG9%KrrYcSbn@Dp_avG6)DL0015U1mGV=`G+-Z?TsA1 zw1=LfnT_@TXOk~y1NbFBzJBn(`>0r$ln$gr0KaYzz2bFG?kg*&hxVZV?mZTJ!Rt2(tP{X%9LOoVQQEVYI$LKT2PMTn?8(94*XHJXYS zsScqsE~e&NjMe;E`6Oq9|GA7RD;Ds&kba*z;qL+VBW6b+fkM7D+Cqj*e2ug)i&&pf zsAr0>r431s8pkEZ6;w#Z_P(m@hqbDA9~-44DY$8hACCCH`j9dPx`Nv zJ||g88!aV5OLAge4wla0k`&4BfFtP3*MQy?YEv3fFKzEb&r~D!fNYX=^yim)M97WT zTxYjJnx(R8RSOZji?}%k6Zcq&!ec@$`NC{x#j-$rk+5&NojyuA=!G*aN3odld9JU} zcKF%zg>#vxq%z2R9()*r{WlP9iM48c6(Sp}3%{4`M zz!cJ+-1txhy9<7)6q4&1Zq(B-pvu%N53Cg?@?xCLh~i;QP^}1P7n4I>bZbtV!UAx| zOtXZ_2w$d8S(FJZ#EBd+^LnZc{Egs@pO%hm>wJoFqR1kiTC+18F`aFZvk3E6B7-%i zsHAqH!ldlLt!;$8xk%El4>{Qc{NW}e@HvuYOfk_mf&tU0WJ>cWA>XAg%@^^$+)b(SFxX)Bit-HFk_U})$=|Q4m5E*5F~%*d8^!>NGSrPk)mHX(c$5- zO!sK3K>3d`Uw#-XOsAa=)#FclWVHyiMymWIs#rWdkF)YaAxTI!#RfbEE6KOfZ{}i}llU+ONg`-=WHD zppA_X1OPxE5dZ-7pWEY~q3VBv)VZpZ%{~i4C;EvGzTDcjYK{mjuXLX`KgW&DNk~^J&l9Hd=30$8FjSSp($=2Z5TT}_ ztjtes&6a?zPvF!o*fEA~TxI9Qg*LtK;(oW0QGB;%T3_IARSrdr<8ZYeFRSfrIwD!a zBBELd+$^S9mA|?yaq6SWC67At9ZQOP(^;>GK=3YX!jr1E{3hw@+3iJFu!m1a7`C)S zj^zl?QEOX@A3V4NzrNi0onsTdC`)IKyeF=+SsLyGJN-oQ99Qo`%DH2FY}&+7&CNsD zeFobXd|H^h3~d&Z?Z%WVHNst11-m$z#0n&pYu|!Zj_jpiwK|E+OG~~HO=ajri=3=E zD-n&kefyE6t0=GAgpbs1ZPN@6XgT;>kJr@=BZ(SIhv;0-xDeOW&@Xa!v81AWLkvV2 zISwr2emOetg?WrK9w;s3?i3+m8x$Xu2~Y#aw^0ror^$9+`40)fFm=M=X2m$->s26bgmIWbI{iPvB1SpJnE2A=e-oxe8N5#z(ojc3_{%=r(oNMqTNaX1j` zi`Vo$r_7*Z_{Us7Y*0xrXME*@ka64unxaBbYW#&_92(-blYwPRxhUjN@GA_&ZQkX` zU!tzZkU7NfaNh5rirv|6c(Qy6h1;_!Rf4&0TYrC){B<7=p>aScM}`}pBKv_@&-YJC#|e$N$~Z0{(MVst%JyRm^ESv ztj~cV&{ArwInX{I$*&@ZGFM<%rZLqLQrKUrrWpUXy}srtQNENO50PDgD6jdi)7P4=fEN9etV-P`GpoywNo z=xfxlb$N7ak;%`Fj?7;haXwW}0<`Sn?OW6$UKZ`i1_tSdVhj_cUT)!cObb62;=8CX z-zt``HqpXwS{|M%J31e%eKzkq_}w&~OG#j=KMy~s8|*FyB8`3oGMZhQ-nn7FDs@=) zJo_O+H)C~ZUq^BXMiZJsm1Dv8<>d5D%t>O0O(JNNdYd0(Pe3H@<&`KN(tY3k?VAtg zRgdJ#?azX!@QWfsuF891EoiA@9wfX<=|Uxwo$4mo@PqSjol4XmFW17?OxKrsqx!2; zkA*|E`7mG5*xTD`t-H_?9H}5|#$7Ms9DIP(*)dVF+(Xuh*H6 zYi^m-F*Q#ZF!fE}J>C2}J-TZ*9-dC$IR4&Q6ku#s)twn`p7S5BdGg7I_hO2LAoO%e zaoUK3QC#sSDQpX3cz2S8LtMIqZ$iNPRc2ZA)tEC@DW?Z82l4BE9JHm{AL+PnTN>Ws zj|>iEF4DTC+M0d|;51+jT~5}Gi;Jk&UBYkKSPX8%R}BLat0NV!{^i#e!Rgg5KmOJ_ zi?eYzU0*Y-|7jgbJvSRC$A7cVKOX&$bpoS%q59|$1h4!*5gx7Q+!11nv<0tsgzkZp z4A;Tdi4F5lw$lwjd-u=jY@E}6TVM^wBem}^FVq3?ZGoJ5R_{70rF@YJ3phv(}<$og%*r#j_0h zYWsix4WOiKUR_5b8kVfP(j6UF3DOB8%5pwfYj_*-^CyafcWo)Ad8s0*jj*;Wl4}S{ zAiB~W!);blJ>L;Qp`C*65H`nclcF2?ezne&P?f4(c(Z3EqAnA~Fj4h_`axH<_rcM&qR2~LVk1?7_p*vW zd(%AxCW2BRjI-Y?#GR-;Nk4p^VwmHosRV3bI!66bOM00tsVFDO{Lgd9ZJ6-YfJu_# z-c5=x?K@-$Fw7Vq_!(>5 zfskg*M+z6L6TfN6^LXk@jGf6;c)0)w)^MU6pyB36I|fHdCr8;1moX0RxQ~yP^TUE? z1$&D`Z#2VA*s@&b32GfRj#}C*do{e+K8_tNfVPbbrV*Qgph6Gi<4^g!u#fh!g(^TS z8-5RGAmj5G_$DG+XhT-b=U6C`RWKkL=CH9vVU;)3%2*5KWEY}o^SxsQYux0y@pU(Y zymLlFxRNG@I|Eq6l^2!H@->_#pcwRCrLs6e|D>Bon>(v6tb=e8k(wg%vSv<^Fdg|s z*q6!A6gw)YK#G1C>BnWvq5JjofqWwQeOByzJ*_#DNyJmZB+8 z@n-C)GU!4PrEfP9i)1h#i=-sRoB0p!@PK=!UkQJB6&FdtHB0nwd9)z&OrZ=(e%aZ*1ZP z-q`%D%Ta(~89V+;f&jt)$i4qjkg&FKG;&b*M^)l~?*DW(8A_{BYjh}H)eAl$?^&bL z{2&o2m1PSIM7lgZ#KD46mdh+K4X52tYht>pYk6I~mfH^*4i~)_O;r`Jh;@dJAsyK0 zYJtX7w7<+lw2x(+{i#anChZ2vF!OL@Pn_>>`hANN$O);hix~z56v+k^hGW(E%&BZJ zNKvMeBo|bBR-G8uLZ-K2Ko+Pn4(i5K*( zpslP@c7A1WaVbJJ=ipo*_sA#QRlA+pG;M zP8ow{FMf(a+{zmx4&`1ENp$>B>)@o%`+-;QEQ)?cD!k}vQGs>_*+HoOBgb6}P|=G6 zQ{PHPXWgAvI+(n>HEFlLy|iB3bMW2Gz`qX|gmtuYb?^G1A&fi4H{Y#GxchIzk-`eS z5B67Ws*m(P!qLA(%b(%sFLLEPZQc4SD+<1XzQ+aGLetg&9|spyGi;V>=WT-BqjHy0 zNT>|X0|}G9@XGBH$*y2rn2ow{suQ-U0H`JZCcH3A!2IJ^`O}%8>a^ye9R;v{H#S1J zL{f0ACdk3~zLkw+g{A_ge60Al7})92w=+DSma(E%h#&Ks4n}^ksWN7~N$Mu^-akwv zvS!}3((E9On>;(7bs9!uDU6FfhZjOt+|b}zesY*SLg>B)wWm;s&7 zHj$H+r%FIBLbYp5q9>AYXo*ntP62UP;38n`!g}))aU5D$)e^=tw_3goXSG?rjAyM~ z*9^k$_?@Qnx4Bb^D&wchW}6uU7WzWKMi(x}KxN}I>#(I9>wYWfBNde!(zVPHPA##| z=@=_<_=A zn$~M!KcULr#Ckhabp>q1JUFY6-PcDx5x8nrwGZ+g7;CPsA!Szo8PACMc^Ar9m`dQ= zAj1+4j6+JSIJlsFO6v};*$5shrfZ1ww>d=v6TtRbknKV3iYpjSY?^|8$9a zh#M+PTfXoxP$~$2RoiV5j%+X3k(I{{`U-IIfa-o=;nD@xqP2{pjFct&BznmM%yyHu z6tsB2_f%=W7v&&$uC+>arGO);Us50y%~DOLiG?$h;3v*-za90=0F(Pt4c2f|Yj>=S zhMSI* zQ8J>aOUKw-T$yLqA!0Q`XD$%BAPMX#5#4e7SP2BJN&57DUQ7KsBN7Oyjj>pDI*ZU2u5Hbpz20 zS#H3T-+L44kk7Pe_ee-nr=lk63|%vf1zQVU`Uh?z zxd$tn_85wrXwk?PU@D;p=~zOaT`aH%4W!m0&s2d=5@aR}w?A=r>k+nSOEssRME4f12l(__EqluNjoXVt5(QiLav?q_GDb9TEk&m3e3Ys&sgh2G|&{J zVs||YWoAWGncdPSpuM5N>EZger+c6owm)LL6Lho6{qS6*+d{_!zW19*!wDVigtx`p z@c5z+05_y5lm7g{S%Rsf4i03TsG7}To9LNlBH(ejP4svMa3Tnh1EK7-e>V3n0UB6Q zB<*4c$)`i%(-55IbbCwd^Gjd+x6l`_c4Ge{9sI-ZQv8kj_(vDuKQzcc8Y6#~3>wS` z&=z_C=uw86>0^&$U#u_7VnCueuZq1Rz24_uTr$X<{;Yq-fN5w09PAZ7?$_NpyMMU_ z6Nds7QGl`B83Ss+d@=Jl2o=|gnlN(6?Ydw;k=d1GuV?Q^_pNz#JckhJx>K2 zlA7<(*JjAkpkLg=9PwxdbZRSdf3a~s_po^(TDwXWaI*z6x{acYx$PPBU3!YzkSH&w z+A)ZJ{K3snMFk$$=VnxY0!`Cbjajv|wfVQo?6u?fiOp9dHW>SV%F~XfMpj0&e_k2> z=!cxE$=Kj9qjVG9;8wIYuWm9CgtnE&Z5H^kSS4(tJ)C4dOtqY0MqAp=>X1O}3Y zKqIljL6j_rYmOB|qVUDOqPjMjIA25vAYlPgWQwk0z8yb(a{rjt?0m#GIPrxLbK8na zOU6bdbes6eB(pY~`SDno2q6}9M_|lFdSNPV=xFtO)1_*UIWaB*Up0H2c_T``Fsv~M z6tkZ$DcOzBJ_Xw@Ru43qPz?jh6T*?PX~vu>37tXm4&smvxUN}*2n%^(nK=I;>=`X! zSW}D}fpK=eK&-VdCwRXoE1nS3F@+aAr7=IaH81F)9NM)KgidMLD!qIl(Ra7S35y$8 zw=7D-?4%o$8@R^~=62bQ6)SV<)I8LQ_pwRZ1F=eaxS#VL-GafRO)U@1(58CfI%^Uq zrcu8*tt8Ay(I-l@qI%7c7|(6W;O+Zc9_M#3|!QNPQ;0XMN$P_%jaZ zR`y_oG5ucaE#b(JX2CIoXLh(1zzKLT>SSyhnqi@AD>lIre_EU9Puh^`x|2?+48`c;GwOK=7Kb*~Wr-8V3j$ zcQB5O!8atNz;<1zzflxi28FXkGYlq4czq-azr8M@Fyi!BA#MA+fCh=90cdA$Jb_#m z>gS0kd!%iOGQzivv#%czng(H~CGS6f5XIltmnI(>Tf3-K*&Wrwm|i| zv}O~$V!r#{A#ZvmBTa7>s|0W|-3X?Ehh(LO_|jG*Uk=*Xj0vZt$OAiVQZ8doZZBOj zE?>g(1&r1^ROn|1a%vZIYQp^T>6Uc4A>Jm6!F=dEwMz8XD9mT=63m#w`@3+EOIGad~n~-)Df@F+jMFKqZG-( zuo8pX9LU6|>3Qpn-a@@pnkl_neLloEEU$P?(#T5R;T$Y}S}~wEl{vSaZwA>fF?m<9 z+UREhys=@)g|(Mrt5AK_CGCLFR~jY%Dte~%Bsb4i8kU$ws1A<}Ln(aU-H_IAr4;W4 zYi(i|H-0$=c}{WF8I@e7f|h6!ksMu2G`@LY$j)IYQZ7+h2r<}VDni7@*l(rmyIg2Z zMlZ4BBwrB-`=$`Tis5}ZxhPH_!b7^B7HQs5RHFh8MWBQ}z7QOoN+IBTm=>Sd-3Vgb zNd^kEcw#9}RmDs9ZXxfB>$My=8!|BF)Wn!)Wr8;@KSmlBqRqi22+V@`hOtpCfO?N9 z4_VD4DKrD0hihh$PTtLy97KN&CgadwA!?^)?G&b*YPtJe(S#v|RD^4Wnyg*!^1Uo2 zp&MUmgYF}{H17%76}Fab;akY=VRetFi8$vTe<4npZ0ww?2JgPEIk+IS|7l*c1xR(y zWHmnc>+(@XVQwisn^c)s8a|)i5BXAjL-?_{&@P1#=JC$)xC)5W5c`3|AXE=tIEb?| ztd@$WM~Fg%)1tHlqn@3p;p|UM;~D%}si<@tZIbkhP8RTwUsJ>18OaWp_2y?3AG1SE zD-K$jzAiv)NXyfw3Z!)?8jM}iL6`uKg6$t)2cw=PTsp)(LC^;+u0Fr+O zZ&N*M!>>x^zY?Q=8~#~9I9FS@-e5uSqMh-=|P)e z;*2;OWeEWG8kLQDex+MPQ*b@nLP_;gk|P+)_dCMGPjt%P9Xlq)4ckjXSyQ)pvb1xu zEHrFwxr06G6*Y^ToENwe`r{-L1LeviJf$+`^01{XRy6DebxNBZJChx;opf(ctmrt0 zfQLzqvXS=Rx zzQW<}<9(EXZ%uJsQL48=W$r+wRn;O~#ZbkmkVl?Px1KlKhKapXY2^Ab_9@gz3SeSB zdKoL%4iYxut##+A+ZmqeiX}y)kIb5~HjpZLzH2FYt{W`ivnMsQ59v*-;wScFd_F`J?TTCKz5Bg$E zx*!`ITpM6Y1fgje3h!GC_)aaLt@5hPv2D0tA;0!g3+;{r=}ca(L$1jLdO-Jj*V;>PK@u zK8}EwpPZ&tab`ZGEaJ~`PO)!1q_e|3F%t0r`JzpWeN!cry~(IxbXo1_`2MSEk0mYwL6TpuiuXku>%w>+j)qy4%aP z+bfzW&Sbe={sDkbmk2TwZo^VKln!t(#^(tTAzW)Be*4=Lh|lyJgdj-vkN5l z0eP+xH53;I6ULS5@&Elh&%#EC%(tC1(uoatTS#C8FGaM8`w~s{e)E% zLY`9G{p7k3H^%qWRB9+)j$n1F^7f?*lJnZN6T@+f!V3y+p>PK}V<`_RdeI{wf3{e| ze_qtpMfLp&5f%+DS64}uS4PAu=MyL&O z&yke6YYh!IZ9GX z;G3X4>~y)qI!?Tw%x&`+*lUZ) z=<~TH>S)w|SwtxHz%(6o(Vz8MO$%=rwR`X+{CtH)>dLiuUehMK`q8Z`Wpa*;ojUK3 za1@(eG|{l57w*(eeaXDRK6`eIqLeen!7byTxENxd2p^RbhF71Os!VkjnCEo~(+{=)a8;<65^Qq=nH z*4B~+reJkP>SJip>>)H*E7luE5mxrgq5WlZ;;rs`9-kS=O{@m-`{(Ly(mjbNRKzjjt-`bCdx?V{vl~%yf0V;GN2P{4{UKp&Mdn zbz=v_@ku;Pd09&)DOZ&knf*LMd|DnQq>_q2+S>i26QY2(=PC-vg}Ve{*2S~;G^+j0 zW{(4vi2_H&1D81|;wqX0mBvKZw~~s}qv8TpQ$>suR2Gu&d#sg9ZaPl6FL(ah__@AR z+a5Wq6%}#J%V!8iW-#F2MvUK@*%!A_9H~Gst}%o zTx~B^QKhF6angOy+Gbn{Y!#ki^y+W$m)l9D(k+gk)XFS&yM5O(YX;`FwNfd$sJ&oz z;cOau3s1n&OQHd5vzg2G3^=jEJ+75?>YtZP;*85#yh<9d-Am&>dKRue<^XdTDx$w7 z&83H-o<55d*){Db+^)T5e7FlDP|V9f`%RX#vU$kWwYZm{Z95EW*;2?BG~MK3-;Fh0 zg(#R;G}l;W>MfT3a+r}^!>It}w5~!yqz+4SSd-OEROD=7A=WE58yHCJK>NCF) z8TOo|%r(d=`PsAw0mAN|Ty?{hhOSCiDZ8ev^EdQlw*4^C*{Q{bNoo9^6JyQY_QanUC$lvR)P{W zrI!U+{Ijr1^L;HG7YDa*w09O4XY*T|e!fxo-4?KB*Q?BWykVXnuA1g2 zfKa?5ufid7DS^ihHl&ysdUo#}X+0%R=R4gDH?p3Z`!iKH6%o6+BO)^rvIYZ(C~Mv6 z?6n!RsqEYskOeqIz2&X6Inr*D%H%{dkWD#elo)JaUI<`EG_P-TBDjqG{w7Hs1{JEG z8pp@c!S?42+2=DK^gIVe!??!*efTT*1yyuZ1A(r5qV{yUdj5M(o7f(ay}vKT^T0C` z<|N^dkK_aUS+S50cV~A+k;SM?A0do;MGO?%Nu)4WCJ?A|TPK<4-KT-qBxui4{+ufX zwGI;s#9J=oHVTk17BY=PXsG_?Sz2IcTKu6-1 z-jfIZG%O}+Ib9la)+ z;30^k$>-A;2uQTYm5~c-@5Ydfd8RkbB-JqwCp)^lF{1dAI8qW@2b5cSv{AjVRCtIY z_An#c?hr=UQNztt8ZWr(PrwCvrk@>m?6xrAQG8u|;8DBX?WheRFBj0d2z{j zii7(i@5R)II60c2hqxyV`agd#XSnvqqSE!ldgS)<|HRAz3x&Z^@1GsG+`VEIRo=hJ_257V;Q_t`bCr49|3=J9$z&i=YAW3B0nue}3*h#14qA^PBc1|TPZ6G+nO=)maN zKzAq$ew6DfC+{S(ma|~k-FNsu4%<<<&z5n7n%&PLhIg00RL-T6kx7;(W#no)lC>(q3L z^_R|DpBL&rm5!0y;~s}7GVnTMaKA!^e2v03Mx-oMzunjFjBeeR&6Hno_=ev6L*~p> zjpXKT^d(8zteKDjFBK4yAJmz0)K+dKAREs4nN%+YcX^hiBpbSx{PY}XWe(G`^X(U) zqDM~Eu2zqqS}*Wt|Az1GjQ=@IVF#5GQ@mgiyKkz00cVr`3xQ=QMeS0GuFLrY`;Tf=ouYa)VtnE1f*m_ z%Lt-UXiJ4-kuM0vQ~QVL>|ckZL{<>M4U_f>O0x z>2A?H?{rU(X$w64%>EOZRJB!^K#0|)Y}j`GLU8PZo|#5~^J>HCehJoq?P_3TBdF4T z85WMk=y#dL9Zx+to)7LoKAkoe%DV0mC?!H}V4ayxX1jA4b(=d`tKM=4LuLGv&;SVs zUyTFV;4)be`AowV1}g=Cs4~Q%a*}s0JS9~CqzAQFRslO){V@v!Ku0gg<}I2eb`sm@ zj3m%g!9@FmDZ4eY)LHxXRhFoygI&*1Jw|ND ziDjcM8z$BhGnt*52bYZB2)ba(6ZQ>bzgHm> zkmw~tUfsXk5warDB%>^9z{*L%#sq6t9H600<11Pr*AggAdZtHFbCxyPsfUGK$t}YD zYTMl4TXY5I$v2;~u~?i^Uj$?T#$%e`tGD=mS%^trTE9r8VX>r7)w4JmV6Kr&D!PG>rV2*gFV|zm4)l~MdRMu#Pm+RtE0;@Z>a1Wper~}ngGo+fHBAylO z39N<)GKvMsmlY``N>Sifr&_eNh)jy+~}h>(IgD6$iX5eE;T zt#2TL@`&Jin*;FdZpWXrneTtwq-dB{#cco5m&9L9ihnU{e-V!VqO$(-=>JM(J>nBe zxg+MPl;R=GSz%em#|YN?*yNx?`zHsb8f{N3O?qUFKnpNU*^`+8f>hdf)~5A$wtti6 z)sJgRj;|ll>xGD1xjMy`W;o1e!@?6QS{c!k9L>fIHy=4J8e=d$Ds&f( zte^-Zg5HKf!2WLL0hfCrfxo%uaO=~A4VHhsx8NY0?k!l8;GqXLmP2oseE#g${0E*!5h6OTEqJ1I3La>f{zaz| z%bjmypA7o%80i_WveqlzWeMN*Aw<^Wh^qteQD!nIJG8hgZ$gSn_EFGtgyR@T%q*-+ zIrYmGc%p#s6OE!^v%`?TFdE3gv4x6eilno4LdT1$flYSAz~{zZgzt^?u>zl>#y5ls zm?}XQq`Dc-9Q{k)s?{g*j2_C)e$EE{vWS`j++r+q>MBw;Zu_Ashki=aFw9D~( z`)xh(aD{l;KFACY3Z759Qsu3){Gt7-sTJz7u(Xa}rvIb`9ZY^$DDKw-)BA(7Hxp#Q z7*r;Nk|{eZo)N0|)5p5aR;WYzm?oI3j>@qtjA|sF1OE1!Hi{yvCI9*m+GN%#JKhko=#JS z7B;IBdjC4`>$T%02*N0W?T^(?mPxcYjm!D26OnpT<+~Yv`|;jy)3~eZqSovi{Z}Uy zK?h0s-0!RB46k&*uKPvdd^)1>g!WB0dQA!xjb5$cJs46RXpfnl1L`Oi;K66BkI?f! zN`$xddS4@DW)aKz*Q>8fp`|$W;h~lcy!Wqu^3b6`J5Dvd{c$PMOghGMJ zg4^YKN%)%6kNn&wRSLb7EEgX=|E%nLXO(|l2||wNHQ$;eS%Re&ar6jvCJUvW4+RqV zw+7%!g8tpEBgH*2MFK+cSv);cczL&|zj;sk2KXpYCvcx^1PMuw60<)yio%xhDE}5AK zK7tl=4~t&x2kWp+X$8vKIbGM-X9efaUF;}wxTXY~BwYBbCd}IgWds^&_njtc z|MZi!K>1j~I)3!Qo~U@vWS;KOz3x&T5aNd4MsA4*7gtz?&lAtIxK_RZ5}y}~`uu<} z_o4>ODEZv zO2G-sPBasc8eCwtb^867gZ|q|#tBpInBu~(B>n}FIsp?EE7zT3G>@1I{41)BaZ=hxi201E%wl5MzUEe#t@5>{Tnl`zgem3n%Xj> zJ+gJ48k?yhtj^aea-*SemMB0?oK`*s(7Ngt+9DcB?R*YW15lqxz-r7w#P#NVy-z;O z^c&A?Y{Ib*mH=D?2*H~DRPb7dh;l%F`ARTJ!<}S=in1@VfV!(x=oCh-rRK0dh1P}E zAFsSoCT=pBZ0>W^KBtXUF>lN^26)LW)|}5HfSMlCGFW1KQ)@7R7`#P>`3?9~A8D@; zR5pM-%;#q1e+W#2*pdi@?;=XI7D# zR(vv>{k4kmF_>58O9Ks3j&xv;NGF*AKZ*88w{>$jq{7ngFwp)V=+J5ObpFvi*WLYvtmXE>yxArw zX)BKWv%zJW#ZqU2RaFG$G!r6GLR8kSv1Tp)XFlp^fUlLRG&}135~b z3+P8t%S_&>H%gY|6l|Q)QO@h+G?y5e+BS|8;B+#?_4^!M!i{@s-xqbWKkal(5okQ+ z*K^$)$|79a>l3k06TojyHxI#7?$)WnXYA{rH>k|67rEXeN-6~$A#ILG66}CCH?3}| zXn6=$a=-=!AWNgYwR8yqxgTaD7RYIA$*`|P5}8+VZ)<7LI?AdIX!vwFlAsg4l77%> z$rBrY>j7(|XigS~x)jg6JyGdj5@$DPKc5*5k`i)gYg`Y&tPjOby1t&E4N=ge7;SPG zW|yi-XaBi(I5o}I#KTrju0>0>wq-sSUW8%8T>2t-ryTz^(vZq?|4@$iB=G?#?#~_d{TPvN z{D{qT2FVhDd8q0Ab{HQABY47qG&`)zBL09 zk}dEC&ALd{;@po36!y&tO_*5u(fxV#vg&a0+8>b%Oh|m_Mrp2XEf{h@k2lL@CgcL% zDe)DKp^k|rT&2}#6Gl#6huW_+`_CvyF!^eDlFwRD3&l~-prILp^{8m?{150@j|lsr zw1w*Eke(4vj4kzQXI0fk=q8C0_F+c0Fr&>RXL#cySSa?iz^Ys0-0_X`s>R~%gZLsJ z)7_=R3|EYSaCMi$u#QO8S6Z5Umn8rcoHVE36Izhy)^xZcvjD${jY{T+tB5SX9X7C+ zvksNC@=opI0S^2()#6Q4OJ{6Y_^TP6veENj#-Ug-ULErN9xM*Lk9MuW+ih#wznr+; zU`F;-%%6n~Djg)ffyFT=pDa$a+h;X3sY|Ev4W^m`uANmrldjpJI(~#>PU=rM916um zwu(+0Jp-b11Dv4$6VizIf;3o+9m)QHG$8*S(h#~r{}a-92)EJcb`93 zfd;UV{N@Vuq(CoMILh%R_IJbU58ZBRt2JSx~jp%0Qy7+16ojqC<^v^G0)@H%0%=75 z7197MoAdtvgEWl(32F3;IJ=Ji71A*K1JZDOm`q`=R3uHCRH-x*WE7fJuqvu!sbzN# z7&R&D-I++6+5AfHd&Vej%a-fG86~J zr4TEB!Uii5y=JRV?lu*Tb^$imvyB?L9D+C}K5Y$1EH?5VV(uUA{~EDpWmk)W)0kbm z-LntW*KEk6&q&>+r|dbCXH7^UvCTxG)a(CPFk}hN_Hd|_hsm2BZ86TrswO{Q^y3#@ z>}6=o)hil9&}}_3Jk-$ytJh8d@-ug2Ax}~!!1$mi?}_TN7NWCxtt628c`Bh4zGZCA8snNwq`s=J7uH?v$11loq|eEGhQh@OA$}K z5qK&Ic6Ss4-Ue#KI+m$}8h?vk5QaVU$*6Si4YZ6PL3H7VLE{4|%%Px;h)!`R8x)o> z#0?l3P>PE{4N(@pRfVX@m;ULGbMnb@Oa&_y*=r_$F$)3-^%g4*O3*HwBzd37U!iuX zm1HP1BA7r_MOCpPV9&e4yWE4?*(^d9B+I&3Km`ou!u9d~#1If1YHh#ac}KBodDX~% z?c&12lFCQk4VNBVRQD+;jYkuW~I*WYAaweXL+B2~VwKUf78BUntP~M1I zUUai(PlDrGTSX5ug_Q?H6Cd*d{Dy~0U%$@_-1th!=z-@AAEV@SPJl&mSptBvN#-KW&{LxE;3-0ExQ~O_QwO|B|hK zwY>g32mlz`H`4(yz6M|C*Pq}43~dZ#?QLuwz8FF$D}8G{GfSHP)83cIL)o_d4?>pg z`!?D4t!$M{5kmH@lt$UfPRKGvc2f4TMI?k0k?aOZc9M0>$dbs6bui0&RquT(chBej z{od!F_m5}hbB&qL%<**|%XyvWbzbN3JzPBP9f_ZaGav?CEgdZo2?+_v26%#q6CjQ6 zpZ=}KcaVPz;JYxf8N_%P)Jy^*BM|_RGLn!nk`UqFvsFmQe`5bo7I+~cB|Ah;L3x;p zng;kmH3Nv0gp7>z5E(i7As~^NBn0>#bcm6hiC_LK1+(!rN&zpHV|O0p9Trr7*}`fv zfEGG_-8+nmnvI=V&CD$SDT+0S$H3yWWtFl*}@n_Ju1o!#$xeb@7^$4|`;=*0-=MSAEE*&)jB zdXbR&e^;FG5IMg*1=Cq$%4=TC0>|zgW>J5T_p*gb@VE(@^}6=}HJgwEQW*1HwI7=O zzbO{>ztZe)#rE|Y2hoy|0L~+01VKOqf>?em=-)e77JS!Zax+aXAnziA-#7 zih&)*abx^jA=T{g#OPbOEkqDsKq(TM==YTf3cIzi+=5&sU-ZOjqv^_!tGtVRd|>oj zoMDNpk{Tz5Ex9awU(LuC7^}MPFd`FaOj#VzjM{1APkmPP@VyVSF zx>T!JldX(LRbnVt^>{%}UH3G;YCTEytk1*HE)0Ux{wg0jiovTqP>&lbj;yaMx4-u! zZSV;cY?UC&u_q-gr6owC?zd#%b(i&qKDDKP_C?JTvR^1-iJ()fSOc|FM9=^#6hQ=G zU#w0f5<&UY4Mb2gf)e5eiwWfzP}QG-j3;hwVgy{r+nm{MN!Q?5GPed^joRMR`#9*^ za2+*aj?eeqJ2y~0<=zM9QcCq<-55O*f`l-g-YiT=NNt!~*yym|ki&3`=J8m#b*Qn= z)m}1BV2$l`oID%RCQ%u`z+uo3$`T>rZd{~xHLzW$+-x$-l%VroEr-D7MImj!!%l*2 z%d(wPHsRoT6IdnaCyzXum) zkW7A7_A%XqEj>gEB1;6ddSMWRMCL6bhzM$r3Y~=E8O(DoZ75;LPDVI?#0JL9go6)!3kG{sKCl zCEiv`UuF{fbU_vJvG#p>wUN2=$*gowbLThD_Rd4`3{Dj&Qv%i7y$hj(5IQ2rV|7dr zxfeRnR0V}sL?No^;f7$GG&Xgn;vNxHMc-jKPO0&Bz_)3vdp5DXjNKBwgmc9-CCb)w zqO1kmn`l+lu8jl>2R`A(i!4|SR%iHeUw+r#v^5G1!=@v91Cfp_qevNk_*_7JM4|3S3bY)X}rFDp)^H@Dp1s%4#a$#MlF2YJT2PR?~-n5rCB|n8H7gQj(^M~g0#u@U_=nA zmk6490>iUx68r*IHqdC;;!bCE@TplDFos>JPt5+rO%F@P)-ed3?Xh=8J%Sbiw`3Z< z+TZYrT+A3M?6Z(->5Vr(FE*NmFW|=;x8%@z8S;F7+2{TIrbc8-H*0ij2WOfjSdUR0 zxx+G_7tt-BGNLTL)?QcQ)?Rby&1FKKQ^nj@0_RtKBIwB-d=n9bafG3bn+UPDAjq65 z#I6c>;(L&>`4d6p+(gh~QAI}+>N!~3V^>hsnFxaW-)Y*l1zQq9Oaq;;4JD*3PPP}a z(+V@HvRwDb3+?cq7DCSk#A)I4Anp@Q*jybXwhD^9C5vMT<#nG&9TCuXpI@8iB!XNH zFM|zVzlwi8$gAnjhRly}yVysg_N{P_0$bOLS$T{_?gcFM@1Ul6H4FeJJ%hDqm<%Eb zz3xK3ac1~Z-zhB)e#SnQ8s#*$7gS|MW)DWlY7j_>lO@Q3(~Wjk8m;$5@R5B+hKgvcAmPEU(=z}-Xp#{BV3cY1JRj?H5BOtGur6v4Yd zwWgIS3>2LfuJBr=tah2C*=L#+Nh-5dDbc~5J02V4tp1ul-HWzg zC!w-k$o~F1tlg4u53!*YFj$YEL!VABtJid&j%gABV&wP8NL*ry#mxg?7Qs+#942?` z>`--XY^eBfuotS26z7Y7-bh&#U)|;*8l$R@^tcVKhIBx}a>z&OE&ZK6oGFS?-HGG@ z^k?{lN7+73TL)dz>v34(4-E0_S%KE%wjsdy=QgHHPoV{>Q!TW(LtrfJf#-G3&MIt?(Z@w9( zItB=v+pNdekUc`OI!XAYvCFj%wj)O_iW|t4E|;D)3(HDz^eq%BCxSrj*GgtwI_xL0%frKd#mHbYo(ynWAb_QMWoM35D}0{9!Y zde|8!=qt+=WfUT6niCs7vpPPpHH@)S6AW?cL+XPG)FFF5MG3*Ojs;hjwisM;BnGMt z$3^wS4Tpj?ypVW5RYfo7XD&xd)gHh|HCcx#$Z#MZz##IuW~G#ui4+L z(2zh*^R%P*s8v45P+TnGIPZ0z}d}wHC2K|o>d&?K94wK$m&h2 zM9-d!84ceN0rSQbg*~~ffKn4{GrD)|DK}%>J+4M^wAqUk$7RoqID>!)b)TZ;FCVj( zOcD%Nm|_V^3PjKt*;e~orG&se9m3Q}DRy?N)av$+c|aJR!q=3SZB!2lC-s#3iS{=+ zOWWs#t(wJJiwyAV#l3!e_H=t$W4aXA-A0{RA}9hNm(2MuHXW^4LJAfKjY}=$icC@# z@GZvBHsv<*rUK@`Y;xOQAW{6*}PR_$9yae%)>@$y%@ylLQaLE4gX9#*iN?2Ks(f zyoX@LS8>dSX86XTnToi2a!j%wRvhC$V+Li~Fg)T)kidEcVW2H17s5hiyU=UvouNFV zs{DmG4eaHTr%#m1&`+9AHin~U=s7OGPM3KQWb0St!e-Ue9KPutyHOcDtANA}k!Rc0 zF73Fxrj6bcCA-(Aqu$6>&um<5ps(;q|LG$yFZW~mN{OPU-&KZ+cCFKfL%Pvp<@%41 zMRz}VFJIw7f2vm)_b#*$Z?CQ4=u&xqEIuj4D(M12zX=6~O>h$uGq-$!5mF2r1DsPk zEy|i^Za2Noesopac`q=u@8ioQwx=D0Qy!n%P-avicJ9*O60%X6dp;7AnBv-+1e8-7AuD5HX<-3x`P<@XuI<4LQA?4)NuYXdaEu;Uk#YIYtKH|mBo@! ziEFg>a@CmXd04@^-S0jR6E91e+%U_6~Xk!dBFy`M}^u zI)Hcc_-qJzpcyIv&{w#)_K-WeDt)GBkB%8EXcNMQl6G3;exdazT zR>h~Ugu~$&j~T<2vuK~KNbJa-5e|Yaaz-m(#<0iX=#h{pFo`1Y`$O1H_*GJjM;q0q zA>&uRqu5PM-e!Z+P|H;{Ohk5ClX?g;OxCDr0Dtmn;j0o?||_ z7n`fpzHq5bSHW|=)7Fu5G?hm+P;9W?_V6>)I2UnE_ldV|xh3dy3Um{x-7ppwzIK70 z{&Q97D14~9604iTrxI_rgJCT@(QDvmmzhg5<%AyJcPk%LF{P^bf&Mp zi8>gJ9Yb4cV2fw6X)LjE=q5{S8+sKEp(7|v<77v0Fl1R!OAa445AA<7&MX;95&b27`OHNkK&`WtWsBM!myu`ingHs{B@B7&YuLK}Q7*DHAO zJoR*#Q)=lfUfYpbitRjSRYkbTR40zNji$*2TmYYJGs;>-iEDY~7m2mJm(i8hc-XEf zJ95nZ^ei7=i_}{o6m6SKb4j(NloDS7tFT3dWU)damBKtKE9qv#RQVKewuB&oSF{Oi zS5@{?DG|h=G3!VKU9d>R`onN6xr9WTE#T}0XTXjTK|`z+({+-w5Yz>=ILL-wtt1gd z<&}#Yo7>rTEF*##9pSKD$#ocxQ;!Hr4Gaw#!-^9@bgRHXo(zOHGPE6v4FhvScCS~# z+TH?l+5#eIBLMo+l5jMtqmPhL7P>j0jnj!5a3sX1lf#fQ$BCd!)h2*?2qlFDuJ1HM zJ&2%iaoAdgY~NeR|98X1h@cp`T`8a?Ni!8V;SSikWBS5W6izdj5s2Z69>5CrvIO(* z%FGnuPBjsz4S^YW#2zaQbvXD25%eW?;LqAr?~Q7LF(P2i+}&eWSb;#U?IYY+!|lBQ zy!i?R!L#l(5oimEp!fBFE<1u-0{DzV{DV-CGnld>_%dL_-de(O>=TS^J3-1?-d8Uq zs1w1ZCLBjW7!dIGw=!fDk|43jr{#oVIf(Uq2rYa`De;!7R+I zM!=jB?=%6kWWasAjd|cOwG%i|AU6FwOq`WThs+JBar)@UmopU%jSqdh1SVW)3S9jY z96fElj=a049?$N)c}sHFl03Y1?vttr^iG~3O;|JXnGHI?MgDVPR4dY1J(4d%tRga- zOD;l1Ggv;>n!ayor1)x??q-ohYN=VaRkg^fM5=^NuTOH&dlPq)kjsv17zmD`duzDr zk)GSBtuOd2KbpfF?e;;>3GiG7#KpSm_~oz=>kY(2`1v8b5#ea5M|U5&r#}6%dULQk zHKOq4y=fH~vJ+ZEiRW8g29_zJH8Bw2G}O`bY+MrK9Kxkak&=}gfs+qZntHK`DxaEq z!lNE*ounh2uLEw-{$jWh5pQN0$7AVKkcv?WJSCJ=Ul{3~JY*>{;qUeu2>Wzdtk>uY z0IdCXPY#A+3Chanem41HVChA}XjU=7Txtr{$3)-Vc~rKw2- zAIHA&LqZ~(UWvvL*aMQSF<_tpyiQ=|dMY>3_p^+8HzXtilRGEU$rD4aJYH0TUP{&G1MaXwy`D)=s(AQ zZ18W!010vIueIs_(|>;_dUxVzBYz0oPH+M!*Z}g+A0*Y^iE)42Irx50`*~8g%d8wr zIXkRAE-zGh(pybrd4UvR1p zWHd#?+*4EsUjg|clC zbVPx)6V+Dl7gGL-)rXI7<|!m!6CjpuuxO%B{ zHyjP>6o}M69y8_RhA8>sS`zZXE3#^ff3FLt5VaZ0_Hmgnv+Izduf*AKya8xe=)ROk z=0+HUzfh^n3Dh?l?K=IM&nCssyX&&91lXRckUezlR6p^2osI0b-n!8Y0t*kVY)h_; zpnlB-iSwS5%|aIhF3P^;N>YkH9|Mvfo1!UW#qR||=J(}h)xq1^IZhzT0&i5p?Fo^tK?OsrJO#w) zTc4#K?_wdGlJ`{D7H@R8Rsd6?q&rz2?J{m?>+J5!r6A3jUcD3yfenDu6sypJF+o#%; zT6@}h`;*|-T)u0a_S+hWis7?%S-Z{Z`j^#e)CWylgxuz&8`!E+lSGDjPuSY+{Q_5obwg0J8rYFS{A0PE-H|@OI(;1f*S2i7tC*9uA7F@;#4W$a* zS>TO9B~uK?&srnrmmd9qc{6R#|-Ln-|cW^V&G z?jsVPGJ55dhK*XasGhtX=RVfW?rU33@>N(ROgtr1J9XP3O~}Bk-;-Ui?7n!lTdnrc zHzw;eljdwT1h$m(o%1wH`%ceOhKF(Xm=9{G8qE58-O@-lJ=#;f;3vavGqik~Ni^9VOUILW!I_BxpYMjesFe&* zvDmtZ*KOPoju)@i8riYz& zDv1VG8Cpg=HEyR9=kNA@)r<`C9 zoT-29aH&6*<#2qJZe~wqtw(vcGWptB4q+=-n@h_r?3TE>IIFD-R+O%eL7r#BwIA52 zCgUpuX!9I7f_4sPqs@IY#MCa1#xNwhhX?WJ!YR=4_w^>vGUy(Xezx?%f6qsUl!R;n!Zk=^zw!To#u?X_AK%hkKlX} zwtJ<=+P!*Mq(@i1#Z~xHe;#?`;MH+UzK}rz)f9JjxMT>*(k>Yb-2h$t49mk@RQv$i6-GvWy6@ z7Swtxxr*7}t)#i7&O@RaMOaT*hyF42^Y4>lP6A>yEEX4>Wi$~qhNScvkB`j@dV+iaH^qrvAX4* zx2v~8zpR0?b1ixo7UPUeeNLku={}BSY`ZR}SDwc(>5zQq%5BtcCWXw=*xRVIa}pOU z$ygYv=GobF9c*5mr*+6Jxa}O7B8+ujHx)elvfzBo1D7d~1|PR!(6{OPQZPqETTd^u zr}u8n+!qgHud_+FW-87ld9R3kD;r!7k*_hZiN}<-^TpL9qz=(qy*j$6*3fv8s`Zk% zy_Q)Rxr)^FdzL9JcZD;QYUk>%vbHHql{<@ujTb&%6KLzH<$H8SFjR9$@`FjqW46c622959 z%#>^d9@weNi5AnenY2f9+z_D(7OOmAswkhwJ<8hpQd%h1PA>UG(QS1p=FzB_heuB! z?;SpOuk2aJ(5tzok3oG~jQvvW!pbOr>Dv;;iq~^m3WX#HL#DM4EamH#!#xF^tl%o_ z@rSqaieJ`OS_h2sktv(p?4K@pGw-94Q;PwvpG^B+W2SAVh7FgWy^v&CT}NxdRV*9K z#@V7L%rC@c-Z#rAcR|^>)ZMbHl2a*du6lPY|D$_~nGKMZLn^hz+6>ETYP4fn(^Bc9ue=_UaV47v{B7uaDaPm5Vz?< z|K6xaLMjaup80d(#r+=k^W7iHFdFIo4)A+@wqF6bfO+!I?7Sbjcn1X!7Ny!3y$U3{ z{ZA#T4x;^D&1oMC1o8ps-2aE#P6xpb*67)XTLLyYeg`{PvF9Md!7?WM2vl^xDYswL zL+Hk+M`?_dK#`9;~kY%``3G`_Yrz^{^d^VgAO>j z*18WucKv5Fep`7xD1LB>Z(qFI_NVx73w{U153UmJi+9@pw-J6{Gdc+H`%28dII#BM z@QV%pdtK(B^zWCLze-cN{389=1?NHW->2!niXU?ORs8QsyOAC_kgWv*aRE;sU}*FA I`u^#^0Kyi-wg3PC literal 0 HcmV?d00001