From 4463d664e325bbdd6495fa3c4473afdc7c94ef3e Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Wed, 18 Sep 2024 13:58:19 +0200 Subject: [PATCH] deprecate the ProviderFactoryTestCase --- UPGRADE-7.2.md | 5 ++ .../Tests/CrowdinProviderFactoryTest.php | 13 ++- .../Translation/Bridge/Crowdin/composer.json | 2 +- .../Loco/Tests/LocoProviderFactoryTest.php | 13 ++- ...roviderFactoryWithoutTranslatorBagTest.php | 5 +- .../Translation/Bridge/Loco/composer.json | 2 +- .../Tests/LokaliseProviderFactoryTest.php | 13 ++- .../Translation/Bridge/Lokalise/composer.json | 2 +- .../Tests/PhraseProviderFactoryTest.php | 60 ++------------ .../Translation/Bridge/Phrase/composer.json | 2 +- .../Component/Translation/CHANGELOG.md | 5 ++ .../Test/AbstractProviderFactoryTestCase.php | 79 ++++++++++++++++++ .../Test/IncompleteDsnTestTrait.php | 42 ++++++++++ .../Test/ProviderFactoryTestCase.php | 83 ++----------------- 14 files changed, 179 insertions(+), 147 deletions(-) create mode 100644 src/Symfony/Component/Translation/Test/AbstractProviderFactoryTestCase.php create mode 100644 src/Symfony/Component/Translation/Test/IncompleteDsnTestTrait.php diff --git a/UPGRADE-7.2.md b/UPGRADE-7.2.md index 7c0c8064f4381..b7baa5e0d76a4 100644 --- a/UPGRADE-7.2.md +++ b/UPGRADE-7.2.md @@ -77,6 +77,11 @@ String Translation ----------- + * Deprecate `ProviderFactoryTestCase`, extend `AbstractTransportFactoryTestCase` instead + + The `testIncompleteDsnException()` test is no longer provided by default. If you make use of it by implementing the `incompleteDsnProvider()` data providers, + you now need to use the `IncompleteDsnTestTrait`. + * Deprecate passing an escape character to `CsvFileLoader::setCsvControl()` TwigBridge diff --git a/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderFactoryTest.php b/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderFactoryTest.php index f6013bd226c1f..c8d53d3b1e70b 100644 --- a/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderFactoryTest.php +++ b/src/Symfony/Component/Translation/Bridge/Crowdin/Tests/CrowdinProviderFactoryTest.php @@ -11,12 +11,19 @@ namespace Symfony\Component\Translation\Bridge\Crowdin\Tests; +use Psr\Log\NullLogger; +use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Translation\Bridge\Crowdin\CrowdinProviderFactory; +use Symfony\Component\Translation\Dumper\XliffFileDumper; +use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Component\Translation\Provider\ProviderFactoryInterface; -use Symfony\Component\Translation\Test\ProviderFactoryTestCase; +use Symfony\Component\Translation\Test\AbstractProviderFactoryTestCase; +use Symfony\Component\Translation\Test\IncompleteDsnTestTrait; -class CrowdinProviderFactoryTest extends ProviderFactoryTestCase +class CrowdinProviderFactoryTest extends AbstractProviderFactoryTestCase { + use IncompleteDsnTestTrait; + public static function supportsProvider(): iterable { yield [true, 'crowdin://PROJECT_ID:API_TOKEN@default']; @@ -48,6 +55,6 @@ public static function incompleteDsnProvider(): iterable public function createFactory(): ProviderFactoryInterface { - return new CrowdinProviderFactory($this->getClient(), $this->getLogger(), $this->getDefaultLocale(), $this->getLoader(), $this->getXliffFileDumper()); + return new CrowdinProviderFactory(new MockHttpClient(), new NullLogger(), 'en', $this->createMock(LoaderInterface::class), $this->createMock(XliffFileDumper::class)); } } diff --git a/src/Symfony/Component/Translation/Bridge/Crowdin/composer.json b/src/Symfony/Component/Translation/Bridge/Crowdin/composer.json index 8ea423bd246ef..d2f60819d6b9b 100644 --- a/src/Symfony/Component/Translation/Bridge/Crowdin/composer.json +++ b/src/Symfony/Component/Translation/Bridge/Crowdin/composer.json @@ -23,7 +23,7 @@ "php": ">=8.2", "symfony/config": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0" + "symfony/translation": "^7.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Translation\\Bridge\\Crowdin\\": "" }, diff --git a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php index e0ba1c414ae39..36f8c16660ea6 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryTest.php @@ -11,12 +11,19 @@ namespace Symfony\Component\Translation\Bridge\Loco\Tests; +use Psr\Log\NullLogger; +use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Translation\Bridge\Loco\LocoProviderFactory; +use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Component\Translation\Provider\ProviderFactoryInterface; -use Symfony\Component\Translation\Test\ProviderFactoryTestCase; +use Symfony\Component\Translation\Test\AbstractProviderFactoryTestCase; +use Symfony\Component\Translation\Test\IncompleteDsnTestTrait; +use Symfony\Component\Translation\TranslatorBagInterface; -class LocoProviderFactoryTest extends ProviderFactoryTestCase +class LocoProviderFactoryTest extends AbstractProviderFactoryTestCase { + use IncompleteDsnTestTrait; + public static function supportsProvider(): iterable { yield [true, 'loco://API_KEY@default']; @@ -48,6 +55,6 @@ public static function incompleteDsnProvider(): iterable public function createFactory(): ProviderFactoryInterface { - return new LocoProviderFactory($this->getClient(), $this->getLogger(), $this->getDefaultLocale(), $this->getLoader(), $this->getTranslatorBag()); + return new LocoProviderFactory(new MockHttpClient(), new NullLogger(), 'en', $this->createMock(LoaderInterface::class), $this->createMock(TranslatorBagInterface::class)); } } diff --git a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryWithoutTranslatorBagTest.php b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryWithoutTranslatorBagTest.php index a82efa4fd8bbd..17edc30bccbfa 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryWithoutTranslatorBagTest.php +++ b/src/Symfony/Component/Translation/Bridge/Loco/Tests/LocoProviderFactoryWithoutTranslatorBagTest.php @@ -11,13 +11,16 @@ namespace Symfony\Component\Translation\Bridge\Loco\Tests; +use Psr\Log\NullLogger; +use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Translation\Bridge\Loco\LocoProviderFactory; +use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Component\Translation\Provider\ProviderFactoryInterface; class LocoProviderFactoryWithoutTranslatorBagTest extends LocoProviderFactoryTest { public function createFactory(): ProviderFactoryInterface { - return new LocoProviderFactory($this->getClient(), $this->getLogger(), $this->getDefaultLocale(), $this->getLoader(), null); + return new LocoProviderFactory(new MockHttpClient(), new NullLogger(), 'en', $this->createMock(LoaderInterface::class), null); } } diff --git a/src/Symfony/Component/Translation/Bridge/Loco/composer.json b/src/Symfony/Component/Translation/Bridge/Loco/composer.json index cf10eb5bb2a56..40eb6f753d363 100644 --- a/src/Symfony/Component/Translation/Bridge/Loco/composer.json +++ b/src/Symfony/Component/Translation/Bridge/Loco/composer.json @@ -19,7 +19,7 @@ "php": ">=8.2", "symfony/http-client": "^6.4|^7.0", "symfony/config": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0" + "symfony/translation": "^7.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Translation\\Bridge\\Loco\\": "" }, diff --git a/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderFactoryTest.php b/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderFactoryTest.php index 42cca6575ac2f..6c3cd7e5e990e 100644 --- a/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderFactoryTest.php +++ b/src/Symfony/Component/Translation/Bridge/Lokalise/Tests/LokaliseProviderFactoryTest.php @@ -11,15 +11,20 @@ namespace Symfony\Component\Translation\Bridge\Lokalise\Tests; +use Psr\Log\NullLogger; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\HttpClient\Response\JsonMockResponse; use Symfony\Component\Translation\Bridge\Lokalise\LokaliseProviderFactory; +use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Component\Translation\Provider\Dsn; use Symfony\Component\Translation\Provider\ProviderFactoryInterface; -use Symfony\Component\Translation\Test\ProviderFactoryTestCase; +use Symfony\Component\Translation\Test\AbstractProviderFactoryTestCase; +use Symfony\Component\Translation\Test\IncompleteDsnTestTrait; -class LokaliseProviderFactoryTest extends ProviderFactoryTestCase +class LokaliseProviderFactoryTest extends AbstractProviderFactoryTestCase { + use IncompleteDsnTestTrait; + public static function supportsProvider(): iterable { yield [true, 'lokalise://PROJECT_ID:API_KEY@default']; @@ -48,7 +53,7 @@ public function testBaseUri() { $response = new JsonMockResponse(['files' => []]); $httpClient = new MockHttpClient([$response]); - $factory = new LokaliseProviderFactory($httpClient, $this->getLogger(), $this->getDefaultLocale(), $this->getLoader()); + $factory = new LokaliseProviderFactory($httpClient, new NullLogger(), 'en', $this->createMock(LoaderInterface::class)); $provider = $factory->create(new Dsn('lokalise://PROJECT_ID:API_KEY@default')); // Make a real HTTP request. @@ -59,6 +64,6 @@ public function testBaseUri() public function createFactory(): ProviderFactoryInterface { - return new LokaliseProviderFactory($this->getClient(), $this->getLogger(), $this->getDefaultLocale(), $this->getLoader()); + return new LokaliseProviderFactory(new MockHttpClient(), new NullLogger(), 'en', $this->createMock(LoaderInterface::class)); } } diff --git a/src/Symfony/Component/Translation/Bridge/Lokalise/composer.json b/src/Symfony/Component/Translation/Bridge/Lokalise/composer.json index a6c3b499c1cc6..78be5ea3c89cc 100644 --- a/src/Symfony/Component/Translation/Bridge/Lokalise/composer.json +++ b/src/Symfony/Component/Translation/Bridge/Lokalise/composer.json @@ -19,7 +19,7 @@ "php": ">=8.2", "symfony/config": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0" + "symfony/translation": "^7.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Translation\\Bridge\\Lokalise\\": "" }, diff --git a/src/Symfony/Component/Translation/Bridge/Phrase/Tests/PhraseProviderFactoryTest.php b/src/Symfony/Component/Translation/Bridge/Phrase/Tests/PhraseProviderFactoryTest.php index 6521656af7d6e..3e0b4ffd18df3 100644 --- a/src/Symfony/Component/Translation/Bridge/Phrase/Tests/PhraseProviderFactoryTest.php +++ b/src/Symfony/Component/Translation/Bridge/Phrase/Tests/PhraseProviderFactoryTest.php @@ -12,23 +12,24 @@ namespace Symfony\Component\Translation\Bridge\Phrase\Tests; use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\TestCase; use Psr\Cache\CacheItemPoolInterface; use Psr\Log\LoggerInterface; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Translation\Bridge\Phrase\PhraseProviderFactory; use Symfony\Component\Translation\Dumper\XliffFileDumper; -use Symfony\Component\Translation\Exception\IncompleteDsnException; use Symfony\Component\Translation\Exception\MissingRequiredOptionException; -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; use Symfony\Component\Translation\Loader\LoaderInterface; use Symfony\Component\Translation\Provider\Dsn; +use Symfony\Component\Translation\Test\AbstractProviderFactoryTestCase; +use Symfony\Component\Translation\Test\IncompleteDsnTestTrait; /** * @author wicliff */ -class PhraseProviderFactoryTest extends TestCase +class PhraseProviderFactoryTest extends AbstractProviderFactoryTestCase { + use IncompleteDsnTestTrait; + private MockObject&MockHttpClient $httpClient; private MockObject&LoggerInterface $logger; private MockObject&LoaderInterface $loader; @@ -36,55 +37,6 @@ class PhraseProviderFactoryTest extends TestCase private MockObject&CacheItemPoolInterface $cache; private string $defaultLocale; - /** - * @dataProvider supportsProvider - */ - public function testSupports(bool $expected, string $dsn) - { - $factory = $this->createFactory(); - - $this->assertSame($expected, $factory->supports(new Dsn($dsn))); - } - - /** - * @dataProvider createProvider - */ - public function testCreate(string $expected, string $dsn) - { - $factory = $this->createFactory(); - $provider = $factory->create(new Dsn($dsn)); - - $this->assertSame($expected, (string) $provider); - } - - /** - * @dataProvider unsupportedSchemeProvider - */ - public function testUnsupportedSchemeException(string $dsn, string $message) - { - $factory = $this->createFactory(); - $dsn = new Dsn($dsn); - - $this->expectException(UnsupportedSchemeException::class); - $this->expectExceptionMessage($message); - - $factory->create($dsn); - } - - /** - * @dataProvider incompleteDsnProvider - */ - public function testIncompleteDsnException(string $dsn, string $message) - { - $factory = $this->createFactory(); - $dsn = new Dsn($dsn); - - $this->expectException(IncompleteDsnException::class); - $this->expectExceptionMessage($message); - - $factory->create($dsn); - } - public function testRequiredUserAgentOption() { $factory = $this->createFactory(); @@ -144,7 +96,7 @@ public static function supportsProvider(): \Generator yield 'not supported' => [false, 'unsupported://PROJECT_ID:API_TOKEN@default?userAgent=myProject']; } - private function createFactory(): PhraseProviderFactory + public function createFactory(): PhraseProviderFactory { return new PhraseProviderFactory( $this->getHttpClient(), diff --git a/src/Symfony/Component/Translation/Bridge/Phrase/composer.json b/src/Symfony/Component/Translation/Bridge/Phrase/composer.json index 204f7122777a1..2d3105037f7c6 100644 --- a/src/Symfony/Component/Translation/Bridge/Phrase/composer.json +++ b/src/Symfony/Component/Translation/Bridge/Phrase/composer.json @@ -20,7 +20,7 @@ "psr/cache": "^3.0", "symfony/http-client": "^6.4|^7.0", "symfony/mime": "^6.4|^7.0", - "symfony/translation": "^6.4|^7.0" + "symfony/translation": "^7.2" }, "autoload": { "psr-4": { "Symfony\\Component\\Translation\\Bridge\\Phrase\\": "" }, diff --git a/src/Symfony/Component/Translation/CHANGELOG.md b/src/Symfony/Component/Translation/CHANGELOG.md index 0d9382a216ff5..9a8bba0852631 100644 --- a/src/Symfony/Component/Translation/CHANGELOG.md +++ b/src/Symfony/Component/Translation/CHANGELOG.md @@ -4,6 +4,11 @@ CHANGELOG 7.2 --- + * Deprecate `ProviderFactoryTestCase`, extend `AbstractTransportFactoryTestCase` instead + + The `testIncompleteDsnException()` test is no longer provided by default. If you make use of it by implementing the `incompleteDsnProvider()` data providers, + you now need to use the `IncompleteDsnTestTrait`. + * Make `ProviderFactoryTestCase` and `ProviderTestCase` compatible with PHPUnit 10+ * Add `lint:translations` command * Deprecate passing an escape character to `CsvFileLoader::setCsvControl()` diff --git a/src/Symfony/Component/Translation/Test/AbstractProviderFactoryTestCase.php b/src/Symfony/Component/Translation/Test/AbstractProviderFactoryTestCase.php new file mode 100644 index 0000000000000..75e7dd2d3dc22 --- /dev/null +++ b/src/Symfony/Component/Translation/Test/AbstractProviderFactoryTestCase.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Test; + +use PHPUnit\Framework\Attributes\DataProvider; +use PHPUnit\Framework\TestCase; +use Symfony\Component\Translation\Exception\UnsupportedSchemeException; +use Symfony\Component\Translation\Provider\Dsn; +use Symfony\Component\Translation\Provider\ProviderFactoryInterface; + +abstract class AbstractProviderFactoryTestCase extends TestCase +{ + abstract public function createFactory(): ProviderFactoryInterface; + + /** + * @return iterable + */ + abstract public static function supportsProvider(): iterable; + + /** + * @return iterable + */ + abstract public static function createProvider(): iterable; + + /** + * @return iterable + */ + abstract public static function unsupportedSchemeProvider(): iterable; + + /** + * @dataProvider supportsProvider + */ + #[DataProvider('supportsProvider')] + public function testSupports(bool $expected, string $dsn) + { + $factory = $this->createFactory(); + + $this->assertSame($expected, $factory->supports(new Dsn($dsn))); + } + + /** + * @dataProvider createProvider + */ + #[DataProvider('createProvider')] + public function testCreate(string $expected, string $dsn) + { + $factory = $this->createFactory(); + $provider = $factory->create(new Dsn($dsn)); + + $this->assertSame($expected, (string) $provider); + } + + /** + * @dataProvider unsupportedSchemeProvider + */ + #[DataProvider('unsupportedSchemeProvider')] + public function testUnsupportedSchemeException(string $dsn, ?string $message = null) + { + $factory = $this->createFactory(); + + $dsn = new Dsn($dsn); + + $this->expectException(UnsupportedSchemeException::class); + if (null !== $message) { + $this->expectExceptionMessage($message); + } + + $factory->create($dsn); + } +} diff --git a/src/Symfony/Component/Translation/Test/IncompleteDsnTestTrait.php b/src/Symfony/Component/Translation/Test/IncompleteDsnTestTrait.php new file mode 100644 index 0000000000000..892f6bf72899b --- /dev/null +++ b/src/Symfony/Component/Translation/Test/IncompleteDsnTestTrait.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Translation\Test; + +use PHPUnit\Framework\Attributes\DataProvider; +use Symfony\Component\Translation\Exception\IncompleteDsnException; +use Symfony\Component\Translation\Provider\Dsn; + +trait IncompleteDsnTestTrait +{ + /** + * @return iterable + */ + abstract public static function incompleteDsnProvider(): iterable; + + /** + * @dataProvider incompleteDsnProvider + */ + #[DataProvider('incompleteDsnProvider')] + public function testIncompleteDsnException(string $dsn, ?string $message = null) + { + $factory = $this->createFactory(); + + $dsn = new Dsn($dsn); + + $this->expectException(IncompleteDsnException::class); + if (null !== $message) { + $this->expectExceptionMessage($message); + } + + $factory->create($dsn); + } +} diff --git a/src/Symfony/Component/Translation/Test/ProviderFactoryTestCase.php b/src/Symfony/Component/Translation/Test/ProviderFactoryTestCase.php index 8117f680601bc..e82f32907e84d 100644 --- a/src/Symfony/Component/Translation/Test/ProviderFactoryTestCase.php +++ b/src/Symfony/Component/Translation/Test/ProviderFactoryTestCase.php @@ -11,17 +11,11 @@ namespace Symfony\Component\Translation\Test; -use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\MockObject\MockObject; -use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; use Symfony\Component\HttpClient\MockHttpClient; use Symfony\Component\Translation\Dumper\XliffFileDumper; -use Symfony\Component\Translation\Exception\IncompleteDsnException; -use Symfony\Component\Translation\Exception\UnsupportedSchemeException; use Symfony\Component\Translation\Loader\LoaderInterface; -use Symfony\Component\Translation\Provider\Dsn; -use Symfony\Component\Translation\Provider\ProviderFactoryInterface; use Symfony\Component\Translation\TranslatorBagInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -29,9 +23,13 @@ * A test case to ease testing a translation provider factory. * * @author Mathieu Santostefano + * + * @deprecated since Symfony 7.2, use AbstractProviderFactoryTestCase instead */ -abstract class ProviderFactoryTestCase extends TestCase +abstract class ProviderFactoryTestCase extends AbstractProviderFactoryTestCase { + use IncompleteDsnTestTrait; + protected HttpClientInterface $client; protected LoggerInterface|MockObject $logger; protected string $defaultLocale; @@ -39,18 +37,6 @@ abstract class ProviderFactoryTestCase extends TestCase protected XliffFileDumper|MockObject $xliffFileDumper; protected TranslatorBagInterface|MockObject $translatorBag; - abstract public function createFactory(): ProviderFactoryInterface; - - /** - * @return iterable - */ - abstract public static function supportsProvider(): iterable; - - /** - * @return iterable - */ - abstract public static function createProvider(): iterable; - /** * @return iterable */ @@ -67,65 +53,6 @@ public static function incompleteDsnProvider(): iterable return []; } - /** - * @dataProvider supportsProvider - */ - #[DataProvider('supportsProvider')] - public function testSupports(bool $expected, string $dsn) - { - $factory = $this->createFactory(); - - $this->assertSame($expected, $factory->supports(new Dsn($dsn))); - } - - /** - * @dataProvider createProvider - */ - #[DataProvider('createProvider')] - public function testCreate(string $expected, string $dsn) - { - $factory = $this->createFactory(); - $provider = $factory->create(new Dsn($dsn)); - - $this->assertSame($expected, (string) $provider); - } - - /** - * @dataProvider unsupportedSchemeProvider - */ - #[DataProvider('unsupportedSchemeProvider')] - public function testUnsupportedSchemeException(string $dsn, ?string $message = null) - { - $factory = $this->createFactory(); - - $dsn = new Dsn($dsn); - - $this->expectException(UnsupportedSchemeException::class); - if (null !== $message) { - $this->expectExceptionMessage($message); - } - - $factory->create($dsn); - } - - /** - * @dataProvider incompleteDsnProvider - */ - #[DataProvider('incompleteDsnProvider')] - public function testIncompleteDsnException(string $dsn, ?string $message = null) - { - $factory = $this->createFactory(); - - $dsn = new Dsn($dsn); - - $this->expectException(IncompleteDsnException::class); - if (null !== $message) { - $this->expectExceptionMessage($message); - } - - $factory->create($dsn); - } - protected function getClient(): HttpClientInterface { return $this->client ??= new MockHttpClient(); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy