From 46c8a9ab62a0cc9afa04361236b3dd0832cfeb1f Mon Sep 17 00:00:00 2001 From: Jake Jackson Date: Wed, 30 Sep 2026 18:01:18 +1000 Subject: [PATCH] Draw linear gradients in their old directions under cssMode legacy Under CssMode::LEGACY a linear gradient reads its direction as mPDF v7 did, prefixed or not: "left" and "right" name the side it ends at and "top" and "bottom" the side it starts from, with or without "to"; angles run counter-clockwise from pointing right in whole degrees; and turn is not read. The output is byte-identical to the code before #577. The angle is wrapped with fmod() and cut with an explicit cast, so PHP 8.1 raises no deprecation for a fractional angle. Under CssMode::STANDARD gradients run as CSS Images gives, as #577 made them. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG-GRAVITYPDF.md | 5 +- src/Gradient.php | 162 +++++++++++++----- tests/Mpdf/LinearGradientDirectionTest.php | 136 ++++++++++++++- ...earGradientDirectionLegacySnapshotTest.php | 80 +++++++++ .../LinearGradientDirectionSnapshotTest.php | 46 ++++- .../linear-gradient-direction-legacy.pdf | Bin 0 -> 54916 bytes 6 files changed, 369 insertions(+), 60 deletions(-) create mode 100644 tests/Snapshots/LinearGradientDirectionLegacySnapshotTest.php create mode 100644 tests/data/snapshots/linear-gradient-direction-legacy.pdf diff --git a/CHANGELOG-GRAVITYPDF.md b/CHANGELOG-GRAVITYPDF.md index d2c0a85c1..2fc92a7fc 100644 --- a/CHANGELOG-GRAVITYPDF.md +++ b/CHANGELOG-GRAVITYPDF.md @@ -200,7 +200,7 @@ Bugfixes * `rotate: 90deg` on a positioned block turned it on PHP 5.6 to 7.4 but not on PHP 8, where `"90deg" == 90` is false. The angle is now read as tables read it: whole degrees, with or without `deg`, so `270deg` turns the block as `-90` does. A positioned block also takes `180deg` as it takes `180`. [#579] * `background-size` lengths such as `60mm` or `100px` drew the image 2.83 times too small, because they were used as points. [#574] * A stylesheet `url()` did not load its image when the path had spaces or parentheses, when there was whitespace inside the parentheses, or when it was an SVG data URI that is not base64, such as Bootstrap's `form-select` arrow. [#573] -* `linear-gradient(to bottom, …)` and `to top` were drawn upside down, and so was the vertical half of `to bottom right` and the other corners. Angles ran counter-clockwise from pointing right, so `90deg` drew bottom to top. A gradient now runs as CSS Images gives: `0deg` points up and angles turn clockwise, `turn` is read, and a corner keyword leaves the other two corners halfway along. `-moz-`, `-webkit-` and `-o-` gradients keep their legacy angles, and their side keyword, such as `left`, names the side the gradient starts from. [#577] +* `linear-gradient(to bottom, …)` and `to top` were drawn upside down, and so was the vertical half of `to bottom right` and the other corners. Angles ran counter-clockwise from pointing right, so `90deg` drew bottom to top. A gradient now runs as CSS Images gives: `0deg` points up and angles turn clockwise, `turn` is read, and a corner keyword leaves the other two corners halfway along. `-moz-`, `-webkit-` and `-o-` gradients keep their legacy angles, and their side keyword, such as `left`, names the side the gradient starts from. Set `'cssMode' => \Mpdf\CssMode::LEGACY` to keep the directions mPDF v7 drew, prefixed or not. [#577] [#639] * Characters mPDF moved into a substitute font (`useSubstitutions`, and the fonts for supplementary planes) were wrapped in a `` that stylesheet rules reached, so `span { border: 1px solid }` drew a box around them, and the span counted among its siblings for `:nth-child()`. In the standard CSS mode no rule reaches that span and it is not counted, as a browser has no such element. The legacy mode styles it as before. [#634] ### Images and SVG @@ -842,5 +842,6 @@ These changes do not change output. [#631]: https://github.com/GravityPDF/mpdf/pull/631 [#632]: https://github.com/GravityPDF/mpdf/issues/632 [#633]: https://github.com/GravityPDF/mpdf/pull/633 -[#635]: https://github.com/GravityPDF/mpdf/pull/635 [#634]: https://github.com/GravityPDF/mpdf/pull/634 +[#635]: https://github.com/GravityPDF/mpdf/pull/635 +[#639]: https://github.com/GravityPDF/mpdf/pull/639 diff --git a/src/Gradient.php b/src/Gradient.php index e7f90c65a..a826d1023 100644 --- a/src/Gradient.php +++ b/src/Gradient.php @@ -623,17 +623,20 @@ public function Gradient($x, $y, $w, $h, $type, $stops = [], $colorspace = 'RGB' /** * Reads the arguments of a linear gradient into the start point or angle Gradient() works from, where y runs up the - * box and angles run counter-clockwise from pointing right + * box and angles run counter-clockwise from pointing right. In legacy CSS mode the direction is read as mPDF v7 + * read it, whatever the prefix * * @param string[] $m The match whose second element holds the arguments * @param bool $repeat Whether the gradient repeats - * @param bool $legacy Whether the function is prefixed, where a keyword names the start side and angles already - * run counter-clockwise from pointing right + * @param bool $prefixed Whether the function is prefixed, where a keyword names the start side and angles already + * run counter-clockwise from pointing right * * @return array */ - private function parseMozLinearGradient($m, $repeat, $legacy) + private function parseMozLinearGradient($m, $repeat, $prefixed) { + $legacy = $this->mpdf->cssMode === CssMode::LEGACY; + $g = []; $g['type'] = self::TYPE_LINEAR; $g['colorspace'] = 'RGB'; @@ -657,7 +660,9 @@ private function parseMozLinearGradient($m, $repeat, $legacy) } // Is first part $bgr[0] a valid point/angle? $first = preg_split('/\s+/', trim($bgr[0])); - if (preg_match('/(left|center|right|bottom|top|deg|grad|rad|turn)/i', $bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i', $bgr[0])) { + // mPDF v7 did not read turn, so a first stop whose colour name holds it, such as a spot colour, stays a stop + $units = $legacy ? 'deg|grad|rad' : 'deg|grad|rad|turn'; + if (preg_match('/(left|center|right|bottom|top|' . $units . ')/i', $bgr[0]) && !preg_match('/(<#|rgb|rgba|hsl|hsla)/i', $bgr[0])) { $startStops = 1; } elseif (trim($first[count($first) - 1]) === '0') { $startStops = 1; @@ -672,45 +677,10 @@ private function parseMozLinearGradient($m, $repeat, $legacy) // first part a valid point/angle? if ($startStops === 1) { // default values - // [ || ,] = [<% em px left center right bottom top> || ,] - if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad|turn)/i', $bgr[0], $m)) { - $perTurn = ['deg' => 360, 'grad' => 400, 'rad' => 2 * M_PI, 'turn' => 1]; - $angle = (float) $m[1] * 360 / $perTurn[strtolower($m[2])]; - } elseif (trim($first[count($first) - 1]) === '0') { - $angle = 0; - } - - if (isset($angle)) { - // CSS Images angles point up at 0 and run clockwise - if (!$legacy) { - $angle = 90 - $angle; - } - $angle = fmod($angle, 360); - if ($angle < 0) { - $angle += 360; - } - } - - // "to left" names the side the gradient ends at, and a legacy "left" the side it starts from - $to = strtolower($first[0]) === 'to'; - - if (stripos($bgr[0], 'left') !== false) { - $startx = $to ? 1 : 0; - } elseif (stripos($bgr[0], 'right') !== false) { - $startx = $to ? 0 : 1; - } - - if (stripos($bgr[0], 'top') !== false) { - $starty = $to ? 0 : 1; - } elseif (stripos($bgr[0], 'bottom') !== false) { - $starty = $to ? 1 : 0; - } - - // Corner to corner across the box, so the other two corners take the colour halfway along, as CSS Images - // gives for "to top right" - if ($to && isset($startx, $starty)) { - $endx = 1 - $startx; - $endy = 1 - $starty; + if ($legacy) { + list($angle, $startx, $starty, $endx, $endy) = $this->readLegacyDirection($bgr[0], $first); + } else { + list($angle, $startx, $starty, $endx, $endy) = $this->readDirection($bgr[0], $first, $prefixed); } // Check for %? ?% or %% @@ -796,6 +766,110 @@ private function parseMozLinearGradient($m, $repeat, $legacy) return $g; } + /** + * Reads the angle or side keywords a linear gradient starts with, as CSS Images gives them for an unprefixed + * function: "to" names the side the gradient ends at, and angles point up at 0 and run clockwise + * + * @param string $direction The first argument + * @param string[] $words The first argument split at whitespace + * @param bool $prefixed Whether the function is prefixed, where a keyword names the start side and angles already + * run counter-clockwise from pointing right + * + * @return array The angle, start x, start y, end x and end y, each null where the argument does not set it + */ + private function readDirection($direction, array $words, $prefixed) + { + $angle = $startx = $starty = $endx = $endy = null; + + // [ || ,] = [<% em px left center right bottom top> || ,] + if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad|turn)/i', $direction, $m)) { + $perTurn = ['deg' => 360, 'grad' => 400, 'rad' => 2 * M_PI, 'turn' => 1]; + $angle = (float) $m[1] * 360 / $perTurn[strtolower($m[2])]; + } elseif (trim($words[count($words) - 1]) === '0') { + $angle = 0; + } + + if (isset($angle)) { + // CSS Images angles point up at 0 and run clockwise + if (!$prefixed) { + $angle = 90 - $angle; + } + $angle = fmod($angle, 360); + if ($angle < 0) { + $angle += 360; + } + } + + // "to left" names the side the gradient ends at, and a prefixed "left" the side it starts from + $to = strtolower($words[0]) === 'to'; + + if (stripos($direction, 'left') !== false) { + $startx = $to ? 1 : 0; + } elseif (stripos($direction, 'right') !== false) { + $startx = $to ? 0 : 1; + } + + if (stripos($direction, 'top') !== false) { + $starty = $to ? 0 : 1; + } elseif (stripos($direction, 'bottom') !== false) { + $starty = $to ? 1 : 0; + } + + // Corner to corner across the box, so the other two corners take the colour halfway along, as CSS Images + // gives for "to top right" + if ($to && isset($startx, $starty)) { + $endx = 1 - $startx; + $endy = 1 - $starty; + } + + return [$angle, $startx, $starty, $endx, $endy]; + } + + /** + * Reads the angle or side keywords a linear gradient starts with as mPDF v7 did, prefixed or not and with or + * without "to": "left" and "right" name the side the gradient ends at, "top" and "bottom" the side it starts + * from, and angles run counter-clockwise from pointing right in whole degrees + * + * @param string $direction The first argument + * @param string[] $words The first argument split at whitespace + * + * @return array The angle, start x, start y, end x and end y, each null where the argument does not set it + */ + private function readLegacyDirection($direction, array $words) + { + $angle = $startx = $starty = null; + + if (preg_match('/([\-]*[0-9\.]+)(deg|grad|rad)/i', $direction, $m)) { + $angle = (float) $m[1]; + if (strtolower($m[2]) === 'grad') { + $angle *= (360 / 400); + } elseif (strtolower($m[2]) === 'rad') { + $angle = rad2deg($angle); + } + $angle = fmod($angle, 360); + if ($angle < 0) { + $angle += 360; + } + $angle = (int) $angle % 360; + } elseif (trim($words[count($words) - 1]) === '0') { + $angle = 0; + } + + if (stripos($direction, 'left') !== false) { + $startx = 1; + } elseif (stripos($direction, 'right') !== false) { + $startx = 0; + } + + if (stripos($direction, 'top') !== false) { + $starty = 1; + } elseif (stripos($direction, 'bottom') !== false) { + $starty = 0; + } + + return [$angle, $startx, $starty, null, null]; + } + private function parseMozRadialGradient($m, $repeat) { $g = []; diff --git a/tests/Mpdf/LinearGradientDirectionTest.php b/tests/Mpdf/LinearGradientDirectionTest.php index fdf633815..33c1323fb 100644 --- a/tests/Mpdf/LinearGradientDirectionTest.php +++ b/tests/Mpdf/LinearGradientDirectionTest.php @@ -4,7 +4,8 @@ /** * The axis a linear-gradient() background is drawn along. Gradient() registers it as [x0, y0, x1, y1] across the box, - * with y running up, so "to bottom" starts at y = 1 and ends at y = 0. + * with y running up, so "to bottom" starts at y = 1 and ends at y = 0. Standard CSS mode reads the direction as CSS + * Images gives it, and legacy CSS mode as mPDF v7 did. */ class LinearGradientDirectionTest extends \Yoast\PHPUnitPolyfills\TestCases\TestCase { @@ -13,13 +14,15 @@ class LinearGradientDirectionTest extends \Yoast\PHPUnitPolyfills\TestCases\Test * The axis drawn for a block with the given background * * @param string $background + * @param string $cssMode + * @param string $property The property the gradient is given in * * @return float[] */ - private function axis($background) + private function axis($background, $cssMode = CssMode::STANDARD, $property = 'background') { - $mpdf = new Mpdf(); - $mpdf->WriteHTML('
'); + $mpdf = new Mpdf(['cssMode' => $cssMode]); + $mpdf->WriteHTML('
'); $mpdf->Output('', 'S'); $this->assertCount(1, $mpdf->gradients); @@ -87,6 +90,121 @@ public function axisProvider() ]; } + /** + * In legacy CSS mode a side keyword or an angle runs the axis as mPDF v7 drew it, prefixed or not + * + * @dataProvider legacyAxisProvider + * + * @param string $background + * @param float[] $expected + */ + public function testLegacyAxis($background, $expected) + { + $this->assertEqualsWithDelta($expected, $this->axis($background, CssMode::LEGACY), 0.0001); + } + + /** + * Backgrounds with a side or corner keyword or a right angle, with the axis mPDF v7 gave each + * + * @return array + */ + public function legacyAxisProvider() + { + $down = [0.5, 1, 0.5, 0]; + $up = [0.5, 0, 0.5, 1]; + $right = [0, 0.5, 1, 0.5]; + $left = [1, 0.5, 0, 0.5]; + + return [ + 'no direction' => ['linear-gradient(red, blue)', $down], + 'to bottom runs up' => ['linear-gradient(to bottom, red, blue)', $up], + 'to top runs down' => ['linear-gradient(to top, red, blue)', $down], + 'to right' => ['linear-gradient(to right, red, blue)', $right], + 'to left' => ['linear-gradient(to left, red, blue)', $left], + 'repeating, to bottom runs up' => ['repeating-linear-gradient(to bottom, red, blue 5mm)', $up], + 'left runs to the left' => ['linear-gradient(left, red, blue)', $left], + 'top runs down' => ['linear-gradient(top, red, blue)', $down], + + // A corner sets only the start, and the angle is squared to the box + 'to bottom right' => ['linear-gradient(to bottom right, red, blue)', [0, 0, 1, 0.5]], + 'to top left' => ['linear-gradient(to top left, red, blue)', [1, 0.5, 0, 0]], + + '0deg points right' => ['linear-gradient(0deg, red, blue)', [0, 0, 1, 0]], + 'unitless 0 points right' => ['linear-gradient(0, red, blue)', [0, 0, 1, 0]], + '90deg points up' => ['linear-gradient(90deg, red, blue)', [0, 0, 0, 1]], + '180deg points left' => ['linear-gradient(180deg, red, blue)', [1, 0, 0, 0]], + '270deg points down' => ['linear-gradient(270deg, red, blue)', [0, 1, 0, 0]], + '-90deg points down' => ['linear-gradient(-90deg, red, blue)', [0, 1, 0, 0]], + '450deg points up' => ['linear-gradient(450deg, red, blue)', [0, 0, 0, 1]], + '100grad points up' => ['linear-gradient(100grad, red, blue)', [0, 0, 0, 1]], + 'turn is not read' => ['linear-gradient(0.5turn, red, blue)', [0, 0, 1, 0]], + + '-moz- left runs to the left' => ['-moz-linear-gradient(left, red, blue)', $left], + '-webkit- left runs to the left' => ['-webkit-linear-gradient(left, red, blue)', $left], + '-o- right runs to the right' => ['-o-linear-gradient(right, red, blue)', $right], + '-moz- 90deg points up' => ['-moz-linear-gradient(90deg, red, blue)', [0, 0, 0, 1]], + '-webkit- 0deg points right' => ['-webkit-linear-gradient(0deg, red, blue)', [0, 0, 1, 0]], + ]; + } + + /** + * In legacy CSS mode "left" runs the gradient to the left, prefixed or not, in the background shorthand and in + * background-image + * + * @dataProvider prefixProvider + * + * @param string $property + * @param string $prefix + */ + public function testLegacyLeftRunsToTheLeftWhateverThePrefix($property, $prefix) + { + $this->assertEqualsWithDelta( + [1, 0.5, 0, 0.5], + $this->axis($prefix . 'linear-gradient(left, red, blue)', CssMode::LEGACY, $property), + 0.0001 + ); + } + + /** + * Each property a gradient is given in, with no prefix and with each prefix the gradient parser tells apart + * + * @return array + */ + public function prefixProvider() + { + $cases = []; + foreach (['background', 'background-image'] as $property) { + foreach (['', '-moz-', '-webkit-', '-o-'] as $prefix) { + $cases[$property . ', ' . ($prefix ?: 'no prefix')] = [$property, $prefix]; + } + } + + return $cases; + } + + /** + * In legacy CSS mode a fractional angle is cut to whole degrees, as mPDF v7 cut it, without the deprecation PHP 8.1 + * raises for an implicit conversion from float to int or any other error + */ + public function testLegacyFractionalAngleIsCutToWholeDegreesWithoutDeprecation() + { + $errors = []; + set_error_handler(function ($errno, $errstr) use (&$errors) { + $errors[] = $errstr; + + return true; + }); + + try { + $fractional = $this->axis('linear-gradient(22.9deg, red, blue)', CssMode::LEGACY); + } finally { + restore_error_handler(); + } + + $this->assertSame([], $errors); + $this->assertEqualsWithDelta($this->axis('linear-gradient(22deg, red, blue)', CssMode::LEGACY), $fractional, 0.0001); + } + /** * An angle between the sides runs the axis into the right quarter * @@ -95,10 +213,11 @@ public function axisProvider() * @param string $background * @param int $dx The sign the axis runs across the box * @param int $dy The sign the axis runs up the box + * @param string $cssMode */ - public function testDiagonalAxis($background, $dx, $dy) + public function testDiagonalAxis($background, $dx, $dy, $cssMode = CssMode::STANDARD) { - list($x0, $y0, $x1, $y1) = $this->axis($background); + list($x0, $y0, $x1, $y1) = $this->axis($background, $cssMode); $this->assertSame($dx, $this->sign($x1 - $x0), 'across'); $this->assertSame($dy, $this->sign($y1 - $y0), 'up'); @@ -132,6 +251,11 @@ public function diagonalProvider() '135deg' => ['linear-gradient(135deg, red, blue)', 1, -1], '22.5deg' => ['linear-gradient(22.5deg, red, blue)', 1, 1], '-moz- left top' => ['-moz-linear-gradient(left top, red, blue)', 1, -1], + + 'legacy 45deg' => ['linear-gradient(45deg, red, blue)', 1, 1, CssMode::LEGACY], + 'legacy 135deg' => ['linear-gradient(135deg, red, blue)', -1, 1, CssMode::LEGACY], + 'legacy 22.5deg' => ['linear-gradient(22.5deg, red, blue)', 1, 1, CssMode::LEGACY], + 'legacy -moz- left top' => ['-moz-linear-gradient(left top, red, blue)', -1, -1, CssMode::LEGACY], ]; } diff --git a/tests/Snapshots/LinearGradientDirectionLegacySnapshotTest.php b/tests/Snapshots/LinearGradientDirectionLegacySnapshotTest.php new file mode 100644 index 000000000..4c7826740 --- /dev/null +++ b/tests/Snapshots/LinearGradientDirectionLegacySnapshotTest.php @@ -0,0 +1,80 @@ + [ + ['linear-gradient(to bottom, red, blue)', 'to bottom: red at the bottom, blue at the top.'], + ['linear-gradient(to top, red, blue)', 'to top: red at the top, blue at the bottom.'], + ['linear-gradient(to right, red, blue)', 'to right: red at the left, blue at the right.'], + ['linear-gradient(to left, red, blue)', 'to left: red at the right, blue at the left.'], + ['linear-gradient(to bottom right, red, blue)', 'to bottom right: red at the left, blue at the right, running slightly up from the bottom left corner.'], + ['linear-gradient(to top left, red, blue)', 'to top left: red at the right, blue at the left, running slightly down to the bottom left corner.'], + ], + 'Angles' => [ + ['linear-gradient(0deg, red, blue)', '0deg: red at the left, blue at the right.'], + ['linear-gradient(90deg, red, blue)', '90deg: red at the bottom, blue at the top.'], + ['linear-gradient(180deg, red, blue)', '180deg: red at the right, blue at the left.'], + ['linear-gradient(270deg, red, blue)', '270deg: red at the top, blue at the bottom.'], + ['linear-gradient(45deg, red, blue)', '45deg: red at the left, blue at the right, running slightly up from the bottom left corner.'], + ['linear-gradient(135deg, red, blue)', '135deg: red at the right, blue at the left, running slightly up from the bottom right corner.'], + ['linear-gradient(0.25turn, red, blue)', '0.25turn: turn is not read, so red at the left, blue at the right.'], + ], + 'Prefixed functions' => [ + ['-moz-linear-gradient(left, red, blue)', '-moz- left: red at the right, blue at the left.'], + ['-webkit-linear-gradient(top, red, blue)', '-webkit- top: red at the top, blue at the bottom.'], + ['-webkit-linear-gradient(90deg, red, blue)', '-webkit- 90deg: red at the bottom, blue at the top.'], + ], + ]; + } + +} diff --git a/tests/Snapshots/LinearGradientDirectionSnapshotTest.php b/tests/Snapshots/LinearGradientDirectionSnapshotTest.php index b1f1024b5..bde8deeb0 100644 --- a/tests/Snapshots/LinearGradientDirectionSnapshotTest.php +++ b/tests/Snapshots/LinearGradientDirectionSnapshotTest.php @@ -2,10 +2,12 @@ namespace Snapshots; +use Mpdf\CssMode; + /** * Linear gradient backgrounds run the way CSS Images gives: "to" names the side the gradient ends at, and angles point - * up at 0deg and run clockwise. Prefixed functions keep the legacy reading, where a keyword names the side the - * gradient starts from and angles run counter-clockwise from pointing right. + * up at 0deg and run clockwise. Prefixed functions keep the reading of their old syntax, where a keyword names the + * side the gradient starts from and angles run counter-clockwise from pointing right. * * @group snapshot */ @@ -23,11 +25,33 @@ public function getId() } /** - * A red to blue gradient box for each direction, under a caption saying where the red should be + * The CSS mode the document is drawn in + * + * @return string */ - public function generatePdf() + protected function cssMode() + { + return CssMode::STANDARD; + } + + /** + * The document's title + * + * @return string + */ + protected function title() { - $cases = [ + return 'linear-gradient() directions'; + } + + /** + * The gradients, each with a caption saying where the red and blue should be, grouped under headings + * + * @return array + */ + protected function cases() + { + return [ 'Keywords' => [ ['linear-gradient(to bottom, red, blue)', 'to bottom: red at the top, blue at the bottom.'], ['linear-gradient(to top, red, blue)', 'to top: red at the bottom, blue at the top.'], @@ -51,7 +75,13 @@ public function generatePdf() ['-webkit-linear-gradient(90deg, red, blue)', '-webkit- 90deg: red at the bottom, blue at the top.'], ], ]; + } + /** + * A red to blue gradient box for each direction, under a caption saying where the red should be + */ + public function generatePdf() + { $html = ' -

linear-gradient() directions

'; +

' . $this->title() . '

'; - foreach ($cases as $heading => $gradients) { + foreach ($this->cases() as $heading => $gradients) { $html .= '

' . $heading . '

'; foreach ($gradients as $case) { $html .= '

' . $case[1] . '

'; } } - $this->mpdf = $this->createMpdf(); + $this->mpdf = $this->createMpdf(['cssMode' => $this->cssMode()]); $this->mpdf->WriteHTML($html); } diff --git a/tests/data/snapshots/linear-gradient-direction-legacy.pdf b/tests/data/snapshots/linear-gradient-direction-legacy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aacf21efb1429fa363afe42262491587f0663932 GIT binary patch literal 54916 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 literal 0 HcmV?d00001