From 3958f44445b80880bae105fb089e4f9ce700af14 Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Wed, 30 Sep 2026 18:09:13 +1000 Subject: [PATCH] Read each HTML presentational attribute only on the elements HTML defines it for, under any stylesheet rule In standard mode, color, width, height, valign, vspace, hspace, align, border, nowrap, size and type are hints of no specificity on the elements the HTML Rendering section gives them to. ,

and

no longer apply. The tag handlers no longer read align, nowrap, a table's border, or
again over the stylesheet.
is inherited, and
,
, , , ,
  • and wider table borders take effect. Legacy mode is unchanged. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG-GRAVITYPDF.md | 12 +- src/Css/CssMerger.php | 65 +- src/Css/PresentationalHints.php | 350 +++++++ src/ServiceFactory.php | 4 +- src/Tag/BlockTag.php | 4 +- src/Tag/Hr.php | 2 +- src/Tag/Input.php | 2 +- src/Tag/Table.php | 9 +- src/Tag/Tag.php | 13 + src/Tag/Td.php | 4 +- tests/Mpdf/CascadeOrderTest.php | 2 +- tests/Mpdf/Css/PresentationalHintsTest.php | 217 +++++ tests/Mpdf/LineRecordingMpdf.php | 34 + tests/Mpdf/ListMarkerRecordingMpdf.php | 8 +- tests/Mpdf/PageStreams.php | 15 +- tests/Mpdf/PresentationalAttributeTest.php | 869 ++++++++++++++++++ tests/Mpdf/Tag/StandardBlockTagsTest.php | 29 + ...EmailInvoiceTemplateLegacySnapshotTest.php | 21 + .../EmailInvoiceTemplateSnapshot.php | 96 ++ ...ailInvoiceTemplateStandardSnapshotTest.php | 21 + .../PresentationalAttributesSnapshotTest.php | 116 +++ tests/data/snapshots/barcode.pdf | Bin 165925 -> 166544 bytes .../email-invoice-template-legacy.pdf | Bin 0 -> 42371 bytes .../email-invoice-template-standard.pdf | Bin 0 -> 42374 bytes .../snapshots/presentational-attributes.pdf | Bin 0 -> 56912 bytes 25 files changed, 1850 insertions(+), 43 deletions(-) create mode 100644 src/Css/PresentationalHints.php create mode 100644 tests/Mpdf/Css/PresentationalHintsTest.php create mode 100644 tests/Mpdf/LineRecordingMpdf.php create mode 100644 tests/Mpdf/PresentationalAttributeTest.php create mode 100644 tests/Snapshots/EmailInvoiceTemplateLegacySnapshotTest.php create mode 100644 tests/Snapshots/EmailInvoiceTemplateSnapshot.php create mode 100644 tests/Snapshots/EmailInvoiceTemplateStandardSnapshotTest.php create mode 100644 tests/Snapshots/PresentationalAttributesSnapshotTest.php create mode 100644 tests/data/snapshots/email-invoice-template-legacy.pdf create mode 100644 tests/data/snapshots/email-invoice-template-standard.pdf create mode 100644 tests/data/snapshots/presentational-attributes.pdf diff --git a/CHANGELOG-GRAVITYPDF.md b/CHANGELOG-GRAVITYPDF.md index fc5b6036f..6ea0ce14b 100644 --- a/CHANGELOG-GRAVITYPDF.md +++ b/CHANGELOG-GRAVITYPDF.md @@ -46,6 +46,12 @@ Read this section before upgrading from upstream mPDF. Each entry says what chan * Important declarations apply after the inline style: those of the stylesheets by specificity and then order, then those of `style=""`, then those of the default stylesheet (`defaultCssFile`), as a browser's own important declarations beat a page's. * A shorthand marked `!important` makes every longhand it sets important, so `border: 1mm solid green !important` beats a `border-top-color` of a more specific rule or of a later declaration in the same block. * `@page` rules, `body` rules and the class rules SVG text looks up take an important declaration over a later one of the same selector that is not. An important declaration of a `body` rule beats ``. +* **HTML attributes that style an element are read only where HTML defines them**, as a browser reads them, in standard mode. Set `'cssMode' => \Mpdf\CssMode::LEGACY` to keep the old reading. [#531] [#641] + * `color` applies to `font` and `hr` only, `width` to images, tables, cells, `hr`, `meter` and `progress`, `height` to images, tables, rows, row groups, cells, `meter` and `progress`, `valign` to rows, row groups and cells, `vspace` and `hspace` to images, and `align` to `div`, `p`, headings, table parts, `caption`, `hr` and `img`. So ``, ``, `

    `, ``, `

    `, `` and `
    ` no longer do anything. mPDF's own tags, such as ``, keep every attribute. + * A stylesheet rule beats the attribute everywhere. Before, `align` on a paragraph, div or table cell, `nowrap` on a cell, `border` on a table, ``, `
    ` in a table cell and `align` on a text field beat any rule for the same property. + * `
    ` passes its alignment on to what it holds, and `
  • ` beats the marker the item inherits from its list. + * Attributes mPDF ignored now take effect: `
    `, `
    `, `` (float left or right, or vertical alignment), ``, ``, and `` wider than 1. + * A table's `border` gives each cell a 1px border of its own, which a rule for the table's border leaves alone. Before, the cells copied the table's border. New features ------------ @@ -800,6 +806,7 @@ These changes do not change output. [#526]: https://github.com/GravityPDF/mpdf/issues/526 [#527]: https://github.com/GravityPDF/mpdf/issues/527 [#528]: https://github.com/GravityPDF/mpdf/issues/528 +[#531]: https://github.com/GravityPDF/mpdf/issues/531 [#532]: https://github.com/GravityPDF/mpdf/issues/532 [#533]: https://github.com/GravityPDF/mpdf/issues/533 [#535]: https://github.com/GravityPDF/mpdf/issues/535 @@ -852,8 +859,9 @@ These changes do not change output. [#632]: https://github.com/GravityPDF/mpdf/issues/632 [#633]: https://github.com/GravityPDF/mpdf/pull/633 [#634]: https://github.com/GravityPDF/mpdf/pull/634 +[#635]: https://github.com/GravityPDF/mpdf/pull/635 [#636]: https://github.com/GravityPDF/mpdf/issues/636 [#637]: https://github.com/GravityPDF/mpdf/pull/637 -[#635]: https://github.com/GravityPDF/mpdf/pull/635 -[#639]: https://github.com/GravityPDF/mpdf/pull/639 [#638]: https://github.com/GravityPDF/mpdf/pull/638 +[#639]: https://github.com/GravityPDF/mpdf/pull/639 +[#641]: https://github.com/GravityPDF/mpdf/pull/641 diff --git a/src/Css/CssMerger.php b/src/Css/CssMerger.php index cb4a45e91..ee2c53d3e 100644 --- a/src/Css/CssMerger.php +++ b/src/Css/CssMerger.php @@ -57,6 +57,11 @@ class CssMerger */ private $borderMerger; + /** + * @var \Mpdf\Css\PresentationalHints + */ + private $presentationalHints; + /** * @var bool When true, state outside this object will be modified * @internal self::previewBlockCss() uses this property to look ahead without affecting state @@ -70,7 +75,8 @@ public function __construct( SelectorParser $selectorParser, InlinePropertyConverter $inlinePropertyConverter, ColorConverter $colorConverter, - BorderMerger $borderMerger + BorderMerger $borderMerger, + PresentationalHints $presentationalHints ) { $this->mpdf = $mpdf; $this->normalizeProperties = $normalizeProperties; @@ -79,6 +85,7 @@ public function __construct( $this->inlinePropertyConverter = $inlinePropertyConverter; $this->colorConverter = $colorConverter; $this->borderMerger = $borderMerger; + $this->presentationalHints = $presentationalHints; } /** @@ -199,7 +206,7 @@ private function mergeInCascadeOrder($inherit, $tag, array $attr) list($defaultRules, $importantDefaultRules) = $this->cssManager->getDefaultRules()->matchingDeclarations($tag, $id, $classes, $path); $this->mergeEach($defaultRules, $dominance); - $this->mergeInlineAttributes($tag, $attr); + $this->mergePresentationalHints($tag, $attr); $this->mergeTableSpecificCss($tag, $attr); if ($tag === 'BODY') { @@ -496,30 +503,7 @@ protected function mergeInlineAttributes($tag, $attr) } if ($tag === 'FONT') { - if (!empty($attr['FACE'])) { - $this->cssProperties = array_merge($this->cssProperties, $this->normalizeProperties->normalize(['FONT-FAMILY' => $attr['FACE']])); - } - - $size = isset($attr['SIZE']) ? $attr['SIZE'] : ''; - if ($size === '+1') { - $this->cssProperties['FONT-SIZE'] = '120%'; - } elseif ($size === '-1') { - $this->cssProperties['FONT-SIZE'] = '86%'; - } elseif ($size === '1') { - $this->cssProperties['FONT-SIZE'] = 'XX-SMALL'; - } elseif ($size === '2') { - $this->cssProperties['FONT-SIZE'] = 'X-SMALL'; - } elseif ($size === '3') { - $this->cssProperties['FONT-SIZE'] = 'SMALL'; - } elseif ($size === '4') { - $this->cssProperties['FONT-SIZE'] = 'MEDIUM'; - } elseif ($size === '5') { - $this->cssProperties['FONT-SIZE'] = 'LARGE'; - } elseif ($size === '6') { - $this->cssProperties['FONT-SIZE'] = 'X-LARGE'; - } elseif ($size === '7') { - $this->cssProperties['FONT-SIZE'] = 'XX-LARGE'; - } + $this->cssProperties = array_merge($this->cssProperties, $this->presentationalHints->ofFont($attr)); } if (!empty($attr['VALIGN'])) { @@ -537,6 +521,27 @@ protected function mergeInlineAttributes($tag, $attr) } } + /** + * Merges the presentational attributes of an element as the standard cascade reads them: only on the elements + * HTML gives each to. mPDF's own tags take every attribute, as they do under the legacy cascade + * + * @param string $tag HTML tag name + * @param array $attr HTML attributes + * @return void + */ + private function mergePresentationalHints($tag, array $attr) + { + if (in_array($tag, PresentationalHints::OWN_TAGS, true)) { + $this->mergeInlineAttributes($tag, $attr); + return; + } + + $hints = $this->presentationalHints->of($tag, $attr); + if ($hints) { + $this->setMergedCss($hints, false); + } + } + /** * Merge default CSS for the tag. * @@ -557,7 +562,7 @@ protected function mergeDefaultCss($tag) } /** - * Merge table specific CSS (CELLSPACING, CELLPADDING). + * Merge table specific CSS (CELLSPACING, CELLPADDING, and the cells' border of a table with a border attribute). * * @param string $tag HTML tag name * @param array $attr HTML attributes @@ -588,6 +593,12 @@ protected function mergeTableSpecificCss($tag, $attr) $this->cssProperties['PADDING-TOP'] = $cellPadding; $this->cssProperties['PADDING-BOTTOM'] = $cellPadding; } + + // Only the standard cascade marks a table's cells to take the border its border attribute gives them + if (!empty($tableCell['cell_border'])) { + $border = $this->presentationalHints->ofCellBorder(); + $this->setMergedCss($border, false); + } } /** diff --git a/src/Css/PresentationalHints.php b/src/Css/PresentationalHints.php new file mode 100644 index 000000000..98da6c7af --- /dev/null +++ b/src/Css/PresentationalHints.php @@ -0,0 +1,350 @@ +` is ignored as a browser + * ignores it. `bgcolor`, `cellpadding`, `cellspacing` and a table's `align` are read where the table is built. + */ +class PresentationalHints +{ + + /** + * mPDF's own tags that run the cascade. They keep every attribute mPDF has read for them + */ + const OWN_TAGS = ['BARCODE', 'DOTTAB', 'TEXTCIRCLE']; + + /** + * The elements each attribute that sets one property is a hint on, and the property. mPDF also sizes a meter and + * a progress bar by their width and height + */ + const PROPERTIES = [ + 'COLOR' => [['FONT', 'HR'], 'COLOR'], + 'WIDTH' => [['HR', 'IMG', 'METER', 'PROGRESS', 'TABLE', 'TD', 'TH'], 'WIDTH'], + 'HEIGHT' => [['IMG', 'METER', 'PROGRESS', 'TABLE', 'TBODY', 'TD', 'TFOOT', 'TH', 'THEAD', 'TR'], 'HEIGHT'], + 'VALIGN' => [['TBODY', 'TD', 'TFOOT', 'TH', 'THEAD', 'TR'], 'VERTICAL-ALIGN'], + ]; + + /** + * The text alignment `align` gives the elements it aligns the text of, by its value + */ + const TEXT_ALIGN = [ + 'DIV' => ['left' => 'left', 'right' => 'right', 'center' => 'center', 'middle' => 'center', 'justify' => 'justify'], + 'P' => ['left' => 'left', 'right' => 'right', 'center' => 'center', 'justify' => 'justify'], + 'CELL' => ['left' => 'left', 'right' => 'right', 'center' => 'center', 'middle' => 'center', 'absmiddle' => 'center', 'justify' => 'justify'], + ]; + + /** + * The elements that take their text alignment from `align` as a paragraph does, and as a table cell does + */ + const TEXT_ALIGN_OF = [ + 'DIV' => 'DIV', + 'P' => 'P', 'H1' => 'P', 'H2' => 'P', 'H3' => 'P', 'H4' => 'P', 'H5' => 'P', 'H6' => 'P', + 'THEAD' => 'CELL', 'TBODY' => 'CELL', 'TFOOT' => 'CELL', 'TR' => 'CELL', 'TD' => 'CELL', 'TH' => 'CELL', + ]; + + /** + * How `align` places an image, by its value + */ + const IMAGE_ALIGN = [ + 'left' => ['FLOAT' => 'left'], + 'right' => ['FLOAT' => 'right'], + 'top' => ['VERTICAL-ALIGN' => 'top'], + 'baseline' => ['VERTICAL-ALIGN' => 'baseline'], + 'texttop' => ['VERTICAL-ALIGN' => 'text-top'], + 'absmiddle' => ['VERTICAL-ALIGN' => 'middle'], + 'abscenter' => ['VERTICAL-ALIGN' => 'middle'], + 'middle' => ['VERTICAL-ALIGN' => 'middle'], + 'center' => ['VERTICAL-ALIGN' => 'middle'], + 'bottom' => ['VERTICAL-ALIGN' => 'bottom'], + ]; + + /** + * The margins `align` gives a horizontal rule, by its value + */ + const RULE_ALIGN = [ + 'left' => ['MARGIN-LEFT' => '0', 'MARGIN-RIGHT' => 'auto'], + 'right' => ['MARGIN-LEFT' => 'auto', 'MARGIN-RIGHT' => '0'], + 'center' => ['MARGIN-LEFT' => 'auto', 'MARGIN-RIGHT' => 'auto'], + ]; + + /** + * The marker `type` gives a list or a list item, by its value. The letters and numerals are matched as written, + * the words in any case + */ + const LIST_TYPES = [ + '1' => 'decimal', + 'a' => 'lower-latin', + 'A' => 'upper-latin', + 'i' => 'lower-roman', + 'I' => 'upper-roman', + 'none' => 'none', + 'disc' => 'disc', + 'circle' => 'circle', + 'square' => 'square', + ]; + + /** + * The font sizes of ``, by its value + */ + const FONT_SIZES = [ + '+1' => '120%', + '-1' => '86%', + '1' => 'XX-SMALL', + '2' => 'X-SMALL', + '3' => 'SMALL', + '4' => 'MEDIUM', + '5' => 'LARGE', + '6' => 'X-LARGE', + '7' => 'XX-LARGE', + ]; + + /** + * @var \Mpdf\Mpdf + */ + private $mpdf; + + /** + * @var \Mpdf\Css\NormalizeProperties + */ + private $normalizeProperties; + + /** + * @var array|null The border ofCellBorder() gives, once it has been asked for + */ + private $cellBorder; + + /** + * @param \Mpdf\Mpdf $mpdf For the characters a table cell can align on + * @param \Mpdf\Css\NormalizeProperties $normalizeProperties + */ + public function __construct(Mpdf $mpdf, NormalizeProperties $normalizeProperties) + { + $this->mpdf = $mpdf; + $this->normalizeProperties = $normalizeProperties; + } + + /** + * The properties an element's attributes set as hints. `dir` and `lang` are read on every element + * + * @param string $tag Uppercased + * @param array $attr The element's attributes, keyed uppercased + * + * @return array CSS properties, keyed uppercased + */ + public function of($tag, array $attr) + { + $hints = []; + + if (!empty($attr['DIR'])) { + $hints['DIRECTION'] = $attr['DIR']; + } + + if (!empty($attr['LANG'])) { + $hints['LANG'] = $attr['LANG']; + } + + foreach (self::PROPERTIES as $attribute => list($tags, $property)) { + if (!empty($attr[$attribute]) && in_array($tag, $tags, true)) { + $hints[$property] = $attr[$attribute]; + } + } + + if ($tag === 'FONT') { + $hints = array_merge($hints, $this->ofFont($attr)); + } + + if (isset($attr['ALIGN'])) { + $hints = array_merge($hints, $this->ofAlign($tag, strtolower(trim($attr['ALIGN'])), $attr)); + } + + if (isset($attr['NOWRAP']) && ($tag === 'TD' || $tag === 'TH')) { + $hints['WHITE-SPACE'] = 'nowrap'; + } + + if ($tag === 'IMG' || ($tag === 'INPUT' && isset($attr['TYPE']) && strtolower($attr['TYPE']) === 'image')) { + $hints = array_merge($hints, $this->ofImageSpacing($attr)); + } + + if (($tag === 'TABLE' || $tag === 'IMG') && isset($attr['BORDER'])) { + $hints = array_merge($hints, $this->ofBorder($tag, $attr['BORDER'])); + } + + if (isset($attr['TYPE']) && in_array($tag, ['OL', 'UL', 'LI'], true)) { + $type = array_key_exists($attr['TYPE'], self::LIST_TYPES) ? $attr['TYPE'] : strtolower($attr['TYPE']); + if (array_key_exists($type, self::LIST_TYPES)) { + $hints['LIST-STYLE-TYPE'] = self::LIST_TYPES[$type]; + } + } + + if ($tag === 'HR' && isset($attr['SIZE'])) { + $size = self::nonNegativeInteger($attr['SIZE']); + if ($size) { + $hints['HEIGHT'] = $size . 'px'; + } + } + + return $hints; + } + + /** + * The font family and size `` and `` set + * + * @param array $attr The font element's attributes + * + * @return array CSS properties + */ + public function ofFont(array $attr) + { + $hints = []; + + if (!empty($attr['FACE'])) { + $hints = $this->normalizeProperties->normalize(['FONT-FAMILY' => $attr['FACE']]); + } + + if (isset($attr['SIZE']) && array_key_exists($attr['SIZE'], self::FONT_SIZES)) { + $hints['FONT-SIZE'] = self::FONT_SIZES[$attr['SIZE']]; + } + + return $hints; + } + + /** + * The border each cell of a table with a `border` attribute takes, as a browser's default stylesheet gives it + * + * @return array CSS properties + */ + public function ofCellBorder() + { + if ($this->cellBorder === null) { + $this->cellBorder = $this->ofBorder('TABLE', '1'); + } + + return $this->cellBorder; + } + + /** + * The width of the border `border` gives a table or an image: a table's is 1px where the value is not a number, + * and an image has none at 0 + * + * @param string $tag TABLE or IMG + * @param string $value The attribute's value + * + * @return int Pixels, 0 for no border + */ + public static function borderWidth($tag, $value) + { + $width = self::nonNegativeInteger($value); + + return $width === null && $tag === 'TABLE' ? 1 : (int) $width; + } + + /** + * What `align` sets on an element + * + * @param string $tag + * @param string $align The attribute's value, lowercased + * @param array $attr The element's attributes, for the character a table cell aligns on + * + * @return array CSS properties + */ + private function ofAlign($tag, $align, array $attr) + { + if (array_key_exists($tag, self::TEXT_ALIGN_OF)) { + $values = self::TEXT_ALIGN[self::TEXT_ALIGN_OF[$tag]]; + if (isset($values[$align])) { + return ['TEXT-ALIGN' => $values[$align]]; + } + + return $align === 'char' && ($tag === 'TD' || $tag === 'TH') ? $this->ofCharAlign($attr) : []; + } + + if ($tag === 'IMG' && array_key_exists($align, self::IMAGE_ALIGN)) { + return self::IMAGE_ALIGN[$align]; + } + + if ($tag === 'HR' && array_key_exists($align, self::RULE_ALIGN)) { + return self::RULE_ALIGN[$align]; + } + + if ($tag === 'CAPTION' && $align === 'bottom') { + return ['CAPTION-SIDE' => 'bottom']; + } + + return []; + } + + /** + * The decimal alignment `align="char"` gives a table cell: on its `char`, or on the point where it names none + * + * @param array $attr The cell's attributes + * + * @return array CSS properties, none for a character mPDF cannot align on + */ + private function ofCharAlign(array $attr) + { + if (empty($attr['CHAR'])) { + return ['TEXT-ALIGN' => 'DPR']; + } + + $char = UtfString::strcode2utf(html_entity_decode($attr['CHAR'])); + $key = array_search($char, $this->mpdf->decimal_align, true); + + return $key === false ? [] : ['TEXT-ALIGN' => $key . 'R']; + } + + /** + * The margins `vspace` and `hspace` give an image + * + * @param array $attr The image's attributes + * + * @return array CSS properties + */ + private function ofImageSpacing(array $attr) + { + $hints = []; + + if (!empty($attr['VSPACE'])) { + $hints['MARGIN-TOP'] = $hints['MARGIN-BOTTOM'] = $attr['VSPACE']; + } + + if (!empty($attr['HSPACE'])) { + $hints['MARGIN-LEFT'] = $hints['MARGIN-RIGHT'] = $attr['HSPACE']; + } + + return $hints; + } + + /** + * The solid black border `border` draws around a table or an image + * + * @param string $tag TABLE or IMG + * @param string $value The attribute's value + * + * @return array CSS properties + */ + private function ofBorder($tag, $value) + { + $width = self::borderWidth($tag, $value); + + return $width ? $this->normalizeProperties->normalize(['BORDER' => $width . 'px solid #000000']) : []; + } + + /** + * Reads a value as HTML's rules for parsing non-negative integers do: the digits it starts with, after any + * whitespace and a plus sign + * + * @param string $value + * + * @return int|null Null where the value does not start with a number + */ + private static function nonNegativeInteger($value) + { + return preg_match('/^\s*\+?(\d+)/', $value, $matches) ? (int) $matches[1] : null; + } +} diff --git a/src/ServiceFactory.php b/src/ServiceFactory.php index ffc4300a8..28f78e5c4 100644 --- a/src/ServiceFactory.php +++ b/src/ServiceFactory.php @@ -12,6 +12,7 @@ use Mpdf\Css\InlinePropertyConverter; use Mpdf\Css\InlineStyleParser; use Mpdf\Css\NormalizeProperties; +use Mpdf\Css\PresentationalHints; use Mpdf\Css\SelectorParser; use Mpdf\Css\ShadowParser; use Mpdf\File\LocalContentLoader; @@ -115,7 +116,8 @@ public function getServices( $selectorParser, $inlinePropertyConverter, $colorConverter, - $borderMerger + $borderMerger, + new PresentationalHints($mpdf, $normalizeProperties) ); $cssManager = new CssManager($cssParser, $cssMerger); diff --git a/src/Tag/BlockTag.php b/src/Tag/BlockTag.php index 15b1ab0b2..4a1c76772 100644 --- a/src/Tag/BlockTag.php +++ b/src/Tag/BlockTag.php @@ -54,7 +54,7 @@ public function open($attr, &$ahtml, &$ihtml) } $cappos = 'T'; - if (isset($attr['ALIGN']) && strtolower($attr['ALIGN']) === 'bottom') { + if (isset($attr['ALIGN']) && strtolower($attr['ALIGN']) === 'bottom' && !$this->appliesStandardCascade()) { $cappos = 'B'; } elseif (isset($p['CAPTION-SIDE']) && strtolower($p['CAPTION-SIDE']) === 'bottom') { $cappos = 'B'; @@ -550,7 +550,7 @@ public function open($attr, &$ahtml, &$ihtml) } // mPDF 6 - if (!empty($attr['ALIGN'])) { + if (!empty($attr['ALIGN']) && !$this->appliesStandardCascade()) { $currblk['block-align'] = $this->getAlign($attr['ALIGN']); } diff --git a/src/Tag/Hr.php b/src/Tag/Hr.php index 8d023f2ab..8a00c3091 100644 --- a/src/Tag/Hr.php +++ b/src/Tag/Hr.php @@ -92,7 +92,7 @@ public function open($attr, &$ahtml, &$ihtml) $properties['WIDTH'] = NumericString::removePercentChar($properties['WIDTH']); // make "90%" become simply "90" $objattr['W-PERCENT'] = $properties['WIDTH']; } - if (isset($attr['WIDTH']) && NumericString::containsPercentChar($attr['WIDTH'])) { + if (isset($attr['WIDTH']) && NumericString::containsPercentChar($attr['WIDTH']) && !$this->appliesStandardCascade()) { $attr['WIDTH'] = NumericString::removePercentChar($attr['WIDTH']); // make "90%" become simply "90" $objattr['W-PERCENT'] = $attr['WIDTH']; } diff --git a/src/Tag/Input.php b/src/Tag/Input.php index 06b23d1e0..20d4f0217 100644 --- a/src/Tag/Input.php +++ b/src/Tag/Input.php @@ -80,7 +80,7 @@ public function open($attr, &$ahtml, &$ihtml) $objattr['fontfamily'] = $this->mpdf->FontFamily; $objattr['fontsize'] = $this->mpdf->FontSizePt; if ($this->mpdf->activeForms()) { - if (isset($attr['ALIGN'])) { + if (isset($attr['ALIGN']) && !($this->appliesStandardCascade() && isset($properties['TEXT-ALIGN']))) { $objattr['text_align'] = $this->getAlign($attr['ALIGN']); } elseif (isset($properties['TEXT-ALIGN'])) { $objattr['text_align'] = $this->getAlign($properties['TEXT-ALIGN']); diff --git a/src/Tag/Table.php b/src/Tag/Table.php index db745ed1f..c88690ffd 100644 --- a/src/Tag/Table.php +++ b/src/Tag/Table.php @@ -3,6 +3,7 @@ namespace Mpdf\Tag; use Mpdf\Css\Border; +use Mpdf\Css\PresentationalHints; use Mpdf\Mpdf; use Mpdf\Utils\Rotation; @@ -462,7 +463,11 @@ public function open($attr, &$ahtml, &$ihtml) $table['cell_padding'] = false; } - if (isset($attr['BORDER']) && $attr['BORDER'] == '1') { + $this->mpdf->table_border_attr_set = 0; + if ($this->appliesStandardCascade()) { + // The table's border came in the properties. Its cells take a border of their own, below any rule for them + $table['cell_border'] = isset($attr['BORDER']) && PresentationalHints::borderWidth('TABLE', $attr['BORDER']) > 0; + } elseif (isset($attr['BORDER']) && $attr['BORDER'] == '1') { $this->mpdf->table_border_attr_set = 1; $bord = $this->mpdf->border_details('#000000 1px solid'); if ($bord['s']) { @@ -472,8 +477,6 @@ public function open($attr, &$ahtml, &$ihtml) $table['border_details']['T'] = $bord; $table['border_details']['B'] = $bord; } - } else { - $this->mpdf->table_border_attr_set = 0; } if ($w) { diff --git a/src/Tag/Tag.php b/src/Tag/Tag.php index 5f3040eeb..730862894 100644 --- a/src/Tag/Tag.php +++ b/src/Tag/Tag.php @@ -8,6 +8,7 @@ use Mpdf\Color\ColorConverter; use Mpdf\Css\BorderMerger; use Mpdf\CssManager; +use Mpdf\CssMode; use Mpdf\Form; use Mpdf\Image\ImageProcessor; use Mpdf\Language\LanguageToFontInterface; @@ -121,6 +122,18 @@ protected function getAlign($property) return array_key_exists($property, self::ALIGN) ? self::ALIGN[$property] : ''; } + /** + * Whether the standard cascade applies the document's CSS. Its presentational attributes then reach a tag + * handler as hints among the merged properties, below any stylesheet rule, and are not read again from the + * attributes + * + * @return bool + */ + protected function appliesStandardCascade() + { + return $this->mpdf->cssMode === CssMode::STANDARD; + } + /** * Whether a page-break-before or page-break-after value starts a new page: always, left or right * diff --git a/src/Tag/Td.php b/src/Tag/Td.php index bbe4a3d96..2a137794e 100644 --- a/src/Tag/Td.php +++ b/src/Tag/Td.php @@ -222,7 +222,7 @@ public function open($attr, &$ahtml, &$ihtml) $c['a'] = $this->getAlign($properties['TEXT-ALIGN']); } } - if (!empty($attr['ALIGN'])) { + if (!empty($attr['ALIGN']) && !$this->appliesStandardCascade()) { if (strtolower($attr['ALIGN']) === 'char') { if (!empty($attr['CHAR'])) { $char = html_entity_decode($attr['CHAR']); @@ -402,7 +402,7 @@ public function open($attr, &$ahtml, &$ihtml) if (isset($attr['TEXT-ROTATE'])) { $c['R'] = $attr['TEXT-ROTATE']; } - if (!empty($attr['NOWRAP'])) { + if (!empty($attr['NOWRAP']) && !$this->appliesStandardCascade()) { $c['nowrap'] = 1; } diff --git a/tests/Mpdf/CascadeOrderTest.php b/tests/Mpdf/CascadeOrderTest.php index 6cfa52d42..110cb826f 100644 --- a/tests/Mpdf/CascadeOrderTest.php +++ b/tests/Mpdf/CascadeOrderTest.php @@ -346,7 +346,7 @@ public function uncontestedDocuments() return [ 'collapsed borders of cells, rows and the table' => ['' . '
    ab
    cd
    '], - 'a border from a cell rule against one as wide from the border attribute, which the rule wins' => ['' + 'a border from a cell rule against one as wide from the border attribute, which the rule wins' => ['' . '
    abc
    '], 'separate borders and padding' => ['' . '
    h
    a
    '], diff --git a/tests/Mpdf/Css/PresentationalHintsTest.php b/tests/Mpdf/Css/PresentationalHintsTest.php new file mode 100644 index 000000000..e8c899cf9 --- /dev/null +++ b/tests/Mpdf/Css/PresentationalHintsTest.php @@ -0,0 +1,217 @@ +hints = new PresentationalHints($mpdf, $normalizeProperties); + } + + /** + * An attribute sets its property on an element HTML gives it to, and nothing on one it does not + * + * @dataProvider elements + * + * @param string $tag + * @param array $attr + * @param array $expected + */ + public function testReadsEachAttributeOnTheElementsHtmlGivesItTo($tag, array $attr, array $expected) + { + $this->assertEquals($expected, $this->hints->of($tag, $attr)); + } + + /** + * Each attribute on an element it is a hint on, and on elements it is not + * + * @return array[] Each [tag, attributes, the properties they set] + */ + public function elements() + { + $black = function ($width) { + $border = []; + foreach (['TOP', 'RIGHT', 'BOTTOM', 'LEFT'] as $side) { + $border['BORDER-' . $side] = $width . ' solid #000000'; + $border['BORDER-' . $side . '-WIDTH'] = $width; + $border['BORDER-' . $side . '-STYLE'] = 'solid'; + $border['BORDER-' . $side . '-COLOR'] = '#000000'; + } + + return $border; + }; + + return [ + 'dir on any element' => ['SPAN', ['DIR' => 'rtl'], ['DIRECTION' => 'rtl']], + 'lang on any element' => ['P', ['LANG' => 'fr'], ['LANG' => 'fr']], + + 'color on font' => ['FONT', ['COLOR' => '#f00'], ['COLOR' => '#f00']], + 'color on hr' => ['HR', ['COLOR' => '#f00'], ['COLOR' => '#f00']], + 'color on a' => ['A', ['COLOR' => '#f00'], []], + 'color on span' => ['SPAN', ['COLOR' => '#f00'], []], + 'color on p' => ['P', ['COLOR' => '#f00'], []], + 'color on td' => ['TD', ['COLOR' => '#f00'], []], + 'color on input' => ['INPUT', ['COLOR' => '#f00'], []], + + 'face and size on font' => ['FONT', ['FACE' => 'serif', 'SIZE' => '5'], ['FONT-FAMILY' => 'serif', 'FONT-SIZE' => 'LARGE']], + 'a size a step larger on font' => ['FONT', ['SIZE' => '+1'], ['FONT-SIZE' => '120%']], + 'a size mPDF has no size for on font' => ['FONT', ['SIZE' => '9'], []], + 'face on span' => ['SPAN', ['FACE' => 'serif'], []], + + 'width on img' => ['IMG', ['WIDTH' => '20'], ['WIDTH' => '20']], + 'width on table' => ['TABLE', ['WIDTH' => '50%'], ['WIDTH' => '50%']], + 'width on td' => ['TD', ['WIDTH' => '30mm'], ['WIDTH' => '30mm']], + 'width on th' => ['TH', ['WIDTH' => '30mm'], ['WIDTH' => '30mm']], + 'width on hr' => ['HR', ['WIDTH' => '50%'], ['WIDTH' => '50%']], + 'width on meter' => ['METER', ['WIDTH' => '40mm'], ['WIDTH' => '40mm']], + 'width on progress' => ['PROGRESS', ['WIDTH' => '40mm'], ['WIDTH' => '40mm']], + 'width on div' => ['DIV', ['WIDTH' => '50mm'], []], + 'width on p' => ['P', ['WIDTH' => '50mm'], []], + 'width on textarea' => ['TEXTAREA', ['WIDTH' => '50mm'], []], + 'width on input' => ['INPUT', ['WIDTH' => '50mm'], []], + 'width of zero on table' => ['TABLE', ['WIDTH' => '0'], []], + + 'height on img' => ['IMG', ['HEIGHT' => '20'], ['HEIGHT' => '20']], + 'height on td' => ['TD', ['HEIGHT' => '30mm'], ['HEIGHT' => '30mm']], + 'height on tr' => ['TR', ['HEIGHT' => '30mm'], ['HEIGHT' => '30mm']], + 'height on thead' => ['THEAD', ['HEIGHT' => '30mm'], ['HEIGHT' => '30mm']], + 'height on div' => ['DIV', ['HEIGHT' => '30mm'], []], + 'height on hr' => ['HR', ['HEIGHT' => '3mm'], []], + + 'valign on td' => ['TD', ['VALIGN' => 'bottom'], ['VERTICAL-ALIGN' => 'bottom']], + 'valign on th' => ['TH', ['VALIGN' => 'top'], ['VERTICAL-ALIGN' => 'top']], + 'valign on tr' => ['TR', ['VALIGN' => 'top'], ['VERTICAL-ALIGN' => 'top']], + 'valign on thead' => ['THEAD', ['VALIGN' => 'top'], ['VERTICAL-ALIGN' => 'top']], + 'valign on tbody' => ['TBODY', ['VALIGN' => 'top'], ['VERTICAL-ALIGN' => 'top']], + 'valign on tfoot' => ['TFOOT', ['VALIGN' => 'top'], ['VERTICAL-ALIGN' => 'top']], + 'valign on table' => ['TABLE', ['VALIGN' => 'top'], []], + 'valign on img' => ['IMG', ['VALIGN' => 'top'], []], + 'valign on span' => ['SPAN', ['VALIGN' => 'top'], []], + + 'vspace and hspace on img' => ['IMG', ['VSPACE' => '10', 'HSPACE' => '5'], ['MARGIN-TOP' => '10', 'MARGIN-BOTTOM' => '10', 'MARGIN-LEFT' => '5', 'MARGIN-RIGHT' => '5']], + 'vspace on an image button' => ['INPUT', ['TYPE' => 'image', 'VSPACE' => '10'], ['MARGIN-TOP' => '10', 'MARGIN-BOTTOM' => '10']], + 'vspace on a text field' => ['INPUT', ['TYPE' => 'text', 'VSPACE' => '10'], []], + 'hspace on div' => ['DIV', ['HSPACE' => '10'], []], + + 'align on div' => ['DIV', ['ALIGN' => 'center'], ['TEXT-ALIGN' => 'center']], + 'align middle on div' => ['DIV', ['ALIGN' => 'Middle'], ['TEXT-ALIGN' => 'center']], + 'align on p' => ['P', ['ALIGN' => 'right'], ['TEXT-ALIGN' => 'right']], + 'align middle on p' => ['P', ['ALIGN' => 'middle'], []], + 'align on h1' => ['H1', ['ALIGN' => 'justify'], ['TEXT-ALIGN' => 'justify']], + 'align on h6' => ['H6', ['ALIGN' => 'left'], ['TEXT-ALIGN' => 'left']], + 'align on td' => ['TD', ['ALIGN' => 'right'], ['TEXT-ALIGN' => 'right']], + 'align absmiddle on th' => ['TH', ['ALIGN' => 'absmiddle'], ['TEXT-ALIGN' => 'center']], + 'align on tr' => ['TR', ['ALIGN' => 'center'], ['TEXT-ALIGN' => 'center']], + 'align on thead' => ['THEAD', ['ALIGN' => 'right'], ['TEXT-ALIGN' => 'right']], + 'align char on td' => ['TD', ['ALIGN' => 'char'], ['TEXT-ALIGN' => 'DPR']], + 'align char on a comma' => ['TD', ['ALIGN' => 'char', 'CHAR' => ','], ['TEXT-ALIGN' => 'DCR']], + 'align char on a character mPDF cannot align on' => ['TD', ['ALIGN' => 'char', 'CHAR' => 'x'], []], + 'align char on tr' => ['TR', ['ALIGN' => 'char'], []], + 'align on blockquote' => ['BLOCKQUOTE', ['ALIGN' => 'center'], []], + 'align on span' => ['SPAN', ['ALIGN' => 'center'], []], + 'align on ul' => ['UL', ['ALIGN' => 'center'], []], + 'align bottom on caption' => ['CAPTION', ['ALIGN' => 'bottom'], ['CAPTION-SIDE' => 'bottom']], + 'align left on caption' => ['CAPTION', ['ALIGN' => 'left'], []], + 'align left on hr' => ['HR', ['ALIGN' => 'left'], ['MARGIN-LEFT' => '0', 'MARGIN-RIGHT' => 'auto']], + 'align right on hr' => ['HR', ['ALIGN' => 'right'], ['MARGIN-LEFT' => 'auto', 'MARGIN-RIGHT' => '0']], + 'align center on hr' => ['HR', ['ALIGN' => 'center'], ['MARGIN-LEFT' => 'auto', 'MARGIN-RIGHT' => 'auto']], + 'align left on img' => ['IMG', ['ALIGN' => 'left'], ['FLOAT' => 'left']], + 'align right on img' => ['IMG', ['ALIGN' => 'RIGHT'], ['FLOAT' => 'right']], + 'align absmiddle on img' => ['IMG', ['ALIGN' => 'absmiddle'], ['VERTICAL-ALIGN' => 'middle']], + 'align texttop on img' => ['IMG', ['ALIGN' => 'texttop'], ['VERTICAL-ALIGN' => 'text-top']], + 'align bottom on img' => ['IMG', ['ALIGN' => 'bottom'], ['VERTICAL-ALIGN' => 'bottom']], + 'align justify on img' => ['IMG', ['ALIGN' => 'justify'], []], + 'align on table, read where the table is built' => ['TABLE', ['ALIGN' => 'center'], []], + + 'nowrap on td' => ['TD', ['NOWRAP' => 'nowrap'], ['WHITE-SPACE' => 'nowrap']], + 'nowrap on th' => ['TH', ['NOWRAP' => 'nowrap'], ['WHITE-SPACE' => 'nowrap']], + 'nowrap on div' => ['DIV', ['NOWRAP' => 'nowrap'], []], + + 'border on table' => ['TABLE', ['BORDER' => '1'], $black('1px')], + 'a wider border on table' => ['TABLE', ['BORDER' => '3'], $black('3px')], + 'a border that is not a number on table' => ['TABLE', ['BORDER' => 'yes'], $black('1px')], + 'no border on table' => ['TABLE', ['BORDER' => '0'], []], + 'border on img' => ['IMG', ['BORDER' => '2'], $black('2px')], + 'no border on img' => ['IMG', ['BORDER' => '0'], []], + 'a border that is not a number on img' => ['IMG', ['BORDER' => 'yes'], []], + 'border on td' => ['TD', ['BORDER' => '1'], []], + 'border on div' => ['DIV', ['BORDER' => '1'], []], + + 'type on ol' => ['OL', ['TYPE' => 'A'], ['LIST-STYLE-TYPE' => 'upper-latin']], + 'lowercase type on ol' => ['OL', ['TYPE' => 'a'], ['LIST-STYLE-TYPE' => 'lower-latin']], + 'roman type on li' => ['LI', ['TYPE' => 'I'], ['LIST-STYLE-TYPE' => 'upper-roman']], + 'type on ul, in capitals' => ['UL', ['TYPE' => 'SQUARE'], ['LIST-STYLE-TYPE' => 'square']], + 'type none on li' => ['LI', ['TYPE' => 'none'], ['LIST-STYLE-TYPE' => 'none']], + 'a type HTML does not define on ol' => ['OL', ['TYPE' => 'lower-greek'], []], + 'type on input' => ['INPUT', ['TYPE' => 'text'], []], + + 'size on hr' => ['HR', ['SIZE' => '5'], ['HEIGHT' => '5px']], + 'size of zero on hr' => ['HR', ['SIZE' => '0'], []], + 'size on span' => ['SPAN', ['SIZE' => '5'], []], + + 'bgcolor, read where the table is built' => ['TD', ['BGCOLOR' => '#f00'], []], + 'cellpadding, read where the table is built' => ['TABLE', ['CELLPADDING' => '5'], []], + ]; + } + + /** + * The width of the border `border` gives: a table's is 1px where the value is not a number, an image has none + * + * @dataProvider borderWidths + * + * @param string $tag + * @param string $value + * @param int $expected + */ + public function testReadsTheWidthOfABorderAsANonNegativeInteger($tag, $value, $expected) + { + $this->assertSame($expected, PresentationalHints::borderWidth($tag, $value)); + } + + /** + * Values of `border`, read as HTML reads them + * + * @return array[] Each [tag, value, width in pixels] + */ + public function borderWidths() + { + return [ + 'a number' => ['TABLE', '2', 2], + 'zero' => ['TABLE', '0', 0], + 'with leading space and a plus sign' => ['TABLE', ' +4', 4], + 'digits then other characters' => ['TABLE', '3px', 3], + 'not a number, on a table' => ['TABLE', 'border', 1], + 'empty, on a table' => ['TABLE', '', 1], + 'not a number, on an image' => ['IMG', 'border', 0], + 'a negative number, on an image' => ['IMG', '-2', 0], + ]; + } +} diff --git a/tests/Mpdf/LineRecordingMpdf.php b/tests/Mpdf/LineRecordingMpdf.php new file mode 100644 index 000000000..650820b84 --- /dev/null +++ b/tests/Mpdf/LineRecordingMpdf.php @@ -0,0 +1,34 @@ +drawnLines[] = ['page' => $this->page, 'ends' => [$x1, $y1, $x2, $y2], 'colour' => $this->DrawColor, 'width' => $this->LineWidth]; + + parent::Line($x1, $y1, $x2, $y2); + } +} diff --git a/tests/Mpdf/ListMarkerRecordingMpdf.php b/tests/Mpdf/ListMarkerRecordingMpdf.php index 72f8282c8..2ae2b202f 100644 --- a/tests/Mpdf/ListMarkerRecordingMpdf.php +++ b/tests/Mpdf/ListMarkerRecordingMpdf.php @@ -3,12 +3,15 @@ namespace Mpdf; /** - * Records the image each list marker is asked to draw, as the cascade and setCSS() hand it over, before the image - * is looked for. + * Records the type and the image each list marker is asked to draw, as the cascade and setCSS() hand them over, + * before the image is looked for. */ class ListMarkerRecordingMpdf extends Mpdf { + /** The list-style-type value of each marker set, in order. */ + public $markerTypes = []; + /** The list-style-image value of each marker set, in order. */ public $markerImages = []; @@ -19,6 +22,7 @@ class ListMarkerRecordingMpdf extends Mpdf */ function _setListMarker($listitemtype, $listitemimage, $listitemposition) { + $this->markerTypes[] = $listitemtype; $this->markerImages[] = $listitemimage; return parent::_setListMarker($listitemtype, $listitemimage, $listitemposition); diff --git a/tests/Mpdf/PageStreams.php b/tests/Mpdf/PageStreams.php index 2daf8fd58..aac463cbd 100644 --- a/tests/Mpdf/PageStreams.php +++ b/tests/Mpdf/PageStreams.php @@ -271,7 +271,20 @@ private function imagePlacements($html, $page = 0, $config = []) { $pages = $this->pages($this->render($html, $config)); $this->assertArrayHasKey($page, $pages); - preg_match_all('/([-\d.]+) 0 0 ([-\d.]+) ([-\d.]+) [-\d.]+ cm \/I\d+ Do/', $pages[$page], $matches, PREG_SET_ORDER); + + return $this->placementsIn($pages[$page]); + } + + /** + * Where each image in a page's content stream is placed, keyed w/h/x in millimetres + * + * @param string $stream + * + * @return array[] + */ + private function placementsIn($stream) + { + preg_match_all('/([-\d.]+) 0 0 ([-\d.]+) ([-\d.]+) [-\d.]+ cm \/I\d+ Do/', $stream, $matches, PREG_SET_ORDER); return array_map(function ($match) { return ['w' => $match[1] / Mpdf::SCALE, 'h' => $match[2] / Mpdf::SCALE, 'x' => $match[3] / Mpdf::SCALE]; diff --git a/tests/Mpdf/PresentationalAttributeTest.php b/tests/Mpdf/PresentationalAttributeTest.php new file mode 100644 index 000000000..c43fad4c4 --- /dev/null +++ b/tests/Mpdf/PresentationalAttributeTest.php @@ -0,0 +1,869 @@ + $expected + */ + public function testTheColourOfText($cssMode, $html, array $expected) + { + $this->assertDrawnInColours($expected, $this->drawnColours($html, ['cssMode' => $cssMode])); + } + + /** + * `color` on the elements HTML gives it to and on those it does not + * + * @return array[] + */ + public function textColours() + { + return $this->inBothModes([ + 'font color beats the colour it inherits' => [ + '

    font

    ', + ['font' => self::GREEN], + ['font' => self::GREEN], + ], + 'a rule beats font color' => [ + '

    font

    ', + ['font' => self::BLUE], + ['font' => self::BLUE], + ], + 'font color inside a link' => [ + '

    font

    ', + ['font' => self::GREEN], + ['font' => self::GREEN], + ], + 'a link keeps its colour over its color attribute' => [ + '

    link

    ', + ['link' => self::BLUE], + ['link' => self::BLUE], + ], + 'a span has no color attribute' => [ + '

    span

    ', + ['span' => self::RED], + ['span' => self::BLACK], + ], + 'a paragraph has no color attribute' => [ + '

    para

    ', + ['para' => self::RED], + ['para' => self::BLACK], + ], + 'a div passes on no color attribute' => [ + '

    inside

    ', + ['inside' => self::RED], + ['inside' => self::BLACK], + ], + 'a table cell has no color attribute' => [ + '
    cell
    ', + ['cell' => self::RED], + ['cell' => self::BLACK], + ], + 'a heading has no color attribute' => [ + '

    heading

    ', + ['heading' => self::RED], + ['heading' => self::BLACK], + ], + ]); + } + + /** + * A horizontal rule is drawn where, as long, in the colour and as thick as its attributes and rules say + * + * @dataProvider horizontalRules + * + * @param string $cssMode + * @param string $html + * @param array $expected The rule's left and right ends in millimetres, its stroke colour and its width + */ + public function testAHorizontalRule($cssMode, $html, array $expected) + { + $mpdf = $this->document($html, $cssMode); + + $this->assertCount(1, $mpdf->drawnLines); + $line = $mpdf->drawnLines[0]; + $this->assertEqualsWithDelta($expected[0], $line['ends'][0], 0.2, 'Where the rule starts'); + $this->assertEqualsWithDelta($expected[1], $line['ends'][2], 0.2, 'Where the rule ends'); + $this->assertSame($expected[2], $line['colour']); + $this->assertEqualsWithDelta($expected[3], $line['width'], 0.01, 'How thick the rule is'); + } + + /** + * `color`, `width`, `align` and `size` on an hr, and a rule for each + * + * @return array[] + */ + public function horizontalRules() + { + $thin = 0.2; + $tenPixels = 10 * 25.4 / 96; + + return $this->inBothModes([ + 'color' => [ + '
    ', + [self::LEFT, self::RIGHT, self::GREY_STROKE, $thin], + [self::LEFT, self::RIGHT, self::RED_STROKE, $thin], + ], + 'a rule beats color' => [ + '
    ', + [self::LEFT, self::RIGHT, self::BLUE_STROKE, $thin], + [self::LEFT, self::RIGHT, self::BLUE_STROKE, $thin], + ], + 'width' => [ + '
    ', + [self::LEFT, self::RIGHT, self::GREY_STROKE, $thin], + [60, 150, self::GREY_STROKE, $thin], + ], + 'a rule beats width' => [ + '
    ', + [33, 177, self::GREY_STROKE, $thin], + [33, 177, self::GREY_STROKE, $thin], + ], + 'align left' => [ + '
    ', + [self::LEFT, self::RIGHT, self::GREY_STROKE, $thin], + [self::LEFT, 105, self::GREY_STROKE, $thin], + ], + 'align right' => [ + '
    ', + [self::LEFT, self::RIGHT, self::GREY_STROKE, $thin], + [105, self::RIGHT, self::GREY_STROKE, $thin], + ], + 'a rule beats align' => [ + '
    ', + [self::LEFT, self::RIGHT, self::GREY_STROKE, $thin], + [60, 150, self::GREY_STROKE, $thin], + ], + 'size' => [ + '
    ', + [self::LEFT, self::RIGHT, self::GREY_STROKE, $thin], + [self::LEFT, self::RIGHT, self::GREY_STROKE, $tenPixels], + ], + 'a rule beats size' => [ + '
    ', + [self::LEFT, self::RIGHT, self::GREY_STROKE, 1], + [self::LEFT, self::RIGHT, self::GREY_STROKE, 1], + ], + 'width in a table cell' => [ + '

    ', + [60.5, 149.5, self::GREY_STROKE, $thin], + [60.5, 149.5, self::GREY_STROKE, $thin], + ], + 'a rule beats width in a table cell' => [ + '

    ', + [60.5, 149.5, self::GREY_STROKE, $thin], + [33.7, 176.3, self::GREY_STROKE, $thin], + ], + ]); + } + + /** + * Each piece of text is aligned as the attributes and rules say + * + * @dataProvider textAlignments + * + * @param string $cssMode + * @param string $html + * @param array $expected Each piece of text and its alignment across the page: left, center or + * right + */ + public function testTheAlignmentOfText($cssMode, $html, array $expected) + { + $boxes = $this->keyedByText($mpdf = $this->document($html, $cssMode), $mpdf->drawnBoxes); + + foreach ($expected as $text => $alignment) { + $this->assertArrayHasKey($text, $boxes, sprintf('"%s" is not drawn', $text)); + $this->assertSame($alignment, $this->alignmentBetween(self::LEFT, self::RIGHT, $boxes[$text]), sprintf('How "%s" is aligned', $text)); + } + } + + /** + * `align` on the blocks and table parts HTML gives it to and on those it does not, and a rule for it + * + * @return array[] + */ + public function textAlignments() + { + return $this->inBothModes([ + 'a paragraph' => [ + '

    para

    ', + ['para' => 'right'], + ['para' => 'right'], + ], + 'a rule beats a paragraph\'s align' => [ + '

    para

    ', + ['para' => 'right'], + ['para' => 'left'], + ], + 'a heading' => [ + '

    heading

    ', + ['heading' => 'center'], + ['heading' => 'center'], + ], + 'a div passes its align on to what is in it' => [ + '

    inside

    ', + ['inside' => 'left'], + ['inside' => 'center'], + ], + 'a rule beats the align a paragraph inherits' => [ + '

    inside

    ', + ['inside' => 'right'], + ['inside' => 'right'], + ], + 'middle on a div' => [ + '
    div
    ', + ['div' => 'left'], + ['div' => 'center'], + ], + 'an address has no align attribute' => [ + '
    address
    ', + ['address' => 'right'], + ['address' => 'left'], + ], + 'a section has no align attribute' => [ + '
    section
    ', + ['section' => 'right'], + ['section' => 'left'], + ], + 'a table cell' => [ + '
    cell
    ', + ['cell' => 'right'], + ['cell' => 'right'], + ], + 'a rule beats a table cell\'s align' => [ + '
    cell
    ', + ['cell' => 'right'], + ['cell' => 'left'], + ], + 'a header cell\'s align beats its default centring' => [ + '
    header
    ', + ['header' => 'left'], + ['header' => 'left'], + ], + 'a table head passes its align on to its cells' => [ + '
    head
    body
    ', + ['head' => 'left', 'body' => 'left'], + ['head' => 'right', 'body' => 'left'], + ], + ]); + } + + /** + * `nowrap` keeps a cell's text on one line, under any rule that wraps it + * + * @dataProvider unwrappedCells + * + * @param string $cssMode + * @param string $html + * @param int $expected How many lines the cell's text is drawn on + */ + public function testNowrapOnATableCell($cssMode, $html, $expected) + { + $this->assertCount($expected, $this->document($html, $cssMode)->drawnText); + } + + /** + * A narrow cell with and without a rule against its nowrap + * + * @return array[] + */ + public function unwrappedCells() + { + $table = '
    aaaa bbbb cccc dddd eeee
    '; + + return $this->inBothModes([ + 'nowrap' => [$table, 1, 1], + 'a rule beats nowrap' => ['' . $table, 1, 2], + ]); + } + + /** + * `valign` places a cell's text, and a rule beats it, under both cascades + * + * @dataProvider verticallyAlignedCells + * + * @param string $cssMode + * @param string $css + * @param bool $lower Whether the cell's text is drawn below that of the cell beside it, which is aligned to the top + */ + public function testValignOnATableCell($cssMode, $css, $lower) + { + $html = '
    bottomtop
    '; + $y = $this->keyedByText($mpdf = $this->document($html, $cssMode), $mpdf->drawnY); + + $this->assertSame($lower, $y['bottom'] > $y['top'] + 10); + } + + /** + * A cell aligned to the bottom by its attribute, with and without a rule + * + * @return array[] + */ + public function verticallyAlignedCells() + { + return $this->inBothModes([ + 'valign' => ['', true, true], + 'a rule beats valign' => ['td { vertical-align: top; }', false, false], + ]); + } + + /** + * `type` sets the marker of a list and of a list item, which beats what the item inherits from its list under the + * standard cascade, and a rule beats it + * + * @dataProvider listTypes + * + * @param string $cssMode + * @param string $html + * @param string[] $expected The type of each marker, in order + */ + public function testTypeOnAListAndAListItem($cssMode, $html, array $expected) + { + $mpdf = new ListMarkerRecordingMpdf(['mode' => 'c', 'cssMode' => $cssMode]); + $mpdf->WriteHTML($html); + + $this->assertSame($expected, $mpdf->markerTypes); + } + + /** + * Lists and items with a type, with and without a rule + * + * @return array[] + */ + public function listTypes() + { + return $this->inBothModes([ + 'on an ordered list' => ['
    1. x
    ', ['lower-latin'], ['lower-latin']], + 'a rule beats it on an ordered list' => ['
    1. x
    ', ['decimal'], ['decimal']], + 'on a list' => ['
    • x
    ', ['square'], ['square']], + 'on a list item' => ['
    • x
    • y
    ', ['disc', 'disc'], ['square', 'disc']], + 'a rule beats it on a list item' => ['
    • x
    ', ['circle'], ['circle']], + ]); + } + + /** + * `bgcolor` on a table, a row and a cell fills it, under any rule for its background, under both cascades + * + * @dataProvider backgrounds + * + * @param string $cssMode + * @param string $html + * @param string[] $fills The colour filled, and a colour not filled + */ + public function testBgcolor($cssMode, $html, array $fills) + { + list($expected, $unexpected) = $fills; + $page = $this->pages($this->render($html, ['cssMode' => $cssMode]))[0]; + + $this->assertMatchesRegularExpression('/' . $expected . '\s+[-\d. ]+ re f/', $page); + $this->assertStringNotContainsString($unexpected, $page); + } + + /** + * bgcolor on each part of a table, with and without a rule for its background + * + * @return array[] + */ + public function backgrounds() + { + $cases = []; + foreach (['table' => 'x', 'tr' => '
    x
    ', 'td' => 'x
    '] as $tag => $html) { + $withAttribute = sprintf($html, ' bgcolor="#008000"'); + $cases['on a ' . $tag] = [$withAttribute, [self::GREEN, self::BLUE], [self::GREEN, self::BLUE]]; + $cases['a rule beats it on a ' . $tag] = ['' . $withAttribute, [self::BLUE, self::GREEN], [self::BLUE, self::GREEN]]; + } + + return $this->inBothModes($cases); + } + + /** + * A table's `cellpadding` pads its cells, under any rule for their padding, under both cascades + * + * @dataProvider paddedCells + * + * @param string $cssMode + * @param string $css + * @param float $expected How far in from the page's left edge the cell's text starts, in millimetres + */ + public function testCellpadding($cssMode, $css, $expected) + { + $html = '
    padded
    '; + $boxes = $this->keyedByText($mpdf = $this->document($html, $cssMode), $mpdf->drawnBoxes); + + $this->assertEqualsWithDelta(self::LEFT + $expected, $boxes['padded'][1], 0.1); + } + + /** + * A padded table, with and without a rule + * + * @return array[] + */ + public function paddedCells() + { + return $this->inBothModes([ + 'cellpadding' => ['', 20 * 25.4 / 96, 20 * 25.4 / 96], + 'a rule beats cellpadding' => ['td { padding: 0; }', 0, 0], + ]); + } + + /** + * A table's `border` draws a border around it, which a rule for the table's border beats under the standard + * cascade, and one around each of its cells, which a rule for the table's border does not reach + * + * @dataProvider tableBorders + * + * @param string $cssMode + * @param string $html + * @param array $expected The widths of the lines drawn, in millimetres, keyed by the number of lines drawn that wide + */ + public function testTheBorderOfATable($cssMode, $html, array $expected) + { + $this->assertEquals($expected, $this->lineWidths($this->document($html, $cssMode))); + } + + /** + * Tables of one cell with a border attribute, with and without a rule + * + * @return array[] + */ + public function tableBorders() + { + $px = function ($pixels) { + return (string) round($pixels * 25.4 / 96, 2); + }; + $cell = 'cell'; + + return $this->inBothModes([ + 'border' => ['' . $cell, [$px(1) => 8], [$px(1) => 8]], + 'no border' => ['
    ' . $cell, [], []], + 'a wider border' => ['
    ' . $cell, [], [$px(3) => 4, $px(1) => 4]], + 'a rule beats the table\'s border' => ['
    ' . $cell, [$px(1) => 8], [$px(1) => 4]], + 'a rule beats the table\'s border with its own' => ['
    ' . $cell, [$px(1) => 8], [$px(2) => 4, $px(1) => 4]], + 'a rule beats the border of the cells' => ['
    ' . $cell, [$px(1) => 4, $px(2) => 4], [$px(1) => 4, $px(2) => 4]], + 'a wider border wins the outer edges of collapsed cells' => [ + '
    ab
    ', + [$px(1) => 8], + [$px(3) => 6, $px(1) => 2], + ], + ]); + } + + /** + * `align="bottom"` puts a caption below its table, under any rule for its side + * + * @dataProvider captions + * + * @param string $cssMode + * @param string $css + * @param bool $below + */ + public function testAlignOnACaption($cssMode, $css, $below) + { + $html = '
    caption
    cell
    '; + $y = $this->keyedByText($mpdf = $this->document($html, $cssMode), $mpdf->drawnY); + + $this->assertSame($below, $y['caption'] > $y['cell']); + } + + /** + * A caption at the bottom by its attribute, with and without a rule + * + * @return array[] + */ + public function captions() + { + return $this->inBothModes([ + 'align bottom' => ['', true, true], + 'a rule beats align' => ['caption { caption-side: top; }', true, false], + ]); + } + + /** + * An image is drawn where, as large as and inside the border its attributes and rules say + * + * @dataProvider images + * + * @param string $cssMode + * @param string $attributes Of the image + * @param string $css + * @param array $expected Its left edge, width and height in millimetres, and the number of lines drawn around it + */ + public function testAnImage($cssMode, $attributes, $css, array $expected) + { + $html = '

    text

    '; + $mpdf = $this->document($html, $cssMode, $pdf); + $placements = $this->placementsIn($this->pages($pdf)[0]); + + $this->assertCount(1, $placements); + $this->assertEqualsWithDelta($expected[0], $placements[0]['x'], 0.1, 'Where the image starts'); + $this->assertEqualsWithDelta($expected[1], $placements[0]['w'], 0.1, 'How wide the image is'); + $this->assertEqualsWithDelta($expected[2], $placements[0]['h'], 0.1, 'How tall the image is'); + $this->assertCount($expected[3], $mpdf->drawnLines, 'How many sides of a border are drawn'); + } + + /** + * `width`, `height`, `hspace`, `align` and `border` on an image, and a rule for each + * + * @return array[] + */ + public function images() + { + $px = function ($pixels) { + return $pixels * 25.4 / 96; + }; + $size = 'width="40" height="20"'; + + return $this->inBothModes([ + 'width and height' => [ + $size, + '', + [self::LEFT, $px(40), $px(20), 0], + [self::LEFT, $px(40), $px(20), 0], + ], + 'a rule beats width and height' => [ + $size, + 'img { width: 20mm; height: 10mm; }', + [self::LEFT, 20, 10, 0], + [self::LEFT, 20, 10, 0], + ], + 'hspace' => [ + $size . ' hspace="20"', + '', + [self::LEFT, $px(40), $px(20), 0], + [self::LEFT + $px(20), $px(40), $px(20), 0], + ], + 'a rule beats hspace' => [ + $size . ' hspace="20"', + 'img { margin: 0; }', + [self::LEFT, $px(40), $px(20), 0], + [self::LEFT, $px(40), $px(20), 0], + ], + 'align right' => [ + $size . ' align="right"', + '', + [self::LEFT, $px(40), $px(20), 0], + [self::RIGHT - $px(40), $px(40), $px(20), 0], + ], + 'a rule beats align' => [ + $size . ' align="right"', + 'img { float: none; }', + [self::LEFT, $px(40), $px(20), 0], + [self::LEFT, $px(40), $px(20), 0], + ], + 'border' => [ + $size . ' border="2"', + '', + [self::LEFT, $px(40), $px(20), 0], + [self::LEFT + $px(2), $px(40), $px(20), 4], + ], + 'no border' => [ + $size . ' border="0"', + '', + [self::LEFT, $px(40), $px(20), 0], + [self::LEFT, $px(40), $px(20), 0], + ], + 'a rule beats border' => [ + $size . ' border="2"', + 'img { border: none; }', + [self::LEFT, $px(40), $px(20), 0], + [self::LEFT, $px(40), $px(20), 0], + ], + ]); + } + + /** + * `` beats the default margin of an image under the standard cascade, and a rule beats it, which moves + * what follows down or not + */ + public function testVspaceOnAnImage() + { + $image = '

    after

    '; + $y = []; + foreach (['' => $image, 'ruled' => '' . $image] as $name => $html) { + foreach ([CssMode::LEGACY, CssMode::STANDARD] as $cssMode) { + $y[$name][$cssMode] = $this->document($html, $cssMode)->drawnY[0]; + } + } + + $this->assertEqualsWithDelta(2 * 30 * 25.4 / 96, $y[''][CssMode::STANDARD] - $y[''][CssMode::LEGACY], 0.1); + $this->assertEqualsWithDelta($y[''][CssMode::LEGACY], $y['ruled'][CssMode::STANDARD], 0.01); + $this->assertEqualsWithDelta($y[''][CssMode::LEGACY], $y['ruled'][CssMode::LEGACY], 0.01); + } + + /** + * A div has no width attribute under the standard cascade: it takes the width of the page + * + * @dataProvider divWidths + * + * @param string $cssMode + * @param float $expected The width of its background, in millimetres + */ + public function testADivHasNoWidthAttribute($cssMode, $expected) + { + $page = $this->pages($this->render('
    div
    ', ['cssMode' => $cssMode]))[0]; + + $this->assertSame(1, preg_match('/' . self::GREEN . '\s+[-\d.]+ [-\d.]+ ([-\d.]+) [-\d.]+ re f/', $page, $fill)); + $this->assertEqualsWithDelta($expected, $fill[1] / Mpdf::SCALE, 0.1); + } + + /** + * Each cascade, and the width of a div with a width attribute in it + * + * @return array[] + */ + public function divWidths() + { + return $this->inBothModes(['a div' => [50, self::RIGHT - self::LEFT]]); + } + + /** + * Each cascade + * + * @return array[] + */ + public function cssModes() + { + return [CssMode::LEGACY => [CssMode::LEGACY], CssMode::STANDARD => [CssMode::STANDARD]]; + } + + /** + * mPDF reads `align` on a text field to align its text, which a rule beats under the standard cascade + * + * @dataProvider textFields + * + * @param string $cssMode + * @param string $css + * @param string $expected The field's quadding: 1 centred, 2 to the right + */ + public function testAlignOnATextField($cssMode, $css, $expected) + { + $pdf = $this->render('
    ', ['cssMode' => $cssMode, 'useActiveForms' => true]); + + $this->assertStringContainsString('/Q ' . $expected, $pdf); + } + + /** + * A centred field, with and without a rule + * + * @return array[] + */ + public function textFields() + { + return $this->inBothModes([ + 'align' => ['', '1', '1'], + 'a rule beats align' => ['input { text-align: right; }', '1', '2'], + ]); + } + + /** + * mPDF's own tags keep the attributes mPDF reads for them: a barcode is drawn in its color + * + * @dataProvider cssModes + * + * @param string $cssMode + */ + public function testABarcodeKeepsItsColour($cssMode) + { + $page = $this->pages($this->render('', ['cssMode' => $cssMode]))[0]; + + $this->assertMatchesRegularExpression('/' . self::RED . '\s+[-\d. ]+ re f/', $page); + } + + /** + * The attributes and the rules against them apply the same wherever the element is: a block, a table cell, a + * header or footer, a positioned block, a block laid out again because it is kept together, and after a forced + * page break + * + * @dataProvider contexts + * + * @param string $cssMode + * @param string $context + * @param array $expected The colour of each piece of text, how each is aligned, the stroke colour of the rule, + * and what it spans: full, left half or middle half + */ + public function testInEveryContext($cssMode, $context, array $expected) + { + $html = '' + . $this->inContext($context, '

    a wide paragraph that sets the width of what it is in

    ' + . '

    right

    centre

    ' + . '

    font span link

    ' + . '

    para

    ' + . '

    aligned

    ruled

    inherited

    ' + . '
    '); + + $mpdf = $this->document($html, $cssMode); + + $this->assertDrawnInColours($expected[0], $this->keyedByText($mpdf, $mpdf->drawnColours)); + $this->assertDrawnInContext($context, $mpdf, array_keys($expected[0])); + + // The wide paragraph spans a table cell, which is as wide as it, and the text aligned right reaches the edge + // of anything wider + $boxes = $this->keyedByText($mpdf, $mpdf->drawnBoxes); + $wide = $boxes['a wide paragraph that sets the width of what it is in']; + $left = $wide[1]; + $right = max($wide[2], $boxes['right'][2]); + foreach ($expected[1] as $text => $alignment) { + $this->assertSame($alignment, $this->alignmentBetween($left, $right, $boxes[$text]), sprintf('How "%s" is aligned', $text)); + } + + $rule = end($mpdf->drawnLines); + $quarter = ($right - $left) / 4; + $spans = [ + 'full' => [$left, $right], + 'left half' => [$left, $left + 2 * $quarter], + 'middle half' => [$left + $quarter, $right - $quarter], + ]; + $this->assertSame($expected[2], $rule['colour']); + $this->assertEqualsWithDelta($spans[$expected[3]], [$rule['ends'][0], $rule['ends'][2]], 1, 'Where the rule starts and ends'); + } + + /** + * Every context under each cascade + * + * @return array[] + */ + public function contexts() + { + $legacy = [ + ['font' => self::GREEN, 'span' => self::RED, 'link' => self::BLUE, 'para' => self::RED], + ['aligned' => 'right', 'ruled' => 'right', 'inherited' => 'left'], + self::GREY_STROKE, + 'full', + ]; + $standard = [ + ['font' => self::GREEN, 'span' => self::BLACK, 'link' => self::BLUE, 'para' => self::BLACK], + ['aligned' => 'right', 'ruled' => 'left', 'inherited' => 'center'], + self::GREEN_STROKE, + 'left half', + ]; + + $cases = []; + foreach (['block', 'table cell', 'header', 'footer', 'positioned block', 'kept block', 'forced page break'] as $context) { + $cases[$context] = [$context, $legacy, $standard]; + } + + // The blocks in a table cell take the cell's alignment, whatever their own, and the legacy cascade reads the + // width of a rule in a cell from its attribute + $cases['table cell'][1][1] = []; + $cases['table cell'][1][3] = 'middle half'; + $cases['table cell'][2][1] = []; + + return $this->inBothModes($cases); + } + + /** + * Each case once under each cascade, with what that cascade should give + * + * @param array[] $cases Each [..., what the legacy cascade gives, what the standard cascade gives], the values + * before the last two passed to the test ahead of the one for the cascade + * + * @return array[] + */ + private function inBothModes(array $cases) + { + $data = []; + foreach ($cases as $name => $case) { + $standard = array_pop($case); + $legacy = array_pop($case); + $data['legacy: ' . $name] = array_merge([CssMode::LEGACY], $case, [$legacy]); + $data['standard: ' . $name] = array_merge([CssMode::STANDARD], $case, [$standard]); + } + + return $data; + } + + /** + * Writes a document through LineRecordingMpdf and closes it, so its headers and footers are drawn + * + * @param string $html + * @param string $cssMode + * @param string|null $pdf Set to the document, uncompressed + * + * @return LineRecordingMpdf + */ + private function document($html, $cssMode, &$pdf = null) + { + $mpdf = new LineRecordingMpdf(['mode' => 'c', 'cssMode' => $cssMode]); + $mpdf->compress = false; + $mpdf->WriteHTML($html); + $pdf = $mpdf->OutputBinaryData(); + + return $mpdf; + } + + /** + * How a piece of text is aligned between two edges, give or take the padding of a table cell + * + * @param float $left + * @param float $right + * @param array $box As TextRecordingMpdf records it: page, left, right, top + * + * @return string left, center, right, or where it starts if none of those + */ + private function alignmentBetween($left, $right, array $box) + { + if (abs($box[1] - $left) < 1.5) { + return 'left'; + } + + if (abs($box[2] - $right) < 1.5) { + return 'right'; + } + + if (abs(($box[1] + $box[2]) / 2 - ($left + $right) / 2) < 1.5) { + return 'center'; + } + + return (string) $box[1]; + } + + /** + * How many lines of each width a document drew + * + * @param LineRecordingMpdf $mpdf + * + * @return array The number of lines, keyed by their width in millimetres to two places + */ + private function lineWidths(LineRecordingMpdf $mpdf) + { + return array_count_values(array_map(function ($line) { + return (string) round($line['width'], 2); + }, $mpdf->drawnLines)); + } + +} diff --git a/tests/Mpdf/Tag/StandardBlockTagsTest.php b/tests/Mpdf/Tag/StandardBlockTagsTest.php index ed79bc8dc..d24d2cfcb 100644 --- a/tests/Mpdf/Tag/StandardBlockTagsTest.php +++ b/tests/Mpdf/Tag/StandardBlockTagsTest.php @@ -2,13 +2,21 @@ namespace Mpdf\Tag; +use Mpdf\CssMode; + class StandardBlockTagsTest extends BaseTagTestCase { /** + * Opens each block tag, which the legacy cascade aligns by its align attribute whatever the tag + * * @dataProvider blockTagsProvider + * + * @param string $tagName + * @param string $className */ public function testOpenAndClose_BlockTags($tagName, $className) { + $this->mpdf->cssMode = CssMode::LEGACY; $tag = $this->createTag($className); $attr = ['ALIGN' => 'center']; @@ -34,6 +42,27 @@ public function testOpenAndClose_BlockTags($tagName, $className) $this->assertArrayHasKey('InlineProperties', $this->mpdf->blk[$this->mpdf->blklvl]); } + /** + * The standard cascade reads align as the text alignment of a div, and of no other of these tags + * + * @dataProvider blockTagsProvider + * + * @param string $tagName + * @param string $className + */ + public function testAlignIsTheTextAlignmentOfADivOnly($tagName, $className) + { + $attr = ['ALIGN' => 'center']; + $ahtml = []; + $ihtml = 0; + + $this->createTag($className)->open($attr, $ahtml, $ihtml); + + $block = $this->mpdf->blk[$this->mpdf->blklvl]; + $this->assertSame($tagName === 'DIV' ? 'C' : null, isset($block['align']) ? $block['align'] : null); + $this->assertFalse($block['block-align']); + } + public function blockTagsProvider() { return [ diff --git a/tests/Snapshots/EmailInvoiceTemplateLegacySnapshotTest.php b/tests/Snapshots/EmailInvoiceTemplateLegacySnapshotTest.php new file mode 100644 index 000000000..781a7bcb5 --- /dev/null +++ b/tests/Snapshots/EmailInvoiceTemplateLegacySnapshotTest.php @@ -0,0 +1,21 @@ +cssMode(); + } + + /** + * The template, with a caption for each part saying what the standard and the legacy cascade draw + */ + public function generatePdf() + { + ob_start(); + ?> + + +

    Written with cssMode set to cssMode(); ?>.

    + +

    Masthead

    +

    A table filled by bgcolor, with font color and size. Both: white "ACME Supplies" and yellow "INVOICE" on dark blue, and a light blue tagline, .tagline beating its font color.

    + + + + + +
    ACME Supplies
    Everything for the workshop
    INVOICE
    No. 10042
    + +

    Greeting

    +

    p align="center" against p.greeting. Standard: the greeting is at the left, the rule beating the attribute. Legacy: it is centred, the attribute beating the rule. The paragraph with only its attribute is centred in both.

    +

    Dear customer, thank you for your order.

    +

    Your order has been sent.

    + +

    Items

    +

    th bgcolor against table.items th, and td align="center" against td.amount. Both: the headings are white on blue, the rule beating bgcolor. Standard: the amounts are at the right, the rule beating the attribute. Legacy: they are centred. The quantities, with only their attribute, are centred in both, and every cell has a thin black border from border="1".

    + + + + + +
    ItemQtyAmount
    Widgets440.00
    Sprockets1296.00
    Gaskets (back-ordered)37.50
    + +

    Summary

    +

    table border="1" against table.summary. Standard: the table's own border is thick and blue, the rule beating the attribute, and its cells keep a thin black border. Legacy: every border is thin and black. The total is on one line in both, by nowrap.

    + + + + +
    Subtotal143.50
    Delivery10.00
    Total due153.50 AUD
    + +

    Footer

    +

    hr color against hr.divider, and color on a link and a span. Both: the rule is blue, hr.divider beating the attribute. Standard: the rule is half as wide as the page, at its left, and the link is blue and the note black, neither element taking a color attribute. Legacy: the rule is as wide as the page, and the link is blue and the note red.

    +
    +

    Pay online (due within 30 days)

    + mpdf = $this->createMpdf(['cssMode' => $this->cssMode()]); + + $this->mpdf->WriteHTML($html); + } + +} diff --git a/tests/Snapshots/EmailInvoiceTemplateStandardSnapshotTest.php b/tests/Snapshots/EmailInvoiceTemplateStandardSnapshotTest.php new file mode 100644 index 000000000..8ee535488 --- /dev/null +++ b/tests/Snapshots/EmailInvoiceTemplateStandardSnapshotTest.php @@ -0,0 +1,21 @@ + + + +

    Presentational attributes

    + +

    <hr color> beats the grey of the built-in defaults: the rule is green.

    +

    + +

    <hr width="50%"> beats the full width of the built-in defaults: the rule is half as wide as the box, and centred.

    +

    + +

    <hr align="left"> puts a half-width rule at the left of the box.

    +

    + +

    <hr size="6"> draws the rule 6px thick.

    +

    + +

    <font color> colours its text: "font" is green.

    +

    font and text around it

    + +

    A span, a paragraph and a link have no color attribute: "span" and "paragraph" are black, and the link is blue.

    +

    span and a link

    paragraph

    + +

    <p align="right"> puts its text at the right.

    +

    Aligned right

    + +

    A stylesheet rule beats <p align="right">: the text is at the left.

    +

    A rule against the attribute

    + +

    <div align="center"> centres the paragraphs in it.

    +

    A paragraph in a centred div

    + +

    <td align> and <td valign> place the text of a cell: "right" at the bottom right; a rule beats the align of "ruled", which is at the left.

    +
    rightruled
    + +

    <td nowrap> keeps a narrow cell's text on one line.

    +
    one line of text
    + +

    <td bgcolor> fills the cell: the cell is green.

    +
        
    + +

    <table border="1"> draws a thin black border around the table and each cell, and a rule for the table's border beats it: the outer border is thick and green, the cells' thin and black.

    +
    plainplain
    +
    ruledruled
    + +

    <table border="3"> draws a 3px border around the table.

    +
    three pixels
    + +

    <caption align="bottom"> puts the caption below its table.

    +
    The caption
    The table
    + + + +

    <li type="square"> beats the disc the item inherits from its list: the first marker is a square, the second a disc.

    +
    • A square
    • A disc
    + +

    <img vspace hspace> beats the image's default margin of 0: the image stands 20px clear of the text on each side.

    +
    before after
    + +

    <img align="right"> floats the image to the right, and the text flows at its left.

    +
    Text beside the image.
    + +

    <img border="3"> draws a 3px black border around the image.

    +
    + mpdf = $this->createMpdf(['cssMode' => \Mpdf\CssMode::STANDARD]); + + $this->mpdf->WriteHTML($html); + } + +} diff --git a/tests/data/snapshots/barcode.pdf b/tests/data/snapshots/barcode.pdf index a0b4e5d6e80839cf334cd2ea6985eef06ba27e7e..09f49708bc9e8d8f3a2786b075f7cfb544720922 100644 GIT binary patch literal 166544 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 literal 165925 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 z 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 af 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 literal 0 HcmV?d00001 diff --git a/tests/data/snapshots/email-invoice-template-standard.pdf b/tests/data/snapshots/email-invoice-template-standard.pdf new file mode 100644 index 0000000000000000000000000000000000000000..00f6dbb99b0dad98e2625538e46cd75c859034d2 GIT binary patch literal 42374 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 literal 0 HcmV?d00001 diff --git a/tests/data/snapshots/presentational-attributes.pdf b/tests/data/snapshots/presentational-attributes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53fe8738465cd705ffd84568fd7694db446ed8a2 GIT binary patch literal 56912 zcmeFa2Rzl^A3sh5A?=~TZO96D-z%e1k`NgUGkb4kM=2_@5)C6sDMcA2LdYoDWhEmr zGK;eFKj#kjlF!ih^ZWfD|HtG1@!{V4y61J?=XK6`Jg`zAQ9GjW~}1kBC5_dh6oWQU1LL5@Yl}J$^n4_-zu|;C>R=;>PlHVAvBPHfD^?D zqlria5sMNgiXydGMO5ufEy-UCBaxs8>F@8wlnw2zPub}k+9S~9dS&daPuU>E#SxTe zlRt~7fX{ZiR`xcq5&F&uk$r%&-|)1lzM-;=6hcxG!78%X%F5co9-)CCz^V{hfV9ur z$^kUm9)X1XwD&4q%aOoKsd5W zsUk!Upb(-Y8B~oB(yFW|(tBf21WG5vDk7tTLKxdmvmgGbnLn9FcB1#yIA|O-^5C}d7B?dbNLk4^BYsKKepbLIY8LYv3 zT?PvV1nIK_C}GN=$8ZXK2TJlIRLwv`5l3b|ex?-ER#OBd&T1HjfCtT^{k5B;m3Yuf zB8t*VaRw963Iu~bXqyH2wPTP3pY%X`V2ka+dk0X$5WE_bZwx?rBfx)(M73wwMOWI6M1}R4l4>W{3j0WSUh;!c#E1e>v7&IMqD1isWf@j1 zQJ8?kBM4Z$FbXe!pC zc$@`-6^BEEr(tH32zW636h2T2VS+e@utL!0mN1^AQMA9HwMc{+_&r3blFARJH0imN z2?c6|6i}lIE9((Z9h!&%vzt1F(Vzx6>wgykgBQkPQ1l`Iil``Yh6poBq$W`K<|_iV z=Kwnag@uoW{Y0%1lIAbM-;DxwTxb%|wEznK2Lce0>hqd+3jrsm&DK}8oTj8Z@U4`_o1XoDxtLK{b*{RSjt zkzm-$fMY;1@POC9LLMU$W?;ynr8%Lehg6g)(mhz>5M9LlNmf3{pgiIC>Fgk)Q}v zzWItkfe^?}K%(hEj7plf2n0%R(k&%`LKy|hxX?*J*8(W`9|%B#EV_r1L5!|P{#N~I z>j?dDQl`-~h|wgVlITRBGSWTrk3fvdPY+@gx&CPssG#-Vffybdc0d=&h8@*pf`*(a zFpI1hAc$Fzj2;IHjM)IlBAZXT03@jJA~XZQXr>S}wP=PGwWi-84ua2o%_JJQkb#C~ zCgJe_VXzP)(4qukJQipUh4QZu22TJ81MEoJ+=dhkYNmS5B$3pU!Z+X9Jw3AkKMnvS zd@k8cg3pDNf0`Jy=}l$C0fd=h>EQuIlt8k$rYHAI5=jIK-+V=&dn_KYxG!drf0qv20hAXH@=wG5y9g+>Fcv=p0#RVch@P>{ z!p|g;M4<4^R|Kl|0(JrkxTm*ScnWF$B2aph4nF{eG741uph-a20x0+&2tdLQx`$Hm zgVrPS#SdCte=%v`HtRne1o#vZSWucwj~|q_{L?5hFXP;g)cM}sAhiXTQ`qXOMd zvmHBBH_s`6A`n4LDOL(}KskZ;&{eY)IB&?@TS+Bgxj%K&kep?+95pk1Qe;TM5k!H% zg6cV=Jf7wcn#1LW#|fhVD9vPq+comGj4BVL*a2xyQRqNkTD8<+_)V{Iq9|ce;5MQu z1*BkbGd54NNKmh-eDhTcDl|cUXotb)lA(!8`KKB6y9jU_Nub|6;Q)nzonf8LB9TO( z@Xc2QYI^}Y1reu(qLAhur!G||;Xg(gUv zJ&!>BbmQ{B3<4FJV6RXHf0{(;%zqjMs!sfe(1Zg{YOpIHL(^UWCicKcfr?7@qaaA1 zpiu)sMi+cC0cEI)47X2kn`H$|8S+NzG=M4u_-qaSQsE4Gu;C_ZrbnF&X4I!aFr(JG zb&h9}zlVMt=>N6=Wuf^*@9Uv@foSa^`>Pn#qmVg-ruG&Z z_-lZti#)&J%$hNms7CHH(HAn)!Zg8-ibEm7Fzl);}S zQRMokQTRUq_eijP03H;oC2B*0U3yO$JoGdMApg6sY_>H@26dWejK=xDL#-(2J2Vb~ zB@%>jDC%kGUIuDIp*J4^kc86Ie}N)cQBl$f8%+fvg>o20oe;A~Pz9-c^PR!4N-96_ zGt;36tPxWFY4CqjK`hD7NpgKt6b@1-+B_}7OcJRH6u$Y2K+$3N5FCcIBcB$ELYlt_ ze>V!h3q{ugG>+tXK+Nap7O+DUp$;JpMW{Xb@7q5uIZc4+9-m_#{da=^p8`>Y+GGlr zlSq`d{F4;_J&Is~CmIR-q4Y+h1A{YAPZ&}G0}>1Yen16SQOM;!827Yoc5G+LBSGMWs~1lA=PyY?jMs0Qb6rtQCh zBRmp-0DTk#7En;w8Bq+gNF-gR@Xc43r{^!=$70ABLf*r|hd|0d&7$Ao2slMW3FPfC zIS>O2^%eLDKvmPqF_T0Rfx@fp!6o)q5vqAQJ}&RO@iqb zkOlt(0Z4E}_fQHz(RyT_MhzT1$~2npahe3vB$^1cF8ebXAU_FvXoEjZqO|3oM&bVe z9DzLs5lQt=i38ifl;QMm5JQaxFa%&jj%J`z$dO<)L*}<#3dI=*qo<$|^gn|Q8bbuV zNJLYfNA8F7Y5;BDU^SjB)_8#66^v&uos;ONDKgi8M{F2OcF^13g3K1 zpz1ncr-0nFP!!VqMfkf>prQ>;0=gDJ!T&%2657x`l!7+29+@xN(CYe&Ndvb~|KT9O zr;yNw(qu6B(2 zPYr8;CK=gyGXQ7_{cMiFu!Dz|(Em42Qw)Y$(t<0=?_s0^793?^5EvrxOo6yy5KBcN z03(bXVWaYU88q-(5ec|yE_kXrn+9SgsHNtpib9&Z5G9t5J~WwnRyv213ylYJ0a)i4 z9N35fB_+>^>E8bxn&<2Xv?vlR1L$dyV8{oBLf8Ch+H`l}aG(@?I)wteVm1vN15-=Q zRo8T1%vI{|1P2>*6dI4fz;I=-l2HYxOqt&W|MM6{3FPu=1cuC*WYZ_cy;c*(&M6&02PEYYa%wTZljv+1x7>%TQc&K=(2ew+Y(*roZMgVi*2+{{uK>VblBNaudG%7~@?a?TL zm88?Zoq$5rK>}+94WJ%|1A-HFGzN(f00}2J|Uy z71br3>yVuVFw+6%DcF&MYfuz>oj$k*>Np&8vT;m15rU^fG;X-|(H}5VX9>*sfIRSN z)U_HqD9EcDbq>*=F3ns+;TbqQ)%v|YGQ!Mk1O18%_Yd^$4S4ts)e6=&lMAe|v<`>! zl$JL_eouciL@^f8Afp1tW|4c9+&}P~j3y;bAE0#9_EROc2M9^uuhhPw_3s>eABc?v z91KCCKX@X)hpRk@1po)zaL)sq2K0eK0PrUY0+mSmFuM#qG6Oq0DibU-i)4wQ66UCf zLYlM8ocb^`Dr%0E9&{`gA_5wm!GU#;+`(is4opGXK+){Yzv~iUiHm|R0Vjz#Qm7Uf zJ`w@Ml9OG-VA+^m1}_S1D9|MoCQ`S}WCP+-%FxwAUBqb(qssa>4J3dW29Ca{-ERq^ z+sOpFzNV6<$5j*q23T~O2{v#R$r3>&%u&zun9Wg!at2A6U@~Ob1_35?`BMZCoB`Ze z|IGk_sYQhHPY)1C$HReWI4Xf8+e{LWjY6R7d}=)u(wt@fYJjK%_D|}C7slg(+$d;N zkc?;w0f`kRQcaNAWx&|M-9MEHiZhEu8gf#ZIqIR1<}C9sh6+mn&<}bSSUA7~LeZt^ z?Z)rA1RQ=KM}-70vzBTIFBoAw@B*O0eh^Ix7N!!Az$7PSg#lffT?S4T@MJ0zNtY;P zC~QDBN*TI({%WZH7XM(h2e7QDeGMw65a>FVN}3)-5HN;;a6=)G=G#mXm`fDG9Q8~O z&>Us{#Q+h2IV+0#j|PYU4$Z-SjoR1HXa!&beC$*T6mB++t`uGWQ>&UDqiHs}LVq<# zRDJsMod}8uG#u>H{*BFo`3su`1NJL01bF6J|4&xRAFR4S<-w|pB7l<`vK2}p;DH|v zcxgyees&o!TY!IMnu#*&=t-nmMRZv2f|0`#5KL13#-?jQ;Q2i8z(2hA=6=Nq{@$XwK^OHU(DT@q!Eswkwn z3;iFQx&Q*PNUC8d4h&tmai%6cL-UaSG!9Nqsxyh~DyL=4&`ideH9#X5rYOVhHZ4+s zYG(h%1paHM5DKJ8qQUYty?sKV;UN>u!I<7s)5-wFM1u$>Dgl<6MY2Rt33Jp#A39ByXpIYXr;_>h4CBbR-JxYD#zfK2_(a3ho!Nz~DoHNM>3BmM@10Z#t{>B0LapsK!I6M;df8oLb6yi_P`hhf36Wo*+Xtli|BEJrV+%ZRY?GHO*knql z{O8RD5CJnE;oSx}(%l5p1b{!_t_xr=VF3&gaL`l)3G~2|N-9qNs1J>PEZ96yzlYmL z()VQU>5t^v^;xG0U`Rk3%``V~i_zCk{s?NPKArMCwXqa#>PJfLGdq{E)uUbeK!os5 zA3{kWf@lMB9xhmH$=5#2B*F7P0)=nB$7irgGC$a3lk<%!J{I^~NcpFer{9h+31Byg z7Nw8hf)pZdMn2Lk5~&FkzWItkZ76Orr1^{RccTDI4AONRG@S>`=K<}Ji21~zL4J6INjLb@B-+&cTPdi3 zL*2MhKU47SPgWx|@V8AzIf(<;eAt^UKMRur$jaBGP{loJPevutuQK zv~4Fj1C_iAP_dQPewt)+;O%dg5FT#sXIMfoxtsukYQXqX=h`e1NxLb0^Hq-Ni3#|T z!0$`8Bw#!mYzd_N)4cj!1aJWmnq+cQQ+n`#LLgrfF)hMO5=jIK-+V=&!UJH(0jB^( zHK;X0()>mEyHTJ56iouU7C^!OKmZaP(LIy`P_!QTTQi6@1oXp6nMTt+KF2(wi7?Gb zd*q)16osD-pr}*&A4dVWy=SlS;0`8&Cd9sbv6 z(W0bFad2>-2#j)Y76Zawz=d>F0?D~Jy9|~>z=22=(hXhUuxut9tsc5Ev)JY=LzR*0 z_?mHk_Z&O`HDd8Ilztufkt%52_FJU^B3XoMuCEybP~|D01EyG z0zl-X4k3B*B2j2PGEd~BtLrZ&4JjEC)K51q|H~l2r@(D6>=nx3Pm?H}`A?%j(-m?6 z!|yI`cunmL7dPnwTZD+pDLn_$y}Rlf@#$gXIC%nRPah=<6a-p#Ht!FO3;o;X1Qz2f+2e zthD}ww;3ZrJ-YUW@Eg!a;Ns)GdjPsmzRCo7J*? zvil(gHW2jIzic32QgOC-Ftn7lGO|X1Z6JK82&@M-($3Vz!P*X-F_FppkHJKIR*_@i zeq<1Lq5)#}Na3&uEC>W8fWt~0h*>3qT{saS3_QsKF~X!@vO^X`EWq+e>MI5eFG%tO zTqH)|6vT;wufhHe7^%=h3(NxycnTI=H7N@G0(h{<0ha;@f&zY6GLCO}S!}D`e z8Bh)j;{V`vBp`^G{2j1;2*Ak!tyvs+j|DmYuoq!Bz*qQu&`VGcWcRCD%gF9m(6vE; z?w&O{=v0bw88rxHq@4^wZdof+FkO}Gto2n49S}yQRt9#Ii?b1WhQ_8=tYGvFOaV@i zKau|GTk6`79!;Ah@JerGP#zq$IV1S?f~&9%`B_C2Ar`=i&Zo9d1$>d(KuY}{yd{Y_-8%hKcJP*RQeTkT4BKLA zWjNhkHr6(<0@CmAkW5k{ilWZDqhNKAm!xvPX**3P$vR5z%)dh*aLKu@%|Sy`V-p9U zGoq{jnJJ%eDEJ9#x)kY-bs-o5AcO&0i^2gBP$;A*n0O)wEOd>*)#u>dUI=(7)(e4^1UIyk#XewaVF>R)pREMH z-^dQY2C$e~IDmx;isE3n-w@6gh^v&dVyE!lvW}xH3=EzX{oy@Fj0|{O4O9irTL^^| zUF@9Hx#QCrW#7NCp+5HP&y?rxz5RQb#oo90JEY`z@2dWG*da+J!YU0DVR_d+qF-uV z#(R^njopWiWmNyLa!A(r)OXl%W54#WYkA&|n-&jc6bMxo0j`x*?Jm`W+SsOI?H}oc z%wDbj@p36&q11*$+~e;%j%swvb-VX!Y;^CJ***TjD0{r>sKFpkp|l)TNybO6+xWPA;GH1cP?-7$y^v*a%Q8k z>8cxfQ;wyX7({ncB-*~_-E8i}?2sE^s5W4}~WgSFUqr_P6oR^0i6e13_-l^=_P*10XO zV=nt89jkUBHj2lCsjP7M*Lo$3_Z!c1wi33k*7f|hH@|#E^H4fVSw_nX*QfcYjxO7v z{#S#duM&k)*LGU!w)Y~jOa(g6J3B&rI}VCV9oajuGptLfz`1Z0Tl0(EQZ4;q8omDQ z(k84@G17Q#D@^DyRns$PJNj5;1GdWhw=QKV*#0oy>iTWlO|Tnew=Fq0 zvbYj!9Gx-jCcS;(%C`dVIhDkNZ{5O0V^{YNB{hG}!W-ie&=aOaB(AOt@jHRg5Jh}*y5&AFp%b)GK61-9Hd z*mzVp>#GoUW#&cyC(nlP551i0ItAQTGP>{FCs5Hbc{iIG8>ww;Y z(aJTyM#XLx@Fz*o*@-Fg?_%4@#Kj4hHvKHyX|a~RI>xS=7QEJH?N;7Jer>*4+(7O z#vN@9z-fQrTX&#ig;3*zu5(6r%!1iiILn`}HEfRGv-rZD4s7tjMSgd_+-{Xpec0kO zF(UhYC#EO^j%W;fOO+nOpb{_n^D0w-rbEEz@ zuc6!_EzHgP{ox0)^Y;~2iVSQE2sRwreq!$rCy@{RcX=Jl-89P*HWT%E8`(lmS1miZ z$|;m-@omQCQ!zFTuec;+5gcs2=+L%DY{jqQ2WL3W{4q& zqkm4cV9jzj-e2Vp-8&|q?w)+(y2rY{^LXDrne7s(-O{dNC`g`8jBC2pYR}`=T?#qCWE28_uX9D-=&%x zmuj!FYMcz)(OiEc?APhu9^a^QnV}1;d(RTMvFouuFG@Yv@V_)h`1|dVH`P4VETU;0 z6kg}=w3=%Z=Q^&noEI~9nZ2>>D7(QK=BV&d$7_T(L8zd$Ee_o6lv&l4Zf$2KR=)a}RVyI7NMSv9Q?Yu6A%CH;bnamz0gtc#iId z)7^Y`wK8m5>%TsH_+dzm?bo7pCl~&D9c+D%t?P`7r!aQ#weQ-zu_JHC0@L>PdU>6X zwB1~5`R(fq`(qw1txWE?CckwprcS%G4N9MvM>-Hb?Q=~^)jE$wb33pEU0C?!nCd}; zi|>;~xOT1(y0mq$OHv$jBdc$BO@Ow10j4XWRR!fvh|+Rl9!>Y~bd(#EdVl@V0W zoQv-YR%Ga3@LK8e_H)^u;mdJ5>p$mu$!^G!%fu^*xE)&=5ytJPy_QK_m|bZ^@orOd zZztY>`MvFGu1l#WuitHWceT+sO!IxjiM6MOI{4iho!rzq1!`|_>|<~dKXc1$@wk=b z&(&=gU52*Bbl=z#dAPdZ-rd(`SGAnamPnUeIwzgFc!WPI>+Aumz=VcWPenCcllR2E z5wXjc4b}bpnhTnn)El??X{l*sn0K-2ynq=m}Olc&KJZF>3vJN*l zvX9s8Q@GAHZgbFJfbSj8xt9TTZwH9)1{V>Bh6`>aDtJuk4Eb=J8RC!5eqp+-F)KIg z^shUqpLh0%IlS)ZNUSK{JlS=b$>r5Ko%oFBW*>u2d1f=U4KYvnFzQIxIDJc5px*uF zyZ_4f?l$3-4C>lJWj9MZvd*{{-sFvR{AH4^dUB{P+3G{%!XM7=-NQR?YNR$a@qLgk zeCgnnZ#sH5UZyEyMST8>jnBesohKYx3KZmy*6dXJ{%twmHg5*Yv#wfC0_1iGIj(>F zB!px8)$oknrz6)^M&`$Hy8CT>vrs`t`3k4Zi6TXXES{kaMNc*w3@i{!vRKM?V|{O) z)P?E=Hd$V8v^##D`M?>4tw_A5h1`%y5YfukFC6^7_iPIv-?w^@dCiJS7Sk=v{%3Qy6rTUKX&Z~mx&+M^HWinzG0XH- z>WsBFj_XYLZF@4@`Kj(e_T_WN{`WK`J$`-PD55oSaAZ8~>7HTyq=@DP?)=n|t^_R) z)XlD@Jg6(Pu1-?3Nn77G(P1}{Y@d8d^y(f6#b z1y}Na=`De8Rkk-xF`maeW`^L>?7-W&>Y9mjX_O0XSoR63Aq5W9RC0=I9e>?K3a z9r*lf5BFzp>EiTa4D5(y>pa3QEzUA7_I*XJ&8AQX1(l*4SGL#rcP|OY2>Leq=UaTwTzvOTll6GLp7(2ArnkI7`|ftJ^g0Iq6gwBcUi;Lb zWm3qv^rDdj=I+;FN%j{?{m_FQ-qiHa3yRZKE(`_Rr%fD~6K-S%wu?80 z3JVMR6+HS%_?<_IC!e>Ly!R$Yw#E+uC0( z>pJS|Mhft5_WZra3B{vFM~$L=2gWjmjUL>!jj!`7EN8-qX>o2Tm@3d0U!U_rSU^)& zq{TMjJzH~*(gUaM9X4(&n8mf9pV~cH6CsqEs?k@TDHFi@vC+kN@@)+7&Cas+Pco4W zhT2LQN$F2ZcSZ-V+YtKUdA~!;E8~8zrq#HnP^ld5bcT)%L9w#sFN4!Vz8|b>VOkn0 zB~zZbTiwn)cnkL}o5ZAyZniv;h%A@Mu@C8N?gL+k6E+NeNh{{((!A`a+O;ZKewsrhVZ(5LsmB*9@^+Kj9eGJ&{HUOuyd7BxHof- zvENpP2nFt#@i?zhiK?0^PqvE3YOhAtBs{Cj9Oyh^d;P-+A00lyn3xNqNBwQTN__S3 zW{R*)@Cb-hHskOdAhzRxHvvH1b?!i}Tn};1;JN zmj=Ct9NbvSUX6}iYT0IznVUEyIxv3wRul4!e~V+^nH+(db5loJF2qQ^s)#A|*nG-g z@-0!s7QaMK_Kk!Ap3PTu_#ww4vE9ecUdzqZdNT6)NQdI4LW_1^U904v_9aS5Nfrk` zzb{dXEme7&uyu=IvO%t^R8Pg##6po+v24Nenn{HX>dKWPZxf>qq;<-E@T_>F!t~Bs za_4y)Uk2G*1A-sJ6IqH+mlMK$)i@hher_JOykEU@B7gLJon_%CPtNi~BA0oQx25_R zd4|tz>@vf92uNv5339pF__FHW{~{h_b zeW`w|m@C0s%-i#nEPJ1q*C(q|X?tT$Jr4u3VK(N@3&S$&d9_^XoZ0TWeNPq42p7?7 zs+aaP>k`S02z*edYFtor^onETXWMUmf?|q8$90Z9_aA+AIL`I*-u6Z%=S7YVYoaCx z+&ON4dJ?}}Onv)i$!Gmy$>ZBDdQa$5!iVG5zL)wgyx6 zYhwL#@>Z4Z9{oP6j9DrcfdXWLpDac;Z^^n}t!Xi>pz^g11|=H);xomUp{NHT-fEkM0|9QTf3n14)IDEt-?yLfXd*9&&!{8 z={zrYFCK98vE|*Av1D1nvYuSI(90rCat3_EhcAjWZWK7&>SR+Lyo=wtN~Z3fyJn!! zCEmk=ZB^d)P0+8(-!7FpE)i;*c;6-upT3d1v3a5or5imcRupks*HU&#uebGHE|(9Z z7jJYw9Th8|aup~OzvR@63CpYUKQg&sqKb>iV`Nz zr>Vs3%C4JAgP*Rp<2xFcm-jH888Gb7E-~_d%7J9!TYvo1k_(IuV~N>jQXb>)9=$;( z*I(V#{v*IUO78mEBJ4zoz|BL22?b3DkA-tTAuvkm91b|WMeMKtO1hhO@uDChh;E9gN^%Wh$O#7TzGQJkK^ws11 z!%}jMxl7`29@Bg|a7k$BbMw-%Ok>IPfs&*{UNN7}zntt^*Obrs+^8&7Slg#;R}{chs1>u19&;VeD(EU;{Nz-=mygvr=-r*7LCqy8PrDm(oyKfLs+Yzkb7kAM zrlo>^?#Ans+`65bNd_(FVvYD4ds5aLl@m5@?26^|_A=76?OWNFe9Jm3_ve?7tu*I1D_A)8i`n+{e&q3l@8!yyoLhg6WBd&j*dGcs zseZg894=p${$9EiuaIf~Tqa;+J|@b;(%rY6BeWd%u(6as>CzX3Mp$UNim2a%N`BRr zEtcjIhx;;4WIJ}R-R0!2eZ#$!sZZHC*3kM)o7?8#73oiY;`RsY^NZ zQ?I@Kyy1XkgKOJ>G$AXLn1+c~@jp}^oib3C{_BHgR| z6N%S)F{Jg?t>67V=F3NstdaIx;LkG#y`ay>$2ek#EF+hhMy_Ax^ouXp&^Dl4}<^LFn>=>+e@PrMI1wGrPMi3B%-DCe9VLnJA>T!h@-Iohp zm1UP?4KfGC)qB=@YV-a&toi-IB|u)kWeCacw-OROnz%N~7ZqjocYC&!V8 zOOH0jxEQo?*{&m4?z-qxP8gF2Mry|We0btzR&cmbj((RtPidE6<&Jl?X>Pq&<-Hl7 zc)VNg`u!%dK|k@!*@q?)MCIdN%)QYfKR(@U(s;gRS;rgMp1KeNN%Lpg=>qIRwpJ3^ zEj`I2_(X-98*^$V8CRvOZcHcUuItiY+wf!|bF=430xiR=S66L z%u|nhJmB^9;lbUSl%@OdjwdUcj)w{IR&lj&NH)^X4?lC|pY zSuZBPG@ElTTa{mDHjJux)n{H4ciTP?#X3>5;8*|Gyr;SQ>-CwII7sq4bq^lYUFiSL zy#AX&=AHLGI+a)3IEw;$`k8an_I~RB>2+fBnt})&=aSbw@{wG2_8D151I-&If8N@6 zKv+IX`G_dLd&}mk(C*`L_SZL^I-ZvG!l_c-B|ht!`RnfzL)G=Ndpelw7uT4ir+Jj6 z+Qi%|w(b!+ZO*mp;rTjOlXbkC*SD-aJk~72eIiiO^mKmP(Bc60%ohsTHbsFK#w-aw zjW^Ob96u(D-!Zq8=zC_R_pQA<#Lk~DGwVV&cYaOm>N~YWKhsQZZwyxOfYY_wrH-9N z9*S|dzB^epa&bqM8?LfDZLHvIu|Ry}nT|OB{m7vPG(X|UYIpB@_pGCcTS<_%%E=OYUdMtBS}*)3ohTw z9&=RwWt7{>tMksNe+R=a7R{4}Eo=?}26t38Sf?CrICt7SVQb92^+NeqIzwzYEzg^y z>dvOW8d-cjiZ3Mkn~lezCwo#X_o~@^Iv2ko0cW#RcfC!Cm-&4c$5#!s01Ewf};9m=d7a6SPZzzl2T4G|bTGG3Fuw6=a*`zfhriLA>cGdgd zL7nKWD++401kOI?KHK;)E_28FFO2O0+82ssf`byB5=LE@L|X*LM1Er*J{2xGE*84k zMsmIHy~`O&;hiP@D*5}dYaFf?eH`E0=#b`3Fuq)+v?-+(%l&HokngJZr;q{fq%O5B z5?G*BkWMe7if6id9hGnaMX9 z=e%cC;+q3kB>p<(9)>rybO}EaRJ(D-lKECK3U*7o$Gcm+npMk6O9Q*S>`N#Jn-piJ% ze$0u>6yM0RMNmLSt;kzGj%Cd@=GU$wstm5#etOaAJpn1@Z+$q??>Tp@f1YQ!@4#J| zwM37iz&FJw&#6v)L;<)Y6jipUY*Sma!qYatPi>oqXSWhN!DP10s z=d5SfVG2Qy2>XbRdYYeeMn8JKKudyqP@3!a}@u_VdO9nj_Zx0Yj&XW?XIkoe+j4xBJXN3{rL~&c~`rcR7De8QaTQ(nVUv@&M zt$1~lP28C_y(i`BOn5ubFUyCynU8y{|H{nmbs4o0sdw`6nm+sh%eKN~+ons5n%f@j z&F7FAeR5`!oncqT)&i@?Pu8qwd;DyxzWj|9-YVimo6(!a9UlFy7JiqE+iXuRQcSsX z=z6jEFOR~26Z=OR!;)YfGUIv<75w^W7Rf}<1nSGlR` z3*3+P^>~!BUES&1dV;9#dtb0N-|b!8Tea5@LTnSUHsMl|W)3PUJ0Ce|U^|N6itcRf zF8*Mm%y*peL$rGB>rAPj*gYRo*s5|~m~39>a$W6}#9d8k$1P9lSo<&YzBm_fLNGT^ zZfn|?A@MzRpGrpsJaH~+lKISRuLOlQ<>$y~j`5#A`rvC}W`p=MrIY+V-}*g|D@}wS zv8Y(m&F^C^sPv%O?U{{!^Gae`;+MQQuYh!u3DgA>Tqvt&GOPcc&bz_mdr)OdIMgs} z8$0-e*qW-}3a+sdOyh`=c$8Pa)=Dw#vBu{bj`*0VJ^m)o!zZ1zgGG~8E@OQr`@zh- zd+Nn|;S&Ca&;na)Hld3!Qz-xVg;_!kMs zO)IV&a|~$m+TZx`F!uW==Z{~^FXKbx6Q)+Vs*iGQkAL=jz*X+oh@wRc!<*vKtb50J zE}Ovhb%`*a(oZz{$I>uvHA6cnj0)qyPO)qqReVQRrwT58nxFY6ezu)7XN^fG(13y*_*R9*u zVE0@rr#<8JCzfT_Dtf$+OC+zBwKjguF~6{3nXueD?;}<2Sfl;+X_3Y6FADnvB>8qZ z8{yKAIo0d5jFxS?ciq_KMpLgqz=6Ia9z7zL9fpfrEK;O|EG2%N+Wq(~*UiC{77v0^ zuefXa&z{gYd+F8jh(n)n7ZtQBHarb?by(uI?!j7>pZVy7kI#M-PF?Z)QKJMjV! zY|UzOMgkt zvpvn2(GstZ9k^Ef;$(>3hZ_}|QacpUI%RSGt(mOGHy&O)k+GQPz=zme<|>cKTXq~_ zyO&C$!*;K8v3p^;lA-BB_xFg3Ok(eleaH>_w&i2l{M>< zH@1r3P&w4R;mwQ0?ZPS5)i0tP)A;<_zjvkGs~qXsR35|8em~uHwTJwdq#X~^)sSnl zkGX9v*_R=!dBCXd+a9(1W2y^kw9NTKSac_zAB;YZ*gJXnd-)099~jl{9WN{+-emR+ ztKTTnKT>GSW24cLmKvDbO3?b^cFxD=MGtZBk1~0J@#7!em$%itoZ9ZlcU-vsvC#E* zll%%_kcE%0cm%|^32*K(Up(=$)uyAjTI{*;k6PtxF4a*LTraAVS1Kh9m`K)C8fnWV z21i|!i2w4g^+et$>khk!;A=OtV#iLYaUbeSP}1p3QO#!3zAu=1`;*o+zHy%qS~pa` zSA#5bsT$c>lzksEU>Bu8PBV)s=3iFqDHtdE{k(9>&y4b_H2I8Ab2i*`yGNOr$Oc?DS8!qPaF(1o zddq@vZu7}!OOC7MTkpGxVt(>PzJf#TRJfAi(+}Ur7r$e_u;v*WVbaF7^k|*cmC)Wb zqel8?y?*fR5?&l;uwc#cV)h+7eB7@mS_`vx4L(l3qPZa7m$=Z1moItOEB4c|VJBi= z<}VCE)oDLsj{bh-VYTN{8#{MF(Z`0(>+p4Yshs_S&wAnn2y4HdRr1SK?LOk0b-6|3 z5tB;vCDEH%?->)Amoj|V$gXK8eQIac5WYG7j;eL*dG-St590iikEp7vX=#6fVAhK_>z-h+Zvv(&oRkhYGYZOzCzRTWCRvx^!>_m1@_bhJ+IDRx5T~R z#FX0Zd0#a4-Hrw2e&#{YQoipC?KbAE?%r(ow2|XtK~l8~qn!|!RiNNoc7ePVj|UH( z-`Wy&qS{KxFsMYKkUcg`?gZ0WCtHP`HS0n;efJ z8)B}ipfPq|!rz57Tv}4MOB5$l`nL3)oI*8E@ros)1DjR|Daw~@zAC!qm^WwL63!P_ zzr0&5x=A(zFmy&5n+b|#V_iXyh$HA-(y?h zmnXkmRHI!*&r|MI;3;Pd+tTajQ?Q~a9D$dh5f)h5j_&mj%6T!`-fu;cS9FhOI=NhR zrjo_|l_mVhP_gUQ@i~w0%0wQzHo;kvc~o{mb8bvA!seP}<0235qR(Oh!7b|Nd@bKp zn2i~BEquB0^fsQ!4MrQcu+^UsI6Lwr$w1jOY4D(rWx1Z(utY}I>Weu7!#j(@#*~j6 zIVRWbx~;iU??uTXIRVQZ%-dI;&|%EPS81LSeD**?O=HRWYtJS=`u()4eITEFB~}fE ztSR`3DZTXIQMp-i+#UNLYlz-2?Bezbe{N=4-e4wpImmsAH+xNQVSMw-w6Sk*D_%7f z<_|c=d?~LPlW2;X;z-qreen8y*`h9+!}89y&bx8EQ{Sv(H71!heCj_|$dxT}da7Tj zgspaJ^WbNIew;D1ZsDlh%Mo=)yDgsK9;x>o8uw`T%9bkdCaPXd zKGWvM?fmV6Qdj=*?^1lG7kSE5zHj2W&+i->d^IGTD5<`y;-G)Pjxwe14mjt_!TM+0 zI#+mfned5zR*dxH@mboYbj%JB+T+oH=)K=&yU_WOu#(Hp%RRSR1$%wBx)uhFA(D8# zdlGsDdhZ$3lp;)ztxLjO?5XAA>%F-3qi*BRJxLPU4NPp$F9ciS^t2EUeAhic5F{iw zE~mj)_mY2q{U&L=C3_(LLZHG@qGY2?Lt4(U`t^J8_>-%n1gr*lHkMxMe*B?w3}f(V z>uysm__5@^qcs=fj~%IkVvvzCdYiZSp*IeP?p@iY68~oP zp&h(eWkcleZtrKmu}9YbtbtGPx2M|$lOsaZ6wn`o{LYW;4{nz!*l^J7{PPfXnS$5B z726MP*es=7zbc|xuxr=Vw!6#uU!330!z3%aWjiWI@eupgCEp~K&v9QG-ttX8K=kvr zQwAZm$2MF$e88XO+5!J<+q}mQZIgO)(aAPVgcF~ViM80pxoi9J4fT=iOLllIEJ7Um z%;bH@HiZ4X_rZnxF5#<>ReA^3GD<2x61k+-gL&mM)L$d}HA;Rg|GezvuAnm=udgR$ zDa)_F^kBvK*!sI!r?#gn#;um{A7b1xc0O40+vmJjV|h%K8OJ;xI41O)C1i9j)y*u%pF}m)~tyP{v|8JKn8Pt1=j$TIJl; zxKjHe%;CzqjQznr^+C)TSDAMWhjA5ciC|2%_o%!S?7t^v8_(u*2alV?tv)IxwNL79 zxzfrFBHrf%eiO=@DcnMjv8u(SzaYf}eorb7Qanhn;I4=11Q^IjNq_-aC9@J>a3BSflmG*gT3|*R{O4~7Ah85y zMdHDIp9Ju9B1}>N2`}(z;JO|_#~?((-4R5P&rTqMmca{Iz$*bH+>jG#$VoGJP$x+4 z0@*a+4IX5wz^ocr3B0b7R2h8+3=t&f06Gp<0$*XK3dpd5@8ON47cEm{qGqtWHp~h8Vmun{8t$? zf1M0N8i<+w4su~cadW33(IvwW2zAqj!ZrOMaH1xit(p`uoFOjn@~s zMNSP)Wk(GUI;KzO!!)$4%4ONI`~77W0YN@4PHVTqCT5o`pZJtJM~%HvmzN**>G&wH z!Q%U;re5uZWshxokv9d+v(*m5 zQ+%Pj>6To*z<~uTqazR!EUTFW9PJo6FYGzL=*s;Al?Tru&iG>^E_8O7H*O7PT(V|E zs*A~+h=`k#Da#t$Y}aKS_b%U8G#U^$%xLDy;HH1(*z)}&PdXMyMEE6_mX`WXa9-TX zNJzFG35kxc1L98^%UdThh%6!sF^5)rs7@kh_(DQFUylghQ)r&SB z=@fmKayxso(sF^l_D43lcvca4N|#^JOE!7^#c8oNqXc&n%65^P-bt&CnkC4irS(o* z-Sh%i#Kx>2Vj0rBU@KOCJ~Ot4VRXB{l-eF%?u5<9y(G?t4c00mKWigv1kl2{*WD_e z10QnL>3(wlHM%77N0D$u&CrU3bDAfR_f`~_uk(~#SCZdIJiDDGJEz{Q^F-<0T-TsI zMqUEN&8tdwcg1b8Ii1TcR=+ibZHXTCR=zWLK%TNpRsnW!b%PZ$GILJMwlGK2$N$NL_|e8U)}K^%(Xe4^K$LQ z#A}sDt`k_=rGpo7hc92$&d$NxVk6BYog|0~*DA(^zbpYiDf;*;MNSmv?SonmB;WS-*fJmR7q{&&-i{BTld%-6^XJNc%1 zNBOnZ!<*gua7#1UBe?~Ihxs|9j_i8X(t$Zuc{geAL8+$^>u}?*THTfSz6RVmvcQB# zYGK=|&oY>=hcOHpElY?iGbDV{OY-6i3km}^-wH%Nn=Ft1>0Tx&Ct3I2)(Io}@z*;{ zk8M-h$RhmC$H$-A*Sx)!aXJC{()oLvhINGaXnTKl;0o(3x9<%vu8L$oaP+skWwg-R zae=jM=h5?eHYwcxAuFmj)^Ito9Mjsa|Npf2m0@vg+qR9nySux)1cJLe!QI_8NN^{( z2iM>Z!Gi<{Zo%E%Uz5G}Irr}KzVE*G{=Qw^)wOEYTD{hsT}@AF)fj_}og7`ETgssR zm!!}UN;+~8HA?gJvJ{n$y?;}*{ulG6qo~NoxLp4jdE4#|cj+_ggUqxpI3$4FuHY!Z*_cB}m7Oj)ghdEh0Psi0s6YXI0{+uU z zW|el9TG5-1@V*&@_O##J_z@HaZ|c7EyP&VYCP@`avinf{5Uk z5I8<(CEuXW3TMNuFziPtjp6D|z znK2h0pB*P0!4LrwsIv|fX-Qe=I8+iSN^m~jy*Uq7!e2F!VMz9ON3q*(oJ}}8;~!g| z->nV>z;M6A)ROOBuVLnAv2-8?$7Q~iky{DjjXKM*xP_=N=KBOJTCM}Hc=jv|_`Wu_eD$t|yn zD?Cc(q_a8b?ANm~&;WHa?f-+x%zsw*u*2!)0wH5=nbYY!A?0D=($~7EBR+l*iE)L1 zb8j@!-jCmfdR)81aAHRSk)1)O)xi?4oY+aY(LAt`=&}=gl%iJ_BOU~X8xV=a4VmfI zPSUrTU){-je3zMiJijJg<#J_RAhhn<>pAEk7W()uRJ>-J_{3RO>YTb6>3|Wi%O`y0 zzU;Hqk?8-8_4y<3!K!V^Bz=D8wm|hu+i5PbPZ?WnK}_{n8ky%5b{jdpN{+0DH!-d)gbG z7^_0CES>MXxf%@$N@IhCm3%Hyx*BQfn)-02YtwhT83u`1*o9MGt?PaH$$ix`NROCI z6@0@cZW4`z$w5QX5@dbDX7JuT1SICb>>|cvT|4UTY3&^A*Q9%yPiVd*dxBc@a^{7B zc{+Z@=QQp#a0rN&hT*H@w!OJ4t~;NG$2_%i=GF^1@$&I6SgD0Y$w`G`DcI!^5p>ZM zh5qwtgZi((g6D|%&^SFN@(YR;i1g~ABTiYh_sG}i&hfWWa6p$Ay{~Z6ynM~fLYyXk zB%(ml53;_st}1{IF{6Ju0J#M|2j}aOyH9O59rO_uP7cAgwA#aRfrs zp&@o`RyKI1&o6?98%%4yKk9Nj?d1FMC$u$YI0Q&HzRkV7$o;bRxI6onF}vF25wCo| zu#Y*GIOX;eP96lBszU$;pC{h zs3>Ug^P~g);+VT^b!C=cn5Tt~;p1@Pafq#`LStnGGp27{?#m1f+-aJ2Nt>JfiZvTr zMHiD-rk_DAJG*9u$B^?TG!I3QBad{iVEG1_}R3KEytS<(p{sExkED@-KeQ9xEnbA`>Zm4e82djGi{$be#5<>R#?S?C& z2)2)ICyPsFSWJsZLQN(zIlnaAe6BEA8tWOXnlW#>MVFdrTG*;D^V#8i@`(5?-kUR` z&FBu4p_qYLnvp)QTerr}enYX5Cc~W5Ce88wwKZ8#O~1kie)@cX_QcF7eBs5-6H?{9 z4(%H+h>&B<=U%=mLjFAJtigPTXChak9BNz<{zVbptg-$2;*&E&%-YgYNb#9X$!DGY zXE*#vwpvUiD2_nur65~OLR=r7(ZwUapy9Z5}9{Bxpvq7OVbm2w!D!y^AHkDXB;aITs9zAFLybPm$ zI?>ni=P@)1{b8-7JLs1uKQB8xRb$!Ort1E@^7mIGiE*1Z(_mM9KroC7T49cEJA%f# zReN;lT>sb5Eak^G55%2aJipy+tXwBX{AH$(M`+orU2E}86X(Z%107jjo8@kg4a{wN zKlmEw^*;Ay6zfU zot9f0OK)7~uxws=8MN;5L7kKf?L4_+?((eN>(K*^(u%AWl>7FvL1wQqrURBKCN{(& zjy!KuhwmpS-;uoRxpnu|@fWOqJZ!~oez6#owP}oHJ7`b-sc0ys?!d!jqK z%-xTM$H%$vy>@q1n_|~p3KI%+BlE8pDOi3j(w@L2zN^CThIcYFN=8BCYUv<2CH{81 z?qBb}cFq;!d~95Y$Np7R_CQi?wTRjOp`jeol%#+=*&9KcbkY6TYOTrpR`4tp;*L@G zW90hJ76VB6ejaYD;wiE#Ew9gnwVMpcDqqjl%fbMQlGjzu_((nvqGFpP?20(y^iAMs zO;@Dcg8kW7a|%_Rk5zeo{Q?M(16N4J@*na$j(hu`4`)v{`KLKDcLk3S64;v~6+UIz z2QNTwQbOYhFYTjZO`radAxoVbxL&#yYo%5F3@HS#JKcJqu)^b^d^teGpH|^j!;FTC z4eM#&fI%=CyyYGhgE>u*L)%7=Y**97y1Woz-|YQZ>M8X|&_Zms+f;IiGq{8Rm%^a) zgSh>W&zP3s>n0lAB|gz&+K@fr(uM3DSh>3GR;O85`VRRJUP1Oc##a2ima!{=m?&ha zm}cLvnUoi%hU(@fqsujUyFvX_T*X}{nOCq_MlH_6A8WBkp{<8gdi7**si&(81}%C* z{QI*iVL}faoGFBhK)61)3Ky;APpCnmN5<^Qu=&Kg`|Mzkc0M+MWYlF&zI8^C(&b)R zu-p0aZF6?j-OD00@JF;4Cw+T7V?HhDu}Eks&c62mtZA_+j&-q#(AVy};FB9)2Q1A# zdk5)QKn>iNHJ>LMM9j`$&V29vFc0YLUZ-B6nGU!ZR|DH{0*)jyv?4Gw+UH^p#2bf2Hc$;HJNR`Jxj6WtL*a(dwyiYOjs>Z!s*z(N&sGjsEqERHTee&MPDf+6D zJL&nEc4?n;W8H=W?U4+Z;<^(VFReR~X^Bci&yxpKcS1h#+Aj*zr`257+^3L%ZVKzS z^3xV>t24`kESMkzq!3``d^t7Y`No6nzJ8A-QfO=7&e>FLMWEe3&e)*YQ1K6i_{8xn zzOg(-yR14Q#uiY8pkxvvkY(&WKKUR>Q)ci+UHQJ~BNjkx#EOIr3=Ia6vSi<0`(6bM zNT#k+W~Vw4S7`(D_0UjOyU+2N4IA7VO6f!6y(HYVhw~SQPP}FtI}wkKer}HLSq&Ae zeVPvyD4Rt4GIG=3Sy`!87%QB7>_2EL-}MzJ2yxU_dRp~kp`h6F3G#k0X5O<7IAP9x zB;5nV#L(w!k)MkaDrkx32O=EtH!zneFbx)mF>+kNB+j%7CVt#3pcLS2`im^!&@ zzOHoEd$9gAMxFg-m>B6Oky@!NjEHn21G-b#TZ3M8k<)EKlMexl#r6f=6!w<)VDyqs z2aHSH|N7zdN@Mvkm8gXIxKe;m0i4sT^W}(tiOsvG_UW_km3@T&8Z5_vPh6Oi;!m_t zG+l3Y^rZumpiwT5LWLpem;K^zF^#6>8eLwjr>pS8d_r@JjmxX&Wh?Ti$1>SIoYdjx za)aSSAZx*j^p`B#u3_3kQG+M6L6QS@w6f?j`^8tWb*Xd+ehiJ*H;k_9DlSnfiCgC} zbqX&yg!1LlItmLb7)?Lrxk_n$_2cDW!54a4trWJAzepD=hK7CmuD&@pP{AeiH19O{ zy%DCxv}vh1qhVRg>4am@Q&RDhOnK8uLA>-cGfL+ypbDwnYGtByzJcI`#pG+SRU^oR z?v97k0;`WSZJG_M93%6LUit1wkh2^a0a-Y{xq&-=qce4pzDvH7vdnT-PLiQPfKtHq zKzYG#5pGDIV`%|)MGLaQzW!qaPVC76+7%AtXy(l5EomI^j%R!2H2{k$g|`=VrcrDF zxMAQX_a+ik-G+H~Ys6`}Q@j0_E_r(++`VR)riEh-g28q28UAR$lDjAsKPI;g2Wff> z)py5kjmlZOhG0U?TD}FB=KZhxfsTX45$<2?sus`poCfJ;3o~ih7-EnZn#@vrpV15A z>l^c5^o?>V`5r0RkUG7}tX5WHzMn8Co)4rIVaN-BUu5o<>Aa300ouZdm@^Ms0&#O9 zL7E=hWN%c0a8sZ3%#u4T>UuPFZCq+J(h#8t-wV<3K=RRhopTp4jfJpE2MajBcL@6z z`~SFvymvfB@!KlFaO~&v;=6tb^l^FSH`nJ^LU;o$qWYMOF>39xmK(rS(tt!M4Z>l8P#= z7Ed)>j`W|*mMJd-L|6i|KP&s};P3`#+;z!1w>K+by6BTr^<5p#My~j`Djteq>J^Ev z6>;jBj%2ypYF>;NtLRs7d2ueeJk;_;>T5pEB<~kPt$!X!$&A{H@>60#VqEMpSLE(c z)+v@F5Fp{Eb^IO?{0Ql^SS!pYk^X%xKLcOV4D%d#{jMlUYDQqoayF(nVO^$e zja($+H;Q{5+BQ2ic5JK%ProjnlHJ7Mo#ooWYZ!HPX$!B9x%f9Ao3=eU!&R|QK6l5g zC{fykX;(w@95RiuYr5UIg{?F!x_u`II4 z51CT;QijDB5Mm*cZDZNRuV3#rzDa*Yb@%KC=_Q5hZIT|M^>(Q=3?)+Z{1^<8j;}j%kU73sXRoTF zU!axhjSwx}+QVW;YZF<*&dvs6R0cD>k0>9|_XB)*;O~s68uqyP3Hd%eidwr&fp5b@ zk>s{V7=586aPR66Z1k60=q)S^F(r96p6l|xmHk$@-xyk&2)}#WB#W(U{<7&;zT)*t zw6j=p-o!qpEzTrV?_$um5w%R0|P z&TdbiN;&E@9=TY}PS?-)V#y_+)p~g|W%@$c3B>ZRDo}RnYqP71h9{*bKR^5&Hs%kf z6p)$Z*s3dCg+hA%`ZT`U^o)jZvE~1C_Rt3xmU+8Y?W%j^I!p(-<3+kFq`B*e74qEE zL==^??<)1|9aZJOZG_SqT)fla&=5$~muo-Fa`kZltw9phOVt^q-%4Alkr`ItUD*%6 zX0rq|3+kwxfO}sEsIq`Z$aTXrP;QlP*EG6g4h_A@U~|t73%|6X=CT~rpxY)1o5fk- zcPUmQa0O7~^cLqmwb0N6WKGvV^4Y;#1LKZqbtvoqUEpLLW(UU-=FF$u5aA z*=|55vMoMqj-T>ucqNHG(-(Y`g-&!HAWu=Su zgD9IOo0LkyLY}AIWlPw=rdcdKQskgltOmc|Rn#@R*U6R7@TEkxzJ5VRS-ZOT@wHda zVbq+2zD7I5sqm@KY5%H%r~mQv1l5Xp+QhpYcQ4Ny+!?y^xe@&^Z{K~sA5A~q15e>P zbM8GK5w7X3tgrcgxqoRgKaE=z>%c1Q)MoU^TeskP#6#Rdx`&VtCw*KWOMKQtJqV*} zemawPk+n5O54zOzXCgOBT%;@!veQ^1Jzy%q!ICOTW!AQ}{vjt)uz2$xq?gTV2`U67 zztOkj1a4S;$dE1jTb?A%5UYJEwSrEF>u&EiJiADZh)i#G_kBE2(>L}j>Fd5bp^zT5X!d;o+v zA~DOMkE25|^d-1z`LrgYteGBkxq@*@{Hldq1>hF7UBwAXw4=2obh?-(!n~?*yO=np z1-ze$peoT-!H94$T52kuh5_zi6_x?^0;5;r`#;hVpo>Zf%~ZQ}33630(pc+pI^n5Z z&ul|^wgYq!E=@G;L0fqRccK;3hi#fvHPjcj@-SGOp2oPShPK^!8WznOwBTD8HF?^q zNaf{AOXDNw>C1IZYH;ZhAbm64TMZkl>h-Hire@S|E9%CL;>r(AoP9mzTth0jW)8{@ z1BBh>BU|uihM;Y~wDA5K1gxnu;wY0uBBWRqWSW&t;~i8$?kR+na@dHJm5RUmhtjw+ zbPBdU3598mC{+X)Z={4nEm7nuF&orqmdm+1`RMkRoD{Y}zos39XPfY-VNIgUq4f-M01}I%zc-?(->FkJ^BZsHY6WDfNDp`k z=S=U+G99`Wt*RU!i*07)iDO={7RIvZC~YfR;F!9H2LCWl?6TCWyY)cO@I2zEUExdMi~S!h?<4NKhHcD1W@ZppD%qqf~j#Se#Bd;iBxz zh5qPl8H3GEb;JTr!Gpr{Idr2L%`(9F0Z&AJqWB4z8b8&%>e$Z)R2(l<{AIe=&y?Glj{o-)0g z8WDZ-Nv-^}Didb&(e|5_5upX+)B)45O zPS2s+Qm5&)fT_Bofrp2-V6^N!O`zaWygE-^(hNh7!DE6y( zRi?bfFFxHdjBl=P4On;JBFW3JcUxS$ zvYQFZ=}x#>z0X)LI5OhR)=rnvein;A@#4vho-I$V zYU`{jR$GvBKH+>)FrF=&ovx$(#CDL0(oY+XtASvoq~RjL?i`y9ww7GhpX6H`bJ%G9 zd@dAU`=VXu#362T&}rdfNegGmlLeZDq!1+!!k?U5s;Gc@UTd?Ln3qi#6tCa)z5!@hxOa=yob0Kqice}HM& zo3TJ`ImyuOXxDX_r6~?ZH5o|~sj{lgRh>Pmd$j_sOlMC-KB>5tp7mUPILOx>-JS@E z9o=RM%tp1#K<{?n;Ps_SB-?6vvVcux3OURRP?6j=mW`CnX{kyRvs0Jad@yn|&MbD8 zrqLzqpG)rhG`qq(cZo<9BFmVQVojSm!3Zf}W$4#fE^$6+!)TperURjJ?%hx2v{Iij zU}}<*1+UsrrcmUt;+iV*33*{in>{~I$Ec{j(mOcL>UE8CJB>fOJB0;p7p|-X?JwszsUb${E#A#F zOP@^jcB=PG@NsIao^(35X~gQOm3lwp9Hv;W(1B3EnP0Rt2<*6C)81<>d~F@)KjB!u zc4OS7(JI|>&i}J+vJ@H7@#1vyv;jlTy5H(o zr`8CQ>w}1FO=;iK%^A=FvyK=}`+Cu9ev>>S(U4a z*mR01QFPDh7z(0MsRQBLKrl_ETCE+s5zbgVWuy&90D*xUM@?D8S}?mYqQRK#B+P=y7@V^Od(Du#2{5XLWz!mLJQcaIL--tT*eeF#l5KN=5^toyPAr}e=rWuyO0)lBYj8n_o z-oP|0HLolnIp1;BzsQ>5nTKO{pTb7~qA4R+X(gJCSb`?q5Qk9cUC5djyLnrzMw9S} z)3L1t<^y3S4a(eD%q;5O{T$-`iX$Scp>J#e7V#9Y{EbPY2QiS&Cjc%B1>JfkbyA;E@JDby?5D$;mUNkcw1g-VtgV=#Zb@h z-KWfqtW-VFTndOcEKMbYnStkGem%X1tkl@}7-JeCow-Ts7TYL1KrS9mB|^Gx`pecA z^x+Vd2w1p?hJbj)n)`)&95G?BjA9590Ci=qgO`$B`cH~ost?1a>WQic=K-Y=yaE~UW?LqB({BbA+uw>Ly=wK;)Mny-=d zmK1+LX}&MW(G4-p%4dTDp)^vU@CilRfcu=z%vHHPvoL0Tohsw;EK6=KvOhR3h*Cv8ZBTb@= z=f2wi>&ZDy_YPl%P$WCKS#-!AHuW!a5=(l8I&qG_i$d*p%G*_3Yu%eP6%djF+eyaeQu8=L$M`=$mN&ULdOWpxV-f+W# z>zN*`Fb`A>aW)?klJ^-*8{%Z`6Y{Q;SvNj$cBB?wQ)u^-?{`RQTYaFhC6hXqQBHU+ zOu|gyUzCx)AsepT=sRbb>LW7&U8Wo*-wf=#!**I~?wqm>G+CY(w$%N=>K4_+&KVbV zPT53xonmK8B2~j%$|YrmA>kcAIc&61(y6>5&T7@1%3j7Kbq1S=%9(J7{edPsLFZ{` ztiz`;11cdt*tjrWikxv-Cjw7Wybn^6j59$~6Ae$;D6xNC-(((H!BP|Z(>Vpp@Wzil zfaRVzDuVAM2sy77{)SXOfb;+w2OpggA%-O0A+nGh6aZ}Pu%H5aOSxW|eJS($x2`D``w$FEsnl2fiOY zLQoW9iH9$t&!I_i17@yB61d_M#NxrFji^y{#DctK$m8Nnlmb$O*VBHfquitTU>~Md z^nQDNeF}SN!r6Pk3Vp%TuAT_{Pjn3s)$lh_8BGNvE1)FLe*xG?*#b3ifYK_zr4fKy zJFrZD>NK#hZ~~Px>}~9wRNf>o-flN{votnUmJk7oyjZ$8E1Eiq+S@wV+r5c1aR2)@ zAbWRu*0s761S$4!8ni1~T1;_>cD-!{!&IS8d`63tMuQCeuzq1nPySLc?la>7cc?SOD^*<5#Cj$RO z;GYQm6M?@X0L(mic$qnPnSopY%)G!Xgq;Hb%q~Fw$S{<7xZn2v$U=Y@Y~ET)0d?T* z0K@NVjKtaI3K*7P@Mh&d( z3p@@0M}a^kVR;9Mrep|3>WI!77@r4CCQ{pjp*(p;&SvBk1OtnSg^hztK}khTL(2|S zujc0A6@4!zE+Hu;t)i-?t^pK?HU`S7np;>}IlH*JxqEne1%C_)4GaGi0px{BPD%Zo zmY!cwSoEd1q_nK=YkfmwQ*%pe@3+4Gfx)5Sk*VpQGqZE^3ybR;n_JsEyL5{mm~FpkJWi;9%fTZ+?M*x&v1*6mSR<7D&{0N>GN5Xr!!x z(C8xZd9^(-WNgZ37)DN$u$biR>lEj2uKo7x|ID$V|0mD><=DUdS_Hs@0Z%^^Fcg3g z;PE7a_BbZl(QmC)mq}zWK#1u3TKZGw?NZ}5{Y(ZO50f1xb=asU&mL6iP34^r73dd= zw1sDtz=xfBdiE0bsU6b3njU&5G3`i}WXnZ^dFiqUf9=N>!Lzo-H;8FIo^GlX)Ub{} z#^RzGn-s&K%o9UbgdG1=i14m`!6Oh60F@#%{j||qvZ)zIN-ahJzy>YbTN0`}eyR;w zdboXd)}YI$9a=A?qC{8G7mJo*ffbOW<#vTHCZ54rDydfzV}Wqio=pi>YclNB<%Wkc zj!(SX(vZ=8X>oz9H2b`=&Dw~SnBd>-*N}O`S>$Jn81xl5&UtP?9@68YO`t6}y z9B0&%N76&umc{dUgEP^hWr+Qb>OT7IuNsU(ge4j>3IsbsS*p<|e@SJOI8feYUd&`I!x5Gy$l zAI()nJlUz2Kj|CDES!>YdM2=p7s@~tlKaN~U^BMopk0((-<3|1N#}U!#vi*YX62FL zeiL*A_flal*ut*CwtPi;lE`{wk2`Q|rlvuYjU@k$XrwiZO&2#Z3G<|aH-03xbffv8 z*4|s791Z@9!2CEO$WFQ&rGqlxplh@Y8-&uYdthwk<+WRZ}3SQ$zG+@~(y-Gb(p znW`xqDjOcKVz4!P1?~O%XIcV&Q`RYzP&WZD{}9WHMxJGK%(j&8AO9SM3gTs zX4i$az$3`PueY4_RG7u+`)FgN1j-|(dsH(GLIKEL$exwpk;=2VfErDZ(>UxXU#aWe zsHx!XA7$|!S!0n4lA1+|gruzRaG;vM_y*zKUh4Ax+5`d49VS!ez}GCnc@As@gM`t3 zdj(WZLtU3!1aZI?0Ng5-6;v4g)GSV@L4?5qXzAKYj(%C1a4Y?Ar~0Al6@4(T&0h@B zO8bz$%UF5Mpm?9~{?U`fu?cLR=oO%quiO~^Su{hVHpAE9HdTR6ybhCR`1nXLi@Ib* zpUaf4A+SdsKX_lvz#Sn!f*SNDzWIRJ20ZT9`5eJ3K>GMFVXC^)))3-*#mIJ`FpPnO zyme7cJJ#%rg-C=Hn7guowS|TAtlWY8_vX@JY@W@1VMVq8NK1=KdZ(xa^d!R{%(v)g z0Bn3%>iljDjJ^c%65}YT6hM$;;Ner5Hnl;xJ_!BD2^jcegs;c$;r=UNZr#otbM``d z`J?iDsWn#Lts#T@GS>vju&zJ!E8uXWXfGmS#}a=u6;jH?eS0Mm-)mAyNq09FT}cdp zF?naK=NGR{!OvA`dAz7aZ#+G&Mkzs< z@Tx)k0y2|W8Gw)gb3j)h8bQNlrU{M`=R{)(g%1)yV@a9a3mkok7=emftbF*Dr{ukI z^Y>3%ZSjT4!F>2zx0@JWH+tokWwQCZ4y<8Ywob+m9HqH{O>%!y=SKi&CCxm@HKHT9 z`7yXj3-SYa`GhbG0WIN~4tj!F{d&z^5f6i-k=zVT*+{alfWRuD(&B=;;83!CZSey6 ztun{f__=+hWL{>5DI2r8;76DLCOr_4Wg= z%$e#jN6UnfI3WE=kCM2QKv`pHNmYjZPV%Z$x9&!ZoTz4wGMVQB?gffamTZxcq1<=< zAgj4SrFKgP5qMg!&8JJ%lKdJz)VeyL6M-Sfx`LMtA=yjMB--{D7 zshWBKMe2V~hKc;S75#H7r3akc0?L&G#lnFF7UI9C+JH*nZ|rry`Qn(wJX|DHT!1>? zziUaTun_-?OOEN!Nw?oeq*#c5&&vI71)LQ7Q+6H5TlUvX9V`=YXeO>e(RpI(msfx- zKoRgBAP$ta7j-fa?Ff-FJGgASdzwEYzuCCC|D!FChVJkEva)fr{6||hZXl1{-`T#$Wf}+p=-+015d1X5(ZBlJ@=G#?1vhd*7CS#hHzhhyCyUvT?C;{zo5N zoc|F&c5a@xbNIi#9|w?r@9%wZaIye7{{B_Z#mUgp#?%S+?W?6?>1FzMZZIj^+q)10 z+5FzVTTD`RX7Hz**Uq5n7Mga%-GnOO}RNuc~}g&jX6z?c-W1YIl0-4 f1&ROXDtdoVUKu*M{5~f+I9b^^VJRrY6vY1*_Tr82 literal 0 HcmV?d00001