From 5af6edae62dbbd5885c62059c2b864e54e97af47 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Sun, 6 Jun 2021 14:37:28 +0200 Subject: [PATCH 1/5] [FrameworkBundle][WebProfilerBundle] Don't pass null to string parameters Signed-off-by: Alexander M. Turek --- .../FrameworkBundle/Console/Descriptor/XmlDescriptor.php | 4 ++-- .../FrameworkBundle/Tests/Kernel/ConcreteMicroKernel.php | 6 ++++-- .../EventListener/WebDebugToolbarListener.php | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php index b11674a31b..e0ea8233f1 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Descriptor/XmlDescriptor.php @@ -285,7 +285,7 @@ class XmlDescriptor extends Descriptor $descriptionXML->appendChild($dom->createCDATASection($classDescription)); } - $serviceXML->setAttribute('class', $definition->getClass()); + $serviceXML->setAttribute('class', $definition->getClass() ?? ''); if ($factory = $definition->getFactory()) { $serviceXML->appendChild($factoryXML = $dom->createElement('factory')); @@ -311,7 +311,7 @@ class XmlDescriptor extends Descriptor $serviceXML->setAttribute('abstract', $definition->isAbstract() ? 'true' : 'false'); $serviceXML->setAttribute('autowired', $definition->isAutowired() ? 'true' : 'false'); $serviceXML->setAttribute('autoconfigured', $definition->isAutoconfigured() ? 'true' : 'false'); - $serviceXML->setAttribute('file', $definition->getFile()); + $serviceXML->setAttribute('file', $definition->getFile() ?? ''); $calls = $definition->getMethodCalls(); if (\count($calls) > 0) { diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Kernel/ConcreteMicroKernel.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Kernel/ConcreteMicroKernel.php index b2a84ed536..6eb02fa11a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Kernel/ConcreteMicroKernel.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Kernel/ConcreteMicroKernel.php @@ -76,8 +76,10 @@ class ConcreteMicroKernel extends Kernel implements EventSubscriberInterface public function __destruct() { - $fs = new Filesystem(); - $fs->remove($this->cacheDir); + if ($this->cacheDir) { + $fs = new Filesystem(); + $fs->remove($this->cacheDir); + } } protected function configureRoutes(RouteCollectionBuilder $routes) diff --git a/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php b/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php index 7f41db3052..a681f5d242 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php +++ b/src/Symfony/Bundle/WebProfilerBundle/EventListener/WebDebugToolbarListener.php @@ -103,7 +103,7 @@ class WebDebugToolbarListener implements EventSubscriberInterface || $response->isRedirection() || ($response->headers->has('Content-Type') && false === strpos($response->headers->get('Content-Type'), 'html')) || 'html' !== $request->getRequestFormat() - || false !== stripos($response->headers->get('Content-Disposition'), 'attachment;') + || false !== stripos($response->headers->get('Content-Disposition', ''), 'attachment;') ) { return; } From 8fbf3bb3c7903be23afa0482e0b46f387390aaa3 Mon Sep 17 00:00:00 2001 From: "Alexander M. Turek" Date: Sun, 6 Jun 2021 14:53:30 +0200 Subject: [PATCH 2/5] [Security] Fix SerializableUser fixture Signed-off-by: Alexander M. Turek --- .../Authentication/Token/AbstractTokenTest.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php b/src/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php index b1e7993de7..fccc7768ff 100644 --- a/src/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php +++ b/src/Symfony/Component/Security/Core/Tests/Authentication/Token/AbstractTokenTest.php @@ -322,12 +322,22 @@ class SerializableUser implements UserInterface, \Serializable public function serialize(): string { - return serialize($this->name); + return serialize($this->__serialize()); } public function unserialize($serialized): void { - $this->name = unserialize($serialized); + $this->__unserialize(unserialize($serialized)); + } + + public function __serialize(): array + { + return ['name' => $this->name]; + } + + public function __unserialize(array $data): void + { + ['name' => $this->name] = $data; } } From a245efb6045aaf9368ef5522d2791572ecf24e33 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Sun, 6 Jun 2021 16:23:08 +0200 Subject: [PATCH 3/5] [travis] fix travis hopefuly --- .travis.yml | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1b9678a7b6..d7752d038a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: php -dist: xenial +dist: bionic git: depth: 2 @@ -11,6 +11,9 @@ addons: - language-pack-fr-base - zookeeperd - libzookeeper-mt-dev + - librabbitmq-dev + - libsodium-dev + - libtidy-dev env: global: @@ -36,15 +39,6 @@ cache: - ~/php-ext before_install: - - | - # Enable Sury ppa - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6B05F25D762E3157 - sudo add-apt-repository -y ppa:ondrej/php - sudo rm /etc/apt/sources.list.d/google-chrome.list - sudo rm /etc/apt/sources.list.d/mongodb-3.4.list - sudo apt update - sudo apt install -y librabbitmq-dev libsodium-dev - - | # General configuration set -e @@ -123,8 +117,13 @@ before_install: - | # php.ini configuration + ( + for PHP in $TRAVIS_PHP_VERSION $php_extra; do + phpenv global $PHP 2>/dev/null || (cd / && wget https://storage.googleapis.com/travis-ci-language-archives/php/binaries/ubuntu/18.04/x86_64/php-$PHP.tar.bz2 -O - | tar -xj) & + done + wait + ) for PHP in $TRAVIS_PHP_VERSION $php_extra; do - phpenv global $PHP 2>/dev/null || (cd / && wget https://storage.googleapis.com/travis-ci-language-archives/php/binaries/ubuntu/16.04/x86_64/php-$PHP.tar.bz2 -O - | tar -xj) INI=~/.phpenv/versions/$PHP/etc/conf.d/travis.ini echo date.timezone = Europe/Paris >> $INI echo memory_limit = -1 >> $INI @@ -132,34 +131,30 @@ before_install: echo session.gc_probability = 0 >> $INI echo opcache.enable_cli = 1 >> $INI echo apc.enable_cli = 1 >> $INI - if [[ $PHP != 8.* ]]; then - echo extension = memcached.so >> $INI - fi done find ~/.phpenv -name xdebug.ini -delete + composer self-update + composer self-update --2 + - | # Install extra PHP extensions for PHP in $TRAVIS_PHP_VERSION $php_extra; do export PHP=$PHP phpenv global $PHP - composer self-update - composer self-update --2 INI=~/.phpenv/versions/$PHP/etc/conf.d/travis.ini if ! php --ri sodium > /dev/null; then tfold ext.libsodium tpecl libsodium sodium.so $INI fi - if [[ $PHP = 8.* ]]; then - tfold ext.memcached tpecl memcached-3.1.5 memcached.so $INI - else + if [[ $PHP != 8.* ]]; then tfold ext.zookeeper tpecl zookeeper-0.7.2 zookeeper.so $INI - tfold ext.amqp tpecl amqp-1.10.2 amqp.so $INI fi - - tfold ext.mongodb tpecl mongodb-1.9.0 mongodb.so $INI + tfold ext.memcached tpecl memcached-3.1.5 memcached.so $INI + tfold ext.amqp tpecl amqp-1.11.0beta amqp.so $INI tfold ext.apcu tpecl apcu-5.1.19 apcu.so $INI tfold ext.igbinary tpecl igbinary-3.1.6 igbinary.so $INI tfold ext.redis tpecl redis-5.2.3 redis.so $INI "no" + tfold ext.mongodb tpecl mongodb-1.9.1 mongodb.so $INI done install: From 7341e29f2f87c8932baea93895e5ded4c482bf49 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 7 Jun 2021 11:04:09 +0200 Subject: [PATCH 4/5] Fix tests (bis) --- src/Symfony/Component/HttpClient/composer.json | 1 + .../Tests/File/MimeType/MimeTypeTest.php | 3 ++- .../Mime/Tests/FileBinaryMimeTypeGuesserTest.php | 5 +++++ .../HttpClient/Test/Fixtures/web/index.php | 5 +++-- .../HttpClient/Test/HttpClientTestCase.php | 14 +++++++++----- .../Contracts/HttpClient/Test/TestHttpServer.php | 5 +++-- 6 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/Symfony/Component/HttpClient/composer.json b/src/Symfony/Component/HttpClient/composer.json index a6209060a5..6c45b6dee3 100644 --- a/src/Symfony/Component/HttpClient/composer.json +++ b/src/Symfony/Component/HttpClient/composer.json @@ -33,6 +33,7 @@ "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", "symfony/dependency-injection": "^4.3|^5.0", + "symfony/http-client-contracts": "^1.1.11|~2.1.4|~2.2.1|~2.3.2|^2.4.1", "symfony/http-kernel": "^4.4.13", "symfony/process": "^4.2|^5.0" }, diff --git a/src/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php b/src/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php index bbc74e74a6..42d5c436cd 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/File/MimeType/MimeTypeTest.php @@ -65,7 +65,8 @@ class MimeTypeTest extends TestCase public function testGuessWithDuplicatedFileType() { - $this->assertSame('application/vnd.openxmlformats-officedocument.wordprocessingml.document', MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test.docx')); + $type = MimeTypeGuesser::getInstance()->guess(__DIR__.'/../Fixtures/test.docx'); + $this->assertTrue(\in_array($type, ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip'], true)); } public function testGuessWithIncorrectPath() diff --git a/src/Symfony/Component/Mime/Tests/FileBinaryMimeTypeGuesserTest.php b/src/Symfony/Component/Mime/Tests/FileBinaryMimeTypeGuesserTest.php index 0742732895..5d225038d4 100644 --- a/src/Symfony/Component/Mime/Tests/FileBinaryMimeTypeGuesserTest.php +++ b/src/Symfony/Component/Mime/Tests/FileBinaryMimeTypeGuesserTest.php @@ -20,4 +20,9 @@ class FileBinaryMimeTypeGuesserTest extends AbstractMimeTypeGuesserTest { return new FileBinaryMimeTypeGuesser(); } + + public function testGuessWithDuplicatedFileType() + { + $this->markTestSkipped('Result varies depending on the OS'); + } } diff --git a/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php b/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php index 30a7049758..a5cf236a35 100644 --- a/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php +++ b/src/Symfony/Contracts/HttpClient/Test/Fixtures/web/index.php @@ -30,6 +30,7 @@ foreach ($_SERVER as $k => $v) { } $json = json_encode($vars, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE); +$localhost = gethostbyname('localhost'); switch ($vars['REQUEST_URI']) { default: @@ -41,7 +42,7 @@ switch ($vars['REQUEST_URI']) { case '/': case '/?a=a&b=b': - case 'http://127.0.0.1:8057/': + case "http://$localhost:8057/": case 'http://localhost:8057/': ob_start('ob_gzhandler'); break; @@ -74,7 +75,7 @@ switch ($vars['REQUEST_URI']) { case '/301': if ('Basic Zm9vOmJhcg==' === $vars['HTTP_AUTHORIZATION']) { - header('Location: http://127.0.0.1:8057/302', true, 301); + header("Location: http://$localhost:8057/302", true, 301); } break; diff --git a/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php b/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php index f3e75c9337..af19e387f8 100644 --- a/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php +++ b/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php @@ -335,6 +335,7 @@ abstract class HttpClientTestCase extends TestCase public function testRedirects() { $client = $this->getHttpClient(__FUNCTION__); + $localhost = gethostbyname('localhost'); $response = $client->request('POST', 'http://localhost:8057/301', [ 'auth_basic' => 'foo:bar', 'body' => function () { @@ -352,7 +353,7 @@ abstract class HttpClientTestCase extends TestCase $expected = [ 'HTTP/1.1 301 Moved Permanently', - 'Location: http://127.0.0.1:8057/302', + "Location: http://$localhost:8057/302", 'Content-Type: application/json', 'HTTP/1.1 302 Found', 'Location: http://localhost:8057/', @@ -425,6 +426,7 @@ abstract class HttpClientTestCase extends TestCase public function testMaxRedirects() { $client = $this->getHttpClient(__FUNCTION__); + $localhost = gethostbyname('localhost'); $response = $client->request('GET', 'http://localhost:8057/301', [ 'max_redirects' => 1, 'auth_basic' => 'foo:bar', @@ -442,7 +444,7 @@ abstract class HttpClientTestCase extends TestCase $expected = [ 'HTTP/1.1 301 Moved Permanently', - 'Location: http://127.0.0.1:8057/302', + "Location: http://$localhost:8057/302", 'Content-Type: application/json', 'HTTP/1.1 302 Found', 'Location: http://localhost:8057/', @@ -691,8 +693,9 @@ abstract class HttpClientTestCase extends TestCase public function testResolve() { $client = $this->getHttpClient(__FUNCTION__); + $localhost = gethostbyname('localhost'); $response = $client->request('GET', 'http://symfony.com:8057/', [ - 'resolve' => ['symfony.com' => '127.0.0.1'], + 'resolve' => ['symfony.com' => $localhost], ]); $this->assertSame(200, $response->getStatusCode()); @@ -706,15 +709,16 @@ abstract class HttpClientTestCase extends TestCase public function testIdnResolve() { $client = $this->getHttpClient(__FUNCTION__); + $localhost = gethostbyname('localhost'); $response = $client->request('GET', 'http://0-------------------------------------------------------------0.com:8057/', [ - 'resolve' => ['0-------------------------------------------------------------0.com' => '127.0.0.1'], + 'resolve' => ['0-------------------------------------------------------------0.com' => $localhost], ]); $this->assertSame(200, $response->getStatusCode()); $response = $client->request('GET', 'http://Bücher.example:8057/', [ - 'resolve' => ['xn--bcher-kva.example' => '127.0.0.1'], + 'resolve' => ['xn--bcher-kva.example' => $localhost], ]); $this->assertSame(200, $response->getStatusCode()); diff --git a/src/Symfony/Contracts/HttpClient/Test/TestHttpServer.php b/src/Symfony/Contracts/HttpClient/Test/TestHttpServer.php index 06a11444e3..a521a96683 100644 --- a/src/Symfony/Contracts/HttpClient/Test/TestHttpServer.php +++ b/src/Symfony/Contracts/HttpClient/Test/TestHttpServer.php @@ -31,15 +31,16 @@ class TestHttpServer }); } + $localhost = gethostbyname('localhost'); $finder = new PhpExecutableFinder(); - $process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', '127.0.0.1:'.$port])); + $process = new Process(array_merge([$finder->find(false)], $finder->findArguments(), ['-dopcache.enable=0', '-dvariables_order=EGPCS', '-S', "$localhost:$port"])); $process->setWorkingDirectory(__DIR__.'/Fixtures/web'); $process->start(); self::$process[$port] = $process; do { usleep(50000); - } while (!@fopen('http://127.0.0.1:'.$port, 'r')); + } while (!@fopen("http://$localhost:$port", 'r')); return $process; } From a71fb4b8f2fc78670cc1af8bd4f7f286ad470262 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 7 Jun 2021 15:37:24 +0200 Subject: [PATCH 5/5] fix tests (ter) --- .github/workflows/tests.yml | 18 +++++++++--------- .../HttpClient/Tests/CurlHttpClientTest.php | 11 +++++++---- src/Symfony/Component/HttpClient/composer.json | 3 +-- .../HttpClient/Test/HttpClientTestCase.php | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3f5e8ef78f..1e5bffaca5 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - php: ['7.1', '7.4'] + php: ['7.1', '8.0'] services: ldap: @@ -106,14 +106,14 @@ jobs: LDAP_HOST: localhost LDAP_PORT: 3389 - - name: Run HTTP push tests - if: matrix.php == '7.4' - run: | - [ -d .phpunit ] && mv .phpunit .phpunit.bak - wget -q https://github.com/symfony/binary-utils/releases/download/v0.1/vulcain_0.1.3_Linux_x86_64.tar.gz -O - | tar xz && mv vulcain /usr/local/bin - docker run --rm -e COMPOSER_ROOT_VERSION -v $(pwd):/app -v $(which composer):/usr/local/bin/composer -v /usr/local/bin/vulcain:/usr/local/bin/vulcain -w /app php:7.4-alpine ./phpunit src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php --filter testHttp2Push - sudo rm -rf .phpunit - [ -d .phpunit.bak ] && mv .phpunit.bak .phpunit + #- name: Run HTTP push tests + # if: matrix.php == '8.0' + # run: | + # [ -d .phpunit ] && mv .phpunit .phpunit.bak + # wget -q https://github.com/symfony/binary-utils/releases/download/v0.1/vulcain_0.1.3_Linux_x86_64.tar.gz -O - | tar xz && mv vulcain /usr/local/bin + # docker run --rm -e COMPOSER_ROOT_VERSION -v $(pwd):/app -v $(which composer):/usr/local/bin/composer -v $(which vulcain):/usr/local/bin/vulcain -w /app php:8.0-alpine ./phpunit src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php --filter testHttp2Push + # sudo rm -rf .phpunit + # [ -d .phpunit.bak ] && mv .phpunit.bak .phpunit nightly: name: PHPUnit on PHP nightly diff --git a/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php index 269705a3f4..8875f60628 100644 --- a/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php @@ -38,7 +38,8 @@ class CurlHttpClientTest extends HttpClientTestCase public function testBindToPort() { $client = $this->getHttpClient(__FUNCTION__); - $response = $client->request('GET', 'http://localhost:8057', ['bindto' => '127.0.0.1:9876']); + $localhost = gethostbyname('localhost'); + $response = $client->request('GET', "http://$localhost:8057", ['bindto' => "$localhost:9876"]); $response->getStatusCode(); $r = new \ReflectionProperty($response, 'handle'); @@ -46,7 +47,7 @@ class CurlHttpClientTest extends HttpClientTestCase $curlInfo = curl_getinfo($r->getValue($response)); - self::assertSame('127.0.0.1', $curlInfo['local_ip']); + self::assertSame($localhost, $curlInfo['local_ip']); self::assertSame(9876, $curlInfo['local_port']); } @@ -152,13 +153,15 @@ class CurlHttpClientTest extends HttpClientTestCase return $client; } - if (['application/json'] !== $client->request('GET', 'http://127.0.0.1:8057/json')->getHeaders()['content-type']) { + $localhost = gethostbyname('localhost'); + + if (['application/json'] !== $client->request('GET', "http://$localhost:8057/json")->getHeaders()['content-type']) { $this->markTestSkipped('symfony/http-client-contracts >= 2.0.1 required'); } $process = new Process(['vulcain'], null, [ 'DEBUG' => 1, - 'UPSTREAM' => 'http://127.0.0.1:8057', + 'UPSTREAM' => "http://$localhost:8057", 'ADDR' => ':3000', 'KEY_FILE' => __DIR__.'/Fixtures/tls/server.key', 'CERT_FILE' => __DIR__.'/Fixtures/tls/server.crt', diff --git a/src/Symfony/Component/HttpClient/composer.json b/src/Symfony/Component/HttpClient/composer.json index 6c45b6dee3..0e4af20f44 100644 --- a/src/Symfony/Component/HttpClient/composer.json +++ b/src/Symfony/Component/HttpClient/composer.json @@ -23,7 +23,7 @@ "require": { "php": ">=7.1.3", "psr/log": "^1.0", - "symfony/http-client-contracts": "^1.1.10|^2", + "symfony/http-client-contracts": "^1.1.11|~2.1.4|~2.2.1|~2.3.2|^2.4.1", "symfony/polyfill-php73": "^1.11", "symfony/service-contracts": "^1.0|^2" }, @@ -33,7 +33,6 @@ "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", "symfony/dependency-injection": "^4.3|^5.0", - "symfony/http-client-contracts": "^1.1.11|~2.1.4|~2.2.1|~2.3.2|^2.4.1", "symfony/http-kernel": "^4.4.13", "symfony/process": "^4.2|^5.0" }, diff --git a/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php b/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php index af19e387f8..77329af8c8 100644 --- a/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php +++ b/src/Symfony/Contracts/HttpClient/Test/HttpClientTestCase.php @@ -860,7 +860,7 @@ abstract class HttpClientTestCase extends TestCase $body = $response->toArray(); $this->assertSame('localhost:8057', $body['HTTP_HOST']); - $this->assertMatchesRegularExpression('#^http://(localhost|127\.0\.0\.1):8057/$#', $body['REQUEST_URI']); + $this->assertMatchesRegularExpression('#^http://(localhost|127\.0\.\d+\.1):8057/$#', $body['REQUEST_URI']); $response = $client->request('GET', 'http://localhost:8057/', [ 'proxy' => 'http://foo:b%3Dar@localhost:8057',