From 0ac81f8f695322ddd588570be97459ed48965063 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Mon, 22 Mar 2021 12:39:42 +0545 Subject: [PATCH 01/10] update image preview api --- app/controllers/api/storage.php | 25 ++++++- composer.json | 2 +- composer.lock | 124 +++++++++++++++++++++++--------- 3 files changed, 116 insertions(+), 35 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index d4500e95aa..efefdea5ae 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -113,7 +113,7 @@ App::post('/v1/storage/files') $iv = OpenSSL::randomPseudoBytes(OpenSSL::cipherIVLength(OpenSSL::CIPHER_AES_128_GCM)); $data = OpenSSL::encrypt($data, OpenSSL::CIPHER_AES_128_GCM, $key, 0, $iv, $tag); - if (!$device->write($path, $data)) { + if (!$device->write($path, $data, $mimeType)) { throw new Exception('Failed to save file', 500); } @@ -240,13 +240,18 @@ App::get('/v1/storage/files/:fileId/preview') ->param('width', 0, new Range(0, 4000), 'Resize preview image width, Pass an integer between 0 to 4000.', true) ->param('height', 0, new Range(0, 4000), 'Resize preview image height, Pass an integer between 0 to 4000.', true) ->param('quality', 100, new Range(0, 100), 'Preview image quality. Pass an integer between 0 to 100. Defaults to 100.', true) + ->param('borderWidth', 0, new Range(0, 100), 'Preview image border. Pass an integer between 0 to 100. Defaults to 0.', true) + ->param('borderColor', '', new HexColor(), 'Preview image border color. Use a valid HEX color, no # is needed for prefix.', true) + ->param('borderRadius', 0, new Range(0, 4000), 'Preview image border radius. Pass an integer between 0 to 4000.', true) + ->param('opacity', 1, new Range(0,1), 'Preview image opacity. Only works with transparent images (png). Pass an integer between 0 to 1.', true) + ->param('rotation', 0, new Range(0,360), 'Preview image rotation. Pass an integer between 0 to 360.', true) ->param('background', '', new HexColor(), 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true) ->inject('request') ->inject('response') ->inject('project') ->inject('projectDB') - ->action(function ($fileId, $width, $height, $quality, $background, $output, $request, $response, $project, $projectDB) { + ->action(function ($fileId, $width, $height, $quality, $borderWidth, $borderColor, $borderRadius, $opacity, $background, $output, $request, $response, $project, $projectDB) { /** @var Utopia\Swoole\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Appwrite\Database\Document $project */ @@ -340,6 +345,22 @@ App::get('/v1/storage/files/:fileId/preview') $image->setBackground('#'.$background); } + if (!empty($borderRadius)) { + $image->setBorderRadius($borderRadius); + } + + if (!empty($borderWidth) && !empty($borderColor) ) { + $image->setBorder($borderWidth, '#'.$borderColor); + } + + if (!empty($opacity)) { + $image->setOpacity($opacity); + } + + if (!empty($rotation)) { + $image->setRotation($rotation); + } + $output = (empty($output)) ? $type : $output; $data = $image->output($output, $quality); diff --git a/composer.json b/composer.json index 66bb66f518..f0a59f8a3f 100644 --- a/composer.json +++ b/composer.json @@ -48,7 +48,7 @@ "utopia-php/swoole": "0.2.*", "utopia-php/system": "0.4.*", "utopia-php/storage": "0.4.*", - "utopia-php/image": "0.1.*", + "utopia-php/image": "0.2.*", "resque/php-resque": "1.3.6", "matomo/device-detector": "4.1.0", diff --git a/composer.lock b/composer.lock index 8b29ae44f8..3108768c99 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "00a80774fb5a4984181b29f2f037a0e5", + "content-hash": "bce17bf8896e6b6571ca053b92768c25", "packages": [ { "name": "adhocore/jwt", @@ -364,18 +364,18 @@ "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "01129f635f45659fd4764a533777d069a978bc9d" + "reference": "98eeb955cbbe0e5d6f3f818e940c84f66aba427b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/01129f635f45659fd4764a533777d069a978bc9d", - "reference": "01129f635f45659fd4764a533777d069a978bc9d", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/98eeb955cbbe0e5d6f3f818e940c84f66aba427b", + "reference": "98eeb955cbbe0e5d6f3f818e940c84f66aba427b", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.4", - "guzzlehttp/psr7": "^1.7", + "guzzlehttp/psr7": "^1.7 || ^2.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0" }, @@ -383,6 +383,7 @@ "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", "php-http/client-integration-tests": "^3.0", "phpunit/phpunit": "^8.5.5 || ^9.3.5", @@ -459,7 +460,7 @@ "type": "github" } ], - "time": "2021-03-15T07:56:29+00:00" + "time": "2021-03-21T18:42:29+00:00" }, { "name": "guzzlehttp/promises", @@ -519,46 +520,47 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.x-dev", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a67cdbf85690e54a7b92fe91c297b20d2607c0b2" + "reference": "c0dcda9f54d145bd4d062a6d15f54931a67732f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a67cdbf85690e54a7b92fe91c297b20d2607c0b2", - "reference": "a67cdbf85690e54a7b92fe91c297b20d2607c0b2", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/c0dcda9f54d145bd4d062a6d15f54931a67732f9", + "reference": "c0dcda9f54d145bd4d062a6d15f54931a67732f9", "shasum": "" }, "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" }, "provide": { + "psr/http-factory-implementation": "1.0", "psr/http-message-implementation": "1.0" }, "require-dev": { - "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7-dev" + "dev-master": "2.0-dev" } }, "autoload": { "psr-4": { "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -573,6 +575,11 @@ { "name": "Tobias Schultze", "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" } ], "description": "PSR-7 message implementation that also provides common utility methods", @@ -588,9 +595,9 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/1.x" + "source": "https://github.com/guzzle/psr7/tree/2.0.0-beta1" }, - "time": "2021-03-15T11:15:53+00:00" + "time": "2021-03-21T17:21:36+00:00" }, { "name": "influxdb/influxdb-php", @@ -906,6 +913,62 @@ }, "time": "2020-09-19T09:12:31+00:00" }, + { + "name": "psr/http-factory", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "36fa03d50ff82abcae81860bdaf4ed9a1510c7cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/36fa03d50ff82abcae81860bdaf4ed9a1510c7cd", + "reference": "36fa03d50ff82abcae81860bdaf4ed9a1510c7cd", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2020-09-17T16:52:55+00:00" + }, { "name": "psr/http-message", "version": "dev-master", @@ -1692,16 +1755,16 @@ }, { "name": "utopia-php/image", - "version": "0.1.0", + "version": "0.2.0", "source": { "type": "git", "url": "https://github.com/utopia-php/image.git", - "reference": "66e38db211b1d6fe93de09d82606641e0f996e42" + "reference": "3b22910b0257657ba40e853918cb7c9d19fba125" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/image/zipball/66e38db211b1d6fe93de09d82606641e0f996e42", - "reference": "66e38db211b1d6fe93de09d82606641e0f996e42", + "url": "https://api.github.com/repos/utopia-php/image/zipball/3b22910b0257657ba40e853918cb7c9d19fba125", + "reference": "3b22910b0257657ba40e853918cb7c9d19fba125", "shasum": "" }, "require": { @@ -1739,9 +1802,9 @@ ], "support": { "issues": "https://github.com/utopia-php/image/issues", - "source": "https://github.com/utopia-php/image/tree/0.1.0" + "source": "https://github.com/utopia-php/image/tree/0.2.0" }, - "time": "2021-02-19T05:09:46+00:00" + "time": "2021-03-18T04:49:59+00:00" }, { "name": "utopia-php/locale", @@ -2304,7 +2367,6 @@ "require-dev": { "phpunit/phpunit": "^7.0" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -5959,9 +6021,7 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": { - "appwrite/sdk-generator": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { From dbac4083ad24574293490695431ba682e76b93e5 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Tue, 23 Mar 2021 15:53:09 +0545 Subject: [PATCH 02/10] fix missing param rotation --- app/controllers/api/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index efefdea5ae..9ba8608720 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -251,7 +251,7 @@ App::get('/v1/storage/files/:fileId/preview') ->inject('response') ->inject('project') ->inject('projectDB') - ->action(function ($fileId, $width, $height, $quality, $borderWidth, $borderColor, $borderRadius, $opacity, $background, $output, $request, $response, $project, $projectDB) { + ->action(function ($fileId, $width, $height, $quality, $borderWidth, $borderColor, $borderRadius, $opacity, $rotation, $background, $output, $request, $response, $project, $projectDB) { /** @var Utopia\Swoole\Request $request */ /** @var Appwrite\Utopia\Response $response */ /** @var Appwrite\Database\Document $project */ From 1dbe8f980c221ebaf064b53a9375c4629cb77071 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 26 Mar 2021 11:27:39 +0545 Subject: [PATCH 03/10] test and resources for new preview api features --- tests/e2e/Services/Storage/StorageBase.php | 67 ++++++++++++++++++--- tests/resources/file.png | Bin 0 -> 16804 bytes tests/resources/logo-after.jpg | Bin 0 -> 16804 bytes tests/resources/logo-after.png | Bin 0 -> 24911 bytes 4 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 tests/resources/file.png create mode 100644 tests/resources/logo-after.jpg create mode 100644 tests/resources/logo-after.png diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php index 2d660fe982..395eb8ce4f 100644 --- a/tests/e2e/Services/Storage/StorageBase.php +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -4,6 +4,7 @@ namespace Tests\E2E\Services\Storage; use CURLFile; use Tests\E2E\Client; +use Utopia\Image\Image; trait StorageBase { @@ -73,25 +74,75 @@ trait StorageBase $this->assertEquals(200, $file2['headers']['status-code']); $this->assertEquals('image/png', $file2['headers']['content-type']); $this->assertNotEmpty($file2['body']); - - $file3 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/download', array_merge([ + + //new image preview features + $file3 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/preview', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], - ], $this->getHeaders())); + ], $this->getHeaders()), [ + 'width' => 300, + 'height' => 100, + 'borderRadius' => '50', + 'opacity' => '0.5', + 'output' => 'png', + 'rotation' => '45', + ]); + $this->assertEquals(200, $file3['headers']['status-code']); - $this->assertEquals('attachment; filename="logo.png"', $file3['headers']['content-disposition']); $this->assertEquals('image/png', $file3['headers']['content-type']); $this->assertNotEmpty($file3['body']); - $file4 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/view', array_merge([ + $image = new \Imagick(); + $image->readImageBlob($file3['body']); + $original = new \Imagick(__DIR__ . '/../../../resources/logo-after.png'); + + $this->assertEquals($image->getImageWidth(), $original->getImageWidth()); + $this->assertEquals($image->getImageHeight(), $original->getImageHeight()); + $this->assertEquals('PNG', $image->getImageFormat()); + + + $file4 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/preview', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'width' => 200, + 'height' => 80, + 'borderWidth' => '5', + 'borderColor' => 'ff0000', + 'output' => 'jpg', + ]); + + $this->assertEquals(200, $file4['headers']['status-code']); + $this->assertEquals('image/jpeg', $file4['headers']['content-type']); + $this->assertNotEmpty($file4['body']); + + $image = new \Imagick(); + $image->readImageBlob($file4['body']); + $original = new \Imagick(__DIR__ . '/../../../resources/logo-after.jpg'); + + $this->assertEquals($image->getImageWidth(), $original->getImageWidth()); + $this->assertEquals($image->getImageHeight(), $original->getImageHeight()); + $this->assertEquals('JPEG', $image->getImageFormat()); + + $file5 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/download', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders())); - $this->assertEquals(200, $file4['headers']['status-code']); - $this->assertEquals('image/png', $file4['headers']['content-type']); - $this->assertNotEmpty($file4['body']); + $this->assertEquals(200, $file5['headers']['status-code']); + $this->assertEquals('attachment; filename="logo.png"', $file5['headers']['content-disposition']); + $this->assertEquals('image/png', $file5['headers']['content-type']); + $this->assertNotEmpty($file5['body']); + + $file6 = $this->client->call(Client::METHOD_GET, '/storage/files/' . $data['fileId'] . '/view', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals(200, $file6['headers']['status-code']); + $this->assertEquals('image/png', $file6['headers']['content-type']); + $this->assertNotEmpty($file6['body']); /** * Test for FAILURE diff --git a/tests/resources/file.png b/tests/resources/file.png new file mode 100644 index 0000000000000000000000000000000000000000..8928d11114a814f38df52268cc07396d0b4f5d83 GIT binary patch literal 16804 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 literal 0 HcmV?d00001 diff --git a/tests/resources/logo-after.jpg b/tests/resources/logo-after.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8928d11114a814f38df52268cc07396d0b4f5d83 GIT binary patch literal 16804 zcmeIZRa{&_^C&o2f``Ff2X}X$!QEkSx4}I?0wDy~!66XbA;=6)65QP(1Se>K03kqF zzJ1txclSQ*-Mjnt?>b#ay1S~oPj~&gyQ-d+pMC%c)Ra_}04OM^0I_EPJgor~pWpu1 z!heYTuTgj|{qzL@!~~cDX3kFLCINYnpstPW ze+WO5L_x#&@8|+B(J@}4qP@Vv{tsgn;Bzt>DjEtdCK?7N+H*cs6f|@I#*3FgOhN`C zVsZ*beqBSOjLgL)EKxD}fWTG+36p@Jf{phtQZiegh}2JCK|*?4Ppbgj=fbE!G$240 z@Rc_I_krVWpp({7qP`@!VY%kFs&te~C$`pCBJ2|`&Bz8Qy{<~#!s!PdT_-40fkT#E z4p2eBEs1h%qVcP==MQp>1KkDz_e@oh;im01+K#rpg`XPAY$s~(3BKTi*e5whclTq! zxdb|7B<2e8L^s#{p1?L`ToXux^c2k0@cUHYXwf#X#FhX?bSCdp=-gvz8g}C;I)<(r z$?r}?<-fQuNpCMnj>?bl=op8GyzVSG^E3(fUEPGVXLT-IznmlYY~g+L%7FV<=dZOR zrMB0|h|sZ$iq7`$`_~^1r0ae|ldi+$e-Bcf;%xTK|5v8}>Vp3o1^;g*LapYR=!(lS zZK@j^cSCDErO#K3M#~-HLwUC~j72k-sw&sV;$d;fEBmEZK3&qcu0Gr{S9-jpY2UFB z-@LQvLOos;9wPKBM4Xp8*YD9Q)9T$<^E?(fwjUx=9!#6Qj5DtmAreZwEC?C=5^?ju zFo?=KS+Bhzqtpw@ybUid9GZDI$o5R!2eoZ&yJ zM4?@g5_mvq&d5uY@{ft(wv@Ssl2(D8w}s7b5=6C6Vca9!-+CAEc7DP7uDe1y8va`R zn`l!$h!(!b(L46`(5}8J)MEdi0Uh<*s5g$3V|UW(|Ee~m5~U2ntW2K(6woICc-XD= zRWZ{kbKXDY-QHfm*_NNX7!67!|KC=~O3Hg@YbTlR2|z1bNOJ3N#T~ZYqaXL*z<}^^ zi*6;l>7TaV6QDX!n@O95&Uo?7pwSaxMu75E@i69I)$s|CddGXdAyg+3jN&%)UTbON z?D61aa|dtk9;)u6?$vPpF6e>E>(P_8zUE)nn`RH--Bx1wxA~5BX!=pt!J_aDT5CsP zy-QRg5-4fk1NG|C^S3~yIo9e!)Zyrh`C;-C7k*W;kJ@z~8|mV64dxNy!ST<^g`lq` z1W841r*`c>!UNu$hfQ&K(0`QQAQ2zYC3BG9x40S0wJHwospTHDh^=v`p!i%_ub8`g z`{HD|Ew+ekiwB%^edUf6splLVkoTfKceJCfYshYW~WAT7x!OI42MX>-ij`n^KGBT8=Sq z?@yxK^7!|GDwFjOGn?&7u0p;df3fl%tz2GZ%dN{Ra$O%Ad--L#7HhJaPLfN<5j$cx z>70B+l6XeiTr-za7p>73?K2ptHFB`p;0oaa;e1Al42#(o`xukV{i-Iy2j~zHb1h?e zvhpLzY68z0T+9#Q@l7Z36s@o2Tgf1-N=|%;#?$g2R|#f5ZjwVHeLnu5^x3xWTE=6@ z&|OHj5$h(&tW6t(uRj%uzGVBHa3D6wpMM}e$e&<0BtGf8m0(ByaFzd`ugO#5Q_-?A z=A3xJqJ{=wu;Fu~fkf5S)xW{uqv~!T=V*;PXK9--zMKx zM5cBiN%l;Rd;9-*j5r%t+eP*d{(%~2$(+V^0t$Mcv9Hf{^_boTZ@nhM!S=fkaJ*S$ zO+c<=mvh99nY}7XL?Mgt2r{TP<|9TCL`A{G-X}JCQHM*GXG;eRkg3|{Svyhf*{&=w z#BsQP$nX>s%p)ae1TCT@h~(EIGkQ z$cD92Qzt=7s4He}KHpm3O9fV9?iYKB+bW{MGTPz8)GroD zSiXrF3FXcxQ}Kq^Pz(ui*3nnhBo;ANRqNI9NfcgU8j=M6s1?3fVNb7_l3yt? z>JrMK+#R?7h3#+hCv9nm5u49ls`OuJQw85q`rpQcimQWZZzNGRE^gqO7e8ooqOH38 z39#GR>eITxHLFImzv9!P4%BBux`mF}!%-|^ClB)b12aBbq~y!#Knx(i1PBRI;hW+<$qrWjj;>3_US!v4j?x4lxNfnwKDXB$sg>ba-w$j9o zxj4G{w?8P8ABI8IvLXI!)f~aPuJs2=_C`uJBi$yvnL)ScddT69l{1k=R&1fQQJs%@ z6wzhH0>|1ML##kbet-7qNVy>5>K1ia63tbsqsEjAWr zpdNgR_$4e*>(#e1;jmvAmZjJr<->yQvj2j4Ki`^_V26p|h`4;kUzM|tDQ31~RYJ85 zQI9HCS=GUT+8|I|%u!tIUKv+4Lk7dMTS1RkzrEoyMxN+utfjwpobwKtpc$MfUw?U4 zH^_#YEq2A7ElH1Q?q38_@FJ*EfN|S~8q6O`vRYBSg!YMlo_HBplL55)N*kd31Q2KG zZ;k-(CikUA%)Z{KO=!F{QIB&8(t@YcfD=J{MVN7pNr)nth1#Xm=VmkHP|hi^HO$cV1YqUG z-eG^mL*$gc@xeF7-Q2{30muIHz0LYi*p%aq^`4L$&-wo6MOJ$9%_FF7_U+g zflnXF>QTUMD{;aZtCct0wfp@p<*v+{Z}P#@9}tqB#>U@iV$K5%~yFM2a6^DOTX_Gz%9!F^`bkTI@Q7qxe;!Z z*CBIJ(QF>#VU8OQVs+<(tg4+gbr!kVJLA-10w{wk3JKbAIk<6y+VbOluWVy;W8e*$ zl)EoJCc@DV6;RxE`YHr@*zt!Xh)iA9CCspNP8}+whV=IuwtBE4BFR%yID8qfu;Yq@ z4Y9~FbY-qLJtgM#a$s$12c513o`u+l{Sk532y=G+dTv!2L(ECJ;G#@IJX~UO7Tq~T zd>u=h%@Je7StU}V+q@cv=j+ti*vhcXalPFjD3DPi{%tyY_@|zRzw@Z!`?6>YJsIi; zlcDHPk#7c0cu)^Td`g~Cz?J>;`fn6e^8|?N+3+&|KH!PddWAd2wOE0!!eeaiapn28 z*aDns-=;C-u1X@VI)sAbx3?K`%km=w-4Qj^TSLd;hd`Vg2$MgUVjWXgv20O5t^}A_ z$Q;!(X=Q_??3-{1w+)OB*V{8tSP3@N_k*kzSNm-ML#jRU%Dl@ZL8&zMBFE#PXvt5} z+D&2mz#pf}4g)WN6(8LS%FT_|mDc%%VUv~$hl^`D{pe`=v)<{8xQdWsN5>b^!^19B zp{PT56e`ZGRBS(hKFoLJ%4j(h7}!h`g6V31r1pN|+q;VotK7ZJe;X_ppCKOe(r4K) zP?y$rMMQIH%+S~uSvPyQ*F-($Q0GCUw&~eEN|A-*hmm&R)7Lhk^6Q(%a6*8)dRi)D z$y7x9vf#w9v=?lFUG>!kFkrMaA7OCBPeSDwkpkCS`POtvL{0r}zs`LNXKYvzTVG7! z@(dWo*|#k6Yz^t~?2U^moAVU?Q~q-iX}^4)vV9vmMsr3@6Jg{&COyf; zpiHdW#O}k0B!>(zC=D0Ld#eN!w|{se{{)b|m>6xH|NnQ1?9fuCCG`G4Oko{{Gy3N8 z8*xjSsrD0KktqLw?%#vBOz+a)%_qS59dBCKer{z%%1J4`JzEb1M4}6M0$><`t$tO0 zJ&c(N9K3x31k{hqiZ`CW7IiY-n)DFAQ&qF9T!`XfVa(G=rn^w)YkrUC3c_r${%M>; z@S^d2+e+0uWIFOTz`_zDS`hY&1gyuh(^yTvW}Dxi7jyS=ka( z=#@e?=LmE)021NeSG#X)&_FM z=EtMir%0LVnnYYpWMp|MPj{5V_aD}}o9?*Y)419#E}v|0&)_o=(rJ2z&n436&ukQ> z~FN*@7LPjgR`*0XSC z#-E^(l|V5sCiy&<4E}9HQz9sG%9XeZ)Lj}G^QxotDoHG8XmO&#ZuWl7=)~+R4__$r zD6YP;dJ>|)HN;0n#SH`;ag*Ui;U=)bm74S_y&ERZe-{0d`tsQF16edT3px?g5b(c0 z6!c;^$P8R8UHz%1J6%qG*E15Ad2ZqH3-vL^UAM&O?cae0a`_Q{i2m>`m-a#Z!}UtR zWtYW#2#M0jK0Fnfudo{5yEGQ|vLTH@#|gXE^hRcAiP9R!#C1%Mq$mJVMj&vNx?2YO zhpiLjM>?!*qdFW#av%(siMH^hx3u)n1}EeqJbU_e{Q~!4biU0@gxcryzKpyOh{a!? zh1p(Q@`ZTT1-3MScsJ2_5!RT!j&~fxe?AR#j`X{i`9{Ftqp^WtQKxi#mBi7?dyN~% zsMTyb52hj-xrVtpl_$U_zbd0aH#{;gIMxutAff2bADR~N#)mv=8;>*2YBBZJr-++7Dxz{$;P6(*tZfnNUmq8S;@N?RfvYQvpes35iw=y={ zea`UCiEJNNOm|OH6whw_Kv%Sf{x0>Se<{NY?fssZ&lOsFd{tORc;fwA-!eZ!=}|-< zf}4f?B4$av5PCu?u5XokgD>enHGEg8nF|^J+ZTZRzW!tI!lk9z8o7RPNcO_rYoY(0 zYq(LRe8>*z@(ZvAl<-jB0x_hZ8;do3@fL1MQoRI`sH)&8FrR_qc+MU}qgQMe8Wj~& z8*Ter6ld7B|A9EJNmEf6A{jVmKD`j#am2#~X=s_eN|n%9IQX@b-06gbglq!uxY4ul zBIJ#u%t>>#-pb=Mg5S;$5AK`t@PgE!R=uR@K<6lH1=x$pEQ zU$-4k@+_gMekVZA4-pwK?k9r;(9@*9kr`=?7aV3iR>r%PRu~`Vq5M#0I*~#6=rfzIE~hAu=*&*HLY~PNGGcl1~h% zi{8)*ub0IE|GKLXl}C_oJaa($P>cd$BMS{@(va~++Si2MwfOMH@`pk1C&0*q(L?qr z)JZO!z66Cw4V*US(ySF93C0glZ7fO5K8s`DU3<_CDyPcXHQOnZ7>RcEA5^jt)ox^` z%!t?%ZBjKQiG*ePIWMV8e9y0#~=f5z16R;1|61nJ8{cGrnXY^)5%MNz!togfba6HF!;^50%5;Ahss}`@WXk zDPmYMA<0wZTQ^d`e+3x6YjJs2#4ic`BR&&ftGrp5x+5Mg9;I?&?*IKPgZWgNnV!~R zUukowyvl=Zn^)ij9GOj2Qr-fclM$uH)Bsn7uRbp}m+?~Mn zRf}?yH&t*4UO{{iN^&5QFX|la@tK2WWn!9HBh>t`cXrE%kmGcRfhoy7rUq%>yVa66 zA4I-y^VYQjPsG6eY}LDr+<$U@g%U@40UuNqVCPW&U__g69sSZH5BvNL-cZUdJI~Ba z_J*wMtz$qcw)3CxUZdEhUoYtWx+IwOsaZNn%GIE*eZ2gs4TBZj+?>#Oe;DWJpMRVu zLT6o(ei_=NRBFS1TJJ}>>8l?{C8cT*M>V}x9P{$?!G&k{k>IGh1Jdmb^VgG zYCPbC@P9^k9m8n>i5*Eh{290gV2sZ~2lA^@A!KvbuLA=1q7a+4^QRV?g^_95^#(+g zX{W{%#@vkZnR=i>9`5KO2Ib64ZAKY6#P`%MKSWrwb;X-jPT%w|s)$`6X-WwBV7eqj zuUdAwGcZHt_rZn`gMACc{hl$A*&~xei8UD&DX&xSelSM;9zNdcU%iER?q~wjkL`RT zivF=l?Y?c2Xe|lzm9^xMQ~SL2gl1E_&LiCx-d5fc;^hn}9pX64h?)Tk#?+0}Aj+}Z zpcFd(MRJ=A;vE#BEpeJm3jI-EZlPHLILnrJipQf{QeGt*!79We1&(0_6Ey&9IS?OJ z#^g1CYZ)p6M}kE$)>W+zaNI|SoA7kICX;~{n294@!if`U>t5bN8m2En*#b#oJ2A^2 z#B&(amczgJyXg)+maQHu;o|;vrgF6`uy0T3M61bU)VIy>$Ze_@fii9lFVaXk!ig|# zPS6*LXG!--E^Lz=dL%4YV)8fOX)mca42^TP{l*+N$n2N(?F}yd_8=<)mRW9E{;W~d z&3ZKHZssK~B2vt}Z=)B{Fe***j3oW@9loB^<`^nwNZ zM#$MkmAX6$nzU#I;#X{;z3(cxeKxuab*O$ahIfGf6_Yt714BNC-NT2MVKNrPm0q2I zGt4ZJa?#OBH(H~96~*ytSJX(AxKa=*P6s1f`B6sd?{`UdoG$o)CcuO6q{!cqG*AtXQs)^yK6^m0~Yr6{oJ6_~d$jq0!^fbZIfMfs7OQ zdC%WIn&<5#I0u72XZS~Xv6X}#t$b<%;Aa4U)}-8uCZXyoKMVnNSe#38z!=&<3hYMc zhL(`Ig0L~hBkkI;7&(AGSA-nF>R||j`c{9vvG|?b8MtX`VZ5Kq zlu8}tV$8bWm>phGps2K6T)?0pe&Y$8+LZ6kA7z;OgUGbu;3vNLQG8`IUxyVHs7)bJ zu^*uzhLEA94G9T^(7-JAoVkQ?;iN7Ft;@9O4zY$ai5P#2Sih8NX22r*>L}N?GKGY4 z>qpLBCAI;1^vw!~wfhr31(ykb?8uIWgeasNYY4LaLAT|>=E2QQ*r6*LJ&EFbTL{e{ zvATVm5k*fF!OY#$H=^hJ-VpAHNkCGxB3ofCuWOM31V^AprHA#u*GbhSA@fuFL2&s{ zzv(4eYaVxre2Jxc>$qONp7Sw&erKb2oi3g79P78%qycBTp52IxDw4|J`9!FCj|KGe zov=-cLH}O3&!z@E*SiJrdy6>FeZiutNiV^scSs$L6gcbV!rgLGav(9sg=lF?PK}AJ zOK4BP8;n7$D<=Q`?(9-+NRrH@q{Tyl`E3kZ->gTEPf!mup5viBze!eJ@jvGCn0F(2@rHK#JcqN34nZ# zvckcW42p!PoACa(h{LYZIL@ZWv8MX5gUX_!&9C<|H}!qCYt4Fo-|hOAv?xMpa_H#7f#p=n_%o9ZZWN0QGo2ub3VX zBMT7k4;e%Q2HbG05JvwsTSJQ0^zF-_l5d~g&$aJA9@GTMu)FnLvuY12YJ5M>JP9jK zv>Us~zO*E67dnBkln=Pi40y$6fHDZovN8p`Yme|N>b1>PHgb#D)<9LaSl~tO&xo8g zhd2%EY29KuxdL`xZc)&<7aHQ*3!2(Wn>8cIAZeF5_Lf`ROq+mhOj=D`VjGJVWl@D3 zOeF@cql*C~Dh`%vjpEK_uD@$tU9oo4Y7QpiCa^QHA=w|`8H0UZwUMUJNxGgrAf+ZZ zI`mM7|Lo9~a8By5O+Jh4Km_7^E(<6OSwZA7ef-d1t-~>2sYmUy!+0co-d`*(kc5wX zF+Ls(8P*sp@~?`BPtoD#o_~?G@q>(F%qw&EJ%nI|%Gnq;(72hE=U|}7tS10A1nWIZ zZ_W-pj9Et^sAlaSU3HJJB}7K>um>I%k{0&&u#R{j3O}a%L57J75&E7&7mf3EeV5=MbPAKe0>7aVjY7Cwh6FT|@*C%IxO>U{b ze)4%F!@FwO=A~R_}#;KcFV2MO?CQoNJw3w^R{A`v8tWPK9pN=W> zB)eH}yB55h3wC;()i%Vkd;&NJ4K+upkeFhFUuf|1B))$uc&9HUw|9X-$u=D`XLHu` zQx_Hh)|xLV3MdHJkW&d{-h+@BuCbZB=d;OjA3yd=FT{{$8I&jGi$;D8xTU~N9T@tw z->~uKok*W^8A*KKg@ZUv)XR4Jj#Z|Q%39Z#Pk>?$nk&Y0z8bN6>3iL7hePwe1_z_eJa>De~h zWyj+qsd$1fJxh9diXG^syf7kBUgY3E0d`QFQK^<&>jvUOAqjJY%ieGK$t+dQ8o_xf zzHBKHQ!+<5+ildNIBl18zTB@h3C4wM^z$ZssB1JXYgp|3ny1=KymiMf)_bU5QaWNR z47*Pu*K19gbb#5$GEJ~R;e`JEdn{Jw;*kxEvVe=uYR~5Gbe4}i<7qW7>#p~apD67& zv~{Nqd18ZY((R-X=8dbhvzV}z9Qho%AgXa297_vz26F~5yeTep4@O5%e$q5rB}(zp zPhZO)tnWX2WFHfY)cm*G7gA7Z0t%Bt9-gH(hrcHH5R#hZU>cxJ5$}H`F*1wtHS%)R zjw-^n$#fftj;YnwP_tf75Qo~%g#Xu{Vp$>)>gO&^L8Y;xo5?eCKAcxy+`Fn?ve!=e zxS%j#A$+}%!VHL){*&fQ;#xPQ+)gKu!st*kPAaEo!m$FwszcA(X7Y@k%H|pHpLO#g z3m~KLMvpSi&@m^1DC`lEKokh4LT*LXJ&|=X1OAMb@-Z4MhlAOZL(N^5qk}5%36GPR zu0EfX(1`PuX(X)g>%r2_-Qfat$1Hvn8qy>;`A#gH9a*2Ldi~wPkSiu3v`uBsE9{&s z4Rb>3(A%A|0OF{S?UkPI9%3(qFhnuYCR_0^sAc=oK4+wiX^JV98Y3y)+cic$ay8B? zurdue3)_1Cd9L+R zu1UueI|HFSZ^a@$Yh}PFwKJEw3lZQ6=)-&sI~aEtW-wQCru$S=g zoeRdSR#sOh8~!Ub5G1@}Earu%jjl6a04r84;vK}2D%3hK5K6kvqx}8v?J~k(Io4x} z-aM1+43Mzc%r%Qa{#+lTLnZ8J*6!g=X@+d1AFHMRWE4pLHI*S+!@e8OsA?iPgVFMJ zXWo(QWLrKqC5ygwGkXcOmdP8gsEqJn2j|Tk7gnwl1s4pfgoM1%{+PHQ)i*sdYpkN; zC*43pq6&-Sn4g6}FD`RU2ean1UhxENkyJSJYzv!ej?Qrar1+R^h={wHs>NtE?O(>r zhf$}g&fuyqh82X_EL(Ujc2Yot>EA5SoX^Wx%$~4L%p&?!7OX?J$m1@FE5&HR4 zaJu#`QOcI@;P^rh$(4D#rTnHtSMt*>d_rgX7Dx;<1c5hH4Th0NaaBfIoc_tA3$?w3 z8bJGUiVxeLPerCP+{35sM9gPXz1_Jlr2u|I~t` z#C9SS(wfugGA3w0NwLUSB*q8V#dNr(-RI;l+!UEOV=hmC`SZbj{pVW`Y#DZG9q8m2 z^U57Y;M2zA5t+nTefeAah^Ff?;L@0J``oON#>Q7O9wW~$H+!P`p70FG$u%Zx|8V)a z*2adp`c@@PE`1XA+Y>I{+d}!^`MeWVKVKy(k|cq~zGX6Y`|5u$63loCESkXW_+8Ld zrSZ}-SX@RCPf!3mXN=+(gStQWKlcWyIgt(a<9YGAx3vMfa4+}(mN?$5MMOx0qBd*R zzl>YW>l(mdo9O}`Tc=isaL%5#gO=$wze5ho_rndFWz+W?WJX!-#Z?78YGO%@H7fLF z9bz1CkCWeH!6!7wb&`<9cnoXl97xjJWERp{ug`5?7xe85-!}G>a9~Zdl%S}SQ3zu3 zM@%bfHp(S+l=Y1IZNT)tXAXQrX-RIOmrCMzWi;Q8Yp4^2Ak^jOMuPVtmu2Q+f!k=B z7ck**At&S0z^q>nX@;}&s!`)(VS_K7HF7%Uez0-3 z8E)Lqg>|m>bpDLI5zcJYIh|~7^7fo(rBpdn8O#PCY+CEeR~K?7ZOUv0fOJ*^QQ@XJ_{)s$O-E-HyP*Y+$cQ)yZ;m%yzrMDbB5{ z>9$^~jEQ(3=(ZOjAR3vh*)lB!A%xlKV z^}zN^y&KKQ=j+MmGrN&@46?pu%kM}B_)hG?^;w6T)q>mOfqzCfg@WdJkeC{s*#cHS z91tlBL@7;J#p^D-%1Oh79>-ud*T@1Z(v1IIXTYIxo#Rs6Gdw$$dut)CZlX+#2FIZ zO5k2c*cPu|3uWam`!OHha71rN`T zQ77SGORHnBnte_Ri;~DEMaNlpa7$k^Nb3;(6|@kBg^c>E;dV^^TT?z8xxItnsjgds zU=eB)Kl(sU^uAP^ANlMleVWyOB_+t=?lO(RmmO=e>@tHQ{;3eqO*82_4ueDf{Mh6< zs>ZGyZaH>TT!PP#*@AiWB@lD=U%TsXA+;UB`=M4+6h6q0kmlSLPFjym{?C{;Yaan9k1 zxeArbrj1(7EA^UwqinHuh%!RIe5^1EbXOH?ipEk=KB4Fe)kx_1}79=ZDk#Wg2$Fe(| zZw_& zS940R!WhMQ@=o7Z>p?Z@mwH_`Dt@Fdy<6=lU@DVD`Ff%-WXpl;y4aV43@l2Tnb4gM zj#rl5L}R;a^>?(l^^_y2Youdg3tVSEU35;8(DUQG8jqoDH9n-`jVDD6mikycT`U}x z&MGxlHM064eSRM&iWin1RmE+fD-3tGKXo+;p?AhZS;=ymm|XGImOf=2LA!0+&G~I* z2jUmvu(v;Nk`xo1dXChl8LRIM)iZ!th9UKboef!G$9s9u>ttF4bM8pB_yS^{VMP=p zA=;&>Plb(b-8Rj$n;2aeT|uxmhLI5!f5f82E7ZTjR1EYDj;GSrm>RIJSJU7(;)u#5NIK?zR2?0M{?NNg|{FQ_}dmxSA1REKtnVuWPcMK^5%Th8s6I_mIXmo{KtW+M;#EP6( z3ne0oE*suYhjdS{mR?(a3W0Spb*!f1Y5Rl~k&(`SE7sW-q+fS?Px*tLY5d~L7*~eq z)?HTv-Iyb>LoA_`gOIn0GgKeEr?97q+}jA)oalH06!>UrjepP;CK8_fwr-R%)+Bzr z)tdh)*Ne~vwNx(?cZh;xlhycrw9f6}Ds1r_(aSx!{_Em$9X9of?iF1`knxA)gRPyd z=d1A5-LEN*uFW5ny*CC{kH+Zy2WWUV&+%dXTS?Dm_}V#g)8uvukNPIE(%f~*)U>5~ z33=l&r#cQ1$4`MS`^IE@02MpD?-+*RCBM#8m={xAoA*m~FOuKEb!@pr3Sj2SBqIX$ z9`DAQWSmu~*hwE^@;v9>2*6C$jr=LPHG54wHCL&d%F@yL8e5Zgr$07n6C>cLZSkKd z1%!y;ow{*F4m3ommVtlM>4TvrJ^6b7V<^fx$NV=goOKzJ^{C$wOc_-9x2O4^0Pj)SiK zt$uet=6NMg;kwJ?#+E1qp#t0poUcuJ&TR6L_sCb@31Q={kyiC|e=R3!BSO znEexoRpprM*D355*;bO}G6iMoO&+)7NEk2A8>CJ8qh7%OHU;mihuK@J*eV{diS;a& zzsg$Rq5Ar%hxf$1C>Uyvkoo6Rk+=V zQ&!ty#VB-(jGtmTA~fmV*J#!{&07ZjaiIYQIViAzL;0epvC}4B%_+#1;x+^nS8$zK z+^1d1GFXZprLdee>4z)rG(+6!1{Nl9a|7-$==Nddd^a8*o#n@vh;A&N@%;3? zZxNrX{$7TRxi_dp4j0DcBvhx;&}1L<0!gn%GYBjAx{T; z=lxX|ygtxMykhV!+@3o_f|sw!rCcfMtv;9dsC>1@3@D6Ly;PM) zCK0-Cxthh!EV`oUPKX=hJ#6{U$K2Wz3ZUZJW``64F*v*E}zxO+k>TN^q-3 zB2!$6X|AUw8b8tkRm0lcvaq)`wN$2IR*LlA6-~18L09rLPsW*8XEr;nA+~63S!eT9 zvaxbh_LJI?67O0oxs@*F(KrlrNgO}ImLfJ&2^F2L#IR?h`UHZI0SQF;6<(V>n{ecU+$UPFy}M|0V>e zO}A1CdZkBr^bN~5J@m=D7pI()VF_=~U1-tx&v>*`s;CQ$q2b^UGv#Z5ql^x&QpWYL zaQu&c!nBkV_L=k}D^@aQJk6i$=PSNN`H1N$+NxCk^}U4UhZH2*%8w6j{5G-KmXZce``~97qF)7~QG5)iJn-unO4y*EJ zSsKocOwgts&Q0~E@N8umPEhMbVwONi_r(eHtlRKkS>LD}^bN`4`@;VmY)yJ^35?1#gJ(=^thjA=0{|$ z29iTpeB@97l`N3?J*zD(KN_q}?ST#I<9*w|*%~+-b0&z*DQCJnrA{ z!Bn*-`aGT9&NX=t_BMO<_u?&a))um|O@w1qi6hJ@T~*sm5W6fdUt_B8j8R7L8RVfe zBYr8eO5B5O5WoIX{{j9`T2o+@LuZ00^62ghSs)cHkf7(ztS)}MUz+Q*Fi*rM%2Llu zIXy#L{Nv=Et!pi@THSI&KKcZ(!yAOhn)&bv!PvO3X69B;CyJrHdJ3%debsmX7l-XOuKr2=V9hA-;^g?^Uzf_{)(JNp>xMWIg>j@hby}- z+A$f>e{mF%rAIF^AP`5_h@vc^c3EC{L6`o=#*p$DSCTGu)sw!hj|XeFu6(}0yrk(B zhr3iK%Se;YNl6o|>Dl@=kI|=^v3xYv=yw)3U5K7KJgpRzn#v67-4J+Tovop~8&J^v zlZ)DmnW@|bWbS2kiatRWtJ659A8!s;Tf91eUuKbG&tK>jgRm4V^*&5mFlwNeQn0R% z7NlUY6Abi7crDUob5vJiKb!wo$NB4N#u`@`f)3U93=TWX+*Gdy07`x{q-$|wwt}FT zcYIc+IyvZMx+s-;8TNhd0hmoBR@P8|gLy74J|+=zU7-Anu?UIbNTo=&+D^*lQ)P+i z6TUU>cG~IU7PJ^8QYt(AB8-^KJsO1a$r*A^8(vs72?jXgng{j(#^^qNq8+-n=#6E)oDTpeIyV%fSSv28ZSq z7Z;!2dhXsM8a~&Hl4~i4(0mJ3wz*aI5hu0JK7*X~q;+Pm_+drC3m@Sw@*q~_lsUhK zTKR9-l94z#_H=7BA9vf zsL#JJhApP5qkc5cy{eaY5y7H%cx3*pyoNO2i{$SKo(HxqiR&_(Fq`Fh%#R!I;(j<2sj_w?-2V!r zQ2NmUQus+pAriA1mx|84Q}cmqGj;^= zHsPcv09yrd&4VbV%P>rt?Nn7T4IfQYTKfAZ+U$FWmGg9A?ZuC(lYbLse#b?yY1|v-I=1(% zZ94H~WK+`g?t=y+$XN-FwOY1U6XWHYOzEw*$Kv0_`+JYoLVbawlBCDAiU6@J)Bmf_ ze6Bh6FV32Le%J4ij|c6f`5PyvtOv6JK4gbw0^nd2b_-W;T1L0GG9RL6T literal 0 HcmV?d00001 diff --git a/tests/resources/logo-after.png b/tests/resources/logo-after.png new file mode 100644 index 0000000000000000000000000000000000000000..d308043365efe54f4f0bef4c266ce860f9e60741 GIT binary patch literal 24911 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�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 Date: Sun, 28 Mar 2021 15:59:04 +0545 Subject: [PATCH 04/10] fix docker-compose conflict --- composer.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/composer.lock b/composer.lock index 2d9816605a..beb6e14fb7 100644 --- a/composer.lock +++ b/composer.lock @@ -3510,12 +3510,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ad069801f3d0cdb7102e58afd5f9f32834ec7160" + "reference": "f6293e1b30a2354e8428e004689671b83871edde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ad069801f3d0cdb7102e58afd5f9f32834ec7160", - "reference": "ad069801f3d0cdb7102e58afd5f9f32834ec7160", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", + "reference": "f6293e1b30a2354e8428e004689671b83871edde", "shasum": "" }, "require": { @@ -3571,7 +3571,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" }, "funding": [ { @@ -3579,7 +3579,7 @@ "type": "github" } ], - "time": "2021-02-08T09:55:27+00:00" + "time": "2021-03-28T07:26:59+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4997,12 +4997,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "5da8b675121f9f4419b7052caa0cc6118a3ccd47" + "reference": "fb7e2447d39984358343685fb9f0e800cd79e6a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5da8b675121f9f4419b7052caa0cc6118a3ccd47", - "reference": "5da8b675121f9f4419b7052caa0cc6118a3ccd47", + "url": "https://api.github.com/repos/symfony/console/zipball/fb7e2447d39984358343685fb9f0e800cd79e6a3", + "reference": "fb7e2447d39984358343685fb9f0e800cd79e6a3", "shasum": "" }, "require": { @@ -5088,7 +5088,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T14:20:07+00:00" + "time": "2021-03-28T09:44:11+00:00" }, { "name": "symfony/deprecation-contracts", From d10c758e80c6c9951471432b3d05840486d5c20f Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Sun, 4 Apr 2021 14:25:03 +0545 Subject: [PATCH 05/10] parameter description changes Co-authored-by: Christy Jacob --- app/controllers/api/storage.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index ee3c68f1d6..04ffce09ae 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -242,11 +242,11 @@ App::get('/v1/storage/files/:fileId/preview') ->param('width', 0, new Range(0, 4000), 'Resize preview image width, Pass an integer between 0 to 4000.', true) ->param('height', 0, new Range(0, 4000), 'Resize preview image height, Pass an integer between 0 to 4000.', true) ->param('quality', 100, new Range(0, 100), 'Preview image quality. Pass an integer between 0 to 100. Defaults to 100.', true) - ->param('borderWidth', 0, new Range(0, 100), 'Preview image border. Pass an integer between 0 to 100. Defaults to 0.', true) + ->param('borderWidth', 0, new Range(0, 100), 'Preview image border in pixels. Pass an integer between 0 to 100. Defaults to 0.', true) ->param('borderColor', '', new HexColor(), 'Preview image border color. Use a valid HEX color, no # is needed for prefix.', true) - ->param('borderRadius', 0, new Range(0, 4000), 'Preview image border radius. Pass an integer between 0 to 4000.', true) - ->param('opacity', 1, new Range(0,1), 'Preview image opacity. Only works with transparent images (png). Pass an integer between 0 to 1.', true) - ->param('rotation', 0, new Range(0,360), 'Preview image rotation. Pass an integer between 0 to 360.', true) + ->param('borderRadius', 0, new Range(0, 4000), 'Preview image border radius in pixels. Pass an integer between 0 to 4000.', true) + ->param('opacity', 1, new Range(0,1), 'Preview image opacity. Only works with images having an alpha channel (like png). Pass a number between 0 to 1.', true) + ->param('rotation', 0, new Range(0,360), 'Preview image rotation in degrees. Pass an integer between 0 and 360.', true) ->param('background', '', new HexColor(), 'Preview image background color. Only works with transparent images (png). Use a valid HEX color, no # is needed for prefix.', true) ->param('output', '', new WhiteList(\array_keys(Config::getParam('storage-outputs')), true), 'Output format type (jpeg, jpg, png, gif and webp).', true) ->inject('request') From 7b81ce2550f72f8bda9c1b0c2692d852f092bb56 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 8 Apr 2021 16:42:30 +0545 Subject: [PATCH 06/10] updating cache key --- app/controllers/api/storage.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 04ffce09ae..4e6754c586 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -278,7 +278,7 @@ App::get('/v1/storage/files/:fileId/preview') $fileLogos = Config::getParam('storage-logos'); $date = \date('D, d M Y H:i:s', \time() + (60 * 60 * 24 * 45)).' GMT'; // 45 days cache - $key = \md5($fileId.$width.$height.$quality.$background.$storage.$output); + $key = \md5($fileId.$width.$height.$quality.$borderWidth.$borderColor.$borderRadius.$opacity.$rotation.$background.$storage.$output); $file = $projectDB->getDocument($fileId); @@ -298,7 +298,7 @@ App::get('/v1/storage/files/:fileId/preview') $cipher = null; $background = (empty($background)) ? 'eceff1' : $background; $type = \strtolower(\pathinfo($path, PATHINFO_EXTENSION)); - $key = \md5($path.$width.$height.$quality.$background.$storage.$output); + $key = \md5($path.$width.$height.$quality.$borderWidth.$borderColor.$borderRadius.$opacity.$rotation.$background.$storage.$output); } $compressor = new GZIP(); From d82bb692b2e92361b34d8c2275d8c52ee43391bb Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 9 Apr 2021 12:49:46 +0545 Subject: [PATCH 07/10] fix for border with border radius issue --- app/controllers/api/storage.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 4e6754c586..8401c93541 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -346,15 +346,15 @@ App::get('/v1/storage/files/:fileId/preview') if (!empty($background)) { $image->setBackground('#'.$background); } + + if (!empty($borderWidth) ) { + $image->setBorder($borderWidth, '#'.$borderColor); + } if (!empty($borderRadius)) { $image->setBorderRadius($borderRadius); } - if (!empty($borderWidth) && !empty($borderColor) ) { - $image->setBorder($borderWidth, '#'.$borderColor); - } - if (!empty($opacity)) { $image->setOpacity($opacity); } @@ -367,7 +367,7 @@ App::get('/v1/storage/files/:fileId/preview') $data = $image->output($output, $quality); - $cache->save($key, $data); + // $cache->save($key, $data); $response ->setContentType($outputs[$output]) From b7920ab26cfa186dbe8d97961b974789c5cb3ea6 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 9 Apr 2021 13:27:45 +0545 Subject: [PATCH 08/10] fix issue with opacity --- app/controllers/api/storage.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 8401c93541..19e7302113 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -342,10 +342,15 @@ App::get('/v1/storage/files/:fileId/preview') $image = new Image($source); $image->crop((int) $width, (int) $height); + + if (!empty($opacity)) { + $image->setOpacity($opacity); + } if (!empty($background)) { $image->setBackground('#'.$background); } + if (!empty($borderWidth) ) { $image->setBorder($borderWidth, '#'.$borderColor); @@ -355,10 +360,6 @@ App::get('/v1/storage/files/:fileId/preview') $image->setBorderRadius($borderRadius); } - if (!empty($opacity)) { - $image->setOpacity($opacity); - } - if (!empty($rotation)) { $image->setRotation($rotation); } @@ -367,7 +368,7 @@ App::get('/v1/storage/files/:fileId/preview') $data = $image->output($output, $quality); - // $cache->save($key, $data); + $cache->save($key, $data); $response ->setContentType($outputs[$output]) From 6c8cb0545b37e56702e32e60b2684e5d59ac8c39 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 9 Apr 2021 13:41:49 +0545 Subject: [PATCH 09/10] handle when opacity is set to 0 --- app/controllers/api/storage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php index 19e7302113..820cc4e394 100644 --- a/app/controllers/api/storage.php +++ b/app/controllers/api/storage.php @@ -343,7 +343,7 @@ App::get('/v1/storage/files/:fileId/preview') $image->crop((int) $width, (int) $height); - if (!empty($opacity)) { + if (!empty($opacity) || $opacity==0) { $image->setOpacity($opacity); } From 1f37f7da299d732b21c404036ac05f4257eaa490 Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Thu, 15 Apr 2021 11:55:39 +0545 Subject: [PATCH 10/10] composer update --- composer.lock | 164 +++++++++++++++++++++++++------------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/composer.lock b/composer.lock index c535eb3803..107f1063f9 100644 --- a/composer.lock +++ b/composer.lock @@ -1755,16 +1755,16 @@ }, { "name": "utopia-php/image", - "version": "0.2.0", + "version": "0.2.1", "source": { "type": "git", "url": "https://github.com/utopia-php/image.git", - "reference": "3b22910b0257657ba40e853918cb7c9d19fba125" + "reference": "0754955a165483852184d1215cc3bf659432d23a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/image/zipball/3b22910b0257657ba40e853918cb7c9d19fba125", - "reference": "3b22910b0257657ba40e853918cb7c9d19fba125", + "url": "https://api.github.com/repos/utopia-php/image/zipball/0754955a165483852184d1215cc3bf659432d23a", + "reference": "0754955a165483852184d1215cc3bf659432d23a", "shasum": "" }, "require": { @@ -1802,9 +1802,9 @@ ], "support": { "issues": "https://github.com/utopia-php/image/issues", - "source": "https://github.com/utopia-php/image/tree/0.2.0" + "source": "https://github.com/utopia-php/image/tree/0.2.1" }, - "time": "2021-03-18T04:49:59+00:00" + "time": "2021-04-13T07:47:24+00:00" }, { "name": "utopia-php/locale", @@ -2276,12 +2276,12 @@ "source": { "type": "git", "url": "https://github.com/amphp/byte-stream.git", - "reference": "f813a658f0446192c5e17f96727070ee9342b93a" + "reference": "7a64a9ad336fc5e1e70b1c1fc1e9618a7027332e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/byte-stream/zipball/f813a658f0446192c5e17f96727070ee9342b93a", - "reference": "f813a658f0446192c5e17f96727070ee9342b93a", + "url": "https://api.github.com/repos/amphp/byte-stream/zipball/7a64a9ad336fc5e1e70b1c1fc1e9618a7027332e", + "reference": "7a64a9ad336fc5e1e70b1c1fc1e9618a7027332e", "shasum": "" }, "require": { @@ -2346,7 +2346,7 @@ "type": "github" } ], - "time": "2020-08-30T19:23:04+00:00" + "time": "2021-04-05T20:23:22+00:00" }, { "name": "appwrite/sdk-generator", @@ -3587,12 +3587,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "b2ce4cf415b9989fac88e8c27c39b5ba2faad72b" + "reference": "97eb187efc3560da69c5b501235cd3eb1ebfec86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/b2ce4cf415b9989fac88e8c27c39b5ba2faad72b", - "reference": "b2ce4cf415b9989fac88e8c27c39b5ba2faad72b", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/97eb187efc3560da69c5b501235cd3eb1ebfec86", + "reference": "97eb187efc3560da69c5b501235cd3eb1ebfec86", "shasum": "" }, "require": { @@ -3640,7 +3640,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:19+00:00" + "time": "2021-04-02T08:22:03+00:00" }, { "name": "phpunit/php-invoker", @@ -3648,12 +3648,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "e2905d5648ac5e9bd0aa85b50d240e5890f76493" + "reference": "de89b92643f75d97135fd0f895d4369630952c95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/e2905d5648ac5e9bd0aa85b50d240e5890f76493", - "reference": "e2905d5648ac5e9bd0aa85b50d240e5890f76493", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/de89b92643f75d97135fd0f895d4369630952c95", + "reference": "de89b92643f75d97135fd0f895d4369630952c95", "shasum": "" }, "require": { @@ -3704,7 +3704,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:27+00:00" + "time": "2021-04-02T08:22:12+00:00" }, { "name": "phpunit/php-text-template", @@ -3712,12 +3712,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "e6a2483ffd3659d723996fb8b2ca638244b87e7c" + "reference": "f46a87d94ad351b46c836f6cdda98795e8a6c979" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/e6a2483ffd3659d723996fb8b2ca638244b87e7c", - "reference": "e6a2483ffd3659d723996fb8b2ca638244b87e7c", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/f46a87d94ad351b46c836f6cdda98795e8a6c979", + "reference": "f46a87d94ad351b46c836f6cdda98795e8a6c979", "shasum": "" }, "require": { @@ -3764,7 +3764,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:59+00:00" + "time": "2021-04-02T08:22:46+00:00" }, { "name": "phpunit/php-timer", @@ -3772,12 +3772,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "c0187813193d3709a455b94916bbee2881a1c6e3" + "reference": "bd80d581ad411a5a4b7e613541a7f4cd09cf0da9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/c0187813193d3709a455b94916bbee2881a1c6e3", - "reference": "c0187813193d3709a455b94916bbee2881a1c6e3", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/bd80d581ad411a5a4b7e613541a7f4cd09cf0da9", + "reference": "bd80d581ad411a5a4b7e613541a7f4cd09cf0da9", "shasum": "" }, "require": { @@ -3824,7 +3824,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:35+00:00" + "time": "2021-04-02T08:22:20+00:00" }, { "name": "phpunit/phpunit", @@ -3983,12 +3983,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "845853b8c553f6b61d9a708b8f26066806bcc7dd" + "reference": "e59dfbeeaf6ccdff168c537427cbc9f7fed6b160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/845853b8c553f6b61d9a708b8f26066806bcc7dd", - "reference": "845853b8c553f6b61d9a708b8f26066806bcc7dd", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/e59dfbeeaf6ccdff168c537427cbc9f7fed6b160", + "reference": "e59dfbeeaf6ccdff168c537427cbc9f7fed6b160", "shasum": "" }, "require": { @@ -4032,7 +4032,7 @@ "type": "github" } ], - "time": "2021-03-17T06:18:24+00:00" + "time": "2021-04-02T08:23:11+00:00" }, { "name": "sebastian/code-unit", @@ -4096,12 +4096,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ab4d610891809670894a4fc260c17e5d5960ba4c" + "reference": "f7ee1d817bdd8a8bdfb76b11fa851204132ef6d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ab4d610891809670894a4fc260c17e5d5960ba4c", - "reference": "ab4d610891809670894a4fc260c17e5d5960ba4c", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/f7ee1d817bdd8a8bdfb76b11fa851204132ef6d9", + "reference": "f7ee1d817bdd8a8bdfb76b11fa851204132ef6d9", "shasum": "" }, "require": { @@ -4144,7 +4144,7 @@ "type": "github" } ], - "time": "2021-03-17T06:16:16+00:00" + "time": "2021-04-02T08:20:56+00:00" }, { "name": "sebastian/comparator", @@ -4152,12 +4152,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "d3d66b8faa86ac57e1236d576ad003f73097c9cd" + "reference": "604de433dd3e1467ded9a92414b3561a812554c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d3d66b8faa86ac57e1236d576ad003f73097c9cd", - "reference": "d3d66b8faa86ac57e1236d576ad003f73097c9cd", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/604de433dd3e1467ded9a92414b3561a812554c5", + "reference": "604de433dd3e1467ded9a92414b3561a812554c5", "shasum": "" }, "require": { @@ -4219,7 +4219,7 @@ "type": "github" } ], - "time": "2021-03-17T06:16:24+00:00" + "time": "2021-04-02T08:21:05+00:00" }, { "name": "sebastian/complexity", @@ -4284,12 +4284,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "e81849c6dfbe34442b4685fa457fd6f012370e54" + "reference": "3fa178cf5772d7a09bcfe01bfb7acc13edcf8aec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e81849c6dfbe34442b4685fa457fd6f012370e54", - "reference": "e81849c6dfbe34442b4685fa457fd6f012370e54", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3fa178cf5772d7a09bcfe01bfb7acc13edcf8aec", + "reference": "3fa178cf5772d7a09bcfe01bfb7acc13edcf8aec", "shasum": "" }, "require": { @@ -4343,7 +4343,7 @@ "type": "github" } ], - "time": "2021-03-17T06:16:31+00:00" + "time": "2021-04-02T08:21:13+00:00" }, { "name": "sebastian/environment", @@ -4351,12 +4351,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "c25633688d84a9f8694989223479051b5a8a23e7" + "reference": "1fe23c75ca20a9cfe5ef8af473c726f9ef7e9465" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/c25633688d84a9f8694989223479051b5a8a23e7", - "reference": "c25633688d84a9f8694989223479051b5a8a23e7", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1fe23c75ca20a9cfe5ef8af473c726f9ef7e9465", + "reference": "1fe23c75ca20a9cfe5ef8af473c726f9ef7e9465", "shasum": "" }, "require": { @@ -4407,7 +4407,7 @@ "type": "github" } ], - "time": "2021-03-17T06:16:40+00:00" + "time": "2021-04-02T08:21:21+00:00" }, { "name": "sebastian/exporter", @@ -4415,12 +4415,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "9119858d42f3963d01b737f029bb90f8464fd0ca" + "reference": "31abe95278f9b406051b4a26faf2677fbcc01755" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/9119858d42f3963d01b737f029bb90f8464fd0ca", - "reference": "9119858d42f3963d01b737f029bb90f8464fd0ca", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/31abe95278f9b406051b4a26faf2677fbcc01755", + "reference": "31abe95278f9b406051b4a26faf2677fbcc01755", "shasum": "" }, "require": { @@ -4485,7 +4485,7 @@ "type": "github" } ], - "time": "2021-03-17T06:16:48+00:00" + "time": "2021-04-02T08:21:30+00:00" }, { "name": "sebastian/global-state", @@ -4493,12 +4493,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "fe610de5530e3d29007134f76ee8dc79581a607d" + "reference": "8684de2d84cd6a819f5e22a1292cd3b2e1f26487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/fe610de5530e3d29007134f76ee8dc79581a607d", - "reference": "fe610de5530e3d29007134f76ee8dc79581a607d", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/8684de2d84cd6a819f5e22a1292cd3b2e1f26487", + "reference": "8684de2d84cd6a819f5e22a1292cd3b2e1f26487", "shasum": "" }, "require": { @@ -4550,7 +4550,7 @@ "type": "github" } ], - "time": "2021-03-17T06:16:56+00:00" + "time": "2021-04-02T08:21:38+00:00" }, { "name": "sebastian/lines-of-code", @@ -4615,12 +4615,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "01ab82e49081de59e2da70c351d5f698c77c33c5" + "reference": "b331fc5975a2225e6b93c7e6cd9fce0a57f0fddc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/01ab82e49081de59e2da70c351d5f698c77c33c5", - "reference": "01ab82e49081de59e2da70c351d5f698c77c33c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b331fc5975a2225e6b93c7e6cd9fce0a57f0fddc", + "reference": "b331fc5975a2225e6b93c7e6cd9fce0a57f0fddc", "shasum": "" }, "require": { @@ -4665,7 +4665,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:03+00:00" + "time": "2021-04-02T08:21:47+00:00" }, { "name": "sebastian/object-reflector", @@ -4673,12 +4673,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "7ed67aee59862b40785138f0203e86f1fde1b93a" + "reference": "297a334e3ae78670a7633e36569d7362bb7397bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/7ed67aee59862b40785138f0203e86f1fde1b93a", - "reference": "7ed67aee59862b40785138f0203e86f1fde1b93a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/297a334e3ae78670a7633e36569d7362bb7397bf", + "reference": "297a334e3ae78670a7633e36569d7362bb7397bf", "shasum": "" }, "require": { @@ -4721,7 +4721,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:11+00:00" + "time": "2021-04-02T08:21:54+00:00" }, { "name": "sebastian/recursion-context", @@ -4729,12 +4729,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "249976376508ed7e83b6dc429cd883a44b2a3c51" + "reference": "78526ace5bac7c10048020f0317c58fd310a14ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/249976376508ed7e83b6dc429cd883a44b2a3c51", - "reference": "249976376508ed7e83b6dc429cd883a44b2a3c51", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/78526ace5bac7c10048020f0317c58fd310a14ec", + "reference": "78526ace5bac7c10048020f0317c58fd310a14ec", "shasum": "" }, "require": { @@ -4785,7 +4785,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:43+00:00" + "time": "2021-04-02T08:22:30+00:00" }, { "name": "sebastian/resource-operations", @@ -4849,12 +4849,12 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "e02c851008e26557b4f1b4ffd139b71c96937b04" + "reference": "17fc98bb3c75a02a1a99ffdd022e84ac6d22bd51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e02c851008e26557b4f1b4ffd139b71c96937b04", - "reference": "e02c851008e26557b4f1b4ffd139b71c96937b04", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/17fc98bb3c75a02a1a99ffdd022e84ac6d22bd51", + "reference": "17fc98bb3c75a02a1a99ffdd022e84ac6d22bd51", "shasum": "" }, "require": { @@ -4898,7 +4898,7 @@ "type": "github" } ], - "time": "2021-03-17T06:17:51+00:00" + "time": "2021-04-02T08:36:52+00:00" }, { "name": "sebastian/version", @@ -4997,12 +4997,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "fb7e2447d39984358343685fb9f0e800cd79e6a3" + "reference": "9a90698d4624b85a578007a00312338d3adecaf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/fb7e2447d39984358343685fb9f0e800cd79e6a3", - "reference": "fb7e2447d39984358343685fb9f0e800cd79e6a3", + "url": "https://api.github.com/repos/symfony/console/zipball/9a90698d4624b85a578007a00312338d3adecaf8", + "reference": "9a90698d4624b85a578007a00312338d3adecaf8", "shasum": "" }, "require": { @@ -5088,7 +5088,7 @@ "type": "tidelift" } ], - "time": "2021-03-28T09:44:11+00:00" + "time": "2021-04-09T09:54:19+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5576,12 +5576,12 @@ "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "1309413986521646bb0ba91140afdc2a61ed8cfe" + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1309413986521646bb0ba91140afdc2a61ed8cfe", - "reference": "1309413986521646bb0ba91140afdc2a61ed8cfe", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", "shasum": "" }, "require": { @@ -5648,7 +5648,7 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-04-01T10:43:52+00:00" }, { "name": "symfony/string", @@ -5790,12 +5790,12 @@ "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "116bfb0bc9ec2a39db93431b7fe67144164d251e" + "reference": "f7250c6ea6b6cdd724e25ce7c56e2a60006203cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/116bfb0bc9ec2a39db93431b7fe67144164d251e", - "reference": "116bfb0bc9ec2a39db93431b7fe67144164d251e", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/f7250c6ea6b6cdd724e25ce7c56e2a60006203cb", + "reference": "f7250c6ea6b6cdd724e25ce7c56e2a60006203cb", "shasum": "" }, "require": { @@ -5861,7 +5861,7 @@ "type": "tidelift" } ], - "time": "2021-03-22T08:23:49+00:00" + "time": "2021-04-10T08:17:25+00:00" }, { "name": "vimeo/psalm",