Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!4񗪴6type/phpunit.xmlnu刐迭 tests/unit src PK!M顺type/README.mdnu刐迭[![Latest Stable Version](https://poser.pugx.org/sebastian/type/v/stable.png)](https://packagist.org/packages/sebastian/type) [![CI Status](https://github.com/sebastianbergmann/type/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/type/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/type/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/type) [![codecov](https://codecov.io/gh/sebastianbergmann/type/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/type) # sebastian/type Collection of value objects that represent the types of the PHP type system. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/type ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/type ``` PK!蓾  type/phive.xmlnu刐迭 PK! 稆鼷 type/LICENSEnu刐迭BSD 3-Clause License Copyright (c) 2019-2023, Sebastian Bergmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!衟镻 $type/tests/unit/IterableTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; use SebastianBergmann\Type\TestFixture\Iterator; /** * @covers \SebastianBergmann\Type\IterableType * * @uses \SebastianBergmann\Type\Type * @uses \SebastianBergmann\Type\TypeName * @uses \SebastianBergmann\Type\ObjectType * @uses \SebastianBergmann\Type\SimpleType */ final class IterableTypeTest extends TestCase { /** * @var IterableType */ private $type; protected function setUp(): void { $this->type = new IterableType(false); } public function testMayDisallowNull(): void { $this->assertFalse($this->type->allowsNull()); } public function testCanGenerateReturnTypeDeclaration(): void { $this->assertEquals(': iterable', $this->type->getReturnTypeDeclaration()); } public function testMayAllowNull(): void { $type = new IterableType(true); $this->assertTrue($type->allowsNull()); } public function testCanGenerateNullableReturnTypeDeclaration(): void { $type = new IterableType(true); $this->assertEquals(': ?iterable', $type->getReturnTypeDeclaration()); } public function testNullCanBeAssignedToNullableIterable(): void { $type = new IterableType(true); $this->assertTrue($type->isAssignable(new NullType)); } public function testIterableCanBeAssignedToIterable(): void { $this->assertTrue($this->type->isAssignable(new IterableType(false))); } public function testArrayCanBeAssignedToIterable(): void { $this->assertTrue( $this->type->isAssignable( Type::fromValue([], false) ) ); } public function testIteratorCanBeAssignedToIterable(): void { $this->assertTrue( $this->type->isAssignable( Type::fromValue(new Iterator, false) ) ); } public function testSomethingThatIsNotIterableCannotBeAssignedToIterable(): void { $this->assertFalse( $this->type->isAssignable( Type::fromValue(null, false) ) ); } } PK!3e"type/tests/unit/SimpleTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Type\SimpleType * * @uses \SebastianBergmann\Type\Type */ final class SimpleTypeTest extends TestCase { public function testCanBeBool(): void { $type = new SimpleType('bool', false); $this->assertSame(': bool', $type->getReturnTypeDeclaration()); } public function testCanBeBoolean(): void { $type = new SimpleType('boolean', false); $this->assertSame(': bool', $type->getReturnTypeDeclaration()); } public function testCanBeDouble(): void { $type = new SimpleType('double', false); $this->assertSame(': float', $type->getReturnTypeDeclaration()); } public function testCanBeFloat(): void { $type = new SimpleType('float', false); $this->assertSame(': float', $type->getReturnTypeDeclaration()); } public function testCanBeReal(): void { $type = new SimpleType('real', false); $this->assertSame(': float', $type->getReturnTypeDeclaration()); } public function testCanBeInt(): void { $type = new SimpleType('int', false); $this->assertSame(': int', $type->getReturnTypeDeclaration()); } public function testCanBeInteger(): void { $type = new SimpleType('integer', false); $this->assertSame(': int', $type->getReturnTypeDeclaration()); } public function testCanBeArray(): void { $type = new SimpleType('array', false); $this->assertSame(': array', $type->getReturnTypeDeclaration()); } public function testCanBeArray2(): void { $type = new SimpleType('[]', false); $this->assertSame(': array', $type->getReturnTypeDeclaration()); } public function testMayAllowNull(): void { $type = new SimpleType('bool', true); $this->assertTrue($type->allowsNull()); $this->assertSame(': ?bool', $type->getReturnTypeDeclaration()); } public function testMayNotAllowNull(): void { $type = new SimpleType('bool', false); $this->assertFalse($type->allowsNull()); } /** * @dataProvider assignablePairs */ public function testIsAssignable(Type $assignTo, Type $assignedType): void { $this->assertTrue($assignTo->isAssignable($assignedType)); } public function assignablePairs(): array { return [ 'nullable to not nullable' => [new SimpleType('int', false), new SimpleType('int', true)], 'not nullable to nullable' => [new SimpleType('int', true), new SimpleType('int', false)], 'nullable to nullable' => [new SimpleType('int', true), new SimpleType('int', true)], 'not nullable to not nullable' => [new SimpleType('int', false), new SimpleType('int', false)], 'null to not nullable' => [new SimpleType('int', true), new NullType], ]; } /** * @dataProvider notAssignablePairs */ public function testIsNotAssignable(Type $assignTo, Type $assignedType): void { $this->assertFalse($assignTo->isAssignable($assignedType)); } public function notAssignablePairs(): array { return [ 'null to not nullable' => [new SimpleType('int', false), new NullType], 'int to boolean' => [new SimpleType('boolean', false), new SimpleType('int', false)], 'object' => [new SimpleType('boolean', false), new ObjectType(TypeName::fromQualifiedName(\stdClass::class), true)], 'unknown type' => [new SimpleType('boolean', false), new UnknownType], 'void' => [new SimpleType('boolean', false), new VoidType], ]; } /** * @dataProvider returnTypes */ public function testReturnTypeDeclaration(Type $type, string $returnType): void { $this->assertEquals($type->getReturnTypeDeclaration(), $returnType); } public function returnTypes(): array { return [ '[]' => [new SimpleType('[]', false), ': array'], 'array' => [new SimpleType('array', false), ': array'], '?array' => [new SimpleType('array', true), ': ?array'], 'boolean' => [new SimpleType('boolean', false), ': bool'], 'real' => [new SimpleType('real', false), ': float'], 'double' => [new SimpleType('double', false), ': float'], 'integer' => [new SimpleType('integer', false), ': int'], ]; } public function testCanHaveValue(): void { $this->assertSame('string', Type::fromValue('string', false)->value()); } } PK!Z[vAaa)type/tests/unit/GenericObjectTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Type\GenericObjectType * * @uses \SebastianBergmann\Type\Type * @uses \SebastianBergmann\Type\ObjectType * @uses \SebastianBergmann\Type\SimpleType * @uses \SebastianBergmann\Type\TypeName */ final class GenericObjectTypeTest extends TestCase { /** * @var GenericObjectType */ private $type; protected function setUp(): void { $this->type = new GenericObjectType(false); } public function testMayDisallowNull(): void { $this->assertFalse($this->type->allowsNull()); } public function testCanGenerateReturnTypeDeclaration(): void { $this->assertEquals(': object', $this->type->getReturnTypeDeclaration()); } public function testMayAllowNull(): void { $type = new GenericObjectType(true); $this->assertTrue($type->allowsNull()); } public function testCanGenerateNullableReturnTypeDeclaration(): void { $type = new GenericObjectType(true); $this->assertEquals(': ?object', $type->getReturnTypeDeclaration()); } public function testObjectCanBeAssignedToGenericObject(): void { $this->assertTrue( $this->type->isAssignable( new ObjectType(TypeName::fromQualifiedName(\stdClass::class), false) ) ); } public function testNullCanBeAssignedToNullableGenericObject(): void { $type = new GenericObjectType(true); $this->assertTrue( $type->isAssignable( new NullType ) ); } public function testNonObjectCannotBeAssignedToGenericObject(): void { $this->assertFalse( $this->type->isAssignable( new SimpleType('bool', false) ) ); } } PK!皴 type/tests/unit/NullTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Type\NullType */ final class NullTypeTest extends TestCase { /** * @var NullType */ private $type; protected function setUp(): void { $this->type = new NullType; } /** * @dataProvider assignableTypes */ public function testIsAssignable(Type $assignableType): void { $this->assertTrue($this->type->isAssignable($assignableType)); } public function assignableTypes(): array { return [ [new SimpleType('int', false)], [new SimpleType('int', true)], [new ObjectType(TypeName::fromQualifiedName(self::class), false)], [new ObjectType(TypeName::fromQualifiedName(self::class), true)], [new UnknownType], ]; } /** * @dataProvider notAssignable */ public function testIsNotAssignable(Type $assignedType): void { $this->assertFalse($this->type->isAssignable($assignedType)); } public function notAssignable(): array { return [ 'void' => [new VoidType], ]; } public function testAllowsNull(): void { $this->assertTrue($this->type->allowsNull()); } public function testCanGenerateReturnTypeDeclaration(): void { $this->assertEquals('', $this->type->getReturnTypeDeclaration()); } } PK!'紳dd type/tests/unit/TypeNameTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Type\TypeName */ final class TypeNameTest extends TestCase { public function testFromReflection(): void { $class = new \ReflectionClass(TypeName::class); $typeName = TypeName::fromReflection($class); $this->assertTrue($typeName->isNamespaced()); $this->assertEquals('SebastianBergmann\\Type', $typeName->getNamespaceName()); $this->assertEquals(TypeName::class, $typeName->getQualifiedName()); $this->assertEquals('TypeName', $typeName->getSimpleName()); } public function testFromQualifiedName(): void { $typeName = TypeName::fromQualifiedName('PHPUnit\\Framework\\MockObject\\TypeName'); $this->assertTrue($typeName->isNamespaced()); $this->assertEquals('PHPUnit\\Framework\\MockObject', $typeName->getNamespaceName()); $this->assertEquals('PHPUnit\\Framework\\MockObject\\TypeName', $typeName->getQualifiedName()); $this->assertEquals('TypeName', $typeName->getSimpleName()); } public function testFromQualifiedNameWithLeadingSeparator(): void { $typeName = TypeName::fromQualifiedName('\\Foo\\Bar'); $this->assertTrue($typeName->isNamespaced()); $this->assertEquals('Foo', $typeName->getNamespaceName()); $this->assertEquals('Foo\\Bar', $typeName->getQualifiedName()); $this->assertEquals('Bar', $typeName->getSimpleName()); } public function testFromQualifiedNameWithoutNamespace(): void { $typeName = TypeName::fromQualifiedName('Bar'); $this->assertFalse($typeName->isNamespaced()); $this->assertNull($typeName->getNamespaceName()); $this->assertEquals('Bar', $typeName->getQualifiedName()); $this->assertEquals('Bar', $typeName->getSimpleName()); } } PK! 籽type/tests/unit/TypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Type\Type * * @uses \SebastianBergmann\Type\SimpleType * @uses \SebastianBergmann\Type\GenericObjectType * @uses \SebastianBergmann\Type\ObjectType * @uses \SebastianBergmann\Type\TypeName * @uses \SebastianBergmann\Type\CallableType * @uses \SebastianBergmann\Type\IterableType */ final class TypeTest extends TestCase { /** * @dataProvider valuesToNullableType */ public function testTypeMappingFromValue($value, bool $allowsNull, Type $expectedType): void { $this->assertEquals($expectedType, Type::fromValue($value, $allowsNull)); } public function valuesToNullableType(): array { return [ '?null' => [null, true, new NullType], 'null' => [null, false, new NullType], '?integer' => [1, true, new SimpleType('int', true, 1)], 'integer' => [1, false, new SimpleType('int', false, 1)], '?boolean' => [true, true, new SimpleType('bool', true, true)], 'boolean' => [true, false, new SimpleType('bool', false, true)], '?object' => [new \stdClass, true, new ObjectType(TypeName::fromQualifiedName(\stdClass::class), true)], 'object' => [new \stdClass, false, new ObjectType(TypeName::fromQualifiedName(\stdClass::class), false)], ]; } /** * @dataProvider namesToTypes */ public function testTypeMappingFromName(string $typeName, bool $allowsNull, $expectedType): void { $this->assertEquals($expectedType, Type::fromName($typeName, $allowsNull)); } public function namesToTypes(): array { return [ '?void' => ['void', true, new VoidType], 'void' => ['void', false, new VoidType], '?null' => ['null', true, new NullType], 'null' => ['null', true, new NullType], '?int' => ['int', true, new SimpleType('int', true)], '?integer' => ['integer', true, new SimpleType('int', true)], 'int' => ['int', false, new SimpleType('int', false)], 'bool' => ['bool', false, new SimpleType('bool', false)], 'boolean' => ['boolean', false, new SimpleType('bool', false)], 'object' => ['object', false, new GenericObjectType(false)], 'real' => ['real', false, new SimpleType('float', false)], 'double' => ['double', false, new SimpleType('float', false)], 'float' => ['float', false, new SimpleType('float', false)], 'string' => ['string', false, new SimpleType('string', false)], 'array' => ['array', false, new SimpleType('array', false)], 'resource' => ['resource', false, new SimpleType('resource', false)], 'resource (closed)' => ['resource (closed)', false, new SimpleType('resource (closed)', false)], 'unknown type' => ['unknown type', false, new UnknownType], '?classname' => [\stdClass::class, true, new ObjectType(TypeName::fromQualifiedName(\stdClass::class), true)], 'classname' => [\stdClass::class, false, new ObjectType(TypeName::fromQualifiedName(\stdClass::class), false)], 'callable' => ['callable', false, new CallableType(false)], '?callable' => ['callable', true, new CallableType(true)], 'iterable' => ['iterable', false, new IterableType(false)], '?iterable' => ['iterable', true, new IterableType(true)], ]; } } PK! )2''$type/tests/unit/CallableTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; use SebastianBergmann\Type\TestFixture\ClassWithCallbackMethods; use SebastianBergmann\Type\TestFixture\ClassWithInvokeMethod; /** * @covers \SebastianBergmann\Type\CallableType * * @uses \SebastianBergmann\Type\Type * @uses \SebastianBergmann\Type\ObjectType * @uses \SebastianBergmann\Type\SimpleType * @uses \SebastianBergmann\Type\TypeName */ final class CallableTypeTest extends TestCase { /** * @var CallableType */ private $type; protected function setUp(): void { $this->type = new CallableType(false); } public function testMayDisallowNull(): void { $this->assertFalse($this->type->allowsNull()); } public function testCanGenerateReturnTypeDeclaration(): void { $this->assertEquals(': callable', $this->type->getReturnTypeDeclaration()); } public function testMayAllowNull(): void { $type = new CallableType(true); $this->assertTrue($type->allowsNull()); } public function testCanGenerateNullableReturnTypeDeclaration(): void { $type = new CallableType(true); $this->assertEquals(': ?callable', $type->getReturnTypeDeclaration()); } public function testNullCanBeAssignedToNullableCallable(): void { $type = new CallableType(true); $this->assertTrue($type->isAssignable(new NullType)); } public function testCallableCanBeAssignedToCallable(): void { $this->assertTrue($this->type->isAssignable(new CallableType(false))); } public function testClosureCanBeAssignedToCallable(): void { $this->assertTrue( $this->type->isAssignable( new ObjectType( TypeName::fromQualifiedName(\Closure::class), false ) ) ); } public function testInvokableCanBeAssignedToCallable(): void { $this->assertTrue( $this->type->isAssignable( new ObjectType( TypeName::fromQualifiedName(ClassWithInvokeMethod::class), false ) ) ); } public function testStringWithFunctionNameCanBeAssignedToCallable(): void { $this->assertTrue( $this->type->isAssignable( Type::fromValue('SebastianBergmann\Type\TestFixture\callback_function', false) ) ); } public function testStringWithClassNameAndStaticMethodNameCanBeAssignedToCallable(): void { $this->assertTrue( $this->type->isAssignable( Type::fromValue(ClassWithCallbackMethods::class . '::staticCallback', false) ) ); } public function testArrayWithClassNameAndStaticMethodNameCanBeAssignedToCallable(): void { $this->assertTrue( $this->type->isAssignable( Type::fromValue([ClassWithCallbackMethods::class, 'staticCallback'], false) ) ); } public function testArrayWithClassNameAndInstanceMethodNameCanBeAssignedToCallable(): void { $this->assertTrue( $this->type->isAssignable( Type::fromValue([new ClassWithCallbackMethods, 'nonStaticCallback'], false) ) ); } public function testSomethingThatIsNotCallableCannotBeAssignedToCallable(): void { $this->assertFalse( $this->type->isAssignable( Type::fromValue(null, false) ) ); } public function testObjectWithoutInvokeMethodCannotBeAssignedToCallable(): void { $this->assertFalse( $this->type->isAssignable( Type::fromValue(new class { }, false) ) ); } } PK!浚,#type/tests/unit/UnknownTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Type\UnknownType */ final class UnknownTypeTest extends TestCase { /** * @var UnknownType */ private $type; protected function setUp(): void { $this->type = new UnknownType; } /** * @dataProvider assignableTypes */ public function testIsAssignable(Type $assignableType): void { $this->assertTrue($this->type->isAssignable($assignableType)); } public function assignableTypes(): array { return [ [new SimpleType('int', false)], [new SimpleType('int', true)], [new VoidType], [new ObjectType(TypeName::fromQualifiedName(self::class), false)], [new ObjectType(TypeName::fromQualifiedName(self::class), true)], [new UnknownType], ]; } public function testAllowsNull(): void { $this->assertTrue($this->type->allowsNull()); } public function testReturnTypeDeclaration(): void { $this->assertEquals('', $this->type->getReturnTypeDeclaration()); } } PK!u挒綍 type/tests/unit/VoidTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Type\VoidType */ final class VoidTypeTest extends TestCase { /** * @dataProvider assignableTypes */ public function testIsAssignable(Type $assignableType): void { $type = new VoidType; $this->assertTrue($type->isAssignable($assignableType)); } public function assignableTypes(): array { return [ [new VoidType], ]; } /** * @dataProvider notAssignableTypes */ public function testIsNotAssignable(Type $assignableType): void { $type = new VoidType; $this->assertFalse($type->isAssignable($assignableType)); } public function notAssignableTypes(): array { return [ [new SimpleType('int', false)], [new SimpleType('int', true)], [new ObjectType(TypeName::fromQualifiedName(self::class), false)], [new ObjectType(TypeName::fromQualifiedName(self::class), true)], [new UnknownType], ]; } public function testNotAllowNull(): void { $type = new VoidType; $this->assertFalse($type->allowsNull()); } public function testCanGenerateReturnTypeDeclaration(): void { $type = new VoidType; $this->assertEquals(': void', $type->getReturnTypeDeclaration()); } } PK!*琛摳"type/tests/unit/ObjectTypeTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use PHPUnit\Framework\TestCase; use SebastianBergmann\Type\TestFixture\ChildClass; use SebastianBergmann\Type\TestFixture\ParentClass; /** * @covers \SebastianBergmann\Type\ObjectType * * @uses \SebastianBergmann\Type\TypeName * @uses \SebastianBergmann\Type\Type * @uses \SebastianBergmann\Type\SimpleType */ final class ObjectTypeTest extends TestCase { /** * @var ObjectType */ private $childClass; /** * @var ObjectType */ private $parentClass; protected function setUp(): void { $this->childClass = new ObjectType( TypeName::fromQualifiedName(ChildClass::class), false ); $this->parentClass = new ObjectType( TypeName::fromQualifiedName(ParentClass::class), false ); } public function testParentIsNotAssignableToChild(): void { $this->assertFalse($this->childClass->isAssignable($this->parentClass)); } public function testChildIsAssignableToParent(): void { $this->assertTrue($this->parentClass->isAssignable($this->childClass)); } public function testClassIsAssignableToSelf(): void { $this->assertTrue($this->parentClass->isAssignable($this->parentClass)); } public function testSimpleTypeIsNotAssignableToClass(): void { $this->assertFalse($this->parentClass->isAssignable(new SimpleType('int', false))); } public function testClassFromOneNamespaceIsNotAssignableToClassInOtherNamespace(): void { $classFromNamespaceA = new ObjectType( TypeName::fromQualifiedName(\someNamespaceA\NamespacedClass::class), false ); $classFromNamespaceB = new ObjectType( TypeName::fromQualifiedName(\someNamespaceB\NamespacedClass::class), false ); $this->assertFalse($classFromNamespaceA->isAssignable($classFromNamespaceB)); } public function testClassIsAssignableToSelfCaseInsensitively(): void { $classLowercased = new ObjectType( TypeName::fromQualifiedName(\strtolower(ParentClass::class)), false ); $this->assertTrue($this->parentClass->isAssignable($classLowercased)); } public function testNullIsAssignableToNullableType(): void { $someClass = new ObjectType( TypeName::fromQualifiedName(ParentClass::class), true ); $this->assertTrue($someClass->isAssignable(Type::fromValue(null, true))); } public function testNullIsNotAssignableToNotNullableType(): void { $someClass = new ObjectType( TypeName::fromQualifiedName(ParentClass::class), false ); $this->assertFalse($someClass->isAssignable(Type::fromValue(null, true))); } public function testPreservesNullNotAllowed(): void { $someClass = new ObjectType( TypeName::fromQualifiedName(ParentClass::class), false ); $this->assertFalse($someClass->allowsNull()); } public function testPreservesNullAllowed(): void { $someClass = new ObjectType( TypeName::fromQualifiedName(ParentClass::class), true ); $this->assertTrue($someClass->allowsNull()); } public function testCanGenerateReturnTypeDeclaration(): void { $this->assertEquals(': SebastianBergmann\Type\TestFixture\ParentClass', $this->parentClass->getReturnTypeDeclaration()); } public function testHasClassName(): void { $this->assertEquals('SebastianBergmann\Type\TestFixture\ParentClass', $this->parentClass->className()->getQualifiedName()); } } PK!瓌Luu#type/tests/_fixture/ParentClass.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type\TestFixture; class ParentClass { public function foo(): void { } } PK!櫬N藠-type/tests/_fixture/ClassWithInvokeMethod.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type\TestFixture; final class ClassWithInvokeMethod { public function __invoke(): void { } } PK! 8\\"type/tests/_fixture/ChildClass.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type\TestFixture; class ChildClass extends ParentClass { } PK!誥!ZZ)type/tests/_fixture/callback_function.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type\TestFixture; function callback_function(): void { } PK!0type/tests/_fixture/ClassWithCallbackMethods.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type\TestFixture; final class ClassWithCallbackMethods { public static function staticCallback(): void { } public function nonStaticCallback(): void { } } PK!瓅饔KK type/tests/_fixture/Iterator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type\TestFixture; final class Iterator implements \Iterator { public function current(): void { } public function next(): void { } public function key(): void { } public function valid(): void { } public function rewind(): void { } } PK!謣dtype/.travis.ymlnu刐迭language: php php: - 7.2 - 7.3 - 7.4snapshot - nightly matrix: allow_failures: - php: master fast_finish: true env: matrix: - DEPENDENCIES="high" - DEPENDENCIES="low" global: - DEFAULT_COMPOSER_FLAGS="--no-interaction --no-ansi --no-progress --no-suggest" before_install: - ./tools/composer clear-cache install: - if [[ "$DEPENDENCIES" = 'high' ]]; then travis_retry ./tools/composer update $DEFAULT_COMPOSER_FLAGS; fi - if [[ "$DEPENDENCIES" = 'low' ]]; then travis_retry ./tools/composer update $DEFAULT_COMPOSER_FLAGS --prefer-lowest; fi script: - ./vendor/bin/phpunit --coverage-clover=coverage.xml after_success: - bash <(curl -s https://codecov.io/bash) notifications: email: false jobs: include: - stage: "Static Code Analysis" php: 7.3 env: php-cs-fixer install: - phpenv config-rm xdebug.ini script: - ./tools/php-cs-fixer fix --dry-run -v --show-progress=dots --diff-format=udiff - stage: "Static Code Analysis" php: 7.3 env: psalm install: - phpenv config-rm xdebug.ini script: - travis_retry ./tools/composer update $DEFAULT_COMPOSER_FLAGS - ./tools/psalm --shepherd --stats PK!o匵Btype/.php_cs.distnu刐迭 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'align_multiline_comment' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => true, 'cast_spaces' => true, 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => ['space' => 'none'], 'declare_strict_types' => true, 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'is_null' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'logical_operators' => true, 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'multiline_comment_opening_closing' => true, 'multiline_whitespace_before_semicolons' => true, 'native_constant_invocation' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'new_with_braces' => false, 'no_alias_functions' => true, 'no_alternative_syntax' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_before_namespace' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_multiline_whitespace_around_double_arrow' => true, 'no_null_property_initialization' => true, 'no_php4_constructor' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => true, 'no_unneeded_curly_braces' => true, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'ordered_interfaces' => [ 'direction' => 'ascend', 'order' => 'alpha', ], 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, 'phpdoc_types' => ['groups' => ['simple', 'meta']], 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'return_assignment' => true, 'return_type_declaration' => ['space_before' => 'none'], 'semicolon_after_instruction' => true, 'set_type_to_cast' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trailing_comma_in_multiline_array' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => [ 'elements' => [ 'const', 'method', 'property', ], ], 'void_return' => true, 'whitespace_after_comma_in_array' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ); PK!鱉媕type/composer.jsonnu刐迭{ "name": "sebastian/type", "description": "Collection of value objects that represent the types of the PHP type system", "type": "library", "homepage": "https://github.com/sebastianbergmann/type", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/type/issues" }, "prefer-stable": true, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "config": { "platform": { "php": "8.1.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture" ], "files": [ "tests/_fixture/callback_function.php", "tests/_fixture/functions_that_declare_return_types.php" ] }, "extra": { "branch-alias": { "dev-main": "4.0-dev" } } } PK!1酳)type/.github/FUNDING.ymlnu刐迭patreon: s_bergmann PK!鰕type/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [4.0.0] - 2023-02-03 ### Removed * This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 ## [3.2.1] - 2023-02-03 ### Fixed * [#28](https://github.com/sebastianbergmann/type/pull/28): Potential undefined offset warning/notice ## [3.2.0] - 2022-09-12 ### Added * [#25](https://github.com/sebastianbergmann/type/issues/25): Support Disjunctive Normal Form types * Added `ReflectionMapper::fromParameterTypes()` * Added `IntersectionType::types()` and `UnionType::types()` * Added `UnionType::containsIntersectionTypes()` ## [3.1.0] - 2022-08-29 ### Added * [#21](https://github.com/sebastianbergmann/type/issues/21): Support `true` as stand-alone type ## [3.0.0] - 2022-03-15 ### Added * Support for intersection types introduced in PHP 8.1 * Support for the `never` return type introduced in PHP 8.1 * Added `Type::isCallable()`, `Type::isGenericObject()`, `Type::isIterable()`, `Type::isMixed()`, `Type::isNever()`, `Type::isNull()`, `Type::isObject()`, `Type::isSimple()`, `Type::isStatic()`, `Type::isUnion()`, `Type::isUnknown()`, and `Type::isVoid()` ### Changed * Renamed `ReflectionMapper::fromMethodReturnType(ReflectionMethod $method)` to `ReflectionMapper::fromReturnType(ReflectionFunctionAbstract $functionOrMethod)` ### Removed * Removed `Type::getReturnTypeDeclaration()` (use `Type::asString()` instead and prefix its result with `': '`) * Removed `TypeName::getNamespaceName()` (use `TypeName::namespaceName()` instead) * Removed `TypeName::getSimpleName()` (use `TypeName::simpleName()` instead) * Removed `TypeName::getQualifiedName()` (use `TypeName::qualifiedName()` instead) ## [2.3.4] - 2021-06-15 ### Fixed * Fixed regression introduced in 2.3.3 ## [2.3.3] - 2021-06-15 [YANKED] ### Fixed * [#15](https://github.com/sebastianbergmann/type/issues/15): "false" pseudo type is not handled properly ## [2.3.2] - 2021-06-04 ### Fixed * Fixed handling of tentatively declared return types ## [2.3.1] - 2020-10-26 ### Fixed * `SebastianBergmann\Type\Exception` now correctly extends `\Throwable` ## [2.3.0] - 2020-10-06 ### Added * [#14](https://github.com/sebastianbergmann/type/issues/14): Support for `static` return type that is introduced in PHP 8 ## [2.2.2] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.2.1] - 2020-07-05 ### Fixed * Fixed handling of `mixed` type in `ReflectionMapper::fromMethodReturnType()` ## [2.2.0] - 2020-07-05 ### Added * Added `MixedType` object for representing PHP 8's `mixed` type ## [2.1.1] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [2.1.0] - 2020-06-01 ### Added * Added `UnionType` object for representing PHP 8's Union Types * Added `ReflectionMapper::fromMethodReturnType()` for mapping `\ReflectionMethod::getReturnType()` to a `Type` object * Added `Type::name()` for retrieving the name of a type * Added `Type::asString()` for retrieving a textual representation of a type ### Changed * Deprecated `Type::getReturnTypeDeclaration()` (use `Type::asString()` instead and prefix its result with `': '`) * Deprecated `TypeName::getNamespaceName()` (use `TypeName::namespaceName()` instead) * Deprecated `TypeName::getSimpleName()` (use `TypeName::simpleName()` instead) * Deprecated `TypeName::getQualifiedName()` (use `TypeName::qualifiedName()` instead) ## [2.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.2 ## [1.1.3] - 2019-07-02 ### Fixed * Fixed class name comparison in `ObjectType` to be case-insensitive ## [1.1.2] - 2019-06-19 ### Fixed * Fixed handling of `object` type ## [1.1.1] - 2019-06-08 ### Fixed * Fixed autoloading of `callback_function.php` fixture file ## [1.1.0] - 2019-06-07 ### Added * Added support for `callable` type * Added support for `iterable` type ## [1.0.0] - 2019-06-06 * Initial release based on [code contributed by Michel Hartmann to PHPUnit](https://github.com/sebastianbergmann/phpunit/pull/3673) [4.0.0]: https://github.com/sebastianbergmann/type/compare/3.2.1...4.0.0 [3.2.1]: https://github.com/sebastianbergmann/type/compare/3.2.0...3.2.1 [3.2.0]: https://github.com/sebastianbergmann/type/compare/3.1.0...3.2.0 [3.1.0]: https://github.com/sebastianbergmann/type/compare/3.0.0...3.1.0 [3.0.0]: https://github.com/sebastianbergmann/type/compare/2.3.4...3.0.0 [2.3.4]: https://github.com/sebastianbergmann/type/compare/ca39369c41313ed12c071ed38ecda8fcdb248859...2.3.4 [2.3.3]: https://github.com/sebastianbergmann/type/compare/2.3.2...ca39369c41313ed12c071ed38ecda8fcdb248859 [2.3.2]: https://github.com/sebastianbergmann/type/compare/2.3.1...2.3.2 [2.3.1]: https://github.com/sebastianbergmann/type/compare/2.3.0...2.3.1 [2.3.0]: https://github.com/sebastianbergmann/type/compare/2.2.2...2.3.0 [2.2.2]: https://github.com/sebastianbergmann/type/compare/2.2.1...2.2.2 [2.2.1]: https://github.com/sebastianbergmann/type/compare/2.2.0...2.2.1 [2.2.0]: https://github.com/sebastianbergmann/type/compare/2.1.1...2.2.0 [2.1.1]: https://github.com/sebastianbergmann/type/compare/2.1.0...2.1.1 [2.1.0]: https://github.com/sebastianbergmann/type/compare/2.0.0...2.1.0 [2.0.0]: https://github.com/sebastianbergmann/type/compare/1.1.3...2.0.0 [1.1.3]: https://github.com/sebastianbergmann/type/compare/1.1.2...1.1.3 [1.1.2]: https://github.com/sebastianbergmann/type/compare/1.1.1...1.1.2 [1.1.1]: https://github.com/sebastianbergmann/type/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/sebastianbergmann/type/compare/1.0.0...1.1.0 [1.0.0]: https://github.com/sebastianbergmann/type/compare/ff74aa41746bd8d10e931843ebf37d42da513ede...1.0.0 PK!X铋扏@type/src/TypeName.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function array_pop; use function explode; use function implode; use function substr; use ReflectionClass; final class TypeName { private ?string $namespaceName; private string $simpleName; public static function fromQualifiedName(string $fullClassName): self { if ($fullClassName[0] === '\\') { $fullClassName = substr($fullClassName, 1); } $classNameParts = explode('\\', $fullClassName); $simpleName = array_pop($classNameParts); $namespaceName = implode('\\', $classNameParts); return new self($namespaceName, $simpleName); } public static function fromReflection(ReflectionClass $type): self { return new self( $type->getNamespaceName(), $type->getShortName() ); } public function __construct(?string $namespaceName, string $simpleName) { if ($namespaceName === '') { $namespaceName = null; } $this->namespaceName = $namespaceName; $this->simpleName = $simpleName; } public function namespaceName(): ?string { return $this->namespaceName; } public function simpleName(): string { return $this->simpleName; } public function qualifiedName(): string { return $this->namespaceName === null ? $this->simpleName : $this->namespaceName . '\\' . $this->simpleName; } public function isNamespaced(): bool { return $this->namespaceName !== null; } } PK!)T[[type/src/VoidType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class VoidType extends Type { public function isAssignable(Type $other): bool { return $other instanceof self; } public function getReturnTypeDeclaration(): string { return ': void'; } public function allowsNull(): bool { return false; } } PK!彻璹QQtype/src/IterableType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class IterableType extends Type { /** * @var bool */ private $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } /** * @throws RuntimeException */ public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { return true; } if ($other instanceof SimpleType) { return \is_iterable($other->value()); } if ($other instanceof ObjectType) { try { return (new \ReflectionClass($other->className()->getQualifiedName()))->isIterable(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } } return false; } public function getReturnTypeDeclaration(): string { return ': ' . ($this->allowsNull ? '?' : '') . 'iterable'; } public function allowsNull(): bool { return $this->allowsNull; } } PK!9誳闧[type/src/NullType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class NullType extends Type { public function isAssignable(Type $other): bool { return !($other instanceof VoidType); } public function getReturnTypeDeclaration(): string { return ''; } public function allowsNull(): bool { return true; } } PK!艠1咤type/src/ObjectType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class ObjectType extends Type { /** * @var TypeName */ private $className; /** * @var bool */ private $allowsNull; public function __construct(TypeName $className, bool $allowsNull) { $this->className = $className; $this->allowsNull = $allowsNull; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { if (0 === \strcasecmp($this->className->getQualifiedName(), $other->className->getQualifiedName())) { return true; } if (\is_subclass_of($other->className->getQualifiedName(), $this->className->getQualifiedName(), true)) { return true; } } return false; } public function getReturnTypeDeclaration(): string { return ': ' . ($this->allowsNull ? '?' : '') . $this->className->getQualifiedName(); } public function allowsNull(): bool { return $this->allowsNull; } public function className(): TypeName { return $this->className; } } PK!螉]練type/src/CallableType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class CallableType extends Type { /** * @var bool */ private $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } /** * @throws RuntimeException */ public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { return true; } if ($other instanceof ObjectType) { if ($this->isClosure($other)) { return true; } if ($this->hasInvokeMethod($other)) { return true; } } if ($other instanceof SimpleType) { if ($this->isFunction($other)) { return true; } if ($this->isClassCallback($other)) { return true; } if ($this->isObjectCallback($other)) { return true; } } return false; } public function getReturnTypeDeclaration(): string { return ': ' . ($this->allowsNull ? '?' : '') . 'callable'; } public function allowsNull(): bool { return $this->allowsNull; } private function isClosure(ObjectType $type): bool { return !$type->className()->isNamespaced() && $type->className()->getSimpleName() === \Closure::class; } /** * @throws RuntimeException */ private function hasInvokeMethod(ObjectType $type): bool { try { $class = new \ReflectionClass($type->className()->getQualifiedName()); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } if ($class->hasMethod('__invoke')) { return true; } return false; } private function isFunction(SimpleType $type): bool { if (!\is_string($type->value())) { return false; } return \function_exists($type->value()); } private function isObjectCallback(SimpleType $type): bool { if (!\is_array($type->value())) { return false; } if (\count($type->value()) !== 2) { return false; } if (!\is_object($type->value()[0]) || !\is_string($type->value()[1])) { return false; } [$object, $methodName] = $type->value(); $reflector = new \ReflectionObject($object); return $reflector->hasMethod($methodName); } private function isClassCallback(SimpleType $type): bool { if (!\is_string($type->value()) && !\is_array($type->value())) { return false; } if (\is_string($type->value())) { if (\strpos($type->value(), '::') === false) { return false; } [$className, $methodName] = \explode('::', $type->value()); } if (\is_array($type->value())) { if (\count($type->value()) !== 2) { return false; } if (!\is_string($type->value()[0]) || !\is_string($type->value()[1])) { return false; } [$className, $methodName] = $type->value(); } \assert(isset($className) && \is_string($className)); \assert(isset($methodName) && \is_string($methodName)); try { $class = new \ReflectionClass($className); if ($class->hasMethod($methodName)) { $method = $class->getMethod($methodName); return $method->isPublic() && $method->isStatic(); } // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new RuntimeException( $e->getMessage(), (int) $e->getCode(), $e ); // @codeCoverageIgnoreEnd } return false; } } PK!k5type/src/Type.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; abstract class Type { public static function fromValue($value, bool $allowsNull): self { $typeName = \gettype($value); if ($typeName === 'object') { return new ObjectType(TypeName::fromQualifiedName(\get_class($value)), $allowsNull); } $type = self::fromName($typeName, $allowsNull); if ($type instanceof SimpleType) { $type = new SimpleType($typeName, $allowsNull, $value); } return $type; } public static function fromName(string $typeName, bool $allowsNull): self { switch (\strtolower($typeName)) { case 'callable': return new CallableType($allowsNull); case 'iterable': return new IterableType($allowsNull); case 'null': return new NullType; case 'object': return new GenericObjectType($allowsNull); case 'unknown type': return new UnknownType; case 'void': return new VoidType; case 'array': case 'bool': case 'boolean': case 'double': case 'float': case 'int': case 'integer': case 'real': case 'resource': case 'resource (closed)': case 'string': return new SimpleType($typeName, $allowsNull); default: return new ObjectType(TypeName::fromQualifiedName($typeName), $allowsNull); } } abstract public function isAssignable(Type $other): bool; abstract public function getReturnTypeDeclaration(): string; abstract public function allowsNull(): bool; } PK!56媴ww'type/src/exception/RuntimeException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class RuntimeException extends \RuntimeException implements Exception { } PK!g@杉aa type/src/exception/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use Throwable; interface Exception extends Throwable { } PK!type/src/GenericObjectType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class GenericObjectType extends Type { /** * @var bool */ private $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if (!$other instanceof ObjectType) { return false; } return true; } public function getReturnTypeDeclaration(): string { return ': ' . ($this->allowsNull ? '?' : '') . 'object'; } public function allowsNull(): bool { return $this->allowsNull; } } PK! 猾EEtype/src/UnknownType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class UnknownType extends Type { public function isAssignable(Type $other): bool { return true; } public function getReturnTypeDeclaration(): string { return ''; } public function allowsNull(): bool { return true; } } PK!g type/src/SimpleType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class SimpleType extends Type { /** * @var string */ private $name; /** * @var bool */ private $allowsNull; /** * @var mixed */ private $value; public function __construct(string $name, bool $nullable, $value = null) { $this->name = $this->normalize($name); $this->allowsNull = $nullable; $this->value = $value; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { return $this->name === $other->name; } return false; } public function getReturnTypeDeclaration(): string { return ': ' . ($this->allowsNull ? '?' : '') . $this->name; } public function allowsNull(): bool { return $this->allowsNull; } public function value() { return $this->value; } private function normalize(string $name): string { $name = \strtolower($name); switch ($name) { case 'boolean': return 'bool'; case 'real': case 'double': return 'float'; case 'integer': return 'int'; case '[]': return 'array'; default: return $name; } } } PK!罨type/psalm.xmlnu刐迭 PK!鳘霉type/build.xmlnu刐迭 PK!拿e9type/.gitattributesnu刐迭/tools export-ignore PK!婰馅type/.gitignorenu刐迭/.php_cs /.php_cs.cache /.phpunit.result.cache /composer.lock /vendor # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf # Generated files .idea/**/contentModel.xml # Sensitive or high-churn files .idea/**/dataSources/ .idea/**/dataSources.ids .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml .idea/**/dbnavigator.xml # Gradle .idea/**/gradle.xml .idea/**/libraries # Gradle and Maven with auto-import # When using Gradle or Maven with auto-import, you should exclude module files, # since they will be recreated, and may cause churn. Uncomment if using # auto-import. # .idea/modules.xml # .idea/*.iml # .idea/modules # CMake cmake-build-*/ # Mongo Explorer plugin .idea/**/mongoSettings.xml # File-based project format *.iws # IntelliJ out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties # Editor-based Rest Client .idea/httpRequests # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser PK!:diff/phpunit.xmlnu誌w洞 tests src PK!坌fdiff/README.mdnu誌w洞# sebastian/diff Diff implementation for PHP, factored out of PHPUnit into a stand-alone component. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/diff If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/diff ### Usage The `Differ` class can be used to generate a textual representation of the difference between two strings: ```php use SebastianBergmann\Diff\Differ; $differ = new Differ; print $differ->diff('foo', 'bar'); ``` The code above yields the output below: --- Original +++ New @@ @@ -foo +bar The `Parser` class can be used to parse a unified diff into an object graph: ```php use SebastianBergmann\Diff\Parser; use SebastianBergmann\Git; $git = new Git('/usr/local/src/money'); $diff = $git->getDiff( '948a1a07768d8edd10dcefa8315c1cbeffb31833', 'c07a373d2399f3e686234c4f7f088d635eb9641b' ); $parser = new Parser; print_r($parser->parse($diff)); ``` The code above yields the output below: Array ( [0] => SebastianBergmann\Diff\Diff Object ( [from:SebastianBergmann\Diff\Diff:private] => a/tests/MoneyTest.php [to:SebastianBergmann\Diff\Diff:private] => b/tests/MoneyTest.php [chunks:SebastianBergmann\Diff\Diff:private] => Array ( [0] => SebastianBergmann\Diff\Chunk Object ( [start:SebastianBergmann\Diff\Chunk:private] => 87 [startRange:SebastianBergmann\Diff\Chunk:private] => 7 [end:SebastianBergmann\Diff\Chunk:private] => 87 [endRange:SebastianBergmann\Diff\Chunk:private] => 7 [lines:SebastianBergmann\Diff\Chunk:private] => Array ( [0] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::add ) [1] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => * @covers SebastianBergmann\Money\Money::newMoney ) [2] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => */ ) [3] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 2 [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded() ) [4] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 1 [content:SebastianBergmann\Diff\Line:private] => public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded() ) [5] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => { ) [6] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => $a = new Money(1, new Currency('EUR')); ) [7] => SebastianBergmann\Diff\Line Object ( [type:SebastianBergmann\Diff\Line:private] => 3 [content:SebastianBergmann\Diff\Line:private] => $b = new Money(2, new Currency('EUR')); ) ) ) ) ) ) PK!    diff/LICENSEnu誌w洞sebastian/diff Copyright (c) 2002-2017, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!?承*diff/tests/LineTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\Line */ class LineTest extends TestCase { /** * @var Line */ private $line; protected function setUp() { $this->line = new Line; } public function testCanBeCreatedWithoutArguments() { $this->assertInstanceOf('SebastianBergmann\Diff\Line', $this->line); } public function testTypeCanBeRetrieved() { $this->assertEquals(Line::UNCHANGED, $this->line->getType()); } public function testContentCanBeRetrieved() { $this->assertEquals('', $this->line->getContent()); } } PK!s'D !diff/tests/fixtures/.editorconfignu刐迭root = true PK!腢$diff/tests/fixtures/patch.txtnu誌w洞diff --git a/Foo.php b/Foo.php index abcdefg..abcdefh 100644 --- a/Foo.php +++ b/Foo.php @@ -20,4 +20,5 @@ class Foo const ONE = 1; const TWO = 2; + const THREE = 3; const FOUR = 4; PK!s'D %diff/tests/fixtures/out/.editorconfignu刐迭root = true PK!鞴DD"diff/tests/fixtures/out/.gitignorenu刐迭# reset all ignore rules to create sandbox for integration test !/**PK!Z$>//'diff/tests/fixtures/serialized_diff.binnu刐迭a:1:{i:0;O:27:"SebastianBergmann\Diff\Diff":3:{s:33:"SebastianBergmann\Diff\Difffrom";s:7:"old.txt";s:31:"SebastianBergmann\Diff\Diffto";s:7:"new.txt";s:35:"SebastianBergmann\Diff\Diffchunks";a:3:{i:0;O:28:"SebastianBergmann\Diff\Chunk":5:{s:35:"SebastianBergmann\Diff\Chunkstart";i:1;s:40:"SebastianBergmann\Diff\ChunkstartRange";i:3;s:33:"SebastianBergmann\Diff\Chunkend";i:1;s:38:"SebastianBergmann\Diff\ChunkendRange";i:4;s:35:"SebastianBergmann\Diff\Chunklines";a:4:{i:0;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:1;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222111";}i:1;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"1111111";}i:2;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"1111111";}i:3;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"1111111";}}}i:1;O:28:"SebastianBergmann\Diff\Chunk":5:{s:35:"SebastianBergmann\Diff\Chunkstart";i:5;s:40:"SebastianBergmann\Diff\ChunkstartRange";i:10;s:33:"SebastianBergmann\Diff\Chunkend";i:6;s:38:"SebastianBergmann\Diff\ChunkendRange";i:8;s:35:"SebastianBergmann\Diff\Chunklines";a:11:{i:0;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"1111111";}i:1;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"1111111";}i:2;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"1111111";}i:3;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:8:"+1121211";}i:4;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"1111111";}i:5;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:8:"-1111111";}i:6;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:8:"-1111111";}i:7;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:8:"-2222222";}i:8;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}i:9;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}i:10;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}}}i:2;O:28:"SebastianBergmann\Diff\Chunk":5:{s:35:"SebastianBergmann\Diff\Chunkstart";i:17;s:40:"SebastianBergmann\Diff\ChunkstartRange";i:5;s:33:"SebastianBergmann\Diff\Chunkend";i:16;s:38:"SebastianBergmann\Diff\ChunkendRange";i:6;s:35:"SebastianBergmann\Diff\Chunklines";a:6:{i:0;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}i:1;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}i:2;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}i:3;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:8:"+2122212";}i:4;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}i:5;O:27:"SebastianBergmann\Diff\Line":2:{s:33:"SebastianBergmann\Diff\Linetype";i:3;s:36:"SebastianBergmann\Diff\Linecontent";s:7:"2222222";}}}}}}PK!C痉Adiff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txtnu刐迭aPK!2##Adiff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txtnu刐迭a a a a a a a a a a b a a a a a a cPK!&/鬍EAdiff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txtnu刐迭a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a aPK!Adiff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txtnu刐迭PK!@k閻diff/tests/fixtures/patch2.txtnu誌w洞diff --git a/Foo.php b/Foo.php index abcdefg..abcdefh 100644 --- a/Foo.php +++ b/Foo.php @@ -20,4 +20,5 @@ class Foo const ONE = 1; const TWO = 2; + const THREE = 3; const FOUR = 4; @@ -320,4 +320,5 @@ class Foo const A = 'A'; const B = 'B'; + const C = 'C'; const D = 'D'; @@ -600,4 +600,5 @@ class Foo public function doSomething() { + return 'foo'; } PK!嘜鼺  diff/tests/ChunkTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\Chunk */ class ChunkTest extends TestCase { /** * @var Chunk */ private $chunk; protected function setUp() { $this->chunk = new Chunk; } public function testCanBeCreatedWithoutArguments() { $this->assertInstanceOf('SebastianBergmann\Diff\Chunk', $this->chunk); } public function testStartCanBeRetrieved() { $this->assertEquals(0, $this->chunk->getStart()); } public function testStartRangeCanBeRetrieved() { $this->assertEquals(1, $this->chunk->getStartRange()); } public function testEndCanBeRetrieved() { $this->assertEquals(0, $this->chunk->getEnd()); } public function testEndRangeCanBeRetrieved() { $this->assertEquals(1, $this->chunk->getEndRange()); } public function testLinesCanBeRetrieved() { $this->assertEquals(array(), $this->chunk->getLines()); } public function testLinesCanBeSet() { $this->assertEquals(array(), $this->chunk->getLines()); $testValue = array('line0', 'line1'); $this->chunk->setLines($testValue); $this->assertEquals($testValue, $this->chunk->getLines()); } } PK!犡锨><><diff/tests/DifferTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use SebastianBergmann\Diff\LCS\MemoryEfficientImplementation; use SebastianBergmann\Diff\LCS\TimeEfficientImplementation; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\Differ * * @uses SebastianBergmann\Diff\LCS\MemoryEfficientImplementation * @uses SebastianBergmann\Diff\LCS\TimeEfficientImplementation * @uses SebastianBergmann\Diff\Chunk * @uses SebastianBergmann\Diff\Diff * @uses SebastianBergmann\Diff\Line * @uses SebastianBergmann\Diff\Parser */ class DifferTest extends TestCase { const REMOVED = 2; const ADDED = 1; const OLD = 0; /** * @var Differ */ private $differ; protected function setUp() { $this->differ = new Differ; } /** * @param array $expected * @param string|array $from * @param string|array $to * @dataProvider arrayProvider */ public function testArrayRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation(array $expected, $from, $to) { $this->assertEquals($expected, $this->differ->diffToArray($from, $to, new TimeEfficientImplementation)); } /** * @param string $expected * @param string $from * @param string $to * @dataProvider textProvider */ public function testTextRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation($expected, $from, $to) { $this->assertEquals($expected, $this->differ->diff($from, $to, new TimeEfficientImplementation)); } /** * @param array $expected * @param string|array $from * @param string|array $to * @dataProvider arrayProvider */ public function testArrayRepresentationOfDiffCanBeRenderedUsingMemoryEfficientLcsImplementation(array $expected, $from, $to) { $this->assertEquals($expected, $this->differ->diffToArray($from, $to, new MemoryEfficientImplementation)); } /** * @param string $expected * @param string $from * @param string $to * @dataProvider textProvider */ public function testTextRepresentationOfDiffCanBeRenderedUsingMemoryEfficientLcsImplementation($expected, $from, $to) { $this->assertEquals($expected, $this->differ->diff($from, $to, new MemoryEfficientImplementation)); } public function testCustomHeaderCanBeUsed() { $differ = new Differ('CUSTOM HEADER'); $this->assertEquals( "CUSTOM HEADER@@ @@\n-a\n+b\n", $differ->diff('a', 'b') ); } public function testTypesOtherThanArrayAndStringCanBePassed() { $this->assertEquals( "--- Original\n+++ New\n@@ @@\n-1\n+2\n", $this->differ->diff(1, 2) ); } /** * @param string $diff * @param Diff[] $expected * @dataProvider diffProvider */ public function testParser($diff, array $expected) { $parser = new Parser; $result = $parser->parse($diff); $this->assertEquals($expected, $result); } public function arrayProvider() { return array( array( array( array('a', self::REMOVED), array('b', self::ADDED) ), 'a', 'b' ), array( array( array('ba', self::REMOVED), array('bc', self::ADDED) ), 'ba', 'bc' ), array( array( array('ab', self::REMOVED), array('cb', self::ADDED) ), 'ab', 'cb' ), array( array( array('abc', self::REMOVED), array('adc', self::ADDED) ), 'abc', 'adc' ), array( array( array('ab', self::REMOVED), array('abc', self::ADDED) ), 'ab', 'abc' ), array( array( array('bc', self::REMOVED), array('abc', self::ADDED) ), 'bc', 'abc' ), array( array( array('abc', self::REMOVED), array('abbc', self::ADDED) ), 'abc', 'abbc' ), array( array( array('abcdde', self::REMOVED), array('abcde', self::ADDED) ), 'abcdde', 'abcde' ), 'same start' => array( array( array(17, self::OLD), array('b', self::REMOVED), array('d', self::ADDED), ), array(30 => 17, 'a' => 'b'), array(30 => 17, 'c' => 'd'), ), 'same end' => array( array( array(1, self::REMOVED), array(2, self::ADDED), array('b', self::OLD), ), array(1 => 1, 'a' => 'b'), array(1 => 2, 'a' => 'b'), ), 'same start (2), same end (1)' => array( array( array(17, self::OLD), array(2, self::OLD), array(4, self::REMOVED), array('a', self::ADDED), array(5, self::ADDED), array('x', self::OLD), ), array(30 => 17, 1 => 2, 2 => 4, 'z' => 'x'), array(30 => 17, 1 => 2, 3 => 'a', 2 => 5, 'z' => 'x'), ), 'same' => array( array( array('x', self::OLD), ), array('z' => 'x'), array('z' => 'x'), ), 'diff' => array( array( array('y', self::REMOVED), array('x', self::ADDED), ), array('x' => 'y'), array('z' => 'x'), ), 'diff 2' => array( array( array('y', self::REMOVED), array('b', self::REMOVED), array('x', self::ADDED), array('d', self::ADDED), ), array('x' => 'y', 'a' => 'b'), array('z' => 'x', 'c' => 'd'), ), 'test line diff detection' => array( array( array( '#Warning: Strings contain different line endings!', self::OLD, ), array( 'assertSame($expected, $differ->diff($from, $to)); } public function textForNoNonDiffLinesProvider() { return array( array( '', 'a', 'a' ), array( "-A\n+C\n", "A\n\n\nB", "C\n\n\nB", ), ); } /** * @requires PHPUnit 5.7 */ public function testDiffToArrayInvalidFromType() { $differ = new Differ; $this->expectException('\InvalidArgumentException'); $this->expectExceptionMessageRegExp('#^"from" must be an array or string\.$#'); $differ->diffToArray(null, ''); } /** * @requires PHPUnit 5.7 */ public function testDiffInvalidToType() { $differ = new Differ; $this->expectException('\InvalidArgumentException'); $this->expectExceptionMessageRegExp('#^"to" must be an array or string\.$#'); $differ->diffToArray('', new \stdClass); } } PK!"diff/tests/ParserTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\Parser * * @uses SebastianBergmann\Diff\Chunk * @uses SebastianBergmann\Diff\Diff * @uses SebastianBergmann\Diff\Line */ class ParserTest extends TestCase { /** * @var Parser */ private $parser; protected function setUp() { $this->parser = new Parser; } public function testParse() { $content = \file_get_contents(__DIR__ . '/fixtures/patch.txt'); $diffs = $this->parser->parse($content); $this->assertInternalType('array', $diffs); $this->assertContainsOnlyInstancesOf('SebastianBergmann\Diff\Diff', $diffs); $this->assertCount(1, $diffs); $chunks = $diffs[0]->getChunks(); $this->assertInternalType('array', $chunks); $this->assertContainsOnlyInstancesOf('SebastianBergmann\Diff\Chunk', $chunks); $this->assertCount(1, $chunks); $this->assertEquals(20, $chunks[0]->getStart()); $this->assertCount(4, $chunks[0]->getLines()); } public function testParseWithMultipleChunks() { $content = \file_get_contents(__DIR__ . '/fixtures/patch2.txt'); $diffs = $this->parser->parse($content); $this->assertCount(1, $diffs); $chunks = $diffs[0]->getChunks(); $this->assertCount(3, $chunks); $this->assertEquals(20, $chunks[0]->getStart()); $this->assertEquals(320, $chunks[1]->getStart()); $this->assertEquals(600, $chunks[2]->getStart()); $this->assertCount(5, $chunks[0]->getLines()); $this->assertCount(5, $chunks[1]->getLines()); $this->assertCount(4, $chunks[2]->getLines()); } public function testParseWithRemovedLines() { $content = <<parser->parse($content); $this->assertInternalType('array', $diffs); $this->assertContainsOnlyInstancesOf('SebastianBergmann\Diff\Diff', $diffs); $this->assertCount(1, $diffs); $chunks = $diffs[0]->getChunks(); $this->assertInternalType('array', $chunks); $this->assertContainsOnlyInstancesOf('SebastianBergmann\Diff\Chunk', $chunks); $this->assertCount(1, $chunks); $chunk = $chunks[0]; $this->assertSame(49, $chunk->getStart()); $this->assertSame(49, $chunk->getEnd()); $this->assertSame(9, $chunk->getStartRange()); $this->assertSame(8, $chunk->getEndRange()); $lines = $chunk->getLines(); $this->assertInternalType('array', $lines); $this->assertContainsOnlyInstancesOf('SebastianBergmann\Diff\Line', $lines); $this->assertCount(2, $lines); /** @var Line $line */ $line = $lines[0]; $this->assertSame('A', $line->getContent()); $this->assertSame(Line::UNCHANGED, $line->getType()); $line = $lines[1]; $this->assertSame('B', $line->getContent()); $this->assertSame(Line::REMOVED, $line->getType()); } public function testParseDiffForMulitpleFiles() { $content = <<parser->parse($content); $this->assertCount(2, $diffs); /** @var Diff $diff */ $diff = $diffs[0]; $this->assertSame('a/Test.txt', $diff->getFrom()); $this->assertSame('b/Test.txt', $diff->getTo()); $this->assertCount(1, $diff->getChunks()); $diff = $diffs[1]; $this->assertSame('a/Test2.txt', $diff->getFrom()); $this->assertSame('b/Test2.txt', $diff->getTo()); $this->assertCount(1, $diff->getChunks()); } } PK!⺋^^diff/tests/DiffTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\Diff * * @uses SebastianBergmann\Diff\Chunk */ final class DiffTest extends TestCase { public function testGettersAfterConstructionWithDefault() { $from = 'line1a'; $to = 'line2a'; $diff = new Diff($from, $to); $this->assertSame($from, $diff->getFrom()); $this->assertSame($to, $diff->getTo()); $this->assertSame(array(), $diff->getChunks(), 'Expect chunks to be default value "array()".'); } public function testGettersAfterConstructionWithChunks() { $from = 'line1b'; $to = 'line2b'; $chunks = array(new Chunk(), new Chunk(2, 3)); $diff = new Diff($from, $to, $chunks); $this->assertSame($from, $diff->getFrom()); $this->assertSame($to, $diff->getTo()); $this->assertSame($chunks, $diff->getChunks(), 'Expect chunks to be passed value.'); } public function testSetChunksAfterConstruction() { $diff = new Diff('line1c', 'line2c'); $this->assertSame(array(), $diff->getChunks(), 'Expect chunks to be default value "array()".'); $chunks = array(new Chunk(), new Chunk(2, 3)); $diff->setChunks($chunks); $this->assertSame($chunks, $diff->getChunks(), 'Expect chunks to be passed value.'); } } PK!陫$辻y.diff/tests/TimeEfficientImplementationTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; /** * @covers SebastianBergmann\Diff\TimeEfficientLongestCommonSubsequenceCalculator */ final class TimeEfficientImplementationTest extends LongestCommonSubsequenceTest { protected function createImplementation(): LongestCommonSubsequenceCalculator { return new TimeEfficientLongestCommonSubsequenceCalculator; } } PK!耦k朦diff/tests/Utils/FileUtils.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Utils; final class FileUtils { public static function getFileContent(string $file): string { $content = @\file_get_contents($file); if (false === $content) { $error = \error_get_last(); throw new \RuntimeException(\sprintf( 'Failed to read content of file "%s".%s', $file, $error ? ' ' . $error['message'] : '' )); } return $content; } } PK!櫠グd,d,/diff/tests/Utils/UnifiedDiffAssertTraitTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Utils; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\Utils\UnifiedDiffAssertTrait */ final class UnifiedDiffAssertTraitTest extends TestCase { use UnifiedDiffAssertTrait; /** * @param string $diff * * @dataProvider provideValidCases */ public function testValidCases(string $diff): void { $this->assertValidUnifiedDiffFormat($diff); } public function provideValidCases(): array { return [ [ '--- Original +++ New @@ -8 +8 @@ -Z +U ', ], [ '--- Original +++ New @@ -8 +8 @@ -Z +U @@ -15 +15 @@ -X +V ', ], 'empty diff. is valid' => [ '', ], ]; } public function testNoLinebreakEnd(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Expected diff to end with a line break, got "C".', '#'))); $this->assertValidUnifiedDiffFormat("A\nB\nC"); } public function testInvalidStartWithoutHeader(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote("Expected line to start with '@', '-' or '+', got \"A\n\". Line 1.", '#'))); $this->assertValidUnifiedDiffFormat("A\n"); } public function testInvalidStartHeader1(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote("Line 1 indicates a header, so line 2 must start with \"+++\".\nLine 1: \"--- A\n\"\nLine 2: \"+ 1\n\".", '#'))); $this->assertValidUnifiedDiffFormat("--- A\n+ 1\n"); } public function testInvalidStartHeader2(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote("Header line does not match expected pattern, got \"+++ file X\n\". Line 2.", '#'))); $this->assertValidUnifiedDiffFormat("--- A\n+++ file\tX\n"); } public function testInvalidStartHeader3(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Date of header line does not match expected pattern, got "[invalid date]". Line 1.', '#'))); $this->assertValidUnifiedDiffFormat( "--- Original\t[invalid date] +++ New @@ -1,2 +1,2 @@ -A +B " . ' ' ); } public function testInvalidStartHeader4(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote("Expected header line to start with \"+++ \", got \"+++INVALID\n\". Line 2.", '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++INVALID @@ -1,2 +1,2 @@ -A +B ' . ' ' ); } public function testInvalidLine1(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote("Expected line to start with '@', '-' or '+', got \"1\n\". Line 5.", '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8 +8 @@ -Z 1 +U ' ); } public function testInvalidLine2(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Expected string length of minimal 2, got 1. Line 4.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8 +8 @@ ' ); } public function testHunkInvalidFormat(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote("Hunk header line does not match expected pattern, got \"@@ INVALID -1,1 +1,1 @@\n\". Line 3.", '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ INVALID -1,1 +1,1 @@ -Z +U ' ); } public function testHunkOverlapFrom(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected new hunk; "from" (\'-\') start overlaps previous hunk. Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,1 +8,1 @@ -Z +U @@ -7,1 +9,1 @@ -Z +U ' ); } public function testHunkOverlapTo(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected new hunk; "to" (\'+\') start overlaps previous hunk. Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,1 +8,1 @@ -Z +U @@ -17,1 +7,1 @@ -Z +U ' ); } public function testExpectHunk1(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Expected hunk start (\'@\'), got "+". Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8 +8 @@ -Z +U +O ' ); } public function testExpectHunk2(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected hunk start (\'@\'). Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,12 +8,12 @@ ' . ' ' . ' @@ -38,12 +48,12 @@ ' ); } public function testMisplacedLineAfterComments1(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected line as 2 "No newline" markers have found, ". Line 8.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8 +8 @@ -Z \ No newline at end of file +U \ No newline at end of file +A ' ); } public function testMisplacedLineAfterComments2(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected line as 2 "No newline" markers have found, ". Line 7.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8 +8 @@ +U \ No newline at end of file \ No newline at end of file \ No newline at end of file ' ); } public function testMisplacedLineAfterComments3(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected line as 2 "No newline" markers have found, ". Line 7.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8 +8 @@ +U \ No newline at end of file \ No newline at end of file +A ' ); } public function testMisplacedComment(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected "\ No newline at end of file", it must be preceded by \'+\' or \'-\' line. Line 1.', '#'))); $this->assertValidUnifiedDiffFormat( '\ No newline at end of file ' ); } public function testUnexpectedDuplicateNoNewLineEOF(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected "\\ No newline at end of file", "\\" was already closed. Line 8.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,12 +8,12 @@ ' . ' ' . ' \ No newline at end of file ' . ' \ No newline at end of file ' ); } public function testFromAfterClose(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Not expected from (\'-\'), already closed by "\ No newline at end of file". Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,12 +8,12 @@ -A \ No newline at end of file -A \ No newline at end of file ' ); } public function testSameAfterFromClose(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Not expected same (\' \'), \'-\' already closed by "\ No newline at end of file". Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,12 +8,12 @@ -A \ No newline at end of file A \ No newline at end of file ' ); } public function testToAfterClose(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Not expected to (\'+\'), already closed by "\ No newline at end of file". Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,12 +8,12 @@ +A \ No newline at end of file +A \ No newline at end of file ' ); } public function testSameAfterToClose(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Not expected same (\' \'), \'+\' already closed by "\ No newline at end of file". Line 6.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,12 +8,12 @@ +A \ No newline at end of file A \ No newline at end of file ' ); } public function testUnexpectedEOFFromMissingLines(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected EOF, number of lines in hunk "from" (\'-\')) mismatched. Line 7.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,19 +7,2 @@ -A +B ' . ' ' ); } public function testUnexpectedEOFToMissingLines(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected EOF, number of lines in hunk "to" (\'+\')) mismatched. Line 7.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -8,2 +7,3 @@ -A +B ' . ' ' ); } public function testUnexpectedEOFBothFromAndToMissingLines(): void { $this->expectException(\UnexpectedValueException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote('Unexpected EOF, number of lines in hunk "from" (\'-\')) and "to" (\'+\') mismatched. Line 7.', '#'))); $this->assertValidUnifiedDiffFormat( '--- Original +++ New @@ -1,12 +1,14 @@ -A +B ' . ' ' ); } } PK!"诟+++diff/tests/Utils/UnifiedDiffAssertTrait.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Utils; trait UnifiedDiffAssertTrait { /** * @param string $diff * * @throws \UnexpectedValueException */ public function assertValidUnifiedDiffFormat(string $diff): void { if ('' === $diff) { $this->addToAssertionCount(1); return; } // test diff ends with a line break $last = \substr($diff, -1); if ("\n" !== $last && "\r" !== $last) { throw new \UnexpectedValueException(\sprintf('Expected diff to end with a line break, got "%s".', $last)); } $lines = \preg_split('/(.*\R)/', $diff, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $lineCount = \count($lines); $lineNumber = $diffLineFromNumber = $diffLineToNumber = 1; $fromStart = $fromTillOffset = $toStart = $toTillOffset = -1; $expectHunkHeader = true; // check for header if ($lineCount > 1) { $this->unifiedDiffAssertLinePrefix($lines[0], 'Line 1.'); $this->unifiedDiffAssertLinePrefix($lines[1], 'Line 2.'); if ('---' === \substr($lines[0], 0, 3)) { if ('+++' !== \substr($lines[1], 0, 3)) { throw new \UnexpectedValueException(\sprintf("Line 1 indicates a header, so line 2 must start with \"+++\".\nLine 1: \"%s\"\nLine 2: \"%s\".", $lines[0], $lines[1])); } $this->unifiedDiffAssertHeaderLine($lines[0], '--- ', 'Line 1.'); $this->unifiedDiffAssertHeaderLine($lines[1], '+++ ', 'Line 2.'); $lineNumber = 3; } } $endOfLineTypes = []; $diffClosed = false; // assert format of lines, get all hunks, test the line numbers for (; $lineNumber <= $lineCount; ++$lineNumber) { if ($diffClosed) { throw new \UnexpectedValueException(\sprintf('Unexpected line as 2 "No newline" markers have found, ". Line %d.', $lineNumber)); } $line = $lines[$lineNumber - 1]; // line numbers start by 1, array index at 0 $type = $this->unifiedDiffAssertLinePrefix($line, \sprintf('Line %d.', $lineNumber)); if ($expectHunkHeader && '@' !== $type && '\\' !== $type) { throw new \UnexpectedValueException(\sprintf('Expected hunk start (\'@\'), got "%s". Line %d.', $type, $lineNumber)); } if ('@' === $type) { if (!$expectHunkHeader) { throw new \UnexpectedValueException(\sprintf('Unexpected hunk start (\'@\'). Line %d.', $lineNumber)); } $previousHunkFromEnd = $fromStart + $fromTillOffset; $previousHunkTillEnd = $toStart + $toTillOffset; [$fromStart, $fromTillOffset, $toStart, $toTillOffset] = $this->unifiedDiffAssertHunkHeader($line, \sprintf('Line %d.', $lineNumber)); // detect overlapping hunks if ($fromStart < $previousHunkFromEnd) { throw new \UnexpectedValueException(\sprintf('Unexpected new hunk; "from" (\'-\') start overlaps previous hunk. Line %d.', $lineNumber)); } if ($toStart < $previousHunkTillEnd) { throw new \UnexpectedValueException(\sprintf('Unexpected new hunk; "to" (\'+\') start overlaps previous hunk. Line %d.', $lineNumber)); } /* valid states; hunks touches against each other: $fromStart === $previousHunkFromEnd $toStart === $previousHunkTillEnd */ $diffLineFromNumber = $fromStart; $diffLineToNumber = $toStart; $expectHunkHeader = false; continue; } if ('-' === $type) { if (isset($endOfLineTypes['-'])) { throw new \UnexpectedValueException(\sprintf('Not expected from (\'-\'), already closed by "\\ No newline at end of file". Line %d.', $lineNumber)); } ++$diffLineFromNumber; } elseif ('+' === $type) { if (isset($endOfLineTypes['+'])) { throw new \UnexpectedValueException(\sprintf('Not expected to (\'+\'), already closed by "\\ No newline at end of file". Line %d.', $lineNumber)); } ++$diffLineToNumber; } elseif (' ' === $type) { if (isset($endOfLineTypes['-'])) { throw new \UnexpectedValueException(\sprintf('Not expected same (\' \'), \'-\' already closed by "\\ No newline at end of file". Line %d.', $lineNumber)); } if (isset($endOfLineTypes['+'])) { throw new \UnexpectedValueException(\sprintf('Not expected same (\' \'), \'+\' already closed by "\\ No newline at end of file". Line %d.', $lineNumber)); } ++$diffLineFromNumber; ++$diffLineToNumber; } elseif ('\\' === $type) { if (!isset($lines[$lineNumber - 2])) { throw new \UnexpectedValueException(\sprintf('Unexpected "\\ No newline at end of file", it must be preceded by \'+\' or \'-\' line. Line %d.', $lineNumber)); } $previousType = $this->unifiedDiffAssertLinePrefix($lines[$lineNumber - 2], \sprintf('Preceding line of "\\ No newline at end of file" of unexpected format. Line %d.', $lineNumber)); if (isset($endOfLineTypes[$previousType])) { throw new \UnexpectedValueException(\sprintf('Unexpected "\\ No newline at end of file", "%s" was already closed. Line %d.', $type, $lineNumber)); } $endOfLineTypes[$previousType] = true; $diffClosed = \count($endOfLineTypes) > 1; } else { // internal state error throw new \RuntimeException(\sprintf('Unexpected line type "%s" Line %d.', $type, $lineNumber)); } $expectHunkHeader = $diffLineFromNumber === ($fromStart + $fromTillOffset) && $diffLineToNumber === ($toStart + $toTillOffset) ; } if ( $diffLineFromNumber !== ($fromStart + $fromTillOffset) && $diffLineToNumber !== ($toStart + $toTillOffset) ) { throw new \UnexpectedValueException(\sprintf('Unexpected EOF, number of lines in hunk "from" (\'-\')) and "to" (\'+\') mismatched. Line %d.', $lineNumber)); } if ($diffLineFromNumber !== ($fromStart + $fromTillOffset)) { throw new \UnexpectedValueException(\sprintf('Unexpected EOF, number of lines in hunk "from" (\'-\')) mismatched. Line %d.', $lineNumber)); } if ($diffLineToNumber !== ($toStart + $toTillOffset)) { throw new \UnexpectedValueException(\sprintf('Unexpected EOF, number of lines in hunk "to" (\'+\')) mismatched. Line %d.', $lineNumber)); } $this->addToAssertionCount(1); } /** * @param string $line * @param string $message * * @return string '+', '-', '@', ' ' or '\' */ private function unifiedDiffAssertLinePrefix(string $line, string $message): string { $this->unifiedDiffAssertStrLength($line, 2, $message); // 2: line type indicator ('+', '-', ' ' or '\') and a line break $firstChar = $line[0]; if ('+' === $firstChar || '-' === $firstChar || '@' === $firstChar || ' ' === $firstChar) { return $firstChar; } if ("\\ No newline at end of file\n" === $line) { return '\\'; } throw new \UnexpectedValueException(\sprintf('Expected line to start with \'@\', \'-\' or \'+\', got "%s". %s', $line, $message)); } private function unifiedDiffAssertStrLength(string $line, int $min, string $message): void { $length = \strlen($line); if ($length < $min) { throw new \UnexpectedValueException(\sprintf('Expected string length of minimal %d, got %d. %s', $min, $length, $message)); } } /** * Assert valid unified diff header line * * Samples: * - "+++ from1.txt\t2017-08-24 19:51:29.383985722 +0200" * - "+++ from1.txt" * * @param string $line * @param string $start * @param string $message */ private function unifiedDiffAssertHeaderLine(string $line, string $start, string $message): void { if (0 !== \strpos($line, $start)) { throw new \UnexpectedValueException(\sprintf('Expected header line to start with "%s", got "%s". %s', $start . ' ', $line, $message)); } // sample "+++ from1.txt\t2017-08-24 19:51:29.383985722 +0200\n" $match = \preg_match( "/^([^\t]*)(?:[\t]([\\S].*[\\S]))?\n$/", \substr($line, 4), // 4 === string length of "+++ " / "--- " $matches ); if (1 !== $match) { throw new \UnexpectedValueException(\sprintf('Header line does not match expected pattern, got "%s". %s', $line, $message)); } // $file = $matches[1]; if (\count($matches) > 2) { $this->unifiedDiffAssertHeaderDate($matches[2], $message); } } private function unifiedDiffAssertHeaderDate(string $date, string $message): void { // sample "2017-08-24 19:51:29.383985722 +0200" $match = \preg_match( '/^([\d]{4})-([01]?[\d])-([0123]?[\d])(:? [\d]{1,2}:[\d]{1,2}(?::[\d]{1,2}(:?\.[\d]+)?)?(?: ([\+\-][\d]{4}))?)?$/', $date, $matches ); if (1 !== $match || ($matchesCount = \count($matches)) < 4) { throw new \UnexpectedValueException(\sprintf('Date of header line does not match expected pattern, got "%s". %s', $date, $message)); } // [$full, $year, $month, $day, $time] = $matches; } /** * @param string $line * @param string $message * * @return int[] */ private function unifiedDiffAssertHunkHeader(string $line, string $message): array { if (1 !== \preg_match('#^@@ -([\d]+)((?:,[\d]+)?) \+([\d]+)((?:,[\d]+)?) @@\n$#', $line, $matches)) { throw new \UnexpectedValueException( \sprintf( 'Hunk header line does not match expected pattern, got "%s". %s', $line, $message ) ); } return [ (int) $matches[1], empty($matches[2]) ? 1 : (int) \substr($matches[2], 1), (int) $matches[3], empty($matches[4]) ? 1 : (int) \substr($matches[4], 1), ]; } } PK! :diff/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Utils; use PHPUnit\Framework\TestCase; use Symfony\Component\Process\Process; /** * @requires OS Linux * * @coversNothing */ final class UnifiedDiffAssertTraitIntegrationTest extends TestCase { use UnifiedDiffAssertTrait; private $filePatch; protected function setUp(): void { $this->filePatch = __DIR__ . '/../fixtures/out/patch.txt'; $this->cleanUpTempFiles(); } protected function tearDown(): void { $this->cleanUpTempFiles(); } /** * @param string $fileFrom * @param string $fileTo * * @dataProvider provideFilePairsCases */ public function testValidPatches(string $fileFrom, string $fileTo): void { $command = \sprintf( 'diff -u %s %s > %s', \escapeshellarg(\realpath($fileFrom)), \escapeshellarg(\realpath($fileTo)), \escapeshellarg($this->filePatch) ); $p = new Process($command); $p->run(); $exitCode = $p->getExitCode(); if (0 === $exitCode) { // odd case when two files have the same content. Test after executing as it is more efficient than to read the files and check the contents every time. $this->addToAssertionCount(1); return; } $this->assertSame( 1, // means `diff` found a diff between the files we gave it $exitCode, \sprintf( "Command exec. was not successful:\n\"%s\"\nOutput:\n\"%s\"\nStdErr:\n\"%s\"\nExit code %d.\n", $command, $p->getOutput(), $p->getErrorOutput(), $p->getExitCode() ) ); $this->assertValidUnifiedDiffFormat(FileUtils::getFileContent($this->filePatch)); } /** * @return array> */ public function provideFilePairsCases(): array { $cases = []; // created cases based on dedicated fixtures $dir = \realpath(__DIR__ . '/../fixtures/UnifiedDiffAssertTraitIntegrationTest'); $dirLength = \strlen($dir); for ($i = 1;; ++$i) { $fromFile = \sprintf('%s/%d_a.txt', $dir, $i); $toFile = \sprintf('%s/%d_b.txt', $dir, $i); if (!\file_exists($fromFile)) { break; } $this->assertFileExists($toFile); $cases[\sprintf("Diff file:\n\"%s\"\nvs.\n\"%s\"\n", \substr(\realpath($fromFile), $dirLength), \substr(\realpath($toFile), $dirLength))] = [$fromFile, $toFile]; } // create cases based on PHP files within the vendor directory for integration testing $dir = \realpath(__DIR__ . '/../../vendor'); $dirLength = \strlen($dir); $fileIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir, \RecursiveDirectoryIterator::SKIP_DOTS)); $fromFile = __FILE__; /** @var \SplFileInfo $file */ foreach ($fileIterator as $file) { if ('php' !== $file->getExtension()) { continue; } $toFile = $file->getPathname(); $cases[\sprintf("Diff file:\n\"%s\"\nvs.\n\"%s\"\n", \substr(\realpath($fromFile), $dirLength), \substr(\realpath($toFile), $dirLength))] = [$fromFile, $toFile]; $fromFile = $toFile; } return $cases; } private function cleanUpTempFiles(): void { @\unlink($this->filePatch); } } PK!?婢歗^3diff/tests/Exception/ConfigurationExceptionTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\ConfigurationException */ final class ConfigurationExceptionTest extends TestCase { public function testConstructWithDefaults(): void { $e = new ConfigurationException('test', 'A', 'B'); $this->assertSame(0, $e->getCode()); $this->assertNull($e->getPrevious()); $this->assertSame('Option "test" must be A, got "string#B".', $e->getMessage()); } public function testConstruct(): void { $e = new ConfigurationException( 'test', 'integer', new \SplFileInfo(__FILE__), 789, new \BadMethodCallException(__METHOD__) ); $this->assertSame('Option "test" must be integer, got "SplFileInfo".', $e->getMessage()); } } PK!7,85diff/tests/Exception/InvalidArgumentExceptionTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\Diff\InvalidArgumentException */ final class InvalidArgumentExceptionTest extends TestCase { public function testInvalidArgumentException(): void { $previousException = new \LogicException(); $message = 'test'; $code = 123; $exception = new InvalidArgumentException($message, $code, $previousException); $this->assertInstanceOf(Exception::class, $exception); $this->assertSame($message, $exception->getMessage()); $this->assertSame($code, $exception->getCode()); $this->assertSame($previousException, $exception->getPrevious()); } } PK!x窎+diff/tests/LongestCommonSubsequenceTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use PHPUnit\Framework\TestCase; /** * @coversNothing */ abstract class LongestCommonSubsequenceTest extends TestCase { /** * @var LongestCommonSubsequenceCalculator */ private $implementation; /** * @var string */ private $memoryLimit; /** * @var int[] */ private $stress_sizes = [1, 2, 3, 100, 500, 1000, 2000]; protected function setUp(): void { $this->memoryLimit = \ini_get('memory_limit'); \ini_set('memory_limit', '256M'); $this->implementation = $this->createImplementation(); } protected function tearDown(): void { \ini_set('memory_limit', $this->memoryLimit); } public function testBothEmpty(): void { $from = []; $to = []; $common = $this->implementation->calculate($from, $to); $this->assertSame([], $common); } public function testIsStrictComparison(): void { $from = [ false, 0, 0.0, '', null, [], true, 1, 1.0, 'foo', ['foo', 'bar'], ['foo' => 'bar'], ]; $to = $from; $common = $this->implementation->calculate($from, $to); $this->assertSame($from, $common); $to = [ false, false, false, false, false, false, true, true, true, true, true, true, ]; $expected = [ false, true, ]; $common = $this->implementation->calculate($from, $to); $this->assertSame($expected, $common); } public function testEqualSequences(): void { foreach ($this->stress_sizes as $size) { $range = \range(1, $size); $from = $range; $to = $range; $common = $this->implementation->calculate($from, $to); $this->assertSame($range, $common); } } public function testDistinctSequences(): void { $from = ['A']; $to = ['B']; $common = $this->implementation->calculate($from, $to); $this->assertSame([], $common); $from = ['A', 'B', 'C']; $to = ['D', 'E', 'F']; $common = $this->implementation->calculate($from, $to); $this->assertSame([], $common); foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \range($size + 1, $size * 2); $common = $this->implementation->calculate($from, $to); $this->assertSame([], $common); } } public function testCommonSubsequence(): void { $from = ['A', 'C', 'E', 'F', 'G']; $to = ['A', 'B', 'D', 'E', 'H']; $expected = ['A', 'E']; $common = $this->implementation->calculate($from, $to); $this->assertSame($expected, $common); $from = ['A', 'C', 'E', 'F', 'G']; $to = ['B', 'C', 'D', 'E', 'F', 'H']; $expected = ['C', 'E', 'F']; $common = $this->implementation->calculate($from, $to); $this->assertSame($expected, $common); foreach ($this->stress_sizes as $size) { $from = $size < 2 ? [1] : \range(1, $size + 1, 2); $to = $size < 3 ? [1] : \range(1, $size + 1, 3); $expected = $size < 6 ? [1] : \range(1, $size + 1, 6); $common = $this->implementation->calculate($from, $to); $this->assertSame($expected, $common); } } public function testSingleElementSubsequenceAtStart(): void { foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_slice($from, 0, 1); $common = $this->implementation->calculate($from, $to); $this->assertSame($to, $common); } } public function testSingleElementSubsequenceAtMiddle(): void { foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_slice($from, (int) ($size / 2), 1); $common = $this->implementation->calculate($from, $to); $this->assertSame($to, $common); } } public function testSingleElementSubsequenceAtEnd(): void { foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_slice($from, $size - 1, 1); $common = $this->implementation->calculate($from, $to); $this->assertSame($to, $common); } } public function testReversedSequences(): void { $from = ['A', 'B']; $to = ['B', 'A']; $expected = ['A']; $common = $this->implementation->calculate($from, $to); $this->assertSame($expected, $common); foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_reverse($from); $common = $this->implementation->calculate($from, $to); $this->assertSame([1], $common); } } public function testStrictTypeCalculate(): void { $diff = $this->implementation->calculate(['5'], ['05']); $this->assertIsArray($diff); $this->assertCount(0, $diff); } /** * @return LongestCommonSubsequenceCalculator */ abstract protected function createImplementation(): LongestCommonSubsequenceCalculator; } PK!2otA:diff/tests/Output/UnifiedDiffOutputBuilderDataProvider.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; final class UnifiedDiffOutputBuilderDataProvider { public static function provideDiffWithLineNumbers(): array { return [ 'diff line 1 non_patch_compat' => [ '--- Original +++ New @@ -1 +1 @@ -AA +BA ', 'AA', 'BA', ], 'diff line +1 non_patch_compat' => [ '--- Original +++ New @@ -1 +1,2 @@ -AZ + +B ', 'AZ', "\nB", ], 'diff line -1 non_patch_compat' => [ '--- Original +++ New @@ -1,2 +1 @@ - -AF +B ', "\nAF", 'B', ], 'II non_patch_compat' => [ '--- Original +++ New @@ -1,4 +1,2 @@ - - A 1 ', "\n\nA\n1", "A\n1", ], 'diff last line II - no trailing linebreak non_patch_compat' => [ '--- Original +++ New @@ -5,4 +5,4 @@ ' . ' ' . ' ' . ' -E +B ', "A\n\n\n\n\n\n\nE", "A\n\n\n\n\n\n\nB", ], [ "--- Original\n+++ New\n@@ -1,2 +1 @@\n \n-\n", "\n\n", "\n", ], 'diff line endings non_patch_compat' => [ "--- Original\n+++ New\n@@ -1 +1 @@\n #Warning: Strings contain different line endings!\n- [ '--- Original +++ New ', "AT\n", "AT\n", ], [ '--- Original +++ New @@ -1,4 +1,4 @@ -b +a ' . ' ' . ' ' . ' ', "b\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "a\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ], 'diff line @1' => [ '--- Original +++ New @@ -1,2 +1,2 @@ ' . ' -AG +B ', "\nAG\n", "\nB\n", ], 'same multiple lines' => [ '--- Original +++ New @@ -1,4 +1,4 @@ ' . ' ' . ' -V +B C213 ', "\n\nV\nC213", "\n\nB\nC213", ], 'diff last line I' => [ '--- Original +++ New @@ -5,4 +5,4 @@ ' . ' ' . ' ' . ' -E +B ', "A\n\n\n\n\n\n\nE\n", "A\n\n\n\n\n\n\nB\n", ], 'diff line middle' => [ '--- Original +++ New @@ -5,7 +5,7 @@ ' . ' ' . ' ' . ' -X +Z ' . ' ' . ' ' . ' ', "A\n\n\n\n\n\n\nX\n\n\n\n\n\n\nAY", "A\n\n\n\n\n\n\nZ\n\n\n\n\n\n\nAY", ], 'diff last line III' => [ '--- Original +++ New @@ -12,4 +12,4 @@ ' . ' ' . ' ' . ' -A +B ', "A\n\n\n\n\n\n\nA\n\n\n\n\n\n\nA\n", "A\n\n\n\n\n\n\nA\n\n\n\n\n\n\nB\n", ], [ '--- Original +++ New @@ -1,8 +1,8 @@ A -B +B1 D E EE F -G +G1 H ', "A\nB\nD\nE\nEE\nF\nG\nH", "A\nB1\nD\nE\nEE\nF\nG1\nH", ], [ '--- Original +++ New @@ -1,4 +1,5 @@ Z + a b c @@ -7,5 +8,5 @@ f g h -i +x j ', 'Z a b c d e f g h i j ', 'Z a b c d e f g h x j ', ], [ '--- Original +++ New @@ -1,7 +1,5 @@ - -a +b A -X - +Y ' . ' A ', "\na\nA\nX\n\n\nA\n", "b\nA\nY\n\nA\n", ], [ << * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use PHPUnit\Framework\TestCase; use SebastianBergmann\Diff\Utils\UnifiedDiffAssertTrait; use Symfony\Component\Process\Process; /** * @covers SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder * * @uses SebastianBergmann\Diff\Differ * @uses SebastianBergmann\Diff\TimeEfficientLongestCommonSubsequenceCalculator * * @requires OS Linux */ final class UnifiedDiffOutputBuilderIntegrationTest extends TestCase { use UnifiedDiffAssertTrait; private $dir; private $fileFrom; private $filePatch; protected function setUp(): void { $this->dir = \realpath(__DIR__ . '/../../fixtures/out/') . '/'; $this->fileFrom = $this->dir . 'from.txt'; $this->filePatch = $this->dir . 'patch.txt'; $this->cleanUpTempFiles(); } protected function tearDown(): void { $this->cleanUpTempFiles(); } /** * @dataProvider provideDiffWithLineNumbers * * @param mixed $expected * @param mixed $from * @param mixed $to */ public function testDiffWithLineNumbersPath($expected, $from, $to): void { $this->doIntegrationTestPatch($expected, $from, $to); } /** * @dataProvider provideDiffWithLineNumbers * * @param mixed $expected * @param mixed $from * @param mixed $to */ public function testDiffWithLineNumbersGitApply($expected, $from, $to): void { $this->doIntegrationTestGitApply($expected, $from, $to); } public function provideDiffWithLineNumbers() { return \array_filter( UnifiedDiffOutputBuilderDataProvider::provideDiffWithLineNumbers(), static function ($key) { return !\is_string($key) || false === \strpos($key, 'non_patch_compat'); }, ARRAY_FILTER_USE_KEY ); } private function doIntegrationTestPatch(string $diff, string $from, string $to): void { $this->assertNotSame('', $diff); $this->assertValidUnifiedDiffFormat($diff); $diff = self::setDiffFileHeader($diff, $this->fileFrom); $this->assertNotFalse(\file_put_contents($this->fileFrom, $from)); $this->assertNotFalse(\file_put_contents($this->filePatch, $diff)); $command = \sprintf( 'patch -u --verbose --posix %s < %s', // --posix \escapeshellarg($this->fileFrom), \escapeshellarg($this->filePatch) ); $p = new Process($command); $p->run(); $this->assertProcessSuccessful($p); $this->assertStringEqualsFile( $this->fileFrom, $to, \sprintf('Patch command "%s".', $command) ); } private function doIntegrationTestGitApply(string $diff, string $from, string $to): void { $this->assertNotSame('', $diff); $this->assertValidUnifiedDiffFormat($diff); $diff = self::setDiffFileHeader($diff, $this->fileFrom); $this->assertNotFalse(\file_put_contents($this->fileFrom, $from)); $this->assertNotFalse(\file_put_contents($this->filePatch, $diff)); $command = \sprintf( 'git --git-dir %s apply --check -v --unsafe-paths --ignore-whitespace %s', \escapeshellarg($this->dir), \escapeshellarg($this->filePatch) ); $p = new Process($command); $p->run(); $this->assertProcessSuccessful($p); } private function assertProcessSuccessful(Process $p): void { $this->assertTrue( $p->isSuccessful(), \sprintf( "Command exec. was not successful:\n\"%s\"\nOutput:\n\"%s\"\nStdErr:\n\"%s\"\nExit code %d.\n", $p->getCommandLine(), $p->getOutput(), $p->getErrorOutput(), $p->getExitCode() ) ); } private function cleanUpTempFiles(): void { @\unlink($this->fileFrom . '.orig'); @\unlink($this->fileFrom); @\unlink($this->filePatch); } private static function setDiffFileHeader(string $diff, string $file): string { $diffLines = \preg_split('/(.*\R)/', $diff, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $diffLines[0] = \preg_replace('#^\-\-\- .*#', '--- /' . $file, $diffLines[0], 1); $diffLines[1] = \preg_replace('#^\+\+\+ .*#', '+++ /' . $file, $diffLines[1], 1); return \implode('', $diffLines); } } PK!谲珯<'<'Odiff/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use PHPUnit\Framework\TestCase; use SebastianBergmann\Diff\Differ; use SebastianBergmann\Diff\Utils\FileUtils; use SebastianBergmann\Diff\Utils\UnifiedDiffAssertTrait; use Symfony\Component\Process\Process; /** * @covers SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder * * @uses SebastianBergmann\Diff\Differ * @uses SebastianBergmann\Diff\TimeEfficientLongestCommonSubsequenceCalculator * * @requires OS Linux */ final class StrictUnifiedDiffOutputBuilderIntegrationTest extends TestCase { use UnifiedDiffAssertTrait; private $dir; private $fileFrom; private $fileTo; private $filePatch; protected function setUp(): void { $this->dir = \realpath(__DIR__ . '/../../fixtures/out') . '/'; $this->fileFrom = $this->dir . 'from.txt'; $this->fileTo = $this->dir . 'to.txt'; $this->filePatch = $this->dir . 'diff.patch'; if (!\is_dir($this->dir)) { throw new \RuntimeException('Integration test working directory not found.'); } $this->cleanUpTempFiles(); } protected function tearDown(): void { $this->cleanUpTempFiles(); } /** * Integration test * * - get a file pair * - create a `diff` between the files * - test applying the diff using `git apply` * - test applying the diff using `patch` * * @param string $fileFrom * @param string $fileTo * * @dataProvider provideFilePairs */ public function testIntegrationUsingPHPFileInVendorGitApply(string $fileFrom, string $fileTo): void { $from = FileUtils::getFileContent($fileFrom); $to = FileUtils::getFileContent($fileTo); $diff = (new Differ(new StrictUnifiedDiffOutputBuilder(['fromFile' => 'Original', 'toFile' => 'New'])))->diff($from, $to); if ('' === $diff && $from === $to) { // odd case: test after executing as it is more efficient than to read the files and check the contents every time $this->addToAssertionCount(1); return; } $this->doIntegrationTestGitApply($diff, $from, $to); } /** * Integration test * * - get a file pair * - create a `diff` between the files * - test applying the diff using `git apply` * - test applying the diff using `patch` * * @param string $fileFrom * @param string $fileTo * * @dataProvider provideFilePairs */ public function testIntegrationUsingPHPFileInVendorPatch(string $fileFrom, string $fileTo): void { $from = FileUtils::getFileContent($fileFrom); $to = FileUtils::getFileContent($fileTo); $diff = (new Differ(new StrictUnifiedDiffOutputBuilder(['fromFile' => 'Original', 'toFile' => 'New'])))->diff($from, $to); if ('' === $diff && $from === $to) { // odd case: test after executing as it is more efficient than to read the files and check the contents every time $this->addToAssertionCount(1); return; } $this->doIntegrationTestPatch($diff, $from, $to); } /** * @param string $expected * @param string $from * @param string $to * * @dataProvider provideOutputBuildingCases * @dataProvider provideSample * @dataProvider provideBasicDiffGeneration */ public function testIntegrationOfUnitTestCasesGitApply(string $expected, string $from, string $to): void { $this->doIntegrationTestGitApply($expected, $from, $to); } /** * @param string $expected * @param string $from * @param string $to * * @dataProvider provideOutputBuildingCases * @dataProvider provideSample * @dataProvider provideBasicDiffGeneration */ public function testIntegrationOfUnitTestCasesPatch(string $expected, string $from, string $to): void { $this->doIntegrationTestPatch($expected, $from, $to); } public function provideOutputBuildingCases(): array { return StrictUnifiedDiffOutputBuilderDataProvider::provideOutputBuildingCases(); } public function provideSample(): array { return StrictUnifiedDiffOutputBuilderDataProvider::provideSample(); } public function provideBasicDiffGeneration(): array { return StrictUnifiedDiffOutputBuilderDataProvider::provideBasicDiffGeneration(); } public function provideFilePairs(): array { $cases = []; $fromFile = __FILE__; $vendorDir = \realpath(__DIR__ . '/../../../vendor'); $fileIterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($vendorDir, \RecursiveDirectoryIterator::SKIP_DOTS)); /** @var \SplFileInfo $file */ foreach ($fileIterator as $file) { if ('php' !== $file->getExtension()) { continue; } $toFile = $file->getPathname(); $cases[\sprintf("Diff file:\n\"%s\"\nvs.\n\"%s\"\n", \realpath($fromFile), \realpath($toFile))] = [$fromFile, $toFile]; $fromFile = $toFile; } return $cases; } /** * Compare diff create by builder and against one create by `diff` command. * * @param string $diff * @param string $from * @param string $to * * @dataProvider provideBasicDiffGeneration */ public function testIntegrationDiffOutputBuilderVersusDiffCommand(string $diff, string $from, string $to): void { $this->assertNotSame('', $diff); $this->assertValidUnifiedDiffFormat($diff); $this->assertNotFalse(\file_put_contents($this->fileFrom, $from)); $this->assertNotFalse(\file_put_contents($this->fileTo, $to)); $p = new Process(\sprintf('diff -u %s %s', \escapeshellarg($this->fileFrom), \escapeshellarg($this->fileTo))); $p->run(); $this->assertSame(1, $p->getExitCode()); // note: Process assumes exit code 0 for `isSuccessful`, however `diff` uses the exit code `1` for success with diff $output = $p->getOutput(); $diffLines = \preg_split('/(.*\R)/', $diff, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $diffLines[0] = \preg_replace('#^\-\-\- .*#', '--- /' . $this->fileFrom, $diffLines[0], 1); $diffLines[1] = \preg_replace('#^\+\+\+ .*#', '+++ /' . $this->fileFrom, $diffLines[1], 1); $diff = \implode('', $diffLines); $outputLines = \preg_split('/(.*\R)/', $output, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $outputLines[0] = \preg_replace('#^\-\-\- .*#', '--- /' . $this->fileFrom, $outputLines[0], 1); $outputLines[1] = \preg_replace('#^\+\+\+ .*#', '+++ /' . $this->fileFrom, $outputLines[1], 1); $output = \implode('', $outputLines); $this->assertSame($diff, $output); } private function doIntegrationTestGitApply(string $diff, string $from, string $to): void { $this->assertNotSame('', $diff); $this->assertValidUnifiedDiffFormat($diff); $diff = self::setDiffFileHeader($diff, $this->fileFrom); $this->assertNotFalse(\file_put_contents($this->fileFrom, $from)); $this->assertNotFalse(\file_put_contents($this->filePatch, $diff)); $p = new Process(\sprintf( 'git --git-dir %s apply --check -v --unsafe-paths --ignore-whitespace %s', \escapeshellarg($this->dir), \escapeshellarg($this->filePatch) )); $p->run(); $this->assertProcessSuccessful($p); } private function doIntegrationTestPatch(string $diff, string $from, string $to): void { $this->assertNotSame('', $diff); $this->assertValidUnifiedDiffFormat($diff); $diff = self::setDiffFileHeader($diff, $this->fileFrom); $this->assertNotFalse(\file_put_contents($this->fileFrom, $from)); $this->assertNotFalse(\file_put_contents($this->filePatch, $diff)); $command = \sprintf( 'patch -u --verbose --posix %s < %s', \escapeshellarg($this->fileFrom), \escapeshellarg($this->filePatch) ); $p = new Process($command); $p->run(); $this->assertProcessSuccessful($p); $this->assertStringEqualsFile( $this->fileFrom, $to, \sprintf('Patch command "%s".', $command) ); } private function assertProcessSuccessful(Process $p): void { $this->assertTrue( $p->isSuccessful(), \sprintf( "Command exec. was not successful:\n\"%s\"\nOutput:\n\"%s\"\nStdErr:\n\"%s\"\nExit code %d.\n", $p->getCommandLine(), $p->getOutput(), $p->getErrorOutput(), $p->getExitCode() ) ); } private function cleanUpTempFiles(): void { @\unlink($this->fileFrom . '.orig'); @\unlink($this->fileFrom . '.rej'); @\unlink($this->fileFrom); @\unlink($this->fileTo); @\unlink($this->filePatch); } private static function setDiffFileHeader(string $diff, string $file): string { $diffLines = \preg_split('/(.*\R)/', $diff, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); $diffLines[0] = \preg_replace('#^\-\-\- .*#', '--- /' . $file, $diffLines[0], 1); $diffLines[1] = \preg_replace('#^\+\+\+ .*#', '+++ /' . $file, $diffLines[1], 1); return \implode('', $diffLines); } } PK!访+軻DVD8diff/tests/Output/StrictUnifiedDiffOutputBuilderTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use PHPUnit\Framework\TestCase; use SebastianBergmann\Diff\ConfigurationException; use SebastianBergmann\Diff\Differ; use SebastianBergmann\Diff\Utils\UnifiedDiffAssertTrait; /** * @covers SebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder * * @uses SebastianBergmann\Diff\Differ */ final class StrictUnifiedDiffOutputBuilderTest extends TestCase { use UnifiedDiffAssertTrait; /** * @param string $expected * @param string $from * @param string $to * @param array $options * * @dataProvider provideOutputBuildingCases */ public function testOutputBuilding(string $expected, string $from, string $to, array $options): void { $diff = $this->getDiffer($options)->diff($from, $to); $this->assertValidDiffFormat($diff); $this->assertSame($expected, $diff); } /** * @param string $expected * @param string $from * @param string $to * @param array $options * * @dataProvider provideSample */ public function testSample(string $expected, string $from, string $to, array $options): void { $diff = $this->getDiffer($options)->diff($from, $to); $this->assertValidDiffFormat($diff); $this->assertSame($expected, $diff); } /** * {@inheritdoc} */ public function assertValidDiffFormat(string $diff): void { $this->assertValidUnifiedDiffFormat($diff); } /** * {@inheritdoc} */ public function provideOutputBuildingCases(): array { return StrictUnifiedDiffOutputBuilderDataProvider::provideOutputBuildingCases(); } /** * {@inheritdoc} */ public function provideSample(): array { return StrictUnifiedDiffOutputBuilderDataProvider::provideSample(); } /** * @param string $expected * @param string $from * @param string $to * * @dataProvider provideBasicDiffGeneration */ public function testBasicDiffGeneration(string $expected, string $from, string $to): void { $diff = $this->getDiffer([ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', ])->diff($from, $to); $this->assertValidDiffFormat($diff); $this->assertSame($expected, $diff); } public function provideBasicDiffGeneration(): array { return StrictUnifiedDiffOutputBuilderDataProvider::provideBasicDiffGeneration(); } /** * @param string $expected * @param string $from * @param string $to * @param array $config * * @dataProvider provideConfiguredDiffGeneration */ public function testConfiguredDiffGeneration(string $expected, string $from, string $to, array $config = []): void { $diff = $this->getDiffer(\array_merge([ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', ], $config))->diff($from, $to); $this->assertValidDiffFormat($diff); $this->assertSame($expected, $diff); } public function provideConfiguredDiffGeneration(): array { return [ [ '--- input.txt +++ output.txt @@ -1 +1 @@ -a \ No newline at end of file +b \ No newline at end of file ', 'a', 'b', ], [ '', "1\n2", "1\n2", ], [ '', "1\n", "1\n", ], [ '--- input.txt +++ output.txt @@ -4 +4 @@ -X +4 ', "1\n2\n3\nX\n5\n6\n7\n8\n9\n0\n", "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n", [ 'contextLines' => 0, ], ], [ '--- input.txt +++ output.txt @@ -3,3 +3,3 @@ 3 -X +4 5 ', "1\n2\n3\nX\n5\n6\n7\n8\n9\n0\n", "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n", [ 'contextLines' => 1, ], ], [ '--- input.txt +++ output.txt @@ -1,10 +1,10 @@ 1 2 3 -X +4 5 6 7 8 9 0 ', "1\n2\n3\nX\n5\n6\n7\n8\n9\n0\n", "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n", [ 'contextLines' => 999, ], ], [ '--- input.txt +++ output.txt @@ -1,0 +1,2 @@ + +A ', '', "\nA\n", ], [ '--- input.txt +++ output.txt @@ -1,2 +1,0 @@ - -A ', "\nA\n", '', ], [ '--- input.txt +++ output.txt @@ -1,5 +1,5 @@ 1 -X +2 3 -Y +4 5 @@ -8,3 +8,3 @@ 8 -X +9 0 ', "1\nX\n3\nY\n5\n6\n7\n8\nX\n0\n", "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n", [ 'commonLineThreshold' => 2, 'contextLines' => 1, ], ], [ '--- input.txt +++ output.txt @@ -2 +2 @@ -X +2 @@ -4 +4 @@ -Y +4 @@ -9 +9 @@ -X +9 ', "1\nX\n3\nY\n5\n6\n7\n8\nX\n0\n", "1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n", [ 'commonLineThreshold' => 1, 'contextLines' => 0, ], ], ]; } public function testReUseBuilder(): void { $differ = $this->getDiffer([ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', ]); $diff = $differ->diff("A\nB\n", "A\nX\n"); $this->assertSame( '--- input.txt +++ output.txt @@ -1,2 +1,2 @@ A -B +X ', $diff ); $diff = $differ->diff("A\n", "A\n"); $this->assertSame( '', $diff ); } public function testEmptyDiff(): void { $builder = new StrictUnifiedDiffOutputBuilder([ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', ]); $this->assertSame( '', $builder->getDiff([]) ); } /** * @param array $options * @param string $message * * @dataProvider provideInvalidConfiguration */ public function testInvalidConfiguration(array $options, string $message): void { $this->expectException(ConfigurationException::class); $this->expectExceptionMessageRegExp(\sprintf('#^%s$#', \preg_quote($message, '#'))); new StrictUnifiedDiffOutputBuilder($options); } public function provideInvalidConfiguration(): array { $time = \time(); return [ [ ['collapseRanges' => 1], 'Option "collapseRanges" must be a bool, got "integer#1".', ], [ ['contextLines' => 'a'], 'Option "contextLines" must be an int >= 0, got "string#a".', ], [ ['commonLineThreshold' => -2], 'Option "commonLineThreshold" must be an int > 0, got "integer#-2".', ], [ ['commonLineThreshold' => 0], 'Option "commonLineThreshold" must be an int > 0, got "integer#0".', ], [ ['fromFile' => new \SplFileInfo(__FILE__)], 'Option "fromFile" must be a string, got "SplFileInfo".', ], [ ['fromFile' => null], 'Option "fromFile" must be a string, got "".', ], [ [ 'fromFile' => __FILE__, 'toFile' => 1, ], 'Option "toFile" must be a string, got "integer#1".', ], [ [ 'fromFile' => __FILE__, 'toFile' => __FILE__, 'toFileDate' => $time, ], 'Option "toFileDate" must be a string or , got "integer#' . $time . '".', ], [ [], 'Option "fromFile" must be a string, got "".', ], ]; } /** * @param string $expected * @param string $from * @param string $to * @param int $threshold * * @dataProvider provideCommonLineThresholdCases */ public function testCommonLineThreshold(string $expected, string $from, string $to, int $threshold): void { $diff = $this->getDiffer([ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', 'commonLineThreshold' => $threshold, 'contextLines' => 0, ])->diff($from, $to); $this->assertValidDiffFormat($diff); $this->assertSame($expected, $diff); } public function provideCommonLineThresholdCases(): array { return [ [ '--- input.txt +++ output.txt @@ -2,3 +2,3 @@ -X +B C12 -Y +D @@ -7 +7 @@ -X +Z ', "A\nX\nC12\nY\nA\nA\nX\n", "A\nB\nC12\nD\nA\nA\nZ\n", 2, ], [ '--- input.txt +++ output.txt @@ -2 +2 @@ -X +B @@ -4 +4 @@ -Y +D ', "A\nX\nV\nY\n", "A\nB\nV\nD\n", 1, ], ]; } /** * @param string $expected * @param string $from * @param string $to * @param int $contextLines * @param int $commonLineThreshold * * @dataProvider provideContextLineConfigurationCases */ public function testContextLineConfiguration(string $expected, string $from, string $to, int $contextLines, int $commonLineThreshold = 6): void { $diff = $this->getDiffer([ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', 'contextLines' => $contextLines, 'commonLineThreshold' => $commonLineThreshold, ])->diff($from, $to); $this->assertValidDiffFormat($diff); $this->assertSame($expected, $diff); } public function provideContextLineConfigurationCases(): array { $from = "A\nB\nC\nD\nE\nF\nX\nG\nH\nI\nJ\nK\nL\nM\n"; $to = "A\nB\nC\nD\nE\nF\nY\nG\nH\nI\nJ\nK\nL\nM\n"; return [ 'EOF 0' => [ "--- input.txt\n+++ output.txt\n@@ -3 +3 @@ -X \\ No newline at end of file +Y \\ No newline at end of file ", "A\nB\nX", "A\nB\nY", 0, ], 'EOF 1' => [ "--- input.txt\n+++ output.txt\n@@ -2,2 +2,2 @@ B -X \\ No newline at end of file +Y \\ No newline at end of file ", "A\nB\nX", "A\nB\nY", 1, ], 'EOF 2' => [ "--- input.txt\n+++ output.txt\n@@ -1,3 +1,3 @@ A B -X \\ No newline at end of file +Y \\ No newline at end of file ", "A\nB\nX", "A\nB\nY", 2, ], 'EOF 200' => [ "--- input.txt\n+++ output.txt\n@@ -1,3 +1,3 @@ A B -X \\ No newline at end of file +Y \\ No newline at end of file ", "A\nB\nX", "A\nB\nY", 200, ], 'n/a 0' => [ "--- input.txt\n+++ output.txt\n@@ -7 +7 @@\n-X\n+Y\n", $from, $to, 0, ], 'G' => [ "--- input.txt\n+++ output.txt\n@@ -6,3 +6,3 @@\n F\n-X\n+Y\n G\n", $from, $to, 1, ], 'H' => [ "--- input.txt\n+++ output.txt\n@@ -5,5 +5,5 @@\n E\n F\n-X\n+Y\n G\n H\n", $from, $to, 2, ], 'I' => [ "--- input.txt\n+++ output.txt\n@@ -4,7 +4,7 @@\n D\n E\n F\n-X\n+Y\n G\n H\n I\n", $from, $to, 3, ], 'J' => [ "--- input.txt\n+++ output.txt\n@@ -3,9 +3,9 @@\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n", $from, $to, 4, ], 'K' => [ "--- input.txt\n+++ output.txt\n@@ -2,11 +2,11 @@\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n", $from, $to, 5, ], 'L' => [ "--- input.txt\n+++ output.txt\n@@ -1,13 +1,13 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n", $from, $to, 6, ], 'M' => [ "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n", $from, $to, 7, ], 'M no linebreak EOF .1' => [ "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n-M\n+M\n\\ No newline at end of file\n", $from, \substr($to, 0, -1), 7, ], 'M no linebreak EOF .2' => [ "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n-M\n\\ No newline at end of file\n+M\n", \substr($from, 0, -1), $to, 7, ], 'M no linebreak EOF .3' => [ "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n", \substr($from, 0, -1), \substr($to, 0, -1), 7, ], 'M no linebreak EOF .4' => [ "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n\\ No newline at end of file\n", \substr($from, 0, -1), \substr($to, 0, -1), 10000, 10000, ], 'M+1' => [ "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n", $from, $to, 8, ], 'M+100' => [ "--- input.txt\n+++ output.txt\n@@ -1,14 +1,14 @@\n A\n B\n C\n D\n E\n F\n-X\n+Y\n G\n H\n I\n J\n K\n L\n M\n", $from, $to, 107, ], '0 II' => [ "--- input.txt\n+++ output.txt\n@@ -12 +12 @@\n-X\n+Y\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n", 0, 999, ], '0\' II' => [ "--- input.txt\n+++ output.txt\n@@ -12 +12 @@\n-X\n+Y\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\nA\nA\nA\nA\nA\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\nA\nA\nA\nA\nA\n", 0, 999, ], '0\'\' II' => [ "--- input.txt\n+++ output.txt\n@@ -12,2 +12,2 @@\n-X\n-M\n\\ No newline at end of file\n+Y\n+M\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n", 0, ], '0\'\'\' II' => [ "--- input.txt\n+++ output.txt\n@@ -12,2 +12,2 @@\n-X\n-X1\n+Y\n+Y2\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nX1\nM\nA\nA\nA\nA\nA\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nY2\nM\nA\nA\nA\nA\nA\n", 0, 999, ], '1 II' => [ "--- input.txt\n+++ output.txt\n@@ -11,3 +11,3 @@\n K\n-X\n+Y\n M\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n", 1, ], '5 II' => [ "--- input.txt\n+++ output.txt\n@@ -7,7 +7,7 @@\n G\n H\n I\n J\n K\n-X\n+Y\n M\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nX\nM\n", "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nY\nM\n", 5, ], [ '--- input.txt +++ output.txt @@ -1,28 +1,28 @@ A -X +B V -Y +D 1 A 2 A 3 A 4 A 8 A 9 A 5 A A A A A A A A A A A ', "A\nX\nV\nY\n1\nA\n2\nA\n3\nA\n4\nA\n8\nA\n9\nA\n5\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\n", "A\nB\nV\nD\n1\nA\n2\nA\n3\nA\n4\nA\n8\nA\n9\nA\n5\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\n", 9999, 99999, ], ]; } /** * Returns a new instance of a Differ with a new instance of the class (DiffOutputBuilderInterface) under test. * * @param array $options * * @return Differ */ private function getDiffer(array $options = []): Differ { return new Differ(new StrictUnifiedDiffOutputBuilder($options)); } } PK!z6|dd/diff/tests/Output/DiffOnlyOutputBuilderTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use PHPUnit\Framework\TestCase; use SebastianBergmann\Diff\Differ; /** * @covers SebastianBergmann\Diff\Output\DiffOnlyOutputBuilder * * @uses SebastianBergmann\Diff\Differ * @uses SebastianBergmann\Diff\TimeEfficientLongestCommonSubsequenceCalculator */ final class DiffOnlyOutputBuilderTest extends TestCase { /** * @param string $expected * @param string $from * @param string $to * @param string $header * * @dataProvider textForNoNonDiffLinesProvider */ public function testDiffDoNotShowNonDiffLines(string $expected, string $from, string $to, string $header = ''): void { $differ = new Differ(new DiffOnlyOutputBuilder($header)); $this->assertSame($expected, $differ->diff($from, $to)); } public function textForNoNonDiffLinesProvider(): array { return [ [ " #Warning: Strings contain different line endings!\n-A\r\n+B\n", "A\r\n", "B\n", ], [ "-A\n+B\n", "\nA", "\nB", ], [ '', 'a', 'a', ], [ "-A\n+C\n", "A\n\n\nB", "C\n\n\nB", ], [ "header\n", 'a', 'a', 'header', ], [ "header\n", 'a', 'a', "header\n", ], ]; } } PK!(& & @diff/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; final class StrictUnifiedDiffOutputBuilderDataProvider { public static function provideOutputBuildingCases(): array { return [ [ '--- input.txt +++ output.txt @@ -1,3 +1,4 @@ +b ' . ' ' . ' ' . ' @@ -16,5 +17,4 @@ ' . ' ' . ' ' . ' - -B +A ', "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nB\n", "b\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nA\n", [ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', ], ], [ '--- ' . __FILE__ . "\t2017-10-02 17:38:11.586413675 +0100 +++ output1.txt\t2017-10-03 12:09:43.086719482 +0100 @@ -1,1 +1,1 @@ -B +X ", "B\n", "X\n", [ 'fromFile' => __FILE__, 'fromFileDate' => '2017-10-02 17:38:11.586413675 +0100', 'toFile' => 'output1.txt', 'toFileDate' => '2017-10-03 12:09:43.086719482 +0100', 'collapseRanges' => false, ], ], [ '--- input.txt +++ output.txt @@ -1 +1 @@ -B +X ', "B\n", "X\n", [ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', 'collapseRanges' => true, ], ], ]; } public static function provideSample(): array { return [ [ '--- input.txt +++ output.txt @@ -1,6 +1,6 @@ 1 2 3 -4 +X 5 6 ', "1\n2\n3\n4\n5\n6\n", "1\n2\n3\nX\n5\n6\n", [ 'fromFile' => 'input.txt', 'toFile' => 'output.txt', ], ], ]; } public static function provideBasicDiffGeneration(): array { return [ [ "--- input.txt +++ output.txt @@ -1,2 +1 @@ -A -B +A\rB ", "A\nB\n", "A\rB\n", ], [ "--- input.txt +++ output.txt @@ -1 +1 @@ - +\r \\ No newline at end of file ", "\n", "\r", ], [ "--- input.txt +++ output.txt @@ -1 +1 @@ -\r \\ No newline at end of file + ", "\r", "\n", ], [ '--- input.txt +++ output.txt @@ -1,3 +1,3 @@ X A -A +B ', "X\nA\nA\n", "X\nA\nB\n", ], [ '--- input.txt +++ output.txt @@ -1,3 +1,3 @@ X A -A \ No newline at end of file +B ', "X\nA\nA", "X\nA\nB\n", ], [ '--- input.txt +++ output.txt @@ -1,3 +1,3 @@ A A -A +B \ No newline at end of file ', "A\nA\nA\n", "A\nA\nB", ], [ '--- input.txt +++ output.txt @@ -1 +1 @@ -A \ No newline at end of file +B \ No newline at end of file ', 'A', 'B', ], ]; } } PK!zl浤V V 2diff/tests/Output/UnifiedDiffOutputBuilderTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use PHPUnit\Framework\TestCase; use SebastianBergmann\Diff\Differ; /** * @covers SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder * * @uses SebastianBergmann\Diff\Differ * @uses SebastianBergmann\Diff\Output\AbstractChunkOutputBuilder * @uses SebastianBergmann\Diff\TimeEfficientLongestCommonSubsequenceCalculator */ final class UnifiedDiffOutputBuilderTest extends TestCase { /** * @param string $expected * @param string $from * @param string $to * @param string $header * * @dataProvider headerProvider */ public function testCustomHeaderCanBeUsed(string $expected, string $from, string $to, string $header): void { $differ = new Differ(new UnifiedDiffOutputBuilder($header)); $this->assertSame( $expected, $differ->diff($from, $to) ); } public function headerProvider(): array { return [ [ "CUSTOM HEADER\n@@ @@\n-a\n+b\n", 'a', 'b', 'CUSTOM HEADER', ], [ "CUSTOM HEADER\n@@ @@\n-a\n+b\n", 'a', 'b', "CUSTOM HEADER\n", ], [ "CUSTOM HEADER\n\n@@ @@\n-a\n+b\n", 'a', 'b', "CUSTOM HEADER\n\n", ], [ "@@ @@\n-a\n+b\n", 'a', 'b', '', ], ]; } /** * @param string $expected * @param string $from * @param string $to * * @dataProvider provideDiffWithLineNumbers */ public function testDiffWithLineNumbers($expected, $from, $to): void { $differ = new Differ(new UnifiedDiffOutputBuilder("--- Original\n+++ New\n", true)); $this->assertSame($expected, $differ->diff($from, $to)); } public function provideDiffWithLineNumbers(): array { return UnifiedDiffOutputBuilderDataProvider::provideDiffWithLineNumbers(); } } PK!奟~))4diff/tests/Output/AbstractChunkOutputBuilderTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use PHPUnit\Framework\TestCase; use SebastianBergmann\Diff\Differ; /** * @covers SebastianBergmann\Diff\Output\AbstractChunkOutputBuilder * * @uses SebastianBergmann\Diff\Differ * @uses SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder * @uses SebastianBergmann\Diff\TimeEfficientLongestCommonSubsequenceCalculator */ final class AbstractChunkOutputBuilderTest extends TestCase { /** * @param array $expected * @param string $from * @param string $to * @param int $lineThreshold * * @dataProvider provideGetCommonChunks */ public function testGetCommonChunks(array $expected, string $from, string $to, int $lineThreshold = 5): void { $output = new class extends AbstractChunkOutputBuilder { public function getDiff(array $diff): string { return ''; } public function getChunks(array $diff, $lineThreshold) { return $this->getCommonChunks($diff, $lineThreshold); } }; $this->assertSame( $expected, $output->getChunks((new Differ)->diffToArray($from, $to), $lineThreshold) ); } public function provideGetCommonChunks(): array { return[ 'same (with default threshold)' => [ [], 'A', 'A', ], 'same (threshold 0)' => [ [0 => 0], 'A', 'A', 0, ], 'empty' => [ [], '', '', ], 'single line diff' => [ [], 'A', 'B', ], 'below threshold I' => [ [], "A\nX\nC", "A\nB\nC", ], 'below threshold II' => [ [], "A\n\n\n\nX\nC", "A\n\n\n\nB\nC", ], 'below threshold III' => [ [0 => 5], "A\n\n\n\n\n\nB", "A\n\n\n\n\n\nA", ], 'same start' => [ [0 => 5], "A\n\n\n\n\n\nX\nC", "A\n\n\n\n\n\nB\nC", ], 'same start long' => [ [0 => 13], "\n\n\n\n\n\n\n\n\n\n\n\n\n\nA", "\n\n\n\n\n\n\n\n\n\n\n\n\n\nB", ], 'same part in between' => [ [2 => 8], "A\n\n\n\n\n\n\nX\nY\nZ\n\n", "B\n\n\n\n\n\n\nX\nA\nZ\n\n", ], 'same trailing' => [ [2 => 14], "A\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "B\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ], 'same part in between, same trailing' => [ [2 => 7, 10 => 15], "A\n\n\n\n\n\n\nA\n\n\n\n\n\n\n", "B\n\n\n\n\n\n\nB\n\n\n\n\n\n\n", ], 'below custom threshold I' => [ [], "A\n\nB", "A\n\nD", 2, ], 'custom threshold I' => [ [0 => 1], "A\n\nB", "A\n\nD", 1, ], 'custom threshold II' => [ [], "A\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "A\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", 19, ], [ [3 => 9], "a\nb\nc\nd\ne\nf\ng\nh\ni\nj\nk", "a\np\nc\nd\ne\nf\ng\nh\ni\nw\nk", ], [ [0 => 5, 8 => 13], "A\nA\nA\nA\nA\nA\nX\nC\nC\nC\nC\nC\nC", "A\nA\nA\nA\nA\nA\nB\nC\nC\nC\nC\nC\nC", ], [ [0 => 5, 8 => 13], "A\nA\nA\nA\nA\nA\nX\nC\nC\nC\nC\nC\nC\nX", "A\nA\nA\nA\nA\nA\nB\nC\nC\nC\nC\nC\nC\nY", ], ]; } } PK! %y0diff/tests/MemoryEfficientImplementationTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; /** * @covers SebastianBergmann\Diff\MemoryEfficientLongestCommonSubsequenceCalculator */ final class MemoryEfficientImplementationTest extends LongestCommonSubsequenceTest { protected function createImplementation(): LongestCommonSubsequenceCalculator { return new MemoryEfficientLongestCommonSubsequenceCalculator; } } PK!墍 diff/.travis.ymlnu誌w洞language: php php: - 5.3 - 5.4 - 5.5 - 5.6 - 7.0 - 7.0snapshot - 7.1 - 7.1snapshot - master sudo: false before_install: - composer self-update - composer clear-cache install: - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest --optimize-autoloader --prefer-stable script: - ./vendor/bin/phpunit --coverage-clover=coverage.xml after_success: - bash <(curl -s https://codecov.io/bash) notifications: email: false PK!姜S  diff/.php_cs.distnu刐迭 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => true, 'cast_spaces' => true, 'class_attributes_separation' => ['elements' => ['method']], 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => ['space' => 'none'], 'declare_strict_types' => true, 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'no_alias_functions' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_null_property_initialization' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => true, 'no_unneeded_curly_braces' => true, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_types' => true, 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'return_type_declaration' => ['space_before' => 'none'], 'self_accessor' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => true, 'void_return' => true, 'whitespace_after_comma_in_array' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ); PK!K^diff/composer.jsonnu誌w洞{ "name": "sebastian/diff", "description": "Diff implementation", "keywords": ["diff"], "homepage": "https://github.com/sebastianbergmann/diff", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" } ], "require": { "php": "^5.3.3 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "1.4-dev" } } } PK!运睌diff/.github/stale.ymlnu刐迭# Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale daysUntilStale: 60 # Number of days of inactivity before a stale Issue or Pull Request is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. daysUntilClose: 7 # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - enhancement # Set to true to ignore issues in a project (defaults to false) exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: false # Label to use when marking as stale staleLabel: wontfix # Comment to post when marking as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Comment to post when closing a stale Issue or Pull Request. closeComment: > This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 30 # Limit to only `issues` or `pulls` only: issues PK!鎮蠥diff/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [5.1.1] - 2024-03-02 ### Changed * Do not use implicitly nullable parameters ## [5.1.0] - 2023-12-22 ### Added * `SebastianBergmann\Diff\Chunk::start()`, `SebastianBergmann\Diff\Chunk::startRange()`, `SebastianBergmann\Diff\Chunk::end()`, `SebastianBergmann\Diff\Chunk::endRange()`, and `SebastianBergmann\Diff\Chunk::lines()` * `SebastianBergmann\Diff\Diff::from()`, `SebastianBergmann\Diff\Diff::to()`, and `SebastianBergmann\Diff\Diff::chunks()` * `SebastianBergmann\Diff\Line::content()` and `SebastianBergmann\Diff\Diff::type()` * `SebastianBergmann\Diff\Line::isAdded()`,`SebastianBergmann\Diff\Line::isRemoved()`, and `SebastianBergmann\Diff\Line::isUnchanged()` ### Changed * `SebastianBergmann\Diff\Diff` now implements `IteratorAggregate`, iterating over it yields the aggregated `SebastianBergmann\Diff\Chunk` objects * `SebastianBergmann\Diff\Chunk` now implements `IteratorAggregate`, iterating over it yields the aggregated `SebastianBergmann\Diff\Line` objects ### Deprecated * `SebastianBergmann\Diff\Chunk::getStart()`, `SebastianBergmann\Diff\Chunk::getStartRange()`, `SebastianBergmann\Diff\Chunk::getEnd()`, `SebastianBergmann\Diff\Chunk::getEndRange()`, and `SebastianBergmann\Diff\Chunk::getLines()` * `SebastianBergmann\Diff\Diff::getFrom()`, `SebastianBergmann\Diff\Diff::getTo()`, and `SebastianBergmann\Diff\Diff::getChunks()` * `SebastianBergmann\Diff\Line::getContent()` and `SebastianBergmann\Diff\Diff::getType()` ## [5.0.3] - 2023-05-01 ### Changed * [#119](https://github.com/sebastianbergmann/diff/pull/119): Improve performance of `TimeEfficientLongestCommonSubsequenceCalculator` ## [5.0.2] - 2023-05-01 ### Changed * [#118](https://github.com/sebastianbergmann/diff/pull/118): Improve performance of `MemoryEfficientLongestCommonSubsequenceCalculator` ## [5.0.1] - 2023-03-23 ### Fixed * [#115](https://github.com/sebastianbergmann/diff/pull/115): `Parser::parseFileDiff()` does not handle diffs correctly that only add lines or only remove lines ## [5.0.0] - 2023-02-03 ### Changed * Passing a `DiffOutputBuilderInterface` instance to `Differ::__construct()` is no longer optional ### Removed * Removed support for PHP 7.3, PHP 7.4, and PHP 8.0 ## [4.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\Diff\Exception` now correctly extends `\Throwable` ## [4.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.2] - 2020-06-30 ### Added * This component is now supported on PHP 8 ## [4.0.1] - 2020-05-08 ### Fixed * [#99](https://github.com/sebastianbergmann/diff/pull/99): Regression in unified diff output of identical strings ## [4.0.0] - 2020-02-07 ### Removed * Removed support for PHP 7.1 and PHP 7.2 ## [3.0.2] - 2019-02-04 ### Changed * `Chunk::setLines()` now ensures that the `$lines` array only contains `Line` objects ## [3.0.1] - 2018-06-10 ### Fixed * Removed `"minimum-stability": "dev",` from `composer.json` ## [3.0.0] - 2018-02-01 * The `StrictUnifiedDiffOutputBuilder` implementation of the `DiffOutputBuilderInterface` was added ### Changed * The default `DiffOutputBuilderInterface` implementation now generates context lines (unchanged lines) ### Removed * Removed support for PHP 7.0 ### Fixed * [#70](https://github.com/sebastianbergmann/diff/issues/70): Diffing of arrays no longer works ## [2.0.1] - 2017-08-03 ### Fixed * [#66](https://github.com/sebastianbergmann/diff/pull/66): Restored backwards compatibility for PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 ## [2.0.0] - 2017-07-11 [YANKED] ### Added * [#64](https://github.com/sebastianbergmann/diff/pull/64): Show line numbers for chunks of a diff ### Removed * This component is no longer supported on PHP 5.6 [5.1.1]: https://github.com/sebastianbergmann/diff/compare/5.1.0...5.1.1 [5.1.0]: https://github.com/sebastianbergmann/diff/compare/5.0.3...5.1.0 [5.0.3]: https://github.com/sebastianbergmann/diff/compare/5.0.2...5.0.3 [5.0.2]: https://github.com/sebastianbergmann/diff/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/diff/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/diff/compare/4.0.4...5.0.0 [4.0.4]: https://github.com/sebastianbergmann/diff/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/diff/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/diff/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/diff/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/diff/compare/3.0.2...4.0.0 [3.0.2]: https://github.com/sebastianbergmann/diff/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/diff/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/diff/compare/2.0...3.0.0 [2.0.1]: https://github.com/sebastianbergmann/diff/compare/c341c98ce083db77f896a0aa64f5ee7652915970...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.4...c341c98ce083db77f896a0aa64f5ee7652915970 PK!e捾diff/src/Line.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; class Line { const ADDED = 1; const REMOVED = 2; const UNCHANGED = 3; /** * @var int */ private $type; /** * @var string */ private $content; /** * @param int $type * @param string $content */ public function __construct($type = self::UNCHANGED, $content = '') { $this->type = $type; $this->content = $content; } /** * @return string */ public function getContent() { return $this->content; } /** * @return int */ public function getType() { return $this->type; } } PK!>傾s s >diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use function array_fill; use function array_merge; use function array_reverse; use function array_slice; use function count; use function in_array; use function max; final class MemoryEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator { /** * @inheritDoc */ public function calculate(array $from, array $to): array { $cFrom = count($from); $cTo = count($to); if ($cFrom === 0) { return []; } if ($cFrom === 1) { if (in_array($from[0], $to, true)) { return [$from[0]]; } return []; } $i = (int) ($cFrom / 2); $fromStart = array_slice($from, 0, $i); $fromEnd = array_slice($from, $i); $llB = $this->length($fromStart, $to); $llE = $this->length(array_reverse($fromEnd), array_reverse($to)); $jMax = 0; $max = 0; for ($j = 0; $j <= $cTo; $j++) { $m = $llB[$j] + $llE[$cTo - $j]; if ($m >= $max) { $max = $m; $jMax = $j; } } $toStart = array_slice($to, 0, $jMax); $toEnd = array_slice($to, $jMax); return array_merge( $this->calculate($fromStart, $toStart), $this->calculate($fromEnd, $toEnd), ); } private function length(array $from, array $to): array { $current = array_fill(0, count($to) + 1, 0); $cFrom = count($from); $cTo = count($to); for ($i = 0; $i < $cFrom; $i++) { $prev = $current; for ($j = 0; $j < $cTo; $j++) { if ($from[$i] === $to[$j]) { $current[$j + 1] = $prev[$j] + 1; } else { /** * @noinspection PhpConditionCanBeReplacedWithMinMaxCallInspection * * We do not use max() here to avoid the function call overhead */ if ($current[$j] > $prev[$j + 1]) { $current[$j + 1] = $current[$j]; } else { $current[$j + 1] = $prev[$j + 1]; } } } } return $current; } } PK!>柄D/diff/src/LongestCommonSubsequenceCalculator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; interface LongestCommonSubsequenceCalculator { /** * Calculates the longest common subsequence of two arrays. */ public function calculate(array $from, array $to): array; } PK!S9R))diff/src/Differ.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use SebastianBergmann\Diff\LCS\LongestCommonSubsequence; use SebastianBergmann\Diff\LCS\TimeEfficientImplementation; use SebastianBergmann\Diff\LCS\MemoryEfficientImplementation; /** * Diff implementation. */ class Differ { /** * @var string */ private $header; /** * @var bool */ private $showNonDiffLines; /** * @param string $header * @param bool $showNonDiffLines */ public function __construct($header = "--- Original\n+++ New\n", $showNonDiffLines = true) { $this->header = $header; $this->showNonDiffLines = $showNonDiffLines; } /** * Returns the diff between two arrays or strings as string. * * @param array|string $from * @param array|string $to * @param LongestCommonSubsequence $lcs * * @return string */ public function diff($from, $to, LongestCommonSubsequence $lcs = null) { $from = $this->validateDiffInput($from); $to = $this->validateDiffInput($to); $diff = $this->diffToArray($from, $to, $lcs); $old = $this->checkIfDiffInOld($diff); $start = isset($old[0]) ? $old[0] : 0; $end = \count($diff); if ($tmp = \array_search($end, $old)) { $end = $tmp; } return $this->getBuffer($diff, $old, $start, $end); } /** * Casts variable to string if it is not a string or array. * * @param mixed $input * * @return string */ private function validateDiffInput($input) { if (!\is_array($input) && !\is_string($input)) { return (string) $input; } return $input; } /** * Takes input of the diff array and returns the old array. * Iterates through diff line by line, * * @param array $diff * * @return array */ private function checkIfDiffInOld(array $diff) { $inOld = false; $i = 0; $old = array(); foreach ($diff as $line) { if ($line[1] === 0 /* OLD */) { if ($inOld === false) { $inOld = $i; } } elseif ($inOld !== false) { if (($i - $inOld) > 5) { $old[$inOld] = $i - 1; } $inOld = false; } ++$i; } return $old; } /** * Generates buffer in string format, returning the patch. * * @param array $diff * @param array $old * @param int $start * @param int $end * * @return string */ private function getBuffer(array $diff, array $old, $start, $end) { $buffer = $this->header; if (!isset($old[$start])) { $buffer = $this->getDiffBufferElementNew($diff, $buffer, $start); ++$start; } for ($i = $start; $i < $end; $i++) { if (isset($old[$i])) { $i = $old[$i]; $buffer = $this->getDiffBufferElementNew($diff, $buffer, $i); } else { $buffer = $this->getDiffBufferElement($diff, $buffer, $i); } } return $buffer; } /** * Gets individual buffer element. * * @param array $diff * @param string $buffer * @param int $diffIndex * * @return string */ private function getDiffBufferElement(array $diff, $buffer, $diffIndex) { if ($diff[$diffIndex][1] === 1 /* ADDED */) { $buffer .= '+' . $diff[$diffIndex][0] . "\n"; } elseif ($diff[$diffIndex][1] === 2 /* REMOVED */) { $buffer .= '-' . $diff[$diffIndex][0] . "\n"; } elseif ($this->showNonDiffLines === true) { $buffer .= ' ' . $diff[$diffIndex][0] . "\n"; } return $buffer; } /** * Gets individual buffer element with opening. * * @param array $diff * @param string $buffer * @param int $diffIndex * * @return string */ private function getDiffBufferElementNew(array $diff, $buffer, $diffIndex) { if ($this->showNonDiffLines === true) { $buffer .= "@@ @@\n"; } return $this->getDiffBufferElement($diff, $buffer, $diffIndex); } /** * Returns the diff between two arrays or strings as array. * * Each array element contains two elements: * - [0] => mixed $token * - [1] => 2|1|0 * * - 2: REMOVED: $token was removed from $from * - 1: ADDED: $token was added to $from * - 0: OLD: $token is not changed in $to * * @param array|string $from * @param array|string $to * @param LongestCommonSubsequence $lcs * * @return array */ public function diffToArray($from, $to, LongestCommonSubsequence $lcs = null) { if (\is_string($from)) { $fromMatches = $this->getNewLineMatches($from); $from = $this->splitStringByLines($from); } elseif (\is_array($from)) { $fromMatches = array(); } else { throw new \InvalidArgumentException('"from" must be an array or string.'); } if (\is_string($to)) { $toMatches = $this->getNewLineMatches($to); $to = $this->splitStringByLines($to); } elseif (\is_array($to)) { $toMatches = array(); } else { throw new \InvalidArgumentException('"to" must be an array or string.'); } list($from, $to, $start, $end) = self::getArrayDiffParted($from, $to); if ($lcs === null) { $lcs = $this->selectLcsImplementation($from, $to); } $common = $lcs->calculate(\array_values($from), \array_values($to)); $diff = array(); if ($this->detectUnmatchedLineEndings($fromMatches, $toMatches)) { $diff[] = array( '#Warning: Strings contain different line endings!', 0 ); } foreach ($start as $token) { $diff[] = array($token, 0 /* OLD */); } \reset($from); \reset($to); foreach ($common as $token) { while (($fromToken = \reset($from)) !== $token) { $diff[] = array(\array_shift($from), 2 /* REMOVED */); } while (($toToken = \reset($to)) !== $token) { $diff[] = array(\array_shift($to), 1 /* ADDED */); } $diff[] = array($token, 0 /* OLD */); \array_shift($from); \array_shift($to); } while (($token = \array_shift($from)) !== null) { $diff[] = array($token, 2 /* REMOVED */); } while (($token = \array_shift($to)) !== null) { $diff[] = array($token, 1 /* ADDED */); } foreach ($end as $token) { $diff[] = array($token, 0 /* OLD */); } return $diff; } /** * Get new strings denoting new lines from a given string. * * @param string $string * * @return array */ private function getNewLineMatches($string) { \preg_match_all('(\r\n|\r|\n)', $string, $stringMatches); return $stringMatches; } /** * Checks if input is string, if so it will split it line-by-line. * * @param string $input * * @return array */ private function splitStringByLines($input) { return \preg_split('(\r\n|\r|\n)', $input); } /** * @param array $from * @param array $to * * @return LongestCommonSubsequence */ private function selectLcsImplementation(array $from, array $to) { // We do not want to use the time-efficient implementation if its memory // footprint will probably exceed this value. Note that the footprint // calculation is only an estimation for the matrix and the LCS method // will typically allocate a bit more memory than this. $memoryLimit = 100 * 1024 * 1024; if ($this->calculateEstimatedFootprint($from, $to) > $memoryLimit) { return new MemoryEfficientImplementation; } return new TimeEfficientImplementation; } /** * Calculates the estimated memory footprint for the DP-based method. * * @param array $from * @param array $to * * @return int|float */ private function calculateEstimatedFootprint(array $from, array $to) { $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; return $itemSize * \pow(\min(\count($from), \count($to)), 2); } /** * Returns true if line ends don't match on fromMatches and toMatches. * * @param array $fromMatches * @param array $toMatches * * @return bool */ private function detectUnmatchedLineEndings(array $fromMatches, array $toMatches) { return isset($fromMatches[0], $toMatches[0]) && \count($fromMatches[0]) === \count($toMatches[0]) && $fromMatches[0] !== $toMatches[0]; } /** * @param array $from * @param array $to * * @return array */ private static function getArrayDiffParted(array &$from, array &$to) { $start = array(); $end = array(); \reset($to); foreach ($from as $k => $v) { $toK = \key($to); if ($toK === $k && $v === $to[$k]) { $start[$k] = $v; unset($from[$k], $to[$k]); } else { break; } } \end($from); \end($to); do { $fromK = \key($from); $toK = \key($to); if (null === $fromK || null === $toK || \current($from) !== \current($to)) { break; } \prev($from); \prev($to); $end = array($fromK => $from[$fromK]) + $end; unset($from[$fromK], $to[$toK]); } while (true); return array($from, $to, $start, $end); } } PK!& 歉 diff/src/Parser.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; /** * Unified diff parser. */ class Parser { /** * @param string $string * * @return Diff[] */ public function parse($string) { $lines = \preg_split('(\r\n|\r|\n)', $string); if (!empty($lines) && $lines[\count($lines) - 1] == '') { \array_pop($lines); } $lineCount = \count($lines); $diffs = array(); $diff = null; $collected = array(); for ($i = 0; $i < $lineCount; ++$i) { if (\preg_match('(^---\\s+(?P\\S+))', $lines[$i], $fromMatch) && \preg_match('(^\\+\\+\\+\\s+(?P\\S+))', $lines[$i + 1], $toMatch)) { if ($diff !== null) { $this->parseFileDiff($diff, $collected); $diffs[] = $diff; $collected = array(); } $diff = new Diff($fromMatch['file'], $toMatch['file']); ++$i; } else { if (\preg_match('/^(?:diff --git |index [\da-f\.]+|[+-]{3} [ab])/', $lines[$i])) { continue; } $collected[] = $lines[$i]; } } if ($diff !== null && \count($collected)) { $this->parseFileDiff($diff, $collected); $diffs[] = $diff; } return $diffs; } /** * @param Diff $diff * @param array $lines */ private function parseFileDiff(Diff $diff, array $lines) { $chunks = array(); $chunk = null; foreach ($lines as $line) { if (\preg_match('/^@@\s+-(?P\d+)(?:,\s*(?P\d+))?\s+\+(?P\d+)(?:,\s*(?P\d+))?\s+@@/', $line, $match)) { $chunk = new Chunk( $match['start'], isset($match['startrange']) ? \max(1, $match['startrange']) : 1, $match['end'], isset($match['endrange']) ? \max(1, $match['endrange']) : 1 ); $chunks[] = $chunk; $diffLines = array(); continue; } if (\preg_match('/^(?P[+ -])?(?P.*)/', $line, $match)) { $type = Line::UNCHANGED; if ($match['type'] === '+') { $type = Line::ADDED; } elseif ($match['type'] === '-') { $type = Line::REMOVED; } $diffLines[] = new Line($type, $match['line']); if (null !== $chunk) { $chunk->setLines($diffLines); } } } $diff->setChunks($chunks); } } PK!v莬寂diff/src/Chunk.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; class Chunk { /** * @var int */ private $start; /** * @var int */ private $startRange; /** * @var int */ private $end; /** * @var int */ private $endRange; /** * @var array */ private $lines; /** * @param int $start * @param int $startRange * @param int $end * @param int $endRange * @param array $lines */ public function __construct($start = 0, $startRange = 1, $end = 0, $endRange = 1, array $lines = array()) { $this->start = (int) $start; $this->startRange = (int) $startRange; $this->end = (int) $end; $this->endRange = (int) $endRange; $this->lines = $lines; } /** * @return int */ public function getStart() { return $this->start; } /** * @return int */ public function getStartRange() { return $this->startRange; } /** * @return int */ public function getEnd() { return $this->end; } /** * @return int */ public function getEndRange() { return $this->endRange; } /** * @return array */ public function getLines() { return $this->lines; } /** * @param array $lines */ public function setLines(array $lines) { $this->lines = $lines; } } PK!S dhdiff/src/Diff.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; class Diff { /** * @var string */ private $from; /** * @var string */ private $to; /** * @var Chunk[] */ private $chunks; /** * @param string $from * @param string $to * @param Chunk[] $chunks */ public function __construct($from, $to, array $chunks = array()) { $this->from = $from; $this->to = $to; $this->chunks = $chunks; } /** * @return string */ public function getFrom() { return $this->from; } /** * @return string */ public function getTo() { return $this->to; } /** * @return Chunk[] */ public function getChunks() { return $this->chunks; } /** * @param Chunk[] $chunks */ public function setChunks(array $chunks) { $this->chunks = $chunks; } } PK!)-diff/src/Exception/ConfigurationException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use function gettype; use function is_object; use function sprintf; use Exception; final class ConfigurationException extends InvalidArgumentException { public function __construct( string $option, string $expected, $value, int $code = 0, ?Exception $previous = null ) { parent::__construct( sprintf( 'Option "%s" must be %s, got "%s".', $option, $expected, is_object($value) ? $value::class : (null === $value ? '' : gettype($value) . '#' . $value), ), $code, $previous, ); } } PK!>faa diff/src/Exception/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use Throwable; interface Exception extends Throwable { } PK!L}f/diff/src/Exception/InvalidArgumentException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } PK!KU{@ @ <diff/src/TimeEfficientLongestCommonSubsequenceCalculator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff; use function array_reverse; use function count; use function max; use SplFixedArray; final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator { /** * @inheritDoc */ public function calculate(array $from, array $to): array { $common = []; $fromLength = count($from); $toLength = count($to); $width = $fromLength + 1; $matrix = new SplFixedArray($width * ($toLength + 1)); for ($i = 0; $i <= $fromLength; $i++) { $matrix[$i] = 0; } for ($j = 0; $j <= $toLength; $j++) { $matrix[$j * $width] = 0; } for ($i = 1; $i <= $fromLength; $i++) { for ($j = 1; $j <= $toLength; $j++) { $o = ($j * $width) + $i; // don't use max() to avoid function call overhead $firstOrLast = $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0; if ($matrix[$o - 1] > $matrix[$o - $width]) { if ($firstOrLast > $matrix[$o - 1]) { $matrix[$o] = $firstOrLast; } else { $matrix[$o] = $matrix[$o - 1]; } } else { if ($firstOrLast > $matrix[$o - $width]) { $matrix[$o] = $firstOrLast; } else { $matrix[$o] = $matrix[$o - $width]; } } } } $i = $fromLength; $j = $toLength; while ($i > 0 && $j > 0) { if ($from[$i - 1] === $to[$j - 1]) { $common[] = $from[$i - 1]; $i--; $j--; } else { $o = ($j * $width) + $i; if ($matrix[$o - $width] > $matrix[$o - 1]) { $j--; } else { $i--; } } } return array_reverse($common); } } PK!粮w.diff/src/Output/AbstractChunkOutputBuilder.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function count; abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface { /** * Takes input of the diff array and returns the common parts. * Iterates through diff line by line. */ protected function getCommonChunks(array $diff, int $lineThreshold = 5): array { $diffSize = count($diff); $capturing = false; $chunkStart = 0; $chunkSize = 0; $commonChunks = []; for ($i = 0; $i < $diffSize; $i++) { if ($diff[$i][1] === 0 /* OLD */) { if ($capturing === false) { $capturing = true; $chunkStart = $i; $chunkSize = 0; } else { $chunkSize++; } } elseif ($capturing !== false) { if ($chunkSize >= $lineThreshold) { $commonChunks[$chunkStart] = $chunkStart + $chunkSize; } $capturing = false; } } if ($capturing !== false && $chunkSize >= $lineThreshold) { $commonChunks[$chunkStart] = $chunkStart + $chunkSize; } return $commonChunks; } } PK!柳0  .diff/src/Output/DiffOutputBuilderInterface.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; /** * Defines how an output builder should take a generated * diff array and return a string representation of that diff. */ interface DiffOutputBuilderInterface { public function getDiff(array $diff): string; } PK!K5P**2diff/src/Output/StrictUnifiedDiffOutputBuilder.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function array_merge; use function array_splice; use function count; use function fclose; use function fopen; use function fwrite; use function is_bool; use function is_int; use function is_string; use function max; use function min; use function sprintf; use function stream_get_contents; use function substr; use SebastianBergmann\Diff\ConfigurationException; use SebastianBergmann\Diff\Differ; /** * Strict Unified diff output builder. * * Generates (strict) Unified diff's (unidiffs) with hunks. */ final class StrictUnifiedDiffOutputBuilder implements DiffOutputBuilderInterface { private static array $default = [ 'collapseRanges' => true, // ranges of length one are rendered with the trailing `,1` 'commonLineThreshold' => 6, // number of same lines before ending a new hunk and creating a new one (if needed) 'contextLines' => 3, // like `diff: -u, -U NUM, --unified[=NUM]`, for patch/git apply compatibility best to keep at least @ 3 'fromFile' => null, 'fromFileDate' => null, 'toFile' => null, 'toFileDate' => null, ]; private bool $changed; private bool $collapseRanges; /** * @psalm-var positive-int */ private int $commonLineThreshold; private string $header; /** * @psalm-var positive-int */ private int $contextLines; public function __construct(array $options = []) { $options = array_merge(self::$default, $options); if (!is_bool($options['collapseRanges'])) { throw new ConfigurationException('collapseRanges', 'a bool', $options['collapseRanges']); } if (!is_int($options['contextLines']) || $options['contextLines'] < 0) { throw new ConfigurationException('contextLines', 'an int >= 0', $options['contextLines']); } if (!is_int($options['commonLineThreshold']) || $options['commonLineThreshold'] <= 0) { throw new ConfigurationException('commonLineThreshold', 'an int > 0', $options['commonLineThreshold']); } $this->assertString($options, 'fromFile'); $this->assertString($options, 'toFile'); $this->assertStringOrNull($options, 'fromFileDate'); $this->assertStringOrNull($options, 'toFileDate'); $this->header = sprintf( "--- %s%s\n+++ %s%s\n", $options['fromFile'], null === $options['fromFileDate'] ? '' : "\t" . $options['fromFileDate'], $options['toFile'], null === $options['toFileDate'] ? '' : "\t" . $options['toFileDate'], ); $this->collapseRanges = $options['collapseRanges']; $this->commonLineThreshold = $options['commonLineThreshold']; $this->contextLines = $options['contextLines']; } public function getDiff(array $diff): string { if (0 === count($diff)) { return ''; } $this->changed = false; $buffer = fopen('php://memory', 'r+b'); fwrite($buffer, $this->header); $this->writeDiffHunks($buffer, $diff); if (!$this->changed) { fclose($buffer); return ''; } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); // If the last char is not a linebreak: add it. // This might happen when both the `from` and `to` do not have a trailing linebreak $last = substr($diff, -1); return "\n" !== $last && "\r" !== $last ? $diff . "\n" : $diff; } private function writeDiffHunks($output, array $diff): void { // detect "No newline at end of file" and insert into `$diff` if needed $upperLimit = count($diff); if (0 === $diff[$upperLimit - 1][1]) { $lc = substr($diff[$upperLimit - 1][0], -1); if ("\n" !== $lc) { array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } } else { // search back for the last `+` and `-` line, // check if it has a trailing linebreak, else add a warning under it $toFind = [1 => true, 2 => true]; for ($i = $upperLimit - 1; $i >= 0; $i--) { if (isset($toFind[$diff[$i][1]])) { unset($toFind[$diff[$i][1]]); $lc = substr($diff[$i][0], -1); if ("\n" !== $lc) { array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } if (!count($toFind)) { break; } } } } // write hunks to output buffer $cutOff = max($this->commonLineThreshold, $this->contextLines); $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; $toStart = $fromStart = 1; $i = 0; /** @var int $i */ foreach ($diff as $i => $entry) { if (0 === $entry[1]) { // same if (false === $hunkCapture) { $fromStart++; $toStart++; continue; } $sameCount++; $toRange++; $fromRange++; if ($sameCount === $cutOff) { $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 ? $hunkCapture : $this->contextLines; // note: $contextEndOffset = $this->contextLines; // // because we never go beyond the end of the diff. // with the cutoff/contextlines here the follow is never true; // // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { // $contextEndOffset = count($diff) - 1; // } // // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $cutOff + $this->contextLines + 1, $fromStart - $contextStartOffset, $fromRange - $cutOff + $contextStartOffset + $this->contextLines, $toStart - $contextStartOffset, $toRange - $cutOff + $contextStartOffset + $this->contextLines, $output, ); $fromStart += $fromRange; $toStart += $toRange; $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; } continue; } $sameCount = 0; if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { continue; } $this->changed = true; if (false === $hunkCapture) { $hunkCapture = $i; } if (Differ::ADDED === $entry[1]) { // added $toRange++; } if (Differ::REMOVED === $entry[1]) { // removed $fromRange++; } } if (false === $hunkCapture) { return; } // we end here when cutoff (commonLineThreshold) was not reached, but we were capturing a hunk, // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // prevent trying to write out more common lines than there are in the diff _and_ // do not write more than configured through the context lines $contextEndOffset = min($sameCount, $this->contextLines); $fromRange -= $sameCount; $toRange -= $sameCount; $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $sameCount + $contextEndOffset + 1, $fromStart - $contextStartOffset, $fromRange + $contextStartOffset + $contextEndOffset, $toStart - $contextStartOffset, $toRange + $contextStartOffset + $contextEndOffset, $output, ); } private function writeHunk( array $diff, int $diffStartIndex, int $diffEndIndex, int $fromStart, int $fromRange, int $toStart, int $toRange, $output ): void { fwrite($output, '@@ -' . $fromStart); if (!$this->collapseRanges || 1 !== $fromRange) { fwrite($output, ',' . $fromRange); } fwrite($output, ' +' . $toStart); if (!$this->collapseRanges || 1 !== $toRange) { fwrite($output, ',' . $toRange); } fwrite($output, " @@\n"); for ($i = $diffStartIndex; $i < $diffEndIndex; $i++) { if ($diff[$i][1] === Differ::ADDED) { $this->changed = true; fwrite($output, '+' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::REMOVED) { $this->changed = true; fwrite($output, '-' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::OLD) { fwrite($output, ' ' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { $this->changed = true; fwrite($output, $diff[$i][0]); } // } elseif ($diff[$i][1] === Differ::DIFF_LINE_END_WARNING) { // custom comment inserted by PHPUnit/diff package // skip // } else { // unknown/invalid // } } } private function assertString(array $options, string $option): void { if (!is_string($options[$option])) { throw new ConfigurationException($option, 'a string', $options[$option]); } } private function assertStringOrNull(array $options, string $option): void { if (null !== $options[$option] && !is_string($options[$option])) { throw new ConfigurationException($option, 'a string or ', $options[$option]); } } } PK!榮 ,diff/src/Output/UnifiedDiffOutputBuilder.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function array_splice; use function count; use function fclose; use function fopen; use function fwrite; use function max; use function min; use function str_ends_with; use function stream_get_contents; use function substr; use SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in unified diff format in chunks. */ final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder { private bool $collapseRanges = true; private int $commonLineThreshold = 6; /** * @psalm-var positive-int */ private int $contextLines = 3; private string $header; private bool $addLineNumbers; public function __construct(string $header = "--- Original\n+++ New\n", bool $addLineNumbers = false) { $this->header = $header; $this->addLineNumbers = $addLineNumbers; } public function getDiff(array $diff): string { $buffer = fopen('php://memory', 'r+b'); if ('' !== $this->header) { fwrite($buffer, $this->header); if (!str_ends_with($this->header, "\n")) { fwrite($buffer, "\n"); } } if (0 !== count($diff)) { $this->writeDiffHunks($buffer, $diff); } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); // If the diff is non-empty and last char is not a linebreak: add it. // This might happen when both the `from` and `to` do not have a trailing linebreak $last = substr($diff, -1); return '' !== $diff && "\n" !== $last && "\r" !== $last ? $diff . "\n" : $diff; } private function writeDiffHunks($output, array $diff): void { // detect "No newline at end of file" and insert into `$diff` if needed $upperLimit = count($diff); if (0 === $diff[$upperLimit - 1][1]) { $lc = substr($diff[$upperLimit - 1][0], -1); if ("\n" !== $lc) { array_splice($diff, $upperLimit, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } } else { // search back for the last `+` and `-` line, // check if it has trailing linebreak, else add a warning under it $toFind = [1 => true, 2 => true]; for ($i = $upperLimit - 1; $i >= 0; $i--) { if (isset($toFind[$diff[$i][1]])) { unset($toFind[$diff[$i][1]]); $lc = substr($diff[$i][0], -1); if ("\n" !== $lc) { array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]); } if (!count($toFind)) { break; } } } } // write hunks to output buffer $cutOff = max($this->commonLineThreshold, $this->contextLines); $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; $toStart = $fromStart = 1; $i = 0; /** @var int $i */ foreach ($diff as $i => $entry) { if (0 === $entry[1]) { // same if (false === $hunkCapture) { $fromStart++; $toStart++; continue; } $sameCount++; $toRange++; $fromRange++; if ($sameCount === $cutOff) { $contextStartOffset = ($hunkCapture - $this->contextLines) < 0 ? $hunkCapture : $this->contextLines; // note: $contextEndOffset = $this->contextLines; // // because we never go beyond the end of the diff. // with the cutoff/contextlines here the follow is never true; // // if ($i - $cutOff + $this->contextLines + 1 > \count($diff)) { // $contextEndOffset = count($diff) - 1; // } // // ; that would be true for a trailing incomplete hunk case which is dealt with after this loop $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $cutOff + $this->contextLines + 1, $fromStart - $contextStartOffset, $fromRange - $cutOff + $contextStartOffset + $this->contextLines, $toStart - $contextStartOffset, $toRange - $cutOff + $contextStartOffset + $this->contextLines, $output, ); $fromStart += $fromRange; $toStart += $toRange; $hunkCapture = false; $sameCount = $toRange = $fromRange = 0; } continue; } $sameCount = 0; if ($entry[1] === Differ::NO_LINE_END_EOF_WARNING) { continue; } if (false === $hunkCapture) { $hunkCapture = $i; } if (Differ::ADDED === $entry[1]) { $toRange++; } if (Differ::REMOVED === $entry[1]) { $fromRange++; } } if (false === $hunkCapture) { return; } // we end here when cutoff (commonLineThreshold) was not reached, but we were capturing a hunk, // do not render hunk till end automatically because the number of context lines might be less than the commonLineThreshold $contextStartOffset = $hunkCapture - $this->contextLines < 0 ? $hunkCapture : $this->contextLines; // prevent trying to write out more common lines than there are in the diff _and_ // do not write more than configured through the context lines $contextEndOffset = min($sameCount, $this->contextLines); $fromRange -= $sameCount; $toRange -= $sameCount; $this->writeHunk( $diff, $hunkCapture - $contextStartOffset, $i - $sameCount + $contextEndOffset + 1, $fromStart - $contextStartOffset, $fromRange + $contextStartOffset + $contextEndOffset, $toStart - $contextStartOffset, $toRange + $contextStartOffset + $contextEndOffset, $output, ); } private function writeHunk( array $diff, int $diffStartIndex, int $diffEndIndex, int $fromStart, int $fromRange, int $toStart, int $toRange, $output ): void { if ($this->addLineNumbers) { fwrite($output, '@@ -' . $fromStart); if (!$this->collapseRanges || 1 !== $fromRange) { fwrite($output, ',' . $fromRange); } fwrite($output, ' +' . $toStart); if (!$this->collapseRanges || 1 !== $toRange) { fwrite($output, ',' . $toRange); } fwrite($output, " @@\n"); } else { fwrite($output, "@@ @@\n"); } for ($i = $diffStartIndex; $i < $diffEndIndex; $i++) { if ($diff[$i][1] === Differ::ADDED) { fwrite($output, '+' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::REMOVED) { fwrite($output, '-' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::OLD) { fwrite($output, ' ' . $diff[$i][0]); } elseif ($diff[$i][1] === Differ::NO_LINE_END_EOF_WARNING) { fwrite($output, "\n"); // $diff[$i][0] } else { /* Not changed (old) Differ::OLD or Warning Differ::DIFF_LINE_END_WARNING */ fwrite($output, ' ' . $diff[$i][0]); } } } } PK!鯩'11)diff/src/Output/DiffOnlyOutputBuilder.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\Output; use function fclose; use function fopen; use function fwrite; use function str_ends_with; use function stream_get_contents; use function substr; use SebastianBergmann\Diff\Differ; /** * Builds a diff string representation in a loose unified diff format * listing only changes lines. Does not include line numbers. */ final class DiffOnlyOutputBuilder implements DiffOutputBuilderInterface { private string $header; public function __construct(string $header = "--- Original\n+++ New\n") { $this->header = $header; } public function getDiff(array $diff): string { $buffer = fopen('php://memory', 'r+b'); if ('' !== $this->header) { fwrite($buffer, $this->header); if (!str_ends_with($this->header, "\n")) { fwrite($buffer, "\n"); } } foreach ($diff as $diffEntry) { if ($diffEntry[1] === Differ::ADDED) { fwrite($buffer, '+' . $diffEntry[0]); } elseif ($diffEntry[1] === Differ::REMOVED) { fwrite($buffer, '-' . $diffEntry[0]); } elseif ($diffEntry[1] === Differ::DIFF_LINE_END_WARNING) { fwrite($buffer, ' ' . $diffEntry[0]); continue; // Warnings should not be tested for line break, it will always be there } else { /* Not changed (old) 0 */ continue; // we didn't write the not-changed line, so do not add a line break either } $lc = substr($diffEntry[0], -1); if ($lc !== "\n" && $lc !== "\r") { fwrite($buffer, "\n"); // \No newline at end of file } } $diff = stream_get_contents($buffer, -1, 0); fclose($buffer); return $diff; } } PK!diff/build.xmlnu誌w洞 PK!Ju苘,,diff/.gitignorenu誌w洞/.idea /composer.lock /vendor /.php_cs.cachePK!:recursion-context/phpunit.xmlnu刐迭 tests src PK!痓樤recursion-context/README.mdnu誌w洞# Recursion Context ... ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/recursion-context If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/recursion-context PK!绅recursion-context/LICENSEnu誌w洞Recursion Context Copyright (c) 2002-2015, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!貭 9ee'recursion-context/tests/ContextTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\RecursionContext; use PHPUnit_Framework_TestCase; /** * @covers SebastianBergmann\RecursionContext\Context */ class ContextTest extends PHPUnit_Framework_TestCase { /** * @var \SebastianBergmann\RecursionContext\Context */ private $context; protected function setUp() { $this->context = new Context(); } public function failsProvider() { return array( array(true), array(false), array(null), array('string'), array(1), array(1.5), array(fopen('php://memory', 'r')) ); } public function valuesProvider() { $obj2 = new \stdClass(); $obj2->foo = 'bar'; $obj3 = (object) array(1,2,"Test\r\n",4,5,6,7,8); $obj = new \stdClass(); //@codingStandardsIgnoreStart $obj->null = null; //@codingStandardsIgnoreEnd $obj->boolean = true; $obj->integer = 1; $obj->double = 1.2; $obj->string = '1'; $obj->text = "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext"; $obj->object = $obj2; $obj->objectagain = $obj2; $obj->array = array('foo' => 'bar'); $obj->array2 = array(1,2,3,4,5,6); $obj->array3 = array($obj, $obj2, $obj3); $obj->self = $obj; $storage = new \SplObjectStorage(); $storage->attach($obj2); $storage->foo = $obj2; return array( array($obj, spl_object_hash($obj)), array($obj2, spl_object_hash($obj2)), array($obj3, spl_object_hash($obj3)), array($storage, spl_object_hash($storage)), array($obj->array, 0), array($obj->array2, 0), array($obj->array3, 0) ); } /** * @covers SebastianBergmann\RecursionContext\Context::add * @uses SebastianBergmann\RecursionContext\InvalidArgumentException * @dataProvider failsProvider */ public function testAddFails($value) { $this->setExpectedException( 'SebastianBergmann\\RecursionContext\\Exception', 'Only arrays and objects are supported' ); $this->context->add($value); } /** * @covers SebastianBergmann\RecursionContext\Context::contains * @uses SebastianBergmann\RecursionContext\InvalidArgumentException * @dataProvider failsProvider */ public function testContainsFails($value) { $this->setExpectedException( 'SebastianBergmann\\RecursionContext\\Exception', 'Only arrays and objects are supported' ); $this->context->contains($value); } /** * @covers SebastianBergmann\RecursionContext\Context::add * @dataProvider valuesProvider */ public function testAdd($value, $key) { $this->assertEquals($key, $this->context->add($value)); // Test we get the same key on subsequent adds $this->assertEquals($key, $this->context->add($value)); } /** * @covers SebastianBergmann\RecursionContext\Context::contains * @uses SebastianBergmann\RecursionContext\Context::add * @depends testAdd * @dataProvider valuesProvider */ public function testContainsFound($value, $key) { $this->context->add($value); $this->assertEquals($key, $this->context->contains($value)); // Test we get the same key on subsequent calls $this->assertEquals($key, $this->context->contains($value)); } /** * @covers SebastianBergmann\RecursionContext\Context::contains * @dataProvider valuesProvider */ public function testContainsNotFound($value) { $this->assertFalse($this->context->contains($value)); } } PK!?recursion-context/.travis.ymlnu誌w洞language: php php: - 5.3.3 - 5.3 - 5.4 - 5.5 - 5.6 - hhvm sudo: false before_script: - composer self-update - composer install --no-interaction --prefer-source --dev script: ./vendor/bin/phpunit notifications: email: false irc: "irc.freenode.org#phpunit" PK!6G訪Lrecursion-context/composer.jsonnu誌w洞{ "name": "sebastian/recursion-context", "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" } ], "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } PK!若绸JJ#recursion-context/src/Exception.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\RecursionContext; /** */ interface Exception { } PK!mH2recursion-context/src/InvalidArgumentException.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\RecursionContext; /** */ final class InvalidArgumentException extends \InvalidArgumentException implements Exception { } PK!{{!recursion-context/src/Context.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\RecursionContext; /** * A context containing previously processed arrays and objects * when recursively processing a value. */ final class Context { /** * @var array[] */ private $arrays; /** * @var \SplObjectStorage */ private $objects; /** * Initialises the context */ public function __construct() { $this->arrays = array(); $this->objects = new \SplObjectStorage; } /** * Adds a value to the context. * * @param array|object $value The value to add. * * @return int|string The ID of the stored value, either as a string or integer. * * @throws InvalidArgumentException Thrown if $value is not an array or object */ public function add(&$value) { if (is_array($value)) { return $this->addArray($value); } elseif (is_object($value)) { return $this->addObject($value); } throw new InvalidArgumentException( 'Only arrays and objects are supported' ); } /** * Checks if the given value exists within the context. * * @param array|object $value The value to check. * * @return int|string|false The string or integer ID of the stored value if it has already been seen, or false if the value is not stored. * * @throws InvalidArgumentException Thrown if $value is not an array or object */ public function contains(&$value) { if (is_array($value)) { return $this->containsArray($value); } elseif (is_object($value)) { return $this->containsObject($value); } throw new InvalidArgumentException( 'Only arrays and objects are supported' ); } /** * @param array $array * * @return bool|int */ private function addArray(array &$array) { $key = $this->containsArray($array); if ($key !== false) { return $key; } $key = count($this->arrays); $this->arrays[] = &$array; if (!isset($array[PHP_INT_MAX]) && !isset($array[PHP_INT_MAX - 1])) { $array[] = $key; $array[] = $this->objects; } else { /* cover the improbable case too */ do { $key = random_int(PHP_INT_MIN, PHP_INT_MAX); } while (isset($array[$key])); $array[$key] = $key; do { $key = random_int(PHP_INT_MIN, PHP_INT_MAX); } while (isset($array[$key])); $array[$key] = $this->objects; } return $key; } /** * @param object $object * * @return string */ private function addObject($object) { if (!$this->objects->contains($object)) { $this->objects->attach($object); } return spl_object_hash($object); } /** * @param array $array * * @return int|false */ private function containsArray(array &$array) { $end = array_slice($array, -2); return isset($end[1]) && $end[1] === $this->objects ? $end[0] : false; } /** * @param object $value * * @return string|false */ private function containsObject($value) { if ($this->objects->contains($value)) { return spl_object_hash($value); } return false; } public function __destruct() { foreach ($this->arrays as &$array) { if (is_array($array)) { array_pop($array); array_pop($array); } } } } PK!𠢻33recursion-context/build.xmlnu誌w洞 PK!纫Mqqrecursion-context/.gitignorenu誌w洞.idea phpunit.xml composer.lock composer.phar vendor/ cache.properties build/LICENSE build/README.md build/*.tgz PK!侓姄comparator/phpunit.xmlnu刐迭 tests src PK!|m戤xxcomparator/README.mdnu誌w洞[![Build Status](https://travis-ci.org/sebastianbergmann/comparator.svg?branch=master)](https://travis-ci.org/sebastianbergmann/comparator) # Comparator This component provides the functionality to compare PHP values for equality. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/comparator If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/comparator ## Usage ```php getComparatorFor($date1, $date2); try { $comparator->assertEquals($date1, $date2); print "Dates match"; } catch (ComparisonFailure $failure) { print "Dates don't match"; } ``` PK!:  comparator/LICENSEnu誌w洞Comparator Copyright (c) 2002-2015, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK! K9 +comparator/tests/ResourceComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * @coversDefaultClass SebastianBergmann\Comparator\ResourceComparator * */ class ResourceComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new ResourceComparator; } public function acceptsSucceedsProvider() { $tmpfile1 = tmpfile(); $tmpfile2 = tmpfile(); return array( array($tmpfile1, $tmpfile1), array($tmpfile2, $tmpfile2), array($tmpfile1, $tmpfile2) ); } public function acceptsFailsProvider() { $tmpfile1 = tmpfile(); return array( array($tmpfile1, null), array(null, $tmpfile1), array(null, null) ); } public function assertEqualsSucceedsProvider() { $tmpfile1 = tmpfile(); $tmpfile2 = tmpfile(); return array( array($tmpfile1, $tmpfile1), array($tmpfile2, $tmpfile2) ); } public function assertEqualsFailsProvider() { $tmpfile1 = tmpfile(); $tmpfile2 = tmpfile(); return array( array($tmpfile1, $tmpfile2), array($tmpfile2, $tmpfile1) ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual) { $exception = null; try { $this->comparator->assertEquals($expected, $actual); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual) { $this->setExpectedException('SebastianBergmann\\Comparator\\ComparisonFailure'); $this->comparator->assertEquals($expected, $actual); } } PK!)肪Bnn-comparator/tests/MockObjectComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * @coversDefaultClass SebastianBergmann\Comparator\MockObjectComparator * */ class MockObjectComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new MockObjectComparator; $this->comparator->setFactory(new Factory); } public function acceptsSucceedsProvider() { $testmock = $this->getMock('SebastianBergmann\\Comparator\\TestClass'); $stdmock = $this->getMock('stdClass'); return array( array($testmock, $testmock), array($stdmock, $stdmock), array($stdmock, $testmock) ); } public function acceptsFailsProvider() { $stdmock = $this->getMock('stdClass'); return array( array($stdmock, null), array(null, $stdmock), array(null, null) ); } public function assertEqualsSucceedsProvider() { // cyclic dependencies $book1 = $this->getMock('SebastianBergmann\\Comparator\\Book', null); $book1->author = $this->getMock('SebastianBergmann\\Comparator\\Author', null, array('Terry Pratchett')); $book1->author->books[] = $book1; $book2 = $this->getMock('SebastianBergmann\\Comparator\\Book', null); $book2->author = $this->getMock('SebastianBergmann\\Comparator\\Author', null, array('Terry Pratchett')); $book2->author->books[] = $book2; $object1 = $this->getMock('SebastianBergmann\\Comparator\\SampleClass', null, array(4, 8, 15)); $object2 = $this->getMock('SebastianBergmann\\Comparator\\SampleClass', null, array(4, 8, 15)); return array( array($object1, $object1), array($object1, $object2), array($book1, $book1), array($book1, $book2), array( $this->getMock('SebastianBergmann\\Comparator\\Struct', null, array(2.3)), $this->getMock('SebastianBergmann\\Comparator\\Struct', null, array(2.5)), 0.5 ) ); } public function assertEqualsFailsProvider() { $typeMessage = 'is not instance of expected class'; $equalMessage = 'Failed asserting that two objects are equal.'; // cyclic dependencies $book1 = $this->getMock('SebastianBergmann\\Comparator\\Book', null); $book1->author = $this->getMock('SebastianBergmann\\Comparator\\Author', null, array('Terry Pratchett')); $book1->author->books[] = $book1; $book2 = $this->getMock('SebastianBergmann\\Comparator\\Book', null); $book2->author = $this->getMock('SebastianBergmann\\Comparator\\Author', null, array('Terry Pratch')); $book2->author->books[] = $book2; $book3 = $this->getMock('SebastianBergmann\\Comparator\\Book', null); $book3->author = 'Terry Pratchett'; $book4 = $this->getMock('stdClass'); $book4->author = 'Terry Pratchett'; $object1 = $this->getMock('SebastianBergmann\\Comparator\\SampleClass', null, array(4, 8, 15)); $object2 = $this->getMock('SebastianBergmann\\Comparator\\SampleClass', null, array(16, 23, 42)); return array( array( $this->getMock('SebastianBergmann\\Comparator\\SampleClass', null, array(4, 8, 15)), $this->getMock('SebastianBergmann\\Comparator\\SampleClass', null, array(16, 23, 42)), $equalMessage ), array($object1, $object2, $equalMessage), array($book1, $book2, $equalMessage), array($book3, $book4, $typeMessage), array( $this->getMock('SebastianBergmann\\Comparator\\Struct', null, array(2.3)), $this->getMock('SebastianBergmann\\Comparator\\Struct', null, array(4.2)), $equalMessage, 0.5 ) ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0) { $exception = null; try { $this->comparator->assertEquals($expected, $actual, $delta); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual, $message, $delta = 0.0) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', $message ); $this->comparator->assertEquals($expected, $actual, $delta); } } PK!憥椲)comparator/tests/ObjectComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use stdClass; /** * @coversDefaultClass SebastianBergmann\Comparator\ObjectComparator * */ class ObjectComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new ObjectComparator; $this->comparator->setFactory(new Factory); } public function acceptsSucceedsProvider() { return array( array(new TestClass, new TestClass), array(new stdClass, new stdClass), array(new stdClass, new TestClass) ); } public function acceptsFailsProvider() { return array( array(new stdClass, null), array(null, new stdClass), array(null, null) ); } public function assertEqualsSucceedsProvider() { // cyclic dependencies $book1 = new Book; $book1->author = new Author('Terry Pratchett'); $book1->author->books[] = $book1; $book2 = new Book; $book2->author = new Author('Terry Pratchett'); $book2->author->books[] = $book2; $object1 = new SampleClass(4, 8, 15); $object2 = new SampleClass(4, 8, 15); return array( array($object1, $object1), array($object1, $object2), array($book1, $book1), array($book1, $book2), array(new Struct(2.3), new Struct(2.5), 0.5) ); } public function assertEqualsFailsProvider() { $typeMessage = 'is not instance of expected class'; $equalMessage = 'Failed asserting that two objects are equal.'; // cyclic dependencies $book1 = new Book; $book1->author = new Author('Terry Pratchett'); $book1->author->books[] = $book1; $book2 = new Book; $book2->author = new Author('Terry Pratch'); $book2->author->books[] = $book2; $book3 = new Book; $book3->author = 'Terry Pratchett'; $book4 = new stdClass; $book4->author = 'Terry Pratchett'; $object1 = new SampleClass( 4, 8, 15); $object2 = new SampleClass(16, 23, 42); return array( array(new SampleClass(4, 8, 15), new SampleClass(16, 23, 42), $equalMessage), array($object1, $object2, $equalMessage), array($book1, $book2, $equalMessage), array($book3, $book4, $typeMessage), array(new Struct(2.3), new Struct(4.2), $equalMessage, 0.5) ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0) { $exception = null; try { $this->comparator->assertEquals($expected, $actual, $delta); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual, $message, $delta = 0.0) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', $message ); $this->comparator->assertEquals($expected, $actual, $delta); } } PK!$n鼺 F *comparator/tests/NumericComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * @coversDefaultClass SebastianBergmann\Comparator\NumericComparator * */ class NumericComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new NumericComparator; } public function acceptsSucceedsProvider() { return array( array(5, 10), array(8, '0'), array('10', 0), array(0x74c3b00c, 42), array(0755, 0777) ); } public function acceptsFailsProvider() { return array( array('5', '10'), array(8, 5.0), array(5.0, 8), array(10, null), array(false, 12) ); } public function assertEqualsSucceedsProvider() { return array( array(1337, 1337), array('1337', 1337), array(0x539, 1337), array(02471, 1337), array(1337, 1338, 1), array('1337', 1340, 5), ); } public function assertEqualsFailsProvider() { return array( array(1337, 1338), array('1338', 1337), array(0x539, 1338), array(1337, 1339, 1), array('1337', 1340, 2), ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0) { $exception = null; try { $this->comparator->assertEquals($expected, $actual, $delta); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual, $delta = 0.0) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', 'matches expected' ); $this->comparator->assertEquals($expected, $actual, $delta); } } PK!鏓运(comparator/tests/ArrayComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * @coversDefaultClass SebastianBergmann\Comparator\ArrayComparator * */ class ArrayComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new ArrayComparator; $this->comparator->setFactory(new Factory); } public function acceptsFailsProvider() { return array( array(array(), null), array(null, array()), array(null, null) ); } public function assertEqualsSucceedsProvider() { return array( array( array('a' => 1, 'b' => 2), array('b' => 2, 'a' => 1) ), array( array(1), array('1') ), array( array(3, 2, 1), array(2, 3, 1), 0, true ), array( array(2.3), array(2.5), 0.5 ), array( array(array(2.3)), array(array(2.5)), 0.5 ), array( array(new Struct(2.3)), array(new Struct(2.5)), 0.5 ), ); } public function assertEqualsFailsProvider() { return array( array( array(), array(0 => 1) ), array( array(0 => 1), array() ), array( array(0 => null), array() ), array( array(0 => 1, 1 => 2), array(0 => 1, 1 => 3) ), array( array('a', 'b' => array(1, 2)), array('a', 'b' => array(2, 1)) ), array( array(2.3), array(4.2), 0.5 ), array( array(array(2.3)), array(array(4.2)), 0.5 ), array( array(new Struct(2.3)), array(new Struct(4.2)), 0.5 ) ); } /** * @covers ::accepts */ public function testAcceptsSucceeds() { $this->assertTrue( $this->comparator->accepts(array(), array()) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0, $canonicalize = false) { $exception = null; try { $this->comparator->assertEquals($expected, $actual, $delta, $canonicalize); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual,$delta = 0.0, $canonicalize = false) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', 'Failed asserting that two arrays are equal' ); $this->comparator->assertEquals($expected, $actual, $delta, $canonicalize); } } PK!a )comparator/tests/DoubleComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * @coversDefaultClass SebastianBergmann\Comparator\DoubleComparator * */ class DoubleComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new DoubleComparator; } public function acceptsSucceedsProvider() { return array( array(0, 5.0), array(5.0, 0), array('5', 4.5), array(1.2e3, 7E-10), array(3, acos(8)), array(acos(8), 3), array(acos(8), acos(8)) ); } public function acceptsFailsProvider() { return array( array(5, 5), array('4.5', 5), array(0x539, 02471), array(5.0, false), array(null, 5.0) ); } public function assertEqualsSucceedsProvider() { return array( array(2.3, 2.3), array('2.3', 2.3), array(5.0, 5), array(5, 5.0), array(5.0, '5'), array(1.2e3, 1200), array(2.3, 2.5, 0.5), array(3, 3.05, 0.05), array(1.2e3, 1201, 1), array((string)(1/3), 1 - 2/3), array(1/3, (string)(1 - 2/3)) ); } public function assertEqualsFailsProvider() { return array( array(2.3, 4.2), array('2.3', 4.2), array(5.0, '4'), array(5.0, 6), array(1.2e3, 1201), array(2.3, 2.5, 0.2), array(3, 3.05, 0.04), array(3, acos(8)), array(acos(8), 3), array(acos(8), acos(8)) ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0) { $exception = null; try { $this->comparator->assertEquals($expected, $actual, $delta); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual, $delta = 0.0) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', 'matches expected' ); $this->comparator->assertEquals($expected, $actual, $delta); } } PK!C砯f*comparator/tests/DOMNodeComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use DOMNode; use DOMDocument; /** * @coversDefaultClass SebastianBergmann\Comparator\DOMNodeComparator * */ class DOMNodeComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new DOMNodeComparator; } public function acceptsSucceedsProvider() { $document = new DOMDocument; $node = new DOMNode; return array( array($document, $document), array($node, $node), array($document, $node), array($node, $document) ); } public function acceptsFailsProvider() { $document = new DOMDocument; return array( array($document, null), array(null, $document), array(null, null) ); } public function assertEqualsSucceedsProvider() { return array( array( $this->createDOMDocument(''), $this->createDOMDocument('') ), array( $this->createDOMDocument(''), $this->createDOMDocument('') ), array( $this->createDOMDocument(''), $this->createDOMDocument('') ), array( $this->createDOMDocument("\n \n"), $this->createDOMDocument('') ), ); } public function assertEqualsFailsProvider() { return array( array( $this->createDOMDocument(''), $this->createDOMDocument('') ), array( $this->createDOMDocument(''), $this->createDOMDocument('') ), array( $this->createDOMDocument(' bar '), $this->createDOMDocument('') ), array( $this->createDOMDocument(''), $this->createDOMDocument('') ), array( $this->createDOMDocument(' bar '), $this->createDOMDocument(' bir ') ) ); } private function createDOMDocument($content) { $document = new DOMDocument; $document->preserveWhiteSpace = false; $document->loadXML($content); return $document; } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual) { $exception = null; try { $this->comparator->assertEquals($expected, $actual); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', 'Failed asserting that two DOM' ); $this->comparator->assertEquals($expected, $actual); } } PK!*訽 'comparator/tests/TypeComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use stdClass; /** * @coversDefaultClass SebastianBergmann\Comparator\TypeComparator * */ class TypeComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new TypeComparator; } public function acceptsSucceedsProvider() { return array( array(true, 1), array(false, array(1)), array(null, new stdClass), array(1.0, 5), array("", "") ); } public function assertEqualsSucceedsProvider() { return array( array(true, true), array(true, false), array(false, false), array(null, null), array(new stdClass, new stdClass), array(0, 0), array(1.0, 2.0), array("hello", "world"), array("", ""), array(array(), array(1,2,3)) ); } public function assertEqualsFailsProvider() { return array( array(true, null), array(null, false), array(1.0, 0), array(new stdClass, array()), array("1", 1) ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual) { $exception = null; try { $this->comparator->assertEquals($expected, $actual); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual) { $this->setExpectedException('SebastianBergmann\\Comparator\\ComparisonFailure', 'does not match expected type'); $this->comparator->assertEquals($expected, $actual); } } PK!@@,comparator/tests/ExceptionComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use \Exception; use \RuntimeException; /** * @coversDefaultClass SebastianBergmann\Comparator\ExceptionComparator * */ class ExceptionComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new ExceptionComparator; $this->comparator->setFactory(new Factory); } public function acceptsSucceedsProvider() { return array( array(new Exception, new Exception), array(new RuntimeException, new RuntimeException), array(new Exception, new RuntimeException) ); } public function acceptsFailsProvider() { return array( array(new Exception, null), array(null, new Exception), array(null, null) ); } public function assertEqualsSucceedsProvider() { $exception1 = new Exception; $exception2 = new Exception; $exception3 = new RunTimeException('Error', 100); $exception4 = new RunTimeException('Error', 100); return array( array($exception1, $exception1), array($exception1, $exception2), array($exception3, $exception3), array($exception3, $exception4) ); } public function assertEqualsFailsProvider() { $typeMessage = 'not instance of expected class'; $equalMessage = 'Failed asserting that two objects are equal.'; $exception1 = new Exception('Error', 100); $exception2 = new Exception('Error', 101); $exception3 = new Exception('Errors', 101); $exception4 = new RunTimeException('Error', 100); $exception5 = new RunTimeException('Error', 101); return array( array($exception1, $exception2, $equalMessage), array($exception1, $exception3, $equalMessage), array($exception1, $exception4, $typeMessage), array($exception2, $exception3, $equalMessage), array($exception4, $exception5, $equalMessage) ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual) { $exception = null; try { $this->comparator->assertEquals($expected, $actual); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual, $message) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', $message ); $this->comparator->assertEquals($expected, $actual); } } PK!!*comparator/tests/ComparisonFailureTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Comparator\ComparisonFailure * * @uses \SebastianBergmann\Comparator\Factory */ final class ComparisonFailureTest extends TestCase { public function testComparisonFailure(): void { $actual = "\nB\n"; $expected = "\nA\n"; $message = 'Test message'; $failure = new ComparisonFailure( $expected, $actual, '|' . $expected, '|' . $actual, false, $message ); $this->assertSame($actual, $failure->getActual()); $this->assertSame($expected, $failure->getExpected()); $this->assertSame('|' . $actual, $failure->getActualAsString()); $this->assertSame('|' . $expected, $failure->getExpectedAsString()); $diff = ' --- Expected +++ Actual @@ @@ | -A +B '; $this->assertSame($diff, $failure->getDiff()); $this->assertSame($message . $diff, $failure->toString()); } public function testDiffNotPossible(): void { $failure = new ComparisonFailure('a', 'b', false, false, true, 'test'); $this->assertSame('', $failure->getDiff()); $this->assertSame('test', $failure->toString()); } } PK!?顎'xx comparator/tests/FactoryTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * @coversDefaultClass SebastianBergmann\Comparator\Factory * */ class FactoryTest extends \PHPUnit_Framework_TestCase { public function instanceProvider() { $tmpfile = tmpfile(); return array( array(NULL, NULL, 'SebastianBergmann\\Comparator\\ScalarComparator'), array(NULL, TRUE, 'SebastianBergmann\\Comparator\\ScalarComparator'), array(TRUE, NULL, 'SebastianBergmann\\Comparator\\ScalarComparator'), array(TRUE, TRUE, 'SebastianBergmann\\Comparator\\ScalarComparator'), array(FALSE, FALSE, 'SebastianBergmann\\Comparator\\ScalarComparator'), array(TRUE, FALSE, 'SebastianBergmann\\Comparator\\ScalarComparator'), array(FALSE, TRUE, 'SebastianBergmann\\Comparator\\ScalarComparator'), array('', '', 'SebastianBergmann\\Comparator\\ScalarComparator'), array('0', '0', 'SebastianBergmann\\Comparator\\ScalarComparator'), array('0', 0, 'SebastianBergmann\\Comparator\\NumericComparator'), array(0, '0', 'SebastianBergmann\\Comparator\\NumericComparator'), array(0, 0, 'SebastianBergmann\\Comparator\\NumericComparator'), array(1.0, 0, 'SebastianBergmann\\Comparator\\DoubleComparator'), array(0, 1.0, 'SebastianBergmann\\Comparator\\DoubleComparator'), array(1.0, 1.0, 'SebastianBergmann\\Comparator\\DoubleComparator'), array(array(1), array(1), 'SebastianBergmann\\Comparator\\ArrayComparator'), array($tmpfile, $tmpfile, 'SebastianBergmann\\Comparator\\ResourceComparator'), array(new \stdClass, new \stdClass, 'SebastianBergmann\\Comparator\\ObjectComparator'), array(new \DateTime, new \DateTime, 'SebastianBergmann\\Comparator\\DateTimeComparator'), array(new \SplObjectStorage, new \SplObjectStorage, 'SebastianBergmann\\Comparator\\SplObjectStorageComparator'), array(new \Exception, new \Exception, 'SebastianBergmann\\Comparator\\ExceptionComparator'), array(new \DOMDocument, new \DOMDocument, 'SebastianBergmann\\Comparator\\DOMNodeComparator'), // mixed types array($tmpfile, array(1), 'SebastianBergmann\\Comparator\\TypeComparator'), array(array(1), $tmpfile, 'SebastianBergmann\\Comparator\\TypeComparator'), array($tmpfile, '1', 'SebastianBergmann\\Comparator\\TypeComparator'), array('1', $tmpfile, 'SebastianBergmann\\Comparator\\TypeComparator'), array($tmpfile, new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'), array(new \stdClass, $tmpfile, 'SebastianBergmann\\Comparator\\TypeComparator'), array(new \stdClass, array(1), 'SebastianBergmann\\Comparator\\TypeComparator'), array(array(1), new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'), array(new \stdClass, '1', 'SebastianBergmann\\Comparator\\TypeComparator'), array('1', new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'), array(new ClassWithToString, '1', 'SebastianBergmann\\Comparator\\ScalarComparator'), array('1', new ClassWithToString, 'SebastianBergmann\\Comparator\\ScalarComparator'), array(1.0, new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'), array(new \stdClass, 1.0, 'SebastianBergmann\\Comparator\\TypeComparator'), array(1.0, array(1), 'SebastianBergmann\\Comparator\\TypeComparator'), array(array(1), 1.0, 'SebastianBergmann\\Comparator\\TypeComparator'), ); } /** * @dataProvider instanceProvider * @covers ::getComparatorFor * @covers ::__construct */ public function testGetComparatorFor($a, $b, $expected) { $factory = new Factory; $actual = $factory->getComparatorFor($a, $b); $this->assertInstanceOf($expected, $actual); } /** * @covers ::register */ public function testRegister() { $comparator = new TestClassComparator; $factory = new Factory; $factory->register($comparator); $a = new TestClass; $b = new TestClass; $expected = 'SebastianBergmann\\Comparator\\TestClassComparator'; $actual = $factory->getComparatorFor($a, $b); $factory->unregister($comparator); $this->assertInstanceOf($expected, $actual); } /** * @covers ::unregister */ public function testUnregister() { $comparator = new TestClassComparator; $factory = new Factory; $factory->register($comparator); $factory->unregister($comparator); $a = new TestClass; $b = new TestClass; $expected = 'SebastianBergmann\\Comparator\\ObjectComparator'; $actual = $factory->getComparatorFor($a, $b); $this->assertInstanceOf($expected, $actual); } } PK!堚U剫/comparator/tests/_fixture/ClassWithToString.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; class ClassWithToString { public function __toString() { return 'string representation'; } } PK!踩"comparator/tests/_fixture/Book.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * A book. */ class Book { // the order of properties is important for testing the cycle! public $author; } PK!!疖QQ1comparator/tests/_fixture/TestClassComparator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; class TestClassComparator extends ObjectComparator { } PK!唓\$comparator/tests/_fixture/Struct.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * A struct. */ class Struct { public $var; public function __construct($var) { $this->var = $var; } } PK!櫆#..'comparator/tests/_fixture/TestClass.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; class TestClass { } PK!俐)comparator/tests/_fixture/SampleClass.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * A sample class. */ class SampleClass { public $a; protected $b; protected $c; public function __construct($a, $b, $c) { $this->a = $a; $this->b = $b; $this->c = $c; } } PK!#06$comparator/tests/_fixture/Author.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * An author. */ class Author { // the order of properties is important for testing the cycle! public $books = []; private $name = ''; public function __construct($name) { $this->name = $name; } } PK!謷羘)comparator/tests/ScalarComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * @coversDefaultClass SebastianBergmann\Comparator\ScalarComparator * */ class ScalarComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new ScalarComparator; } public function acceptsSucceedsProvider() { return array( array("string", "string"), array(new ClassWithToString, "string"), array("string", new ClassWithToString), array("string", null), array(false, "string"), array(false, true), array(null, false), array(null, null), array("10", 10), array("", false), array("1", true), array(1, true), array(0, false), array(0.1, "0.1") ); } public function acceptsFailsProvider() { return array( array(array(), array()), array("string", array()), array(new ClassWithToString, new ClassWithToString), array(false, new ClassWithToString), array(tmpfile(), tmpfile()) ); } public function assertEqualsSucceedsProvider() { return array( array("string", "string"), array(new ClassWithToString, new ClassWithToString), array("string representation", new ClassWithToString), array(new ClassWithToString, "string representation"), array("string", "STRING", true), array("STRING", "string", true), array("String Representation", new ClassWithToString, true), array(new ClassWithToString, "String Representation", true), array("10", 10), array("", false), array("1", true), array(1, true), array(0, false), array(0.1, "0.1"), array(false, null), array(false, false), array(true, true), array(null, null) ); } public function assertEqualsFailsProvider() { $stringException = 'Failed asserting that two strings are equal.'; $otherException = 'matches expected'; return array( array("string", "other string", $stringException), array("string", "STRING", $stringException), array("STRING", "string", $stringException), array("string", "other string", $stringException), // https://github.com/sebastianbergmann/phpunit/issues/1023 array('9E6666666','9E7777777', $stringException), array(new ClassWithToString, "does not match", $otherException), array("does not match", new ClassWithToString, $otherException), array(0, 'Foobar', $otherException), array('Foobar', 0, $otherException), array("10", 25, $otherException), array("1", false, $otherException), array("", true, $otherException), array(false, true, $otherException), array(true, false, $otherException), array(null, true, $otherException), array(0, true, $otherException) ); } /** * @covers ::accepts * @dataProvider acceptsSucceedsProvider */ public function testAcceptsSucceeds($expected, $actual) { $this->assertTrue( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual, $ignoreCase = false) { $exception = null; try { $this->comparator->assertEquals($expected, $actual, 0.0, false, $ignoreCase); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual, $message) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', $message ); $this->comparator->assertEquals($expected, $actual); } } PK!T航+comparator/tests/DateTimeComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use DateTime; use DateTimeImmutable; use DateTimeZone; /** * @coversDefaultClass SebastianBergmann\Comparator\DateTimeComparator * */ class DateTimeComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new DateTimeComparator; } public function acceptsFailsProvider() { $datetime = new DateTime; return array( array($datetime, null), array(null, $datetime), array(null, null) ); } public function assertEqualsSucceedsProvider() { return array( array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')) ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:25', new DateTimeZone('America/New_York')), 10 ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:14:40', new DateTimeZone('America/New_York')), 65 ), array( new DateTime('2013-03-29', new DateTimeZone('America/New_York')), new DateTime('2013-03-29', new DateTimeZone('America/New_York')) ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:35', new DateTimeZone('America/Chicago')) ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:49', new DateTimeZone('America/Chicago')), 15 ), array( new DateTime('2013-03-30', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 23:00:00', new DateTimeZone('America/Chicago')) ), array( new DateTime('2013-03-30', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 23:01:30', new DateTimeZone('America/Chicago')), 100 ), array( new DateTime('@1364616000'), new DateTime('2013-03-29 23:00:00', new DateTimeZone('America/Chicago')) ), array( new DateTime('2013-03-29T05:13:35-0500'), new DateTime('2013-03-29T04:13:35-0600') ) ); } public function assertEqualsFailsProvider() { return array( array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:35', new DateTimeZone('America/New_York')) ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 03:13:35', new DateTimeZone('America/New_York')), 3500 ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 05:13:35', new DateTimeZone('America/New_York')), 3500 ), array( new DateTime('2013-03-29', new DateTimeZone('America/New_York')), new DateTime('2013-03-30', new DateTimeZone('America/New_York')) ), array( new DateTime('2013-03-29', new DateTimeZone('America/New_York')), new DateTime('2013-03-30', new DateTimeZone('America/New_York')), 43200 ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/Chicago')), ), array( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/Chicago')), 3500 ), array( new DateTime('2013-03-30', new DateTimeZone('America/New_York')), new DateTime('2013-03-30', new DateTimeZone('America/Chicago')) ), array( new DateTime('2013-03-29T05:13:35-0600'), new DateTime('2013-03-29T04:13:35-0600') ), array( new DateTime('2013-03-29T05:13:35-0600'), new DateTime('2013-03-29T05:13:35-0500') ), ); } /** * @covers ::accepts */ public function testAcceptsSucceeds() { $this->assertTrue( $this->comparator->accepts( new DateTime, new DateTime ) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0) { $exception = null; try { $this->comparator->assertEquals($expected, $actual, $delta); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual, $delta = 0.0) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', 'Failed asserting that two DateTime objects are equal.' ); $this->comparator->assertEquals($expected, $actual, $delta); } /** * @requires PHP 5.5 * @covers ::accepts */ public function testAcceptsDateTimeInterface() { $this->assertTrue($this->comparator->accepts(new DateTime, new DateTimeImmutable)); } /** * @requires PHP 5.5 * @covers ::assertEquals */ public function testSupportsDateTimeInterface() { $this->comparator->assertEquals( new DateTime('2013-03-29 04:13:35', new DateTimeZone('America/New_York')), new DateTimeImmutable('2013-03-29 04:13:35', new DateTimeZone('America/New_York')) ); } } PK!p鄕=! ! 3comparator/tests/SplObjectStorageComparatorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use SplObjectStorage; use stdClass; /** * @coversDefaultClass SebastianBergmann\Comparator\SplObjectStorageComparator * */ class SplObjectStorageComparatorTest extends \PHPUnit_Framework_TestCase { private $comparator; protected function setUp() { $this->comparator = new SplObjectStorageComparator; } public function acceptsFailsProvider() { return array( array(new SplObjectStorage, new stdClass), array(new stdClass, new SplObjectStorage), array(new stdClass, new stdClass) ); } public function assertEqualsSucceedsProvider() { $object1 = new stdClass(); $object2 = new stdClass(); $storage1 = new SplObjectStorage(); $storage2 = new SplObjectStorage(); $storage3 = new SplObjectStorage(); $storage3->attach($object1); $storage3->attach($object2); $storage4 = new SplObjectStorage(); $storage4->attach($object2); $storage4->attach($object1); return array( array($storage1, $storage1), array($storage1, $storage2), array($storage3, $storage3), array($storage3, $storage4) ); } public function assertEqualsFailsProvider() { $object1 = new stdClass; $object2 = new stdClass; $storage1 = new SplObjectStorage; $storage2 = new SplObjectStorage; $storage2->attach($object1); $storage3 = new SplObjectStorage; $storage3->attach($object2); $storage3->attach($object1); return array( array($storage1, $storage2), array($storage1, $storage3), array($storage2, $storage3), ); } /** * @covers ::accepts */ public function testAcceptsSucceeds() { $this->assertTrue( $this->comparator->accepts( new SplObjectStorage, new SplObjectStorage ) ); } /** * @covers ::accepts * @dataProvider acceptsFailsProvider */ public function testAcceptsFails($expected, $actual) { $this->assertFalse( $this->comparator->accepts($expected, $actual) ); } /** * @covers ::assertEquals * @dataProvider assertEqualsSucceedsProvider */ public function testAssertEqualsSucceeds($expected, $actual) { $exception = null; try { $this->comparator->assertEquals($expected, $actual); } catch (ComparisonFailure $exception) { } $this->assertNull($exception, 'Unexpected ComparisonFailure'); } /** * @covers ::assertEquals * @dataProvider assertEqualsFailsProvider */ public function testAssertEqualsFails($expected, $actual) { $this->setExpectedException( 'SebastianBergmann\\Comparator\\ComparisonFailure', 'Failed asserting that two objects are equal.' ); $this->comparator->assertEquals($expected, $actual); } } PK!M仏comparator/.travis.ymlnu誌w洞language: php sudo: false install: - travis_retry composer install --no-interaction --prefer-source script: ./vendor/bin/phpunit --configuration ./build/travis-ci.xml php: - 5.3.3 - 5.3 - 5.4 - 5.5 - 5.6 - hhvm notifications: email: false webhooks: urls: - https://webhooks.gitter.im/e/6668f52f3dd4e3f81960 on_success: always on_failure: always on_start: false PK!札瞒  comparator/.php_cs.distnu刐迭 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'align_multiline_comment' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => true, 'cast_spaces' => true, 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => ['space' => 'none'], 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'is_null' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'logical_operators' => true, 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'multiline_comment_opening_closing' => true, 'multiline_whitespace_before_semicolons' => true, 'native_constant_invocation' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'new_with_braces' => false, 'no_alias_functions' => true, 'no_alternative_syntax' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_before_namespace' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_multiline_whitespace_around_double_arrow' => true, 'no_null_property_initialization' => true, 'no_php4_constructor' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => true, 'no_unneeded_curly_braces' => true, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, 'phpdoc_types' => true, 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'return_assignment' => true, 'return_type_declaration' => ['space_before' => 'none'], 'self_accessor' => true, 'semicolon_after_instruction' => true, 'set_type_to_cast' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => true, //'void_return' => true, 'whitespace_after_comma_in_array' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ); PK! v::comparator/composer.jsonnu誌w洞{ "name": "sebastian/comparator", "description": "Provides the functionality to compare PHP values for equality", "keywords": ["comparator","compare","equality"], "homepage": "http://www.github.com/sebastianbergmann/comparator", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" } ], "require": { "php": ">=5.3.3", "sebastian/diff": "~1.2", "sebastian/exporter": "~1.2 || ~2.0" }, "require-dev": { "phpunit/phpunit": "~4.4" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "1.2.x-dev" } } } PK!9comparator/.github/stale.ymlnu刐迭# Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale daysUntilStale: 60 # Number of days of inactivity before a stale Issue or Pull Request is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. daysUntilClose: 7 # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - enhancement # Set to true to ignore issues in a project (defaults to false) exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: false # Label to use when marking as stale staleLabel: stale # Comment to post when marking as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Comment to post when closing a stale Issue or Pull Request. closeComment: > This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 30 # Limit to only `issues` or `pulls` only: issues PK!綹诸comparator/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [5.0.5] - 2026-01-24 ### Changed * [#134](https://github.com/sebastianbergmann/comparator/issues/134): Suppress warning introduced in PHP 8.5 ## [5.0.4] - 2025-09-07 ### Changed * Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5 ## [5.0.3] - 2024-10-18 ### Fixed * Reverted [#113](https://github.com/sebastianbergmann/comparator/pull/113) as it broke backward compatibility ## [5.0.2] - 2024-08-12 ### Fixed * [#112](https://github.com/sebastianbergmann/comparator/issues/112): Arrays with different keys and the same values are considered equal in canonicalize mode ## [5.0.1] - 2023-08-14 ### Fixed * `MockObjectComparator` only works on instances of `PHPUnit\Framework\MockObject\MockObject`, but not on instances of `PHPUnit\Framework\MockObject\Stub` * `MockObjectComparator` only ignores the `$__phpunit_invocationMocker` property, but not other properties with names prefixed with `__phpunit_` ## [5.0.0] - 2023-02-03 ### Changed * Methods now have parameter and return type declarations * `Comparator::$factory` is now private, use `Comparator::factory()` instead * `ComparisonFailure`, `DOMNodeComparator`, `DateTimeComparator`, `ExceptionComparator`, `MockObjectComparator`, `NumericComparator`, `ResourceComparator`, `SplObjectStorageComparator`, and `TypeComparator` are now `final` * `ScalarComparator` and `DOMNodeComparator` now use `mb_strtolower($string, 'UTF-8')` instead of `strtolower($string)` ### Removed * Removed `$identical` parameter from `ComparisonFailure::__construct()` * Removed `Comparator::$exporter` * Removed support for PHP 7.3, PHP 7.4, and PHP 8.0 ## [4.0.8] - 2022-09-14 ### Fixed * [#102](https://github.com/sebastianbergmann/comparator/pull/102): Fix `float` comparison precision ## [4.0.7] - 2022-09-14 ### Fixed * [#99](https://github.com/sebastianbergmann/comparator/pull/99): Fix weak comparison between `'0'` and `false` ## [4.0.6] - 2020-10-26 ### Fixed * `SebastianBergmann\Comparator\Exception` now correctly extends `\Throwable` ## [4.0.5] - 2020-09-30 ### Fixed * [#89](https://github.com/sebastianbergmann/comparator/pull/89): Handle PHP 8 `ValueError` ## [4.0.4] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.3] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [4.0.2] - 2020-06-15 ### Fixed * [#85](https://github.com/sebastianbergmann/comparator/issues/85): Version 4.0.1 breaks backward compatibility ## [4.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [4.0.0] - 2020-02-07 ### Removed * Removed support for PHP 7.1 and PHP 7.2 ## [3.0.5] - 2022-09-14 ### Fixed * [#102](https://github.com/sebastianbergmann/comparator/pull/102): Fix `float` comparison precision ## [3.0.4] - 2022-09-14 ### Fixed * [#99](https://github.com/sebastianbergmann/comparator/pull/99): Fix weak comparison between `'0'` and `false` ## [3.0.3] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` ## [3.0.2] - 2018-07-12 ### Changed * By default, `MockObjectComparator` is now tried before all other (default) comparators ## [3.0.1] - 2018-06-14 ### Fixed * [#53](https://github.com/sebastianbergmann/comparator/pull/53): `DOMNodeComparator` ignores `$ignoreCase` parameter * [#58](https://github.com/sebastianbergmann/comparator/pull/58): `ScalarComparator` does not handle extremely ugly string comparison edge cases ## [3.0.0] - 2018-04-18 ### Fixed * [#48](https://github.com/sebastianbergmann/comparator/issues/48): `DateTimeComparator` does not support fractional second deltas ### Removed * Removed support for PHP 7.0 ## [2.1.3] - 2018-02-01 ### Changed * This component is now compatible with version 3 of `sebastian/diff` ## [2.1.2] - 2018-01-12 ### Fixed * Fix comparison of `DateTimeImmutable` objects ## [2.1.1] - 2017-12-22 ### Fixed * [phpunit/#2923](https://github.com/sebastianbergmann/phpunit/issues/2923): Unexpected failed date matching ## [2.1.0] - 2017-11-03 ### Added * Added `SebastianBergmann\Comparator\Factory::reset()` to unregister all non-default comparators * Added support for `phpunit/phpunit-mock-objects` version `^5.0` [5.0.5]: https://github.com/sebastianbergmann/comparator/compare/5.0.4...5.0.5 [5.0.4]: https://github.com/sebastianbergmann/comparator/compare/5.0.3...5.0.4 [5.0.3]: https://github.com/sebastianbergmann/comparator/compare/5.0.2...5.0.3 [5.0.2]: https://github.com/sebastianbergmann/comparator/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/comparator/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/comparator/compare/4.0...5.0.0 [4.0.10]: https://github.com/sebastianbergmann/comparator/compare/4.0.9...4.0.10 [4.0.9]: https://github.com/sebastianbergmann/comparator/compare/4.0.8...4.0.9 [4.0.8]: https://github.com/sebastianbergmann/comparator/compare/4.0.7...4.0.8 [4.0.7]: https://github.com/sebastianbergmann/comparator/compare/4.0.6...4.0.7 [4.0.6]: https://github.com/sebastianbergmann/comparator/compare/4.0.5...4.0.6 [4.0.5]: https://github.com/sebastianbergmann/comparator/compare/4.0.4...4.0.5 [4.0.4]: https://github.com/sebastianbergmann/comparator/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/comparator/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/comparator/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/comparator/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/comparator/compare/3.0...4.0.0 [3.0.7]: https://github.com/sebastianbergmann/comparator/compare/3.0.6...3.0.7 [3.0.6]: https://github.com/sebastianbergmann/comparator/compare/3.0.5...3.0.6 [3.0.5]: https://github.com/sebastianbergmann/comparator/compare/3.0.4...3.0.5 [3.0.4]: https://github.com/sebastianbergmann/comparator/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/sebastianbergmann/comparator/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/sebastianbergmann/comparator/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/comparator/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/comparator/compare/2.1.3...3.0.0 [2.1.3]: https://github.com/sebastianbergmann/comparator/compare/2.1.2...2.1.3 [2.1.2]: https://github.com/sebastianbergmann/comparator/compare/2.1.1...2.1.2 [2.1.1]: https://github.com/sebastianbergmann/comparator/compare/2.1.0...2.1.1 [2.1.0]: https://github.com/sebastianbergmann/comparator/compare/2.0.2...2.1.0 PK!枍頞'comparator/src/MockObjectComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares PHPUnit_Framework_MockObject_MockObject instances for equality. */ class MockObjectComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return $expected instanceof \PHPUnit_Framework_MockObject_MockObject && $actual instanceof \PHPUnit_Framework_MockObject_MockObject; } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param object $object * @return array */ protected function toArray($object) { $array = parent::toArray($object); unset($array['__phpunit_invocationMocker']); return $array; } }PK!腤b鯯 S $comparator/src/DOMNodeComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use DOMDocument; use DOMNode; /** * Compares DOMNode instances for equality. */ class DOMNodeComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return $expected instanceof DOMNode && $actual instanceof DOMNode; } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) { $expectedAsString = $this->nodeToText($expected, true, $ignoreCase); $actualAsString = $this->nodeToText($actual, true, $ignoreCase); if ($expectedAsString !== $actualAsString) { if ($expected instanceof DOMDocument) { $type = 'documents'; } else { $type = 'nodes'; } throw new ComparisonFailure( $expected, $actual, $expectedAsString, $actualAsString, false, sprintf("Failed asserting that two DOM %s are equal.\n", $type) ); } } /** * Returns the normalized, whitespace-cleaned, and indented textual * representation of a DOMNode. * * @param DOMNode $node * @param bool $canonicalize * @param bool $ignoreCase * @return string */ private function nodeToText(DOMNode $node, $canonicalize, $ignoreCase) { if ($canonicalize) { $document = new DOMDocument; $document->loadXML($node->C14N()); $node = $document; } if ($node instanceof DOMDocument) { $document = $node; } else { $document = $node->ownerDocument; } $document->formatOutput = true; $document->normalizeDocument(); if ($node instanceof DOMDocument) { $text = $node->saveXML(); } else { $text = $document->saveXML($node); } if ($ignoreCase) { $text = strtolower($text); } return $text; } } PK!捩``"comparator/src/ArrayComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares arrays for equality. */ class ArrayComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return is_array($expected) && is_array($actual); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) { if ($canonicalize) { sort($expected); sort($actual); } $remaining = $actual; $expString = $actString = "Array (\n"; $equal = true; foreach ($expected as $key => $value) { unset($remaining[$key]); if (!array_key_exists($key, $actual)) { $expString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value) ); $equal = false; continue; } try { $comparator = $this->factory->getComparatorFor($value, $actual[$key]); $comparator->assertEquals($value, $actual[$key], $delta, $canonicalize, $ignoreCase, $processed); $expString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value) ); $actString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($actual[$key]) ); } catch (ComparisonFailure $e) { $expString .= sprintf( " %s => %s\n", $this->exporter->export($key), $e->getExpectedAsString() ? $this->indent($e->getExpectedAsString()) : $this->exporter->shortenedExport($e->getExpected()) ); $actString .= sprintf( " %s => %s\n", $this->exporter->export($key), $e->getActualAsString() ? $this->indent($e->getActualAsString()) : $this->exporter->shortenedExport($e->getActual()) ); $equal = false; } } foreach ($remaining as $key => $value) { $actString .= sprintf( " %s => %s\n", $this->exporter->export($key), $this->exporter->shortenedExport($value) ); $equal = false; } $expString .= ')'; $actString .= ')'; if (!$equal) { throw new ComparisonFailure( $expected, $actual, $expString, $actString, false, 'Failed asserting that two arrays are equal.' ); } } protected function indent($lines) { return trim(str_replace("\n", "\n ", $lines)); } } PK!賴1d d comparator/src/Factory.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Factory for comparators which compare values for equality. */ class Factory { /** * @var Comparator[] */ private $comparators = array(); /** * @var Factory */ private static $instance; /** * Constructs a new factory. */ public function __construct() { $this->register(new TypeComparator); $this->register(new ScalarComparator); $this->register(new NumericComparator); $this->register(new DoubleComparator); $this->register(new ArrayComparator); $this->register(new ResourceComparator); $this->register(new ObjectComparator); $this->register(new ExceptionComparator); $this->register(new SplObjectStorageComparator); $this->register(new DOMNodeComparator); $this->register(new MockObjectComparator); $this->register(new DateTimeComparator); } /** * @return Factory */ public static function getInstance() { if (self::$instance === null) { self::$instance = new self; } return self::$instance; } /** * Returns the correct comparator for comparing two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return Comparator */ public function getComparatorFor($expected, $actual) { foreach ($this->comparators as $comparator) { if ($comparator->accepts($expected, $actual)) { return $comparator; } } } /** * Registers a new comparator. * * This comparator will be returned by getInstance() if its accept() method * returns TRUE for the compared values. It has higher priority than the * existing comparators, meaning that its accept() method will be tested * before those of the other comparators. * * @param Comparator $comparator The registered comparator */ public function register(Comparator $comparator) { array_unshift($this->comparators, $comparator); $comparator->setFactory($this); } /** * Unregisters a comparator. * * This comparator will no longer be returned by getInstance(). * * @param Comparator $comparator The unregistered comparator */ public function unregister(Comparator $comparator) { foreach ($this->comparators as $key => $_comparator) { if ($comparator === $_comparator) { unset($this->comparators[$key]); } } } } PK!RO^P P %comparator/src/DateTimeComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares DateTimeInterface instances for equality. */ class DateTimeComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return ($expected instanceof \DateTime || $expected instanceof \DateTimeInterface) && ($actual instanceof \DateTime || $actual instanceof \DateTimeInterface); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) { $delta = new \DateInterval(sprintf('PT%sS', abs($delta))); $expectedLower = clone $expected; $expectedUpper = clone $expected; if ($actual < $expectedLower->sub($delta) || $actual > $expectedUpper->add($delta)) { throw new ComparisonFailure( $expected, $actual, $this->dateTimeToString($expected), $this->dateTimeToString($actual), false, 'Failed asserting that two DateTime objects are equal.' ); } } /** * Returns an ISO 8601 formatted string representation of a datetime or * 'Invalid DateTimeInterface object' if the provided DateTimeInterface was not properly * initialized. * * @param \DateTimeInterface $datetime * @return string */ private function dateTimeToString($datetime) { $string = $datetime->format('Y-m-d\TH:i:s.uO'); return $string ? $string : 'Invalid DateTimeInterface object'; } } PK!臽comparator/src/Comparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use SebastianBergmann\Exporter\Exporter; /** * Abstract base class for comparators which compare values for equality. */ abstract class Comparator { /** * @var Factory */ protected $factory; /** * @var Exporter */ protected $exporter; public function __construct() { $this->exporter = new Exporter; } /** * @param Factory $factory */ public function setFactory(Factory $factory) { $this->factory = $factory; } /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ abstract public function accepts($expected, $actual); /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ abstract public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false); } PK!媁曛-comparator/src/SplObjectStorageComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares \SplObjectStorage instances for equality. */ class SplObjectStorageComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return $expected instanceof \SplObjectStorage && $actual instanceof \SplObjectStorage; } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { foreach ($actual as $object) { if (!$expected->contains($object)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, 'Failed asserting that two objects are equal.' ); } } foreach ($expected as $object) { if (!$actual->contains($object)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, 'Failed asserting that two objects are equal.' ); } } } } PK!G棅相!comparator/src/TypeComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares values for type equality. */ class TypeComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return true; } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { if (gettype($expected) != gettype($actual)) { throw new ComparisonFailure( $expected, $actual, // we don't need a diff '', '', false, sprintf( '%s does not match expected type "%s".', $this->exporter->shortenedExport($actual), gettype($expected) ) ); } } } PK!爇f&comparator/src/ExceptionComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares Exception instances for equality. */ class ExceptionComparator extends ObjectComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return $expected instanceof \Exception && $actual instanceof \Exception; } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param object $object * @return array */ protected function toArray($object) { $array = parent::toArray($object); unset( $array['file'], $array['line'], $array['trace'], $array['string'], $array['xdebug_message'] ); return $array; } } PK!ёw w #comparator/src/ScalarComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares scalar or NULL values for equality. */ class ScalarComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool * @since Method available since Release 3.6.0 */ public function accepts($expected, $actual) { return ((is_scalar($expected) xor null === $expected) && (is_scalar($actual) xor null === $actual)) // allow comparison between strings and objects featuring __toString() || (is_string($expected) && is_object($actual) && method_exists($actual, '__toString')) || (is_object($expected) && method_exists($expected, '__toString') && is_string($actual)); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { $expectedToCompare = $expected; $actualToCompare = $actual; // always compare as strings to avoid strange behaviour // otherwise 0 == 'Foobar' if (is_string($expected) || is_string($actual)) { $expectedToCompare = (string) $expectedToCompare; $actualToCompare = (string) $actualToCompare; if ($ignoreCase) { $expectedToCompare = strtolower($expectedToCompare); $actualToCompare = strtolower($actualToCompare); } } if ($expectedToCompare != $actualToCompare) { if (is_string($expected) && is_string($actual)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, 'Failed asserting that two strings are equal.' ); } throw new ComparisonFailure( $expected, $actual, // no diff is required '', '', false, sprintf( 'Failed asserting that %s matches expected %s.', $this->exporter->export($actual), $this->exporter->export($expected) ) ); } } } PK!槬26#comparator/src/ObjectComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares objects for equality. */ class ObjectComparator extends ArrayComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return is_object($expected) && is_object($actual); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * @param array $processed List of already processed elements (used to prevent infinite recursion) * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array()) { if (get_class($actual) !== get_class($expected)) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual), false, sprintf( '%s is not instance of expected class "%s".', $this->exporter->export($actual), get_class($expected) ) ); } // don't compare twice to allow for cyclic dependencies if (in_array(array($actual, $expected), $processed, true) || in_array(array($expected, $actual), $processed, true)) { return; } $processed[] = array($actual, $expected); // don't compare objects if they are identical // this helps to avoid the error "maximum function nesting level reached" // CAUTION: this conditional clause is not tested if ($actual !== $expected) { try { parent::assertEquals( $this->toArray($expected), $this->toArray($actual), $delta, $canonicalize, $ignoreCase, $processed ); } catch (ComparisonFailure $e) { throw new ComparisonFailure( $expected, $actual, // replace "Array" with "MyClass object" substr_replace($e->getExpectedAsString(), get_class($expected) . ' Object', 0, 5), substr_replace($e->getActualAsString(), get_class($actual) . ' Object', 0, 5), false, 'Failed asserting that two objects are equal.' ); } } } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param object $object * @return array */ protected function toArray($object) { return $this->exporter->toArray($object); } } PK! 廣 $comparator/src/ComparisonFailure.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use SebastianBergmann\Diff\Differ; /** * Thrown when an assertion for string equality failed. */ class ComparisonFailure extends \RuntimeException { /** * Expected value of the retrieval which does not match $actual. * @var mixed */ protected $expected; /** * Actually retrieved value which does not match $expected. * @var mixed */ protected $actual; /** * The string representation of the expected value * @var string */ protected $expectedAsString; /** * The string representation of the actual value * @var string */ protected $actualAsString; /** * @var bool */ protected $identical; /** * Optional message which is placed in front of the first line * returned by toString(). * @var string */ protected $message; /** * Initialises with the expected value and the actual value. * * @param mixed $expected Expected value retrieved. * @param mixed $actual Actual value retrieved. * @param string $expectedAsString * @param string $actualAsString * @param bool $identical * @param string $message A string which is prefixed on all returned lines * in the difference output. */ public function __construct($expected, $actual, $expectedAsString, $actualAsString, $identical = false, $message = '') { $this->expected = $expected; $this->actual = $actual; $this->expectedAsString = $expectedAsString; $this->actualAsString = $actualAsString; $this->message = $message; } /** * @return mixed */ public function getActual() { return $this->actual; } /** * @return mixed */ public function getExpected() { return $this->expected; } /** * @return string */ public function getActualAsString() { return $this->actualAsString; } /** * @return string */ public function getExpectedAsString() { return $this->expectedAsString; } /** * @return string */ public function getDiff() { if (!$this->actualAsString && !$this->expectedAsString) { return ''; } $differ = new Differ("\n--- Expected\n+++ Actual\n"); return $differ->diff($this->expectedAsString, $this->actualAsString); } /** * @return string */ public function toString() { return $this->message . $this->getDiff(); } } PK!vz戝pp#comparator/src/DoubleComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares doubles for equality. */ class DoubleComparator extends NumericComparator { /** * Smallest value available in PHP. * * @var float */ const EPSILON = 0.0000000001; /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return (is_double($expected) || is_double($actual)) && is_numeric($expected) && is_numeric($actual); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { if ($delta == 0) { $delta = self::EPSILON; } parent::assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase); } } PK!佾聊**%comparator/src/ResourceComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares resources for equality. */ class ResourceComparator extends Comparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { return is_resource($expected) && is_resource($actual); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { if ($actual != $expected) { throw new ComparisonFailure( $expected, $actual, $this->exporter->export($expected), $this->exporter->export($actual) ); } } } PK!_衝逊$comparator/src/NumericComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * Compares numerical values for equality. */ class NumericComparator extends ScalarComparator { /** * Returns whether the comparator can compare two values. * * @param mixed $expected The first value to compare * @param mixed $actual The second value to compare * @return bool */ public function accepts($expected, $actual) { // all numerical values, but not if one of them is a double // or both of them are strings return is_numeric($expected) && is_numeric($actual) && !(is_double($expected) || is_double($actual)) && !(is_string($expected) && is_string($actual)); } /** * Asserts that two values are equal. * * @param mixed $expected First value to compare * @param mixed $actual Second value to compare * @param float $delta Allowed numerical distance between two values to consider them equal * @param bool $canonicalize Arrays are sorted before comparison when set to true * @param bool $ignoreCase Case is ignored when set to true * * @throws ComparisonFailure */ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false) { if (is_infinite($actual) && is_infinite($expected)) { return; } if ((is_infinite($actual) xor is_infinite($expected)) || (is_nan($actual) or is_nan($expected)) || abs($actual - $expected) > $delta) { throw new ComparisonFailure( $expected, $actual, '', '', false, sprintf( 'Failed asserting that %s matches expected %s.', $this->exporter->export($actual), $this->exporter->export($expected) ) ); } } } PK! 祧comparator/build.xmlnu誌w洞 PK!⊥楯Jcomparator/.gitignorenu誌w洞/build/coverage /composer.lock /composer.phar /phpunit.xml /.idea /vendor PK!:exporter/phpunit.xmlnu刐迭 tests src PK!i4+QT T exporter/README.mdnu誌w洞Exporter ======== [![Build Status](https://secure.travis-ci.org/sebastianbergmann/exporter.png?branch=master)](https://travis-ci.org/sebastianbergmann/exporter) This component provides the functionality to export PHP variables for visualization. ## Usage Exporting: ```php '' 'string' => '' 'code' => 0 'file' => '/home/sebastianbergmann/test.php' 'line' => 34 'trace' => Array &0 () 'previous' => null ) */ print $exporter->export(new Exception); ``` ## Data Types Exporting simple types: ```php export(46); // 4.0 print $exporter->export(4.0); // 'hello, world!' print $exporter->export('hello, world!'); // false print $exporter->export(false); // NAN print $exporter->export(acos(8)); // -INF print $exporter->export(log(0)); // null print $exporter->export(null); // resource(13) of type (stream) print $exporter->export(fopen('php://stderr', 'w')); // Binary String: 0x000102030405 print $exporter->export(chr(0) . chr(1) . chr(2) . chr(3) . chr(4) . chr(5)); ``` Exporting complex types: ```php Array &1 ( 0 => 1 1 => 2 2 => 3 ) 1 => Array &2 ( 0 => '' 1 => 0 2 => false ) ) */ print $exporter->export(array(array(1,2,3), array("",0,FALSE))); /* Array &0 ( 'self' => Array &1 ( 'self' => Array &1 ) ) */ $array = array(); $array['self'] = &$array; print $exporter->export($array); /* stdClass Object &0000000003a66dcc0000000025e723e2 ( 'self' => stdClass Object &0000000003a66dcc0000000025e723e2 ) */ $obj = new stdClass(); $obj->self = $obj; print $exporter->export($obj); ``` Compact exports: ```php shortenedExport(array()); // Array (...) print $exporter->shortenedExport(array(1,2,3,4,5)); // stdClass Object () print $exporter->shortenedExport(new stdClass); // Exception Object (...) print $exporter->shortenedExport(new Exception); // this\nis\na\nsuper\nlong\nstring\nt...\nspace print $exporter->shortenedExport( <<. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!>k exporter/tests/ExporterTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Exporter; /** * @covers SebastianBergmann\Exporter\Exporter */ class ExporterTest extends \PHPUnit_Framework_TestCase { /** * @var Exporter */ private $exporter; protected function setUp() { $this->exporter = new Exporter; } public function exportProvider() { $obj2 = new \stdClass; $obj2->foo = 'bar'; $obj3 = (object)array(1,2,"Test\r\n",4,5,6,7,8); $obj = new \stdClass; //@codingStandardsIgnoreStart $obj->null = null; //@codingStandardsIgnoreEnd $obj->boolean = true; $obj->integer = 1; $obj->double = 1.2; $obj->string = '1'; $obj->text = "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext"; $obj->object = $obj2; $obj->objectagain = $obj2; $obj->array = array('foo' => 'bar'); $obj->self = $obj; $storage = new \SplObjectStorage; $storage->attach($obj2); $storage->foo = $obj2; return array( array(null, 'null'), array(true, 'true'), array(false, 'false'), array(1, '1'), array(1.0, '1.0'), array(1.2, '1.2'), array(fopen('php://memory', 'r'), 'resource(%d) of type (stream)'), array('1', "'1'"), array(array(array(1,2,3), array(3,4,5)), << Array &1 ( 0 => 1 1 => 2 2 => 3 ) 1 => Array &2 ( 0 => 3 1 => 4 2 => 5 ) ) EOF ), // \n\r and \r is converted to \n array("this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", << null 'boolean' => true 'integer' => 1 'double' => 1.2 'string' => '1' 'text' => 'this is a very very very very very very long text' 'object' => stdClass Object &%x ( 'foo' => 'bar' ) 'objectagain' => stdClass Object &%x 'array' => Array &%d ( 'foo' => 'bar' ) 'self' => stdClass Object &%x ) EOF ), array(array(), 'Array &%d ()'), array($storage, << stdClass Object &%x ( 'foo' => 'bar' ) '%x' => Array &0 ( 'obj' => stdClass Object &%x 'inf' => null ) ) EOF ), array($obj3, << 1 1 => 2 2 => 'Test\n' 3 => 4 4 => 5 5 => 6 6 => 7 7 => 8 ) EOF ), array( chr(0) . chr(1) . chr(2) . chr(3) . chr(4) . chr(5), 'Binary String: 0x000102030405' ), array( implode('', array_map('chr', range(0x0e, 0x1f))), 'Binary String: 0x0e0f101112131415161718191a1b1c1d1e1f' ), array( chr(0x00) . chr(0x09), 'Binary String: 0x0009' ), array( '', "''" ), ); } /** * @dataProvider exportProvider */ public function testExport($value, $expected) { $this->assertStringMatchesFormat( $expected, $this->trimNewline($this->exporter->export($value)) ); } public function testExport2() { if (PHP_VERSION === '5.3.3') { $this->markTestSkipped('Skipped due to "Nesting level too deep - recursive dependency?" fatal error'); } $obj = new \stdClass; $obj->foo = 'bar'; $array = array( 0 => 0, 'null' => null, 'boolean' => true, 'integer' => 1, 'double' => 1.2, 'string' => '1', 'text' => "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", 'object' => $obj, 'objectagain' => $obj, 'array' => array('foo' => 'bar'), ); $array['self'] = &$array; $expected = << 0 'null' => null 'boolean' => true 'integer' => 1 'double' => 1.2 'string' => '1' 'text' => 'this is a very very very very very very long text' 'object' => stdClass Object &%x ( 'foo' => 'bar' ) 'objectagain' => stdClass Object &%x 'array' => Array &%d ( 'foo' => 'bar' ) 'self' => Array &%d ( 0 => 0 'null' => null 'boolean' => true 'integer' => 1 'double' => 1.2 'string' => '1' 'text' => 'this is a very very very very very very long text' 'object' => stdClass Object &%x 'objectagain' => stdClass Object &%x 'array' => Array &%d ( 'foo' => 'bar' ) 'self' => Array &%d ) ) EOF; $this->assertStringMatchesFormat( $expected, $this->trimNewline($this->exporter->export($array)) ); } public function shortenedExportProvider() { $obj = new \stdClass; $obj->foo = 'bar'; $array = array( 'foo' => 'bar', ); return array( array(null, 'null'), array(true, 'true'), array(1, '1'), array(1.0, '1.0'), array(1.2, '1.2'), array('1', "'1'"), // \n\r and \r is converted to \n array("this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", "'this\\nis\\na\\nvery\\nvery\\nvery\\nvery...g\\ntext'"), array(new \stdClass, 'stdClass Object ()'), array($obj, 'stdClass Object (...)'), array(array(), 'Array ()'), array($array, 'Array (...)'), ); } /** * @dataProvider shortenedExportProvider */ public function testShortenedExport($value, $expected) { $this->assertSame( $expected, $this->trimNewline($this->exporter->shortenedExport($value)) ); } /** * @requires extension mbstring */ public function testShortenedExportForMultibyteCharacters() { $oldMbLanguage = mb_language(); mb_language('Japanese'); $oldMbInternalEncoding = mb_internal_encoding(); mb_internal_encoding('UTF-8'); try { $this->assertSame( "'銇勩倣銇伀銇汇伕銇ㄣ仭銈娿伂銈嬨倰銈忋亱銈堛仧銈屻仢銇ゃ伃銇倝銈銇嗐倫銇亰銇忋倓...銇椼倯銇层倐銇涖仚'", $this->trimNewline($this->exporter->shortenedExport('銇勩倣銇伀銇汇伕銇ㄣ仭銈娿伂銈嬨倰銈忋亱銈堛仧銈屻仢銇ゃ伃銇倝銈銇嗐倫銇亰銇忋倓銇俱亼銇点亾銇堛仸銇傘仌銇嶃倖銈併伩銇椼倯銇层倐銇涖仚')) ); } catch (\Exception $e) { mb_internal_encoding($oldMbInternalEncoding); mb_language($oldMbLanguage); throw $e; } mb_internal_encoding($oldMbInternalEncoding); mb_language($oldMbLanguage); } public function provideNonBinaryMultibyteStrings() { return array( array(implode('', array_map('chr', range(0x09, 0x0d))), 5), array(implode('', array_map('chr', range(0x20, 0x7f))), 96), array(implode('', array_map('chr', range(0x80, 0xff))), 128), ); } /** * @dataProvider provideNonBinaryMultibyteStrings */ public function testNonBinaryStringExport($value, $expectedLength) { $this->assertRegExp( "~'.{{$expectedLength}}'\$~s", $this->exporter->export($value) ); } public function testNonObjectCanBeReturnedAsArray() { $this->assertEquals(array(true), $this->exporter->toArray(true)); } private function trimNewline($string) { return preg_replace('/[ ]*\n/', "\n", $string); } } PK!尪喋^^exporter/.travis.ymlnu誌w洞language: php before_script: - composer self-update - composer install --no-interaction --prefer-source --dev php: - 5.3.3 - 5.3 - 5.4 - 5.5 - 5.6 - hhvm notifications: email: false webhooks: urls: - https://webhooks.gitter.im/e/6668f52f3dd4e3f81960 on_success: always on_failure: always on_start: false PK!煮/LLexporter/.php_cs.distnu刐迭 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'align_multiline_comment' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => true, 'cast_spaces' => true, 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => ['space' => 'none'], 'declare_strict_types' => true, 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'is_null' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'logical_operators' => true, 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'multiline_comment_opening_closing' => true, 'multiline_whitespace_before_semicolons' => true, 'native_constant_invocation' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'new_with_braces' => false, 'no_alias_functions' => true, 'no_alternative_syntax' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_before_namespace' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_multiline_whitespace_around_double_arrow' => true, 'no_null_property_initialization' => true, 'no_php4_constructor' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => true, 'no_unneeded_curly_braces' => true, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, 'phpdoc_types' => true, 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'return_assignment' => true, 'return_type_declaration' => ['space_before' => 'none'], 'self_accessor' => true, 'semicolon_after_instruction' => true, 'set_type_to_cast' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => true, //'void_return' => true, 'whitespace_after_comma_in_array' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ); PK!卽蒅exporter/composer.jsonnu誌w洞{ "name": "sebastian/exporter", "description": "Provides the functionality to export PHP variables for visualization", "keywords": ["exporter","export"], "homepage": "http://www.github.com/sebastianbergmann/exporter", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" }, { "name": "Volker Dusch", "email": "github@wallbash.com" }, { "name": "Adam Harvey", "email": "aharvey@php.net" }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" } ], "require": { "php": ">=5.3.3", "sebastian/recursion-context": "~2.0" }, "require-dev": { "phpunit/phpunit": "~4.4", "ext-mbstring": "*" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } PK!1酳)exporter/.github/FUNDING.ymlnu刐迭patreon: s_bergmann PK!M虫脀wexporter/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [5.1.4] - 2025-09-24 ### Changed * Suppress `unexpected NAN value was coerced to string` warning triggered on PHP 8.5 ## [5.1.3] - 2025-09-22 ### Changed * Suppress `not representable as an int, cast occurred` warning triggered on PHP 8.5 ## [5.1.2] - 2024-03-02 ### Changed * Do not use implicitly nullable parameters ## [5.1.1] - 2023-09-24 ### Changed * [#52](https://github.com/sebastianbergmann/exporter/pull/52): Optimize export of large arrays and object graphs ## [5.1.0] - 2023-09-18 ### Changed * [#51](https://github.com/sebastianbergmann/exporter/pull/51): Export arrays using short array syntax [5.1.4]: https://github.com/sebastianbergmann/exporter/compare/5.1.3...5.1.4 [5.1.3]: https://github.com/sebastianbergmann/exporter/compare/5.1.2...5.1.3 [5.1.2]: https://github.com/sebastianbergmann/exporter/compare/5.1.1...5.1.2 [5.1.1]: https://github.com/sebastianbergmann/exporter/compare/5.1.0...5.1.1 [5.1.0]: https://github.com/sebastianbergmann/exporter/compare/5.0.1...5.1.0 PK!燑E#E#exporter/src/Exporter.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Exporter; use SebastianBergmann\RecursionContext\Context; /** * A nifty utility for visualizing PHP variables. * * * export(new Exception); * */ class Exporter { /** * Exports a value as a string * * The output of this method is similar to the output of print_r(), but * improved in various aspects: * * - NULL is rendered as "null" (instead of "") * - TRUE is rendered as "true" (instead of "1") * - FALSE is rendered as "false" (instead of "") * - Strings are always quoted with single quotes * - Carriage returns and newlines are normalized to \n * - Recursion and repeated rendering is treated properly * * @param mixed $value * @param int $indentation The indentation level of the 2nd+ line * @return string */ public function export($value, $indentation = 0) { return $this->recursiveExport($value, $indentation); } /** * @param mixed $data * @param Context $context * @return string */ public function shortenedRecursiveExport(&$data, Context $context = null) { $result = array(); $exporter = new self(); if (!$context) { $context = new Context; } $array = $data; $context->add($data); foreach ($array as $key => $value) { if (is_array($value)) { if ($context->contains($data[$key]) !== false) { $result[] = '*RECURSION*'; } else { $result[] = sprintf( 'array(%s)', $this->shortenedRecursiveExport($data[$key], $context) ); } } else { $result[] = $exporter->shortenedExport($value); } } return implode(', ', $result); } /** * Exports a value into a single-line string * * The output of this method is similar to the output of * SebastianBergmann\Exporter\Exporter::export(). * * Newlines are replaced by the visible string '\n'. * Contents of arrays and objects (if any) are replaced by '...'. * * @param mixed $value * @return string * @see SebastianBergmann\Exporter\Exporter::export */ public function shortenedExport($value) { if (is_string($value)) { $string = $this->export($value); if (function_exists('mb_strlen')) { if (mb_strlen($string) > 40) { $string = mb_substr($string, 0, 30) . '...' . mb_substr($string, -7); } } else { if (strlen($string) > 40) { $string = substr($string, 0, 30) . '...' . substr($string, -7); } } return str_replace("\n", '\n', $string); } if (is_object($value)) { return sprintf( '%s Object (%s)', get_class($value), count($this->toArray($value)) > 0 ? '...' : '' ); } if (is_array($value)) { return sprintf( 'Array (%s)', count($value) > 0 ? '...' : '' ); } return $this->export($value); } /** * Converts an object to an array containing all of its private, protected * and public properties. * * @param mixed $value * @return array */ public function toArray($value) { if (!is_object($value)) { return (array) $value; } $array = array(); foreach ((array) $value as $key => $val) { // properties are transformed to keys in the following way: // private $property => "\0Classname\0property" // protected $property => "\0*\0property" // public $property => "property" if (preg_match('/^\0.+\0(.+)$/', $key, $matches)) { $key = $matches[1]; } // See https://github.com/php/php-src/commit/5721132 if ($key === "\0gcdata") { continue; } $array[$key] = $val; } // Some internal classes like SplObjectStorage don't work with the // above (fast) mechanism nor with reflection in Zend. // Format the output similarly to print_r() in this case if ($value instanceof \SplObjectStorage) { // However, the fast method does work in HHVM, and exposes the // internal implementation. Hide it again. if (property_exists('\SplObjectStorage', '__storage')) { unset($array['__storage']); } elseif (property_exists('\SplObjectStorage', 'storage')) { unset($array['storage']); } if (property_exists('\SplObjectStorage', '__key')) { unset($array['__key']); } foreach ($value as $key => $val) { $array[spl_object_hash($val)] = array( 'obj' => $val, 'inf' => $value->getInfo(), ); } } return $array; } /** * Recursive implementation of export * * @param mixed $value The value to export * @param int $indentation The indentation level of the 2nd+ line * @param \SebastianBergmann\RecursionContext\Context $processed Previously processed objects * @return string * @see SebastianBergmann\Exporter\Exporter::export */ protected function recursiveExport(&$value, $indentation, $processed = null) { if ($value === null) { return 'null'; } if ($value === true) { return 'true'; } if ($value === false) { return 'false'; } if (is_float($value) && floatval(intval($value)) === $value) { return "$value.0"; } if (is_resource($value)) { return sprintf( 'resource(%d) of type (%s)', $value, get_resource_type($value) ); } if (is_string($value)) { // Match for most non printable chars somewhat taking multibyte chars into account if (preg_match('/[^\x09-\x0d\x1b\x20-\xff]/', $value)) { return 'Binary String: 0x' . bin2hex($value); } return "'" . str_replace(array("\r\n", "\n\r", "\r"), array("\n", "\n", "\n"), $value) . "'"; } $whitespace = str_repeat(' ', 4 * $indentation); if (!$processed) { $processed = new Context; } if (is_array($value)) { if (($key = $processed->contains($value)) !== false) { return 'Array &' . $key; } $array = $value; $key = $processed->add($value); $values = ''; if (count($array) > 0) { foreach ($array as $k => $v) { $values .= sprintf( '%s %s => %s' . "\n", $whitespace, $this->recursiveExport($k, $indentation), $this->recursiveExport($value[$k], $indentation + 1, $processed) ); } $values = "\n" . $values . $whitespace; } return sprintf('Array &%s (%s)', $key, $values); } if (is_object($value)) { $class = get_class($value); if ($hash = $processed->contains($value)) { return sprintf('%s Object &%s', $class, $hash); } $hash = $processed->add($value); $values = ''; $array = $this->toArray($value); if (count($array) > 0) { foreach ($array as $k => $v) { $values .= sprintf( '%s %s => %s' . "\n", $whitespace, $this->recursiveExport($k, $indentation), $this->recursiveExport($v, $indentation + 1, $processed) ); } $values = "\n" . $values . $whitespace; } return sprintf('%s Object &%s (%s)', $class, $hash, $values); } return var_export($value, true); } } PK!l躷**exporter/build.xmlnu誌w洞 PK!纫Mqqexporter/.gitignorenu誌w洞.idea phpunit.xml composer.lock composer.phar vendor/ cache.properties build/LICENSE build/README.md build/*.tgz PK!j1,resource-operations/README.mdnu誌w洞# Resource Operations Provides a list of PHP built-in functions that operate on resources. ## Installation To add this component as a local, per-project dependency to your project, simply add a dependency on `sebastian/resource-operations` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on this component: ```JSON { "require": { "sebastian/resource-operations": "~1.0" } } ``` PK!I瑠  resource-operations/LICENSEnu誌w洞Resource Operations Copyright (c) 2015, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!Cb憔4resource-operations/tests/ResourceOperationsTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ResourceOperations; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\ResourceOperations\ResourceOperations */ final class ResourceOperationsTest extends TestCase { public function testGetFunctions(): void { $functions = ResourceOperations::getFunctions(); $this->assertInternalType('array', $functions); $this->assertContains('fopen', $functions); } } PK!羪=m resource-operations/.php_cs.distnu刐迭 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'align_multiline_comment' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => true, 'cast_spaces' => true, 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => ['space' => 'none'], 'declare_strict_types' => true, 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'is_null' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'logical_operators' => true, 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'multiline_comment_opening_closing' => true, 'multiline_whitespace_before_semicolons' => true, 'native_constant_invocation' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'new_with_braces' => false, 'no_alias_functions' => true, 'no_alternative_syntax' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_before_namespace' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_multiline_whitespace_around_double_arrow' => true, 'no_null_property_initialization' => true, 'no_php4_constructor' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => true, 'no_unneeded_curly_braces' => true, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, 'phpdoc_types' => true, 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'return_assignment' => true, 'return_type_declaration' => ['space_before' => 'none'], 'self_accessor' => true, 'semicolon_after_instruction' => true, 'set_type_to_cast' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trailing_comma_in_multiline_array' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => true, 'void_return' => true, 'whitespace_after_comma_in_array' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ); PK!辺4&resource-operations/build/generate.phpnu券蓓#!/usr/bin/env php * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ $functions = require __DIR__ . '/arginfo.php'; $resourceFunctions = []; foreach ($functions as $function => $arguments) { foreach ($arguments as $argument) { if ($argument == 'resource') { $resourceFunctions[] = $function; } } } $resourceFunctions = array_unique($resourceFunctions); sort($resourceFunctions); $buffer = << * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ResourceOperations; class ResourceOperations { /** * @return string[] */ public static function getFunctions() { return [ EOT; foreach ($resourceFunctions as $function) { $buffer .= sprintf(" '%s',\n", $function); } $buffer .= <<< EOT ]; } } EOT; file_put_contents(__DIR__ . '/../src/ResourceOperations.php', $buffer); PK!KYY!resource-operations/composer.jsonnu誌w洞{ "name": "sebastian/resource-operations", "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "require": { "php": ">=5.6.0" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } PK!9%resource-operations/.github/stale.ymlnu刐迭# Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale daysUntilStale: 60 # Number of days of inactivity before a stale Issue or Pull Request is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. daysUntilClose: 7 # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - enhancement # Set to true to ignore issues in a project (defaults to false) exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: false # Label to use when marking as stale staleLabel: stale # Comment to post when marking as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Comment to post when closing a stale Issue or Pull Request. closeComment: > This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 30 # Limit to only `issues` or `pulls` only: issues PK!vT^^ resource-operations/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [2.0.1] - 2018-10-04 ### Fixed * Functions and methods with nullable parameters of type `resource` are now also considered ## [2.0.0] - 2018-09-27 ### Changed * [FunctionSignatureMap.php](https://raw.githubusercontent.com/phan/phan/master/src/Phan/Language/Internal/FunctionSignatureMap.php) from `phan/phan` is now used instead of [arginfo.php](https://raw.githubusercontent.com/rlerdorf/phan/master/includes/arginfo.php) from `rlerdorf/phan` ### Removed * This component is no longer supported on PHP 5.6 and PHP 7.0 ## 1.0.0 - 2015-07-28 * Initial release [2.0.1]: https://github.com/sebastianbergmann/comparator/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/comparator/compare/1.0.0...2.0.0 PK!h諕U扷.resource-operations/src/ResourceOperations.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ResourceOperations; class ResourceOperations { /** * @return string[] */ public static function getFunctions() { return [ 'Directory::close', 'Directory::read', 'Directory::rewind', 'HttpResponse::getRequestBodyStream', 'HttpResponse::getStream', 'MongoGridFSCursor::__construct', 'MongoGridFSFile::getResource', 'MysqlndUhConnection::stmtInit', 'MysqlndUhConnection::storeResult', 'MysqlndUhConnection::useResult', 'PDF_new', 'PDO::pgsqlLOBOpen', 'RarEntry::getStream', 'SQLite3::openBlob', 'XMLWriter::openMemory', 'XMLWriter::openURI', 'ZipArchive::getStream', 'bbcode_create', 'bzopen', 'crack_opendict', 'cubrid_connect', 'cubrid_connect_with_url', 'cubrid_get_query_timeout', 'cubrid_lob2_bind', 'cubrid_lob2_close', 'cubrid_lob2_export', 'cubrid_lob2_import', 'cubrid_lob2_new', 'cubrid_lob2_read', 'cubrid_lob2_seek', 'cubrid_lob2_seek64', 'cubrid_lob2_size', 'cubrid_lob2_size64', 'cubrid_lob2_tell', 'cubrid_lob2_tell64', 'cubrid_lob2_write', 'cubrid_pconnect', 'cubrid_pconnect_with_url', 'cubrid_prepare', 'cubrid_query', 'cubrid_set_query_timeout', 'cubrid_unbuffered_query', 'curl_copy_handle', 'curl_getinfo', 'curl_init', 'curl_multi_add_handle', 'curl_multi_close', 'curl_multi_exec', 'curl_multi_getcontent', 'curl_multi_info_read', 'curl_multi_init', 'curl_multi_remove_handle', 'curl_multi_select', 'curl_multi_setopt', 'curl_pause', 'curl_reset', 'curl_setopt', 'curl_setopt_array', 'curl_share_close', 'curl_share_init', 'curl_share_setopt', 'curl_unescape', 'cyrus_connect', 'db2_column_privileges', 'db2_columns', 'db2_connect', 'db2_exec', 'db2_foreign_keys', 'db2_next_result', 'db2_pconnect', 'db2_prepare', 'db2_primary_keys', 'db2_procedure_columns', 'db2_procedures', 'db2_special_columns', 'db2_statistics', 'db2_table_privileges', 'db2_tables', 'dba_fetch', 'dba_fetch 1', 'dba_open', 'dba_popen', 'dbplus_aql', 'dbplus_open', 'dbplus_rcreate', 'dbplus_ropen', 'dbplus_rquery', 'dbplus_sql', 'deflate_init', 'dio_open', 'eio_busy', 'eio_cancel', 'eio_chmod', 'eio_chown', 'eio_close', 'eio_custom', 'eio_dup2', 'eio_fallocate', 'eio_fchmod', 'eio_fchown', 'eio_fdatasync', 'eio_fstat', 'eio_fstatvfs', 'eio_fsync', 'eio_ftruncate', 'eio_futime', 'eio_get_last_error', 'eio_grp', 'eio_grp_add', 'eio_grp_cancel', 'eio_grp_limit', 'eio_link', 'eio_lstat', 'eio_mkdir', 'eio_mknod', 'eio_nop', 'eio_open', 'eio_read', 'eio_readahead', 'eio_readdir', 'eio_readlink', 'eio_realpath', 'eio_rename', 'eio_rmdir', 'eio_seek', 'eio_sendfile', 'eio_stat', 'eio_statvfs', 'eio_symlink', 'eio_sync', 'eio_sync_file_range', 'eio_syncfs', 'eio_truncate', 'eio_unlink', 'eio_utime', 'eio_write', 'enchant_broker_free_dict', 'enchant_broker_init', 'enchant_broker_request_dict', 'enchant_broker_request_pwl_dict', 'event_base_new', 'event_base_reinit', 'event_buffer_new', 'event_new', 'event_priority_set', 'event_timer_set', 'expect_popen', 'fam_monitor_collection', 'fam_monitor_directory', 'fam_monitor_file', 'fam_open', 'fann_cascadetrain_on_data', 'fann_cascadetrain_on_file', 'fann_clear_scaling_params', 'fann_copy', 'fann_create_from_file', 'fann_create_shortcut_array', 'fann_create_standard', 'fann_create_standard_array', 'fann_create_train', 'fann_create_train_from_callback', 'fann_descale_input', 'fann_descale_output', 'fann_descale_train', 'fann_destroy', 'fann_destroy_train', 'fann_duplicate_train_data', 'fann_get_MSE', 'fann_get_activation_function', 'fann_get_activation_steepness', 'fann_get_bias_array', 'fann_get_bit_fail', 'fann_get_bit_fail_limit', 'fann_get_cascade_activation_functions', 'fann_get_cascade_activation_functions_count', 'fann_get_cascade_activation_steepnesses', 'fann_get_cascade_activation_steepnesses_count', 'fann_get_cascade_candidate_change_fraction', 'fann_get_cascade_candidate_limit', 'fann_get_cascade_candidate_stagnation_epochs', 'fann_get_cascade_max_cand_epochs', 'fann_get_cascade_max_out_epochs', 'fann_get_cascade_min_cand_epochs', 'fann_get_cascade_min_out_epochs', 'fann_get_cascade_num_candidate_groups', 'fann_get_cascade_num_candidates', 'fann_get_cascade_output_change_fraction', 'fann_get_cascade_output_stagnation_epochs', 'fann_get_cascade_weight_multiplier', 'fann_get_connection_array', 'fann_get_connection_rate', 'fann_get_errno', 'fann_get_errstr', 'fann_get_layer_array', 'fann_get_learning_momentum', 'fann_get_learning_rate', 'fann_get_network_type', 'fann_get_num_input', 'fann_get_num_layers', 'fann_get_num_output', 'fann_get_quickprop_decay', 'fann_get_quickprop_mu', 'fann_get_rprop_decrease_factor', 'fann_get_rprop_delta_max', 'fann_get_rprop_delta_min', 'fann_get_rprop_delta_zero', 'fann_get_rprop_increase_factor', 'fann_get_sarprop_step_error_shift', 'fann_get_sarprop_step_error_threshold_factor', 'fann_get_sarprop_temperature', 'fann_get_sarprop_weight_decay_shift', 'fann_get_total_connections', 'fann_get_total_neurons', 'fann_get_train_error_function', 'fann_get_train_stop_function', 'fann_get_training_algorithm', 'fann_init_weights', 'fann_length_train_data', 'fann_merge_train_data', 'fann_num_input_train_data', 'fann_num_output_train_data', 'fann_randomize_weights', 'fann_read_train_from_file', 'fann_reset_errno', 'fann_reset_errstr', 'fann_run', 'fann_save', 'fann_save_train', 'fann_scale_input', 'fann_scale_input_train_data', 'fann_scale_output', 'fann_scale_output_train_data', 'fann_scale_train', 'fann_scale_train_data', 'fann_set_activation_function', 'fann_set_activation_function_hidden', 'fann_set_activation_function_layer', 'fann_set_activation_function_output', 'fann_set_activation_steepness', 'fann_set_activation_steepness_hidden', 'fann_set_activation_steepness_layer', 'fann_set_activation_steepness_output', 'fann_set_bit_fail_limit', 'fann_set_callback', 'fann_set_cascade_activation_functions', 'fann_set_cascade_activation_steepnesses', 'fann_set_cascade_candidate_change_fraction', 'fann_set_cascade_candidate_limit', 'fann_set_cascade_candidate_stagnation_epochs', 'fann_set_cascade_max_cand_epochs', 'fann_set_cascade_max_out_epochs', 'fann_set_cascade_min_cand_epochs', 'fann_set_cascade_min_out_epochs', 'fann_set_cascade_num_candidate_groups', 'fann_set_cascade_output_change_fraction', 'fann_set_cascade_output_stagnation_epochs', 'fann_set_cascade_weight_multiplier', 'fann_set_error_log', 'fann_set_input_scaling_params', 'fann_set_learning_momentum', 'fann_set_learning_rate', 'fann_set_output_scaling_params', 'fann_set_quickprop_decay', 'fann_set_quickprop_mu', 'fann_set_rprop_decrease_factor', 'fann_set_rprop_delta_max', 'fann_set_rprop_delta_min', 'fann_set_rprop_delta_zero', 'fann_set_rprop_increase_factor', 'fann_set_sarprop_step_error_shift', 'fann_set_sarprop_step_error_threshold_factor', 'fann_set_sarprop_temperature', 'fann_set_sarprop_weight_decay_shift', 'fann_set_scaling_params', 'fann_set_train_error_function', 'fann_set_train_stop_function', 'fann_set_training_algorithm', 'fann_set_weight', 'fann_set_weight_array', 'fann_shuffle_train_data', 'fann_subset_train_data', 'fann_test', 'fann_test_data', 'fann_train', 'fann_train_epoch', 'fann_train_on_data', 'fann_train_on_file', 'fbsql_connect', 'fbsql_db_query', 'fbsql_list_dbs', 'fbsql_list_fields', 'fbsql_list_tables', 'fbsql_pconnect', 'fbsql_query', 'fdf_create', 'fdf_open', 'fdf_open_string', 'finfo::buffer', 'finfo_buffer', 'finfo_close', 'finfo_file', 'finfo_open', 'finfo_set_flags', 'fopen', 'fsockopen', 'ftp_alloc', 'ftp_cdup', 'ftp_chdir', 'ftp_chmod', 'ftp_close', 'ftp_connect', 'ftp_delete', 'ftp_exec', 'ftp_fget', 'ftp_fput', 'ftp_get', 'ftp_get_option', 'ftp_login', 'ftp_mdtm', 'ftp_mkdir', 'ftp_nb_continue', 'ftp_nb_fget', 'ftp_nb_fput', 'ftp_nb_get', 'ftp_nb_put', 'ftp_nlist', 'ftp_pasv', 'ftp_put', 'ftp_pwd', 'ftp_raw', 'ftp_rawlist', 'ftp_rename', 'ftp_rmdir', 'ftp_set_option', 'ftp_site', 'ftp_size', 'ftp_ssl_connect', 'ftp_systype', 'gnupg_init', 'gupnp_context_new', 'gupnp_control_point_new', 'gupnp_device_info_get_service', 'gupnp_root_device_new', 'gzopen', 'hash_copy', 'hash_final', 'hash_init', 'hash_update', 'hash_update_file', 'hash_update_stream', 'http_get_request_body_stream', 'ibase_blob_create', 'ibase_blob_open', 'ibase_blob_open 1', 'ibase_connect', 'ibase_pconnect', 'ibase_prepare', 'ibase_service_attach', 'ibase_set_event_handler', 'ibase_set_event_handler 1', 'ibase_trans', 'ifx_connect', 'ifx_pconnect', 'ifx_prepare', 'ifx_query', 'imageaffine', 'imageconvolution', 'imagecreate', 'imagecreatefromgd', 'imagecreatefromgd2', 'imagecreatefromgd2part', 'imagecreatefromgif', 'imagecreatefromjpeg', 'imagecreatefrompng', 'imagecreatefromstring', 'imagecreatefromwbmp', 'imagecreatefromwebp', 'imagecreatefromxbm', 'imagecreatefromxpm', 'imagecreatetruecolor', 'imagegrabscreen', 'imagegrabwindow', 'imagepalettetotruecolor', 'imagepsloadfont', 'imagerotate', 'imagescale', 'imap_open', 'inflate_init', 'ingres_connect', 'ingres_pconnect', 'inotify_init', 'kadm5_init_with_password', 'ldap_connect', 'ldap_first_entry', 'ldap_first_reference', 'ldap_list', 'ldap_next_entry', 'ldap_next_reference', 'ldap_read', 'ldap_search', 'm_initconn', 'mailparse_msg_create', 'mailparse_msg_get_part', 'mailparse_msg_parse_file', 'maxdb::use_result', 'maxdb_connect', 'maxdb_embedded_connect', 'maxdb_init', 'maxdb_stmt::result_metadata', 'maxdb_stmt_result_metadata', 'maxdb_use_result', 'mcrypt_module_open', 'msg_get_queue', 'msql_connect', 'msql_db_query', 'msql_list_dbs', 'msql_list_fields', 'msql_list_tables', 'msql_pconnect', 'msql_query', 'mssql_connect', 'mssql_init', 'mssql_pconnect', 'mysql_connect', 'mysql_db_query', 'mysql_list_dbs', 'mysql_list_fields', 'mysql_list_processes', 'mysql_list_tables', 'mysql_pconnect', 'mysql_query', 'mysql_unbuffered_query', 'mysqlnd_uh_convert_to_mysqlnd', 'ncurses_new_panel', 'ncurses_newpad', 'ncurses_newwin', 'ncurses_panel_above', 'ncurses_panel_below', 'ncurses_panel_window', 'newt_button', 'newt_button_bar', 'newt_checkbox', 'newt_checkbox_tree', 'newt_checkbox_tree_multi', 'newt_compact_button', 'newt_create_grid', 'newt_entry', 'newt_form', 'newt_form_get_current', 'newt_grid_basic_window', 'newt_grid_h_close_stacked', 'newt_grid_h_stacked', 'newt_grid_simple_window', 'newt_grid_v_close_stacked', 'newt_grid_v_stacked', 'newt_label', 'newt_listbox', 'newt_listitem', 'newt_radio_get_current', 'newt_radiobutton', 'newt_run_form', 'newt_scale', 'newt_textbox', 'newt_textbox_reflowed', 'newt_vertical_scrollbar', 'oci_connect', 'oci_get_implicit_resultset', 'oci_new_connect', 'oci_new_cursor', 'oci_parse', 'oci_pconnect', 'odbc_columnprivileges', 'odbc_columns', 'odbc_connect', 'odbc_exec', 'odbc_foreignkeys', 'odbc_gettypeinfo', 'odbc_pconnect', 'odbc_prepare', 'odbc_primarykeys', 'odbc_procedurecolumns', 'odbc_procedures', 'odbc_specialcolumns', 'odbc_statistics', 'odbc_tableprivileges', 'odbc_tables', 'openal_buffer_create', 'openal_context_create', 'openal_device_open', 'openal_source_create', 'openal_stream', 'openssl_csr_new', 'openssl_csr_sign', 'openssl_pkey_get_private', 'openssl_pkey_get_public', 'openssl_pkey_new', 'openssl_x509_read', 'pfsockopen', 'pg_cancel_query', 'pg_client_encoding', 'pg_close', 'pg_connect', 'pg_connect_poll', 'pg_connection_busy', 'pg_connection_reset', 'pg_connection_status', 'pg_consume_input', 'pg_copy_from', 'pg_copy_to', 'pg_dbname', 'pg_end_copy', 'pg_escape_bytea', 'pg_escape_identifier', 'pg_escape_identifier 1', 'pg_escape_literal', 'pg_escape_string', 'pg_execute', 'pg_execute 1', 'pg_flush', 'pg_free_result', 'pg_get_notify', 'pg_get_pid', 'pg_get_result', 'pg_host', 'pg_last_error', 'pg_last_notice', 'pg_lo_create', 'pg_lo_export', 'pg_lo_import', 'pg_lo_open', 'pg_lo_unlink', 'pg_options', 'pg_parameter_status', 'pg_pconnect', 'pg_ping', 'pg_port', 'pg_prepare', 'pg_prepare 1', 'pg_put_line', 'pg_query', 'pg_query 1', 'pg_query_params', 'pg_query_params 1', 'pg_send_execute', 'pg_send_prepare', 'pg_send_query', 'pg_send_query_params', 'pg_set_client_encoding', 'pg_set_client_encoding 1', 'pg_set_error_verbosity', 'pg_socket', 'pg_trace', 'pg_transaction_status', 'pg_tty', 'pg_untrace', 'pg_version', 'php_user_filter::filter', 'popen', 'proc_open', 'ps_new', 'px_new', 'radius_acct_open', 'radius_auth_open', 'radius_salt_encrypt_attr', 'rpm_open', 'sem_get', 'shm_attach', 'socket_accept', 'socket_create', 'socket_create_listen', 'socket_recvmsg', 'socket_sendmsg', 'sqlite_open', 'sqlite_popen', 'sqlsrv_begin_transaction', 'sqlsrv_cancel', 'sqlsrv_client_info', 'sqlsrv_close', 'sqlsrv_commit', 'sqlsrv_connect', 'sqlsrv_execute', 'sqlsrv_fetch', 'sqlsrv_fetch_array', 'sqlsrv_fetch_object', 'sqlsrv_field_metadata', 'sqlsrv_free_stmt', 'sqlsrv_get_field', 'sqlsrv_has_rows', 'sqlsrv_next_result', 'sqlsrv_num_fields', 'sqlsrv_num_rows', 'sqlsrv_prepare', 'sqlsrv_query', 'sqlsrv_rollback', 'sqlsrv_rows_affected', 'sqlsrv_send_stream_data', 'sqlsrv_server_info', 'ssh2_auth_agent', 'ssh2_connect', 'ssh2_exec', 'ssh2_fetch_stream', 'ssh2_publickey_init', 'ssh2_sftp', 'ssh2_sftp_chmod', 'ssh2_shell', 'ssh2_tunnel', 'stomp_connect', 'streamWrapper::stream_cast', 'stream_bucket_new', 'stream_context_create', 'stream_context_get_default', 'stream_context_set_default', 'stream_filter_append', 'stream_filter_prepend', 'stream_socket_accept', 'stream_socket_client', 'stream_socket_server', 'svn_fs_apply_text', 'svn_fs_begin_txn2', 'svn_fs_file_contents', 'svn_fs_revision_root', 'svn_fs_txn_root', 'svn_repos_create', 'svn_repos_fs', 'svn_repos_fs_begin_txn_for_commit', 'svn_repos_open', 'sybase_connect', 'sybase_pconnect', 'sybase_unbuffered_query', 'tmpfile', 'udm_alloc_agent', 'udm_alloc_agent_array', 'udm_find', 'unlink', 'w32api_init_dtype', 'wddx_packet_start', 'xml_parser_create', 'xml_parser_create_ns', 'xml_parser_free', 'xml_parser_get_option', 'xml_parser_set_option', 'xmlrpc_server_create', 'xmlwriter_open_memory', 'xmlwriter_open_uri', 'xslt_create', 'zip_open', 'zip_read', ]; } } PK!3*resource-operations/build.xmlnu誌w洞 PK!閪'resource-operations/.gitignorenu誌w洞/.idea /build/arginfo.php PK!S$code-unit-reverse-lookup/phpunit.xmlnu誌w洞 tests src PK!蔥"code-unit-reverse-lookup/README.mdnu誌w洞# code-unit-reverse-lookup Looks up which function or method a line of code belongs to. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/code-unit-reverse-lookup If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/code-unit-reverse-lookup PK!XX掊 code-unit-reverse-lookup/LICENSEnu誌w洞code-unit-reverse-lookup Copyright (c) 2016-2017, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK! 章-code-unit-reverse-lookup/tests/WizardTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnitReverseLookup; use PHPUnit\Framework\TestCase; /** * @covers SebastianBergmann\CodeUnitReverseLookup\Wizard */ class WizardTest extends TestCase { /** * @var Wizard */ private $wizard; protected function setUp(): void { $this->wizard = new Wizard; } public function testMethodCanBeLookedUp() { $this->assertEquals( __METHOD__, $this->wizard->lookup(__FILE__, __LINE__) ); } public function testReturnsFilenameAndLineNumberAsStringWhenNotInCodeUnit() { $this->assertEquals( 'file.php:1', $this->wizard->lookup('file.php', 1) ); } } PK!縶z峱p$code-unit-reverse-lookup/.travis.ymlnu誌w洞language: php php: - 5.6 - 7.0 - 7.0snapshot - 7.1 - 7.1snapshot - master sudo: false before_install: - composer self-update - composer clear-cache install: - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest --optimize-autoloader --prefer-stable script: - ./vendor/bin/phpunit notifications: email: false PK!D&code-unit-reverse-lookup/composer.jsonnu誌w洞{ "name": "sebastian/code-unit-reverse-lookup", "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "require": { "php": ">=5.6" }, "require-dev": { "phpunit/phpunit": "^8.5" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "1.0.x-dev" } } } PK!T code-unit-reverse-lookup/.php_csnu誌w洞files() ->in('src') ->in('tests') ->name('*.php'); return Symfony\CS\Config\Config::create() ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) ->fixers( array( 'align_double_arrow', 'align_equals', 'braces', 'concat_with_spaces', 'duplicate_semicolon', 'elseif', 'empty_return', 'encoding', 'eof_ending', 'extra_empty_lines', 'function_call_space', 'function_declaration', 'indentation', 'join_function', 'line_after_namespace', 'linefeed', 'list_commas', 'lowercase_constants', 'lowercase_keywords', 'method_argument_space', 'multiple_use', 'namespace_no_leading_whitespace', 'no_blank_lines_after_class_opening', 'no_empty_lines_after_phpdocs', 'parenthesis', 'php_closing_tag', 'phpdoc_indent', 'phpdoc_no_access', 'phpdoc_no_empty_return', 'phpdoc_no_package', 'phpdoc_params', 'phpdoc_scalar', 'phpdoc_separation', 'phpdoc_to_comment', 'phpdoc_trim', 'phpdoc_types', 'phpdoc_var_without_name', 'remove_lines_between_uses', 'return', 'self_accessor', 'short_array_syntax', 'short_tag', 'single_line_after_imports', 'single_quote', 'spaces_before_semicolon', 'spaces_cast', 'ternary_spaces', 'trailing_spaces', 'trim_array_spaces', 'unused_use', 'visibility', 'whitespacy_lines' ) ) ->finder($finder); PK!犩? %code-unit-reverse-lookup/ChangeLog.mdnu誌w洞# Change Log All notable changes to `sebastianbergmann/code-unit-reverse-lookup` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [1.0.2] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^5.6 || ^7.0` to `>=5.6` ## 1.0.0 - 2016-02-13 * Initial release [1.0.2]: https://github.com/sebastianbergmann/code-unit-reverse-lookup/compare/1.0.1...1.0.2 PK!廅e e 'code-unit-reverse-lookup/src/Wizard.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnitReverseLookup; /** * @since Class available since Release 1.0.0 */ class Wizard { /** * @var array */ private $lookupTable = []; /** * @var array */ private $processedClasses = []; /** * @var array */ private $processedFunctions = []; /** * @param string $filename * @param int $lineNumber * * @return string */ public function lookup($filename, $lineNumber) { if (!isset($this->lookupTable[$filename][$lineNumber])) { $this->updateLookupTable(); } if (isset($this->lookupTable[$filename][$lineNumber])) { return $this->lookupTable[$filename][$lineNumber]; } else { return $filename . ':' . $lineNumber; } } private function updateLookupTable() { $this->processClassesAndTraits(); $this->processFunctions(); } private function processClassesAndTraits() { foreach (array_merge(get_declared_classes(), get_declared_traits()) as $classOrTrait) { if (isset($this->processedClasses[$classOrTrait])) { continue; } $reflector = new \ReflectionClass($classOrTrait); foreach ($reflector->getMethods() as $method) { $this->processFunctionOrMethod($method); } $this->processedClasses[$classOrTrait] = true; } } private function processFunctions() { foreach (get_defined_functions()['user'] as $function) { if (isset($this->processedFunctions[$function])) { continue; } $this->processFunctionOrMethod(new \ReflectionFunction($function)); $this->processedFunctions[$function] = true; } } /** * @param \ReflectionFunctionAbstract $functionOrMethod */ private function processFunctionOrMethod(\ReflectionFunctionAbstract $functionOrMethod) { if ($functionOrMethod->isInternal()) { return; } $name = $functionOrMethod->getName(); if ($functionOrMethod instanceof \ReflectionMethod) { $name = $functionOrMethod->getDeclaringClass()->getName() . '::' . $name; } if (!isset($this->lookupTable[$functionOrMethod->getFileName()])) { $this->lookupTable[$functionOrMethod->getFileName()] = []; } foreach (range($functionOrMethod->getStartLine(), $functionOrMethod->getEndLine()) as $line) { $this->lookupTable[$functionOrMethod->getFileName()][$line] = $name; } } } PK!bx0"""code-unit-reverse-lookup/build.xmlnu誌w洞 PK!75=#code-unit-reverse-lookup/.gitignorenu誌w洞/.idea /composer.lock /vendor PK!k鴢啖global-state/phpunit.xmlnu刐迭 tests src PK!暾 Zggglobal-state/README.mdnu誌w洞# GlobalState Snapshotting of global state, factored out of PHPUnit into a stand-alone component. [![Build Status](https://travis-ci.org/sebastianbergmann/global-state.svg?branch=master)](https://travis-ci.org/sebastianbergmann/global-state) ## Installation To add this package as a local, per-project dependency to your project, simply add a dependency on `sebastian/global-state` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on GlobalState: { "require": { "sebastian/global-state": "1.0.*" } } PK! 廯  global-state/LICENSEnu誌w洞GlobalState Copyright (c) 2001-2015, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!Q.姴#global-state/tests/RestorerTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\GlobalState\Restorer * * @uses \SebastianBergmann\GlobalState\Blacklist * @uses \SebastianBergmann\GlobalState\Snapshot */ final class RestorerTest extends TestCase { public static function setUpBeforeClass(): void { $GLOBALS['varBool'] = false; $GLOBALS['varNull'] = null; $_GET['varGet'] = 0; } public function testRestorerGlobalVariable(): void { $snapshot = new Snapshot(null, true, false, false, false, false, false, false, false, false); $restorer = new Restorer; $restorer->restoreGlobalVariables($snapshot); $this->assertArrayHasKey('varBool', $GLOBALS); $this->assertEquals(false, $GLOBALS['varBool']); $this->assertArrayHasKey('varNull', $GLOBALS); $this->assertEquals(null, $GLOBALS['varNull']); $this->assertArrayHasKey('varGet', $_GET); $this->assertEquals(0, $_GET['varGet']); } /** * @backupGlobals enabled */ public function testIntegrationRestorerGlobalVariables(): void { $this->assertArrayHasKey('varBool', $GLOBALS); $this->assertEquals(false, $GLOBALS['varBool']); $this->assertArrayHasKey('varNull', $GLOBALS); $this->assertEquals(null, $GLOBALS['varNull']); $this->assertArrayHasKey('varGet', $_GET); $this->assertEquals(0, $_GET['varGet']); } /** * @depends testIntegrationRestorerGlobalVariables */ public function testIntegrationRestorerGlobalVariables2(): void { $this->assertArrayHasKey('varBool', $GLOBALS); $this->assertEquals(false, $GLOBALS['varBool']); $this->assertArrayHasKey('varNull', $GLOBALS); $this->assertEquals(null, $GLOBALS['varNull']); $this->assertArrayHasKey('varGet', $_GET); $this->assertEquals(0, $_GET['varGet']); } } PK!.圞'global-state/tests/CodeExporterTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\GlobalState\CodeExporter */ final class CodeExporterTest extends TestCase { /** * @runInSeparateProcess */ public function testCanExportGlobalVariablesToCode(): void { $GLOBALS = ['foo' => 'bar']; $snapshot = new Snapshot(null, true, false, false, false, false, false, false, false, false); $exporter = new CodeExporter; $this->assertEquals( '$GLOBALS = [];' . \PHP_EOL . '$GLOBALS[\'foo\'] = \'bar\';' . \PHP_EOL, $exporter->globalVariables($snapshot) ); } } PK!両g $global-state/tests/BlacklistTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use PHPUnit_Framework_TestCase; /** */ class BlacklistTest extends PHPUnit_Framework_TestCase { /** * @var \SebastianBergmann\GlobalState\Blacklist */ private $blacklist; protected function setUp() { $this->blacklist = new Blacklist; } public function testGlobalVariableThatIsNotBlacklistedIsNotTreatedAsBlacklisted() { $this->assertFalse($this->blacklist->isGlobalVariableBlacklisted('variable')); } public function testGlobalVariableCanBeBlacklisted() { $this->blacklist->addGlobalVariable('variable'); $this->assertTrue($this->blacklist->isGlobalVariableBlacklisted('variable')); } public function testStaticAttributeThatIsNotBlacklistedIsNotTreatedAsBlacklisted() { $this->assertFalse( $this->blacklist->isStaticAttributeBlacklisted( 'SebastianBergmann\GlobalState\TestFixture\BlacklistedClass', 'attribute' ) ); } public function testClassCanBeBlacklisted() { $this->blacklist->addClass('SebastianBergmann\GlobalState\TestFixture\BlacklistedClass'); $this->assertTrue( $this->blacklist->isStaticAttributeBlacklisted( 'SebastianBergmann\GlobalState\TestFixture\BlacklistedClass', 'attribute' ) ); } public function testSubclassesCanBeBlacklisted() { $this->blacklist->addSubclassesOf('SebastianBergmann\GlobalState\TestFixture\BlacklistedClass'); $this->assertTrue( $this->blacklist->isStaticAttributeBlacklisted( 'SebastianBergmann\GlobalState\TestFixture\BlacklistedChildClass', 'attribute' ) ); } public function testImplementorsCanBeBlacklisted() { $this->blacklist->addImplementorsOf('SebastianBergmann\GlobalState\TestFixture\BlacklistedInterface'); $this->assertTrue( $this->blacklist->isStaticAttributeBlacklisted( 'SebastianBergmann\GlobalState\TestFixture\BlacklistedImplementor', 'attribute' ) ); } public function testClassNamePrefixesCanBeBlacklisted() { $this->blacklist->addClassNamePrefix('SebastianBergmann\GlobalState'); $this->assertTrue( $this->blacklist->isStaticAttributeBlacklisted( 'SebastianBergmann\GlobalState\TestFixture\BlacklistedClass', 'attribute' ) ); } public function testStaticAttributeCanBeBlacklisted() { $this->blacklist->addStaticAttribute( 'SebastianBergmann\GlobalState\TestFixture\BlacklistedClass', 'attribute' ); $this->assertTrue( $this->blacklist->isStaticAttributeBlacklisted( 'SebastianBergmann\GlobalState\TestFixture\BlacklistedClass', 'attribute' ) ); } } PK!^f0VV4global-state/tests/_fixture/BlacklistedInterface.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; /** */ interface BlacklistedInterface { } PK!2J豄K-global-state/tests/_fixture/SnapshotTrait.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; /** */ trait SnapshotTrait { } PK! 櫓ll5global-state/tests/_fixture/BlacklistedChildClass.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; /** */ class BlacklistedChildClass extends BlacklistedClass { } PK!\彑醡m0global-state/tests/_fixture/BlacklistedClass.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; /** */ class BlacklistedClass { private static $attribute; } PK!@l\KK1global-state/tests/_fixture/SnapshotFunctions.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; function snapshotFunction() { } PK! 殾祿6global-state/tests/_fixture/BlacklistedImplementor.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; /** */ class BlacklistedImplementor implements BlacklistedInterface { private static $attribute; } PK!m豵7ww3global-state/tests/_fixture/SnapshotDomDocument.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; use DomDocument; /** */ class SnapshotDomDocument extends DomDocument { } PK!斋噟-global-state/tests/_fixture/SnapshotClass.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState\TestFixture; use DomDocument; use ArrayObject; /** */ class SnapshotClass { private static $string = 'snapshot'; private static $dom; private static $closure; private static $arrayObject; private static $snapshotDomDocument; private static $resource; private static $stdClass; public static function init() { self::$dom = new DomDocument(); self::$closure = function () {}; self::$arrayObject = new ArrayObject(array(1, 2, 3)); self::$snapshotDomDocument = new SnapshotDomDocument(); self::$resource = fopen('php://memory', 'r'); self::$stdClass = new \stdClass(); } } PK!#global-state/tests/SnapshotTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use ArrayObject; use PHPUnit_Framework_TestCase; use SebastianBergmann\GlobalState\TestFixture\SnapshotClass; /** */ class SnapshotTest extends PHPUnit_Framework_TestCase { public function testStaticAttributes() { $blacklist = $this->getBlacklist(); $blacklist->method('isStaticAttributeBlacklisted')->willReturnCallback(function ($class) { return $class !== 'SebastianBergmann\GlobalState\TestFixture\SnapshotClass'; }); SnapshotClass::init(); $snapshot = new Snapshot($blacklist, false, true, false, false, false, false, false, false, false); $expected = array('SebastianBergmann\GlobalState\TestFixture\SnapshotClass' => array( 'string' => 'snapshot', 'arrayObject' => new ArrayObject(array(1, 2, 3)), 'stdClass' => new \stdClass(), )); $this->assertEquals($expected, $snapshot->staticAttributes()); } public function testConstants() { $snapshot = new Snapshot($this->getBlacklist(), false, false, true, false, false, false, false, false, false); $this->assertArrayHasKey('GLOBALSTATE_TESTSUITE', $snapshot->constants()); } public function testFunctions() { require_once __DIR__.'/_fixture/SnapshotFunctions.php'; $snapshot = new Snapshot($this->getBlacklist(), false, false, false, true, false, false, false, false, false); $functions = $snapshot->functions(); $this->assertThat( $functions, $this->logicalOr( // Zend $this->contains('sebastianbergmann\globalstate\testfixture\snapshotfunction'), // HHVM $this->contains('SebastianBergmann\GlobalState\TestFixture\snapshotFunction') ) ); $this->assertNotContains('assert', $functions); } public function testClasses() { $snapshot = new Snapshot($this->getBlacklist(), false, false, false, false, true, false, false, false, false); $classes = $snapshot->classes(); $this->assertContains('PHPUnit_Framework_TestCase', $classes); $this->assertNotContains('Exception', $classes); } public function testInterfaces() { $snapshot = new Snapshot($this->getBlacklist(), false, false, false, false, false, true, false, false, false); $interfaces = $snapshot->interfaces(); $this->assertContains('PHPUnit_Framework_Test', $interfaces); $this->assertNotContains('Countable', $interfaces); } /** * @requires PHP 5.4 */ public function testTraits() { spl_autoload_call('SebastianBergmann\GlobalState\TestFixture\SnapshotTrait'); $snapshot = new Snapshot($this->getBlacklist(), false, false, false, false, false, false, true, false, false); $this->assertContains('SebastianBergmann\GlobalState\TestFixture\SnapshotTrait', $snapshot->traits()); } public function testIniSettings() { $snapshot = new Snapshot($this->getBlacklist(), false, false, false, false, false, false, false, true, false); $iniSettings = $snapshot->iniSettings(); $this->assertArrayHasKey('date.timezone', $iniSettings); $this->assertEquals('Etc/UTC', $iniSettings['date.timezone']); } public function testIncludedFiles() { $snapshot = new Snapshot($this->getBlacklist(), false, false, false, false, false, false, false, false, true); $this->assertContains(__FILE__, $snapshot->includedFiles()); } /** * @return \SebastianBergmann\GlobalState\Blacklist */ private function getBlacklist() { return $this->getMockBuilder('SebastianBergmann\GlobalState\Blacklist') ->disableOriginalConstructor() ->getMock(); } } PK!鼊c掱global-state/.travis.ymlnu誌w洞language: php php: - 5.3.3 - 5.3 - 5.4 - 5.5 - 5.6 - hhvm sudo: false before_script: - composer self-update - composer install --no-interaction --prefer-source --dev script: ./vendor/bin/phpunit notifications: email: false PK!s?C>>global-state/.php_cs.distnu刐迭 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'align_multiline_comment' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => true, 'cast_spaces' => true, 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => ['space' => 'none'], 'declare_strict_types' => true, 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'is_null' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'logical_operators' => true, 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'multiline_comment_opening_closing' => true, 'multiline_whitespace_before_semicolons' => true, 'native_constant_invocation' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'new_with_braces' => false, 'no_alias_functions' => true, 'no_alternative_syntax' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_before_namespace' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_multiline_whitespace_around_double_arrow' => true, 'no_null_property_initialization' => true, 'no_php4_constructor' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => true, 'no_unneeded_curly_braces' => true, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, 'phpdoc_types' => ['groups' => ['simple', 'meta']], 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'return_assignment' => true, 'return_type_declaration' => ['space_before' => 'none'], 'self_accessor' => true, 'semicolon_after_instruction' => true, 'set_type_to_cast' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trailing_comma_in_multiline_array' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => [ 'elements' => [ 'const', 'method', 'property', ], ], 'void_return' => true, 'whitespace_after_comma_in_array' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ); PK!D昪  global-state/composer.jsonnu誌w洞{ "name": "sebastian/global-state", "description": "Snapshotting of global state", "keywords": ["global state"], "homepage": "http://www.github.com/sebastianbergmann/global-state", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "require": { "php": ">=5.3.3" }, "require-dev": { "phpunit/phpunit": "~4.2" }, "suggest": { "ext-uopz": "*" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture/" ] }, "extra": { "branch-alias": { "dev-master": "1.0-dev" } } } PK!9global-state/.github/stale.ymlnu刐迭# Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale daysUntilStale: 60 # Number of days of inactivity before a stale Issue or Pull Request is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. daysUntilClose: 7 # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - enhancement # Set to true to ignore issues in a project (defaults to false) exemptProjects: false # Set to true to ignore issues in a milestone (defaults to false) exemptMilestones: false # Label to use when marking as stale staleLabel: stale # Comment to post when marking as stale. Set to `false` to disable markComment: > This issue has been automatically marked as stale because it has not had activity within the last 60 days. It will be closed after 7 days if no further activity occurs. Thank you for your contributions. # Comment to post when removing the stale label. # unmarkComment: > # Your comment here. # Comment to post when closing a stale Issue or Pull Request. closeComment: > This issue has been automatically closed because it has not had activity since it was marked as stale. Thank you for your contributions. # Limit the number of actions per hour, from 1-30. Default is 30 limitPerRun: 30 # Limit to only `issues` or `pulls` only: issues PK!,K鏵MMglobal-state/ChangeLog.mdnu刐迭# Changes in sebastian/global-state All notable changes in `sebastian/global-state` are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [6.0.2] - 2024-03-02 ### Changed * Do not use implicitly nullable parameters ## [6.0.1] - 2023-07-19 ### Changed * Changed usage of `ReflectionProperty::setValue()` to be compatible with PHP 8.3 ## [6.0.0] - 2023-02-03 ### Changed * Renamed `SebastianBergmann\GlobalState\ExcludeList::addStaticAttribute()` to `SebastianBergmann\GlobalState\ExcludeList::addStaticProperty()` * Renamed `SebastianBergmann\GlobalState\ExcludeList::isStaticAttributeExcluded()` to `SebastianBergmann\GlobalState\ExcludeList::isStaticPropertyExcluded()` * Renamed `SebastianBergmann\GlobalState\Restorer::restoreStaticAttributes()` to `SebastianBergmann\GlobalState\Restorer::restoreStaticProperties()` * Renamed `SebastianBergmann\GlobalState\Snapshot::staticAttributes()` to `SebastianBergmann\GlobalState\Snapshot::staticProperties()` ### Removed * Removed `SebastianBergmann\GlobalState\Restorer::restoreFunctions()` * This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 ## [5.0.5] - 2022-02-14 ### Fixed * [#34](https://github.com/sebastianbergmann/global-state/pull/34): Uninitialised typed static properties are not handled correctly ## [5.0.4] - 2022-02-10 ### Fixed * The `$includeTraits` parameter of `SebastianBergmann\GlobalState\Snapshot::__construct()` is not respected ## [5.0.3] - 2021-06-11 ### Changed * `SebastianBergmann\GlobalState\CodeExporter::globalVariables()` now generates code that is compatible with PHP 8.1 ## [5.0.2] - 2020-10-26 ### Fixed * `SebastianBergmann\GlobalState\Exception` now correctly extends `\Throwable` ## [5.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [5.0.0] - 2020-08-07 ### Changed * The `SebastianBergmann\GlobalState\Blacklist` class has been renamed to `SebastianBergmann\GlobalState\ExcludeList` ## [4.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.2 ## [3.0.2] - 2022-02-10 ### Fixed * The `$includeTraits` parameter of `SebastianBergmann\GlobalState\Snapshot::__construct()` is not respected ## [3.0.1] - 2020-11-30 ### Changed * Changed PHP version constraint in `composer.json` from `^7.2` to `>=7.2` ## [3.0.0] - 2019-02-01 ### Changed * `Snapshot::canBeSerialized()` now recursively checks arrays and object graphs for variables that cannot be serialized ### Removed * This component is no longer supported on PHP 7.0 and PHP 7.1 [6.0.2]: https://github.com/sebastianbergmann/global-state/compare/6.0.1...6.0.2 [6.0.1]: https://github.com/sebastianbergmann/global-state/compare/6.0.0...6.0.1 [6.0.0]: https://github.com/sebastianbergmann/global-state/compare/5.0.5...6.0.0 [5.0.5]: https://github.com/sebastianbergmann/global-state/compare/5.0.4...5.0.5 [5.0.4]: https://github.com/sebastianbergmann/global-state/compare/5.0.3...5.0.4 [5.0.3]: https://github.com/sebastianbergmann/global-state/compare/5.0.2...5.0.3 [5.0.2]: https://github.com/sebastianbergmann/global-state/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/global-state/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/global-state/compare/4.0.0...5.0.0 [4.0.0]: https://github.com/sebastianbergmann/global-state/compare/3.0.2...4.0.0 [3.0.2]: https://github.com/sebastianbergmann/phpunit/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/phpunit/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/phpunit/compare/2.0.0...3.0.0 PK!:[ [ global-state/src/Blacklist.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use ReflectionClass; /** * A blacklist for global state elements that should not be snapshotted. */ class Blacklist { /** * @var array */ private $globalVariables = array(); /** * @var array */ private $classes = array(); /** * @var array */ private $classNamePrefixes = array(); /** * @var array */ private $parentClasses = array(); /** * @var array */ private $interfaces = array(); /** * @var array */ private $staticAttributes = array(); /** * @param string $variableName */ public function addGlobalVariable($variableName) { $this->globalVariables[$variableName] = true; } /** * @param string $className */ public function addClass($className) { $this->classes[] = $className; } /** * @param string $className */ public function addSubclassesOf($className) { $this->parentClasses[] = $className; } /** * @param string $interfaceName */ public function addImplementorsOf($interfaceName) { $this->interfaces[] = $interfaceName; } /** * @param string $classNamePrefix */ public function addClassNamePrefix($classNamePrefix) { $this->classNamePrefixes[] = $classNamePrefix; } /** * @param string $className * @param string $attributeName */ public function addStaticAttribute($className, $attributeName) { if (!isset($this->staticAttributes[$className])) { $this->staticAttributes[$className] = array(); } $this->staticAttributes[$className][$attributeName] = true; } /** * @param string $variableName * @return bool */ public function isGlobalVariableBlacklisted($variableName) { return isset($this->globalVariables[$variableName]); } /** * @param string $className * @param string $attributeName * @return bool */ public function isStaticAttributeBlacklisted($className, $attributeName) { if (in_array($className, $this->classes)) { return true; } foreach ($this->classNamePrefixes as $prefix) { if (strpos($className, $prefix) === 0) { return true; } } $class = new ReflectionClass($className); foreach ($this->parentClasses as $type) { if ($class->isSubclassOf($type)) { return true; } } foreach ($this->interfaces as $type) { if ($class->implementsInterface($type)) { return true; } } if (isset($this->staticAttributes[$className][$attributeName])) { return true; } return false; } } PK!訐;\global-state/src/Restorer.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use ReflectionProperty; /** * Restorer of snapshots of global state. */ class Restorer { /** * Deletes function definitions that are not defined in a snapshot. * * @param Snapshot $snapshot * @throws RuntimeException when the uopz_delete() function is not available * @see https://github.com/krakjoe/uopz */ public function restoreFunctions(Snapshot $snapshot) { if (!function_exists('uopz_delete')) { throw new RuntimeException('The uopz_delete() function is required for this operation'); } $functions = get_defined_functions(); foreach (array_diff($functions['user'], $snapshot->functions()) as $function) { uopz_delete($function); } } /** * Restores all global and super-global variables from a snapshot. * * @param Snapshot $snapshot */ public function restoreGlobalVariables(Snapshot $snapshot) { $superGlobalArrays = $snapshot->superGlobalArrays(); foreach ($superGlobalArrays as $superGlobalArray) { $this->restoreSuperGlobalArray($snapshot, $superGlobalArray); } $globalVariables = $snapshot->globalVariables(); foreach (array_keys($GLOBALS) as $key) { if ($key != 'GLOBALS' && !in_array($key, $superGlobalArrays) && !$snapshot->blacklist()->isGlobalVariableBlacklisted($key)) { if (isset($globalVariables[$key])) { $GLOBALS[$key] = $globalVariables[$key]; } else { unset($GLOBALS[$key]); } } } } /** * Restores all static attributes in user-defined classes from this snapshot. * * @param Snapshot $snapshot */ public function restoreStaticAttributes(Snapshot $snapshot) { $current = new Snapshot($snapshot->blacklist(), false, false, false, false, true, false, false, false, false); $newClasses = array_diff($current->classes(), $snapshot->classes()); unset($current); foreach ($snapshot->staticAttributes() as $className => $staticAttributes) { foreach ($staticAttributes as $name => $value) { $reflector = new ReflectionProperty($className, $name); $reflector->setAccessible(true); $reflector->setValue($value); } } foreach ($newClasses as $className) { $class = new \ReflectionClass($className); $defaults = $class->getDefaultProperties(); foreach ($class->getProperties() as $attribute) { if (!$attribute->isStatic()) { continue; } $name = $attribute->getName(); if ($snapshot->blacklist()->isStaticAttributeBlacklisted($className, $name)) { continue; } if (!isset($defaults[$name])) { continue; } $attribute->setAccessible(true); $attribute->setValue($defaults[$name]); } } } /** * Restores a super-global variable array from this snapshot. * * @param Snapshot $snapshot * @param $superGlobalArray */ private function restoreSuperGlobalArray(Snapshot $snapshot, $superGlobalArray) { $superGlobalVariables = $snapshot->superGlobalVariables(); if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray]) && isset($superGlobalVariables[$superGlobalArray])) { $keys = array_keys( array_merge( $GLOBALS[$superGlobalArray], $superGlobalVariables[$superGlobalArray] ) ); foreach ($keys as $key) { if (isset($superGlobalVariables[$superGlobalArray][$key])) { $GLOBALS[$superGlobalArray][$key] = $superGlobalVariables[$superGlobalArray][$key]; } else { unset($GLOBALS[$superGlobalArray][$key]); } } } } } PK!`(C!global-state/src/CodeExporter.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; /** * Exports parts of a Snapshot as PHP code. */ class CodeExporter { /** * @param Snapshot $snapshot * @return string */ public function constants(Snapshot $snapshot) { $result = ''; foreach ($snapshot->constants() as $name => $value) { $result .= sprintf( 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", $name, $name, $this->exportVariable($value) ); } return $result; } /** * @param Snapshot $snapshot * @return string */ public function iniSettings(Snapshot $snapshot) { $result = ''; foreach ($snapshot->iniSettings() as $key => $value) { $result .= sprintf( '@ini_set(%s, %s);' . "\n", $this->exportVariable($key), $this->exportVariable($value) ); } return $result; } /** * @param mixed $variable * @return string */ private function exportVariable($variable) { if (is_scalar($variable) || is_null($variable) || (is_array($variable) && $this->arrayOnlyContainsScalars($variable))) { return var_export($variable, true); } return 'unserialize(' . var_export(serialize($variable), true) . ')'; } /** * @param array $array * @return bool */ private function arrayOnlyContainsScalars(array $array) { $result = true; foreach ($array as $element) { if (is_array($element)) { $result = self::arrayOnlyContainsScalars($element); } elseif (!is_scalar($element) && !is_null($element)) { $result = false; } if ($result === false) { break; } } return $result; } } PK!脰S蒎%%global-state/src/Snapshot.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use ReflectionClass; use Serializable; /** * A snapshot of global state. */ class Snapshot { /** * @var Blacklist */ private $blacklist; /** * @var array */ private $globalVariables = array(); /** * @var array */ private $superGlobalArrays = array(); /** * @var array */ private $superGlobalVariables = array(); /** * @var array */ private $staticAttributes = array(); /** * @var array */ private $iniSettings = array(); /** * @var array */ private $includedFiles = array(); /** * @var array */ private $constants = array(); /** * @var array */ private $functions = array(); /** * @var array */ private $interfaces = array(); /** * @var array */ private $classes = array(); /** * @var array */ private $traits = array(); /** * Creates a snapshot of the current global state. * * @param Blacklist $blacklist * @param bool $includeGlobalVariables * @param bool $includeStaticAttributes * @param bool $includeConstants * @param bool $includeFunctions * @param bool $includeClasses * @param bool $includeInterfaces * @param bool $includeTraits * @param bool $includeIniSettings * @param bool $includeIncludedFiles */ public function __construct(Blacklist $blacklist = null, $includeGlobalVariables = true, $includeStaticAttributes = true, $includeConstants = true, $includeFunctions = true, $includeClasses = true, $includeInterfaces = true, $includeTraits = true, $includeIniSettings = true, $includeIncludedFiles = true) { if ($blacklist === null) { $blacklist = new Blacklist; } $this->blacklist = $blacklist; if ($includeConstants) { $this->snapshotConstants(); } if ($includeFunctions) { $this->snapshotFunctions(); } if ($includeClasses || $includeStaticAttributes) { $this->snapshotClasses(); } if ($includeInterfaces) { $this->snapshotInterfaces(); } if ($includeGlobalVariables) { $this->setupSuperGlobalArrays(); $this->snapshotGlobals(); } if ($includeStaticAttributes) { $this->snapshotStaticAttributes(); } if ($includeIniSettings) { $this->iniSettings = ini_get_all(null, false); } if ($includeIncludedFiles) { $this->includedFiles = get_included_files(); } if (function_exists('get_declared_traits')) { $this->traits = get_declared_traits(); } } /** * @return Blacklist */ public function blacklist() { return $this->blacklist; } /** * @return array */ public function globalVariables() { return $this->globalVariables; } /** * @return array */ public function superGlobalVariables() { return $this->superGlobalVariables; } /** * Returns a list of all super-global variable arrays. * * @return array */ public function superGlobalArrays() { return $this->superGlobalArrays; } /** * @return array */ public function staticAttributes() { return $this->staticAttributes; } /** * @return array */ public function iniSettings() { return $this->iniSettings; } /** * @return array */ public function includedFiles() { return $this->includedFiles; } /** * @return array */ public function constants() { return $this->constants; } /** * @return array */ public function functions() { return $this->functions; } /** * @return array */ public function interfaces() { return $this->interfaces; } /** * @return array */ public function classes() { return $this->classes; } /** * @return array */ public function traits() { return $this->traits; } /** * Creates a snapshot user-defined constants. */ private function snapshotConstants() { $constants = get_defined_constants(true); if (isset($constants['user'])) { $this->constants = $constants['user']; } } /** * Creates a snapshot user-defined functions. */ private function snapshotFunctions() { $functions = get_defined_functions(); $this->functions = $functions['user']; } /** * Creates a snapshot user-defined classes. */ private function snapshotClasses() { foreach (array_reverse(get_declared_classes()) as $className) { $class = new ReflectionClass($className); if (!$class->isUserDefined()) { break; } $this->classes[] = $className; } $this->classes = array_reverse($this->classes); } /** * Creates a snapshot user-defined interfaces. */ private function snapshotInterfaces() { foreach (array_reverse(get_declared_interfaces()) as $interfaceName) { $class = new ReflectionClass($interfaceName); if (!$class->isUserDefined()) { break; } $this->interfaces[] = $interfaceName; } $this->interfaces = array_reverse($this->interfaces); } /** * Creates a snapshot of all global and super-global variables. */ private function snapshotGlobals() { $superGlobalArrays = $this->superGlobalArrays(); foreach ($superGlobalArrays as $superGlobalArray) { $this->snapshotSuperGlobalArray($superGlobalArray); } foreach (array_keys($GLOBALS) as $key) { if ($key != 'GLOBALS' && !in_array($key, $superGlobalArrays) && $this->canBeSerialized($GLOBALS[$key]) && !$this->blacklist->isGlobalVariableBlacklisted($key)) { $this->globalVariables[$key] = unserialize(serialize($GLOBALS[$key])); } } } /** * Creates a snapshot a super-global variable array. * * @param $superGlobalArray */ private function snapshotSuperGlobalArray($superGlobalArray) { $this->superGlobalVariables[$superGlobalArray] = array(); if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { foreach ($GLOBALS[$superGlobalArray] as $key => $value) { $this->superGlobalVariables[$superGlobalArray][$key] = unserialize(serialize($value)); } } } /** * Creates a snapshot of all static attributes in user-defined classes. */ private function snapshotStaticAttributes() { foreach ($this->classes as $className) { $class = new ReflectionClass($className); $snapshot = array(); foreach ($class->getProperties() as $attribute) { if ($attribute->isStatic()) { $name = $attribute->getName(); if ($this->blacklist->isStaticAttributeBlacklisted($className, $name)) { continue; } $attribute->setAccessible(true); $value = $attribute->getValue(); if ($this->canBeSerialized($value)) { $snapshot[$name] = unserialize(serialize($value)); } } } if (!empty($snapshot)) { $this->staticAttributes[$className] = $snapshot; } } } /** * Returns a list of all super-global variable arrays. * * @return array */ private function setupSuperGlobalArrays() { $this->superGlobalArrays = array( '_ENV', '_POST', '_GET', '_COOKIE', '_SERVER', '_FILES', '_REQUEST' ); if (ini_get('register_long_arrays') == '1') { $this->superGlobalArrays = array_merge( $this->superGlobalArrays, array( 'HTTP_ENV_VARS', 'HTTP_POST_VARS', 'HTTP_GET_VARS', 'HTTP_COOKIE_VARS', 'HTTP_SERVER_VARS', 'HTTP_POST_FILES' ) ); } } /** * @param mixed $variable * @return bool * @todo Implement this properly */ private function canBeSerialized($variable) { if (!is_object($variable)) { return !is_resource($variable); } if ($variable instanceof \stdClass) { return true; } $class = new ReflectionClass($variable); do { if ($class->isInternal()) { return $variable instanceof Serializable; } } while ($class = $class->getParentClass()); return true; } } PK!p樆茊0global-state/src/exceptions/RuntimeException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; final class RuntimeException extends \RuntimeException implements Exception { } PK! pp)global-state/src/exceptions/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use Throwable; interface Exception extends Throwable { } PK! uglobal-state/build.xmlnu誌w洞 PK!凎%lGGglobal-state/.gitignorenu誌w洞.idea composer.lock composer.phar vendor/ cache.properties phpunit.xml PK!:object-reflector/phpunit.xmlnu刐迭 tests src PK!蓡object-reflector/README.mdnu刐迭[![Latest Stable Version](https://poser.pugx.org/sebastian/object-reflector/v/stable.png)](https://packagist.org/packages/sebastian/object-reflector) [![CI Status](https://github.com/sebastianbergmann/object-reflector/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/object-reflector/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/object-reflector/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/object-reflector) [![codecov](https://codecov.io/gh/sebastianbergmann/object-reflector/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/object-reflector) # sebastian/object-reflector Allows reflection of object properties, including inherited and private as well as protected ones. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/object-reflector ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/object-reflector ``` PK!R6object-reflector/LICENSEnu刐迭BSD 3-Clause License Copyright (c) 2017-2023, Sebastian Bergmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!H鴜.object-reflector/tests/ObjectReflectorTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace SebastianBergmann\ObjectReflector; use PHPUnit\Framework\TestCase; use SebastianBergmann\ObjectReflector\TestFixture\ChildClass; use SebastianBergmann\ObjectReflector\TestFixture\ClassWithIntegerAttributeName; /** * @covers SebastianBergmann\ObjectReflector\ObjectReflector */ class ObjectReflectorTest extends TestCase { /** * @var ObjectReflector */ private $objectReflector; protected function setUp()/*: void */ { $this->objectReflector = new ObjectReflector; } public function testReflectsAttributesOfObject()/*: void */ { $o = new ChildClass; $this->assertEquals( [ 'privateInChild' => 'private', 'protectedInChild' => 'protected', 'publicInChild' => 'public', 'undeclared' => 'undeclared', 'SebastianBergmann\ObjectReflector\TestFixture\ParentClass::privateInParent' => 'private', 'SebastianBergmann\ObjectReflector\TestFixture\ParentClass::protectedInParent' => 'protected', 'SebastianBergmann\ObjectReflector\TestFixture\ParentClass::publicInParent' => 'public', ], $this->objectReflector->getAttributes($o) ); } public function testReflectsAttributeWithIntegerName()/*: void */ { $o = new ClassWithIntegerAttributeName; $this->assertEquals( [ 1 => 2 ], $this->objectReflector->getAttributes($o) ); } public function testRaisesExceptionWhenPassedArgumentIsNotAnObject()/*: void */ { $this->expectException(InvalidArgumentException::class); $this->objectReflector->getAttributes(null); } } PK!滋熵/object-reflector/tests/_fixture/ParentClass.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace SebastianBergmann\ObjectReflector\TestFixture; class ParentClass { private $privateInParent = 'private'; private $protectedInParent = 'protected'; private $publicInParent = 'public'; } PK!镜辩AA.object-reflector/tests/_fixture/ChildClass.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace SebastianBergmann\ObjectReflector\TestFixture; class ChildClass extends ParentClass { private $privateInChild = 'private'; private $protectedInChild = 'protected'; private $publicInChild = 'public'; public function __construct() { $this->undeclared = 'undeclared'; } } PK!宛Aobject-reflector/tests/_fixture/ClassWithIntegerAttributeName.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace SebastianBergmann\ObjectReflector\TestFixture; class ClassWithIntegerAttributeName { public function __construct() { $i = 1; $this->$i = 2; } } PK! 蘼object-reflector/.travis.ymlnu刐迭language: php php: - 7.0 - 7.0snapshot - 7.1 - 7.1snapshot - master sudo: false before_install: - composer self-update - composer clear-cache install: - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest --optimize-autoloader --prefer-stable script: - ./vendor/bin/phpunit --coverage-clover=coverage.xml after_success: - bash <(curl -s https://codecov.io/bash) notifications: email: false PK!茶pobject-reflector/composer.jsonnu刐迭{ "name": "sebastian/object-reflector", "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "config": { "platform": { "php": "8.1.0" }, "optimize-autoloader": true, "sort-packages": true }, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture/" ] }, "extra": { "branch-alias": { "dev-main": "3.0-dev" } } } PK!哂 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'align_double_arrow' => true, 'align_equals' => true ], 'blank_line_after_namespace' => true, 'blank_line_before_return' => true, 'braces' => true, 'cast_spaces' => true, 'concat_space' => ['spacing' => 'one'], 'declare_strict_types' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, #'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'line_ending' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'method_argument_space' => true, 'no_alias_functions' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_closing_tag' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_consecutive_blank_lines' => true, 'no_leading_namespace_whitespace' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_whitespace' => true, 'no_unused_imports' => true, 'no_whitespace_in_blank_line' => true, 'phpdoc_align' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_types' => true, 'phpdoc_var_without_name' => true, 'self_accessor' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'ternary_operator_spaces' => true, 'trim_array_spaces' => true, 'visibility_required' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ->name('*.php') ); PK!綼荟object-reflector/ChangeLog.mdnu刐迭# Change Log All notable changes to `sebastianbergmann/object-reflector` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [3.0.0] - 2023-02-03 ### Changed * `ObjectReflector::getAttributes()` has been renamed to `ObjectReflector::getProperties()` ### Removed * This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 ## [2.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\ObjectReflector\Exception` now correctly extends `\Throwable` ## [2.0.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [2.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [2.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.0, PHP 7.1, and PHP 7.2 ## [1.1.1] - 2017-03-29 * Fixed [#1](https://github.com/sebastianbergmann/object-reflector/issues/1): Attributes with non-string names are not handled correctly ## [1.1.0] - 2017-03-16 ### Changed * Changed implementation of `ObjectReflector::getattributes()` to use `(array)` cast instead of `ReflectionObject` ## 1.0.0 - 2017-03-12 * Initial release [3.0.0]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.4...3.0.0 [2.0.4]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.3...2.0.4 [2.0.3]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.2...2.0.3 [2.0.2]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/object-reflector/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.1...2.0.0 [1.1.1]: https://github.com/sebastianbergmann/object-reflector/compare/1.1.0...1.1.1 [1.1.0]: https://github.com/sebastianbergmann/object-reflector/compare/1.0.0...1.1.0 PK!頄t(object-reflector/src/ObjectReflector.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectReflector; use function count; use function explode; final class ObjectReflector { /** * @psalm-return array */ public function getProperties(object $object): array { $properties = []; $className = $object::class; foreach ((array) $object as $name => $value) { $name = explode("\0", (string) $name); if (count($name) === 1) { $name = $name[0]; } elseif ($name[1] !== $className) { $name = $name[1] . '::' . $name[2]; } else { $name = $name[2]; } $properties[$name] = $value; } return $properties; } } PK! ^釴N"object-reflector/src/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace SebastianBergmann\ObjectReflector; interface Exception { } PK!Y腏1object-reflector/src/InvalidArgumentException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ declare(strict_types=1); namespace SebastianBergmann\ObjectReflector; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } PK!@C<object-reflector/build.xmlnu刐迭 PK!<--object-reflector/.gitignorenu刐迭/.idea /.php_cs.cache /composer.lock /vendor PK!|蠶sversion/README.mdnu誌w洞# Version **Version** is a library that helps with managing the version number of Git-hosted PHP projects. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/version If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/version ## Usage The constructor of the `SebastianBergmann\Version` class expects two parameters: * `$release` is the version number of the latest release (`X.Y.Z`, for instance) or the name of the release series (`X.Y`) when no release has been made from that branch / for that release series yet. * `$path` is the path to the directory (or a subdirectory thereof) where the sourcecode of the project can be found. Simply passing `__DIR__` here usually suffices. Apart from the constructor, the `SebastianBergmann\Version` class has a single public method: `getVersion()`. Here is a contrived example that shows the basic usage: getVersion()); ?> string(18) "3.7.10-17-g00f3408" When a new release is prepared, the string that is passed to the constructor as the first argument needs to be updated. ### How SebastianBergmann\Version::getVersion() works * If `$path` is not (part of) a Git repository and `$release` is in `X.Y.Z` format then `$release` is returned as-is. * If `$path` is not (part of) a Git repository and `$release` is in `X.Y` format then `$release` is returned suffixed with `-dev`. * If `$path` is (part of) a Git repository and `$release` is in `X.Y.Z` format then the output of `git describe --tags` is returned as-is. * If `$path` is (part of) a Git repository and `$release` is in `X.Y` format then a string is returned that begins with `X.Y` and ends with information from `git describe --tags`. PK!nversion/LICENSEnu誌w洞Version Copyright (c) 2013-2015, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!aversion/composer.jsonnu誌w洞{ "name": "sebastian/version", "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/version/issues" }, "require": { "php": ">=5.6" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } PK!倫oXversion/.php_csnu誌w洞files() ->in('src') ->name('*.php'); return Symfony\CS\Config\Config::create() ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) ->fixers( array( 'align_double_arrow', 'align_equals', 'braces', 'concat_with_spaces', 'duplicate_semicolon', 'elseif', 'empty_return', 'encoding', 'eof_ending', 'extra_empty_lines', 'function_call_space', 'function_declaration', 'indentation', 'join_function', 'line_after_namespace', 'linefeed', 'list_commas', 'lowercase_constants', 'lowercase_keywords', 'method_argument_space', 'multiple_use', 'namespace_no_leading_whitespace', 'no_blank_lines_after_class_opening', 'no_empty_lines_after_phpdocs', 'parenthesis', 'php_closing_tag', 'phpdoc_indent', 'phpdoc_no_access', 'phpdoc_no_empty_return', 'phpdoc_no_package', 'phpdoc_params', 'phpdoc_scalar', 'phpdoc_separation', 'phpdoc_to_comment', 'phpdoc_trim', 'phpdoc_types', 'phpdoc_var_without_name', 'remove_lines_between_uses', 'return', 'self_accessor', 'short_array_syntax', 'short_tag', 'single_line_after_imports', 'single_quote', 'spaces_before_semicolon', 'spaces_cast', 'ternary_spaces', 'trailing_spaces', 'trim_array_spaces', 'unused_use', 'visibility', 'whitespacy_lines' ) ) ->finder($finder); PK!N\潜version/src/Version.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann; /** * @since Class available since Release 1.0.0 */ class Version { /** * @var string */ private $path; /** * @var string */ private $release; /** * @var string */ private $version; /** * @param string $release * @param string $path */ public function __construct($release, $path) { $this->release = $release; $this->path = $path; } /** * @return string */ public function getVersion() { if ($this->version === null) { if (count(explode('.', $this->release)) == 3) { $this->version = $this->release; } else { $this->version = $this->release . '-dev'; } $git = $this->getGitInformation($this->path); if ($git) { if (count(explode('.', $this->release)) == 3) { $this->version = $git; } else { $git = explode('-', $git); $this->version = $this->release . '-' . end($git); } } } return $this->version; } /** * @param string $path * * @return bool|string */ private function getGitInformation($path) { if (!is_dir($path . DIRECTORY_SEPARATOR . '.git')) { return false; } $process = proc_open( 'git describe --tags', [ 1 => ['pipe', 'w'], 2 => ['pipe', 'w'], ], $pipes, $path ); if (!is_resource($process)) { return false; } $result = trim(stream_get_contents($pipes[1])); fclose($pipes[1]); fclose($pipes[2]); $returnCode = proc_close($process); if ($returnCode !== 0) { return false; } return $result; } } PK!rsXversion/.gitattributesnu誌w洞*.php diff=php PK!=vkversion/.gitignorenu誌w洞/.idea PK!饊存object-enumerator/phpunit.xmlnu誌w洞 tests src PK!ぢ5object-enumerator/README.mdnu誌w洞# Object Enumerator Traverses array structures and object graphs to enumerate all referenced objects. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/object-enumerator If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/object-enumerator PK!峐剈  object-enumerator/LICENSEnu誌w洞Object Enumerator Copyright (c) 2016, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!0" *object-enumerator/tests/EnumeratorTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator; use SebastianBergmann\ObjectEnumerator\Fixtures\ExceptionThrower; /** * @covers SebastianBergmann\ObjectEnumerator\Enumerator */ class EnumeratorTest extends \PHPUnit_Framework_TestCase { /** * @var Enumerator */ private $enumerator; protected function setUp() { $this->enumerator = new Enumerator; } public function testEnumeratesSingleObject() { $a = new \stdClass; $objects = $this->enumerator->enumerate($a); $this->assertCount(1, $objects); $this->assertSame($a, $objects[0]); } public function testEnumeratesArrayWithSingleObject() { $a = new \stdClass; $objects = $this->enumerator->enumerate([$a]); $this->assertCount(1, $objects); $this->assertSame($a, $objects[0]); } public function testEnumeratesArrayWithTwoReferencesToTheSameObject() { $a = new \stdClass; $objects = $this->enumerator->enumerate([$a, $a]); $this->assertCount(1, $objects); $this->assertSame($a, $objects[0]); } public function testEnumeratesArrayOfObjects() { $a = new \stdClass; $b = new \stdClass; $objects = $this->enumerator->enumerate([$a, $b, null]); $this->assertCount(2, $objects); $this->assertSame($a, $objects[0]); $this->assertSame($b, $objects[1]); } public function testEnumeratesObjectWithAggregatedObject() { $a = new \stdClass; $b = new \stdClass; $a->b = $b; $a->c = null; $objects = $this->enumerator->enumerate($a); $this->assertCount(2, $objects); $this->assertSame($a, $objects[0]); $this->assertSame($b, $objects[1]); } public function testEnumeratesObjectWithAggregatedObjectsInArray() { $a = new \stdClass; $b = new \stdClass; $a->b = [$b]; $objects = $this->enumerator->enumerate($a); $this->assertCount(2, $objects); $this->assertSame($a, $objects[0]); $this->assertSame($b, $objects[1]); } public function testEnumeratesObjectsWithCyclicReferences() { $a = new \stdClass; $b = new \stdClass; $a->b = $b; $b->a = $a; $objects = $this->enumerator->enumerate([$a, $b]); $this->assertCount(2, $objects); $this->assertSame($a, $objects[0]); $this->assertSame($b, $objects[1]); } public function testEnumeratesClassThatThrowsException() { $thrower = new ExceptionThrower(); $objects = $this->enumerator->enumerate($thrower); $this->assertSame($thrower, $objects[0]); } public function testExceptionIsRaisedForInvalidArgument() { $this->setExpectedException(InvalidArgumentException::class); $this->enumerator->enumerate(null); } public function testExceptionIsRaisedForInvalidArgument2() { $this->setExpectedException(InvalidArgumentException::class); $this->enumerator->enumerate([], ''); } } PK!$I5object-enumerator/tests/_fixture/ExceptionThrower.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator\Fixtures; use RuntimeException; class ExceptionThrower { private $property; public function __construct() { unset($this->property); } public function __get($property) { throw new RuntimeException; } } PK!=5.6", "sebastian/recursion-context": "~2.0" }, "require-dev": { "phpunit/phpunit": "~5" }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/" ] }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } PK!Tobject-enumerator/.php_csnu誌w洞files() ->in('src') ->in('tests') ->name('*.php'); return Symfony\CS\Config\Config::create() ->level(\Symfony\CS\FixerInterface::NONE_LEVEL) ->fixers( array( 'align_double_arrow', 'align_equals', 'braces', 'concat_with_spaces', 'duplicate_semicolon', 'elseif', 'empty_return', 'encoding', 'eof_ending', 'extra_empty_lines', 'function_call_space', 'function_declaration', 'indentation', 'join_function', 'line_after_namespace', 'linefeed', 'list_commas', 'lowercase_constants', 'lowercase_keywords', 'method_argument_space', 'multiple_use', 'namespace_no_leading_whitespace', 'no_blank_lines_after_class_opening', 'no_empty_lines_after_phpdocs', 'parenthesis', 'php_closing_tag', 'phpdoc_indent', 'phpdoc_no_access', 'phpdoc_no_empty_return', 'phpdoc_no_package', 'phpdoc_params', 'phpdoc_scalar', 'phpdoc_separation', 'phpdoc_to_comment', 'phpdoc_trim', 'phpdoc_types', 'phpdoc_var_without_name', 'remove_lines_between_uses', 'return', 'self_accessor', 'short_array_syntax', 'short_tag', 'single_line_after_imports', 'single_quote', 'spaces_before_semicolon', 'spaces_cast', 'ternary_spaces', 'trailing_spaces', 'trim_array_spaces', 'unused_use', 'visibility', 'whitespacy_lines' ) ) ->finder($finder); PK!2z>object-enumerator/ChangeLog.mdnu誌w洞# Change Log All notable changes to `sebastianbergmann/object-enumerator` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [2.0.1] - 2017-02-18 ### Fixed * Fixed [#2](https://github.com/sebastianbergmann/phpunit/pull/2): Exceptions in `ReflectionProperty::getValue()` are not handled ## [2.0.0] - 2016-11-19 ### Changed * This component is now compatible with `sebastian/recursion-context: ~1.0.4` ## 1.0.0 - 2016-02-04 ### Added * Initial release [2.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/1.0...2.0.0 PK!n$*a66#object-enumerator/src/Exception.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator; interface Exception { } PK!濢'韝x2object-enumerator/src/InvalidArgumentException.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator; class InvalidArgumentException extends \InvalidArgumentException implements Exception { } PK!Q $k k $object-enumerator/src/Enumerator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator; use SebastianBergmann\RecursionContext\Context; /** * Traverses array structures and object graphs * to enumerate all referenced objects. */ class Enumerator { /** * Returns an array of all objects referenced either * directly or indirectly by a variable. * * @param array|object $variable * * @return object[] */ public function enumerate($variable) { if (!is_array($variable) && !is_object($variable)) { throw new InvalidArgumentException; } if (isset(func_get_args()[1])) { if (!func_get_args()[1] instanceof Context) { throw new InvalidArgumentException; } $processed = func_get_args()[1]; } else { $processed = new Context; } $objects = []; if ($processed->contains($variable)) { return $objects; } $array = $variable; $processed->add($variable); if (is_array($variable)) { foreach ($array as $element) { if (!is_array($element) && !is_object($element)) { continue; } $objects = array_merge( $objects, $this->enumerate($element, $processed) ); } } else { $objects[] = $variable; $reflector = new \ReflectionObject($variable); foreach ($reflector->getProperties() as $attribute) { $attribute->setAccessible(true); try { $value = $attribute->getValue($variable); } catch (\Throwable $e) { continue; } catch (\Exception $e) { continue; } if (!is_array($value) && !is_object($value)) { continue; } $objects = array_merge( $objects, $this->enumerate($value, $processed) ); } } return $objects; } } PK!E溬韀[object-enumerator/build.xmlnu誌w洞 PK!5h=eeobject-enumerator/.gitignorenu誌w洞.idea composer.lock composer.phar vendor/ cache.properties build/LICENSE build/README.md build/*.tgz PK!+斜曟environment/phpunit.xmlnu誌w洞 tests src PK!}Lenvironment/README.mdnu誌w洞# Environment This component provides functionality that helps writing PHP code that has runtime-specific (PHP / HHVM) execution paths. [![Latest Stable Version](https://poser.pugx.org/sebastian/environment/v/stable.png)](https://packagist.org/packages/sebastian/environment) [![Build Status](https://travis-ci.org/sebastianbergmann/environment.png?branch=master)](https://travis-ci.org/sebastianbergmann/environment) ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): composer require sebastian/environment If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: composer require --dev sebastian/environment ## Usage ```php getNameWithVersion()); var_dump($runtime->getName()); var_dump($runtime->getVersion()); var_dump($runtime->getBinary()); var_dump($runtime->isHHVM()); var_dump($runtime->isPHP()); var_dump($runtime->hasXdebug()); var_dump($runtime->canCollectCodeCoverage()); ``` ### Output on PHP $ php --version PHP 5.5.8 (cli) (built: Jan 9 2014 08:33:30) Copyright (c) 1997-2013 The PHP Group Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans $ php example.php string(9) "PHP 5.5.8" string(3) "PHP" string(5) "5.5.8" string(14) "'/usr/bin/php'" bool(false) bool(true) bool(true) bool(true) ### Output on HHVM $ hhvm --version HipHop VM 2.4.0-dev (rel) Compiler: heads/master-0-ga98e57cabee7e7f0d14493ab17d5c7ab0157eb98 Repo schema: 8d6e69287c41c1f09bb4d327421720d1922cfc67 $ hhvm example.php string(14) "HHVM 2.4.0-dev" string(4) "HHVM" string(9) "2.4.0-dev" string(42) "'/usr/local/src/hhvm/hphp/hhvm/hhvm' --php" bool(true) bool(false) bool(false) bool(true) PK!额徇  environment/LICENSEnu誌w洞Environment Copyright (c) 2014-2015, Sebastian Bergmann . All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Sebastian Bergmann nor the names of his contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!&祜)environment/tests/OperatingSystemTest.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use PHPUnit\Framework\TestCase; /** * @covers \SebastianBergmann\Environment\OperatingSystem */ final class OperatingSystemTest extends TestCase { /** * @var \SebastianBergmann\Environment\OperatingSystem */ private $os; protected function setUp(): void { $this->os = new OperatingSystem; } /** * @requires OS Linux */ public function testFamilyCanBeRetrieved(): void { $this->assertEquals('Linux', $this->os->getFamily()); } /** * @requires OS Darwin */ public function testFamilyReturnsDarwinWhenRunningOnDarwin(): void { $this->assertEquals('Darwin', $this->os->getFamily()); } /** * @requires OS Windows */ public function testGetFamilyReturnsWindowsWhenRunningOnWindows(): void { $this->assertSame('Windows', $this->os->getFamily()); } /** * @requires PHP 7.2.0 */ public function testGetFamilyReturnsPhpOsFamilyWhenRunningOnPhp72AndGreater(): void { $this->assertSame(\PHP_OS_FAMILY, $this->os->getFamily()); } } PK!涒茹zz!environment/tests/ConsoleTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use PHPUnit_Framework_TestCase; class ConsoleTest extends PHPUnit_Framework_TestCase { /** * @var \SebastianBergmann\Environment\Console */ private $console; protected function setUp() { $this->console = new Console; } /** * @covers \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectIfStdoutIsInteractiveByDefault() { $this->assertInternalType('boolean', $this->console->isInteractive()); } /** * @covers \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectIfFileDescriptorIsInteractive() { $this->assertInternalType('boolean', $this->console->isInteractive(STDOUT)); } /** * @covers \SebastianBergmann\Environment\Console::hasColorSupport * * @uses \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectColorSupport() { $this->assertInternalType('boolean', $this->console->hasColorSupport()); } /** * @covers \SebastianBergmann\Environment\Console::getNumberOfColumns * * @uses \SebastianBergmann\Environment\Console::isInteractive */ public function testCanDetectNumberOfColumns() { $this->assertInternalType('integer', $this->console->getNumberOfColumns()); } } PK!捻|謃 _ !environment/tests/RuntimeTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; use PHPUnit_Framework_TestCase; class RuntimeTest extends PHPUnit_Framework_TestCase { /** * @var \SebastianBergmann\Environment\Runtime */ private $env; protected function setUp() { $this->env = new Runtime; } /** * @covers \SebastianBergmann\Environment\Runtime::canCollectCodeCoverage * * @uses \SebastianBergmann\Environment\Runtime::hasXdebug * @uses \SebastianBergmann\Environment\Runtime::isHHVM * @uses \SebastianBergmann\Environment\Runtime::isPHP */ public function testAbilityToCollectCodeCoverageCanBeAssessed() { $this->assertInternalType('boolean', $this->env->canCollectCodeCoverage()); } /** * @covers \SebastianBergmann\Environment\Runtime::getBinary * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testBinaryCanBeRetrieved() { $this->assertInternalType('string', $this->env->getBinary()); } /** * @covers \SebastianBergmann\Environment\Runtime::isHHVM */ public function testCanBeDetected() { $this->assertInternalType('boolean', $this->env->isHHVM()); } /** * @covers \SebastianBergmann\Environment\Runtime::isPHP * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testCanBeDetected2() { $this->assertInternalType('boolean', $this->env->isPHP()); } /** * @covers \SebastianBergmann\Environment\Runtime::hasXdebug * * @uses \SebastianBergmann\Environment\Runtime::isHHVM * @uses \SebastianBergmann\Environment\Runtime::isPHP */ public function testXdebugCanBeDetected() { $this->assertInternalType('boolean', $this->env->hasXdebug()); } /** * @covers \SebastianBergmann\Environment\Runtime::getNameWithVersion * * @uses \SebastianBergmann\Environment\Runtime::getName * @uses \SebastianBergmann\Environment\Runtime::getVersion * @uses \SebastianBergmann\Environment\Runtime::isHHVM * @uses \SebastianBergmann\Environment\Runtime::isPHP */ public function testNameAndVersionCanBeRetrieved() { $this->assertInternalType('string', $this->env->getNameWithVersion()); } /** * @covers \SebastianBergmann\Environment\Runtime::getName * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testNameCanBeRetrieved() { $this->assertInternalType('string', $this->env->getName()); } /** * @covers \SebastianBergmann\Environment\Runtime::getVersion * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testVersionCanBeRetrieved() { $this->assertInternalType('string', $this->env->getVersion()); } /** * @covers \SebastianBergmann\Environment\Runtime::getVendorUrl * * @uses \SebastianBergmann\Environment\Runtime::isHHVM */ public function testVendorUrlCanBeRetrieved() { $this->assertInternalType('string', $this->env->getVendorUrl()); } } PK!.瞈environment/.travis.ymlnu誌w洞language: php sudo: false before_install: - composer self-update install: - travis_retry composer install --no-interaction --prefer-source php: - 5.6 - hhvm notifications: email: false PK!Wl巷bbenvironment/.php_cs.distnu刐迭 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'align_multiline_comment' => true, 'array_indentation' => true, 'array_syntax' => ['syntax' => 'short'], 'binary_operator_spaces' => [ 'operators' => [ '=' => 'align', '=>' => 'align', ], ], 'blank_line_after_namespace' => true, 'blank_line_before_statement' => [ 'statements' => [ 'break', 'continue', 'declare', 'do', 'for', 'foreach', 'if', 'include', 'include_once', 'require', 'require_once', 'return', 'switch', 'throw', 'try', 'while', 'yield', ], ], 'braces' => true, 'cast_spaces' => true, 'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], 'combine_consecutive_issets' => true, 'combine_consecutive_unsets' => true, 'combine_nested_dirname' => true, 'compact_nullable_typehint' => true, 'concat_space' => ['spacing' => 'one'], 'declare_equal_normalize' => ['space' => 'none'], 'declare_strict_types' => true, 'dir_constant' => true, 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'is_null' => true, 'line_ending' => true, 'list_syntax' => ['syntax' => 'short'], 'logical_operators' => true, 'lowercase_cast' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'lowercase_static_reference' => true, 'magic_constant_casing' => true, 'method_argument_space' => ['ensure_fully_multiline' => true], 'modernize_types_casting' => true, 'multiline_comment_opening_closing' => true, 'multiline_whitespace_before_semicolons' => true, 'native_constant_invocation' => true, 'native_function_casing' => true, 'native_function_invocation' => true, 'new_with_braces' => false, 'no_alias_functions' => true, 'no_alternative_syntax' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_blank_lines_before_namespace' => true, 'no_closing_tag' => true, 'no_empty_comment' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_blank_lines' => true, 'no_homoglyph_names' => true, 'no_leading_import_slash' => true, 'no_leading_namespace_whitespace' => true, 'no_mixed_echo_print' => ['use' => 'print'], 'no_multiline_whitespace_around_double_arrow' => true, 'no_null_property_initialization' => true, 'no_php4_constructor' => true, 'no_short_bool_cast' => true, 'no_short_echo_tag' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_superfluous_elseif' => true, 'no_superfluous_phpdoc_tags' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_comma_in_singleline_array' => true, 'no_trailing_whitespace' => true, 'no_trailing_whitespace_in_comment' => true, 'no_unneeded_control_parentheses' => true, 'no_unneeded_curly_braces' => true, 'no_unneeded_final_method' => true, 'no_unreachable_default_argument_value' => true, 'no_unset_on_property' => true, 'no_unused_imports' => true, 'no_useless_else' => true, 'no_useless_return' => true, 'no_whitespace_before_comma_in_array' => true, 'no_whitespace_in_blank_line' => true, 'non_printable_character' => true, 'normalize_index_brace' => true, 'object_operator_without_whitespace' => true, 'ordered_class_elements' => [ 'order' => [ 'use_trait', 'constant_public', 'constant_protected', 'constant_private', 'property_public_static', 'property_protected_static', 'property_private_static', 'property_public', 'property_protected', 'property_private', 'method_public_static', 'construct', 'destruct', 'magic', 'phpunit', 'method_public', 'method_protected', 'method_private', 'method_protected_static', 'method_private_static', ], ], 'ordered_imports' => true, 'phpdoc_add_missing_param_annotation' => true, 'phpdoc_align' => true, 'phpdoc_annotation_without_dot' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_order' => true, 'phpdoc_return_self_reference' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_single_line_var_spacing' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_trim_consecutive_blank_line_separation' => true, 'phpdoc_types' => true, 'phpdoc_types_order' => true, 'phpdoc_var_without_name' => true, 'pow_to_exponentiation' => true, 'protected_to_private' => true, 'random_api_migration' => true, 'return_assignment' => true, 'return_type_declaration' => ['space_before' => 'none'], 'self_accessor' => true, 'semicolon_after_instruction' => true, 'set_type_to_cast' => true, 'short_scalar_cast' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'standardize_not_equals' => true, 'ternary_to_null_coalescing' => true, 'trailing_comma_in_multiline_array' => true, 'trim_array_spaces' => true, 'unary_operator_spaces' => true, 'visibility_required' => [ 'elements' => [ 'const', 'method', 'property', ], ], 'void_return' => true, 'whitespace_after_comma_in_array' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ); PK!聹environment/composer.jsonnu誌w洞{ "name": "sebastian/environment", "description": "Provides functionality to handle HHVM/PHP environments", "keywords": ["environment","hhvm","xdebug"], "homepage": "http://www.github.com/sebastianbergmann/environment", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" } ], "prefer-stable": true, "require": { "php": "^5.6 || ^7.0" }, "require-dev": { "phpunit/phpunit": "^5.0" }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-master": "2.0.x-dev" } } } PK!么environment/.github/FUNDING.ymlnu刐迭github: sebastianbergmann PK!W簛  environment/ChangeLog.mdnu刐迭# Changes in sebastianbergmann/environment All notable changes in `sebastianbergmann/environment` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [6.1.0] - 2024-03-23 ### Added * [#72](https://github.com/sebastianbergmann/environment/pull/72): `Runtime::getRawBinary()` ## [6.0.1] - 2023-04-11 ### Fixed * [#68](https://github.com/sebastianbergmann/environment/pull/68): The Just-in-Time compiler is disabled when `opcache.jit_buffer_size` is set to `0` * [#70](https://github.com/sebastianbergmann/environment/pull/70): The first `0` of `opcache.jit` only disables CPU-specific optimizations, not the Just-in-Time compiler itself ## [6.0.0] - 2023-02-03 ### Removed * Removed `SebastianBergmann\Environment\OperatingSystem::getFamily()` because this component is no longer supported on PHP versions that do not have `PHP_OS_FAMILY` * Removed `SebastianBergmann\Environment\Runtime::isHHVM()` * This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 ## [5.1.5] - 2022-MM-DD ### Fixed * [#59](https://github.com/sebastianbergmann/environment/issues/59): Wrong usage of `stream_isatty()`, `fstat()` used without checking whether the function is available ## [5.1.4] - 2022-04-03 ### Fixed * [#63](https://github.com/sebastianbergmann/environment/pull/63): `Runtime::getCurrentSettings()` does not correctly process INI settings ## [5.1.3] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [5.1.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [5.1.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [5.1.0] - 2020-04-14 ### Added * `Runtime::performsJustInTimeCompilation()` returns `true` if PHP 8's JIT is active, `false` otherwise ## [5.0.2] - 2020-03-31 ### Fixed * [#55](https://github.com/sebastianbergmann/environment/issues/55): `stty` command is executed even if no tty is available ## [5.0.1] - 2020-02-19 ### Changed * `Runtime::getNameWithVersionAndCodeCoverageDriver()` now prioritizes PCOV over Xdebug when both extensions are loaded (just like php-code-coverage does) ## [5.0.0] - 2020-02-07 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 ## [4.2.3] - 2019-11-20 ### Changed * [#50](https://github.com/sebastianbergmann/environment/pull/50): Windows improvements to console capabilities ### Fixed * [#49](https://github.com/sebastianbergmann/environment/issues/49): Detection how OpCache handles docblocks does not work correctly when PHPDBG is used ## [4.2.2] - 2019-05-05 ### Fixed * [#44](https://github.com/sebastianbergmann/environment/pull/44): `TypeError` in `Console::getNumberOfColumnsInteractive()` ## [4.2.1] - 2019-04-25 ### Fixed * Fixed an issue in `Runtime::getCurrentSettings()` ## [4.2.0] - 2019-04-25 ### Added * [#36](https://github.com/sebastianbergmann/environment/pull/36): `Runtime::getCurrentSettings()` ## [4.1.0] - 2019-02-01 ### Added * Implemented `Runtime::getNameWithVersionAndCodeCoverageDriver()` method * [#34](https://github.com/sebastianbergmann/environment/pull/34): Support for PCOV extension ## [4.0.2] - 2019-01-28 ### Fixed * [#33](https://github.com/sebastianbergmann/environment/issues/33): `Runtime::discardsComments()` returns true too eagerly ### Removed * Removed support for Zend Optimizer+ in `Runtime::discardsComments()` ## [4.0.1] - 2018-11-25 ### Fixed * [#31](https://github.com/sebastianbergmann/environment/issues/31): Regressions in `Console` class ## [4.0.0] - 2018-10-23 [YANKED] ### Fixed * [#25](https://github.com/sebastianbergmann/environment/pull/25): `Console::hasColorSupport()` does not work on Windows ### Removed * This component is no longer supported on PHP 7.0 ## [3.1.0] - 2017-07-01 ### Added * [#21](https://github.com/sebastianbergmann/environment/issues/21): Equivalent of `PHP_OS_FAMILY` (for PHP < 7.2) ## [3.0.4] - 2017-06-20 ### Fixed * [#20](https://github.com/sebastianbergmann/environment/pull/20): PHP 7 mode of HHVM not forced ## [3.0.3] - 2017-05-18 ### Fixed * [#18](https://github.com/sebastianbergmann/environment/issues/18): `Uncaught TypeError: preg_match() expects parameter 2 to be string, null given` ## [3.0.2] - 2017-04-21 ### Fixed * [#17](https://github.com/sebastianbergmann/environment/issues/17): `Uncaught TypeError: trim() expects parameter 1 to be string, boolean given` ## [3.0.1] - 2017-04-21 ### Fixed * Fixed inverted logic in `Runtime::discardsComments()` ## [3.0.0] - 2017-04-21 ### Added * Implemented `Runtime::discardsComments()` for querying whether the PHP runtime discards annotations ### Removed * This component is no longer supported on PHP 5.6 [6.1.0]: https://github.com/sebastianbergmann/environment/compare/6.0.1...6.1.0 [6.0.1]: https://github.com/sebastianbergmann/environment/compare/6.0.0...6.0.1 [6.0.0]: https://github.com/sebastianbergmann/environment/compare/5.1.5...6.0.0 [5.1.5]: https://github.com/sebastianbergmann/environment/compare/5.1.4...5.1.5 [5.1.4]: https://github.com/sebastianbergmann/environment/compare/5.1.3...5.1.4 [5.1.3]: https://github.com/sebastianbergmann/environment/compare/5.1.2...5.1.3 [5.1.2]: https://github.com/sebastianbergmann/environment/compare/5.1.1...5.1.2 [5.1.1]: https://github.com/sebastianbergmann/environment/compare/5.1.0...5.1.1 [5.1.0]: https://github.com/sebastianbergmann/environment/compare/5.0.2...5.1.0 [5.0.2]: https://github.com/sebastianbergmann/environment/compare/5.0.1...5.0.2 [5.0.1]: https://github.com/sebastianbergmann/environment/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/environment/compare/4.2.3...5.0.0 [4.2.3]: https://github.com/sebastianbergmann/environment/compare/4.2.2...4.2.3 [4.2.2]: https://github.com/sebastianbergmann/environment/compare/4.2.1...4.2.2 [4.2.1]: https://github.com/sebastianbergmann/environment/compare/4.2.0...4.2.1 [4.2.0]: https://github.com/sebastianbergmann/environment/compare/4.1.0...4.2.0 [4.1.0]: https://github.com/sebastianbergmann/environment/compare/4.0.2...4.1.0 [4.0.2]: https://github.com/sebastianbergmann/environment/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/environment/compare/66691f8e2dc4641909166b275a9a4f45c0e89092...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/environment/compare/3.1.0...66691f8e2dc4641909166b275a9a4f45c0e89092 [3.1.0]: https://github.com/sebastianbergmann/environment/compare/3.0...3.1.0 [3.0.4]: https://github.com/sebastianbergmann/environment/compare/3.0.3...3.0.4 [3.0.3]: https://github.com/sebastianbergmann/environment/compare/3.0.2...3.0.3 [3.0.2]: https://github.com/sebastianbergmann/environment/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/environment/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/environment/compare/2.0...3.0.0 PK!O< zzenvironment/src/Runtime.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; /** * Utility class for HHVM/PHP environment handling. */ class Runtime { /** * @var string */ private static $binary; /** * Returns true when Xdebug is supported or * the runtime used is PHPDBG (PHP >= 7.0). * * @return bool */ public function canCollectCodeCoverage() { return $this->hasXdebug() || $this->hasPHPDBGCodeCoverage(); } /** * Returns the path to the binary of the current runtime. * Appends ' --php' to the path when the runtime is HHVM. * * @return string */ public function getBinary() { // HHVM if (self::$binary === null && $this->isHHVM()) { if ((self::$binary = getenv('PHP_BINARY')) === false) { self::$binary = PHP_BINARY; } self::$binary = escapeshellarg(self::$binary) . ' --php'; } // PHP >= 5.4.0 if (self::$binary === null && defined('PHP_BINARY')) { if (PHP_BINARY !== '') { self::$binary = escapeshellarg(PHP_BINARY); } } // PHP < 5.4.0 if (self::$binary === null) { if (PHP_SAPI == 'cli' && isset($_SERVER['_'])) { if (strpos($_SERVER['_'], 'phpunit') !== false) { $file = file($_SERVER['_']); if (strpos($file[0], ' ') !== false) { $tmp = explode(' ', $file[0]); self::$binary = escapeshellarg(trim($tmp[1])); } else { self::$binary = escapeshellarg(ltrim(trim($file[0]), '#!')); } } elseif (strpos(basename($_SERVER['_']), 'php') !== false) { self::$binary = escapeshellarg($_SERVER['_']); } } } if (self::$binary === null) { $possibleBinaryLocations = [ PHP_BINDIR . '/php', PHP_BINDIR . '/php-cli.exe', PHP_BINDIR . '/php.exe' ]; foreach ($possibleBinaryLocations as $binary) { if (is_readable($binary)) { self::$binary = escapeshellarg($binary); break; } } } if (self::$binary === null) { self::$binary = 'php'; } return self::$binary; } /** * @return string */ public function getNameWithVersion() { return $this->getName() . ' ' . $this->getVersion(); } /** * @return string */ public function getName() { if ($this->isHHVM()) { return 'HHVM'; } elseif ($this->isPHPDBG()) { return 'PHPDBG'; } else { return 'PHP'; } } /** * @return string */ public function getVendorUrl() { if ($this->isHHVM()) { return 'http://hhvm.com/'; } else { return 'https://secure.php.net/'; } } /** * @return string */ public function getVersion() { if ($this->isHHVM()) { return HHVM_VERSION; } else { return PHP_VERSION; } } /** * Returns true when the runtime used is PHP and Xdebug is loaded. * * @return bool */ public function hasXdebug() { return ($this->isPHP() || $this->isHHVM()) && extension_loaded('xdebug'); } /** * Returns true when the runtime used is HHVM. * * @return bool */ public function isHHVM() { return defined('HHVM_VERSION'); } /** * Returns true when the runtime used is PHP without the PHPDBG SAPI. * * @return bool */ public function isPHP() { return !$this->isHHVM() && !$this->isPHPDBG(); } /** * Returns true when the runtime used is PHP with the PHPDBG SAPI. * * @return bool */ public function isPHPDBG() { return PHP_SAPI === 'phpdbg' && !$this->isHHVM(); } /** * Returns true when the runtime used is PHP with the PHPDBG SAPI * and the phpdbg_*_oplog() functions are available (PHP >= 7.0). * * @return bool */ public function hasPHPDBGCodeCoverage() { return $this->isPHPDBG() && function_exists('phpdbg_start_oplog'); } } PK!ー珨#environment/src/OperatingSystem.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; final class OperatingSystem { /** * Returns PHP_OS_FAMILY (if defined (which it is on PHP >= 7.2)). * Returns a string (compatible with PHP_OS_FAMILY) derived from PHP_OS otherwise. */ public function getFamily(): string { if (\defined('PHP_OS_FAMILY')) { return \PHP_OS_FAMILY; } if (\DIRECTORY_SEPARATOR === '\\') { return 'Windows'; } switch (\PHP_OS) { case 'Darwin': return 'Darwin'; case 'DragonFly': case 'FreeBSD': case 'NetBSD': case 'OpenBSD': return 'BSD'; case 'Linux': return 'Linux'; case 'SunOS': return 'Solaris'; default: return 'Unknown'; } } } PK!鬎 environment/src/Console.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Environment; /** */ class Console { const STDIN = 0; const STDOUT = 1; const STDERR = 2; /** * Returns true if STDOUT supports colorization. * * This code has been copied and adapted from * Symfony\Component\Console\Output\OutputStream. * * @return bool */ public function hasColorSupport() { if (DIRECTORY_SEPARATOR == '\\') { return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI') || 'xterm' === getenv('TERM'); } if (!defined('STDOUT')) { return false; } return $this->isInteractive(STDOUT); } /** * Returns the number of columns of the terminal. * * @return int */ public function getNumberOfColumns() { if (DIRECTORY_SEPARATOR == '\\') { $columns = 80; if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) { $columns = $matches[1]; } elseif (function_exists('proc_open')) { $process = proc_open( 'mode CON', [ 1 => ['pipe', 'w'], 2 => ['pipe', 'w'] ], $pipes, null, null, ['suppress_errors' => true] ); if (is_resource($process)) { $info = stream_get_contents($pipes[1]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { $columns = $matches[2]; } } } return $columns - 1; } if (!$this->isInteractive(self::STDIN)) { return 80; } if (function_exists('shell_exec') && preg_match('#\d+ (\d+)#', shell_exec('stty size'), $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } } if (function_exists('shell_exec') && preg_match('#columns = (\d+);#', shell_exec('stty'), $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } } return 80; } /** * Returns if the file descriptor is an interactive terminal or not. * * @param int|resource $fileDescriptor * * @return bool */ public function isInteractive($fileDescriptor = self::STDOUT) { return function_exists('posix_isatty') && @posix_isatty($fileDescriptor); } } PK!祳 ,,environment/build.xmlnu誌w洞 PK!缮驃--environment/.gitignorenu誌w洞/.idea /vendor /composer.lock /composer.phar PK!2饃2diff/tests/LCS/TimeEfficientImplementationTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\LCS; /** * @covers SebastianBergmann\Diff\LCS\TimeEfficientImplementation */ class TimeEfficientImplementationTest extends LongestCommonSubsequenceTest { protected function createImplementation() { return new TimeEfficientImplementation; } } PK!像/diff/tests/LCS/LongestCommonSubsequenceTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\LCS; use PHPUnit\Framework\TestCase; abstract class LongestCommonSubsequenceTest extends TestCase { /** * @var LongestCommonSubsequence */ private $implementation; /** * @var string */ private $memoryLimit; /** * @var int[] */ private $stress_sizes = array(1, 2, 3, 100, 500, 1000, 2000); protected function setUp() { $this->memoryLimit = \ini_get('memory_limit'); \ini_set('memory_limit', '256M'); $this->implementation = $this->createImplementation(); } /** * @return LongestCommonSubsequence */ abstract protected function createImplementation(); protected function tearDown() { \ini_set('memory_limit', $this->memoryLimit); } public function testBothEmpty() { $from = array(); $to = array(); $common = $this->implementation->calculate($from, $to); $this->assertEquals(array(), $common); } public function testIsStrictComparison() { $from = array( false, 0, 0.0, '', null, array(), true, 1, 1.0, 'foo', array('foo', 'bar'), array('foo' => 'bar') ); $to = $from; $common = $this->implementation->calculate($from, $to); $this->assertEquals($from, $common); $to = array( false, false, false, false, false, false, true, true, true, true, true, true ); $expected = array( false, true, ); $common = $this->implementation->calculate($from, $to); $this->assertEquals($expected, $common); } public function testEqualSequences() { foreach ($this->stress_sizes as $size) { $range = \range(1, $size); $from = $range; $to = $range; $common = $this->implementation->calculate($from, $to); $this->assertEquals($range, $common); } } public function testDistinctSequences() { $from = array('A'); $to = array('B'); $common = $this->implementation->calculate($from, $to); $this->assertEquals(array(), $common); $from = array('A', 'B', 'C'); $to = array('D', 'E', 'F'); $common = $this->implementation->calculate($from, $to); $this->assertEquals(array(), $common); foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \range($size + 1, $size * 2); $common = $this->implementation->calculate($from, $to); $this->assertEquals(array(), $common); } } public function testCommonSubsequence() { $from = array('A', 'C', 'E', 'F', 'G'); $to = array('A', 'B', 'D', 'E', 'H'); $expected = array('A', 'E'); $common = $this->implementation->calculate($from, $to); $this->assertEquals($expected, $common); $from = array('A', 'C', 'E', 'F', 'G'); $to = array('B', 'C', 'D', 'E', 'F', 'H'); $expected = array('C', 'E', 'F'); $common = $this->implementation->calculate($from, $to); $this->assertEquals($expected, $common); foreach ($this->stress_sizes as $size) { $from = $size < 2 ? array(1) : \range(1, $size + 1, 2); $to = $size < 3 ? array(1) : \range(1, $size + 1, 3); $expected = $size < 6 ? array(1) : \range(1, $size + 1, 6); $common = $this->implementation->calculate($from, $to); $this->assertEquals($expected, $common); } } public function testSingleElementSubsequenceAtStart() { foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_slice($from, 0, 1); $common = $this->implementation->calculate($from, $to); $this->assertEquals($to, $common); } } public function testSingleElementSubsequenceAtMiddle() { foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_slice($from, (int) $size / 2, 1); $common = $this->implementation->calculate($from, $to); $this->assertEquals($to, $common); } } public function testSingleElementSubsequenceAtEnd() { foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_slice($from, $size - 1, 1); $common = $this->implementation->calculate($from, $to); $this->assertEquals($to, $common); } } public function testReversedSequences() { $from = array('A', 'B'); $to = array('B', 'A'); $expected = array('A'); $common = $this->implementation->calculate($from, $to); $this->assertEquals($expected, $common); foreach ($this->stress_sizes as $size) { $from = \range(1, $size); $to = \array_reverse($from); $common = $this->implementation->calculate($from, $to); $this->assertEquals(array(1), $common); } } public function testStrictTypeCalculate() { $diff = $this->implementation->calculate(array('5'), array('05')); $this->assertInternalType('array', $diff); $this->assertCount(0, $diff); } } PK!ほ症4diff/tests/LCS/MemoryEfficientImplementationTest.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\LCS; /** * @covers SebastianBergmann\Diff\LCS\MemoryEfficientImplementation */ class MemoryEfficientImplementationTest extends LongestCommonSubsequenceTest { protected function createImplementation() { return new MemoryEfficientImplementation; } } PK!儨7 diff/.php_csnu誌w洞 For the full copyright and license information, please view the LICENSE file that was distributed with this source code. EOF; return PhpCsFixer\Config::create() ->setRiskyAllowed(true) ->setRules( [ 'array_syntax' => ['syntax' => 'long'], 'binary_operator_spaces' => [ 'align_double_arrow' => true, 'align_equals' => true ], 'blank_line_after_namespace' => true, 'blank_line_before_return' => true, 'braces' => true, 'cast_spaces' => true, 'concat_space' => ['spacing' => 'one'], 'elseif' => true, 'encoding' => true, 'full_opening_tag' => true, 'function_declaration' => true, 'header_comment' => ['header' => $header, 'separate' => 'none'], 'indentation_type' => true, 'line_ending' => true, 'lowercase_constants' => true, 'lowercase_keywords' => true, 'method_argument_space' => true, 'native_function_invocation' => true, 'no_alias_functions' => true, 'no_blank_lines_after_class_opening' => true, 'no_blank_lines_after_phpdoc' => true, 'no_closing_tag' => true, 'no_empty_phpdoc' => true, 'no_empty_statement' => true, 'no_extra_consecutive_blank_lines' => true, 'no_leading_namespace_whitespace' => true, 'no_singleline_whitespace_before_semicolons' => true, 'no_spaces_after_function_name' => true, 'no_spaces_inside_parenthesis' => true, 'no_trailing_comma_in_list_call' => true, 'no_trailing_whitespace' => true, 'no_unused_imports' => true, 'no_whitespace_in_blank_line' => true, 'phpdoc_align' => true, 'phpdoc_indent' => true, 'phpdoc_no_access' => true, 'phpdoc_no_empty_return' => true, 'phpdoc_no_package' => true, 'phpdoc_scalar' => true, 'phpdoc_separation' => true, 'phpdoc_to_comment' => true, 'phpdoc_trim' => true, 'phpdoc_types' => true, 'phpdoc_var_without_name' => true, 'self_accessor' => true, 'simplified_null_return' => true, 'single_blank_line_at_eof' => true, 'single_import_per_statement' => true, 'single_line_after_imports' => true, 'single_quote' => true, 'ternary_operator_spaces' => true, 'trim_array_spaces' => true, 'visibility_required' => true, ] ) ->setFinder( PhpCsFixer\Finder::create() ->files() ->in(__DIR__ . '/src') ->in(__DIR__ . '/tests') ->name('*.php') ); PK!渙凅R R Fdiff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\LCS; /** * Memory-efficient implementation of longest common subsequence calculation. */ class MemoryEfficientImplementation implements LongestCommonSubsequence { /** * Calculates the longest common subsequence of two arrays. * * @param array $from * @param array $to * * @return array */ public function calculate(array $from, array $to) { $cFrom = \count($from); $cTo = \count($to); if ($cFrom === 0) { return array(); } if ($cFrom === 1) { if (\in_array($from[0], $to, true)) { return array($from[0]); } return array(); } $i = (int) ($cFrom / 2); $fromStart = \array_slice($from, 0, $i); $fromEnd = \array_slice($from, $i); $llB = $this->length($fromStart, $to); $llE = $this->length(\array_reverse($fromEnd), \array_reverse($to)); $jMax = 0; $max = 0; for ($j = 0; $j <= $cTo; $j++) { $m = $llB[$j] + $llE[$cTo - $j]; if ($m >= $max) { $max = $m; $jMax = $j; } } $toStart = \array_slice($to, 0, $jMax); $toEnd = \array_slice($to, $jMax); return \array_merge( $this->calculate($fromStart, $toStart), $this->calculate($fromEnd, $toEnd) ); } /** * @param array $from * @param array $to * * @return array */ private function length(array $from, array $to) { $current = \array_fill(0, \count($to) + 1, 0); $cFrom = \count($from); $cTo = \count($to); for ($i = 0; $i < $cFrom; $i++) { $prev = $current; for ($j = 0; $j < $cTo; $j++) { if ($from[$i] === $to[$j]) { $current[$j + 1] = $prev[$j] + 1; } else { $current[$j + 1] = \max($current[$j], $prev[$j + 1]); } } } return $current; } } PK!掘Ddiff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\LCS; /** * Time-efficient implementation of longest common subsequence calculation. */ class TimeEfficientImplementation implements LongestCommonSubsequence { /** * Calculates the longest common subsequence of two arrays. * * @param array $from * @param array $to * * @return array */ public function calculate(array $from, array $to) { $common = array(); $fromLength = \count($from); $toLength = \count($to); $width = $fromLength + 1; $matrix = new \SplFixedArray($width * ($toLength + 1)); for ($i = 0; $i <= $fromLength; ++$i) { $matrix[$i] = 0; } for ($j = 0; $j <= $toLength; ++$j) { $matrix[$j * $width] = 0; } for ($i = 1; $i <= $fromLength; ++$i) { for ($j = 1; $j <= $toLength; ++$j) { $o = ($j * $width) + $i; $matrix[$o] = \max( $matrix[$o - 1], $matrix[$o - $width], $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 ); } } $i = $fromLength; $j = $toLength; while ($i > 0 && $j > 0) { if ($from[$i - 1] === $to[$j - 1]) { $common[] = $from[$i - 1]; --$i; --$j; } else { $o = ($j * $width) + $i; if ($matrix[$o - $width] > $matrix[$o - 1]) { --$j; } else { --$i; } } } return \array_reverse($common); } } PK!\/jj)diff/src/LCS/LongestCommonSubsequence.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Diff\LCS; /** * Interface for implementations of longest common subsequence calculation. */ interface LongestCommonSubsequence { /** * Calculates the longest common subsequence of two arrays. * * @param array $from * @param array $to * * @return array */ public function calculate(array $from, array $to); } PK!T県C"recursion-context/phpunit.xml.distnu誌w洞 tests src PK!D 銕-comparator/tests/_files/ClassWithToString.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; class ClassWithToString { public function __toString() { return 'string representation'; } } PK!a comparator/tests/_files/Book.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * A book. * */ class Book { // the order of properties is important for testing the cycle! public $author = null; } PK!謞羷TT/comparator/tests/_files/TestClassComparator.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; class TestClassComparator extends ObjectComparator { } PK!挦炪"comparator/tests/_files/Struct.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * A struct. * */ class Struct { public $var; public function __construct($var) { $this->var = $var; } } PK! Q"11%comparator/tests/_files/TestClass.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; class TestClass { } PK!峲+'comparator/tests/_files/SampleClass.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * A sample class. * */ class SampleClass { public $a; protected $b; protected $c; public function __construct($a, $b, $c) { $this->a = $a; $this->b = $b; $this->c = $c; } } PK!G*髙"comparator/tests/_files/Author.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; /** * An author. * */ class Author { // the order of properties is important for testing the cycle! public $books = array(); private $name = ''; public function __construct($name) { $this->name = $name; } } PK!鐽殙k k comparator/tests/autoload.phpnu誌w洞 '/ArrayComparatorTest.php', 'sebastianbergmann\\comparator\\author' => '/_files/Author.php', 'sebastianbergmann\\comparator\\book' => '/_files/Book.php', 'sebastianbergmann\\comparator\\classwithtostring' => '/_files/ClassWithToString.php', 'sebastianbergmann\\comparator\\datetimecomparatortest' => '/DateTimeComparatorTest.php', 'sebastianbergmann\\comparator\\domnodecomparatortest' => '/DOMNodeComparatorTest.php', 'sebastianbergmann\\comparator\\doublecomparatortest' => '/DoubleComparatorTest.php', 'sebastianbergmann\\comparator\\exceptioncomparatortest' => '/ExceptionComparatorTest.php', 'sebastianbergmann\\comparator\\factorytest' => '/FactoryTest.php', 'sebastianbergmann\\comparator\\mockobjectcomparatortest' => '/MockObjectComparatorTest.php', 'sebastianbergmann\\comparator\\numericcomparatortest' => '/NumericComparatorTest.php', 'sebastianbergmann\\comparator\\objectcomparatortest' => '/ObjectComparatorTest.php', 'sebastianbergmann\\comparator\\resourcecomparatortest' => '/ResourceComparatorTest.php', 'sebastianbergmann\\comparator\\sampleclass' => '/_files/SampleClass.php', 'sebastianbergmann\\comparator\\scalarcomparatortest' => '/ScalarComparatorTest.php', 'sebastianbergmann\\comparator\\splobjectstoragecomparatortest' => '/SplObjectStorageComparatorTest.php', 'sebastianbergmann\\comparator\\struct' => '/_files/Struct.php', 'sebastianbergmann\\comparator\\testclass' => '/_files/TestClass.php', 'sebastianbergmann\\comparator\\testclasscomparator' => '/_files/TestClassComparator.php', 'sebastianbergmann\\comparator\\typecomparatortest' => '/TypeComparatorTest.php' ); } $cn = strtolower($class); if (isset($classes[$cn])) { require __DIR__ . $classes[$cn]; } } ); // @codeCoverageIgnoreEnd PK!1阚Dcomparator/tests/bootstrap.phpnu誌w洞 tests src PK!殶子comparator/build/travis-ci.xmlnu誌w洞 ../tests PK!碕 Wexporter/phpunit.xml.distnu誌w洞 tests src PK!氩5global-state/phpunit.xml.distnu誌w洞 tests src PK!縹]!qq%global-state/src/RuntimeException.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; /** */ class RuntimeException extends \RuntimeException implements Exception { } PK!??global-state/src/Exception.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; /** */ interface Exception { } PK!$I5object-enumerator/tests/Fixtures/ExceptionThrower.phpnu誌w洞 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\ObjectEnumerator\Fixtures; use RuntimeException; class ExceptionThrower { private $property; public function __construct() { unset($this->property); } public function __get($property) { throw new RuntimeException; } } PK!聢code-unit/composer.jsonnu刐迭{ "name": "sebastian/code-unit", "description": "Collection of value objects that represent the PHP code units", "type": "library", "homepage": "https://github.com/sebastianbergmann/code-unit", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues" }, "prefer-stable": true, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "config": { "platform": { "php": "8.1.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "autoload-dev": { "classmap": [ "tests/_fixture" ], "files": [ "tests/_fixture/file_with_multiple_code_units.php", "tests/_fixture/function.php" ] }, "extra": { "branch-alias": { "dev-main": "2.0-dev" } } } PK!s蟻code-unit/README.mdnu刐迭[![Latest Stable Version](https://poser.pugx.org/sebastian/code-unit/v/stable.png)](https://packagist.org/packages/sebastian/code-unit) [![CI Status](https://github.com/sebastianbergmann/code-unit/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/code-unit/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/code-unit/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/code-unit) [![codecov](https://codecov.io/gh/sebastianbergmann/code-unit/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/code-unit) # sebastian/code-unit Collection of value objects that represent the PHP code units. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/code-unit ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/code-unit ``` PK!E >螾Pcode-unit/SECURITY.mdnu刐迭# Security Policy This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. **If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** ## Security Contact Information After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. PK!l`%code-unit/src/InterfaceMethodUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class InterfaceMethodUnit extends CodeUnit { /** * @psalm-assert-if-true InterfaceMethod $this */ public function isInterfaceMethod(): bool { return true; } } PK!XVXcode-unit/src/Mapper.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use function array_keys; use function array_merge; use function array_unique; use function array_values; use function class_exists; use function explode; use function function_exists; use function interface_exists; use function ksort; use function method_exists; use function sort; use function sprintf; use function str_contains; use function trait_exists; use ReflectionClass; use ReflectionFunction; use ReflectionMethod; final class Mapper { /** * @psalm-return array> */ public function codeUnitsToSourceLines(CodeUnitCollection $codeUnits): array { $result = []; foreach ($codeUnits as $codeUnit) { $sourceFileName = $codeUnit->sourceFileName(); if (!isset($result[$sourceFileName])) { $result[$sourceFileName] = []; } $result[$sourceFileName] = array_merge($result[$sourceFileName], $codeUnit->sourceLines()); } foreach (array_keys($result) as $sourceFileName) { $result[$sourceFileName] = array_values(array_unique($result[$sourceFileName])); sort($result[$sourceFileName]); } ksort($result); return $result; } /** * @throws InvalidCodeUnitException * @throws ReflectionException */ public function stringToCodeUnits(string $unit): CodeUnitCollection { if (str_contains($unit, '::')) { [$firstPart, $secondPart] = explode('::', $unit); if ($this->isUserDefinedFunction($secondPart)) { return CodeUnitCollection::fromList(CodeUnit::forFunction($secondPart)); } if ($this->isUserDefinedMethod($firstPart, $secondPart)) { return CodeUnitCollection::fromList(CodeUnit::forClassMethod($firstPart, $secondPart)); } if ($this->isUserDefinedInterface($firstPart)) { return CodeUnitCollection::fromList(CodeUnit::forInterfaceMethod($firstPart, $secondPart)); } if ($this->isUserDefinedTrait($firstPart)) { return CodeUnitCollection::fromList(CodeUnit::forTraitMethod($firstPart, $secondPart)); } } else { if ($this->isUserDefinedClass($unit)) { $units = [CodeUnit::forClass($unit)]; foreach ($this->reflectorForClass($unit)->getTraits() as $trait) { if (!$trait->isUserDefined()) { // @codeCoverageIgnoreStart continue; // @codeCoverageIgnoreEnd } $units[] = CodeUnit::forTrait($trait->getName()); } return CodeUnitCollection::fromList(...$units); } if ($this->isUserDefinedInterface($unit)) { return CodeUnitCollection::fromList(CodeUnit::forInterface($unit)); } if ($this->isUserDefinedTrait($unit)) { return CodeUnitCollection::fromList(CodeUnit::forTrait($unit)); } if ($this->isUserDefinedFunction($unit)) { return CodeUnitCollection::fromList(CodeUnit::forFunction($unit)); } } throw new InvalidCodeUnitException( sprintf( '"%s" is not a valid code unit', $unit ) ); } /** * @psalm-param class-string $className * * @throws ReflectionException */ private function reflectorForClass(string $className): ReflectionClass { try { return new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedFunction(string $functionName): bool { if (!function_exists($functionName)) { return false; } try { return (new ReflectionFunction($functionName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedClass(string $className): bool { if (!class_exists($className)) { return false; } try { return (new ReflectionClass($className))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedInterface(string $interfaceName): bool { if (!interface_exists($interfaceName)) { return false; } try { return (new ReflectionClass($interfaceName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedTrait(string $traitName): bool { if (!trait_exists($traitName)) { return false; } try { return (new ReflectionClass($traitName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @throws ReflectionException */ private function isUserDefinedMethod(string $className, string $methodName): bool { if (!class_exists($className)) { // @codeCoverageIgnoreStart return false; // @codeCoverageIgnoreEnd } if (!method_exists($className, $methodName)) { // @codeCoverageIgnoreStart return false; // @codeCoverageIgnoreEnd } try { return (new ReflectionMethod($className, $methodName))->isUserDefined(); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } } PK!馢鳈  !code-unit/src/ClassMethodUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class ClassMethodUnit extends CodeUnit { /** * @psalm-assert-if-true ClassMethodUnit $this */ public function isClassMethod(): bool { return true; } } PK!TJ丝code-unit/src/TraitUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class TraitUnit extends CodeUnit { /** * @psalm-assert-if-true TraitUnit $this */ public function isTrait(): bool { return true; } } PK!慆N'$code-unit/src/CodeUnitCollection.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use function array_merge; use function count; use Countable; use IteratorAggregate; /** * @template-implements IteratorAggregate * * @psalm-immutable */ final class CodeUnitCollection implements Countable, IteratorAggregate { /** * @psalm-var list */ private readonly array $codeUnits; public static function fromList(CodeUnit ...$codeUnits): self { return new self($codeUnits); } /** * @psalm-param list $codeUnits */ private function __construct(array $codeUnits) { $this->codeUnits = $codeUnits; } /** * @psalm-return list */ public function asArray(): array { return $this->codeUnits; } public function getIterator(): CodeUnitCollectionIterator { return new CodeUnitCollectionIterator($this); } public function count(): int { return count($this->codeUnits); } public function isEmpty(): bool { return empty($this->codeUnits); } public function mergeWith(self $other): self { return new self( array_merge( $this->asArray(), $other->asArray() ) ); } } PK!氾code-unit/src/FileUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class FileUnit extends CodeUnit { /** * @psalm-assert-if-true FileUnit $this */ public function isFile(): bool { return true; } } PK!%閨UU,code-unit/src/CodeUnitCollectionIterator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use Iterator; /** * @template-implements Iterator */ final class CodeUnitCollectionIterator implements Iterator { /** * @psalm-var list */ private array $codeUnits; private int $position = 0; public function __construct(CodeUnitCollection $collection) { $this->codeUnits = $collection->asArray(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return isset($this->codeUnits[$this->position]); } public function key(): int { return $this->position; } public function current(): CodeUnit { return $this->codeUnits[$this->position]; } public function next(): void { $this->position++; } } PK!wkjj&code-unit/src/exceptions/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use Throwable; interface Exception extends Throwable { } PK!梦-code-unit/src/exceptions/NoTraitException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use RuntimeException; final class NoTraitException extends RuntimeException implements Exception { } PK!O铏0code-unit/src/exceptions/ReflectionException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use RuntimeException; final class ReflectionException extends RuntimeException implements Exception { } PK!6*a5code-unit/src/exceptions/InvalidCodeUnitException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use RuntimeException; final class InvalidCodeUnitException extends RuntimeException implements Exception { } PK! 1Z  !code-unit/src/TraitMethodUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class TraitMethodUnit extends CodeUnit { /** * @psalm-assert-if-true TraitMethodUnit $this */ public function isTraitMethod(): bool { return true; } } PK!=i3030code-unit/src/CodeUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; use function count; use function file; use function file_exists; use function is_readable; use function range; use function sprintf; use ReflectionClass; use ReflectionFunction; use ReflectionMethod; /** * @psalm-immutable */ abstract class CodeUnit { private readonly string $name; private readonly string $sourceFileName; /** * @psalm-var list */ private readonly array $sourceLines; /** * @psalm-param class-string $className * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forClass(string $className): ClassUnit { self::ensureUserDefinedClass($className); $reflector = self::reflectorForClass($className); return new ClassUnit( $className, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $className * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forClassMethod(string $className, string $methodName): ClassMethodUnit { self::ensureUserDefinedClass($className); $reflector = self::reflectorForClassMethod($className, $methodName); return new ClassMethodUnit( $className . '::' . $methodName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @throws InvalidCodeUnitException */ public static function forFileWithAbsolutePath(string $path): FileUnit { self::ensureFileExistsAndIsReadable($path); return new FileUnit( $path, $path, range( 1, count(file($path)) ) ); } /** * @psalm-param class-string $interfaceName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forInterface(string $interfaceName): InterfaceUnit { self::ensureUserDefinedInterface($interfaceName); $reflector = self::reflectorForClass($interfaceName); return new InterfaceUnit( $interfaceName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $interfaceName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forInterfaceMethod(string $interfaceName, string $methodName): InterfaceMethodUnit { self::ensureUserDefinedInterface($interfaceName); $reflector = self::reflectorForClassMethod($interfaceName, $methodName); return new InterfaceMethodUnit( $interfaceName . '::' . $methodName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $traitName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forTrait(string $traitName): TraitUnit { self::ensureUserDefinedTrait($traitName); $reflector = self::reflectorForClass($traitName); return new TraitUnit( $traitName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param class-string $traitName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forTraitMethod(string $traitName, string $methodName): TraitMethodUnit { self::ensureUserDefinedTrait($traitName); $reflector = self::reflectorForClassMethod($traitName, $methodName); return new TraitMethodUnit( $traitName . '::' . $methodName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param callable-string $functionName * * @throws InvalidCodeUnitException * @throws ReflectionException */ public static function forFunction(string $functionName): FunctionUnit { $reflector = self::reflectorForFunction($functionName); if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined function', $functionName ) ); } return new FunctionUnit( $functionName, $reflector->getFileName(), range( $reflector->getStartLine(), $reflector->getEndLine() ) ); } /** * @psalm-param list $sourceLines */ private function __construct(string $name, string $sourceFileName, array $sourceLines) { $this->name = $name; $this->sourceFileName = $sourceFileName; $this->sourceLines = $sourceLines; } public function name(): string { return $this->name; } public function sourceFileName(): string { return $this->sourceFileName; } /** * @psalm-return list */ public function sourceLines(): array { return $this->sourceLines; } public function isClass(): bool { return false; } public function isClassMethod(): bool { return false; } public function isInterface(): bool { return false; } public function isInterfaceMethod(): bool { return false; } public function isTrait(): bool { return false; } public function isTraitMethod(): bool { return false; } public function isFunction(): bool { return false; } public function isFile(): bool { return false; } /** * @throws InvalidCodeUnitException */ private static function ensureFileExistsAndIsReadable(string $path): void { if (!(file_exists($path) && is_readable($path))) { throw new InvalidCodeUnitException( sprintf( 'File "%s" does not exist or is not readable', $path ) ); } } /** * @psalm-param class-string $className * * @throws InvalidCodeUnitException */ private static function ensureUserDefinedClass(string $className): void { try { $reflector = new ReflectionClass($className); if ($reflector->isInterface()) { throw new InvalidCodeUnitException( sprintf( '"%s" is an interface and not a class', $className ) ); } if ($reflector->isTrait()) { throw new InvalidCodeUnitException( sprintf( '"%s" is a trait and not a class', $className ) ); } if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined class', $className ) ); } // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $interfaceName * * @throws InvalidCodeUnitException */ private static function ensureUserDefinedInterface(string $interfaceName): void { try { $reflector = new ReflectionClass($interfaceName); if (!$reflector->isInterface()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not an interface', $interfaceName ) ); } if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined interface', $interfaceName ) ); } // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $traitName * * @throws InvalidCodeUnitException */ private static function ensureUserDefinedTrait(string $traitName): void { try { $reflector = new ReflectionClass($traitName); if (!$reflector->isTrait()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a trait', $traitName ) ); } // @codeCoverageIgnoreStart if (!$reflector->isUserDefined()) { throw new InvalidCodeUnitException( sprintf( '"%s" is not a user-defined trait', $traitName ) ); } } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $className * * @throws ReflectionException */ private static function reflectorForClass(string $className): ReflectionClass { try { return new ReflectionClass($className); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param class-string $className * * @throws ReflectionException */ private static function reflectorForClassMethod(string $className, string $methodName): ReflectionMethod { try { return new ReflectionMethod($className, $methodName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } /** * @psalm-param callable-string $functionName * * @throws ReflectionException */ private static function reflectorForFunction(string $functionName): ReflectionFunction { try { return new ReflectionFunction($functionName); // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), $e ); } // @codeCoverageIgnoreEnd } } PK!穜馳code-unit/src/FunctionUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class FunctionUnit extends CodeUnit { /** * @psalm-assert-if-true FunctionUnit $this */ public function isFunction(): bool { return true; } } PK!=%tcode-unit/src/InterfaceUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class InterfaceUnit extends CodeUnit { /** * @psalm-assert-if-true InterfaceUnit $this */ public function isInterface(): bool { return true; } } PK!m=code-unit/src/ClassUnit.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CodeUnit; /** * @psalm-immutable */ final class ClassUnit extends CodeUnit { /** * @psalm-assert-if-true ClassUnit $this */ public function isClass(): bool { return true; } } PK!誈3伹 code-unit/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. ## [2.0.0] - 2023-02-03 ### Added * Added `SebastianBergmann\CodeUnit\FileUnit` value object that represents a sourcecode file ### Removed * `SebastianBergmann\CodeUnit\CodeUnitCollection::fromArray()` has been removed * `SebastianBergmann\CodeUnit\Mapper::stringToCodeUnits()` no longer supports `ClassName<*>` * This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 ## [1.0.8] - 2020-10-26 ### Fixed * `SebastianBergmann\CodeUnit\Exception` now correctly extends `\Throwable` ## [1.0.7] - 2020-10-02 ### Fixed * `SebastianBergmann\CodeUnit\Mapper::stringToCodeUnits()` no longer attempts to create `CodeUnit` objects for code units that are not declared in userland ## [1.0.6] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [1.0.5] - 2020-06-26 ### Fixed * [#3](https://github.com/sebastianbergmann/code-unit/issues/3): Regression in 1.0.4 ## [1.0.4] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [1.0.3] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports ## [1.0.2] - 2020-04-30 ### Fixed * `Mapper::stringToCodeUnits()` raised the wrong exception for `Class::method` when a class named `Class` exists but does not have a method named `method` ## [1.0.1] - 2020-04-27 ### Fixed * [#2](https://github.com/sebastianbergmann/code-unit/issues/2): `Mapper::stringToCodeUnits()` breaks when `ClassName` is used for class that extends built-in class ## [1.0.0] - 2020-03-30 * Initial release [2.0.0]: https://github.com/sebastianbergmann/code-unit/compare/1.0.8...2.0.0 [1.0.8]: https://github.com/sebastianbergmann/code-unit/compare/1.0.7...1.0.8 [1.0.7]: https://github.com/sebastianbergmann/code-unit/compare/1.0.6...1.0.7 [1.0.6]: https://github.com/sebastianbergmann/code-unit/compare/1.0.5...1.0.6 [1.0.5]: https://github.com/sebastianbergmann/code-unit/compare/1.0.4...1.0.5 [1.0.4]: https://github.com/sebastianbergmann/code-unit/compare/1.0.3...1.0.4 [1.0.3]: https://github.com/sebastianbergmann/code-unit/compare/1.0.2...1.0.3 [1.0.2]: https://github.com/sebastianbergmann/code-unit/compare/1.0.1...1.0.2 [1.0.1]: https://github.com/sebastianbergmann/code-unit/compare/1.0.0...1.0.1 [1.0.0]: https://github.com/sebastianbergmann/code-unit/compare/530c3900e5db9bcb8516da545bef0d62536cedaa...1.0.0 PK!碢@冫code-unit/LICENSEnu刐迭BSD 3-Clause License Copyright (c) 2020-2023, Sebastian Bergmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!w怓Flines-of-code/composer.jsonnu刐迭{ "name": "sebastian/lines-of-code", "description": "Library for counting the lines of code in PHP source code", "type": "library", "homepage": "https://github.com/sebastianbergmann/lines-of-code", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy" }, "prefer-stable": true, "require": { "php": ">=8.1", "nikic/php-parser": "^4.18 || ^5.0" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "config": { "platform": { "php": "8.1" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-main": "2.0-dev" } } } PK!駳==lines-of-code/README.mdnu刐迭[![Latest Stable Version](https://poser.pugx.org/sebastian/lines-of-code/v/stable.png)](https://packagist.org/packages/sebastian/lines-of-code) [![CI Status](https://github.com/sebastianbergmann/lines-of-code/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/lines-of-code/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/lines-of-code/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/lines-of-code) [![codecov](https://codecov.io/gh/sebastianbergmann/lines-of-code/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/lines-of-code) # sebastian/lines-of-code Library for counting the lines of code in PHP source code. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/lines-of-code ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/lines-of-code ``` PK!KJulines-of-code/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!kJM  )lines-of-code/src/LineCountingVisitor.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use function array_merge; use function array_unique; use function assert; use function count; use PhpParser\Comment; use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\NodeVisitorAbstract; final class LineCountingVisitor extends NodeVisitorAbstract { /** * @psalm-var non-negative-int */ private readonly int $linesOfCode; /** * @var Comment[] */ private array $comments = []; /** * @var int[] */ private array $linesWithStatements = []; /** * @psalm-param non-negative-int $linesOfCode */ public function __construct(int $linesOfCode) { $this->linesOfCode = $linesOfCode; } public function enterNode(Node $node): void { $this->comments = array_merge($this->comments, $node->getComments()); if (!$node instanceof Expr) { return; } $this->linesWithStatements[] = $node->getStartLine(); } public function result(): LinesOfCode { $commentLinesOfCode = 0; foreach ($this->comments() as $comment) { $commentLinesOfCode += ($comment->getEndLine() - $comment->getStartLine() + 1); } $nonCommentLinesOfCode = $this->linesOfCode - $commentLinesOfCode; $logicalLinesOfCode = count(array_unique($this->linesWithStatements)); assert($commentLinesOfCode >= 0); assert($nonCommentLinesOfCode >= 0); assert($logicalLinesOfCode >= 0); return new LinesOfCode( $this->linesOfCode, $commentLinesOfCode, $nonCommentLinesOfCode, $logicalLinesOfCode, ); } /** * @return Comment[] */ private function comments(): array { $comments = []; foreach ($this->comments as $comment) { $comments[$comment->getStartLine() . '_' . $comment->getStartTokenPos() . '_' . $comment->getEndLine() . '_' . $comment->getEndTokenPos()] = $comment; } return $comments; } } PK!0+qq)lines-of-code/src/Exception/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use Throwable; interface Exception extends Throwable { } PK! 8lines-of-code/src/Exception/IllogicalValuesException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use LogicException; final class IllogicalValuesException extends LogicException implements Exception { } PK!/韲0lines-of-code/src/Exception/RuntimeException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; final class RuntimeException extends \RuntimeException implements Exception { } PK!趛<6lines-of-code/src/Exception/NegativeValueException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use InvalidArgumentException; final class NegativeValueException extends InvalidArgumentException implements Exception { } PK!歴稠^ ^ !lines-of-code/src/LinesOfCode.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; /** * @psalm-immutable */ final class LinesOfCode { /** * @psalm-var non-negative-int */ private readonly int $linesOfCode; /** * @psalm-var non-negative-int */ private readonly int $commentLinesOfCode; /** * @psalm-var non-negative-int */ private readonly int $nonCommentLinesOfCode; /** * @psalm-var non-negative-int */ private readonly int $logicalLinesOfCode; /** * @psalm-param non-negative-int $linesOfCode * @psalm-param non-negative-int $commentLinesOfCode * @psalm-param non-negative-int $nonCommentLinesOfCode * @psalm-param non-negative-int $logicalLinesOfCode * * @throws IllogicalValuesException * @throws NegativeValueException */ public function __construct(int $linesOfCode, int $commentLinesOfCode, int $nonCommentLinesOfCode, int $logicalLinesOfCode) { /** @psalm-suppress DocblockTypeContradiction */ if ($linesOfCode < 0) { throw new NegativeValueException('$linesOfCode must not be negative'); } /** @psalm-suppress DocblockTypeContradiction */ if ($commentLinesOfCode < 0) { throw new NegativeValueException('$commentLinesOfCode must not be negative'); } /** @psalm-suppress DocblockTypeContradiction */ if ($nonCommentLinesOfCode < 0) { throw new NegativeValueException('$nonCommentLinesOfCode must not be negative'); } /** @psalm-suppress DocblockTypeContradiction */ if ($logicalLinesOfCode < 0) { throw new NegativeValueException('$logicalLinesOfCode must not be negative'); } if ($linesOfCode - $commentLinesOfCode !== $nonCommentLinesOfCode) { throw new IllogicalValuesException('$linesOfCode !== $commentLinesOfCode + $nonCommentLinesOfCode'); } $this->linesOfCode = $linesOfCode; $this->commentLinesOfCode = $commentLinesOfCode; $this->nonCommentLinesOfCode = $nonCommentLinesOfCode; $this->logicalLinesOfCode = $logicalLinesOfCode; } /** * @psalm-return non-negative-int */ public function linesOfCode(): int { return $this->linesOfCode; } /** * @psalm-return non-negative-int */ public function commentLinesOfCode(): int { return $this->commentLinesOfCode; } /** * @psalm-return non-negative-int */ public function nonCommentLinesOfCode(): int { return $this->nonCommentLinesOfCode; } /** * @psalm-return non-negative-int */ public function logicalLinesOfCode(): int { return $this->logicalLinesOfCode; } public function plus(self $other): self { return new self( $this->linesOfCode() + $other->linesOfCode(), $this->commentLinesOfCode() + $other->commentLinesOfCode(), $this->nonCommentLinesOfCode() + $other->nonCommentLinesOfCode(), $this->logicalLinesOfCode() + $other->logicalLinesOfCode(), ); } } PK!i杈  lines-of-code/src/Counter.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\LinesOfCode; use function assert; use function file_get_contents; use function substr_count; use PhpParser\Error; use PhpParser\Node; use PhpParser\NodeTraverser; use PhpParser\ParserFactory; final class Counter { /** * @throws RuntimeException */ public function countInSourceFile(string $sourceFile): LinesOfCode { return $this->countInSourceString(file_get_contents($sourceFile)); } /** * @throws RuntimeException */ public function countInSourceString(string $source): LinesOfCode { $linesOfCode = substr_count($source, "\n"); if ($linesOfCode === 0 && !empty($source)) { $linesOfCode = 1; } assert($linesOfCode >= 0); try { $nodes = (new ParserFactory)->createForHostVersion()->parse($source); assert($nodes !== null); return $this->countInAbstractSyntaxTree($linesOfCode, $nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), $error->getCode(), $error, ); } // @codeCoverageIgnoreEnd } /** * @psalm-param non-negative-int $linesOfCode * * @param Node[] $nodes * * @throws RuntimeException */ public function countInAbstractSyntaxTree(int $linesOfCode, array $nodes): LinesOfCode { $traverser = new NodeTraverser; $visitor = new LineCountingVisitor($linesOfCode); $traverser->addVisitor($visitor); try { /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), $error->getCode(), $error, ); } // @codeCoverageIgnoreEnd return $visitor->result(); } } PK!D┿lines-of-code/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [2.0.2] - 2023-12-21 ### Changed * This component is now compatible with `nikic/php-parser` 5.0 ## [2.0.1] - 2023-08-31 ### Changed * Improved type information ## [2.0.0] - 2023-02-03 ### Removed * This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 ## [1.0.3] - 2020-11-28 ### Fixed * Files that do not contain a newline were not handled correctly ### Changed * A line of code is no longer considered to be a Logical Line of Code if it does not contain an `Expr` node ## [1.0.2] - 2020-10-26 ### Fixed * `SebastianBergmann\LinesOfCode\Exception` now correctly extends `\Throwable` ## [1.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [1.0.0] - 2020-07-22 * Initial release [2.0.2]: https://github.com/sebastianbergmann/lines-of-code/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/lines-of-code/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.3...2.0.0 [1.0.3]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.2...1.0.3 [1.0.2]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.1...1.0.2 [1.0.1]: https://github.com/sebastianbergmann/lines-of-code/compare/1.0.0...1.0.1 [1.0.0]: https://github.com/sebastianbergmann/lines-of-code/compare/f959e71f00e591288acc024afe9cb966c6cf9bd6...1.0.0 PK!碢@冫lines-of-code/LICENSEnu刐迭BSD 3-Clause License Copyright (c) 2020-2023, Sebastian Bergmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!E >螾Ptype/SECURITY.mdnu刐迭# Security Policy This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. **If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** ## Security Contact Information After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. PK!?  type/src/type/UnknownType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class UnknownType extends Type { public function isAssignable(Type $other): bool { return true; } public function name(): string { return 'unknown type'; } public function asString(): string { return ''; } public function allowsNull(): bool { return true; } /** * @psalm-assert-if-true UnknownType $this */ public function isUnknown(): bool { return true; } } PK!@繒5#type/src/type/GenericObjectType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class GenericObjectType extends Type { private bool $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if (!$other instanceof ObjectType) { return false; } return true; } public function name(): string { return 'object'; } public function allowsNull(): bool { return $this->allowsNull; } /** * @psalm-assert-if-true GenericObjectType $this */ public function isGenericObject(): bool { return true; } } PK!鰅 type/src/type/UnionType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function count; use function implode; use function sort; final class UnionType extends Type { /** * @psalm-var non-empty-list */ private array $types; /** * @throws RuntimeException */ public function __construct(Type ...$types) { $this->ensureMinimumOfTwoTypes(...$types); $this->ensureOnlyValidTypes(...$types); $this->types = $types; } public function isAssignable(Type $other): bool { foreach ($this->types as $type) { if ($type->isAssignable($other)) { return true; } } return false; } public function asString(): string { return $this->name(); } public function name(): string { $types = []; foreach ($this->types as $type) { if ($type->isIntersection()) { $types[] = '(' . $type->name() . ')'; continue; } $types[] = $type->name(); } sort($types); return implode('|', $types); } public function allowsNull(): bool { foreach ($this->types as $type) { if ($type instanceof NullType) { return true; } } return false; } /** * @psalm-assert-if-true UnionType $this */ public function isUnion(): bool { return true; } public function containsIntersectionTypes(): bool { foreach ($this->types as $type) { if ($type->isIntersection()) { return true; } } return false; } /** * @psalm-return non-empty-list */ public function types(): array { return $this->types; } /** * @throws RuntimeException */ private function ensureMinimumOfTwoTypes(Type ...$types): void { if (count($types) < 2) { throw new RuntimeException( 'A union type must be composed of at least two types' ); } } /** * @throws RuntimeException */ private function ensureOnlyValidTypes(Type ...$types): void { foreach ($types as $type) { if ($type instanceof UnknownType) { throw new RuntimeException( 'A union type must not be composed of an unknown type' ); } if ($type instanceof VoidType) { throw new RuntimeException( 'A union type must not be composed of a void type' ); } } } } PK!訂顂type/src/type/StaticType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function is_subclass_of; use function strcasecmp; final class StaticType extends Type { private TypeName $className; private bool $allowsNull; public function __construct(TypeName $className, bool $allowsNull) { $this->className = $className; $this->allowsNull = $allowsNull; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if (!$other instanceof ObjectType) { return false; } if (0 === strcasecmp($this->className->qualifiedName(), $other->className()->qualifiedName())) { return true; } if (is_subclass_of($other->className()->qualifiedName(), $this->className->qualifiedName(), true)) { return true; } return false; } public function name(): string { return 'static'; } public function allowsNull(): bool { return $this->allowsNull; } /** * @psalm-assert-if-true StaticType $this */ public function isStatic(): bool { return true; } } PK!P俕+type/src/type/Type.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function gettype; use function strtolower; abstract class Type { public static function fromValue(mixed $value, bool $allowsNull): self { if ($allowsNull === false) { if ($value === true) { return new TrueType; } if ($value === false) { return new FalseType; } } $typeName = gettype($value); if ($typeName === 'object') { return new ObjectType(TypeName::fromQualifiedName($value::class), $allowsNull); } $type = self::fromName($typeName, $allowsNull); if ($type instanceof SimpleType) { $type = new SimpleType($typeName, $allowsNull, $value); } return $type; } public static function fromName(string $typeName, bool $allowsNull): self { return match (strtolower($typeName)) { 'callable' => new CallableType($allowsNull), 'true' => new TrueType, 'false' => new FalseType, 'iterable' => new IterableType($allowsNull), 'never' => new NeverType, 'null' => new NullType, 'object' => new GenericObjectType($allowsNull), 'unknown type' => new UnknownType, 'void' => new VoidType, 'array', 'bool', 'boolean', 'double', 'float', 'int', 'integer', 'real', 'resource', 'resource (closed)', 'string' => new SimpleType($typeName, $allowsNull), 'mixed' => new MixedType, default => new ObjectType(TypeName::fromQualifiedName($typeName), $allowsNull), }; } public function asString(): string { return ($this->allowsNull() ? '?' : '') . $this->name(); } /** * @psalm-assert-if-true CallableType $this */ public function isCallable(): bool { return false; } /** * @psalm-assert-if-true TrueType $this */ public function isTrue(): bool { return false; } /** * @psalm-assert-if-true FalseType $this */ public function isFalse(): bool { return false; } /** * @psalm-assert-if-true GenericObjectType $this */ public function isGenericObject(): bool { return false; } /** * @psalm-assert-if-true IntersectionType $this */ public function isIntersection(): bool { return false; } /** * @psalm-assert-if-true IterableType $this */ public function isIterable(): bool { return false; } /** * @psalm-assert-if-true MixedType $this */ public function isMixed(): bool { return false; } /** * @psalm-assert-if-true NeverType $this */ public function isNever(): bool { return false; } /** * @psalm-assert-if-true NullType $this */ public function isNull(): bool { return false; } /** * @psalm-assert-if-true ObjectType $this */ public function isObject(): bool { return false; } /** * @psalm-assert-if-true SimpleType $this */ public function isSimple(): bool { return false; } /** * @psalm-assert-if-true StaticType $this */ public function isStatic(): bool { return false; } /** * @psalm-assert-if-true UnionType $this */ public function isUnion(): bool { return false; } /** * @psalm-assert-if-true UnknownType $this */ public function isUnknown(): bool { return false; } /** * @psalm-assert-if-true VoidType $this */ public function isVoid(): bool { return false; } abstract public function isAssignable(self $other): bool; abstract public function name(): string; abstract public function allowsNull(): bool; } PK!皟type/src/type/VoidType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class VoidType extends Type { public function isAssignable(Type $other): bool { return $other instanceof self; } public function name(): string { return 'void'; } public function allowsNull(): bool { return false; } /** * @psalm-assert-if-true VoidType $this */ public function isVoid(): bool { return true; } } PK!嗏骞kktype/src/type/TrueType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class TrueType extends Type { public function isAssignable(Type $other): bool { if ($other instanceof self) { return true; } return $other instanceof SimpleType && $other->name() === 'bool' && $other->value() === true; } public function name(): string { return 'true'; } public function allowsNull(): bool { return false; } /** * @psalm-assert-if-true TrueType $this */ public function isTrue(): bool { return true; } } PK!祹 type/src/type/NeverType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class NeverType extends Type { public function isAssignable(Type $other): bool { return $other instanceof self; } public function name(): string { return 'never'; } public function allowsNull(): bool { return false; } /** * @psalm-assert-if-true NeverType $this */ public function isNever(): bool { return true; } } PK!L/type/src/type/MixedType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class MixedType extends Type { public function isAssignable(Type $other): bool { return !$other instanceof VoidType; } public function asString(): string { return 'mixed'; } public function name(): string { return 'mixed'; } public function allowsNull(): bool { return true; } /** * @psalm-assert-if-true MixedType $this */ public function isMixed(): bool { return true; } } PK!-{type/src/type/ObjectType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function is_subclass_of; use function strcasecmp; final class ObjectType extends Type { private TypeName $className; private bool $allowsNull; public function __construct(TypeName $className, bool $allowsNull) { $this->className = $className; $this->allowsNull = $allowsNull; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { if (0 === strcasecmp($this->className->qualifiedName(), $other->className->qualifiedName())) { return true; } if (is_subclass_of($other->className->qualifiedName(), $this->className->qualifiedName(), true)) { return true; } } return false; } public function name(): string { return $this->className->qualifiedName(); } public function allowsNull(): bool { return $this->allowsNull; } public function className(): TypeName { return $this->className; } /** * @psalm-assert-if-true ObjectType $this */ public function isObject(): bool { return true; } } PK!2A驺type/src/type/IterableType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function assert; use function class_exists; use function is_iterable; use ReflectionClass; final class IterableType extends Type { private bool $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } /** * @throws RuntimeException */ public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { return true; } if ($other instanceof SimpleType) { return is_iterable($other->value()); } if ($other instanceof ObjectType) { $className = $other->className()->qualifiedName(); assert(class_exists($className)); return (new ReflectionClass($className))->isIterable(); } return false; } public function name(): string { return 'iterable'; } public function allowsNull(): bool { return $this->allowsNull; } /** * @psalm-assert-if-true IterableType $this */ public function isIterable(): bool { return true; } } PK!劘古66type/src/type/SimpleType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function strtolower; final class SimpleType extends Type { private string $name; private bool $allowsNull; private mixed $value; public function __construct(string $name, bool $nullable, mixed $value = null) { $this->name = $this->normalize($name); $this->allowsNull = $nullable; $this->value = $value; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($this->name === 'bool' && $other->name() === 'true') { return true; } if ($this->name === 'bool' && $other->name() === 'false') { return true; } if ($other instanceof self) { return $this->name === $other->name; } return false; } public function name(): string { return $this->name; } public function allowsNull(): bool { return $this->allowsNull; } public function value(): mixed { return $this->value; } /** * @psalm-assert-if-true SimpleType $this */ public function isSimple(): bool { return true; } private function normalize(string $name): string { $name = strtolower($name); return match ($name) { 'boolean' => 'bool', 'real', 'double' => 'float', 'integer' => 'int', '[]' => 'array', default => $name, }; } } PK!o|type/src/type/NullType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class NullType extends Type { public function isAssignable(Type $other): bool { return !($other instanceof VoidType); } public function name(): string { return 'null'; } public function asString(): string { return 'null'; } public function allowsNull(): bool { return true; } /** * @psalm-assert-if-true NullType $this */ public function isNull(): bool { return true; } } PK!錠!pptype/src/type/FalseType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class FalseType extends Type { public function isAssignable(Type $other): bool { if ($other instanceof self) { return true; } return $other instanceof SimpleType && $other->name() === 'bool' && $other->value() === false; } public function name(): string { return 'false'; } public function allowsNull(): bool { return false; } /** * @psalm-assert-if-true FalseType $this */ public function isFalse(): bool { return true; } } PK!<悚 "type/src/type/IntersectionType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function assert; use function count; use function implode; use function in_array; use function sort; final class IntersectionType extends Type { /** * @psalm-var non-empty-list */ private array $types; /** * @throws RuntimeException */ public function __construct(Type ...$types) { $this->ensureMinimumOfTwoTypes(...$types); $this->ensureOnlyValidTypes(...$types); $this->ensureNoDuplicateTypes(...$types); $this->types = $types; } public function isAssignable(Type $other): bool { return $other->isObject(); } public function asString(): string { return $this->name(); } public function name(): string { $types = []; foreach ($this->types as $type) { $types[] = $type->name(); } sort($types); return implode('&', $types); } public function allowsNull(): bool { return false; } /** * @psalm-assert-if-true IntersectionType $this */ public function isIntersection(): bool { return true; } /** * @psalm-return non-empty-list */ public function types(): array { return $this->types; } /** * @throws RuntimeException */ private function ensureMinimumOfTwoTypes(Type ...$types): void { if (count($types) < 2) { throw new RuntimeException( 'An intersection type must be composed of at least two types' ); } } /** * @throws RuntimeException */ private function ensureOnlyValidTypes(Type ...$types): void { foreach ($types as $type) { if (!$type->isObject()) { throw new RuntimeException( 'An intersection type can only be composed of interfaces and classes' ); } } } /** * @throws RuntimeException */ private function ensureNoDuplicateTypes(Type ...$types): void { $names = []; foreach ($types as $type) { assert($type instanceof ObjectType); $classQualifiedName = $type->className()->qualifiedName(); if (in_array($classQualifiedName, $names, true)) { throw new RuntimeException('An intersection type must not contain duplicate types'); } $names[] = $classQualifiedName; } } } PK!/㥮妊type/src/type/CallableType.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function assert; use function class_exists; use function count; use function explode; use function function_exists; use function is_array; use function is_object; use function is_string; use function str_contains; use Closure; use ReflectionClass; use ReflectionObject; final class CallableType extends Type { private bool $allowsNull; public function __construct(bool $nullable) { $this->allowsNull = $nullable; } public function isAssignable(Type $other): bool { if ($this->allowsNull && $other instanceof NullType) { return true; } if ($other instanceof self) { return true; } if ($other instanceof ObjectType) { if ($this->isClosure($other)) { return true; } if ($this->hasInvokeMethod($other)) { return true; } } if ($other instanceof SimpleType) { if ($this->isFunction($other)) { return true; } if ($this->isClassCallback($other)) { return true; } if ($this->isObjectCallback($other)) { return true; } } return false; } public function name(): string { return 'callable'; } public function allowsNull(): bool { return $this->allowsNull; } /** * @psalm-assert-if-true CallableType $this */ public function isCallable(): bool { return true; } private function isClosure(ObjectType $type): bool { return $type->className()->qualifiedName() === Closure::class; } private function hasInvokeMethod(ObjectType $type): bool { $className = $type->className()->qualifiedName(); assert(class_exists($className)); return (new ReflectionClass($className))->hasMethod('__invoke'); } private function isFunction(SimpleType $type): bool { if (!is_string($type->value())) { return false; } return function_exists($type->value()); } private function isObjectCallback(SimpleType $type): bool { if (!is_array($type->value())) { return false; } if (count($type->value()) !== 2) { return false; } if (!isset($type->value()[0], $type->value()[1])) { return false; } if (!is_object($type->value()[0]) || !is_string($type->value()[1])) { return false; } [$object, $methodName] = $type->value(); return (new ReflectionObject($object))->hasMethod($methodName); } private function isClassCallback(SimpleType $type): bool { if (!is_string($type->value()) && !is_array($type->value())) { return false; } if (is_string($type->value())) { if (!str_contains($type->value(), '::')) { return false; } [$className, $methodName] = explode('::', $type->value()); } if (is_array($type->value())) { if (count($type->value()) !== 2) { return false; } if (!isset($type->value()[0], $type->value()[1])) { return false; } if (!is_string($type->value()[0]) || !is_string($type->value()[1])) { return false; } [$className, $methodName] = $type->value(); } assert(isset($className) && is_string($className)); assert(isset($methodName) && is_string($methodName)); if (!class_exists($className)) { return false; } $class = new ReflectionClass($className); if (!$class->hasMethod($methodName)) { return false; } $method = $class->getMethod($methodName); return $method->isPublic() && $method->isStatic(); } } PK!@峣..type/src/ReflectionMapper.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; use function assert; use ReflectionFunction; use ReflectionIntersectionType; use ReflectionMethod; use ReflectionNamedType; use ReflectionType; use ReflectionUnionType; final class ReflectionMapper { /** * @psalm-return list */ public function fromParameterTypes(ReflectionFunction|ReflectionMethod $functionOrMethod): array { $parameters = []; foreach ($functionOrMethod->getParameters() as $parameter) { $name = $parameter->getName(); assert($name !== ''); if (!$parameter->hasType()) { $parameters[] = new Parameter($name, new UnknownType); continue; } $type = $parameter->getType(); if ($type instanceof ReflectionNamedType) { $parameters[] = new Parameter( $name, $this->mapNamedType($type, $functionOrMethod) ); continue; } if ($type instanceof ReflectionUnionType) { $parameters[] = new Parameter( $name, $this->mapUnionType($type, $functionOrMethod) ); continue; } if ($type instanceof ReflectionIntersectionType) { $parameters[] = new Parameter( $name, $this->mapIntersectionType($type, $functionOrMethod) ); } } return $parameters; } public function fromReturnType(ReflectionFunction|ReflectionMethod $functionOrMethod): Type { if (!$this->hasReturnType($functionOrMethod)) { return new UnknownType; } $returnType = $this->returnType($functionOrMethod); assert($returnType instanceof ReflectionNamedType || $returnType instanceof ReflectionUnionType || $returnType instanceof ReflectionIntersectionType); if ($returnType instanceof ReflectionNamedType) { return $this->mapNamedType($returnType, $functionOrMethod); } if ($returnType instanceof ReflectionUnionType) { return $this->mapUnionType($returnType, $functionOrMethod); } if ($returnType instanceof ReflectionIntersectionType) { return $this->mapIntersectionType($returnType, $functionOrMethod); } } private function mapNamedType(ReflectionNamedType $type, ReflectionFunction|ReflectionMethod $functionOrMethod): Type { if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'self') { return ObjectType::fromName( $functionOrMethod->getDeclaringClass()->getName(), $type->allowsNull() ); } if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'static') { return new StaticType( TypeName::fromReflection($functionOrMethod->getDeclaringClass()), $type->allowsNull() ); } if ($type->getName() === 'mixed') { return new MixedType; } if ($functionOrMethod instanceof ReflectionMethod && $type->getName() === 'parent') { return ObjectType::fromName( $functionOrMethod->getDeclaringClass()->getParentClass()->getName(), $type->allowsNull() ); } return Type::fromName( $type->getName(), $type->allowsNull() ); } private function mapUnionType(ReflectionUnionType $type, ReflectionFunction|ReflectionMethod $functionOrMethod): Type { $types = []; foreach ($type->getTypes() as $_type) { assert($_type instanceof ReflectionNamedType || $_type instanceof ReflectionIntersectionType); if ($_type instanceof ReflectionNamedType) { $types[] = $this->mapNamedType($_type, $functionOrMethod); continue; } $types[] = $this->mapIntersectionType($_type, $functionOrMethod); } return new UnionType(...$types); } private function mapIntersectionType(ReflectionIntersectionType $type, ReflectionFunction|ReflectionMethod $functionOrMethod): Type { $types = []; foreach ($type->getTypes() as $_type) { assert($_type instanceof ReflectionNamedType); $types[] = $this->mapNamedType($_type, $functionOrMethod); } return new IntersectionType(...$types); } private function hasReturnType(ReflectionFunction|ReflectionMethod $functionOrMethod): bool { if ($functionOrMethod->hasReturnType()) { return true; } return $functionOrMethod->hasTentativeReturnType(); } private function returnType(ReflectionFunction|ReflectionMethod $functionOrMethod): ?ReflectionType { if ($functionOrMethod->hasReturnType()) { return $functionOrMethod->getReturnType(); } return $functionOrMethod->getTentativeReturnType(); } } PK! type/src/Parameter.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Type; final class Parameter { /** * @psalm-var non-empty-string */ private string $name; private Type $type; /** * @psalm-param non-empty-string $name */ public function __construct(string $name, Type $type) { $this->name = $name; $this->type = $type; } public function name(): string { return $this->name; } public function type(): Type { return $this->type; } } PK!ㄞ type/infection.jsonnu刐迭{ "source": { "directories": [ "src" ] }, "mutators": { "@default": true }, "minMsi": 100, "minCoveredMsi": 100 } PK!E >螾P$code-unit-reverse-lookup/SECURITY.mdnu刐迭# Security Policy This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. **If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** ## Security Contact Information After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. PK!樧O *code-unit-reverse-lookup/.psalm/config.xmlnu刐迭 PK!aB俔$$,code-unit-reverse-lookup/.psalm/baseline.xmlnu刐迭 assert(is_array($traits)) is_array($traits) PK!KJuenvironment/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!KJuglobal-state/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!┋  global-state/src/ExcludeList.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\GlobalState; use function in_array; use function str_starts_with; use ReflectionClass; final class ExcludeList { private array $globalVariables = []; private array $classes = []; private array $classNamePrefixes = []; private array $parentClasses = []; private array $interfaces = []; private array $staticProperties = []; public function addGlobalVariable(string $variableName): void { $this->globalVariables[$variableName] = true; } public function addClass(string $className): void { $this->classes[] = $className; } public function addSubclassesOf(string $className): void { $this->parentClasses[] = $className; } public function addImplementorsOf(string $interfaceName): void { $this->interfaces[] = $interfaceName; } public function addClassNamePrefix(string $classNamePrefix): void { $this->classNamePrefixes[] = $classNamePrefix; } public function addStaticProperty(string $className, string $propertyName): void { if (!isset($this->staticProperties[$className])) { $this->staticProperties[$className] = []; } $this->staticProperties[$className][$propertyName] = true; } public function isGlobalVariableExcluded(string $variableName): bool { return isset($this->globalVariables[$variableName]); } /** * @psalm-param class-string $className */ public function isStaticPropertyExcluded(string $className, string $propertyName): bool { if (in_array($className, $this->classes, true)) { return true; } foreach ($this->classNamePrefixes as $prefix) { if (str_starts_with($className, $prefix)) { return true; } } $class = new ReflectionClass($className); foreach ($this->parentClasses as $type) { if ($class->isSubclassOf($type)) { return true; } } foreach ($this->interfaces as $type) { if ($class->implementsInterface($type)) { return true; } } return isset($this->staticProperties[$className][$propertyName]); } } PK!KJuexporter/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!KJurecursion-context/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!颣djrecursion-context/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [5.0.1] - 2025-08-10 ### Changed * Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5 ## [5.0.0] - 2023-02-03 ### Removed * This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 ## [4.0.5] - 2023-02-03 ### Fixed * [#26](https://github.com/sebastianbergmann/recursion-context/pull/26): Don't clobber `null` values if `array_key_exists(PHP_INT_MAX, $array)` ## [4.0.4] - 2020-10-26 ### Fixed * `SebastianBergmann\RecursionContext\Exception` now correctly extends `\Throwable` ## [4.0.3] - 2020-09-28 ### Changed * [#21](https://github.com/sebastianbergmann/recursion-context/pull/21): Add type annotations for in/out parameters * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [4.0.2] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [4.0.1] - 2020-06-15 ### Changed * Tests etc. are now ignored for archive exports [5.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/5.0.0...5.0.1 [5.0.0]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.5...5.0.0 [4.0.5]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.4...4.0.5 [4.0.4]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.1...4.0.2 [4.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.0...4.0.1 PK!N2屗;;complexity/composer.jsonnu刐迭{ "name": "sebastian/complexity", "description": "Library for calculating the complexity of PHP code units", "type": "library", "homepage": "https://github.com/sebastianbergmann/complexity", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", "security": "https://github.com/sebastianbergmann/complexity/security/policy" }, "prefer-stable": true, "require": { "php": ">=8.1", "nikic/php-parser": "^4.18 || ^5.0" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "config": { "platform": { "php": "8.1.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-main": "3.2-dev" } } } PK![驾complexity/README.mdnu刐迭[![Latest Stable Version](https://poser.pugx.org/sebastian/complexity/v/stable.png)](https://packagist.org/packages/sebastian/complexity) [![CI Status](https://github.com/sebastianbergmann/complexity/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/complexity/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/complexity/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/complexity) [![codecov](https://codecov.io/gh/sebastianbergmann/complexity/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/complexity) # sebastian/complexity Library for calculating the complexity of PHP code units. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/complexity ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/complexity ``` PK!KJucomplexity/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!%#2 7complexity/src/Visitor/ComplexityCalculatingVisitor.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use function assert; use function is_array; use PhpParser\Node; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Trait_; use PhpParser\NodeTraverser; use PhpParser\NodeVisitorAbstract; final class ComplexityCalculatingVisitor extends NodeVisitorAbstract { /** * @psalm-var list */ private array $result = []; private bool $shortCircuitTraversal; public function __construct(bool $shortCircuitTraversal) { $this->shortCircuitTraversal = $shortCircuitTraversal; } public function enterNode(Node $node): ?int { if (!$node instanceof ClassMethod && !$node instanceof Function_) { return null; } if ($node instanceof ClassMethod) { if ($node->getAttribute('parent') instanceof Interface_) { return null; } if ($node->isAbstract()) { return null; } $name = $this->classMethodName($node); } else { $name = $this->functionName($node); } $statements = $node->getStmts(); assert(is_array($statements)); $this->result[] = new Complexity( $name, $this->cyclomaticComplexity($statements), ); if ($this->shortCircuitTraversal) { return NodeTraverser::DONT_TRAVERSE_CHILDREN; } return null; } public function result(): ComplexityCollection { return ComplexityCollection::fromList(...$this->result); } /** * @param Stmt[] $statements * * @psalm-return positive-int */ private function cyclomaticComplexity(array $statements): int { $traverser = new NodeTraverser; $cyclomaticComplexityCalculatingVisitor = new CyclomaticComplexityCalculatingVisitor; $traverser->addVisitor($cyclomaticComplexityCalculatingVisitor); /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($statements); return $cyclomaticComplexityCalculatingVisitor->cyclomaticComplexity(); } /** * @psalm-return non-empty-string */ private function classMethodName(ClassMethod $node): string { $parent = $node->getAttribute('parent'); assert($parent instanceof Class_ || $parent instanceof Trait_); if ($parent->getAttribute('parent') instanceof New_) { return 'anonymous class'; } assert(isset($parent->namespacedName)); assert($parent->namespacedName instanceof Name); return $parent->namespacedName->toString() . '::' . $node->name->toString(); } /** * @psalm-return non-empty-string */ private function functionName(Function_ $node): string { assert(isset($node->namespacedName)); assert($node->namespacedName instanceof Name); $functionName = $node->namespacedName->toString(); assert($functionName !== ''); return $functionName; } } PK!;山,Acomplexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\BinaryOp\BooleanOr; use PhpParser\Node\Expr\BinaryOp\LogicalAnd; use PhpParser\Node\Expr\BinaryOp\LogicalOr; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Stmt\Case_; use PhpParser\Node\Stmt\Catch_; use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\For_; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\While_; use PhpParser\NodeVisitorAbstract; final class CyclomaticComplexityCalculatingVisitor extends NodeVisitorAbstract { /** * @psalm-var positive-int */ private int $cyclomaticComplexity = 1; public function enterNode(Node $node): void { switch ($node::class) { case BooleanAnd::class: case BooleanOr::class: case Case_::class: case Catch_::class: case ElseIf_::class: case For_::class: case Foreach_::class: case If_::class: case LogicalAnd::class: case LogicalOr::class: case Ternary::class: case While_::class: $this->cyclomaticComplexity++; } } /** * @psalm-return positive-int */ public function cyclomaticComplexity(): int { return $this->cyclomaticComplexity; } } PK! 曀$9 9 complexity/src/Calculator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use function assert; use function file_get_contents; use PhpParser\Error; use PhpParser\Node; use PhpParser\NodeTraverser; use PhpParser\NodeVisitor\NameResolver; use PhpParser\NodeVisitor\ParentConnectingVisitor; use PhpParser\ParserFactory; final class Calculator { /** * @throws RuntimeException */ public function calculateForSourceFile(string $sourceFile): ComplexityCollection { return $this->calculateForSourceString(file_get_contents($sourceFile)); } /** * @throws RuntimeException */ public function calculateForSourceString(string $source): ComplexityCollection { try { $nodes = (new ParserFactory)->createForHostVersion()->parse($source); assert($nodes !== null); return $this->calculateForAbstractSyntaxTree($nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), $error->getCode(), $error, ); } // @codeCoverageIgnoreEnd } /** * @param Node[] $nodes * * @throws RuntimeException */ public function calculateForAbstractSyntaxTree(array $nodes): ComplexityCollection { $traverser = new NodeTraverser; $complexityCalculatingVisitor = new ComplexityCalculatingVisitor(true); $traverser->addVisitor(new NameResolver); $traverser->addVisitor(new ParentConnectingVisitor); $traverser->addVisitor($complexityCalculatingVisitor); try { /* @noinspection UnusedFunctionResultInspection */ $traverser->traverse($nodes); // @codeCoverageIgnoreStart } catch (Error $error) { throw new RuntimeException( $error->getMessage(), $error->getCode(), $error, ); } // @codeCoverageIgnoreEnd return $complexityCalculatingVisitor->result(); } } PK!-mm&complexity/src/Exception/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use Throwable; interface Exception extends Throwable { } PK!lE緝-complexity/src/Exception/RuntimeException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; final class RuntimeException extends \RuntimeException implements Exception { } PK! ;;(complexity/src/Complexity/Complexity.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use function str_contains; /** * @psalm-immutable */ final class Complexity { /** * @psalm-var non-empty-string */ private readonly string $name; /** * @psalm-var positive-int */ private int $cyclomaticComplexity; /** * @psalm-param non-empty-string $name * @psalm-param positive-int $cyclomaticComplexity */ public function __construct(string $name, int $cyclomaticComplexity) { $this->name = $name; $this->cyclomaticComplexity = $cyclomaticComplexity; } /** * @psalm-return non-empty-string */ public function name(): string { return $this->name; } /** * @psalm-return positive-int */ public function cyclomaticComplexity(): int { return $this->cyclomaticComplexity; } public function isFunction(): bool { return !$this->isMethod(); } public function isMethod(): bool { return str_contains($this->name, '::'); } } PK!h:complexity/src/Complexity/ComplexityCollectionIterator.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use Iterator; final class ComplexityCollectionIterator implements Iterator { /** * @psalm-var list */ private readonly array $items; private int $position = 0; public function __construct(ComplexityCollection $items) { $this->items = $items->asArray(); } public function rewind(): void { $this->position = 0; } public function valid(): bool { return isset($this->items[$this->position]); } public function key(): int { return $this->position; } public function current(): Complexity { return $this->items[$this->position]; } public function next(): void { $this->position++; } } PK!墄縣m m 2complexity/src/Complexity/ComplexityCollection.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Complexity; use function array_filter; use function array_merge; use function array_reverse; use function array_values; use function count; use function usort; use Countable; use IteratorAggregate; /** * @psalm-immutable */ final class ComplexityCollection implements Countable, IteratorAggregate { /** * @psalm-var list */ private readonly array $items; public static function fromList(Complexity ...$items): self { return new self($items); } /** * @psalm-param list $items */ private function __construct(array $items) { $this->items = $items; } /** * @psalm-return list */ public function asArray(): array { return $this->items; } public function getIterator(): ComplexityCollectionIterator { return new ComplexityCollectionIterator($this); } /** * @psalm-return non-negative-int */ public function count(): int { return count($this->items); } public function isEmpty(): bool { return empty($this->items); } /** * @psalm-return non-negative-int */ public function cyclomaticComplexity(): int { $cyclomaticComplexity = 0; foreach ($this as $item) { $cyclomaticComplexity += $item->cyclomaticComplexity(); } return $cyclomaticComplexity; } public function isFunction(): self { return new self( array_values( array_filter( $this->items, static fn (Complexity $complexity): bool => $complexity->isFunction(), ), ), ); } public function isMethod(): self { return new self( array_values( array_filter( $this->items, static fn (Complexity $complexity): bool => $complexity->isMethod(), ), ), ); } public function mergeWith(self $other): self { return new self( array_merge( $this->asArray(), $other->asArray(), ), ); } public function sortByDescendingCyclomaticComplexity(): self { $items = $this->items; usort( $items, static function (Complexity $a, Complexity $b): int { return $a->cyclomaticComplexity() <=> $b->cyclomaticComplexity(); }, ); return new self(array_reverse($items)); } } PK!幸Hcomplexity/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [3.2.0] - 2023-12-21 ### Added * `ComplexityCollection::sortByDescendingCyclomaticComplexity()` ### Changed * This component is now compatible with `nikic/php-parser` 5.0 ## [3.1.0] - 2023-09-28 ### Added * `Complexity::isFunction()` and `Complexity::isMethod()` * `ComplexityCollection::isFunction()` and `ComplexityCollection::isMethod()` * `ComplexityCollection::mergeWith()` ### Fixed * Anonymous classes are not processed correctly ## [3.0.1] - 2023-08-31 ### Fixed * [#7](https://github.com/sebastianbergmann/complexity/pull/7): `ComplexityCalculatingVisitor` tries to process interface methods ## [3.0.0] - 2023-02-03 ### Removed * This component is no longer supported on PHP 7.3, PHP 7.4 and PHP 8.0 ## [2.0.2] - 2020-10-26 ### Fixed * `SebastianBergmann\Complexity\Exception` now correctly extends `\Throwable` ## [2.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [2.0.0] - 2020-07-25 ### Removed * The `ParentConnectingVisitor` has been removed (it should have been marked as `@internal`) ## [1.0.0] - 2020-07-22 * Initial release [3.2.0]: https://github.com/sebastianbergmann/complexity/compare/3.1.0...3.2.0 [3.1.0]: https://github.com/sebastianbergmann/complexity/compare/3.0.1...3.1.0 [3.0.1]: https://github.com/sebastianbergmann/complexity/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/complexity/compare/2.0.2...3.0.0 [2.0.2]: https://github.com/sebastianbergmann/complexity/compare/2.0.1...2.0.2 [2.0.1]: https://github.com/sebastianbergmann/complexity/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/complexity/compare/1.0.0...2.0.0 [1.0.0]: https://github.com/sebastianbergmann/complexity/compare/70ee0ad32d9e2be3f85beffa3e2eb474193f2487...1.0.0 PK!碢@冫complexity/LICENSEnu刐迭BSD 3-Clause License Copyright (c) 2020-2023, Sebastian Bergmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!E >螾Pversion/SECURITY.mdnu刐迭# Security Policy This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. **If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** ## Security Contact Information After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. PK!>Bt簜version/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [4.0.1] - 2023-02-07 ### Fixed * [#17](https://github.com/sebastianbergmann/version/pull/17): Release archive contains unnecessary assets ## [4.0.0] - 2023-02-03 ### Changed * `Version::getVersion()` has been renamed to `Version::asString()` ### Removed * This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 ## [3.0.2] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [3.0.1] - 2020-06-26 ### Added * This component is now supported on PHP 8 ## [3.0.0] - 2020-01-21 ### Removed * This component is no longer supported on PHP 7.1 and PHP 7.2 [4.0.1]: https://github.com/sebastianbergmann/version/compare/4.0.0...4.0.1 [4.0.0]: https://github.com/sebastianbergmann/version/compare/3.0.2...4.0.0 [3.0.2]: https://github.com/sebastianbergmann/version/compare/3.0.1...3.0.2 [3.0.1]: https://github.com/sebastianbergmann/version/compare/3.0.0...3.0.1 [3.0.0]: https://github.com/sebastianbergmann/version/compare/2.0.1...3.0.0 PK!E >螾Pobject-reflector/SECURITY.mdnu刐迭# Security Policy This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. **If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** ## Security Contact Information After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. PK!E >螾Pobject-enumerator/SECURITY.mdnu刐迭# Security Policy This library is intended to be used in development environments only. For instance, it is used by the testing framework PHPUnit. There is no reason why this library should be installed on a webserver. **If you upload this library to a webserver then your deployment process is broken. On a more general note, if your `vendor` directory is publicly accessible on your webserver then your deployment process is also broken.** ## Security Contact Information After the above, if you still would like to report a security vulnerability, please email `sebastian@phpunit.de`. PK!荹9_cli-parser/composer.jsonnu刐迭{ "name": "sebastian/cli-parser", "description": "Library for parsing CLI options", "type": "library", "homepage": "https://github.com/sebastianbergmann/cli-parser", "license": "BSD-3-Clause", "authors": [ { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de", "role": "lead" } ], "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy" }, "prefer-stable": true, "require": { "php": ">=8.1" }, "require-dev": { "phpunit/phpunit": "^10.0" }, "config": { "platform": { "php": "8.1.0" }, "optimize-autoloader": true, "sort-packages": true }, "autoload": { "classmap": [ "src/" ] }, "extra": { "branch-alias": { "dev-main": "2.0-dev" } } } PK!b导++cli-parser/README.mdnu刐迭[![Latest Stable Version](https://poser.pugx.org/sebastian/cli-parser/v/stable.png)](https://packagist.org/packages/sebastian/cli-parser) [![CI Status](https://github.com/sebastianbergmann/cli-parser/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/cli-parser/actions) [![Type Coverage](https://shepherd.dev/github/sebastianbergmann/cli-parser/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/cli-parser) [![codecov](https://codecov.io/gh/sebastianbergmann/cli-parser/branch/main/graph/badge.svg)](https://codecov.io/gh/sebastianbergmann/cli-parser) # sebastian/cli-parser Library for parsing `$_SERVER['argv']`, extracted from `phpunit/phpunit`. ## Installation You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): ``` composer require sebastian/cli-parser ``` If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency: ``` composer require --dev sebastian/cli-parser ``` PK!KJucli-parser/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!jk cli-parser/src/Parser.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function array_map; use function array_merge; use function array_shift; use function array_slice; use function assert; use function count; use function current; use function explode; use function is_array; use function is_int; use function is_string; use function key; use function next; use function preg_replace; use function reset; use function sort; use function str_ends_with; use function str_starts_with; use function strlen; use function strstr; use function substr; final class Parser { /** * @psalm-param list $argv * @psalm-param list $longOptions * * @psalm-return array{0: array, 1: array} * * @throws AmbiguousOptionException * @throws OptionDoesNotAllowArgumentException * @throws RequiredOptionArgumentMissingException * @throws UnknownOptionException */ public function parse(array $argv, string $shortOptions, ?array $longOptions = null): array { if (empty($argv)) { return [[], []]; } $options = []; $nonOptions = []; if ($longOptions) { sort($longOptions); } if (isset($argv[0][0]) && $argv[0][0] !== '-') { array_shift($argv); } reset($argv); $argv = array_map('trim', $argv); while (false !== $arg = current($argv)) { $i = key($argv); assert(is_int($i)); next($argv); if ($arg === '') { continue; } if ($arg === '--') { $nonOptions = array_merge($nonOptions, array_slice($argv, $i + 1)); break; } if ($arg[0] !== '-' || (strlen($arg) > 1 && $arg[1] === '-' && !$longOptions)) { $nonOptions[] = $arg; continue; } if (strlen($arg) > 1 && $arg[1] === '-' && is_array($longOptions)) { $this->parseLongOption( substr($arg, 2), $longOptions, $options, $argv, ); continue; } $this->parseShortOption( substr($arg, 1), $shortOptions, $options, $argv, ); } return [$options, $nonOptions]; } /** * @throws RequiredOptionArgumentMissingException */ private function parseShortOption(string $argument, string $shortOptions, array &$options, array &$argv): void { $argumentLength = strlen($argument); for ($i = 0; $i < $argumentLength; $i++) { $option = $argument[$i]; $optionArgument = null; if ($argument[$i] === ':' || ($spec = strstr($shortOptions, $option)) === false) { throw new UnknownOptionException('-' . $option); } if (strlen($spec) > 1 && $spec[1] === ':') { if ($i + 1 < $argumentLength) { $options[] = [$option, substr($argument, $i + 1)]; break; } if (!(strlen($spec) > 2 && $spec[2] === ':')) { $optionArgument = current($argv); if (!$optionArgument) { throw new RequiredOptionArgumentMissingException('-' . $option); } assert(is_string($optionArgument)); next($argv); } } $options[] = [$option, $optionArgument]; } } /** * @psalm-param list $longOptions * * @throws AmbiguousOptionException * @throws OptionDoesNotAllowArgumentException * @throws RequiredOptionArgumentMissingException * @throws UnknownOptionException */ private function parseLongOption(string $argument, array $longOptions, array &$options, array &$argv): void { $count = count($longOptions); $list = explode('=', $argument); $option = $list[0]; $optionArgument = null; if (count($list) > 1) { $optionArgument = $list[1]; } $optionLength = strlen($option); foreach ($longOptions as $i => $longOption) { $opt_start = substr($longOption, 0, $optionLength); if ($opt_start !== $option) { continue; } $opt_rest = substr($longOption, $optionLength); if ($opt_rest !== '' && $i + 1 < $count && $option[0] !== '=' && str_starts_with($longOptions[$i + 1], $option)) { throw new AmbiguousOptionException('--' . $option); } if (str_ends_with($longOption, '=')) { if (!str_ends_with($longOption, '==') && !strlen((string) $optionArgument)) { if (false === $optionArgument = current($argv)) { throw new RequiredOptionArgumentMissingException('--' . $option); } next($argv); } } elseif ($optionArgument) { throw new OptionDoesNotAllowArgumentException('--' . $option); } $fullOption = '--' . preg_replace('/={1,2}$/', '', $longOption); $options[] = [$fullOption, $optionArgument]; return; } throw new UnknownOptionException('--' . $option); } } PK!@1渓l'cli-parser/src/exceptions/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use Throwable; interface Exception extends Throwable { } PK! ?3Acli-parser/src/exceptions/OptionDoesNotAllowArgumentException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class OptionDoesNotAllowArgumentException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Option "%s" does not allow an argument', $option, ), ); } } PK!男瓅|4cli-parser/src/exceptions/UnknownOptionException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class UnknownOptionException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Unknown option "%s"', $option, ), ); } } PK! ,x6cli-parser/src/exceptions/AmbiguousOptionException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class AmbiguousOptionException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Option "%s" is ambiguous', $option, ), ); } } PK!亷顆Dcli-parser/src/exceptions/RequiredOptionArgumentMissingException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\CliParser; use function sprintf; use RuntimeException; final class RequiredOptionArgumentMissingException extends RuntimeException implements Exception { public function __construct(string $option) { parent::__construct( sprintf( 'Required argument for option "%s" is missing', $option, ), ); } } PK!矅┽LLcli-parser/ChangeLog.mdnu刐迭# ChangeLog All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. ## [2.0.1] - 2024-03-02 ### Changed * Do not use implicitly nullable parameters ## [2.0.0] - 2023-02-03 ### Removed * This component is no longer supported on PHP 7.3, PHP 7.4, and PHP 8.0 ## [1.0.1] - 2020-09-28 ### Changed * Changed PHP version constraint in `composer.json` from `^7.3 || ^8.0` to `>=7.3` ## [1.0.0] - 2020-08-12 * Initial release [2.0.1]: https://github.com/sebastianbergmann/cli-parser/compare/2.0.0...2.0.1 [2.0.0]: https://github.com/sebastianbergmann/cli-parser/compare/1.0.1...2.0.0 [1.0.1]: https://github.com/sebastianbergmann/cli-parser/compare/1.0.0...1.0.1 [1.0.0]: https://github.com/sebastianbergmann/cli-parser/compare/bb7bb3297957927962b0a3335befe7b66f7462e9...1.0.0 PK!жkcli-parser/LICENSEnu刐迭BSD 3-Clause License Copyright (c) 2020-2024, Sebastian Bergmann All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. PK!KJudiff/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!KJucomparator/SECURITY.mdnu刐迭# Security Policy If you believe you have found a security vulnerability in the library that is developed in this repository, please report it to us through coordinated disclosure. **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** Instead, please email `sebastian@phpunit.de`. Please include as much of the information listed below as you can to help us better understand and resolve the issue: * The type of issue * Full paths of source file(s) related to the manifestation of the issue * The location of the affected source code (tag/branch/commit or direct URL) * Any special configuration required to reproduce the issue * Step-by-step instructions to reproduce the issue * Proof-of-concept or exploit code (if possible) * Impact of the issue, including how an attacker might exploit the issue This information will help us triage your report more quickly. ## Web Context The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. The library is developed with a focus on development environments and the command-line. No specific testing or hardening with regard to using the library in an HTTP or web context or with untrusted input data is performed. The library might also contain functionality that intentionally exposes internal application data for debugging purposes. If the library is used in a web application, the application developer is responsible for filtering inputs or escaping outputs as necessary and for verifying that the used functionality is safe for use within the intended context. Vulnerabilities specific to the use outside a development context will be fixed as applicable, provided that the fix does not have an averse effect on the primary use case for development purposes. PK!t 閙m'comparator/src/exceptions/Exception.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; use Throwable; interface Exception extends Throwable { } PK!必觾.comparator/src/exceptions/RuntimeException.phpnu刐迭 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Comparator; final class RuntimeException extends \RuntimeException implements Exception { } PK!謧鬁暅暅1type/6c86af81e3d675f46bfc7bded8179ef036eacbe6.zipnu誌w洞PK G 釴 sebastianbergmann-type-3aaaa15/UTg]PK G 釴拿e9- sebastianbergmann-type-3aaaa15/.gitattributesUTg]/tools export-ignore PK G 釴' sebastianbergmann-type-3aaaa15/.github/UTg]PK G 釴1酳)2 sebastianbergmann-type-3aaaa15/.github/FUNDING.ymlUTg]patreon: s_bergmann PK G 釴婰箱) sebastianbergmann-type-3aaaa15/.gitignoreUTg]mT遫6~譥q繼短挾都uNV$▉翭袵儮N峙沈$頮e舦A换飤恥鍆空\郧烰+葶tL朾悡3c▽欲D酆P坷=b`盖鴂Pd頽n頻Dc鑯朐Vdq_z繅. #tX鰆D枱蒠168jaSK攎6貹r脌V51z井k汄<敎紈!V,蓇痥磂鈀匟 罪⺻(TT睪Mi鄻寒èEU_]誒.熨+嵳骮NpT肩K(壁a臦EbI笫趻嶳 剕B笹訊>∨"缎9gh'蒂笒FQ碙\瀡}靕譜E祋)h)鳰T胺殂|暪,繘3芿q爷鶤7却摵^i渟A焸j (粅総3$洼{q葲盧矄餌暍+i7@8遺撦蛅橹垤\頬2-喑6〦\浤)7u!$扚=倪h陘阍Y薁燯b< 喃朂d~@荬E%8U8e淂:cW潩帉|軻j弲鋄6塋[^#緍v玎鲑07iG鲈耡4o0F蚜s楘蔉爆u凬.殜叅书鎘\s灹微夊"做(5s镲g珚F1摬9伋巈 <腋餜|@o茮/鞝7囻欚~腴樥V,耳涓喷q[庒!g鍶卺Q^ 轾<5丞&闰!"鸲%Y餭c兹Q #Y刢A闼灯颕 >腈I鼷晗逜%R唦H鎁<鷊氍e;鈁9=++~PK G 釴% sebastianbergmann-type-3aaaa15/.idea/UTg]PK G 釴8 sebastianbergmann-type-3aaaa15/.idea/inspectionProfiles/UTg]PK G 釴鶎nK sebastianbergmann-type-3aaaa15/.idea/inspectionProfiles/Project_Default.xmlUTg]蚞mo鄹猖~~E邢生鞛{vq庛搭&v庡ぽ-67⿸T髯R掑4睌Xd/P腘C蜥藀83緧e欼A9$ワ迣勎hlWJ 哙c8$偓▃笄?帋辠庮ㄒP蜉洘 麺fX筯-輰狍脱9黌4ytF$珂蚎*怨憭艤hM?M.e抯hFEBE台~sDYp毤{$\C鬁轖艇a希Ox4~_/6竽酻鍥`*鏒跤[2變r巉d,鴓:滾;@p諳抝紱鏕圪@G"朖吝g481謬 喤鑽乒ⅶL$L琭rxd蠤, ,3Sl拮毉D函 蓥`(屭T$ !ST泐漅 6 7#24櫒3 M簮<澡#省孴○蕧5猔W6斫 Y@D漏A槗r鬾嶍. 切層权<6"鼘!媍w{惍狼R 犹l偏&漠"087絥嚐薇爞髠&z榽蹾. 毋H霚戥@鎿=8bje7 bZL~v訩d.W ~y"EX%#痗$「A昹:@铷k邽弻微X艎e{%惝5JA壺7痳奅藙唯*哯 6;墽2*鑋紟 u杮艑、爼d'楽氫"#則颴'盪5l5ID枖镅~;墳Bz?㭎|>橿鰃I鳣x淿 8O{輰祼躂巗毭jw恔#-] 誱飊_刊?Z ╄ (JRE0 禿q濌[6蟾L洩螾6除䥽C#途A喛魐 宽9╞瞷廸豁虉ZQ恳恋aY;歑G(帖#!(猽 梽]鞙<痘s鳣 6隌rV噰'MJPx3l 掏B Y]烡唞51 跀绋铰0U:o v璹Uh'蒁 d秹h g-嫿N0=d頢AV'廳|杇溑牣垿dA筥倒蔓搉F"蚩i*k$pn}"聱e>R>剭0媼濤*_G 箩稫婞hN#}硚 書\ 颩z&.;>疯S5g"Wl橏巍g騖2 Q3yA嵉駞 疊钸=歍w命 {%a 糵貓笝Ot\)m揈釞篲痨n6學}躚杊紴=靌{Fi+j勳3殱烻穅T>$挴制^灭囆4e1[+ p6颺DyF3% &廷tGD蹚按%箨r醦9&=標+礉Tb%腰uF鵭挍,7鸵佉杮z膙s鐦X爙`莁PT+v葪丩hA鏮 鉥lg=翉傿蓋O)(P)O硸吙囹=铊a読!踌m`膟2馣攇X罸r郥店棼K)6_*镨矇vi檬佛佂 AhV厓盹+B夠u崟l籁 牺簹肃2&祴铺频Z嶭 蓬d稾.W壛?漲偯Zr趻`蚌5X4歡@耭 癍Q$nX[W6o仧6蠱-4w猱 奣9绮a筼率K貾萅vCKwD禈],諉h軞-&経I擥姹硲-綿M\a%翻羴投+ g諉\!璲nI麉%憏籙纄漦舨[q 驾丰篍5籹饌Z疈A6;习bR劎虂"圩*i(nG榅mme肾0p.3#眞%`E煵-焱f藲vL01簭船c/"蚚C1]怓; Oi*說炿禿藊E-算^本v肪倆]=乔 *n薥\摘导爅3*/砏 rlP髸C儦鞧fXJ鏛$簟U'彿方篎眥漥蜼爯 t讱(=-Pv/^縚Su四⿸稵唇:豑_燸Z0ι)l("駧判刡r&薿燨好掤1A儎歜:P?曑387E#‐)喑^1M氏h(轔$}j"7^/'v!=菤 仞8膧K存;*,穾 n+-郀ッV(;玻"hq龕艄 F9%3豉ir仇7閶x-U冏I菒]L雜>咓棡锉淜婥|煜t柔[洬S鴒J簷,褋l霹鮉/豵C#+_贂+7#?q丿?Eh厔瀋筨刓<5魋蹎&~瘿璤诘;#二斩_谄察o5謆n滓摑跁m?7宲敘94苷侈{糈輛:欵侦/uN穂螯~>鼃u1宖罅d|3淔鲽~jnOγ鵻r6寙躇l2?滾.嘄顸f詿G畅韢珓塯覍独C趕 峟ta.@ 坔哬)9/皟繤该﨣鑢V)9簃敟飝tHE Zl,忑咍驅'4~#ゎeu婗= f5晈魕砀#a:Py闿k萿|鐆rO櫣g歂2j鳛鱹1bt+码=吹Fa圵rIL鸡瓀P`Ka#韶7淢!@6蹾&)偩齼蹨BRM)L-a)梦@;#嗍禐蒙0嘷sbM $U眞lt瑭晋yV翋秮3傥蠖郹Tb #1AM勃藑(4腠b@鵁湭蚿欇w咵@揕斮辥洦/i:[ 鍟!Ye 詙lA饯f-+K垢蟨L癕%半,!> b_●z|溄:屁Qz紨jH怩1/Ⅺ烸餽鄣m櫶幊\瘡鯕-捅F弒醻%Ir 莽++溇V莩搮苀绁冹岢漄l憱?vy4嶌輰_"t踜渟>Z鶇紥℅3麸-.l%g鞥'T]g?腄W箶鬖炓Zt'姧嗛霫摜U韎语斣衧n'z泊~尦5鸔燢!鍏O娻4贋贀ヵ晱b'Wn*"7伙:X%,,匍纄n皾Rn并┯瀘譈P芴Dm羧!鈽r6w`b╭ 棔Z遂z愲 檏<碄v[0q拔W駌酐,+皣銂U@腜l诞,)86 ,1差鳅>D缞gE4e褶!* 6蠷烇 芝>樝居肿駛:諥/谺翚^O/B 3晚誄坱%趝霙 7d *迩ㄈ琄?Fg页眨劜只旘箁p,悆霤-趴AY\%h岇藘w 暽<扶&h痦敶b鍗FǖtfIih g巼熩w&"@^5勢楈亂;v釟溪Av玊鹳殬3I0,.壓M浣↖ 觖)吜螌8 醻W~殐D貛!n駣╣勹4_A .2夬 K芛婠-=s鞠8$爲0t妍艔+邟朋f{公曀-:鹙L挮@y瀹諤萭2 膖滴禞蔋T濺蜋) 3v切A鄑優劇@e\瓮巵g隌寰<鐋tCY2ZeoB製6譅 陷極茔(2襝i0穅D叾.亪當;宐眜е;o菂镃頭8srpzL}攭4W搶>诲簢)R>监隢"侜P砢~冺呪B3篓騌m1$ :M[2aT3霐噝叄.偅傖* 5伉╙籬k_T^]禚|䴗髑u撝mJW"}!&暪~彈s>g﹫-#襅烍$'%+0f◣Y誊'MSJ'鏰弻/=;Q-鞗2鼘b{*跓緡磞裰'T5>瘁!宍弃0T┶逍nO锿轲j2澩/GQ甄覫f8餆輰⑸t4孼> 鄜2沁(倒K=旪`4'6沭荊砧殬烗貾朙<碣4渚怦6k`絵ピ&柁湦烹薽脶冲8襔晣僷E段r撂壊瘣熦:Mi頱8欔昣O奣8s燶滆(靠謷瘳w繓2kH勢 -0蜪琌栰々W<婈箯鼸橷簼肢卷7雇'RK%禣Hfs鯹愹闶r-nA瘱h&F憜渕)互洘掭RGICn簜$K襩(糦 Yl+抢mi帖#:%@{赶>F腐B朮踄l(&H膜aE2碫蹯夕俌aEП~汈煜苽J鯲*O醄cQ解砮a%5崨粙郾W|6匹%嬡>U驭瑵匣謊_园@吶j;频]&奟湠.R澑i R痀A0槄7ム觮A碼nc蝩 阂锁‵圣誸輀髏脰 鉪a'替觽-棈諟m+7惄v¦{-挕朎S|h/i:A鍫岽O歊u顖:Il娷颴Je/觿7愞=KW/"44=澶頂_1犊7嗒KR诮T= 稻滝eZ{→a焖$7撳攢ㄢY囑}蹲3XF9稟秧.15 瘍4^8襳Y' 呇駲鴯gQ意蓹>紵$ci鉯掔i爇hN牣萛嚻蛵塜Y'囀)讥苉鱺$廂i硪 蜚!W褴h 埅嫘&鷾憄3}ZG箩Z膆轑踈痦炝饔9J02k葿9 $萙+zH厓夺.v!(Fr '釄i,蠄!懱Un~萆W其-L攘"XK灉牻8輨Cf .褬巭_銶 *樸=Ik/(牡O℃ L谄狵杞>` iM冄n棰滢缰吾ǚ椶4.Z艆鼷 񴦳EA(珼o怡o呆 $賊欭跐c lr扠抈寚” 鄮Z朐 查u捩较兣滣g叶X鐚颏Z)% q卷@*b^藝. 渨^愖D穄繢鱐Y_功鱟粶漤蒔巯W頀啰0坜\_灩" 欭丕纼叐n练駮a縂迯凵wY濧)嵼[蓒,;谫5飨 袧〖kp筭 0鎻&M 鬜犄桢`譚憫腹^u驭舥痒*|-澓+'哐讅彺<5f圩2遛ZM:贠O摚#*縃 ER$抨滏&靗+_ *<筐髩.2:][9&3矠@A 鰃|溕吱姬璭;f9荔:圵錌y| Z慔@E?厦"f ~?躕廷1词K(A6RRR&?|N57貘7縃e; K賽<穩≈ K-Z揇辿>_^lY洲$2&b瘉9縓嵊莑Q垆o+C樢"梷:铕伣 駨肺K_PK G 釴鐱"1- sebastianbergmann-type-3aaaa15/.idea/misc.xmlUTg]E岮 0E=0{瓊垕$]諈笅 摹D扞H余 ヨ鲶䓖b曭"K<6O煆腩們闐蜀M饵@RdlI紮j赐.M4杉r崒┐銌y糜b&篠%廝峗:3B縵麩概PK G 釴榷0 sebastianbergmann-type-3aaaa15/.idea/modules.xmlUTg]}螹 侤嗷縝兼t坧跣H"v嶦'圬Y专煩X3a黅<6耯媊uaJ+鐋?[Ayam 鲿K3弘>q%,烣4ugd鹀鶓v:譮弲憱鐹+吉J'熥3蓯橮E!哸瞲恃衧蕿ⅳ.穵"R$*+絗We扞h)茀s"┄I{鏴tH瑀"/G >:&朑!椖 *J,捘[-茞,E)! 铉 鋭涘5繬 蛸j:暛鞹6b?tA宊泥璽 郔)愼毓4X爕婛=黿铑庰'R璅賽F.僣弫V跎£@g嶝鉧:.;宺7鱟餫=2屲齞瓟(飫魖([3D俆⑺犷m瀳K帽軏&賮崤僃詌+F5R5卫7"J郏;豿棧駓搄6梍h詗裒;o>B孯4%觝v-yO〝<=慂y &m枹X23呂唞霜鴪 9{_熻&b#皎<&湀U漢鏪颒c剥烳 @_匭魱唹{+;nj95@N苮撫鴅1帲睬z=聀鴅型4栈/}9y溡/2Г儭朖闍頊氞yP跄薘dU奪lL哞\+園'趮裓淓"0cK Gl'xLa\uVRh夿G坦 tw萚庩]貽Oe帮R僦$鈉孖u%:MTK9楪/J攉玧WbH #潇巭wN荿'LQ瑎K/:v嘏谧;h|+屬腔 -7|崸b歕倹㏑=&>72鱘)貂﹟玿3c嵱貳~王燒兯v;yKg聛=:洆_讣"浞 U鮧]XF甉p齰?PK G 釴謣d* sebastianbergmann-type-3aaaa15/.travis.ymlUTg]璖遦0~譥q凚虐 轵襱 憾,軸)F%[C枌NJ~';Y2鲆炅;菹>Y釟$5兙Op<?=>3M韼盢腵9HX隷J-孧Aa禿菧:丵瞙Jm溋v1$艠r涭{虛.W胝蒡踛=煷Tlr鰡*鎷弃J豤鹜忡韈辜䅟縙(on_蓹s绻q詨愌x傾84T逷8j槡Fa0V)韮*嵜H3庿L嬭脚B鳕H獶郣葨f説xz偵舏樏e灍 妒bc *嗇岿S_嫧噔黳W犕RoT嬥閮*p蔍 蔪鷛g鞢QW3憿み魨庖fi~效畚2&4-δ$%璥蘏 l崴;檪幮曝悻>kE盨銒祚1纾袴娂!VuD淹"棷玵姚ZxB;誓煬#JXRZX8awhp岕A>櫖倨%rm9Y鴛鈸7H锎ix鑐[*5S"揠!姘売 勵柪巼D溳怋橡]绲彊车褮S%蚐V^;& 劢韡9榬猳UǔHC" PK G 釴W/40+ sebastianbergmann-type-3aaaa15/ChangeLog.mdUTg]潚O徲0棚#趼"5墰掖{玍癊,郥L钞m邶鲐I 9櫳飴邲艽4xgB禯儽乹 喯X 廻JPB<*鲷^&#?!:`p驰~箎w 羃琦S, {摊纔4鷮愘 4sXt3/獃盚|P( y;@h=v冢c濖证鼽婐跖樓X騢 '灁'フ渘*艍壮5忇?a鑛L>媋}摆2鶝$樦湁эuoDP謉畊噃鐂瑁由謸@駰@5 l9╩7襍z婴g{T李U$V#禞 M4巌鑀c2撉噭h鴁X0糘{羅喑-j乇.1)厙菝啡椓莔hTh{>l伹垕x帽kyt莨氲嗡UU^2m5!(!,檪D'袀L裚 *&%S臈亰?爞L馷j韶扸梜I 軘t,懽e% 赊%ZQ匋PK G 釴$惢1,& sebastianbergmann-type-3aaaa15/LICENSEUTg]礣_忊6鳔萦mqm呲毮ざ弫榏K$F辟諂(渮瘆泷蛨`w]埉磕彄e,鳔徤郊F俖 繇 添2t勠輄ё觵tq舟?g彁L6亻亡3茢韂垞蹪s#tc鏯翇鼀谯t硈c7}懒OC揉菖W餝缛呋冔w怉7Y8賗p1Ns=鈑衩"锐柽蔌{?鰩&疗儫鄘I飡|w5`敷oT簡`粞韒唀鄨`剄灳讉岥c;蛜B竔@wu2悜 ㄜy癱靚鷤醷琇0t袾;唟衖:XゎG_晆⿷p莕挨;44t@(瑙俺.h脙{嫉(f鹧%\U饩k桪?膚汓u 滌6 碜D;4^)剫硳t0喙Q醭,D-槙糿禞.WVuYW轛F蓎kjベ'骃*餵 鈁諴+愲嗚奧F 潄-d堤牚 +錤|f,扊 瑓蔠鴵蟚)6-ぉ悑-悓C脮憏[rM珰Z [呍y慑Z3dGF息2燱,墣輂譀J(揀hJ社D& 〥n韧跄囼JiD. 袈6籦j駑嫃_%Z鹼O刔伹Dp$y$c 簼k#Mk,牒H9ke.鬢V:呎j!冡!0)龝误VK YWO8 ΒX伪礖嶂U矈誮K爺A>兺J嘟|TH爂2 E#禷骱怸敠1禥詥`跭c鯸0隲A饑l +<诎D④ヌMEGq湣寵K苖U那6<%曙蟝$刖?憥?鄪螬Y3 児5胓駲梅=6p 3"褍MWrut±i5,q 逺茟毶\/9lM]鲪3椸甎x.囝o⒒e韬J+PK G 釴鳘霉P( sebastianbergmann-type-3aaaa15/build.xmlUTg]綋盢0嗺>卐16啢*!泵个%5ul藈E坵荌 2Td"珞輜繐b筴 k!爒朵黧;卫JТ璌鼧=疱bV^A尝亽踊T"*9E3柈侱╝7夢`朶鯲浩;劺笈焯6 赟/蛾症g毹峛"惍$7韐(0@罃%岿X 勽鴻珐畴[M蒍8AGqr;(駻罴8蒬膲龘E旗do6l58覂H州"夣D憸3趻理D錚┋杢Y+LLH鬔G1%蔡篖[倫襇亵]/偮⒕a琸@:9KG1 楑龤帗0梓|G8\Se?滄W潲:﹠PK G 釴蝒伙c, sebastianbergmann-type-3aaaa15/composer.jsonUTg]昐Mo0 界W>霄64;靀犌-h檸臻k"U4+蜻'+%-嗞b弿徳隞Y0X]墛b跺嵡暧污#蔂<+g5书& 濧G畕J&<媭> ″tE1!9]n辠儬 1殅匼-Ak浗yt=kd鰐斩k與長话0 貟礦-遘牖鮡}!意喨 斳坎a:_∈菥幐 K$P鸹}磰O儍踊f鷍qm筮帰.p ;pQD鷲頊揂3x毼&.3qvU啦nje*爹R脱u徬gS箜龠N偿硟Z$j嗔SX廔$顽#赩.m≦盢贏彙hn'lR钓 У①]摆'椉"綳`愴佅龥X綇荋L磴燸8悘擣鷂j+A.u8D洘k3iU|%囚k 鑭━冥嵥"W虴n騞澐PK G 釴蓾荮 ( sebastianbergmann-type-3aaaa15/phive.xmlUTg]m徑0厀炩骖Ca t5iJ礛J鄞曕+0(氧鼄9M7 F朼Av 譳{gx9燆vm謝 铿 UJ>)鯅]Ll3f柪駻2羰"7=蓘牡$E崰mL3R 'xZ2&鏛ほ 狳揳 夢))7悐霫龡6枫旺┩^PK G 釴42黺6* sebastianbergmann-type-3aaaa15/phpunit.xmlUTg]晵OO0 骑U/蛝 氌"艟趬?嗋%.嬙艜硇蝽I籿0塡??~&活鰑}鹰J次挎阨>籖着"kvM餘扝{^u靣iVZ穖浂)耀綳.硝溯恚倭'W亵嬇PK G 釴罨( sebastianbergmann-type-3aaaa15/psalm.xmlUTg]晻Ms0嗭 甄撴9$訓h3愇*づ〞殿J聘烤 崗Y項郑*4汨?垶&絈n刮z缀z玶愩h偷(x呜嵛猶磓.&IY桚虮彅&儑溏|葂瑢u軋S病Rp岷$蚙筓闷筄;恠p敆愎 %虂\x周陬j 沌:S銆謀\╄鈲负(n 诐猻wA~2G褴w7鳼-=v怉bj禱+鶄b黱鳠k%箑?u驎馅?勼 茉勯牏~草蚬h⒒峰Gdao楾鮺l#醐絳桱\o荇暖s戤黻喞W L嵭卨蠌椷W鮦滫鏬蜊徰襋蚞醱聩5?婭PK G 釴# sebastianbergmann-type-3aaaa15/src/UTg]PK G 釴螉]-3 sebastianbergmann-type-3aaaa15/src/CallableType.phpUTg]鞻羘8禁+&PIo鱤譏v)`沶撧饫%殊V抮l;K$荖|/偵崽{脃鸣x懪4H垹濼j3*黁op趦S3 K(7#BA仱s"#|犕闲N泎w鴵娕抪7謼/鏛潊艏<)燽 Q$べ砢媂!$,燶b\IKy矂\[1鷋锡}=购够耶 H廌B4甴廘鸥d殝b犘8YR\ _焴Cn/b 秳H $d濸鬒QJz冇S驟8+"`灕I00週Qt>!蘊>G茦h0)Gy<羮c_?GS{^y剄e<2f?{ x*h9WlI癁氶港h-LL!%[p碡39pR+.佔啮頬y/V*?縱\U灌Y(壴萳B4糏欴邱鬳/ T9&'I*s訮 鄱3緟硫y蚖閣鷻8 _閩o畐l暯撾Р嶭V'6'流/n驆頪曋I涠謑,ê5:櫐kz殗庋瓓/,鶖炤!竝枝 p/\續譍7({摶Fu辦Wmn踜倨j漚瓉J2鐲赢('其楫7貗=__滞+嚍oF娉ㄘb沏1LK谩1}[锍)趓軓蟅9臩2巓佤朏 5L齵T挎$a辨oW鎌楘M洡+*葌^/x*铦络邯Y b餵!7塘i堔淙`从5$鉖3~縜1递《9tki/扺<靗q&墻彇W嫖f蘚≯P﨣顲肺汻卮泉ヮ*嶕d输琱X$譝輥磫阾峢F焢挾邨XX驚.D螯f*谳4HmWp倆齍 驹俺嫁鲟脧衹gq漾,M!j?)m索:釄B87y岢~j莺7囯礯 誳?臛゜萜廬{K芚栚*桡:t嬜肈1Xh,D臙o鷙惝)Kt阌*抺レPDl麇綨6G爽S奷2w覝,轸EX鬈髍/謢證M薁"白7S竱[<9躻:@ 侅=z譆 k此_.B U螺锷穂.炐注7X蛬毊茷Ow蚡 (?x輛 hk0Z 绶融僮B9踚讧警_>苘掭D猟;d豤Z茾绽T胇s' 茑塒漒/3媅 =寿擉凂鲯m昬嵍( 熒拰閇鯎:/&[亠 d-珞磱щz3懔2斫;d泠酼矉N 暷杋X舐f 冣"依 +Ce宬蠼箽醨祚磫顱协嵗"e9/'鐡巒8:;涗$$V"_=.OfPK G 釴彻璹Q3 sebastianbergmann-type-3aaaa15/src/IterableType.phpUTg]璗薾0茧+ D攽D5'峴 `性JbASI 婞{棇錀湤蕥犲pg喕双洣j G「Af潙峦軰凍鶦zeF餢I 匱鬽竡P`q镰揬g~N8e"匶熜擪5\m蟹淖j槲swg驹\匬碕仺#耸9()P[庹Em栜蒢烞Sl%q蝳經L飃S*坱w版r -Z9玥 睾5(H%趩Sl<H.(悮6怒;噯/-纆:粪惺Fp%9+n`Q转 d巅光!鍶誯{O秹"齑 rL 蠊5yh卌> 臍罏< 7B縝o韑纪譡餰紽y2噰V;鼓槌榔箢=$鞧ke﹠b  &截:蓐啊稉擃:RC/9顥A t 潙3夾6嫪?檉r偌U麧|O椅e甍绸姭Y汘痒臤3/z癙*4馷貉z鰹:湧g輳+YH踢b)Eロ[氻软W柫瓱旾"P墂ギ ={豔軌 貛擬GA<|隬屃7礀敯趑(奍硪;!轱c:叻]  }X_5)騩.妾藴\@缜F挍h;I 愻龣黁砌<;>韤PK G 釴9誳關[/ sebastianbergmann-type-3aaaa15/src/NullType.phpUTg]}QMK1界W t[づ遃[< 2;H搻蘘E潳锭襖Bf逈鬓dv;5U憙<烹酸TMF F瓣t凢=譆#k磽 .A媕藑(磌f魸桴V蟾纬 A曮?A尞菷训 kd盱xC(/M浱{}y/栿4*涗6≈)P3瞻衍IGD讎奃ㄎ'殊殺G滐$跿〧[oc剠豅e爋&[GH醌@庯K,Il暭示頲原乓P慖鏝,囜斘櫶1 膤皃V霡:2趭d埏N讐/拹[uT%~3)j轞!zi=8嬈窶L箣撈9舸碪PK G 釴艠101 sebastianbergmann-type-3aaaa15/src/ObjectType.phpUTg]晹Mo0 嗭<どvm毪葜 ]{ 2玃$C挀C(往ㄣf/喤/掖oYA嶾2儽uFp穚/隰cr 喋 !鑎1鉆`1c ζ^>"潡<伹]>畼Rp砏逺絑 7蕅忆|\塒訰渍艘S9H罳Y mV 瓎PIdt y呖}緹=辿镴鎌,渎7斦sWR昂6㏄ㄇ慴+3=|﨑絔GQ!#6涩3r垀G@讀0w偣]3B3*幟2bB/80砧饰礀輽LJ奖3Y揨M媶ǜ,\+昕.轆颿$攸砺_=?> }芤尲蠇遁惵轞+枈e%4絉揬Z?庥jMm塽Lqろ飾藸珝薗 芫膲汦Y礉简 s2浍*n韗睤鱌3) 伖?墦a名Y耶&珖輁貐Pd鴀U'锝[ 䲢皟礠LZ<)酿3h齕⺈醱营\-[艘8鳢.綑B 姬氤绺{{惓畕o_驏q 軫坭PK G 釴g x1 sebastianbergmann-type-3aaaa15/src/SimpleType.phpUTg]}TMo0 禁W訬%氐m陬 =瑿镭t,@ IN莙\'>谋洒D殒,J(昲(蔽堅-墚$;<編f&餦 箰.󚦷XZ仗9惜&烐鳭f礔ムν剧zn氀m凒 競 凾;#VTH憭瞈W遐 .劶 竉?=<>=x 鑐2ZV2 Wp昂2)q,E 譫K涞V鵡3鱲E筆融$Z Ob |枵懯,鴱-~f揑x硺  元Y殔wi寥f!豏k9 B)踔>瞁'爇馢0v儾赪,%凰Λ咱 婨R椩仐A 鐘笖黓永8愓禁g=⺶霊褪糫骩(?J1廤th蛢?ふ鬻躆O}3a縓+V蕮%a逨氱茖69$鮘\4 E隤ツG繥<吒鲝!W靍G|#-駚蛼蘋0uM澫鐛攝a癇兯Q隗蕃三咕忥,as:{謌幆 嗛怱w吲泪x 錱u掅m9v伟嗁H#zL50?蛁ii冔=折/u歶抜綧瞸4佫䏝嫿 *:妘骼gd-3湽澡咺卹"s眯?蠣荃q錢Iw5晗~PK G 釴k5+ sebastianbergmann-type-3aaaa15/src/Type.phpUTg]峌Mo0 禁W vQ簇5i稣uC仭脰,颖6E2$笰1艨彅'M>匕鳫J耘嚭@﹨迷xO5籰殰$p窌騊*岪遉徆餉 s勿314套鴮n评E怇HBY侊;煰諥蔉k惗~rjQ$OqMi軷e)=*\E匡讞W7+"C%瑒嘊qBy皜 Y(o'Q鮵b}-h璚~K筂揇淠$d獡骼瑭洔D$NR F睭(漖 輅:z湎)渲j 蔬P凧ㄋH襌3鈈迱 樍v詭H窢宮eg[d8 3`╒?"偟Х濍d翨6B玆a罧)噠坹g/凮仙K$歴jY#Y/r椻u*詃慔沰畺詄V箾:'碅圕?胍響軙&憾8杏*硛瓨okM(+H飰 X垄蟰3暭汕扝E畄W/ sebastianbergmann-type-3aaaa15/src/TypeName.phpUTg]昑飋0秊库&!5 圩褸氮&Mh6&d嘪2秂;04窨.@歘ki8q藿{w镬麢 $<柼蛐y+b框胅舂? 苾饻 ⿶p5蘻)8緁 ζ!帬a車佩|鎣砮J羮墌纜~旔9鎷多3i.%内d楯@姌+噛U杫≌屼 鱲傦嫺o_熸'*D鷮y3墵傊圭 靺橡鄑nc帀払8Pl藵a竁*_>cm H卋∕2鐎舵 燅`P瑯齛,(и滣婆j1稀W"漤"x-迚-V_ 6{1貨;╞o銵奣饎噌z凿G獌v鹷h 5魣:钭沁E,7 挒:"X簗嵸C爕凃_ 遯?F;!6%O*/頎O宒植檬h6h+闺&P盩虻"薖藑n(<闧XV叽'O%/>缅藍Q/翳hu浽擱鲃鈔铉U乤"又 %⒊俁鷍k6绫g椺j淬瞉镴专5鼱9kOY4匔=Ot萶|箬5嗤I獫碬谛n馷h%锃 婻 裚羱进%q{/2腾R陘籲禥q青蚓J+]H▕抵5|埅u 幜?PK G 釴 猾BE2 sebastianbergmann-type-3aaaa15/src/UnknownType.phpUTg]峇MK1界W藺瓒H媁[凯 [o俤wgw冮$$钞E滵氅埞勌槛娼赦聎jXD︹W込実'愎歁L`輽嵄r{\K賖%鳷p ZTcX;p崱輍"X/e^O啩5p頫氜Z觱 歫唉B26殟翟 欦p硘\-揟6蓾ft勞e蟈胉笓埉薁:粸)宆K碜Z餐昷 i駀u岎LoJF#鶷 趋ジ0T%徊搏MK捍Xd覒譨| 6s緳>p鑕l*煸A)C撯m紳BdShj 廎蔶k#/PK G 釴)TP[/ sebastianbergmann-type-3aaaa15/src/VoidType.phpUTg]}QMK1界W藺p[拟吊[+覂O偺钗襠商w[O臷Bf逈鬓潋︼zīrー壎扥裒腤檶 屷 島zBL%瞂魮?W\枃躍lW=\oUo餠蝛恨s濨毩9˙繊俄凶鄉E濽7!甈l餲;B-m2镥鵤綳斡╨R: CmS爎猘cビ0膴Tㄎ'沏姼G9?x觢3c隥9d嗺`隩5Cz榦zT藲腤色铍庂KGE&GS(Cp欝薒' 扬!殭}Ey桩檈匚読I^39i<孢趟*T(砝非О8G缏;趴tL嘔;PK G 釴- sebastianbergmann-type-3aaaa15/src/exception/UTg]PK G 釴Pm{?: sebastianbergmann-type-3aaaa15/src/exception/Exception.phpUTg]=徦j1 E齄 -揚2t濘AdY(-弇lMА暨kMV槿鬈鞸r i彊E2k鶖KⅡp寇╪G,{傶&袯a ]米昸鐱/醦堇 弩!丽F?准1艾 =寂 扈=铇.櫹N蠚B┕疗<爌 w罪泎 i-尐x宭mq韲飑3u;覄E粧_纖鄄m錦脗-*| b躋}魯& 牐呡?嚮纶憳耈t哳驱PK G 釴% sebastianbergmann-type-3aaaa15/tests/UTg]PK G 釴. sebastianbergmann-type-3aaaa15/tests/_fixture/UTg]PK G 釴 8\< sebastianbergmann-type-3aaaa15/tests/_fixture/ChildClass.phpUTg]=PMk0 禁W柝栄皊Z1h巺∑J-plc)k素譃$灋艮愈%朲彊f[k"yz湳L0皜票@菫犜刌!v tDQ芇嶔e釐訷;圐m失C鯘齔魡篮呆硧t凎衅t蛗r ,xn)H ]=*丘鞗<斫空蹚齰<5橳 g<:J维甃J塁n偕ue$ vw~3~hJ禖C;捐恑eLy詭江.J |0骳~PK G 釴J sebastianbergmann-type-3aaaa15/tests/_fixture/ClassWithCallbackMethods.phpUTg]厪Ok1棚sT)昢CE⌒觫袐Pf揧whLB2珪鈝镬Vシ鎼悪鳑yo鷲幀荓"櫗|!Q够N蘹d`珕 造 鬗b *,茲黌u漷`嚢=愁~籽3艟BJ褼W谭=┉4Q鏥%8萡x 蝗'~梗鶍_抿鬶~PK G 釴櫬NG sebastianbergmann-type-3aaaa15/tests/_fixture/ClassWithInvokeMethod.phpUTg]=廙k1嗭sT).絍鸄EAh{Q鐴1檜嚻$$砕)蝞9$0骴鎦㊣嗳z4(捹蔞螇抒齪b獞.P'7a5赼芇u鳻!xゼ?`0窖/函 ,cGO14u=貥螜鲘-參{C卌竷 祐d:迻躇莏迧%p诘BN,峷4@塵钉媆o]檧* 祐3繆o謿m肠" 䱷6幽槡荝`州:z庱嬣I氳虖=┹┚ 扼嗧杮h0|cd證枧\/PK G 釴瓅饔&K: sebastianbergmann-type-3aaaa15/tests/_fixture/Iterator.phpUTg]晱MkA 嗭+rT)J~孝 擽(8搖Cgg嚈{驰晟儩K y2y拶s,#8 $厄)荋~85搼琄蜳'1 d赽0轲眗:癈X'餔iWa0恍/z ,cGO;:仈E=:颙 <[ Y飭 揍'赞灘眵迼o髲占棓Z锑 磎,4@疀dI罐zbV#j颾~攥5踗MY|&言槀菧a)擯詿+氮(H喭筰 鑻蚔ch篳;癕J 隘脔/y2W嗀疡vx彏蓓x胾㩳~PK G 釴瓌Lu= sebastianbergmann-type-3aaaa15/tests/_fixture/ParentClass.phpUTg]=怬k0 棚:&e4旌vXia0茽9哻+ 睄4+_}J吨樯秣磣.侲娱凟鍰喛1?迼+U-,爒敗A瞑Ch!c3擌$_妌瘶幗7鯆 瀤i耖f癈h嚠9蜒1ho#>嫰oC5S饂;訰;庴茺踗逳_蛺4猫3X5懾IG0$僢dg闖y輈嶼j7+杔3镨泧+U9莽焖骹zr庑餱鈩6劉|S ;TuQ縋K G 釴誥!ZC sebastianbergmann-type-3aaaa15/tests/_fixture/callback_function.phpUTg]=廜k0 棚:&e4旌v豩a0vi巺⒇J#尕芕殨憋>',= 灋魚o喆臜E捜ZNr 锼崻V VPw湢eK恎(郲H訿FWM鰑鯩諦梡X6餔褴敖筥r捺X謫烚o>倀韅-h畱蠞:5箶s]隿徛掭A皠Y0嶓萸铙皼^蛺摇缊 O厷A壤纫錗.慄5 3SW蔭O)`謓 屋5%袤 6J祪h炊A齯Z敘|媑辕PK G 釴* sebastianbergmann-type-3aaaa15/tests/unit/UTg]PK G 釴 )2Q'> sebastianbergmann-type-3aaaa15/tests/unit/CallableTypeTest.phpUTg]諚遱1沁锆貒漐芖!eF>堄 w{{$g;Nwwsw-ZPk^nH6贿齞髢gG0肈琙gd.躑婗贏P `篊i! }Sa,鰠uR:涳沄tx乫0J脸隿姉)轹#<,娲7D埑$丳F剨 !*KqUH8┱ K滧yo谕映)或"軵8 戜匉櫭& i:3!R犎J屝鷑敆聓]薯 2婘鹲辦矡hs匐M抮嗲O鯢-e{虳X麢4E掫Ex軵G鳋趈/1烴粸鋛ㄇh,魱糕阿 (S溴 V嵇0t胭v(癋3傢W)朖Py0樜凂䅟" 鍔?犳眕ca`6?P鬟匀眕;._锛O;J媕'蜹去G5镂觠c-#o斍岫门蹁纒PT浻血盚,規b与"@支躅H黐q鮎Z毃'g~婸爍-鯸 O<哝V莑 ┨ ~閺裤q=#認"胧蘦燵鈣-*'+,風栖祟襚ugCh<吤轈滢R>毩1`N∩埏腪9Puu橴╊弎6陜幪.諾匯鋵鰰氱U隃ym壎tfo*韋栉!sG鐚7~{0蠌s+谾#6z魜奒#瞠 龒?sk{ =xs#礰癔招秿齏扌梐=jZE7+鸚@V険H萇e峠NX<.始钄索狓b"'*8:"脇泞恅*崋踱K嬐#B_V 趦>_ 牰8*腉埲遌K0g蹐:zD㱮镺X蹫殚+Zi鱌0#w[d06N5%荇i2葟専s蹲"~PK G 釴Z[vA}aC sebastianbergmann-type-3aaaa15/tests/unit/GenericObjectTypeTest.phpUTg]Mo1斤瘶C$( 陼|$m6MrC,竇飙= EU䓖g紎H6麦<锿洷99/涫a焐閯~写@y钓#貒頟{萾幚邊r6弣錓+'M笩G=毫H' 髸F観奼37 2!迸蚤翋@r潬裉k2隖姶5P洙xo琿蝳咕娇朤A$ 罝yH/ S榟r 鸲t 2QT" 舺 錽峤.譾E%筝}納`峤区塽縵]粼a) h韲R.;F纭鱸4膭dgf紎j軅ZI{疓靊=瑋躵闪獿臡蕰靼Q岠鴩肖骀D# 捙tc6息]8=V劙G諡%苧/骋$2 <凈P耐6尛N"摰'><p 唃e2蜹顟荺饛3柌螩筏 .銒歗i躈nyF_'dg醒峝師h鄝滣U傢e俕v;R閷 4\:",#n戳啔阿h鬊頩瀄n55锷昩驶岟v鬗帹~䶮Y笠眢'v飈tE邞[y榻L籿EZ漄.Bk縻餖*坟 %fFPK G 釴衟镻 > sebastianbergmann-type-3aaaa15/tests/unit/IterableTypeTest.phpUTg]蚒Ko覢钧W獭R营4鈿i T$錌谪鉪临5汇gf潳I觻腲,<厩乌疦骯 茩rX箐tL_i殻?~箇征#貒頟{Hu喞蟎9泜蔷颏暕K!鏘j-迌< Fx等>c悸h:L餯V硬h垚Y蓖$愰峠\揨7Rき9侭∴X%q>]_^鮫卜N昞o餼0b徙瀍佧]儠竽Th寃3嶜l u3V9XnxJB:X騁"ju*a釁,[醂XY B8爡駿& Y逥>=q 晳i-j鴘噗t荃p毣棘 槯9 1唉)Z`?rD∠q涷 熼b嬜頱8丐〞蒔4%苉聫籸漸洶贯d[詵&a瓁`慗v痣主隖螉Er軔G 灏yw栘薔桤>}灻v;砯謦JfSs宅_t瘖閧m孚3璵唔72谛薸10齯蘞虹聂|_>2蟶!熎メe6喱籬7㑳哿]砀P侍澘u"烛雧Rx!ㄑ騅鎘p漉 猃紡啱K侯 ^Q9}% N潦芈脢7盻k挬d3J掩霌-9#3靏饿ZH辧FJN'敵圓h圏糐歁27C6R^B蹦0*${{炈 眞s &8u匮w襖j虵盝ぃ攊踴䥺褿鏛琬麺 j弧9  +E[W_%Ea媞甯死瞯z溃7UM7si]T五v|秜髉鏍^~m{崾墉蚺;昚m#,\f枟眮枔馘 {艹7裖韩=呀5+磤隐漜鳂(刦哅?綐鎇9鄶餟"e$樊姈元k{ヮ^cQB;<儹蔲G軗e紼-['锞浼钞Ra2[CTi "雹K蟽.挗R遙T麱2a媢Q凉闐r凈薛欇E繅@闵{.%|屁+殰C玊檙 ⒎腮枢栅渟 泔斣蚫*;銂碗茥耜袽e啡晭ì献h韴髾斾&cbt*笸シ束}M树秽麉<炁睒黟掁禚2q3钽$茙J e臏瀕镤F{B垦沈}2%nf靗3aB⑸3R 埪F溹5qC楾橮坶业:[h鴨'欹}褌鍂7椙/)9璨e 玚/竍车`\谳匊48通绤嘃絘棌籶_v挾绗M袊V猎5W褦sYJy򗦌S諟Z夅︸s{祣*{ej,-A?T+4zV籪z薐)洭鸱P7/=猒:沶鶜}皹(i 螃籨k媫y絋胈4 X}鵭醐匇用;び墹榺KH"FC笊(^楺W観E 团笔3z=簣殀*鶼7垢>_/曱WmZ &(-07赁3j卋裹冔↑W ni,yU痋百r莮k立*頴壁枲滀0e(贆i(瓥J鵧\劚c+*+3柵H"H6锂) %0:肰媍ga8z鮋dF颒湼圍蚷汒嶔艸蠙醳%%u袧ト~蟒PK G 釴'紳 d: sebastianbergmann-type-3aaaa15/tests/unit/TypeNameTest.phpUTg]蚒Mo贎禁W! J倆% 崅@瓟掖P鮞)Z糲紞賣w切ㄊ镓伶#凢uSu6殭鬓碳9%H孯a1pdUD穞煛粁::m0I攦X%018 GJ鐽Q~蕌Ei礰\e 韑.磫蠛鷴鮮Tbo 膟欱d瞷玣 佇Rcc鐐斞菒(8禤,q罪麅褁PP昅R"柭乀臔訙P翿Q罊蹻菳察恒i1G 幷漌崌烅腆r只yw髤嚃霔妻t早V笭.G箤瓋p?S1荚崟徣9櫗"9+鄌I&"' TiF缚@?銡#蚋[!o@.讛s颡蹙苵g鶨WM虧怐瘈銾Q怲擮-W歅瀾偉驽箰k獧,胉k戕浇菇5(+R&[狧芁A婮CF禠痯 P)`⑻G湲Am濔 k{E鎨# 熯I暨 鵰>P :屜m)砖貈Td轔钵﹃kd;>5栙瘕8鄛R恈|烷K>靬C媯.+閤彛渜牋Jc4棗 徸兆綞龑PK G 釴浚,;= sebastianbergmann-type-3aaaa15/tests/unit/UnknownTypeTest.phpUTg]漈羘1斤W憼^!S(-蠯*;撕1鲋瀰*薇)tⅩ愧駴y锿寍醵 H1Q耣烊蕜狙篅w褝谕0违僉* 蝿#)t勖/纭q襽仰蕖/勚p礐0_%]ω麚so,P帎旿Ab姷曮淍擫P;嬲櫛 A诣 菛W!镢胅0犒RA$鍌`%ひ殨)$鍇)m侺枕H築pl+|:fo(*檕鴄8a嵊{锁暠嫌1:篶) h7儠浤,:4濊gmV詸詡=+T顋a罒:u癳墌E'0lKaa痙埛梅皉) 洏!L|;睷'緵`慗q痃逊l$&9甂MdB9l<礮%鰎鷷涏伹>途髷C3鄛韙2k烱&1酢亍:澃|峴I釙猏?傔孾ヌ 鴯8凯@T蛳徿硙 篝"邍1<=!唳父纬郏熴;1/裲PK G 釴u挒紺: sebastianbergmann-type-3aaaa15/tests/unit/VoidTypeTest.phpUTg]礥Mo1斤瘶C$D倆% M欱磹^BT欇Ypc飙=U洀 H┄,蛱槛鎦謠6熶恇咆憰 }庮騇龑髚j淭】娎;淬┬.仲W蘔hIg)稏5c&Y$&焄9潅 j羌:3v*H]嘰∴綑2詝航iw鹠D褼斅A*}C0匯覄#軃3匨悏覡i1E 轠+_ 阜(*槸鞅w锹所ケ徝:篴)溞▍V3C隸i仍 紮詡V9X<$ ~1O*H衄櫳-0k1R!2瀥1b賉漻鱻笾]+b_'/!狹槺班鲭4\俧遅z辊?av鞔臜hi` 孋羒Kn襪3駩鏷иb&-e┌钭~輔陓ǒc/鳉 ]口最f捕#;喎7鴝{鹯/娿娫T〤嬲U7>怟<$;S?弤`B!t鶇k63k &1鮗盋5涐b'附忸簦6>8U沪孟哛5y v 涿酦P刜醚z烑#╧dk]\Y馳/厧戹P甧?GPK G 釴 sebastianbergmann-type-3aaaa15/UTg]PK G 釴拿e9- Fsebastianbergmann-type-3aaaa15/.gitattributesUTg]PK G 釴' sebastianbergmann-type-3aaaa15/.github/UTg]PK G 釴1酳)2 sebastianbergmann-type-3aaaa15/.github/FUNDING.ymlUTg]PK G 釴婰箱) ksebastianbergmann-type-3aaaa15/.gitignoreUTg]PK G 釴% sebastianbergmann-type-3aaaa15/.idea/UTg]PK G 釴8 sebastianbergmann-type-3aaaa15/.idea/inspectionProfiles/UTg]PK G 釴鶎nK Jsebastianbergmann-type-3aaaa15/.idea/inspectionProfiles/Project_Default.xmlUTg]PK G 釴鐱"1- Hsebastianbergmann-type-3aaaa15/.idea/misc.xmlUTg]PK G 釴榷0 !sebastianbergmann-type-3aaaa15/.idea/modules.xmlUTg]PK G 釴.]9&D sebastianbergmann-type-3aaaa15/.idea/php-inspections-ea-ultimate.xmlUTg]PK G 釴v糤FH , sebastianbergmann-type-3aaaa15/.idea/php.xmlUTg]PK G 釴e) - \!sebastianbergmann-type-3aaaa15/.idea/type.imlUTg]PK G 釴莄転, #sebastianbergmann-type-3aaaa15/.idea/vcs.xmlUTg]PK G 釴o匵B+ $sebastianbergmann-type-3aaaa15/.php_cs.distUTg]PK G 釴謣d* (,sebastianbergmann-type-3aaaa15/.travis.ymlUTg]PK G 釴W/40+ .sebastianbergmann-type-3aaaa15/ChangeLog.mdUTg]PK G 釴$惢1,& 0sebastianbergmann-type-3aaaa15/LICENSEUTg]PK G 釴h澭( 84sebastianbergmann-type-3aaaa15/README.mdUTg]PK G 釴鳘霉P( 5sebastianbergmann-type-3aaaa15/build.xmlUTg]PK G 釴蝒伙c, -7sebastianbergmann-type-3aaaa15/composer.jsonUTg]PK G 釴蓾荮 ( <9sebastianbergmann-type-3aaaa15/phive.xmlUTg]PK G 釴42黺6* 2:sebastianbergmann-type-3aaaa15/phpunit.xmlUTg]PK G 釴罨( ;sebastianbergmann-type-3aaaa15/psalm.xmlUTg]PK G 釴# f>sebastianbergmann-type-3aaaa15/src/UTg]PK G 釴螉]-3 >sebastianbergmann-type-3aaaa15/src/CallableType.phpUTg]PK G 釴8 7Csebastianbergmann-type-3aaaa15/src/GenericObjectType.phpUTg]PK G 釴彻璹Q3 `Esebastianbergmann-type-3aaaa15/src/IterableType.phpUTg]PK G 釴9誳關[/ >Hsebastianbergmann-type-3aaaa15/src/NullType.phpUTg]PK G 釴艠101 銲sebastianbergmann-type-3aaaa15/src/ObjectType.phpUTg]PK G 釴g x1 lLsebastianbergmann-type-3aaaa15/src/SimpleType.phpUTg]PK G 釴k5+ W/ (Rsebastianbergmann-type-3aaaa15/src/TypeName.phpUTg]PK G 釴 猾BE2 誘sebastianbergmann-type-3aaaa15/src/UnknownType.phpUTg]PK G 釴)TP[/ pVsebastianbergmann-type-3aaaa15/src/VoidType.phpUTg]PK G 釴- Xsebastianbergmann-type-3aaaa15/src/exception/UTg]PK G 釴Pm{?: jXsebastianbergmann-type-3aaaa15/src/exception/Exception.phpUTg]PK G 釴56媴wA 玒sebastianbergmann-type-3aaaa15/src/exception/RuntimeException.phpUTg]PK G 釴%  [sebastianbergmann-type-3aaaa15/tests/UTg]PK G 釴. X[sebastianbergmann-type-3aaaa15/tests/_fixture/UTg]PK G 釴 8\< 璠sebastianbergmann-type-3aaaa15/tests/_fixture/ChildClass.phpUTg]PK G 釴J ]sebastianbergmann-type-3aaaa15/tests/_fixture/ClassWithCallbackMethods.phpUTg]PK G 釴櫬NG 抆sebastianbergmann-type-3aaaa15/tests/_fixture/ClassWithInvokeMethod.phpUTg]PK G 釴瓅饔&K: `sebastianbergmann-type-3aaaa15/tests/_fixture/Iterator.phpUTg]PK G 釴瓌Lu= 昦sebastianbergmann-type-3aaaa15/tests/_fixture/ParentClass.phpUTg]PK G 釴誥!ZC 鸼sebastianbergmann-type-3aaaa15/tests/_fixture/callback_function.phpUTg]PK G 釴* Wdsebastianbergmann-type-3aaaa15/tests/unit/UTg]PK G 釴 )2Q'> ╠sebastianbergmann-type-3aaaa15/tests/unit/CallableTypeTest.phpUTg]PK G 釴Z[vA}aC ^hsebastianbergmann-type-3aaaa15/tests/unit/GenericObjectTypeTest.phpUTg]PK G 釴衟镻 > Eksebastianbergmann-type-3aaaa15/tests/unit/IterableTypeTest.phpUTg]PK G 釴皴n: >nsebastianbergmann-type-3aaaa15/tests/unit/NullTypeTest.phpUTg]PK G 釴*琛揙<  qsebastianbergmann-type-3aaaa15/tests/unit/ObjectTypeTest.phpUTg]PK G 釴3e< 縯sebastianbergmann-type-3aaaa15/tests/unit/SimpleTypeTest.phpUTg]PK G 釴'紳 d: 髕sebastianbergmann-type-3aaaa15/tests/unit/TypeNameTest.phpUTg]PK G 釴 谆6 t{sebastianbergmann-type-3aaaa15/tests/unit/TypeTest.phpUTg]PK G 釴浚,;= sebastianbergmann-type-3aaaa15/tests/unit/UnknownTypeTest.phpUTg]PK G 釴u挒紺: +sebastianbergmann-type-3aaaa15/tests/unit/VoidTypeTest.phpUTg]PK99蟿(3aaaa15fa71d27650d62a948be022fe3b48541a3PK!N-:耩耩1diff/e6140b7bac501c4f9a1ee510440e3b8aff26e8d5.zipnu誌w洞PK #癈N sebastianbergmann-diff-720fcc7/UT#誛\PK #癈N' sebastianbergmann-diff-720fcc7/.github/UT#誛\PK #癈N运睌h0 sebastianbergmann-diff-720fcc7/.github/stale.ymlUT#誛\昑Mo0 禁W萫R'C餫楈偠; 6k%OI箫GJNK梋b+$鶠=儠循+4Zca唉2y疇髜p舃睍 U^泘21#薴%Z0-4忄)胆杰I AhX;&(鼬+狊'Ht愋喃鯮=鸨涘 聶.褹瓕&'羿 碆9錀F:Q)蘟邲9% G#6淶釄叫A(u楥<9蒪/う坿1r'R+.-鄸9爭恷綜M 昁w7谏-uH餑:鬻+6>c?圦d@W壓浩迪& Q拐H泋堵O=糼A裻G俎忦洈釆赭e敖TD説|15t$茅佋賥槾杬"vc^{+煿rezν祪!?x2v麮MA 鳫r>v洎 :◥E穰>` \鶻 ?)~42<镃wO7O3,]蓶?&髩謸n:葨盃 *g:X獈們 q婚i貱轏-砑讼闏~6;圙J%y噦>Qdx偄a<6壼康秠ь挍谧1骇栝蝆濎昭/_(僻8 t歙l5=|负^骛)贊?G姿Lq韢'DF2mM珊 闶鸥NYPK #癈N%搐R) sebastianbergmann-diff-720fcc7/.gitignoreUT#誛\5華 ;徺>蓯R敂b|鉸哖撃@瑌CS2抁 2^嗳E>頠&k7;泇P PK #癈N姜S" + sebastianbergmann-diff-720fcc7/.php_cs.distUT#誛\漎Ko7倦W臁l纔衚b粡4m戶E蝚Ys 捳_哚C珪,r曻bI黤9稆冉鹮鑶撛罆uF0G躰{悯慌wPo铑顤䎬\.刴Z!×5mcaET结o+v輡攸f軸铍昿婫m譇觶)胛5T馞 殊nΗNhu (皪r縸|狩Q/譗譴﹎辧呺pu囤 囒汈n0嗉Q蜔蒺>0孔敕o赅陑燕喵'a焪?K┓蜡滖0]霼専逻Cw念敚/随渱Y贜穦9Z E蛶 u;P6!#z+">鞧M驪潹鵍kI3態…C!躒朮F坲棂+;0傁%3橵N(ヵ\舉]ZA *K@YWZmqE1閥Q櫦L碽E寔痎旐伤3礡Z礨ge踈g舳竓vゥm噓]Z 慄え 長:2霷覼;懺ZB]n1朮纕T畁愑鬨鲟:蜅O0葶F(l~t%!鲞N淠?3茋f貊? 礜E缄#9 F楯+曗擤xT5殚(i菂!!Vg0袺 涹逇3隺J剮C I鼵h蝋訝C披C松?/y轥姧0总%菄凝J浧v猣!縨f勝d0儊4.>鶂恃*嗶}嗇V^D鰐-伉腊哦T剼N?Jh滪.剒Gz/焧jr徲(L钄浹鹗 c O R左-訤砵6)M凹eC鋋糍<-Sk﨧捜f&禎)DA?篙Q1詐硾&伛@/ _湣S*豊鱶-wC椮E塴1齹魾,悍>日 婖9謎216os獺?瀎. 喥"伡瞓汅\喤'+璭滴Gd袁鲪b[:<2硬炋if鎙+&xr^H(+惱`{$槔婈F菡J%鮭俙L?1)nDb_eT蕂挌'铲K/蕽3璋遼z8鎉牪Sa鬪"b轥儹摗)九髨$櫴责戜F:谩ヘ}~Cク9+灚氮旹奺S+白<t.娗8籁矆J-G燾]g釞噾@^RJ`晋恷岹羛ふ轢恅8绷刞枪rLK"蜑嶵桷槹畆琂+<肯脤vh湥瘰H 塬沨8帨蟒魚毛nx梡橷]鋭鑊鉟1觌戲5N<):汅螆蝗7嘃e鹛is_3=-1)B9G6a#Q 噸濸ゴ偨h及櫫{着!搮覚fx/肐2g嗳 髆,慧3]\:W搗D2#[bTT筿f婦佄=鴂F戭64]閁x~杛z 靵F魋愙鶀姽龋羻}請逘妨 x鹛瑦鉜}5支觕I9鉝G齶窇逄"%.Z湀tJ*槎X鑂鯊炀炵9#Ψ譽懷f|>梧H?[M.戵橵緕]v|樕 稊t筎|"n锊]>0M懡誖?2勺嬲8_$?+V榷c麎濫&谎傁膎筢}嶽>臤撟彙窔脅兩{埓t" 唚鲨‘'B氎f冬,V竳辐PK #癈N嗾I* sebastianbergmann-diff-720fcc7/.travis.ymlUT#誛\UPAN0 肩9!瓈RoY供踆J(vV离q7 圞茡x'萚 '_鲡擉>衢幭w|贯潛娥鋀H偽透r eQHD> V/樦惺bB!B芡鉄V+\I.祣wB鍬賀@T廛/ 酹T*妕&m跴0@SN 媃肫k搬s+)嗰妝:螖G[L藅鶧沮 CLg觜脟#9籋嬔"td鱫闭鋬鴀等4帒4鞞<徫eVZ)蛮珱狋诲oPK #癈N蓢EZ<+ sebastianbergmann-diff-720fcc7/ChangeLog.mdUT#誛\漈[O0~席8j鰼I湸M诰u0UHq5M烊v('aE燤效\靯足翎xM艎]蕰闾4tY0H涀╞惿.0,.垃箚溿瀂s甭g *爌黶~uvzy}鰌6h V葧検@ジHyU09N嫛G拣\I0uI钂慮鑧29勪x]嬐l逛傞傾俲防劗*5kj1煞庐'╙悽x乀 C剐愗o愃G絚:鰤K"7 -r卟R>↓r了簍5颇 n^z3鑕飑w擛甦 Zf蕒訰$;瞔@亝椒j飳猢%x蝁v麦6Um咀既楯攳.燃5鵤9殺-赔蔡j蘕N肼 zS訿6M鰈犐j湹/-k椯埒t]UR去倹7{飪nn`褟I;AGh磐篰6#賿j茅X2*~|畊痛摿 );枠S涌F鞵H敡`+咋<|觵,e)Q)U]~[T堡閒KUfs++坛溩皔x#紶礂ㄈ氎酦9)忀 棚砰蒀ka轛绡%禙F_72B#wk,6 .q搉敡4&f|('毭 P鸱Et儉瞤鹅$尳萹哼 >IT19聻5NwⅦ"P鄑w狆/ q篿&巶t:I 砮鐡iD パ(3G鉷導卞 [舍迴q娉屛PK #癈NDte#2 & sebastianbergmann-diff-720fcc7/LICENSEUT#誛\礣_忊6鳔萦m時踼kj朆Bmg91粬H宐倡7c爌杲屒篼7#傒!簐过灡?F黩狍焴}z 趱!L眸曳嗠葸亲鉯pq屹&06伛蛌茢韁垼蹫Ⅲ碈 黫苜t硊C;~擂弣揉菖W餭z"莓% 谘卵幗嬔vp龥腽_蹐A顔伫56?J 圜W-;哚籗堣 定郗R%!儚ng3,#]螋dZ综q騍 萿耈弘N悂A逦颪b{澬 遚e劸峷t!軅N恿"u遻8琄崉;唇%E?佟吝灓D駁@?$uA煨岘ネ@1綇矽嗦u鲘 鯴;'>居/醜w碔冂h縁凇峒M!=槄誀霗Ys%+U?薆0輤Y入誇声吕. 4皙累(9mL45v~J^m@|[)5 鋜UJCt+#呂@Vy矚gP諉時) >3u朒 朆 Р攆擑f襎扰fH芶艜憏Sr獸璲-lR%桲QLA<嬍^鸩$BvsY+E (%煐,!7C_+d%rI馦6S|凟(鴴涎阽["鞉'#%$c型Ti#`^譋蔣 ,s】膊)現  O両榀t6ZRf(晳u鮻鉣c*婂[n]%P6Jれ3X/+3%) 崏4!h脥q.宷楧H)鍫 #HnY"'泤F3eq俼 Q#G〗D 蟐*愡齸流?'﹪O暦/QFB蔛鲣曰4{曫竸陃A,L謿嚣 #∶鶶朵C婾B嶨a渁) 頕斻 籠4汳xA&Elnn; 狃0h掹`摂O5S∑+}e' 戝"蕬yS堷淧鐼`爖I3L8Ⅶ钯楟Q`$N Β抬Jp9题崣@鉁ɡXP`4skuX!恺>] 7q}2蓺泱k?晸魺蔊 h .峌#渱*r蝽苾RYWRyF}H枺垇UL厾緞a凳聱鶿s▇"ηvY淎饅奭8褄鯂Z)3>5u柑啣<7嵗d#鈸fU受檌N綩W裥躆"黠.`祙砟茒6埪郍!hB槌鏯u墡 -p由Q(h辢5wH迼\*g棺韣4R"舋*]j統产狡:*j糒C潅;`m聟秘x4鷰觑;,u&跏嫔v珮\T澥l灊o毲痤-}7K煴揼t}主麑霉5ExJ 讕蒥趂,鐖K":迿TOY庒酹!gd欑峐慦D尊ft,2c毴贊#m豷u/齎未饦!e齐綗褯挪窺 M耦{譈=!耲躔jP+x:r<愤U]un尃A唂纴;衢皻&蜁鹜鸞0q陜衒nT醄KG晜 薻]u2栆笽q燛1FV黎M-C鷘f.A莰叚诣][F-j58$?衸NS)沗斆冚甴嬳絥遗$io'1睚軳鸌軒л韙B.0揶濤N灿98H;缸蒇殪苹閪狠&{'祉叮蠸膃あH恎骑D寇|罹k吻鷐'窃Z嫳;筇邈d麑媫E羬嘔p絻詅疁nFjz5gN磝6滫蟭号0/璐jm嵮zc穀*c笄b炙钁蹜nH辁-F踖8C3羣髯T関貂醍鲣货藿梟薡_鉹r_苧昝J蝠dwv\,M.1搲雾趸YK.e飩 w|19zGX|祯铦釼.諆j? t裋缥 榁涝悍紈九硷|澕e攇1ぅ屳or<布悐5韸醀z'﨑/碐ユ熻>SGEB铹碟搅尔-轮梨33轜來煞踂阹遊主簿|o°睒继候ǖ睥*孼袂恄ao闾m鹳纆5> >;w兿椇yu霎开PK #癈N>( sebastianbergmann-diff-720fcc7/build.xmlUT#誛\厭An E9B]謖浑翹"u`cb7j栈;睔XQ侧}䶮〕⑶H苹Z>/煠@Ъ6妍鄱x戨闸 釥肸j4Rhl Y%! W 懣!8伹揕t歫,倇T 0蕆蹈"D*毨c巴皸傌%c祤圈舤2镄h慟hk曼鸞鲑購Vs1/)滓z禑Uy w=闠涩腨鶺G 譃犥_$ 埻t罽<<脪v雎厑3(伍D6e$ 岀曄墷p򝢓鎓妞w冱 趫DwApd頑斱塷s>靼3遆@bo=h尫!b儽牨ys/嚘围Z暓窛PK #癈N缘宒m, sebastianbergmann-diff-720fcc7/composer.jsonUT#誛\匯罵0襟櫆i媀G冘滖卵仚m互殼&┦@4刡D4條瞣遻簧~D膦8)3袉丠 V杢|╯盲鐰 "75r艿Gnq!U-鞎)m嘆皁a砂 罴蛘曚乩9⿲i4I6蘐m鐠'児 諉M,G韡箞诣﹩譃}ZSI鍖箣~韲(买鎊葥 H淅阘^肠jlO&.豱鼰猿TH^炷⺄轺僦B#帷婲CT2粘5﹗鉀c]ⅲ/*鷡葵陒r8愼c<曣/ヘ%崚9j頎樒┷顱Q矕P剨y Zsh': <9坊鷷氩冸|笛W裼(2"" 悴V9怫犼[O銐篁銀篞7PK #癈N侓姄Z* sebastianbergmann-diff-720fcc7/phpunit.xmlUT#誛\晵OO0 棚U頺8Χ砟熋65K\⿱°蹞v(Lㄎ巷=[蓶荂晐'.W長$4朕s陛穊YL瞶_g9壌E憀.鎏魾师i益:E.绯贂|{z\=栽:b4圛2|眖狃Yjメ>苜窉5┇Ыij@蓼s9蓪$w圠霼潒p絋伇Be邺X⒆p忢瑆!鳛烀8朱|茌堥2続兘4樳綜偩^t穐榜(武w1qq构0P狿兵F:蘕氀&室sw*:塋瀾懞<索8末T趭翉殮}籍,qR{訞磵*Nfe+爼敲雬鼧養赟R蝥彍g!鐞*^O1PK #癈N# sebastianbergmann-diff-720fcc7/src/UT#誛\PK #癈N覣)m, sebastianbergmann-diff-720fcc7/src/Chunk.phpUT#誛\漈Mo0 禁Wp@N5雞i簄]vXz電戦X#挏,蜻G刹箦閠%=诀H屎鸗f%$$r3)蓪n{胔袕蠙4愂渶祬"Cs4V$2Mo鐮辫链9/KT 頩險J跊勵C谭B兺*螦錐薊fU 氇葱K床P譖鎰挤挻鰍摟邱鏖豎y6C k4怘椥疾斃Z趯O8STZ %鋅釖L壖賈o ( 賊幤纁V褵x 鷠?出 5礱=餾╁ -習盶7&z{T zk$╀?B蜪Mあ椬钚溝L+9w崨﹦k蘤車J貥礐R0装[{e藜 沴f襒5n(锛荐紁7甛熯咦B~屭ta顑z!h蓔yO5Q冭&猰7Dn淀傡再妠坜鞷誨+补埻{粯r/髱Ur a[撼L;鲷x柞=Uv(鉪;+|诠}U~%qDC椣j汧{r硰U!# 怵餋缈z{7d ;翬6*A黮O:恘豅kP>2諕T:徝儤m贷昃馇穥PK #癈N3攥罡+ sebastianbergmann-diff-720fcc7/src/Diff.phpUT#誛\昍罭0禁+胬… 讌Z$ふ^嗥闘k;'U}莍燤a膳蚣欦炵弪菏+HI鑙蛃轙f玢 昄L)72S萗pZ``6IM枬I_l1苻齴紜T岻螒aR川橰XW{M"擱t(e堡P{霛筮?鋛Je脾+0%鮓亅蒬覝"}矪Q.跼覝7+d倱袒R樉:祁刃m^?/肧:俛`R饷劃ヽ=熵+ K2:蠊vV╦停柋泇麭?7锑鵨馨矶繐樫閁曐琜坍雇v脍{鰚+塥A逰鈡Q嵖組逭'}k3'鳠d濙韆jm鉦鋰奙[埅蛜?X舍矧曕C.\1硆&N鱔B[PK #癈N串DN 9%- sebastianbergmann-diff-720fcc7/src/Differ.phpUT#誛\璝mS跦熬劓鼈 洯rb6 8划%@乖4:d骚A#gF4嘍0拄糅t<輣r徆憋妷xX2>5遧uw禶.>嚈0老 坒蕾葬聎庐缦f#覇蹌媡>傍f釀!纪ㄟ〖$鬍莄z锨(1g0K躧7sN鐰嗷,(7淓衤~禶0咻^;O.喣J*)鎺{噧鐡A覦0題14GI21液坏: 茥咎TO5o抖^8>M2躏嚹<廈菱r}沉钕?髾Wb偄;襅峗癙HW(鮣~锠噑I拟m>薲婠CCC.圄lv邤┻ m鑉ㄏ嚐Na罏咜h赳沅xt2 O&_逕煂N辕,'+卺榍寏"楟掭91T&*)等鸱轞jp宣岔bGF釢&◇~u賿伟〒瞸杽.d"'甴!SnS荕?撔GN2L賘9粼(S覹)7`g$湐偭$輴] eic烵(琶藐)佰叧?蠍穩诐^g繀{漖跹S{-Ys柽W罁2妳射g 鍮,y扣搅殥L;n磋f鮩猾隲诅≯[8>盕N%铵趐祘 X鴂:犢,,,麂蜣c飍讍絶 :鷝|1[Dw葝<^ 6酊 68瀲鋁 廨>Qc菨;RV甛<3皇夣c9%E>橰iPf璂朰R $踌闼r脟嘽?d\锍亙妮Y)_b玖mW擀澺癏姫kK厃漽W殗i]A褄觩蟂哬豱d枅瀋訳> jx嵠?Y鑑猙C铁};2`溼:髍痎(81荩B(W粅Th亰-*譢ツ\,1朏O蠩IG-0迴W|誩@誹霱U绬r 旾U8J&瑶+r謺"hi痑惫丢?g彘擘KWzh+篃S\P|/ee5雗2>鱣賛ы褽:g沘_A櫔瑞~"t慾5d醎GS牭黤 AUh骒諺楖*氕镼夔浰厅齗M鱺硡$V墴瞸hL枂厢顪yT<嚒GES毝9 嫡D詡_8q堺鷓廎1&d1釟S靇屆鞹Q隩阙~)p箐l)窐Cf囏Nr竤b邫襆+谣 &V#挻#捿 檌A朞sxm=(蒨 礘味iDRD痱%既_嶊祔HZ瓎j遄3Gaq铚狗\簭热僫7夛xD^谨銶L哞ㄛ訃6}V鳸{i钱鳕弪/p畝PZ纗硾変穴w潩駓砙o榻-h鱖pv>點rqv<簻 廏&囷.?1縯r:~:稽ge繍G8謫幍甇C'鳺TB簾$0=槯}]!啑x羞臀V诺—舊┕〨W亼傺Y{阷IA祅愺#硤硊'T慿驵lq伔喤贌g撗慑鋌舣∧;圻稬4箔;0^鴄c霧I嘎栭W塚vv襙謱7鈩Q7屈$b爒#gE匰寬c忰*c曮$$m鴢P陽Zz滷#dU闸繹Cf乨矝!L1?橀E鶜05訔tW絢+B笳獅卯怲洅j 蚮髭@蚭#異)丅2罛[餕5愍s瘟 2丿礵3砷eO6莛俣 囧礱>V歑 ;jtHw 釯孖臎2S7S\儵(Y/E墥併b嘌!v|烕眰 煵艔廝&)X]Q頶涸Z狙86辌6a嫻,1_詡俖ZG娫板% 熕f8癸簞[s猲x(+鍔黓龙訑+{]/朖\1:)猣闥_恦捀饧雞鸤'p﹞鍃媂q N樁邱秺@$-6秞jQ箍BA-濚搢S咏*{諡u鴇;[7巶u 'b吴詄蟛py縏H僦a鑱枤we/⿻/ 翞I蒊.叴 ;4/:裑鯼2I荸H0n〾/"邯葳栓T烿*3X覔勝葖萙7[!稨愌続嵮g)瀨Y|舜I烉蓐噛腼1c7塱取ト竉匠寶+=P鳭潁N鑩骭2`娠鬃饂IR銿8KEㄏ+宐1誁/j誧4砭mPK #癈N- sebastianbergmann-diff-720fcc7/src/Exception/UT#誛\PK #癈N< 1CG sebastianbergmann-diff-720fcc7/src/Exception/ConfigurationException.phpUT#誛\厯Mo1嗭h!h瘄$iS*E獨CzDB;浑j锥麬堃幫圱痤;炵,骩S萉攒b遹+卂僴馿0c!!Bn=n阁挮I.媌L(韹<2 m賞蕞铷_P覐s糹k~h 綛(B]冃媾什蚶U鮑叾 鱎9哦烻菹圎瀵<*A鷬{xr m偳灔(CV 51ROS糀g8;;櫅1VH 瘟絍,僊8藵@wU钹Amy-蟑 * +Z撫0鞤{Gw垚獎n豸^ 瞯鋷炀M3慣薤^紞3崲q黓屌恋篒贛匦恏vJ$誾-" |巓賉c1厂>綠 鴟 凣妶4x泶鋳1潂Hs唒|q+{荀负vW鏰僷鞦Pj焸鉲tQt狯br棭晅k靳C冼p :}z]p 婨{Uに1v換6柲qW0嗢SF宽鸌懔)G烘承殍c,=颈7PK #癈Ng这@: sebastianbergmann-diff-720fcc7/src/Exception/Exception.phpUT#誛\=廇K1咃sl媡褴ZE]A恀闝(觗 d搻毯-7)锭仚麈}o龢\C赾懱Z鰎NT铉+-,嘤q藶犖刌 Z(t"尅3l聿隁t︾盎^鄼騫`}S?占1, m=o18;z:妫繾莱jn1($OXw週优黢ow}{u0 F!嫬梈犇1k狝u纴J潞肌_煽^k箷R劜m揀)5酰~PK #癈NgⅧ擖I sebastianbergmann-diff-720fcc7/src/Exception/InvalidArgumentException.phpUT#誛\u怬k0 棚:秂4燔2(宂篶aǘ荴J2鲚鐢捣 OO~咖魿j83虳3[S"够澂L0皜蠔<傭& =2剖摈蒜洭3;図e蠑c匁正X騿群tt敷謌袞!碛)s*`t豏敀};T钽 X觴辿呒踷 -*(鄕*尙m檾賀 r4QW艱霩駣~!呓杛+c蕔D`=錰(j}磾&&牐Rt霫笂孥鼧_PK #癈N'晁 O+ sebastianbergmann-diff-720fcc7/src/Line.phpUT#誛\厬[O翤呥鱓虄 嶛 %AL}2!K;K7)踗w !頻)`憔l簊鏈oψ穀淎刟"-VY覕何E-偤:Lb鞞侊LZ俆伱檛ぅ "璗搖^Z k鸲邬B讃u楏r)酠賡焃A錓a毉瓰褼愯嶃\粣觻,A蒾K崼粼庍嗈獉僅麃f9a+M1Wx楁6D娦SB笯桰~埽锶?<\[d窪:#mP| 鄵3Fd/z兞p郷磉踝狍薌¤厘夲?阿W滈A絕<[w)-/偸颼k`鮎聶g豇%橓6N&4Tv8*75L櫷C猺6呴&隗6蕡K*昛a馆?g~7匛眱掶▇8砾蜴4┛昒k瓱-Rn蛻f髱粎ew榓#6PK #癈N鳠<I sebastianbergmann-diff-720fcc7/src/LongestCommonSubsequenceCalculator.phpUT#誛\mP罦1界+驵-W[礨+臟= 2洕t賒M&.E黽撦n+b.嫱槛姝钲簠姢AO摾^K~鏲K狯z臠 ^k@iC恓嫗)Tb`嵍ùR4桮'r 驀瓍誽z濘⒄绩桀大:繎J1'8S渣8「卬T帏v$vま堊瑴[庒c鷒B輜頮_q恉8:戺煵:岅呒装顐] PK #癈N28>WC sebastianbergmann-diff-720fcc7/src/Output/DiffOnlyOutputBuilder.phpUT#誛\璘遫6~譥q 侸婍(yM戤盱 :h圂* J:Y(J F}w旐(e励`S潺#镢隷郦s% F櫥曐秇ё駇怽pV褺)8hJ皹 毪蠭!蓑掛4蔯邅鱤值^R綨KwY鄾澫]c繳e銶5r]9%s詵蜿1祊惭ch Z{惛駘客棢蕛t昿 蓜参a*!堕L帞ˊF5赩锈y:#r閩缵屋Agh?h&桂wRpy佽5l Z晕S!Z疮殕MJI8絬O枺(⒗帊V[+∽hiQ=刌Cs8 摣瓳韩34锭VJ-éJX 馂卖d<<4 k*gM坴猛卾hJ狵- x 處詎)瓚!淲( _口et抰:骷W唁蒎.赨fS8汱&pOw抱z47>媫 弒>紊泝!'o>炍糉4#a屫9W;勏:>Q 湒M: 殛$I島c夺B3事xG憞,! C鴈:}-D鍛#F #階膤3悝端m籼c 撾1\乔yN驸P耥3磺鄆v樢D慦"祿熖3坫D 駃魉鮓志#nn尥f筚嫲叄.y綷}= ,<咔4沅8[茌>,栿諀9[}~鱭筙颤p*w~.$轇捓ga4]WR勃門% #貱薆G缰 AF琪$i$aj#吨VhG鳩K娭 MQ妄CD$*tH濿eM萱泗z5&輩Ⅰ`EQ邦@J苩t'焳灚X/君哴竐|锛zO哝?t 驥71-H/絸鼂蹴秘q璚瑍%)7鹫噫Y t澭}芙=PK #癈N搝k霬 H sebastianbergmann-diff-720fcc7/src/Output/DiffOutputBuilderInterface.phpUT#誛\=怣k1嗭s鐰ジ鬦V Bi(斮蚫7tMB2〩飀u%$篑>锘| ]MM彂&墸m鴭O佉幂t—檪|v6伇=佨#7惃颇]キ1s+瓝f 槐+婍潈宓鸜舨<佐x檡#0癸●m1犛雄哱]g|< [飊!魟蝼c8探m_6锘MY5@r GL爉1Tg& G藵T腀96$B u騳E慎k12/斾1XG :L餋阬{MR鐂瘉駴%G 枿c挠`/玷ぉp篤!R"莾訏蜞e 窻1ESH ku栞%醌@N鹊'『fX棛蒠鞙轤闛PK #癈N稔 (L sebastianbergmann-diff-720fcc7/src/Output/StrictUnifiedDiffOutputBuilder.phpUT#誛\踨6鲚_q鈗+)挗笣蓃芷N霗灶$皖儱(0 隈$=$AEr凰p頦M磯纁n嗄瑳葮籸!"朙O{摚阉#x mx>囡葔%>$l$;b鋛呯鑘醉燎|~e駔g砰  ._y<儁 7 4 '槸7酇繻&+0:拠bQ\{囔Q两縹{u篑奝)&迤戰$鄎h旿媪#蹵0峕唲慌%綛卞矞H!3<厖 d葟庙;寜倷!仭6h籇鹵趶砂伀齒W碡|)阀%\<810F:q7喪乸wk鏐蛮^贰h窼 奃倍c0荢〓JD 3#&L酭拋!昡'帩'8 U鶬(贑26g犋b媦 ? 8蹵q畻懃菥鸼茡)經煾黾3#7q虑)籾8蚀潚 滻A鍥匥Tm匢#>=6 ^?G 阒え0r 汪舝桅〾藧!槏;珅攐w莼2M $3,:訁ft臅噬^毼窏打;嵸=ー**神{"R緞觟G(缦U 鮘胹($権勽秀醦?$?$3扬鞒枫A錖閐吇太'斅Ζ陋隉鑤` 3y 痁彽淹]蠡T+Fn*毄6S]5汩帉8i"h膁 %f-X蕯昽M[Sf/Wk&蘇礐奖Y>縏掄kポ臻簕荓Ρ@E[3M.乶"恔 fjz昍'N铋矛嚪旕h磂0~嶜珟犷31鎾u3繟胀-FT荌柽7鄶8斛Ze.焯w0)垱衶鐱*(%妯m盤γ縟kx:繸a 轆圳k_5鯚萾L鱀b转氹冦y>N],逢斗 x茑廢榰鳮娝翖2\*e_)瑦旈 誢Cb檶g:芁S略z<媿晩r遜 |ダ*[c経琔C 腈;劸 !鱦乯髽dxO< )洆粼諈4t>V*鉿s苹:f 奫嬦)j>~戏\i 硽_闌T[w&N鐆簾nM白蠛Yrj哴\[9薢$!Ana?z铑蚻2">哕.轤運-畁.W凤猛跬owh916+墙W7"<桚虩嘖宸:せa 豟w衪駚&H翑 uEG,鑀綪AY镱醇i斂蝛'f'淩{誘繳jd'xY=6嫄誼0tM.3:'靼7%簸fb叞o&摽飝U綃CN噹?呲x慓╒W玆镼覨a鲓禉C鱐yKO揾鯬導HN#Ц┘44灾m颋眯 憑隓槷YY綃]氣%(Z +晱鼜譮G~4圃堠cza妦ni鉼围n漇軠`睂焞-{!站螆* 冎`Q抙C6嬾%b塋礀 s懖&概[≮&ⅴ攌+To釀D7渥&z>Q册9h玭1哣/|k|缉杞踟貑賨篍4t %r\ 瘣聜踤菅 鶌蜋&诪B蘁Tx铂D帵槵1Be,閱臠忛窬侘Hj-"2<撋睤逊^30俾芜@ `寨 Y|3%b拀iS糚瓨R劒烣k蚻栧Lp樗陪哻VAz 汇K%5腁Fv?2/7v[]V鞿4胟靆v_C)楖悸%9X9噐]Wm輱∽綴鸝:╘鈤Y2,繒椻{4醡T洧2鬂~號\鯿>a蠭绷威喀緭>嵛e蝌暌趪啷亂{$>\齫"1蹎v2-.im5髯柧芠T觮鵖誎 tm儺愆4aP}闷t呁恚侱xW1牽C揚6浶)u矖<ui易k 偋S1-縀f!﹪"XT$Tg.蘉ν$}縂j碒;冖莪Pu*咆``愇鸲/樭`K[4櫮箤炳芩E询/ 嫯5:匤A毁X泍j譂n圃lC[f0踨at鲯嘠惁`霒Q莘%軷-莺\梚瞣懠QZ玙漟 醴P閟i誮ko廇]2茖瓺M_迷抌忱g&騞*詍YW轮3u5VkgMQ砳{靄\腊C) ~ZG诱_縝М*峭﹗澸 ) }棭郹3%硭^~|?鎺徕b&巤!B>P珃U輇Be1[S}12[;{OR?\胱槱乍焜箵┈A鳪䙌秐遊Y缠剡@孂\曥b膀議脳罪迺,楈t歚 6Ut齟Y]=翢鵌p "墙w滞I 菸搟Y共h勎c幔q襦塬瘿~;/PK #癈N* F sebastianbergmann-diff-720fcc7/src/Output/UnifiedDiffOutputBuilder.phpUT#誛\礩軸跦鱛选ㄅ苬瞠莿l;猉S曥>`蕦1瀶阐蛞%fび遊榙w砐I醩髧饈:M '9y.0I1w登!澫QA瀦=棁 嘋概籀埼t窟嚛芴袅胖E 臨夓堡,|R蟫杜7V;剜0扛 z攩箔+釾2蹠x捜k 鑢擝禫*V嗳j2薞<&5擰螆~Wbkモ2Ye4*转7"/鍟▏.2;y 昣 6_8槩;鋯X S 豦 Q/&$0!<0/-/}+#R魘|V=fл笧r m葙TC8箍;筼$i嗾C${w_K!蛫嬬糲飒y而c囝偬f嘘*.顬濶o7子所弭b~y{5沣玳豸燋黜W$讱v娯[罛x_ 懛足珞饋髒PVi+>)>襡J5昻E}JP盤+釙覄晈'09c肋飇'e粐 |5Tc繳傇1 噰姎J夐 剿儺(=顫晵綯酚対卧Rm賒膑浆*>wv)杳1眾铳輤7 蛙贞T8c$靆q'-辔爱de 2T癹姉歔,擖a犞鈁瀻>畡b/说,k7林鶆e纲虀!蓗ヌ禋氿嫛Gl廵 挑xだ{%鄭かq楍s蒗V嶄&r9@澴卪蒆,#踒陲o5uO洇弟r币﹍;r箷蝝,v畇痶紺2輮蹮涢E衔夺9玭%5單<傳3礼}锦丞嫵髏嬠1皊懅椱/璸饁Gw4jc緪灎囧Fb9zBx q9膠D袚%1i毁/\|佴&\.G笿?擵2栙#u釂<枙介鯯3@Q闰R褀箒-滍顓-N谠 em敉⒏蹐q>'S|.$;詊N暺2瘹嘌躠砇XU衼伾.枂|I-q啈;忟茻:莕k蔲愓綸8碗祪鯱q跘-符J拗髪庘嘣k稣█>:髹睡}鸝z恂4嗍0n団鈙缽玧m! D.睒a;櫕讣J嶟兰嫘C鮙迏/../=偏眣缦椏蔺鐣糩R玼ゑ:蟙r缲偘)1F!d]GG巽- 撠b.癕0%襸昰罸y` 失 变m 擨3dO羢壓姎鏯劜 5绸侰 搫養g跿趎焆臀鱷滷=佥襎;Q8 s倈唥 0.-.l膗榆届;`嶰吖米;f旁ㄓR=⑹跃腶鷺w%秅薏!禫陉0踍[癓勒鮪 }u>(m乫 靚薦遖yw髅Z (V梇惆帠.齉Y5岇絙銿崒5m鄄+s峌鄾curm曨v钡踯]嵳赮墼|.hO9诇緐^徫蟖xo-臸掣7艴9缦?=鏰Ji尬ix)uP娞坴俆鶯燐顕=紡蓗砾yu602 适d覷S曠t铽9:&蘮岇8k琣[?>鉼奚俛袜b{wJ藍徸价沇蕚煑礕зL?キ僀34淇縛掹绣620c'排蚺跽誚籠斥彇?闄N酾椢K/PK #癈NG2  - sebastianbergmann-diff-720fcc7/src/Parser.phpUT#誛\漋mo6_q孼姮x辆K襪@秃/0e)AH惨侶漭=|铊"荭 鏅p瓷d`钐S*綮虧鬎'=8伩禦C$c鳱yf 堾媨畭鋔(:E?runJ &餐+邮{夒頃4А1 蘓@磸c掫)摏瓸坋 斊uU攄;nd惼傘軆6钣熺梂7eI-7鹑5剴6t7"凣i秇 鑔 鮶婏凬9NV訩骒77椤栮7%#塰磂RB,菆もH>鎆玫濓>6悶XbqR桤锫X鵧蚂3挫j]處;葸⊕ H噟y鎺乬9zTB X殙蜐Nci渷2Y鎏;V港2NF嗉辉<99 镞h+${e*gk樛f0傅ラa栍]殼げzM栫JL/䙌抆巯-叐T3I媭 彥,楿圄%N2|Ok$&鄖}俎 I挮堥lQ臶喵訛掣濺获\玥.T_;蕭輌 ! 怴&$c^S`餚u$噉-玮紱迨tyY潹>M瑥 %a:琲XO怓=櫿L糊讧裿8沌鼞=東为抯5 m5蕶.ね b&莺5巈t,茤堬og〣V,鋨腘邹笫笞?~=缞忒軶#:弳 QFx晇呲SWysYg/芹&并蕟≦*歖顩{4軋V帆枾Pp巴C"胿 秢鯊n7 ;-闙A餪 E糏熳秱秧r夣闟羓凎錅厼婭3d毺岗kq柰l} 稘q篭V9叝莴_,/梥鷙:S蠎矢衘`蒩u篔fI菡捗*顪 +1渦C7僷護鉖鼠3u\但C葿}lV 嶬应蕨釸m(逵]汁掝l1譙5_y喁嶉犁'O熉徔]襻犄藡幎#RQ袪咐剑岫濖廁F鸠棢奎 术`徝6J{9qXI讅-Y5鎳*Kk蹒構vE鏴q穻l鳕団--U3-狻/PK #癈Nv< V sebastianbergmann-diff-720fcc7/src/TimeEfficientLongestCommonSubsequenceCalculator.phpUT#誛\峊MO0界W獭BI(絉是 瓌鯮n碆3i\%v講(蹩镓M毿J.v<ヂ@"2Z - 螜眰葾,掍宲&u~銵J杠╚)=嬹yPl姁擸\颶,R L茞 幰P](3+<"CFgW>锺陷山r"m,瑯乆8C笠b +aS姁蛻 盆T侤M凌p+絍>齅鍲A蒆\茖'戙}.P贕%h鞚蕇%'遘嗫%;栺2c柤墱鐒5p|@蠣喵+y2E-l:(缭 隂洚3+ 欀z塚 T/VE浗O拊qO弡9~?嗙侉8侴 贻曇嘅0j伂 Qd%b鲪61 [0毎oL襵"{o:輆臗赚)J 曏捫E“ 傮衵帍{"j筼~顗櫹谆妓妛閥k瀠%霋o矅?栞H⺁挆缱"jfO岞3j#书熸-苊|屏) g'嘇UW継:4O惚w绾檫6!p鐊ぱgk氘9;逥\6)齯莛帋抳唤 勥Z宙踻炚潺)潪v蛶N;3鷠v^岊圁V:鍴秝頏棫nY逬啁餒5赗K橔邒芖锚痴漍豚?PK #癈N% sebastianbergmann-diff-720fcc7/tests/UT#誛\PK #癈NY0M<2 sebastianbergmann-diff-720fcc7/tests/ChunkTest.phpUT#誛\璗[O0~席8H$UK莐Qja{爃r銚"u";v[l塼_?梇 揬 -曅Z杊忲犦讬矏0E '聮-U氼1蜛$傃f緺櫸勚p鴦>f絁+趽豜9- P啇VyIQ.崥fBK萓傏伯N 3 輨2G恋孤卂w>堺>r&) aA*hRJX(蕏丌2 矏D绾Z绦杺婳7吻=w ^漖莅篑゛0縻k>藂R萄-D8M6謧:.B--l垉痧鋘袄\X峪JKfv7舿V艂0q橛J'畒糼tS哘鎱碦pc堑д p氎莒銡硽穰<;=v缻Q"蠗殴襤-痢研堐揶5_泛S5E籀r滂;飌Q褖橵3訲寺@[:了4鬛;#/-絤cD|)紬!驂9授 楛灟N~ =舧oS鳏u,舻涮VS簦So(肴鵑;鹣#毠 緐W丨荮9轷& )Q頕Mx5?近g鼛1鎛龜紐Z]籷綊孇z叐1PK #癈N鷿摑+u1 sebastianbergmann-diff-720fcc7/tests/DiffTest.phpUT#誛\臩羘贎禁+FQ%ld@し(-伓RTE偑U藌學1恢偑鼂gH#6囋嘐73锿{驸} 蠙菩X-庚a殈7漟M榚翤*r-樁燫0竊 &;塇6展覑G0鴪z筨R屡緕H|稘酄隀( 6CH<畩颂 鋫4+S %c(rdt格}W_F惘颖錏趯Y0塸 -J l勍*5G"J些乨+4K紧Z挅AI勛煰繎蝙DS鼺榛 *4.Cㄍ堿胰搖,攚^\*$#Wrf 8萉轠攭仛?=E 萌G蓾S` ⻊謷)#%蓯覂呱廗LY欅0zk%?c7=oR璙袊F.$vY@矪!頪 DR4Nm鑷漠兙ΓDk@;《Srs_琥[% 絿Q詛帣鶦韖狗貏Q 嶑}佨7@-慆X臣D8cZ砿澋臗"薻謌;踋<顸帔#琑迖g肩p^蝐x'p:ǜ烑珓麮l呺NvMV觶鈸碞e艋q花x#畟釐座_慆Z崇? Y<PK #癈N夠.3 sebastianbergmann-diff-720fcc7/tests/DifferTest.phpUT#誛\鞿雘6慰俿 萵靎v H,庛l(抰-Q櫼(*弇wや7鯇 艅 讹幥#┹_俼mjy動z(竗塳叙]获m緻!v\廱 豾pH$.a鄱8/AN娭緲r澹 a 镂】埞猊M鲯6G>莃Ly饵鄟唬崩勝豷-蔅钘9>狷瑝犦呼N;酊}㎎)艱;b蹠啈6緎8 #nQ枞σ阭櫺0 @湙>弟<po姞明拷枦G滹|~c^襊衾柗姱ol濫"垊 M椱S"壮)遨/-栻0M忺Gy翜兩*N枘}莙-2q斐憚闛&>粓!#⑻=釿慓勏s5^篒} 阮BL,G靎6r\F <8鰺 2;挠咷臕>绪-醲阸E赩wo墵瓁紭 j4s"f,呩!>跗觉][ 舽如固弥^棵 0'鵢褮90耆紊肔 T:】e娉~頿) 鼊=摬 锕雮c衢痚WDC瀞溬曇4􇕎z鍴h=縮p:逶B纤 a厓 岆纱U=:秘寫4ソ橬匟S..`勚/z<魰滨罐 D蒁m4rb6鮯J2釺0B补p.Ax#馳呎\B襖0~3狷鎞鸀浦牯]栵v|迤枭G豤cヵ,-蠣j銞c耇巘檥(綏鲒 K>礦珔蠣z敨旧抖娥)3冼>捱7Y 磶蒵庭V:W礇赣業迕R@d溍j嫋DpれF-烸%顋d~e瘩〾 ha|* bi*a" _-Y秉KOQT亭藤9餆滮?L.葀祾掛c8\!4,巂X 俇肞纶 2,伮塙+盭%媪 v説5乔d鹖釧*> 腽獜嶳><赳劁(I伈Q,禡伺eI$諜灣蔢裛劙*BQC0鸹解?檄=;.钉鋣廉鎭玏?J鹰E莎衚帨速玶Z鰼Y󝳥w+%?挲瑿躒簏ⅳ:R镮冸艍梡捷&i)$鹾膧+恓J騇軼 <%枞O@b>'暓韃)i塊ix摗A蝦a珗6Sa{e蚞肄有}舏*w!2Sr_膾U'锕昨ΙKL鄏焾=桻jSyd {痳R錝{鰬p坭ol鵏椺x[{%麌禎疴3u噌噼楮xp诳顭^鞛N7K H荷或錾鋮 I騝砞閄醤5)M&{wD%+si揮+箃祤3兘芢)4k~邬萻牸8础謒:粕3 磏踕鳣?4牓纷蛊祛铞蠋P艫&5D[6聇J! , 翢暥帓4喬g瀻!o: 裴>k纍夌贕軣葲岇摸o袬]$嵒|蒣cgG綘效+8HF魷廁鰽輝龉&/ljxAm0LK'桟嫠缦孎驋聜b軲<猋#睠#羠 麺90猥/3vo翚糩慵跥U%紮纫-c歜艛偹晋氭y%\嘽o[3\墣{)!诱E閫)Rd,蚒6+鎰Vm$2赱 茉u縻琉a6 璲HW2f亱`hrW 摆 i茾輱"臯h+F泏柼]D懅佊婚7"_ 7邳X萄睈犤\gz嵠瀐h晪聸谏)*|筆岇Kf-梾iO钒龑V鍡Eú 幍">s呱-嫣Kg撴Xk岭礱紾E澞軉&cz囑隮徖迅e搢hS贸^伳1i掹乶<*譈{{Z]穾k h9U笘P)佢摦螎垧爩偔愑甉竚y7笈徴"瀓M啋豶R臔:爠 %絇oj'悇$F#4郀窚枬鮾箪+厸0V撪蜊騺済讕餥銅e麒脺`4h砛 訝驡e7横晵焆QoP嚺C>r9Pq镝0*>砸肁烗f@c5鮁5j棂貪$Cc攍;z謅; LAS腺)旇'/*象醗臤z燲7細)麯蛈麷蟥鲀鈖wv踚p3矧徢m槊瀰~>}E烤Ng嗭粆揀熅7龤;у{71運Y荪g鎏PK #癈N狂炱1 sebastianbergmann-diff-720fcc7/tests/LineTest.phpUT#誛\潚袿0七骔ID{-辛BHU囍V{4滚贡栚憓I&䎱蝞藰i~眛军撅凰披秐A勄<7捑襝嬦騗q灂 0疢m綶 渾+[*u髋謀0;祭綦嵃.^函X單庼哕:T#璁i@忽褯uM 瑐艸磥u璿~#8{m儌k搅m鷑r_崸硄D%揟 偔燣 搓l 拯傠糄R]梇fC+给b|y冕纬琧羾粐;_込钸:m9茾{釂r惒\I祝-'芺以 蹐 # ;仂G|:器旅 e篬ozAG 堪梋蕵\wV屏衿h焰zgTj隈9姡9E\傚蒒+=韷輮遵G%<埠v]鹵稟K犸J=蒇@翵蟥7溂禨糹b慰k2y葚z/q/簶Vw子忋沖凮GkL旒x跜,飵岂耧蕒+瘰PK #癈Nx窎E sebastianbergmann-diff-720fcc7/tests/LongestCommonSubsequenceTest.phpUT#誛\誜[S8~席8特.2鹄瓍ZfhС!換l卙謻\I唂w{$_b'v%介AJぃs鵷.朜奁陣DRWi蓔=杂槳虞豌V{[p;a ,cL1EGDiFx;`泷6R走刕T轌剆8)ㄟ〖3谐l蠒悹'艻/猢d 2焤卹鵛葓h&qH =0鷋鬏\w簾z]檬*'D#Q0c(4G'競(慔煝爛'U1辽B鮘蠡K4罡認P噻熆犳wW咟珙*軦]悹絜my鐙*'仮eOF5 艼翇圜f泩"羬蒆询 >5紑~訑 r骗Z27 <偃B? 2#o1栰乭 ,B"实E诞cn031坔$漪咵L7靎\鯖1Ujㄘ縏)魒=伢`邇轁L嚳斑脋愸彞性7'8N竜訤嫌_bw ,Q姃i鎴邷曯DIw尦=债撐C赤幺,匷狆蕾;8黨(%T!偌/){]Yu3IO&iJ浈x V5h顪╠!T枺鷉7婖 卤巟B冦捹聨s尘u翙鵘X幪#﹌岴 T茣x9壅禱珵MY 槜M◎艑ic*很6v"1 yh!2A:t豜K7I鑼坱8=薵 8Z晘(9]乫E0V5,硭04犨4牾XR湘爾k?靱MH厮舶j餉,a旞p3檿|堝j命,m苞I偣搌藵荱"js3[}- @ZQ(+7 -*畿㎡W螀硢屨lf5a5▎Y饴t&%/蚸譼W緿蒿s温蝁氀Y" rz鼁貨唧J藷c齫酜k?螏6<鳇Wv呢蒋s9I1k螄暑r2潐-憌霚 骤V礩s莞d!銩%\rK 樵Bl?梂E漊覨 炝[鼱姥|$\%XsY煜(湷8\吴!腳庽覶翸[=件劥涥Q婛s萦x鵠kuy%R掗P櫅q帀8){V5C鷳A財N!.^d7!+Tm ?.~?Sd哓K诊 爝<樾喙炯枬/nez眊釺鯚 XЬ/天兠4.^?兔鑣灶;辂帊椨kun皉-郐擁垊k B欔i瘵NR滺嚹)虫 犭"嶽OPK #癈N %y燫J sebastianbergmann-diff-720fcc7/tests/MemoryEfficientImplementationTest.phpUT#誛\晳OK1棚sl媂稼k┣侺硴n ;Y揑k炕倡zp. 摋呒桳簠妉繢,蒣y杴Kl81銘<>凅丂揁t恑峐<蚋蛭潽畵枃浮磇阫漌厮iE梍w頱 \ ll魃oj 偡腨绮嫨A駪O 勞踷邗鞒r蕖z揜@3T .B旒詚r,蓲s=6啽≤6凯湳n5苣鐲鬡痬躌蔊tjb谙濗"騿蔡b覦^杣Bli喠杸S?遹F 0g鳦竜4l>鷵聙^吀蕄 迚虥6E!邾w卪G厏c皿4烿>筣%拻X噙'=遢紱PK #癈N, sebastianbergmann-diff-720fcc7/tests/Output/UT#誛\PK #癈N奟~澉)N sebastianbergmann-diff-720fcc7/tests/Output/AbstractChunkOutputBuilderTest.phpUT#誛\綎}o6拽8ln+治M;M -*Z:Y\$Rエ噶酗#%;懍&盉蝤釕只0綀)歆ZqOワLO莾3:v!O!}'Liじ`╂L寍/h邝p筋猠虅w浹绀 甠鴛V膢 tdQ濴_橉!姅tE U4梑I剬陬8甽堙椏\_毄,檰K羚&ρ!鮌┨攪$洌9巂1 F 鷼軁O晒縡:婶膓2医7J例(l%窄;荰_夷7蘟9F6雜O蕖J%蓍俁`灳3q浄2 笪I瞦抃硈XY}覶Uj彑/儉{咡$乓!鉞婋l戔 厙,虿坕┈孷;bi 虸g縥~ k洕犓鷋.ⅲ10ヘ=~M校E痶沚K8 攲捍瑃p⊥G8Α屩髇嗿L+%8C?鼊6┐;策I稜娄z灘h袛Xe|?蟚撌癉?|<磳e@8呑郚驕57&"4@蓄身_ &ㄣ_6u癴6╃垾莉4鍾3%犠洈壕9]俥泴浒b耟7#s(浐鈝W\<歮wu+熯-鶀J#-底璂V绍&['矗I@@+狰U謈陵]担3犼p-畗曞╓垻夰娱W黫離g['酰ka椐櫽鎜t諶幙硘顯皨臭静s a淲Iw馴鱈f禬6鞑T锁 ga蹡_芋矟jw炣坖/誥g鼍誾h帏mk>5丿L:o豚+\峄]竍閵烩汢拞愓vH7\~酠;骜昈兣曄3#ζ儭槿n纩紐咡纥 PK #癈Nz6|dI sebastianbergmann-diff-720fcc7/tests/Output/DiffOnlyOutputBuilderTest.phpUT#誛\璗mo0䴙_q*:Z辕}[ m礗ōDX$b-9gES0 /覍D=蟬w驿s檿恅 崱盳砌昲N矍Aw/=赶T,叾燫08艼A軩﹂焥G酶 =糟B辽螋9骍$鞟俫髽kチfi曠玶﹀8 (乗艸唝)UV*闌櫍嘟壞⿵|韄 痋*/襢侣TH34,&06c U(AШ$ 4ム庭魠蜩捦E窌-+{筠}果蚢SE鱤l%{!圎B9簕搋y&ㄍ藬栻YWA<鹵嬅烹F聐6_)?戕《C炧pE<䴔{唖,裡p罯AC%^╝萔勚b舵E-4翉鍐[沟 M\#:竞d$ㄕ蜞!鸶9鳦D憥鑃/蝔Fn6?t^撉T岲]l哳綏φ谔o質~S┤}瞩z{澃炇瓌o箐7,飗鸰葲铂?,n蘏PK #癈N8 sebastianbergmann-diff-720fcc7/tests/Output/Integration/UT#誛\PK #癈N谲珯<'i sebastianbergmann-diff-720fcc7/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.phpUT#誛\踨6鲚_伜NE:涸痳渦b拴靿涮t卢 摖 杷戽遻@R$-蕆撿vgBk$8拦這盔G:OI穆*鎖h︽>e鷃线靚慮2檚Mb0)U喨榟vM滇T "莭CP/羯笜!瘷-銭 }2罬?b/5'R3g$螔剟2絎|67剨$p@舎扲3鳓鱼觲)閾螤咔O田L忍t|;奄onV0沀F维^3憥#踂X&农N.紉L-鴡Ex櫣挿D@辝聽澼,EIz潑䦃A@珂bqD佋ズ'B薒D龓$V據B敻L'l憿;k/圑塥G猫:柗b*僮3^护蒐>^L魅孉坲3-'B00>J甈諻錃橻苿 褕t j4笹1!.燎'6]a鮶 2] Sz袣閴lnQC!贻pps>逌X悛鄃郥揮C药闑泭,/慞给T紘 n^!G^撃n儶闸銆潡q8萼討穆x鍐~誕V見涭Xa=c{>.z琽戕r饞t!AcT韙褍椼o賛纾稃鑬q靁坪H┻p滗S!鄦DF !s麎 ☉荼03(^H鮜j愙R1聤虂(P0鑘i径,黡荁'.Mだ{1><E閎=樍沩UK1燽]`坉#藬芻呇%5w眐糨擙赮捂N莅uv椱⊥诮膌!CUX蓐叼c簚秌-萲獃團鰡 ;彵*jm 橹勑骄n妓澘腴蓏狦券軏譖撹v馻丮暍 湉?2+!賱:К疧P憋&4啹O蠮$汸W&6歷0}h{{@>|"滇膖zrz6歂+76CS咕)啅碓.f淪兗H芰u攼窋7錎耠乍弸v矞_R覿7=綐烵苸O漯*層臅/眛4N峎 Y擝K碚﹪,k汏&魌瀡樌j媓0飏懕嚏zB輖錏s鞼华鬊 欍 熺譏r!)&{踙牰"貇鞞荑a籟1曇傈讪c眺?=0輦銖 朧溧甬琞r噕俬Kxx|HU^嚏 孽=箆頽.:@&獲=F( 戬/鯷逍/LxB躿矜U锅嫨徻舡4c4斷v穁gP|OUb饓=鲓5熜D3/@+G英J莧y︴垧o刚D篭]#)f~ 頃h鱄/#4|@!M櫈$$襙 -R嶞戴Re耴闳蕔痥醠斻鍴F5鼄lU4笑$C淘(&侟屷昞q=蜝壋洫K骝蹚臁76'藆W{Wv塑{ K2サ>tfG洺F顰x茀藚愐R舊S&躼潄走 搦兟ê宆綑/蜰'鱼奄閛樱W撍w#驘暝垠殍穻娠U睍>蹦毿L髑=#睋祯zd衼旡心u赊j{玵<强求缦潜 G%T&Ty閩v]M蘊贏~┄+T仵ⅷN~±隱*羰谥(f礹傛楹{}R赧揎o阁#蛼x8蕴X`愹/屸費!FD剘酆仑,J1鰖疠肳?熨" 3炥 躥B訕醢粢鹑gj苻頊淈.诙- _mX叉椥 钍4砕|9姿4犴颠z育輝嬈洍筕洯=杵"ψ兲-5兓Tj~6黚c媆9,座\燎镮栛キ廅菮讪敋Zk6 炈呀.tm賤m禶κ;9T?Ey|=55 V @粫冏v轎孛锞|宅谁*-┇*c崝 屖牝Y郧鄂炯愄眀緈襔*释V.浙PeE]冐Xi遾補悏剫OM?3澗T|V}sXm菵>嘬v%镖@k煅垽-9 嗼c訂:呚潤|凗嗔蜤壼<i湤>o PK #癈N0瘚c sebastianbergmann-diff-720fcc7/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.phpUT#誛\鞼[o6~鳢嘁薢^摝K嫒m45lgC1m#Q6塪I*北隹颬肥插奱r`G囩驖珟撄$E$L$栆拞:衚A赠墋謘弞蜅T&怜繰##E畋37<>胘6歎'鑗")f 僵/繼屁F鋗)3%Aq$(鋌-閎fJhH,2艢r6@"!h彅<錼7#飗U9H侥=a"j合4壭誎8蟙H繮D j纷c8%J` 中+濑8檀若Y瘲佪甥8鄰%=q蠅#t枱w韪4Q>H茢D唕憐.1榨:9[# 誉D驉(U(貳塗6敓3欴D杚*蘔喂焟NS馀1 )嘟醠aB劣敵Yv鐚皭宲f 旨,釀JP鹮唍(薞y"b0T@倳B]丿& 橶 ;"+MX晝轤=棄gW瑂!#FT禝茠Щe}5 Mu $ }',=r錖s汄s迋翏p巪Ip"癪ZApu= 4D}w841] b潋L粆;?闊档UX嵍`巵:+絒&鱟KFj)詵 №貪槗T孉伈霣褡蝋h傚b駥藜馔ea崱)1h1辇 蕡躥=碋蒧嬃嚷)J 挄萢>5A踼Iw w硔NM_曓ebr[F埝岘:嫌铡?畐T_ 懍崘=硏[鸷僥-髵@2鋍):忠DZ酴购F賃#=Ё鸏6) >6繸dm7 禒S'![敩_緺'0"舷a翍*?>,惹@聅刖}丁&標轸騍0揪檣余n縳焜嗹(鎕 迹 ╢2邱UwE妾籫珞䱷<-~Ph撤Fa柳+Nh訦8_6琂鏇!佬T$塐Oa昼0崔 I碕拳裭o弦哓ち k1噲0 儇訯柈蒎 U畟眮 挐殟嗽$婇x硤婫r28皕躶莵骸+刕+ 坍[Q7 K鍜$癶.谵 |w顎,皁.蟕',%3峒:SR饰残Fj奛鎅^屴 "o猔3b y绥*挲馍\邈嗟:汑瓬蚒厦{殳招:痦榏 : 沝)\掟9忦o帀cF穞粮$斡掙螨鹏郖Z L|=矾富K 貄Ae謓YJ淂贏跈:s屖鼟 圌'㈱诈蟶鑕纆 蘴銲 x+(髠奮GC 鹅 玣Yhcmp0u.熺T#e/濰蹕]K({h法y?rI蛵枹耺oW跾╟~8T芏宋皻$)s#@H擧ǘ5<颛禰 rNh2蹀成王<蛤n?K牲n辍/停蹚侘a2詌汾诛?蹝D$0 ?}莬叙X;巸>6w`)>@'5熿謡l>曟沣.'ユ%殾"1V?Qr:Q_{PK #癈N(A& Z sebastianbergmann-diff-720fcc7/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.phpUT#誛\蚔kO0_q艞iJ輺蔯mxLH圡&!T箟C-d;04襁g'村釚4鰿鸤srm蒄D4L垹隦 獊合<{hk&1 1K(i 塗岎瓐舚U t=軃㩳|*n苿s責⒒z綔3U嶈醕蘨*@(膟扏榝鱾輰A翨圣^椙臨^,鬏2zW臐漒鬙蘐I5" 顖剤檮喒15#:欐"諿q22#簊J}<8稚遰曞jq9&DJb,f42彗,墾8&妡-酉莶|﹖∥枃&菾該h苚巘唕}Dr_剹摌&ㄊ嚝i噄W锐?>agm櫄k%FPG蠤^觴ZV离o痦缝芃Q P哑穵>,4g鏦施(西璝[職fz濉吆%鲦J&湔全闿偹 r亗.R圄.a渹敬P}逖W+s嫳磽 {嫋k'鰭倽顊龌蚴( KS细楮謟,鰶零.緭覤螨條{3侗-R?憩V逷tE﨨现;o颿/PK #癈N访+菡 VDR sebastianbergmann-diff-720fcc7/tests/Output/StrictUnifiedDiffOutputBuilderTest.phpUT#誛\錦鹲诤臢;@ &怈阪喖诖閕;嫂s3惞禜9a0礈 5┈欠焩W粧嵴壳鱟栳9歌R顷;鷆屳譌楗扼B疱農 1跋1r(貆pq乖Bd觖郜痁鞏嗍秦!餵Z麍7!蓊酑鬼角袩 囆登?kpO .&.楐mg劏e2寚辈 ?妚'g\濕Hz(<"z3「絞w=q簶 悦鯉4骂甭)t箉蕜3?N鑨B_j趧嶜轫НL筌am/ v 凈R軓殂&}k0qgO]<$6$V鵍k2<} 鱴I踰盋8肉xw^啅忽v躣裉+1麃綿霭鉓蹜,H韀辟"椪N鞓鴫b襰璃R鸞鲡捛 +鶍!c殙F困 ` ?峲椡|添綾廱nQ{r`S鎧wz垻O廄`1a`,H鳃v溺x襛和T瀟y烜欆6臲A!戾懿囆X:蹝扠鵮嬠)糵 T樖*N沀y暍?敫浔,毸fHL74茨寽 ,娋Yme+f'艀潦?讃t鎚RgNV澅繌,r嬾祛螪P|Z j""渹B< 溉缐i汚鏯:qH姉; h琢A K劣圣vu渉G鹊L癨^S V裦霛覼縊W侘v吴>剛E圹魤梳j詵旲T撑曰龒*b棶蔄~遺慮U鮟@)譸%G耬婜齰NE6Ew#筢ju偾XZ?龓潏d%䶮啷R├4M譽x鍲;:倞GGZi&黙翉C媊` 測B苨M$逓14Rvf o薸(z0LR廴V攫1u熚x艉`黌与*鎰&5傻I&3删I&i櫎 L定gl錋p领儾旈扢+,mz洓佪.椟耎]h;*0蔉暀 縭6 j!N`O儅 4ó;E璙k5$ 巎"]盂J"$韊,Z 纲j屮时T酪=R< 帶岍 W57炛餔MneM鲜殺R ] 吀 +孽/P⊙&\兙;亟穱=礹^隣蕐3襴*風 j倦畢澒`灄碄o鵸Z鋣跽d系*&?< 龑亢 虌 # xm U f蚯|&p#14填j剼A[k 訏l(=)鳥2玤1(nJ;r\U︿k縥栫つa獛E桘腜M整喅獒.鴞厜iy噘J鐳 5T5*唚顺`w觗3=((~Tg#~苾厂q裻  鶙坏Y(9v疣羁洸运肳喡f 蝜涱~fI財磁$k[a︽&,QeL憔3O<⒈?#2鹈裑EQ狷0毟:,o儙m0)l0&;浧砌1树h烨綿D硝xs_5E倰盲^*礵d慥QS|>i曏2V昂緪_6c^崌监傯礅葺遒輂) EP殇=鎳8s亂舺8\:b 侒閵壆B婼z扠秿*廵 s墫仅)6.l,蠍Sm5oCa瑆)崦 v灩#{n&K詑鮊傥 缵w鎕煛.腽$鹗Z未PF櫌I滙" 5Z贸8厴s/;C:蝫8jr噧й5憢煀 麪稃7T驸2kc璂6飇u.S=Q踉Рj-艙谭裵賖8M鍥$7乛q遆GG4*m随郸=嘼甂輟~攑Z憟y敖剝S皵潰馄毣崐M 9|6}緒謞f抯a蘯L蛑$&yg掲&4f籄6'X怔&緐层-渳<嚜槀h坛騖& .搱衹弆&)$邚鱝遵穘藩夘X萲鋹菲w靔迬蓠鷪篔訸Q 距迲B{M^sヤD斑鎬萼'z q⑶牉E∶圮餝L"鼁櫓"繣n1v撆x梘*辐 -)艻(.8鮠q掮Z /M!:.枷-X#Y八\矩呜鹛=縫p橻澜d?.>r?EH 6鹋`餰v;O0$+Lp濤KZ纭苩'柡E轛-3湧/[U4閖-歳"38V枼U豢煪s蔋莫tň奶mj摔通Vgc鄻z斧%f獦9碂u渊ωH.騽枛(v\f禰v"Mo鈿*T<蚰e嘲N劥蔑鞔 ] 蟨-!IZ咵&v⊥F鞪5M梢*x6<*nj媠;Y灙q$+S7#'卹W署;\peZ躲J9i鋍a燂>禧姤g-9I螐{,贾6G濉7镌粻-綻墟O嬻k]\涒讍&居N a!5q缀6诺%畭圗E遡+Д&C+Z滃滛8gq',釸D簶麀虼N䦟D> 鵞湃髪刡焊翺6涠7?t鑁痈o▄鏎,圧镬颖畔g]乡嬦.鷪餾峒企<9=|PK #癈N2otAT sebastianbergmann-diff-720fcc7/tests/Output/UnifiedDiffOutputBuilderDataProvider.phpUT#誛\臰mS"9竣消8z.翰{/{瀆曤-+圔槡值縚'( $0x##揘:嫌閪挬穋孌蒯塜L矰嗁M嬼cqiV久/m檅Sv'鰵槉O3烧j$浲戋.咾x鰀联HZ]V喗wh揪捹J$>=庂%樀6麧喗!懎v哱E貞)瞳毥に3賁wФ颮軟q荊坏摮歷e@fm炨=O1挌P飁& H{$4Q$4闡呕"95?!g{D帩龀笩m4モ劚糜蠒lJ{/;慔鰔Jz%龁訉勀S厷 苾^诿%;朖滛 懁婯' 0N'Y?Q鴘貭?*%皥nb瀰頉白夲|咔S &炵釅竾魦qg @ay墓 l裰o.\+-嘘8;逗仼闎^p⺧睬紏8/谺7#rGG瘉逮10,:P.d 杤{洙N#>∨,釖ZΦ~7? 虯邎p c鼩+詠f鮸鋇^3R潆椑檢D卧HF0匧鵏鑉眄钩U▓倻篵;!郷/y⑷<#旁蠲炇窽'塒偃炜脢:XB>楷膯澻) ))髚YdM/鳄-)0侈L 鸶=cmh縧堸+篠iSⅡT偭;p%xu&0池輣'摯刬^殉鈔└ Υ軺︰珁䲢"缛1櫅#%2:"叢vS癁 _>9X謌寵箣蚟竍蒬[i谝9梟1莥vz錶晔4T皤H'}髁?牰C!癵舶F遾Θ4窬派误唩瘡嘓 嵉Lo笱l读椸颊l u嘈"袆碅聯e卖c`z5则*8x +z虍 d=zq愁WS螭a,做P+旿頂7'`Z搅: 觡K歉c`斷邆wx爂情衁bHB"SML禉扡2u畿 c菭{蹱9lS筮湨nT寤6R矌b肿烏Hn緵c済+:俟蒴◢e喻剫)秾嚟i籺{(阶梯獒+穱5砹軡.^韯圂叽0櫥用罐]g鐜6)^>^>^>灮_GF:Mq16羣4醴g伔 P鵐熧靇糪3剿c p-71&蟃墿5χ欄`杲i甥g鉣}[陞{]楆憨Tz儱扨",|蔒8倗=rFG鐠}撛嶘淘L3鮣扪座F 齧埸 ?PK #癈Nzl浤V L sebastianbergmann-diff-720fcc7/tests/Output/UnifiedDiffOutputBuilderTest.phpUT#誛\臮mO跕 䴙_aUHばR+o+"&1@k>,h$Ns"顾睽M鶔秌JSi!椮>c焥H 1蕵B_#筝<∣>磸嫁{0N箚刧L h 6湁^虛鋩鞙礱葱9狪蝿悭u熲Y镣A導3桼両沞赦Y馡j2⌒W$R逄p):Pd菻68+蟏 oFC绐iRf`4能%Z1谈IIC hiU(F嚭鐈傚 F%蜞倰 n)9%葦b蟢*4V 鳹 ]r5峯?谜痨b%>酐佽睝靽乭u^澵e勧&a枉毩C?"[鬏鶮l鄘26W睢吱t騦.E踱W鷱]s76轺矜犢p芲/+黩&H砺-輤Ш祜 蝄q(嬳/澘,氭泅毖L#)旴ns坷踱PK #癈N8 3 sebastianbergmann-diff-720fcc7/tests/ParserTest.phpUT#誛\蚗mo8䙡知He淮籊_鑝ポ蛾溯嘡!68关№濚窟貀!BJ;+懩瀏蟲l黟譧 8壩EH1釤佒苷.簼R幤#蚯垞鎮b謙閤9);Ut搸燾Nf1t業骼^抹h镐K9驝$#螩<噒23y!寖]6雒詆uxC邷扜咞v~铱搁KU姢榖1G."A\鬑F頖缾K$毽1<#<佬橯ON凉M嬂嗾撰;`>8 A n '厘@嵂貘 槱7P周U~NB^劵!'a2G=0P(y2嵷廟)鵖*魨2&eL唄x榮3懳"$s9J=4鍛l爚嶤攔W]M B:莻牆@嵙4慕 8b帉/$柛 鬸蛚*∝唋;2偲梄鷮だUL碏#葴匤l昘慫莋鄺峐満 螂$訃糜箅5P9" oX8訂x昷鈶'mK|摟瀂[B膫0$"_2稆渜仚CX陃UL陦嶊A憡([9睖2];5vo>_繵旹\/指灁-X攀7笘*紒5f&槻P鬸墎 N&6W缸渖P-綠灎Pk襶72莮詙窴嵀鲌X1瑫荵u无&C鯦2fmk> 7杄汜醓釺搼F1“6e褨 嘑佾F橩9.O嶘e,屿篡歛9淰蜇^鞳鮋葵ㄗ有慺k`鴃麆蕺挈Wヰ}ja 5 KuI^Y巒Z0龎浍W H煿%5&1洂佝K3 迳溛纪瘡-覤蟑詎瀪;'柹羒&>艸u駒z娚鐹 X毷Q%1gV%l灤貚粙摨G旷O n醠緁tt庍L绾2WV娩拝>l玊蓝*7Q酬-T酬觫姯诖霽蝜蝓j琐 觱味-m鄣w疇i灟斂,蟚h怦J幊+}癉紾綠轹搠ZT XF F褑^<弃Cu#枟.醷o"h3 疬薂4D苁HF趀k碸0.AKU劣|1t;i-転躱磫-9kz=(鏮傞zi[孊汞.$g(9魉>缶|~\}}ZY$鯍`/#&趲- 鮸傿n詁R率F/9y>+o>惫鏅o勑艼8a铜r^泪-珔H琑珤Z钀蜓YBKy露凅$春唅淁S鏹C Mn溉鏄屽膃53辢(x$u]熦斋姽*喞儺∩媆搷PT 陜蹆遽6逨Kf嚝 }rS6殉`义F奲-YV 爈a隼/%_寿E<[\拟?f鲶Nz襸嬨鯣7e嚺O竼锚厣>惼`Os0qPK #癈N"卺 +E sebastianbergmann-diff-720fcc7/tests/Utils/UnifiedDiffAssertTrait.phpUT#誛\ko8騵~臫洰~&媘澑馸沕 t蹱I8Xn燲t,詵 塏l筮o喸儝h荖姻袅度醦褿菋<6灩3c鵦~羙,顆澲炝廰庀圜聧8堎s Z?4嶡捅g 鼖EWs7(鄜死鏜徑H旨#郤撳l鉷q鵚Sn嗔 苶僆蚞顕 sq熠g_藕wo_灱?;!T侶>u9|uc饇b鑢蓹_}>d 椦樶F#猍;;;g衤帕岕攔2鐋恂,>苜釕雜焬4骔硤熡鹞?;OkoO|#1;!競]S2旳餴~嵙皁 6FB阄栰溘-堎%薑)竍s\鄘 I瘏燣uW住 $扟z 樀酐J櫍g棨誼醶辻(M_喫沝貓馿fc幅t溑h `KU辅踿羍能/祛 }p忮%2` 簂h# '0 Q.V;N攜r fエM'^犎瑵$抐賃猰 9Oc硴m-viQ,."vu/f>7k-彻鐋碯'e賳訌'8;}黯丈环_键媵Npq蝼轾暛舿BS蕕c9IJ鳊r~散 V叙莀G醸哲yX氶(H'葛孲と邑?泒楲b鸢 蔆`C軦*裢2喒捬-賏琉芐6:`* 6tVX察肽鷌&D柮鋈 CS$朜啣+Wm4襕3锶鱫郯o昚萔蛛鯕饙沂魏曯l6啍苆昏箬-R6芢8]/裚c酫巵9F 潋<#y铴颩呩$qznw*C!崌*e 嫡j-r檆渊X燭|=o祽#閹敵q誴8 薡c('w梶Df慁 簽 y.啹"哠z 憅唶\<,0p訵庑!噪蔰俎;婺晏q瀮Hz鑲>$4`儡嵕 0u駺=&<鮠D祥凳(z关*tF$fUl夶_Fy7娷r P鞷麫祳埜Y!椓jV疍S台祦 pe溽J室,橷"萤 湚ヤ謧Jh鉳4#逻 )rVQM@O*"x敇b曀M蚆脴0,!p褦狾癓楂煞^魏0"!I殧肱l瑝Z脇C患煗!矉xFk:琢綅t:弎=勛,毠"渋M@戂慥稄n磩9凍6.h墪$dc藭"h4傆T笹ZH>y(脯`.[{pM}韥欕PK%杽X榎箏鶎广)剺闸灃c$D厏]*嗍狣臅U詥V癶蕄战5维)蝧_掷W饩瓾H焣p?[誆芷譍_莮 q殍q恃趝 捫R髀;位伇瑣0yy@墭z>瑔鐳a愫@#z蚌┆$E`(tY_x#<靲燒暍Kmzム侮bw蜨t D'g 痃[K欓gz+佪i\T]E&捴萸稈X 熕~麙Qv3O蔨[6i懘霰J洋睑暘愒b颰蠰U沗鵝0齒嬉-:味饢嚳@曉 塁恝+m璕遉f常凳惨鵅樯嬭-:o9欶模╔3Y嫝0)r圼崕Dg+$麗&Ss筜-囜腬篆Y4貐Wk<塯E肰摹=&/2!錾v膉 };糤t|蜥禎湽d[hN/禱柛n*'s?起価偡Ip,审~"5?j'报( 辯觯MVL蚘籛閘$/覴(,予@>"s诇Z駈0虔):f梼隦疛歖ζ%#ル耈)龑G颴p脓閍M孜q墸蟦O壎身+渆LI?訽N(/郏医`<灏呖C謴G赒(彇-6QO耙7宙t毫衍=詁跨A玊CX却7%a澽筱拽q*奮嬈否錐R=扂佄 5W只3丏_ね昽嘢#侞戭渊DD硐,y闕qaPI%J埁 M N;ご挸獶婒Z蓼M5g顋1cq/}o]〾廚锒;6谙<稞验u7鳠?銮熭.咱輛踃第(G0矋"擀!L筞訃癤4odKd(礓V擥0N銞尿繢曔m鋤+y筗昭$@撯蠮+ 北皝(肞頭"KfNo攀衕}6嚐>诔蹄楥95髂梕;羘税 肺6X6憒 奴 蠢;XH仪蜚鉾漉{橚(j驜,該OV,\N澤α勃礭駑谱癝蝕iP缭蒴 拝W鑂羸!踝yr謬齈`牺f/:瀊疀F珠xn瓎9lwF囚*w鲹7硍 猚wo{/磄濂w4榄n[8埜4F)z辪諍.摜#訒黦J轈&`aZ;x榪撴茸1r粛|窴隒鍲 DV糗甑盨).穑媕纏磎谏#铼溑e&袶-珕[骮 S檳&fN];<`p齅 0橧lo 暎吿<寸Z5翪 F婾2*鑁y婄 z矺=,毴潵期馄l距7jご:蠯謊IL 薧放-钰鉅磁(鯉蹪PK #癈N {T sebastianbergmann-diff-720fcc7/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.phpUT#誛\誛逴8~颻1婡M賜{悸栥甈]uhm私lP譓溒"眘队侼7泓 i Om泷7阆8外 B$Ls蟈-话7轞gx軄c樓翤$鴻1mAE`鴴+"hG袃Y5縮絁檾鸸毒纗v蝮r虳i1(OT雳*独d4WFJ %麗%溼车奉z:菌2"W檯 3 Jh橻翭g0p rB=靦$K股>W三KL慰"1g漀巃o笶D悛嵰齄;FDgn~鰳FJ>鷆昮JrinL鯄~喦. 螀疚郱赛‖菶犞\/ 藭 砂: 30~$xH衺3唊;譒丞磡薳h爞座8銅 2-痔r80孽劜<燽F (捓辠^諮勎B銗榧#X,.н @w8 #馺sL╮;倘f`l 尊鄮僳l斡l傤寚预椐乊昔ペ茸苯嶙m =K侙$WEi&ZクL蟄9Y蹌2淅Z刓f2q谛櫼tXd/扊蛿岧%"t誅佰`鶾馹H=PiJgk玖綎6蜿I]:橡)#C瑛oY %" 势鼠5g 頮煺Xz絯-A皁,豧S5鶔aZu舷_U附欻 顋龛外y齸兹嘌燸P蘡?秋<洹蹹誺瀅匓梍Qkez鲔m*鎟ec'篤'\z舭筟x颬犈少|黿(稌0Baモ4セ{d咷醾刮賥○縣D/蹷爻t够吹4飪O姂蹞:%+叾楌"礟碬]莴杧揦8>:N7硋囈袠剆j 傊2鹻vfg7鉴=闓囿N萣^Q::鷭編竮侉頧隣,xg鼲A79鄃腷 姛3&铸犤]脄T狄┞殍 祢7`B缷q帡園黆宙P茽篒BGF譹须k`聡0鑠\褧駙锧D!gX6 i麈h镟2F>觩M<衍囁@黢 N@$頿如d鹾e 6*bX86}d狗彄筠 T;枙喟颺縶忲{1逗旕厀茣轈嫲满3Gy琭v鏰/輤鸗襐娗,f6u罰姁)稺1乢i.|#-绹ZH寱魻 t=xL(砏>屿],噥蟘堃?>0餴H昒[7烸r幠よ*衕丐j%?Ju2餗吃lz→+fL6-s94K爳61m綵穾麔幣1痪1^蘵 4.犵撳噪u8羍H,譽針_Z苑垒俈霜e癸-6震s璥?T襵 .⺁貵她pGD岆慦i紎uc.︻骰毦v投♀9u烯faI3Rx替聾&蔜蝖! [y T鷮J/蜋\A2Z.n4 榞E沥1欚攝訛伌H栒忽R艧築rO 奬 :扶繒y蒏籭侄IA充3麪i呁Q峺(dn坊=9p筗|嗁聶&厍捖馗椙t褫gC]#'豘x06樔褋d骐鰝3圜l欬T糨b彗%3f獴虨k澽 焥J阷z劁L贕&/7仫e,蕬&盂O⑿\yK\d嗔舍隊櫷咣鎘f苮哊(鳁痕虷Jf邀*Τl i匹鎦,蹁j常砽6r珯硒p蒮=撛y镹GDW  &榠 |p{圇L梛9鹤|Pw6;^蜃3筨Poz*込z雱&I1佽熏U㊣鐠&4"滙楧 M"郊櫨M P骝4-0Rk<щ塞}8E鏛䙡lr魃G`6fW昃蒒32横?睸< 秵 慀{驡纝叠PK #癈N. sebastianbergmann-diff-720fcc7/tests/fixtures/UT#誛\PK #癈Ns'D ; sebastianbergmann-diff-720fcc7/tests/fixtures/.editorconfigUT#誛\root = true PK #癈NT sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/UT#誛\PK #癈NC痉[ sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txtUT#誛\aPK #癈N[ sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txtUT#誛\PK #癈N&/E[ sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txtUT#誛\K銳PK #癈N2 #[ sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txtUT#誛\K銳膧I(糳PK #癈N2 sebastianbergmann-diff-720fcc7/tests/fixtures/out/UT#誛\PK #癈Ns'D ? sebastianbergmann-diff-720fcc7/tests/fixtures/out/.editorconfigUT#誛\root = true PK #癈N鞴>D< sebastianbergmann-diff-720fcc7/tests/fixtures/out/.gitignoreUT#誛\罙 0 阑疿裰媜Ju-厭@矀蟱鍬(豘樏#墊 \IQ鎤O$#M3bi巯謣PK #癈N腢$7 sebastianbergmann-diff-720fcc7/tests/fixtures/patch.txtUT#誛\K蒐KS姓M,QH詗讼+(PH偙2驲R+搾SR右豸 C3.]]]..mmm$ 篎:& 贎襎萂蜪,.V蕇)@r~^q墏繜珎瓊5瞂H?P倘欿I#ひEhP心 PK #癈N@k閻8 sebastianbergmann-diff-720fcc7/tests/fixtures/patch2.txtUT#誛\}峕k0嗭+藁ldq囤奕犨飒B撞k岶]"5耟炜7+S;缮擏湩PR傮JYd;c偊n愡;Q~"薊Q*$ 鐀L8缈S16榎,困酳 嫖躍湷秴'%宯-引/$Cv|O& 仉a霌(筀O銊軀Q/岨5.]已灂g+:2=[弒6鬐7o:k狐dUF0o妫吹艺#綡/髐)mw褷覙伙沑PK #癈NZ$>q/A sebastianbergmann-diff-720fcc7/tests/fixtures/serialized_diff.binUT#誛\項MK0嘂[r籀A痎鈔wSi#*K籌鷄]p,匜p 吢L鷇&3o>?z郞瑨9W架鞓7y枡 (q蟛藏〈礪盷_( 揈$鴞瓰吣K匯赸$款鈀{#6,mJ睷Q鋩I郞r縢b胾 M廹獕醔萁&滬鍍戜4踈p摐`B塷32Vb礞上W迌G#潍BH.d[] c屢Z囅ND韷pc唸8GD#和辠 m唥>嫭,彪3( sebastianbergmann-diff-720fcc7/build.xmlUT#誛\PK #癈N缘宒m, >sebastianbergmann-diff-720fcc7/composer.jsonUT#誛\PK #癈N侓姄Z* sebastianbergmann-diff-720fcc7/phpunit.xmlUT#誛\PK #癈N# sebastianbergmann-diff-720fcc7/src/UT#誛\PK #癈N覣)m, sebastianbergmann-diff-720fcc7/src/Chunk.phpUT#誛\PK #癈N3攥罡+ f sebastianbergmann-diff-720fcc7/src/Diff.phpUT#誛\PK #癈N串DN 9%- p"sebastianbergmann-diff-720fcc7/src/Differ.phpUT#誛\PK #癈N- -sebastianbergmann-diff-720fcc7/src/Exception/UT#誛\PK #癈N< 1CG f-sebastianbergmann-diff-720fcc7/src/Exception/ConfigurationException.phpUT#誛\PK #癈Ng这@: /sebastianbergmann-diff-720fcc7/src/Exception/Exception.phpUT#誛\PK #癈NgⅧ擖I 1sebastianbergmann-diff-720fcc7/src/Exception/InvalidArgumentException.phpUT#誛\PK #癈N'晁 O+ {2sebastianbergmann-diff-720fcc7/src/Line.phpUT#誛\PK #癈N鳠<I j4sebastianbergmann-diff-720fcc7/src/LongestCommonSubsequenceCalculator.phpUT#誛\PK #癈NfVX %6sebastianbergmann-diff-720fcc7/src/MemoryEfficientLongestCommonSubsequenceCalculator.phpUT#誛\PK #癈N* 9sebastianbergmann-diff-720fcc7/src/Output/UT#誛\PK #癈NE檒鋏OH 9sebastianbergmann-diff-720fcc7/src/Output/AbstractChunkOutputBuilder.phpUT#誛\PK #癈N28>WC <sebastianbergmann-diff-720fcc7/src/Output/DiffOnlyOutputBuilder.phpUT#誛\PK #癈N搝k霬 H 嶡sebastianbergmann-diff-720fcc7/src/Output/DiffOutputBuilderInterface.phpUT#誛\PK #癈N稔 (L GBsebastianbergmann-diff-720fcc7/src/Output/StrictUnifiedDiffOutputBuilder.phpUT#誛\PK #癈N* F GMsebastianbergmann-diff-720fcc7/src/Output/UnifiedDiffOutputBuilder.phpUT#誛\PK #癈NG2  - 7Vsebastianbergmann-diff-720fcc7/src/Parser.phpUT#誛\PK #癈Nv< V 朲sebastianbergmann-diff-720fcc7/src/TimeEfficientLongestCommonSubsequenceCalculator.phpUT#誛\PK #癈N% sebastianbergmann-diff-720fcc7/tests/UT#誛\PK #癈NY0M<2 韂sebastianbergmann-diff-720fcc7/tests/ChunkTest.phpUT#誛\PK #癈N鷿摑+u1 俙sebastianbergmann-diff-720fcc7/tests/DiffTest.phpUT#誛\PK #癈N夠.3 csebastianbergmann-diff-720fcc7/tests/DifferTest.phpUT#誛\PK #癈N/ ksebastianbergmann-diff-720fcc7/tests/Exception/UT#誛\PK #癈N?婢 ^M rksebastianbergmann-diff-720fcc7/tests/Exception/ConfigurationExceptionTest.phpUT#誛\PK #癈N7,8O 餸sebastianbergmann-diff-720fcc7/tests/Exception/InvalidArgumentExceptionTest.phpUT#誛\PK #癈N狂炱1 +psebastianbergmann-diff-720fcc7/tests/LineTest.phpUT#誛\PK #癈Nx窎E Nrsebastianbergmann-diff-720fcc7/tests/LongestCommonSubsequenceTest.phpUT#誛\PK #癈N %y燫J :wsebastianbergmann-diff-720fcc7/tests/MemoryEfficientImplementationTest.phpUT#誛\PK #癈N, 齲sebastianbergmann-diff-720fcc7/tests/Output/UT#誛\PK #癈N奟~澉)N Pysebastianbergmann-diff-720fcc7/tests/Output/AbstractChunkOutputBuilderTest.phpUT#誛\PK #癈Nz6|dI 紏sebastianbergmann-diff-720fcc7/tests/Output/DiffOnlyOutputBuilderTest.phpUT#誛\PK #癈N8 聙sebastianbergmann-diff-720fcc7/tests/Output/Integration/UT#誛\PK #癈N谲珯<'i !sebastianbergmann-diff-720fcc7/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.phpUT#誛\PK #癈N0瘚c 湂sebastianbergmann-diff-720fcc7/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.phpUT#誛\PK #癈N(A& Z 睈sebastianbergmann-diff-720fcc7/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.phpUT#誛\PK #癈N访+菡 VDR ssebastianbergmann-diff-720fcc7/tests/Output/StrictUnifiedDiffOutputBuilderTest.phpUT#誛\PK #癈N2otAT 翞sebastianbergmann-diff-720fcc7/tests/Output/UnifiedDiffOutputBuilderDataProvider.phpUT#誛\PK #癈Nzl浤V L $sebastianbergmann-diff-720fcc7/tests/Output/UnifiedDiffOutputBuilderTest.phpUT#誛\PK #癈N8 3 fsebastianbergmann-diff-720fcc7/tests/ParserTest.phpUT#誛\PK #癈N陫$轓yH Μsebastianbergmann-diff-720fcc7/tests/TimeEfficientImplementationTest.phpUT#誛\PK #癈N+ csebastianbergmann-diff-720fcc7/tests/Utils/UT#誛\PK #癈N耦k氘8 诞sebastianbergmann-diff-720fcc7/tests/Utils/FileUtils.phpUT#誛\PK #癈N"卺 +E 掳sebastianbergmann-diff-720fcc7/tests/Utils/UnifiedDiffAssertTrait.phpUT#誛\PK #癈N {T sebastianbergmann-diff-720fcc7/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.phpUT#誛\PK #癈N櫠グ;d,I sebastianbergmann-diff-720fcc7/tests/Utils/UnifiedDiffAssertTraitTest.phpUT#誛\PK #癈N. 扒sebastianbergmann-diff-720fcc7/tests/fixtures/UT#誛\PK #癈Ns'D ; sebastianbergmann-diff-720fcc7/tests/fixtures/.editorconfigUT#誛\PK #癈NT ssebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/UT#誛\PK #癈NC痉[ 钊sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txtUT#誛\PK #癈N[ qsebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txtUT#誛\PK #癈N&/E[ 笊sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txtUT#誛\PK #癈N2 #[ |sebastianbergmann-diff-720fcc7/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txtUT#誛\PK #癈N2 sebastianbergmann-diff-720fcc7/tests/fixtures/out/UT#誛\PK #癈Ns'D ? asebastianbergmann-diff-720fcc7/tests/fixtures/out/.editorconfigUT#誛\PK #癈N鞴>D< 铀sebastianbergmann-diff-720fcc7/tests/fixtures/out/.gitignoreUT#誛\PK #癈N腢$7 tsebastianbergmann-diff-720fcc7/tests/fixtures/patch.txtUT#誛\PK #癈N@k閻8 Xsebastianbergmann-diff-720fcc7/tests/fixtures/patch2.txtUT#誛\PK #癈NZ$>q/A 撐sebastianbergmann-diff-720fcc7/tests/fixtures/serialized_diff.binUT#誛\PKGGG l(720fcc7e9b5cf384ea68d9d930d480907a0c1a29PK!&恌f>recursion-context/f8c1c1968fbcf5ae9af5ec6ceb30aab26fa949b2.zipnu誌w洞PK bJ, sebastianbergmann-recursion-context-5b0cd72/UT 筙PK bJI&6 sebastianbergmann-recursion-context-5b0cd72/.gitignoreUT 筙/.idea /composer.lock /vendor PK bJ埏5にg7 sebastianbergmann-recursion-context-5b0cd72/.travis.ymlUT 筙UPAn0见䜣7愆R>"I揪^筈 00 # 疝`9郑喰bL耠駋ec╲嵯+啁'槪哷m9nP CXp'񸕄劤淯 5-岛傘} 偊 穄Wx=]鵆#δ拡 萅拢l4+ dm哐㎞'齚傛R.:7栽/ホ艾T}竫L/銾tZ埀其!8m斸}谵D<伿鯅_PK bJ 鬯>83 sebastianbergmann-recursion-context-5b0cd72/LICENSEUT 筙礣蚽6倔){獩鍾燵%& K.I烹, K4D:i迆gh砼9滐oV;M六r?F鸒d,髑魃=緿萘谬骺䱷伓6D讕0酚笮#>铪:O侈9c黳`擦N1顱溰壉{8 n勦OSg油螎眙{? !7_繭檑"|秭甼 僾瞤从郻='陑<臈6鈬E惷量柜:?鰩&疗儫鄘ICK鐊|w 5`惑疶$`粞u6貌 p@0赂%O遦A祁泻罭j@疀>4牷⻊湖菻T題w蹚 齻醷琇0囱N=刱衖:Xゎ[g_晆⿷p莢挨;44t@( 瑙滹俺.h脙{嫉(f鹧9\U饩k鏒傔7汓e mG泟}庼k羡沦僘J 簙4鄖'Y鎇0Ky睫*筙X謊!^x[%鐛⿻f煾莆O├-埊k%磫Z乗璌塦埉xeば*/汢V 癛羐ξ蹱~剷P蚬,ベ&綠i*鋌廐芶蜁憏Sr隖璳-lR%+Q虗A<壥^虿$BvuYo*E (%煑,!7C_+d-rI馯S嬁|凟(鴬/汹鏺"鞉&#%V$c型\i#`Q譋蔣 $s】安)現  O両/t7ZRf(祽uu囥輅*婂[n]%PJれ3,+3%) 崏4!hn?5 sebastianbergmann-recursion-context-5b0cd72/build.xmlUT 筙u捔N0 嗭}(釮W竡h幻茚寄-ai盼楡;i 第.U阆v腠y扳剳寃峾蟖0遆Bbo=h7}!b嚤ぉ毆q%哉l?PK bJ僒棜hI9 sebastianbergmann-recursion-context-5b0cd72/composer.jsonUT 筙昍眓0荠 +3I悙Z墘C噴J/#v遑╉$ 痬BhZ血^饧{w鱸鰅B軍$-Hd0c9萒#酛芓IM檄9獃e頹d_K陭 =獺8扟+娖愅zC2佹⑷Tafm礖佣m搨[Vg Ue:寱.J惪'8Ei傊j香G蝶颽-S󶘻: 籕蹕)Y醍饺袎%p1妋Y豹栜&9FCo7鱷騻偛-k净蝒釈>x<銹57M軣"慼咳囕Q鉍偷W絲E庛%揞撡欁嵒 烾;踋 1 0jt1殾坠w#-鱈4寘2 挷=Z0#$爊涓t7嬟7Of!鉡.荬泑PK bJ:麱7 sebastianbergmann-recursion-context-5b0cd72/phpunit.xmlUT 筙晵薾0E鼯 >8iオ妧(j昒.挭輦=K郃瀜_U獺e区cC竚事粈%&蜃潦骼HT跍#_>xVy鍖f m覒3W!旰犒鞾墉Vk聩r8蔰 qb$ oz趰儻I T%饊2峋緥6擔y0 腃觡Cj"2盡縺QhE LTfh%Q{耶1q岉Q擀囿擰j媎源鸸佋23S葤L阳3瓣辒p财6o"o杼\Z|i梫f.W鍵&Rf夏SぺZ|脚#o5 qE韢w苰T栓8=-烩NB;秒+kH,*イ:捼內憒p陘觘8揪}駓試#柢x=j'荣汴47kc睮T鳭%璇`|N棎 浶-*秝,#e櫧r%瞾#E鞉1%痉q帔fo鷘;[5G.WX袷mn荥I眜E}g綍-恐餁鏪7氕l/拗畍xP蔷峈媻 f 嬘嶘>飖瀰.9︶以/任;WCRo'R 驯禵&8蕠乬 i=荐%瀉8l2搦蚠F饹颶呱 7&鯮釭>;妊蛵3畷=-ù冃䙡H般雭>(鯙m/謊n8膑/覕彼'?楖v螯犎:?u/PK bJ若绸J= sebastianbergmann-recursion-context-5b0cd72/src/Exception.phpUT 筙E惲N0 嗭y l腡$闳臟芷Z汥塊飵mp婔[燒>$熖1欣荤&od8嘏 t澸龃Rl!o-鑸ENBf鞸鈹-!W﹉鶺繗5珹=[J嫓6?PK bJmHL sebastianbergmann-recursion-context-5b0cd72/src/InvalidArgumentException.phpUT 筙u惤n0 剋=6(h锌殠Y壎壢!袸姠颺贖药搥#忳潠弣刍盘 >[.Ps$胺乾恓袞鄡鼝 '乁谠锉」貴鐛繀 戆(@ 濡CX枊鰀)儼==)O请!F皓受 ("{抌Rк魬写觪蚪璚整OM腾⒙ .歽7(8捕6>% 贀厜z釡`G艎鷧|{m|.|镬廸摨fA嶺 懨sn啂D珦硱7赋B*簅縻~PK bJ2 sebastianbergmann-recursion-context-5b0cd72/tests/UT 筙PK bJ鸟A sebastianbergmann-recursion-context-5b0cd72/tests/ContextTest.phpUT 筙誛韓6 %Z靧溨k8X 骣焵痚-2⿸c杌黩C婂蕢邾@G馈C揎sxI?絓斀GN然ErX #C矰&(9z瞑>7帒 k9誼劑d:鉈+u耸樨繿l狒竵 g;3!p_ C噵Y榿缁跮`濉.妁賎W辣蝺]KyR 櫍恜蟆 怯縴浏,濰c鏷赘6n往> mⅶ;" /茙a牠b1t旇跺蚇"r羽 5劈緓fm沢J 塛K偷iY嫉蒒輟嬰^#褮 雦)辔/粤%J鈨+鴩U蜬刭|赸 凖胣嶀 烻噿哔锷C憻 342{z埚-/D7凯F#蔢c痏談r慿庬4g痙V-侂蒥 ラ矋AF5瓄m鸉j_;MZc泑咆昋蹡界f劵鳑o届穣讴2掾b闶亷%U暐>聜V穘]螆cu癘擇倣H龕X]5齸╩甐}巯怌-lRO>V岳r袰$.M'0Y葽鄯柯7A募N珯倧騿鯚pВ1(韽;< Ogs^Dv忶:vmHiQ| :w"<Lo勣F炅脀e~吸S3PK bJ, sebastianbergmann-recursion-context-5b0cd72/UT 筙PK bJI&6 Ssebastianbergmann-recursion-context-5b0cd72/.gitignoreUT 筙PK bJ埏5にg7 sebastianbergmann-recursion-context-5b0cd72/.travis.ymlUT 筙PK bJ 鬯>83 sebastianbergmann-recursion-context-5b0cd72/LICENSEUT 筙PK bJ痓樤5 sebastianbergmann-recursion-context-5b0cd72/README.mdUT 筙PK bJ.>?5 sebastianbergmann-recursion-context-5b0cd72/build.xmlUT 筙PK bJ僒棜hI9 isebastianbergmann-recursion-context-5b0cd72/composer.jsonUT 筙PK bJ:麱7 1 sebastianbergmann-recursion-context-5b0cd72/phpunit.xmlUT 筙PK bJ0  sebastianbergmann-recursion-context-5b0cd72/src/UT 筙PK bJ<{; , sebastianbergmann-recursion-context-5b0cd72/src/Context.phpUT 筙PK bJ若绸J= sebastianbergmann-recursion-context-5b0cd72/src/Exception.phpUT 筙PK bJmHL sebastianbergmann-recursion-context-5b0cd72/src/InvalidArgumentException.phpUT 筙PK bJ2 sebastianbergmann-recursion-context-5b0cd72/tests/UT 筙PK bJ鸟A sebastianbergmann-recursion-context-5b0cd72/tests/ContextTest.phpUT 筙PKV(5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8PK!送生嗒嗒7comparator/6f6a5004ba92a72cc62a4983fe102df11076b827.zipnu誌w洞PK 桝霯% sebastianbergmann-comparator-5de4fc1/UT頾G[PK 桝霯- sebastianbergmann-comparator-5de4fc1/.github/UT頾G[PK 桝霯9d6 sebastianbergmann-comparator-5de4fc1/.github/stale.ymlUT頾G[昑Mo覢禁W屧 HT〩>p)桱Um9 剶=帡畐脋翠唧f譱JDK鼓尢虥yo啉埼:y党48O颶OBT嗛勂7,:帺;7-J"gT}NS藶蹳节yju躌eR.BHL鑠晫䴔8D蓙 |盦96t秥u儌餖3.p_顔#EG2佸プA祮kv稞1J$si郮鎊R[瀜hR6)c肚驭H掍yR"怙悹fN鯙怨6鬪8]鴥A愨Hqd宖T&l索P@;t 鼛侮埙6鈏/3FS畳悫l踃韊>e糈妿3m餚b蹺z芋爳羣;俎勿W%#4屣琢N趢皈]蜸鐻FR詙筯鶴*婕 z&!-7t/d铟嚃;4b迬pT鍰#Z燡袽兀Nlq窆挶u稚駶嶅蕖n鲙蠔凫0屐踉釁鱡,扜ミ霉甂辗蛤;诤攚O/奮玫伉P?莒頔 ﹑葐 J鯜#"鶽 嗎绫匟筑ゥ眺?u5鷹躧咤:.鮿zQ>~q卩8㈧&zwr含閏1粅孨棔戲+鲎6r#:rLVegV⑺ja陋扏3/SUPK 桝霯<--/ sebastianbergmann-comparator-5de4fc1/.gitignoreUT頾G[/.idea /.php_cs.cache /composer.lock /vendor PK 桝霯札瞒 1 sebastianbergmann-comparator-5de4fc1/.php_cs.distUT頾G[漎Ks6倦W鹦:3畗)q蹽蟙τv捾 W"j`P产牖xd鈰)鈁`必齰见筼-t醵夯猾鮌>奋T.犅=斩R浭罋拴糴椩*}砕]盬乍鉖鑝Gガ\d愜4p縕=(] D臫衸圳娛渷4甫(軶藭籍z唔8旖藿笥麜孜对V{j獑z靶T{n[A蛵4\n焱jチZV俘;罄烝驨 呔~4P W疺xo纞滏轲j蜁屒媸v忛升誘瓠$ ,\A僽 m]浇Dp乸 苚 4={蘡=鶴沄i[ZsI鮼鼞覵&垷!=<鑝X蟧尘蝋钏 5_h-▅"込tcAI;皙鐚3扻z冎刣鴫&@q穔魧к6檼査r 0Au~X錐p!牞 驧vD214Ye0Q抏1<繜8<3厠淋锿禯沓凓诜沽褆噵H钊慅票6Bm.C x^=2纁 b鞛钨尛郦=踮E=訽.誄襓駻Re冨; w艴檺鋵钚塴N=粜<蔗詫F 煿禤^X !偖E.7X<<譺R歬!K骦0Q晿AN尰T骅U"哫Z繧嫖杽 >滗衬_1iD)檂擸迤dn豐+葤)wNm鵌-gT愺359&b峚姳O}羷Op+,@簲寻 2煃:娀J*8 f 酟ㄞ罡下K澾9籴TR.a保%唶?i鉓UZFI幪*獪慫m忍)顱菣各湸\抷杠)V (慴╨蠯魝鵤O\錒F∪ 8E恾↖s琪钀X笵]F0 >/&(狥|皮毻鍝R#孃Ns夝"邽@货b犃竝m朏鏘.F霫l袠5藚苛^Y怷]楌oxJ;*啋1|E R "憧壧S軄罺颶-X2椞蛊熑8/"銀s翊,$9n厂椺誤x-V僗51燋a&鶻榞叙> l!擝=26g0,n 諯$吖 僈<䌷bx /誜簙K餎FH)/镾魍AV鉷]篐9袦un憁鹛跏1g/4XB_澓喐#TJU綨=婜L,qH2+ 吘{溱嗛in儵.s 嶌鯠穀倠s1aE膄抉2:7衽}W+損够a恍&5Wb仛w gck媾垧-挞cq8:c﹉碚迿瀧%棘i r/d把/0Ab曁乶k/.库 ^,3 稾摭Bㄤ[峊髑獮G.熵Uc^3.呣$4&怜薂d,7m玶繤锢鯣e;剤復(娑x=,eN_?|W\4T7Cn 烦=>8{0E-虐给莲x>d?oMw莛5"濭奬{[ofNo躵;浌2鶍}J|piB熅%幘M啞媜揂衹4go讣"澉 ﹏謍V哘k<x鮢?PK 桝霯rf0 sebastianbergmann-comparator-5de4fc1/.travis.ymlUT頾G[MO0 界WX$鄲VpA谪a B鈉bpB2穽&U湈耧IW&!.渓莮~z1h+C[稡p穛c(0 _@聐z霄盇鋮 豁 ^嵇琽.騟~啡镦座j氃邯揰;平鰨矢5歰疱扉姹樳.颳鵆qy3粖肦Z'祶倂hYY隴鍓yǜ*鈵宝襶*村 j攌Z卿伾敳k7璋  U]8狸灍!龜捓巣滸痱2丳搮鄎鬓 F揩淍&墫龘#z*伤+Z寸n脿0投d7蝕km厨:獵D)穽轜$曢抽g濐#栺2wJ {秩5\ u-彸L El猐諳a]啸V責u彞爹鷦颬K 桝霯I舀.a1 sebastianbergmann-comparator-5de4fc1/ChangeLog.mdUT頾G[MS0禁W霯z 濟3·笰()_右斜b[騂2叩-莂JgZrq淙z镯顊羈臘庣2w溍! [IR櫾% )pf5d溇59#軂E瑎菱祓螋簌臻蕵j铥戳:癇鎊"K 曗"酻佢s溠n'^郋鬣B378p猫Yu┿紘H1cua>@|!搰/L藼S蘃  屸$u墮$駥姃翞=>哾sF  _w祉nG麚4M靛墁阤[撈%訂3盌晽L囵(蓌耨张駞鑌怤 窕n礰ch禟4ǘ筭o鍨5苓V0礛滼l:f簻褸qm朮澁诈&1`)$滍,1砶壞1悔o3-T黼絸駒~fD铥c阼c?黥徙铒>=鵚趎1簐 O}; 饀|葵v|>'濤g馒 c刞G^l7aL傥1疙):?@;tp-F ;沶秐h靰枨 ^]|曳?E蛀雾莓% 赻醜C颾q鈙衩"柔郷蒺;?t帤FFM綅3老扚瘥w-;哚挥袮lQ#禰BB 菸fXv#0畉捎蟌恞wh]o娩愲&剋 璁;‘A2;;鮲堩麆>c+6卩诿x :M嬙}脶飓.5钚鰱齠}艧}扅 稏mx癈嚪6鹏>Z8鐑 住J7傌c頊辱黢&Y$弙G泟}庼+ 鏼浅硱t=3k鄖リGY0 y节(9_X詄!^x[%⿻f钙├ 堬+%磫Z乗甁塦埉xeば*/汢V 癛.チgξ榀mP蟕)T纠焲*Ki6塷&M匼l哾V\7%W癹元萔!u^r賾模 /K"dW楑姢遉劑R騣) ∩B*rs91魠痢GV"梩z醞揮0跌妨GX剛/瓆&.壚m"8捈QbI1軱祽1鎢]礟2 +k澛j慈惲餌様﨎鏸%e喴峆猋YWw85ΒX伪礖嶂U矈誮C爺A>凊B嘟w漵耶-遾鱹熛/nO.R"I钿D鼷滗B鸇氩厩{镮Ks.+1}e薐:I鳨vr铯Q鵔蒠韬b?吀蔚嚫o 偸賲N骮ikd d×A<縿,缤陻邍 鉏厡旴茇J恑蕵塬鞋-Az怭X%T铧A崻;.mp稗 ^ n#}胙m鬵Hj醭v;鳼5磃!.姹XS, 﨔4 .禡q亝璊v¦Qi篳vǘ貮>h耝4侈熪纁托訶皡洂.q藔鏣$ =啵 1浲oN<抡亨t5w汚笡J暖邃餀Mń5S⿱鄍"D+晞噋啮=;幆YI=帓(締了襻h-G搚0^緧苾琵虻?{猬閨曃馶*斤>ty A爐 ●损漗d齟 Z{e臙群,CK' 肆57厙[鞐 PK 桝霯薂阛2 sebastianbergmann-comparator-5de4fc1/composer.jsonUT頾G[昑Mo0 界W>做t= ;唍爀谝"[%%閵q5貾_,嫃=R擾偀搟憍, m.m銆 XJnL塣抳A鄱儺萵5飰燩T睍]"X1ぃX}Z-樔甘捓_眹97砊z&鼥淜全)鏸LR禔uoX呧鼄炞:╔d湑O5Hu恁Z寲佞炨a龢蕙 D儾曰7虹eZ:>獕嘠n$檺貈6虫.漴闭!+1櫚嚊I}篇_袶uUb 饄黡洳6粠糆銒5$?T唂/w` Wま峧P)諶E飍sU#b@ =2僷&庄帲+ぴ(L("#M萱蒝验|愝灆8ギq椊粚澜怓皂`0WMK芫R頕 邠媃洞mルy㈠罔邩驉Zc§鲐R闌n鴼1&瞎p沉I妲?]鋤]鋟線>G!^c苶 楽璗)老"} 蘰|f涧繂灏8,PK 桝霯侓姄Z0 sebastianbergmann-comparator-5de4fc1/phpunit.xmlUT頾G[晵OO0 棚U頺8Χ砟熋65K\⿱°蹞v(Lㄎ巷=[蓶荂晐'.W長$4朕s陛穊YL瞶_g9壌E憀.鎏魾师i益:E.绯贂|{z\=栽:b4圛2|眖狃Yjメ>苜窉5┇Ыij@蓼s9蓪$w圠霼潒p絋伇Be邺X⒆p忢瑆!鳛烀8朱|茌堥2続兘4樳綜偩^t穐榜(武w1qq构0P狿兵F:蘕氀&室sw*:塋瀾懞<索8末T趭翉殮}籍,qR{訞磵*Nfe+爼敲雬鼧養赟R蝥彍g!鐞*^O1PK 桝霯) sebastianbergmann-comparator-5de4fc1/src/UT頾G[PK 桝霯菆:Q\< sebastianbergmann-comparator-5de4fc1/src/ArrayComparator.phpUT頾G[軼Ks8 钧W73幱螃N浲83;淤忙泛摗%8娆D$芹_运苍$=u[>忳騇>:?)|轍 k".+a< 呌fF趌腑驷w4鳈P 拮6蓎·%xY谲hn儼.b濓尲8*乀屁,}]蓜揨M!OQ愳A庵踼z耒韨]鵓軫8 壌稳U0伃t殹4.L岕9牦赲惉幖 |y]gx1"L|糀1bG鳳﹖秽1N叺p庞繥*毙團逩@名錻 +尣拜 piP啒@ 瘮鎂脙H 闯液r驊3蠕#%>魄c嗋3c,島 湲|娯QR4羻cM X審VZД燔缗姼$奤$倛c虧嶊瑕征&^?茫舾旜毋輼L帏-//奸莹 頃礹 逖尌э0蚋y荥剖r漥妐渀闐吤U氷-鵖E咶其懰[(*-'錧++揚CY劝f `LE{`(娬嗴]!xU呉yT湂 埋W)貉梟褰"籯nUG勆s.<0螎帒h鬆y〢戩牂3TDmT+固 >悇 I R艆盩y.蒼c舳jJN颋却)(__K 拼瘑wsx7{7鞞<5欋tR?n>/_籡!韞澊&y,櫧V痋敉顄L玨x f偫S鲿d^プ钘+{K 溍/!垨戗R*~k亥,菶棧7衐G|励o芰凭簆磱P聈N_Xゅ礏跬3pG體鳫5G觭>u]鳔79=簎t犖銏轟%Zc薏.=7)瀨H氊 ?(L@枥笅FH逃QVg2N*妲-}赪tfZkc沇a emvg楓铓崚e55?p{v惯▆猑韙閊wN[KQ?JW;+УW}俚_熻(鍃 9X鲏蘝久逊洽Q4; H鳝申縑4!伀絰哸觋鸼:薺{瞟o7n黾f[~v觷蠐餔~j!陚5T麪易'摀酳J5縲歾>张A裊骮8陌9 5E螪7麬踑卲t<焢狛t臎 g^遾Dsw煋. 裔7渻峷崮U叓J;ty8砲I否;儁JW龛圞 钘砧┐痮oOPK 桝霯89\7 sebastianbergmann-comparator-5de4fc1/src/Comparator.phpUT頾G[漈羘0 禁+x! 菠鞯]" ;,=(d櫘葤'製场>什6K禷喝惾乔莋]}h&[/2X纝<擩#疝G`K饦 OJ樀5 瞡叛!a&绨O黟輈-寔1鐤羀U嗤惓˙([瑼阪嘣cE LZI4灚浺篫惒f 岶羐O >矬Щ項6@鮐濔P(ON-a潰妎 o[' X3#j魨喑憏"n祓}柕⺄撒贡幮筤魸mr& $AK-<軳簓*%剾号勥["I憼"誓+麢bX 竲vk輆8[鱷, j\旕毄濲N潨似┯蛓P鰍κp薊_x睁Wぶ0 dKE?NS蒮N#⑽cZ 伲v!紗Z="E诡兎曮觻l:澣Ly騶=矕殴栗!稸趆沜1厰貝煃4棭瘘wSl糋G>S滂m鷱J劦%纶Q墧Yj/ $6Z蹘馤[盟 9R噃^7誄瘖h:vxT&6c_X剭sE窳s彍尋<宋r虀U弳箢拢衞黱琶膱D暢]z!B褲P咜/鶴oC帅瘫L襘缅阹yだ5敎喫7 噇珬PK 桝霯岻] > sebastianbergmann-comparator-5de4fc1/src/ComparisonFailure.phpUT頾G[璙mO0䴙_q D[h2^V$鸙 股サ斱欗孝境'm^(c%矽罟绻圾釱篖凂I'鸶b 衞蕯兤9訂31鍔6檻陮亊8nP-VL(蟎戵Lps醗q鍺*0K8Ke鴅i⑿]腞瓨酭 !M愌3堑;黜aj]9╢ 瑱唸kx<3翚%健4刺T(B媧禕2+憑喑2皿 萾浬W穷捦&?2揻f鯧饦cd夫潧'=K+癪 i嵤f貙饂n^ f攔'&d 9d福w橞缻Ai橗虅+渘BL郞碶\籒`篒1磡=$CeX!EE"P<\B$Q儛Hz蚕疉+ 4钭壣呥叴蠒韖禟靕s鎚c 縢鎉y煲5=邫偘讚F`C牻◣忈衊嗣黕+兰嫂]矧kU唼踰o文h4*o.3qzzZf鈖08体1F楒愤{禺襦>go*霙鹛o敽x _PK 桝霯8 > sebastianbergmann-comparator-5de4fc1/src/DOMNodeComparator.phpUT頾G[漋Ko跢倦WL咋 ='+掜:6P辣佖u+rdm@聿籏裫灆]-I节 紣殱跬>^嫝3:肜<-固鑍鉆狭釲X'IB岽6$i9鼛鎒)攤彽%仐J篴営嵧62!张谌梾2萫娛抴5譮)溤E巶d+墪坊啞|╪!T翨&3rV:虪抧A'攩榨Ie萉:J,俤u1痃:胵捵O?榇\('(:濝t 趚B羀'TJJ馃R湟瓋4吨l:T檯囐WL]s轩z+~梧 阂( M_ 6劅T楯肑%卺:俓产栻旿张讉溡wE雮8娫Qrt绬SM-0鰯 g*詄l捩⊿8摀粘B窺婍|P碩诌R揢 5 鯀燴4V婹E? 挍>4<1砎@?W挌\麪?惢v.睺!媤衆b JmX乜+4NS﹢i*鶤7蒮V抿鲑6qtof点w導E潿Wz蔝侪嶖逼VY澙| 冕^餵蔍+*蟦玆琶鯁#*庖/ 斉踒锍會P喊み╨;荙醉=譨Rq咾+.L,緥缌癆對 4*G挨迱*ld.{-訙党T 0r?鯢ZuFS*>腚'b k+-鍂K >.f羆紛怠j罻鬿R袝)VM<U腆M5嬨#獃R廵肢n 毠s辞u暙媰 /B5<*牮庐\杭恠贜腟訉 S治锷r`]〓騝 氱嗓[@O皣雨倵W薏jC鋨?;f沎;鉯嫜4軧鏔'X3BUX两牼漶=薣*; (8(け,旙tW佦樗輕嬊鹲S 4凅 銮芉e3ル搯旻 L6蔉駌裼啃汊1h讁灌T蝻/",闸褚PK 桝霯僞k瑹t= sebastianbergmann-comparator-5de4fc1/src/DoubleComparator.phpUT頾G[漈逴0 ~颻勵虚幗傲亍!!唙<"Mi暌Hi%6隹螴躋`B驥U;撱OUQ%媰喽Pr鳾 G`s饦 OJ槄%;Y7缬!a"О钽輢)寔!鐢羕炨.缏:!i獹ь a2蠮Ⅰ\蒌謺倲534 鰉61镪騶u絕℉ A欜銽Zf(*8耺x[;塡(美zQ=窕蟆茫5墊[2经S蚠Z裞 )叼灸饋衐潚跦;禭 琄沗#t 6Bi憜A根z3镂跚O7翧犖硤_i C琻謼W弋鐕絵鄦F5#瘴xh d]邸lG '邺财峬欩L埋J趵酑2膈D!錊H羧峝oe.驀訸齃厞菭$飾慳傽H纍肿浧箜0倁垞;Du9Sxz0咠6韺w茟.(桘骲g蓿#哳骎pu{.礼鷃J遟F `/CM⒆頛k0^.#嘂( 叱〢4籑Eh鉛诸]賤8*& 扒媓M@T螠彮(藓衞妡!U mx(T!W徺w瓣辮辻x[鈬_嬛櫧1 Q醠慊!洁 [B奖坬芦虚k8w6jrN觅3鉂s记*嘔徟`訚P啊孏/椵{q4滈v3独BZ.逫}D賏$PK 桝霯褧紬@ sebastianbergmann-comparator-5de4fc1/src/ExceptionComparator.phpUT頾G[uS踤0 }鱓!h"H逈nd纮a志@藢<壩C}攟雮/瞲9<<?訣潿n竻{亻扏冚仹=k4+e+1"[窋钀0W7鹭辜Bc鄜葃鹌h^f艟所lpA発敪ON Jx﹏v諹融%∝鰵1镫椡鲔6@E猏 =d诔觟脭罙s!i蜜)払肢腵E綟 蘽庀洝胾"欴经叼狣&vD:2櫶明7)蛇鋴迓w ?g< 拵[笷馎壷鞺?X豤賽_v=菴癄褿裞F荶娛逽恀;蟤绊.'iO!褤2繣Z[v禪<&虽崐: *纍炎粔癍0犭6}su5皫灌k鲣厮+簱 :'i0j(廣 的諲飸I^ǔY鮬-w綂d=9煯墁='攲4䲢帛9鯿泈P乌^迏&脀w珩雂坢d y>\囚熥a绠_}6>v瞨S伟&燆3J淈棳\0啝窋s9&PK 桝霯o 4 sebastianbergmann-comparator-5de4fc1/src/Factory.phpUT頾G[蚖KS0剧W!噭醧Bi漚πЮ0娂嶶l蓵dBγ颙~腎l&闗lY机v鼷v濗/i攙N:pE孈)T'蘕龄 W -21韛=迖囼=|C=M様p^賊掦L {郋a骫iB樑1p曃禈F ァ觘╰卢P 測7秒粐k缡C0ca撎b3a#zCa昳巘P鮅GM蔴瑽^V瀠('9^崎y 00強偳 嵾効3 ;蠌13淫杭gw厘诱踻砟1媊,鍋CWH簱 X搵蝰s.蠈U砂葡; 0dYl7皈裦Z6橫ㄦe宎&公9L艳狯鷡c7wz沭舸J 怐m熁嘱$拐砵逩Ш-甔錥?肘*跔3n 071彴粐頠E4捭,A-邃,fzw<]嚳丹6l}璤B鉭粢囀柍妫PK 桝霯楶N6PA sebastianbergmann-comparator-5de4fc1/src/MockObjectComparator.phpUT頾G[漈踤1}忒槆∕*yo  q﹉y"(歺'Y覿{眊硥邺;憬唸/就9s鎎_臼<殞"羮=瑃J s帋廉烙=k4e39D秐,0Tgp邹r 崄s%鋮<庨e児8!Xi 舒;ё Rx駈V謊融歴萐B9踙*+茺w畴弚讈獟 2旇!譃漗L1敋箲0-"qSP= f鋝敵Ny+|>"淔挀Jo}Fn咿~慞7NJ瑉麼婘枹3%鐶仼鎉韁ヨ=羝紺-搲=^D权詣1傁膮3蕜$!u6扲訹INia僫A~軤[挮`濧Ψ挳msq*P<0`踨垔%>@O蔎 ;W閲サis6╂糥JHcJ屐嚌后诌Ye_'&寙狈鞀 <茁== 良G-相浃撛宎洝t⺈9覬蘳t?3k6湄藳[{抌澝漈0jMP灗x詁;紸&y徫r暍.架r >趎嵒A=i孞漂澭泝黼`6l;bP球"|cd庑~u秴9<_O嬫蟌h潮匓R蓾~跥5bkX涥玷'PK 桝霯=4> sebastianbergmann-comparator-5de4fc1/src/NumericComparator.phpUT頾G[漊蒼0诫+;p燹4⿷ 4HR懹:掎"蓶"-/N唡臣7湖R錟4粓^r!齎Lh寵6湁Y"K22#諗^[(芒絿V%;97o鍽*09BV$瞶S|`"厒'(4E橳%3\ T2步rl钲狱醳馺]筎M 4LC实Q< πp撚 暋e)诂g慲%陫懎思M|9*紛棷贰Q棬x xeEMJ餲 n藜铯`Z贸;\﹩/⑦衠戩箑飄j%449R睘wH坒/奕惿4燵'w鰕 %_'府0堡糥止移美戎譨 K G1懺#任乺鵆,el3鱗1u棜.踁`I倳眩.籌o燹{b93`4)C'@! ;狣ViG桝*)n 騜IC> 趛+= /哈迈鶏犰l&鑫A8烣鯽VHfl6癳疸x熭 趮置暶縂肶鹤曆^!敢蒈~pn靬鼰贡g褡筰憥8I0琫峋(dC蝃3A蕧4坆(鏩h瀦褦韭A;'")珿 醊)鲦I裄賨c$e凡銡(H艶1f茯 苘n+鰿宠嶉1'+勹癿l蠫茓#陥奬l4i絹嫌蠐A7 ';鉖劋17摯9璼転~亟杵u紖镎ue舩g遵\劲b+|r鸦庅℅庐I螱鉵6;仢 罝Jt躲%媢媮K鈓 vX"鶵眭q4y飋wq~1涳鞛y+Z&跲9博舀7签'9壃[ z 狵輣u/o楗搄旮GT蛆l枲=颽綠PK 桝霯󑥚= sebastianbergmann-comparator-5de4fc1/src/ObjectComparator.phpUT頾G[漌Ko7倦WL菕 E圣;v 6 M=賳A韼$讳栦JV魑慃扸;T眳1bW秣-癁鼔.7事v嶄aOl(夺O騰玜#恧.晐嚯)を欬?羚寣wji b鄑╇笭笷,h1覕蒍侎雒B毪貨鷒/(iq.ADf+肫鍆#?哤●A讧鯶fЁ{厗 /; 钐Z46彄:|姥鬷@蚝鶛@蚝}5惀2裠鉏寜e$fI⒎)慒乒P勥-:錟++銆4xx 鄤`kb纇娬嘄] 侥〈>偋"H8~艡鶥璡)挍sUa貙骏Bp!ネ顾<$"轆} Θ(得$暀 0丠b$E贡劷補捿阼-獩莼2色攖豤闅cz 陪2w楌n騨|釱X庽BTm譕綺慢鉧]% V铻<錞貒_./」_栓!趟 姼村鵳"闽Q醧麁Y黜I2孡a畹%B衂63R筫^7柋4え!VU醽汽ol2h膻9C経雍箍S瘋襵Mk5p峷@-搼/&|k妚c6茖狧⑤噺TOl名顶Y忋F鯈}墡嚯=託 Z%pL!u皷8b崤+([4鵌旆髏F\譧S虖kL2O檅旎.C!歆釿Z綛 鈼銅S銃鲎萸/熛僯f{蓲淖旟< #蠎&岟2R .釬;(\;蒯臹+w~綠L疉譱萧瘱惚氙<癪荵;|豵E籮.龆^hXr-vH啍瘛伐齫/"=>0赝=彸埻4>(僶瘓X sf鰱幤 &0(f粤;EW歽呛)痒>褹嗉€ijt+牖炤逥DoW{@渒雕"嵸 猦蒚蔔4Av蓃脨t楘蘁8贳M\d姽佄2vX/; 邘壁洷?枖oUjP1O氟住X9D眶PK 桝霯癒o.? sebastianbergmann-comparator-5de4fc1/src/ResourceComparator.phpUT頾G[漈]O0|席豃恨裎GU 廐如l%荖 乂:qrP礭閿苴3迿]瑛S[放隊俯M勈X~* "甎$\J麊搳|X騨扉}肝腽脈冦 s其3,駎腬T#T澋爙蘿M燶 謍t慜w"爿Z媻s麆邂蜊酯P¬綂P欻连;zC5岃粻*Q猑N5[殴\扭皎`OR紺#/q盓,tzH礥1瞒q荓鳫枋sUGb8`u罞鑛d亙;匙犢卺/嬳=<(踑\庤Lr&h#诉燎q#Ni6Pib] 缊趕[轆N!k镯榌郗梗躧Д暊雌栤轙"煼燊艸寣&辝譯>祛n-,G夃关6Q]J疇J)﹃tjUEvb跁)lj磜蜣\!gg鈧 I屾L*韅爡5 $懫h8悥?凚d#8Jbb"r",#!栂?QW暹6縪甹讨~e坢佪#@Z-浤譃晔辸殮&砛>2蹁娮pFA归笼~讔圍9╟ 嗟u5刵稝睱T礰La!L夫2/孪粔$峟xz意`o,G^縹9贵y0蝅K謽s=銟(磫Eh1骘#y圐H梞EzN=)现k党羄傖\+E%ja籱s0]o';(a栆d梁y3`*g瓣钺篗!寔sN+B"懦sm!i6yaR蠮Ⅰ斴d"(k鍼jd籗X7窸/>8TSj菶ZxHN)*鋞Cmx[9墧(E畓Q/羸驶耾/猡7谛庙_诌P9 组0掝╚里曅*<4R 颽 4﹪翑麹N摋|臥9恪螒Z徏 *$毅_ⅰ秔't厏癣 珈^@☆墭 迼T捷戍alk7P菮=JK偨甫~X[玔鄄y栒毚0扙!%柫O鎉綴夅覨阼4營ho5裤&點2聓t燎婊Q7╂s7T骙絁u囂触') :.炊53U丯I娙+$C峢6談6^螉蒯( + 0×硢#螇嘓姺廂]#鞢7┦摾4绬&p栢猶鮩X1劵鋟h蠢褬rg雗8榈P宏墇a叝赣]7=叄叛|曾)d鸣陈[鉿n!s榲庖kb!=q悖2樉雓9<#U偁駶v㧟煢{0魨"`哄蘥hv鱱K李K濹舟uo伋?牡痪I辻迪-襩D曎 箊韩鸞!f窍L徤鸲C竳澾.v骭"\鼄L~PK 桝霯S烍冶; sebastianbergmann-comparator-5de4fc1/src/TypeComparator.phpUT頾G[漈Mo0 禁WpE&E汈迯+R`腊脷c/奓l蓳韬傩>R﨟0]淧z弢彅>Wy,8僓nd鄌<佀 郱2.+9ㄈ9繢O岜邍/7ゲ-撟中<艣筻椮幞(=43侈裬笜_迢刜C0溄+ 頞浬`虼A;終4匫装 w:}儞晛鍡i$n蝾牞潏馰'j幢X@儛:{J渾絍<)Y6:wz:姷秾翺◎芌6.:濔汴x#鄃Y0\狓潉y乴Q毤络7 翮7!觘 杼柢魊诮PK 桝霯+ sebastianbergmann-comparator-5de4fc1/tests/UT頾G[PK 桝霯窋hvB sebastianbergmann-comparator-5de4fc1/tests/ArrayComparatorTest.phpUT頾G[臰Ko0 钧W餚 N&}瑮局甴[Q )葾暀F+{挏4蜻G晌[I悻纜盋扅>R⑷\|N鹖胸`鸅CO鬘2愻@3覨0汆+ 橧T澊瑼全袣T/疞J笜赲擉L S忦i& L1$)褚7纃编(5∷^壃A##貮嘈賫v{w吆钞U觛哃C$碤93罰>璓:G娦瞡捊搔';酚蟽 #試OD坑Td5L韵#jsK凥”烘晢&ヘh鳆 Z =诚m-殞觡T@鐳6檲3.c=!mU檀啣0l6 E$5翢鑡楸a榋6-顫*1`a徬顯緬鋠O{欎鯤袎4OiX=傾""趃蟦仗 \偆摮~巨噜婞y 璱馷蚼橬雽S隰僇"BV椚)4檼袨 煊nwk 旱E箷諣蒗藵舤』櫆吱梯瘜藕S屖抃$V佀+8狝遒}/偷5*艋 J肆瓃8蚝=獢鮯R,嫁H~鈅:\昦I桡鷫秪陜瑹杢稂聡@:hQ滠V鮼-鶷6纍~w┌U簿w:瀰暻逳<令唯6徶V鎮艻YT陀耾摋c\衦誛gM閨b冶v俨r 典浖5M.3/礕恒9@O,^h籛籟*/渡 b哅 综/'傰8逺7訿:4 [证d廴<ィ苄x邚謈!E茊褷sX?溕D 蝏I爻!疘 举P-啷粂姍>F嶆4抓j庘jKお抽k 迖pe驕#W#2{O烀 :OrV淲v乜扜u衮僿.=wy7墇5媑gnl熕高j蚟0琗;蔢笎/+3L Z mX6嚊﹁:鉦PK 桝霯!'D sebastianbergmann-comparator-5de4fc1/tests/ComparisonFailureTest.phpUT頾G[昐M徻0禁W孷曁W郶4@A璗瓙亟錬嘪 vd;矮铪鲙蟮 ,ね翈f娼y髄蛼孡饦盚9酁1mA臽鴰+槣勱Afc袈>l<,皋様p違|$膝般埾*蘘i 8OSU觫>崩d4豜艼J K9秘Q餝侞鵦箊禺U!&搪垊盳靣#8 沗0*!荈w'D7肵<, 湄u髛髣騼礔訧開#7v墏癭2(駽u溱@p嫰F5i畒e噺m喊k怫R葟卍鑋蕦 N'22P+% 鄺;m棥3琄酊熱―T J滬>|伝@.y7}O蜱寚熙"9o'裭闽!i! P4)娝頧#駭/U5暛~冈襑 鉱*.f┽g鼤&{w准 譾媤6脃=敷"仉鳔窢嵻6xU;囗>?7[|)roDjZd飈憟cw婺<╧蓀8凴駗饈洆醾袥8冻0詄d}p羆諜o潢3q斴(c.晋H簄1ett嘖y疥完W:眼B邇挾c7PK 桝霯`(D sebastianbergmann-comparator-5de4fc1/tests/DOMNodeComparatorTest.phpUT頾G[蚗]o9}鏦\@D3軼l4hWj(jヒ莄狸`馅 ]蹇锏鐩P喘樍龉鳛;w扉温唚趢Sx榪 0纊H9蜑6徥9v#味6砝}:餀毼邢0h<軠鵯榒FR仚1楧AT喯奜g堭!鄶 嵽臘91\.#胤鄉閜炯汗坎╢F ,焝xSdKnf84磳e枞g6j!葴閻`_y2cx辢D桴莽扚s&蘺趒儲?>"柜H⊥咔L汯 徂{A鍌) 鉳奁壻姬蟅 燍﹍桊5+畧y尴識"艤..e@磫 膁4を46'憁鑮AT湆z* 喠 -甊<" '憼6m0k蚦仡鬬!癸&.m;眽駀槢坍婝syI淒O槦B) 嵕忦蕓}傷L;朕$乺/yJe:vw~)f"%鄈謅圩蘹7黧6勤钇.*c|韝偼lg眠v莊蓙熟N\`!Y徾鰉$v繻 i蛿国'"岭K^r闊銦洹b樦蝽V_Ii唥蟏Z濐綪A%毯b4焾j﨑X+G弍責HY;~"豼僞n際7c?c效3'N殗9v湱⺌湈wK筫鳷H澎[藔Q;毢V僔 䎬 j T眳爒踜/-樲G}鐝黋+o廭.l] q8 福B殬靳承絻e+覕l>!氱柽疛髋擧u饆蘅粌 眒–艒礝 I宋ky熃V n谶晀 輲7Yx劺u琢,铐B鼤}8N岧再蟺澖暑<0#,'-踪謤k傟'栤)厥Rn]厝鮘橀f,0$7穏o纤(RpJ#蠹6瓃:蝟穕灸矒;yJ 滱籸-绊樈43録鐞.ET尫H=s}筼虑朝RBU亃=鱍 f=驓iMΜ莶8#婺4c栆 "浵鸠.{Y萧cB迭濸) 辧>吨祄圏鴉*喠.冂7燹}崻dwaz 妃cR鮸溚Ni4PK 桝霯DC壓*]E sebastianbergmann-comparator-5de4fc1/tests/DateTimeComparatorTest.phpUT頾G[軾Qo8~鏦藽%B%@Z陬u疻t+軺旿顤丈$|湰鞞玈麔 (穖转歜{緳of 計燑塤獰栢&a腬 塒鄭@!憡^方)N鍓3墉 黢:麹舩J8噵ヌ湬3噡\若<jBa.貫$豿p\fS.Q;ybJ髕|湜1:鍉鹼}s{!BS談( 揓癮牗s&競4洟"噅%N鐤柷畻 螷叠B沓)=O}< 莸?=緲果躅Yz曂=裣燨ズF圼? 齪e{3*$ 蛱呢 (w; 5顐Y齓Tl|<恣I忳sAC_'d桯 汱碠 b#!vP檫潳獰!絏畤O_顎;羑臩灾91 腑S 3Z=鳩 39幡H':ijW0p 3oSy(蠹 1yW*坢S_I y's0*牒U害ca偑@p溞闼R O炎jzY蟄W栀恕鄏醟>)㏄7馐㏎g;玪揝燈H6蔒砤誏f昂V籠M硌囁(歊羖R骏罂sU甌B7_0SS氘}3,[輺y8t柷'WD*}=吝cj鍑hE(鉲%氍潺VnM玨汎凊狂htw@缙葇x瞻:璑+吒鷉;:,5辰熃樥處<転e葊~ 嗓 峟N嘝M罏e邌踿q6偱-桺E^[?迡8趈快V麼<踥囩遍呋龥-.爷舳藦荋廲潷銞妳G:疷i藶t蛒X═煝R躰蒾WE_訦i荑f嶂兹O8蹈IqJ6\靌镀;牖 '粞[zU8!堵z獉szXu鱊唺統4蛌笸0Jw\bYjn}詼4騟仵K晉J燔鎿-96,l㈧ ]釀5晞骁Rv衝裓c%R咈 痱戀3 %岻D2捊夐m韩 { 譮K﨨$c級&b萨8垰{嗣 摒o旲0T39觺[Wpx炀訓_烁DlZ鴕9暴+_e穮鱽飡釦胠蓦4絍擙_晦膝PK 桝霯仜娻P C sebastianbergmann-comparator-5de4fc1/tests/DoubleComparatorTest.phpUT頾G[絍MO跕禁W)2鵑i丷Z毃昛嚺瀽U澋换*匠v8I[3鹒娼檶}%渼V笮侰笣pc#=dRC0厪Li蜠 d: :m禰嚊逷>Mp赌\P餒p蒺饇a>窤*DE(r4宭3幭1钭纤琳屠剨K︶)鸶覓?F=x鎧Bⅰ侶篐<4U7-力˙F秂錳幔%肧藠(膈忞;*4攧z錈-*}I褋鎍L杪 f(6}W3|(<鬜].(遊AV徾"喬ホ雗 膼q?K6鎮Q瘄鋣= 幄 曲g]盄姊3& 貐逤蒰L#纲&$濦:巹k哛邊vf麾CIFs樉澂吕g4<1b救A>町0着P珱堫瑭k谈囈扞詰p4橂惧@垦zp汁dr燻k捷鑐讈懔Q粈!麍箒?煮頏汾/罈0尴须啔穛1'M緯J叚M|A50!*跑愺Hps圊訒 a嵡嗨餗襻尮廈St1恓 椔僷寣枝g1铥粉屋C呛姪30c畭恺萡3nF碈ih))P杣l:d礀2_镙'ⅷ漌C耍zD亵簥溙輠Dmn塤3哋0儮势Y啉r奐Co[衈 \璢岖A`艾 阱g鮕裡>睫 赖]魄懧复.鮰檀啋Tl IG貌p蝊鑹薲?e 矩o骑P)35?鄄dG舡戰 挵y 萜%L%b$▆jV%G+7I瓌@{3梃歜,j鑊粦` jQ$锯舼C?D羝@+9*窇悒蠨J纒篳熺5栟:痟g莎!wAR腒晅璪逈+⒋东 墘Wガ5*御瘪6誴4/壯Y穴莫蛋莪w敀灵蒊LyE鋷襣豺)鎷涣頻砞+k转hw~H攵K甪轇鼇Z!.ぁ 4%h鈑樮(裾V酆_B i慮泲a2澨L傡"楤圦酋襼こ谎!e!Д愔圢1TyQyz霞鮂TTf0毓&樛ǔ脗漡ay駁莋 [j}訄Y煡箵ch4^枪靛 B4趫阎qG沙dl.鴷鵒亶絉];險髮A%佶f筫"砦\=隩曵4蜏W^2枦獝塣uus塘g乕鵁檃讶D;逋#氼 釧齀しy羪齹)<菠1IN鸙%刚UZ孺2W嵚咧rq蹈i詖鹷q钐PK 桝霯o:U: sebastianbergmann-comparator-5de4fc1/tests/FactoryTest.phpUT頾G[蜆[O0沁)黀-*醇cl卬H"R蕛洔崔;矟^4褫wrkKo抡&q爝鶡s;噵涎8*鋱羟L@Q〾饓!U歈農E垗T y偨u稟溾9 rR紊舃耤昔楖槷怐弫鴔WDs蒄cM(鱄繺 璼_葠j&x揇Pl0槮銅躹n顫旿誧*1%<2ez孫 %b Q莳p倞(-潊囩旿孷?<↑AW猕⿶}P簝偘C(u枋悐 鲴]赈i 幡怂#6轪)粱眲4>>PL|&0永=ET⺄Q<拇a6箾 s4.}i掫莿"%濓!k],疞蘂榷瑌nソN睭阙篥謉76岑﹩> !/o嶀蛖 8Q)q 6泹/廒撫洐 Q鰉眫o2佃j宆镱Z给q]p蹬棉=~办兑j憪宛CG#P&]9蹽傞e(?{ 衖虭K婿世]踊频栰儂o-眦UΔ焁8魠儏昑k(鬾仇Qx哄4e6U2eX洝T魊瀆緁5GZ%M沾(\6*櫦Wkk伲*+*柟*抛}0媝痲F&倅憻昚X%∠嫯箦sl埍&苗E足搜vc崟aI齵|9﹐sgz~}ˇYo餐礕au漈s=X⺧ w"擓螃.眈翸Y^1盳-Viq礷w64w)B俔岓j映跂\昄梒久镃$鰅i?I;g疗G磵)`1柿%-您/O腺+,謜M5噯P+PK 桝霯?;c^G sebastianbergmann-comparator-5de4fc1/tests/MockObjectComparatorTest.phpUT頾G[鞽逴8~颻1HMQh P侇 xL2ms磛蝪Z袏螐&m毝犝牝捴炏笸缟寭氵胊Xkm譧n唩倊0B爗趣厪L閫駯'4却怣6莐纔:g(c9gZ<鈦nM0B"簦<救`0岳@C; 9f:軈p剬&N-畀?{邕蚏柂2 S敄羉ぱ噄爣4Ca(I蓱弳uU萮,c匡e誮y晋汴栬達HBM厊嚎AD枞+眵FL)2om垧N<1A┼緅觖K=}==<苂嵻G?U陝<琙h鰏]箬霾檭@ ~羵Q$褗8]3Y,F%堛Q怞V鸔含P"&K駢A宿CL楩仳蜊M8陴~=/敭6t0乷峛2庇-_丼Z18Z広閽揇F青撨髿p)焔臉鏰ㄕuDw粽摾G4H抃cbD銻)~靡盳OJF+:胑@:畈s輊<w&q閒+,睧2媷u3iW酐臏卞T濇c1c#峠-n旴┫壺huZ碯嘟x颿hT3厁趦+揺趆r#滁櫑藏|綝=緍L嵦苌鐥u庇eY收.N璢 NU;2舷(绠~僐纠=i诞?f闷翁Y?^汌O%M{4碥c%l氽[属殟灑u関\吔僥,c醉Ot疥镺膒3Y糆{谅&煕$a屐娥螶T畫 uSI谕齻{;X醡穣P{K裓鬕垪爕雝銪娱Ri崎麲嘯|泱 癁薔4R4亶/矉|;鮐@ 楧皑f=梛醉熃n4颭赐俐囬睙锳i?揩s稘E曠"岗询蓼鼍感辸∮蕃M璠高Y數苹+R9_潒mde莢嬭綆駘b躴 -铑濇F赧鏌T3鸵^快e壶賎钿`?O8g+=修袺>6$24嬀 8 鉇RMFRo櫕",e m溩伤 ,Eu囼寖N#俚佛?曹q圇惩 E< i颲-嘣r矙o忾磝阖e訥j6MRXv`XK>凴鎒汢SNU9-{ 弗UML蜮 9nF炡9蓎靰B/+族e麵拻6?j娃盩Y蓍(Ae%冼裵log翁PK 桝霯;,C sebastianbergmann-comparator-5de4fc1/tests/ObjectComparatorTest.phpUT頾G[鞼輔6蟔q*ZhЗ韊椒*冥懋R郄摌廨`gEW;v> $罎龃紕冂w物|谲M#昀) 墣3D!%6gtaqv瘐榱úT鯏hXSZ瞦琲 Η竷n(K煝謁嚀U恋測F|t焮x81Z}閺Q !繊灘吟H杵+車D)餅Z黝|1哩N像_宰雲[)h怑7)Y1$>緰`J!aa, 鄤q倷3nCH|Q悈戍>6@鍭鉺"+豻砶邞ds)滧艛$;B#<壒ojKT緿n鎮V(県Sg兊K﹍齠7鈒倚淊n'楿+cI擐慥O1緄硛J穄"(⿴%囎|<實 無^U6+腄4鹙朶+%喏q1>琧WZ墑令KX)*趺1 洆秧偪 >爲iH31廑T灓ぞ噫MI鰈@b=弄+蓗东n霗J箘G3J祅祑)8極斛 挐抎Zフ跧珬订渡.R錙d喢堞战羿g.畩閊絫C峞&杰x箓*綂 瘲喒v穫堤祵}眦:齰R贴.渨畮)蔸;阉堽A"镌洳'OR 浅r%s訋頥!鹪X刃6禤.1哮{r脐厐$b 垽`Q漋!%wO曋杯c\9蘙9%偎捄蹂eS琟蹇咻?y须{p賙铒潠:缔f7弰&榔 谿笩 #遙2>.;Gj窬M册彪f瞴*"嶗勏8$( oDH 枌揼S粪魱踁蕂淊>日嶀汞t湏C5W渇o穩窅 5窿=餃飯0>蜔侨鲘b叡邔&p+U l+g{示"]w 駹趼尝紆Df,2r{wE ыu?a0慸}&B2猇聦仸日( 朞抂D?cz zy蓠{孻#^/E~,rW躀&闺 jM麗啳s)y迎#W齇讜I-凿筐樑%SV宻Lf碿d畲殙u豭蠱S讕gD3Z~嚟嬈}w寰4衕3-岜I骮5lw禘y~韥籮1淀蝀蒸崌盹 茇愝z6瑥悎YV栀8敃靀O_捭#|I齢hZR舛螖<流:冒&1p0鏨缈饿掹疄魂魻肈▏-象c祂阑ブ錠恐,7e∑編祕U 嗵缕Om-奦峲/-V6?葌螐烅秺芊鐁雫!狊s>."XoPK 桝霯0f蔍!C sebastianbergmann-comparator-5de4fc1/tests/ScalarComparatorTest.phpUT頾G[蚗遫贖~绡U &$ms羃6 ={隸追粏D餄]僲 &U7R靫g均媲晤纡s4顈蝍8L=#&5)(0芣_,#覤vH(4 扼'寿抭砖 伹<詽?mt鶥倿#L闩|=藀6桌x嬓G: 筪: }[吀秡_寇鲱=e╆9影f 侾iNb珻=rC塜鶫4gKT)-裱m赆U撜堽/Ik-淇!*}K凥=蔌b匯凌辢喑撡噆|胰 秖!{茾沧}嬗泫4枷翬,褑lrF筞0H|Q N邪2儗瘶,鑞&]麑d竍崽'!}撝i蘿ST旡!j.a%吕 %83y)儊徖﹛霏_Y崡崓xB諚`緩慥儤▄)Va操3&Q菕胏孏荰"9m鼐嵺喰 ?T〤1癛这`┾qZeS禤Xmk3璭謩+P>Uf伍zDる;PN)7-霼鄕Rp璺3N'苪瞡j詳?庅8甆Dqj%x摚Z#綄L囤惤塕(u锟,誴J瓝鞨綫w^圎犝閡蔑_铪(躭6(桲虀K 簲/癲+*竞煏銍z櫯{臨8"螔,鳛L;11磪% &鲟⒆aL"燗8W敔C徧 嶞9礤賫奄l攆]铱鳗)瘢:%鍉倽.痰幵ル唯忏I噕~7=丯6wsuCTn谆鴐徚囖鹍z'鳘%Jl 衝2 1((T 痢斟魠0Y胒*椀m徕] 羗8.篿Gs菕2塒=I胝攕L槰媦u贽霚"宂+5み尭!7臿M h莨x噊嵜:-4榝蹘Yu巨祯_M穻?v鯕gHよ狢腕啷 榫CJb3鏴崞@倝2黅眜挮;;F]?霚鞗塣8'鞫D箘絼3.$;&m剉乄s{痀夤-R绥渄Uhr擩┬踩ZLF珪m/鄾6吐:G瘯r(O駉f*鴸罎Wd炷廛,险昩唱%&zi#)嗞蛞!謗蚾壉fj酹覜嗮ヱPK 桝霯ZxVM sebastianbergmann-comparator-5de4fc1/tests/SplObjectStorageComparatorTest.phpUT頾G[蚖[o0~席8-鶷寒m抑U*{0o辽lZM'q.鸫龠箎缢惫珄i%<瘶(; B伩I鏒*Fx遵赘H/ l 觗>S盶吾.祔@!g贲{泬/@(,B[顐%F _瑝b>顯郠俴F窇莘胥t琞E┆Q%\&昤驪Q禠璸藧~(妬\頩湰 '壪Fi匔 1暧棫L6h吊棚3昷 }i帻殺 Y頦G漷/"C厔YU藤狈l霂)蔧&,>`:w傧忄臊L鷟B 糮渀g5~2c#腢IHH叠ZOD殈0 ^霭nE崧煞1揆殻0!w串P株%佰钒駲佲佞剐使合芾(框<啈韓-湥挸P膓h牑鍴> 肻*祧QLAU(8鸡 鷜5E鞤$)Z${c瞩╋篅)㏄?!皲4膉^鑵%盂s毮槽胏H02W覜{l[Np<负'Jge'5鮉aoN{c騒 赍脷e棐凵x>枍/ 2虪骀酻^%哲 3@g恌e楆4貾l禒螭Q邛^兌魍橁+臩57眨<食K0{5N醃D蠳晔t.Q$懐袢8<胧墝 DG驄:~! 氞w詳!C摣87戢57瘹鹃*/&氂9d 硅Θ偾(gv岫斔嫺程蛓4硖唫笾=8Qn菛.F彄倞蒉F啡2Z~#播韾尭&茥駸吊!瀘襈u首瓋{n嚝1?鮛蜒⒁鉉Cg5$fU|,壾铿PK 桝霯瑁 A sebastianbergmann-comparator-5de4fc1/tests/TypeComparatorTest.phpUT頾G[Mo贎禁W&Z4-礡E 9噸=墨歖wwM*䓖g06劋{癮具镥4N轿g0姽O铦2e@蜙#訂3 鍦勌H&k凪高赆9.s n^o|哛亯fY扏(鹰釵&"Hx圔Sv1搄 棦i倢d 幭物鐝鰚`C筊M <3 譌袂蘞宪膜!Zf*DJ…恒 6G2掑昽 燈s=纤(胼骰*2T漉,诊甸SA=ё&'Lk2餃9x7犚09}2ZΩ鹻/E勓枺婟Z堓蟂=,ぷ騧 笘b葂)t敉竊7 鯭Xf`崉T毤衠湄CL<7獛{/楢h勁f5襚h;薉h営<扜蝖澫瀱囯]AC礋荤霿 #袜.< CL嵕翔崙維r#TA硵J∩攢q.癵lT-鐽[K4汕輎Y#h%Z韁-喉|.K}?蛥鱼牬Fe2繍賕箶灯A<籚稟N蠆苢n垯骦>+r?$憱6Z$0Z拵Фm煢铩.饮府テ慥帅胅A较甯2~追髗Xq#f恰-龠+喚_鼾兢n縖袪Ovt弊膸垶2鮠肝S?wl跞罴幏迄t续bQ豖Wn6E{孼,盤萟椀XA萀CP U4 W^}on┨`鏐+ 秹G闙 p瀘沟鮜 ↗信吇 d謠﨎~$依躋灣c钂矂就N龛蔥yPK 桝霯4 sebastianbergmann-comparator-5de4fc1/tests/_fixture/UT頾G[PK 桝霯#06C> sebastianbergmann-comparator-5de4fc1/tests/_fixture/Author.phpUT頾G[=P]K1|席X⌒戴ZT臈R鰎{洁]捊"n覐vfvgf瘖墏 |6&BmZ=WC#磪v 慮 ; Fz +/vZ 鬀鎅桏逐储臙箨pCP鱩 邬c0粏md返 瞦|K(辰纸凯泆Z暛r 孭櫲翑=S脥 #>h扖%讌藏Q(硾螳耧-酟I'亠鲕淐J#,驞)怶贅 呍蜸`C1鮤:⊿r拫v[核+|_Jx斘鼺x劘1悂`鋈僤[狃 uou 禰憩衚e8游:=2肃I澰?PK 桝霯踩< sebastianbergmann-comparator-5de4fc1/tests/_fixture/Book.phpUT頾G[=P蚇0 剧)屇&>癕CBB\茟嫑篗DG塊5!О錽?o揔X粱z鬘竾B-耍(溩n-蟬豎F6螕奜阉海3gG蠴!錿蕕p;轗,{#婄x)*鲥i^x/垴PㄢP`/拀; u0{q:収lI:qP盞騭饛峤褲,y沸2⺮m繰`髆@O,8w旊睷鍰Y<暫B?&蝹Q牤外焐篫$以jo钙I\觚1縋K 桝霯堚UI sebastianbergmann-comparator-5de4fc1/tests/_fixture/ClassWithToString.phpUT頾G[=OMk0 禁W柚FZ侗辛`鞉.儮8JlHdc+ c艨O哨阘#榻O袳Sl l徜|喼鶪LL5f袢 QB)z&^(u2冕蝭V駪届z紃^Cq碡鱜C麵緎 艮g轿mH'再阀i峤繒菑8K-V拧绖%鵽j`蜮t1r%=孕旌0鍒:;* 髌s唕~?U*曠吸袏c璿5圪'溝r7 6W"*/kmc,K勒~羃膛PK 桝霯'C sebastianbergmann-comparator-5de4fc1/tests/_fixture/SampleClass.phpUT頾G[e惲j!嗭>鰫4y趷B◆ av滞 *:6敀w镨694偍燓3镪褀^-g f鹧5汝101睞$7Dva!`BS豞钺Y囥致戟貶馾 /浸蛹躨hS9瘫c@跕oH(輒肼l湞冿5 2鶷to蓰~桲! #4&r0ub堇蓀'7#HKg譑eq醒0嬹享5峤?)~ &z宷琎栋/|涽闓 焜娂渻cM貾U"籂Q&K92洮dI膿 纰旾域v鞊G曘莪J肝妇翑1嶘PK 桝霯唓\ > sebastianbergmann-comparator-5de4fc1/tests/_fixture/Struct.phpUT頾G[M愊j0 骑~ zh酥<篮頞閌0v蓭儮8Nmplc c糨''m.哋>鞸蠥Tkk&Ag~F逜R &2*閧憒莛t1, 闧^U<蹊lg3噂gh营菡箧#怴衑kA虸爇‐忭盙2掭A Y;5尵忳>敤4 槧5墷i2C;|F9J艐ZU+岚W) k3 鼂?_ 鳲F嘭,irK)A=*釽W 兠鈱捧O椴撳8S什尛譬蒥jQH飛軄莐N/"PK 桝霯櫆#.A sebastianbergmann-comparator-5de4fc1/tests/_fixture/TestClass.phpUT頾G[=OAj1 见:丁d行. J/杀胖痬,m桼jC'峟f鱘cu萜NN6+62Es缢h ji[籢w7^Fv艦O檜栝_s( 4 SJ郖齨| $鰯跑驪趫%?@M剢}1蚖蓰[8顥W专QaF伬蠐R5c5蛽ZRw.鉎R寻5-鴊6|t'夦随~墀PK 桝霯!疖QK sebastianbergmann-comparator-5de4fc1/tests/_fixture/TestClassComparator.phpUT頾G[EOAN1 肩> u "!!8碐.弈e(霾 倪蒝t{5泷天畛夕YX醚矦蟻犖孍! 浴(cll*垰师^蟼粋脜嘒*c勢ㄏ侨簈t鳢yJ鬰`S.| ズ>昐紖+錾4漸/享盁_潱狦 頕%L!i,柂懀9uc"$+$o梿[cl@8抙;oW鐺):伔顑琟 骳~PK 桝霯% sebastianbergmann-comparator-5de4fc1/UT頾G[PK 桝霯- Lsebastianbergmann-comparator-5de4fc1/.github/UT頾G[PK 桝霯9d6 sebastianbergmann-comparator-5de4fc1/.github/stale.ymlUT頾G[PK 桝霯<--/ asebastianbergmann-comparator-5de4fc1/.gitignoreUT頾G[PK 桝霯札瞒 1 sebastianbergmann-comparator-5de4fc1/.php_cs.distUT頾G[PK 桝霯rf0  sebastianbergmann-comparator-5de4fc1/.travis.ymlUT頾G[PK 桝霯I舀.a1  sebastianbergmann-comparator-5de4fc1/ChangeLog.mdUT頾G[PK 桝霯鵴﹀3 , sebastianbergmann-comparator-5de4fc1/LICENSEUT頾G[PK 桝霯Vzu&w. \sebastianbergmann-comparator-5de4fc1/README.mdUT頾G[PK 桝霯埽V. sebastianbergmann-comparator-5de4fc1/build.xmlUT頾G[PK 桝霯薂阛2 sebastianbergmann-comparator-5de4fc1/composer.jsonUT頾G[PK 桝霯侓姄Z0 sebastianbergmann-comparator-5de4fc1/phpunit.xmlUT頾G[PK 桝霯) ssebastianbergmann-comparator-5de4fc1/src/UT頾G[PK 桝霯菆:Q\< sebastianbergmann-comparator-5de4fc1/src/ArrayComparator.phpUT頾G[PK 桝霯89\7  sebastianbergmann-comparator-5de4fc1/src/Comparator.phpUT頾G[PK 桝霯岻] > a#sebastianbergmann-comparator-5de4fc1/src/ComparisonFailure.phpUT頾G[PK 桝霯8 > #'sebastianbergmann-comparator-5de4fc1/src/DOMNodeComparator.phpUT頾G[PK 桝霯秪椚0 ? +sebastianbergmann-comparator-5de4fc1/src/DateTimeComparator.phpUT頾G[PK 桝霯僞k瑹t= %0sebastianbergmann-comparator-5de4fc1/src/DoubleComparator.phpUT頾G[PK 桝霯褧紬@ (3sebastianbergmann-comparator-5de4fc1/src/ExceptionComparator.phpUT頾G[PK 桝霯o 4 5sebastianbergmann-comparator-5de4fc1/src/Factory.phpUT頾G[PK 桝霯楶N6PA 9sebastianbergmann-comparator-5de4fc1/src/MockObjectComparator.phpUT頾G[PK 桝霯=4> k<sebastianbergmann-comparator-5de4fc1/src/NumericComparator.phpUT頾G[PK 桝霯󑥚= @sebastianbergmann-comparator-5de4fc1/src/ObjectComparator.phpUT頾G[PK 桝霯癒o.? Esebastianbergmann-comparator-5de4fc1/src/ResourceComparator.phpUT頾G[PK 桝霯QM祠 = 驡sebastianbergmann-comparator-5de4fc1/src/ScalarComparator.phpUT頾G[PK 桝霯 G KLsebastianbergmann-comparator-5de4fc1/src/SplObjectStorageComparator.phpUT頾G[PK 桝霯S烍冶; {Osebastianbergmann-comparator-5de4fc1/src/TypeComparator.phpUT頾G[PK 桝霯+ 嶳sebastianbergmann-comparator-5de4fc1/tests/UT頾G[PK 桝霯窋hvB 郣sebastianbergmann-comparator-5de4fc1/tests/ArrayComparatorTest.phpUT頾G[PK 桝霯!'D 縑sebastianbergmann-comparator-5de4fc1/tests/ComparisonFailureTest.phpUT頾G[PK 桝霯`(D QYsebastianbergmann-comparator-5de4fc1/tests/DOMNodeComparatorTest.phpUT頾G[PK 桝霯DC壓*]E 衇sebastianbergmann-comparator-5de4fc1/tests/DateTimeComparatorTest.phpUT頾G[PK 桝霯仜娻P C fbsebastianbergmann-comparator-5de4fc1/tests/DoubleComparatorTest.phpUT頾G[PK 桝霯軎肞`[F  fsebastianbergmann-comparator-5de4fc1/tests/ExceptionComparatorTest.phpUT頾G[PK 桝霯o:U: 韎sebastianbergmann-comparator-5de4fc1/tests/FactoryTest.phpUT頾G[PK 桝霯?;c^G 鎚sebastianbergmann-comparator-5de4fc1/tests/MockObjectComparatorTest.phpUT頾G[PK 桝霯[貨O D 穜sebastianbergmann-comparator-5de4fc1/tests/NumericComparatorTest.phpUT頾G[PK 桝霯;,C 2vsebastianbergmann-comparator-5de4fc1/tests/ObjectComparatorTest.phpUT頾G[PK 桝霯涋彇 E 峼sebastianbergmann-comparator-5de4fc1/tests/ResourceComparatorTest.phpUT頾G[PK 桝霯0f蔍!C 殅sebastianbergmann-comparator-5de4fc1/tests/ScalarComparatorTest.phpUT頾G[PK 桝霯ZxVM Msebastianbergmann-comparator-5de4fc1/tests/SplObjectStorageComparatorTest.phpUT頾G[PK 桝霯瑁 A sebastianbergmann-comparator-5de4fc1/tests/TypeComparatorTest.phpUT頾G[PK 桝霯4 isebastianbergmann-comparator-5de4fc1/tests/_fixture/UT頾G[PK 桝霯#06C> 膲sebastianbergmann-comparator-5de4fc1/tests/_fixture/Author.phpUT頾G[PK 桝霯踩< lsebastianbergmann-comparator-5de4fc1/tests/_fixture/Book.phpUT頾G[PK 桝霯堚UI 讓sebastianbergmann-comparator-5de4fc1/tests/_fixture/ClassWithToString.phpUT頾G[PK 桝霯'C Jsebastianbergmann-comparator-5de4fc1/tests/_fixture/SampleClass.phpUT頾G[PK 桝霯唓\ > 蹚sebastianbergmann-comparator-5de4fc1/tests/_fixture/Struct.phpUT頾G[PK 桝霯櫆#.A Isebastianbergmann-comparator-5de4fc1/tests/_fixture/TestClass.phpUT頾G[PK 桝霯!疖QK 倰sebastianbergmann-comparator-5de4fc1/tests/_fixture/TestClassComparator.phpUT頾G[PK33訐(5de4fc177adf9bce8df98d8d141a7559d7ccf6daPK!<韢5}55exporter/331a7ff7006f116504fd143fccd63dbfda2e80b3.zipnu誌w洞PK U.O# sebastianbergmann-exporter-68609e1/UT超|]PK U.O+ sebastianbergmann-exporter-68609e1/.github/UT超|]PK U.O1酳)6 sebastianbergmann-exporter-68609e1/.github/FUNDING.ymlUT超|]patreon: s_bergmann PK U.O圱 M06- sebastianbergmann-exporter-68609e1/.gitignoreUT超|]幼薒IM湟O蜗-/N-宜蒓捂/K蚄/庖+(圤.3魭3RPK U.O煮/L/ sebastianbergmann-exporter-68609e1/.php_cs.distUT超|]漎輔6鱛J=礗鲅5@乤诮eASg E$eGw0-;&6/懪邞w躯猪O}踂 0A5\9衬=樆k6牜魂鲻秪鏑晋诲p┒曏T疖+m豐鯠佛j岛b渍'XSc9曊癄暡5噖?闵冧鯱鳙諆視m≮ BTL酰孥諺T6曕 ち箐F閹ZM 狓n莂镩~痤熮%鮬筍"鵓Y$灨*揕2绬b\8)倯姎磜^F嚹*'2q勊郼璫byrI紣尿糛l!I嫉賐 散Q敘腠8W ',vZ鴈愊V萤ll:c H霽\#約1x+x溢腃 dv. *襨瀊㤘bd/陷^駾 舀羍p1奥薀恝>9T,{啈酢煬培潗^e+s(噗C悐昞t+芙qi8栒榹$[0紉衻気圓 啍k3p 姻h粑掇(睩|皮毻&鮙釫秨砦洀償 鷧k4O襴裞廳兤琘.戋 稣偰J紕魍毌豍衾c蜣Q1敂岖ol辫M柢苂潮蠾&a迹a轢鑹e摎+1@突悡!赿4絏屸爅奩t-Nc,;U革<u了&'*艆 6&Ht爳#袎鯾碧(L奔W煞╊廢=彂 鲍6坻;悌鱀禂cj$2寤猗『q破0赏铊 zt::a奲!Z騛飌胥Xq>d?匽锔醟霦|鯚5ru柞N駀骣-w樫虝蔁涑銉K輖3,潁 勵[9y缅!縸鳫H酹猒完2r嶗護WPK U.O訅$扅. sebastianbergmann-exporter-68609e1/.travis.ymlUT超|]UPKn 躶 栱偆?㏑詗柸!Nb塦凪增%%U6屒x鈀`帕-S徚X腱{鱰狍/綹&抣L竝茟(勑 <飰 +i披 搀74鍺1fa潒(*f餔[玆5cRE+幛从7:(蕘a畺甆銈僬錝1膅J赗t齺q孳O1%议泫ǐWt>溦韽w焮0l斺}嵭|&愅~<鴴僽b7$C遻灡j;恂渪4&惨B蜽齤q 僝 PK U.O-Q藄/ sebastianbergmann-exporter-68609e1/ChangeLog.mdUT超|]昉Aj0茧$郾蹕s 爄 -B"YT杽$<縅\韫份潩af2瑊n$憩dl5實颊q;pO璎2:(冐珋矹?cPF&r郮oW瘺禽坻0隿taY朹 釗毝v(鏿^0杄剡UQ悾^TM緃蜿 dxR粵斐葫訓*鯿{ 则7-y9pcJ8#峑梪3_鈨5鱸醠=N!'G<捂' c坔 埭皯$; 鰗2嵷n?_蜞Hǔ叮廐 mSbC註Y 楕燋'稵^賃Q7PK U.O蚏{2* sebastianbergmann-exporter-68609e1/LICENSEUT超|]礣_徻8鳔酴{蕅{鹶mu:捲v栻砶壞(1惠oT鬃{泷颀枨`G芌|萦s忢<苓?p鏮 h籯︵鎣|隂a/欲?晴鉯pa仲縢1&韉弁S秙S蓊:8M?嵀7;74忑豋 己 ~屵X;穡mC 4{傢8揍!<7?, O喧41j阭?K毨镞荡久w)爟袪Flv䥇J梽 >钢&Xv0畉延蟌惐=4沆愲&剋 璁;‘A2;邽z;勬}B`+# 畤k󟹒,R鳝嚦贺H窩覽R魦I: @翥勪o俺.h脙:嫉(谅9\U饩k鏒&4"羣-m9诏憊h8o4=槙誀藚賞%蠒*e&2榦连礥r2*驦( 既鸲0J蝛S*>p崫b[*%磫R乗W笵0DW0Rd戞u&媏EiX.滓3S&戶縨P.`-T郝焲.si稇o!M乗l乨*畬L霚+╦U昛偈s."!;2倄解yN勳瓴B戶[0怟>D"4橧%RCn.'喚08敆H%RI馦S嫰5>"d|蜅h磴5vIn翍さk拰1鑪畭4,,娆厇敥袩Y^V璄 咷b劺g:蟢-)3攏凴uedY茚x7槉b)侵,哰*T-丷16+侘婒孖q Ccb)嶓遟葒廝坋.棦HUKB貶-頿TRY0⑤p洮 Tu>,l r<{$樶璧棘I,]]鉃PK U.O愙衏 9 , sebastianbergmann-exporter-68609e1/README.mdUT超|]礦隣9羁b鶳76涉瓁U校=V麽蔗霳挱{霄箍ko伃 茬駴嚽9+暥ㄙA粅uy\"噑薽e~t嬷杅愤7楿{V鬀聇尝寛nl铃鮨隶靋鞎r鰍⒐替 扐遚=$f靊^仍R珱"Gv0璬f %(7\|"Hr4惖姢N记貨7皈3d欷V)鋖棻腚雛^昌忣2鐛g橇倡撪賘鼻刿芣8壏捌阰憗 Kg綧~bf醈诀rL揿噄:饷t-8#88(4c5敥芩?-D虚险烪疎c{c咊 1'o U櫄(+!X潭鷮昫勐*茴u|!蘹襄盢駉躵竂杊烛 :$銤Vg;q愰ロB4HEsB%p萠ErA{蕝罺潥$蠋蝂鍃鏑$户g焄E厷u褾>褐C#f愑hT3 F1╥}4小RC緢劢W%蔔D擎簝蚎(佽6j掚%5W不愞QㄊG8輓呁鏆"概燳 浥╕寷舦軘軁嵐!痤%媗i蜅t澝}M輒 存冋v喽谜vX_紌? 7a聺_丧q|箉琠_Y 勥A2LFq~鼹u&煆緸熌 莹%谇瓖P:12)梌q辻蔨|B$1徍+跻潩<薞輚G8|FhBQ摕.:"w:1萱珐軴T睖瑊謰5F('n禉粎狞d紹毣魖睫砋氩J粕v儽欒鐇睘箬A}洴斆4]\I飨㎎JJ蝖Sw+i 渧t6O赳Ml敕/焈黴z鰠9xF溦靥A3廘k竇[,p-篯Rz2PK U.O#a, sebastianbergmann-exporter-68609e1/build.xmlUT超|]u捔n 嗭y 砀4踡*U趠{ n艼a覷汌#i)褄A叁矨n/儍3&擦封y$弃飋El籎>Q3x5`+CbL Uv B蜵tHV┣Yy YDo凇驈: 1P﹐簀]1) 疑F灠vc,G8d 雳4觝覡CF06碘猁缩909黫幹酈4僱\效I++?`3鬸氆'V屋De ,纍n0!5孏fup孇打K@8+桲&G-u鞢m}y澆tOR^碠Ht/<賩9蕔從峰6嬚涉鯻宏PK U.O^Y聐0 sebastianbergmann-exporter-68609e1/composer.jsonUT超|]昑M徻0襟+,玀 ⿻8嘦OHH怼贘g俔;烩縲b+r夈y筠鴜&/F7 1畋翻u9 *袈6(k嗦賺=$埠3bVa莻e嘾秞\ 8&dm("螲狡]o]鍓?霂K4陇m皡U琒喰螉鹼焓\卅8U_5`逓B+伷G娀錍6皖5t=啞 液XH灄*qjy詁wXHrBbJ'ξ[賤F吋B~骂o迵鷬u途颌D/!蠱"鋦5l~\q完5:鲂瑸鳡5滺^玵[A羗pwQdN5魌啿+搀EJ?"U\汵XS%滶攻)h3f.V[è縡,蟼躍遝-5u脫W岘]婷0I>wSSUrd鐥#璼歑嚔s炴*"nC凮 炶庝Y厸7Cs;fN艌4kJ2'麮J}#紀燤﹃P刨剫#dF餓$F8iオ妧(j昒.挭輦=K郃瀜_U獺e区cC竚事粈%&蜃潦骼HT跍#_>xVy鍖f m覒3W!旰犒鞾墉Vk聩r8蔰 qb$ oz趰儻I T%饊2峋緥6擔y0 腃觡Cj"2盡縺QhE LTfh%%舯裙^镊褜a'n鲢\覫$d13宄E9鲚O眃&糗測焥"鐢L,#q^瑇:汯眲diL蘬汅E$訙 H懷-S鸂蝳黳qA)2<掍!$I懃I)iBR9`A%) J眨=->铓rKxxi鴟环W 讍+梊]9擊Q嗘F娊w劌S"罾 .(K澆徬d4歞TX9"y珀 un鼥B縍a :)x输z酸箏蝓茦(锧m=YRF{`'BT愽#p)6:0+侱繮VR#陘吞惑 -/eQ*kRzYP942.R癏"sミ>E鲀璟X棰帙t2%燃储牨'-翠恷#"釘%斆) 睬吏z腛檺4JU}国z筿H驋5N黢z筘4蔇鸤阖鹄A傎C澉2瘜X"X箊%j."F4M枩 錊犘,eTc鐲`u D糙崾屨)N !BM8Z)p!箏 .(蟅-冼!ZeX)cRRu齱F4覼т%oRh螲輯raD啷殏膓怶ggD拱 @M7防榳puy聃犏茂挤蹮@; }S吖/O3/o泄}TZ溹77澕争猠爦▎'缎<固葂Ny 僒鍆 歂鏼*o庂JE證 Ia娌噖冗''&鍻鮔!:儝%!摃BE 劇檟!箪y韮 x倳欒軔O䥇92糵玚76蜙U- J耖-5崲痊k捄紀D冝$鶟a燥叕=O倆喋pY#敇瞒D濹鎢茣摆JrNw啈5箈矞纎{r@j凛甸饑梴"鶇>O霮(m炅 翙^琘h;2 =:#/券 屖;U[$=q^2 B蹣踢5s9峾N鐑m蚸蟬殇蘌m谊 ╨朳7C3墨%U睓 ~鑭o2[敥J2吔类视枾幮膫肵g.]e-第k 胖樤覞#节訇|.0u琐" K赐  笛嶧膂陏墓X,[MShR袅髵%挟澢牊*嵀a U#耍Dwb 喝鵭H>8+T)lT阂晒 oFh癧3(織攢芓鲝擜帍b9山p|蓎蚊扁狦螤LS掵驩倠栯 畑柌築ZJ1舢虸錘挭,.,坑<蓑魋'沺旐⒍ H狖 (卤]9ㄐ縬鷃)m8T)8澼-"蟷o鬧8 渠餗A鲷m扏2Up鍯m⒄灈[$} u臷蔅湆F3鑲松靨T (x談 )+3A饴\AP7晰脙綖呺n伡擬絬泋xy涙#_oX6)偦扽誧a焓琚歁TS詖&褻5Opq岣宲鯀 婠 Zm`◤hv絕>时芈輫*AN婓蠝.q龉~mR)┾kU辞F痌s︽U氃wム釟譟謤郮 9岚P詁7瑍谱!l釠 熬渊,d=:鞫鈨zB嶕_^W鰮@欞獱]e毖痘皜試擣昲觞./5誫凟.$7~@ 8~鉞 ",:Pl暣雤䴔<骩8!麵虑鴛<娱-&-4k,?,+3>!鉍NRv<]S%x=,}FO抽笴y逿軻Xx蒴B甪 潢厕;哕xxB搧檺W想'睫A媑c〆N-眬犥澞<曟K讂B罯=)囚壳OG踽麈喾 j朏竰fS麏泑[-V须{n隭众㈩u_"j窜>瞸;岱瓘>o萉=鮺命#校轕h6V爑鎤塣書倶uv 搯=7l*趱髻3茾蔭t}燉玁gZ3礊S葟 wD=磌^鐵崟捣:'lw嚎书湱a洉谜 铣縦}iV叾m麨鳋PK U.O) sebastianbergmann-exporter-68609e1/tests/UT超|]PK U.O~蘸7 .9 sebastianbergmann-exporter-68609e1/tests/ExporterTest.phpUT超|]i嬨弱{娐L忎芻[v鱈霄綮迅買姊{f縓ゲ瓕,iKr 矰f 箹虯!!鋭@ H~岨H瞢抎澗fv!唍暘辿蹶斋w硷N\bP菀=煓徇冈;V闓;睪^LL弻Lx髩3"糈u極t璇1m$藌潨印纟搹(O5&几榪f泘訝#淪B蒱fYDwf'>裭僗mf禛沯鹃 鈀T兙K揯q记廚zO蟵H姵镺4焅i1L\襭鍿僜欮F` 3c:厜 蝩k侵υ僽1鉰/Z缪挝 鎩髼兰z缡a泽O#>^$pF髝泅榈疐O 刳闼@w.)髺L48话Y濭.v莽夺憳櫇;~|$# 2汲艧.3/5煉[t盩扬鳷G褝f稁'鮛簉饂 鏰悄啀Ya轉4gC匮A侒9棪AY懖3黇G4Q阵\嫖脩4詷v'N鶭僼俁檍d緼鋘冘k惷A箊轛 鐾0眈姫1脅4F釙w讪谸  鬺#>t衳;拑蟜(a侸岮B葷苽T殱<{H姅@崓{嶪 w\雕OSmP逈欏豤誚药鍓嬐墘 -哑歩W乭宨7 媫 4B"匩 +χh 霮锛; 孼见绠鯇3p.鷱 0斤k鶧娆账剢F'銓3f搤襾?I 0)㤘U}k墐 ヨ鞭犉H9tt>}^褃鄫 爼D) 95獲YXpベ朖沵D叡葷RG頣!肁犣慈3"#钎,{氁┟n$ 扦:炉然F$zQ" z酹殪贁傁%恻I欓@<`ㄠy:硘0гF[猋劅齸d韬閣厬滂囡羶絞;虺s籑d袴Q%齁颡鄈'y磬k椏 C萾騞篩2鸜2欪矖8穲V嫚]崃<澜鬧c闸矻b0HBdoi*e+q豪堷?幙鰮眇檂*hr哤I%^'澓 h椓c躼(o$绿戂蛔DZ糗9蔋m[Jо缆!l埉撒館碤7rs褺 %嶷DOS琚&4䦅$鷴}﨡秲O!|煠z2銡RFJ构*:pq裕蟮k5航J+[V"リ儹慠霻陱梥鯠灢R凃^窪撯uo+蓦碙踚貧)(kX皡雺驦% 吇`蚅:c-Y蕋6返! 诣.,蟒`.o夼=藜囃谜遂xV 撣u-%iu扸7i'瓋zqGΝr蜲䓖輓窌vлm锓 2М伞,V箹_L5W朻v靉=2LP鸝针雚D#キ(JG*乺W恭*M*篵(Tm) 5架_W>7 腝璜IRm孱]朐)j3罅狢-t篅暬E朸@扥 惉{h5 敩5: 媐" 纯攛褤D]X6麘妨拑仵Z>%瘯瓮.Fpp萞戓I.36cmk裞蘟练$熼F垉LA"]!14_婯故D*-b 粋Ya^叺^;┄晙.N妥';艴-9胿B&9罏>(9W儔[C鮶俖_Z廦,(茦#"?~~馡镬厂澍鴺H蚽+誗p){呟wt]j萊 茖bt^{ 僗x拌%禒!.i1瘹]R鑰に牰~髜 RQ)7耿 -U孌8w広猿v頣f2鮄s IH侌 < 捘垝弮載屹,D&駉B N遡趽睦1鮞JP坬K@覒ト叧艤蘨雾]_母孛邰' (挺綢ヶVbR問趽妢┺泭冢獇鷼鰆嶟拭56sT盜$'}尉n7荳范涹&坣S7僪終g挄s-+/ '|搳癃聀丂綝吉4\ yPR厐蜈n5_錧^莪D飀蝎昊%⑺朸棖\72&K陯).j幚ld夬?碈憴I=毻*姤]飀硦aI掸(r?枑谱燴,F蔘1 艡惘 Ryχ'*L问拟<嫹i啞M;车^)+旻7- F?潤寊釩登s摹8 汮摎痏绋紋#┓>骿ⅹ薮f-I鉴t普z茌V5k鑮:,O+8O#堗x}5'恸7閸魅桻吕SB@,筤%3紏 x鸎莐ix,簂骑嫅醠\翬Mm弖詶/$*煀椊l缮収83十>候礨~趭 縗q怳椦.ラpbZ}2豐仆6U尳aTt 弐d!瑛dD鳑 "."ア槴鳱bⅤ蚁奤痝D坠$膿亮[\娤种吥M×踈+僲/ a>9佝鎿冨問萼閟掎蓔:麏苭x馘嬬鵂禢;_3%拪-U蹬}ⅷ$G冟舺Qy U彡gS肆受r耙嵚3,閜膦cI8p訌ZI沨]苴 A辴C1 9G. 鋩+ 敬w;y煽届I骡<劫PK U.O# sebastianbergmann-exporter-68609e1/UT超|]PK U.O+ Jsebastianbergmann-exporter-68609e1/.github/UT超|]PK U.O1酳)6 sebastianbergmann-exporter-68609e1/.github/FUNDING.ymlUT超|]PK U.O圱 M06-  sebastianbergmann-exporter-68609e1/.gitignoreUT超|]PK U.O煮/L/ sebastianbergmann-exporter-68609e1/.php_cs.distUT超|]PK U.O訅$扅. sebastianbergmann-exporter-68609e1/.travis.ymlUT超|]PK U.O-Q藄/  sebastianbergmann-exporter-68609e1/ChangeLog.mdUT超|]PK U.O蚏{2*  sebastianbergmann-exporter-68609e1/LICENSEUT超|]PK U.O愙衏 9 ,  sebastianbergmann-exporter-68609e1/README.mdUT超|]PK U.O#a, jsebastianbergmann-exporter-68609e1/build.xmlUT超|]PK U.O^Y聐0 sebastianbergmann-exporter-68609e1/composer.jsonUT超|]PK U.O:麱. +sebastianbergmann-exporter-68609e1/phpunit.xmlUT超|]PK U.O' sebastianbergmann-exporter-68609e1/src/UT超|]PK U.O覔矟 M#3 sebastianbergmann-exporter-68609e1/src/Exporter.phpUT超|]PK U.O) #sebastianbergmann-exporter-68609e1/tests/UT超|]PK U.O~蘸7 .9 _#sebastianbergmann-exporter-68609e1/tests/ExporterTest.phpUT超|]PKI.(68609e1261d215ea5b21b7987539cbfbe156ec3ePK!s6T汖S齋@resource-operations/5a27fbb9d458caeca4ba4f68794395b0673dcbef.zipnu誌w洞PK 蟥CM. sebastianbergmann-resource-operations-4d7a795/UT 挼[PK 蟥CM6 sebastianbergmann-resource-operations-4d7a795/.github/UT 挼[PK 蟥CM9d? sebastianbergmann-resource-operations-4d7a795/.github/stale.ymlUT 挼[昑Mo覢禁W屧 HT〩>p)桱Um9 剶=帡畐脋翠唧f譱JDK鼓尢虥yo啉埼:y党48O颶OBT嗛勂7,:帺;7-J"gT}NS藶蹳节yju躌eR.BHL鑠晫䴔8D蓙 |盦96t秥u儌餖3.p_顔#EG2佸プA祮kv稞1J$si郮鎊R[瀜hR6)c肚驭H掍yR"怙悹fN鯙怨6鬪8]鴥A愨Hqd宖T&l索P@;t 鼛侮埙6鈏/3FS畳悫l踃韊>e糈妿3m餚b蹺z芋爳羣;俎勿W%#4屣琢N趢皈]蜸鐻FR詙筯鶴*婕 z&!-7t/d铟嚃;4b迬pT鍰#Z燡袽兀Nlq窆挶u稚駶嶅蕖n鲙蠔凫0屐踉釁鱡,扜ミ霉甂辗蛤;诤攚O/奮玫伉P?莒頔 ﹑葐 J鯜#"鶽 嗎绫匟筑ゥ眺?u5鷹躧咤:.鮿zQ>~q卩8㈧&zwr含閏1粅孨棔戲+鲎6r#:rLVegV⑺ja陋扏3/SUPK 蟥CML浡HM8 sebastianbergmann-resource-operations-4d7a795/.gitignoreUT 挼[驶 @袨a` ;+0%濦钽W?B+蔃榃钜QX.:φB藅举箍 緯勫侹 LuH[W镱*鳡3钢t$\6堮f梺fD爻<該/礽暥蹉櫺欿狦Mibz世`9 鹹3腚 娈 :S髤謧'饨G74懘痾95`1鐼H幙`l璢cd<逄dJZ.拳7争e昜A K@Y沎鏇鞀dbh彩膃$薭4|x逓<梼筓凒浄投Z沓媧-韀鋴茆華4:%覅pd葉覾Bm.C 唷1 Ol浦譛輥mU>踮e肭s鯋t謥|怲賎7萞y}.H rF-碊"浻bZ灖:|4Q/孟\n[( /,列HWo*>撞$ j虤觩韻4o榓筓壵鎌蛥uWKK 8蒤悹~*勻}Rd鈴﨣,1綣顨T!铽堞茗C-{Yr呧.A经 靛 rZ.=嫸腵<\姧距丱0顣n ]y釋h貈櫙\E珤 N銈跙;顡T脉i繮wA6蹚簸sovi墿猜华大y? UT9 " 跴臩崋3%婿湸垝{杠)VL(憆衧魝缑灨.揕*绬"/溿AΒ&=;obu$耬鸨1= $7Ib{(禤$炡l3哹1(J,(鑪;5 7玨6~涑誸j[郦Nm咆妨莥剋=1x*x蜱$C bN. *襨80戀脧玳/e"誮 i脏*8豠鬻v琌]& 藂9a;篃B雭!s牉Z)Q$飫魚(G D逴A*vr1eW竤庖pl鯾H禶xq= )g鄲デc谢佞敚駏媕稏_敋x設碰篡o!) 7抜 炰颾峌耻設湯墲x 飮57啊榿氢剑b(9脀8L+b1浫4灩9d I[(慊S7w凧┦WQ9僆K舀l鍔Ba顬1乤y305耬>轂6Kpxd<&靾=曍綫芵鰽|v7V$\飄革.藾嚩I偷犳壬%阡jz艐)f驯8G偙源鰆颸辖掕 ^4%筓2X 1丣n嶡g趮睡x蹖-繍*鵔#觚鲍鐟 籲蘫媛0泟$膗垖%鴨齚UN谟w#8靹駋炮6?O'亥泰Q嚯狉囷殝嗞苪b葝&7鸇鏲(6ⅴ~9輇 35綰+^賥h;nw爝嘾劃馔獭O'鮬3譣?鶲摲曶桡胧呻习t鳅3篧.'B獩裩V朡k x鮲?PK 蟥CMvT^: sebastianbergmann-resource-operations-4d7a795/ChangeLog.mdUT 挼[潚Mo0嗭#韰"派([z*!X稶揑b嶝重f徇3vvK{═q夵晈瀢轞栗(蛝;艜謄l恵嵭鎐:燮 M攣0*解7+3a 褋勲猾/7_o迣!8YU?鵉蝚⒌Su帞i曈鐴Q,癧塟,爠U郊(梪Y縆 窺勘+姺pM5宒:0尪髉Pa滴蠳掍$秶鹎!4勣Fj鄙V=赞B薐狢J'狛P3儡煂;1|W儜!~朜秆齭K f婝钁窰嗑e訋u嫦$=#V炡j涼.鍊=&#u鮎3枭N>C觲8G謬>i蜖狉耷:8嶀舧x埾m 莄x趺烀轩婣j闿鼖1 緯4A8糼賴邼b 拜*]b0勮.貌熰坄剄灳諅岥c雥7蝵诡Bx讇詈3犏d #AP 鹲飭鼐O ?`e劸峮繇q潶僂昃鱬馯9 wh{G妦癈C=I@堚/a湊 v幹mpC嚪6鹏!:镐 住J󻼦`頀駮&]$楴nO泟}烐k.4Mv% 蛋喙株Q霬@瓥藭厱* 皙累蔶9o唥;? 驹ZJ僜抓D0D准睷 d晽M!玡暡瑪ki駲UY" 諦+绮攙涾襐扰H啤孚始)箚貉2萔!M^r 賾模,/K"d7梛S M绎-耚@)悎衐!等-构郟^#等%乛皋fWL#∴k綝ko壈k"p$o碭揹屃4sc瑎E寿(sa>盧VcD 'b劺ぬ':#)3攏呏MmオpLE硿ck懧UU矈)%P e熈f%館S))NaL, 0@{*,錜T範"攳4G% =# G&Y@U椼萋fi 缷GI/庌入殼闰5 PK 蟥CM_{儎7 sebastianbergmann-resource-operations-4d7a795/README.mdUT 挼[厫1O1 咓 K┳刍残墛 !4竦F﹠腘鞲G+$DF;稆給/ㄒjBx盕#a a[錎"R`匽1 嵱}=K劇^靦耣V嫢叹!糐b.$u骫島8_塬珅`28"g4 L 譛S==蕅批~0u蓣{磘铥噓囡:魣煃*傗.猀濑簱涐|; 馱廛犍~徣秳A*泄0;N蟍葇绺衖j#氓=H+y鐾馄3: 壙阾潒+PK 蟥CM6<7 sebastianbergmann-resource-operations-4d7a795/build.xmlUT 挼[峊薾0见+⑶Hl袺X!@ P犿暷" r'(蝻]蒖m+蜟Y抔赋{+0&鉣%繑煡@W{m\[蛇縩妎騤砕囪`M翧彆寴|5>`bj払c賀%Rr| b3o#:*Y[wQ>鴦瘼E7,嘡mVg#z`:欯`脶[b泹"jJS鮭  6睊燓n!!?>栢鉖j塴屌,按揪kw^昴X龊P伒坿7樐蜳'庝#謆竐偔=〣愵膽剃靥鬱騥垻p0巟7闍榛X彇" 椞粻斲濎g栲|↓蝁篳爍釉嘕+枴 荖*}d"A<}X敢 稏CFO暏勿o┽)曅z)o涎轁襔=%侯诧緄8o\+g:;脧L=5u.继繰 '傋z憽褷扭鉰5N絆 Tg嗝<娽F穈殃寡-+/GWM廩9|6#藕QH桱E貢--o3'<饚JN 庚瓏+姗名wpm枕V載7嗕P巟a*g澪 噪則o>欴汩K1闼觙硏锄PK 蟥CM4 sebastianbergmann-resource-operations-4d7a795/build/UT 挼[PK 蟥CM胪顀J@ sebastianbergmann-resource-operations-4d7a795/build/generate.phpUT 挼[鞹薾0俭+订 蓡+プ贘偠爉$7hye)啅颮e' "w8郴锄!uF!S擮*沛楐-5獷as衐_3朜L唷JQ#衃qm)A.餾s+i 鲴q1唟躳c楌 鮪膝劰 {WD辘吧/:蘵AVカk(酡女怖jQ4D.薋颷)9= |nq?o/~/黆璕[q 宪繴6吴瀰劜8h'-z)cR散M率(蒅'4B腹藄H J竰睋:嵖窲(艶(],3艸9颌倄@C恸/.`孽雾QZ3哤Q齉 _!/Q傦焜1z 裡4,肃|隬D嵺t報愵岯恃 罥1杒饴?*姦寳珉!遽I燥謹k蚠r残C4偰汧埙O豩闶5]3熛 佷{4娪^<_輚┺鰴z[ 蒊i蛵佊v0D:;+41筟}+贰,閷魮盋鄯/=艟]籨岤鵩躈3秽賎墑fA4[苂C/G烲4]沙g;廆2x7Lg缰臐*闕疁蛬FZ?恬鹂$┭EzZ砌2 絻PK 蟥CM綼~V; sebastianbergmann-resource-operations-4d7a795/composer.jsonUT 挼[}捇N0嗺<呭'00V陥妕鉁$_ZD晈莙婴)烄s锨>e$.狝!]臧杪3羠d ^龛莨窧黔鑶匦车 b懧ybj瞹蹝2闄肖毀~鈁堥膆r駱擺0&〈辸n]倾1o刼C檚壈D(扟罳$焚讲G"!捏槅郲c]L咖腊N觧1樰艝lF逹d狣B.f礭新药禣积H`+;8叹4 :O汞焬4P-斯t媖臣槤 -nt-c 6V-⒆H(_]輊5?(駜6vx皙隮3颈 *朠蚚R V醽8钿F嫅踚鱕焑縋K 蟥CM2 sebastianbergmann-resource-operations-4d7a795/src/UT 挼[PK 蟥CM6G/iH sebastianbergmann-resource-operations-4d7a795/src/ResourceOperations.phpUT 挼[潁[肤苢;舮长錢"k蒅N釮"&惒昬觡铏n標沈OUu7.踊8嫠w埥侀kuUuu踹奉医&撄}囜鸰>>/>{藷/9晻y滑^谟Kol;龉鵒mg鷏(燮 憴滁/?榗f2k^~o鷖5退咣痨鐶铅0湛骍劭 髍%o籊_/肒/U櫅埔7Ф獿F袭ス蓒遼龂/駠/鵖R裔 /诽%钻8箷脜獏+;齈a冈奎jc粚濵%駕_诊诚Ne換I跅橉咡/~!R7秘7/\氭鏌R#諕0z;6hr速 _硐~掯}鰫茜?跚7鰪鬃糺V褶dE緯峃鴝*俘+崈+j鷊*?;榸淃:;楖+TIcN?啞&铷U屉+5吟嬗h祓x0蝎蹑{hVJ貿OT棷梪賔蔸r0柠秏雾燏缠陣?尳宥>r袕鶒`笄|[罕q鯯t鵆4F$5裀_覦轎n{C珆*懏賎Q (UF崇R曂浭h蟋JX. .曅Q[+N﹐俦2囓T暿0麽T7繉醣蒍7sTK戌抒>,衸d鴋蝒s(趞琈1Nm =W忣⒚Z_;词ψ釒鍸=Pk/6嶡呺 弳5C检s芗yUv9p]Q&A低凙 鹙y癟=韀+)N垆n,Ie3$怈倵邡+ B&&Ehh抔劬誝JSE+3~钲w#漎I繫蒗擛S%Z7F焍叐 .旵碦yT$a O斱4づ袯|狌鷲_2X>I崮&S儦XbLm1甸0MN8\G 嶷苠=w忆HK&銪/M術豪苎4呏I啸)q聘:L尶: '濌悜妱怯 FM咦鰷@?F蒢_魪籪貯篺炸V@賔S'杸d绣梒{W j843A霘扵譻焨2琪<瑺暐葐L叺j X鎦追6(趐76R喖璟豨u瘎l蚣`諍*燴M65逹詴%麯襠@椃V2挺# 臖仇橞kY炐,i哝芞񬌊窍S j8鸙S9lv畔瑟K欢/LPG飩Sd.S 鶲槭,4L謒R?h<4^Rv2佸稀k)袸`獕M肞B= 譬:5C娫"圖ブ ┦C栗禑,k j-碟0|+ N婰_%咥疫琧7'翮c'湭腎戳%+戓蝕/戬_痍认i 4I姐額脣yz75m桼噰>k處瞄筮問B烉鵲苚勶^_怀齌}筝锟>鞠/泚]オ_駠 嵄_;跨铽辗-櫓,Q"邹]艔&ˉ;P=榛鉕 $i&a鯚?黼k拗?繳蚎梯溷`~塞矉f?錳瑍黖4zM蹉楓躎鈆鼵[島预x$_岭kV曠嵂瓯峬r,鷏3密慥髹o.\V魹 ?}3鉥暑亏鸡苜乙劊瑮汽=cZ皱#;锲篊JZ繷)E熔(鈔$k)` 啳 Q=六(悵皚J雙/砓v淗/H,灒咜枨~@;%3*烓僱m捸!焷vz庋"+谂3鏊3g邨鼏觀=滫掇U 颠v&騃d5摺左ば摄x頄4犫绉j5{ D墂┤筱<+麞趾 精+-:],OE晬稥}柨扁颼.;D莄_<梗Jx然倇Cs'捰=8嵱Vl%P[精? 媱l臘SkM憹k昍oe)x0鰬hc邠;触譁臦7ゴ槁}i:懮 輤跗垺铵y嗈?饴6賱g飤瞪蠄|<爄 韍&ρ嚒琈;搫䲡 2<玪圕≈o 夓x_3H"5噐kI0鳟淼,琅硠懩Z庵樔?'鶯烉%鷮Э%餌豯枘d`詺TG鋛O暈}{,il鸡yF囦Lo茪%&)钲wi頂栭Eg刺z脎:f耦亣m~1u浒 狔jMH^啙I:墕汎庾顡汢K誧焁穏a轧+M1B毺釖5E4 5箑爜蠄统N櫐燳嶹耲?ヘ,墏:抆Q囯振竀>熧 腊Z恉 枆涻眃恰 ml ∷F-H$!H鈙:H&愂a=鄍^ (嘭(镅彇ы咜乚Pg咨AOH乭趥+h猎錕'Z歐%h&氈#S诨炯挬w5鳈Zy箎皑X_5@ $+F39<!缾(韝/`k[鴄圬:-给t紡輏r8 #]盼{犛,ば/衳儂I菿 <3n'桶i佦迶珂餱px%, H操AC貮僴s兇H$ Q餟齆啾v5嚂襱;:u*焋X弒PYgh-,;櫯闰[熷 ;h篳!F宩:8調叮沀2K @X丆階桸3狧'6殩毬H鉒 醔能.餭嗅 @氽-v2嗸dFxd+/!鳑{N*M佟觀嘶矎荣腁(鼃醛彸!逈怓2僴3皬b坽m4+鴜>蕤趥\6獰赱 FkZF氻憸a/畜SV馫暩z狤;〆;q"ZD]3譙4uM3Gv4!,QXV褦勓G?F=@z3 銆D瀔mU)C瘇kpo5盵(笸(-<. P)CZ- 玃谈眯""H 顈C ".聅eH贕璘H\v}帜酘亗/5旭b)6<3M~蓺醦鋒*嶱磞_7i|腭OLVwPh?鶋'[yp淠\<炎<洙{TK-=U 灶V怼診孧e慤*邟韥TT6Y,<++j~1盳縝l1!mv牥d#uW>%6lN翩`选啵5{<烝攤共-3k鹉樶襸 I娖昚sh* 剀]燷_$3x柼嫁l^2氤廡軽qh樨娡_Jt#柰骛┽秪 KB税鏸E酐k浛xuょ儏跮竆 z拴M遁V*纔铛i鎌惮朠& )酐魑 倪w(澆讷寚亥Y 8a U; +霒"H憪偰给叆MiO嘃睈D礐涠Jij<沢鷮$袡)H孽dbe瞊6\P|熣裄飯 `垢$貹霢畼CY峮馁䴕疵&琳A8B珏;玿 $彾(z⿺%杬{*%跽RG 唼馥婛% %q韅L讟8vw"颂&z蚎Hl 洐拖T絴h&孒,璇N"靯m鏾抣-J鰗q餪苗{| ?矜局滪4 蠉+伴邳瞉:凰狍昃梌6#7 < 墡<1鍞贅 b僆(+焋w0]^^坳-歺|7b功,僬愸 萸S琯藁轷1釄e朝6s|畅I )Oz搨 io椂*鳋'屶鬨c蓟q據(谛睻f>t1c焏塿嚓腹;ㄈ<摬晏鐾O:6渳齫!+訙囁Cf蕐S諜f虨z他迳:皶籘/UYB騪5壺徃G辛 H☉[氼遤狹晉I伧杯ro}戥=\盛@哷樎&鵉>k詁~gw5鎃6瓯C汷箖蔏[:祻┹璲窃铄粄灶g䥺^饥颬粺n祘鬶疒菦xm僿P道WNp特軯願*共団[`忒镅B婁xb桴P蟙8谽6熂Xpd#$Nvx倆禼苪瀦&f t#.tR照巔鬴堇廠X9唻禪EBHK獕Ai fK蠛-擰泸昆谥/祶U磞G挕vH7w$D准PA/D臝垔6?鼣]3 S:枛i杚躞8枮胏X掆牛榒桵UE$I9 寪-X谩V0(?=螄HY< N L4`a藾亄箳aL5f腤svl源M皰;燮'棕骎飈涭lA莄蚟67奀翤芢瓪;r暋c( :澣;$瘧X圅Oe7=9vF'r鴔軋0~奆瘊-=>7_:垷E%H=湙賰鴹~5E&篋申酟D韪 ~/2誧GG搚垏 53zE虧o庀B厎烶倶有鋽a$/鈚b[;v钄摃尃汊蚁萻鋷︾ ]?吿h諡仌N@] 编珑鐳晠-X(CJ]槣#;瑉#F~<廀9﨨w凊4嫕烑Yl徆荶y餣 A衁 裘蕚倶P&肂+L;趐俀Р珥/俈莨QFMn祁姠b厯莠(lQlynT\ 邕墑趥5T婂M▲_J偞殫'ジ I袀劏Sa9焯檮sdB痪eGZ$'+髽谇訮葉w  靕璂謼賘儧"APJ閭眐:茌)v1怆zb"l湀艦ZQFySG墒磣K N灛i 聓M來 蘽M碹娳﹖莈n8+鵆\]Z=庿j鎆驷V燉|Q胬I捓38r叨CxCkVV洒嗛!s炯 +駅jc,I鯿EIt魵︴痮Pj>褴厞燽1|A伹~蝫脳施&P鏅E朽逶%z徫,〒脨官梲邊拂敐枍鹀w乾貨M栀頹緷%贋﨎.c#z名T墢*.L達⑨捿磼嘬淑w58#僞炂娢;摧巷氶I&󒂊?E棓炦慐y~G帚'm綿鲡2(肪\啞随蜮懈,L笠諠$=杜C鵧)e<傃S{湈:秏=m癇/P|N~I@#e塁飩&E '~餅.1?X幡-uzo);Tr90笨$嘟% zX\葄錮胪痵#: n-p价g*J憉F嫆*(岺 =壋D癩濣y}om苢麳7 K矗犊鍽淴苼塚Unu驙禙慔6D綉}𦶴)伟g埳Z濐覑Xd0爐 Aq" ~ =鬷 ,嶼2齈;[&41{嬲鮏旼!3宂喓広N+3C撸Z华儦1eH4o|q;竹毰1窸臕Uwa瀌u宖(唱题J_呾詈T妭n颁 淖?iY|b員)A媅|耫钆埌瀠古wf籉0+糛#R囐覺舺a鉝羁Om訏-(r侲荅z駥坵=┕墩4~徢'@敜Qt}勰&赎畩M%譸怮|8,倈O)-I# 眷Dg ]6簦蔰w柚嘙训浙瑃慶9菃蚰Zw{w纮n铚誹栿$P︶鏖箞2懝绱蝘8棏曡烑洣hf瑵 撽gz敯印)m}&葋#频伾朓jt>_=N"Ypp3恵烔i+葩髁鄘=乁,讇榘環璏嚓8M岷l腤 腶)轰嚛b哻"∟蒔I#桗 篛+锢决 贾4氓踢些〾 胹悽絏碱9羼4畤謴uLN阧P绽9b鄜)u >辣.矛T彷>8淔 )a"+We ,犜随迧 蹪`蘖pe3.v笙1舧客x r嗤 p(d(#;溠r啭#鎚|蔪嶒V兤萺苊g緋V豶灎鹙厬h.A泑嗰铫▋ H9fG诱(L3(Y飫R乲{V儼8鑏6jA~ U腴荨T 轝@& tx2+:辉na 鮾柾^春u67>颦\-~ly;哅:(-堯硏K@x鍄朿^R愺餲(艗9摓8饌sOSn (\<桗u湾鉗x5!K絞?U┖篕x旔憷QM鮕3/~蒔滖K _j§4痻葷桉pb嘜(P&4Y讯願ま也bamz葽羆亹pq:喫p' G鍸綥L+M嘼Е肻掂 ├衸v1蜃瞣t剂扯甧+莓-逘SPtV黎耍燖X-+昕%壟渂采.v;Ц硫況,鑔r 媤悑擢x岕彲(蔳\綣Q;b鋢~L`Zty巒.ik4<#ヘ嫥Li暼菷候曝餖 970疒.\~ 囓c祖>罬'xoN|^'.mV棝^xk峵發-8^郥 脩7t+?X錔佦\2}G騚俁荪迁O0> #$旮g 錄0澧爛t8"A'Y纫=胫:礳齉裈渴u鼹鴘馂O$6y矙璽立G璒po艿儅琻9% )嘪 婏@憬 .时!N鯔Y;粥k憢,嵌/3樒е磋 牱燩儃醬X哮#1犬{4rF 辱9鉕l ,jY纏q篝g腱委*q堑杦竑=O篂M0謓磑)琋(F醈櫟坐怠g>,90vF薱kAw荤B+鍚罋6躩轛:_"R# p迆Bqy'l翘 伯朻8·6腢 81aぢl倱鮇靤;YA)闹伡媅欺Y戢袦愮夁cY[ k51`澣齏'髡杉}u*鉤澣╓oて[0褫莧e 7R-p\燩T-`樜n墐z#橾滼37儕z祽d甆沗utj踓禋!S颊 m禃4溊Se$g势d怲恱嬝伾繎 rI~%A4鄢fc诂7^2疖貧[s鳲Q;裋с@纍$Q魟 HO侓HL傇,楻喺S魴蜇^Zn蕯ρ3歐徳紌燝z="荹q>RK訡M:A镭zl腕侵<lMAsY<6g#=[+鋫柸KB,p糐. HP<#$}战6%岬8) 褆.忎j>4 飖Xp5!&\s*K硸O莑炥1dwEv妹鏪UiJ}嚯n伔俻務囻"跏c噯鶯n8瀻嵡vZ蔻j忭昀)L礗概&h@%l垖畠棽03. (T 典冯雿sz艞 Bcn/!Q:B '>dGM 5儦8M;JL赡倮}LC9欹輍癆顟X蚞qpD{奛摥q礕埋窕 朿:蔊[?bb$聼P轔鎮螡Mh輲 |-8鶣柬A-\.5O+柜e$桠帩!2熲產X2@贷 許.痠jZ諛躲k,枆.陦Ccvr%钬 [鈳鯲贴均 $-瀛忦v痨噅ke曗頽贡,bK踧92OyΥ 沵<6礇臑–銎嵩m8Τ瘴}^糍MRTCTo-6 8Hv>齃R'╖z梱涆24譔汘;禄床M擛銠5K頚淎箵巻4勼妛佔 9h薻袜@ 躀E﨎慲鹈 棖G鑃/蔼瑅彊-sM彋X(|eF烯 汊<%lD鋙毕fI埭v敀7+}輀桦6逯罅赽7准Clr 凳嶡摐7谸0Γ慁螫+标16柈栗vk/y麀诨%毜竣ys[9f蘧,x囥C濳: V圚N%f%+)韚*幇磚姴蒽sa%Z tY廱蛨Z4浕揌乩a螩m簓l.溤|紃&d+&6V%M靐)╆s 焛m^蕩搒燚>爥暲q頓A]x湟!宣芇aNm獥汗;] 潗}:(萹"F>妻緉] C+Gu傊F'g 淪 h 3婞躪 6%鸸 V匪!慛!攜镀冷f&rx}陥X-*¥KBq叀z婞詫涟R彭凸攼!;╂#"G 柿M埔a瀻≥KP縨?罠E狓'm"菶f|"H S筘靕砚'幑 % r玻胨kY檚季,H2V勉!房)鱙`<~尌髣灼L陮ヤ髮桵湰m#,ǘ暩@屺[礼眩狵鐧兣髮肁+p鍐囯憘s*#6測'B C┣*=V諽P+-{幣貨訪欻N再 #eB`M2Hr thGC%玆舊A:z巃蹛/x粫CI舤施5O 9Z揁毨i踤Yt銕';9%濰豧ybX~g{僥G嫆xy柨 /+ 奓 YQ<']3O;簂T(愓+N|挎 UoMWhLP 冩莚鲨F耒:厡櫅;澢w(妊"%o啲屜 烅奘T嶎績?粤1贊zCc戯r駗RbZ馊筺*% T衸8獷$抔槸8巕蘅57`协)乇鎇H@ǜ茂 軨NX[G韧[(憚\︰罍e 箰栥c0慣焌]棢9UIJt| v&喟剐 *亜4鐧僒E⻊龖1U?溋X;0dwO ?決Co1e嗛)M裖槮芑饬䴓縈撱呃c琮@昚澶Y箘P時囙㈥0,嗭弒"> A閲fD㑳 #偽峼D选cS晬騇x A旴聇;羶蕷釘e勅yA>诞薱咔弎(#鉷@Qi嫏琏'8U鎯密N$^=卐e |%2蔄潅冼<灣{\後桉闝譣08乆P8T偻(]bx踴爬堰"[瞆适@r⌒钓瞻8;贑髉"/0! 蕿怗釚惽磤 NdQE}抒D#'R{貵D埻0颶髸T5g 埐`孏 襼勼*ah+$C衘#.轢q葪禶黩 u 莹黆檚O 雺.|( 搇掎.p4D 8浃*敤e哸F鎒韚Z2犳1闳獧醫G8"滏癈[w獪椦9烤zA恎`򾾮:^昂骛鰦[癚8螝 fk I印琌$黽蕫D彊J`鉂'⑤v麚蕈I{8仨惂挥s=郔$q湷3Lt瞺AA# X 栺溡f 欣僆=w︿棻凉$,RL鶛ォ3Cθ茋捴電鉻4'?U紴締釆<+朾06X,棜踧聐穹栥hhX's+鉖;灯Ⅵ;亅K咵Б[籓0QL食ZfC+俙瞊(9.呧3曁U堹Qh}h閎ο魼霥e溫騖覜i)翫C M敔$匰x'.櫧郈s"udeA59r俒:崔'q D o傀7颁易N臸鏁z俔骢酣1柊軕鳯II 暐0Q矎g;3乱夏g2+T枌n輇嬲w汊蚉霶:m揭p"+B{緩滋昒6n饑7鹃 齒=荈:踯xэ蜞:<弢1Uv耬G倇Q 巖倁M29瑡tP^V,/鉑 wM藭VZRH嬏欴松竷5l敋\r磖荄?踲e0>諩2g_[纁U睇膀i錳莵c>溻~媎塮幉欧犑み1鵀坸IXq7啰'm VG疄e{任酝頮P7啳c铧`X毝95葢莊F潷mG?搮r軑西き蝫磀旐N潻泒盃nt猚铧酁Nu蘐:H攗窌骟d锛洧 K嗱\MD簒罓) rA0例醏)%2<沎Dm闉*5兒J疏槇鼫聰 v|Wゞ`.#棫=O 莕 "/D@X<4C<铳云KJ5閷h;!鍽'a鮥κ%萆!忼"/軐'F捣烒;?晓?PK 蟥CM4 sebastianbergmann-resource-operations-4d7a795/tests/UT 挼[PK 蟥CMCb鉾N sebastianbergmann-resource-operations-4d7a795/tests/ResourceOperationsTest.phpUT 挼[峈KK#A诀儛j+ 水h2S搃渢7U5穎L偹鎌_啯䴙E弤2ANY匧]Q鰴娟&慭].轄餇右 "皁BV0I93槇Q} rn咄z餖s'馼!繦龀3瓋左湲w淚d袙牗 矘6*烸3E鋏ku "促视哄齴唼~緈ぺ⒙r叽氉J9杤c->硾QNM陙 $Ih矯騷鹳赢隉C覭鏹s| {鵰6%驯3罓簧鈯X`#6]赯*!)衉 竪vR=俘賈C謄A睑巘阐梟o麵i紊 pu膓8\au蘤縢讝擷[舂建n檘9"n模紂 娹;=痯尦u[PK 蟥CM. sebastianbergmann-resource-operations-4d7a795/UT 挼[PK 蟥CM6 Usebastianbergmann-resource-operations-4d7a795/.github/UT 挼[PK 蟥CM9d? sebastianbergmann-resource-operations-4d7a795/.github/stale.ymlUT 挼[PK 蟥CML浡HM8 |sebastianbergmann-resource-operations-4d7a795/.gitignoreUT 挼[PK 蟥CM羪=m: #sebastianbergmann-resource-operations-4d7a795/.php_cs.distUT 挼[PK 蟥CMvT^: ` sebastianbergmann-resource-operations-4d7a795/ChangeLog.mdUT 挼[PK 蟥CM櫳r35  sebastianbergmann-resource-operations-4d7a795/LICENSEUT 挼[PK 蟥CM_{儎7 sebastianbergmann-resource-operations-4d7a795/README.mdUT 挼[PK 蟥CM6<7 sebastianbergmann-resource-operations-4d7a795/build.xmlUT 挼[PK 蟥CM4 sebastianbergmann-resource-operations-4d7a795/build/UT 挼[PK 蟥CM胪顀J@ 韥zsebastianbergmann-resource-operations-4d7a795/build/generate.phpUT 挼[PK 蟥CM綼~V; +sebastianbergmann-resource-operations-4d7a795/composer.jsonUT 挼[PK 蟥CM2 sebastianbergmann-resource-operations-4d7a795/src/UT 挼[PK 蟥CM6G/iH <sebastianbergmann-resource-operations-4d7a795/src/ResourceOperations.phpUT 挼[PK 蟥CM4 kJsebastianbergmann-resource-operations-4d7a795/tests/UT 挼[PK 蟥CMCb鉾N 艼sebastianbergmann-resource-operations-4d7a795/tests/ResourceOperationsTest.phpUT 挼[PK 睱(4d7a795d35b889bf80a0cc04e08d77cedfa917a9PK!a磦4ttEcode-unit-reverse-lookup/9fdb38e356a0265a2dd6b64495413906b9366038.zipnu誌w洞PK 猿cJ3 sebastianbergmann-code-unit-reverse-lookup-4419fcd/UT_篨PK 猿cJ75== sebastianbergmann-code-unit-reverse-lookup-4419fcd/.gitignoreUT_篨/.idea /composer.lock /vendor PK 猿cJTf: sebastianbergmann-code-unit-reverse-lookup-4419fcd/.php_csUT_篨}U薾0见+r(`铍惁@ =枭宝VrW!);.-芅M*钾鋵腐馘楋}/薜鬢_F2崨泧拖阗򅆾碇k"W>~k嵟pZ-冏俗麍!営 伱镇'焙件糥x寖ёfo榋乘?=媨传n>E} 纂鞣觐鱿磔貵a務qx銀浿慾x豘TB嗝駽崄O豴塵綐.N5搯&v*5F3糁U@g4[ 趢-N]G5%HschW渟珢s魻;蚁v  撘`,m罜蒊咡!鮮%榺R蠮塙襉諂獯圡y⒁QY>犠Pp (続y鸟谰)c菎Hf78 疄' dzQ "V!H:雚 ik瀣H艭P#U+_*m﨎a]D觾 : 篰靝H頔(琇3爔Z跔vw七鰴%墆刔憶L 劳"a餾 3彝勅G-蛧絨s胸棟暠=溹!%~I箬x徆俒DJb*瞰g.爉s旯=t欤:EF橄:$;箷ue\/苈璍|8盡倏13M毐冉&疸虗曎flRl躃鬠翤掕χ簕蘓顜%r赀梺z偋G辄4u曔唪 PK 猿cJ縶z嵰p> sebastianbergmann-code-unit-reverse-lookup-4419fcd/.travis.ymlUT_篨UPAn 俭 >@贘!盌0餐J黼藮n玕 3#g(〢屡祝:讖舮酤铀礍諆項>2?A 9m/~嚞柢; 蕤ˋ# 験YQ糱轈^bF!葩蜃瞍7A撓!Tz 團\娨窾$:樁擯瓼'}af秐w斝米躪h6ZL似2疶婢竀葴+l碨凣>剎蹇U|PK 猿cJqゾ? sebastianbergmann-code-unit-reverse-lookup-4419fcd/ChangeLog.mdUT_篨%幩j0D鼹o殏麳頛(iih? r-菔"驎愪|輛9g嗵48$巕奛1H4嗼5鈀x=赡-$覚hY|鏫Xok簜2肍.,-紶尉噗o蔚xq[f?嚪耋鴝:^鎆覭纵秱Ct瓑K稢蔨孫並玊觍h嚻瀠孔糜/n0Z薞〨紀<dL厱PK 猿cJXX掊=: sebastianbergmann-code-unit-reverse-lookup-4419fcd/LICENSEUT_篨礣Ko6倔W 龃)鱭h乶Q敄泙,$瘡睤'D-;C;蛔截4圀絝辔黯4簒?;{瘙坑懕&黥醕w魁螂秣G陬];萝NOC;庰Wx葵瑛|$竃o1~8@0賎巯S秝!Nnw娢徯=渹7B皈┏閒缙vz兘焼惲珛相鞳 緒{椎怉;Y8趇p1帗q=鈙衩"柔郷蔌{GM丵觍銦屃O鸬~脌`8厛b 拜*]b0:沘8 a\閽Н cwh輅зw5 譓衇B]?@2晎邼;砌}B?c+ m磽kt置賅e]j$鼙,)嶠$  ?) , 陴`o-m|磒瓽暩o鼻9戉黢&Y$G垩&a煟龤h嚻6卲鯼朢儺虇+x^Q蘎@^J.杣YW轛F蓎cjベ驝*餵 怏Z V W隦"+^)t彩甩愓"6瑪+i饳┏D鷐*_釵>棩4勰 M匼822oJ甡莰u惌B昙鋜%##圙Q蠯^朌犬.隡%I康sヤ驲@"B搮T"7滏rb 僀y%䦶珽. > 袈6籤j駉儚_Z鹸M刔佦Dp$yD$c 簷k#Mc,旰H9ke.'V:呎h!冡!0)龎误FK 6伯頿LE睖ck懧d朄)償}洢纚EyΔ8叀1睖迄3涿蛵G Q鍌5w8*╅伂裯8r62:o6K紉$樶璧棘I,_^鉃/PK 猿cJ蔥 < sebastianbergmann-code-unit-reverse-lookup-4419fcd/README.mdUT_篨崘AK1咃zP≯谨戛愨!MfwY櫂L旪鱢珔*蘣`嗺蜣穪O]鍫]蕝(騐1Om詣) Ce1揘鈇d8秽DQx,P迟嗬Em寁U,2)敠=e夭壋q婦筀Y^)<%bO鞏鎴Ej棋TK荊檽/鲹j*I菹r'y銎牻欈k葎B'[4X頾8 氙 樿Ol_7Q4Cc种靐 + ~奏PQ敹蛷蝫擨j鬵4A縼\鵹f郝q玈5芽殅PK 猿cJbx0塇"< sebastianbergmann-code-unit-reverse-lookup-4419fcd/build.xmlUT_篨厭罭0 嗭{(釮(8篡awx,qKX欴3&飵郗b-*i具韠/v愌判颧嘒) 榟]觫炲j龚S師`H軨#T 嶵咥 是-I .堾|^.瘹t頯n楲,r0:軟丕垚e礬\嵭 B揮⒀靭鳺捸绛袡\ 1脗a]n漭螰#瘀汾q8摥髉哊|4跧QWs棴N曁J湽 H邴#=w馑褔XON炝>咊茻e!嵺Y(fwba$ N+J叏\ 溶Lvz撳аe@ 陘&劌:箛禁 E祬|]2磹幫;泏54u>蘸:緒PK 猿cJSS T@@ sebastianbergmann-code-unit-reverse-lookup-4419fcd/composer.jsonUT_篨u捤n0E鱸(:— 珚v $癠筷E傸{傑厣=sg潴 要4UX瓲蜇R 3挩E 忚<i蘥凑谜选gN 屛器$z竟`鯭,乹0p)4傎CFC嬕鑳嘸nDnZzr琠5虯蹥誏裐tEQ 嗂栗鎹<慦IceS0鐡1<潑筶n臿=V!覯TT萣/栛湲畎氼雒i;&p吽顄玠藴輘絸v藌~貅tx泀)藖缠MIihW"槫+j嫛 妛鞅-Xx 帠犞Q8P_(汶9暺.噟鮥h缱滫Y?PK 猿cJS鹟> sebastianbergmann-code-unit-reverse-lookup-4419fcd/phpunit.xmlUT_篨}捤N0E鼾娙{怛扨U牪岜hl{J,RO擈8iRQ欵$9q溳n7u,篭湩S憖觝扰雑qv#n婭諸Mp枔H;歮涉nfR秏浂)y1潪索ギ`N#VN儤$7> P4炖G詩]$臠觌045 +9.穌"KD&霆膳8僞X2蔺CP橄<訶獨r睅o^rT裺fo死p寖elj灄唬;<|/ ||<觟糋V曗{|苸5w運驿>48(9>'Z桯0詪緫q薖炝蘕氀'謐煌E責l洋欆#C<荣U侄f﹎坏%N坁銜婲`Zx芗嵢/^;'蝥徰蝚?s馼PK 猿cJ7 sebastianbergmann-code-unit-reverse-lookup-4419fcd/src/UT_篨PK 猿cJ廅Ge A sebastianbergmann-code-unit-reverse-lookup-4419fcd/src/Wizard.phpUT_篨璙Qo0~席窱H$U≥雋Y划*裋j;韥"d X Nd;T墼境潉 ㈥妢鬏w邼9麣-2镤葍#x^p1O?cRCC楩厮=+ {I汘食>y'? gLi|C9_2!郘昸励#>7紷報$賝社 LD愷""N鍜i瀶cd炊怿j鼺稺作O室 ︶)埜覓蟫紃綘JEス 裦bX焫瀈KTE妟牲鍔虀逩楊萬;餒#她BqA~W S 貖駝蛨俒}D囚sjC呏'胐潺鮻 d[1 LJ龌X9欎+:N阦ⅠN凩!*厬%岅07MQZ仺oL:铈 ewb(痵x\9な鹐蕺{癸痽o蝴邼 .g4綴ㄗ 枩/櫠闡壘+D愉1 购夁2rGz菐腆莅鳇苡18輦J3鷏牤琙jw嵡m里vH袽}Pca绾Ⅴ傏w+6吋肊hR|O4矮为d倖u3覔︼c3窙M瓻 躕3总 .]G`鼷纨PK 猿cJ9 sebastianbergmann-code-unit-reverse-lookup-4419fcd/tests/UT_篨PK 猿cJ|鴈xG sebastianbergmann-code-unit-reverse-lookup-4419fcd/tests/WizardTest.phpUT_篨昐Mo1斤瘶C$>膫rmS殧倐Dh埜 z`,鲋C?薇棩姅ī/^吞{筠x鲫sUT蔂汙枀r癠%邥f 箲榸(祒@0-峺騏晕;袄峱/hw{5\&v /qx翷*毒,笰跤猐A 磩R濞+衃c鱾斞=↗;(盨8茼 ,414坵e誂屡1鎄^5剏樜蛛< 襝疹膖蜤\: 4O~ub 熯饍%#謞嘥9 緝C攐映[4E橼鏳8Yv7^迆麣e阂a綂,汱gc甧躭:绡争о$o禌&吔秆r4锡~凍-x◆nU牉氷 逺+琷棴鳂:追zp鶌熺PK 猿cJ3 sebastianbergmann-code-unit-reverse-lookup-4419fcd/UT_篨PK 猿cJ75== Zsebastianbergmann-code-unit-reverse-lookup-4419fcd/.gitignoreUT_篨PK 猿cJTf: sebastianbergmann-code-unit-reverse-lookup-4419fcd/.php_csUT_篨PK 猿cJ縶z嵰p> sebastianbergmann-code-unit-reverse-lookup-4419fcd/.travis.ymlUT_篨PK 猿cJqゾ? sebastianbergmann-code-unit-reverse-lookup-4419fcd/ChangeLog.mdUT_篨PK 猿cJXX掊=: sebastianbergmann-code-unit-reverse-lookup-4419fcd/LICENSEUT_篨PK 猿cJ蔥 <  sebastianbergmann-code-unit-reverse-lookup-4419fcd/README.mdUT_篨PK 猿cJbx0塇"<  sebastianbergmann-code-unit-reverse-lookup-4419fcd/build.xmlUT_篨PK 猿cJSS T@@  sebastianbergmann-code-unit-reverse-lookup-4419fcd/composer.jsonUT_篨PK 猿cJS鹟> _sebastianbergmann-code-unit-reverse-lookup-4419fcd/phpunit.xmlUT_篨PK 猿cJ7 0sebastianbergmann-code-unit-reverse-lookup-4419fcd/src/UT_篨PK 猿cJ廅Ge A sebastianbergmann-code-unit-reverse-lookup-4419fcd/src/Wizard.phpUT_篨PK 猿cJ9 =sebastianbergmann-code-unit-reverse-lookup-4419fcd/tests/UT_篨PK 猿cJ|鴈xG sebastianbergmann-code-unit-reverse-lookup-4419fcd/tests/WizardTest.phpUT_篨PKQ(4419fcdb5eabb9caa61a27c7a1db532a6b55dd18PK!!.襒襒9global-state/5eec8e48052fd6b5c9c52d704890e41edcd90f37.zipnu誌w洞PK 阔?N' sebastianbergmann-global-state-edf8a46/UTY賁\PK 阔?N/ sebastianbergmann-global-state-edf8a46/.github/UTY賁\PK 阔?N9d8 sebastianbergmann-global-state-edf8a46/.github/stale.ymlUTY賁\昑Mo覢禁W屧 HT〩>p)桱Um9 剶=帡畐脋翠唧f譱JDK鼓尢虥yo啉埼:y党48O颶OBT嗛勂7,:帺;7-J"gT}NS藶蹳节yju躌eR.BHL鑠晫䴔8D蓙 |盦96t秥u儌餖3.p_顔#EG2佸プA祮kv稞1J$si郮鎊R[瀜hR6)c肚驭H掍yR"怙悹fN鯙怨6鬪8]鴥A愨Hqd宖T&l索P@;t 鼛侮埙6鈏/3FS畳悫l踃韊>e糈妿3m餚b蹺z芋爳羣;俎勿W%#4屣琢N趢皈]蜸鐻FR詙筯鶴*婕 z&!-7t/d铟嚃;4b迬pT鍰#Z燡袽兀Nlq窆挶u稚駶嶅蕖n鲙蠔凫0屐踉釁鱡,扜ミ霉甂辗蛤;诤攚O/奮玫伉P?莒頔 ﹑葐 J鯜#"鶽 嗎绫匟筑ゥ眺?u5鷹躧咤:.鮿zQ>~q卩8㈧&zwr含閏1粅孨棔戲+鲎6r#:rLVegV⑺ja陋扏3/SUPK 阔?NR靐=M1 sebastianbergmann-global-state-edf8a46/.gitignoreUTY賁\幼薒IM湟+(圤.3魭3R!芤继舰遭覝榩r~nA~qj慯N~r6梸Yj^J~PK 阔?Ns?C >3 sebastianbergmann-global-state-edf8a46/.php_cs.distUTY賁\漎輔6鱛J磁=礗鲅5@乤纸eASg E$eGw0-;&6/蓖邏笺蒿>t鹀喏ULP W苆,眂骖wZ 桕浇?Pn供6\@{猰6晛55朣鵩+詺奧芌 疻+v]}:,V縺辷T赎6 鼊捽 墀VJW秴j3Q1諒歰[[Q賂3w;j箳7U/鈕;{/髹趋~鬭逑g[j=5U脻b肓BS砉mq蟦誀. U{穁i皟栒焟<餲糤r梅o2 ㄐ挣縒靇箍 緯勫侹 LuH[Ww鲿{型\k:.膞邓@3"熨c肷椱碕埴髾袣K狦性*MLO ~傯,馉话焀尘蒨钏牫c8禒驂x胙M$砝=g湁袃xM喛爈礭<逶dJZ.拳抢. jPX授2遜W$C=L\&J,F脳佺鯄3弍1榌5縴輑>花擒揖E救-D .猄 ]pG嗢7嵉KA!訤2翼kS鱰蝔l}S豓5頢痌内炳|~<$漸 $U6X rW<$9#Z"懲閆O,-蟂>氀h冡g.穪-攧C垹kQAに 7焝Y挒f拒驏5a#,*1垂邦覟bi'欝巁 !儫$櫱S<:K舣捁&Y熔*)7s藶咥朙! 惎薳Bm9渇㎏扦1褭1犫/x寋H梌8#6燗3WGQ玹w鈧貰兓顡P买i@WwN6藦簸skvXi墶⒙洩大y= U;4惷tu_弝>1磅+o;|p愝~綻:被j戀{鋾簑婌/奴15n崾{饕1=PK 阔?N|醌kH3 sebastianbergmann-global-state-edf8a46/ChangeLog.mdUTY賁\m=O0唚姄泊Hq2 矔 *蔞U娿墿c[禨T~=棪厖>葑椑α蔃繨劏勆m+∮EDZ儽QTA䲡讞 貅A檰b勢缩鈋貘贠](察@1n叶嵋v淲F*1p茠v<琦R樼雏4煣鵯H$(稦感赬R堍WB玱'訏牼溃靰PG'侰yみ=[}衳醃"巶& D欽諤呬辵舁 ;{U鳧岈!KcA[!粑Y?鴇 l搞鵼貘' hW{劬:垓{ }討柼诞7*f::D69珑!岧PK 阔?N?璌9. sebastianbergmann-global-state-edf8a46/LICENSEUTY賁\礣_徻8鳔酴{J槎ow=澪$,厔碀<bv-舊W;c酄壕 忕鱫F籱Ct眇喾磲S坢磳妣>虹w瘐耨帅瘡_~螥_`j晴3\稔>O儖撐5a黳`戳幆稕0鏐蓥:8 n郞阄隈鰚霤o.線臃?E蛀雾莓% 谘卵幗嬔vp腽_趫A鎲g伫56?K 圜W-;哚籗堣 定郗ヒ%!儚ng3,#]螋dZ综q騅 萿耈弘N悂A逦颪b{澬g 遚e穋t!軅N恿"u遻8琄崉;唇%E控×邽D駁@?$嚟A煨岘ネ@1綇矽嗦u鲘 鯴;'>狙/醜w碔冂h縁凇峒M!=槄誀霗Ys%+U?葿0輤Y入誇声吕. 4皙累(9mL45v~H^m@|_)5 鋜UJCt+#呂@Vy矚gP諉時) >3u朒 朆 Р攆擑f襎扰fH芶艜憏Sr獸璲-lR%桲QLA<壥^鸩$BvsY+E (%煐,!7C_+d%rI馷6S|凟(鴴涎谇["鞉'#%$c型Ti#`^譋蔣 $s】辈)現  O両閛t6ZRf(晳u鮻鉣c*婂[n]%P6Jれ3X/+3%) 崏4!h乥RH9詜登# 鋻W担膡4幄o n閔汄瑕歰PK 阔?N趀@*0 sebastianbergmann-global-state-edf8a46/build.xmlUTY賁\厭An E>B]謖浑聉*u秘b4R栈;囤X┞!xg犧(蓏兹峭啻7 峾{}.熶-hN爲鶱aI0蝎勡HNA秴龋fX鐡Lp敾O %;w艫嚒 ePt仱u 孠8G鲖r?I,ベ雔琥R湂w韔T$侔峥 骘<>燡!虻怽 #e耈齉3#;|( 1Cvn歒N3,MmVZ5嫥穵声d?龀$(1N鄫 r獃欓軾%蒋Gl66縵鼿)喋鬒褰6=纠瑟鵘苲;^%J搈獸 FC,"95蓧'/炧i*_蓊齠岿PK 阔?Nk鴢嗖2 sebastianbergmann-global-state-edf8a46/phpunit.xmlUTY賁\晸A彌0咃如.味桿mRUJD踇遑闷x=纯締K唎暛1H;瞺箹3鋎丹=}粼xmHG頼粿叄4ǹ骯岝l鴲P弞n貺#~CC)|E0H硐腮苍]竖罜べ 戰YY~衾&n辫渡桢筢鴔{葖m丙Q祢"?})v,簥蔕K銒Vm舸垚LL簡_h`n貞洄鈏闕0\陫.内K餢猷ケ(凉S8!VP{]佦[瑹'鋸樳堨棾a3'儞玠陟訇7PK 阔?N+ sebastianbergmann-global-state-edf8a46/src/UTY賁\PK 阔?N=诺@ 8 sebastianbergmann-global-state-edf8a46/src/Blacklist.phpUTY賁\璙蒼0诫+r惸淼売,HE[訣/Pe偆ECR%臶嚓"`臋麈虰R厒對渉玒j沓黙x崕"8偀33N邐h 2Cb,#b42!Xb)瀢.q:処}/p辺]"n)=丸E弩Yj吋R5埲硵 凐"梲A,撯mKF熂邨麤郫揫蕮别D d%枖杅鹉l乢0#K漅<隥$葌E兄0瘔?荠'.懦e駝 $1< /B( * 4L!K瀬 F媱t:b寔:f7|<榹庎rI4se襩 伬/I850嗛 楫嬧箝l} 箱_Q酗氭煜!“酨菦C1a┪焙[cl讜暐W秊U&丌毓"u $祟:祱9,+冇f枓e>Bǖ{;O.z禍v碮朇鼛a9l\膘7ty6禱[檓螬啩雳塾y谕a痑`;愅枼佴貺や=a4单v罿襩葬V铰礕 譖u5|`庋o锤;绡猈甯R碬 奸(I 750鄷;P◇{=)LBI鹰T徢鹁锏慤`懂壜U:?h惟<烀謂:蹨W鬓q9厁窴Lq呌嚙咬蘸泅釺/Hs_;7jg-7鱙='4 ̄PK 阔?N7g暄j ; sebastianbergmann-global-state-edf8a46/src/CodeExporter.phpUTY賁\臮颫0库@-IP黼J;曦 u*74;;I h?螗畗黝絯玟鴀杁0肏0吘6奊fb掰洜:趏>|I竼 2惼爍蚀酟虴:e釦f饜鈓0"諀沥勩U 胀%739R&A坰! J偿怏3x爆渡2dQ 郹皢,斩磑櫲1▉謥陮*涁皬莄饂fHBq鎳^G嘵@盦BG=a7敾軬幥敕m铚gS亊)a#欶筞>瑣Qhr%+uEHy躭G1鉛峗lJ鹼tq鷡4︴盏s! /F/t玒醅昭譊7h节rK% 鈷徰/輼z伮\':裩鼛~駄<%戻瞧+~Ko恋髲玬炢譊弱DG>:祒缚i啐齸V鄞籄劐2ヘ矠悍WivGR,蟁i梲礻鑊t衛V)7I!gH寸l騬6Q脆哐w鳔畯 JP 飝{逢q衯?漉4M胖槎諡滐腘3 \4Mk猲晭WQ桶蛂/盯傞m< 嶎3R3j矝;[鴑6姶閇坯藢費j鸏4C'PK 阔?N6丘k7 sebastianbergmann-global-state-edf8a46/src/Restorer.phpUTY賁\璚踤8}鱓L;凭6捣I 恝.-,ndIKRv硧)阞塉l"嬩虦9s狲蒿Y斄儤 簸悿 Gxza鯏贽獺2'婏疰g橯{01d錳鱿jc瑉~m杧袴貫駱璫l霑)暽酚闁ㄌA簺>鲳W奡灊歸柉)v祣Q0鹕~Koa=a閶)駛'汲eゞ?)σ5鶁慵~ 怭z磞餏邿錊噙9膔hr扸 吷旹i鄆P栤f败貮 $Y伔dB扒諉嚒W+盆~\274鵃y]o;辴>阅軥呷B洘U燤b]~2''va砖A*覞# 煃|QH?J'h0襑1蛃儧味沵Md{礛鑀缋dn}X碞{幈C;]肚<;于|6q恷~君z}u(覀栚栩央p6浟葹翛7Gs朵蓨n憖#;1 b狿蠠坦<廀u箟c%挹敛-=N哾腌潠蛔$媿藥`L7媅kN戲巙髯I掸o*%u蛔aRs5X躦)脜1pU?僜L旫=3降旚 0啇=/%蚓-骿;$c詁沵觔毺-+趈M第#F+谟,牿益4y 0洆胖^6種eIゞ镶]I=P-魉oE鯫’(EU[:蒠+"譖]J嫂$<悧~h劄z贈JA<"坝q媺┦矄踞f 缾J勫2=婈c眏i猸畓 矕j7珤祀Zg蓰夿髗{T愐d掍鑚 ()MR撔瘭挠邧[=啜/wr钘7黳i 瘜覞jsZ^ 丶nc胂g/w廚`氉私[=齼6秭m辌y挱cyq缄J\'幉NG泛壑;趁捤r躼厰点落飔=5辗垯:筧7w换FM?獗[郉ahタs縵f繴孨刡湕gI揇1?潜>^?= PK 阔?N)>)7 sebastianbergmann-global-state-edf8a46/src/Snapshot.phpUTY賁\軿[S8~席3LqZΟK閞傩a)]ByI槍(腫#{d蕁{$俨,蓭輢X縿如\ゐ嶙|暎塖蘃Tp柲|茻rR 鰓h]瘨-摂 1([蘱L黠襩幱菧z臗4) aw鳂R鬉s佫&倈瑇2嗻姞e櫐(悟'栜8聇佉$&齮櫛{虛岊<%(.蜲G熐#!J薟槪G\燛"洍,衏耊)矑-ふ婏I慶X訓讍O?I锹艃翣,|4楏?I摊2厪屬:禺H\<:('啭代=20迁8/V 7裔梨W4兛+瀅t魛:Iq-匟T3g華垠5眂起摕Ut僘傜))!氒綷JQ鎰0 獰 缯&A垞鴺W噘TLB1<汯堄rAg涉文(邤Y襒漭>p聳怾; P17g8轸龜,MHMF(窊卧P巍::胕⿰_H&#:u祿q*4諎31^u鵗 絮VrV鎎k謯.:鳍/周薫ur稺5馦髓m1* aZ|湣猨P廱隬忄8H嚺斋翤u榯僡峘隆 朸醧S諧k騘∷Ξ珍k滦在贼ɑB慃姼W`]B)跂羹iN^祉, G@ W崐  z葤卐[k串蕽4kP"k擧 &R嬰=9敿犟'p/B緖ギY║4D<"煺uG嬡霟#`琏藫銒%,偈寮雋 幦;z笃$fXY {瀳 }|uj嫑1-K摽e!熘斯e响痦裌鼴蠗鑸f -r昮+-jCF唧4峒y[崛銉5+杷F`4m|趇佝+('?,履7襟 諢)憠#庵糏W 4::搥\o=旜7儇蚑':鼒pZ:&0R脶0狫:!苘&5銗{澭逿 d鼇'djqj-,秏﹝*4/,兘釅p@涿,B(?塤怐{1窣0=阐}K嫥Z!oD=ゲ 窭A问%9餜<2=>帯 >葂$嶿o膔H淾R%F弚疧fm}崷墝樗 i食g#9Ae傋鍘藭I9哒2^ZM [Ty^W掝秞t苋6熸G罇#;逞鐩=k硭屮赮4r譔//?9算颜丸蔣>;崫斋_G-}鞸 甎 !'+1哻圓-/聃&tQ]晥D砑 Q縺 :D蓒妣岽?B藍吕y踣wqLW暁聇D_o凍譛Y欱3iT熑5'8盆)d矆槊1丸觹V莪③v忼忉飑C詰[<刓"甒,{阪沍fX韅+5憧lf惟▇ ay蜣s嫋矻1榽牬 躯<艨ix鼥3楬榟9騀廲h^隨鑇&c#j-!3滇匶z軍PM鍧4佼4,&)'詪$儋 箽[f>:/氺痏u!祘厚鋹6(\>4HkзlM椆<Y柉3TTgy壓GE孔MRu+ , 絜脫 杫闦┮騻j酠2Sd僨? #憛?Y 迥i淭B殠xl癡6T6%炞麓_ひ莐赮?PK 阔?N6 sebastianbergmann-global-state-edf8a46/src/exceptions/UTY賁\PK 阔?Nch5NC sebastianbergmann-global-state-edf8a46/src/exceptions/Exception.phpUTY賁\=廇K1咃sl媣褴狤YE/隥恑2&!檜-7YlO3锿>喆肈,壍|)R窘Y颰砆皝wzveFLLG搪铔羺#弘,(-鷍Y5tg厓總祟媔^|/忢[字W 琗1冡Z8 榊l箶"9LIS 2 u<帞#栞咟 紅靔艥R靺R_曧乏Xq詮鶸PK 阔?Np樆J sebastianbergmann-global-state-edf8a46/src/exceptions/RuntimeException.phpUTY賁\e廜KA 棚)r碋[<服A"氡 長樛 摤m炕硧砼S%/秣杦雇菺,t刿3橥鮠徭SS鴋Y♂HPg芺P冖Lw1m1^熏 ?侕:佸賣_s{a糊<4}屶S>薜("{窑摇q扠葢癹_L鼹蚋z[瘑W#h癎吚C眒o`现諱-ⅸ/瀓P╃N#蚗3 | sebastianbergmann-global-state-edf8a46/tests/BlacklistTest.phpUTY賁\誚逴0~蟔qHmP頃_*!M ﹨_垍隓謦M;6$PTm%J铑伙;9黌dHL窗豼dUB胯w籁w醴#貑q#鸪 O羇,)a:弲辵$髫邍t寲p嗹v*寔*陝髺F褳你E0稝BZj I^痏YS爏苠ν賀vZ轐爊>V奬O!|伣慹7~D赳閍鵷鱩櫬 灻蕵fssa 坌w9-W6妥JO繎鍿弨l#▌r0x蜷si輊?x捂ⅴ銸薻⒕#糡禉0亴淆<->g^qn-髿仇獁t荡'7瀘 巣{蓑#PK 阔?NQ.奦= sebastianbergmann-global-state-edf8a46/tests/RestorerTest.phpUTY賁\鞹裯0}蟇車I J非0 ⒋戟A2κ$7莫3蹃ⅸ緆'a磦旾輀(骨畿s畇)K31Lch懡畴 M鹽4h$.h蠘稜08c苧&[sL4峞彥轆篓悛zㄧ &%渕P]馔%非1vJ虆襚S$"暛5煣槍A!~(絗+賭L K+]足;蕥)嘲bb涘cXq浺j抹\GHD盬 $[犐桔(瘎O嚲潜k4r⒔辜% M皶吟 'ET歇麕簯Z60佊Tu镃棊,载翀眃橧曱&\22Y0c牏w,守@誏+ZY> 纄L[捤萫@C`oR(豾g叺彴T<鰳橹会鐺飢4磀骇8mH榩f,害餎秊顔儔/ⅴ飊滇(x 顶n4Z辘j别訙頢kJ=蚔e\璐4狸咗辥[RS蒖I躋鸯擮O鍥p锡s虞霵怪l}商g\鮨?s栆w姆鴾乡x0_a饚A8斘ME∟蠂d婞 v媙讓甖@樘徦3w%-蔚W拷峰-繵0铺嬪掿夦1 PK 阔?NⅪ >= sebastianbergmann-global-state-edf8a46/tests/SnapshotTest.phpUTY賁\礧遱8~绡蠧fl2ぬ&%聵6sL3惂:Y祳鋼$箾夫/l襐/F杤鼷綸打?揢B"$5芊`9$^urNf+aI,$'鳯b鶄ZT鯒R/癅例文g]2-w怺n枏T)虮埠粮!庾呁X+N釺J聇騜膔劒圚粮_炮r汸|W!/亣2嶴G癃覫1熳蟔86h訾蛷p-裊秪蠫秝,!5<紩旪悎慓w 笁漏>&v$┑5*轷铣|0芥茠鸢б喝 苙旦(g虑BQ谈僋*,垙餲*菠T扼_囙瑞箒阎詯毞靘?{&F19[斔H-_欣+8U陶3'~鲯埐My$7蝄礬\W^葊(蹗W冯叼.癡7;蕚 〃A'N#厳嬎恮J94釷f續鹛x /M{[,蕽墿醇G坤細鹔勪螴| 涚~p降 淆w找#n箿艮n計蕑/磹K笮躚>紩譏i 'E.~吙稱镡诰蒰返FZ倉?=9锸褞z 崱/煩龐盔蕨蛇访蓆6骙0滿镲f佔衻m搗颛?Mi圲Wo狀 S T痡f嬺屗[a C<.N2@檗塝叒锚k彬W混U]~2;M:="M裏 砋虿'Fx寙壼斐>燿諛彣釤摮M:SQ *jh[5輚(磓u屇酘s!y8 sv'qh9)h塵o唯斁魑K庽s嶑]鵮螪釬繫^鐦zS津槀龝倪騩Vl卥籨k応R扄袢諍{絾飣礪魎/挚煃冬緈鵿8Fg&S純嶑冦7煶mj镢\曌|>緵髖{兝汊 ]Q>眚筍 鼆銛瓐.9虌/O;=[~.wkVn垬鴊臡q0貀呠6q*樰擾5V^;嶉v*P(鏥劕ZH糈PK 阔?N6 sebastianbergmann-global-state-edf8a46/tests/_fixture/UTY賁\PK 阔?N菗{O sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedChildClass.phpUTY賁\UP羓B1肩+雳*=k[QJ/z蕷3Kc阐猂蛖T¨厵潩櫇=g熈 Xh Z仃嘵2摄胮j&##貁h8詸(匂('噽頔Qi\;衫as輤暶c勝M5md;z琒M財/^罇丐rD 聤}1漽蒇雛蹙Yu瓣Q釀幓b鸙闪壵W懺K杖酴'&鈶$c舗莎羨/}荕Wq%5煹-45N韌>鋿瀮[(潟Ⅺ蟰匇6?PK 阔?N嗊婘|J sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedClass.phpUTY賁\=怬k1棚s鐰閅EK◆2&愁袠勌琕J縶硧欿鄀^揎忘% Y彊F瓇9<=巊樌亞=Af呚EC调q圑A暒e痉岇觌,(蘯捽蜘g媑3hK衪迌嶉測*`p噘R悞殬=$OX#觟饈/W燉jN(喔/峨淴垓R奌觳晔<$,趰 緘:謢彭咲1es"梆h縸!缝髃牅旟X,酗-堋^@f嫦PK 阔?N觅}P sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedImplementor.phpUTY賁\U怉k1咃s鐰z种b"擽(1檜噁搻蘪ヴ縲vQ」$L嫱替㎞嗳z4(捹失暓轻訪FF碍笯艦@飫Y VPh廍娩嚆鼵k'!l盃|h0樰T/贳柋g媐3HMP缔儘闇鵓 `p噘R(獦庒'在戦噪拮復彰J',喔 秓淴j %顿篂zb6Tj鞦~呓7]妮枈[贚Sctsダ拢闏n(XCA4_;侾赛袚2u0td w(堠5PK 阔?Nc_'eN sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedInterface.phpUTY賁\=廇O0 咃>n有&!.輖r返H(q)饪揤t'K晓>6!m1"Id-r U躵倸-A!Q匢]裍_〗O侭雦?" 絼r線=纽C鏯{俜w,kCO萄G悥狀砻5r 3`Y揔龠>v(燧K樀/廪N/圇0練翵&0<珃!K7笻騷詳嵦敽P;J硋K>考N吮忮LI廃-}R靹b=R{孃觙/2T?闣PK 阔?NG sebastianbergmann-global-state-edf8a46/tests/_fixture/SnapshotClass.phpUTY賁\}扱o0沁0 RuE{M趎Z昄應叫乏B翐-鸋M; 泶都骥筝条W;hQj岜鋾猛椯"+/2竴嘵钄F嗷灷v仈0錠跢柘驫) 3哐oa \O7;EW-逓湑魼=B7j 液僕蹫@磼h7濙 e%8崅譾 魃籣-V烁Uj杬AZ5#a {E= 翈^"jS譭f膧 ^:?7均2V1怄o=.矊'TF感[簨o贌 鴕^順8%酳l耹蜱矸8﹎嘟搹O01鄧)邍恗~·懕醓焿n42樛agU浉鐖 ɑ鵿犏駢窙汲髪?*絩S$>薓弭奧謡谽]魉簽齩M摴楝CS潼_退r懒鶦~ 瓜逷O羅Jj友-y處賍PK 阔?N㖞沨M sebastianbergmann-global-state-edf8a46/tests/_fixture/SnapshotDomDocument.phpUTY賁\MP羓B1肩+雳*=k[i誖(<廈Y搣&悧勳*藜GO 3;3粁N6!1訄%;-_rN膹愎歁L`kC)哌瓀(谸c9C菐犔圛 t惄,尵闿h演fA嵯挄^C}a3@颽U=哐砽 =黭!乆俷tt堢慕@o辣&煁匡BP8垘癭_L英{{9|試V, L樍餦 L,禱J皮%u<#鞖簍姧啿鵞艱;$! c禔歽S?闣PK 阔?N' sebastianbergmann-global-state-edf8a46/UTY賁\PK 阔?N/ Nsebastianbergmann-global-state-edf8a46/.github/UTY賁\PK 阔?N9d8 sebastianbergmann-global-state-edf8a46/.github/stale.ymlUTY賁\PK 阔?NR靐=M1 gsebastianbergmann-global-state-edf8a46/.gitignoreUTY賁\PK 阔?Ns?C >3 sebastianbergmann-global-state-edf8a46/.php_cs.distUTY賁\PK 阔?N3e鍮|2 b sebastianbergmann-global-state-edf8a46/.travis.ymlUTY賁\PK 阔?N|醌kH3  sebastianbergmann-global-state-edf8a46/ChangeLog.mdUTY賁\PK 阔?N?璌9. Asebastianbergmann-global-state-edf8a46/LICENSEUTY賁\PK 阔?N纶YDF{0 sebastianbergmann-global-state-edf8a46/README.mdUTY賁\PK 阔?N趀@*0 lsebastianbergmann-global-state-edf8a46/build.xmlUTY賁\PK 阔?Ne7E4 sebastianbergmann-global-state-edf8a46/composer.jsonUTY賁\PK 阔?Nk鴢嗖2 sebastianbergmann-global-state-edf8a46/phpunit.xmlUTY賁\PK 阔?N+ sebastianbergmann-global-state-edf8a46/src/UTY賁\PK 阔?N=诺@ 8 Ysebastianbergmann-global-state-edf8a46/src/Blacklist.phpUTY賁\PK 阔?N7g暄j ; sebastianbergmann-global-state-edf8a46/src/CodeExporter.phpUTY賁\PK 阔?N6丘k7 sebastianbergmann-global-state-edf8a46/src/Restorer.phpUTY賁\PK 阔?N)>)7 $sebastianbergmann-global-state-edf8a46/src/Snapshot.phpUTY賁\PK 阔?N6 6-sebastianbergmann-global-state-edf8a46/src/exceptions/UTY賁\PK 阔?Nch5NC -sebastianbergmann-global-state-edf8a46/src/exceptions/Exception.phpUTY賁\PK 阔?Np樆J .sebastianbergmann-global-state-edf8a46/src/exceptions/RuntimeException.phpUTY賁\PK 阔?N- X0sebastianbergmann-global-state-edf8a46/tests/UTY賁\PK 阔?N嫋硟 > 0sebastianbergmann-global-state-edf8a46/tests/BlacklistTest.phpUTY賁\PK 阔?N.圞A 3sebastianbergmann-global-state-edf8a46/tests/CodeExporterTest.phpUTY賁\PK 阔?NQ.奦= 5sebastianbergmann-global-state-edf8a46/tests/RestorerTest.phpUTY賁\PK 阔?NⅪ >= 8sebastianbergmann-global-state-edf8a46/tests/SnapshotTest.phpUTY賁\PK 阔?N6 <sebastianbergmann-global-state-edf8a46/tests/_fixture/UTY賁\PK 阔?N菗{O B=sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedChildClass.phpUTY賁\PK 阔?N嗊婘|J >sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedClass.phpUTY賁\PK 阔?N觅}P /@sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedImplementor.phpUTY賁\PK 阔?Nc_'eN 籄sebastianbergmann-global-state-edf8a46/tests/_fixture/BlacklistedInterface.phpUTY賁\PK 阔?NG 'Csebastianbergmann-global-state-edf8a46/tests/_fixture/SnapshotClass.phpUTY賁\PK 阔?N㖞沨M /Esebastianbergmann-global-state-edf8a46/tests/_fixture/SnapshotDomDocument.phpUTY賁\PK 阔?NnaYDhK sebastianbergmann-global-state-edf8a46/tests/_fixture/SnapshotFunctions.phpUTY賁\PK 阔?N護ZG Hsebastianbergmann-global-state-edf8a46/tests/_fixture/SnapshotTrait.phpUTY賁\PK""!sI(edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4PK!D駆甍((=object-reflector/5c43ed184bdc32c1be2cebdc45c53727b61c366e.zipnu誌w洞PK }J+ sebastianbergmann-object-reflector-773f97c/UTOy踃PK }J<--5 sebastianbergmann-object-reflector-773f97c/.gitignoreUTOy踃/.idea /.php_cs.cache /composer.lock /vendor PK }J哂斉儴褉鄘< W 幅4仅P;.姇焋〔釽疔VY+n箩踸>牱H n嬧羪A 埡7Fh醉=n蔞聽<[;*Bg疎g@穹g勢`鼷嚮?>僩(;D厑u罙- 詛+㳠夯饊/緎镀頉7趦"X]偗追#喦/聘T+=L讂a5记胨)^ヲ^韊豙R/w+緮摋24蜸h僔tx旁市) !櫉!稸V恷炢 辱鎢 O2釄;儅銔Q鯭醇{M啷U- .e螜Zl32憹披c|V5媑J%埑Z崰它寁沨v!m澧I揖孙&仲U撕:渦a= <&2F挌罽.搆冹3蔜欢Kc虚沭2竹5k 焊Y"Υ椄@[&脕9嚁倽 6謭鐢籪)KYVO蠫仫湳踩╭媨矍h瀣,r鋪响秾迷;罘1缨z椈i爵,唄`愂 hZ晕'%瓯*薋hV Y騆Jb^心c)秂N纲he眺X}巾T蹘[郎3藏慡妑&I!rh 楾 燲7)铁x%硗7欳zT邾8钞(醪|c<蓾灯犌v 2鱧1鲜8n笧f涝#.l`瑧ec憧c炶Tor鷽& .馡悞g屽&2歀f9O剑,糓v坦鏒蓂湚>c 锠效=T燺嚙嬆股`槚3&8|喅/hWR幔攂-薀傋逄2W<8D醅,垅_PK }J 6 sebastianbergmann-object-reflector-773f97c/.travis.ymlUTOy踃UPAN0 肩9!-湊*x耸M葜RG冻^OJㄐ^b忋彎 o6渱賸s頇滣量 /W Ew?鼁艊j(蝘]x+$E鏵\Y餏Y R曷憦聤jY鲤#& 廪$&p' 殀w B鍬构h墓 +醅o偑i6Tk嬔A'啣I喼+Jh苗詌h*謁 舐2螖莢皻樵墊o7 1澷菂囅#9k3vc承uf休?*趸Y裪#/馗駒v<;椯h鏥縗<襲PK }J把Bj7 sebastianbergmann-object-reflector-773f97c/ChangeLog.mdUTOy踃瓚MK聾嗭+ri厊UP汰璪编2Iι阥7靚玄{'I[$備恉&y鏅wX5╧倣﹨X*趚,A9x梗潡 瞮媄铅xR嚃婏奇枲2e邟鯰佋猷 櫿;﹌~'=u皕\粳7埘~謝遝q 渾*SG9tV闞v奬$D@!,掫6L艥W ?y.H'榗Z-}#鍂鵛:讚嬘yK锃,z?l逘q&:t\%4盾栧爛u+懦Kc-T馼檤矻o唕p姾擮 [^n 4蝽h鱶査矚竰稓腕酘zG愊衂瘥龖乹鹒娋`钇Ь:竭齯z>g濢s气﹠傃Mn|q輰1:?叛锵褔殹凅淅0咉睾t橱C3玖!岧斄珡启螒酢6怉3:8贡1Ncx鈙衩!锐^m:OM&夼蠈'鳴狃 ;O5`/T簡`逊.貌熰坄剄瀪詡岉瘪g?諃\w!糼@wu2悜 ㄜ咑芑!6X}s渘Aч`懞=\|U围F氜憿熿nOⅧ `'$兘A苄岘M@1}.聈鲘 X$2匔|ド_ ki摪嫌~嵈C胑洣殁廉v说p儩R乄;6ZJ僜oJ塦埉ye0*/隑V *eY)滓3D6P X 澂'熕R赸鈁H[![  譜鎢5lj絈F*どK.注!;2倄斥eI勳鍾m+E (%煑,%7C_+d#rI馦畐訄縦|凟(鴼/掩荹"鞖'#蒶-$c0踯Xik+`㏕憆6B?蔦/琓&匲!冨!0)髤误贖 奖RU8-ΒY伪礖岐*Y艀斵(e惒蟕x)蠑0 &栍8?C> 修y凧,KU.íe+峹繯ICd艌v藨砃杋'P斟x钒Y$疴Q掛薱啠7蚝&)瞸u峽掐PK }J'6衿4 sebastianbergmann-object-reflector-773f97c/README.mdUTOy踃}怉O0 咃杤斤8韯B夷]2回瀟eb A.庫澌給忼+筕珙sY; x^焬3I}1匼b綅(0偋脑Nハ)曛雇訾鎠鰦瀞O\ x#貥r昱 ^罜驵sJ; 燋F湊"R樍f.桻雅麦&V敆垩l襗崖Ws藃祛v蜛=梖M鳹 (鯺-y曛敪|秘硕$螥埧炱"蓑堬榶:!YKR覴琅鷄鳩♀3蠷5U蟬袘K巊$蒝W涵^a+K壑O&PK }J@C<釫4 sebastianbergmann-object-reflector-773f97c/build.xmlUTOy踃厭Mn0咓溌埠lH浑"R黜&$uql3ΘU颺'"Y$廄=蠜焜}璀豤$鉣-煑OR燬^渍螨m[既鮦Q呰?Q眕衏-}3[浛>J”卍箹劀俓-D~*嗀$:瀌2犛TKe埽騷饎Q柅 "RMn喗D搶")鑨嘑媽B沊藝篁奋缛~ 5'[c潀-璚籌Q旼s篆N櫶R湽u腵 实6H馑饑豅溬*1Cc/0衝鵢8姵;2拏企嚏DQ8_s1秤籰."裖櫥ギC廑溝5焱7愗[鉳A#姳牨x}/嚔位Z暓9 PK }J紿H8 sebastianbergmann-object-reflector-773f97c/composer.jsonUTOy踃uR軳 具S恀忊b⑸畉4訙页C÷A,}w)牒)7髅 嫬0衋眆吳 <)0耉(;茈竅W,O5z門O蕷戰lj嫍填賶藔醛*%SF關+幽狤k迖J+涩Avim=4)SK喳崲6Tゴ潣cV铓蘭\qV娛h|趌_=鈟!Pk潖餥譹賚夕l3筃"s'v爐6僻卷僎T諼探C獀S嘷A寡徕[D讪簋X逎xC尥ka孎b_k祬: 辸術CH坵R\r稔院嶒縙 渑荿(8黈 赚賠 |$4F郵8厚莴r旴] |X 媉PK }J:麱6 sebastianbergmann-object-reflector-773f97c/phpunit.xmlUTOy踃晵薾0E鼯 >8iオ妧(j昒.挭輦=K郃瀜_U獺e区cC竚事粈%&蜃潦骼HT跍#_>xVy鍖f m覒3W!旰犒鞾墉Vk聩r8蔰 qb$ oz趰儻I T%饊2峋緥6擔y0 腃觡Cj"2盡縺QhE LTfh%:  BFW'5B塁諸j7J3-]N壥张騌﹢=晞5gz{瀆2犚劜mt鳐)5逢[_PK }JY腏K sebastianbergmann-object-reflector-773f97c/src/InvalidArgumentException.phpUTOy踃u怣KA 嗭+rl嫸x秪S 謈Afg草褥0肾窨沒苻<栒奓$o昿5X皪+&l咷撧燴d 釁4詠膤^(z)歷=雫揲鎷(餏>戺@R剪塏吏@Bg乗d唦仺棂鱶逜@*<栞呤渘!紎构j斟QT娞餰堛魄蘿v7巾 9濔iP穼pA/蜯9滵mC笟L(詸螱;旔le>z詛坠8.g餇刽^[ 鄢={PK }J1 sebastianbergmann-object-reflector-773f97c/tests/UTOy踃PK }JH鴜rH sebastianbergmann-object-reflector-773f97c/tests/ObjectReflectorTest.phpUTOy踃経Qo0~席*E#mY;褼掩c歀r!迋澷牃w6!-晇曟藈咻w鼯鉁虙,h7h耺"-2E=咢菭?18錧F:p=l N%)|B3 ム躰l棞8W扤"1m8OSu鯼,!*俆啫,3玐浌 ┱1d) -$.}軛a?洪籘綥J罵X垽%#9aKI {玸"E瑾nA刟* :魫〗8ms礄`x僭Η傻椸隖F鏫狰篪庅 .爹5笶K=.骜鴣\Qnp襅d鮎a?E焕{n|gh恈牡q巾ψ2 4+g痎鐷犫qUUda#@'^炚-f^S -|m縢F.!贼庁k&>篚乒 輙E核陯v -5礫57璶%!\鈗诠S馲愬S'&舛 -暤遵:菋%鑲铢鮒 d#蜤j毳迎o['穾 潌蔳<倠ni;:/t纸!钧m7绐 涑糅唞蘨y:澆锏鮜泔*5&{A戴zoq鰍x泛3ぇ!tj紏薀))y莠x* 糴麿:*BZ待U垯齿'葪臮GWf栂唙らJ解=XW嚝寔e满P-D*藅ィ玉oncW)杴=PK }J: sebastianbergmann-object-reflector-773f97c/tests/_fixture/UTOy踃PK }J镜辩NAH sebastianbergmann-object-reflector-773f97c/tests/_fixture/ChildClass.phpUTOy踃e愛j1嗭s!x*街赗QJ[獥俤揧7eM杁鈦饣w6=&?邷}UTb袃Ua洇D嗷挒厘嗖wT憎槜|;?`矄; K蘢 #-<⑦瞍0W韥 Gkh爍忆虧*騒枲\u騠[H4 m辔6w~'8{U墥到罜蕒ZLg纤Y]*岻$8&媱 倠^!7襒O=B*デNM+谛┞pw aC%Z旰愈%Y饁u`铰@ssよ3筨0-L┃閴GB紃'KI鳷揿%!礆锹4竷v4GAG/囱1c扞`炻头6,;u簤窵Y烿m`m鉞*5澫,>PK }J宛,[ sebastianbergmann-object-reflector-773f97c/tests/_fixture/ClassWithIntegerAttributeName.phpUTOy踃EPMk1界W獭暘孬˙/俤吵nJLB2⿻飀u9d聸73锿溲譤 {z碍u凧蝆W+>QQ?`e80`f&wT6X菻ZZx羛8Jka[靿'玦P忪殖t‵⊕1牅?} -羑6騠[筽敜澖oP2謦裨艚嬽f慓52〇'≡憘.a 'M5W谺t)(銭%f誄!JTF靌盯==崎;率#F/欮g磠kN疝^`放HK齅) w蚰a炦^讲 蟭存菱G嘜踕鱒e斑+gYJR蚤6+/菨nS醠?汴E\/PK }J滋I sebastianbergmann-object-reflector-773f97c/tests/_fixture/ParentClass.phpUTOy踃e怣K1嗭s趭秞n玝i *肚偺&齿H殑d兜葙u+Ts欋3飢L頱砧R%+洝磶@b哪J;i綨T:! 卨嗑缞 蘬衙ロ絿I>i鱞\{薈C穄"$鄪牞1賛艀迉硽|栁 i噇兛傝E踇:磚徦冱i5o1笲f06s睧蚫郹箳Y!:i扚啔〨JZ#彘蚡瑪鍒.u趇筌炧鮰佂2/讐s滨sebastianbergmann-object-reflector-773f97c/tests/UTOy踃PK }JH鴜rH sebastianbergmann-object-reflector-773f97c/tests/ObjectReflectorTest.phpUTOy踃PK }J: wsebastianbergmann-object-reflector-773f97c/tests/_fixture/UTOy踃PK }J镜辩NAH sebastianbergmann-object-reflector-773f97c/tests/_fixture/ChildClass.phpUTOy踃PK }J宛,[ sebastianbergmann-object-reflector-773f97c/tests/_fixture/ClassWithIntegerAttributeName.phpUTOy踃PK }J滋I Csebastianbergmann-object-reflector-773f97c/tests/_fixture/ParentClass.phpUTOy踃PK(773f97c67f28de00d397be301821b06708fca0bePK!#34version/c315a200d32565a6d8ebb3495cb5ae34c5ced3c8.zipnu誌w洞PK jCI" sebastianbergmann-version-99732be/UT9 騑PK jCIrsX0 sebastianbergmann-version-99732be/.gitattributesUT9 騑*.php diff=php PK jCI=vk, sebastianbergmann-version-99732be/.gitignoreUT9 騑/.idea PK jCI倫oX`) sebastianbergmann-version-99732be/.php_csUT9 騑}UMo1襟+8T俆m:ぉT)J憐B飿uc{61k 臹|澫7鰲颹弁)趔缌*r铭⺻x二 z禽j%=B腻輑坞7 嗴N诲"x8X\.b嫽铣櫱貃髦=9シ皀p噁哈/鷂. q祕 <<^"bFXwi侘0\秈-黎 儌 確|1鸬峠着$'!娊幁]嵮魸烟A衘I嗆5M@瓓S叟A屌+0'┭n[湏瑾!zш潓殰恅虡$i繡虸俼 %砟善5榖牳"椐?qbS瀲($Y EV嗹%d軈.逘监' 嫳%稠-'W/庡q+v蜨8!5H靃難2ic澜實蔝釆 –W.瘭爹 灴哾慚灀h1j;鯟!○2c'@$廇蛌苚 饴祭定M&p`0) 閒Bぃ枽S宆)h枋墒灎>%~M骽i嚬寋D椖T孬W.燪刽TZ騋/E炏C漄iz檬阂禼nV&决嬡偏懗R鋙\剻泼X詾;鹈%藈6I礢岸ъ珓辯阼顃噆<咖 弿义iJo2慷锳PK jCIn/) sebastianbergmann-version-99732be/LICENSEUT9 騑礣_徻8鳔酴{蕅頋铄ZUg朆沦斍@坍%X靔縸g {P弹}泷蛨凅c?綆铖)蔓徙_裤沁h籯CtS;>鲰0犁饁黠殚t\渢鏊勸F;>踤聵矟 qt籹D&h瘟 阜閒鐔v|厓麗翄婳嗲繇蠎蹙s穙 僾磒瞔颾淔:<魔6鈬E愩芽羔鰚5FM綅0苛鲯洊斤疠9Dt[訦砦?S闅罣贩朷#茘.y鷁 2顝8浜 酠弘唯菮F偁r琪甾眪浶厩}龛赾潶僂昃鱬馯Y wh{K妦睠兛=I@堚/~ H ;K雮6<亍肹K泚bz-\蛄呺P%A皏I$鳦|∩_ 律頸摪涎~嵈C胑汢竫0 〢3翅J濿猑薆0輦Y入誚声吕. 4皙累(9mL4{5v綤^mA|])5 鋜UJCt+#呂@Vy矚gP諉時) >3u朒l儂K◎SYJ矼|3i*鋌3$惆馐燃)箓U@ 捤(&葞 症2,墣輁譀J(拁oJ骚D& 〥n韧跄囼JY塡褹|鑵玬v旁饪a 句s傣䱷&鲏郒騀%It3誇毱樧u憆諦璭.'V:呎h!冡!0)龎斡FK 2伯pLE睖ck懧d朄)償}泤纚EyΔ8叀1睖迄3涿蜐G紨sQ鍌58*╅伂裯8r626K9^%删B8奥P%k;霶x9徾侽╋蘿 唀鮇窬函 Gk倶o蜽埇B?蕃Vpd箋輵p{こAH勂檃t/鮇 (勠8劐寭>'Ba蹑M斋<q颢梱{y偌蛘,麢}%RコQH霅碐9<&5鄺,/蟀+<蘾(G畭<裪漻'+D+i2dZpm﨏燀鰷嶜梭姚:36柹'lJ;檲挟P僧B34L萌#2ゴ欘9 裪")|畖裆P焺&鄸7ㄢEW凮A殯eb皯袬(=/ Z$5b鲐9诟蠍>烙鐇记)殂0)=驷並涒QE7PK jCIaE/ sebastianbergmann-version-99732be/composer.jsonUT9 騑晵?O0坯~ +3I咼 T恅`ㄔu$GlRT寤悚n*脛'鵺螼>,X\吪 犽:FGA囋:a齒姾W8p咛s饘4木勭L亞^>6%覣5铇yg下椳惽幁_痔:髞nZ''躿K撕#64UkT=泲>N鷆R5M譝洤蚝|9!xn碰跿譨辝9lNX*蚃怸 勌"{败-|蔗o3r翵劗榌么&w5蜧儋S!蟥拥3$久 纥hy勥咻T饭<唀v3}+丠佂2<趙m}~6c徂;華覃钖 P諭縨W6t;糙棻;篴1,~PK jCI& sebastianbergmann-version-99732be/src/UT9 騑PK jCIN\钦1 sebastianbergmann-version-99732be/src/Version.phpUT9 騑飋0秊库&UJ2蒂粚峈$愋4UnrI,R'矟9鏕椇-氊箇黝=劢|Sfv昀)躦\A聅z朙j(耊攰傊,艀侻鵳 4g蔻L桳窽葳5瀹譇學-鎪!霐I曠錙捎L1牺YO鴙縩;富濪{/"龡粻 l涽Tc W髽&w;汵?暇惋nf7鬸D H 追漧y%,飋隇僐覅倅% o+卥 孮Et#孎殽n<靀p<%/扅v最鉷'嬲?b*{m嶠栮敁攸+y]/悎rT官膁煲#{-玟牴p5 嗃门_鐞Dy“鱭|嘤>l0毿q閈棰>麁:乡G坟嚘宇<9PK jCI" sebastianbergmann-version-99732be/UT9 騑PK jCIrsX0 Isebastianbergmann-version-99732be/.gitattributesUT9 騑PK jCI=vk, sebastianbergmann-version-99732be/.gitignoreUT9 騑PK jCI倫oX`)  sebastianbergmann-version-99732be/.php_csUT9 騑PK jCIn/) sebastianbergmann-version-99732be/LICENSEUT9 騑PK jCI|蠶sh+ 8sebastianbergmann-version-99732be/README.mdUT9 騑PK jCIaE/  sebastianbergmann-version-99732be/composer.jsonUT9 騑PK jCI&  sebastianbergmann-version-99732be/src/UT9 騑PK jCIN\钦1  sebastianbergmann-version-99732be/src/Version.phpUT9 騑PK p(99732be0ddb3361e16ad77b68ba41efc8e979019PK!g~%~%>object-enumerator/38cda1088c4ea6478e144eed041619e5c731b8ba.zipnu誌w洞PK m,K, sebastianbergmann-object-enumerator-7cfd9e6/UT僘PK m,K5h=Te6 sebastianbergmann-object-enumerator-7cfd9e6/.gitignoreUT僘铀LIM銳蜗-/N-宜蒓蜦 2嫺蔙驲驄艄3R 婒 R婮2S嫻扟3sR魙<漖齻]〖 WG_W杰(_K$綂 PK m,KTf3 sebastianbergmann-object-enumerator-7cfd9e6/.php_csUT僘}U薾0见+r(`铍惁@ =枭宝VrW!);.-芅M*钾鋵腐馘楋}/薜鬢_F2崨泧拖阗򅆾碇k"W>~k嵟pZ-冏俗麍!営 伱镇'焙件糥x寖ёfo榋乘?=媨传n>E} 纂鞣觐鱿磔貵a務qx銀浿慾x豘TB嗝駽崄O豴塵綐.N5搯&v*5F3糁U@g4[ 趢-N]G5%HschW渟珢s魻;蚁v  撘`,m罜蒊咡!鮮%榺R蠮塙襉諂獯圡y⒁QY>犠Pp (続y鸟谰)c菎Hf78 疄' dzQ "V!H:雚 ik瀣H艭P#U+_*m﨎a]D觾 : 篰靝H頔(琇3爔Z跔vw七鰴%墆刔憶L 劳"a餾 3彝勅G-蛧絨s胸棟暠=溹!%~I箬x徆俒DJb*瞰g.爉s旯=t欤:EF橄:$;箷ue\/苈璍|8盡倏13M毐冉&疸虗曎flRl躃鬠翤掕χ簕蘓顜%r赀梺z偋G辄4u曔唪 PK m,K 7 sebastianbergmann-object-enumerator-7cfd9e6/.travis.ymlUT僘UPAN0 肩9!-湊*x耸M葜RG冻^OJㄐ^b忋彎 o6渱賸s頇滣量 /W Ew?鼁艊j(蝘]x+$E鏵\Y餏Y R曷憦聤jY鲤#& 廪$&p' 殀w B鍬构h墓 +醅o偑i6Tk嬔A'啣I喼+Jh苗詌h*謁 舐2螖莢皻樵墊o7 1澷菂囅#9k3vc承uf休?*趸Y裪#/馗駒v<;椯h鏥縗<襲PK m,Kw!ǘy8 sebastianbergmann-object-enumerator-7cfd9e6/ChangeLog.mdUT僘瓝Ko1咓W师A歡J)賲垔FbU奼鎓凄仄4棣繚;$ !慤l忯漿9罸臮塸苀R傄瀏!ox Kw^p暋-譢〩g1獄崠{m椑-BzP  |%羓'TIw勁gD畁g_n頾*锿4妦蕞J]喒^Gc0V╘.dl4偱$屆#惼苫 釯骯燥Q0>詋CX黋 K'碞hzu笆皞艜赻/愵&A 鼚闯Z盄儶@?锷蒶鋸b踧颷^K捋(T匳4罱Y)柶m   <郱?u2_沑萠e R觱\m尪6繚蜜稷#Э彑慑惴X屢.SG耊u謫y\"S橺 橺(O醶洠昸鯺>tσ}n礎霟в7.k</wP0 H $H鬻涼亄褦Cc1功vo^:颙鉇挏壪;蒠Qt偀hM%UR"w萖咩)鼡QG定澱b远5 曲驗剼粼旛= 5瞟 霙詔菍Y哐0j贛殲f襠菍PK m,K糵73 sebastianbergmann-object-enumerator-7cfd9e6/LICENSEUT僘礣輳6鱛1骇*;U5K!Nmg9Cbv]A倡;c貎S锏/`<炦讓P\A 纾F乞pzs剰/魁縢`墚潰o樆耖|炥稔:=熚儚侈9c黳1凌&7靖~茦v綗忤w玷硇脃r樎y靄嘿違沏斄珡启螒C秣緆 僾tpr阊氰z8嶀坯x埾m 嘋x趺ta=5M寶.逬 爝祎∏w)丌Flw釁J讋 !eX0nt捎穁惐;焳Wr輩甬蒗g怎?菮F偁r:軇!讹 X嶝F70輦N恿"u遻给獪O崉;碐G娋矯C=I@堚/a湊 v幹mpC彿6Ctp瓽暩o鼻%)煦+MH0漒G泟}烐k.4Mv% 蛋喙株Q霬@瓥藭厱* 皙累蔶9o唥;? 驹ZJ僜抓D0D准睷 d晽M!玡暡瑪ki駲UY"齩瑓蜽鴵蟚)6-き悑-悓C偷晊Sr ue惌B毤鋜-##圙QY0+^朌萵.咋殼遊劰R騳) ∩Bj慬rs=1魠痢Gj慘:/絧酵畼F#,B磷|壷>a譊>I辢&僫嫫J踃K敵鶴媛|b2) ,O両橭t7FRf( 瓫贘U=鄕7槉f9侵"叓猟RzK爺A>兺J嘟3xIe$Acq(x!QR@淍MJgEf y郩 鍭瑾%A鐻B跲9焚!︰-pr顛 t侭 'AkD0n!4Yx夡);蛻U4逕y态$弮Y謢埚d鼙繇愚9之_%佉 休圀溾夎W__dN鱰∪y[8矦樝+蘭イ阬Z傃耳崖\6 .q幺X閚嚳巌*PK m,K蔍謾E5 sebastianbergmann-object-enumerator-7cfd9e6/build.xmlUT僘厭AN0E=卐$ 靀$恝R%鰌= my匹qw湸mT礩XIW隒o#飆|濖诟畺飋垅E甒*D墛厓k闆幔@梲尷>J”卍箹劀俓-D~*嗀幛:頳2犛TKe埽騷饎Q柅 "RSn)&D6-(閤咶媽B沊藝箅o瓜蝵礆摥眡丯箹肢荬ㄊc鸽Qf%我:b蚌錰$馿鳦l吴柲胸 谕叄8{)#)h`<瘄N咉卶'獑質'簣DwApd頑敽塷s>靼7遆@bo=h尫!b嫳牨ys/嚘围Z暓嫗PK m,K茔瘆gS9 sebastianbergmann-object-enumerator-7cfd9e6/composer.jsonUT僘uR薾0肩+,ZEj愞Z\涱赒獔痲<銤蟫X埌 &+0繬伾m駦谣h|蜶rw剸葤T霐5=銤`嚹堗W#/潷斺(#*偠f岈Q謧p媱F鈭浔Mml甹鏩^鍄韹L&煂HU鎶醸斠J⑨瞺K楅緡2xW[釶䦂:L籝<氡玿"Pz栦s[忿(棔楲.6飌隂Z鶖kr90龕呯:濸z0禩Z鉷"a#簺汭K躚觑锶~ sebastianbergmann-object-enumerator-7cfd9e6/src/Enumerator.phpUT僘蚒羘0 禁+8 (挔m皊诖] hwK婤慽[#敎磋賟lg豽.巈掞戯I垢蕮<楳樎鱀圱娎蟎悈,俹(-,u盇6u裞9\ c曅 )略{譢剐蕿嚫93 DE殏舔WRqbAR%Q喼QFaU!OQ疝V岙帖rw稽t6v翤▽%.,啺S6/軆 捜@!:殖 衎&假P瘷?V濐Aa辌旘#nH=蕚 鱱沬/鲅?g6 盓2h@塛酁 i r<"&'婆 杏E莌橞l茡涨FI6V,7O7髈vX5)撊TC竸>塚w);x躲懈|nT垭V\鴃X鸅g 57Y糓陫胮暤/鱢蹏滇D稅鎉{揲r 匧竾 /﹁$耀c&层葄▌[nHJ8飣軝| &岂`:鰐籮鐗灦f:楗Nl~ 菏SX=獁D飙谆槒ㄔ錆-仃7暣鞻j葒├?P星鮪符攉W尹W眦T香{PK m,Kn$*a6= sebastianbergmann-object-enumerator-7cfd9e6/src/Exception.phpUT僘E徚N1 D稆 P-侰9r&N*隓壝N禤8Y县o蹲9d砓X罧 #A婤蝠<* &*īuq熧s匮圲n╈'乵=i7齬值+咛}*爜婪力黁xPD$悼熓勈I. G庐1颓茔幂鸫朣GN 0c荱 廙闪wīK龖zc屶D5c蠴浏?M媈芒T黚-蕓/ PK m,K濢'眚xL sebastianbergmann-object-enumerator-7cfd9e6/src/InvalidArgumentException.phpUT僘u復N1 勶y P瘾E獎郟幗x锲(隓壏[剎w矃'K焔鞕鮩蛏疰笯莵犖刌!v疒緭Uhd(F棘襓}a/aK-ex犥(雛bw躜(琄G7繛A=A76探W@q貟旡Z簶T巖)V秅殠剧蚦蟛m鍿菧闝a帇fnG%涄∧1[獜桐WTVx巭J钧i鶺糈厝畸茏昲s皵鎩@%qv*xfT 艇2逷K m,K2 sebastianbergmann-object-enumerator-7cfd9e6/tests/UT僘PK m,K+ s# D sebastianbergmann-object-enumerator-7cfd9e6/tests/EnumeratorTest.phpUT僘錠罭跕禁+R8バ(☉嘱剞仲祐譏P趴wv砟)5·[3硂藜嶇霤炴^g邇}餝!絪 143RR◢n-`来酟繥T蓜 gza 銪ps醳u鍶*0)B\d2縎)YY]淀遜涟痮褳S栺鑂%DA踶n匪-''n蟎C}絭4胥蛗8n棉迴 PK m,K; sebastianbergmann-object-enumerator-7cfd9e6/tests/_fixture/UT僘PK m,K$I9O sebastianbergmann-object-enumerator-7cfd9e6/tests/_fixture/ExceptionThrower.phpUT僘uP]K1|席冖h\A矍B慑鰖懟$l6鼲輁m偶fgfgvv殸&##X56Bm[鶅&_肹鶃啞p〤异i,蕴!,痹懎v饒错磗0霢湏<畃Yxn暝禶|8捿6 赨衂.蔶W{4[飊!川踄荀簵绉鈛Yd>'7歛#T6221V胺苋D:D熑,0(錿1h/勺绂?E {郉%I駷媰翋 lZ#\慤C~彜> dwn鶂腉魓*ガ芾,偼苮'駬崃癵滜%9 nr浕g8礴於Yr%r錅鬿煶隝}PK m,K, sebastianbergmann-object-enumerator-7cfd9e6/UT僘PK m,K5h=Te6 Ssebastianbergmann-object-enumerator-7cfd9e6/.gitignoreUT僘PK m,KTf3 sebastianbergmann-object-enumerator-7cfd9e6/.php_csUT僘PK m,K 7 sebastianbergmann-object-enumerator-7cfd9e6/.travis.ymlUT僘PK m,Kw!ǘy8 #sebastianbergmann-object-enumerator-7cfd9e6/ChangeLog.mdUT僘PK m,K糵73 sebastianbergmann-object-enumerator-7cfd9e6/LICENSEUT僘PK m,Kぢ55 - sebastianbergmann-object-enumerator-7cfd9e6/README.mdUT僘PK m,K蔍謾E5  sebastianbergmann-object-enumerator-7cfd9e6/build.xmlUT僘PK m,K茔瘆gS9 9sebastianbergmann-object-enumerator-7cfd9e6/composer.jsonUT僘PK m,K饊碻7 sebastianbergmann-object-enumerator-7cfd9e6/phpunit.xmlUT僘PK m,K0 sebastianbergmann-object-enumerator-7cfd9e6/src/UT僘PK m,Kz荺r> sebastianbergmann-object-enumerator-7cfd9e6/src/Enumerator.phpUT僘PK m,Kn$*a6= 8sebastianbergmann-object-enumerator-7cfd9e6/src/Exception.phpUT僘PK m,K濢'眚xL usebastianbergmann-object-enumerator-7cfd9e6/src/InvalidArgumentException.phpUT僘PK m,K2 sebastianbergmann-object-enumerator-7cfd9e6/tests/UT僘PK m,K+ s# D 3sebastianbergmann-object-enumerator-7cfd9e6/tests/EnumeratorTest.phpUT僘PK m,K; Isebastianbergmann-object-enumerator-7cfd9e6/tests/_fixture/UT僘PK m,K$I9O sebastianbergmann-object-enumerator-7cfd9e6/tests/_fixture/ExceptionThrower.phpUT僘PKZ(7cfd9e65d11ffb5af41198476395774d4c8a84c5PK!*[饪;;8environment/f24906d5c02cabcc22893eed6efed53b55a529f6.zipnu誌w洞PK tO& sebastianbergmann-environment-464c90d/UT傹註PK tO. sebastianbergmann-environment-464c90d/.github/UT傹註PK tO么9 sebastianbergmann-environment-464c90d/.github/FUNDING.ymlUT傹註github: sebastianbergmann PK tO}5馂@S0 sebastianbergmann-environment-464c90d/.gitignoreUT傹註幼薒IM湟/K蚄/庖O蜗-/N-宜蒓蜦d$e乀A|r盺rbrF*刐殫Y擹\歋PK tOWl巷b2 sebastianbergmann-environment-464c90d/.php_cs.distUT傹註漎Ko7倦W臁:隲zJ鲬艪-捾\儬赋Z謀rCr%久嚚,r7衽掵 9蝲3C撖cR玩驄R孃v夝"呔v胪3(%@僸8嵨撿]屫X1k朳)九.\怷窏鹁刁誵-<&-c綱侵+\嬹逥)罾`b倃-沛.|Q蒏鎈泗審d憗窦9血xZ d{7V佡悱娝餵 獳,饸槂O; 1鶳榞n'叙> l釂"擝26g0,n .u溺H緐鼳梙?, 躽鬭^嵟稷^t.栢媽怰^:<顩儸漆"v憿s9$",<蛴I筻檵汣螑_L懘i皠2:u qO〝獆Q{鮳𿇶Y鈵Fe3W } 鹊 佑S!\骖#夙塶丟媸c聤XS塿抉2:7褓MZ+損m讥醰夹&5Wb汍 'Wn搵炫(^TM1嫀忄尌P;g x擠[鸩)拳J紣羓*厑6p 組褔0檅皶$^\斉浟Xn技珕笆%〨彫^貐糵蔚 }LhbB 攣萵偡眄洶rp0樉篳草D那筻|=嵈h2F伅J;+DW!弳[哽岨蜠餄嵔M槩X礀恺e+sl妺濯応鴁W|朝s繹nW鱠韄Z歕8SXzL|O(%酃赙鄢颲駀ё 峋j瓻x魺&戴.E赉 礓7 澖A鳘lN~狎姁?~"ず╆譌澈0孼E嗾壅PK tO燏f-01 sebastianbergmann-environment-464c90d/.travis.ymlUT傹註漃=O0蔟+0RJ7X;癟Uuq.%6>;*!藑<絳w !酅  慍#$<琽矽鰷镂鶠-z]傡及'孉煐ja<韃^焪*Ku鞵鼴O)"マ:j)K暃糲 a 誋B鼱膧虫c蘅w ごNj)爦谫爀]*埞t渾8踐磸E_靼逤uY瞽` 玝d嚸釮 -樕v.原秛啌1+7捠,睁玙&硜^归獐U冂9)曒c-廤*抋屟sS资u旂宗 鉠擘畹洛仧񼾞 鬶樐PK tOj閅<2 sebastianbergmann-environment-464c90d/ChangeLog.mdUT傹註逴8~蟔1/pwm${vA 鯴!D菽M-;k;败_隳ロ襯(晉h7咛|30YP2 \f3 芓歋!:Lx蝙忏葆聵b蚤<磶椛思s呪"鍱苩垠6j眇Z鴇"梍鈟苛Y嵺儺_囆#錰Q*7抽e杣湖緌懭'T /攟琡5 ZZ卙Ag<銌3]3< 6`赖.欘DC鋚  . 昴NP+,擇凖刜眛$2T 焑橡碻.O/X扲[~K55.!j猙a盈;QJ猧誎揨窖(e婕恬跖|"2 毽(彟+瀌3j踶R昻U尗R炞1&%j!53;Qo荌箔櫬^S聻曖}溔:鍝78m@炗渳CZ7Lil棻H&2a靃ESv琍S卶 gf!撟5.rh媩]匱鍾铃溻豋脛%睱蘝6溳翈n 面B'\荰%z"骿vm鷬橰 c叚b嗞筬s舝>俕遂&淎D2觖f玬壎蕔倭兪穠MZH鋈漙頦,UL[脔M!唯+:䦅庍 B庚>>tr|穬W衜A譜鋏迳韇 瞚\鑣蝩_浍])稅岘 橠鏦"!YY糅~漨6Q龞{0=J滭(#,E9)捁扛0䌷鳄A"培$齰"賩賚+褁v褸幤`蓾炥|─GR駌/X.釆K稥vM*4棅 l_-bZ /+b刱煡95疋]だ5Α vh冪A R471]V稚.=w馟^鵙驿3#乕隬蜾涔@7 嬬忂镃嶷鄌蟫賔6擫=坫o 硷Tu滟S鮇X>妮l廕{澎9州v象!8倃疿ムC酀讴顬v籡亁 8sX久"灮Nc,遱WEc,唛Ej,絴_脲7撰纂 蓔纻$巣鶦译蛡~i4徍毕绤#瀃| 脜N吟嗸苕i k碗醢RXa!堢靰a厼弛=皥 <鐋{`媥舞b/H竷PK tOI“6- sebastianbergmann-environment-464c90d/LICENSEUT傹註礣_徻8鳔酴{Ji{簵籚3K!《硵茾坍%X靔魁(T鬃{泷蛨`穖埉>卺艒~桧她駇tO揎圜O鴢f牤颽j千畐煆Я臝g0~8@0赻跰S秙!巒{娢渹7@皈qg油 眸{?!僕熈忛蹮"雧琏n@韍醜寝舎;8廅舥x埾m 噧u禳9j 寶zb ~儫%瘥珫濓疠)Dt[訦碇縋閽罣烦朷茘.y鶼 28浜 岐輚'怎?菮F偁r鐆'Z凍:厩}龛贑潶僂昃鱬鯱Y wh{K妦盋兛=I@堚蟺~ H[K雮6<亍肹K泚bz-滙羺隤%A毂vN$鴠|ド_ 卵頷摪涎~嵈C脃汢8{0 〢3虫J濿獈攨(`愖珝掦厑E]Bi郩伔昋r跇Zi鰩k靯 稼RBk儒獢嗚奧F 潄)d5牚 +錜|f,扊 ,吺鴵Oe)&裢ぉ悑蛺屆+#螃 V峑語*のK.棦 ;2倄洁eI勳娌^WB戶{0PJ>-$"4YH%rCn.'喚08擶菾鋻饣@/\m |凟(鴴涎邴["鞉'#%$c型Ti#`^譋蔣 (s】安)現  O両/t6ZRf(晳u鮻鉣c*婂[n]%P6Jれ3X/+3%) 崏4蠍4w驲蜤 劜朲<啜う瞓D绘荣$舜|糩,  x(I鳄1醚kyYY靖=aPK tO蟓侷/ sebastianbergmann-environment-464c90d/README.mdUT傹註漇]k0|鳢豶嶀l飞C覢(\爜@K}猩{龆菠hWn镞Wr/勾ㄟぽ潩峠栏V,僾む靲V娾sO 拶t蹾-2l⒄B*C闀@徠3$d;竈^Чw5癰彋6め(4癨轡晙?Q菍^I蟯Q瑸>*A$jmn0pj鴝詪x>k簹{B觬MJW4c蟥湚穷 酥帙(6獉≯潗+3+4腶R降j;l|铽苫媁跛牯趱衽嚙径(痛"抜-y"A嵞暒夶=5唍P鯻'諥Y轃 C鵢8eQ蘤piY擨磽"heA祄zCiS谺蕗愦2 Z鬶[:闪峙wト9K9宎媳C鸦藟eyV惥籏x)唷\_n"p謑"磵!飉qD銃瀀榔,詊B]謖浑聉*u` b7R栈;睔X懧!xg犧+F宒糼潴鍵 t蔾泮F~伎/ru堽  6輍:朆掑Fr -D5C靟酧' 45RY鳕穰犤嬞戾湘.w [崆曝+四kE锥&tl(爧6咓胅]o6洩揯劍釬誈 贜侢穳^r.睱双颉嘆) c+项f鮸+/+Q侅潮bZEv亲n鬜v:2CCWK瞘z-Z*6郔9c}9_褠\J庆>1梙K纭13嬶AZ蘒呻h逗`Q.[\A屳臻N铔鞡G}幠-y7NnG蘗84#x)睻} X^煢蝗窰荁N訶衆旚鱾21K=枈'萎仵'PK tOJ涣鵕1 sebastianbergmann-environment-464c90d/phpunit.xmlUT傹註晵袿0七+柧硞苃6B4<>炎逸犐-+辬9c4/M餁&篌睂N嗳燤4瀳茇}*稕屮A坛QR*o G伓4;揑艁箽IY譽\咂桷騠2櫴麋語啜破+獳將n吰櫯u獢 窧祇$)hR[彲>緭蓠L鵃r嚾腘U8佂袸KTy? t睓ua-蛘摑&芰殱鸭亍询+螼迏粉1冓 H窤 [謸_湃喦JE咈%/づr鉆3簭坾Q榮*鉽瓞旽d 詄/ !.ヂ n蠺聈i垼省'a"葪Z:<緐确 H{IJN挸黛rv⿸7dPK tO* sebastianbergmann-environment-464c90d/src/UT傹註PK tOB皊5 sebastianbergmann-environment-464c90d/src/Console.phpUT傹註蚗ms贔L楬脖i~)& 3崫w:%g8唳猡逎坤镱榕 ;揕gz_愵鰙熭=耦,欸0徙)頹D貙:夂遇Nj徒炝蚛h槉﨔L=覨0黉r)T(\欳$'w炝0#煿-様.g:G当鎝翺S烑30崈芶碫b67冷1鍾9 諅Dg阜|e鶁韜{W壊稓93癰&傸簭 熇J9灎:屨槪 '珱5\G 鱮3谬迵'第TH&Lk鑶RS\徒=麐6/橞僊纯Q|従燫 o.鸚h√镝峻观呱 慃ㄌ=&VR僎1唡歩襮吺h凧|眎8L2^ )1蝼淜Jダ萐賱E攨 莗綐唕韜肊J 盁喸繋Mhg嬩灏剩i,莇 ╈抦媚R;嘂0 ,mZ钁雦@+:3n庐s|}\2给鑨 -e價< b雱瑑Sr[捯l9収.筨3逕蒔瘛立纡巋譏侧x疰 鴻#䜣嘀Y$F獶雋i诃(蚖聁铒鼶剁L狌+LYU鰆3PW脋鼹施馉W蘥o谜"巜 岭缮畖*囷bqVr狋%0桲灖!富.辟蓌q鮝x伝鳫JjO蹍Ya獬祫y覆:軩昐諷娬舄跐拓-p~殷巕z鱼c薅~犖妐.;3V陎墈油%捘貦4醶珼dp詀熌($濠<暋傥嵕 X7`舚甀&k摗介4脼薶B(Ci Xs歁5鉮 ,X5挱貆檤>冋姤r杢qQ4q湸fp?拥醼}k&豰4(n咋`(烈K:炬N)T梱卛r[8農淨a拘惇巕3鐨鏔h弑P攭埯e1麱猔幏-鑏R閵b繁F暃紳#1爰痮n緃簨搇h1cx頞閕?m劊;玢咳驿vF~a粒a8昕飤T枝Q 梞紆堓箖7衘D秾[.譺愧P媷瓁m顣耈ㄥH%3|ly郇凴f莈须轡 {.鴋絪|哔-^煜燮夹晇蹶 T蛓婬褓8灮蝛睴窅}锏墫衕譅N濤<痆.:坜iw(/%籱吡)礊A6X+愷=f磽鴜R殍惹鵁@i鏴諜;G3鳚^莵$褸,S辳- n劚RPi'耽 蓈辜bx帘Qo3A'襑n[惔蜠i B\)*遦筂, !掅+ +}5痔Nq驙録lW!媎 攣胝0ne瑅Y k3)顖铙轳少 "瑅-汇唴L贊碿9L<諄婤仺 '$謗疝蒤腘碆縔I@w?}胡瓆T缕 A$杖2攰G)膳TY9嵖 >?;靈5C衘.甸;裷骗-蠥蓝繪? af鮐盎盤鞆P #蠌縗鶎藞@Q蔽鑀嵹乥S陚s 螄2庨L朢趥\荙${ <巊B髴饹鹟8瘢 跢+旖s惆鵐鲢GaqVK鶐1郕_屔摚槆"c恃T凕6F au傛45憺6情!蠓z廪俒Y逜窠"D,P47鋺潀'=c蹞J鯣满^煐3严鄘M墩2锏$額l锌<檾 裰倴Q蒣暅麿O矾曾椅,厯炜!銈丄}/栾翥$妐j斏u叡枏遷氽蛛妫船Zcz祋RI$NgS徛d]纞]せ狻<)恋tL智9譌G?0q砐8WAktm ~CK溮6 %娐檃CO坕顔Rc栍矵欽s基ucP鮗 廕朘K鉃S[╦;MZ+Z(嬥粵鑂aJY眲撣勍$'埛3M吂9訯Vh48l閠鉁拑2趤犽〗缑熫m湨D顄蘨7;t;蓉M衖H蝞繈.a篹睗彄糏g9侲A%5L;F湶@束d!妇Y楱郞莕蕌舧楼 梳愥T鄁㖞o;q嬪Z<甂eq葚緩苏伊窆鶼_鯟迎噱)rN棃旦銔$V"4鋾j監菛怎)O4@鐡%褗{H彙餩祧詪]枴oVN鎏GN"py]鋺0悗H韝z梤噔攂乌瘭熕!坂櫲>薔樯%4檮03盏;{C閸鴏uYeo<恷$镪爥隻霒傒%柾N吋n蘎#閽,傀lPK tO, sebastianbergmann-environment-464c90d/tests/UT傹註PK tO&,; sebastianbergmann-environment-464c90d/tests/ConsoleTest.phpUT傹註軸Mk1斤瘶Cvhbz*4b'訮渶頉∪怀Y璅HM颒扼QC揣璨 图麈哇髈畄Pai斍^`疜囜鈙p 驠ǖA惎S瀬j窻伒礉鰀[磡*濠鯽/+赭螣.6Z艇w=7鋪:%箥作 儾] Bok颦bM8僇:嶋荀c2簽萎T质峛X昇s"ck蛵既仮/Q*L匲-т領鵡鷜某B{鼾n!鷹7^谥杝 <ER08]栐皘p9"萡Qk玠z輢h{掆wr2Q:B)n2萠鐄屺>婞51柹:29.鐓膈緽G菏E[%OO; +[S與q牁"樢z华紩抁GV处▔丘鍎堩Yば榔赠竄l^}皊-碚週薆X#e8QSQ僯奞NAu 佧蘭丅砂nj8猽T嶚d \2胱嵪s⿷s{0憯?韇 0㎜V*-騏c佱跴,q}n顴鷀鑂覟↙檏2嶆!F和墄2SjJ嚴7?H Ui夼科k軳剈m 返|$縁8霝v?渀gS覶vRp魥耴嶞 艮i|F橭靳缤澉粦灊PK tOT垀l\; sebastianbergmann-environment-464c90d/tests/RuntimeTest.phpUT傹註綏逴釦沁鸚%&Q冉獂*!舺 1K;袓e贩籈团齠T8,鰠d贆鵿鏦徼G1匛m魍統嶲W織绞籶r !術虜9峿 gb虝#篆E/Agr蜳 GL8漃谼pS8彻 L0H|?+> 0@膤毬媮T#f{G辱l恬奄齦株璑莺r&d檰[]`徿勽 樾2Q>R-ul:ft6%焵麝3墖灄P豽K Ef廟=鬾P褏十St馑1* 渐{讐0|b#瞫鹕4L倄=犌3;3└蟈13;TFBO彜A擀k遞洩mn鉨茠頡 `浵齝矅*狥嫘輝矜H蘒窧潽抑S齞,镾輌艻5EW:誰z顱繚凓腶S隚,g񔿖7*菱L毗笨0L盩ZERL誣CP浱縏蝚xTc僚餔疵8梥崢z皾踶鄎寔祇I3"k縨 :yR5;譎[蛆rJ铬Ql炦` 1髼3hc|M#"K斝,襰刮 邜r輍tm揌2J[溦 t苗[乲奁d秌W]'鐦.肙峖却u敡5S+勡鬞Y諪靣崶梥彠踷=璳 M驍秣St镋NG涆诛鏏筁罧e.@睈鯥a堏貣#w{]3歄鍜謞=N玺k 罩篽a碝$3獻v*9_R.= {攮_w歐4g2置乀* 8棪呮擖呅榅T*鼶a欮諗毷|螸#5N鳆{姎s@L:勲9撘珱鯭. 囉硹筈x2|?0K}P.'繕o[UCs( 衛﹠ g籁屴学8:約趎B礪匓霯 /?PK tO& sebastianbergmann-environment-464c90d/UT傹註PK tO. Msebastianbergmann-environment-464c90d/.github/UT傹註PK tO么9 sebastianbergmann-environment-464c90d/.github/FUNDING.ymlUT傹註PK tO}5馂@S0 sebastianbergmann-environment-464c90d/.gitignoreUT傹註PK tOWl巷b2 sebastianbergmann-environment-464c90d/.php_cs.distUT傹註PK tO燏f-01  sebastianbergmann-environment-464c90d/.travis.ymlUT傹註PK tOj閅<2  sebastianbergmann-environment-464c90d/ChangeLog.mdUT傹註PK tOI“6- Gsebastianbergmann-environment-464c90d/LICENSEUT傹註PK tO蟓侷/ sebastianbergmann-environment-464c90d/README.mdUT傹註PK tO^1-)/ sebastianbergmann-environment-464c90d/build.xmlUT傹註PK tO冁窴J3 ysebastianbergmann-environment-464c90d/composer.jsonUT傹註PK tOJ涣鵕1 Ssebastianbergmann-environment-464c90d/phpunit.xmlUT傹註PK tO* sebastianbergmann-environment-464c90d/src/UT傹註PK tOB皊5 Nsebastianbergmann-environment-464c90d/src/Console.phpUT傹註PK tOー珨= g sebastianbergmann-environment-464c90d/src/OperatingSystem.phpUT傹註PK tO扨 5 "sebastianbergmann-environment-464c90d/src/Runtime.phpUT傹註PK tO, R*sebastianbergmann-environment-464c90d/tests/UT傹註PK tO&,; *sebastianbergmann-environment-464c90d/tests/ConsoleTest.phpUT傹註PK tO&祜C 3-sebastianbergmann-environment-464c90d/tests/OperatingSystemTest.phpUT傹註PK tOT垀l\; /sebastianbergmann-environment-464c90d/tests/RuntimeTest.phpUT傹註PKCx3(464c90d7bdf5ad4e8a6aea15c091fec0603d4368PK!4񗪴6type/phpunit.xmlnu刐迭PK!M顺vtype/README.mdnu刐迭PK!蓾  type/phive.xmlnu刐迭PK! 稆鼷 type/LICENSEnu刐迭PK!衟镻 $5type/tests/unit/IterableTypeTest.phpnu刐迭PK!3e"type/tests/unit/SimpleTypeTest.phpnu刐迭PK!Z[vAaa)-type/tests/unit/GenericObjectTypeTest.phpnu刐迭PK!皴 5type/tests/unit/NullTypeTest.phpnu刐迭PK!'紳dd <type/tests/unit/TypeNameTest.phpnu刐迭PK! 籽rEtype/tests/unit/TypeTest.phpnu刐迭PK! )2''$廢type/tests/unit/CallableTypeTest.phpnu刐迭PK!浚,# ftype/tests/unit/UnknownTypeTest.phpnu刐迭PK!u挒綍 雓type/tests/unit/VoidTypeTest.phpnu刐迭PK!*琛摳"衦type/tests/unit/ObjectTypeTest.phpnu刐迭PK!瓌Luu#趥type/tests/_fixture/ParentClass.phpnu刐迭PK!櫬N藠-type/tests/_fixture/ClassWithInvokeMethod.phpnu刐迭PK! 8\\"墕type/tests/_fixture/ChildClass.phpnu刐迭PK!誥!ZZ)7type/tests/_fixture/callback_function.phpnu刐迭PK!0陦type/tests/_fixture/ClassWithCallbackMethods.phpnu刐迭PK!瓅饔KK type/tests/_fixture/Iterator.phpnu刐迭PK!謣d簬type/.travis.ymlnu刐迭PK!o匵B袚type/.php_cs.distnu刐迭PK!鱉媕こtype/composer.jsonnu刐迭PK!1酳)徃type/.github/FUNDING.ymlnu刐迭PK!鰕敫type/ChangeLog.mdnu刐迭PK!X铋扏@幌type/src/TypeName.phpnu刐迭PK!)T[[@type/src/VoidType.phpnu刐迭PK!彻璹QQ噘type/src/IterableType.phpnu刐迭PK!9誳闧[ztype/src/NullType.phpnu刐迭PK!艠1咤type/src/ObjectType.phpnu刐迭PK!螉]練Ftype/src/CallableType.phpnu刐迭PK!k5)type/src/Type.phpnu刐迭PK!56媴ww'etype/src/exception/RuntimeException.phpnu刐迭PK!g@杉aa 3type/src/exception/Exception.phpnu刐迭PK!type/src/GenericObjectType.phpnu刐迭PK! 猾EE type/src/UnknownType.phpnu刐迭PK!g  type/src/SimpleType.phpnu刐迭PK!罨type/psalm.xmlnu刐迭PK!鳘霉 type/build.xmlnu刐迭PK!拿e9L type/.gitattributesnu刐迭PK!婰馅 type/.gitignorenu刐迭PK!:&diff/phpunit.xmlnu誌w洞PK!坌f)diff/README.mdnu誌w洞PK!    }?diff/LICENSEnu誌w洞PK!?承*艵diff/tests/LineTest.phpnu誌w洞PK!s'D !欼diff/tests/fixtures/.editorconfignu刐迭PK!腢$鱅diff/tests/fixtures/patch.txtnu誌w洞PK!s'D % Kdiff/tests/fixtures/out/.editorconfignu刐迭PK!鞴DD"mKdiff/tests/fixtures/out/.gitignorenu刐迭PK!Z$>//'Ldiff/tests/fixtures/serialized_diff.binnu刐迭PK!C痉A塡diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txtnu刐迭PK!2##A鸤diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txtnu刐迭PK!&/鬍EA廬diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txtnu刐迭PK!AE^diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txtnu刐迭PK!@k閻禴diff/tests/fixtures/patch2.txtnu誌w洞PK!嘜鼺  瀈diff/tests/ChunkTest.phpnu誌w洞PK!犡锨><><餱diff/tests/DifferTest.phpnu誌w洞PK!"wdiff/tests/ParserTest.phpnu誌w洞PK!⺋^^Ldiff/tests/DiffTest.phpnu誌w洞PK!陫$辻y.窈diff/tests/TimeEfficientImplementationTest.phpnu刐迭PK!耦k朦冉diff/tests/Utils/FileUtils.phpnu刐迭PK!櫠グd,d,/diff/tests/Utils/UnifiedDiffAssertTraitTest.phpnu刐迭PK!"诟+++枕diff/tests/Utils/UnifiedDiffAssertTrait.phpnu刐迭PK! :diff/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.phpnu刐迭PK!?婢歗^3?*diff/tests/Exception/ConfigurationExceptionTest.phpnu刐迭PK!7,85/diff/tests/Exception/InvalidArgumentExceptionTest.phpnu刐迭PK!x窎+J3diff/tests/LongestCommonSubsequenceTest.phpnu刐迭PK!2otA:-Jdiff/tests/Output/UnifiedDiffOutputBuilderDataProvider.phpnu刐迭PK!0I `diff/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.phpnu刐迭PK!谲珯<'<'OIsdiff/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.phpnu刐迭PK!访+軻DVD8diff/tests/Output/StrictUnifiedDiffOutputBuilderTest.phpnu刐迭PK!z6|dd/逻diff/tests/Output/DiffOnlyOutputBuilderTest.phpnu刐迭PK!(& & @呯diff/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.phpnu刐迭PK!zl浤V V 2diff/tests/Output/UnifiedDiffOutputBuilderTest.phpnu刐迭PK!奟~))4誉diff/tests/Output/AbstractChunkOutputBuilderTest.phpnu刐迭PK! %y0`diff/tests/MemoryEfficientImplementationTest.phpnu刐迭PK!墍 ?diff/.travis.ymlnu誌w洞PK!姜S  bdiff/.php_cs.distnu刐迭PK!K^/diff/composer.jsonnu誌w洞PK!运睌2diff/.github/stale.ymlnu刐迭PK!鎮蠥8diff/ChangeLog.mdnu刐迭PK!e捾Mdiff/src/Line.phpnu誌w洞PK!>傾s s >騊diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.phpnu刐迭PK!>柄D/覽diff/src/LongestCommonSubsequenceCalculator.phpnu刐迭PK!S9R))^diff/src/Differ.phpnu誌w洞PK!& 歉 sdiff/src/Parser.phpnu誌w洞PK!v莬寂ndiff/src/Chunk.phpnu誌w洞PK!S dhudiff/src/Diff.phpnu誌w洞PK!)-]diff/src/Exception/ConfigurationException.phpnu刐迭PK!>faa {diff/src/Exception/Exception.phpnu刐迭PK!L}f/,diff/src/Exception/InvalidArgumentException.phpnu刐迭PK!KU{@ @ < diff/src/TimeEfficientLongestCommonSubsequenceCalculator.phpnu刐迭PK!粮w.赴diff/src/Output/AbstractChunkOutputBuilder.phpnu刐迭PK!柳0  .diff/src/Output/DiffOutputBuilderInterface.phpnu刐迭PK!K5P**2diff/src/Output/StrictUnifiedDiffOutputBuilder.phpnu刐迭PK!榮 ,嶄diff/src/Output/UnifiedDiffOutputBuilder.phpnu刐迭PK!鯩'11)diff/src/Output/DiffOnlyOutputBuilder.phpnu刐迭PK!0diff/build.xmlnu誌w洞PK!Ju苘,,|diff/.gitignorenu誌w洞PK!:recursion-context/phpunit.xmlnu刐迭PK!痓樤recursion-context/README.mdnu誌w洞PK!绅recursion-context/LICENSEnu誌w洞PK!貭 9ee'6recursion-context/tests/ContextTest.phpnu誌w洞PK!?-recursion-context/.travis.ymlnu誌w洞PK!6G訪LW/recursion-context/composer.jsonnu誌w洞PK!若绸JJ#2recursion-context/src/Exception.phpnu誌w洞PK!mH24recursion-context/src/InvalidArgumentException.phpnu誌w洞PK!{{!6recursion-context/src/Context.phpnu誌w洞PK!𠢻33OFrecursion-context/build.xmlnu誌w洞PK!纫Mqq虸recursion-context/.gitignorenu誌w洞PK!侓姄奐comparator/phpunit.xmlnu刐迭PK!|m戤xx肕comparator/README.mdnu誌w洞PK!:  Rcomparator/LICENSEnu誌w洞PK! K9 +蔢comparator/tests/ResourceComparatorTest.phpnu誌w洞PK!)肪Bnn-dcomparator/tests/MockObjectComparatorTest.phpnu誌w洞PK!憥椲)蝭comparator/tests/ObjectComparatorTest.phpnu誌w洞PK!$n鼺 F *5comparator/tests/NumericComparatorTest.phpnu誌w洞PK!鏓运(諘comparator/tests/ArrayComparatorTest.phpnu誌w洞PK!a )栅comparator/tests/DoubleComparatorTest.phpnu誌w洞PK!C砯f*郾comparator/tests/DOMNodeComparatorTest.phpnu誌w洞PK!*訽 '浡comparator/tests/TypeComparatorTest.phpnu誌w洞PK!@@,comparator/tests/ExceptionComparatorTest.phpnu誌w洞PK!!*Kcomparator/tests/ComparisonFailureTest.phpnu刐迭PK!?顎'xx comparator/tests/FactoryTest.phpnu誌w洞PK!堚U剫/tcomparator/tests/_fixture/ClassWithToString.phpnu刐迭PK!踩"^comparator/tests/_fixture/Book.phpnu刐迭PK!!疖QQ1Ccomparator/tests/_fixture/TestClassComparator.phpnu刐迭PK!唓\$觖comparator/tests/_fixture/Struct.phpnu刐迭PK!櫆#..'椠comparator/tests/_fixture/TestClass.phpnu刐迭PK!俐)mcomparator/tests/_fixture/SampleClass.phpnu刐迭PK!#06$comparator/tests/_fixture/Author.phpnu刐迭PK!謷羘)comparator/tests/ScalarComparatorTest.phpnu誌w洞PK!T航+comparator/tests/DateTimeComparatorTest.phpnu誌w洞PK!p鄕=! ! 32comparator/tests/SplObjectStorageComparatorTest.phpnu誌w洞PK!M仏?comparator/.travis.ymlnu誌w洞PK!札瞒  oAcomparator/.php_cs.distnu刐迭PK! v::羅comparator/composer.jsonnu誌w洞PK!9Cdcomparator/.github/stale.ymlnu刐迭PK!綹诸Njcomparator/ChangeLog.mdnu刐迭PK!枍頞'硠comparator/src/MockObjectComparator.phpnu誌w洞PK!腤b鯯 S $緣comparator/src/DOMNodeComparator.phpnu誌w洞PK!捩``"ecomparator/src/ArrayComparator.phpnu誌w洞PK!賴1d d comparator/src/Factory.phpnu誌w洞PK!RO^P P %挪comparator/src/DateTimeComparator.phpnu誌w洞PK!臽jcomparator/src/Comparator.phpnu誌w洞PK!媁曛-@comparator/src/SplObjectStorageComparator.phpnu誌w洞PK!G棅相!scomparator/src/TypeComparator.phpnu誌w洞PK!爇f&ぴcomparator/src/ExceptionComparator.phpnu誌w洞PK!ёw w #奄comparator/src/ScalarComparator.phpnu誌w洞PK!槬26#涙comparator/src/ObjectComparator.phpnu誌w洞PK! 廣 $comparator/src/ComparisonFailure.phpnu誌w洞PK!vz戝pp#comparator/src/DoubleComparator.phpnu誌w洞PK!佾聊**%comparator/src/ResourceComparator.phpnu誌w洞PK!_衝逊$comparator/src/NumericComparator.phpnu誌w洞PK! 祧'comparator/build.xmlnu誌w洞PK!⊥楯Jacomparator/.gitignorenu誌w洞PK!:exporter/phpunit.xmlnu刐迭PK!i4+QT T exporter/README.mdnu誌w洞PK!A猠)*exporter/LICENSEnu誌w洞PK!>k 0exporter/tests/ExporterTest.phpnu誌w洞PK!尪喋^^exporter/.travis.ymlnu誌w洞PK!煮/LLESexporter/.php_cs.distnu刐迭PK!卽蒅謖exporter/composer.jsonnu誌w洞PK!1酳)exporter/.github/FUNDING.ymlnu刐迭PK!M虫脀wwexporter/ChangeLog.mdnu刐迭PK!燑E#E#聓exporter/src/Exporter.phpnu誌w洞PK!l躷**Pexporter/build.xmlnu誌w洞PK!纫Mqq饥exporter/.gitignorenu誌w洞PK!j1,presource-operations/README.mdnu誌w洞PK!I瑠  棩resource-operations/LICENSEnu誌w洞PK!Cb憔4铽resource-operations/tests/ResourceOperationsTest.phpnu刐迭PK!羪=m resource-operations/.php_cs.distnu刐迭PK!辺4&瓮resource-operations/build/generate.phpnu券蓓PK!KYY!*resource-operations/composer.jsonnu誌w洞PK!9%哉resource-operations/.github/stale.ymlnu刐迭PK!vT^^ 枸resource-operations/ChangeLog.mdnu刐迭PK!h諕U扷.栠resource-operations/src/ResourceOperations.phpnu誌w洞PK!3*5resource-operations/build.xmlnu誌w洞PK!閪'8resource-operations/.gitignorenu誌w洞PK!S$79code-unit-reverse-lookup/phpunit.xmlnu誌w洞PK!蔥"<code-unit-reverse-lookup/README.mdnu誌w洞PK!XX掊 >code-unit-reverse-lookup/LICENSEnu誌w洞PK! 章-IEcode-unit-reverse-lookup/tests/WizardTest.phpnu誌w洞PK!縶z峱p$hIcode-unit-reverse-lookup/.travis.ymlnu誌w洞PK!D&,Kcode-unit-reverse-lookup/composer.jsonnu誌w洞PK!T Ncode-unit-reverse-lookup/.php_csnu誌w洞PK!犩? %鯱code-unit-reverse-lookup/ChangeLog.mdnu誌w洞PK!廅e e 'Xcode-unit-reverse-lookup/src/Wizard.phpnu誌w洞PK!bx0"""糲code-unit-reverse-lookup/build.xmlnu誌w洞PK!75=#0gcode-unit-reverse-lookup/.gitignorenu誌w洞PK!k鴢啖global-state/phpunit.xmlnu刐迭PK!暾 Zgg宬global-state/README.mdnu誌w洞PK! 廯  9nglobal-state/LICENSEnu誌w洞PK!Q.姴#噒global-state/tests/RestorerTest.phpnu刐迭PK!.圞'寎global-state/tests/CodeExporterTest.phpnu刐迭PK!両g $唩global-state/tests/BlacklistTest.phpnu誌w洞PK!^f0VV4◣global-state/tests/_fixture/BlacklistedInterface.phpnu誌w洞PK!2J豄K-bglobal-state/tests/_fixture/SnapshotTrait.phpnu誌w洞PK! 櫓ll5 global-state/tests/_fixture/BlacklistedChildClass.phpnu誌w洞PK!\彑醡m0蹞global-state/tests/_fixture/BlacklistedClass.phpnu誌w洞PK!@l\KK1〞global-state/tests/_fixture/SnapshotFunctions.phpnu誌w洞PK! 殾祿6Tglobal-state/tests/_fixture/BlacklistedImplementor.phpnu誌w洞PK!m豵7ww3Mglobal-state/tests/_fixture/SnapshotDomDocument.phpnu誌w洞PK!斋噟-'global-state/tests/_fixture/SnapshotClass.phpnu誌w洞PK!#6global-state/tests/SnapshotTest.phpnu誌w洞PK!鼊c掱/global-state/.travis.ymlnu誌w洞PK!s?C>>岚global-state/.php_cs.distnu刐迭PK!D昪  hglobal-state/composer.jsonnu誌w洞PK!9接global-state/.github/stale.ymlnu刐迭PK!,K鏵MM寿global-state/ChangeLog.mdnu刐迭PK!:[ [ `global-state/src/Blacklist.phpnu誌w洞PK!訐;\ global-state/src/Restorer.phpnu誌w洞PK!`(C!global-state/src/CodeExporter.phpnu誌w洞PK!脰S蒎%%global-state/src/Snapshot.phpnu誌w洞PK!p樆茊06global-state/src/exceptions/RuntimeException.phpnu刐迭PK! pp)8global-state/src/exceptions/Exception.phpnu刐迭PK! u9global-state/build.xmlnu誌w洞PK!凎%lGG->global-state/.gitignorenu誌w洞PK!:>object-reflector/phpunit.xmlnu刐迭PK!蓡糀object-reflector/README.mdnu刐迭PK!R6孎object-reflector/LICENSEnu刐迭PK!H鴜.螸object-reflector/tests/ObjectReflectorTest.phpnu刐迭PK!滋熵/Uobject-reflector/tests/_fixture/ParentClass.phpnu刐迭PK!镜辩AA.IWobject-reflector/tests/_fixture/ChildClass.phpnu刐迭PK!宛A鑉object-reflector/tests/_fixture/ClassWithIntegerAttributeName.phpnu刐迭PK! 蘼\object-reflector/.travis.ymlnu刐迭PK!茶p-^object-reflector/composer.jsonnu刐迭PK!哂!object-enumerator/ChangeLog.mdnu誌w洞PK!n$*a66#object-enumerator/src/Exception.phpnu誌w洞PK!濢'韝x2⊙object-enumerator/src/InvalidArgumentException.phpnu誌w洞PK!Q $k k ${object-enumerator/src/Enumerator.phpnu誌w洞PK!E溬韀[:object-enumerator/build.xmlnu誌w洞PK!5h=ee噜object-enumerator/.gitignorenu誌w洞PK!+斜曟戓environment/phpunit.xmlnu誌w洞PK!}L句environment/README.mdnu誌w洞PK!额徇  environment/LICENSEnu誌w洞PK!&祜)`environment/tests/OperatingSystemTest.phpnu刐迭PK!涒茹zz!;environment/tests/ConsoleTest.phpnu誌w洞PK!捻|謃 _ ! environment/tests/RuntimeTest.phpnu誌w洞PK!.瞈 environment/.travis.ymlnu誌w洞PK!Wl巷bb environment/.php_cs.distnu刐迭PK!聹o. environment/composer.jsonnu誌w洞PK!么1 environment/.github/FUNDING.ymlnu刐迭PK!W簛  1 environment/ChangeLog.mdnu刐迭PK!O< zz螾P忮 code-unit/SECURITY.mdnu刐迭PK!l`%w code-unit/src/InterfaceMethodUnit.phpnu刐迭PK!XVX哧 code-unit/src/Mapper.phpnu刐迭PK!馢鳈  ! code-unit/src/ClassMethodUnit.phpnu刐迭PK!TJ丝Z code-unit/src/TraitUnit.phpnu刐迭PK!慆N'$ code-unit/src/CodeUnitCollection.phpnu刐迭PK!氾 code-unit/src/FileUnit.phpnu刐迭PK!%閨UU,O code-unit/src/CodeUnitCollectionIterator.phpnu刐迭PK!wkjj& code-unit/src/exceptions/Exception.phpnu刐迭PK!梦- code-unit/src/exceptions/NoTraitException.phpnu刐迭PK!O铏0 code-unit/src/exceptions/ReflectionException.phpnu刐迭PK!6*a5 code-unit/src/exceptions/InvalidCodeUnitException.phpnu刐迭PK! 1Z  !! code-unit/src/TraitMethodUnit.phpnu刐迭PK!=i3030 $ code-unit/src/CodeUnit.phpnu刐迭PK!穜馳圱 code-unit/src/FunctionUnit.phpnu刐迭PK!=%t豓 code-unit/src/InterfaceUnit.phpnu刐迭PK!m=,Y code-unit/src/ClassUnit.phpnu刐迭PK!誈3伹 p[ code-unit/ChangeLog.mdnu刐迭PK!碢@冫}e code-unit/LICENSEnu刐迭PK!w怓F筴 lines-of-code/composer.jsonnu刐迭PK!駳==Jp lines-of-code/README.mdnu刐迭PK!KJu蝨 lines-of-code/SECURITY.mdnu刐迭PK!kJM  )寍 lines-of-code/src/LineCountingVisitor.phpnu刐迭PK!0+qq) lines-of-code/src/Exception/Exception.phpnu刐迭PK! 8藝 lines-of-code/src/Exception/IllogicalValuesException.phpnu刐迭PK!/韲0詨 lines-of-code/src/Exception/RuntimeException.phpnu刐迭PK!趛<6粙 lines-of-code/src/Exception/NegativeValueException.phpnu刐迭PK!歴稠^ ^ !詬 lines-of-code/src/LinesOfCode.phpnu刐迭PK!i杈  儧 lines-of-code/src/Counter.phpnu刐迭PK!D┿妞 lines-of-code/ChangeLog.mdnu刐迭PK!碢@冫' lines-of-code/LICENSEnu刐迭PK!E >螾Pg type/SECURITY.mdnu刐迭PK!?  鞒 type/src/type/UnknownType.phpnu刐迭PK!@繒5#O type/src/type/GenericObjectType.phpnu刐迭PK!鰅 坊 type/src/type/UnionType.phpnu刐迭PK!訂顂懬 type/src/type/StaticType.phpnu刐迭PK!P俕+曂 type/src/type/Type.phpnu刐迭PK!皟勣 type/src/type/VoidType.phpnu刐迭PK!嗏骞kk斸 type/src/type/TrueType.phpnu刐迭PK!祹 I type/src/type/NeverType.phpnu刐迭PK!L/^ type/src/type/MixedType.phpnu刐迭PK!-{秒 type/src/type/ObjectType.phpnu刐迭PK!2A驺* type/src/type/IterableType.phpnu刐迭PK!劘古66[ type/src/type/SimpleType.phpnu刐迭PK!o| type/src/type/NullType.phpnu刐迭PK!錠!pp> type/src/type/FalseType.phpnu刐迭PK!<悚 " type/src/type/IntersectionType.phpnu刐迭PK!/㥮妊6 type/src/type/CallableType.phpnu刐迭PK!@峣..U# type/src/ReflectionMapper.phpnu刐迭PK! 8 type/src/Parameter.phpnu刐迭PK!ㄞ < type/infection.jsonnu刐迭PK!E >螾P$< code-unit-reverse-lookup/SECURITY.mdnu刐迭PK!樧O *? code-unit-reverse-lookup/.psalm/config.xmlnu刐迭PK!aB俔$$,螦 code-unit-reverse-lookup/.psalm/baseline.xmlnu刐迭PK!KJuOC environment/SECURITY.mdnu刐迭PK!KJu K global-state/SECURITY.mdnu刐迭PK!┋  萊 global-state/src/ExcludeList.phpnu刐迭PK!KJu1] exporter/SECURITY.mdnu刐迭PK!KJu阣 recursion-context/SECURITY.mdnu刐迭PK!颣dj琹 recursion-context/ChangeLog.mdnu刐迭PK!N2屗;;}s complexity/composer.jsonnu刐迭PK![驾x complexity/README.mdnu刐迭PK!KJu_| complexity/SECURITY.mdnu刐迭PK!%#2 7 complexity/src/Visitor/ComplexityCalculatingVisitor.phpnu刐迭PK!;山,A9 complexity/src/Visitor/CyclomaticComplexityCalculatingVisitor.phpnu刐迭PK! 曀$9 9 / complexity/src/Calculator.phpnu刐迭PK!-mm&耽 complexity/src/Exception/Exception.phpnu刐迭PK!lE緝-x complexity/src/Exception/RuntimeException.phpnu刐迭PK! ;;(X complexity/src/Complexity/Complexity.phpnu刐迭PK!h:氆 complexity/src/Complexity/ComplexityCollectionIterator.phpnu刐迭PK!墄縣m m 2l complexity/src/Complexity/ComplexityCollection.phpnu刐迭PK!幸H; complexity/ChangeLog.mdnu刐迭PK!碢@冫 complexity/LICENSEnu刐迭PK!E >螾PS version/SECURITY.mdnu刐迭PK!>Bt簜嫣 version/ChangeLog.mdnu刐迭PK!E >螾P object-reflector/SECURITY.mdnu刐迭PK!E >螾PH object-enumerator/SECURITY.mdnu刐迭PK!荹9_逯 cli-parser/composer.jsonnu刐迭PK!b导++" cli-parser/README.mdnu刐迭PK!KJu戇 cli-parser/SECURITY.mdnu刐迭PK!jk L cli-parser/src/Parser.phpnu刐迭PK!@1渓l'@ cli-parser/src/exceptions/Exception.phpnu刐迭PK! ?3A cli-parser/src/exceptions/OptionDoesNotAllowArgumentException.phpnu刐迭PK!男瓅|4 cli-parser/src/exceptions/UnknownOptionException.phpnu刐迭PK! ,x6 cli-parser/src/exceptions/AmbiguousOptionException.phpnu刐迭PK!亷顆D cli-parser/src/exceptions/RequiredOptionArgumentMissingException.phpnu刐迭PK!矅┽LL cli-parser/ChangeLog.mdnu刐迭PK!жk cli-parser/LICENSEnu刐迭PK!KJu diff/SECURITY.mdnu刐迭PK!KJuw comparator/SECURITY.mdnu刐迭PK!t 閙m'2% comparator/src/exceptions/Exception.phpnu刐迭PK!必觾.& comparator/src/exceptions/RuntimeException.phpnu刐迭PK!謧鬁暅暅1( type/6c86af81e3d675f46bfc7bded8179ef036eacbe6.zipnu誌w洞PK!N-:耩耩1团 diff/e6140b7bac501c4f9a1ee510440e3b8aff26e8d5.zipnu誌w洞PK!&恌f> recursion-context/f8c1c1968fbcf5ae9af5ec6ceb30aab26fa949b2.zipnu誌w洞PK!送生嗒嗒70 comparator/6f6a5004ba92a72cc62a4983fe102df11076b827.zipnu誌w洞PK!<韢5}55wexporter/331a7ff7006f116504fd143fccd63dbfda2e80b3.zipnu誌w洞PK!s6T汖S齋@Yresource-operations/5a27fbb9d458caeca4ba4f68794395b0673dcbef.zipnu誌w洞PK!a磦4ttE code-unit-reverse-lookup/9fdb38e356a0265a2dd6b64495413906b9366038.zipnu誌w洞PK!!.襒襒9)global-state/5eec8e48052fd6b5c9c52d704890e41edcd90f37.zipnu誌w洞PK!D駆甍((=陚object-reflector/5c43ed184bdc32c1be2cebdc45c53727b61c366e.zipnu誌w洞PK!#34Pversion/c315a200d32565a6d8ebb3495cb5ae34c5ced3c8.zipnu誌w洞PK!g~%~%>iobject-enumerator/38cda1088c4ea6478e144eed041619e5c731b8ba.zipnu誌w洞PK!*[饪;;8Uenvironment/f24906d5c02cabcc22893eed6efed53b55a529f6.zipnu誌w洞PKJ"