From d160737fb23874b83ed20360a00bee9f87512d47 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 7 May 2021 14:15:16 +0200 Subject: [PATCH 01/16] Avoid die while decoding erroneus json data --- pandora_server/lib/PandoraFMS/Tools.pm | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/Tools.pm b/pandora_server/lib/PandoraFMS/Tools.pm index f71287822a..19e6a4987d 100755 --- a/pandora_server/lib/PandoraFMS/Tools.pm +++ b/pandora_server/lib/PandoraFMS/Tools.pm @@ -2462,12 +2462,20 @@ sub p_decode_json { my ($pa_config, $data) = @_; my $decoded_data; - if ($JSON::VERSION > 2.90) { - # Initialize JSON manager. - my $json = JSON->new->utf8->allow_nonref; - $decoded_data = $json->decode($data); - } else { - $decoded_data = decode_json($data); + eval { + local $SIG{__DIE__}; + if ($JSON::VERSION > 2.90) { + # Initialize JSON manager. + my $json = JSON->new->utf8->allow_nonref; + $decoded_data = $json->decode($data); + } else { + $decoded_data = decode_json($data); + } + }; + if ($@){ + if (defined($data)) { + logger($pa_config, 'Failed to decode data: '.$@, 5); + } } return $decoded_data; From b3ac981681e0cc0d07a02abccd7342bd612ac96c Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 14 May 2021 12:43:18 +0200 Subject: [PATCH 02/16] Gracefully stop pandorafms threads --- pandora_server/bin/pandora_server | 32 +++++++++++++- .../lib/PandoraFMS/ProducerConsumerServer.pm | 34 +++++++++++--- pandora_server/lib/PandoraFMS/Server.pm | 11 +++-- pandora_server/lib/PandoraFMS/Tools.pm | 44 ++++++++++++++++++- 4 files changed, 110 insertions(+), 11 deletions(-) diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server index d82944f93b..fa3d1bbfcf 100755 --- a/pandora_server/bin/pandora_server +++ b/pandora_server/bin/pandora_server @@ -75,6 +75,36 @@ sub pandora_shutdown () { # Stop the netflow daemon pandora_stop_netflow_daemon (); + + # Stop server threads. + stop_server_threads(); + + # Wait threads. + my $max_wait = 10; + my $waiting = 1; + my $start_waiting = time(); + while ($waiting eq 1) { + $waiting = 0; + foreach my $thr (threads->list()) { + #my $tid = shift @{$self->{'_threads'}}; + #my $thr = threads->object($tid); + + if (defined($thr)) { + if ($thr->is_joinable()) { + $thr->join(); + } else { + $thr->kill('KILL'); + if (time() - $start_waiting < $max_wait) { + $waiting = 1; + } else { + # Some discovery external scripts tasks. + $thr->detach(); + } + } + } + } + sleep (1); + } print_message (\%Config, ' [*] Shutting down ' . $Config{'servername'} . "(received signal)...\n", 1); db_disconnect ($DBH); @@ -109,7 +139,7 @@ sub pandora_startup () { start_server_thread(\&pandora_process_policy_queue, [\%Config]) if ($Config{'__enterprise_enabled'} == 1 && $Config{'policy_manager'} == 1); # Start the event replication thread. Do not start with start_server_thread, this thread may exit on its own. - threads->create(\&pandora_process_event_replication, \%Config) if($Config{'__enterprise_enabled'} == 1 && $Config{'event_replication'} == 1); + start_server_thread(\&pandora_process_event_replication, [\%Config]) if($Config{'__enterprise_enabled'} == 1 && $Config{'event_replication'} == 1); pandora_audit (\%Config, $Config{'rb_product_name'} . ' Server Daemon starting', 'SYSTEM', 'System', $DBH); diff --git a/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm b/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm index 3a9a73d46c..0dab871761 100644 --- a/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm +++ b/pandora_server/lib/PandoraFMS/ProducerConsumerServer.pm @@ -88,15 +88,35 @@ sub run ($$$$$) { # Launch consumer threads for (1..$self->getNumThreads ()) { - my $thr = threads->create (\&PandoraFMS::ProducerConsumerServer::data_consumer, $self, - $task_queue, $pending_tasks, $sem, $task_sem); + my $thr = threads->create ({'exit' => 'thread_only'}, + sub { + my ($self, $task_queue, $pending_tasks, $sem, $task_sem) = @_; + local $SIG{'KILL'} = sub { + $RUN = 0; + $task_sem->up(); + $sem->up(); + exit 0; + }; + PandoraFMS::ProducerConsumerServer::data_consumer->(@_); + }, $self, $task_queue, $pending_tasks, $sem, $task_sem + ); return unless defined ($thr); $self->addThread ($thr->tid ()); } # Launch producer thread - my $thr = threads->create (\&PandoraFMS::ProducerConsumerServer::data_producer, $self, - $task_queue, $pending_tasks, $sem, $task_sem); + my $thr = threads->create ({'exit' => 'thread_only'}, + sub { + my ($self, $task_queue, $pending_tasks, $sem, $task_sem) = @_; + local $SIG{'KILL'} = sub { + $RUN = 0; + $task_sem->up(); + $sem->up(); + exit 0; + }; + PandoraFMS::ProducerConsumerServer::data_producer->(@_); + }, $self, $task_queue, $pending_tasks, $sem, $task_sem + ); return unless defined ($thr); $self->addThread ($thr->tid ()); } @@ -124,6 +144,7 @@ sub data_producer ($$$$$) { foreach my $task (@tasks) { $sem->down; + last if ($RUN == 0); if (defined $pending_tasks->{$task}) { $sem->up; next; @@ -137,6 +158,7 @@ sub data_producer ($$$$$) { $sem->up; } + last if ($RUN == 0); # Update queue size for statistics $self->setQueueSize (scalar @{$task_queue}); @@ -151,6 +173,7 @@ sub data_producer ($$$$$) { $task_sem->up($self->getNumThreads ()); db_disconnect ($dbh); + exit 0; } ############################################################################### @@ -168,12 +191,12 @@ sub data_consumer ($$$$$) { $self->setDBH ($dbh); while ($RUN == 1) { - # Wait for data $self->logThread('[CONSUMER] Waiting for data.'); $task_sem->down; $sem->down; + last if ($RUN == 0); my $task = shift (@{$task_queue}); $sem->up; @@ -198,6 +221,7 @@ sub data_consumer ($$$$$) { } db_disconnect ($dbh); + exit 0; } ############################################################################### diff --git a/pandora_server/lib/PandoraFMS/Server.pm b/pandora_server/lib/PandoraFMS/Server.pm index d3587556d8..0972707e3f 100644 --- a/pandora_server/lib/PandoraFMS/Server.pm +++ b/pandora_server/lib/PandoraFMS/Server.pm @@ -68,7 +68,12 @@ sub run ($$) { $self->setServerID (); for (1..$self->{'_num_threads'}) { - my $thr = threads->create (\&{$func}, $self); + my $thr = threads->create ({'exit' => 'thread_only'}, + sub { + local $SIG{'KILL'} = sub { exit 0; }; + $func->(@_); + }, $self + ); return unless defined ($thr); push (@{$self->{'_threads'}}, $thr->tid ()); } @@ -301,12 +306,12 @@ sub stop ($) { 0, $self->{'_server_type'}, 0, 0); }; - # Detach server threads + # Sigkill all server threads foreach my $tid (@{$self->{'_threads'}}) { my $thr = threads->object($tid); next unless defined ($thr); - $thr->detach(); + $thr->kill('KILL'); } } diff --git a/pandora_server/lib/PandoraFMS/Tools.pm b/pandora_server/lib/PandoraFMS/Tools.pm index 19e6a4987d..8f994092aa 100755 --- a/pandora_server/lib/PandoraFMS/Tools.pm +++ b/pandora_server/lib/PandoraFMS/Tools.pm @@ -164,6 +164,7 @@ our @EXPORT = qw( ui_get_full_url p_encode_json p_decode_json + get_server_name ); # ID of the different servers @@ -2146,7 +2147,12 @@ sub start_server_thread { # Signal the threads to run. $THRRUN = 1; - my $thr = threads->create($fn, @{$args}); + my $thr = threads->create({'exit' => 'thread_only'}, sub { + local $SIG{'KILL'} = sub { + exit 0; + }; + $fn->(@_) + }, @{$args}); push(@ServerThreads, $thr); } @@ -2173,7 +2179,7 @@ sub stop_server_threads { $THRRUN = 0; foreach my $thr (@ServerThreads) { - $thr->join(); + $thr->kill('KILL'); } @ServerThreads = (); @@ -2481,6 +2487,40 @@ sub p_decode_json { return $decoded_data; } +################################################################################ +# String name for server type. +################################################################################ +sub get_server_name { + my ($server_type) = @_; + + if (!is_numeric($server_type)) { + return 'UNKNOWN'; + } + + return "DATASERVER" if ($server_type eq DATASERVER); + return "NETWORKSERVER" if ($server_type eq NETWORKSERVER); + return "SNMPCONSOLE" if ($server_type eq SNMPCONSOLE); + return "DISCOVERYSERVER" if ($server_type eq DISCOVERYSERVER); + return "PLUGINSERVER" if ($server_type eq PLUGINSERVER); + return "PREDICTIONSERVER" if ($server_type eq PREDICTIONSERVER); + return "WMISERVER" if ($server_type eq WMISERVER); + return "EXPORTSERVER" if ($server_type eq EXPORTSERVER); + return "INVENTORYSERVER" if ($server_type eq INVENTORYSERVER); + return "WEBSERVER" if ($server_type eq WEBSERVER); + return "EVENTSERVER" if ($server_type eq EVENTSERVER); + return "ICMPSERVER" if ($server_type eq ICMPSERVER); + return "SNMPSERVER" if ($server_type eq SNMPSERVER); + return "SATELLITESERVER" if ($server_type eq SATELLITESERVER); + return "TRANSACTIONALSERVER" if ($server_type eq TRANSACTIONALSERVER); + return "MFSERVER" if ($server_type eq MFSERVER); + return "SYNCSERVER" if ($server_type eq SYNCSERVER); + return "WUXSERVER" if ($server_type eq WUXSERVER); + return "SYSLOGSERVER" if ($server_type eq SYSLOGSERVER); + return "PROVISIONINGSERVER" if ($server_type eq PROVISIONINGSERVER); + return "MIGRATIONSERVER" if ($server_type eq MIGRATIONSERVER); + + return "UNKNOWN"; +} 1; __END__ From b70a056dc513d04ae4c755c320961253f251a576 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 14 May 2021 13:07:56 +0200 Subject: [PATCH 03/16] Avoid offline components to be marked as failed --- pandora_server/bin/pandora_server | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server index fa3d1bbfcf..d1e79abbe2 100755 --- a/pandora_server/bin/pandora_server +++ b/pandora_server/bin/pandora_server @@ -802,7 +802,8 @@ sub main() { db_do ($DBH, "UPDATE tserver SET status = -1 - WHERE UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(keepalive) > 2*server_keepalive" + WHERE UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(keepalive) > 2*server_keepalive + AND status != 0" ); # Set the master server From 38a7db96f89af5a9725385929ab7aa1d86a9feef Mon Sep 17 00:00:00 2001 From: Kevin Date: Thu, 27 May 2021 14:53:07 +0200 Subject: [PATCH 04/16] Added signing and notarizing process --- .../unix/Darwin/dmg/build_darwin_dmg.sh | 57 +++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh index 79078a8725..8ca3382310 100644 --- a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh +++ b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh @@ -6,6 +6,13 @@ function error { exit 1 } +# Gets information about Apple notarization process +function get_notarization_info() { + CALL=$(xcrun altool --notarization-info "$1" -u $APPLE_USER -p "$APPLE_PASS"| grep -Ei "Status:|Status Message") + STATUS=`echo $CALL |grep -ic "in progress"` + MESSAGE=`echo $CALL |grep -ic "package approved"` +} + # Keeping this for future CICD integration if [ "$CI_PROJECT_DIR" != "" ]; then LOCALINST="$CODEHOME/pandora_agents/unix/Darwin/dmg" @@ -36,9 +43,13 @@ fi BUILD_DMG="$BUILD_PATH/build" BUILD_TMP="$BUILD_PATH/buildtmp" +APPLE_USER="kevin.rojas@pandorafms.com" +APPLE_PASS="@keychain:signing" +APPLE_DEVNAME="Developer ID Installer: Artica Soluciones Tecnologicas SL" +APPLE_DEVID="Q35RP2Y7WU" FULLNAME="$DMGNAME-$VERSION.dmg" -echo "VERSION-"$VERSION" NAME-"$DMGNAME +printf "VERSION-'$VERSION' NAME-'$DMGNAME'\n" pushd . cd $LOCALINST @@ -49,8 +60,8 @@ cp ../../../../pandora_agents/unix/tentacle* files/pandorafms/ cp -R ../../../../pandora_agents/unix/plugins files/pandorafms/ cp -R ../../../../pandora_agents/unix/man files/pandorafms/ cp -R ../../../../pandora_agents/unix/Darwin/pandora_agent.conf files/pandorafms/ -mkdir $BUILD_DMG -mkdir $BUILD_TMP +mkdir -p $BUILD_DMG +mkdir -p $BUILD_TMP # Build pandorafms agent component pkgbuild --root files/pandorafms/ \ @@ -72,13 +83,47 @@ productbuild --distribution extras/distribution.xml \ --resources resources \ --scripts scripts \ --version "$VERSION" \ - $BUILD_TMP/pandorafms_agent.pkg || error + $BUILD_TMP/pfms_agent.pkg || error + +# Sign the package +productsign --sign "$APPLE_DEVNAME ($APPLE_DEVID)" \ + $BUILD_TMP/pfms_agent.pkg \ + $BUILD_TMP/pandorafms_agent.pkg + +# Notarize +NOTARIZE=$(xcrun altool --notarize-app \ + --primary-bundle-id "com.pandorafms.pandorafms" \ + --asc-provider "$APPLE_DEVID" \ + --username "$APPLE_USER" \ + --password "$APPLE_PASS" \ + --file "$BUILD_TMP/pandorafms_agent.pkg" 2>&1) + +RUUID=$(echo $NOTARIZE | awk '{print $NF}') + +printf "\nPkg sent for notarization (Request UUID= $RUUID ). This may take a few minutes...\n" + +# In order to staple the pkg, notarization must be approved! +STATUS=1 +while [ $STATUS -eq 1 ]; do + get_notarization_info "$RUUID" + printf "Pkg not yet notarized by Apple. Trying again in 60 seconds...\n" + sleep 60 +done + +if [ $MESSAGE -eq 1 ] +then + echo "Package notarized. Stapling pkg..." + xcrun stapler staple "$BUILD_TMP/pandorafms_agent.pkg" || error +fi + # Clean and prepare dmg creation +rm $BUILD_TMP/pfms_agent.pkg rm $BUILD_TMP/pandorafms_src.pdk rm $BUILD_TMP/pandorafms_uninstall.pdk #Create dmg file +printf "Creating DMG file...\n" hdiutil create -volname "Pandora FMS agent installer" \ -srcfolder "$BUILD_TMP" \ -ov -format UDZO \ @@ -90,6 +135,10 @@ DeRez -only icns extras/pandora_installer.png > tmpicns.rsrc || error Rez -append tmpicns.rsrc -o "$BUILD_DMG/$FULLNAME" || error SetFile -a C "$BUILD_DMG/$FULLNAME" || error +# Sign DMG. Not needed, but does not harm +printf "Signing DMG file...\n" +codesign --timestamp --options=runtime --sign "$APPLE_DEVNAME ($APPLE_DEVID)" \ + "$BUILD_DMG/$FULLNAME" # Copy and clean folder rm -Rf $BUILD_TMP From fe02d8176fe7fbf3d397b7c0aa54122fbb51c436 Mon Sep 17 00:00:00 2001 From: Kevin Date: Thu, 27 May 2021 17:45:18 +0200 Subject: [PATCH 05/16] Improved error control and fixed typo --- .../unix/Darwin/dmg/build_darwin_dmg.sh | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh index 8ca3382310..9608e04ea2 100644 --- a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh +++ b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh @@ -17,7 +17,7 @@ function get_notarization_info() { if [ "$CI_PROJECT_DIR" != "" ]; then LOCALINST="$CODEHOME/pandora_agents/unix/Darwin/dmg" else - LOCALINST="/root/code/pandorafms/pandora_agents/unix/Darwin/dmg" + LOCALINST="/opt/code/pandorafms/pandora_agents/unix/Darwin/dmg" fi # DMG package name @@ -38,7 +38,7 @@ fi if [ "$#" -ge 3 ]; then BUILD_PATH="$3" else - BUILD_PATH="/root/code/pandorafms/pandora_agents/unix/Darwin/dmg" + BUILD_PATH="/opt/code/pandorafms/pandora_agents/unix/Darwin/dmg" fi BUILD_DMG="$BUILD_PATH/build" @@ -46,6 +46,7 @@ BUILD_TMP="$BUILD_PATH/buildtmp" APPLE_USER="kevin.rojas@pandorafms.com" APPLE_PASS="@keychain:signing" APPLE_DEVNAME="Developer ID Installer: Artica Soluciones Tecnologicas SL" +APPLE_DEVAPP="Developer ID Application: Artica Soluciones Tecnologicas SL" APPLE_DEVID="Q35RP2Y7WU" FULLNAME="$DMGNAME-$VERSION.dmg" @@ -96,23 +97,29 @@ NOTARIZE=$(xcrun altool --notarize-app \ --asc-provider "$APPLE_DEVID" \ --username "$APPLE_USER" \ --password "$APPLE_PASS" \ - --file "$BUILD_TMP/pandorafms_agent.pkg" 2>&1) + --file "$BUILD_TMP/pandorafms_agent.pkg" 2>&1) + +if [ $(echo $NOTARIZE |grep -c UUID) -ne 1 ] +then + printf "Unable to send the package to notarization. Exiting..." + error +fi RUUID=$(echo $NOTARIZE | awk '{print $NF}') -printf "\nPkg sent for notarization (Request UUID= $RUUID ). This may take a few minutes...\n" +printf "\PKG sent for notarization (Request UUID= $RUUID ). This may take a few minutes...\n" # In order to staple the pkg, notarization must be approved! STATUS=1 while [ $STATUS -eq 1 ]; do get_notarization_info "$RUUID" - printf "Pkg not yet notarized by Apple. Trying again in 60 seconds...\n" + printf "PKG not yet notarized by Apple. Trying again in 60 seconds...\n" sleep 60 done if [ $MESSAGE -eq 1 ] then - echo "Package notarized. Stapling pkg..." + echo "Package notarized. Stapling PKG..." xcrun stapler staple "$BUILD_TMP/pandorafms_agent.pkg" || error fi @@ -137,8 +144,8 @@ SetFile -a C "$BUILD_DMG/$FULLNAME" || error # Sign DMG. Not needed, but does not harm printf "Signing DMG file...\n" -codesign --timestamp --options=runtime --sign "$APPLE_DEVNAME ($APPLE_DEVID)" \ - "$BUILD_DMG/$FULLNAME" +codesign --timestamp --options=runtime --sign "$APPLE_DEVAPP ($APPLE_DEVID)" \ + "$BUILD_DMG/$FULLNAME" || error # Copy and clean folder rm -Rf $BUILD_TMP From 0aef46e17df2b9c2a50a65ebe5a78555affa828a Mon Sep 17 00:00:00 2001 From: Kevin Date: Tue, 1 Jun 2021 15:45:50 +0200 Subject: [PATCH 06/16] fixed files format --- .../Darwin/dmg/resources/text/conclusion.html | 13 +- .../Darwin/dmg/resources/text/license.html | 328 +++++------------- .../Darwin/dmg/resources/text/welcome.html | 14 +- 3 files changed, 110 insertions(+), 245 deletions(-) diff --git a/pandora_agents/unix/Darwin/dmg/resources/text/conclusion.html b/pandora_agents/unix/Darwin/dmg/resources/text/conclusion.html index 9b415ab25f..8122d2d23d 100644 --- a/pandora_agents/unix/Darwin/dmg/resources/text/conclusion.html +++ b/pandora_agents/unix/Darwin/dmg/resources/text/conclusion.html @@ -1,4 +1,9 @@ -Installation complete! Thank you for installing Pandora FMS agent for MacOS. -Agent's service has been automatically started. You can manage the service with: -sudo launchctl start com.pandorafms.pandorafms to start it, and sudo launchctl -stop com.pandorafms.pandorafms to stop it. +Installation complete! + +Thank you for installing Pandora FMS agent for MacOS. Agent's service has been automatically started. + +You can manage the service with: + sudo launchctl start com.pandorafms.pandorafms +to start it, and + sudo launchctl stop com.pandorafms.pandorafms +to stop it. \ No newline at end of file diff --git a/pandora_agents/unix/Darwin/dmg/resources/text/license.html b/pandora_agents/unix/Darwin/dmg/resources/text/license.html index 23a21ce653..e8ffe8166d 100644 --- a/pandora_agents/unix/Darwin/dmg/resources/text/license.html +++ b/pandora_agents/unix/Darwin/dmg/resources/text/license.html @@ -1,237 +1,93 @@ -GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free -Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -Everyone is permitted to copy and distribute verbatim copies of this license -document, but changing it is not allowed. Preamble The licenses for most -software are designed to take away your freedom to share and change it. By -contrast, the GNU General Public License is intended to guarantee your freedom -to share and change free software--to make sure the software is free for all its -users. This General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to using it. -(Some other Free Software Foundation software is covered by the GNU Library -General Public License instead.) You can apply it to your programs, too. When we -speak of free software, we are referring to freedom, not price. Our General -Public Licenses are designed to make sure that you have the freedom to -distribute copies of free software (and charge for this service if you wish), -that you receive source code or can get it if you want it, that you can change -the software or use pieces of it in new free programs; and that you know you can -do these things. To protect your rights, we need to make restrictions that -forbid anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. For example, if you -distribute copies of such a program, whether gratis or for a fee, you must give -the recipients all the rights that you have. You must make sure that they, too, -receive or can get the source code. And you must show them these terms so they -know their rights. We protect your rights with two steps: (1) copyright the -software, and (2) offer you this license which gives you legal permission to -copy, distribute and/or modify the software. Also, for each author's protection -and ours, we want to make certain that everyone understands that there is no -warranty for this free software. If the software is modified by someone else and -passed on, we want its recipients to know that what they have is not the -original, so that any problems introduced by others will not reflect on the -original authors' reputations. Finally, any free program is threatened -constantly by software patents. We wish to avoid the danger that redistributors -of a free program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any patent must -be licensed for everyone's free use or not licensed at all. The precise terms -and conditions for copying, distribution and modification follow. GNU GENERAL -PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -0. This License applies to any program or other work which contains a notice -placed by the copyright holder saying it may be distributed under the terms of -this General Public License. The "Program", below, refers to any such program or -work, and a "work based on the Program" means either the Program or any -derivative work under copyright law: that is to say, a work containing the -Program or a portion of it, either verbatim or with modifications and/or -translated into another language. (Hereinafter, translation is included without -limitation in the term "modification".) Each licensee is addressed as "you". -Activities other than copying, distribution and modification are not covered by -this License; they are outside its scope. The act of running the Program is not -restricted, and the output from the Program is covered only if its contents -constitute a work based on the Program (independent of having been made by -running the Program). Whether that is true depends on what the Program does. 1. -You may copy and distribute verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and appropriately -publish on each copy an appropriate copyright notice and disclaimer of warranty; -keep intact all the notices that refer to this License and to the absence of any -warranty; and give any other recipients of the Program a copy of this License -along with the Program. You may charge a fee for the physical act of -transferring a copy, and you may at your option offer warranty protection in -exchange for a fee. 2. You may modify your copy or copies of the Program or any -portion of it, thus forming a work based on the Program, and copy and distribute -such modifications or work under the terms of Section 1 above, provided that you -also meet all of these conditions: a) You must cause the modified files to carry -prominent notices stating that you changed the files and the date of any change. -b) You must cause any work that you distribute or publish, that in whole or in -part contains or is derived from the Program or any part thereof, to be licensed -as a whole at no charge to all third parties under the terms of this License. c) -If the modified program normally reads commands interactively when run, you must -cause it, when started running for such interactive use in the most ordinary -way, to print or display an announcement including an appropriate copyright -notice and a notice that there is no warranty (or else, saying that you provide -a warranty) and that users may redistribute the program under these conditions, -and telling the user how to view a copy of this License. (Exception: if the -Program itself is interactive but does not normally print such an announcement, -your work based on the Program is not required to print an announcement.) These -requirements apply to the modified work as a whole. If identifiable sections of -that work are not derived from the Program, and can be reasonably considered -independent and separate works in themselves, then this License, and its terms, -do not apply to those sections when you distribute them as separate works. But -when you distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of this -License, whose permissions for other licensees extend to the entire whole, and -thus to each and every part regardless of who wrote it. Thus, it is not the -intent of this section to claim rights or contest your rights to work written -entirely by you; rather, the intent is to exercise the right to control the -distribution of derivative or collective works based on the Program. In -addition, mere aggregation of another work not based on the Program with the -Program (or with a work based on the Program) on a volume of a storage or -distribution medium does not bring the other work under the scope of this -License. 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of Sections 1 -and 2 above provided that you also do one of the following: a) Accompany it with -the complete corresponding machine-readable source code, which must be -distributed under the terms of Sections 1 and 2 above on a medium customarily -used for software interchange; or, b) Accompany it with a written offer, valid -for at least three years, to give any third party, for a charge no more than -your cost of physically performing source distribution, a complete -machine-readable copy of the corresponding source code, to be distributed under -the terms of Sections 1 and 2 above on a medium customarily used for software -interchange; or, c) Accompany it with the information you received as to the -offer to distribute corresponding source code. (This alternative is allowed only -for noncommercial distribution and only if you received the program in object -code or executable form with such an offer, in accord with Subsection b above.) -The source code for a work means the preferred form of the work for making -modifications to it. For an executable work, complete source code means all the -source code for all modules it contains, plus any associated interface -definition files, plus the scripts used to control compilation and installation -of the executable. However, as a special exception, the source code distributed -need not include anything that is normally distributed (in either source or -binary form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component itself -accompanies the executable. If distribution of executable or object code is made -by offering access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as distribution of the -source code, even though third parties are not compelled to copy the source -along with the object code. 4. You may not copy, modify, sublicense, or -distribute the Program except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense or distribute the Program is void, -and will automatically terminate your rights under this License. However, -parties who have received copies, or rights, from you under this License will -not have their licenses terminated so long as such parties remain in full -compliance. 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or distribute -the Program or its derivative works. These actions are prohibited by law if you -do not accept this License. Therefore, by modifying or distributing the Program -(or any work based on the Program), you indicate your acceptance of this License -to do so, and all its terms and conditions for copying, distributing or -modifying the Program or works based on it. 6. Each time you redistribute the -Program (or any work based on the Program), the recipient automatically receives -a license from the original licensor to copy, distribute or modify the Program -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. You are -not responsible for enforcing compliance by third parties to this License. 7. -If, as a consequence of a court judgment or allegation of patent infringement or -for any other reason (not limited to patent issues), conditions are imposed on -you (whether by court order, agreement or otherwise) that contradict the -conditions of this License, they do not excuse you from the conditions of this -License. If you cannot distribute so as to satisfy simultaneously your -obligations under this License and any other pertinent obligations, then as a -consequence you may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by all those -who receive copies directly or indirectly through you, then the only way you -could satisfy both it and this License would be to refrain entirely from -distribution of the Program. If any portion of this section is held invalid or -unenforceable under any particular circumstance, the balance of the section is -intended to apply and the section as a whole is intended to apply in other -circumstances. It is not the purpose of this section to induce you to infringe -any patents or other property right claims or to contest validity of any such -claims; this section has the sole purpose of protecting the integrity of the -free software distribution system, which is implemented by public license -practices. Many people have made generous contributions to the wide range of -software distributed through that system in reliance on consistent application -of that system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot impose -that choice. This section is intended to make thoroughly clear what is believed -to be a consequence of the rest of this License. 8. If the distribution and/or -use of the Program is restricted in certain countries either by patents or by -copyrighted interfaces, the original copyright holder who places the Program -under this License may add an explicit geographical distribution limitation -excluding those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates the -limitation as if written in the body of this License. 9. The Free Software -Foundation may publish revised and/or new versions of the General Public License -from time to time. Such new versions will be similar in spirit to the present -version, but may differ in detail to address new problems or concerns. Each -version is given a distinguishing version number. If the Program specifies a -version number of this License which applies to it and "any later version", you -have the option of following the terms and conditions either of that version or -of any later version published by the Free Software Foundation. If the Program -does not specify a version number of this License, you may choose any version -ever published by the Free Software Foundation. 10. If you wish to incorporate -parts of the Program into other free programs whose distribution conditions are -different, write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free Software -Foundation; we sometimes make exceptions for this. Our decision will be guided -by the two goals of preserving the free status of all derivatives of our free -software and of promoting the sharing and reuse of software generally. NO -WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU -ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO -EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY -COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE -PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, -SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY -TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF -THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER -PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND -CONDITIONS How to Apply These Terms to Your New Programs If you develop a new -program, and you want it to be of the greatest possible use to the public, the -best way to achieve this is to make it free software which everyone can -redistribute and change under these terms. To do so, attach the following -notices to the program. It is safest to attach them to the start of each source -file to most effectively convey the exclusion of warranty; and each file should -have at least the "copyright" line and a pointer to where the full notice is -found. -Copyright (C) - - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the Free - Software Foundation; either version 2 of the License, or (at your option) - any later version. This program is distributed in the hope that it will be - useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - Public License for more details. You should have received a copy of the GNU - General Public License along with this program; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA Also add information on how to contact you by electronic and paper mail. - If the program is interactive, make it output a short notice like this when - it starts in an interactive mode: Gnomovision version 69, Copyright (C) year - name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details - type `show w'. This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. The hypothetical - commands `show w' and `show c' should show the appropriate parts of the - General Public License. Of course, the commands you use may be called - something other than `show w' and `show c'; they could even be mouse-clicks - or menu items--whatever suits your program. You should also get your - employer (if you work as a programmer) or your school, if any, to sign a - "copyright disclaimer" for the program, if necessary. Here is a sample; - alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in - the program `Gnomovision' (which makes passes at compilers) written by James - Hacker. + +GNU GENERAL PUBLIC LICENSE - , 1 April 1989 Ty Coon, President of Vice This General Public License - does not permit incorporating your program into proprietary programs. If - your program is a subroutine library, you may consider it more useful to - permit linking proprietary applications with the library. If this is what - you want to do, use the GNU Library General Public License instead of this - License. - +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + + c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/pandora_agents/unix/Darwin/dmg/resources/text/welcome.html b/pandora_agents/unix/Darwin/dmg/resources/text/welcome.html index aa18ed61be..4f85edbb2b 100644 --- a/pandora_agents/unix/Darwin/dmg/resources/text/welcome.html +++ b/pandora_agents/unix/Darwin/dmg/resources/text/welcome.html @@ -1,5 +1,9 @@ -Welcome to Pandora FMS agent for MacOS installer. This will install Pandora FMS -agent in the root disk of this system, specifically in: -/usr/local/share/pandora_agent/ /etc/pandora/ It will also create an Uninstaller -at your Applications folder. If you wish to perform a custom installation, -please use the Linux tarball installer instead. +Welcome to Pandora FMS agent for MacOS installer. + +This will install Pandora FMS agent in the root disk of this system, specifically in: + /usr/local/share/pandora_agent/ + /etc/pandora/ + +It will also create an Uninstaller at your Applications folder. + +If you wish to perform a custom installation, please use the Linux tarball installer instead. From 423a46af8c44b4638528a100d0c8bb88e39e84b0 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Thu, 3 Jun 2021 10:29:49 +0200 Subject: [PATCH 07/16] Avoid mark as crashed satellite_server --- pandora_server/bin/pandora_server | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_server/bin/pandora_server b/pandora_server/bin/pandora_server index d1e79abbe2..7b24a97a54 100755 --- a/pandora_server/bin/pandora_server +++ b/pandora_server/bin/pandora_server @@ -803,7 +803,8 @@ sub main() { db_do ($DBH, "UPDATE tserver SET status = -1 WHERE UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(keepalive) > 2*server_keepalive - AND status != 0" + AND status != 0 AND server_type != ?", + PandoraFMS::Tools::SATELLITESERVER ); # Set the master server From d6f5b5890205fb9c44ef8daa48448ee15a95627b Mon Sep 17 00:00:00 2001 From: Kevin Date: Tue, 8 Jun 2021 12:45:19 +0200 Subject: [PATCH 08/16] Fixed permissions --- .../unix/Darwin/dmg/build_darwin_dmg.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh index 9608e04ea2..d4edb590c6 100644 --- a/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh +++ b/pandora_agents/unix/Darwin/dmg/build_darwin_dmg.sh @@ -64,6 +64,18 @@ cp -R ../../../../pandora_agents/unix/Darwin/pandora_agent.conf files/pandorafms mkdir -p $BUILD_DMG mkdir -p $BUILD_TMP +# Make sure the scripts have execution privileges +chmod +x "./scripts/preinstall" +chmod +x "./scripts/postinstall" +chmod +x "./files/pandorafms/inst_utilities/get_group.scpt" +chmod +x "./files/pandorafms/inst_utilities/get_remotecfg.scpt" +chmod +x "./files/pandorafms/inst_utilities/get_serverip.scpt" +chmod +x "./files/pandorafms/inst_utilities/print_conf.pl" +chmod +x "./files/pandorafms_uninstall/PandoraFMS agent uninstaller.app/Contents/MacOS/uninstall.sh" +chmod +x "./files/pandorafms_uninstall/PandoraFMS agent uninstaller.app/Contents/Resources/ask_root" +chmod +x "./files/pandorafms_uninstall/PandoraFMS agent uninstaller.app/Contents/Resources/confirm_uninstall" +chmod +x "./files/pandorafms_uninstall/PandoraFMS agent uninstaller.app/Contents/Resources/uninstall" + # Build pandorafms agent component pkgbuild --root files/pandorafms/ \ --identifier com.pandorafms.pandorafms_src \ @@ -97,7 +109,7 @@ NOTARIZE=$(xcrun altool --notarize-app \ --asc-provider "$APPLE_DEVID" \ --username "$APPLE_USER" \ --password "$APPLE_PASS" \ - --file "$BUILD_TMP/pandorafms_agent.pkg" 2>&1) + --file "$BUILD_TMP/pandorafms_agent.pkg") if [ $(echo $NOTARIZE |grep -c UUID) -ne 1 ] then @@ -107,7 +119,7 @@ fi RUUID=$(echo $NOTARIZE | awk '{print $NF}') -printf "\PKG sent for notarization (Request UUID= $RUUID ). This may take a few minutes...\n" +printf "PKG sent for notarization (Request UUID=$RUUID). This may take a few minutes...\n" # In order to staple the pkg, notarization must be approved! STATUS=1 From 50282dccf437589862c6a3526c5cf206b807e9b4 Mon Sep 17 00:00:00 2001 From: marcos Date: Wed, 9 Jun 2021 16:55:25 +0200 Subject: [PATCH 09/16] add new link documentation --- pandora_console/include/functions_config.php | 2 +- pandora_console/pandoradb_data.sql | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index 3920109890..c88f16cf2d 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -2362,7 +2362,7 @@ function config_process_config() } if (!isset($config['custom_docs_url'])) { - config_update_value('custom_docs_url', 'http://wiki.pandorafms.com/'); + config_update_value('custom_docs_url', 'https://pandorafms.com/manual'); } if (!isset($config['custom_support_url'])) { diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index b1d5f860c7..26032195a8 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -105,7 +105,7 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('show_vc', 1), ('inventory_changes_blacklist', '1,2,20,21'), ('custom_report_front', 0), -('custom_report_front_font', 'opensans.ttf'), +('custom_report_front_font', 'lato.ttf'), ('custom_report_front_logo', 'images/pandora_logo_white.jpg'), ('custom_report_front_header', ''), ('custom_report_front_footer', ''), @@ -226,7 +226,7 @@ UNLOCK TABLES; LOCK TABLES `tlink` WRITE; INSERT INTO `tlink` VALUES -(1,'Documentation','http://wiki.pandorafms.com/'), +(1,'Documentation','https://pandorafms.com/manual'), (2,'Enterprise Edition','http://pandorafms.com'), (3,'Report a bug','https://github.com/pandorafms/pandorafms/issues'), (4,'Suggest new feature','http://forums.pandorafms.com/index.php?board=22.0'), From e0b3536d1b0556ffd333141a857f68243e47bc47 Mon Sep 17 00:00:00 2001 From: Calvo Date: Thu, 10 Jun 2021 18:00:53 +0200 Subject: [PATCH 10/16] Fix treeview modules sql inner condition --- pandora_console/include/class/TreeModule.class.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandora_console/include/class/TreeModule.class.php b/pandora_console/include/class/TreeModule.class.php index 99ed5dfc04..ee9ef10138 100644 --- a/pandora_console/include/class/TreeModule.class.php +++ b/pandora_console/include/class/TreeModule.class.php @@ -28,6 +28,8 @@ class TreeModule extends Tree $this->L1fieldNameSql = 'tam.nombre'; $this->L1inner = ''; $this->L1orderByFinal = 'name'; + $this->L1innerInside = 'INNER JOIN tagente_modulo tam + ON ta.id_agente = tam.id_agente'; $this->L2condition = "AND tam.nombre = '".$this->symbol2name($this->rootID)."'"; } From 8272eb4f5b979e6d80d8b5e8c99a1027a7b07a74 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 12 Jun 2021 01:00:21 +0200 Subject: [PATCH 11/16] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index d8e513971e..dff08782d1 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.755-210611 +Version: 7.0NG.755-210612 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 5ae874c8e0..ad5d7f50ab 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.755-210611" +pandora_version="7.0NG.755-210612" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index b42a135cff..3f2d4d91cf 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1015,7 +1015,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.755'; -use constant AGENT_BUILD => '210611'; +use constant AGENT_BUILD => '210612'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index f2fa414189..82a94ac0b2 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.755 -%define release 210611 +%define release 210612 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index d5d94de191..c5a94936ad 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.755 -%define release 210611 +%define release 210612 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index d404a0a2ca..6798913d0b 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.755" -PI_BUILD="210611" +PI_BUILD="210612" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 132de5598c..9f84a00b2c 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{210611} +{210612} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 102dc5664d..a93df9d97c 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.755 Build 210611") +#define PANDORA_VERSION ("7.0NG.755 Build 210612") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 90a485d10a..e000e10136 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.755(Build 210611))" + VALUE "ProductVersion", "(7.0NG.755(Build 210612))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 3a523983a1..0ad5b88f51 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.755-210611 +Version: 7.0NG.755-210612 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index ee8d74be8a..4680249a58 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.755-210611" +pandora_version="7.0NG.755-210612" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 35d4b78f30..9d3dc41c02 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC210611'; +$build_version = 'PC210612'; $pandora_version = 'v7.0NG.755'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index e161f42b23..493b5f62ff 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index d8d8983f2d..aa6052fd57 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.755 -%define release 210611 +%define release 210612 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index ad16abf9ed..29998d9654 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.755 -%define release 210611 +%define release 210612 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index a129db32de..a23c77e2cb 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.755" -PI_BUILD="210611" +PI_BUILD="210612" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 3b70873f25..05b4433fbc 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.755 Build 210611"; +my $version = "7.0NG.755 Build 210612"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 752aff5801..0fa339c562 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.755 Build 210611"; +my $version = "7.0NG.755 Build 210612"; # save program name for logging my $progname = basename($0); From e7a204d6d8fc30dd4907b21441dbec76b25b8a80 Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 13 Jun 2021 01:00:16 +0200 Subject: [PATCH 12/16] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index dff08782d1..711d9a0d12 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.755-210612 +Version: 7.0NG.755-210613 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index ad5d7f50ab..aa55a22b43 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.755-210612" +pandora_version="7.0NG.755-210613" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 3f2d4d91cf..e485318247 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1015,7 +1015,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.755'; -use constant AGENT_BUILD => '210612'; +use constant AGENT_BUILD => '210613'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 82a94ac0b2..78f0f2ecc0 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.755 -%define release 210612 +%define release 210613 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index c5a94936ad..9356e4f777 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.755 -%define release 210612 +%define release 210613 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 6798913d0b..95c75c4a16 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.755" -PI_BUILD="210612" +PI_BUILD="210613" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 9f84a00b2c..8fa70f1b19 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{210612} +{210613} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index a93df9d97c..6ab68d2333 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.755 Build 210612") +#define PANDORA_VERSION ("7.0NG.755 Build 210613") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index e000e10136..d1b9a5735e 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.755(Build 210612))" + VALUE "ProductVersion", "(7.0NG.755(Build 210613))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 0ad5b88f51..023d901f87 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.755-210612 +Version: 7.0NG.755-210613 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 4680249a58..bc6b3e7606 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.755-210612" +pandora_version="7.0NG.755-210613" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 9d3dc41c02..f264d6033b 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC210612'; +$build_version = 'PC210613'; $pandora_version = 'v7.0NG.755'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 493b5f62ff..25933daec9 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index aa6052fd57..20ac559a48 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.755 -%define release 210612 +%define release 210613 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 29998d9654..73af05d875 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.755 -%define release 210612 +%define release 210613 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index a23c77e2cb..874f608451 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.755" -PI_BUILD="210612" +PI_BUILD="210613" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 05b4433fbc..84888d5074 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.755 Build 210612"; +my $version = "7.0NG.755 Build 210613"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 0fa339c562..81ac2f7aba 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.755 Build 210612"; +my $version = "7.0NG.755 Build 210613"; # save program name for logging my $progname = basename($0); From 595fabb232deb9ccb869d915339f225bfcb34c61 Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 14 Jun 2021 01:00:18 +0200 Subject: [PATCH 13/16] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 711d9a0d12..72c7d62e95 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.755-210613 +Version: 7.0NG.755-210614 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index aa55a22b43..05aea6437e 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.755-210613" +pandora_version="7.0NG.755-210614" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index e485318247..443710df08 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1015,7 +1015,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.755'; -use constant AGENT_BUILD => '210613'; +use constant AGENT_BUILD => '210614'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 78f0f2ecc0..bed94a0eb3 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.755 -%define release 210613 +%define release 210614 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 9356e4f777..580720ed17 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.755 -%define release 210613 +%define release 210614 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 95c75c4a16..a9c3a1893a 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.755" -PI_BUILD="210613" +PI_BUILD="210614" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 8fa70f1b19..9c2eceb3a6 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{210613} +{210614} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 6ab68d2333..7c7e60d77b 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.755 Build 210613") +#define PANDORA_VERSION ("7.0NG.755 Build 210614") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index d1b9a5735e..5689bd2c99 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.755(Build 210613))" + VALUE "ProductVersion", "(7.0NG.755(Build 210614))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 023d901f87..4e72bac0a2 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.755-210613 +Version: 7.0NG.755-210614 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index bc6b3e7606..6b05748769 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.755-210613" +pandora_version="7.0NG.755-210614" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index f264d6033b..f07a7aaa5d 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC210613'; +$build_version = 'PC210614'; $pandora_version = 'v7.0NG.755'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 25933daec9..0e8208bb24 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 20ac559a48..0c995f47e5 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.755 -%define release 210613 +%define release 210614 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 73af05d875..532a8b27bb 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.755 -%define release 210613 +%define release 210614 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 874f608451..fba03de522 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.755" -PI_BUILD="210613" +PI_BUILD="210614" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 84888d5074..979ed39528 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.755 Build 210613"; +my $version = "7.0NG.755 Build 210614"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 81ac2f7aba..78bff4f0ad 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.755 Build 210613"; +my $version = "7.0NG.755 Build 210614"; # save program name for logging my $progname = basename($0); From cdad04f9cd8e84ceb2910c759119de6e49854451 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 14 Jun 2021 11:56:42 +0000 Subject: [PATCH 14/16] Update the DB schema when upgrading from RPMs. Call updateMR.php to update the database schema when manually upgrading from RPM packages. --- .../pandora-stack/sources/init_pandora.sh | 2 +- .../extras/delete_files/delete_files.txt | 11 +- pandora_console/general/footer.php | 8 +- pandora_console/general/maintenance.php | 69 + pandora_console/general/register.php | 89 +- pandora_console/godmode/setup/license.php | 25 +- pandora_console/godmode/um_client/README.txt | 9 + pandora_console/godmode/um_client/api.php | 84 + .../godmode/um_client/composer.json | 28 + .../godmode/um_client/composer.lock | 1787 ++++++++ pandora_console/godmode/um_client/index.php | 395 ++ .../lib/UpdateManager/API/Server.php | 261 ++ .../um_client/lib/UpdateManager/Client.php | 2372 +++++++++++ .../um_client/lib/UpdateManager/Repo.php | 295 ++ .../um_client/lib/UpdateManager/RepoDisk.php | 103 + .../um_client/lib/UpdateManager/RepoMC.php | 138 + .../lib/UpdateManager/UI/Manager.php | 751 ++++ .../um_client/lib/UpdateManager/UI/View.php | 64 + .../um_client/lib/UpdateManager/constants.php | 133 + .../godmode/um_client/resources/helpers.php | 182 + .../resources/images/check-cross.png | Bin 0 -> 1393 bytes .../resources/images/icono_cerrar.png | Bin 0 -> 284 bytes .../resources/images/icono_warning.png | Bin 0 -> 733 bytes .../resources/images/pandora_logo.png | Bin 0 -> 3253 bytes .../resources/images/spinner-classic.gif | Bin 0 -> 1737 bytes .../um_client/resources/images/spinner.gif | Bin 0 -> 432 bytes .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 260 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 251 bytes .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 104 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 125 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 3762 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 90 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 129 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_228ef1_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_444444_256x240.png | Bin 0 -> 3767 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_555555_256x240.png | Bin 0 -> 3767 bytes .../images/ui-icons_777620_256x240.png | Bin 0 -> 3767 bytes .../images/ui-icons_777777_256x240.png | Bin 0 -> 3767 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cc0000_256x240.png | Bin 0 -> 3767 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ef8c08_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ffd27a_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 3767 bytes .../images/update_manager_background.jpg | Bin 0 -> 272332 bytes .../images/update_manager_button.png | Bin 0 -> 291 bytes .../resources/javascript/jquery-3.3.1.min.js | 2 + .../resources/javascript/jquery-ui.min.js | 13 + .../resources/javascript/jquery.fileupload.js | 1414 +++++++ .../javascript/jquery.iframe-transport.js | 207 + .../resources/javascript/jquery.knob.js | 710 ++++ .../um_client/resources/javascript/umc.js | 545 +++ .../resources/javascript/umc_offline.js | 458 +++ .../um_client/resources/styles/calendar.css | 67 + .../um_client/resources/styles/integria.css | 3 + .../resources/styles/jquery-ui.min.css | 9 + .../resources/styles/jquery-ui_custom.css | 23 + .../resources/styles/pandora.css} | 82 +- .../godmode/um_client/resources/styles/um.css | 206 + .../godmode/um_client/tests/ClientTest.php | 559 +++ .../godmode/um_client/updateMR.php | 80 + .../godmode/um_client/vendor/autoload.php | 7 + .../godmode/um_client/vendor/bin/phpunit | 1 + .../um_client/vendor/composer/ClassLoader.php | 479 +++ .../vendor/composer/InstalledVersions.php | 550 +++ .../godmode/um_client/vendor/composer/LICENSE | 19 + .../vendor/composer/autoload_classmap.php | 594 +++ .../vendor/composer/autoload_files.php | 11 + .../vendor/composer/autoload_namespaces.php | 9 + .../vendor/composer/autoload_psr4.php | 17 + .../vendor/composer/autoload_real.php | 75 + .../vendor/composer/autoload_static.php | 680 +++ .../um_client/vendor/composer/installed.json | 1891 +++++++++ .../um_client/vendor/composer/installed.php | 289 ++ .../vendor/composer/platform_check.php | 26 + .../instantiator/.doctrine-project.json | 41 + .../doctrine/instantiator/.github/FUNDING.yml | 3 + .../.github/workflows/coding-standards.yml | 48 + .../workflows/continuous-integration.yml | 91 + .../.github/workflows/phpbench.yml | 50 + .../workflows/release-on-milestone-closed.yml | 45 + .../.github/workflows/static-analysis.yml | 47 + .../doctrine/instantiator/CONTRIBUTING.md | 35 + .../vendor/doctrine/instantiator/LICENSE | 19 + .../vendor/doctrine/instantiator/README.md | 38 + .../doctrine/instantiator/composer.json | 42 + .../doctrine/instantiator/docs/en/index.rst | 68 + .../doctrine/instantiator/docs/en/sidebar.rst | 4 + .../doctrine/instantiator/phpbench.json | 4 + .../doctrine/instantiator/phpcs.xml.dist | 50 + .../doctrine/instantiator/phpstan.neon.dist | 15 + .../Exception/ExceptionInterface.php | 12 + .../Exception/InvalidArgumentException.php | 41 + .../Exception/UnexpectedValueException.php | 57 + .../Doctrine/Instantiator/Instantiator.php | 232 ++ .../Instantiator/InstantiatorInterface.php | 23 + .../myclabs/deep-copy/.github/FUNDING.yml | 12 + .../vendor/myclabs/deep-copy/LICENSE | 20 + .../vendor/myclabs/deep-copy/README.md | 375 ++ .../vendor/myclabs/deep-copy/composer.json | 38 + .../deep-copy/src/DeepCopy/DeepCopy.php | 298 ++ .../src/DeepCopy/Exception/CloneException.php | 9 + .../DeepCopy/Exception/PropertyException.php | 9 + .../Doctrine/DoctrineCollectionFilter.php | 33 + .../DoctrineEmptyCollectionFilter.php | 28 + .../Filter/Doctrine/DoctrineProxyFilter.php | 22 + .../deep-copy/src/DeepCopy/Filter/Filter.php | 18 + .../src/DeepCopy/Filter/KeepFilter.php | 16 + .../src/DeepCopy/Filter/ReplaceFilter.php | 39 + .../src/DeepCopy/Filter/SetNullFilter.php | 24 + .../Matcher/Doctrine/DoctrineProxyMatcher.php | 22 + .../src/DeepCopy/Matcher/Matcher.php | 14 + .../src/DeepCopy/Matcher/PropertyMatcher.php | 39 + .../DeepCopy/Matcher/PropertyNameMatcher.php | 32 + .../DeepCopy/Matcher/PropertyTypeMatcher.php | 52 + .../DeepCopy/Reflection/ReflectionHelper.php | 78 + .../TypeFilter/Date/DateIntervalFilter.php | 33 + .../src/DeepCopy/TypeFilter/ReplaceFilter.php | 30 + .../DeepCopy/TypeFilter/ShallowCopyFilter.php | 17 + .../TypeFilter/Spl/ArrayObjectFilter.php | 36 + .../TypeFilter/Spl/SplDoublyLinkedList.php | 10 + .../Spl/SplDoublyLinkedListFilter.php | 51 + .../src/DeepCopy/TypeFilter/TypeFilter.php | 13 + .../src/DeepCopy/TypeMatcher/TypeMatcher.php | 29 + .../deep-copy/src/DeepCopy/deep_copy.php | 20 + .../vendor/phar-io/manifest/CHANGELOG.md | 25 + .../um_client/vendor/phar-io/manifest/LICENSE | 31 + .../vendor/phar-io/manifest/README.md | 30 + .../vendor/phar-io/manifest/composer.json | 42 + .../vendor/phar-io/manifest/composer.lock | 70 + .../manifest/src/ManifestDocumentMapper.php | 150 + .../phar-io/manifest/src/ManifestLoader.php | 44 + .../manifest/src/ManifestSerializer.php | 168 + .../exceptions/ElementCollectionException.php | 13 + .../manifest/src/exceptions/Exception.php | 13 + .../InvalidApplicationNameException.php | 14 + .../src/exceptions/InvalidEmailException.php | 13 + .../src/exceptions/InvalidUrlException.php | 13 + .../exceptions/ManifestDocumentException.php | 5 + .../ManifestDocumentLoadingException.php | 45 + .../ManifestDocumentMapperException.php | 5 + .../exceptions/ManifestElementException.php | 5 + .../exceptions/ManifestLoaderException.php | 5 + .../manifest/src/values/Application.php | 16 + .../manifest/src/values/ApplicationName.php | 37 + .../phar-io/manifest/src/values/Author.php | 39 + .../manifest/src/values/AuthorCollection.php | 34 + .../src/values/AuthorCollectionIterator.php | 42 + .../manifest/src/values/BundledComponent.php | 33 + .../src/values/BundledComponentCollection.php | 34 + .../BundledComponentCollectionIterator.php | 42 + .../src/values/CopyrightInformation.php | 31 + .../phar-io/manifest/src/values/Email.php | 31 + .../phar-io/manifest/src/values/Extension.php | 46 + .../phar-io/manifest/src/values/Library.php | 16 + .../phar-io/manifest/src/values/License.php | 31 + .../phar-io/manifest/src/values/Manifest.php | 92 + .../src/values/PhpExtensionRequirement.php | 23 + .../src/values/PhpVersionRequirement.php | 25 + .../manifest/src/values/Requirement.php | 13 + .../src/values/RequirementCollection.php | 34 + .../values/RequirementCollectionIterator.php | 42 + .../phar-io/manifest/src/values/Type.php | 41 + .../phar-io/manifest/src/values/Url.php | 36 + .../manifest/src/xml/AuthorElement.php | 20 + .../src/xml/AuthorElementCollection.php | 18 + .../manifest/src/xml/BundlesElement.php | 18 + .../manifest/src/xml/ComponentElement.php | 20 + .../src/xml/ComponentElementCollection.php | 18 + .../manifest/src/xml/ContainsElement.php | 30 + .../manifest/src/xml/CopyrightElement.php | 24 + .../manifest/src/xml/ElementCollection.php | 60 + .../phar-io/manifest/src/xml/ExtElement.php | 16 + .../manifest/src/xml/ExtElementCollection.php | 18 + .../manifest/src/xml/ExtensionElement.php | 20 + .../manifest/src/xml/LicenseElement.php | 20 + .../manifest/src/xml/ManifestDocument.php | 103 + .../manifest/src/xml/ManifestElement.php | 66 + .../phar-io/manifest/src/xml/PhpElement.php | 26 + .../manifest/src/xml/RequiresElement.php | 18 + .../vendor/phar-io/version/CHANGELOG.md | 121 + .../um_client/vendor/phar-io/version/LICENSE | 31 + .../vendor/phar-io/version/README.md | 61 + .../vendor/phar-io/version/composer.json | 34 + .../phar-io/version/src/PreReleaseSuffix.php | 85 + .../vendor/phar-io/version/src/Version.php | 162 + .../version/src/VersionConstraintParser.php | 115 + .../version/src/VersionConstraintValue.php | 88 + .../phar-io/version/src/VersionNumber.php | 28 + .../constraints/AbstractVersionConstraint.php | 23 + .../constraints/AndVersionConstraintGroup.php | 34 + .../src/constraints/AnyVersionConstraint.php | 20 + .../constraints/ExactVersionConstraint.php | 16 + .../GreaterThanOrEqualToVersionConstraint.php | 26 + .../constraints/OrVersionConstraintGroup.php | 35 + ...SpecificMajorAndMinorVersionConstraint.php | 33 + .../SpecificMajorVersionConstraint.php | 25 + .../src/constraints/VersionConstraint.php | 16 + .../version/src/exceptions/Exception.php | 15 + .../InvalidPreReleaseSuffixException.php | 5 + .../exceptions/InvalidVersionException.php | 5 + .../NoPreReleaseSuffixException.php | 5 + .../UnsupportedVersionConstraintException.php | 13 + .../reflection-common/.github/dependabot.yml | 7 + .../.github/workflows/push.yml | 223 + .../phpdocumentor/reflection-common/LICENSE | 22 + .../phpdocumentor/reflection-common/README.md | 11 + .../reflection-common/composer.json | 28 + .../reflection-common/src/Element.php | 30 + .../reflection-common/src/File.php | 35 + .../reflection-common/src/Fqsen.php | 89 + .../reflection-common/src/Location.php | 53 + .../reflection-common/src/Project.php | 25 + .../reflection-common/src/ProjectFactory.php | 28 + .../phpdocumentor/reflection-docblock/LICENSE | 21 + .../reflection-docblock/README.md | 75 + .../reflection-docblock/composer.json | 41 + .../reflection-docblock/src/DocBlock.php | 204 + .../src/DocBlock/Description.php | 114 + .../src/DocBlock/DescriptionFactory.php | 177 + .../src/DocBlock/ExampleFinder.php | 157 + .../src/DocBlock/Serializer.php | 151 + .../src/DocBlock/StandardTagFactory.php | 347 ++ .../reflection-docblock/src/DocBlock/Tag.php | 32 + .../src/DocBlock/TagFactory.php | 84 + .../src/DocBlock/Tags/Author.php | 100 + .../src/DocBlock/Tags/BaseTag.php | 53 + .../src/DocBlock/Tags/Covers.php | 100 + .../src/DocBlock/Tags/Deprecated.php | 108 + .../src/DocBlock/Tags/Example.php | 199 + .../DocBlock/Tags/Factory/StaticMethod.php | 25 + .../src/DocBlock/Tags/Formatter.php | 24 + .../Tags/Formatter/AlignFormatter.php | 49 + .../Tags/Formatter/PassthroughFormatter.php | 29 + .../src/DocBlock/Tags/Generic.php | 88 + .../src/DocBlock/Tags/InvalidTag.php | 144 + .../src/DocBlock/Tags/Link.php | 78 + .../src/DocBlock/Tags/Method.php | 279 ++ .../src/DocBlock/Tags/Param.php | 172 + .../src/DocBlock/Tags/Property.php | 119 + .../src/DocBlock/Tags/PropertyRead.php | 119 + .../src/DocBlock/Tags/PropertyWrite.php | 119 + .../src/DocBlock/Tags/Reference/Fqsen.php | 38 + .../src/DocBlock/Tags/Reference/Reference.php | 22 + .../src/DocBlock/Tags/Reference/Url.php | 36 + .../src/DocBlock/Tags/Return_.php | 64 + .../src/DocBlock/Tags/See.php | 105 + .../src/DocBlock/Tags/Since.php | 102 + .../src/DocBlock/Tags/Source.php | 117 + .../src/DocBlock/Tags/TagWithType.php | 65 + .../src/DocBlock/Tags/Throws.php | 64 + .../src/DocBlock/Tags/Uses.php | 99 + .../src/DocBlock/Tags/Var_.php | 120 + .../src/DocBlock/Tags/Version.php | 105 + .../src/DocBlockFactory.php | 286 ++ .../src/DocBlockFactoryInterface.php | 23 + .../src/Exception/PcreException.php | 38 + .../reflection-docblock/src/Utils.php | 57 + .../phpdocumentor/type-resolver/LICENSE | 21 + .../phpdocumentor/type-resolver/README.md | 177 + .../phpdocumentor/type-resolver/composer.json | 34 + .../phpdocumentor/type-resolver/composer.lock | 71 + .../phpdocumentor/type-resolver/phpbench.json | 10 + .../type-resolver/src/FqsenResolver.php | 79 + .../type-resolver/src/PseudoType.php | 19 + .../type-resolver/src/PseudoTypes/False_.php | 39 + .../type-resolver/src/PseudoTypes/True_.php | 39 + .../phpdocumentor/type-resolver/src/Type.php | 25 + .../type-resolver/src/TypeResolver.php | 543 +++ .../type-resolver/src/Types/AbstractList.php | 83 + .../src/Types/AggregatedType.php | 124 + .../type-resolver/src/Types/Array_.php | 29 + .../type-resolver/src/Types/Boolean.php | 32 + .../type-resolver/src/Types/Callable_.php | 32 + .../type-resolver/src/Types/ClassString.php | 56 + .../type-resolver/src/Types/Collection.php | 68 + .../type-resolver/src/Types/Compound.php | 38 + .../type-resolver/src/Types/Context.php | 97 + .../src/Types/ContextFactory.php | 423 ++ .../type-resolver/src/Types/Expression.php | 51 + .../type-resolver/src/Types/Float_.php | 32 + .../type-resolver/src/Types/Integer.php | 32 + .../type-resolver/src/Types/Intersection.php | 37 + .../type-resolver/src/Types/Iterable_.php | 38 + .../type-resolver/src/Types/Mixed_.php | 32 + .../type-resolver/src/Types/Null_.php | 32 + .../type-resolver/src/Types/Nullable.php | 51 + .../type-resolver/src/Types/Object_.php | 68 + .../type-resolver/src/Types/Parent_.php | 34 + .../type-resolver/src/Types/Resource_.php | 32 + .../type-resolver/src/Types/Scalar.php | 32 + .../type-resolver/src/Types/Self_.php | 34 + .../type-resolver/src/Types/Static_.php | 39 + .../type-resolver/src/Types/String_.php | 32 + .../type-resolver/src/Types/This.php | 35 + .../type-resolver/src/Types/Void_.php | 35 + .../prophecy/.github/workflows/build.yml | 42 + .../vendor/phpspec/prophecy/CHANGES.md | 279 ++ .../um_client/vendor/phpspec/prophecy/LICENSE | 23 + .../vendor/phpspec/prophecy/README.md | 404 ++ .../vendor/phpspec/prophecy/composer.json | 50 + .../prophecy/src/Prophecy/Argument.php | 239 ++ .../Prophecy/Argument/ArgumentsWildcard.php | 101 + .../Prophecy/Argument/Token/AnyValueToken.php | 52 + .../Argument/Token/AnyValuesToken.php | 52 + .../Argument/Token/ApproximateValueToken.php | 55 + .../Argument/Token/ArrayCountToken.php | 86 + .../Argument/Token/ArrayEntryToken.php | 143 + .../Argument/Token/ArrayEveryEntryToken.php | 82 + .../Prophecy/Argument/Token/CallbackToken.php | 75 + .../Argument/Token/ExactValueToken.php | 118 + .../Argument/Token/IdenticalValueToken.php | 74 + .../Prophecy/Argument/Token/InArrayToken.php | 74 + .../Argument/Token/LogicalAndToken.php | 80 + .../Argument/Token/LogicalNotToken.php | 73 + .../Argument/Token/NotInArrayToken.php | 75 + .../Argument/Token/ObjectStateToken.php | 104 + .../Argument/Token/StringContainsToken.php | 67 + .../Argument/Token/TokenInterface.php | 43 + .../src/Prophecy/Argument/Token/TypeToken.php | 76 + .../prophecy/src/Prophecy/Call/Call.php | 162 + .../prophecy/src/Prophecy/Call/CallCenter.php | 240 ++ .../Prophecy/Comparator/ClosureComparator.php | 44 + .../src/Prophecy/Comparator/Factory.php | 47 + .../Comparator/ProphecyComparator.php | 28 + .../src/Prophecy/Doubler/CachedDoubler.php | 66 + .../ClassPatch/ClassPatchInterface.php | 48 + .../ClassPatch/DisableConstructorPatch.php | 76 + .../Doubler/ClassPatch/HhvmExceptionPatch.php | 63 + .../Doubler/ClassPatch/KeywordPatch.php | 68 + .../Doubler/ClassPatch/MagicCallPatch.php | 94 + .../ClassPatch/ProphecySubjectPatch.php | 113 + .../ReflectionClassNewInstancePatch.php | 57 + .../Doubler/ClassPatch/SplFileInfoPatch.php | 123 + .../Doubler/ClassPatch/ThrowablePatch.php | 95 + .../Doubler/ClassPatch/TraversablePatch.php | 83 + .../src/Prophecy/Doubler/DoubleInterface.php | 22 + .../prophecy/src/Prophecy/Doubler/Doubler.php | 146 + .../Doubler/Generator/ClassCodeGenerator.php | 110 + .../Doubler/Generator/ClassCreator.php | 67 + .../Doubler/Generator/ClassMirror.php | 243 ++ .../Doubler/Generator/Node/ArgumentNode.php | 133 + .../Generator/Node/ArgumentTypeNode.php | 10 + .../Doubler/Generator/Node/ClassNode.php | 169 + .../Doubler/Generator/Node/MethodNode.php | 210 + .../Doubler/Generator/Node/ReturnTypeNode.php | 31 + .../Generator/Node/TypeNodeAbstract.php | 87 + .../Doubler/Generator/ReflectionInterface.php | 22 + .../Doubler/Generator/TypeHintReference.php | 43 + .../src/Prophecy/Doubler/LazyDouble.php | 127 + .../src/Prophecy/Doubler/NameGenerator.php | 52 + .../Call/UnexpectedCallException.php | 40 + .../Doubler/ClassCreatorException.php | 31 + .../Doubler/ClassMirrorException.php | 31 + .../Doubler/ClassNotFoundException.php | 33 + .../Exception/Doubler/DoubleException.php | 18 + .../Exception/Doubler/DoublerException.php | 18 + .../Doubler/InterfaceNotFoundException.php | 20 + .../Doubler/MethodNotExtendableException.php | 41 + .../Doubler/MethodNotFoundException.php | 60 + .../Doubler/ReturnByReferenceException.php | 41 + .../src/Prophecy/Exception/Exception.php | 26 + .../Exception/InvalidArgumentException.php | 16 + .../Prediction/AggregateException.php | 51 + .../Prediction/FailedPredictionException.php | 24 + .../Exception/Prediction/NoCallsException.php | 18 + .../Prediction/PredictionException.php | 18 + .../UnexpectedCallsCountException.php | 31 + .../Prediction/UnexpectedCallsException.php | 32 + .../Prophecy/MethodProphecyException.php | 34 + .../Prophecy/ObjectProphecyException.php | 34 + .../Exception/Prophecy/ProphecyException.php | 18 + .../ClassAndInterfaceTagRetriever.php | 69 + .../PhpDocumentor/ClassTagRetriever.php | 60 + .../PhpDocumentor/LegacyClassTagRetriever.php | 35 + .../MethodTagRetrieverInterface.php | 30 + .../Prophecy/Prediction/CallPrediction.php | 86 + .../Prediction/CallTimesPrediction.php | 107 + .../Prediction/CallbackPrediction.php | 65 + .../Prophecy/Prediction/NoCallsPrediction.php | 68 + .../Prediction/PredictionInterface.php | 37 + .../src/Prophecy/Promise/CallbackPromise.php | 66 + .../src/Prophecy/Promise/PromiseInterface.php | 35 + .../Promise/ReturnArgumentPromise.php | 61 + .../src/Prophecy/Promise/ReturnPromise.php | 55 + .../src/Prophecy/Promise/ThrowPromise.php | 100 + .../src/Prophecy/Prophecy/MethodProphecy.php | 565 +++ .../src/Prophecy/Prophecy/ObjectProphecy.php | 286 ++ .../Prophecy/Prophecy/ProphecyInterface.php | 27 + .../Prophecy/ProphecySubjectInterface.php | 34 + .../src/Prophecy/Prophecy/Revealer.php | 44 + .../Prophecy/Prophecy/RevealerInterface.php | 29 + .../phpspec/prophecy/src/Prophecy/Prophet.php | 138 + .../prophecy/src/Prophecy/Util/ExportUtil.php | 210 + .../prophecy/src/Prophecy/Util/StringUtil.php | 99 + .../phpunit/php-code-coverage/.gitattributes | 3 + .../php-code-coverage/.github/CONTRIBUTING.md | 1 + .../php-code-coverage/.github/FUNDING.yml | 1 + .../.github/ISSUE_TEMPLATE.md | 18 + .../phpunit/php-code-coverage/.gitignore | 7 + .../phpunit/php-code-coverage/.php_cs.dist | 197 + .../phpunit/php-code-coverage/.travis.yml | 60 + .../phpunit/php-code-coverage/ChangeLog.md | 159 + .../vendor/phpunit/php-code-coverage/LICENSE | 33 + .../phpunit/php-code-coverage/README.md | 40 + .../phpunit/php-code-coverage/build.xml | 30 + .../phpunit/php-code-coverage/composer.json | 61 + .../phpunit/php-code-coverage/phive.xml | 4 + .../phpunit/php-code-coverage/phpunit.xml | 21 + .../php-code-coverage/src/CodeCoverage.php | 1006 +++++ .../php-code-coverage/src/Driver/Driver.php | 47 + .../php-code-coverage/src/Driver/PCOV.php | 45 + .../php-code-coverage/src/Driver/PHPDBG.php | 96 + .../php-code-coverage/src/Driver/Xdebug.php | 123 + .../CoveredCodeNotExecutedException.php | 17 + .../src/Exception/Exception.php | 17 + .../Exception/InvalidArgumentException.php | 36 + .../MissingCoversAnnotationException.php | 17 + .../src/Exception/RuntimeException.php | 14 + .../UnintentionallyCoveredCodeException.php | 44 + .../phpunit/php-code-coverage/src/Filter.php | 174 + .../src/Node/AbstractNode.php | 328 ++ .../php-code-coverage/src/Node/Builder.php | 227 + .../php-code-coverage/src/Node/Directory.php | 427 ++ .../php-code-coverage/src/Node/File.php | 611 +++ .../php-code-coverage/src/Node/Iterator.php | 89 + .../php-code-coverage/src/Report/Clover.php | 258 ++ .../php-code-coverage/src/Report/Crap4j.php | 165 + .../src/Report/Html/Facade.php | 167 + .../src/Report/Html/Renderer.php | 277 ++ .../src/Report/Html/Renderer/Dashboard.php | 281 ++ .../src/Report/Html/Renderer/Directory.php | 98 + .../src/Report/Html/Renderer/File.php | 529 +++ .../Renderer/Template/coverage_bar.html.dist | 5 + .../Renderer/Template/css/bootstrap.min.css | 7 + .../Html/Renderer/Template/css/custom.css | 0 .../Html/Renderer/Template/css/nv.d3.min.css | 1 + .../Html/Renderer/Template/css/octicons.css | 5 + .../Html/Renderer/Template/css/style.css | 122 + .../Renderer/Template/dashboard.html.dist | 281 ++ .../Renderer/Template/directory.html.dist | 60 + .../Template/directory_item.html.dist | 13 + .../Html/Renderer/Template/file.html.dist | 72 + .../Renderer/Template/file_item.html.dist | 14 + .../Renderer/Template/icons/file-code.svg | 1 + .../Template/icons/file-directory.svg | 1 + .../Renderer/Template/js/bootstrap.min.js | 7 + .../Html/Renderer/Template/js/d3.min.js | 5 + .../Report/Html/Renderer/Template/js/file.js | 62 + .../Html/Renderer/Template/js/jquery.min.js | 2 + .../Html/Renderer/Template/js/nv.d3.min.js | 8 + .../Html/Renderer/Template/js/popper.min.js | 5 + .../Renderer/Template/method_item.html.dist | 11 + .../php-code-coverage/src/Report/PHP.php | 64 + .../php-code-coverage/src/Report/Text.php | 283 ++ .../src/Report/Xml/BuildInformation.php | 81 + .../src/Report/Xml/Coverage.php | 69 + .../src/Report/Xml/Directory.php | 14 + .../src/Report/Xml/Facade.php | 287 ++ .../php-code-coverage/src/Report/Xml/File.php | 81 + .../src/Report/Xml/Method.php | 56 + .../php-code-coverage/src/Report/Xml/Node.php | 87 + .../src/Report/Xml/Project.php | 85 + .../src/Report/Xml/Report.php | 92 + .../src/Report/Xml/Source.php | 38 + .../src/Report/Xml/Tests.php | 46 + .../src/Report/Xml/Totals.php | 140 + .../php-code-coverage/src/Report/Xml/Unit.php | 95 + .../phpunit/php-code-coverage/src/Util.php | 40 + .../phpunit/php-code-coverage/src/Version.php | 30 + .../php-code-coverage/tests/TestCase.php | 395 ++ .../tests/_files/BankAccount-clover.xml | 26 + .../tests/_files/BankAccount-crap4j.xml | 59 + .../tests/_files/BankAccount-text.txt | 12 + .../tests/_files/BankAccount.php | 33 + .../tests/_files/BankAccountTest.php | 66 + .../_files/CoverageClassExtendedTest.php | 14 + .../tests/_files/CoverageClassTest.php | 14 + .../CoverageFunctionParenthesesTest.php | 13 + ...erageFunctionParenthesesWhitespaceTest.php | 13 + .../tests/_files/CoverageFunctionTest.php | 13 + .../CoverageMethodOneLineAnnotationTest.php | 12 + .../_files/CoverageMethodParenthesesTest.php | 14 + ...overageMethodParenthesesWhitespaceTest.php | 14 + .../tests/_files/CoverageMethodTest.php | 14 + .../tests/_files/CoverageNoneTest.php | 11 + .../tests/_files/CoverageNotPrivateTest.php | 14 + .../tests/_files/CoverageNotProtectedTest.php | 14 + .../tests/_files/CoverageNotPublicTest.php | 14 + .../tests/_files/CoverageNothingTest.php | 15 + .../tests/_files/CoveragePrivateTest.php | 14 + .../tests/_files/CoverageProtectedTest.php | 14 + .../tests/_files/CoveragePublicTest.php | 14 + .../CoverageTwoDefaultClassAnnotations.php | 17 + .../tests/_files/CoveredClass.php | 36 + .../tests/_files/CoveredFunction.php | 4 + .../php-code-coverage/tests/_files/Crash.php | 2 + .../NamespaceCoverageClassExtendedTest.php | 14 + .../_files/NamespaceCoverageClassTest.php | 14 + ...NamespaceCoverageCoversClassPublicTest.php | 17 + .../NamespaceCoverageCoversClassTest.php | 22 + .../_files/NamespaceCoverageMethodTest.php | 14 + .../NamespaceCoverageNotPrivateTest.php | 14 + .../NamespaceCoverageNotProtectedTest.php | 14 + .../_files/NamespaceCoverageNotPublicTest.php | 14 + .../_files/NamespaceCoveragePrivateTest.php | 14 + .../_files/NamespaceCoverageProtectedTest.php | 14 + .../_files/NamespaceCoveragePublicTest.php | 14 + .../tests/_files/NamespaceCoveredClass.php | 38 + .../_files/NotExistingCoveredElementTest.php | 26 + .../BankAccount.php.html | 249 ++ .../CoverageForBankAccount/dashboard.html | 287 ++ .../HTML/CoverageForBankAccount/index.html | 118 + .../dashboard.html | 285 ++ .../index.html | 118 + ...with_class_and_anonymous_function.php.html | 172 + .../dashboard.html | 283 ++ .../index.html | 108 + .../source_with_ignore.php.html | 196 + .../BankAccount.php.xml | 262 ++ .../XML/CoverageForBankAccount/index.xml | 33 + .../index.xml | 30 + ..._with_class_and_anonymous_function.php.xml | 161 + .../CoverageForFileWithIgnoredLines/index.xml | 30 + .../source_with_ignore.php.xml | 187 + .../class-with-anonymous-function-clover.xml | 21 + .../class-with-anonymous-function-crap4j.xml | 26 + .../class-with-anonymous-function-text.txt | 12 + .../tests/_files/ignored-lines-clover.xml | 17 + .../tests/_files/ignored-lines-crap4j.xml | 37 + .../tests/_files/ignored-lines-text.txt | 10 + ...urce_with_class_and_anonymous_function.php | 19 + .../tests/_files/source_with_ignore.php | 37 + .../tests/_files/source_with_namespace.php | 20 + .../source_with_oneline_annotations.php | 36 + .../_files/source_with_use_statements.php | 23 + .../tests/_files/source_without_ignore.php | 4 + .../tests/_files/source_without_namespace.php | 18 + .../php-code-coverage/tests/bootstrap.php | 7 + .../tests/tests/BuilderTest.php | 246 ++ .../tests/tests/CloverTest.php | 48 + .../tests/tests/CodeCoverageTest.php | 359 ++ .../tests/tests/Crap4jTest.php | 48 + ...nintentionallyCoveredCodeExceptionTest.php | 51 + .../tests/tests/FilterTest.php | 213 + .../tests/tests/HTMLTest.php | 102 + .../tests/tests/TextTest.php | 48 + .../tests/tests/UtilTest.php | 28 + .../php-code-coverage/tests/tests/XmlTest.php | 97 + .../phpunit/php-file-iterator/.gitattributes | 1 + .../php-file-iterator/.github/stale.yml | 40 + .../phpunit/php-file-iterator/.gitignore | 5 + .../phpunit/php-file-iterator/.php_cs.dist | 168 + .../phpunit/php-file-iterator/.travis.yml | 32 + .../phpunit/php-file-iterator/ChangeLog.md | 77 + .../vendor/phpunit/php-file-iterator/LICENSE | 33 + .../phpunit/php-file-iterator/README.md | 14 + .../phpunit/php-file-iterator/composer.json | 37 + .../phpunit/php-file-iterator/phpunit.xml | 21 + .../phpunit/php-file-iterator/src/Facade.php | 112 + .../phpunit/php-file-iterator/src/Factory.php | 83 + .../php-file-iterator/src/Iterator.php | 112 + .../php-file-iterator/tests/FactoryTest.php | 50 + .../phpunit/php-text-template/.gitattributes | 1 + .../phpunit/php-text-template/.gitignore | 5 + .../vendor/phpunit/php-text-template/LICENSE | 33 + .../phpunit/php-text-template/README.md | 14 + .../phpunit/php-text-template/composer.json | 29 + .../php-text-template/src/Template.php | 135 + .../vendor/phpunit/php-timer/.gitattributes | 1 + .../phpunit/php-timer/.github/FUNDING.yml | 1 + .../phpunit/php-timer/.github/stale.yml | 40 + .../vendor/phpunit/php-timer/.gitignore | 5 + .../vendor/phpunit/php-timer/.php_cs.dist | 197 + .../vendor/phpunit/php-timer/.travis.yml | 23 + .../vendor/phpunit/php-timer/ChangeLog.md | 43 + .../vendor/phpunit/php-timer/LICENSE | 33 + .../vendor/phpunit/php-timer/README.md | 49 + .../vendor/phpunit/php-timer/build.xml | 20 + .../vendor/phpunit/php-timer/composer.json | 42 + .../vendor/phpunit/php-timer/phpunit.xml | 19 + .../phpunit/php-timer/src/Exception.php | 14 + .../php-timer/src/RuntimeException.php | 14 + .../vendor/phpunit/php-timer/src/Timer.php | 100 + .../phpunit/php-timer/tests/TimerTest.php | 134 + .../phpunit/php-token-stream/.gitattributes | 12 + .../phpunit/php-token-stream/.gitignore | 7 + .../phpunit/php-token-stream/ChangeLog.md | 92 + .../vendor/phpunit/php-token-stream/LICENSE | 33 + .../vendor/phpunit/php-token-stream/README.md | 18 + .../phpunit/php-token-stream/composer.json | 42 + .../phpunit/php-token-stream/src/Abstract.php | 12 + .../php-token-stream/src/Ampersand.php | 12 + .../phpunit/php-token-stream/src/AndEqual.php | 12 + .../phpunit/php-token-stream/src/Array.php | 12 + .../php-token-stream/src/ArrayCast.php | 12 + .../phpunit/php-token-stream/src/As.php | 12 + .../phpunit/php-token-stream/src/At.php | 12 + .../phpunit/php-token-stream/src/Backtick.php | 12 + .../php-token-stream/src/BadCharacter.php | 12 + .../phpunit/php-token-stream/src/BoolCast.php | 12 + .../php-token-stream/src/BooleanAnd.php | 12 + .../php-token-stream/src/BooleanOr.php | 12 + .../php-token-stream/src/CachingFactory.php | 42 + .../phpunit/php-token-stream/src/Callable.php | 12 + .../phpunit/php-token-stream/src/Caret.php | 12 + .../phpunit/php-token-stream/src/Case.php | 12 + .../phpunit/php-token-stream/src/Catch.php | 12 + .../php-token-stream/src/Character.php | 12 + .../phpunit/php-token-stream/src/Class.php | 62 + .../phpunit/php-token-stream/src/ClassC.php | 12 + .../src/ClassNameConstant.php | 12 + .../phpunit/php-token-stream/src/Clone.php | 12 + .../php-token-stream/src/CloseBracket.php | 12 + .../php-token-stream/src/CloseCurly.php | 12 + .../php-token-stream/src/CloseSquare.php | 12 + .../phpunit/php-token-stream/src/CloseTag.php | 12 + .../phpunit/php-token-stream/src/Coalesce.php | 12 + .../php-token-stream/src/CoalesceEqual.php | 12 + .../phpunit/php-token-stream/src/Colon.php | 12 + .../phpunit/php-token-stream/src/Comma.php | 12 + .../phpunit/php-token-stream/src/Comment.php | 12 + .../php-token-stream/src/ConcatEqual.php | 12 + .../phpunit/php-token-stream/src/Const.php | 12 + .../src/ConstantEncapsedString.php | 12 + .../phpunit/php-token-stream/src/Continue.php | 12 + .../php-token-stream/src/CurlyOpen.php | 12 + .../phpunit/php-token-stream/src/DNumber.php | 12 + .../phpunit/php-token-stream/src/Dec.php | 12 + .../phpunit/php-token-stream/src/Declare.php | 12 + .../phpunit/php-token-stream/src/Default.php | 12 + .../phpunit/php-token-stream/src/Dir.php | 12 + .../phpunit/php-token-stream/src/Div.php | 12 + .../phpunit/php-token-stream/src/DivEqual.php | 12 + .../phpunit/php-token-stream/src/Do.php | 12 + .../php-token-stream/src/DocComment.php | 12 + .../phpunit/php-token-stream/src/Dollar.php | 12 + .../src/DollarOpenCurlyBraces.php | 12 + .../phpunit/php-token-stream/src/Dot.php | 12 + .../php-token-stream/src/DoubleArrow.php | 12 + .../php-token-stream/src/DoubleCast.php | 12 + .../php-token-stream/src/DoubleColon.php | 12 + .../php-token-stream/src/DoubleQuotes.php | 12 + .../phpunit/php-token-stream/src/Echo.php | 12 + .../phpunit/php-token-stream/src/Ellipsis.php | 12 + .../phpunit/php-token-stream/src/Else.php | 12 + .../phpunit/php-token-stream/src/Elseif.php | 12 + .../phpunit/php-token-stream/src/Empty.php | 12 + .../src/EncapsedAndWhitespace.php | 12 + .../php-token-stream/src/EndHeredoc.php | 12 + .../php-token-stream/src/Enddeclare.php | 12 + .../phpunit/php-token-stream/src/Endfor.php | 12 + .../php-token-stream/src/Endforeach.php | 12 + .../phpunit/php-token-stream/src/Endif.php | 12 + .../php-token-stream/src/Endswitch.php | 12 + .../phpunit/php-token-stream/src/Endwhile.php | 12 + .../phpunit/php-token-stream/src/Equal.php | 12 + .../phpunit/php-token-stream/src/Eval.php | 12 + .../php-token-stream/src/ExclamationMark.php | 12 + .../phpunit/php-token-stream/src/Exit.php | 12 + .../phpunit/php-token-stream/src/Extends.php | 12 + .../phpunit/php-token-stream/src/File.php | 12 + .../phpunit/php-token-stream/src/Final.php | 12 + .../phpunit/php-token-stream/src/Finally.php | 12 + .../phpunit/php-token-stream/src/Fn.php | 12 + .../phpunit/php-token-stream/src/For.php | 12 + .../phpunit/php-token-stream/src/Foreach.php | 12 + .../phpunit/php-token-stream/src/FuncC.php | 12 + .../phpunit/php-token-stream/src/Function.php | 196 + .../phpunit/php-token-stream/src/Global.php | 12 + .../phpunit/php-token-stream/src/Goto.php | 12 + .../phpunit/php-token-stream/src/Gt.php | 12 + .../php-token-stream/src/HaltCompiler.php | 12 + .../phpunit/php-token-stream/src/If.php | 12 + .../php-token-stream/src/Implements.php | 12 + .../phpunit/php-token-stream/src/Inc.php | 12 + .../phpunit/php-token-stream/src/Include.php | 12 + .../php-token-stream/src/IncludeOnce.php | 12 + .../phpunit/php-token-stream/src/Includes.php | 57 + .../php-token-stream/src/InlineHtml.php | 12 + .../php-token-stream/src/Instanceof.php | 12 + .../php-token-stream/src/Insteadof.php | 12 + .../phpunit/php-token-stream/src/IntCast.php | 12 + .../php-token-stream/src/Interface.php | 166 + .../phpunit/php-token-stream/src/IsEqual.php | 12 + .../php-token-stream/src/IsGreaterOrEqual.php | 12 + .../php-token-stream/src/IsIdentical.php | 12 + .../php-token-stream/src/IsNotEqual.php | 12 + .../php-token-stream/src/IsNotIdentical.php | 12 + .../php-token-stream/src/IsSmallerOrEqual.php | 12 + .../phpunit/php-token-stream/src/Isset.php | 12 + .../phpunit/php-token-stream/src/Line.php | 12 + .../phpunit/php-token-stream/src/List.php | 12 + .../phpunit/php-token-stream/src/Lnumber.php | 12 + .../php-token-stream/src/LogicalAnd.php | 12 + .../php-token-stream/src/LogicalOr.php | 12 + .../php-token-stream/src/LogicalXor.php | 12 + .../phpunit/php-token-stream/src/Lt.php | 12 + .../phpunit/php-token-stream/src/MethodC.php | 12 + .../phpunit/php-token-stream/src/Minus.php | 12 + .../php-token-stream/src/MinusEqual.php | 12 + .../phpunit/php-token-stream/src/ModEqual.php | 12 + .../phpunit/php-token-stream/src/MulEqual.php | 12 + .../phpunit/php-token-stream/src/Mult.php | 12 + .../src/NameFullyQualified.php | 12 + .../php-token-stream/src/NameQualified.php | 12 + .../php-token-stream/src/NameRelative.php | 12 + .../php-token-stream/src/Namespace.php | 31 + .../phpunit/php-token-stream/src/New.php | 12 + .../phpunit/php-token-stream/src/NsC.php | 12 + .../php-token-stream/src/NsSeparator.php | 12 + .../php-token-stream/src/NumString.php | 12 + .../php-token-stream/src/ObjectCast.php | 12 + .../php-token-stream/src/ObjectOperator.php | 12 + .../php-token-stream/src/OpenBracket.php | 12 + .../php-token-stream/src/OpenCurly.php | 12 + .../php-token-stream/src/OpenSquare.php | 12 + .../phpunit/php-token-stream/src/OpenTag.php | 12 + .../php-token-stream/src/OpenTagWithEcho.php | 12 + .../phpunit/php-token-stream/src/OrEqual.php | 12 + .../src/PaamayimNekudotayim.php | 12 + .../phpunit/php-token-stream/src/Percent.php | 12 + .../phpunit/php-token-stream/src/Pipe.php | 12 + .../phpunit/php-token-stream/src/Plus.php | 12 + .../php-token-stream/src/PlusEqual.php | 12 + .../phpunit/php-token-stream/src/Pow.php | 12 + .../phpunit/php-token-stream/src/PowEqual.php | 12 + .../phpunit/php-token-stream/src/Print.php | 12 + .../phpunit/php-token-stream/src/Private.php | 12 + .../php-token-stream/src/Protected.php | 12 + .../phpunit/php-token-stream/src/Public.php | 12 + .../php-token-stream/src/QuestionMark.php | 12 + .../phpunit/php-token-stream/src/Require.php | 12 + .../php-token-stream/src/RequireOnce.php | 12 + .../phpunit/php-token-stream/src/Return.php | 12 + .../php-token-stream/src/Semicolon.php | 12 + .../phpunit/php-token-stream/src/Sl.php | 12 + .../phpunit/php-token-stream/src/SlEqual.php | 12 + .../php-token-stream/src/Spaceship.php | 12 + .../phpunit/php-token-stream/src/Sr.php | 12 + .../phpunit/php-token-stream/src/SrEqual.php | 12 + .../php-token-stream/src/StartHeredoc.php | 12 + .../phpunit/php-token-stream/src/Static.php | 12 + .../phpunit/php-token-stream/src/Stream.php | 658 +++ .../phpunit/php-token-stream/src/String.php | 12 + .../php-token-stream/src/StringCast.php | 12 + .../php-token-stream/src/StringVarname.php | 12 + .../phpunit/php-token-stream/src/Switch.php | 12 + .../phpunit/php-token-stream/src/Throw.php | 12 + .../phpunit/php-token-stream/src/Tilde.php | 12 + .../phpunit/php-token-stream/src/Token.php | 68 + .../php-token-stream/src/TokenWithScope.php | 107 + .../src/TokenWithScopeAndVisibility.php | 67 + .../phpunit/php-token-stream/src/Trait.php | 12 + .../phpunit/php-token-stream/src/TraitC.php | 12 + .../phpunit/php-token-stream/src/Try.php | 12 + .../phpunit/php-token-stream/src/Unset.php | 12 + .../php-token-stream/src/UnsetCast.php | 12 + .../phpunit/php-token-stream/src/Use.php | 12 + .../php-token-stream/src/UseFunction.php | 12 + .../phpunit/php-token-stream/src/Util.php | 18 + .../phpunit/php-token-stream/src/Var.php | 12 + .../phpunit/php-token-stream/src/Variable.php | 12 + .../phpunit/php-token-stream/src/While.php | 12 + .../php-token-stream/src/Whitespace.php | 12 + .../phpunit/php-token-stream/src/XorEqual.php | 12 + .../phpunit/php-token-stream/src/Yield.php | 12 + .../php-token-stream/src/YieldFrom.php | 12 + .../phpunit/php-token-stream/src/break.php | 12 + .../vendor/phpunit/phpunit/.phpstorm.meta.php | 45 + .../vendor/phpunit/phpunit/ChangeLog-8.5.md | 141 + .../um_client/vendor/phpunit/phpunit/LICENSE | 33 + .../vendor/phpunit/phpunit/README.md | 41 + .../vendor/phpunit/phpunit/composer.json | 89 + .../um_client/vendor/phpunit/phpunit/phpunit | 61 + .../vendor/phpunit/phpunit/phpunit.xsd | 317 ++ .../vendor/phpunit/phpunit/src/Exception.php | 19 + .../phpunit/phpunit/src/Framework/Assert.php | 3645 +++++++++++++++++ .../src/Framework/Assert/Functions.php | 3009 ++++++++++++++ .../src/Framework/Constraint/ArrayHasKey.php | 82 + .../src/Framework/Constraint/ArraySubset.php | 135 + .../src/Framework/Constraint/Attribute.php | 79 + .../src/Framework/Constraint/Callback.php | 47 + .../Constraint/ClassHasAttribute.php | 91 + .../Constraint/ClassHasStaticAttribute.php | 62 + .../src/Framework/Constraint/Composite.php | 69 + .../src/Framework/Constraint/Constraint.php | 155 + .../src/Framework/Constraint/Count.php | 128 + .../Framework/Constraint/DirectoryExists.php | 56 + .../src/Framework/Constraint/Exception.php | 82 + .../Framework/Constraint/ExceptionCode.php | 64 + .../Framework/Constraint/ExceptionMessage.php | 75 + .../ExceptionMessageRegularExpression.php | 71 + .../src/Framework/Constraint/FileExists.php | 56 + .../src/Framework/Constraint/GreaterThan.php | 51 + .../src/Framework/Constraint/IsAnything.php | 51 + .../src/Framework/Constraint/IsEmpty.php | 70 + .../src/Framework/Constraint/IsEqual.php | 142 + .../src/Framework/Constraint/IsFalse.php | 35 + .../src/Framework/Constraint/IsFinite.php | 37 + .../src/Framework/Constraint/IsIdentical.php | 147 + .../src/Framework/Constraint/IsInfinite.php | 37 + .../src/Framework/Constraint/IsInstanceOf.php | 90 + .../src/Framework/Constraint/IsJson.php | 77 + .../src/Framework/Constraint/IsNan.php | 37 + .../src/Framework/Constraint/IsNull.php | 35 + .../src/Framework/Constraint/IsReadable.php | 56 + .../src/Framework/Constraint/IsTrue.php | 35 + .../src/Framework/Constraint/IsType.php | 214 + .../src/Framework/Constraint/IsWritable.php | 56 + .../src/Framework/Constraint/JsonMatches.php | 109 + .../JsonMatchesErrorMessageProvider.php | 72 + .../src/Framework/Constraint/LessThan.php | 51 + .../src/Framework/Constraint/LogicalAnd.php | 121 + .../src/Framework/Constraint/LogicalNot.php | 169 + .../src/Framework/Constraint/LogicalOr.php | 118 + .../src/Framework/Constraint/LogicalXor.php | 123 + .../Constraint/ObjectHasAttribute.php | 32 + .../Constraint/RegularExpression.php | 57 + .../src/Framework/Constraint/SameSize.php | 18 + .../Framework/Constraint/StringContains.php | 79 + .../Framework/Constraint/StringEndsWith.php | 49 + .../StringMatchesFormatDescription.php | 108 + .../Framework/Constraint/StringStartsWith.php | 54 + .../Constraint/TraversableContains.php | 120 + .../Constraint/TraversableContainsEqual.php | 88 + .../TraversableContainsIdentical.php | 87 + .../Constraint/TraversableContainsOnly.php | 87 + .../src/Framework/DataProviderTestSuite.php | 63 + .../src/Framework/Error/Deprecated.php | 14 + .../phpunit/src/Framework/Error/Error.php | 23 + .../phpunit/src/Framework/Error/Notice.php | 14 + .../phpunit/src/Framework/Error/Warning.php | 14 + .../Exception/AssertionFailedError.php | 24 + .../Exception/CodeCoverageException.php | 17 + .../CoveredCodeNotExecutedException.php | 17 + .../src/Framework/Exception/Exception.php | 81 + .../Exception/ExpectationFailedException.php | 42 + .../Exception/IncompleteTestError.php | 17 + .../Exception/InvalidArgumentException.php | 42 + .../InvalidCoversTargetException.php | 17 + .../InvalidDataProviderException.php | 17 + .../MissingCoversAnnotationException.php | 17 + .../Exception/NoChildTestSuiteException.php | 17 + .../src/Framework/Exception/OutputError.php | 17 + .../Exception/PHPTAssertionFailedError.php | 32 + .../Framework/Exception/RiskyTestError.php | 17 + .../Framework/Exception/SkippedTestError.php | 17 + .../Exception/SkippedTestSuiteError.php | 17 + .../Framework/Exception/SyntheticError.php | 61 + .../Exception/SyntheticSkippedError.php | 17 + .../UnintentionallyCoveredCodeError.php | 17 + .../src/Framework/Exception/Warning.php | 24 + .../src/Framework/ExceptionWrapper.php | 120 + .../phpunit/src/Framework/IncompleteTest.php | 17 + .../src/Framework/IncompleteTestCase.php | 66 + .../InvalidParameterGroupException.php | 17 + .../src/Framework/MockObject/Api/Api.php | 97 + .../src/Framework/MockObject/Api/Method.php | 30 + .../MockObject/Api/MockedCloneMethod.php | 21 + .../MockObject/Api/UnmockedCloneMethod.php | 23 + .../Framework/MockObject/Builder/Identity.php | 25 + .../MockObject/Builder/InvocationMocker.php | 299 ++ .../MockObject/Builder/InvocationStubber.php | 62 + .../Framework/MockObject/Builder/Match_.php | 26 + .../MockObject/Builder/MethodNameMatch.php | 26 + .../MockObject/Builder/ParametersMatch.php | 48 + .../src/Framework/MockObject/Builder/Stub.php | 24 + .../MockObject/ConfigurableMethod.php | 53 + .../Exception/BadMethodCallException.php | 17 + ...ableMethodsAlreadyInitializedException.php | 17 + .../MockObject/Exception/Exception.php | 19 + .../IncompatibleReturnValueException.php | 17 + .../MockObject/Exception/RuntimeException.php | 17 + .../src/Framework/MockObject/Generator.php | 1101 +++++ .../MockObject/Generator/deprecation.tpl | 2 + .../MockObject/Generator/mocked_class.tpl | 6 + .../MockObject/Generator/mocked_method.tpl | 22 + .../Generator/mocked_method_void.tpl | 20 + .../Generator/mocked_static_method.tpl | 5 + .../MockObject/Generator/proxied_method.tpl | 22 + .../Generator/proxied_method_void.tpl | 22 + .../MockObject/Generator/trait_class.tpl | 6 + .../MockObject/Generator/wsdl_class.tpl | 9 + .../MockObject/Generator/wsdl_method.tpl | 4 + .../src/Framework/MockObject/Invocation.php | 199 + .../MockObject/InvocationHandler.php | 197 + .../src/Framework/MockObject/Matcher.php | 278 ++ .../MockObject/MethodNameConstraint.php | 48 + .../src/Framework/MockObject/MockBuilder.php | 511 +++ .../src/Framework/MockObject/MockClass.php | 63 + .../src/Framework/MockObject/MockMethod.php | 385 ++ .../Framework/MockObject/MockMethodSet.php | 45 + .../src/Framework/MockObject/MockObject.php | 25 + .../src/Framework/MockObject/MockTrait.php | 48 + .../src/Framework/MockObject/MockType.php | 18 + .../MockObject/Rule/AnyInvokedCount.php | 36 + .../MockObject/Rule/AnyParameters.php | 31 + .../MockObject/Rule/ConsecutiveParameters.php | 136 + .../MockObject/Rule/InvocationOrder.php | 47 + .../MockObject/Rule/InvokedAtIndex.php | 72 + .../MockObject/Rule/InvokedAtLeastCount.php | 64 + .../MockObject/Rule/InvokedAtLeastOnce.php | 50 + .../MockObject/Rule/InvokedAtMostCount.php | 64 + .../MockObject/Rule/InvokedCount.php | 102 + .../Framework/MockObject/Rule/MethodName.php | 64 + .../Framework/MockObject/Rule/Parameters.php | 160 + .../MockObject/Rule/ParametersRule.php | 25 + .../phpunit/src/Framework/MockObject/Stub.php | 24 + .../MockObject/Stub/ConsecutiveCalls.php | 57 + .../Framework/MockObject/Stub/Exception.php | 46 + .../MockObject/Stub/ReturnArgument.php | 41 + .../MockObject/Stub/ReturnCallback.php | 59 + .../MockObject/Stub/ReturnReference.php | 45 + .../Framework/MockObject/Stub/ReturnSelf.php | 32 + .../Framework/MockObject/Stub/ReturnStub.php | 45 + .../MockObject/Stub/ReturnValueMap.php | 53 + .../src/Framework/MockObject/Stub/Stub.php | 27 + .../src/Framework/MockObject/Verifiable.php | 26 + .../phpunit/src/Framework/SelfDescribing.php | 21 + .../phpunit/src/Framework/SkippedTest.php | 17 + .../phpunit/src/Framework/SkippedTestCase.php | 66 + .../phpunit/phpunit/src/Framework/Test.php | 23 + .../phpunit/src/Framework/TestBuilder.php | 239 ++ .../phpunit/src/Framework/TestCase.php | 2582 ++++++++++++ .../phpunit/src/Framework/TestFailure.php | 157 + .../phpunit/src/Framework/TestListener.php | 84 + .../TestListenerDefaultImplementation.php | 58 + .../phpunit/src/Framework/TestResult.php | 1232 ++++++ .../phpunit/src/Framework/TestSuite.php | 796 ++++ .../src/Framework/TestSuiteIterator.php | 83 + .../phpunit/src/Framework/WarningTestCase.php | 66 + .../phpunit/src/Runner/BaseTestRunner.php | 160 + .../src/Runner/DefaultTestResultCache.php | 233 ++ .../phpunit/phpunit/src/Runner/Exception.php | 19 + .../Filter/ExcludeGroupFilterIterator.php | 23 + .../phpunit/src/Runner/Filter/Factory.php | 56 + .../src/Runner/Filter/GroupFilterIterator.php | 58 + .../Filter/IncludeGroupFilterIterator.php | 23 + .../src/Runner/Filter/NameFilterIterator.php | 135 + .../Runner/Hook/AfterIncompleteTestHook.php | 15 + .../src/Runner/Hook/AfterLastTestHook.php | 15 + .../src/Runner/Hook/AfterRiskyTestHook.php | 15 + .../src/Runner/Hook/AfterSkippedTestHook.php | 15 + .../Runner/Hook/AfterSuccessfulTestHook.php | 15 + .../src/Runner/Hook/AfterTestErrorHook.php | 15 + .../src/Runner/Hook/AfterTestFailureHook.php | 15 + .../phpunit/src/Runner/Hook/AfterTestHook.php | 21 + .../src/Runner/Hook/AfterTestWarningHook.php | 15 + .../src/Runner/Hook/BeforeFirstTestHook.php | 15 + .../src/Runner/Hook/BeforeTestHook.php | 15 + .../phpunit/phpunit/src/Runner/Hook/Hook.php | 14 + .../phpunit/src/Runner/Hook/TestHook.php | 14 + .../src/Runner/Hook/TestListenerAdapter.php | 141 + .../src/Runner/NullTestResultCache.php | 42 + .../phpunit/src/Runner/PhptTestCase.php | 819 ++++ .../src/Runner/ResultCacheExtension.php | 110 + .../src/Runner/StandardTestSuiteLoader.php | 164 + .../phpunit/src/Runner/TestResultCache.php | 28 + .../phpunit/src/Runner/TestSuiteLoader.php | 22 + .../phpunit/src/Runner/TestSuiteSorter.php | 448 ++ .../phpunit/phpunit/src/Runner/Version.php | 71 + .../phpunit/phpunit/src/TextUI/Command.php | 1368 +++++++ .../phpunit/phpunit/src/TextUI/Exception.php | 19 + .../phpunit/phpunit/src/TextUI/Help.php | 255 ++ .../phpunit/src/TextUI/ResultPrinter.php | 588 +++ .../phpunit/phpunit/src/TextUI/TestRunner.php | 1392 +++++++ .../phpunit/src/Util/Annotation/DocBlock.php | 620 +++ .../phpunit/src/Util/Annotation/Registry.php | 93 + .../phpunit/phpunit/src/Util/Blacklist.php | 224 + .../vendor/phpunit/phpunit/src/Util/Color.php | 157 + .../phpunit/src/Util/Configuration.php | 1231 ++++++ .../src/Util/ConfigurationGenerator.php | 66 + .../phpunit/phpunit/src/Util/ErrorHandler.php | 155 + .../phpunit/phpunit/src/Util/Exception.php | 19 + .../phpunit/phpunit/src/Util/FileLoader.php | 84 + .../phpunit/phpunit/src/Util/Filesystem.php | 40 + .../phpunit/phpunit/src/Util/Filter.php | 115 + .../phpunit/phpunit/src/Util/Getopt.php | 197 + .../phpunit/phpunit/src/Util/GlobalState.php | 194 + .../src/Util/InvalidDataSetException.php | 19 + .../vendor/phpunit/phpunit/src/Util/Json.php | 98 + .../phpunit/phpunit/src/Util/Log/JUnit.php | 432 ++ .../phpunit/phpunit/src/Util/Log/TeamCity.php | 394 ++ .../src/Util/PHP/AbstractPhpProcess.php | 415 ++ .../src/Util/PHP/DefaultPhpProcess.php | 233 ++ .../src/Util/PHP/Template/PhptTestCase.tpl | 40 + .../src/Util/PHP/Template/TestCaseClass.tpl | 108 + .../src/Util/PHP/Template/TestCaseMethod.tpl | 111 + .../src/Util/PHP/WindowsPhpProcess.php | 52 + .../phpunit/phpunit/src/Util/Printer.php | 164 + .../phpunit/src/Util/RegularExpression.php | 30 + .../vendor/phpunit/phpunit/src/Util/Test.php | 934 +++++ .../src/Util/TestDox/CliTestDoxPrinter.php | 365 ++ .../src/Util/TestDox/HtmlResultPrinter.php | 133 + .../src/Util/TestDox/NamePrettifier.php | 324 ++ .../src/Util/TestDox/ResultPrinter.php | 342 ++ .../src/Util/TestDox/TestDoxPrinter.php | 384 ++ .../src/Util/TestDox/TextResultPrinter.php | 46 + .../src/Util/TestDox/XmlResultPrinter.php | 254 ++ .../phpunit/src/Util/TextTestListRenderer.php | 54 + .../vendor/phpunit/phpunit/src/Util/Type.php | 52 + .../src/Util/VersionComparisonOperator.php | 57 + .../src/Util/XdebugFilterScriptGenerator.php | 83 + .../vendor/phpunit/phpunit/src/Util/Xml.php | 314 ++ .../phpunit/src/Util/XmlTestListRenderer.php | 90 + .../code-unit-reverse-lookup/.gitignore | 4 + .../code-unit-reverse-lookup/.php_cs | 67 + .../code-unit-reverse-lookup/.travis.yml | 25 + .../code-unit-reverse-lookup/ChangeLog.md | 15 + .../code-unit-reverse-lookup/LICENSE | 33 + .../code-unit-reverse-lookup/README.md | 14 + .../code-unit-reverse-lookup/build.xml | 22 + .../code-unit-reverse-lookup/composer.json | 28 + .../code-unit-reverse-lookup/phpunit.xml | 21 + .../code-unit-reverse-lookup/src/Wizard.php | 111 + .../tests/WizardTest.php | 45 + .../sebastian/comparator/.github/stale.yml | 40 + .../vendor/sebastian/comparator/.gitignore | 4 + .../vendor/sebastian/comparator/.php_cs.dist | 189 + .../vendor/sebastian/comparator/.travis.yml | 33 + .../vendor/sebastian/comparator/ChangeLog.md | 66 + .../vendor/sebastian/comparator/LICENSE | 33 + .../vendor/sebastian/comparator/README.md | 37 + .../vendor/sebastian/comparator/build.xml | 21 + .../vendor/sebastian/comparator/composer.json | 54 + .../vendor/sebastian/comparator/phpunit.xml | 21 + .../comparator/src/ArrayComparator.php | 130 + .../sebastian/comparator/src/Comparator.php | 61 + .../comparator/src/ComparisonFailure.php | 128 + .../comparator/src/DOMNodeComparator.php | 86 + .../comparator/src/DateTimeComparator.php | 86 + .../comparator/src/DoubleComparator.php | 56 + .../comparator/src/ExceptionComparator.php | 52 + .../sebastian/comparator/src/Factory.php | 138 + .../comparator/src/MockObjectComparator.php | 47 + .../comparator/src/NumericComparator.php | 68 + .../comparator/src/ObjectComparator.php | 106 + .../comparator/src/ResourceComparator.php | 52 + .../comparator/src/ScalarComparator.php | 91 + .../src/SplObjectStorageComparator.php | 69 + .../comparator/src/TypeComparator.php | 59 + .../comparator/tests/ArrayComparatorTest.php | 161 + .../tests/ComparisonFailureTest.php | 59 + .../tests/DOMNodeComparatorTest.php | 180 + .../tests/DateTimeComparatorTest.php | 213 + .../comparator/tests/DoubleComparatorTest.php | 135 + .../tests/ExceptionComparatorTest.php | 136 + .../comparator/tests/FactoryTest.php | 117 + .../tests/MockObjectComparatorTest.php | 168 + .../tests/NumericComparatorTest.php | 123 + .../comparator/tests/ObjectComparatorTest.php | 150 + .../tests/ResourceComparatorTest.php | 122 + .../comparator/tests/ScalarComparatorTest.php | 164 + .../tests/SplObjectStorageComparatorTest.php | 145 + .../comparator/tests/TypeComparatorTest.php | 107 + .../comparator/tests/_fixture/Author.php | 26 + .../comparator/tests/_fixture/Book.php | 19 + .../tests/_fixture/ClassWithToString.php | 18 + .../comparator/tests/_fixture/SampleClass.php | 29 + .../comparator/tests/_fixture/Struct.php | 23 + .../comparator/tests/_fixture/TestClass.php | 14 + .../tests/_fixture/TestClassComparator.php | 14 + .../vendor/sebastian/diff/.github/stale.yml | 40 + .../vendor/sebastian/diff/.gitignore | 6 + .../vendor/sebastian/diff/.php_cs.dist | 168 + .../vendor/sebastian/diff/.travis.yml | 26 + .../vendor/sebastian/diff/ChangeLog.md | 60 + .../um_client/vendor/sebastian/diff/LICENSE | 33 + .../um_client/vendor/sebastian/diff/README.md | 195 + .../um_client/vendor/sebastian/diff/build.xml | 22 + .../vendor/sebastian/diff/composer.json | 39 + .../vendor/sebastian/diff/phpunit.xml | 21 + .../vendor/sebastian/diff/src/Chunk.php | 90 + .../vendor/sebastian/diff/src/Diff.php | 67 + .../vendor/sebastian/diff/src/Differ.php | 330 ++ .../src/Exception/ConfigurationException.php | 40 + .../diff/src/Exception/Exception.php | 15 + .../Exception/InvalidArgumentException.php | 15 + .../vendor/sebastian/diff/src/Line.php | 44 + .../LongestCommonSubsequenceCalculator.php | 24 + ...ientLongestCommonSubsequenceCalculator.php | 81 + .../src/Output/AbstractChunkOutputBuilder.php | 56 + .../diff/src/Output/DiffOnlyOutputBuilder.php | 68 + .../src/Output/DiffOutputBuilderInterface.php | 20 + .../Output/StrictUnifiedDiffOutputBuilder.php | 318 ++ .../src/Output/UnifiedDiffOutputBuilder.php | 264 ++ .../vendor/sebastian/diff/src/Parser.php | 106 + ...ientLongestCommonSubsequenceCalculator.php | 66 + .../vendor/sebastian/diff/tests/ChunkTest.php | 73 + .../vendor/sebastian/diff/tests/DiffTest.php | 55 + .../sebastian/diff/tests/DifferTest.php | 444 ++ .../Exception/ConfigurationExceptionTest.php | 41 + .../InvalidArgumentExceptionTest.php | 33 + .../vendor/sebastian/diff/tests/LineTest.php | 44 + .../tests/LongestCommonSubsequenceTest.php | 201 + .../MemoryEfficientImplementationTest.php | 22 + .../Output/AbstractChunkOutputBuilderTest.php | 152 + .../Output/DiffOnlyOutputBuilderTest.php | 76 + ...nifiedDiffOutputBuilderIntegrationTest.php | 299 ++ ...nifiedDiffOutputBuilderIntegrationTest.php | 163 + ...ctUnifiedDiffOutputBuilderDataProvider.php | 189 + .../StrictUnifiedDiffOutputBuilderTest.php | 684 ++++ .../UnifiedDiffOutputBuilderDataProvider.php | 396 ++ .../Output/UnifiedDiffOutputBuilderTest.php | 90 + .../sebastian/diff/tests/ParserTest.php | 170 + .../tests/TimeEfficientImplementationTest.php | 22 + .../sebastian/diff/tests/Utils/FileUtils.php | 31 + .../tests/Utils/UnifiedDiffAssertTrait.php | 277 ++ .../UnifiedDiffAssertTraitIntegrationTest.php | 129 + .../Utils/UnifiedDiffAssertTraitTest.php | 434 ++ .../diff/tests/fixtures/.editorconfig | 1 + .../1_a.txt | 1 + .../1_b.txt | 0 .../2_a.txt | 35 + .../2_b.txt | 18 + .../diff/tests/fixtures/out/.editorconfig | 1 + .../diff/tests/fixtures/out/.gitignore | 2 + .../sebastian/diff/tests/fixtures/patch.txt | 9 + .../sebastian/diff/tests/fixtures/patch2.txt | 21 + .../diff/tests/fixtures/serialized_diff.bin | Bin 0 -> 4143 bytes .../sebastian/environment/.github/FUNDING.yml | 1 + .../vendor/sebastian/environment/.gitignore | 6 + .../vendor/sebastian/environment/.php_cs.dist | 199 + .../vendor/sebastian/environment/.travis.yml | 28 + .../vendor/sebastian/environment/ChangeLog.md | 127 + .../vendor/sebastian/environment/LICENSE | 33 + .../vendor/sebastian/environment/README.md | 17 + .../vendor/sebastian/environment/build.xml | 19 + .../sebastian/environment/composer.json | 37 + .../vendor/sebastian/environment/phpunit.xml | 20 + .../sebastian/environment/src/Console.php | 164 + .../environment/src/OperatingSystem.php | 48 + .../sebastian/environment/src/Runtime.php | 265 ++ .../environment/tests/ConsoleTest.php | 64 + .../environment/tests/OperatingSystemTest.php | 60 + .../environment/tests/RuntimeTest.php | 165 + .../sebastian/exporter/.github/FUNDING.yml | 1 + .../vendor/sebastian/exporter/.gitignore | 5 + .../vendor/sebastian/exporter/.php_cs.dist | 190 + .../vendor/sebastian/exporter/.travis.yml | 24 + .../vendor/sebastian/exporter/ChangeLog.md | 22 + .../vendor/sebastian/exporter/LICENSE | 33 + .../vendor/sebastian/exporter/README.md | 171 + .../vendor/sebastian/exporter/build.xml | 19 + .../vendor/sebastian/exporter/composer.json | 53 + .../vendor/sebastian/exporter/phpunit.xml | 19 + .../sebastian/exporter/src/Exporter.php | 303 ++ .../sebastian/exporter/tests/ExporterTest.php | 432 ++ .../sebastian/global-state/.github/stale.yml | 40 + .../vendor/sebastian/global-state/.gitignore | 6 + .../sebastian/global-state/.php_cs.dist | 197 + .../vendor/sebastian/global-state/.travis.yml | 24 + .../sebastian/global-state/ChangeLog.md | 23 + .../vendor/sebastian/global-state/LICENSE | 33 + .../vendor/sebastian/global-state/README.md | 16 + .../vendor/sebastian/global-state/build.xml | 19 + .../sebastian/global-state/composer.json | 48 + .../vendor/sebastian/global-state/phpunit.xml | 27 + .../sebastian/global-state/src/Blacklist.php | 118 + .../global-state/src/CodeExporter.php | 91 + .../sebastian/global-state/src/Restorer.php | 132 + .../sebastian/global-state/src/Snapshot.php | 419 ++ .../global-state/src/exceptions/Exception.php | 14 + .../src/exceptions/RuntimeException.php | 14 + .../global-state/tests/BlacklistTest.php | 117 + .../global-state/tests/CodeExporterTest.php | 35 + .../global-state/tests/RestorerTest.php | 68 + .../global-state/tests/SnapshotTest.php | 120 + .../tests/_fixture/BlacklistedChildClass.php | 14 + .../tests/_fixture/BlacklistedClass.php | 15 + .../tests/_fixture/BlacklistedImplementor.php | 15 + .../tests/_fixture/BlacklistedInterface.php | 14 + .../tests/_fixture/SnapshotClass.php | 35 + .../tests/_fixture/SnapshotDomDocument.php | 16 + .../tests/_fixture/SnapshotFunctions.php | 14 + .../tests/_fixture/SnapshotTrait.php | 14 + .../sebastian/object-enumerator/.gitignore | 8 + .../sebastian/object-enumerator/.php_cs | 67 + .../sebastian/object-enumerator/.travis.yml | 26 + .../sebastian/object-enumerator/ChangeLog.md | 60 + .../sebastian/object-enumerator/LICENSE | 33 + .../sebastian/object-enumerator/README.md | 14 + .../sebastian/object-enumerator/build.xml | 22 + .../sebastian/object-enumerator/composer.json | 35 + .../sebastian/object-enumerator/phpunit.xml | 20 + .../object-enumerator/src/Enumerator.php | 85 + .../object-enumerator/src/Exception.php | 15 + .../src/InvalidArgumentException.php | 15 + .../tests/EnumeratorTest.php | 139 + .../tests/_fixture/ExceptionThrower.php | 28 + .../sebastian/object-reflector/.gitignore | 4 + .../vendor/sebastian/object-reflector/.php_cs | 79 + .../sebastian/object-reflector/.travis.yml | 26 + .../sebastian/object-reflector/ChangeLog.md | 27 + .../vendor/sebastian/object-reflector/LICENSE | 33 + .../sebastian/object-reflector/README.md | 14 + .../sebastian/object-reflector/build.xml | 22 + .../sebastian/object-reflector/composer.json | 33 + .../sebastian/object-reflector/phpunit.xml | 19 + .../object-reflector/src/Exception.php | 17 + .../src/InvalidArgumentException.php | 17 + .../object-reflector/src/ObjectReflector.php | 51 + .../tests/ObjectReflectorTest.php | 70 + .../tests/_fixture/ChildClass.php | 25 + .../ClassWithIntegerAttributeName.php | 22 + .../tests/_fixture/ParentClass.php | 20 + .../sebastian/recursion-context/.gitignore | 3 + .../sebastian/recursion-context/.travis.yml | 23 + .../sebastian/recursion-context/LICENSE | 33 + .../sebastian/recursion-context/README.md | 14 + .../sebastian/recursion-context/build.xml | 21 + .../sebastian/recursion-context/composer.json | 36 + .../sebastian/recursion-context/phpunit.xml | 19 + .../recursion-context/src/Context.php | 167 + .../recursion-context/src/Exception.php | 17 + .../src/InvalidArgumentException.php | 17 + .../recursion-context/tests/ContextTest.php | 142 + .../resource-operations/.github/stale.yml | 40 + .../sebastian/resource-operations/.gitignore | 5 + .../resource-operations/.php_cs.dist | 191 + .../resource-operations/ChangeLog.md | 33 + .../sebastian/resource-operations/LICENSE | 33 + .../sebastian/resource-operations/README.md | 14 + .../sebastian/resource-operations/build.xml | 38 + .../resource-operations/build/generate.php | 65 + .../resource-operations/composer.json | 33 + .../src/ResourceOperations.php | 2232 ++++++++++ .../tests/ResourceOperationsTest.php | 26 + .../vendor/sebastian/type/.gitattributes | 2 + .../vendor/sebastian/type/.github/FUNDING.yml | 1 + .../vendor/sebastian/type/.gitignore | 72 + .../inspectionProfiles/Project_Default.xml | 499 +++ .../vendor/sebastian/type/.idea/misc.xml | 6 + .../vendor/sebastian/type/.idea/modules.xml | 8 + .../.idea/php-inspections-ea-ultimate.xml | 20 + .../vendor/sebastian/type/.idea/php.xml | 42 + .../vendor/sebastian/type/.idea/type.iml | 40 + .../vendor/sebastian/type/.idea/vcs.xml | 6 + .../vendor/sebastian/type/.php_cs.dist | 200 + .../vendor/sebastian/type/.travis.yml | 53 + .../vendor/sebastian/type/ChangeLog.md | 45 + .../um_client/vendor/sebastian/type/LICENSE | 33 + .../um_client/vendor/sebastian/type/README.md | 17 + .../um_client/vendor/sebastian/type/build.xml | 31 + .../vendor/sebastian/type/composer.json | 49 + .../um_client/vendor/sebastian/type/phive.xml | 5 + .../vendor/sebastian/type/phpunit.xml | 23 + .../um_client/vendor/sebastian/type/psalm.xml | 53 + .../sebastian/type/src/CallableType.php | 182 + .../sebastian/type/src/GenericObjectType.php | 46 + .../sebastian/type/src/IterableType.php | 67 + .../vendor/sebastian/type/src/NullType.php | 28 + .../vendor/sebastian/type/src/ObjectType.php | 63 + .../vendor/sebastian/type/src/SimpleType.php | 86 + .../vendor/sebastian/type/src/Type.php | 75 + .../vendor/sebastian/type/src/TypeName.php | 77 + .../vendor/sebastian/type/src/UnknownType.php | 28 + .../vendor/sebastian/type/src/VoidType.php | 28 + .../type/src/exception/Exception.php | 14 + .../type/src/exception/RuntimeException.php | 14 + .../type/tests/_fixture/ChildClass.php | 14 + .../_fixture/ClassWithCallbackMethods.php | 21 + .../tests/_fixture/ClassWithInvokeMethod.php | 17 + .../type/tests/_fixture/Iterator.php | 33 + .../type/tests/_fixture/ParentClass.php | 17 + .../type/tests/_fixture/callback_function.php | 14 + .../type/tests/unit/CallableTypeTest.php | 150 + .../type/tests/unit/GenericObjectTypeTest.php | 86 + .../type/tests/unit/IterableTypeTest.php | 97 + .../type/tests/unit/NullTypeTest.php | 72 + .../type/tests/unit/ObjectTypeTest.php | 140 + .../type/tests/unit/SimpleTypeTest.php | 162 + .../type/tests/unit/TypeNameTest.php | 59 + .../sebastian/type/tests/unit/TypeTest.php | 85 + .../type/tests/unit/UnknownTypeTest.php | 58 + .../type/tests/unit/VoidTypeTest.php | 70 + .../vendor/sebastian/version/.gitattributes | 1 + .../vendor/sebastian/version/.gitignore | 1 + .../vendor/sebastian/version/.php_cs | 66 + .../vendor/sebastian/version/LICENSE | 33 + .../vendor/sebastian/version/README.md | 43 + .../vendor/sebastian/version/composer.json | 29 + .../vendor/sebastian/version/src/Version.php | 109 + .../vendor/symfony/polyfill-ctype/Ctype.php | 227 + .../vendor/symfony/polyfill-ctype/LICENSE | 19 + .../vendor/symfony/polyfill-ctype/README.md | 12 + .../symfony/polyfill-ctype/bootstrap.php | 50 + .../symfony/polyfill-ctype/bootstrap80.php | 46 + .../symfony/polyfill-ctype/composer.json | 38 + .../vendor/theseer/tokenizer/.php_cs.dist | 213 + .../vendor/theseer/tokenizer/CHANGELOG.md | 63 + .../vendor/theseer/tokenizer/LICENSE | 30 + .../vendor/theseer/tokenizer/README.md | 49 + .../vendor/theseer/tokenizer/composer.json | 27 + .../theseer/tokenizer/src/Exception.php | 5 + .../theseer/tokenizer/src/NamespaceUri.php | 25 + .../tokenizer/src/NamespaceUriException.php | 5 + .../vendor/theseer/tokenizer/src/Token.php | 35 + .../theseer/tokenizer/src/TokenCollection.php | 93 + .../src/TokenCollectionException.php | 5 + .../theseer/tokenizer/src/Tokenizer.php | 137 + .../theseer/tokenizer/src/XMLSerializer.php | 79 + .../vendor/webmozart/assert/.editorconfig | 12 + .../vendor/webmozart/assert/CHANGELOG.md | 175 + .../um_client/vendor/webmozart/assert/LICENSE | 20 + .../vendor/webmozart/assert/README.md | 283 ++ .../vendor/webmozart/assert/composer.json | 38 + .../vendor/webmozart/assert/psalm.xml | 14 + .../vendor/webmozart/assert/src/Assert.php | 2048 +++++++++ .../vendor/webmozart/assert/src/Mixin.php | 1971 +++++++++ .../godmode/um_client/views/offline.php | 99 + .../godmode/um_client/views/online.php | 206 + .../godmode/um_client/views/register.php | 263 ++ .../update_manager/update_manager.offline.php | 133 - .../update_manager/update_manager.online.php | 237 -- .../godmode/update_manager/update_manager.php | 8 +- .../update_manager/update_manager.setup.php | 93 +- .../godmode/users/configure_user.php | 16 +- pandora_console/images/maintenance.png | Bin 0 -> 94473 bytes .../include/ajax/rolling_release.ajax.php | 183 - .../include/ajax/update_manager.ajax.php | 772 ---- .../include/class/ConsoleSupervisor.php | 36 +- pandora_console/include/functions.php | 5 + pandora_console/include/functions_config.php | 4 - .../include/functions_register.php | 365 ++ .../include/functions_update_manager.php | 2067 +--------- .../include/javascript/pandora_ui.js | 4 +- .../include/javascript/update_manager.js | 2425 ----------- .../include/lib/Core/DBMaintainer.php | 88 +- .../include/styles/maintenance.css | 56 + pandora_console/include/styles/register.css | 3 +- pandora_console/index.php | 55 +- .../operation/messages/message_edit.php | 66 +- pandora_console/operation/users/user_edit.php | 46 +- pandora_console/pandora_console.redhat.spec | 8 +- pandora_console/pandora_console.rhel7.spec | 8 +- pandora_console/pandora_console.spec | 8 +- pandora_server/DEBIAN/make_deb_package.sh | 1 + pandora_server/DEBIAN/postinst | 1 + pandora_server/DEBIAN/prerm | 2 + pandora_server/pandora_server.redhat.spec | 2 + pandora_server/pandora_server.spec | 3 + pandora_server/pandora_server_installer | 28 + pandora_server/util/pandora_ha.pl | 386 ++ pandora_server/util/pandora_server | 89 +- 1358 files changed, 123477 insertions(+), 6030 deletions(-) create mode 100644 pandora_console/general/maintenance.php create mode 100644 pandora_console/godmode/um_client/README.txt create mode 100644 pandora_console/godmode/um_client/api.php create mode 100644 pandora_console/godmode/um_client/composer.json create mode 100644 pandora_console/godmode/um_client/composer.lock create mode 100644 pandora_console/godmode/um_client/index.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/API/Server.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/Client.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/Repo.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/RepoDisk.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/RepoMC.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/UI/Manager.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/UI/View.php create mode 100644 pandora_console/godmode/um_client/lib/UpdateManager/constants.php create mode 100644 pandora_console/godmode/um_client/resources/helpers.php create mode 100755 pandora_console/godmode/um_client/resources/images/check-cross.png create mode 100644 pandora_console/godmode/um_client/resources/images/icono_cerrar.png create mode 100644 pandora_console/godmode/um_client/resources/images/icono_warning.png create mode 100644 pandora_console/godmode/um_client/resources/images/pandora_logo.png create mode 100644 pandora_console/godmode/um_client/resources/images/spinner-classic.gif create mode 100644 pandora_console/godmode/um_client/resources/images/spinner.gif create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_flat_10_000000_40x100.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_glass_100_f6f6f6_1x400.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_glass_100_fdf5ce_1x400.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_222222_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_228ef1_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_2e83ff_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_444444_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_454545_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_555555_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_777620_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_777777_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_888888_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_cc0000_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_cd0a0a_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_ef8c08_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_ffd27a_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/ui-icons_ffffff_256x240.png create mode 100644 pandora_console/godmode/um_client/resources/images/update_manager_background.jpg create mode 100644 pandora_console/godmode/um_client/resources/images/update_manager_button.png create mode 100644 pandora_console/godmode/um_client/resources/javascript/jquery-3.3.1.min.js create mode 100644 pandora_console/godmode/um_client/resources/javascript/jquery-ui.min.js create mode 100644 pandora_console/godmode/um_client/resources/javascript/jquery.fileupload.js create mode 100644 pandora_console/godmode/um_client/resources/javascript/jquery.iframe-transport.js create mode 100755 pandora_console/godmode/um_client/resources/javascript/jquery.knob.js create mode 100644 pandora_console/godmode/um_client/resources/javascript/umc.js create mode 100644 pandora_console/godmode/um_client/resources/javascript/umc_offline.js create mode 100644 pandora_console/godmode/um_client/resources/styles/calendar.css create mode 100644 pandora_console/godmode/um_client/resources/styles/integria.css create mode 100644 pandora_console/godmode/um_client/resources/styles/jquery-ui.min.css create mode 100644 pandora_console/godmode/um_client/resources/styles/jquery-ui_custom.css rename pandora_console/godmode/{update_manager/update_manager.css => um_client/resources/styles/pandora.css} (80%) create mode 100644 pandora_console/godmode/um_client/resources/styles/um.css create mode 100644 pandora_console/godmode/um_client/tests/ClientTest.php create mode 100644 pandora_console/godmode/um_client/updateMR.php create mode 100644 pandora_console/godmode/um_client/vendor/autoload.php create mode 120000 pandora_console/godmode/um_client/vendor/bin/phpunit create mode 100644 pandora_console/godmode/um_client/vendor/composer/ClassLoader.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/InstalledVersions.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/composer/autoload_classmap.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/autoload_files.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/autoload_namespaces.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/autoload_psr4.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/autoload_real.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/autoload_static.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/installed.json create mode 100644 pandora_console/godmode/um_client/vendor/composer/installed.php create mode 100644 pandora_console/godmode/um_client/vendor/composer/platform_check.php create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/.doctrine-project.json create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/.github/FUNDING.yml create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/.github/workflows/coding-standards.yml create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/.github/workflows/continuous-integration.yml create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/.github/workflows/phpbench.yml create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/.github/workflows/release-on-milestone-closed.yml create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/.github/workflows/static-analysis.yml create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/CONTRIBUTING.md create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/README.md create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/docs/en/index.rst create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/docs/en/sidebar.rst create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/phpbench.json create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/phpcs.xml.dist create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/phpstan.neon.dist create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php create mode 100644 pandora_console/godmode/um_client/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/.github/FUNDING.yml create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/README.md create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php create mode 100644 pandora_console/godmode/um_client/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/CHANGELOG.md create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/composer.lock create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/ManifestDocumentMapper.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/ManifestLoader.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/ManifestSerializer.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Application.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/ApplicationName.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Author.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/AuthorCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/BundledComponent.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/BundledComponentCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/CopyrightInformation.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Email.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Extension.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Library.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/License.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Manifest.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Requirement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/RequirementCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Type.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/values/Url.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/AuthorElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/BundlesElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ComponentElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ContainsElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/CopyrightElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ElementCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ExtElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ExtElementCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ExtensionElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/LicenseElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ManifestDocument.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/ManifestElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/PhpElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/manifest/src/xml/RequiresElement.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/CHANGELOG.md create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/PreReleaseSuffix.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/Version.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/VersionConstraintParser.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/VersionConstraintValue.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/VersionNumber.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/constraints/VersionConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/exceptions/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/exceptions/InvalidVersionException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php create mode 100644 pandora_console/godmode/um_client/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/.github/dependabot.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/.github/workflows/push.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/src/Element.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/src/File.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/src/Fqsen.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/src/Location.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/src/Project.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-common/src/ProjectFactory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/AlignFormatter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/InvalidTag.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/TagWithType.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/Exception/PcreException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/reflection-docblock/src/Utils.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/composer.lock create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/phpbench.json create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/PseudoType.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/PseudoTypes/False_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/PseudoTypes/True_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Type.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/TypeResolver.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/AbstractList.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/AggregatedType.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Array_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/ClassString.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Collection.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Compound.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Context.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Expression.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Float_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Integer.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Intersection.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Iterable_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Null_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Nullable.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Object_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Parent_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Self_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Static_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/String_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/This.php create mode 100644 pandora_console/godmode/um_client/vendor/phpdocumentor/type-resolver/src/Types/Void_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/.github/workflows/build.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/CHANGES.md create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/InArrayToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/NotInArrayToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/HhvmExceptionPatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentTypeNode.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ReturnTypeNode.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/TypeNodeAbstract.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Prophet.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php create mode 100644 pandora_console/godmode/um_client/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/.gitattributes create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/.github/CONTRIBUTING.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/.github/FUNDING.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/.github/ISSUE_TEMPLATE.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/phive.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/CodeCoverage.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Driver/Driver.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Driver/PCOV.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Driver/PHPDBG.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Driver/Xdebug.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Exception/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Exception/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Exception/MissingCoversAnnotationException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Exception/RuntimeException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Exception/UnintentionallyCoveredCodeException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Filter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Node/AbstractNode.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Node/Builder.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Node/Directory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Node/File.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Node/Iterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Clover.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Facade.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Dashboard.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Directory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/File.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/coverage_bar.html.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/bootstrap.min.css create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/custom.css create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/nv.d3.min.css create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/octicons.css create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/css/style.css create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/dashboard.html.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/d3.min.js create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/nv.d3.min.js create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/PHP.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Text.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Util.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Version.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/TestCase.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesWhitespaceTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodOneLineAnnotationTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Crash.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassExtendedTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_ignore.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_namespace.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_oneline_annotations.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_use_statements.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_without_namespace.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/bootstrap.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/BuilderTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/TextTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitattributes create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.github/stale.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Facade.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Factory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Iterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/tests/FactoryTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitattributes create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-text-template/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-text-template/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-text-template/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-text-template/src/Template.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitattributes create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/FUNDING.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/stale.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/RuntimeException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Timer.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-timer/tests/TimerTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitattributes create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Abstract.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ampersand.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/AndEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Array.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ArrayCast.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/As.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/At.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Backtick.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BadCharacter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BoolCast.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanAnd.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanOr.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CachingFactory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Callable.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Caret.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Case.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Catch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Character.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Class.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassC.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassNameConstant.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Clone.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseBracket.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseCurly.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseSquare.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseTag.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Coalesce.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CoalesceEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Colon.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comma.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comment.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConcatEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Const.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConstantEncapsedString.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Continue.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CurlyOpen.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DNumber.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dec.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Declare.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Default.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dir.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Div.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DivEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Do.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DocComment.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dollar.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DollarOpenCurlyBraces.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dot.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleArrow.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleCast.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleColon.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleQuotes.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Echo.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ellipsis.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Else.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Elseif.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Empty.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EncapsedAndWhitespace.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EndHeredoc.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Enddeclare.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endfor.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endforeach.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endif.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endswitch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endwhile.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Equal.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Eval.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ExclamationMark.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Exit.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Extends.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/File.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Final.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Finally.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Fn.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/For.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Foreach.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/FuncC.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Function.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Global.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Goto.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Gt.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/HaltCompiler.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/If.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Implements.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Inc.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Include.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IncludeOnce.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Includes.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/InlineHtml.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Instanceof.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Insteadof.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IntCast.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Interface.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsGreaterOrEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsIdentical.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotIdentical.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsSmallerOrEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Isset.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Line.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/List.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lnumber.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalAnd.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalOr.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalXor.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lt.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MethodC.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Minus.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MinusEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ModEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MulEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Mult.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameFullyQualified.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameQualified.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameRelative.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Namespace.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/New.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsC.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsSeparator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NumString.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectCast.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectOperator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenBracket.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenCurly.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenSquare.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTag.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTagWithEcho.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OrEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PaamayimNekudotayim.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Percent.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pipe.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Plus.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PlusEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pow.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PowEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Print.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Private.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Protected.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Public.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/QuestionMark.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Require.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/RequireOnce.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Return.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Semicolon.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sl.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SlEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Spaceship.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sr.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SrEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StartHeredoc.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Static.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Stream.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/String.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringCast.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringVarname.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Switch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Throw.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Tilde.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Token.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScope.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScopeAndVisibility.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Trait.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TraitC.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Try.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Unset.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UnsetCast.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Use.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UseFunction.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Util.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Var.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Variable.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/While.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Whitespace.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/XorEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Yield.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/YieldFrom.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/break.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/.phpstorm.meta.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/ChangeLog-8.5.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/README.md create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/composer.json create mode 100755 pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit.xsd create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Count.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Error.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Notice.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Warning.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match_.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTest.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Test.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestBuilder.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestCase.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestFailure.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListener.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestResult.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuite.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestResultCache.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Version.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Command.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Help.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/TestRunner.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Blacklist.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Color.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Configuration.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ErrorHandler.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/FileLoader.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filesystem.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Getopt.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/GlobalState.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Json.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/JUnit.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Printer.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/RegularExpression.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Test.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Type.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Xml.php create mode 100644 pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.php_cs create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/tests/WizardTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/.github/stale.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ArrayComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Comparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ComparisonFailure.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DOMNodeComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DateTimeComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DoubleComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ExceptionComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Factory.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/MockObjectComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/NumericComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ObjectComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ResourceComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ScalarComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/SplObjectStorageComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/src/TypeComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ArrayComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ComparisonFailureTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DOMNodeComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DateTimeComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DoubleComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ExceptionComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/FactoryTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/MockObjectComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/NumericComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ObjectComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ResourceComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ScalarComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/SplObjectStorageComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/TypeComparatorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Author.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Book.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/ClassWithToString.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/SampleClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Struct.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClassComparator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/.github/stale.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Chunk.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Diff.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Differ.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/ConfigurationException.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Line.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/Parser.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ChunkTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DiffTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DifferTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/ConfigurationExceptionTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/InvalidArgumentExceptionTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LineTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LongestCommonSubsequenceTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/MemoryEfficientImplementationTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/AbstractChunkOutputBuilderTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/DiffOnlyOutputBuilderTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/UnifiedDiffOutputBuilderDataProvider.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/UnifiedDiffOutputBuilderTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ParserTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/TimeEfficientImplementationTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/FileUtils.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTrait.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/.editorconfig create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txt create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txt create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txt create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txt create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.editorconfig create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch.txt create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch2.txt create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/serialized_diff.bin create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/.github/FUNDING.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/src/Console.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/src/OperatingSystem.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/src/Runtime.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/tests/ConsoleTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/tests/OperatingSystemTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/environment/tests/RuntimeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/.github/FUNDING.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/src/Exporter.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/exporter/tests/ExporterTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/.github/stale.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Blacklist.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/src/CodeExporter.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Restorer.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Snapshot.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/RuntimeException.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/BlacklistTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/CodeExporterTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/RestorerTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/SnapshotTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.php_cs create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Enumerator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/EnumeratorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/_fixture/ExceptionThrower.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.php_cs create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/ObjectReflector.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/ObjectReflectorTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ChildClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ClassWithIntegerAttributeName.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ParentClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Context.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/InvalidArgumentException.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/recursion-context/tests/ContextTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.github/stale.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build.xml create mode 100755 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build/generate.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/src/ResourceOperations.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/resource-operations/tests/ResourceOperationsTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.gitattributes create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.github/FUNDING.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.idea/inspectionProfiles/Project_Default.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.idea/misc.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.idea/modules.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php-inspections-ea-ultimate.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.idea/type.iml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.idea/vcs.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/.travis.yml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/ChangeLog.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/build.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/phive.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/phpunit.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/psalm.xml create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/CallableType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/GenericObjectType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/IterableType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/NullType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/ObjectType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/SimpleType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/Type.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/TypeName.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/UnknownType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/VoidType.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/RuntimeException.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ChildClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithCallbackMethods.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithInvokeMethod.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/Iterator.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ParentClass.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/callback_function.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/CallableTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/GenericObjectTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/IterableTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/NullTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/ObjectTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/SimpleTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeNameTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/UnknownTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/VoidTypeTest.php create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/version/.gitattributes create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/version/.gitignore create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/version/.php_cs create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/version/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/version/README.md create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/version/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/sebastian/version/src/Version.php create mode 100644 pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/Ctype.php create mode 100644 pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/README.md create mode 100644 pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap.php create mode 100644 pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap80.php create mode 100644 pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/.php_cs.dist create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/CHANGELOG.md create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/README.md create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/Exception.php create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/NamespaceUri.php create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/NamespaceUriException.php create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/Token.php create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollection.php create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollectionException.php create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/Tokenizer.php create mode 100644 pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/XMLSerializer.php create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/.editorconfig create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/CHANGELOG.md create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/LICENSE create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/README.md create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/composer.json create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/psalm.xml create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/src/Assert.php create mode 100644 pandora_console/godmode/um_client/vendor/webmozart/assert/src/Mixin.php create mode 100644 pandora_console/godmode/um_client/views/offline.php create mode 100644 pandora_console/godmode/um_client/views/online.php create mode 100644 pandora_console/godmode/um_client/views/register.php delete mode 100644 pandora_console/godmode/update_manager/update_manager.offline.php delete mode 100644 pandora_console/godmode/update_manager/update_manager.online.php create mode 100644 pandora_console/images/maintenance.png delete mode 100644 pandora_console/include/ajax/rolling_release.ajax.php delete mode 100644 pandora_console/include/ajax/update_manager.ajax.php create mode 100644 pandora_console/include/functions_register.php delete mode 100644 pandora_console/include/javascript/update_manager.js create mode 100644 pandora_console/include/styles/maintenance.css create mode 100755 pandora_server/util/pandora_ha.pl diff --git a/extras/docker/centos8/pandora-stack/sources/init_pandora.sh b/extras/docker/centos8/pandora-stack/sources/init_pandora.sh index 56424e6cb9..7c000ebebd 100755 --- a/extras/docker/centos8/pandora-stack/sources/init_pandora.sh +++ b/extras/docker/centos8/pandora-stack/sources/init_pandora.sh @@ -148,7 +148,7 @@ EOF_INDEX sed -i -e "s/^max_input_time.*/max_input_time = -1/g" /etc/php.ini sed -i -e "s/^max_execution_time.*/max_execution_time = 0/g" /etc/php.ini sed -i -e "s/^upload_max_filesize.*/upload_max_filesize = 800M/g" /etc/php.ini - sed -i -e "s/^memory_limit.*/memory_limit = 500M/g" /etc/php.ini + sed -i -e "s/^memory_limit.*/memory_limit = 800M/g" /etc/php.ini echo "- Setting Public URL: $PUBLICURL" q=$(mysql -u$DBUSER -p$DBPASS $DBNAME -h$DBHOST -sNe "select token from tconfig;" | grep public_url) diff --git a/pandora_console/extras/delete_files/delete_files.txt b/pandora_console/extras/delete_files/delete_files.txt index 1d8e1ec96e..9221d762aa 100644 --- a/pandora_console/extras/delete_files/delete_files.txt +++ b/pandora_console/extras/delete_files/delete_files.txt @@ -73,7 +73,7 @@ enterprise/extensions/ipam.php enterprise/extensions/ipam enterprise/extensions/disabled/visual_console_manager.php enterprise/extensions/visual_console_manager.php -pandora_console/extensions/net_tools.php +extensions/net_tools.php enterprise/godmode/agentes/module_manager_editor_web.php enterprise/include/ajax/web_server_module_debug.php enterprise/include/class/WebServerModuleDebug.class.php @@ -82,4 +82,11 @@ include/lib/WSManager.php include/lib/WebSocketServer.php include/lib/WebSocketUser.php operation/network/network_explorer.php -operation/vsual_console/pure_ajax.php +operation/visual_console/pure_ajax.php +include/ajax/update_manager.ajax.php +godmode/update_manager/update_manager.css +godmode/update_manager/update_manager.offline.php +godmode/update_manager/update_manager.online.php +include/javascript/update_manager.js +enterprise/include/functions_update_manager.php +include/ajax/rolling_release.ajax.php \ No newline at end of file diff --git a/pandora_console/general/footer.php b/pandora_console/general/footer.php index 5c40d49d0c..888a71d5be 100644 --- a/pandora_console/general/footer.php +++ b/pandora_console/general/footer.php @@ -37,14 +37,14 @@ require_once $config['homedir'].'/include/functions_update_manager.php'; $current_package = update_manager_get_current_package(); -if ($current_package == 0) { - $build_package_version = $build_version; +if ($current_package === null) { + $build_package_version = 'Build '.$build_version; } else { - $build_package_version = $current_package; + $build_package_version = 'OUM '.$current_package; } echo __( - '%s %s - Build %s - MR %s', + '%s %s - %s - MR %s', get_product_name(), $pandora_version, $build_package_version, diff --git a/pandora_console/general/maintenance.php b/pandora_console/general/maintenance.php new file mode 100644 index 0000000000..bff7c2ef5e --- /dev/null +++ b/pandora_console/general/maintenance.php @@ -0,0 +1,69 @@ + + + +

Ups ...

+
+ +

+
+
+ + 'responsive', + 'width' => 800, + ] + ); + ?> + +
+
+

+
+ + + + + \ No newline at end of file diff --git a/pandora_console/general/register.php b/pandora_console/general/register.php index dcaa6e3e6f..215e9642ef 100644 --- a/pandora_console/general/register.php +++ b/pandora_console/general/register.php @@ -29,24 +29,16 @@ // Begin. global $config; -require_once $config['homedir'].'/include/functions_update_manager.php'; +require_once $config['homedir'].'/include/functions_register.php'; require_once $config['homedir'].'/include/class/WelcomeWindow.class.php'; -if (is_ajax()) { +if ((bool) is_ajax() === true) { // Parse responses, flow control. $configuration_wizard = get_parameter('save_required_wizard', 0); $change_language = get_parameter('change_language', 0); $cancel_wizard = get_parameter('cancel_wizard', 0); - // Console registration. - $cancel_registration = get_parameter('cancel_registration', 0); - $register_console = get_parameter('register_console', 0); - - // Newsletter. - $cancel_newsletter = get_parameter('cancel_newsletter', 0); - $register_newsletter = get_parameter('register_newsletter', 0); - // Load wizards. $load_wizards = get_parameter('load_wizards', ''); @@ -58,16 +50,8 @@ if (is_ajax()) { case 'initial': return config_wiz_modal(false, false); - case 'registration': - return registration_wiz_modal(false, false); - - case 'newsletter': - return newsletter_wiz_modal(false, false); - case 'all': config_wiz_modal(false, false); - registration_wiz_modal(false, false); - newsletter_wiz_modal(false, false); return; default: @@ -90,31 +74,7 @@ if (is_ajax()) { config_update_value('initial_wizard', 1); } - // Update Manager registration. - if ($cancel_registration) { - config_update_value('pandora_uid', 'OFFLINE'); - } - - if ($register_console) { - $feedback = registration_wiz_process(); - } - - // Newsletter. - if ($cancel_newsletter) { - db_process_sql_update( - 'tusuario', - ['middlename' => -1], - ['id_user' => $config['id_user']] - ); - - // XXX: Also notify UpdateManager. - } - - if ($register_newsletter) { - $feedback = newsletter_wiz_process(); - } - - if (is_array($feedback)) { + if (is_array($feedback) === true) { echo json_encode($feedback); } @@ -123,60 +83,23 @@ if (is_ajax()) { exit(); } - - ui_require_css_file('register'); $initial = isset($config['initial_wizard']) !== true || $config['initial_wizard'] != '1'; -$newsletter = db_get_value( - 'middlename', - 'tusuario', - 'id_user', - $config['id_user'] -); -$show_newsletter = $newsletter == '0' || $newsletter == ''; - -$registration = isset($config['pandora_uid']) !== true - || $config['pandora_uid'] == ''; - - if ($initial && users_is_admin()) { // Show all forms in order. // 1- Ask for email, timezone, etc. Fullfill alerts and user mail. config_wiz_modal( false, true, - (($registration === true) ? 'show_registration_wizard()' : null), + null, true ); } -if (!$config['disabled_newsletter']) { - if ($registration && users_is_admin()) { - // Prepare registration wizard, not launch. leave control to flow. - registration_wiz_modal( - false, - // Launch only if not being launch from 'initial'. - !$initial, - (($show_newsletter === false) ? 'force_run_newsletter()' : null), - true - ); - } else { - if ($show_newsletter) { - // Show newsletter wizard for current user. - newsletter_wiz_modal( - false, - // Launch only if not being call from 'registration'. - !$registration && !$initial, - true - ); - } - } -} - -$welcome = !$registration && !$show_newsletter && !$initial; +$welcome = !$initial; try { $welcome_window = new WelcomeWindow($welcome); if ($welcome_window !== null) { @@ -271,8 +194,6 @@ if (!$double_auth_enabled echo '
'; } -$newsletter = null; - ?> '; - -echo '
'; + +'; // Retrieve UM url configured (or default). $url = get_um_url(); @@ -147,8 +160,8 @@ if (enterprise_installed() || defined('DESTDIR')) { } if (is_metaconsole()) { - ui_require_css_file('pandora_enterprise', '../../'.ENTERPRISE_DIR.'/include/styles/'); - ui_require_css_file('register', '../../include/styles/'); + ui_require_css_file('pandora_enterprise', ENTERPRISE_DIR.'/include/styles/'); + ui_require_css_file('register', 'include/styles/'); } else { ui_require_css_file('pandora'); ui_require_css_file('pandora_enterprise', ENTERPRISE_DIR.'/include/styles/'); diff --git a/pandora_console/godmode/um_client/README.txt b/pandora_console/godmode/um_client/README.txt new file mode 100644 index 0000000000..24fd5c9b29 --- /dev/null +++ b/pandora_console/godmode/um_client/README.txt @@ -0,0 +1,9 @@ + +Testing +------- +Using phpunit8 under an unprivileged user: + + phpunit8 --cache-result-file=/tmp/ . + + +Using phpunit ( diff --git a/pandora_console/godmode/um_client/api.php b/pandora_console/godmode/um_client/api.php new file mode 100644 index 0000000000..bd91564956 --- /dev/null +++ b/pandora_console/godmode/um_client/api.php @@ -0,0 +1,84 @@ + $puid, + 'repo_path' => $repo_path, + 'license' => $license, + ] + ); + + $server->run(); +} catch (Exception $e) { + echo json_encode( + ['error' => $e->getMessage()] + ); +} diff --git a/pandora_console/godmode/um_client/composer.json b/pandora_console/godmode/um_client/composer.json new file mode 100644 index 0000000000..dbbe367332 --- /dev/null +++ b/pandora_console/godmode/um_client/composer.json @@ -0,0 +1,28 @@ +{ + "name": "articapfms/update_manager_client", + "description": "Artica PFMS Update Manager Client", + "type": "library", + "license": "GPL2", + "authors": [ + { + "name": "fbsanchez", + "email": "fborja.sanchez@artica.es" + } + ], + "autoload": { + "psr-4": { + "UpdateManager\\": "lib/UpdateManager" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.14" + } +} diff --git a/pandora_console/godmode/um_client/composer.lock b/pandora_console/godmode/um_client/composer.lock new file mode 100644 index 0000000000..6a0dc7e103 --- /dev/null +++ b/pandora_console/godmode/um_client/composer.lock @@ -0,0 +1,1787 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "09f7a0b9cc1389e49ac2ccc8a5b87b47", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-11-10T18:47:58+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-11-13T09:40:50+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, + "time": "2020-06-27T14:33:11+00:00" + }, + { + "name": "phar-io/version", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "bae7c545bef187884426f042434e561ab1ddb182" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, + "time": "2021-02-23T14:00:09+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.2.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, + "time": "2020-09-03T19:13:55+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, + "time": "2020-09-17T18:55:26+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.12.2", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "245710e971a030f42e08f4912863805570f23d39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", + "reference": "245710e971a030f42e08f4912863805570f23d39", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.1", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.12.2" + }, + "time": "2020-12-19T10:15:11+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "7.0.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bb7c9a210c72e4709cdde67f8b7362f672f2225c", + "reference": "bb7c9a210c72e4709cdde67f8b7362f672f2225c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-xmlwriter": "*", + "php": ">=7.2", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^3.1.1 || ^4.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^4.2.2", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.2.2" + }, + "suggest": { + "ext-xdebug": "^2.7.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.14" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-12-02T13:39:03+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/4b49fb70f067272b659ef0174ff9ca40fdaa6357", + "reference": "4b49fb70f067272b659ef0174ff9ca40fdaa6357", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:25:21+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, + "time": "2015-06-21T13:50:34+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:20:02+00:00" + }, + { + "name": "phpunit/php-token-stream", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "abandoned": true, + "time": "2020-08-04T08:28:15+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "8.5.14", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "c25f79895d27b6ecd5abfa63de1606b786a461a3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c25f79895d27b6ecd5abfa63de1606b786a461a3", + "reference": "c25f79895d27b6ecd5abfa63de1606b786a461a3", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.0", + "phar-io/manifest": "^2.0.1", + "phar-io/version": "^3.0.2", + "php": ">=7.2", + "phpspec/prophecy": "^1.10.3", + "phpunit/php-code-coverage": "^7.0.12", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.3", + "sebastian/exporter": "^3.1.2", + "sebastian/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" + }, + "require-dev": { + "ext-pdo": "*" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*", + "phpunit/php-invoker": "^2.0.0" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.14" + }, + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-01-17T07:37:30+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:15:22+00:00" + }, + { + "name": "sebastian/comparator", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", + "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "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" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:04:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:59:04+00:00" + }, + { + "name": "sebastian/environment", + "version": "4.2.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:53:42+00:00" + }, + { + "name": "sebastian/exporter", + "version": "3.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", + "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "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@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:47:53+00:00" + }, + { + "name": "sebastian/global-state", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "474fb9edb7ab891665d3bfc6317f42a0a150454b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/474fb9edb7ab891665d3bfc6317f42a0a150454b", + "reference": "474fb9edb7ab891665d3bfc6317f42a0a150454b", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:43:24+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:40:27+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:37:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "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" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:34:24+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:30:19+00:00" + }, + { + "name": "sebastian/type", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:25:11+00:00" + }, + { + "name": "sebastian/version", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", + "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, + "time": "2016-10-03T07:35:21+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.22.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "75a63c33a8577608444246075ea0af0d052e452a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2020-07-12T23:59:07+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.9.1", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "shasum": "" + }, + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "type": "library", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.9.1" + }, + "time": "2020-07-08T17:02:28+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/pandora_console/godmode/um_client/index.php b/pandora_console/godmode/um_client/index.php new file mode 100644 index 0000000000..3b3dc708fe --- /dev/null +++ b/pandora_console/godmode/um_client/index.php @@ -0,0 +1,395 @@ + $license_data['limit']) { + ui_print_warning_message( + __( + 'You cannot use update manager %s. You are exceding monitoring limits by %s elements. Please update your license or disable enterprise section by moving enterprise directory to another location and try again.', + $mode_str, + ($limit - $license_data['limit']) + ) + ); + return; + } + + if ($days_to_expiry < 0) { + $mode_str = ''; + if ($mode === Manager::MODE_ONLINE) { + $mode_str = 'online'; + } else if ($mode === Manager::MODE_OFFLINE) { + $mode_str = 'offline'; + } + + ui_print_warning_message( + __( + 'You cannot use update manager %s. This license has expired %d days ago. Please update your license or disable enterprise section by moving enterprise directory to another location and try again.', + $mode_str, + abs($days_to_expiry) + ) + ); + return; + } + } else { + $license_data = []; + $license_data['count_enabled'] = db_get_value( + 'count(*)', + 'tagente', + 'disabled', + 0 + ); + } +} + + +// Set dbh. +if (is_array($config) === true && $config['dbconnection'] !== null) { + $dbh = (object) $config['dbconnection']; +} else { + $dbh = null; +} + +// Retrieve current definition. +if ($dbh !== null) { + $stm = $dbh->query( + 'SELECT `value` FROM `tconfig` + WHERE `token`="current_package"' + ); + if ($stm !== false) { + $current_package = $stm->fetch_array(); + if ($current_package !== null) { + $current_package = $current_package[0]; + } + } + + if (empty($current_package) === true) { + // If no current_package is present, use current_package_enterprise. + $stm = $dbh->query( + 'SELECT MAX(`value`) FROM `tconfig` + WHERE `token`="current_package_enterprise"' + ); + if ($stm !== false) { + $current_package = $stm->fetch_array(); + + if ($current_package !== null) { + $current_package = $current_package[0]; + } + } + } + + $mr = 0; + $stm = $dbh->query( + 'SELECT MAX(`value`) FROM `tconfig` + WHERE `token`="MR" OR `token`="minor_release"' + ); + if ($stm !== false) { + $mr = $stm->fetch_array(); + if ($mr !== null) { + $mr = $mr[0]; + } + } + + $puid = null; + $stm = $dbh->query( + 'SELECT `value` FROM `tconfig` + WHERE `token`="pandora_uid"' + ); + if ($stm !== false) { + $puid = $stm->fetch_array(); + if ($puid !== null) { + $puid = $puid[0]; + } + } +} else { + $current_package = 0; + $mr = 0; + $puid = null; +} + +if (is_ajax() !== true) { + ?> + + 0 + ) { + if ((float) $matches[1] !== (float) $current_package) { + ui_print_warning_message( + __( + 'Master server version %s does not match console version %s.', + (float) $matches[1], + (float) $current_package + ) + ); + } + } + } +} + +// Load styles. +if (function_exists('ui_require_css_file') === true) { + ui_require_css_file('pandora', 'godmode/um_client/resources/styles/'); +} + +if (isset($mode) === false) { + $mode = Manager::MODE_ONLINE; + if (function_exists('get_parameter') === true) { + $mode = (int) get_parameter('mode', null); + } else { + $mode = ($_REQUEST['mode'] ?? Manager::MODE_ONLINE); + } +} + +if (is_int($mode) === false) { + switch ($mode) { + case 'offline': + $mode = Manager::MODE_OFFLINE; + break; + + case 'register': + $mode = Manager::MODE_REGISTER; + break; + + case 'online': + default: + $mode = Manager::MODE_ONLINE; + break; + } +} + +$dbhHistory = null; + +if (is_array($config) === true + && (bool) $config['history_db_enabled'] === true +) { + ob_start(); + $dbhHistory = db_connect( + $config['history_db_host'], + $config['history_db_name'], + $config['history_db_user'], + $config['history_db_pass'], + $config['history_db_port'] + ); + ob_get_clean(); + + if ($dbhHistory === false) { + $dbhHistory = null; + } +} + +$url_update_manager = null; +$homedir = sys_get_temp_dir(); +$dbconnection = null; +$remote_config = null; +$is_metaconsole = false; +$insecure = false; +$pandora_url = ui_get_full_url('godmode/um_client', false, false, false); + +if (is_array($config) === true) { + if (isset($config['secure_update_manager']) === false) { + $config['secure_update_manager'] = null; + } + + if ($config['secure_update_manager'] === '' + || $config['secure_update_manager'] === null + ) { + $insecure = false; + } else { + // Directive defined. + $insecure = !$config['secure_update_manager']; + } + + if ((bool) is_ajax() === false) { + if ($mode === Manager::MODE_ONLINE + && ($puid === null || $puid === 'OFFLINE') + ) { + ui_print_error_message(__('Update manager online requires registration.')); + } + } + + $url_update_manager = $config['url_update_manager']; + $homedir = $config['homedir']; + $dbconnection = $config['dbconnection']; + $remote_config = $config['remote_config']; + if (function_exists('is_metaconsole') === true) { + $is_metaconsole = (bool) is_metaconsole(); + } + + if ($is_metaconsole === false) { + if ((bool) $config['node_metaconsole'] === true) { + $url_update_manager = $config['metaconsole_base_url']; + $url_update_manager .= 'godmode/um_client/api.php'; + } + } else if ($is_metaconsole === true) { + $sc = new Synchronizer(); + $url_meta_base = ui_get_full_url('/', false, false, false); + $sc->apply( + function ($node, $sync) use ($url_meta_base) { + try { + global $config; + + $sync->connect($node); + + $config['metaconsole_base_url'] = db_get_value( + 'value', + 'tconfig', + 'token', + 'metaconsole_base_url' + ); + + if ($config['metaconsole_base_url'] === false) { + // Unset to create new value if does not exist previously. + $config['metaconsole_base_url'] = null; + } + + config_update_value( + 'metaconsole_base_url', + $url_meta_base + ); + + $sync->disconnect(); + } catch (Exception $e) { + ui_print_error_message( + 'Cannot update node settings: ', + $e->getMessage() + ); + } + } + ); + } +} + +$PHPmemory_limit_min = config_return_in_bytes('800M'); +$PHPmemory_limit = config_return_in_bytes(ini_get('memory_limit')); +if ($PHPmemory_limit < $PHPmemory_limit_min && $PHPmemory_limit !== '-1') { + $msg = __( + '\'%s\' recommended value is %s or greater. Please, change it on your PHP configuration file (php.ini) or contact with administrator', + 'memory_limit', + '800M' + ); + if (function_exists('ui_print_warning_message') === true) { + ui_print_warning_message($msg); + } else { + echo $msg; + } +} + +$ui = new Manager( + ((is_array($config) === true) ? $pandora_url : 'http://'.$_SERVER['SERVER_ADDR'].'/'), + ((is_array($config) === true) ? ui_get_full_url('ajax.php') : ''), + ((is_array($config) === true) ? 'godmode/um_client/index' : ''), + [ + 'url' => $url_update_manager, + 'insecure' => $insecure, + 'license' => $license, + 'limit_count' => ((is_array($license_data) === true) ? $license_data['count_enabled'] : null), + 'language' => ((is_array($config) === true) ? $config['language'] : null), + 'timezone' => ((is_array($config) === true) ? $config['timezone'] : null), + 'homedir' => $homedir, + 'dbconnection' => $dbconnection, + 'historydb' => $dbhHistory, + 'current_package' => $current_package, + 'MR' => $mr, + 'registration_code' => $puid, + 'remote_config' => $remote_config, + 'propagate_updates' => $is_metaconsole, + 'set_maintenance_mode' => function () { + if (function_exists('config_update_value') === true) { + config_update_value('maintenance_mode', 1); + } + }, + 'clear_maintenance_mode' => function () { + if (function_exists('config_update_value') === true) { + config_update_value('maintenance_mode', 0); + } + }, + ], + $mode +); + +$ui->run(); diff --git a/pandora_console/godmode/um_client/lib/UpdateManager/API/Server.php b/pandora_console/godmode/um_client/lib/UpdateManager/API/Server.php new file mode 100644 index 0000000000..aa88e0027f --- /dev/null +++ b/pandora_console/godmode/um_client/lib/UpdateManager/API/Server.php @@ -0,0 +1,261 @@ +repoPath = ''; + $this->licenseToken = ''; + + if (isset($settings['repo_path']) === true) { + $this->repoPath = $settings['repo_path']; + } + + if (isset($settings['license']) === true) { + $this->licenseToken = $settings['license']; + } + + if (isset($settings['registration_code']) === true) { + $this->registrationCode = $settings['registration_code']; + } + + } + + + /** + * Handle requests and reponse as UMS. + * + * @return void + * @throws \Exception On error. + */ + public function run() + { + // Requests are handled via POST to hide the user. + self::assertPost(); + + $action = self::input('action'); + + try { + if ($action === 'get_server_package' + || $action === 'get_server_package_signature' + ) { + $this->repository = new RepoMC( + $this->repoPath, + 'tar.gz' + ); + } else { + $this->repository = new RepoMC( + $this->repoPath, + 'oum' + ); + } + } catch (\Exception $e) { + self::error(500, $e->getMessage()); + } + + try { + $this->validateRequest(); + + switch ($action) { + case 'newest_package': + echo json_encode( + $this->repository->newest_package( + self::input('current_package') + ) + ); + break; + + case 'newer_packages': + echo json_encode( + $this->repository->newer_packages( + self::input('current_package') + ) + ); + break; + + case 'get_package': + $this->repository->send_package( + self::input('package') + ); + break; + + case 'get_server_package': + $this->repository->send_server_package( + self::input('version') + ); + break; + + case 'new_register': + echo json_encode( + [ + 'success' => 1, + 'pandora_uid' => $this->registrationCode, + ] + ); + break; + + // Download a package signature. + case 'get_package_signature': + echo $this->repository->send_package_signature( + self::input('package') + ); + break; + + // Download a server package signature. + case 'get_server_package_signature': + echo $this->repository->send_server_package_signature( + self::input('version') + ); + break; + + default: + throw new \Exception('invalid action'); + } + } catch (\Exception $e) { + if ($e->getMessage() === 'file not found in repository') { + self::error(404, $e->getMessage()); + } else { + self::error(500, 'Error: '.$e->getMessage()); + } + } + + } + + + /** + * Exit if not a POST request. + * + * @return void + * @throws \Exception If not running using POST. + */ + private static function assertPost() + { + if ($_SERVER['REQUEST_METHOD'] !== 'POST') { + self::error(500, 'Error: only POST requests are accepted.'); + throw new \Exception('use POST'); + } + } + + + /** + * Validate request. + * + * @return void + * @throws \Exception On error. + */ + private function validateRequest() + { + $reported_license = self::input('license', null); + + if ($reported_license !== $this->licenseToken) { + throw new \Exception('Invalid license', 1); + } + + } + + + /** + * Return headers with desired error. + * + * @param integer $err_code Error code. + * @param string $msg Message. + * + * @return void + */ + private static function error(int $err_code, string $msg='') + { + header('HTTP/1.1 '.$err_code.' '.$msg); + if (empty($msg) !== false) { + echo $msg."\r\n"; + } + } + + + /** + * Retrieve fields from request. + * + * @param string $name Variable name. + * @param mixed $default Default value. + * + * @return mixed Variable value. + */ + private static function input(string $name, $default=null) + { + if (isset($_REQUEST[$name]) === true) { + return $_REQUEST[$name]; + } + + return $default; + } + + +} diff --git a/pandora_console/godmode/um_client/lib/UpdateManager/Client.php b/pandora_console/godmode/um_client/lib/UpdateManager/Client.php new file mode 100644 index 0000000000..228bdae53a --- /dev/null +++ b/pandora_console/godmode/um_client/lib/UpdateManager/Client.php @@ -0,0 +1,2372 @@ + Nodes). + * + * @var boolean + */ + private $propagateUpdates; + + /** + * Last reror message. + * + * @var string|null + */ + private $lastError; + + /** + * Proxy settings: + * host + * port + * user + * password. + * + * @var array|null + */ + private $proxy; + + /** + * Temporary directory. + * + * @var string + */ + private $tmpDir; + + /** + * Available updates. + * + * @var array + */ + private $updates; + + /** + * Where is installed the product files. + * + * @var string + */ + private $productPath; + + /** + * Product DB connection. + * + * @var \mysqli|null + */ + private $dbh; + + /** + * Optional product DB connection. + * + * @var \mysqli|null + */ + private $dbhHistory; + + /** + * MR version. + * + * @var integer + */ + private $MR; + + /** + * Global percentage (for massive update). + * + * @var float|null + */ + private $percentage; + + /** + * Global next version (for massive update). + * + * @var string|null + */ + private $nextUpdate; + + /** + * Task step message. + * + * @var string|null + */ + private $currentTask; + + /** + * Global message (for massive update). + * + * @var string|null + */ + private $globalTask; + + /** + * Set maintenance mode ON. + * + * @var \closure + */ + private $setMaintenanceMode; + + /** + * Set maintenance mode OFF. + * + * @var \closure + */ + private $clearMaintenanceMode; + + /** + * Remote config directory (pandorafms only) to store server updates. + * + * @var string|null + */ + private $remoteConfig; + + /** + * Whenever if an offline usage. + * + * @var boolean + */ + private $offline; + + + /** + * Constructor. + * + * @param array|null $settings Update manager Client settings. + * - homedir (*): where project files are placed (e.g. config['homedir]) + * - dbconnection: mysqli object (connected) + * - historydb: mysqli object (connected to historical database) + * - url (**): UMS url (update_manager_url) + * - host: UMS host + * - port: UMS port + * - endpoint: UMS path (e.g. host:port/endpoint) + * - license: License string + * - registration_code: Registration code in UMS + * - insecure: insecure connections (SSL allow self-signed) + * - current_package: current package + * - tmp: Temporary directory + * - MR: current MR + * - proxy + * - user + * - password + * - host + * - port + * + * (*) mandatory + * (**) Optionally, set full url instead host-port-endpoint. + * + * @throws \Exception On error. + */ + public function __construct(?array $settings) + { + // Default values. + $this->umHost = 'licensing.artica.es'; + $this->umPort = 443; + $this->endPoint = '/'; + $this->insecure = false; + $this->tmpDir = sys_get_temp_dir(); + $this->currentPackage = null; + $this->proxy = null; + $this->lastError = null; + $this->registrationCode = ''; + $this->license = ''; + $this->updates = []; + $this->dbh = null; + $this->dbhHistory = null; + $this->MR = 0; + $this->percentage = null; + $this->nextUpdate = null; + $this->currentTask = null; + $this->globalTask = null; + $this->setMaintenanceMode = null; + $this->clearMaintenanceMode = null; + $this->remoteConfig = null; + $this->limitCount = null; + $this->language = null; + $this->timezone = null; + $this->propagateUpdates = false; + $this->offline = false; + + if (is_array($settings) === true) { + if (isset($settings['homedir']) === true) { + $this->productPath = $settings['homedir']; + } + + if (isset($settings['remote_config']) === true) { + $this->remoteConfig = $settings['remote_config']; + } + + if (isset($settings['limit_count']) === true) { + $this->limitCount = $settings['limit_count']; + } + + if (isset($settings['language']) === true) { + $this->language = $settings['language']; + } + + if (isset($settings['timezone']) === true) { + $this->timezone = $settings['timezone']; + } + + if (isset($settings['dbconnection']) === true) { + $this->dbh = $settings['dbconnection']; + } + + if (isset($settings['historydb']) === true) { + $this->dbhHistory = $settings['historydb']; + } + + if (isset($settings['host']) === true) { + $this->umHost = $settings['host']; + } + + if (isset($settings['port']) === true) { + $this->umPort = $settings['port']; + } + + if (isset($settings['license']) === true) { + $this->license = $settings['license']; + } + + if (isset($settings['registration_code']) === true) { + $this->registrationCode = $settings['registration_code']; + } + + if (isset($settings['propagate_updates']) === true) { + $this->propagateUpdates = $settings['propagate_updates']; + } + + if (isset($settings['proxy']) === true + && is_array($settings['proxy']) === true + ) { + $this->proxy = [ + 'host' => $settings['proxy']['host'], + 'port' => $settings['proxy']['port'], + 'user' => $settings['proxy']['user'], + 'password' => $settings['proxy']['password'], + ]; + } + + if (isset($settings['insecure']) === true) { + $this->insecure = (bool) $settings['insecure']; + } + + if (isset($settings['offline']) === true) { + $this->offline = $settings['offline']; + } + + if (isset($settings['tmp']) === true) { + $this->tmpDir = $settings['tmp']; + } + + if (isset($settings['current_package']) === true) { + $this->currentPackage = $settings['current_package']; + } + + if (isset($settings['MR']) === true) { + $this->MR = $settings['MR']; + } + + if (isset($settings['endpoint']) === true) { + $this->endPoint = $settings['endpoint']; + if (substr( + $this->endPoint, + (strlen($this->endPoint) - 1), + 1 + ) !== '/' + ) { + $this->endPoint .= '/'; + } + + if (substr($this->endPoint, 0, 1) !== '/') { + $this->endPoint = '/'.$this->endPoint; + } + } + + if (isset($settings['url']) === true) { + $this->url = $settings['url']; + } + + if (isset($settings['set_maintenance_mode']) === true) { + $this->setMaintenanceMode = $settings['set_maintenance_mode']; + } + + if (isset($settings['clear_maintenance_mode']) === true) { + $this->clearMaintenanceMode = $settings['clear_maintenance_mode']; + } + } + + if (empty($this->url) === true) { + $this->url = 'https://'.$this->umHost.':'.$this->umPort; + $this->url .= $this->endPoint.'server.php'; + } + + if (empty($this->productPath) === true) { + throw new \Exception('Please provide homedir path to use UMC'); + } + + if (is_dir($this->remoteConfig) === true + && is_dir($this->remoteConfig.'/updates') === false + ) { + mkdir($this->remoteConfig.'/updates/'); + chmod($this->remoteConfig.'/updates/', 0770); + } + } + + + /** + * True if insecure is enabled, false otherwise. + * + * @return boolean + */ + public function isInsecure() + { + return (bool) $this->insecure; + } + + + /** + * Should propagate updates? + * + * @return boolean + */ + public function isPropagatingUpdates() + { + return (bool) $this->propagateUpdates; + } + + + /** + * Return last error. + * + * @return string|null Last error or null if no errors. + */ + public function getLastError():?string + { + return $this->lastError; + } + + + /** + * Return true if registered (having a registration code), false if not. + * + * @return boolean + */ + public function isRegistered():bool + { + if (isset($this->registrationCode) === false + || $this->registrationCode === 'OFFLINE' + ) { + return false; + } + + return (bool) $this->registrationCode; + } + + + /** + * Registrates this console into update manager. + * + * @param string $email Target email. + * + * @return string|null Registration code or null if not registered. + */ + public function register(string $email):?string + { + if ($this->isRegistered() === false) { + $rc = $this->post( + [ + 'action' => 'new_register', + 'arguments' => [ 'email' => $email ], + ] + ); + + if (is_array($rc) === true) { + $this->registrationCode = $rc['pandora_uid']; + } + } + + if ($this->dbh !== null) { + $stm = $this->dbh->query( + 'SELECT `value` FROM `tconfig` WHERE `token`="pandora_uid"' + ); + + $reg_code = null; + if ($stm !== false) { + $reg_code = $stm->fetch_row()[0]; + } + + if (empty($reg_code) === true) { + $this->dbh->query( + sprintf( + 'INSERT INTO `tconfig` (`token`,`value`) + VALUES ("pandora_uid", "%s")', + ($this->getRegistrationCode() ?? 'OFFLINE') + ) + ); + } else { + $this->dbh->query( + sprintf( + 'UPDATE `tconfig` SET `value` = \'%s\' + WHERE `token` = "pandora_uid"', + ($this->getRegistrationCode() ?? 'OFFLINE') + ) + ); + } + } + + return $this->getRegistrationCode(); + } + + + /** + * Unregistrates this console from update manager. + * + * @return void + */ + public function unRegister():void + { + if ($this->isRegistered() === true) { + $this->post( + [ 'action' => 'unregister' ] + ); + + $this->registrationCode = 'OFFLINE'; + } + + if ($this->dbh !== null) { + $this->dbh->query( + sprintf( + 'UPDATE `tconfig` SET `value` = \'%s\' + WHERE `token` = "pandora_uid"', + 'OFFLINE' + ) + ); + } + } + + + /** + * Return registration code if this console is registered into UMS + * + * @return string|null + */ + public function getRegistrationCode():?string + { + if ($this->isRegistered() === true) { + return $this->registrationCode; + } + + return null; + } + + + /** + * Executes a curl request. + * + * @param string $url Url to be called. + * @param array $request Options. + * + * @return mixed Response given by curl. + */ + private function curl(string $url, array $request) + { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt( + $ch, + CURLOPT_POSTFIELDS, + $request + ); + if ($this->insecure === true) { + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + } + + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + + if (is_array($this->proxy) === true) { + curl_setopt($ch, CURLOPT_PROXY, $this->proxy['host']); + if (isset($this->proxy['port']) === true) { + curl_setopt($ch, CURLOPT_PROXYPORT, $this->proxy['port']); + } + + if (isset($this->proxy['user']) === true) { + curl_setopt( + $ch, + CURLOPT_PROXYUSERPWD, + $this->proxy['user'].':'.$this->proxy['password'] + ); + } + } + + // Track progress. + if ((empty($request) === true + || $request['action'] === 'get_package' + || $request['action'] === 'get_server_package') + ) { + curl_setopt( + $ch, + CURLOPT_NOPROGRESS, + false + ); + } + + $target = ''; + if ($request['action'] === 'get_server_package') { + $target = __('server update %d', $request['version']); + } else if ($request['action'] === 'get_package') { + $target = __('console update %d', $request['version']); + } + + curl_setopt( + $ch, + CURLOPT_PROGRESSFUNCTION, + function ( + $ch, + $total_bytes, + $current_bytes, + $total_sent_bytes, + $current_sent_bytes + ) use ($target) { + if ($total_bytes > 0) { + $this->notify( + (100 * $current_bytes / $total_bytes), + __( + 'Downloading %s %.2f/ %.2f MB.', + $target, + ($current_bytes / (1024 * 1024)), + ($total_bytes / (1024 * 1024)) + ), + true + ); + } else { + $this->notify( + 0, + __( + 'Downloading %.2f MB', + ($current_bytes / (1024 * 1024)) + ), + true + ); + } + } + ); + + // Call. + $response = curl_exec($ch); + $erro_no = curl_errno($ch); + if ($erro_no > 0) { + $this->lastError = $erro_no.':'.curl_error($ch); + return null; + } + + return $response; + + } + + + /** + * Make a request to Update manager. + * + * @param array $request Request: + * action: string + * arguments: array. + * @param boolean $literal Literal response, do not decode. + * + * @return mixed|null Parsed response if valid, false if error. + */ + private function post(array $request, bool $literal=false) + { + global $pandora_version; + + $this->lastError = null; + $default = [ + 'current_package' => $this->currentPackage, + 'license' => $this->license, + 'limit_count' => $this->limitCount, + 'language' => $this->language, + 'timezone' => $this->timezone, + // Retrocompatibility token. + 'version' => $pandora_version, + 'puid' => $this->registrationCode, + 'email' => null, + 'format' => 'oum', + 'build' => $this->currentPackage, + ]; + + foreach ([ + 'build', + 'current_package', + 'license', + 'limit_count', + 'language', + 'timezone', + 'version', + 'email', + 'format', + 'puid', + ] as $var_name) { + if (isset($request['arguments'][$var_name]) === false) { + $request['arguments'][$var_name] = $default[$var_name]; + } + } + + // Initialize. + $response = $this->curl( + $this->url, + array_merge( + ['action' => $request['action']], + $request['arguments'] + ) + ); + + if ($literal === true) { + return $response; + } + + if ($response !== null) { + $decoded = json_decode($response, JSON_OBJECT_AS_ARRAY); + if (json_last_error() !== JSON_ERROR_NONE) { + $this->lastError = $response; + return null; + } + + return $decoded; + } + + // Request has failed. + return null; + } + + + /** + * Test update manager server availability. + * + * @return boolean Success or not. + */ + public function test():bool + { + $rc = $this->post([ 'action' => 'test' ], true); + if ($rc === 'Test response.') { + return true; + } + + $this->lastError = $rc; + return false; + + } + + + /** + * Retrieves a list of updates available in target UMS. + * + * @return array|null Results: + * [ + * [ + * 'version' => Version id. + * 'file_name' => File name. + * 'description' => description. + * ] + * ]; + */ + public function listUpdates():?array + { + $this->nextUpdate = null; + if (empty($this->updates) === true) { + $rc = $this->post([ 'action' => 'newer_packages' ]); + + if (is_array($rc) !== true) { + // Propagate last error from request. + return null; + } + + // Translate respone. + $this->updates = array_reduce( + $rc, + function ($carry, $item) { + $matches = []; + if (is_array($item) !== true + && preg_match('/(\d+)\.tar/', $item, $matches) > 0 + ) { + $carry[] = [ + 'version' => $matches[1], + 'file_name' => $item, + 'description' => '', + ]; + } else { + $carry[] = $item; + } + + return $carry; + }, + [] + ); + } + + // Allows 'notify' follow current operation. + if (is_array(current($this->updates)) === true) { + foreach ($this->updates as $update) { + $this->nextUpdate = $update['version']; + if ($this->nextUpdate > $this->currentPackage) { + break; + } + } + } + + return $this->updates; + } + + + /** + * Update database given MR update. + * + * @param string $mr_file Target mr file to apply. + * @param \mysqli|null $dbh Target DBH. + * @param integer|null $mr_version Current MR version (if custom dbh). + * + * @return void + * @throws \Exception On error. + */ + public function updateMR( + string $mr_file, + ?\mysqli $dbh=null, + ?int $mr_version=null + ):void { + if ($dbh === null) { + $dbh = $this->dbh; + } + + if ((bool) $dbh === false) { + throw new \Exception( + 'A database connection is needed in order to apply MR updates.' + ); + } + + if ($mr_version === null) { + $mr_version = $this->MR; + } + + if ($mr_version === 0) { + // PandoraFMS. + $sth = $dbh->query( + 'SELECT `value` + FROM `tconfig` + WHERE `token` = "MR"' + ); + + if ($sth === false) { + // IntegriaIMS. + $sth = $dbh->query( + 'SELECT `value` + FROM `tconfig` + WHERE `token` = "minor_release"' + ); + } + + if ($sth !== false) { + $result = $sth->fetch_array(); + if ($result !== null) { + $mr_version = $result[0][0]; + } + } + } + + if (is_file($mr_file) !== true || is_readable($mr_file) !== true) { + throw new \Exception('Cannot access MR file ('.$mr_file.')'); + } + + $target_mr = null; + $matches = []; + if (preg_match('/(\d+).sql$/', $mr_file, $matches) > 0) { + $target_mr = $matches[1]; + if ($target_mr <= $mr_version) { + return; + } + } + + $sql = file_get_contents($mr_file); + try { + $dbh->query('SET sql_mode=""'); + $dbh->autocommit(false); + $dbh->begin_transaction(); + + $queries = preg_split("/(;\n)|(;\n\r)/", $sql); + foreach ($queries as $query) { + if (empty($query) !== true) { + if ($dbh->query($query) === false) { + // 1022: Duplicate key in table. + // 1050: Table already defined. + // 1060: Duplicated column name, ignore. + // 1061: Duplicated key name, ignore. + // 1062: Duplicated data, ignore. + // 1065: Query was empty, ignore. + // 1091: Column already dropped. + if ($dbh->errno !== 1022 + && $dbh->errno !== 1050 + && $dbh->errno !== 1060 + && $dbh->errno !== 1061 + && $dbh->errno !== 1062 + && $dbh->errno !== 1065 + && $dbh->errno !== 1091 + ) { + // More serious issue, stop. + $err = '(MR:'.$target_mr.') '; + $err .= $dbh->errno.': '.$dbh->error; + $err .= "\n".$query; + + throw new \Exception($err); + } + } + } + } + + // Success. + $dbh->commit(); + } catch (\Exception $e) { + // Error. + $dbh->rollback(); + + throw $e; + } finally { + $dbh->autocommit(true); + } + + if ($dbh === $this->dbh) { + $this->MR = $target_mr; + } else { + // Update product version on target database. + $this->updateLocalDatabase($dbh, $target_mr); + } + } + + + /** + * Return given field from table matching filters. + * + * @param string $field Field to retrieve. + * @param string $table Table. + * @param array $filters Array of filters. + * @param \mysqli|null $dbh Database handler or use default. + * + * @return mixed|false + */ + private function getValue( + string $field, + string $table, + array $filters, + $dbh=null + ) { + // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps + if ($dbh === null) { + $dbh = $this->dbh; + } + + $sql_filters = ''; + foreach ($filters as $k => $v) { + $sql_filters .= sprintf(' AND `%s` = "%s" ', $k, $v); + } + + $stm = $dbh->query( + sprintf( + 'SELECT `%s` FROM `%s` WHERE 1=1 AND %s LIMIT 1', + $field, + $table, + $sql_filters + ) + ); + if ($stm !== false && $stm->num_rows > 0) { + $rs = $stm->fetch_array(); + if (is_array($rs) === true) { + $rs = array_shift($rs); + if (is_array($rs) === true) { + return array_shift($rs); + } + } + } + + return false; + } + + + /** + * Applies all MR updates pending from path. + * + * @return boolean + */ + public function applyAllMRPending() + { + // Apply MR. + try { + $mr_files = $this->getMRFiles($this->productPath); + // Aprox 50%. + if (count($mr_files) > 0) { + foreach ($mr_files as $mr) { + $this->updateMR($this->productPath.'/extras/mr/'.$mr); + if ($this->dbhHistory !== null) { + $historical_MR = $this->getValue( + 'value', + 'tconfig', + ['token' => 'MR'], + $this->dbhHistory + ); + + $this->updateMR( + $this->productPath.'/extras/mr/'.$mr, + $this->dbhHistory, + $historical_MR + ); + } + + // Update versions. + $this->updateLocalDatabase(); + } + } + } catch (\Exception $e) { + $this->lastError = $e->getMessage()."\n"; + return false; + } + + return true; + } + + + /** + * Retrieve a list of MR files given path. + * + * @param string $path Patch files path. + * + * @return array + * @throws \Exception On error. + */ + private function getMRFiles(string $path):array + { + $mr_files = []; + + if (is_dir($path) !== true || is_readable($path) !== true) { + throw new \Exception('Path ['.$path.'] is not readable'); + } + + if (is_dir($path.'/extras/mr/') === false) { + // No directory, no MR. + return []; + } + + $pd = opendir($path.'/extras/mr/'); + if ((bool) $pd !== true) { + throw new \Exception('extras/mr is not readable'); + } + + while (false !== ($pf = readdir($pd))) { + $matches = []; + if (preg_match('/(\d+).sql$/', $pf, $matches) > 0) { + if ($matches[1] > $this->MR) { + $mr_files[(int) $matches[1]] = $pf; + } + } + } + + closedir($pd); + + // Sort mr files. + ksort($mr_files); + + return $mr_files; + + } + + + /** + * Update files. + * + * @param string $version Used to translate paths. + * @param string $from Update all files from path into product. + * @param string $to Product path. + * @param boolean $test Test operation, do not perform. + * @param boolean $classic Process classic opensource package. + * + * @return void + * @throws \Exception On error. + */ + private function updateFiles( + string $version, + string $from, + string $to, + bool $test=false, + bool $classic=false + ) :void { + if (is_dir($from) !== true || is_readable($from) !== true) { + throw new \Exception('Cannot access patch files '.$from); + } + + if (is_dir($to) !== true || is_writable($to) !== true) { + throw new \Exception('Cannot write to installation files '.$to); + } + + // Used to translate paths. + $substr = $this->tmpDir.'/downloads/'.$version; + if ($classic === true) { + $substr .= '/pandora_console'; + } + + $pd = opendir($from); + if ((bool) $pd !== true) { + throw new \Exception('Files are not readable'); + } + + $created_directories = []; + + while (($pf = readdir($pd)) !== false) { + if ($pf !== '.' && $pf !== '..') { + $pf = $from.$pf; + $dest = $to.str_replace($substr, '', $pf); + $target_folder = dirname($dest); + + if (is_dir($pf) === true) { + // It's a directory. + if (is_dir($dest) === true) { + // Target directory already exists. + if ($test === true && is_writable($dest) !== true) { + throw new \Exception($dest.' is not writable'); + } + } else if (is_file($dest) === true) { + $err = '['.$dest.'] $err is expected to be '; + $err .= 'a directory, please remove it.'; + throw new \Exception($err); + } else { + mkdir($dest); + $created_directories[] = $dest; + } + + $this->updateFiles($version, $pf.'/', $to, $test, $classic); + } else { + // It's a file. + if ($test === true) { + if (is_writable($target_folder) !== true) { + throw new \Exception($dest.' is not writable'); + } + } else { + // Rename file. + rename($pf, $dest); + } + } + } + } + + closedir($pd); + + if ($test === true) { + $created_directories = array_reverse($created_directories); + foreach ($created_directories as $dir) { + rmdir($dir); + } + } + } + + + /** + * Completely deletes a folder. + * + * @param string $folder Folder to delete. + * + * @return void + */ + private function rmrf(string $folder):void + { + if (is_dir($folder) !== true || is_readable($folder) !== true) { + return; + } + + $pd = opendir($folder); + if ((bool) $pd === true) { + while (($pf = readdir($pd)) !== false) { + if ($pf !== '.' && $pf !== '..') { + $pf = $folder.$pf; + + if (is_dir($pf) === true) { + // It's a directory. + $this->rmrf($pf.'/'); + } else { + // It's a file. + unlink($pf); + } + } + } + + closedir($pd); + rmdir($folder); + } + } + + + /** + * Process files deletion given a list. + * + * @param string $delete_files_txt Path to delete_files.txt. + * + * @return array Paths processed. + */ + private function deleteFiles(string $delete_files_txt):array + { + if (is_readable($delete_files_txt) === false) { + return []; + } + + $content = file_get_contents($delete_files_txt); + $files = explode('\n', $content); + $processed = []; + foreach ($files as $file) { + $file = trim(str_replace("\0", '', $this->productPath.'/'.$file)); + if (file_exists($file) === true + && is_file($delete_files_txt) === true + ) { + unlink($file); + $processed[$file] = 'removed'; + } else if (is_dir($file) === true) { + $processed[$file] = 'skipped, is a directory'; + } else { + $processed[$file] = 'skipped. Unreachable.'; + } + } + + return $processed; + } + + + /** + * Retrieves a list of files included in given OUM. + * + * @param string $filename File to be analyzed. + * + * @return array|null With the results or null if error. + */ + public static function checkOUMContent(string $filename):?array + { + $files = []; + + if (class_exists('\ZipArchive') === false) { + return null; + } + + $zip = new \ZipArchive; + $res = $zip->open($filename); + if ($res === true) { + for ($i = 0; $i < $zip->numFiles; $i++) { + $stat = $zip->statIndex($i); + $files[] = $stat['name']; + } + + $zip->close(); + } else { + return null; + } + + return $files; + } + + + /** + * Retrieves a list of files included in given file, used for server updates. + * + * @param string $filename File to be analyzed. + * + * @return array|null With the results or null if error. + */ + public static function checkTGZContent(string $filename):?array + { + $files = []; + + if (class_exists('\PharData') === false) { + return null; + } + + $er = error_reporting(); + error_reporting(E_ALL ^ E_NOTICE); + set_error_handler( + function ($errno, $errstr) { + if (preg_match('/Undefined index/', $errstr) > 1) { + return; + } + + throw new \Exception($errstr, $errno); + } + ); + + register_shutdown_function( + function () { + $error = error_get_last(); + if (null !== $error) { + echo __('Failed to analyze package: %s', $error['message']); + } + } + ); + + try { + $phar = new \PharData($filename); + $files = self::recursiveFileList($phar, ''); + } catch (\Exception $e) { + return null; + } + + // Restore. + error_reporting($er); + restore_error_handler(); + + return $files; + } + + + /** + * Retrieve a list of files given item (could be a directory or file) from + * pharData item. + * + * @param \PharData|\PharFileInfo $item Item to analyse. + * @param string $path Anidated path. + * + * @return array Of file paths. + */ + private static function recursiveFileList($item, string $path=''):array + { + $return = []; + if ($item->isDir() === true) { + $pd = new \PharData($item->getPathname()); + $return[] = $path.'/'.$item->getFilename(); + foreach ($pd as $child) { + $return = array_merge( + $return, + self::recursiveFileList( + $child, + $path.'/'.$item->getFilename() + ) + ); + } + } else { + $return[] = $path.'/'.$item->getFilename(); + } + + return $return; + } + + + /** + * Update product to next version available. + * + * @param array|null $package Update to manually uploaded package. + * Format: + * [ + * version + * file_path + * ] + * Version: version to install, file_path where's stored the oum package. + * + * @return boolean|null True if success, false if not, null if already + * up to date. + * @throws \Exception No exception is thrown, is handled using lastError + * and returned value. + */ + public function updateNextVersion(?array $package=null):?bool + { + if ($this->lock() !== true) { + return null; + } + + // Some transfer errors (e.g. failed to open stream: Connection timed + // out) or OS issues (No space left on device) should be captured as + // php errors. + $er = error_reporting(); + error_reporting(E_ALL ^ E_NOTICE); + set_error_handler( + function ($errno, $errstr) { + throw new \Exception($errstr, $errno); + } + ); + + if ($package === null) { + // Use online update. + if ($this->globalTask === null) { + // Single update. + $this->percentage = 0; + $this->currentTask = __('Searching update package'); + } + + // 1. List updates and get next one. + $this->notify(0, 'Retrieving updates.'); + $updates = $this->listUpdates(); + $nextUpdate = null; + + if (is_array($updates) === true) { + $nextUpdate = array_shift($updates); + } + + while ($nextUpdate !== null + && $nextUpdate['version'] <= $this->currentPackage + ) { + $nextUpdate = array_shift($updates); + } + + if ($nextUpdate === null) { + // No more updates pending. + $this->notify(100, 'No more updates pending.'); + $this->unlock(); + return null; + } + + // 2. Retrieve file. + if ($this->globalTask === null) { + // Single update. + $this->percentage = 10; + $this->currentTask = __('Retrieving update'); + } + + $this->notify(0, 'Downloading update '.$nextUpdate['version'].'.'); + $file = $this->post( + [ + 'action' => 'get_package', + 'arguments' => ['package' => $nextUpdate['file_name']], + ], + true + ); + + $file_path = $this->tmpDir.'/'; + $classic_open_packages = false; + try { + if (substr($nextUpdate['file_name'], 0, 7) === 'http://') { + $file_path .= 'package_'.$nextUpdate['version'].'.tar.gz'; + $file = $this->curl($nextUpdate['file_name'], []); + file_put_contents( + $file_path, + $file + ); + $classic_open_packages = true; + } else { + if (preg_match('/Error\: file not found./', $file) > 0) { + $this->lastError = $file; + $this->unlock(); + return false; + } + + $file_path .= basename($nextUpdate['file_name']); + file_put_contents( + $file_path, + $file + ); + } + } catch (\Exception $e) { + error_reporting($er); + $this->lastError = $e->getMessage(); + $this->notify(10, $this->lastError, false); + $this->unlock(); + return false; + } + + $signature = $this->post( + [ + 'action' => 'get_package_signature', + 'arguments' => ['package' => $nextUpdate['file_name']], + ], + 1 + ); + + if ($this->insecure === false + && $this->validateSignature($file_path, $signature) !== true + ) { + $this->lastError = 'Signatures does not match.'; + $this->notify(10, $this->lastError, false); + $this->unlock(); + return false; + } + + if ($this->propagateUpdates === true) { + $this->saveSignature( + $signature, + $nextUpdate['file_name'] + ); + } + } else { + // Manually uploaded package. + if (is_numeric($package['version']) !== true) { + $this->lastError = 'Version does not match required format (numeric)'; + $this->notify(10, $this->lastError, false); + $this->unlock(); + return false; + } + + $classic_open_packages = false; + $nextUpdate = [ 'version' => $package['version'] ]; + $file_path = $package['file_path']; + } + + $version = $nextUpdate['version']; + $extract_to = $this->tmpDir.'/downloads/'.$version.'/'; + + // Cleanup download target. + $this->rmrf($extract_to); + + // Uncompress. + if ($this->globalTask === null) { + // Single update. + $this->percentage = 15; + $this->currentTask = __('Extracting package'); + } + + $this->notify(0, 'Extracting...'); + + if ($classic_open_packages === true) { + try { + $phar = new \PharData($file_path); + if ($phar->extractTo( + $extract_to, + // Extract all files. + null, + // Overwrite if exist. + true + ) !== true + ) { + // When PharData failes because of no space left on device + // a PHP Notice is received instead of a PharData\Exception. + throw new \Exception(error_get_last()); + } + } catch (\Exception $e) { + error_reporting($er); + $this->lastError = $e->getMessage(); + $this->notify(15, $this->lastError, false); + $this->unlock(); + return false; + } + } else { + if (class_exists('\ZipArchive') === false) { + error_reporting($er); + $this->lastError = 'Unable to unzip OUM package. Please install php-zip.'; + $this->notify(15, $this->lastError, false); + $this->unlock(); + return false; + } + + $zip = new \ZipArchive; + $res = $zip->open($file_path); + if ($res === true) { + $zip->extractTo($extract_to); + $zip->close(); + } else { + error_reporting($er); + $this->lastError = 'Unable to unzip OUM package.'; + $this->notify(15, $this->lastError, false); + $this->unlock(); + return false; + } + } + + // Restore previous reporting level. + error_reporting($er); + restore_error_handler(); + + $downloaded_package_files = $extract_to; + if ($classic_open_packages === true) { + // Fix to avoid extra directories in classic OpenSource packages. + $extract_to .= 'pandora_console/'; + } + + // Test files update. + if ($this->globalTask === null) { + // Single update. + $this->percentage = 35; + $this->currentTask = __('Testing files'); + } + + $this->notify(0, 'Testing files from udpate...'); + try { + $this->updateFiles( + $version, + $extract_to, + $this->productPath, + // Test only. + true, + $classic_open_packages + ); + } catch (\Exception $e) { + $this->lastError = $e->getMessage(); + $this->notify(25, $this->lastError, false); + $this->unlock(); + return false; + } + + // Apply MR. + try { + $mr_files = $this->getMRFiles($extract_to); + // Aprox 50%. + if (count($mr_files) > 0) { + $pct = floor(20 / count($mr_files)); + $step = floor(100 / count($mr_files)); + $percentage = 0; + foreach ($mr_files as $mr) { + if ($this->globalTask === null) { + // Single update. + $this->percentage = (55 + $pct); + $this->currentTask = __('Applying MR %s', $mr); + } + + $this->notify($percentage, 'Applying MR update '.$mr.'.'); + $this->updateMR($extract_to.'/extras/mr/'.$mr); + if ($this->dbhHistory !== null) { + $this->notify($percentage, 'Applying MR update '.$mr.' on history database.'); + $historical_MR = $this->getValue( + 'value', + 'tconfig', + ['token' => 'MR'], + $this->dbhHistory + ); + + $this->updateMR( + $this->productPath.'/extras/mr/'.$mr, + $this->dbhHistory, + $historical_MR + ); + } + + // Update versions. + $this->updateLocalDatabase(); + $percentage += $step; + } + } + } catch (\Exception $e) { + $this->lastError = $e->getMessage(); + $this->notify(50, $this->lastError, false); + $this->unlock(); + return false; + } + + // Apply files update. + if ($this->globalTask === null) { + // Single update. + $this->percentage = 75; + $this->currentTask = __('Applying file updates'); + } + + try { + $this->notify(0, 'Updating files...'); + $this->updateFiles( + $version, + $extract_to, + $this->productPath, + // Effective application. + false, + $classic_open_packages + ); + } catch (\Exception $e) { + $this->lastError = $e->getMessage(); + $this->notify(75, $this->lastError, false); + $this->unlock(); + return false; + } + + if ($this->globalTask === null && $this->offline === false) { + $this->percentage = 90; + $this->currentTask = __('Retrieving server update'); + // Schedule server update. + $this->updateServerPackage(null, $version); + } + + $this->notify(95, 'Cleaning downloaded files...'); + + // Save package update if propagating updates. + if ($this->propagateUpdates === true) { + $this->savePackageToRepo($file_path); + } + + if ($this->globalTask === null) { + // Single update. + $this->percentage = 95; + $this->currentTask = __('Cleaning'); + } + + // Remove already extracted files (oum/tar.gz). + $this->rmrf($file_path); + + // Cleanup downloaded files. + $this->rmrf($downloaded_package_files); + + // Process file eliminations (file: delete_files.txt). + $cleaned = $this->deleteFiles( + $this->productPath.'/extras/delete_files/delete_files.txt' + ); + + // Success. + if ($this->globalTask === null) { + // Single update. + $this->percentage = 100; + $this->currentTask = __('Completed'); + } + + $this->notify( + 100, + 'Updated to '.$version, + true, + ['deleted_files' => $cleaned] + ); + + $this->currentPackage = $version; + + if ($this->dbh !== null) { + $this->updateLocalDatabase(); + } + + $this->unlock(); + return true; + } + + + /** + * Update product to latest version available. + * + * @return string Last version reached. + */ + public function updateLastVersion():string + { + $this->percentage = 0; + $this->listUpdates(); + $total_updates = count($this->updates); + + if ($total_updates > 0) { + $pct = (90 / $total_updates); + do { + $this->listUpdates(); + $this->globalTask = __('Updating to '.$this->nextUpdate); + $rc = $this->updateNextVersion(); + if ($rc === false) { + // Failed to upgrade to next version. + break; + } + + // If rc is null, latest version available is applied. + if ($rc !== null) { + $this->percentage += $pct; + } + } while ($rc !== null); + } + + $last_error = $this->lastError; + $this->updateServerPackage(null, $this->currentPackage); + + if ($this->lastError === null) { + // Populate latest console error. + $this->lastError = $last_error; + } + + $this->percentage = 100; + $this->notify(100, 'Updated to '.$this->getVersion().'.'); + + return $this->currentPackage; + } + + + /** + * Retrieve current package version installed. + * + * @return string Version. + */ + public function getVersion():string + { + return ($this->currentPackage ?? ''); + } + + + /** + * Retrieve current MR version installed. + * + * @return integer Version. + */ + public function getMR():int + { + return $this->MR; + } + + + /** + * Return database link. + * + * @return \mysqli + */ + public function getDBH():\mysqli + { + return $this->dbh; + } + + + /** + * Store into dbh (if any) current percentage of completion and a message. + * + * @param float $percent Current completion percentage. + * @param string $msg Mesage to be displayed to user. + * @param boolean $status Status of current operation (true: healthy, + * false: failed). + * @param array $extra Extra messages, for instance, files cleaned. + * + * @return void + */ + private function notify( + float $percent, + string $msg, + bool $status=true, + array $extra=[] + ):void { + if ($this->dbh !== null) { + static $field_exists; + $stm = $this->dbh->query( + 'SELECT count(*) FROM `tconfig` + WHERE `token` = "progress_update"' + ); + + if ($stm !== false) { + $field_exists = $stm->fetch_row(); + $field_exists = (bool) $field_exists[0]; + } + + $task_msg = null; + if ($this->globalTask !== null) { + $task_msg = $this->globalTask; + } else if ($this->currentTask !== null) { + $task_msg = $this->currentTask; + } + + $updates = json_encode( + [ + 'global_percent' => $this->percentage, + 'processing' => $task_msg, + 'percent' => $percent, + 'status' => $status, + 'message' => $msg, + 'extra' => $extra, + ] + ); + + if ($field_exists === false) { + $q = sprintf( + 'INSERT INTO `tconfig`(`token`, `value`) + VALUES ("progress_update", \'%s\')', + $updates + ); + $r = $this->dbh->query($q); + $field_exists = true; + } else { + $this->dbh->query( + sprintf( + 'UPDATE `tconfig` SET `value` = \'%s\' + WHERE `token` = "progress_update"', + $updates + ) + ); + } + } + + } + + + /** + * Deploy server update. + * + * @param array|null $package Server package to be deployed. + * @param float|null $version Target version to aquire. + * + * @return boolean Success or not. + */ + public function updateServerPackage( + ?array $package=null, + ?float $version=null + ):bool { + if (empty($this->remoteConfig) === true) { + $this->lastError = 'Remote configuration directory not defined, please define \'remoteConfig\' in call'; + return false; + } + + $file_path = $this->tmpDir.'/'; + if ($version === null) { + $version = $this->getVersion(); + } + + if ($this->propagateUpdates === true) { + $updatesRepo = $this->remoteConfig.'/updates/repo'; + if (is_dir($updatesRepo) === false) { + mkdir($updatesRepo, 0777, true); + chmod($updatesRepo, 0770); + } + } + + if ($package === null) { + // Retrieve package from UMS. + $this->notify(0, 'Downloading server update '.$version.'.'); + $file = $this->post( + [ + 'action' => 'get_server_package', + 'arguments' => ['version' => $version], + ], + 1 + ); + + if (empty($file) === true) { + // No content. + return false; + } + + $file_name = 'pandorafms_server-'.$version.'.tar.gz'; + $official_name = 'pandorafms_server_enterprise-7.0NG.%s_x86_64.tar.gz'; + $filename_repo = sprintf($official_name, $version); + $official_path = $file_path.$filename_repo; + + if (file_put_contents($official_path, $file) === false) { + $this->lastError = 'Failed to store server update package.'; + return false; + } + + $signature = $this->post( + [ + 'action' => 'get_server_package_signature', + 'arguments' => ['version' => $version], + ], + 1 + ); + + if ($this->insecure === false + && $this->validateSignature($official_path, $signature) !== true + ) { + $this->lastError = 'Signatures does not match'; + return false; + } + + if ($this->propagateUpdates === true) { + $this->saveSignature( + $signature, + $filename_repo + ); + } + + $file_path .= $file_name; + rename($official_path, $file_path); + } else { + $file_path = $package['file_path']; + $version = $package['version']; + } + + // Save package update if propagating updates. + if ($this->propagateUpdates === true) { + $this->savePackageToRepo( + $file_path, + $filename_repo + ); + } + + // Target file name. + $file_name = 'pandorafms_server.tar.gz'; + + $this->notify(90, 'Scheduling server update '.$version.' to pandora_ha'); + + $serverRepo = $this->remoteConfig.'/updates/server'; + + // Clean old repo files. + $this->rmrf($serverRepo.'/'); + + if (is_dir($serverRepo) === false) { + mkdir($serverRepo, 0777, true); + chmod($serverRepo, 0770); + } + + $rc = rename($file_path, $serverRepo.'/'.$file_name); + + if ($rc === false) { + $this->lastError = 'Unable to deploy server update from '.$file_path; + $this->lastError .= ' to '.$serverRepo.'/'.$file_name; + return false; + } + + file_put_contents($serverRepo.'/version.txt', $version); + + // Success. + $this->notify(100, 'Server update scheduled.'); + $this->lastError = null; + return true; + } + + + /** + * Validate received signature. + * + * @param string $file File path. + * @param string $signature Received signature in base64 format. + * + * @return boolean + */ + public function validateSignature(string $file, string $signature) + { + if (empty($signature) === true) { + return false; + } + + // Compute the hash of the data. + $hex_hash = hash_file('sha512', $file); + if ($hex_hash === false) { + return false; + } + + // Verify the signature. + if (openssl_verify($hex_hash, base64_decode($signature), PUB_KEY, 'sha512') === 1) { + return true; + } + + return false; + } + + + /** + * Save signature to file. + * + * @param string $signature File signature. + * @param string $filename Signed filename (i.e. package_NUMBER.oum). + * + * @return boolean Success or not. + */ + public function saveSignature( + string $signature, + string $filename + ) { + $updatesRepo = $this->remoteConfig.'/updates/repo'; + if (is_dir($updatesRepo) === false) { + mkdir($updatesRepo, 0777, true); + chmod($updatesRepo, 0770); + } + + $target = $updatesRepo.'/'.basename($filename).SIGNATURE_EXTENSION; + + if (file_exists($target) === true) { + unlink($target); + } + + // Save signature to file (MC -> nodes). + $rc = (bool) file_put_contents($target, $signature); + chmod($target, 0660); + return $rc; + } + + + /** + * Save update package to repository. + * + * @param string $filename Target filename. + * @param string|null $target Store as target in repo folder. + * + * @return void + */ + private function savePackageToRepo(string $filename, ?string $target=null) + { + if ($this->propagateUpdates === true) { + if (file_exists($filename) === false) { + return; + } + + $updatesRepo = $this->remoteConfig.'/updates/repo'; + if (is_dir($updatesRepo) === false) { + mkdir($updatesRepo, 0777, true); + chmod($updatesRepo, 0770); + } + + $new_name = $target; + if ($new_name === null) { + $new_name = basename($filename); + } + + if (file_exists($updatesRepo.'/'.$new_name) === true) { + unlink($updatesRepo.'/'.$new_name); + } + + copy( + $filename, + $updatesRepo.'/'.$new_name + ); + chmod($updatesRepo.'/'.$new_name, 0660); + } + } + + + /** + * Updates tokens current_package and MR in current database. + * + * @param \mysqli|null $dbh Target dbh where apply changes. + * @param integer|null $mr MR version to update. + * + * @return void + */ + private function updateLocalDatabase(?\mysqli $dbh=null, ?int $mr=null):void + { + // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps + if ($dbh === null) { + $dbh = $this->dbh; + } + + $create_current_package_field = false; + $create_mr_field = false; + + $stm = $dbh->query( + 'SELECT `value` FROM `tconfig` + WHERE `token`="current_package" + LIMIT 1' + ); + if ($stm !== false && $stm->num_rows === 0) { + $create_current_package_field = true; + } + + $stm = $dbh->query( + 'SELECT `value` FROM `tconfig` + WHERE `token`="MR" + LIMIT 1' + ); + if ($stm !== false && $stm->num_rows === 0) { + $create_mr_field = true; + } + + // Current package. + if ($create_current_package_field === true) { + $q = sprintf( + 'INSERT INTO `tconfig`(`token`, `value`) + VALUES ("current_package", "%s")', + $this->getVersion() + ); + } else { + $q = sprintf( + 'UPDATE `tconfig` SET `value`= "%s" + WHERE `token` = "current_package"', + $this->getVersion() + ); + } + + if ($dbh->query($q) === false) { + $this->lastError = $dbh->error; + } + + // MR. + if ($create_mr_field === true) { + $q = sprintf( + 'INSERT INTO `tconfig`(`token`, `value`) + VALUES ("MR", %d)', + ($mr ?? $this->getMR()) + ); + } else { + $q = sprintf( + 'UPDATE `tconfig` SET `value`= %d + WHERE `token` = "MR"', + ($mr ?? $this->getMR()) + ); + } + + if ($dbh->query($q) === false) { + $this->lastError = $dbh->error; + } + + } + + + /** + * Retrieves current update progress. + * + * @return array. + */ + public function getUpdateProgress():array + { + // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps + $stm = $this->dbh->query( + 'SELECT `value` FROM `tconfig` + WHERE `token`="progress_update" + LIMIT 1' + ); + if ($stm !== false && $stm->num_rows === 0) { + return []; + } + + $progress = $stm->fetch_array(); + $progress = $progress[0]; + $progress = json_decode($progress, JSON_OBJECT_AS_ARRAY); + + if (json_last_error() !== JSON_ERROR_NONE) { + $this->lastError = json_last_error_msg(); + return []; + } + + if ($progress === null) { + return []; + } + + return $progress; + } + + + /** + * Retrieves campaign messages from UMS. + * + * @return array|null Array of campaign messages. + */ + public function getMessages() + { + $rc = $this->post( + [ + 'action' => 'get_messages', + 'arguments' => ['puid' => $this->registrationCode], + ] + ); + + return $rc; + } + + + /** + * Get a lock to process update. + * + * @return boolean True (allowed), false if not. + */ + private function lock():bool + { + if ($this->dbh !== null) { + $stm = $this->dbh->query( + 'SELECT IS_FREE_LOCK("umc_lock")' + ); + + if ($stm !== false) { + $lock_status = $stm->fetch_row()[0]; + } + + if ((bool) $lock_status === true) { + // No registers. + $this->dbh->query( + sprintf( + 'SELECT GET_LOCK("umc_lock", %d)', + self::MAX_LOCK_AGE + ) + ); + + if (is_callable($this->setMaintenanceMode) === true) { + call_user_func($this->setMaintenanceMode); + } + + // Available. + return true; + } + + // Locked. + return false; + } + + // No database available, use files. + $lock_file = sys_get_temp_dir().'/umc/lock'; + if (file_exists($lock_file) === true) { + $lock_age = file_get_contents($lock_file); + + if ((time() - $lock_age) > self::MAX_LOCK_AGE) { + unlink($lock_file); + } else { + // Locked. + return false; + } + } + + file_put_contents($lock_file, time()); + + if (is_callable($this->setMaintenanceMode) === true) { + call_user_func($this->setMaintenanceMode); + } + + // Available. + return true; + } + + + /** + * Unlock. + * + * @return void + */ + private function unlock():void + { + if ($this->dbh !== null) { + $this->dbh->query('SELECT RELEASE_LOCK("umc_lock")'); + } else { + $lock_file = sys_get_temp_dir().'/umc/lock'; + if (file_exists($lock_file) === true) { + unlink($lock_file); + } + } + + if (is_callable($this->clearMaintenanceMode) === true) { + call_user_func($this->clearMaintenanceMode); + } + } + + + /** + * Checking progress, check if any instance is running. + * + * @return boolean + */ + public function isRunning():bool + { + $stm = $this->dbh->query( + 'SELECT IS_FREE_LOCK("umc_lock")' + ); + + if ($stm !== false) { + $lock_status = $stm->fetch_row()[0]; + } + + if ((bool) $lock_status === true) { + // Not running. + return false; + } + + // Running, locked. + return true; + } + + +} diff --git a/pandora_console/godmode/um_client/lib/UpdateManager/Repo.php b/pandora_console/godmode/um_client/lib/UpdateManager/Repo.php new file mode 100644 index 0000000000..b5cd9472a8 --- /dev/null +++ b/pandora_console/godmode/um_client/lib/UpdateManager/Repo.php @@ -0,0 +1,295 @@ +path = $path; + $this->files = false; + } + + + /** + * Load repository files. + * + * @return void + */ + protected abstract function load(); + + + /** + * Reload repository files. + * + * @return void + */ + public abstract function reload(); + + + /** + * Return a list of all the packages in the repository. + * + * @return array The list of packages. + */ + public function all_packages() + { + $this->load(); + return array_values($this->files); + } + + + /** + * Return a list of packages newer than then given package. + * + * @param integer $current_package Current package number. + * + * @return array The list of packages as an array. + */ + public function newer_packages($current_package=0) + { + $this->load(); + $new_packages = []; + + foreach ($this->files as $utimestamp => $file_name) { + if ($utimestamp <= $current_package) { + break; + } + + $new_packages[] = $file_name; + } + + // Return newer packages in ascending order so that the client + // can update sequentially! + return array_reverse($new_packages); + } + + + /** + * Return the name of the newest package. + * + * @param integer $current_package Current package number. + * + * @return string The name of the newest package inside an array. + */ + public function newest_package($current_package=0) + { + $this->load(); + $newest_package = []; + + reset($this->files); + $newest_utimestamp = key($this->files); + + if ($newest_utimestamp > $current_package) { + $newest_package[0] = $this->files[$newest_utimestamp]; + } + + return $newest_package; + } + + + /** + * Send back the requested package. + * + * @param string $package_name Name of the package. + * + * @return void + * @throws Exception Exception if the file was not found. + */ + public function send_package($package_name) + { + $this->load(); + + // Check the file exists in the repo. + if ($package_name == false || ! in_array($package_name, array_values($this->files))) { + throw new Exception('file not found in repository'); + } + + // Check if the file exists in the filesystem. + $file = $this->path.'/'.$package_name; + if (! file_exists($file)) { + throw new Exception('file not found'); + } + + // Do not set headers if we are debugging! + if ($_ENV['UM_DEBUG'] == '') { + header('Content-Description: File Transfer'); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename='.basename($file)); + header('Content-Transfer-Encoding: binary'); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: '.filesize($file)); + ob_clean(); + flush(); + } + + // Do not time out if the file is too big! + set_time_limit(0); + readfile($file); + + } + + + /** + * Send back the signature for the given package. + * + * @param string $package_name Name of the package. + * + * @return void + * @throws Exception Exception if the file was not found. + */ + public function send_package_signature($package_name) + { + $this->load(); + + // Check the file exists in the repo. + if ($package_name == false || ! in_array($package_name, array_values($this->files))) { + throw new Exception('file not found in repository'); + } + + // Check if the file exists in the filesystem. + $file = $this->path.'/'.$package_name.SIGNATURE_EXTENSION; + if (! file_exists($file)) { + throw new Exception('file not found'); + } + + // Send the signature. + readfile($file); + } + + + /** + * Send back the requested server package. This function simply calls send_package. + * Repos may implement their own version on top of it. + * + * @param string $package_name Name of the package. + */ + function send_server_package($file) + { + $this->send_package($file); + } + + + /** + * Send back the sinature for the given server package. This function + * simply calls send_package_signature. * Repos may implement their own + * version on top of it. + * + * @param string $package_name Name of the package. + */ + function send_server_package_signature($file) + { + $this->send_package_signature($file); + } + + + /** + * Return the number of packages in the repository. + * + * @param array $db DB object connected to the database. + * + * @return integer The total number of packages. + */ + public function package_count($db=false) + { + $this->load(); + return count($this->files); + } + + + /** + * Check if a package is in the repository. + * + * @param string $package_name Package name. + * + * @return boolean True if file is in the repository, FALSE if not. + */ + public function package_exists($package_name) + { + $file = $this->path.'/'.$package_name; + if (file_exists($file)) { + return true; + } else { + return false; + } + } + + + /** + * Check if a package is signed. + * + * @param string $package_name Package name. + * @param string $verify Verify the signature. + * + * @return boolean True if the package is signed, FALSE if not. + */ + public function package_signed($package_name, $verify=false) + { + $file = $this->path.'/'.$package_name; + $file_sig = $file.SIGNATURE_EXTENSION; + + // No signature found. + if (!file_exists($file_sig)) { + return false; + } + + // No need to verify the signature. + if ($verify === false) { + return true; + } + + // Read the signature. + $signature = base64_decode(file_get_contents($file_sig)); + if ($signature === false) { + return false; + } + + // Compute the hash of the data. + $hex_hash = hash_file('sha512', $file); + if ($hex_hash === false) { + return false; + } + + // Verify the signature. + if (openssl_verify($hex_hash, $signature, PUB_KEY, 'sha512') === 1) { + return true; + } + + return false; + } + + +} diff --git a/pandora_console/godmode/um_client/lib/UpdateManager/RepoDisk.php b/pandora_console/godmode/um_client/lib/UpdateManager/RepoDisk.php new file mode 100644 index 0000000000..bb6368a823 --- /dev/null +++ b/pandora_console/godmode/um_client/lib/UpdateManager/RepoDisk.php @@ -0,0 +1,103 @@ +extension = $extension; + } + + + /** + * Delete a directory and its contents recursively + */ + public static function delete_dir($dirname) + { + if (is_dir($dirname)) { + $dir_handle = @opendir($dirname); + } + + if (!$dir_handle) { + return false; + } + + while ($file = readdir($dir_handle)) { + if ($file != '.' && $file != '..') { + if (!is_dir($dirname.'/'.$file)) { + @unlink($dirname.'/'.$file); + } else { + self::delete_dir($dirname.'/'.$file); + } + } + } + + closedir($dir_handle); + @rmdir($dirname); + + return true; + } + + + /** + * Load repository files. + */ + protected function load() + { + if ($this->files !== false) { + return; + } + + // Read files in the repository. + if (($dh = opendir($this->path)) === false) { + throw new Exception('error opening repository'); + } + + $this->files = []; + while ($file_name = readdir($dh)) { + // Files must contain a version number. + if (preg_match('/(\d+)\_x86_64.'.$this->extension.'$/', $file_name, $utimestamp) === 1 + || preg_match('/(\d+)\.'.$this->extension.'$/', $file_name, $utimestamp) === 1 + ) { + // Add the file to the repository. + $this->files[$utimestamp[1]] = $file_name; + } + } + + closedir($dh); + + // Sort them according to the package UNIX timestamp. + krsort($this->files); + } + + + /** + * Reload repository files. + */ + public function reload() + { + $this->files = false; + $this->load(); + } + + +} diff --git a/pandora_console/godmode/um_client/lib/UpdateManager/RepoMC.php b/pandora_console/godmode/um_client/lib/UpdateManager/RepoMC.php new file mode 100644 index 0000000000..f91a2450b1 --- /dev/null +++ b/pandora_console/godmode/um_client/lib/UpdateManager/RepoMC.php @@ -0,0 +1,138 @@ +FNAME, $version); + $this->load(); + + // Check if the package exists. + if ($dry_run === true) { + return $this->package_exists($package_name); + } + + parent::send_server_package($package_name); + + return true; + } + + + /** + * Return a list of packages newer than then given package. + * + * @param integer $current_package Current package number. + * + * @return array The list of packages as an array. + */ + public function newer_packages($current_package=0) + { + $this->load(); + $new_packages = []; + + foreach ($this->files as $utimestamp => $file_name) { + if ($utimestamp <= $current_package) { + break; + } + + $new_packages[] = [ + 'file_name' => $file_name, + 'version' => $utimestamp, + 'description' => 'Update available from the Metaconsole.', + ]; + } + + // Return newer packages in ascending order so that the client + // can update sequentially! + return array_reverse($new_packages); + } + + + /** + * Retrieve OUM signature. + * + * @param integer $package_name Console package name. + * + * @return string Signature codified in base64. + */ + public function send_package_signature($package_name) + { + $signature_file = $this->path.'/'.$package_name.SIGNATURE_EXTENSION; + $this->load(); + + if ($this->package_exists($package_name) === true + && file_exists($signature_file) === true + ) { + $signature = file_get_contents($signature_file); + return $signature; + } + + return ''; + + } + + + /** + * Retrieve server package signature. + * + * @param integer $version Server package version. + * + * @return string Signature codified in base64. + */ + public function send_server_package_signature($version) + { + $package_name = sprintf($this->FNAME, $version); + $signature_file = $this->path.'/'.$package_name.SIGNATURE_EXTENSION; + $this->load(); + + if ($this->package_exists($package_name) === true + && file_exists($signature_file) === true + ) { + $signature = file_get_contents($signature_file); + return $signature; + } + + return ''; + } + + +} diff --git a/pandora_console/godmode/um_client/lib/UpdateManager/UI/Manager.php b/pandora_console/godmode/um_client/lib/UpdateManager/UI/Manager.php new file mode 100644 index 0000000000..1060694bab --- /dev/null +++ b/pandora_console/godmode/um_client/lib/UpdateManager/UI/Manager.php @@ -0,0 +1,751 @@ +mode = 0; + $this->publicUrl = '/'; + $this->ajaxUrl = '/'; + $this->mode = self::MODE_ONLINE; + + if (empty($public_url) === false) { + $this->publicUrl = $public_url; + } + + if (empty($ajax_url) === false) { + $this->ajaxUrl = $ajax_url; + } + + if (empty($page) === false) { + $this->ajaxPage = $page; + } + + if (empty($mode) === false) { + $this->mode = $mode; + } + + if (session_status() !== PHP_SESSION_ACTIVE) { + session_start(); + } + + if (isset($_SESSION['cors-auth-code']) === true) { + $this->authCode = $_SESSION['cors-auth-code']; + } + + if (empty($this->authCode) === true) { + $this->authCode = hash('sha256', session_id().time().rand()); + $_SESSION['cors-auth-code'] = $this->authCode; + } + + if (session_status() === PHP_SESSION_ACTIVE) { + session_write_close(); + } + + if ($mode === self::MODE_OFFLINE) { + $settings['offline'] = true; + } + + $this->umc = new Client($settings); + } + + + /** + * Run view. + * + * @return void + */ + public function run() + { + if (isset($_REQUEST['data']) === true) { + $data = json_decode($_REQUEST['data'], true); + if (json_last_error() === JSON_ERROR_NONE) { + foreach ($data as $k => $v) { + $_REQUEST[$k] = $v; + } + } + } + + if (isset($_REQUEST['ajax']) === true + && (int) $_REQUEST['ajax'] === 1 + ) { + $this->ajax(); + return; + } + + switch ($this->mode) { + case self::MODE_OFFLINE: + $this->offline(); + break; + + case self::MODE_REGISTER: + $this->register(); + break; + + default: + case self::MODE_ONLINE: + $this->online(); + break; + } + } + + + /** + * Update Manager Client Online Mode page. + * + * @return void + */ + public function online() + { + if ($this->umc->isRegistered() === false) { + $this->register(); + } else { + View::render( + 'online', + [ + 'version' => $this->umc->getVersion(), + 'mr' => $this->umc->getMR(), + 'error' => $this->umc->getLastError(), + 'asset' => function ($rp) { + echo $this->getUrl($rp); + }, + 'authCode' => $this->authCode, + 'ajax' => $this->ajaxUrl, + 'ajaxPage' => $this->ajaxPage, + 'progress' => $this->umc->getUpdateProgress(), + 'running' => $this->umc->isRunning(), + ] + ); + } + } + + + /** + * Update Manager Client Offline Mode page. + * + * @return void + */ + public function offline() + { + View::render( + 'offline', + [ + 'version' => $this->umc->getVersion(), + 'mr' => $this->umc->getMR(), + 'error' => $this->umc->getLastError(), + 'asset' => function ($rp) { + echo $this->getUrl($rp); + }, + 'authCode' => $this->authCode, + 'ajax' => $this->ajaxUrl, + 'ajaxPage' => $this->ajaxPage, + 'progress' => $this->umc->getUpdateProgress(), + 'running' => $this->umc->isRunning(), + 'insecure' => $this->umc->isInsecure(), + ] + ); + } + + + /** + * Update Manager Client Registration page. + * + * @return void + */ + public function register() + { + View::render( + 'register', + [ + 'version' => $this->umc->getVersion(), + 'mr' => $this->umc->getMR(), + 'error' => $this->umc->getLastError(), + 'asset' => function ($rp) { + echo $this->getUrl($rp); + }, + 'authCode' => $this->authCode, + 'ajax' => $this->ajaxUrl, + 'ajaxPage' => $this->ajaxPage, + ] + ); + } + + + /** + * Retrieve full url to a relative path if given. + * + * @param string|null $relative_path Relative path to reach publicly. + * + * @return string Url. + */ + public function getUrl(?string $relative_path) + { + return $this->publicUrl.'/'.$relative_path; + } + + + /** + * Return ajax response. + * + * @return void + */ + public function ajax() + { + if (function_exists('getallheaders') === true) { + $headers = getallheaders(); + } else { + $headers = []; + foreach ($_SERVER as $name => $value) { + if (substr($name, 0, 5) === 'HTTP_') { + $headers[str_replace( + ' ', + '-', + ucwords( + strtolower( + str_replace( + '_', + ' ', + substr($name, 5) + ) + ) + ) + )] = $value; + } + } + } + + if ($this->authCode !== $_REQUEST['cors']) { + header('HTTP/1.1 401 Unauthorized'); + exit; + } + + try { + // Execute target action. + switch ($_REQUEST['action']) { + case 'nextUpdate': + $result = $this->umc->updateNextVersion(); + if ($result !== true) { + $error = $this->umc->getLastError(); + } + + $return = [ + 'version' => $this->umc->getVersion(), + 'mr' => $this->umc->getMR(), + 'messages' => $this->umc->getLastError(), + ]; + break; + + case 'latestUpdate': + $result = $this->umc->updateLastVersion(); + if ($result !== true) { + $error = $this->umc->getLastError(); + } + + $return = [ + 'version' => $this->umc->getVersion(), + 'mr' => $this->umc->getMR(), + 'messages' => $this->umc->getLastError(), + ]; + break; + + case 'status': + $return = $this->umc->getUpdateProgress(); + break; + + case 'getUpdates': + $return = $this->getUpdatesList(); + break; + + case 'uploadOUM': + $return = $this->processOUMUpload(); + break; + + case 'validateUploadedOUM': + $return = $this->validateUploadedOUM(); + break; + + case 'installUploadedOUM': + $return = $this->installOUMUpdate(); + break; + + case 'register': + $return = $this->registerConsole(); + break; + + case 'unregister': + $return = $this->unRegisterConsole(); + break; + + default: + $error = 'Unknown action '.$_REQUEST['action']; + header('HTTP/1.1 501 Unknown action'); + break; + } + } catch (\Exception $e) { + $error = 'Error '.$e->getMessage(); + $error .= ' in '.$e->getFile().':'.$e->getLine(); + header('HTTP/1.1 500 '.$error); + } + + // Response. + if (empty($error) === false) { + if ($headers['Accept'] === 'application/json') { + echo json_encode( + ['error' => $error] + ); + } else { + echo $error; + } + + return; + } + + if ($headers['Accept'] === 'application/json') { + echo json_encode( + ['result' => $return] + ); + } else { + echo $return; + } + + } + + + /** + * Prints a pretty list of updates. + * + * @return string HTML code. + */ + private function getUpdatesList() + { + $updates = $this->umc->listUpdates(); + if (empty($updates) === true) { + if ($updates === null) { + header('HTTP/1.1 403 '.$this->umc->getLastError()); + return $this->umc->getLastError(); + } + + return ''; + } + + if (count($updates) > 0) { + $next = $updates[0]; + $return = '

'.\__('Next update').':'; + $return .= $next['version'].''; + $return .= ' - '; + $return .= \__('Show details').'

'; + + $updates = array_reduce( + $updates, + function ($carry, $item) { + $carry[$item['version']] = $item; + return $carry; + }, + [] + ); + + // This var stores all update descriptions retrieved from UMS. + $return .= ''; + $return .= '
'; + + array_shift($updates); + + if (count($updates) > 0) { + $return .= ''; + $return .= \__( + '%s update(s) available more', + ''.count($updates).'' + ); + $return .= ''; + $return .= '
'; + foreach ($updates as $update) { + $return .= '
'; + $return .= '
'; + $return .= $update['version']; + $return .= '
'; + $return .= ''; + $return .= \__('details').'

'; + $return .= '
'; + } + + $return .= '
'; + } + } + + return $return; + + } + + + /** + * Validates OUM uploaded by user. + * + * @return string JSON response. + */ + private function processOUMUpload() + { + $return = []; + + if (isset($_FILES['upfile']) === true + && $_FILES['upfile']['error'] === 0 + ) { + $file_data = pathinfo($_FILES['upfile']['name']); + $server_update = false; + + $extension = $file_data['extension']; + $version = $file_data['filename']; + + if (preg_match('/pandorafms_server/', $file_data['filename']) > 0) { + $tgz = pathinfo($file_data['filename']); + if ($tgz !== null) { + $extension = $tgz['extension'].'.'.$extension; + $server_update = true; + $matches = []; + if (preg_match( + '/pandorafms_server(.*?)-.*NG\.(\d+\.{0,1}\d*?)_.*/', + $tgz['filename'], + $matches + ) > 0 + ) { + $version = $matches[2]; + if (empty($matches[1]) === true) { + $version .= ' OpenSource'; + } else { + $version .= ' Enterprise'; + } + } else { + $version = $tgz['filename']; + } + } + } else { + if (preg_match( + '/package_(\d+\.{0,1}\d*)/', + $file_data['filename'], + $matches + ) > 0 + ) { + $version = $matches[1]; + } else { + $version = $file_data['filename']; + } + } + + // The package extension should be .oum. + if (strtolower($extension) === 'oum' + || strtolower($extension) === 'tar.gz' + ) { + $path = $_FILES['upfile']['tmp_name']; + + // The package files will be saved in [user temp dir]/pandora_oum/package_name. + if (is_dir(sys_get_temp_dir().'/pandora_oum/') !== true) { + mkdir(sys_get_temp_dir().'/pandora_oum/'); + } + + if (is_dir(sys_get_temp_dir().'/pandora_oum/') !== true) { + $return['status'] = 'error'; + $return['message'] = __('Failed creating temporary directory.'); + return json_encode($return); + } + + $file_path = sys_get_temp_dir(); + $file_path .= '/pandora_oum/'.$_FILES['upfile']['name']; + move_uploaded_file($_FILES['upfile']['tmp_name'], $file_path); + + if (is_file($file_path) === false) { + $return['status'] = 'error'; + $return['message'] = __('Failed storing uploaded file.'); + return json_encode($return); + } + + $return['status'] = 'success'; + $return['packageId'] = hash('sha256', $file_path); + $return['version'] = $version; + $return['server_update'] = $server_update; + + if ($server_update === false) { + $return['files'] = Client::checkOUMContent($file_path); + } else { + $return['files'] = Client::checkTGZContent($file_path); + } + + if (session_status() !== PHP_SESSION_ACTIVE) { + session_start(); + } + + $_SESSION['umc-uploaded-file-id'] = $return['packageId']; + $_SESSION['umc-uploaded-file-version'] = $version; + $_SESSION['umc-uploaded-file-path'] = $file_path; + $_SESSION['umc-uploaded-type-server'] = $server_update; + + if (session_status() === PHP_SESSION_ACTIVE) { + session_write_close(); + } + + return json_encode($return); + } else { + $return['status'] = 'error'; + $return['message'] = __( + 'Invalid extension. The package needs to be in `%s` or `%s` format.', + '.oum', + '.tar.gz' + ); + return json_encode($return); + } + } + + $return['status'] = 'error'; + $return['message'] = __('Failed uploading file.'); + + return json_encode($return); + + } + + + /** + * Verifies uploaded file signature against given one. + * + * @return string JSON result. + */ + private function validateUploadedOUM() + { + if (session_status() !== PHP_SESSION_ACTIVE) { + session_start(); + } + + $file_path = $_SESSION['umc-uploaded-file-path']; + $packageId = $_SESSION['umc-uploaded-file-id']; + $signature = $_REQUEST['signature']; + $version = $_SESSION['umc-uploaded-file-version']; + $server_update = $_SESSION['umc-uploaded-type-server']; + + if ($packageId !== $_REQUEST['packageId']) { + header('HTTP/1.1 401 Unauthorized'); + exit; + } + + $valid = $this->umc->validateSignature( + $file_path, + $signature + ); + + if ($valid !== true) { + $return['status'] = 'error'; + $return['message'] = __('Signatures does not match.'); + } else { + $return['status'] = 'success'; + if ($this->umc->isPropagatingUpdates() === true) { + $this->umc->saveSignature($signature, $file_path); + } + } + + return $return; + + } + + + /** + * Process installation of manually uploaded file. + * + * @return string JSON response. + */ + private function installOUMUpdate() + { + if (session_status() !== PHP_SESSION_ACTIVE) { + session_start(); + } + + $file_path = $_SESSION['umc-uploaded-file-path']; + $packageId = $_SESSION['umc-uploaded-file-id']; + $version = $_SESSION['umc-uploaded-file-version']; + $server_update = $_SESSION['umc-uploaded-type-server']; + + if ($packageId !== $_REQUEST['packageId']) { + header('HTTP/1.1 401 Unauthorized'); + exit; + } + + unset($_SESSION['umc-uploaded-type-server']); + unset($_SESSION['umc-uploaded-file-path']); + unset($_SESSION['umc-uploaded-file-version']); + + if (session_status() === PHP_SESSION_ACTIVE) { + session_write_close(); + } + + if ($server_update === true) { + // Server update. + $result = $this->umc->updateServerPackage( + [ + 'version' => $version, + 'file_path' => $file_path, + ] + ); + } else { + // Console update. + $result = $this->umc->updateNextVersion( + [ + 'version' => $version, + 'file_path' => $file_path, + ] + ); + } + + $message = \__('Update %s successfully installed.', $version); + if ($result !== true) { + $message = \__( + 'Failed while updating: %s', + $this->umc->getLastError() + ); + } + + return [ + 'result' => $message, + 'error' => $this->umc->getLastError(), + 'version' => $this->umc->getVersion(), + ]; + } + + + /** + * Register console into UMS + * + * @return array Result. + */ + private function registerConsole() + { + $email = $_REQUEST['email']; + $rc = $this->umc->getRegistrationCode(); + if ($rc === null) { + // Register. + $rc = $this->umc->register($email); + } + + return [ + 'result' => $rc, + 'error' => $this->umc->getLastError(), + ]; + } + + + /** + * Unregister this console from UMS + * + * @return array Result. + */ + private function unRegisterConsole() + { + $this->umc->unRegister(); + + return [ + 'result' => true, + 'error' => $this->umc->getLastError(), + ]; + } + + +} diff --git a/pandora_console/godmode/um_client/lib/UpdateManager/UI/View.php b/pandora_console/godmode/um_client/lib/UpdateManager/UI/View.php new file mode 100644 index 0000000000..817309cb52 --- /dev/null +++ b/pandora_console/godmode/um_client/lib/UpdateManager/UI/View.php @@ -0,0 +1,64 @@ + 'disabled', 1 => 'testing', 2 => 'published']) +); + +/* + * License modes. + */ + +defined('LICENSE_MODES') || define( + 'LICENSE_MODES', + serialize([ 0 => 'trial', 1 => 'client']) +); + +/* + * Limit modes. + */ + +defined('LIMIT_MODES') || define( + 'LIMIT_MODES', + serialize([ 0 => 'agents', 1 => 'modules']) +); + +/* + * License types. Offline licenses must be 3, not 2! + */ + +defined('LICENSE_TYPES') || define( + 'LICENSE_TYPES', + serialize([ 0 => 'console', 1 => 'metaconsole', 3 => 'offline']) +); + +/* + * Extension of digital signatures. + */ + +defined('SIGNATURE_EXTENSION') || define( + 'SIGNATURE_EXTENSION', + '.sig' +); + +/* + * Public key used to verify signatures. + */ + +defined('PUB_KEY') || define( + 'PUB_KEY', + '-----BEGIN CERTIFICATE----- +MIIGbDCCBVSgAwIBAgIRAO+uHm0PBdm1YtvKjFwNqg4wDQYJKoZIhvcNAQELBQAw +gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO +BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE +AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD +QTAeFw0xOTEwMDEwMDAwMDBaFw0yMTEwMjAyMzU5NTlaMFgxITAfBgNVBAsTGERv +bWFpbiBDb250cm9sIFZhbGlkYXRlZDEdMBsGA1UECxMUUG9zaXRpdmVTU0wgV2ls +ZGNhcmQxFDASBgNVBAMMCyouYXJ0aWNhLmVzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAvYafsbq6mH/GP9jc1zAHXeuh7kz8WYitCawXx5CYUFvO0ch8 +H5v8a7aiLJ+pgrgFyZeZ489a+FJW0wddyMGnch+lGU5BbvoH91BMjZV1CLTOexB2 +liid9aAEasFRBWkwIGMo4fkYFjBwBNofFd8y8vUu9550wZ4QbcshNrhk4E932BuZ +P6WWCR0fEoyP0mQRIRMUTAT5WeOYZHkSIJFiQ5JYH5ClVEOogJkO9QTn5t6GT3Py +SKhFYqskOOtHODztXdX/qKE+wZ2yssOEie5VvfmcoTAwkwLVZAY8Q7wqjtkaQ9kv +weonYXq40KpQ2fksPP0x1FL0rrfsROL/tyv/wwIDAQABo4IC9zCCAvMwHwYDVR0j +BBgwFoAUjYxexFStiuF36Zv5mwXhuAGNYeEwHQYDVR0OBBYEFDxO4vgu+Bht6JnH +Xv4uwf459n7cMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQW +MBQGCCsGAQUFBwMBBggrBgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIH +MCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEC +ATCBhAYIKwYBBQUHAQEEeDB2ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3Rp +Z28uY29tL1NlY3RpZ29SU0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0Eu +Y3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAhBgNVHREE +GjAYggsqLmFydGljYS5lc4IJYXJ0aWNhLmVzMIIBfQYKKwYBBAHWeQIEAgSCAW0E +ggFpAWcAdwD2XJQv0XcwIhRUGAgwlFaO400TGTO/3wwvIAvMTvFk4wAAAW2Gc+pN +AAAEAwBIMEYCIQDweXVdMk4MVPxu0H7MDSs8g9FFLfjthnFv1GBO9wpOvQIhAKvI +fGbNpA2GWSP+L+opz5KnIwoJSL/JD7CMLbboexZsAHUARJRlLrDuzq/EQAfYqP4o +wNrmgr7YyzG1P9MzlrW2gagAAAFthnPqagAABAMARjBEAiAWnW/bqGiL7elEQASm +YT6V0oQOviCJ4vYi+ekYtyHi1QIgDb3PCSOf9TZXnCx8d48NrD1OvabV9LaOimVF +NPfEZQ4AdQBVgdTCFpA2AUrqC5tXPFPwwOQ4eHAlCBcvo6odBxPTDAAAAW2Gc+pK +AAAEAwBGMEQCIEoT2BgNg+WrJcqPeNDcBfiWyT8GoJyscj9UxpAXmMJkAiANowLt +4mz/mc4uYjRxwZnA/BMZgOVPMLtMwaA0b1C32TANBgkqhkiG9w0BAQsFAAOCAQEA +MNwCq90OYGnqoQ4vmX9BPe7e5qoQ7asU82u3XH/nA+lMuD5D4pKHFNFcA/KZbmvc +OXcFt0CwbeWOuAbBom8hvFaF8abtkayG27pknQSv4i5YRKF1pEx3hrMgC8c9e32e +ebGE1kQoj1TQkf6e0t7Ss/XvdnSITSo5Onio/g/dUv9MFI1bjcf+8gWWDueTOKyt +FcVU5xb8g3EtXju01C70KVcN9SgHzSmyBrcBSEvJQ7emnZjyg0xdmlytvSo1Y7jf +JWkEbLlOEtYdkgyWy1ZFi/oO5U4UR6X6xgHiJTRZyXvPoS3mk7k+YgAkdOad0vEI +5JdvxQyReDoCO3u4FtKHEA== +-----END CERTIFICATE-----' +); diff --git a/pandora_console/godmode/um_client/resources/helpers.php b/pandora_console/godmode/um_client/resources/helpers.php new file mode 100644 index 0000000000..5ea8bd47e8 --- /dev/null +++ b/pandora_console/godmode/um_client/resources/helpers.php @@ -0,0 +1,182 @@ +'). + * @param boolean $relative Whether to use relative path to image or not + * (i.e. $relative= true : /pandora/). + * @param boolean $no_in_meta Do not show on metaconsole folder at first. Go + * directly to the node. + * @param boolean $isExternalLink Do not shearch for images in Pandora. + * + * @return string HTML code if return parameter is true. + */ + function html_print_image( + $src, + $return=false, + $options=false, + $return_src=false, + $relative=false, + $no_in_meta=false, + $isExternalLink=false + ) { + $attr = ''; + if (is_array($options) === true) { + foreach ($options as $k => $v) { + $attr = $k.'="'.$v.'" '; + } + } + + $output = ''; + if ($return === false) { + echo $output; + } + + return $output; + } + + +} + + +if (function_exists('html_print_submit_button') === false) { + + + /** + * Render an submit input button element. + * + * The element will have an id like: "submit-$name" + * + * @param string $label Input label. + * @param string $name Input name. + * @param boolean $disabled Whether to disable by default or not. Enabled by default. + * @param array $attributes Additional HTML attributes. + * @param boolean $return Whether to return an output string or echo now (optional, echo by default). + * + * @return string HTML code if return parameter is true. + */ + function html_print_submit_button( + $label='OK', + $name='', + $disabled=false, + $attributes='', + $return=false + ) { + if (!$name) { + $name = 'unnamed'; + } + + if (is_array($attributes)) { + $attr_array = $attributes; + $attributes = ''; + foreach ($attr_array as $attribute => $value) { + $attributes .= $attribute.'="'.$value.'" '; + } + } + + $output = 'DSr z1<%~X^wgl##FWaylc_cg49qE+ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XP}#GU}m6TW~gUq zY+`P1uA^XNU}&IkV5Dzoq-$tyWo%?+V4wg6Nh+i#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaoz zEwNPsx)kDt+yY-;xWReF(0~F4nSMoLfxe-hfqrf-$X{U9#U(+h2xnkbT^v$bkg6Y) zTAW{6lnjiIG-a4(VA$ce2&53`8Y};zOkkuW=D6f1m*%GCm3X??DgkBmQZiGlTpis^ zjm=CPUCo`$U5yM4EeuV}fV7jNiHoy|rHMJr3~YLxEX^$q4V;~UI^7HnU5zYV9i5zA zEnQq(jEtRJElgp0J@bl767!N%VfJPM?S<-f!mHQHxhOTUB)=#mKR*YS0s=DfOY(~| z@(UE4gH08}GxJjN%Zovg1M#a%YEfocYKmJ?ey##IbgeS6*iP8j5WOkngqS|iG5VmS zfs|BWLcsI~V!{(XkOR*;sd>QsQUuHxUw?V2F)%PL_H=O!skk*~ioeT|K!M}8%`TdL z6H#3h9J?r6FmtMsQsAjF&82U&To;8}EpeXa>vBE781KG$&wg?b zD_g~1PBqUM&b$M2+;{LL?fJ*_SHU@Teq&nOKFyUa-U@nu1PffaPt6I{*WVDJA z7K!mTygR{8`M@fnZL1f@yxAt|kbdTun=9iv-jCW9zp~F6UX@Azx~g;k5tTb(p-*gr zHM-h)6Zy{@KjwCLB&qr)HPCTQYJ;EVGC>>ehn=ss@JyJpy)Q3xp7)xq#}t`LcKp{% czt6OV literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/icono_cerrar.png b/pandora_console/godmode/um_client/resources/images/icono_cerrar.png new file mode 100644 index 0000000000000000000000000000000000000000..124540abaef8b148da58df2aedae27feee85f7d3 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^{26dD35K0BH?FdSU!z*L}Wz}CUW zp}kIYz&Mn+l3;vt>lkNs3aU{SjQ~8V0J=7FTa38i=d8# z!4C%|#*bK>zgsMBZ%}08Vfo|2A@KD1_X`;Zo(hTBOFNh* gd=)PGbMOh{js6Fljs-?71p0)*)78&qol`;+0Jt7#l>h($ literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/icono_warning.png b/pandora_console/godmode/um_client/resources/images/icono_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..c280443d36b0acc7b46c0d568a27609b528cea45 GIT binary patch literal 733 zcmV<30wVp1P)@Er35zEba9QymT`|Zs zfB<431n`+42sGgX6E;UeneV}l1WGpGG9ILn5sT4|K)fH>n+MPotVao2pq-9r3N|3I z17QJWh$NT*r9S{QZvY4&Mm!D#IldlA2;`JPpr#90!wIVCJdiR#Gb<5@{ed_DP23P< z7~ZHt4p$uV2bl0_Ml#$0hm->o192b#mjnw^D4)ld$B0R60fm#5FnHen4p1# z3)mBtkO*WLK|E>W0WsMbU&2acLMn@~feTO8tnhd4r0Cq^p7mw*@uHL?g)M(6 zVe73B2|f^8dtz(jP?C)(1>kxCTS2rQUwar=twdrr+yK-Uh_$;1l`upKT6~}$S^|PB zFCfD54^T%35>**N4WCa!h~V@wv>y0CR&9vZ(u{|u6I|Ku0o1~c#N;jjZr1>K)l6^@ P00000NkvXXu0mjf^z$2( literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/pandora_logo.png b/pandora_console/godmode/um_client/resources/images/pandora_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0545d22bded7a969ea8b60fff2e239e643f19a82 GIT binary patch literal 3253 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 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/spinner-classic.gif b/pandora_console/godmode/um_client/resources/images/spinner-classic.gif new file mode 100644 index 0000000000000000000000000000000000000000..1560b646cff2cc4fd292d7fdb6f7adc7eb484b4a GIT binary patch literal 1737 zcmaLXeN0p99l-I&!tEQiv~W&~lv_&SmI|fRw)eE0zR=T_(^9a!crF*Q_O?JP*50BW za+x#6J*VfyIVLB@`G?mSW{fe8%LJS?j`_k2*Er)fUT2(h#u;OrF~)0*amLK)uKSPd z_ve%6mwfVklPAzh+MD7sAOkM}c>DG(0N}=r8~gU{i^XCdkH_!#XEK??hY#PmbLYsB zBQ-TOdcEFcGGQ3zcDqxl)R{A9Dk>_n+3b@iPo6$~y0EaYd-v|n&dz8wdiLzuYuB#f zIId7A#>dBxA3q+6M7D3=e*gY`mSv?<>Cn*7!Gi~r$>gb1r$~|%i^V5SoY=pAe_2@> zpU;2v=+TQ8FUH2ka=F~gmoFiN$BrF){rdHrH*e0LKY#i1-Mo2odV2cVvuD?@ zUw`o6!QH!euU@^nxVSh!KY#Duy<4|#J%9fE_U+r-wrx9k^5pF7Y2!hz{_K}ehqtPf73O8@wtkGyFib|)`J9qAU_vSxN)!U+Q3$?~abhem{rh;Yf zPOJW1?#m|PBZ)!HR~tu$H1Sk?EIk|_G;Yi!he6f93Ps{~w+!$1-$w+3U+n~t&M}Ot zdSwI42rFvpj1a?ZjJW9IPwE??&E&#p9=}A*VhFMy6cm+?16Q*P7E0tZ7Ed$$XgM+i z94(M9MQ3b;8w!dQGl;PjLVE4Y?<_P{QXeB^>`CbQFBvD_OT*#R6y9XGLopA~j#=m{7->pd6t>(Yi=3 zP}uo3V`jwsY7W}yU|ZK5z%f|Z?m9z~uy*yuIRu5uFfoVs{~5H(gmaYV0%%rtm$QvL z{~uwK+1e_?@y3>z>U)~d^%(jpL%ul0QBAF>DcN4YPSb$5Y$@O`J^)4H(vAG6fyV-$ zpp9QFT`ozb8GCfYP#22&x;IILw01D;WQQ6$Rd7I-5KT1ikgn+a(|F~;N5`@Dq1(|Cs^MXKy8P08>2 ze(zaIH}OH&tXIpzRp|f=nv{at6&u#2!XbvJ4yIM4%e%g~!%0&*vz<+T(e8jvJ$eoV zB?T~K5as2YK8NWfo<~YPgTv`>IqKsqR5<(dp)cEDK=00n>#89cvunA{%L%$M)}%E- z+Y7LTL0WhsE#TMm`-=Xj>PZ!`)~ z(K&8wwg6)N&3|FkYgh7U3x!zd`r4lqi5ZME;n0{F5#}>?i)rEJH#GeJiA|m+eZ8DO zSU?f>fl#Gzi`dPes#t)+aBX={4?$xdcO&byCid?1(awZqf1}Z}+v{|OO zt|T#wanNsY&NCKu;zG`1RYSh)xbINpDJ|DFE; D?d&fs literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/spinner.gif b/pandora_console/godmode/um_client/resources/images/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..8186b0c050b2f21f5fc1214b3e6c860f251004ce GIT binary patch literal 432 zcmZ?wbhEHb)Mnsj_{hLuZsYL(|Nj}Y<^V~>|J;7AA;Hd$0j@@R2F#2M3=E3@WSvSg zb4nD-GfOfQ+&$eCeDljPQx)7(6N?l~^bCLsM12!eQWcUa6&$k?D}3@3Q}iM|oD6yK(JH6~0Z3sUlMO5ua-NPWfGaG)pHb==gfwJFl+{>Rqvu3O@J!8=0e(L3?nLra)tix)e1JtWCrtD&u zuG{!)XR6N%llks)fm$W%N7t?V&9~8P_SU)me>XjznBpA!_L;U<*$G!+fjtRI=LAH5 NF^MoRScAe13;=`*poRbd literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/pandora_console/godmode/um_client/resources/images/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..954e22dbd99e8c6dd7091335599abf2d10bf8003 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEr#)R9Ln2z=UU%d=WFXS=@V?HT z#xG*`>Yvsgk=}99w^d^D^d*@m74oMo<%#FcopJf?u00-~YVKV2wzrI*_R6;UORMea zBFVSEnN~eiVA6V&z`E)YLz5Aok^D)In}Yn=OzDpgR5Wv0XfT8pOkmV{sKAJ-PO9#T zZK}IXj&Q-V!U)!LcB_3K0&C*{ literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_diagonals-thick_20_666666_40x40.png b/pandora_console/godmode/um_client/resources/images/ui-bg_diagonals-thick_20_666666_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..64ece5707d91a6edf9fad4bfcce0c4dbcafcf58d GIT binary patch literal 251 zcmVbvPcjKS|RKP(6sDcCAB(_QB%0978a<$Ah$!b|E zwn;|HO0i8cQj@~)s!ajF0S002ovPDHLkV1oEp BYH0uf literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_flat_0_aaaaaa_40x100.png b/pandora_console/godmode/um_client/resources/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_flat_10_000000_40x100.png b/pandora_console/godmode/um_client/resources/images/ui-bg_flat_10_000000_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..abdc01082bf3534eafecc5819d28c9574d44ea89 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQY-ImG zFPf9b{J;c_6SHRK%WcbN_hZpM=(Ry;4Rxv2@@2Y=$K57eF$X$=!PC{xWt~$(69B)$ BI)4BF literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_flat_75_ffffff_40x100.png b/pandora_console/godmode/um_client/resources/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_glass_100_f6f6f6_1x400.png b/pandora_console/godmode/um_client/resources/images/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..9b383f4d2eab09c0f2a739d6b232c32934bc620b GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour1U*q978O6-yYw{%b*}|_(02F z@qbE9)0CJMo;*v*PWv`Vh2h6EmG8IS-Cm{3U~` zFlmZ}YMcJY=eo?o%*@I?2`NblNeMudl#t?z UEim$g7SJdLPgg&ebxsLQ09~*s;{X5v literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_glass_65_ffffff_1x400.png b/pandora_console/godmode/um_client/resources/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_glass_75_dadada_1x400.png b/pandora_console/godmode/um_client/resources/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uP{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/pandora_console/godmode/um_client/resources/images/ui-bg_gloss-wave_35_f6a828_500x100.png new file mode 100644 index 0000000000000000000000000000000000000000..39d5824d6af5456f1e89fc7847ea3599ea5fd815 GIT binary patch literal 3762 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 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/pandora_console/godmode/um_client/resources/images/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..f1273672d253263b7564e9e21d69d7d9d0b337d9 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l%l7LV~E7mxPQ=F85a&M@g_{ d|GeK{$Y5lo%PMu^>wln`44$rjF6*2UngE4^EGqy2 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_222222_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..b273ff111d219c9b9a8b96d57683d0075fb7871a GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_228ef1_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_228ef1_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..a641a371afa0fbb08ba599dc7ddf14b9bfc3c84f GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@e{{5C=l}o! literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_2e83ff_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..09d1cdc856c292c4ab6dd818c7543ac0828bd616 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_444444_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_444444_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..742c0acb7defbcb8c7f08ed3f8ba6232c421e334 GIT binary patch literal 3767 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 ZG*}TEOr00VD*gK}H8HTzuhm1x{|9PA!J7a8 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_454545_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 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 Yuo8Bd1|N`9{`X&MYG`SI*GDD(2k58MI{*Lx literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_777620_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_777620_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..9108efe6218abc5d9ff51dbd3fd21f043c92b461 GIT binary patch literal 3767 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 ZXs{A?m?l4vQ~q}^H8Zj@tT#X={s*p<*tY-x literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_777777_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_777777_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..e59371ebca8d8290698875814ace90392db73bc7 GIT binary patch literal 3767 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 YR>BU`-~)2X|Ncu&4J{4u`l!VJ0M7OJjQ{`u literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_888888_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..6d02426c114be4b57aabc0a80b8a63d9e56b9eb6 GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_cc0000_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_cc0000_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..198f485c2c86f985791338eb84dcfed5186cfb89 GIT binary patch literal 3767 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 literal 0 HcmV?d00001 diff --git a/pandora_console/godmode/um_client/resources/images/ui-icons_ffd27a_256x240.png b/pandora_console/godmode/um_client/resources/images/ui-icons_ffd27a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..e117effa3dca24e7978cfc5f8b967f661e81044f GIT binary patch literal 4369 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ΜToWuyf#zn#5-(qaK~M-6YBOFqXwa+zG=JC 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

b?ras{Yz8>@&6LNbuYHY6vVGD}|LRcR zBzd(`+`?dkizIPOM}Z0LjFtF>bd@`m?cvhIQrYwjuP=`YwbP;-{?b3Rk0{~vnus=X z<7p#FVl51)(a0#S-vy`q4A4k;u~GJ%BK2NB0E>kNF3)P}4HDPEd>#T4f0P|V-@W<> zYv()m5U?-i8s4^LGtG!UrX5P>KPt(=B^yP7h{P_Dz51CMAay+V4`VcRQ4=LX(FYcG zWN!!su2ZK>lDH$fVBG4(=J~eJH4AtDB>b7+KyK!b8{r3Z|Imn!lT}JheaA)^P}chyVN|~43gdgX;r4}nC-;wf z?mtCBdzWwCr>#2E%9_t=J6Fx-j-X@D^qBe%{WYA&Al4w2q|^f-7` z)AC9i?c+ zTzSrOzZ_C;?~iy}x71~wk$BU&gc;JGo?7scq(>1-?T>*`DdtaaeXduQTesssG`pH* zF13%;N(v4%N?KEp7JX>s7bXH!XIB^<(vDhFN=sA93H>5vX~4HFMQ!)7?4VDa9at`0 z_6A`zLNI&bs>scx?b-Rd?z=Mjf>aTcG{1E6JYG|ggg&Xh#x<2NAnqQ@{OA7p0&ZW< z=AEMrao%@YROMXCLLAA(k#1nyHj+}+(nnou)SQbl)I3vsrZ*4?RLAqdSx;VVud>}c z_SUBkoxJ9SH?}7(2%rB@_~bBUG{VlfIlBa(`-dhjjx6Hm?kvSbmE$GGoD#rRjg4da zN16M-57gv#8!w;CDyBKFW)XJ05*4+1)sVh%1Z`U7?&ttFGm2I?-e_F7A1IR)|DIlR zhD#p44~qKq`qF91;OY5t%i^H$IgrJuq~%UPzgy)!JHgP|YUZHG-Z{?}u~l&UA$REf zVV=qR8TdCdtJ!ud?o5L(20{_pujsHDnj$ynUcZc`Fjr(dI;eH!cF%D8i3D;Z+_BP*#nEjO~A;4Y}iicE` z_B@RKdCc8sOCVT^$J~iqwY;b(pPjqSi)Ty<#UwlrGk+~s&pF-bNe>WNzPMqKyU~#X zVqp{%M=I!pEFd1t-)>aQEJXbcNpy%p3xVcp2wjj8(C`7J0B+hGH5AI6a>mAHQL!WJ zRn0ZXxK2amhf${BGJ^0|o|JfUze0e<=N`Fh0c={7!k{%^TLx9+nzWcH?!pfa7iy(M zeaclmDngwmDG+%tR76zAl@=E0vt4=lym5X-l{OJW z-HTHCh_4l-r(GCRW2_uKl{Mo&$OWsbs#~cWaR5`_on2J$0H&{9qhX+W3`C~=;ZjbM zq`UoAqigk0{miVq8eEGTS7bj4RGCuSJJ#r;&VONI3I^5TRO-50MT3VB5~TmzVp>E>*g z>EO@ZFBwtVdAI_?iJ~=6IFGFr?xNI~)XPJIe2C#XT#0_+ao90(^FpDY!AY(M+v38p z$4jDl0UGcz99)oUY!B-YAIVmIHBx=_r=*VDmq({K9C2JZE(3)^4r_Xyi%H*HkSZWk z^}cjnh~KHSgsBwYPS5`hJZKU@25E)+O&Rz~h%}`8NPPTjhq#JFD#TG0y3R}4? zW~SH-dC7Q{Xr*fZ{mVfT%CP8`*9PEChlr$M_WRHVi-Rrmb{9s%QQ)w732!a6%8k}!hj)E7q zS)E$(;BO$s3v#(tnzr=pti`U`G2if*^bERUbk;4IluQ_=IAmao38oxU>32iQA##Ra z9#L^&oH(H+Kt_G44E-~OHS&=scZ`i;D$b6AGHOZ|;w(YUEI@G&FAWv=Ssa`bGFaA( z=*TxcFBn0F(c|4T*S-h7JAdaA8#@jnQTjx_CQU>XU`{DbHH%JLnP{87eiQL2rEz<% zf>@d}gIdQsGLrr!mIVnAbY-EAU)*o_)C2p6Hjb*yd3nqKl=U?5a4NI)-%O9x|9PmLKN8xP@g!_y9mynq}yJq$E&* zASTbJ%ek`85Q>hbS!yGjpCXdP(FVzkzC-zwYl`?k9`uN`1y*BIOdVvql=1u z+SvOhFQ|cPYIz8lY;L%)oNYHNIG=Wb&lDdwiP3;^z{{?2*&P#yk9B4bUcp*0cI}S0 z!G{yR8l?rtjGhn)V&Geb;dO5~S}=WOfukT~3`>&(##I_$Jc1*Fk?y+q_<~(?G$zN3FzW?)rd| zv=0Y7p~L_Yx9lk620eI4y1g-!mMEV_x67A-qwQqN4sGPtN4D=`V0pWWe|Uw=4!k3U*RA)R>i%OwW3 zmm_aS3tVsrQaAEssxX!G-R>ye6DCgA&g1c{5H27}G9TeLfFVeSFIHG&n;W5xz^7K| zpThXYgQFi6SJ$N8x^Ck${-WDKf33t)!*{+&<`Sq#C}57@YV%Z79r5HvQTDH$IuvWBH<|K>Q*iDSa@>!Uq^;}R4-Mh4E_WN4d z>#t*$cDZg%A+qRAzM$u7!bZu)sCKDNr2n8)Yk$%zW3-f0jZxPsYfur+PM~%aDY20A zCM33QDyB#8&1PHyEVl4FcOWua^hr6e?l|5cwYIip%q#!T@Gsk+vo3ne5FYLYp12Ke z3i~BjKoIWi)gUHa_Ilj6b81HEt%@;~>}V$ynh{EmD0&0b#*y9wC`aKbvxzev@D8{$ ziBbKfJx2sL$0u|eGIq+cxt6)0?DiV%ADRFsd91m40jm6i%CC|(6}uX>z1T7w<%vZT z%!!<=2e8sk`|P<2ybhfrA~Sw`9_Wek#=VwojnSKDa&3Z(2=e@pcU(AA@tLIkGXJ<_ z`d%P5k;KF>$LbR2y(8+2B^19jMH%2;J+?Gn-jd{6gZSB(lgwAMy*l*@orkHQfU>=Q zOpJZ7CK**~4tPCNCVK7X@yl40DNCZI?K}<@{aaRw`AUq3{hZKRST|jQq@AIAjYw6S zIU=-3BMu*iH%5TuD8;Ei>FG3a&Kc`Ux}Ck}Fq^(%Y&d$pJYV$Q=^oR-Mc%1+`k-Y! z>bly=_TH0zx@VbMbbBLqO%>pb2?A1)M z#c|+uqEQ2bANoF$SyX%>kHtLsnv$u*hB6vcK70e?56+luwvQx-tE0q$WaHE@Q86kB z)7rIF`qlBpgm)f+#j+4@j$KwU;av8g+J<9qll;w@>b6YN@L>z{{&jzuX$wUVwoVR_^DWgc)AKtzOL3g_jDl+6e3*2h9UWEQ^$gWV zOA?99WE*^7mJE)x$Z@LP$YzVJOWfy8b)cCa2|8{{B5z)L5w z`R-kYFKsUi)azATB2nSeEgekR?Na(=akcI4S&(MQo1};Z&U^KHOUN)Ewz7O0ZdY3@ z8QqOSAIP)03O828Lddn-mEI^eU$yghNyTn?N4S8OytOXHqDzuZ(vV$;vEt)(+B<^X z70!(+bZ!q^nR0VT4?9-v@=sv(9tib;mm+(^=zCBQMqyJ#y8XkkdMLmIzFRKTiwsa4H9z7D1Dn zcJt$V&O3KLN!(V2sPY21lT-O|p}|~SIQW2Ar?#^PS#`WOvC;c+xT3pIqG#N=7{#mL z=!zlQv#~p>QcQ{(Mg1taPJ=o5lBQapHYlWXDh8pe1$xw*9e>SqKrrmgq{?#He4Z1( z#jF+%crn!xPOflv`W`kzh`(^8ph66u z8%|SU><&yY#A($%xbOQ1DFAOOGodZ}b*?3?0oU<-gWiD_9XWzVTyeu0V`*jF;hV)> zMS)n?eZ7MVNo9Q2%p=h4~^Fb=0B zj( zSLCRHTv@vWClO(c zJHbhJHglZ}#zY^t#uO*&D^|=WoZI6AuTg}+veNVoGB)sP_qg#d%Rp4G?mhMXd=Tai z&R|SDDF-gi1wY31ucf4QrnC@Twqwq7A{1D2@7M*t*l!Dr*$YkNuTVB;*)?}5D2pu$ z0jLI-q5dW1mN9-~5d6uWsIRlG;7Nj}4Sf2-ET_P~&8!bJ4;u2A1Ur9|5pLd%TQH`h13 zT~*CWJXA|XQ!z`VoS9PVC0WLFRVMmH!Tem~4=H(u9O~^q9~vu4!;y-2>?$iq9iz}t z+laF6K(7Ln0Nc_P7r{RD?%XAFIrW52E5|8OQKZ+%GxD95t29h_jp`O9VVL5r)Uu!^ z1{AM}abt0Y^@Q3d+dLJVy}S&|L=CJv{{Jth(*NeUs7=nxoC9avU{e` zOdIx-6O((Nn#pb9v8uTaVe|AP*Nlfog{LgNht^j(omzi(cuvlw*yhnuRIvGt>dk+L zA%}O*AOf0bys`T8FkJhG#K~RyfL*C!I?N!2t{G9snn2$ryQ(3~Q&jfyTc1mgj&1VQ zI_oy4lj8kKvH*O3Tub>ejPR|KbH|@EE(KrslP@m}X7s|SpD-RGj^jMbZIwe7hz3xw z0`jE#I5)COCDTo}WWI;Pa=@SnlnMjoo}{OD*NVtB6RW;8JiFiuCc632>flh)y==StqDeTx*m;uKDBk!m;_Cvl@GBFNp=$V@xJIcT z@j!AyJJ&hYdZ(vj0c#K~N5AyRdRcFNar6FIGS_t86`)va*^g-7W{9LV$A2=uJ&jfpEo)N(AvjY`Mosw zD?BgpOd0pj>!t;MD_;=W^dl+X$IZIXEoMb4yGQL z{>fkut%uByO!NF9Y>mg}D$_f7q18lm|JGjm+nI%w+g1cx@Z~Lzbb|8!}Yy-oxUG5&r5h z-sm6<#cp6~=pJ}HC;wz|+u4_ zqjOTr-vvJLHS(uP^B=;q6BYAB+cjT3m&g za!AO{^pzA?bwKC3&<2?zb9Ym6GbclJp;QF18P0}d)*u4IJv}3ysW$kf23zqJ>B4A| z0%^S~&!>I5$k!sBB(g8vKbx_a<^_@{yH@3;mpMn&2sy_jp_YzA9Lch!`JBNI*YK2w zkT57YTO=TN`I((IaQRLE()Cmg=|7}G6|Js6TzA}BSQnz#j1XN`BJ+=knG+Bktd@$( zsy(DiHP=@3ZKhAt)MnS#6`YM`8d9E?9+VkpQ@x28O%_JeqsPp|&0+@!aXW;pf2Dsc zy-lGCN_<=PJP^Dp2X0{f@IX$3EbY+Zx-JrPvg;!r>&>&%n8v_b-#PU3sA|1`9ha!8 z$PB9-a7OnrU?Honj-NVF zWk$`5f_14@hP_%m_r;I4t4LnBIAT-c6@}T2XoqK9*ZFOP&oo^D9%?>UIodm6fi3V1!NG1kDO#Lo!2 zyjI+#$j7d78c^G25kt@Bpm8PNy`@#o(|2F71hn$`>nL6WKp;(Q`0=?p=ixzO`_<5; zfB!%~KE_{S8cSM*z1h~iLh+sr4^)=FU7YVXDUw^De7IH>TML|VvIK!1T~L^8hn3g7 z1^?N{+Xb-sFiZl>LThvHsY0c12*gWwNgg0B%oj?fcu z+_Br+*mrLkOz{&3Hhv=9dIZxuG!DigCWZDLU zPkIK0U=OyaNf$X>sU4A|gBN0XpGMRAnb5_Lu^k3PogpYUkh#~pL8BxVRRBoyOnFSBRwR$Fw6 zI6jHRIs%1H92Tdj&K-yQHwN0l2=U%Me6Ui$*P5nXmRqV;pc13Rv6=kwlXOK46QK_t z=pk$2BTU{Q-m(Lq?6I8V4AE+Q_ot@I?k!> zmchx}(0RxgH(R8}=AIh%Wtv`cz{{QPK z-v38Gkm$`fkBZ8-yhlZpbJrd}jI~ojhkmQN(8dyE-IchCR=)UCV$4i(+?3maZe)HT zi{On?Vypvp6BW$wouhcHVgn(i;=H2ka+evvP+-sE2d#MIGCC$4H9V%UFecy1@BcI+ z@js8?)b&r5H+Uys{;3nD01BkqJ`0a@^&J*gbuKhWjZjMk9(2vGSUFM;Oj#X2`z8bc z06~BIQKgGrQ4rQcYl6zA9$%!xwYv}b`k%^?LiD_rDke;YYb>NeqhEK84WUzw^GPx= zNw!xKXdW0aW@+)>qFl$xMCt2^_Dt}jKV$o zQ~i<1CD#pmnUPClU}CquyNDTm`Qwuno3quAlDQy4fb~?w8|S!m^H^f6{>GltP4cAL ze!3O@({WfcO6}5)veBk%f!EVLV70o#1+TVVb{Cf06APAgbuo!ZoL(3!_no+1C=m`@ zH{2yB9~k5@$LDmlSr+iS7Dgr~dmklye~ve}Z5?{wNA&|tLz+3ybd?C2$lP0fl6-pf zu&_yI9u@HYW~l%E_H~$SJezO-Y*tsYhF3{H~gkLS5r+gJ&f0 zc2|uqHoX0op`)^^vGE7i`BuCW zml752*^OC31Z_~X-`7vYeo5Dcn!^=MGbg;)OCCr~DtsZ-3C}uEYNI2;baXnMst2Gz z0U_b`h-;y&J7aHhD>+}Te*0JZHKA?n$676pJn(z@f8Mr(zIs@}>jn5dVnCy>1Vlh2 zmPkJ|H)%dub~>b-px2I;ptG_xcT2^!Wu~m`R>+phMb(IGjLy2Ti^c&%<=5|y^vs@1 zWp#U@6o9#42&pR;M{4ZZru3x5uzwDkRYxF%@B+eLgW8ZQkr)(SHf20FsC&LSnA)mv zSp6NsL^z4K9HdwK7nb(Gga)`y+cijCV6V23k)OaYNf^m-erGS5$SsZE&*ng+N7f;a zEt`)AcH9lNmHr0yOD{oZ`?~16^hxJ?Y?lOVYd0Xc!-6S$7=G^Goa<=e`mG>_g($LQendyOw+bU24L$Gqwyf1ddp0w3I3 z>)ir#l-H+}1S4vnh-Ettx>0t-()5hh*{vq|qzP?Mp?U|#2V9H$L(5;DjSh5E zn!jVxHfEk1Ynt&Zu(fD`EuLGdjR|j<%hVjweH;guiW6l znA>2h?{T>TbQx|o>*Mp;3m&2rIig6#qCw5;HenBEI0hVDY+{M7BOp}YJ>uR}zjT}o zE;`!EuN2x#DZCY>Aw6wL{4RD>;@a$C9uAFzc=p{v;Qz+a_a#3!jr-uX^NJbzeGqBb z)3O2AFDa{Y0q09Tu`4A88_#67|7^D-&oT+dkJ5}C7^B@o-S%y?-~-?w0b1Lk?ohHt?t}Q*0E(=eSXro-GRt&djkJZtj3k{6*|`qY z751CPN%tZ5H)WcoY*s(e+(`IknQ^$nCTiGN)s07HqTuQCuZf3JDBodbtr9(xfhV>H zE6xY+tpMpoj<>)o5tU4$2vcI9``DH*xDlx2Sj_ywFnFc2fW}ZotF!K+W`U-V@BTch zSVO=?8;>mkl&5WNUO;u(gx%I>5QNr?qHp zck8Aq2FJ8^at;2h6n!;T?ficGnRtue<)lTxPQ5 zl4Ofc;ntwUbXdc`3&V3G!L=^L3tA{Nsr3rh3ZfqaCD-;^C7e}O${F7df_(EVu14~oEM z`qiZlvFVF?t?YX{j4gDSO;=OJV;_g5>f@*Wuc|+PO5!%ee%2G+l?Xi0ku|F^6JaU9 z|6^|Yn7XU?O?L4rMiab#Av*HdxTRb)DTt9Vk}SvJ-g}N*+W#SwTtFK1)NTD@v^BWH z_O{mTy)%e2gv}2xHQMGef^xLZ*~_#%Nu+0aW5=K3S?3|pH4=ZyP_>8u^OQe!qzL24F?;%B| z8qwdBYDQ$hra*y$JEn@6ywHPrb$zinGe?SwLgk!=MfOa%Ol*YpehNjaF)6C!9+PJT zxi3IoiZroQY-Omzy@bp=@VUd|!!7y4%9}9%Ls3&BM+XuEDKbHtcvVMyYln|t2uqaXp9{$u-FB zLrg3i)-y4Up3>E>o{V_UQC##^O`N|Z#s)$C9@fS~%SILs7UDk?O_faT0RFR{B2VNr zNOKQqNZCi`@?ww)qtMIH2IR|N;RVTK_z&g(Y7+YYowMUL>r>52LE;CE`8jR)Nqa+W z;2%@|gLgFxT}vrN$*-|LSu>(`e{UM?>#o5V|0g3-Z3KvtoklwqL=TCH9EsybKHhLo z=l>!dfeH*zF{lTOLptH{js~`UgE_CAd54nD0&u^;mLUpBg8R6Mxg6|MM^-*#|%ON2x^r@j|)6PdK_r#Z< zcdDa5>iZ@X#@!h>s=)k!rMg8mzH8enkDc}vYHiE)4>3}DHSN_b(_iM$jx)zYBFqUt z&~g6l*V6#(J;>RhE*q{=IAkg*d68YVT|SCS#ks-7AkPgTRF;Fjg-TSzQ z(<-?iuCl`PvdyAdWXJnjkkQJ_e&Ee^jjG!ew-ioq5rXIA{%Qr#rsAaW&(e%SQ$=}v z>sLH=aPGUc0fBB-86+JJoYzrak3)QJZ{m{FX;IU<*sJ5DuPOR$Ih^<$b9G@Em}_J9 zro!6$Q>T(Uny=)qq=Da60qO_v(IxMX}v5xU0EusSJ&j=XcSC=W1q)yfN&h zYH9YBi3xSb_PKS|xf%2w3%P*Ug4i=s*wqC<8;VrkGp=>=v#VfjkK9b^a)nu*aG{Y= z0!1*)Ver;!IH>OqFXiE0r+ALmGC-41h~eAvpoY)#rtxpn!H<>)Sj%qdUiAKdoj}6dadGzE`G{&uirT4@ato z=e6o=ll+&D5bpy;?~_(!4_Pl%QO6vYo4I&NXnVgpj5!*L1gigsqB`3u&%Y445wI&G zAWquxDuo&IYOeeBQ>Gf`!5OB}JyFZ{ROqn(RZna|?RYkM!l-reBD69YXr4H;Pz!RH zlC=Jo##l#n=m>M?&Zu~O6ixbDbq+%u2U)(y^g+5E^z6wvwU0iFm@Z##i& z=|6o<+8%Fm8WqI*BCp%ZK=vHa^G7ZneAp2^#P{?`@kr)Y`%q10G!z#&cRe~Y+6 zr-Dy8yrnCLe)}W0_8p)*aKTTmM^3g&F2LO#Ez`cT`t`yLdR57Hb1Z?_ZVJMGu9hyi z{1_6a31-n+`ut}8fGnP~mQ7!|{>R5*UaBB>EKbTainyo+pQ1l-oKY|l!q=EuqEZWwz>-5$hdWX@|&jh4|L7$WvX1PaI)dfzb!~vh;G~J z+^IQ>i~F9Gu{t2~(1@4wgL!eftFG_ow`s#a4N44{Z*7&Vq_cBmNYg(O%hXzmU+N5A1Mk)F)McSL=^| zo?*kuchoLNV{S2bJVfrJpFSRDzlkrAnTzxkxlsh}r;8+q>kn zUdFR*rlr3o_K`>X7nsP+K{&UYVBLBgesMMr+-pi)eJPptArucgg6Hn1NPKF6tL<7} z8da?2sAuZH5oIp4ez#K^AUnCi2t(n_Y9H}{B1H&9CD1M0jyse}Yp3AAuTdpiC0lV( zJR>+46=7sd#}^yoe5mDN0T16%ahRdhFhU&8{L3dfbHZs~ozV!!9RS6!8aj|P;t~M( zpoDs*?T>7;?GO&tK*S+i6tlAGg|v4;){u>2@BP~*Xa^FuHhNg5WIyq(3J-3LA1BCp z(V!`h7K#>be6V7%7QqZ&oQ>D;aAJ!R+ee+hWq(0K&&kaXkb>VYip2-`h z!?BEa2$@Ot!UwAJPA zI8_`aCbYs8GKNK%%9%wO?-_BjFIvb2Lv*_&7iK|bhDTKG6R zO0!V&*EV$@-)h-Vq{6!*aIg3&X@$E-_cYXMu@YQJuHS`hz^;c$+rL_r`OV|v87Y{M zerkmdhacfO2c%IYX`+f83&fO`MyOLp!)02Y+7FU*3-FtOEY7ad8|hd^T;&b68F4bd>xSM9<2+ z64yK~^mm$&9YseF_61hCeb5n-P4N6}* z+xNmbiOXnG*8`&I(s+yiaA=jK53TGCA#KrDJ-;gh2Xe(Ta**UKS zjWavN6_)(_HzCfD0J-3{MtJX>OO`=6AN<7?H(>ryhU8?PzRSV84Nci&_;bp_BZK?B z&WqT8DDn@X9M24Yk*z3#K2-8NfYu-^|1;eW!_B%ks#@Xg!8?-=h!% zkxe_ro`occz7)K*rulQ&AQ$3W3RJ$A|Bb_8Ob%QJ^*l2;-UC*MqJ*p7C z0K)&P6?05s5yUfW{eN|8r?==n7Y^q6dFq~UE_Tdw%3{8JVj%@_)2>fo(|=#J#wJr~ zY>vaRTB0UrA5iZRK<+0kzzV#XLEAg7eF8dtW2;%GXl+0|b3K<8CRZ0OifGSShb$}A zTFL=cYBd9sRU2V*bU7px>mnqI;aL)qTjE?y9`x1Sc*ydJZ&Jw}@M7KJD-CG*GeZWr zVtSp<3C6dtVOVn#2X;1ZY+Zivd&mX5SRcaHW~ypCDy@B{{hYa<94GE%HyXn7bA8!U zYgomSe$_Y8StlX&AZtsr)hkQJe5 zHf;^)gtK(X`7=xXc9t20q+NzhOZf&Pdd@%W@7U;a<9@dIN z=f-Ufwc25;j~4Ni^E_H<5t;<Urd6zC_^KZFxTEqk+q9JrA_zXv}V|R*&kZ z}Nbfs$k^|Bj!}-Iyst$gHkfhHvA#iqgCKgK;3> zu2A5p{CKxS%=V&%>(uxNZF`fTv5v91vHDka{#dokOLvjqD9MV zy9>+VZJ^z6rYs((NIj}eI0~A+nh<#}`FR2}b?I7u;2(zB!`DetLFlF-S>hNBHc zkNg7j+UjN-ovlB%9b?lc@mMXJr!7lwF(+SrMf)6>&hnZZ{N7t|pgxIG)zSI|v5C8d zr{K$2s~w?CXPAhtG4tho7c5T52FeV|tUJd4u9%^3j6oY)+yrpl5s+YAB2c3>4Prlp2{@kWN zLzp}bhlg4tE+Z9^3kW8R6@N841=IWIj+3-R-WPm7fpB%HbJR%d8f@h5jsU+3io^TYMTlac*TjWiXZ z%t7(H%?dYTB2S6r<<3k0=vxo)M?^3 z_;U5WIw?lW4Bm&U77f<~IaQ$RA~SQRAf>;n7c?H3_5#(Chw8O3QJ4sJW22VDCq5uV zJgF%$-jy@xM36$cdmB@ydCg*BuBlu2q3hA|usb2BC~*I|7vhkY`BJjdnN#hMu^eAS z@4Mej;9Tzujwv6{GrsN*|Ka1<=*H1xyX~@}pZmGL@7N8pKm1JB;MTc)k@fR!yW3uE z*V_XNiTbhbLwfk3X=B?$JL;R`+eCf$#yl{3z&FyZ->yHQACtw%1Be8E(&2;zdG9P& zm#-hR7Y}BHyAiz|bMx;D6vPfHhSlJlzu?5EJqbu){4(&p?dYC}jCt>Y_T)7?faX@q4!&(GYN$lM_595U6nU?wbRN`WFgj)iB2nDSc#$iY+YAF8coDY^yEDHkjSg7~ z)Q!68vNr(*_cGTJS(&AXC*w4&rxJ6_^u4Z=RWxvHrx>$bTL@hEDXig2{pgLbn3tk3 zLgetio@+POtp+&zRf^gSroF4O@5EbSx=CEz-B6Te{T_>7AwXE~-pE?g_4En9T(@M% z7%n^5HPaQdEvN-Yq6k#|kv@u^Y=N!E_sg)Dm?u^he~z&_A@O;!R*P! zcu?vCPh9}7-)nnt^DiN1u#12GL+JzWJ!!0;|A+Fxu=ApWoM*0Dfv5gI#Nqy5WB>+= zGNgXxu0=@p+l)}OU+$^U(SQzxG?_8LT*NW}ZK3bvp~;UETu&{;>kK~j*9E4+(bUK{ z<989DBC<>yKk@(4-xiQ=P4h&FV|X*FU)GhwA^OUq$7OV4Fg8xk{7 z+MMuvXq@Bq>^Ed|Ad(zyD0K96uxo-KZ+k-PT1@deaV=|lnPA4TE^6({>qp7z?&^E% z89yhCrd}Psn-6uSnIdF;ABeVDv>Lv|ZzH3@phctGb>fFl0S)VcmnH>E;O`fp)~2u} zs6+9;U-QCJ8DmBYCz7*Hto}Aa+oCg=S_rLTwh$$&5fVYgi=L7Oe6MNr5h~I^>t@~7 z89%yr|A>SwrjnOM#S@%YigDp)gE=P7ST!2RG;TBR}Sb;t#S2zHuzba(B$Mg?b0dr zad)f%qVh_s{%~r0%rpETiq4EGrP`s!`KV#vL&Kme2v|g(?SNM+;9Fn@7vuCGUB!q- z{b}Z)yE{(WlX@7K@Nm}ljQHv@>nBmgN_EpI)6u`!U>F6|6kObWzp%rlf*WYD9n?%c zFxVgVRqq4ZurU?;_l0i6O5!%Zi?;C;g3cg)s`^y(lhvf(qw=bKml7TMw+_{7%Lyz$ z3Q$lM;72zXcJVEHas&1G@$$o`!^&+#&6*1M!Ck$rp~YcPbtZY#Hz~130b7?TzPnU+ zoLAz91Pvo3jj|3ws^OZ@sA?&7z+kv+Uv2GV z{9Sv%wtM*VWcp|%KoLKD=EWq0&gr2GO4r=xn%i{l4Ktu$A-EPj<>Ng1g+bFCYvPPU z^3H26GGE13MRbM9u{>3$Ur!Hh48DWw4O_ikrLZauSb+I;nmyhSu8P*J=&l^`ih^46 zXy+#CYSRXKmL!*$Nf@w@U~dvAx^hhzA?%2k~W6M4C>!g;NF{D+JRv@j0R=fVoK&g3KL%w9ad%{ zAltJHHtC!J>P$-n_7PJWiMS$y`<_!gek6?Wz#-qOP&WP{B%99hs)8_w5kC7KrpWEa zeMijvKorIdgF)_IVh1oc882f0#!cg3zGhX9h~0^?&G$g_6KaHfD4s$U zozcc2VHBVGo(FT-V>#x$sMtq>hAD~LF0B$*C_ngt@JS(fP4~F2cOAuN3A!G0EPBdT*83DWE;<_(QT3-QJiT(j2HZddi>Igh~_ z6WC$FqIBOtDl3ORkD1Ov1fwM?Ya80B1c*Wlw_Y|L3uxT4LGAPW*87-0p6m?1z-gVz zWHxiW_I>*FqvRC2)};deh0X83RvR9oMO#I0r#NON)xT#_S2?fL+BeZ9KF(8bEiOn&}_t43^oPexE%sW7}OD(_=mn{+|6r zqvfw@qN_-mrkIsQI{CKfqifK7Iq-)I&`9(F&G9|pT~(t+;|PtjKvOik@PPW?oP$T4 zyEmDH9lx^`_Tv9ge~qz*Ws|MHSNAISHW3(W;d*56)yHKr@$GJGj}g9D=+`r`v!Ln_ z4v8V~9Hg}}gLjFRyfv~Nj52ii_FSg85^66e8~=>>VJF4U)F9 zopgSvqSh4%$i_r=MQ*7^F&C<{fadOFUtN<~>X92I zfsr~fski!7{3!N9`ob4oL(WOd>@)`rFm4j_LU@U$eaWhHd92oVy9>7n1hMGf0BG~ z8lMP{O-6NSAqS$-8a7B%2Mm2skmL6^eW2Nz4DaM!h zfYRH{*@Q`+4wyhygF@^MbCD60B+x5<|IPTRHN0Wzlk<6|y}0D#qhii^p~Iq6ohbT` zNcvtHpG*!--#O8Kr8>{D*x&$7Y|yXU^|E`l&^OwSW|4%aNS-KAozEf7O@(6fDQlvME)hH z{&gL(jqIf$4?qzDxniUB605f8p|WjXZ$H&?Z`;k<%5I9MZYVnu1Qo|^luJt-5HPmH z#Kra?I|dmYs80b{MF!F2lh5WCm%6O_&l2atN&t`|60j7e!;+NYZ@jT3Z0RB8oQuiYR0v(xIAv%(!EQo{_;ieO!5U>Vai*lWhida! zTJ+2sdIxWR`S>5oKRNg#!zGeRd)V?n)0zK&e&O8ZvLMymxo0e(!D2dZsgA>@bn$U$ zZh~QToRFb-dZeeogYZ5x)0N`h0L=sV^2jHs~fUSwcriS(XR+?T@nrNXz31lhE04}trwZ_Q4IqqoRC?p%Sbrj5r}r)uv=C~DPa20mjqM{CC$H0 z_QaLeLCW zvm6QD^2E)5bk=1x5@W8xQ*jZ+(Jl5eQT~ZTP6Z2Nj%4Q=DPqmU2C$!B}-4s0z@rlFGc#d$=Yjk z686^#T}Ca7emrQc z6{m_{A!#_z0(@C+LS=KaPE%JoNyv-0!pQjA7RzsSb=LvMmgzMN6bgEdd{1J`DPkGY z1=L?~maU|Kz^ubQ4xWj$i_mf0k&xIvxHLa(!$eLF+xg_5EfRF(X(X9Zbk1!w&bwE@x7#*qB}A$)lv$eu_sZ(AJGth9=IA^K5AO(lM>_=Q&$TT6|Ei9wi^0Y0oGfoxDNPW+N#Xl!=-cmL*8^LBh}E~q9? ziRpOe=jlI~DAi-g4|!){ZS*0e9S@z-u*eg@N9IRN4{m&O2iW`aOG}X(Q(=jwx^$HW zaTA(SC!!_UrG#9Vx*?{)8AeXwb^XK|M0aU zKC9*q+@GJq{f3^2m*{wXvb=?lz%VZSNab{>PqniH*AE0i!GerBV`Sh?4v)6qGfQ{`VWlv63B18h?Acq zz}(USu}ryn>fu{B5XKUu1b{EA@!yjKXwHM{Z$eLp8V4tw^#|9fZ>hd8;N8aaZ;#Y~ z?fX<>qbqYPDlg5lhAxL`;oh%UP;OMkjt=JOXU@%XdRQz{A-dtyrb630#edjRQ^9$W z|BSK4uFTCW?UfJX4hZxP4y(y&wC)eHo^|sEcmODfY2xS|dvk-)9Tr`diBX z(0Y4Jf_T@G+D*wxuxy_nw>R$mAe(INtA1jPpn1Og*SgT+5Zg-fGR+=H@#O|q1TD;? z2rf?UY95~O$C4KJ;Ds*X`S#4hRZmx4JMw8vN~W@%oU24&$9o^C z=4Hy+Jwx9Um8poCt5B-WFflfP6q0c&`}i=fk}tXbe$*70DrSx3dOOIlW+AGeDt;ik zA#(HMq=~!Gc?2%Y%?XPic&+=dGuohivN|)+LvQE#M*_gJ53A|-p8#(bK?Ric+6y%m z8ulrben4mr#h0A7QL9#4t(-}6D`=w_w-IzkkaR&RpI(*qGuz+hIu!;_9y|}tW{tL; z*SAymT0`E+qz}(ujpWT8zPutDJYZ1V_#bXJY_>!t3)}k}au1VuJDE}^&HcnLGTf-i zyvpA$)p0I8R|OeeQiCbxuqApjf&m43pi6f}T!3B%G^V?@A45Q&b?=EDm#n=VG7i#9r0`rgASF&6sF zb{qrG!3n(x)x_cl1S|fBVz`Ql_HTz+H$9UNh-BfW0X9P~Hq3988j}`-!owNMBWa%Bw@GBpi>I-pOjO+Ku4@cq$R86#SROQ7=d#wwQ5uEeKIEI|VOk%^3 znt&J)jZHtgZid;d>E4QhoB@y!!2kX~6j=|(XMJKWT-a4s*OCO0!7B_BpMKI=;{VaG zBcQn2LyLZk%v4U?cXt2%^j!23`tM-_yz;*T;55u8MB%jm`*nY+e1KW^67Hj0B#kA# zo7Pu1*5R?UuJ?`CTZiGn+$?Jd{!4ZY-1BmIYW#poF1+GyM)WBFIHYv%dXr)yAFt~F z#-;uKnjEw$lZ1W`50KJwWz2-gcrT>Ea5n6f@MK_PvVNY6E;Q z8Ef3yfz71TVd?Ff6TVreejJCC>=Xnev#Gwb*T+&95^QT}wa7schx7b(QG#5yPJCA5 z?{;|=H&&sk)R%qhrpv`<@7pZnMKV(k<|c>lwTXUi%lhOL(}B?j2V-mDB?>cqjjlm~ zL^B6cXn^(=(SqqbzvNp%l0tsfr}HISr>t~q)c)l8f`00^if;}Z;4aym_EWGOqm8POHR#%~6aNQSa##w$ zZ1+LR+klz8+f}VSzM-tS{z&UUfZwr+F75R{0~5=mA)mT%iJwcA(07zfci?8k%^^Mq z5s mX`XAMd!4mvx_J}=Lz9@?vG&oN4Sg4nybRi&r*}I)Ve!i0=ljx(gtP=*^v@= z)q)PQBCPG9#K^E^)HQ2>{briOU-D+czEBoqpmd&+s7zdkIR2m zSM3?D`-DITCd5#0o-AjvhHTn^1Zi`x(k`!WktYQkDSEzNyaZAPi_6@lWI1}n(_e4Z zd4}3J5phr+1*U4*(XPcE4I|4SPtlAWWAk5a-sVfpMkaAXY9faE`R9HJ$jG~hrFzR< zMN48NQ%9IfF4^n!;4!2vuFShZzTrC5**WOv#nnFn7gryRG1nF&fFJ?2>>vO1=b>SP zceASJdJP=;I-U~v4o^|tbn$JEZ-yg3d|Zv27Zy}{@5=nEsc=@;MKv>+CayXLcDY}) zIe-Dd6h~!6O47A)|B<=+Z{kKi7>(W$Lf~hb*kjDFrN#~Wt)|y!sUC4WTfE;>nFFXq zqYpY5kr%auC9P{Oik7Zw(L)7GwLY&chA#}scQEh4GtdHRhNoWe?-c1&C3(Wp1HdLA zQORfycUDjQSwKSE+S9s$8#L*A$YLk&n831IIq z-&M@iiD2C%oeCz6)Iq|WE&Y4O<)Z0yD%{(eN3^Tnqn$Ns*LVO`dB0XnYETj(UN|XA$E~4PA2OlFlb0;?wgnuhl8m4{^;&Ym| z0qRb0?CHzs)D8841x@p3{K7I#GviB9y7Gp-Ngjjg#VtA8F(tF=Urs`4dV>ak7AE!? zF)rj8XDt6+;ninBY z0B*d{VSF8t2~<#}QcDh2vMOA@hU;&*PQ;&AwjqP9d&?zHnV5?(Orl-oesxY&fl69RBJ2 zw;8qH6j_jLit}ANWZU`^HHS^_V>B9Jj^oD!5#1-QfJ!UopP%@@;=TvVL1GDK3-j4A zO|x-GfClMO)bva!?0fndCZ=T;8Rh(fu7ePU`wAmd{3&uk|kj{E`{zuHx|sEHV#ms%U~vfx2rD_KK4X%67|*d=1vp z?`Wxr>5WZy*<4Ty{WSOYurA+CGbiP(%s_6*&j4`Q*ZT;dQIdxkm(AVyUDO=Q z`S@+qmU_xgfSmQ*x3VKt0LxkMk5Ff}R`I%gHsALVTK+&C@+&;E6S+uJLQ5wayCUV2 z=jPW3ZEX|BEE0~?^HMhlL#@P7IqKro(JL*oOW71zO;B022P@Oluu#fdzH7do+Iw8b zRfMTie-#D>T0QfDp_nIc_~>KWh9&pyC-w50x}>UPRo_e9zSV(q6|YRcQxxBdVPgh`lpvNHG3D5I0vcBR#{hyfXiKY;u{h{*yJ zP&YBek^fDY&%=gvB3VU19`wOR9R z{cg*T-XcGwZvDOAj@R8JZlsJ(65v8`YVNYR#XIiK@*|?!^mX7?`L8bg(PJon|9LN4 zN+zs$jbOlbSSwIzP!69&F5jM~q@@7si z-g9skiX_fSybK<9=ZD@i48Ke~A=REQNtmnK|2wpAs2`3h#e#x5DHk?Ly5SDWKF9w2 z>HKEt#h<5J{zDnZ=0yjcZHaL`EmAFgFq~5|SJgsAsUO0DaL_|Jvq}GNRpbe2{zJ(j zj5CuneuAy6O>;lgf310OJM2D)RsiWtJFsdWP7IeD)Wc@)QwhFoEH$sSy{jKw&qzKY zX-#L^KhXLm|Gwm^AP;!2G->+DTk{b1Jn$b%d!?w1)Gn`bQIpp9RH6T)wJ#5c`g`A( zEflgPyHJ*rQntdh*osJqkU><)9%05zM7A=P$~(#k*%|BDXGk@cG)eYlFf=j7SZDAu zXQ7x}U8Qr+QeOUSAed zX;_B~>2FORzwOV-o{K6;FG+TvbSeSs>}`c(UlcsipvYM;hAafNh`XdXbw|9 z;_F+W0uqP{1yg3nWfFNk6W3%ala$?WVw${4WRI&UajGk=5w}&h-5sM|9r|IBer~{A zDbuX$j7R~(M(i1RPBRFnG^!*ZqLHMr_KlmD>P)k53X)Z#bdK;`-usdhjQz9AmX?V`Sm&r*&{i))j?cAjZY8agy7vt zP>bIQtwQwTCw-P9r=3$@?`}ATGWd0Zlu_D6{Vh2M-du2VI!4pV*eNOEl|ScOQl_a} zO6kP>E-~FLhTI4Sqe5Beu0|F2pB8)Fic>Ca21hi!u2;!qQD1wFn&-Vy&(id|;{BEP z#E%E#3TVrpmIG;K;QGOW?Br-t*uy0Y3@AhI|+Aq(=xjwE zfH3@t&`=w9VW>ai&Ydd{uElQt(-^4xb|d#a&(@(bt8YOPQugv^b(6Loo40|6@S%Rn zLwMk)rb=pV>Rci)T}jcGJ?2nah{LM{87U3e?&qxlE*?2A4jWf~Q7wfyP0agk<) zUh|CYrb0D&d+^d;u3~j)Lc&udN;GEuWnzkj<&vhZtAK{82KXw`=5A4#q3iRvV6G&U zQvlOU-HJ_C*WzCwDijy*%!Ea|&7jaN73ik9Eai^;$P0;_DSvR~Y$$p6B=?Mkxb3&E zh-Yrx*NqEj4Y|{rn;kIxHOQ=(g$0Fy(RMH{cG9n~$_{fI66vIfF&d zA%^=C&gJ@#g_a*cE2+OUkZamF>e8Q|w{2XdSYK8?Us93?p2J)%4{2OV?u&Afdj0nI zdTcLlm|xsQ05~aPeWAoAANJBRwR}E>0KpU;^zU!~)8l=S>RFc){q)gNAGW0~&F*xi z7vTBJNOQv^h;(#9e8bH+-2}w-6Sa8Z2fKd;agzFatr0G>1Ajj97r|=WsDn!1qQO)g155 z(67fbf^!_X55=yUp0GX(@v?`=75aFzjHbZ(U^fK$Lvs25z8B6eTTg6D4r#06=8Bh~ z$OK#xy1=KADiWnXmyc?4WyjCKH4x|409-FX5k`oOL@Ob^Cz*Zr1h;log8QEHk-l(;(;7<4*2T zu|0aV`h)+MWFVH$+8iQmES@$rD{q%8$$4-A`!`3cD|atJUIX|Z*2c;gZPlB)A^>xS zy>{<3{-hnyG}vwT#c%-G#dSB`ST<~UtjT#6@Dg-a4cVaqMWf$kMZ8ZG`s)oi7& z!yU!*M{!pB9FNnZNl)y4j>I|eLwo2+Q{HPttC8^Oc2D-H#tFek&T>P`t+nxj?`$>8 z-A#g*zDdVyb*WAO2-o*cyxz}UomyWrr z;|J%ThrsWn(A-J$xI_?W_*~#c6-J;;0AXwhctJ}Aq_Ymq8wOp?MN_CTzmuO)_^L!P zhDsWk6wf)46hvIgj2}ULZ?aflDt=9@7=X2=%-=hB!#8`F9#*+2QS3#lzcZopqVCC$ zoFbY%sy+JC2~$Sv{jf8sV>7Jr;|5CFLxusD6fU z1p8n_&*cmHUc2=(@GV_y!hFFMsmpGW}f6#Hv|co{=2rOvc@oRhS!8jd3?V`zT(h4J&g% z??m4TcrGk6j3BFZKIr?7()kk(|9(2YFaJlQ;cbCvAO$NBL2#|*s`6i6_P>}#g<(@) z*K(fJS5(z#%FIhTSES_PTjK8As*tJ(8STA!I_X&t{-|L2%7xsS)Pt!CadK-#2}nny z$mTFBImvb5XczDDC81l(7j1S;cOGvyYv_D$z9c?7a_SRxNXGHeCAm4)KsWZNxQqHV z|4a`-K3y%FN;kV#LNzj0(3bhie^^zK|X8oDX=9*l2CuSGSfpAD=Ob8h~*a6-rQdVeT(%s2Va+PuBo zN^QmS40PJm%YG>j%cPldIUQ!A<@3icbzl?9IwP9O=Nzj)H?;ZZMP(p%oM{pp1JfSa zz1fip!4&z&65dkho}^z+A}-82ayiSr^6|wAikJK49D9=Q@U3ek>;*m`Gr7ly{^2V8 zj{Tguy!jEE7X$nfB93XrQ7bE^dJgcynwPBn)5#b4md{_j_qa$^(_XIie#A{De=n8c z6Hc{3i4xKw1{%^kdG3A+EAS7&HjAqAI^q&4>)fW$Qe4Cq&u+S8s^d_Q{&U)Pn(j;} z%aQ-!^E(dw2d)tZZ0+_UY~*br)|7H)%>&O_u#DHSw~lxeFCl_N zt#%Y#lJ=1QJRhd5JNxbBFEvr5)wFOV!I03`@jlqrB6Dzy%o+1E-9a3x?chIn!H&lS zdPc-?WNXX8e%_8#G5x@0gA0m}`CdE5DxAG`St~U4mPI>~u+9EQF8IrB`-gl7I=OE@ zkuyCDeL&Sn>@)Op-2#Ys;*~Sp&gh)Mmf%v&Zo~cKwpwZ;yk(=pqt+q6jR=rv4y z;S&d|OoPh&(*oGsCm#0Sl)T;pNsM9l$?$|P*O|{Or*t}+frH*O^GhKGwIjDbiajmK zE39rvUT)Ub@w+&DOt8#OFmJSJ;bt6|?6E)KG)GNT!9?@1Lq5gTx^KwakB>h;M>Uo_H zKG>X*Dqodt7gNttzsVTj8(!f1+akeAnDBe2lQ*TfpMHPCAJH+vBT1NkyK`c#Z*I7? zjryUu`p06F_2;CjhCIf%50#&tjM8yV{>2AR5@biIHvtlP5m1$ z4iUU}ZW}*^`W zJKQc&JgIuud$`|J;s?itqLODQ)B}5GbmIt6ULPow-n<2xfrl1 zt+m;Sd!{~L^obxF-0SWj9e3x!vbe;ri4&gV!W*3gXo{fAmI<>KU6wgYe?cf zb@p=+&dL6@6Fy+MY{ycn`R4mUhhY1Wc*r1UM@)pYdPY89UbIO`vPH_~s@wDV0%Eao zlg!&~v9-ax)`U+_X|33;2|vM1`{gK>GZua?`E!}!4Jl_sx#WxAF;!-<*9Mm5Bi_tG z7EX48hbAu1_M1N;;!%#UQrbOf!BKzb=c(rLj~$1Z4g+`o6x|C;yYXV^qWWX`zz;ZUD;U+k~mvEEFZi9g-?XUwBt$N)(qR4K1_+3|Nz!yW9p4Q%A~O*_gJ z>DrI;j!kz9;2UzJ?WVuqy5Fm&HQA+Z%~=6?)FvyjYHfI39NERW_;|woF5HjSdI?{9 z-*)+?Wa9<@lSBTcr*DuS{`MT9!h~9dGE|tDM<>ndaIt-Ux+)KfTbRv9=J}d##wRYG z`GaooMapk!hEa3ILN9LIv~(%`Vs|u`A!qNTCk={fnIgfv3etzP0zzFSv%?+QE=I|r$d;?R=#Dzj*fd`boNJS;EzTm4`yHn&@5_#{Dj zW#!JO^|s)c!7lXfZFZmn!+RIGj0AzIPxtVY7$)LBcnhTEgMfF`GXZuUxhk3ckJQJKU+1rw^KvQ1(5lBp z!OEssG|(o1{tr`*tC>3q+xE<>@P1m9+(lKFp-0e5pG?7kUaOf}dQTwW%|=(HEAXmk z=`PKDpJNThz0hG1I%Q^Vruh8%&!C*{zP}BbyOsB%hhX$Ir{$qd7nQdPnmHKX)2K zUq+MtRUjc`(M3ZtTly5*^PEBf8PU6|CnR1;ZuEz@=zyq?{_+d87gs+XD4sgiF>Y9e4dD@gBO=1( z;_~}Wj=jIjE9I3hV?csVma~L=p}x?_V>OiG^}F2imM0oaEdIVP6U7|A9_RF$Bmwh# zWcT>bG%a8$U0x%zEVwt^bEzR!|9fn(*|$o<^b@BerfQQ~O=U%DF_r59{dspjco&ND zroF*HA&=ht`I-4z>v*ukt*kicT*|kDPKWDNF8iL%Oin)e;8`2y*PQ;WB;VDsNRaU* zVH;D#Gd@&s+5>e&)|zxeyI;=)eN7{6GBxn&4IGwwZL0 ziqeCLt9c(6iOAYH5g;auj&RmXwq!DW&{H7Z^W`d;kD0H#QJII4Pk#PKU`|q_ zO%-!YO0I+vZPvO*L@fH<3+c6*{ye$)YM}D-$uH^0{eCu>eJZc-ta@+m)QAqBFHp%K zmo6V%$Chuo-!%~ao${mhx65sl6Gy^b|0ZjSeeAx-(Iszv?0Ax587RYWDCR))+0%E$ zyrC#jO}l{uNvS|d2!8@3tS0oUy=~vYxa*Foj&b59CLK)b@RWbUwe7|=s^e7N-!5^wq0bKPih~A zUzfAL7TPtbh?P5JBNnkN7wBA_rIRc*EOui?(NxOX%t!f|cK)w!NjLRx@}t4?d7dfc z&zJ+)z*Ly9HxdIqiGB4VfKmYW+}>IPAp`AED^HB1%ldm7SdU0CfQd1tPBr6-GA${@HP%Etqakk`>rO1{VS3A9U4<>5(qZki z4NQL9OzbOgKJ;Bc1~=Q~C4N}q&))ShC1Ji~mYYV22Chl;>8?wylA)ifYnHsNO5ss2 zi16e|s?4=CvdDNu`|yPS7p)7MYam|SN5&OKqWSCpj^%p6JfkYX+LD%6dHneu|eGHrW`!q#IL{pXHVn<|i#K#?-ef&lWpA zW_^&U__Tb9I0+evlBY}mF_eB%`cBJd#A&puynTeca}Kz0KgeZ4qB!;x;g5=%fYdE~ zvKuD+lr>?xQF8E0Qh|?7L*gqG9~pPEp88;)BR#Q1RU^)#uwd8S)+LLqdZXOyl&`K) zOISUL`t6l=Z@N@~?8AwGd+)zV#qtJ!4y zUi>jLu&J@MBT*BHsvW?*7{YZ-Xp4I zs8z)K9U`~B17dp%d>lr#R_?h(h1|cGT0QS4RM=Fdo%S9ZSa;G&XmX#lmP-Cb(G%%> zFFFo9ghrb_3%kos5m+lpxxt-ZqLG+u850^dQj(g5d}=b#@W=(xRXAbRUi*6H3(Ui# zG z;txwWp){Lil{BJaqOa}lz6jeJ#)MGFZu7#QC6lY}8P&OWU!oTTpH^--uH2OPg2SrY zo+V)$vB~C>=GqAs@m@rVh1*o4M7*~o*ezazyq!j;prhkKyf8M$@14Wn-jZd+#(W6vl0di zcI>F#4dQCYJkD}Xr7U43qIe?`lcpAJxtX7E=x@rd))J`O`sA(uUyX-n}|wpEh*ptD#+Aoc)>R1J2RWW{&_;=Od zRitS24R>Gp8B|j)Tuqp#chwkD#ohk-toFn2?XJNMw-2a@1nypqbKMqEzE53@5nfSX zyYF-8HLyVi$Zcc;8_J$OYfS&=|8Mf`zc}D=6`A81bQY$8>DGt$r|$srpm;jWnAx}m zxKZTYj6wPy>6LBzGKfH4hD_m@%mn&dbQ^0Vp%oyIi~tmx1!>)28J*QVZ5UCETKpUg z0&PM5b>YeXD0|1nMO0v)z%QeKXSM)hpM$lq&oP1kMJt;L%aBGSe4nFA0ar82Dre&9 z@?gMz%0&CK0t34U)YXoS#nla#4S)h6+YB3q<1Ug#9z-t+uaIg$l5ON#7Yl4yQedc# zA)An34a?(wjwoa>ivWN>r)0G*(qL=PfHdRw zIl#i|C>9FXV0khPjUa(6CaRcLeeMRpy3C%bWv{ch0ELE7CXs}%!$+~`%Q_0J%h!OG_|8ypfhY1OzEHI7H z%WcMJ*~6kV(zt#m138I6dZFvs8vp@P2RjYmCuNaMEW!$c)JPa);3+?NN|xEkl}J+t z0vz8ZG*hn?$U?6`a1b_O1+oXF8TU;v@SkX4Ie5E4$A|^84h2#ZQkEgaNf>Atlab8? z^dw83G`>a)T_hO(EB>Sa++x@fN7tCy0D8B$Z>OuTZ(_GipOR~2z={q!llqa&xV{X) zSuA=T4d$k>cAN$?jDk%QQ7GeF!;QrlKRSyY1_1GIG-)DY12pmW=pV+Z zXLWRTK#Ep!2x1Vz-hfU(T96NE$a(k0EARWI8z1639dbEdW!3F@GWRn0)jo1pJYjledK|$@XnavAZ?q1gKSj6RPOh|)Ksv`|Y z1rks#OfeLau$xP0q)-T$EJOEuK6nyhgALLfc+Ac)$6%x>d3Xf6l?H}^m1#;VnM@oc zpuh*m?}4N#bTieB!Z4p^6Pq^xBngI4m}pQ4V|s zd;~sovk0}IONX*5$@8F>F97BPtbv6UWDUDr+`)iXjjM}7Ul_=1Rx8T!eF@eA&l(q zfP%+1-Iz(-565OgR;%75nFu;zX4mK{JF9^xKcZkGyGH%N`$?Ddl*pn_?{hpSYbx)Af0bfO)z$yNLBj)Cg}LY_{7>k+zwm|dx(g;F*FJd8X`-dtllNek}S zF_FxB+kwnUfD}Cm!3M8H6P8KMHM2|v0!ROsv%|a(tzdPS=L0>&7-5VU*~Ht7uoId$ zLsyWfozR%WaM*ET!|Wz37eUFQvfK=I+wq~f`n!?fel6Bcden}Cw~gc)F!ta$R45zS zyZ|o3!e+;ku-0)P6=}KwqTw!qbGmCl$%Q0ryPIn@(zMX{g?UQWzrDQ&NL{22Hc}WW zJTmfL_&0!T2%TJGMw1HAu!+@ms1O`NStBg6p_G`P%;_EEc4O8cnL?C>B`ts<&@vVD hrDm2<5ClTP@1WTe`y9}H4zYcXnSG8OSK}1B`7fb`~QDF!x1)~DGVzV6&^V7Iy)rT39vJ4 zWUyr0`@diI%j6UVjhG2Mv-yu2{Hxs4)_901l5tWZU%)=5D*_u%e~>JZUn0--)3=U5!_V2J=0&&n0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w(" + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist new file mode 100644 index 0000000000..a263463a68 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory.html.dist @@ -0,0 +1,60 @@ + + + + + Code Coverage for {{full_path}} + + + + + + + +

+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + +{{items}} + +
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
+
+
+
+

Legend

+

+ Low: 0% to {{low_upper_bound}}% + Medium: {{low_upper_bound}}% to {{high_lower_bound}}% + High: {{high_lower_bound}}% to 100% +

+

+ Generated by php-code-coverage {{version}} using {{runtime}}{{generator}} at {{date}}. +

+
+
+ + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist new file mode 100644 index 0000000000..f6941a4376 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/directory_item.html.dist @@ -0,0 +1,13 @@ + + {{icon}}{{name}} + {{lines_bar}} +
{{lines_executed_percent}}
+
{{lines_number}}
+ {{methods_bar}} +
{{methods_tested_percent}}
+
{{methods_number}}
+ {{classes_bar}} +
{{classes_tested_percent}}
+
{{classes_number}}
+ + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist new file mode 100644 index 0000000000..0ca65edf98 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file.html.dist @@ -0,0 +1,72 @@ + + + + + Code Coverage for {{full_path}} + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + +{{items}} + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
+
+ + +{{lines}} + +
+ +
+ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist new file mode 100644 index 0000000000..dc754b3c67 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/file_item.html.dist @@ -0,0 +1,14 @@ + + {{name}} + {{classes_bar}} +
{{classes_tested_percent}}
+
{{classes_number}}
+ {{methods_bar}} +
{{methods_tested_percent}}
+
{{methods_number}}
+ {{crap}} + {{lines_bar}} +
{{lines_executed_percent}}
+
{{lines_number}}
+ + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg new file mode 100644 index 0000000000..5b4b199531 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg new file mode 100644 index 0000000000..4bf1f1caa8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/icons/file-directory.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js new file mode 100644 index 0000000000..c4c0d1f95c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e((t=t||self).bootstrap={},t.jQuery,t.Popper)}(this,function(t,g,u){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)g(this._element).one(Q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=ndocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Ee},je="show",He="out",Re={HIDE:"hide"+De,HIDDEN:"hidden"+De,SHOW:"show"+De,SHOWN:"shown"+De,INSERTED:"inserted"+De,CLICK:"click"+De,FOCUSIN:"focusin"+De,FOCUSOUT:"focusout"+De,MOUSEENTER:"mouseenter"+De,MOUSELEAVE:"mouseleave"+De},xe="fade",Fe="show",Ue=".tooltip-inner",We=".arrow",qe="hover",Me="focus",Ke="click",Qe="manual",Be=function(){function i(t,e){if("undefined"==typeof u)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=g(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(g(this.getTipElement()).hasClass(Fe))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),g.removeData(this.element,this.constructor.DATA_KEY),g(this.element).off(this.constructor.EVENT_KEY),g(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&g(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===g(this.element).css("display"))throw new Error("Please use show on visible elements");var t=g.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){g(this.element).trigger(t);var n=_.findShadowRoot(this.element),i=g.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=_.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&g(o).addClass(xe);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();g(o).data(this.constructor.DATA_KEY,this),g.contains(this.element.ownerDocument.documentElement,this.tip)||g(o).appendTo(l),g(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new u(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:We},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),g(o).addClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().on("mouseover",null,g.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,g(e.element).trigger(e.constructor.Event.SHOWN),t===He&&e._leave(null,e)};if(g(this.tip).hasClass(xe)){var h=_.getTransitionDurationFromElement(this.tip);g(this.tip).one(_.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=g.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==je&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),g(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(g(this.element).trigger(i),!i.isDefaultPrevented()){if(g(n).removeClass(Fe),"ontouchstart"in document.documentElement&&g(document.body).children().off("mouseover",null,g.noop),this._activeTrigger[Ke]=!1,this._activeTrigger[Me]=!1,this._activeTrigger[qe]=!1,g(this.tip).hasClass(xe)){var r=_.getTransitionDurationFromElement(n);g(n).one(_.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){g(this.getTipElement()).addClass(Ae+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(g(t.querySelectorAll(Ue)),this.getTitle()),g(t).removeClass(xe+" "+Fe)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=Se(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?g(e).parent().is(t)||t.empty().append(e):t.text(g(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:_.isElement(this.config.container)?g(this.config.container):g(document).find(this.config.container)},t._getAttachment=function(t){return Pe[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)g(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Qe){var e=t===qe?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===qe?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;g(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),g(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Me:qe]=!0),g(e.getTipElement()).hasClass(Fe)||e._hoverState===je?e._hoverState=je:(clearTimeout(e._timeout),e._hoverState=je,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===je&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||g(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),g(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Me:qe]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=He,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===He&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=g(this.element).data();return Object.keys(e).forEach(function(t){-1!==Oe.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),_.typeCheckConfig(be,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ne);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(g(t).removeClass(xe),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=g(this).data(Ie),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),g(this).data(Ie,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return Le}},{key:"NAME",get:function(){return be}},{key:"DATA_KEY",get:function(){return Ie}},{key:"Event",get:function(){return Re}},{key:"EVENT_KEY",get:function(){return De}},{key:"DefaultType",get:function(){return ke}}]),i}();g.fn[be]=Be._jQueryInterface,g.fn[be].Constructor=Be,g.fn[be].noConflict=function(){return g.fn[be]=we,Be._jQueryInterface};var Ve="popover",Ye="bs.popover",ze="."+Ye,Xe=g.fn[Ve],$e="bs-popover",Ge=new RegExp("(^|\\s)"+$e+"\\S+","g"),Je=l({},Be.Default,{placement:"right",trigger:"click",content:"",template:''}),Ze=l({},Be.DefaultType,{content:"(string|element|function)"}),tn="fade",en="show",nn=".popover-header",on=".popover-body",rn={HIDE:"hide"+ze,HIDDEN:"hidden"+ze,SHOW:"show"+ze,SHOWN:"shown"+ze,INSERTED:"inserted"+ze,CLICK:"click"+ze,FOCUSIN:"focusin"+ze,FOCUSOUT:"focusout"+ze,MOUSEENTER:"mouseenter"+ze,MOUSELEAVE:"mouseleave"+ze},sn=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){g(this.getTipElement()).addClass($e+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||g(this.config.template)[0],this.tip},o.setContent=function(){var t=g(this.getTipElement());this.setElementContent(t.find(nn),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(on),e),t.removeClass(tn+" "+en)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=g(this.getTipElement()),e=t.attr("class").match(Ge);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||tn?-1:n>t?1:n>=t?0:NaN}function r(n){return null===n?NaN:+n}function i(n){return!isNaN(n)}function u(n){return{left:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)<0?r=u+1:i=u}return r},right:function(t,e,r,i){for(arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);i>r;){var u=r+i>>>1;n(t[u],e)>0?i=u:r=u+1}return r}}}function o(n){return n.length}function a(n){for(var t=1;n*t%1;)t*=10;return t}function l(n,t){for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}function c(){this._=Object.create(null)}function f(n){return(n+="")===bo||n[0]===_o?_o+n:n}function s(n){return(n+="")[0]===_o?n.slice(1):n}function h(n){return f(n)in this._}function p(n){return(n=f(n))in this._&&delete this._[n]}function g(){var n=[];for(var t in this._)n.push(s(t));return n}function v(){var n=0;for(var t in this._)++n;return n}function d(){for(var n in this._)return!1;return!0}function y(){this._=Object.create(null)}function m(n){return n}function M(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function x(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(var e=0,r=wo.length;r>e;++e){var i=wo[e]+t;if(i in n)return i}}function b(){}function _(){}function w(n){function t(){for(var t,r=e,i=-1,u=r.length;++ie;e++)for(var i,u=n[e],o=0,a=u.length;a>o;o++)(i=u[o])&&t(i,o,e);return n}function Z(n){return ko(n,qo),n}function V(n){var t,e;return function(r,i,u){var o,a=n[u].update,l=a.length;for(u!=e&&(e=u,t=0),i>=t&&(t=i+1);!(o=a[t])&&++t0&&(n=n.slice(0,a));var c=To.get(n);return c&&(n=c,l=B),a?t?i:r:t?b:u}function $(n,t){return function(e){var r=ao.event;ao.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{ao.event=r}}}function B(n,t){var e=$(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function W(e){var r=".dragsuppress-"+ ++Do,i="click"+r,u=ao.select(t(e)).on("touchmove"+r,S).on("dragstart"+r,S).on("selectstart"+r,S);if(null==Ro&&(Ro="onselectstart"in e?!1:x(e.style,"userSelect")),Ro){var o=n(e).style,a=o[Ro];o[Ro]="none"}return function(n){if(u.on(r,null),Ro&&(o[Ro]=a),n){var t=function(){u.on(i,null)};u.on(i,function(){S(),t()},!0),setTimeout(t,0)}}}function J(n,e){e.changedTouches&&(e=e.changedTouches[0]);var r=n.ownerSVGElement||n;if(r.createSVGPoint){var i=r.createSVGPoint();if(0>Po){var u=t(n);if(u.scrollX||u.scrollY){r=ao.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var o=r[0][0].getScreenCTM();Po=!(o.f||o.e),r.remove()}}return Po?(i.x=e.pageX,i.y=e.pageY):(i.x=e.clientX,i.y=e.clientY),i=i.matrixTransform(n.getScreenCTM().inverse()),[i.x,i.y]}var a=n.getBoundingClientRect();return[e.clientX-a.left-n.clientLeft,e.clientY-a.top-n.clientTop]}function G(){return ao.event.changedTouches[0].identifier}function K(n){return n>0?1:0>n?-1:0}function Q(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(t[1]-n[1])*(e[0]-n[0])}function nn(n){return n>1?0:-1>n?Fo:Math.acos(n)}function tn(n){return n>1?Io:-1>n?-Io:Math.asin(n)}function en(n){return((n=Math.exp(n))-1/n)/2}function rn(n){return((n=Math.exp(n))+1/n)/2}function un(n){return((n=Math.exp(2*n))-1)/(n+1)}function on(n){return(n=Math.sin(n/2))*n}function an(){}function ln(n,t,e){return this instanceof ln?(this.h=+n,this.s=+t,void(this.l=+e)):arguments.length<2?n instanceof ln?new ln(n.h,n.s,n.l):_n(""+n,wn,ln):new ln(n,t,e)}function cn(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?u+(o-u)*n/60:180>n?o:240>n?u+(o-u)*(240-n)/60:u}function i(n){return Math.round(255*r(n))}var u,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,u=2*e-o,new mn(i(n+120),i(n),i(n-120))}function fn(n,t,e){return this instanceof fn?(this.h=+n,this.c=+t,void(this.l=+e)):arguments.length<2?n instanceof fn?new fn(n.h,n.c,n.l):n instanceof hn?gn(n.l,n.a,n.b):gn((n=Sn((n=ao.rgb(n)).r,n.g,n.b)).l,n.a,n.b):new fn(n,t,e)}function sn(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),new hn(e,Math.cos(n*=Yo)*t,Math.sin(n)*t)}function hn(n,t,e){return this instanceof hn?(this.l=+n,this.a=+t,void(this.b=+e)):arguments.length<2?n instanceof hn?new hn(n.l,n.a,n.b):n instanceof fn?sn(n.h,n.c,n.l):Sn((n=mn(n)).r,n.g,n.b):new hn(n,t,e)}function pn(n,t,e){var r=(n+16)/116,i=r+t/500,u=r-e/200;return i=vn(i)*na,r=vn(r)*ta,u=vn(u)*ea,new mn(yn(3.2404542*i-1.5371385*r-.4985314*u),yn(-.969266*i+1.8760108*r+.041556*u),yn(.0556434*i-.2040259*r+1.0572252*u))}function gn(n,t,e){return n>0?new fn(Math.atan2(e,t)*Zo,Math.sqrt(t*t+e*e),n):new fn(NaN,NaN,n)}function vn(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function dn(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function yn(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function mn(n,t,e){return this instanceof mn?(this.r=~~n,this.g=~~t,void(this.b=~~e)):arguments.length<2?n instanceof mn?new mn(n.r,n.g,n.b):_n(""+n,mn,cn):new mn(n,t,e)}function Mn(n){return new mn(n>>16,n>>8&255,255&n)}function xn(n){return Mn(n)+""}function bn(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function _n(n,t,e){var r,i,u,o=0,a=0,l=0;if(r=/([a-z]+)\((.*)\)/.exec(n=n.toLowerCase()))switch(i=r[2].split(","),r[1]){case"hsl":return e(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return t(Nn(i[0]),Nn(i[1]),Nn(i[2]))}return(u=ua.get(n))?t(u.r,u.g,u.b):(null==n||"#"!==n.charAt(0)||isNaN(u=parseInt(n.slice(1),16))||(4===n.length?(o=(3840&u)>>4,o=o>>4|o,a=240&u,a=a>>4|a,l=15&u,l=l<<4|l):7===n.length&&(o=(16711680&u)>>16,a=(65280&u)>>8,l=255&u)),t(o,a,l))}function wn(n,t,e){var r,i,u=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-u,l=(o+u)/2;return a?(i=.5>l?a/(o+u):a/(2-o-u),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=NaN,i=l>0&&1>l?0:r),new ln(r,i,l)}function Sn(n,t,e){n=kn(n),t=kn(t),e=kn(e);var r=dn((.4124564*n+.3575761*t+.1804375*e)/na),i=dn((.2126729*n+.7151522*t+.072175*e)/ta),u=dn((.0193339*n+.119192*t+.9503041*e)/ea);return hn(116*i-16,500*(r-i),200*(i-u))}function kn(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function Nn(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function En(n){return"function"==typeof n?n:function(){return n}}function An(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),Cn(t,e,n,r)}}function Cn(n,t,e,r){function i(){var n,t=l.status;if(!t&&Ln(l)||t>=200&&300>t||304===t){try{n=e.call(u,l)}catch(r){return void o.error.call(u,r)}o.load.call(u,n)}else o.error.call(u,l)}var u={},o=ao.dispatch("beforesend","progress","load","error"),a={},l=new XMLHttpRequest,c=null;return!this.XDomainRequest||"withCredentials"in l||!/^(http(s)?:)?\/\//.test(n)||(l=new XDomainRequest),"onload"in l?l.onload=l.onerror=i:l.onreadystatechange=function(){l.readyState>3&&i()},l.onprogress=function(n){var t=ao.event;ao.event=n;try{o.progress.call(u,l)}finally{ao.event=t}},u.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",u)},u.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",u):t},u.responseType=function(n){return arguments.length?(c=n,u):c},u.response=function(n){return e=n,u},["get","post"].forEach(function(n){u[n]=function(){return u.send.apply(u,[n].concat(co(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),l.setRequestHeader)for(var f in a)l.setRequestHeader(f,a[f]);return null!=t&&l.overrideMimeType&&l.overrideMimeType(t),null!=c&&(l.responseType=c),null!=i&&u.on("error",i).on("load",function(n){i(null,n)}),o.beforesend.call(u,l),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},ao.rebind(u,o,"on"),null==r?u:u.get(zn(r))}function zn(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function Ln(n){var t=n.responseType;return t&&"text"!==t?n.response:n.responseText}function qn(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var i=e+t,u={c:n,t:i,n:null};return aa?aa.n=u:oa=u,aa=u,la||(ca=clearTimeout(ca),la=1,fa(Tn)),u}function Tn(){var n=Rn(),t=Dn()-n;t>24?(isFinite(t)&&(clearTimeout(ca),ca=setTimeout(Tn,t)),la=0):(la=1,fa(Tn))}function Rn(){for(var n=Date.now(),t=oa;t;)n>=t.t&&t.c(n-t.t)&&(t.c=null),t=t.n;return n}function Dn(){for(var n,t=oa,e=1/0;t;)t.c?(t.t8?function(n){return n/e}:function(n){return n*e},symbol:n}}function jn(n){var t=n.decimal,e=n.thousands,r=n.grouping,i=n.currency,u=r&&e?function(n,t){for(var i=n.length,u=[],o=0,a=r[0],l=0;i>0&&a>0&&(l+a+1>t&&(a=Math.max(1,t-l)),u.push(n.substring(i-=a,i+a)),!((l+=a+1)>t));)a=r[o=(o+1)%r.length];return u.reverse().join(e)}:m;return function(n){var e=ha.exec(n),r=e[1]||" ",o=e[2]||">",a=e[3]||"-",l=e[4]||"",c=e[5],f=+e[6],s=e[7],h=e[8],p=e[9],g=1,v="",d="",y=!1,m=!0;switch(h&&(h=+h.substring(1)),(c||"0"===r&&"="===o)&&(c=r="0",o="="),p){case"n":s=!0,p="g";break;case"%":g=100,d="%",p="f";break;case"p":g=100,d="%",p="r";break;case"b":case"o":case"x":case"X":"#"===l&&(v="0"+p.toLowerCase());case"c":m=!1;case"d":y=!0,h=0;break;case"s":g=-1,p="r"}"$"===l&&(v=i[0],d=i[1]),"r"!=p||h||(p="g"),null!=h&&("g"==p?h=Math.max(1,Math.min(21,h)):"e"!=p&&"f"!=p||(h=Math.max(0,Math.min(20,h)))),p=pa.get(p)||Fn;var M=c&&s;return function(n){var e=d;if(y&&n%1)return"";var i=0>n||0===n&&0>1/n?(n=-n,"-"):"-"===a?"":a;if(0>g){var l=ao.formatPrefix(n,h);n=l.scale(n),e=l.symbol+d}else n*=g;n=p(n,h);var x,b,_=n.lastIndexOf(".");if(0>_){var w=m?n.lastIndexOf("e"):-1;0>w?(x=n,b=""):(x=n.substring(0,w),b=n.substring(w))}else x=n.substring(0,_),b=t+n.substring(_+1);!c&&s&&(x=u(x,1/0));var S=v.length+x.length+b.length+(M?0:i.length),k=f>S?new Array(S=f-S+1).join(r):"";return M&&(x=u(k+x,k.length?f-b.length:1/0)),i+=v,n=x+b,("<"===o?i+n+k:">"===o?k+i+n:"^"===o?k.substring(0,S>>=1)+i+n+k.substring(S):i+(M?n:k+n))+e}}}function Fn(n){return n+""}function Hn(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function On(n,t,e){function r(t){var e=n(t),r=u(e,1);return r-t>t-e?e:r}function i(e){return t(e=n(new va(e-1)),1),e}function u(n,e){return t(n=new va(+n),e),n}function o(n,r,u){var o=i(n),a=[];if(u>1)for(;r>o;)e(o)%u||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{va=Hn;var r=new Hn;return r._=n,o(r,t,e)}finally{va=Date}}n.floor=n,n.round=r,n.ceil=i,n.offset=u,n.range=o;var l=n.utc=In(n);return l.floor=l,l.round=In(r),l.ceil=In(i),l.offset=In(u),l.range=a,n}function In(n){return function(t,e){try{va=Hn;var r=new Hn;return r._=t,n(r,e)._}finally{va=Date}}}function Yn(n){function t(n){function t(t){for(var e,i,u,o=[],a=-1,l=0;++aa;){if(r>=c)return-1;if(i=t.charCodeAt(a++),37===i){if(o=t.charAt(a++),u=C[o in ya?t.charAt(a++):o],!u||(r=u(n,e,r))<0)return-1}else if(i!=e.charCodeAt(r++))return-1}return r}function r(n,t,e){_.lastIndex=0;var r=_.exec(t.slice(e));return r?(n.w=w.get(r[0].toLowerCase()),e+r[0].length):-1}function i(n,t,e){x.lastIndex=0;var r=x.exec(t.slice(e));return r?(n.w=b.get(r[0].toLowerCase()),e+r[0].length):-1}function u(n,t,e){N.lastIndex=0;var r=N.exec(t.slice(e));return r?(n.m=E.get(r[0].toLowerCase()),e+r[0].length):-1}function o(n,t,e){S.lastIndex=0;var r=S.exec(t.slice(e));return r?(n.m=k.get(r[0].toLowerCase()),e+r[0].length):-1}function a(n,t,r){return e(n,A.c.toString(),t,r)}function l(n,t,r){return e(n,A.x.toString(),t,r)}function c(n,t,r){return e(n,A.X.toString(),t,r)}function f(n,t,e){var r=M.get(t.slice(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}var s=n.dateTime,h=n.date,p=n.time,g=n.periods,v=n.days,d=n.shortDays,y=n.months,m=n.shortMonths;t.utc=function(n){function e(n){try{va=Hn;var t=new va;return t._=n,r(t)}finally{va=Date}}var r=t(n);return e.parse=function(n){try{va=Hn;var t=r.parse(n);return t&&t._}finally{va=Date}},e.toString=r.toString,e},t.multi=t.utc.multi=ct;var M=ao.map(),x=Vn(v),b=Xn(v),_=Vn(d),w=Xn(d),S=Vn(y),k=Xn(y),N=Vn(m),E=Xn(m);g.forEach(function(n,t){M.set(n.toLowerCase(),t)});var A={a:function(n){return d[n.getDay()]},A:function(n){return v[n.getDay()]},b:function(n){return m[n.getMonth()]},B:function(n){return y[n.getMonth()]},c:t(s),d:function(n,t){return Zn(n.getDate(),t,2)},e:function(n,t){return Zn(n.getDate(),t,2)},H:function(n,t){return Zn(n.getHours(),t,2)},I:function(n,t){return Zn(n.getHours()%12||12,t,2)},j:function(n,t){return Zn(1+ga.dayOfYear(n),t,3)},L:function(n,t){return Zn(n.getMilliseconds(),t,3)},m:function(n,t){return Zn(n.getMonth()+1,t,2)},M:function(n,t){return Zn(n.getMinutes(),t,2)},p:function(n){return g[+(n.getHours()>=12)]},S:function(n,t){return Zn(n.getSeconds(),t,2)},U:function(n,t){return Zn(ga.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return Zn(ga.mondayOfYear(n),t,2)},x:t(h),X:t(p),y:function(n,t){return Zn(n.getFullYear()%100,t,2)},Y:function(n,t){return Zn(n.getFullYear()%1e4,t,4)},Z:at,"%":function(){return"%"}},C={a:r,A:i,b:u,B:o,c:a,d:tt,e:tt,H:rt,I:rt,j:et,L:ot,m:nt,M:it,p:f,S:ut,U:Bn,w:$n,W:Wn,x:l,X:c,y:Gn,Y:Jn,Z:Kn,"%":lt};return t}function Zn(n,t,e){var r=0>n?"-":"",i=(r?-n:n)+"",u=i.length;return r+(e>u?new Array(e-u+1).join(t)+i:i)}function Vn(n){return new RegExp("^(?:"+n.map(ao.requote).join("|")+")","i")}function Xn(n){for(var t=new c,e=-1,r=n.length;++e68?1900:2e3)}function nt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function tt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function et(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function rt(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function it(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function ut(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function ot(n,t,e){ma.lastIndex=0;var r=ma.exec(t.slice(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function at(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=xo(t)/60|0,i=xo(t)%60;return e+Zn(r,"0",2)+Zn(i,"0",2)}function lt(n,t,e){Ma.lastIndex=0;var r=Ma.exec(t.slice(e,e+1));return r?e+r[0].length:-1}function ct(n){for(var t=n.length,e=-1;++e=0?1:-1,a=o*e,l=Math.cos(t),c=Math.sin(t),f=u*c,s=i*l+f*Math.cos(a),h=f*o*Math.sin(a);ka.add(Math.atan2(h,s)),r=n,i=l,u=c}var t,e,r,i,u;Na.point=function(o,a){Na.point=n,r=(t=o)*Yo,i=Math.cos(a=(e=a)*Yo/2+Fo/4),u=Math.sin(a)},Na.lineEnd=function(){n(t,e)}}function dt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function yt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function mt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Mt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function xt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function bt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function _t(n){return[Math.atan2(n[1],n[0]),tn(n[2])]}function wt(n,t){return xo(n[0]-t[0])a;++a)i.point((e=n[a])[0],e[1]);return void i.lineEnd()}var l=new Tt(e,n,null,!0),c=new Tt(e,null,l,!1);l.o=c,u.push(l),o.push(c),l=new Tt(r,n,null,!1),c=new Tt(r,null,l,!0),l.o=c,u.push(l),o.push(c)}}),o.sort(t),qt(u),qt(o),u.length){for(var a=0,l=e,c=o.length;c>a;++a)o[a].e=l=!l;for(var f,s,h=u[0];;){for(var p=h,g=!0;p.v;)if((p=p.n)===h)return;f=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(g)for(var a=0,c=f.length;c>a;++a)i.point((s=f[a])[0],s[1]);else r(p.x,p.n.x,1,i);p=p.n}else{if(g){f=p.p.z;for(var a=f.length-1;a>=0;--a)i.point((s=f[a])[0],s[1])}else r(p.x,p.p.x,-1,i);p=p.p}p=p.o,f=p.z,g=!g}while(!p.v);i.lineEnd()}}}function qt(n){if(t=n.length){for(var t,e,r=0,i=n[0];++r0){for(b||(u.polygonStart(),b=!0),u.lineStart();++o1&&2&t&&e.push(e.pop().concat(e.shift())),p.push(e.filter(Dt))}var p,g,v,d=t(u),y=i.invert(r[0],r[1]),m={point:o,lineStart:l,lineEnd:c,polygonStart:function(){m.point=f,m.lineStart=s,m.lineEnd=h,p=[],g=[]},polygonEnd:function(){m.point=o,m.lineStart=l,m.lineEnd=c,p=ao.merge(p);var n=Ot(y,g);p.length?(b||(u.polygonStart(),b=!0),Lt(p,Ut,n,e,u)):n&&(b||(u.polygonStart(),b=!0),u.lineStart(),e(null,null,1,u),u.lineEnd()),b&&(u.polygonEnd(),b=!1),p=g=null},sphere:function(){u.polygonStart(),u.lineStart(),e(null,null,1,u),u.lineEnd(),u.polygonEnd()}},M=Pt(),x=t(M),b=!1;return m}}function Dt(n){return n.length>1}function Pt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:b,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Ut(n,t){return((n=n.x)[0]<0?n[1]-Io-Uo:Io-n[1])-((t=t.x)[0]<0?t[1]-Io-Uo:Io-t[1])}function jt(n){var t,e=NaN,r=NaN,i=NaN;return{lineStart:function(){n.lineStart(),t=1},point:function(u,o){var a=u>0?Fo:-Fo,l=xo(u-e);xo(l-Fo)0?Io:-Io),n.point(i,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(u,r),t=0):i!==a&&l>=Fo&&(xo(e-i)Uo?Math.atan((Math.sin(t)*(u=Math.cos(r))*Math.sin(e)-Math.sin(r)*(i=Math.cos(t))*Math.sin(n))/(i*u*o)):(t+r)/2}function Ht(n,t,e,r){var i;if(null==n)i=e*Io,r.point(-Fo,i),r.point(0,i),r.point(Fo,i),r.point(Fo,0),r.point(Fo,-i),r.point(0,-i),r.point(-Fo,-i),r.point(-Fo,0),r.point(-Fo,i);else if(xo(n[0]-t[0])>Uo){var u=n[0]a;++a){var c=t[a],f=c.length;if(f)for(var s=c[0],h=s[0],p=s[1]/2+Fo/4,g=Math.sin(p),v=Math.cos(p),d=1;;){d===f&&(d=0),n=c[d];var y=n[0],m=n[1]/2+Fo/4,M=Math.sin(m),x=Math.cos(m),b=y-h,_=b>=0?1:-1,w=_*b,S=w>Fo,k=g*M;if(ka.add(Math.atan2(k*_*Math.sin(w),v*x+k*Math.cos(w))),u+=S?b+_*Ho:b,S^h>=e^y>=e){var N=mt(dt(s),dt(n));bt(N);var E=mt(i,N);bt(E);var A=(S^b>=0?-1:1)*tn(E[2]);(r>A||r===A&&(N[0]||N[1]))&&(o+=S^b>=0?1:-1)}if(!d++)break;h=y,g=M,v=x,s=n}}return(-Uo>u||Uo>u&&-Uo>ka)^1&o}function It(n){function t(n,t){return Math.cos(n)*Math.cos(t)>u}function e(n){var e,u,l,c,f;return{lineStart:function(){c=l=!1,f=1},point:function(s,h){var p,g=[s,h],v=t(s,h),d=o?v?0:i(s,h):v?i(s+(0>s?Fo:-Fo),h):0;if(!e&&(c=l=v)&&n.lineStart(),v!==l&&(p=r(e,g),(wt(e,p)||wt(g,p))&&(g[0]+=Uo,g[1]+=Uo,v=t(g[0],g[1]))),v!==l)f=0,v?(n.lineStart(),p=r(g,e),n.point(p[0],p[1])):(p=r(e,g),n.point(p[0],p[1]),n.lineEnd()),e=p;else if(a&&e&&o^v){var y;d&u||!(y=r(g,e,!0))||(f=0,o?(n.lineStart(),n.point(y[0][0],y[0][1]),n.point(y[1][0],y[1][1]),n.lineEnd()):(n.point(y[1][0],y[1][1]),n.lineEnd(),n.lineStart(),n.point(y[0][0],y[0][1])))}!v||e&&wt(e,g)||n.point(g[0],g[1]),e=g,l=v,u=d},lineEnd:function(){l&&n.lineEnd(),e=null},clean:function(){return f|(c&&l)<<1}}}function r(n,t,e){var r=dt(n),i=dt(t),o=[1,0,0],a=mt(r,i),l=yt(a,a),c=a[0],f=l-c*c;if(!f)return!e&&n;var s=u*l/f,h=-u*c/f,p=mt(o,a),g=xt(o,s),v=xt(a,h);Mt(g,v);var d=p,y=yt(g,d),m=yt(d,d),M=y*y-m*(yt(g,g)-1);if(!(0>M)){var x=Math.sqrt(M),b=xt(d,(-y-x)/m);if(Mt(b,g),b=_t(b),!e)return b;var _,w=n[0],S=t[0],k=n[1],N=t[1];w>S&&(_=w,w=S,S=_);var E=S-w,A=xo(E-Fo)E;if(!A&&k>N&&(_=k,k=N,N=_),C?A?k+N>0^b[1]<(xo(b[0]-w)Fo^(w<=b[0]&&b[0]<=S)){var z=xt(d,(-y+x)/m);return Mt(z,g),[b,_t(z)]}}}function i(t,e){var r=o?n:Fo-n,i=0;return-r>t?i|=1:t>r&&(i|=2),-r>e?i|=4:e>r&&(i|=8),i}var u=Math.cos(n),o=u>0,a=xo(u)>Uo,l=ve(n,6*Yo);return Rt(t,e,l,o?[0,-n]:[-Fo,n-Fo])}function Yt(n,t,e,r){return function(i){var u,o=i.a,a=i.b,l=o.x,c=o.y,f=a.x,s=a.y,h=0,p=1,g=f-l,v=s-c;if(u=n-l,g||!(u>0)){if(u/=g,0>g){if(h>u)return;p>u&&(p=u)}else if(g>0){if(u>p)return;u>h&&(h=u)}if(u=e-l,g||!(0>u)){if(u/=g,0>g){if(u>p)return;u>h&&(h=u)}else if(g>0){if(h>u)return;p>u&&(p=u)}if(u=t-c,v||!(u>0)){if(u/=v,0>v){if(h>u)return;p>u&&(p=u)}else if(v>0){if(u>p)return;u>h&&(h=u)}if(u=r-c,v||!(0>u)){if(u/=v,0>v){if(u>p)return;u>h&&(h=u)}else if(v>0){if(h>u)return;p>u&&(p=u)}return h>0&&(i.a={x:l+h*g,y:c+h*v}),1>p&&(i.b={x:l+p*g,y:c+p*v}),i}}}}}}function Zt(n,t,e,r){function i(r,i){return xo(r[0]-n)0?0:3:xo(r[0]-e)0?2:1:xo(r[1]-t)0?1:0:i>0?3:2}function u(n,t){return o(n.x,t.x)}function o(n,t){var e=i(n,1),r=i(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function l(n){for(var t=0,e=d.length,r=n[1],i=0;e>i;++i)for(var u,o=1,a=d[i],l=a.length,c=a[0];l>o;++o)u=a[o],c[1]<=r?u[1]>r&&Q(c,u,n)>0&&++t:u[1]<=r&&Q(c,u,n)<0&&--t,c=u;return 0!==t}function c(u,a,l,c){var f=0,s=0;if(null==u||(f=i(u,l))!==(s=i(a,l))||o(u,a)<0^l>0){do c.point(0===f||3===f?n:e,f>1?r:t);while((f=(f+l+4)%4)!==s)}else c.point(a[0],a[1])}function f(i,u){return i>=n&&e>=i&&u>=t&&r>=u}function s(n,t){f(n,t)&&a.point(n,t)}function h(){C.point=g,d&&d.push(y=[]),S=!0,w=!1,b=_=NaN}function p(){v&&(g(m,M),x&&w&&E.rejoin(),v.push(E.buffer())),C.point=s,w&&a.lineEnd()}function g(n,t){n=Math.max(-Ha,Math.min(Ha,n)),t=Math.max(-Ha,Math.min(Ha,t));var e=f(n,t);if(d&&y.push([n,t]),S)m=n,M=t,x=e,S=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&w)a.point(n,t);else{var r={a:{x:b,y:_},b:{x:n,y:t}};A(r)?(w||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),k=!1):e&&(a.lineStart(),a.point(n,t),k=!1)}b=n,_=t,w=e}var v,d,y,m,M,x,b,_,w,S,k,N=a,E=Pt(),A=Yt(n,t,e,r),C={point:s,lineStart:h,lineEnd:p,polygonStart:function(){a=E,v=[],d=[],k=!0},polygonEnd:function(){a=N,v=ao.merge(v);var t=l([n,r]),e=k&&t,i=v.length;(e||i)&&(a.polygonStart(),e&&(a.lineStart(),c(null,null,1,a),a.lineEnd()),i&&Lt(v,u,t,c,a),a.polygonEnd()),v=d=y=null}};return C}}function Vt(n){var t=0,e=Fo/3,r=ae(n),i=r(t,e);return i.parallels=function(n){return arguments.length?r(t=n[0]*Fo/180,e=n[1]*Fo/180):[t/Fo*180,e/Fo*180]},i}function Xt(n,t){function e(n,t){var e=Math.sqrt(u-2*i*Math.sin(t))/i;return[e*Math.sin(n*=i),o-e*Math.cos(n)]}var r=Math.sin(n),i=(r+Math.sin(t))/2,u=1+r*(2*i-r),o=Math.sqrt(u)/i;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/i,tn((u-(n*n+e*e)*i*i)/(2*i))]},e}function $t(){function n(n,t){Ia+=i*n-r*t,r=n,i=t}var t,e,r,i;$a.point=function(u,o){$a.point=n,t=r=u,e=i=o},$a.lineEnd=function(){n(t,e)}}function Bt(n,t){Ya>n&&(Ya=n),n>Va&&(Va=n),Za>t&&(Za=t),t>Xa&&(Xa=t)}function Wt(){function n(n,t){o.push("M",n,",",t,u)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function i(){o.push("Z")}var u=Jt(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return u=Jt(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function Jt(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function Gt(n,t){Ca+=n,za+=t,++La}function Kt(){function n(n,r){var i=n-t,u=r-e,o=Math.sqrt(i*i+u*u);qa+=o*(t+n)/2,Ta+=o*(e+r)/2,Ra+=o,Gt(t=n,e=r)}var t,e;Wa.point=function(r,i){Wa.point=n,Gt(t=r,e=i)}}function Qt(){Wa.point=Gt}function ne(){function n(n,t){var e=n-r,u=t-i,o=Math.sqrt(e*e+u*u);qa+=o*(r+n)/2,Ta+=o*(i+t)/2,Ra+=o,o=i*n-r*t,Da+=o*(r+n),Pa+=o*(i+t),Ua+=3*o,Gt(r=n,i=t)}var t,e,r,i;Wa.point=function(u,o){Wa.point=n,Gt(t=r=u,e=i=o)},Wa.lineEnd=function(){n(t,e)}}function te(n){function t(t,e){n.moveTo(t+o,e),n.arc(t,e,o,0,Ho)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function i(){a.point=t}function u(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:i,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=i,a.point=t},pointRadius:function(n){return o=n,a},result:b};return a}function ee(n){function t(n){return(a?r:e)(n)}function e(t){return ue(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){M=NaN,S.point=u,t.lineStart()}function u(e,r){var u=dt([e,r]),o=n(e,r);i(M,x,m,b,_,w,M=o[0],x=o[1],m=e,b=u[0],_=u[1],w=u[2],a,t),t.point(M,x)}function o(){S.point=e,t.lineEnd()}function l(){ +r(),S.point=c,S.lineEnd=f}function c(n,t){u(s=n,h=t),p=M,g=x,v=b,d=_,y=w,S.point=u}function f(){i(M,x,m,b,_,w,p,g,s,v,d,y,a,t),S.lineEnd=o,o()}var s,h,p,g,v,d,y,m,M,x,b,_,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=l},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function i(t,e,r,a,l,c,f,s,h,p,g,v,d,y){var m=f-t,M=s-e,x=m*m+M*M;if(x>4*u&&d--){var b=a+p,_=l+g,w=c+v,S=Math.sqrt(b*b+_*_+w*w),k=Math.asin(w/=S),N=xo(xo(w)-1)u||xo((m*z+M*L)/x-.5)>.3||o>a*p+l*g+c*v)&&(i(t,e,r,a,l,c,A,C,N,b/=S,_/=S,w,d,y),y.point(A,C),i(A,C,N,b,_,w,f,s,h,p,g,v,d,y))}}var u=.5,o=Math.cos(30*Yo),a=16;return t.precision=function(n){return arguments.length?(a=(u=n*n)>0&&16,t):Math.sqrt(u)},t}function re(n){var t=ee(function(t,e){return n([t*Zo,e*Zo])});return function(n){return le(t(n))}}function ie(n){this.stream=n}function ue(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function oe(n){return ae(function(){return n})()}function ae(n){function t(n){return n=a(n[0]*Yo,n[1]*Yo),[n[0]*h+l,c-n[1]*h]}function e(n){return n=a.invert((n[0]-l)/h,(c-n[1])/h),n&&[n[0]*Zo,n[1]*Zo]}function r(){a=Ct(o=se(y,M,x),u);var n=u(v,d);return l=p-n[0]*h,c=g+n[1]*h,i()}function i(){return f&&(f.valid=!1,f=null),t}var u,o,a,l,c,f,s=ee(function(n,t){return n=u(n,t),[n[0]*h+l,c-n[1]*h]}),h=150,p=480,g=250,v=0,d=0,y=0,M=0,x=0,b=Fa,_=m,w=null,S=null;return t.stream=function(n){return f&&(f.valid=!1),f=le(b(o,s(_(n)))),f.valid=!0,f},t.clipAngle=function(n){return arguments.length?(b=null==n?(w=n,Fa):It((w=+n)*Yo),i()):w},t.clipExtent=function(n){return arguments.length?(S=n,_=n?Zt(n[0][0],n[0][1],n[1][0],n[1][1]):m,i()):S},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(p=+n[0],g=+n[1],r()):[p,g]},t.center=function(n){return arguments.length?(v=n[0]%360*Yo,d=n[1]%360*Yo,r()):[v*Zo,d*Zo]},t.rotate=function(n){return arguments.length?(y=n[0]%360*Yo,M=n[1]%360*Yo,x=n.length>2?n[2]%360*Yo:0,r()):[y*Zo,M*Zo,x*Zo]},ao.rebind(t,s,"precision"),function(){return u=n.apply(this,arguments),t.invert=u.invert&&e,r()}}function le(n){return ue(n,function(t,e){n.point(t*Yo,e*Yo)})}function ce(n,t){return[n,t]}function fe(n,t){return[n>Fo?n-Ho:-Fo>n?n+Ho:n,t]}function se(n,t,e){return n?t||e?Ct(pe(n),ge(t,e)):pe(n):t||e?ge(t,e):fe}function he(n){return function(t,e){return t+=n,[t>Fo?t-Ho:-Fo>t?t+Ho:t,e]}}function pe(n){var t=he(n);return t.invert=he(-n),t}function ge(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*r+a*i;return[Math.atan2(l*u-f*o,a*r-c*i),tn(f*u+l*o)]}var r=Math.cos(n),i=Math.sin(n),u=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,l=Math.sin(n)*e,c=Math.sin(t),f=c*u-l*o;return[Math.atan2(l*u+c*o,a*r+f*i),tn(f*r-a*i)]},e}function ve(n,t){var e=Math.cos(n),r=Math.sin(n);return function(i,u,o,a){var l=o*t;null!=i?(i=de(e,i),u=de(e,u),(o>0?u>i:i>u)&&(i+=o*Ho)):(i=n+o*Ho,u=n-.5*l);for(var c,f=i;o>0?f>u:u>f;f-=l)a.point((c=_t([e,-r*Math.cos(f),-r*Math.sin(f)]))[0],c[1])}}function de(n,t){var e=dt(t);e[0]-=n,bt(e);var r=nn(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Uo)%(2*Math.PI)}function ye(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function me(n,t,e){var r=ao.range(n,t-Uo,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Me(n){return n.source}function xe(n){return n.target}function be(n,t,e,r){var i=Math.cos(t),u=Math.sin(t),o=Math.cos(r),a=Math.sin(r),l=i*Math.cos(n),c=i*Math.sin(n),f=o*Math.cos(e),s=o*Math.sin(e),h=2*Math.asin(Math.sqrt(on(r-t)+i*o*on(e-n))),p=1/Math.sin(h),g=h?function(n){var t=Math.sin(n*=h)*p,e=Math.sin(h-n)*p,r=e*l+t*f,i=e*c+t*s,o=e*u+t*a;return[Math.atan2(i,r)*Zo,Math.atan2(o,Math.sqrt(r*r+i*i))*Zo]}:function(){return[n*Zo,t*Zo]};return g.distance=h,g}function _e(){function n(n,i){var u=Math.sin(i*=Yo),o=Math.cos(i),a=xo((n*=Yo)-t),l=Math.cos(a);Ja+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*u-e*o*l)*a),e*u+r*o*l),t=n,e=u,r=o}var t,e,r;Ga.point=function(i,u){t=i*Yo,e=Math.sin(u*=Yo),r=Math.cos(u),Ga.point=n},Ga.lineEnd=function(){Ga.point=Ga.lineEnd=b}}function we(n,t){function e(t,e){var r=Math.cos(t),i=Math.cos(e),u=n(r*i);return[u*i*Math.sin(t),u*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),i=t(r),u=Math.sin(i),o=Math.cos(i);return[Math.atan2(n*u,r*o),Math.asin(r&&e*u/r)]},e}function Se(n,t){function e(n,t){o>0?-Io+Uo>t&&(t=-Io+Uo):t>Io-Uo&&(t=Io-Uo);var e=o/Math.pow(i(t),u);return[e*Math.sin(u*n),o-e*Math.cos(u*n)]}var r=Math.cos(n),i=function(n){return Math.tan(Fo/4+n/2)},u=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(i(t)/i(n)),o=r*Math.pow(i(n),u)/u;return u?(e.invert=function(n,t){var e=o-t,r=K(u)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/u,2*Math.atan(Math.pow(o/r,1/u))-Io]},e):Ne}function ke(n,t){function e(n,t){var e=u-t;return[e*Math.sin(i*n),u-e*Math.cos(i*n)]}var r=Math.cos(n),i=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),u=r/i+n;return xo(i)i;i++){for(;r>1&&Q(n[e[r-2]],n[e[r-1]],n[i])<=0;)--r;e[r++]=i}return e.slice(0,r)}function qe(n,t){return n[0]-t[0]||n[1]-t[1]}function Te(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Re(n,t,e,r){var i=n[0],u=e[0],o=t[0]-i,a=r[0]-u,l=n[1],c=e[1],f=t[1]-l,s=r[1]-c,h=(a*(l-c)-s*(i-u))/(s*o-a*f);return[i+h*o,l+h*f]}function De(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Pe(){rr(this),this.edge=this.site=this.circle=null}function Ue(n){var t=cl.pop()||new Pe;return t.site=n,t}function je(n){Be(n),ol.remove(n),cl.push(n),rr(n)}function Fe(n){var t=n.circle,e=t.x,r=t.cy,i={x:e,y:r},u=n.P,o=n.N,a=[n];je(n);for(var l=u;l.circle&&xo(e-l.circle.x)f;++f)c=a[f],l=a[f-1],nr(c.edge,l.site,c.site,i);l=a[0],c=a[s-1],c.edge=Ke(l.site,c.site,null,i),$e(l),$e(c)}function He(n){for(var t,e,r,i,u=n.x,o=n.y,a=ol._;a;)if(r=Oe(a,o)-u,r>Uo)a=a.L;else{if(i=u-Ie(a,o),!(i>Uo)){r>-Uo?(t=a.P,e=a):i>-Uo?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var l=Ue(n);if(ol.insert(t,l),t||e){if(t===e)return Be(t),e=Ue(t.site),ol.insert(l,e),l.edge=e.edge=Ke(t.site,l.site),$e(t),void $e(e);if(!e)return void(l.edge=Ke(t.site,l.site));Be(t),Be(e);var c=t.site,f=c.x,s=c.y,h=n.x-f,p=n.y-s,g=e.site,v=g.x-f,d=g.y-s,y=2*(h*d-p*v),m=h*h+p*p,M=v*v+d*d,x={x:(d*m-p*M)/y+f,y:(h*M-v*m)/y+s};nr(e.edge,c,g,x),l.edge=Ke(c,n,null,x),e.edge=Ke(n,g,null,x),$e(t),$e(e)}}function Oe(n,t){var e=n.site,r=e.x,i=e.y,u=i-t;if(!u)return r;var o=n.P;if(!o)return-(1/0);e=o.site;var a=e.x,l=e.y,c=l-t;if(!c)return a;var f=a-r,s=1/u-1/c,h=f/c;return s?(-h+Math.sqrt(h*h-2*s*(f*f/(-2*c)-l+c/2+i-u/2)))/s+r:(r+a)/2}function Ie(n,t){var e=n.N;if(e)return Oe(e,t);var r=n.site;return r.y===t?r.x:1/0}function Ye(n){this.site=n,this.edges=[]}function Ze(n){for(var t,e,r,i,u,o,a,l,c,f,s=n[0][0],h=n[1][0],p=n[0][1],g=n[1][1],v=ul,d=v.length;d--;)if(u=v[d],u&&u.prepare())for(a=u.edges,l=a.length,o=0;l>o;)f=a[o].end(),r=f.x,i=f.y,c=a[++o%l].start(),t=c.x,e=c.y,(xo(r-t)>Uo||xo(i-e)>Uo)&&(a.splice(o,0,new tr(Qe(u.site,f,xo(r-s)Uo?{x:s,y:xo(t-s)Uo?{x:xo(e-g)Uo?{x:h,y:xo(t-h)Uo?{x:xo(e-p)=-jo)){var p=l*l+c*c,g=f*f+s*s,v=(s*p-c*g)/h,d=(l*g-f*p)/h,s=d+a,y=fl.pop()||new Xe;y.arc=n,y.site=i,y.x=v+o,y.y=s+Math.sqrt(v*v+d*d),y.cy=s,n.circle=y;for(var m=null,M=ll._;M;)if(y.yd||d>=a)return;if(h>g){if(u){if(u.y>=c)return}else u={x:d,y:l};e={x:d,y:c}}else{if(u){if(u.yr||r>1)if(h>g){if(u){if(u.y>=c)return}else u={x:(l-i)/r,y:l};e={x:(c-i)/r,y:c}}else{if(u){if(u.yp){if(u){if(u.x>=a)return}else u={x:o,y:r*o+i};e={x:a,y:r*a+i}}else{if(u){if(u.xu||s>o||r>h||i>p)){if(g=n.point){var g,v=t-n.x,d=e-n.y,y=v*v+d*d;if(l>y){var m=Math.sqrt(l=y);r=t-m,i=e-m,u=t+m,o=e+m,a=g}}for(var M=n.nodes,x=.5*(f+h),b=.5*(s+p),_=t>=x,w=e>=b,S=w<<1|_,k=S+4;k>S;++S)if(n=M[3&S])switch(3&S){case 0:c(n,f,s,x,b);break;case 1:c(n,x,s,h,b);break;case 2:c(n,f,b,x,p);break;case 3:c(n,x,b,h,p)}}}(n,r,i,u,o),a}function vr(n,t){n=ao.rgb(n),t=ao.rgb(t);var e=n.r,r=n.g,i=n.b,u=t.r-e,o=t.g-r,a=t.b-i;return function(n){return"#"+bn(Math.round(e+u*n))+bn(Math.round(r+o*n))+bn(Math.round(i+a*n))}}function dr(n,t){var e,r={},i={};for(e in n)e in t?r[e]=Mr(n[e],t[e]):i[e]=n[e];for(e in t)e in n||(i[e]=t[e]);return function(n){for(e in r)i[e]=r[e](n);return i}}function yr(n,t){return n=+n,t=+t,function(e){return n*(1-e)+t*e}}function mr(n,t){var e,r,i,u=hl.lastIndex=pl.lastIndex=0,o=-1,a=[],l=[];for(n+="",t+="";(e=hl.exec(n))&&(r=pl.exec(t));)(i=r.index)>u&&(i=t.slice(u,i),a[o]?a[o]+=i:a[++o]=i),(e=e[0])===(r=r[0])?a[o]?a[o]+=r:a[++o]=r:(a[++o]=null,l.push({i:o,x:yr(e,r)})),u=pl.lastIndex;return ur;++r)a[(e=l[r]).i]=e.x(n);return a.join("")})}function Mr(n,t){for(var e,r=ao.interpolators.length;--r>=0&&!(e=ao.interpolators[r](n,t)););return e}function xr(n,t){var e,r=[],i=[],u=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(Mr(n[e],t[e]));for(;u>e;++e)i[e]=n[e];for(;o>e;++e)i[e]=t[e];return function(n){for(e=0;a>e;++e)i[e]=r[e](n);return i}}function br(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function _r(n){return function(t){return 1-n(1-t)}}function wr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Sr(n){return n*n}function kr(n){return n*n*n}function Nr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Er(n){return function(t){return Math.pow(t,n)}}function Ar(n){return 1-Math.cos(n*Io)}function Cr(n){return Math.pow(2,10*(n-1))}function zr(n){return 1-Math.sqrt(1-n*n)}function Lr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ho*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ho/t)}}function qr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Tr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function Rr(n,t){n=ao.hcl(n),t=ao.hcl(t);var e=n.h,r=n.c,i=n.l,u=t.h-e,o=t.c-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return sn(e+u*n,r+o*n,i+a*n)+""}}function Dr(n,t){n=ao.hsl(n),t=ao.hsl(t);var e=n.h,r=n.s,i=n.l,u=t.h-e,o=t.s-r,a=t.l-i;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(u)?(u=0,e=isNaN(e)?t.h:e):u>180?u-=360:-180>u&&(u+=360),function(n){return cn(e+u*n,r+o*n,i+a*n)+""}}function Pr(n,t){n=ao.lab(n),t=ao.lab(t);var e=n.l,r=n.a,i=n.b,u=t.l-e,o=t.a-r,a=t.b-i;return function(n){return pn(e+u*n,r+o*n,i+a*n)+""}}function Ur(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function jr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Hr(t),i=Fr(t,e),u=Hr(Or(e,t,-i))||0;t[0]*e[1]180?t+=360:t-n>180&&(n+=360),r.push({i:e.push(Ir(e)+"rotate(",null,")")-2,x:yr(n,t)})):t&&e.push(Ir(e)+"rotate("+t+")")}function Vr(n,t,e,r){n!==t?r.push({i:e.push(Ir(e)+"skewX(",null,")")-2,x:yr(n,t)}):t&&e.push(Ir(e)+"skewX("+t+")")}function Xr(n,t,e,r){if(n[0]!==t[0]||n[1]!==t[1]){var i=e.push(Ir(e)+"scale(",null,",",null,")");r.push({i:i-4,x:yr(n[0],t[0])},{i:i-2,x:yr(n[1],t[1])})}else 1===t[0]&&1===t[1]||e.push(Ir(e)+"scale("+t+")")}function $r(n,t){var e=[],r=[];return n=ao.transform(n),t=ao.transform(t),Yr(n.translate,t.translate,e,r),Zr(n.rotate,t.rotate,e,r),Vr(n.skew,t.skew,e,r),Xr(n.scale,t.scale,e,r),n=t=null,function(n){for(var t,i=-1,u=r.length;++i=0;)e.push(i[r])}function oi(n,t){for(var e=[n],r=[];null!=(n=e.pop());)if(r.push(n),(u=n.children)&&(i=u.length))for(var i,u,o=-1;++oe;++e)(t=n[e][1])>i&&(r=e,i=t);return r}function yi(n){return n.reduce(mi,0)}function mi(n,t){return n+t[1]}function Mi(n,t){return xi(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function xi(n,t){for(var e=-1,r=+n[0],i=(n[1]-r)/t,u=[];++e<=t;)u[e]=i*e+r;return u}function bi(n){return[ao.min(n),ao.max(n)]}function _i(n,t){return n.value-t.value}function wi(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Si(n,t){n._pack_next=t,t._pack_prev=n}function ki(n,t){var e=t.x-n.x,r=t.y-n.y,i=n.r+t.r;return.999*i*i>e*e+r*r}function Ni(n){function t(n){f=Math.min(n.x-n.r,f),s=Math.max(n.x+n.r,s),h=Math.min(n.y-n.r,h),p=Math.max(n.y+n.r,p)}if((e=n.children)&&(c=e.length)){var e,r,i,u,o,a,l,c,f=1/0,s=-(1/0),h=1/0,p=-(1/0);if(e.forEach(Ei),r=e[0],r.x=-r.r,r.y=0,t(r),c>1&&(i=e[1],i.x=i.r,i.y=0,t(i),c>2))for(u=e[2],zi(r,i,u),t(u),wi(r,u),r._pack_prev=u,wi(u,i),i=r._pack_next,o=3;c>o;o++){zi(r,i,u=e[o]);var g=0,v=1,d=1;for(a=i._pack_next;a!==i;a=a._pack_next,v++)if(ki(a,u)){g=1;break}if(1==g)for(l=r._pack_prev;l!==a._pack_prev&&!ki(l,u);l=l._pack_prev,d++);g?(d>v||v==d&&i.ro;o++)u=e[o],u.x-=y,u.y-=m,M=Math.max(M,u.r+Math.sqrt(u.x*u.x+u.y*u.y));n.r=M,e.forEach(Ai)}}function Ei(n){n._pack_next=n._pack_prev=n}function Ai(n){delete n._pack_next,delete n._pack_prev}function Ci(n,t,e,r){var i=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,i)for(var u=-1,o=i.length;++u=0;)t=i[u],t.z+=e,t.m+=e,e+=t.s+(r+=t.c)}function Pi(n,t,e){return n.a.parent===t.parent?n.a:e}function Ui(n){return 1+ao.max(n,function(n){return n.y})}function ji(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Fi(n){var t=n.children;return t&&t.length?Fi(t[0]):n}function Hi(n){var t,e=n.children;return e&&(t=e.length)?Hi(e[t-1]):n}function Oi(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Ii(n,t){var e=n.x+t[3],r=n.y+t[0],i=n.dx-t[1]-t[3],u=n.dy-t[0]-t[2];return 0>i&&(e+=i/2,i=0),0>u&&(r+=u/2,u=0),{x:e,y:r,dx:i,dy:u}}function Yi(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function Zi(n){return n.rangeExtent?n.rangeExtent():Yi(n.range())}function Vi(n,t,e,r){var i=e(n[0],n[1]),u=r(t[0],t[1]);return function(n){return u(i(n))}}function Xi(n,t){var e,r=0,i=n.length-1,u=n[r],o=n[i];return u>o&&(e=r,r=i,i=e,e=u,u=o,o=e),n[r]=t.floor(u),n[i]=t.ceil(o),n}function $i(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:Sl}function Bi(n,t,e,r){var i=[],u=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]2?Bi:Vi,l=r?Wr:Br;return o=i(n,t,l,e),a=i(t,n,l,Mr),u}function u(n){return o(n)}var o,a;return u.invert=function(n){return a(n)},u.domain=function(t){return arguments.length?(n=t.map(Number),i()):n},u.range=function(n){return arguments.length?(t=n,i()):t},u.rangeRound=function(n){return u.range(n).interpolate(Ur)},u.clamp=function(n){return arguments.length?(r=n,i()):r},u.interpolate=function(n){return arguments.length?(e=n,i()):e},u.ticks=function(t){return Qi(n,t)},u.tickFormat=function(t,e){return nu(n,t,e)},u.nice=function(t){return Gi(n,t),i()},u.copy=function(){return Wi(n,t,e,r)},i()}function Ji(n,t){return ao.rebind(n,t,"range","rangeRound","interpolate","clamp")}function Gi(n,t){return Xi(n,$i(Ki(n,t)[2])),Xi(n,$i(Ki(n,t)[2])),n}function Ki(n,t){null==t&&(t=10);var e=Yi(n),r=e[1]-e[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),u=t/r*i;return.15>=u?i*=10:.35>=u?i*=5:.75>=u&&(i*=2),e[0]=Math.ceil(e[0]/i)*i,e[1]=Math.floor(e[1]/i)*i+.5*i,e[2]=i,e}function Qi(n,t){return ao.range.apply(ao,Ki(n,t))}function nu(n,t,e){var r=Ki(n,t);if(e){var i=ha.exec(e);if(i.shift(),"s"===i[8]){var u=ao.formatPrefix(Math.max(xo(r[0]),xo(r[1])));return i[7]||(i[7]="."+tu(u.scale(r[2]))),i[8]="f",e=ao.format(i.join("")),function(n){return e(u.scale(n))+u.symbol}}i[7]||(i[7]="."+eu(i[8],r)),e=i.join("")}else e=",."+tu(r[2])+"f";return ao.format(e)}function tu(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function eu(n,t){var e=tu(t[2]);return n in kl?Math.abs(e-tu(Math.max(xo(t[0]),xo(t[1]))))+ +("e"!==n):e-2*("%"===n)}function ru(n,t,e,r){function i(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function u(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(i(t))}return o.invert=function(t){return u(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(i)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(i)),o):t},o.nice=function(){var t=Xi(r.map(i),e?Math:El);return n.domain(t),r=t.map(u),o},o.ticks=function(){var n=Yi(r),o=[],a=n[0],l=n[1],c=Math.floor(i(a)),f=Math.ceil(i(l)),s=t%1?2:t;if(isFinite(f-c)){if(e){for(;f>c;c++)for(var h=1;s>h;h++)o.push(u(c)*h);o.push(u(c))}else for(o.push(u(c));c++0;h--)o.push(u(c)*h);for(c=0;o[c]l;f--);o=o.slice(c,f)}return o},o.tickFormat=function(n,e){if(!arguments.length)return Nl;arguments.length<2?e=Nl:"function"!=typeof e&&(e=ao.format(e));var r=Math.max(1,t*n/o.ticks().length);return function(n){var o=n/u(Math.round(i(n)));return t-.5>o*t&&(o*=t),r>=o?e(n):""}},o.copy=function(){return ru(n.copy(),t,e,r)},Ji(o,n)}function iu(n,t,e){function r(t){return n(i(t))}var i=uu(t),u=uu(1/t);return r.invert=function(t){return u(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(i)),r):e},r.ticks=function(n){return Qi(e,n)},r.tickFormat=function(n,t){return nu(e,n,t)},r.nice=function(n){return r.domain(Gi(e,n))},r.exponent=function(o){return arguments.length?(i=uu(t=o),u=uu(1/t),n.domain(e.map(i)),r):t},r.copy=function(){return iu(n.copy(),t,e)},Ji(r,n)}function uu(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function ou(n,t){function e(e){return u[((i.get(e)||("range"===t.t?i.set(e,n.push(e)):NaN))-1)%u.length]}function r(t,e){return ao.range(n.length).map(function(n){return t+e*n})}var i,u,o;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new c;for(var u,o=-1,a=r.length;++oe?[NaN,NaN]:[e>0?a[e-1]:n[0],et?NaN:t/u+n,[t,t+1/u]},r.copy=function(){return lu(n,t,e)},i()}function cu(n,t){function e(e){return e>=e?t[ao.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return cu(n,t)},e}function fu(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return Qi(n,t)},t.tickFormat=function(t,e){return nu(n,t,e)},t.copy=function(){return fu(n)},t}function su(){return 0}function hu(n){return n.innerRadius}function pu(n){return n.outerRadius}function gu(n){return n.startAngle}function vu(n){return n.endAngle}function du(n){return n&&n.padAngle}function yu(n,t,e,r){return(n-e)*t-(t-r)*n>0?0:1}function mu(n,t,e,r,i){var u=n[0]-t[0],o=n[1]-t[1],a=(i?r:-r)/Math.sqrt(u*u+o*o),l=a*o,c=-a*u,f=n[0]+l,s=n[1]+c,h=t[0]+l,p=t[1]+c,g=(f+h)/2,v=(s+p)/2,d=h-f,y=p-s,m=d*d+y*y,M=e-r,x=f*p-h*s,b=(0>y?-1:1)*Math.sqrt(Math.max(0,M*M*m-x*x)),_=(x*y-d*b)/m,w=(-x*d-y*b)/m,S=(x*y+d*b)/m,k=(-x*d+y*b)/m,N=_-g,E=w-v,A=S-g,C=k-v;return N*N+E*E>A*A+C*C&&(_=S,w=k),[[_-l,w-c],[_*e/M,w*e/M]]}function Mu(n){function t(t){function o(){c.push("M",u(n(f),a))}for(var l,c=[],f=[],s=-1,h=t.length,p=En(e),g=En(r);++s1?n.join("L"):n+"Z"}function bu(n){return n.join("L")+"Z"}function _u(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1&&i.push("H",r[0]),i.join("")}function wu(n){for(var t=0,e=n.length,r=n[0],i=[r[0],",",r[1]];++t1){a=t[1],u=n[l],l++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(u[0]-a[0])+","+(u[1]-a[1])+","+u[0]+","+u[1];for(var c=2;c9&&(i=3*t/Math.sqrt(i),o[a]=i*e,o[a+1]=i*r));for(a=-1;++a<=l;)i=(n[Math.min(l,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),u.push([i||0,o[a]*i||0]);return u}function Fu(n){return n.length<3?xu(n):n[0]+Au(n,ju(n))}function Hu(n){for(var t,e,r,i=-1,u=n.length;++i=t?o(n-t):void(f.c=o)}function o(e){var i=g.active,u=g[i];u&&(u.timer.c=null,u.timer.t=NaN,--g.count,delete g[i],u.event&&u.event.interrupt.call(n,n.__data__,u.index));for(var o in g)if(r>+o){var c=g[o];c.timer.c=null,c.timer.t=NaN,--g.count,delete g[o]}f.c=a,qn(function(){return f.c&&a(e||1)&&(f.c=null,f.t=NaN),1},0,l),g.active=r,v.event&&v.event.start.call(n,n.__data__,t),p=[],v.tween.forEach(function(e,r){(r=r.call(n,n.__data__,t))&&p.push(r)}),h=v.ease,s=v.duration}function a(i){for(var u=i/s,o=h(u),a=p.length;a>0;)p[--a].call(n,o);return u>=1?(v.event&&v.event.end.call(n,n.__data__,t),--g.count?delete g[r]:delete n[e],1):void 0}var l,f,s,h,p,g=n[e]||(n[e]={active:0,count:0}),v=g[r];v||(l=i.time,f=qn(u,0,l),v=g[r]={tween:new c,time:l,timer:f,delay:i.delay,duration:i.duration,ease:i.ease,index:t},i=null,++g.count)}function no(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate("+(isFinite(r)?r:e(n))+",0)"})}function to(n,t,e){n.attr("transform",function(n){var r=t(n);return"translate(0,"+(isFinite(r)?r:e(n))+")"})}function eo(n){return n.toISOString()}function ro(n,t,e){function r(t){return n(t)}function i(n,e){var r=n[1]-n[0],i=r/e,u=ao.bisect(Kl,i);return u==Kl.length?[t.year,Ki(n.map(function(n){return n/31536e6}),e)[2]]:u?t[i/Kl[u-1]1?{floor:function(t){for(;e(t=n.floor(t));)t=io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=Yi(r.domain()),u=null==n?i(e,10):"number"==typeof n?i(e,n):!n.range&&[{range:n},t];return u&&(n=u[0],t=u[1]),n.range(e[0],io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return ro(n.copy(),t,e)},Ji(r,n)}function io(n){return new Date(n)}function uo(n){return JSON.parse(n.responseText)}function oo(n){var t=fo.createRange();return t.selectNode(fo.body),t.createContextualFragment(n.responseText)}var ao={version:"3.5.17"},lo=[].slice,co=function(n){return lo.call(n)},fo=this.document;if(fo)try{co(fo.documentElement.childNodes)[0].nodeType}catch(so){co=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}if(Date.now||(Date.now=function(){return+new Date}),fo)try{fo.createElement("DIV").style.setProperty("opacity",0,"")}catch(ho){var po=this.Element.prototype,go=po.setAttribute,vo=po.setAttributeNS,yo=this.CSSStyleDeclaration.prototype,mo=yo.setProperty;po.setAttribute=function(n,t){go.call(this,n,t+"")},po.setAttributeNS=function(n,t,e){vo.call(this,n,t,e+"")},yo.setProperty=function(n,t,e){mo.call(this,n,t+"",e)}}ao.ascending=e,ao.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:NaN},ao.min=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ir&&(e=r)}else{for(;++i=r){e=r;break}for(;++ir&&(e=r)}return e},ao.max=function(n,t){var e,r,i=-1,u=n.length;if(1===arguments.length){for(;++i=r){e=r;break}for(;++ie&&(e=r)}else{for(;++i=r){e=r;break}for(;++ie&&(e=r)}return e},ao.extent=function(n,t){var e,r,i,u=-1,o=n.length;if(1===arguments.length){for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}else{for(;++u=r){e=i=r;break}for(;++ur&&(e=r),r>i&&(i=r))}return[e,i]},ao.sum=function(n,t){var e,r=0,u=n.length,o=-1;if(1===arguments.length)for(;++o1?l/(f-1):void 0},ao.deviation=function(){var n=ao.variance.apply(this,arguments);return n?Math.sqrt(n):n};var Mo=u(e);ao.bisectLeft=Mo.left,ao.bisect=ao.bisectRight=Mo.right,ao.bisector=function(n){return u(1===n.length?function(t,r){return e(n(t),r)}:n)},ao.shuffle=function(n,t,e){(u=arguments.length)<3&&(e=n.length,2>u&&(t=0));for(var r,i,u=e-t;u;)i=Math.random()*u--|0,r=n[u+t],n[u+t]=n[i+t],n[i+t]=r;return n},ao.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},ao.pairs=function(n){for(var t,e=0,r=n.length-1,i=n[0],u=new Array(0>r?0:r);r>e;)u[e]=[t=i,i=n[++e]];return u},ao.transpose=function(n){if(!(i=n.length))return[];for(var t=-1,e=ao.min(n,o),r=new Array(e);++t=0;)for(r=n[i],t=r.length;--t>=0;)e[--o]=r[t];return e};var xo=Math.abs;ao.range=function(n,t,e){if(arguments.length<3&&(e=1,arguments.length<2&&(t=n,n=0)),(t-n)/e===1/0)throw new Error("infinite range");var r,i=[],u=a(xo(e)),o=-1;if(n*=u,t*=u,e*=u,0>e)for(;(r=n+e*++o)>t;)i.push(r/u);else for(;(r=n+e*++o)=u.length)return r?r.call(i,o):e?o.sort(e):o;for(var l,f,s,h,p=-1,g=o.length,v=u[a++],d=new c;++p=u.length)return n;var r=[],i=o[e++];return n.forEach(function(n,i){r.push({key:n,values:t(i,e)})}),i?r.sort(function(n,t){return i(n.key,t.key)}):r}var e,r,i={},u=[],o=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n(ao.map,e,0),0)},i.key=function(n){return u.push(n),i},i.sortKeys=function(n){return o[u.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},ao.set=function(n){var t=new y;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},l(y,{has:h,add:function(n){return this._[f(n+="")]=!0,n},remove:p,values:g,size:v,empty:d,forEach:function(n){for(var t in this._)n.call(this,s(t))}}),ao.behavior={},ao.rebind=function(n,t){for(var e,r=1,i=arguments.length;++r=0&&(r=n.slice(e+1),n=n.slice(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},ao.event=null,ao.requote=function(n){return n.replace(So,"\\$&")};var So=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ko={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},No=function(n,t){return t.querySelector(n)},Eo=function(n,t){return t.querySelectorAll(n)},Ao=function(n,t){var e=n.matches||n[x(n,"matchesSelector")];return(Ao=function(n,t){return e.call(n,t)})(n,t)};"function"==typeof Sizzle&&(No=function(n,t){return Sizzle(n,t)[0]||null},Eo=Sizzle,Ao=Sizzle.matchesSelector),ao.selection=function(){return ao.select(fo.documentElement)};var Co=ao.selection.prototype=[];Co.select=function(n){var t,e,r,i,u=[];n=A(n);for(var o=-1,a=this.length;++o=0&&"xmlns"!==(e=n.slice(0,t))&&(n=n.slice(t+1)),Lo.hasOwnProperty(e)?{space:Lo[e],local:n}:n}},Co.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=ao.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(z(t,n[t]));return this}return this.each(z(n,t))},Co.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=T(n)).length,i=-1;if(t=e.classList){for(;++ii){if("string"!=typeof n){2>i&&(e="");for(r in n)this.each(P(r,n[r],e));return this}if(2>i){var u=this.node();return t(u).getComputedStyle(u,null).getPropertyValue(n)}r=""}return this.each(P(n,e,r))},Co.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(U(t,n[t]));return this}return this.each(U(n,t))},Co.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},Co.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},Co.append=function(n){return n=j(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},Co.insert=function(n,t){return n=j(n),t=A(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},Co.remove=function(){return this.each(F)},Co.data=function(n,t){function e(n,e){var r,i,u,o=n.length,s=e.length,h=Math.min(o,s),p=new Array(s),g=new Array(s),v=new Array(o);if(t){var d,y=new c,m=new Array(o);for(r=-1;++rr;++r)g[r]=H(e[r]);for(;o>r;++r)v[r]=n[r]}g.update=p,g.parentNode=p.parentNode=v.parentNode=n.parentNode,a.push(g),l.push(p),f.push(v)}var r,i,u=-1,o=this.length;if(!arguments.length){for(n=new Array(o=(r=this[0]).length);++uu;u++){i.push(t=[]),t.parentNode=(e=this[u]).parentNode;for(var a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return E(i)},Co.order=function(){for(var n=-1,t=this.length;++n=0;)(e=r[i])&&(u&&u!==e.nextSibling&&u.parentNode.insertBefore(e,u),u=e);return this},Co.sort=function(n){n=I.apply(this,arguments);for(var t=-1,e=this.length;++tn;n++)for(var e=this[n],r=0,i=e.length;i>r;r++){var u=e[r];if(u)return u}return null},Co.size=function(){var n=0;return Y(this,function(){++n}),n};var qo=[];ao.selection.enter=Z,ao.selection.enter.prototype=qo,qo.append=Co.append,qo.empty=Co.empty,qo.node=Co.node,qo.call=Co.call,qo.size=Co.size,qo.select=function(n){for(var t,e,r,i,u,o=[],a=-1,l=this.length;++ar){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(X(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(X(n,t,e))};var To=ao.map({mouseenter:"mouseover",mouseleave:"mouseout"});fo&&To.forEach(function(n){"on"+n in fo&&To.remove(n)});var Ro,Do=0;ao.mouse=function(n){return J(n,k())};var Po=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;ao.touch=function(n,t,e){if(arguments.length<3&&(e=t,t=k().changedTouches),t)for(var r,i=0,u=t.length;u>i;++i)if((r=t[i]).identifier===e)return J(n,r)},ao.behavior.drag=function(){function n(){this.on("mousedown.drag",u).on("touchstart.drag",o)}function e(n,t,e,u,o){return function(){function a(){var n,e,r=t(h,v);r&&(n=r[0]-M[0],e=r[1]-M[1],g|=n|e,M=r,p({type:"drag",x:r[0]+c[0],y:r[1]+c[1],dx:n,dy:e}))}function l(){t(h,v)&&(y.on(u+d,null).on(o+d,null),m(g),p({type:"dragend"}))}var c,f=this,s=ao.event.target.correspondingElement||ao.event.target,h=f.parentNode,p=r.of(f,arguments),g=0,v=n(),d=".drag"+(null==v?"":"-"+v),y=ao.select(e(s)).on(u+d,a).on(o+d,l),m=W(s),M=t(h,v);i?(c=i.apply(f,arguments),c=[c.x-M[0],c.y-M[1]]):c=[0,0],p({type:"dragstart"})}}var r=N(n,"drag","dragstart","dragend"),i=null,u=e(b,ao.mouse,t,"mousemove","mouseup"),o=e(G,ao.touch,m,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},ao.rebind(n,r,"on")},ao.touches=function(n,t){return arguments.length<2&&(t=k().touches),t?co(t).map(function(t){var e=J(n,t);return e.identifier=t.identifier,e}):[]};var Uo=1e-6,jo=Uo*Uo,Fo=Math.PI,Ho=2*Fo,Oo=Ho-Uo,Io=Fo/2,Yo=Fo/180,Zo=180/Fo,Vo=Math.SQRT2,Xo=2,$o=4;ao.interpolateZoom=function(n,t){var e,r,i=n[0],u=n[1],o=n[2],a=t[0],l=t[1],c=t[2],f=a-i,s=l-u,h=f*f+s*s;if(jo>h)r=Math.log(c/o)/Vo,e=function(n){return[i+n*f,u+n*s,o*Math.exp(Vo*n*r)]};else{var p=Math.sqrt(h),g=(c*c-o*o+$o*h)/(2*o*Xo*p),v=(c*c-o*o-$o*h)/(2*c*Xo*p),d=Math.log(Math.sqrt(g*g+1)-g),y=Math.log(Math.sqrt(v*v+1)-v);r=(y-d)/Vo,e=function(n){var t=n*r,e=rn(d),a=o/(Xo*p)*(e*un(Vo*t+d)-en(d));return[i+a*f,u+a*s,o*e/rn(Vo*t+d)]}}return e.duration=1e3*r,e},ao.behavior.zoom=function(){function n(n){n.on(L,s).on(Wo+".zoom",p).on("dblclick.zoom",g).on(R,h)}function e(n){return[(n[0]-k.x)/k.k,(n[1]-k.y)/k.k]}function r(n){return[n[0]*k.k+k.x,n[1]*k.k+k.y]}function i(n){k.k=Math.max(A[0],Math.min(A[1],n))}function u(n,t){t=r(t),k.x+=n[0]-t[0],k.y+=n[1]-t[1]}function o(t,e,r,o){t.__chart__={x:k.x,y:k.y,k:k.k},i(Math.pow(2,o)),u(d=e,r),t=ao.select(t),C>0&&(t=t.transition().duration(C)),t.call(n.event)}function a(){b&&b.domain(x.range().map(function(n){return(n-k.x)/k.k}).map(x.invert)),w&&w.domain(_.range().map(function(n){return(n-k.y)/k.k}).map(_.invert))}function l(n){z++||n({type:"zoomstart"})}function c(n){a(),n({type:"zoom",scale:k.k,translate:[k.x,k.y]})}function f(n){--z||(n({type:"zoomend"}),d=null)}function s(){function n(){a=1,u(ao.mouse(i),h),c(o)}function r(){s.on(q,null).on(T,null),p(a),f(o)}var i=this,o=D.of(i,arguments),a=0,s=ao.select(t(i)).on(q,n).on(T,r),h=e(ao.mouse(i)),p=W(i);Il.call(i),l(o)}function h(){function n(){var n=ao.touches(g);return p=k.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=e(n))}),n}function t(){var t=ao.event.target;ao.select(t).on(x,r).on(b,a),_.push(t);for(var e=ao.event.changedTouches,i=0,u=e.length;u>i;++i)d[e[i].identifier]=null;var l=n(),c=Date.now();if(1===l.length){if(500>c-M){var f=l[0];o(g,f,d[f.identifier],Math.floor(Math.log(k.k)/Math.LN2)+1),S()}M=c}else if(l.length>1){var f=l[0],s=l[1],h=f[0]-s[0],p=f[1]-s[1];y=h*h+p*p}}function r(){var n,t,e,r,o=ao.touches(g);Il.call(g);for(var a=0,l=o.length;l>a;++a,r=null)if(e=o[a],r=d[e.identifier]){if(t)break;n=e,t=r}if(r){var f=(f=e[0]-n[0])*f+(f=e[1]-n[1])*f,s=y&&Math.sqrt(f/y);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+r[0])/2,(t[1]+r[1])/2],i(s*p)}M=null,u(n,t),c(v)}function a(){if(ao.event.touches.length){for(var t=ao.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var i in d)return void n()}ao.selectAll(_).on(m,null),w.on(L,s).on(R,h),N(),f(v)}var p,g=this,v=D.of(g,arguments),d={},y=0,m=".zoom-"+ao.event.changedTouches[0].identifier,x="touchmove"+m,b="touchend"+m,_=[],w=ao.select(g),N=W(g);t(),l(v),w.on(L,null).on(R,t)}function p(){var n=D.of(this,arguments);m?clearTimeout(m):(Il.call(this),v=e(d=y||ao.mouse(this)),l(n)),m=setTimeout(function(){m=null,f(n)},50),S(),i(Math.pow(2,.002*Bo())*k.k),u(d,v),c(n)}function g(){var n=ao.mouse(this),t=Math.log(k.k)/Math.LN2;o(this,n,e(n),ao.event.shiftKey?Math.ceil(t)-1:Math.floor(t)+1)}var v,d,y,m,M,x,b,_,w,k={x:0,y:0,k:1},E=[960,500],A=Jo,C=250,z=0,L="mousedown.zoom",q="mousemove.zoom",T="mouseup.zoom",R="touchstart.zoom",D=N(n,"zoomstart","zoom","zoomend");return Wo||(Wo="onwheel"in fo?(Bo=function(){return-ao.event.deltaY*(ao.event.deltaMode?120:1)},"wheel"):"onmousewheel"in fo?(Bo=function(){return ao.event.wheelDelta},"mousewheel"):(Bo=function(){return-ao.event.detail},"MozMousePixelScroll")),n.event=function(n){n.each(function(){var n=D.of(this,arguments),t=k;Hl?ao.select(this).transition().each("start.zoom",function(){k=this.__chart__||{x:0,y:0,k:1},l(n)}).tween("zoom:zoom",function(){var e=E[0],r=E[1],i=d?d[0]:e/2,u=d?d[1]:r/2,o=ao.interpolateZoom([(i-k.x)/k.k,(u-k.y)/k.k,e/k.k],[(i-t.x)/t.k,(u-t.y)/t.k,e/t.k]);return function(t){var r=o(t),a=e/r[2];this.__chart__=k={x:i-r[0]*a,y:u-r[1]*a,k:a},c(n)}}).each("interrupt.zoom",function(){f(n)}).each("end.zoom",function(){f(n)}):(this.__chart__=k,l(n),c(n),f(n))})},n.translate=function(t){return arguments.length?(k={x:+t[0],y:+t[1],k:k.k},a(),n):[k.x,k.y]},n.scale=function(t){return arguments.length?(k={x:k.x,y:k.y,k:null},i(+t),a(),n):k.k},n.scaleExtent=function(t){return arguments.length?(A=null==t?Jo:[+t[0],+t[1]],n):A},n.center=function(t){return arguments.length?(y=t&&[+t[0],+t[1]],n):y},n.size=function(t){return arguments.length?(E=t&&[+t[0],+t[1]],n):E},n.duration=function(t){return arguments.length?(C=+t,n):C},n.x=function(t){return arguments.length?(b=t,x=t.copy(),k={x:0,y:0,k:1},n):b},n.y=function(t){return arguments.length?(w=t,_=t.copy(),k={x:0,y:0,k:1},n):w},ao.rebind(n,D,"on")};var Bo,Wo,Jo=[0,1/0];ao.color=an,an.prototype.toString=function(){return this.rgb()+""},ao.hsl=ln;var Go=ln.prototype=new an;Go.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,this.l/n)},Go.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new ln(this.h,this.s,n*this.l)},Go.rgb=function(){return cn(this.h,this.s,this.l)},ao.hcl=fn;var Ko=fn.prototype=new an;Ko.brighter=function(n){return new fn(this.h,this.c,Math.min(100,this.l+Qo*(arguments.length?n:1)))},Ko.darker=function(n){return new fn(this.h,this.c,Math.max(0,this.l-Qo*(arguments.length?n:1)))},Ko.rgb=function(){return sn(this.h,this.c,this.l).rgb()},ao.lab=hn;var Qo=18,na=.95047,ta=1,ea=1.08883,ra=hn.prototype=new an;ra.brighter=function(n){return new hn(Math.min(100,this.l+Qo*(arguments.length?n:1)),this.a,this.b)},ra.darker=function(n){return new hn(Math.max(0,this.l-Qo*(arguments.length?n:1)),this.a,this.b)},ra.rgb=function(){return pn(this.l,this.a,this.b)},ao.rgb=mn;var ia=mn.prototype=new an;ia.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,i=30;return t||e||r?(t&&i>t&&(t=i),e&&i>e&&(e=i),r&&i>r&&(r=i),new mn(Math.min(255,t/n),Math.min(255,e/n),Math.min(255,r/n))):new mn(i,i,i)},ia.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),new mn(n*this.r,n*this.g,n*this.b)},ia.hsl=function(){return wn(this.r,this.g,this.b)},ia.toString=function(){return"#"+bn(this.r)+bn(this.g)+bn(this.b)};var ua=ao.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});ua.forEach(function(n,t){ua.set(n,Mn(t))}),ao.functor=En,ao.xhr=An(m),ao.dsv=function(n,t){function e(n,e,u){arguments.length<3&&(u=e,e=null);var o=Cn(n,t,null==e?r:i(e),u);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:i(n)):e},o}function r(n){return e.parse(n.responseText)}function i(n){return function(t){return e.parse(t.responseText,n)}}function u(t){return t.map(o).join(n)}function o(n){return a.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var a=new RegExp('["'+n+"\n]"),l=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var i=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(i(n),e)}:i})},e.parseRows=function(n,t){function e(){if(f>=c)return o;if(i)return i=!1,u;var t=f;if(34===n.charCodeAt(t)){for(var e=t;e++f;){var r=n.charCodeAt(f++),a=1;if(10===r)i=!0;else if(13===r)i=!0,10===n.charCodeAt(f)&&(++f,++a);else if(r!==l)continue;return n.slice(t,f-a)}return n.slice(t)}for(var r,i,u={},o={},a=[],c=n.length,f=0,s=0;(r=e())!==o;){for(var h=[];r!==u&&r!==o;)h.push(r),r=e();t&&null==(h=t(h,s++))||a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new y,i=[];return t.forEach(function(n){for(var t in n)r.has(t)||i.push(r.add(t))}),[i.map(o).join(n)].concat(t.map(function(t){return i.map(function(n){return o(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(u).join("\n")},e},ao.csv=ao.dsv(",","text/csv"),ao.tsv=ao.dsv(" ","text/tab-separated-values");var oa,aa,la,ca,fa=this[x(this,"requestAnimationFrame")]||function(n){setTimeout(n,17)};ao.timer=function(){qn.apply(this,arguments)},ao.timer.flush=function(){Rn(),Dn()},ao.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)};var sa=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(Un);ao.formatPrefix=function(n,t){var e=0;return(n=+n)&&(0>n&&(n*=-1),t&&(n=ao.round(n,Pn(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((e-1)/3)))),sa[8+e/3]};var ha=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,pa=ao.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=ao.round(n,Pn(n,t))).toFixed(Math.max(0,Math.min(20,Pn(n*(1+1e-15),t))))}}),ga=ao.time={},va=Date;Hn.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){da.setUTCDate.apply(this._,arguments)},setDay:function(){da.setUTCDay.apply(this._,arguments)},setFullYear:function(){da.setUTCFullYear.apply(this._,arguments)},setHours:function(){da.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){da.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){da.setUTCMinutes.apply(this._,arguments)},setMonth:function(){da.setUTCMonth.apply(this._,arguments)},setSeconds:function(){da.setUTCSeconds.apply(this._,arguments)},setTime:function(){da.setTime.apply(this._,arguments)}};var da=Date.prototype;ga.year=On(function(n){return n=ga.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),ga.years=ga.year.range,ga.years.utc=ga.year.utc.range,ga.day=On(function(n){var t=new va(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),ga.days=ga.day.range,ga.days.utc=ga.day.utc.range,ga.dayOfYear=function(n){var t=ga.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(n,t){t=7-t;var e=ga[n]=On(function(n){return(n=ga.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});ga[n+"s"]=e.range,ga[n+"s"].utc=e.utc.range,ga[n+"OfYear"]=function(n){var e=ga.year(n).getDay();return Math.floor((ga.dayOfYear(n)+(e+t)%7)/7)}}),ga.week=ga.sunday,ga.weeks=ga.sunday.range,ga.weeks.utc=ga.sunday.utc.range,ga.weekOfYear=ga.sundayOfYear;var ya={"-":"",_:" ",0:"0"},ma=/^\s*\d+/,Ma=/^%/;ao.locale=function(n){return{numberFormat:jn(n),timeFormat:Yn(n)}};var xa=ao.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"], +shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});ao.format=xa.numberFormat,ao.geo={},ft.prototype={s:0,t:0,add:function(n){st(n,this.t,ba),st(ba.s,this.s,this),this.s?this.t+=ba.t:this.s=ba.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var ba=new ft;ao.geo.stream=function(n,t){n&&_a.hasOwnProperty(n.type)?_a[n.type](n,t):ht(n,t)};var _a={Feature:function(n,t){ht(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,i=e.length;++rn?4*Fo+n:n,Na.lineStart=Na.lineEnd=Na.point=b}};ao.geo.bounds=function(){function n(n,t){M.push(x=[f=n,h=n]),s>t&&(s=t),t>p&&(p=t)}function t(t,e){var r=dt([t*Yo,e*Yo]);if(y){var i=mt(y,r),u=[i[1],-i[0],0],o=mt(u,i);bt(o),o=_t(o);var l=t-g,c=l>0?1:-1,v=o[0]*Zo*c,d=xo(l)>180;if(d^(v>c*g&&c*t>v)){var m=o[1]*Zo;m>p&&(p=m)}else if(v=(v+360)%360-180,d^(v>c*g&&c*t>v)){var m=-o[1]*Zo;s>m&&(s=m)}else s>e&&(s=e),e>p&&(p=e);d?g>t?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t):h>=f?(f>t&&(f=t),t>h&&(h=t)):t>g?a(f,t)>a(f,h)&&(h=t):a(t,h)>a(f,h)&&(f=t)}else n(t,e);y=r,g=t}function e(){b.point=t}function r(){x[0]=f,x[1]=h,b.point=n,y=null}function i(n,e){if(y){var r=n-g;m+=xo(r)>180?r+(r>0?360:-360):r}else v=n,d=e;Na.point(n,e),t(n,e)}function u(){Na.lineStart()}function o(){i(v,d),Na.lineEnd(),xo(m)>Uo&&(f=-(h=180)),x[0]=f,x[1]=h,y=null}function a(n,t){return(t-=n)<0?t+360:t}function l(n,t){return n[0]-t[0]}function c(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:nka?(f=-(h=180),s=-(p=90)):m>Uo?p=90:-Uo>m&&(s=-90),x[0]=f,x[1]=h}};return function(n){p=h=-(f=s=1/0),M=[],ao.geo.stream(n,b);var t=M.length;if(t){M.sort(l);for(var e,r=1,i=M[0],u=[i];t>r;++r)e=M[r],c(e[0],i)||c(e[1],i)?(a(i[0],e[1])>a(i[0],i[1])&&(i[1]=e[1]),a(e[0],i[1])>a(i[0],i[1])&&(i[0]=e[0])):u.push(i=e);for(var o,e,g=-(1/0),t=u.length-1,r=0,i=u[t];t>=r;i=e,++r)e=u[r],(o=a(i[1],e[0]))>g&&(g=o,f=e[0],h=i[1])}return M=x=null,f===1/0||s===1/0?[[NaN,NaN],[NaN,NaN]]:[[f,s],[h,p]]}}(),ao.geo.centroid=function(n){Ea=Aa=Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,ja);var t=Da,e=Pa,r=Ua,i=t*t+e*e+r*r;return jo>i&&(t=qa,e=Ta,r=Ra,Uo>Aa&&(t=Ca,e=za,r=La),i=t*t+e*e+r*r,jo>i)?[NaN,NaN]:[Math.atan2(e,t)*Zo,tn(r/Math.sqrt(i))*Zo]};var Ea,Aa,Ca,za,La,qa,Ta,Ra,Da,Pa,Ua,ja={sphere:b,point:St,lineStart:Nt,lineEnd:Et,polygonStart:function(){ja.lineStart=At},polygonEnd:function(){ja.lineStart=Nt}},Fa=Rt(zt,jt,Ht,[-Fo,-Fo/2]),Ha=1e9;ao.geo.clipExtent=function(){var n,t,e,r,i,u,o={stream:function(n){return i&&(i.valid=!1),i=u(n),i.valid=!0,i},extent:function(a){return arguments.length?(u=Zt(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),i&&(i.valid=!1,i=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},(ao.geo.conicEqualArea=function(){return Vt(Xt)}).raw=Xt,ao.geo.albers=function(){return ao.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},ao.geo.albersUsa=function(){function n(n){var u=n[0],o=n[1];return t=null,e(u,o),t||(r(u,o),t)||i(u,o),t}var t,e,r,i,u=ao.geo.albers(),o=ao.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=ao.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=u.scale(),e=u.translate(),r=(n[0]-e[0])/t,i=(n[1]-e[1])/t;return(i>=.12&&.234>i&&r>=-.425&&-.214>r?o:i>=.166&&.234>i&&r>=-.214&&-.115>r?a:u).invert(n)},n.stream=function(n){var t=u.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,i){t.point(n,i),e.point(n,i),r.point(n,i)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(u.precision(t),o.precision(t),a.precision(t),n):u.precision()},n.scale=function(t){return arguments.length?(u.scale(t),o.scale(.35*t),a.scale(t),n.translate(u.translate())):u.scale()},n.translate=function(t){if(!arguments.length)return u.translate();var c=u.scale(),f=+t[0],s=+t[1];return e=u.translate(t).clipExtent([[f-.455*c,s-.238*c],[f+.455*c,s+.238*c]]).stream(l).point,r=o.translate([f-.307*c,s+.201*c]).clipExtent([[f-.425*c+Uo,s+.12*c+Uo],[f-.214*c-Uo,s+.234*c-Uo]]).stream(l).point,i=a.translate([f-.205*c,s+.212*c]).clipExtent([[f-.214*c+Uo,s+.166*c+Uo],[f-.115*c-Uo,s+.234*c-Uo]]).stream(l).point,n},n.scale(1070)};var Oa,Ia,Ya,Za,Va,Xa,$a={point:b,lineStart:b,lineEnd:b,polygonStart:function(){Ia=0,$a.lineStart=$t},polygonEnd:function(){$a.lineStart=$a.lineEnd=$a.point=b,Oa+=xo(Ia/2)}},Ba={point:Bt,lineStart:b,lineEnd:b,polygonStart:b,polygonEnd:b},Wa={point:Gt,lineStart:Kt,lineEnd:Qt,polygonStart:function(){Wa.lineStart=ne},polygonEnd:function(){Wa.point=Gt,Wa.lineStart=Kt,Wa.lineEnd=Qt}};ao.geo.path=function(){function n(n){return n&&("function"==typeof a&&u.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=i(u)),ao.geo.stream(n,o)),u.result()}function t(){return o=null,n}var e,r,i,u,o,a=4.5;return n.area=function(n){return Oa=0,ao.geo.stream(n,i($a)),Oa},n.centroid=function(n){return Ca=za=La=qa=Ta=Ra=Da=Pa=Ua=0,ao.geo.stream(n,i(Wa)),Ua?[Da/Ua,Pa/Ua]:Ra?[qa/Ra,Ta/Ra]:La?[Ca/La,za/La]:[NaN,NaN]},n.bounds=function(n){return Va=Xa=-(Ya=Za=1/0),ao.geo.stream(n,i(Ba)),[[Ya,Za],[Va,Xa]]},n.projection=function(n){return arguments.length?(i=(e=n)?n.stream||re(n):m,t()):e},n.context=function(n){return arguments.length?(u=null==(r=n)?new Wt:new te(n),"function"!=typeof a&&u.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(u.pointRadius(+t),+t),n):a},n.projection(ao.geo.albersUsa()).context(null)},ao.geo.transform=function(n){return{stream:function(t){var e=new ie(t);for(var r in n)e[r]=n[r];return e}}},ie.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},ao.geo.projection=oe,ao.geo.projectionMutator=ae,(ao.geo.equirectangular=function(){return oe(ce)}).raw=ce.invert=ce,ao.geo.rotation=function(n){function t(t){return t=n(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t}return n=se(n[0]%360*Yo,n[1]*Yo,n.length>2?n[2]*Yo:0),t.invert=function(t){return t=n.invert(t[0]*Yo,t[1]*Yo),t[0]*=Zo,t[1]*=Zo,t},t},fe.invert=ce,ao.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=se(-n[0]*Yo,-n[1]*Yo,0).invert,i=[];return e(null,null,1,{point:function(n,e){i.push(n=t(n,e)),n[0]*=Zo,n[1]*=Zo}}),{type:"Polygon",coordinates:[i]}}var t,e,r=[0,0],i=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=ve((t=+r)*Yo,i*Yo),n):t},n.precision=function(r){return arguments.length?(e=ve(t*Yo,(i=+r)*Yo),n):i},n.angle(90)},ao.geo.distance=function(n,t){var e,r=(t[0]-n[0])*Yo,i=n[1]*Yo,u=t[1]*Yo,o=Math.sin(r),a=Math.cos(r),l=Math.sin(i),c=Math.cos(i),f=Math.sin(u),s=Math.cos(u);return Math.atan2(Math.sqrt((e=s*o)*e+(e=c*f-l*s*a)*e),l*f+c*s*a)},ao.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return ao.range(Math.ceil(u/d)*d,i,d).map(h).concat(ao.range(Math.ceil(c/y)*y,l,y).map(p)).concat(ao.range(Math.ceil(r/g)*g,e,g).filter(function(n){return xo(n%d)>Uo}).map(f)).concat(ao.range(Math.ceil(a/v)*v,o,v).filter(function(n){return xo(n%y)>Uo}).map(s))}var e,r,i,u,o,a,l,c,f,s,h,p,g=10,v=g,d=90,y=360,m=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(u).concat(p(l).slice(1),h(i).reverse().slice(1),p(c).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(u=+t[0][0],i=+t[1][0],c=+t[0][1],l=+t[1][1],u>i&&(t=u,u=i,i=t),c>l&&(t=c,c=l,l=t),n.precision(m)):[[u,c],[i,l]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(m)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],y=+t[1],n):[d,y]},n.minorStep=function(t){return arguments.length?(g=+t[0],v=+t[1],n):[g,v]},n.precision=function(t){return arguments.length?(m=+t,f=ye(a,o,90),s=me(r,e,m),h=ye(c,l,90),p=me(u,i,m),n):m},n.majorExtent([[-180,-90+Uo],[180,90-Uo]]).minorExtent([[-180,-80-Uo],[180,80+Uo]])},ao.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||i.apply(this,arguments)]}}var t,e,r=Me,i=xe;return n.distance=function(){return ao.geo.distance(t||r.apply(this,arguments),e||i.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(i=t,e="function"==typeof t?null:t,n):i},n.precision=function(){return arguments.length?n:0},n},ao.geo.interpolate=function(n,t){return be(n[0]*Yo,n[1]*Yo,t[0]*Yo,t[1]*Yo)},ao.geo.length=function(n){return Ja=0,ao.geo.stream(n,Ga),Ja};var Ja,Ga={sphere:b,point:b,lineStart:_e,lineEnd:b,polygonStart:b,polygonEnd:b},Ka=we(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});(ao.geo.azimuthalEqualArea=function(){return oe(Ka)}).raw=Ka;var Qa=we(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},m);(ao.geo.azimuthalEquidistant=function(){return oe(Qa)}).raw=Qa,(ao.geo.conicConformal=function(){return Vt(Se)}).raw=Se,(ao.geo.conicEquidistant=function(){return Vt(ke)}).raw=ke;var nl=we(function(n){return 1/n},Math.atan);(ao.geo.gnomonic=function(){return oe(nl)}).raw=nl,Ne.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Io]},(ao.geo.mercator=function(){return Ee(Ne)}).raw=Ne;var tl=we(function(){return 1},Math.asin);(ao.geo.orthographic=function(){return oe(tl)}).raw=tl;var el=we(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});(ao.geo.stereographic=function(){return oe(el)}).raw=el,Ae.invert=function(n,t){return[-t,2*Math.atan(Math.exp(n))-Io]},(ao.geo.transverseMercator=function(){var n=Ee(Ae),t=n.center,e=n.rotate;return n.center=function(n){return n?t([-n[1],n[0]]):(n=t(),[n[1],-n[0]])},n.rotate=function(n){return n?e([n[0],n[1],n.length>2?n[2]+90:90]):(n=e(),[n[0],n[1],n[2]-90])},e([0,0,90])}).raw=Ae,ao.geom={},ao.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,i=En(e),u=En(r),o=n.length,a=[],l=[];for(t=0;o>t;t++)a.push([+i.call(this,n[t],t),+u.call(this,n[t],t),t]);for(a.sort(qe),t=0;o>t;t++)l.push([a[t][0],-a[t][1]]);var c=Le(a),f=Le(l),s=f[0]===c[0],h=f[f.length-1]===c[c.length-1],p=[];for(t=c.length-1;t>=0;--t)p.push(n[a[c[t]][2]]);for(t=+s;t=r&&c.x<=u&&c.y>=i&&c.y<=o?[[r,o],[u,o],[u,i],[r,i]]:[];f.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(u(n,t)/Uo)*Uo,y:Math.round(o(n,t)/Uo)*Uo,i:t}})}var r=Ce,i=ze,u=r,o=i,a=sl;return n?t(n):(t.links=function(n){return ar(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return ar(e(n)).cells.forEach(function(e,r){for(var i,u,o=e.site,a=e.edges.sort(Ve),l=-1,c=a.length,f=a[c-1].edge,s=f.l===o?f.r:f.l;++l=c,h=r>=f,p=h<<1|s;n.leaf=!1,n=n.nodes[p]||(n.nodes[p]=hr()),s?i=c:a=c,h?o=f:l=f,u(n,t,e,r,i,o,a,l)}var f,s,h,p,g,v,d,y,m,M=En(a),x=En(l);if(null!=t)v=t,d=e,y=r,m=i;else if(y=m=-(v=d=1/0),s=[],h=[],g=n.length,o)for(p=0;g>p;++p)f=n[p],f.xy&&(y=f.x),f.y>m&&(m=f.y),s.push(f.x),h.push(f.y);else for(p=0;g>p;++p){var b=+M(f=n[p],p),_=+x(f,p);v>b&&(v=b),d>_&&(d=_),b>y&&(y=b),_>m&&(m=_),s.push(b),h.push(_)}var w=y-v,S=m-d;w>S?m=d+w:y=v+S;var k=hr();if(k.add=function(n){u(k,n,+M(n,++p),+x(n,p),v,d,y,m)},k.visit=function(n){pr(n,k,v,d,y,m)},k.find=function(n){return gr(k,n[0],n[1],v,d,y,m)},p=-1,null==t){for(;++p=0?n.slice(0,t):n,r=t>=0?n.slice(t+1):"in";return e=vl.get(e)||gl,r=dl.get(r)||m,br(r(e.apply(null,lo.call(arguments,1))))},ao.interpolateHcl=Rr,ao.interpolateHsl=Dr,ao.interpolateLab=Pr,ao.interpolateRound=Ur,ao.transform=function(n){var t=fo.createElementNS(ao.ns.prefix.svg,"g");return(ao.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new jr(e?e.matrix:yl)})(n)},jr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var yl={a:1,b:0,c:0,d:1,e:0,f:0};ao.interpolateTransform=$r,ao.layout={},ao.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++ea*a/y){if(v>l){var c=t.charge/l;n.px-=u*c,n.py-=o*c}return!0}if(t.point&&l&&v>l){var c=t.pointCharge/l;n.px-=u*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=ao.event.x,n.py=ao.event.y,l.resume()}var e,r,i,u,o,a,l={},c=ao.dispatch("start","tick","end"),f=[1,1],s=.9,h=ml,p=Ml,g=-30,v=xl,d=.1,y=.64,M=[],x=[];return l.tick=function(){if((i*=.99)<.005)return e=null,c.end({type:"end",alpha:i=0}),!0;var t,r,l,h,p,v,y,m,b,_=M.length,w=x.length;for(r=0;w>r;++r)l=x[r],h=l.source,p=l.target,m=p.x-h.x,b=p.y-h.y,(v=m*m+b*b)&&(v=i*o[r]*((v=Math.sqrt(v))-u[r])/v,m*=v,b*=v,p.x-=m*(y=h.weight+p.weight?h.weight/(h.weight+p.weight):.5),p.y-=b*y,h.x+=m*(y=1-y),h.y+=b*y);if((y=i*d)&&(m=f[0]/2,b=f[1]/2,r=-1,y))for(;++r<_;)l=M[r],l.x+=(m-l.x)*y,l.y+=(b-l.y)*y;if(g)for(ri(t=ao.geom.quadtree(M),i,a),r=-1;++r<_;)(l=M[r]).fixed||t.visit(n(l));for(r=-1;++r<_;)l=M[r],l.fixed?(l.x=l.px,l.y=l.py):(l.x-=(l.px-(l.px=l.x))*s,l.y-=(l.py-(l.py=l.y))*s);c.tick({type:"tick",alpha:i})},l.nodes=function(n){return arguments.length?(M=n,l):M},l.links=function(n){return arguments.length?(x=n,l):x},l.size=function(n){return arguments.length?(f=n,l):f},l.linkDistance=function(n){return arguments.length?(h="function"==typeof n?n:+n,l):h},l.distance=l.linkDistance,l.linkStrength=function(n){return arguments.length?(p="function"==typeof n?n:+n,l):p},l.friction=function(n){return arguments.length?(s=+n,l):s},l.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,l):g},l.chargeDistance=function(n){return arguments.length?(v=n*n,l):Math.sqrt(v)},l.gravity=function(n){return arguments.length?(d=+n,l):d},l.theta=function(n){return arguments.length?(y=n*n,l):Math.sqrt(y)},l.alpha=function(n){return arguments.length?(n=+n,i?n>0?i=n:(e.c=null,e.t=NaN,e=null,c.end({type:"end",alpha:i=0})):n>0&&(c.start({type:"start",alpha:i=n}),e=qn(l.tick)),l):i},l.start=function(){function n(n,r){if(!e){for(e=new Array(i),l=0;i>l;++l)e[l]=[];for(l=0;c>l;++l){var u=x[l];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var o,a=e[t],l=-1,f=a.length;++lt;++t)(r=M[t]).index=t,r.weight=0;for(t=0;c>t;++t)r=x[t],"number"==typeof r.source&&(r.source=M[r.source]),"number"==typeof r.target&&(r.target=M[r.target]),++r.source.weight,++r.target.weight;for(t=0;i>t;++t)r=M[t],isNaN(r.x)&&(r.x=n("x",s)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof h)for(t=0;c>t;++t)u[t]=+h.call(this,x[t],t);else for(t=0;c>t;++t)u[t]=h;if(o=[],"function"==typeof p)for(t=0;c>t;++t)o[t]=+p.call(this,x[t],t);else for(t=0;c>t;++t)o[t]=p;if(a=[],"function"==typeof g)for(t=0;i>t;++t)a[t]=+g.call(this,M[t],t);else for(t=0;i>t;++t)a[t]=g;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){return r||(r=ao.behavior.drag().origin(m).on("dragstart.force",Qr).on("drag.force",t).on("dragend.force",ni)),arguments.length?void this.on("mouseover.force",ti).on("mouseout.force",ei).call(r):r},ao.rebind(l,c,"on")};var ml=20,Ml=1,xl=1/0;ao.layout.hierarchy=function(){function n(i){var u,o=[i],a=[];for(i.depth=0;null!=(u=o.pop());)if(a.push(u),(c=e.call(n,u,u.depth))&&(l=c.length)){for(var l,c,f;--l>=0;)o.push(f=c[l]),f.parent=u,f.depth=u.depth+1;r&&(u.value=0),u.children=c}else r&&(u.value=+r.call(n,u,u.depth)||0),delete u.children;return oi(i,function(n){var e,i;t&&(e=n.children)&&e.sort(t),r&&(i=n.parent)&&(i.value+=n.value)}),a}var t=ci,e=ai,r=li;return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(ui(t,function(n){n.children&&(n.value=0)}),oi(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},ao.layout.partition=function(){function n(t,e,r,i){var u=t.children;if(t.x=e,t.y=t.depth*i,t.dx=r,t.dy=i,u&&(o=u.length)){var o,a,l,c=-1;for(r=t.value?r/t.value:0;++cs?-1:1),g=ao.sum(c),v=g?(s-l*p)/g:0,d=ao.range(l),y=[];return null!=e&&d.sort(e===bl?function(n,t){return c[t]-c[n]}:function(n,t){return e(o[n],o[t])}),d.forEach(function(n){y[n]={data:o[n],value:a=c[n],startAngle:f,endAngle:f+=a*v+p,padAngle:h}}),y}var t=Number,e=bl,r=0,i=Ho,u=0;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(i=t,n):i},n.padAngle=function(t){return arguments.length?(u=t,n):u},n};var bl={};ao.layout.stack=function(){function n(a,l){if(!(h=a.length))return a;var c=a.map(function(e,r){return t.call(n,e,r)}),f=c.map(function(t){return t.map(function(t,e){return[u.call(n,t,e),o.call(n,t,e)]})}),s=e.call(n,f,l);c=ao.permute(c,s),f=ao.permute(f,s);var h,p,g,v,d=r.call(n,f,l),y=c[0].length;for(g=0;y>g;++g)for(i.call(n,c[0][g],v=d[g],f[0][g][1]),p=1;h>p;++p)i.call(n,c[p][g],v+=f[p-1][g][1],f[p][g][1]);return a}var t=m,e=gi,r=vi,i=pi,u=si,o=hi;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:_l.get(t)||gi,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:wl.get(t)||vi,n):r},n.x=function(t){return arguments.length?(u=t,n):u},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(i=t,n):i},n};var _l=ao.map({"inside-out":function(n){var t,e,r=n.length,i=n.map(di),u=n.map(yi),o=ao.range(r).sort(function(n,t){return i[n]-i[t]}),a=0,l=0,c=[],f=[];for(t=0;r>t;++t)e=o[t],l>a?(a+=u[e],c.push(e)):(l+=u[e],f.push(e));return f.reverse().concat(c)},reverse:function(n){return ao.range(n.length).reverse()},"default":gi}),wl=ao.map({silhouette:function(n){var t,e,r,i=n.length,u=n[0].length,o=[],a=0,l=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;u>e;++e)l[e]=(a-o[e])/2;return l},wiggle:function(n){var t,e,r,i,u,o,a,l,c,f=n.length,s=n[0],h=s.length,p=[];for(p[0]=l=c=0,e=1;h>e;++e){for(t=0,i=0;f>t;++t)i+=n[t][e][1];for(t=0,u=0,a=s[e][0]-s[e-1][0];f>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;u+=o*n[t][e][1]}p[e]=l-=i?u/i*a:0,c>l&&(c=l)}for(e=0;h>e;++e)p[e]-=c;return p},expand:function(n){var t,e,r,i=n.length,u=n[0].length,o=1/i,a=[];for(e=0;u>e;++e){for(t=0,r=0;i>t;t++)r+=n[t][e][1];if(r)for(t=0;i>t;t++)n[t][e][1]/=r;else for(t=0;i>t;t++)n[t][e][1]=o}for(e=0;u>e;++e)a[e]=0;return a},zero:vi});ao.layout.histogram=function(){function n(n,u){for(var o,a,l=[],c=n.map(e,this),f=r.call(this,c,u),s=i.call(this,f,c,u),u=-1,h=c.length,p=s.length-1,g=t?1:1/h;++u0)for(u=-1;++u=f[0]&&a<=f[1]&&(o=l[ao.bisect(s,a,1,p)-1],o.y+=g,o.push(n[u]));return l}var t=!0,e=Number,r=bi,i=Mi;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=En(t),n):r},n.bins=function(t){return arguments.length?(i="number"==typeof t?function(n){return xi(n,t)}:En(t),n):i},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},ao.layout.pack=function(){function n(n,u){var o=e.call(this,n,u),a=o[0],l=i[0],c=i[1],f=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,oi(a,function(n){n.r=+f(n.value)}),oi(a,Ni),r){var s=r*(t?1:Math.max(2*a.r/l,2*a.r/c))/2;oi(a,function(n){n.r+=s}),oi(a,Ni),oi(a,function(n){n.r-=s})}return Ci(a,l/2,c/2,t?1:1/Math.max(2*a.r/l,2*a.r/c)),o}var t,e=ao.layout.hierarchy().sort(_i),r=0,i=[1,1];return n.size=function(t){return arguments.length?(i=t,n):i},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},ii(n,e)},ao.layout.tree=function(){function n(n,i){var f=o.call(this,n,i),s=f[0],h=t(s);if(oi(h,e),h.parent.m=-h.z,ui(h,r),c)ui(s,u);else{var p=s,g=s,v=s;ui(s,function(n){n.xg.x&&(g=n),n.depth>v.depth&&(v=n)});var d=a(p,g)/2-p.x,y=l[0]/(g.x+a(g,p)/2+d),m=l[1]/(v.depth||1);ui(s,function(n){n.x=(n.x+d)*y,n.y=n.depth*m})}return f}function t(n){for(var t,e={A:null,children:[n]},r=[e];null!=(t=r.pop());)for(var i,u=t.children,o=0,a=u.length;a>o;++o)r.push((u[o]=i={_:u[o],parent:t,children:(i=u[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return e.children[0]}function e(n){var t=n.children,e=n.parent.children,r=n.i?e[n.i-1]:null;if(t.length){Di(n);var u=(t[0].z+t[t.length-1].z)/2;r?(n.z=r.z+a(n._,r._),n.m=n.z-u):n.z=u}else r&&(n.z=r.z+a(n._,r._));n.parent.A=i(n,r,n.parent.A||e[0])}function r(n){n._.x=n.z+n.parent.m,n.m+=n.parent.m}function i(n,t,e){if(t){for(var r,i=n,u=n,o=t,l=i.parent.children[0],c=i.m,f=u.m,s=o.m,h=l.m;o=Ti(o),i=qi(i),o&&i;)l=qi(l),u=Ti(u),u.a=n,r=o.z+s-i.z-c+a(o._,i._),r>0&&(Ri(Pi(o,n,e),n,r),c+=r,f+=r),s+=o.m,c+=i.m,h+=l.m,f+=u.m;o&&!Ti(u)&&(u.t=o,u.m+=s-f),i&&!qi(l)&&(l.t=i,l.m+=c-h,e=n)}return e}function u(n){n.x*=l[0],n.y=n.depth*l[1]}var o=ao.layout.hierarchy().sort(null).value(null),a=Li,l=[1,1],c=null;return n.separation=function(t){return arguments.length?(a=t,n):a},n.size=function(t){return arguments.length?(c=null==(l=t)?u:null,n):c?null:l},n.nodeSize=function(t){return arguments.length?(c=null==(l=t)?null:u,n):c?l:null},ii(n,o)},ao.layout.cluster=function(){function n(n,u){var o,a=t.call(this,n,u),l=a[0],c=0;oi(l,function(n){var t=n.children;t&&t.length?(n.x=ji(t),n.y=Ui(t)):(n.x=o?c+=e(n,o):0,n.y=0,o=n)});var f=Fi(l),s=Hi(l),h=f.x-e(f,s)/2,p=s.x+e(s,f)/2;return oi(l,i?function(n){n.x=(n.x-l.x)*r[0],n.y=(l.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(p-h)*r[0],n.y=(1-(l.y?n.y/l.y:1))*r[1]}),a}var t=ao.layout.hierarchy().sort(null).value(null),e=Li,r=[1,1],i=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(i=null==(r=t),n):i?null:r},n.nodeSize=function(t){return arguments.length?(i=null!=(r=t),n):i?r:null},ii(n,t)},ao.layout.treemap=function(){function n(n,t){for(var e,r,i=-1,u=n.length;++it?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var u=e.children;if(u&&u.length){var o,a,l,c=s(e),f=[],h=u.slice(),g=1/0,v="slice"===p?c.dx:"dice"===p?c.dy:"slice-dice"===p?1&e.depth?c.dy:c.dx:Math.min(c.dx,c.dy);for(n(h,c.dx*c.dy/e.value),f.area=0;(l=h.length)>0;)f.push(o=h[l-1]),f.area+=o.area,"squarify"!==p||(a=r(f,v))<=g?(h.pop(),g=a):(f.area-=f.pop().area,i(f,v,c,!1),v=Math.min(c.dx,c.dy),f.length=f.area=0,g=1/0);f.length&&(i(f,v,c,!0),f.length=f.area=0),u.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var u,o=s(t),a=r.slice(),l=[];for(n(a,o.dx*o.dy/t.value),l.area=0;u=a.pop();)l.push(u),l.area+=u.area,null!=u.z&&(i(l,u.z?o.dx:o.dy,o,!a.length),l.length=l.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,i=0,u=1/0,o=-1,a=n.length;++oe&&(u=e),e>i&&(i=e));return r*=r,t*=t,r?Math.max(t*i*g/r,r/(t*u*g)):1/0}function i(n,t,e,r){var i,u=-1,o=n.length,a=e.x,c=e.y,f=t?l(n.area/t):0; +if(t==e.dx){for((r||f>e.dy)&&(f=e.dy);++ue.dx)&&(f=e.dx);++ue&&(t=1),1>e&&(n=0),function(){var e,r,i;do e=2*Math.random()-1,r=2*Math.random()-1,i=e*e+r*r;while(!i||i>1);return n+t*e*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var n=ao.random.normal.apply(ao,arguments);return function(){return Math.exp(n())}},bates:function(n){var t=ao.random.irwinHall(n);return function(){return t()/n}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t}}},ao.scale={};var Sl={floor:m,ceil:m};ao.scale.linear=function(){return Wi([0,1],[0,1],Mr,!1)};var kl={s:1,g:1,p:1,r:1,e:1};ao.scale.log=function(){return ru(ao.scale.linear().domain([0,1]),10,!0,[1,10])};var Nl=ao.format(".0e"),El={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};ao.scale.pow=function(){return iu(ao.scale.linear(),1,[0,1])},ao.scale.sqrt=function(){return ao.scale.pow().exponent(.5)},ao.scale.ordinal=function(){return ou([],{t:"range",a:[[]]})},ao.scale.category10=function(){return ao.scale.ordinal().range(Al)},ao.scale.category20=function(){return ao.scale.ordinal().range(Cl)},ao.scale.category20b=function(){return ao.scale.ordinal().range(zl)},ao.scale.category20c=function(){return ao.scale.ordinal().range(Ll)};var Al=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(xn),Cl=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(xn),zl=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(xn),Ll=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(xn);ao.scale.quantile=function(){return au([],[])},ao.scale.quantize=function(){return lu(0,1,[0,1])},ao.scale.threshold=function(){return cu([.5],[0,1])},ao.scale.identity=function(){return fu([0,1])},ao.svg={},ao.svg.arc=function(){function n(){var n=Math.max(0,+e.apply(this,arguments)),c=Math.max(0,+r.apply(this,arguments)),f=o.apply(this,arguments)-Io,s=a.apply(this,arguments)-Io,h=Math.abs(s-f),p=f>s?0:1;if(n>c&&(g=c,c=n,n=g),h>=Oo)return t(c,p)+(n?t(n,1-p):"")+"Z";var g,v,d,y,m,M,x,b,_,w,S,k,N=0,E=0,A=[];if((y=(+l.apply(this,arguments)||0)/2)&&(d=u===ql?Math.sqrt(n*n+c*c):+u.apply(this,arguments),p||(E*=-1),c&&(E=tn(d/c*Math.sin(y))),n&&(N=tn(d/n*Math.sin(y)))),c){m=c*Math.cos(f+E),M=c*Math.sin(f+E),x=c*Math.cos(s-E),b=c*Math.sin(s-E);var C=Math.abs(s-f-2*E)<=Fo?0:1;if(E&&yu(m,M,x,b)===p^C){var z=(f+s)/2;m=c*Math.cos(z),M=c*Math.sin(z),x=b=null}}else m=M=0;if(n){_=n*Math.cos(s-N),w=n*Math.sin(s-N),S=n*Math.cos(f+N),k=n*Math.sin(f+N);var L=Math.abs(f-s+2*N)<=Fo?0:1;if(N&&yu(_,w,S,k)===1-p^L){var q=(f+s)/2;_=n*Math.cos(q),w=n*Math.sin(q),S=k=null}}else _=w=0;if(h>Uo&&(g=Math.min(Math.abs(c-n)/2,+i.apply(this,arguments)))>.001){v=c>n^p?0:1;var T=g,R=g;if(Fo>h){var D=null==S?[_,w]:null==x?[m,M]:Re([m,M],[S,k],[x,b],[_,w]),P=m-D[0],U=M-D[1],j=x-D[0],F=b-D[1],H=1/Math.sin(Math.acos((P*j+U*F)/(Math.sqrt(P*P+U*U)*Math.sqrt(j*j+F*F)))/2),O=Math.sqrt(D[0]*D[0]+D[1]*D[1]);R=Math.min(g,(n-O)/(H-1)),T=Math.min(g,(c-O)/(H+1))}if(null!=x){var I=mu(null==S?[_,w]:[S,k],[m,M],c,T,p),Y=mu([x,b],[_,w],c,T,p);g===T?A.push("M",I[0],"A",T,",",T," 0 0,",v," ",I[1],"A",c,",",c," 0 ",1-p^yu(I[1][0],I[1][1],Y[1][0],Y[1][1]),",",p," ",Y[1],"A",T,",",T," 0 0,",v," ",Y[0]):A.push("M",I[0],"A",T,",",T," 0 1,",v," ",Y[0])}else A.push("M",m,",",M);if(null!=S){var Z=mu([m,M],[S,k],n,-R,p),V=mu([_,w],null==x?[m,M]:[x,b],n,-R,p);g===R?A.push("L",V[0],"A",R,",",R," 0 0,",v," ",V[1],"A",n,",",n," 0 ",p^yu(V[1][0],V[1][1],Z[1][0],Z[1][1]),",",1-p," ",Z[1],"A",R,",",R," 0 0,",v," ",Z[0]):A.push("L",V[0],"A",R,",",R," 0 0,",v," ",Z[0])}else A.push("L",_,",",w)}else A.push("M",m,",",M),null!=x&&A.push("A",c,",",c," 0 ",C,",",p," ",x,",",b),A.push("L",_,",",w),null!=S&&A.push("A",n,",",n," 0 ",L,",",1-p," ",S,",",k);return A.push("Z"),A.join("")}function t(n,t){return"M0,"+n+"A"+n+","+n+" 0 1,"+t+" 0,"+-n+"A"+n+","+n+" 0 1,"+t+" 0,"+n}var e=hu,r=pu,i=su,u=ql,o=gu,a=vu,l=du;return n.innerRadius=function(t){return arguments.length?(e=En(t),n):e},n.outerRadius=function(t){return arguments.length?(r=En(t),n):r},n.cornerRadius=function(t){return arguments.length?(i=En(t),n):i},n.padRadius=function(t){return arguments.length?(u=t==ql?ql:En(t),n):u},n.startAngle=function(t){return arguments.length?(o=En(t),n):o},n.endAngle=function(t){return arguments.length?(a=En(t),n):a},n.padAngle=function(t){return arguments.length?(l=En(t),n):l},n.centroid=function(){var n=(+e.apply(this,arguments)+ +r.apply(this,arguments))/2,t=(+o.apply(this,arguments)+ +a.apply(this,arguments))/2-Io;return[Math.cos(t)*n,Math.sin(t)*n]},n};var ql="auto";ao.svg.line=function(){return Mu(m)};var Tl=ao.map({linear:xu,"linear-closed":bu,step:_u,"step-before":wu,"step-after":Su,basis:zu,"basis-open":Lu,"basis-closed":qu,bundle:Tu,cardinal:Eu,"cardinal-open":ku,"cardinal-closed":Nu,monotone:Fu});Tl.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Rl=[0,2/3,1/3,0],Dl=[0,1/3,2/3,0],Pl=[0,1/6,2/3,1/6];ao.svg.line.radial=function(){var n=Mu(Hu);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},wu.reverse=Su,Su.reverse=wu,ao.svg.area=function(){return Ou(m)},ao.svg.area.radial=function(){var n=Ou(Hu);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},ao.svg.chord=function(){function n(n,a){var l=t(this,u,n,a),c=t(this,o,n,a);return"M"+l.p0+r(l.r,l.p1,l.a1-l.a0)+(e(l,c)?i(l.r,l.p1,l.r,l.p0):i(l.r,l.p1,c.r,c.p0)+r(c.r,c.p1,c.a1-c.a0)+i(c.r,c.p1,l.r,l.p0))+"Z"}function t(n,t,e,r){var i=t.call(n,e,r),u=a.call(n,i,r),o=l.call(n,i,r)-Io,f=c.call(n,i,r)-Io;return{r:u,a0:o,a1:f,p0:[u*Math.cos(o),u*Math.sin(o)],p1:[u*Math.cos(f),u*Math.sin(f)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>Fo)+",1 "+t}function i(n,t,e,r){return"Q 0,0 "+r}var u=Me,o=xe,a=Iu,l=gu,c=vu;return n.radius=function(t){return arguments.length?(a=En(t),n):a},n.source=function(t){return arguments.length?(u=En(t),n):u},n.target=function(t){return arguments.length?(o=En(t),n):o},n.startAngle=function(t){return arguments.length?(l=En(t),n):l},n.endAngle=function(t){return arguments.length?(c=En(t),n):c},n},ao.svg.diagonal=function(){function n(n,i){var u=t.call(this,n,i),o=e.call(this,n,i),a=(u.y+o.y)/2,l=[u,{x:u.x,y:a},{x:o.x,y:a},o];return l=l.map(r),"M"+l[0]+"C"+l[1]+" "+l[2]+" "+l[3]}var t=Me,e=xe,r=Yu;return n.source=function(e){return arguments.length?(t=En(e),n):t},n.target=function(t){return arguments.length?(e=En(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},ao.svg.diagonal.radial=function(){var n=ao.svg.diagonal(),t=Yu,e=n.projection;return n.projection=function(n){return arguments.length?e(Zu(t=n)):t},n},ao.svg.symbol=function(){function n(n,r){return(Ul.get(t.call(this,n,r))||$u)(e.call(this,n,r))}var t=Xu,e=Vu;return n.type=function(e){return arguments.length?(t=En(e),n):t},n.size=function(t){return arguments.length?(e=En(t),n):e},n};var Ul=ao.map({circle:$u,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*Fl)),e=t*Fl;return"M0,"+-t+"L"+e+",0 0,"+t+" "+-e+",0Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/jl),e=t*jl/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});ao.svg.symbolTypes=Ul.keys();var jl=Math.sqrt(3),Fl=Math.tan(30*Yo);Co.transition=function(n){for(var t,e,r=Hl||++Zl,i=Ku(n),u=[],o=Ol||{time:Date.now(),ease:Nr,delay:0,duration:250},a=-1,l=this.length;++au;u++){i.push(t=[]);for(var e=this[u],a=0,l=e.length;l>a;a++)(r=e[a])&&n.call(r,r.__data__,a,u)&&t.push(r)}return Wu(i,this.namespace,this.id)},Yl.tween=function(n,t){var e=this.id,r=this.namespace;return arguments.length<2?this.node()[r][e].tween.get(n):Y(this,null==t?function(t){t[r][e].tween.remove(n)}:function(i){i[r][e].tween.set(n,t)})},Yl.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function i(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function u(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?$r:Mr,a=ao.ns.qualify(n);return Ju(this,"attr."+n,t,a.local?u:i)},Yl.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(i));return r&&function(n){this.setAttribute(i,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(i.space,i.local));return r&&function(n){this.setAttributeNS(i.space,i.local,r(n))}}var i=ao.ns.qualify(n);return this.tween("attr."+n,i.local?r:e)},Yl.style=function(n,e,r){function i(){this.style.removeProperty(n)}function u(e){return null==e?i:(e+="",function(){var i,u=t(this).getComputedStyle(this,null).getPropertyValue(n);return u!==e&&(i=Mr(u,e),function(t){this.style.setProperty(n,i(t),r)})})}var o=arguments.length;if(3>o){if("string"!=typeof n){2>o&&(e="");for(r in n)this.style(r,n[r],e);return this}r=""}return Ju(this,"style."+n,e,u)},Yl.styleTween=function(n,e,r){function i(i,u){var o=e.call(this,i,u,t(this).getComputedStyle(this,null).getPropertyValue(n));return o&&function(t){this.style.setProperty(n,o(t),r)}}return arguments.length<3&&(r=""),this.tween("style."+n,i)},Yl.text=function(n){return Ju(this,"text",n,Gu)},Yl.remove=function(){var n=this.namespace;return this.each("end.transition",function(){var t;this[n].count<2&&(t=this.parentNode)&&t.removeChild(this)})},Yl.ease=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].ease:("function"!=typeof n&&(n=ao.ease.apply(ao,arguments)),Y(this,function(r){r[e][t].ease=n}))},Yl.delay=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].delay:Y(this,"function"==typeof n?function(r,i,u){r[e][t].delay=+n.call(r,r.__data__,i,u)}:(n=+n,function(r){r[e][t].delay=n}))},Yl.duration=function(n){var t=this.id,e=this.namespace;return arguments.length<1?this.node()[e][t].duration:Y(this,"function"==typeof n?function(r,i,u){r[e][t].duration=Math.max(1,n.call(r,r.__data__,i,u))}:(n=Math.max(1,n),function(r){r[e][t].duration=n}))},Yl.each=function(n,t){var e=this.id,r=this.namespace;if(arguments.length<2){var i=Ol,u=Hl;try{Hl=e,Y(this,function(t,i,u){Ol=t[r][e],n.call(t,t.__data__,i,u)})}finally{Ol=i,Hl=u}}else Y(this,function(i){var u=i[r][e];(u.event||(u.event=ao.dispatch("start","end","interrupt"))).on(n,t)});return this},Yl.transition=function(){for(var n,t,e,r,i=this.id,u=++Zl,o=this.namespace,a=[],l=0,c=this.length;c>l;l++){a.push(n=[]);for(var t=this[l],f=0,s=t.length;s>f;f++)(e=t[f])&&(r=e[o][i],Qu(e,f,o,u,{time:r.time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration})),n.push(e)}return Wu(a,o,u)},ao.svg.axis=function(){function n(n){n.each(function(){var n,c=ao.select(this),f=this.__chart__||e,s=this.__chart__=e.copy(),h=null==l?s.ticks?s.ticks.apply(s,a):s.domain():l,p=null==t?s.tickFormat?s.tickFormat.apply(s,a):m:t,g=c.selectAll(".tick").data(h,s),v=g.enter().insert("g",".domain").attr("class","tick").style("opacity",Uo),d=ao.transition(g.exit()).style("opacity",Uo).remove(),y=ao.transition(g.order()).style("opacity",1),M=Math.max(i,0)+o,x=Zi(s),b=c.selectAll(".domain").data([0]),_=(b.enter().append("path").attr("class","domain"),ao.transition(b));v.append("line"),v.append("text");var w,S,k,N,E=v.select("line"),A=y.select("line"),C=g.select("text").text(p),z=v.select("text"),L=y.select("text"),q="top"===r||"left"===r?-1:1;if("bottom"===r||"top"===r?(n=no,w="x",k="y",S="x2",N="y2",C.attr("dy",0>q?"0em":".71em").style("text-anchor","middle"),_.attr("d","M"+x[0]+","+q*u+"V0H"+x[1]+"V"+q*u)):(n=to,w="y",k="x",S="y2",N="x2",C.attr("dy",".32em").style("text-anchor",0>q?"end":"start"),_.attr("d","M"+q*u+","+x[0]+"H0V"+x[1]+"H"+q*u)),E.attr(N,q*i),z.attr(k,q*M),A.attr(S,0).attr(N,q*i),L.attr(w,0).attr(k,q*M),s.rangeBand){var T=s,R=T.rangeBand()/2;f=s=function(n){return T(n)+R}}else f.rangeBand?f=s:d.call(n,s,f);v.call(n,f,s),y.call(n,s,s)})}var t,e=ao.scale.linear(),r=Vl,i=6,u=6,o=3,a=[10],l=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Xl?t+"":Vl,n):r},n.ticks=function(){return arguments.length?(a=co(arguments),n):a},n.tickValues=function(t){return arguments.length?(l=t,n):l},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(i=+t,u=+arguments[e-1],n):i},n.innerTickSize=function(t){return arguments.length?(i=+t,n):i},n.outerTickSize=function(t){return arguments.length?(u=+t,n):u},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Vl="bottom",Xl={top:1,right:1,bottom:1,left:1};ao.svg.brush=function(){function n(t){t.each(function(){var t=ao.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=t.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),t.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=t.selectAll(".resize").data(v,m);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return $l[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,s=ao.transition(t),h=ao.transition(o);c&&(l=Zi(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),r(s)),f&&(l=Zi(f),h.attr("y",l[0]).attr("height",l[1]-l[0]),i(s)),e(s)})}function e(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+s[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function r(n){n.select(".extent").attr("x",s[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function i(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==ao.event.keyCode&&(C||(M=null,L[0]-=s[1],L[1]-=h[1],C=2),S())}function v(){32==ao.event.keyCode&&2==C&&(L[0]+=s[1],L[1]+=h[1],C=0,S())}function d(){var n=ao.mouse(b),t=!1;x&&(n[0]+=x[0],n[1]+=x[1]),C||(ao.event.altKey?(M||(M=[(s[0]+s[1])/2,(h[0]+h[1])/2]),L[0]=s[+(n[0]f?(i=r,r=f):i=f),v[0]!=r||v[1]!=i?(e?a=null:o=null,v[0]=r,v[1]=i,!0):void 0}function m(){d(),k.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),ao.select("body").style("cursor",null),q.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),z(),w({type:"brushend"})}var M,x,b=this,_=ao.select(ao.event.target),w=l.of(b,arguments),k=ao.select(b),N=_.datum(),E=!/^(n|s)$/.test(N)&&c,A=!/^(e|w)$/.test(N)&&f,C=_.classed("extent"),z=W(b),L=ao.mouse(b),q=ao.select(t(b)).on("keydown.brush",u).on("keyup.brush",v);if(ao.event.changedTouches?q.on("touchmove.brush",d).on("touchend.brush",m):q.on("mousemove.brush",d).on("mouseup.brush",m),k.interrupt().selectAll("*").interrupt(),C)L[0]=s[0]-L[0],L[1]=h[0]-L[1];else if(N){var T=+/w$/.test(N),R=+/^n/.test(N);x=[s[1-T]-L[0],h[1-R]-L[1]],L[0]=s[T],L[1]=h[R]}else ao.event.altKey&&(M=L.slice());k.style("pointer-events","none").selectAll(".resize").style("display",null),ao.select("body").style("cursor",_.style("cursor")),w({type:"brushstart"}),d()}var o,a,l=N(n,"brushstart","brush","brushend"),c=null,f=null,s=[0,0],h=[0,0],p=!0,g=!0,v=Bl[0];return n.event=function(n){n.each(function(){var n=l.of(this,arguments),t={x:s,y:h,i:o,j:a},e=this.__chart__||t;this.__chart__=t,Hl?ao.select(this).transition().each("start.brush",function(){o=e.i,a=e.j,s=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=xr(s,t.x),r=xr(h,t.y);return o=a=null,function(i){s=t.x=e(i),h=t.y=r(i),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){o=t.i,a=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,v=Bl[!c<<1|!f],n):c},n.y=function(t){return arguments.length?(f=t,v=Bl[!c<<1|!f],n):f},n.clamp=function(t){return arguments.length?(c&&f?(p=!!t[0],g=!!t[1]):c?p=!!t:f&&(g=!!t),n):c&&f?[p,g]:c?p:f?g:null},n.extent=function(t){var e,r,i,u,l;return arguments.length?(c&&(e=t[0],r=t[1],f&&(e=e[0],r=r[0]),o=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(l=e,e=r,r=l),e==s[0]&&r==s[1]||(s=[e,r])),f&&(i=t[0],u=t[1],c&&(i=i[1],u=u[1]),a=[i,u],f.invert&&(i=f(i),u=f(u)),i>u&&(l=i,i=u,u=l),i==h[0]&&u==h[1]||(h=[i,u])),n):(c&&(o?(e=o[0],r=o[1]):(e=s[0],r=s[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(l=e,e=r,r=l))),f&&(a?(i=a[0],u=a[1]):(i=h[0],u=h[1],f.invert&&(i=f.invert(i),u=f.invert(u)),i>u&&(l=i,i=u,u=l))),c&&f?[[e,i],[r,u]]:c?[e,r]:f&&[i,u])},n.clear=function(){return n.empty()||(s=[0,0],h=[0,0],o=a=null),n},n.empty=function(){return!!c&&s[0]==s[1]||!!f&&h[0]==h[1]},ao.rebind(n,l,"on")};var $l={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Bl=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Wl=ga.format=xa.timeFormat,Jl=Wl.utc,Gl=Jl("%Y-%m-%dT%H:%M:%S.%LZ");Wl.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?eo:Gl,eo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},eo.toString=Gl.toString,ga.second=On(function(n){return new va(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),ga.seconds=ga.second.range,ga.seconds.utc=ga.second.utc.range,ga.minute=On(function(n){return new va(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),ga.minutes=ga.minute.range,ga.minutes.utc=ga.minute.utc.range,ga.hour=On(function(n){var t=n.getTimezoneOffset()/60;return new va(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),ga.hours=ga.hour.range,ga.hours.utc=ga.hour.utc.range,ga.month=On(function(n){return n=ga.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),ga.months=ga.month.range,ga.months.utc=ga.month.utc.range;var Kl=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ql=[[ga.second,1],[ga.second,5],[ga.second,15],[ga.second,30],[ga.minute,1],[ga.minute,5],[ga.minute,15],[ga.minute,30],[ga.hour,1],[ga.hour,3],[ga.hour,6],[ga.hour,12],[ga.day,1],[ga.day,2],[ga.week,1],[ga.month,1],[ga.month,3],[ga.year,1]],nc=Wl.multi([[".%L",function(n){return n.getMilliseconds()}],[":%S",function(n){return n.getSeconds()}],["%I:%M",function(n){return n.getMinutes()}],["%I %p",function(n){return n.getHours()}],["%a %d",function(n){return n.getDay()&&1!=n.getDate()}],["%b %d",function(n){return 1!=n.getDate()}],["%B",function(n){return n.getMonth()}],["%Y",zt]]),tc={range:function(n,t,e){return ao.range(Math.ceil(n/e)*e,+t,e).map(io)},floor:m,ceil:m};Ql.year=ga.year,ga.scale=function(){return ro(ao.scale.linear(),Ql,nc)};var ec=Ql.map(function(n){return[n[0].utc,n[1]]}),rc=Jl.multi([[".%L",function(n){return n.getUTCMilliseconds()}],[":%S",function(n){return n.getUTCSeconds()}],["%I:%M",function(n){return n.getUTCMinutes()}],["%I %p",function(n){return n.getUTCHours()}],["%a %d",function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],["%b %d",function(n){return 1!=n.getUTCDate()}],["%B",function(n){return n.getUTCMonth()}],["%Y",zt]]);ec.year=ga.year.utc,ga.scale.utc=function(){return ro(ao.scale.linear(),ec,rc)},ao.text=An(function(n){return n.responseText}),ao.json=function(n,t){return Cn(n,"application/json",uo,t)},ao.html=function(n,t){return Cn(n,"text/html",oo,t)},ao.xml=An(function(n){return n.responseXML}),"function"==typeof define&&define.amd?(this.d3=ao,define(ao)):"object"==typeof module&&module.exports?module.exports=ao:this.d3=ao}(); \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js new file mode 100644 index 0000000000..29cacd4d1d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/file.js @@ -0,0 +1,62 @@ + $(function() { + var $window = $(window) + , $top_link = $('#toplink') + , $body = $('body, html') + , offset = $('#code').offset().top + , hidePopover = function ($target) { + $target.data('popover-hover', false); + + setTimeout(function () { + if (!$target.data('popover-hover')) { + $target.popover('hide'); + } + }, 300); + }; + + $top_link.hide().click(function(event) { + event.preventDefault(); + $body.animate({scrollTop:0}, 800); + }); + + $window.scroll(function() { + if($window.scrollTop() > offset) { + $top_link.fadeIn(); + } else { + $top_link.fadeOut(); + } + }).scroll(); + + $('.popin') + .popover({trigger: 'manual'}) + .on({ + 'mouseenter.popover': function () { + var $target = $(this); + var $container = $target.children().first(); + + $target.data('popover-hover', true); + + // popover already displayed + if ($target.next('.popover').length) { + return; + } + + // show the popover + $container.popover('show'); + + // register mouse events on the popover + $target.next('.popover:not(.popover-initialized)') + .on({ + 'mouseenter': function () { + $target.data('popover-hover', true); + }, + 'mouseleave': function () { + hidePopover($container); + } + }) + .addClass('popover-initialized'); + }, + 'mouseleave.popover': function () { + hidePopover($(this).children().first()); + } + }); + }); diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js new file mode 100644 index 0000000000..a1c07fd803 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0f&&(e=a.render.queue[f]);f++)d=e.generate(),typeof e.callback==typeof Function&&e.callback(d);a.render.queue.splice(0,f),a.render.queue.length?setTimeout(c):(a.dispatch.render_end(),a.render.active=!1)};setTimeout(c)},a.render.active=!1,a.render.queue=[],a.addGraph=function(b){typeof arguments[0]==typeof Function&&(b={generate:arguments[0],callback:arguments[1]}),a.render.queue.push(b),a.render.active||a.render()},"undefined"!=typeof module&&"undefined"!=typeof exports&&(module.exports=a),"undefined"!=typeof window&&(window.nv=a),a.dom.write=function(a){return void 0!==window.fastdom?fastdom.write(a):a()},a.dom.read=function(a){return void 0!==window.fastdom?fastdom.read(a):a()},a.interactiveGuideline=function(){"use strict";function b(l){l.each(function(l){function m(){var a=d3.mouse(this),d=a[0],e=a[1],i=!0,j=!1;if(k&&(d=d3.event.offsetX,e=d3.event.offsetY,"svg"!==d3.event.target.tagName&&(i=!1),d3.event.target.className.baseVal.match("nv-legend")&&(j=!0)),i&&(d-=f.left,e-=f.top),0>d||0>e||d>o||e>p||d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement||j){if(k&&d3.event.relatedTarget&&void 0===d3.event.relatedTarget.ownerSVGElement&&(void 0===d3.event.relatedTarget.className||d3.event.relatedTarget.className.match(c.nvPointerEventsClass)))return;return h.elementMouseout({mouseX:d,mouseY:e}),b.renderGuideLine(null),void c.hidden(!0)}c.hidden(!1);var l=g.invert(d);h.elementMousemove({mouseX:d,mouseY:e,pointXValue:l}),"dblclick"===d3.event.type&&h.elementDblclick({mouseX:d,mouseY:e,pointXValue:l}),"click"===d3.event.type&&h.elementClick({mouseX:d,mouseY:e,pointXValue:l})}var n=d3.select(this),o=d||960,p=e||400,q=n.selectAll("g.nv-wrap.nv-interactiveLineLayer").data([l]),r=q.enter().append("g").attr("class"," nv-wrap nv-interactiveLineLayer");r.append("g").attr("class","nv-interactiveGuideLine"),j&&(j.on("touchmove",m).on("mousemove",m,!0).on("mouseout",m,!0).on("dblclick",m).on("click",m),b.guideLine=null,b.renderGuideLine=function(c){i&&(b.guideLine&&b.guideLine.attr("x1")===c||a.dom.write(function(){var b=q.select(".nv-interactiveGuideLine").selectAll("line").data(null!=c?[a.utils.NaNtoZero(c)]:[],String);b.enter().append("line").attr("class","nv-guideline").attr("x1",function(a){return a}).attr("x2",function(a){return a}).attr("y1",p).attr("y2",0),b.exit().remove()}))})})}var c=a.models.tooltip();c.duration(0).hideDelay(0)._isInteractiveLayer(!0).hidden(!1);var d=null,e=null,f={left:0,top:0},g=d3.scale.linear(),h=d3.dispatch("elementMousemove","elementMouseout","elementClick","elementDblclick"),i=!0,j=null,k="ActiveXObject"in window;return b.dispatch=h,b.tooltip=c,b.margin=function(a){return arguments.length?(f.top="undefined"!=typeof a.top?a.top:f.top,f.left="undefined"!=typeof a.left?a.left:f.left,b):f},b.width=function(a){return arguments.length?(d=a,b):d},b.height=function(a){return arguments.length?(e=a,b):e},b.xScale=function(a){return arguments.length?(g=a,b):g},b.showGuideLine=function(a){return arguments.length?(i=a,b):i},b.svgContainer=function(a){return arguments.length?(j=a,b):j},b},a.interactiveBisect=function(a,b,c){"use strict";if(!(a instanceof Array))return null;var d;d="function"!=typeof c?function(a){return a.x}:c;var e=function(a,b){return d(a)-b},f=d3.bisector(e).left,g=d3.max([0,f(a,b)-1]),h=d(a[g]);if("undefined"==typeof h&&(h=g),h===b)return g;var i=d3.min([g+1,a.length-1]),j=d(a[i]);return"undefined"==typeof j&&(j=i),Math.abs(j-b)>=Math.abs(h-b)?g:i},a.nearestValueIndex=function(a,b,c){"use strict";var d=1/0,e=null;return a.forEach(function(a,f){var g=Math.abs(b-a);null!=a&&d>=g&&c>g&&(d=g,e=f)}),e},function(){"use strict";a.models.tooltip=function(){function b(){if(k){var a=d3.select(k);"svg"!==a.node().tagName&&(a=a.select("svg"));var b=a.node()?a.attr("viewBox"):null;if(b){b=b.split(" ");var c=parseInt(a.style("width"),10)/b[2];p.left=p.left*c,p.top=p.top*c}}}function c(){if(!n){var a;a=k?k:document.body,n=d3.select(a).append("div").attr("class","nvtooltip "+(j?j:"xy-tooltip")).attr("id",v),n.style("top",0).style("left",0),n.style("opacity",0),n.selectAll("div, table, td, tr").classed(w,!0),n.classed(w,!0),o=n.node()}}function d(){if(r&&B(e)){b();var f=p.left,g=null!==i?i:p.top;return a.dom.write(function(){c();var b=A(e);b&&(o.innerHTML=b),k&&u?a.dom.read(function(){var a=k.getElementsByTagName("svg")[0],b={left:0,top:0};if(a){var c=a.getBoundingClientRect(),d=k.getBoundingClientRect(),e=c.top;if(0>e){var i=k.getBoundingClientRect();e=Math.abs(e)>i.height?0:e}b.top=Math.abs(e-d.top),b.left=Math.abs(c.left-d.left)}f+=k.offsetLeft+b.left-2*k.scrollLeft,g+=k.offsetTop+b.top-2*k.scrollTop,h&&h>0&&(g=Math.floor(g/h)*h),C([f,g])}):C([f,g])}),d}}var e=null,f="w",g=25,h=0,i=null,j=null,k=null,l=!0,m=400,n=null,o=null,p={left:null,top:null},q={left:0,top:0},r=!0,s=100,t=!0,u=!1,v="nvtooltip-"+Math.floor(1e5*Math.random()),w="nv-pointer-events-none",x=function(a){return a},y=function(a){return a},z=function(a){return a},A=function(a){if(null===a)return"";var b=d3.select(document.createElement("table"));if(t){var c=b.selectAll("thead").data([a]).enter().append("thead");c.append("tr").append("td").attr("colspan",3).append("strong").classed("x-value",!0).html(y(a.value))}var d=b.selectAll("tbody").data([a]).enter().append("tbody"),e=d.selectAll("tr").data(function(a){return a.series}).enter().append("tr").classed("highlight",function(a){return a.highlight});e.append("td").classed("legend-color-guide",!0).append("div").style("background-color",function(a){return a.color}),e.append("td").classed("key",!0).html(function(a,b){return z(a.key,b)}),e.append("td").classed("value",!0).html(function(a,b){return x(a.value,b)}),e.selectAll("td").each(function(a){if(a.highlight){var b=d3.scale.linear().domain([0,1]).range(["#fff",a.color]),c=.6;d3.select(this).style("border-bottom-color",b(c)).style("border-top-color",b(c))}});var f=b.node().outerHTML;return void 0!==a.footer&&(f+=""),f},B=function(a){if(a&&a.series){if(a.series instanceof Array)return!!a.series.length;if(a.series instanceof Object)return a.series=[a.series],!0}return!1},C=function(b){o&&a.dom.read(function(){var c,d,e=parseInt(o.offsetHeight,10),h=parseInt(o.offsetWidth,10),i=a.utils.windowSize().width,j=a.utils.windowSize().height,k=window.pageYOffset,p=window.pageXOffset;j=window.innerWidth>=document.body.scrollWidth?j:j-16,i=window.innerHeight>=document.body.scrollHeight?i:i-16;var r,t,u=function(a){var b=d;do isNaN(a.offsetTop)||(b+=a.offsetTop),a=a.offsetParent;while(a);return b},v=function(a){var b=c;do isNaN(a.offsetLeft)||(b+=a.offsetLeft),a=a.offsetParent;while(a);return b};switch(f){case"e":c=b[0]-h-g,d=b[1]-e/2,r=v(o),t=u(o),p>r&&(c=b[0]+g>p?b[0]+g:p-r+c),k>t&&(d=k-t+d),t+e>k+j&&(d=k+j-t+d-e);break;case"w":c=b[0]+g,d=b[1]-e/2,r=v(o),t=u(o),r+h>i&&(c=b[0]-h-g),k>t&&(d=k+5),t+e>k+j&&(d=k+j-t+d-e);break;case"n":c=b[0]-h/2-5,d=b[1]+g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),t+e>k+j&&(d=k+j-t+d-e);break;case"s":c=b[0]-h/2,d=b[1]-e-g,r=v(o),t=u(o),p>r&&(c=p+5),r+h>i&&(c=c-h/2+5),k>t&&(d=k);break;case"none":c=b[0],d=b[1]-g,r=v(o),t=u(o)}c-=q.left,d-=q.top;var w=o.getBoundingClientRect(),k=window.pageYOffset||document.documentElement.scrollTop,p=window.pageXOffset||document.documentElement.scrollLeft,x="translate("+(w.left+p)+"px, "+(w.top+k)+"px)",y="translate("+c+"px, "+d+"px)",z=d3.interpolateString(x,y),A=n.style("opacity")<.1;l?n.transition().delay(m).duration(0).style("opacity",0):n.interrupt().transition().duration(A?0:s).styleTween("transform",function(){return z},"important").style("-webkit-transform",y).style("opacity",1)})};return d.nvPointerEventsClass=w,d.options=a.utils.optionsFunc.bind(d),d._options=Object.create({},{duration:{get:function(){return s},set:function(a){s=a}},gravity:{get:function(){return f},set:function(a){f=a}},distance:{get:function(){return g},set:function(a){g=a}},snapDistance:{get:function(){return h},set:function(a){h=a}},classes:{get:function(){return j},set:function(a){j=a}},chartContainer:{get:function(){return k},set:function(a){k=a}},fixedTop:{get:function(){return i},set:function(a){i=a}},enabled:{get:function(){return r},set:function(a){r=a}},hideDelay:{get:function(){return m},set:function(a){m=a}},contentGenerator:{get:function(){return A},set:function(a){A=a}},valueFormatter:{get:function(){return x},set:function(a){x=a}},headerFormatter:{get:function(){return y},set:function(a){y=a}},keyFormatter:{get:function(){return z},set:function(a){z=a}},headerEnabled:{get:function(){return t},set:function(a){t=a}},_isInteractiveLayer:{get:function(){return u},set:function(a){u=!!a}},position:{get:function(){return p},set:function(a){p.left=void 0!==a.left?a.left:p.left,p.top=void 0!==a.top?a.top:p.top}},offset:{get:function(){return q},set:function(a){q.left=void 0!==a.left?a.left:q.left,q.top=void 0!==a.top?a.top:q.top}},hidden:{get:function(){return l},set:function(a){l!=a&&(l=!!a,d())}},data:{get:function(){return e},set:function(a){a.point&&(a.value=a.point.x,a.series=a.series||{},a.series.value=a.point.y,a.series.color=a.point.color||a.series.color),e=a}},tooltipElem:{get:function(){return o},set:function(){}},id:{get:function(){return v},set:function(){}}}),a.utils.initOptions(d),d}}(),a.utils.windowSize=function(){var a={width:640,height:480};return window.innerWidth&&window.innerHeight?(a.width=window.innerWidth,a.height=window.innerHeight,a):"CSS1Compat"==document.compatMode&&document.documentElement&&document.documentElement.offsetWidth?(a.width=document.documentElement.offsetWidth,a.height=document.documentElement.offsetHeight,a):document.body&&document.body.offsetWidth?(a.width=document.body.offsetWidth,a.height=document.body.offsetHeight,a):a},a.utils.windowResize=function(b){return window.addEventListener?window.addEventListener("resize",b):a.log("ERROR: Failed to bind to window.resize with: ",b),{callback:b,clear:function(){window.removeEventListener("resize",b)}}},a.utils.getColor=function(b){if(void 0===b)return a.utils.defaultColor();if(Array.isArray(b)){var c=d3.scale.ordinal().range(b);return function(a,b){var d=void 0===b?a:b;return a.color||c(d)}}return b},a.utils.defaultColor=function(){return a.utils.getColor(d3.scale.category20().range())},a.utils.customTheme=function(a,b,c){b=b||function(a){return a.key},c=c||d3.scale.category20().range();var d=c.length;return function(e){var f=b(e);return"function"==typeof a[f]?a[f]():void 0!==a[f]?a[f]:(d||(d=c.length),d-=1,c[d])}},a.utils.pjax=function(b,c){var d=function(d){d3.html(d,function(d){var e=d3.select(c).node();e.parentNode.replaceChild(d3.select(d).select(c).node(),e),a.utils.pjax(b,c)})};d3.selectAll(b).on("click",function(){history.pushState(this.href,this.textContent,this.href),d(this.href),d3.event.preventDefault()}),d3.select(window).on("popstate",function(){d3.event.state&&d(d3.event.state)})},a.utils.calcApproxTextWidth=function(a){if("function"==typeof a.style&&"function"==typeof a.text){var b=parseInt(a.style("font-size").replace("px",""),10),c=a.text().length;return c*b*.5}return 0},a.utils.NaNtoZero=function(a){return"number"!=typeof a||isNaN(a)||null===a||1/0===a||a===-1/0?0:a},d3.selection.prototype.watchTransition=function(a){var b=[this].concat([].slice.call(arguments,1));return a.transition.apply(a,b)},a.utils.renderWatch=function(b,c){if(!(this instanceof a.utils.renderWatch))return new a.utils.renderWatch(b,c);var d=void 0!==c?c:250,e=[],f=this;this.models=function(a){return a=[].slice.call(arguments,0),a.forEach(function(a){a.__rendered=!1,function(a){a.dispatch.on("renderEnd",function(){a.__rendered=!0,f.renderEnd("model")})}(a),e.indexOf(a)<0&&e.push(a)}),this},this.reset=function(a){void 0!==a&&(d=a),e=[]},this.transition=function(a,b,c){if(b=arguments.length>1?[].slice.call(arguments,1):[],c=b.length>1?b.pop():void 0!==d?d:250,a.__rendered=!1,e.indexOf(a)<0&&e.push(a),0===c)return a.__rendered=!0,a.delay=function(){return this},a.duration=function(){return this},a;a.__rendered=0===a.length?!0:a.every(function(a){return!a.length})?!0:!1;var g=0;return a.transition().duration(c).each(function(){++g}).each("end",function(){0===--g&&(a.__rendered=!0,f.renderEnd.apply(this,b))})},this.renderEnd=function(){e.every(function(a){return a.__rendered})&&(e.forEach(function(a){a.__rendered=!1}),b.renderEnd.apply(this,arguments))}},a.utils.deepExtend=function(b){var c=arguments.length>1?[].slice.call(arguments,1):[];c.forEach(function(c){for(var d in c){var e=b[d]instanceof Array,f="object"==typeof b[d],g="object"==typeof c[d];f&&!e&&g?a.utils.deepExtend(b[d],c[d]):b[d]=c[d]}})},a.utils.state=function(){if(!(this instanceof a.utils.state))return new a.utils.state;var b={},c=function(){},d=function(){return{}},e=null,f=null;this.dispatch=d3.dispatch("change","set"),this.dispatch.on("set",function(a){c(a,!0)}),this.getter=function(a){return d=a,this},this.setter=function(a,b){return b||(b=function(){}),c=function(c,d){a(c),d&&b()},this},this.init=function(b){e=e||{},a.utils.deepExtend(e,b)};var g=function(){var a=d();if(JSON.stringify(a)===JSON.stringify(b))return!1;for(var c in a)void 0===b[c]&&(b[c]={}),b[c]=a[c],f=!0;return!0};this.update=function(){e&&(c(e,!1),e=null),g.call(this)&&this.dispatch.change(b)}},a.utils.optionsFunc=function(a){return a&&d3.map(a).forEach(function(a,b){"function"==typeof this[a]&&this[a](b)}.bind(this)),this},a.utils.calcTicksX=function(b,c){var d=1,e=0;for(e;ed?f:d}return a.log("Requested number of ticks: ",b),a.log("Calculated max values to be: ",d),b=b>d?b=d-1:b,b=1>b?1:b,b=Math.floor(b),a.log("Calculating tick count as: ",b),b},a.utils.calcTicksY=function(b,c){return a.utils.calcTicksX(b,c)},a.utils.initOption=function(a,b){a._calls&&a._calls[b]?a[b]=a._calls[b]:(a[b]=function(c){return arguments.length?(a._overrides[b]=!0,a._options[b]=c,a):a._options[b]},a["_"+b]=function(c){return arguments.length?(a._overrides[b]||(a._options[b]=c),a):a._options[b]})},a.utils.initOptions=function(b){b._overrides=b._overrides||{};var c=Object.getOwnPropertyNames(b._options||{}),d=Object.getOwnPropertyNames(b._calls||{});c=c.concat(d);for(var e in c)a.utils.initOption(b,c[e])},a.utils.inheritOptionsD3=function(a,b,c){a._d3options=c.concat(a._d3options||[]),c.unshift(b),c.unshift(a),d3.rebind.apply(this,c)},a.utils.arrayUnique=function(a){return a.sort().filter(function(b,c){return!c||b!=a[c-1]})},a.utils.symbolMap=d3.map(),a.utils.symbol=function(){function b(b,e){var f=c.call(this,b,e),g=d.call(this,b,e);return-1!==d3.svg.symbolTypes.indexOf(f)?d3.svg.symbol().type(f).size(g)():a.utils.symbolMap.get(f)(g)}var c,d=64;return b.type=function(a){return arguments.length?(c=d3.functor(a),b):c},b.size=function(a){return arguments.length?(d=d3.functor(a),b):d},b},a.utils.inheritOptions=function(b,c){var d=Object.getOwnPropertyNames(c._options||{}),e=Object.getOwnPropertyNames(c._calls||{}),f=c._inherited||[],g=c._d3options||[],h=d.concat(e).concat(f).concat(g);h.unshift(c),h.unshift(b),d3.rebind.apply(this,h),b._inherited=a.utils.arrayUnique(d.concat(e).concat(f).concat(d).concat(b._inherited||[])),b._d3options=a.utils.arrayUnique(g.concat(b._d3options||[]))},a.utils.initSVG=function(a){a.classed({"nvd3-svg":!0})},a.utils.sanitizeHeight=function(a,b){return a||parseInt(b.style("height"),10)||400},a.utils.sanitizeWidth=function(a,b){return a||parseInt(b.style("width"),10)||960},a.utils.availableHeight=function(b,c,d){return a.utils.sanitizeHeight(b,c)-d.top-d.bottom},a.utils.availableWidth=function(b,c,d){return a.utils.sanitizeWidth(b,c)-d.left-d.right},a.utils.noData=function(b,c){var d=b.options(),e=d.margin(),f=d.noData(),g=null==f?["No Data Available."]:[f],h=a.utils.availableHeight(d.height(),c,e),i=a.utils.availableWidth(d.width(),c,e),j=e.left+i/2,k=e.top+h/2;c.selectAll("g").remove();var l=c.selectAll(".nv-noData").data(g);l.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),l.attr("x",j).attr("y",k).text(function(a){return a})},a.models.axis=function(){"use strict";function b(g){return s.reset(),g.each(function(b){var g=d3.select(this);a.utils.initSVG(g);var p=g.selectAll("g.nv-wrap.nv-axis").data([b]),q=p.enter().append("g").attr("class","nvd3 nv-wrap nv-axis"),t=(q.append("g"),p.select("g"));null!==n?c.ticks(n):("top"==c.orient()||"bottom"==c.orient())&&c.ticks(Math.abs(d.range()[1]-d.range()[0])/100),t.watchTransition(s,"axis").call(c),r=r||c.scale();var u=c.tickFormat();null==u&&(u=r.tickFormat());var v=t.selectAll("text.nv-axislabel").data([h||null]);v.exit().remove();var w,x,y;switch(c.orient()){case"top":v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",0).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b))+",0)"}).select("text").attr("dy","-0.5em").attr("y",-c.tickPadding()).attr("text-anchor","middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max top").attr("transform",function(b,c){return"translate("+a.utils.NaNtoZero(d.range()[c])+",0)"}));break;case"bottom":w=o+36;var z=30,A=0,B=t.selectAll("g").select("text"),C="";if(j%360){B.each(function(){var a=this.getBoundingClientRect(),b=a.width;A=a.height,b>z&&(z=b)}),C="rotate("+j+" 0,"+(A/2+c.tickPadding())+")";var D=Math.abs(Math.sin(j*Math.PI/180));w=(D?D*z:z)+30,B.attr("transform",C).style("text-anchor",j%360>0?"start":"end")}v.enter().append("text").attr("class","nv-axislabel"),y=d.range().length<2?0:2===d.range().length?d.range()[1]:d.range()[d.range().length-1]+(d.range()[1]-d.range()[0]),v.attr("text-anchor","middle").attr("y",w).attr("x",y/2),i&&(x=p.selectAll("g.nv-axisMaxMin").data([d.domain()[0],d.domain()[d.domain().length-1]]),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-x",0==b?"nv-axisMin-x":"nv-axisMax-x"].join(" ")}).append("text"),x.exit().remove(),x.attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"}).select("text").attr("dy",".71em").attr("y",c.tickPadding()).attr("transform",C).style("text-anchor",j?j%360>0?"start":"end":"middle").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max bottom").attr("transform",function(b){return"translate("+a.utils.NaNtoZero(d(b)+(m?d.rangeBand()/2:0))+",0)"})),l&&B.attr("transform",function(a,b){return"translate(0,"+(b%2==0?"0":"12")+")"});break;case"right":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"begin").attr("transform",k?"rotate(90)":"").attr("y",k?-Math.max(e.right,f)+12:-10).attr("x",k?d3.max(d.range())/2:c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(d(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",c.tickPadding()).style("text-anchor","start").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1));break;case"left":v.enter().append("text").attr("class","nv-axislabel"),v.style("text-anchor",k?"middle":"end").attr("transform",k?"rotate(-90)":"").attr("y",k?-Math.max(e.left,f)+25-(o||0):-10).attr("x",k?-d3.max(d.range())/2:-c.tickPadding()),i&&(x=p.selectAll("g.nv-axisMaxMin").data(d.domain()),x.enter().append("g").attr("class",function(a,b){return["nv-axisMaxMin","nv-axisMaxMin-y",0==b?"nv-axisMin-y":"nv-axisMax-y"].join(" ")}).append("text").style("opacity",0),x.exit().remove(),x.attr("transform",function(b){return"translate(0,"+a.utils.NaNtoZero(r(b))+")"}).select("text").attr("dy",".32em").attr("y",0).attr("x",-c.tickPadding()).attr("text-anchor","end").text(function(a){var b=u(a);return(""+b).match("NaN")?"":b}),x.watchTransition(s,"min-max right").attr("transform",function(b,c){return"translate(0,"+a.utils.NaNtoZero(d.range()[c])+")"}).select("text").style("opacity",1))}if(v.text(function(a){return a}),!i||"left"!==c.orient()&&"right"!==c.orient()||(t.selectAll("g").each(function(a){d3.select(this).select("text").attr("opacity",1),(d(a)d.range()[0]-10)&&((a>1e-10||-1e-10>a)&&d3.select(this).attr("opacity",0),d3.select(this).select("text").attr("opacity",0))}),d.domain()[0]==d.domain()[1]&&0==d.domain()[0]&&p.selectAll("g.nv-axisMaxMin").style("opacity",function(a,b){return b?0:1})),i&&("top"===c.orient()||"bottom"===c.orient())){var E=[];p.selectAll("g.nv-axisMaxMin").each(function(a,b){try{E.push(b?d(a)-this.getBoundingClientRect().width-4:d(a)+this.getBoundingClientRect().width+4)}catch(c){E.push(b?d(a)-4:d(a)+4)}}),t.selectAll("g").each(function(a){(d(a)E[1])&&(a>1e-10||-1e-10>a?d3.select(this).remove():d3.select(this).select("text").remove())})}t.selectAll(".tick").filter(function(a){return!parseFloat(Math.round(1e5*a)/1e6)&&void 0!==a}).classed("zero",!0),r=d.copy()}),s.renderEnd("axis immediate"),b}var c=d3.svg.axis(),d=d3.scale.linear(),e={top:0,right:0,bottom:0,left:0},f=75,g=60,h=null,i=!0,j=0,k=!0,l=!1,m=!1,n=null,o=0,p=250,q=d3.dispatch("renderEnd");c.scale(d).orient("bottom").tickFormat(function(a){return a});var r,s=a.utils.renderWatch(q,p);return b.axis=c,b.dispatch=q,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{axisLabelDistance:{get:function(){return o},set:function(a){o=a}},staggerLabels:{get:function(){return l},set:function(a){l=a}},rotateLabels:{get:function(){return j},set:function(a){j=a}},rotateYLabel:{get:function(){return k},set:function(a){k=a}},showMaxMin:{get:function(){return i},set:function(a){i=a}},axisLabel:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return g},set:function(a){g=a}},ticks:{get:function(){return n},set:function(a){n=a}},width:{get:function(){return f},set:function(a){f=a}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},duration:{get:function(){return p},set:function(a){p=a,s.reset(p)}},scale:{get:function(){return d},set:function(e){d=e,c.scale(d),m="function"==typeof d.rangeBands,a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"])}}}),a.utils.initOptions(b),a.utils.inheritOptionsD3(b,c,["orient","tickValues","tickSubdivide","tickSize","tickPadding","tickFormat"]),a.utils.inheritOptionsD3(b,d,["domain","range","rangeBand","rangeBands"]),b},a.models.boxPlot=function(){"use strict";function b(l){return v.reset(),l.each(function(b){var l=j-i.left-i.right,p=k-i.top-i.bottom;r=d3.select(this),a.utils.initSVG(r),m.domain(c||b.map(function(a,b){return o(a,b)})).rangeBands(e||[0,l],.1);var w=[];if(!d){var x=d3.min(b.map(function(a){var b=[];return b.push(a.values.Q1),a.values.hasOwnProperty("whisker_low")&&null!==a.values.whisker_low&&b.push(a.values.whisker_low),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.min(b)})),y=d3.max(b.map(function(a){var b=[];return b.push(a.values.Q3),a.values.hasOwnProperty("whisker_high")&&null!==a.values.whisker_high&&b.push(a.values.whisker_high),a.values.hasOwnProperty("outliers")&&null!==a.values.outliers&&(b=b.concat(a.values.outliers)),d3.max(b)}));w=[x,y]}n.domain(d||w),n.range(f||[p,0]),g=g||m,h=h||n.copy().range([n(0),n(0)]);{var z=r.selectAll("g.nv-wrap").data([b]);z.enter().append("g").attr("class","nvd3 nv-wrap")}z.attr("transform","translate("+i.left+","+i.top+")");var A=z.selectAll(".nv-boxplot").data(function(a){return a}),B=A.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);A.attr("class","nv-boxplot").attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}).classed("hover",function(a){return a.hover}),A.watchTransition(v,"nv-boxplot: boxplots").style("stroke-opacity",1).style("fill-opacity",.75).delay(function(a,c){return c*t/b.length}).attr("transform",function(a,b){return"translate("+(m(o(a,b))+.05*m.rangeBand())+", 0)"}),A.exit().remove(),B.each(function(a,b){var c=d3.select(this);["low","high"].forEach(function(d){a.values.hasOwnProperty("whisker_"+d)&&null!==a.values["whisker_"+d]&&(c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-whisker nv-boxplot-"+d),c.append("line").style("stroke",a.color?a.color:q(a,b)).attr("class","nv-boxplot-tick nv-boxplot-"+d))})});var C=A.selectAll(".nv-boxplot-outlier").data(function(a){return a.values.hasOwnProperty("outliers")&&null!==a.values.outliers?a.values.outliers:[]});C.enter().append("circle").style("fill",function(a,b,c){return q(a,c)}).style("stroke",function(a,b,c){return q(a,c)}).on("mouseover",function(a,b,c){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:a,color:q(a,c)},e:d3.event})}).on("mouseout",function(a,b,c){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:a,color:q(a,c)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),C.attr("class","nv-boxplot-outlier"),C.watchTransition(v,"nv-boxplot: nv-boxplot-outlier").attr("cx",.45*m.rangeBand()).attr("cy",function(a){return n(a)}).attr("r","3"),C.exit().remove();var D=function(){return null===u?.9*m.rangeBand():Math.min(75,.9*m.rangeBand())},E=function(){return.45*m.rangeBand()-D()/2},F=function(){return.45*m.rangeBand()+D()/2};["low","high"].forEach(function(a){var b="low"===a?"Q1":"Q3";A.select("line.nv-boxplot-whisker.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",.45*m.rangeBand()).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",.45*m.rangeBand()).attr("y2",function(a){return n(a.values[b])}),A.select("line.nv-boxplot-tick.nv-boxplot-"+a).watchTransition(v,"nv-boxplot: boxplots").attr("x1",E).attr("y1",function(b){return n(b.values["whisker_"+a])}).attr("x2",F).attr("y2",function(b){return n(b.values["whisker_"+a])})}),["low","high"].forEach(function(a){B.selectAll(".nv-boxplot-"+a).on("mouseover",function(b,c,d){d3.select(this).classed("hover",!0),s.elementMouseover({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mouseout",function(b,c,d){d3.select(this).classed("hover",!1),s.elementMouseout({series:{key:b.values["whisker_"+a],color:q(b,d)},e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})})}),B.append("rect").attr("class","nv-boxplot-box").on("mouseover",function(a,b){d3.select(this).classed("hover",!0),s.elementMouseover({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),s.elementMouseout({key:a.label,value:a.label,series:[{key:"Q3",value:a.values.Q3,color:a.color||q(a,b)},{key:"Q2",value:a.values.Q2,color:a.color||q(a,b)},{key:"Q1",value:a.values.Q1,color:a.color||q(a,b)}],data:a,index:b,e:d3.event})}).on("mousemove",function(){s.elementMousemove({e:d3.event})}),A.select("rect.nv-boxplot-box").watchTransition(v,"nv-boxplot: boxes").attr("y",function(a){return n(a.values.Q3)}).attr("width",D).attr("x",E).attr("height",function(a){return Math.abs(n(a.values.Q3)-n(a.values.Q1))||1}).style("fill",function(a,b){return a.color||q(a,b)}).style("stroke",function(a,b){return a.color||q(a,b)}),B.append("line").attr("class","nv-boxplot-median"),A.select("line.nv-boxplot-median").watchTransition(v,"nv-boxplot: boxplots line").attr("x1",E).attr("y1",function(a){return n(a.values.Q2)}).attr("x2",F).attr("y2",function(a){return n(a.values.Q2)}),g=m.copy(),h=n.copy()}),v.renderEnd("nv-boxplot immediate"),b}var c,d,e,f,g,h,i={top:0,right:0,bottom:0,left:0},j=960,k=500,l=Math.floor(1e4*Math.random()),m=d3.scale.ordinal(),n=d3.scale.linear(),o=function(a){return a.x},p=function(a){return a.y},q=a.utils.defaultColor(),r=null,s=d3.dispatch("elementMouseover","elementMouseout","elementMousemove","renderEnd"),t=250,u=null,v=a.utils.renderWatch(s,t);return b.dispatch=s,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},maxBoxWidth:{get:function(){return u},set:function(a){u=a}},x:{get:function(){return o},set:function(a){o=a}},y:{get:function(){return p},set:function(a){p=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return l},set:function(a){l=a}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}},duration:{get:function(){return t},set:function(a){t=a,v.reset(t)}}}),a.utils.initOptions(b),b},a.models.boxPlotChart=function(){"use strict";function b(k){return t.reset(),t.models(e),l&&t.models(f),m&&t.models(g),k.each(function(k){var p=d3.select(this);a.utils.initSVG(p);var t=(i||parseInt(p.style("width"))||960)-h.left-h.right,u=(j||parseInt(p.style("height"))||400)-h.top-h.bottom;if(b.update=function(){r.beforeUpdate(),p.transition().duration(s).call(b)},b.container=this,!(k&&k.length&&k.filter(function(a){return a.values.hasOwnProperty("Q1")&&a.values.hasOwnProperty("Q2")&&a.values.hasOwnProperty("Q3")}).length)){var v=p.selectAll(".nv-noData").data([q]);return v.enter().append("text").attr("class","nvd3 nv-noData").attr("dy","-.7em").style("text-anchor","middle"),v.attr("x",h.left+t/2).attr("y",h.top+u/2).text(function(a){return a}),b}p.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var w=p.selectAll("g.nv-wrap.nv-boxPlotWithAxes").data([k]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-boxPlotWithAxes").append("g"),y=x.append("defs"),z=w.select("g"); +x.append("g").attr("class","nv-x nv-axis"),x.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),x.append("g").attr("class","nv-barsWrap"),z.attr("transform","translate("+h.left+","+h.top+")"),n&&z.select(".nv-y.nv-axis").attr("transform","translate("+t+",0)"),e.width(t).height(u);var A=z.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));if(A.transition().call(e),y.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),z.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(o?2:1)).attr("height",16).attr("x",-c.rangeBand()/(o?1:2)),l){f.scale(c).ticks(a.utils.calcTicksX(t/100,k)).tickSize(-u,0),z.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),z.select(".nv-x.nv-axis").call(f);var B=z.select(".nv-x.nv-axis").selectAll("g");o&&B.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}m&&(g.scale(d).ticks(Math.floor(u/36)).tickSize(-t,0),z.select(".nv-y.nv-axis").call(g)),z.select(".nv-zeroLine line").attr("x1",0).attr("x2",t).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("nv-boxplot chart immediate"),b}var c,d,e=a.models.boxPlot(),f=a.models.axis(),g=a.models.axis(),h={top:15,right:10,bottom:50,left:60},i=null,j=null,k=a.utils.getColor(),l=!0,m=!0,n=!1,o=!1,p=a.models.tooltip(),q="No Data Available.",r=d3.dispatch("tooltipShow","tooltipHide","beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(n?"right":"left").tickFormat(d3.format(",.1f")),p.duration(0);var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){p.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(a){p.data(a).hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){p.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.boxplot=e,b.xAxis=f,b.yAxis=g,b.tooltip=p,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},staggerLabels:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return l},set:function(a){l=a}},showYAxis:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return tooltips},set:function(a){tooltips=a}},tooltipContent:{get:function(){return p},set:function(a){p=a}},noData:{get:function(){return q},set:function(a){q=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!==a.top?a.top:h.top,h.right=void 0!==a.right?a.right:h.right,h.bottom=void 0!==a.bottom?a.bottom:h.bottom,h.left=void 0!==a.left?a.left:h.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}},rightAlignYAxis:{get:function(){return n},set:function(a){n=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.bullet=function(){"use strict";function b(d){return d.each(function(b,d){var p=m-c.left-c.right,s=n-c.top-c.bottom;o=d3.select(this),a.utils.initSVG(o);{var t=f.call(this,b,d).slice().sort(d3.descending),u=g.call(this,b,d).slice().sort(d3.descending),v=h.call(this,b,d).slice().sort(d3.descending),w=i.call(this,b,d).slice(),x=j.call(this,b,d).slice(),y=k.call(this,b,d).slice(),z=d3.scale.linear().domain(d3.extent(d3.merge([l,t]))).range(e?[p,0]:[0,p]);this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range())}this.__chart__=z;var A=d3.min(t),B=d3.max(t),C=t[1],D=o.selectAll("g.nv-wrap.nv-bullet").data([b]),E=D.enter().append("g").attr("class","nvd3 nv-wrap nv-bullet"),F=E.append("g"),G=D.select("g");F.append("rect").attr("class","nv-range nv-rangeMax"),F.append("rect").attr("class","nv-range nv-rangeAvg"),F.append("rect").attr("class","nv-range nv-rangeMin"),F.append("rect").attr("class","nv-measure"),D.attr("transform","translate("+c.left+","+c.top+")");var H=function(a){return Math.abs(z(a)-z(0))},I=function(a){return z(0>a?a:0)};G.select("rect.nv-rangeMax").attr("height",s).attr("width",H(B>0?B:A)).attr("x",I(B>0?B:A)).datum(B>0?B:A),G.select("rect.nv-rangeAvg").attr("height",s).attr("width",H(C)).attr("x",I(C)).datum(C),G.select("rect.nv-rangeMin").attr("height",s).attr("width",H(B)).attr("x",I(B)).attr("width",H(B>0?A:B)).attr("x",I(B>0?A:B)).datum(B>0?A:B),G.select("rect.nv-measure").style("fill",q).attr("height",s/3).attr("y",s/3).attr("width",0>v?z(0)-z(v[0]):z(v[0])-z(0)).attr("x",I(v)).on("mouseover",function(){r.elementMouseover({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})}).on("mouseout",function(){r.elementMouseout({value:v[0],label:y[0]||"Current",color:d3.select(this).style("fill")})});var J=s/6,K=u.map(function(a,b){return{value:a,label:x[b]}});F.selectAll("path.nv-markerTriangle").data(K).enter().append("path").attr("class","nv-markerTriangle").attr("transform",function(a){return"translate("+z(a.value)+","+s/2+")"}).attr("d","M0,"+J+"L"+J+","+-J+" "+-J+","+-J+"Z").on("mouseover",function(a){r.elementMouseover({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill"),pos:[z(a.value),s/2]})}).on("mousemove",function(a){r.elementMousemove({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a){r.elementMouseout({value:a.value,label:a.label||"Previous",color:d3.select(this).style("fill")})}),D.selectAll(".nv-range").on("mouseover",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseover({value:a,label:c,color:d3.select(this).style("fill")})}).on("mousemove",function(){r.elementMousemove({value:v[0],label:y[0]||"Previous",color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){var c=w[b]||(b?1==b?"Mean":"Minimum":"Maximum");r.elementMouseout({value:a,label:c,color:d3.select(this).style("fill")})})}),b}var c={top:0,right:0,bottom:0,left:0},d="left",e=!1,f=function(a){return a.ranges},g=function(a){return a.markers?a.markers:[0]},h=function(a){return a.measures},i=function(a){return a.rangeLabels?a.rangeLabels:[]},j=function(a){return a.markerLabels?a.markerLabels:[]},k=function(a){return a.measureLabels?a.measureLabels:[]},l=[0],m=380,n=30,o=null,p=null,q=a.utils.getColor(["#1f77b4"]),r=d3.dispatch("elementMouseover","elementMouseout","elementMousemove");return b.dispatch=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return f},set:function(a){f=a}},markers:{get:function(){return g},set:function(a){g=a}},measures:{get:function(){return h},set:function(a){h=a}},forceX:{get:function(){return l},set:function(a){l=a}},width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},tickFormat:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},orient:{get:function(){return d},set:function(a){d=a,e="right"==d||"bottom"==d}},color:{get:function(){return q},set:function(b){q=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.bulletChart=function(){"use strict";function b(d){return d.each(function(e,o){var p=d3.select(this);a.utils.initSVG(p);var q=a.utils.availableWidth(k,p,g),r=l-g.top-g.bottom;if(b.update=function(){b(d)},b.container=this,!e||!h.call(this,e,o))return a.utils.noData(b,p),b;p.selectAll(".nv-noData").remove();var s=h.call(this,e,o).slice().sort(d3.descending),t=i.call(this,e,o).slice().sort(d3.descending),u=j.call(this,e,o).slice().sort(d3.descending),v=p.selectAll("g.nv-wrap.nv-bulletChart").data([e]),w=v.enter().append("g").attr("class","nvd3 nv-wrap nv-bulletChart"),x=w.append("g"),y=v.select("g");x.append("g").attr("class","nv-bulletWrap"),x.append("g").attr("class","nv-titles"),v.attr("transform","translate("+g.left+","+g.top+")");var z=d3.scale.linear().domain([0,Math.max(s[0],t[0],u[0])]).range(f?[q,0]:[0,q]),A=this.__chart__||d3.scale.linear().domain([0,1/0]).range(z.range());this.__chart__=z;var B=x.select(".nv-titles").append("g").attr("text-anchor","end").attr("transform","translate(-6,"+(l-g.top-g.bottom)/2+")");B.append("text").attr("class","nv-title").text(function(a){return a.title}),B.append("text").attr("class","nv-subtitle").attr("dy","1em").text(function(a){return a.subtitle}),c.width(q).height(r);var C=y.select(".nv-bulletWrap");d3.transition(C).call(c);var D=m||z.tickFormat(q/100),E=y.selectAll("g.nv-tick").data(z.ticks(n?n:q/50),function(a){return this.textContent||D(a)}),F=E.enter().append("g").attr("class","nv-tick").attr("transform",function(a){return"translate("+A(a)+",0)"}).style("opacity",1e-6);F.append("line").attr("y1",r).attr("y2",7*r/6),F.append("text").attr("text-anchor","middle").attr("dy","1em").attr("y",7*r/6).text(D);var G=d3.transition(E).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1);G.select("line").attr("y1",r).attr("y2",7*r/6),G.select("text").attr("y",7*r/6),d3.transition(E.exit()).attr("transform",function(a){return"translate("+z(a)+",0)"}).style("opacity",1e-6).remove()}),d3.timer.flush(),b}var c=a.models.bullet(),d=a.models.tooltip(),e="left",f=!1,g={top:5,right:40,bottom:20,left:120},h=function(a){return a.ranges},i=function(a){return a.markers?a.markers:[0]},j=function(a){return a.measures},k=null,l=55,m=null,n=null,o=null,p=d3.dispatch("tooltipShow","tooltipHide");return d.duration(0).headerEnabled(!1),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.label,value:a.value,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.bullet=c,b.dispatch=p,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{ranges:{get:function(){return h},set:function(a){h=a}},markers:{get:function(){return i},set:function(a){i=a}},measures:{get:function(){return j},set:function(a){j=a}},width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},tickFormat:{get:function(){return m},set:function(a){m=a}},ticks:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return o},set:function(a){o=a}},tooltips:{get:function(){return d.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),d.enabled(!!b)}},tooltipContent:{get:function(){return d.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),d.contentGenerator(b)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},orient:{get:function(){return e},set:function(a){e=a,f="right"==e||"bottom"==e}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.candlestickBar=function(){"use strict";function b(x){return x.each(function(b){c=d3.select(this);var x=a.utils.availableWidth(i,c,h),y=a.utils.availableHeight(j,c,h);a.utils.initSVG(c);var A=x/b[0].values.length*.45;l.domain(d||d3.extent(b[0].values.map(n).concat(t))),l.range(v?f||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:f||[5+A/2,x-A/2-5]),m.domain(e||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(g||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var B=d3.select(this).selectAll("g.nv-wrap.nv-candlestickBar").data([b[0].values]),C=B.enter().append("g").attr("class","nvd3 nv-wrap nv-candlestickBar"),D=C.append("defs"),E=C.append("g"),F=B.select("g");E.append("g").attr("class","nv-ticks"),B.attr("transform","translate("+h.left+","+h.top+")"),c.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:k})}),D.append("clipPath").attr("id","nv-chart-clip-path-"+k).append("rect"),B.select("#nv-chart-clip-path-"+k+" rect").attr("width",x).attr("height",y),F.attr("clip-path",w?"url(#nv-chart-clip-path-"+k+")":"");var G=B.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});G.exit().remove();{var H=G.enter().append("g").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b});H.append("line").attr("class","nv-candlestick-lines").attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),H.append("rect").attr("class","nv-candlestick-rects nv-bars").attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}c.selectAll(".nv-candlestick-lines").transition().attr("transform",function(a,b){return"translate("+l(n(a,b))+",0)"}).attr("x1",0).attr("y1",function(a,b){return m(r(a,b))}).attr("x2",0).attr("y2",function(a,b){return m(s(a,b))}),c.selectAll(".nv-candlestick-rects").transition().attr("transform",function(a,b){return"translate("+(l(n(a,b))-A/2)+","+(m(o(a,b))-(p(a,b)>q(a,b)?m(q(a,b))-m(p(a,b)):0))+")"}).attr("x",0).attr("y",0).attr("width",A).attr("height",function(a,b){var c=p(a,b),d=q(a,b);return c>d?m(d)-m(c):m(c)-m(d)})}),b}var c,d,e,f,g,h={top:0,right:0,bottom:0,left:0},i=null,j=null,k=Math.floor(1e4*Math.random()),l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,d){b.clearHighlights(),c.select(".nv-candlestickBar .nv-tick-0-"+a).classed("hover",d)},b.clearHighlights=function(){c.select(".nv-candlestickBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return i},set:function(a){i=a}},height:{get:function(){return j},set:function(a){j=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return k},set:function(a){k=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return h},set:function(a){h.top=void 0!=a.top?a.top:h.top,h.right=void 0!=a.right?a.right:h.right,h.bottom=void 0!=a.bottom?a.bottom:h.bottom,h.left=void 0!=a.left?a.left:h.left}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.cumulativeLineChart=function(){"use strict";function b(l){return H.reset(),H.models(f),r&&H.models(g),s&&H.models(h),l.each(function(l){function A(){d3.select(b.container).style("cursor","ew-resize")}function E(){G.x=d3.event.x,G.i=Math.round(F.invert(G.x)),K()}function H(){d3.select(b.container).style("cursor","auto"),y.index=G.i,C.stateChange(y)}function K(){bb.data([G]);var a=b.duration();b.duration(0),b.update(),b.duration(a)}var L=d3.select(this);a.utils.initSVG(L),L.classed("nv-chart-"+x,!0);var M=this,N=a.utils.availableWidth(o,L,m),O=a.utils.availableHeight(p,L,m);if(b.update=function(){0===D?L.call(b):L.transition().duration(D).call(b)},b.container=this,y.setter(J(l),b.update).getter(I(l)).update(),y.disabled=l.map(function(a){return!!a.disabled}),!z){var P;z={};for(P in y)z[P]=y[P]instanceof Array?y[P].slice(0):y[P]}var Q=d3.behavior.drag().on("dragstart",A).on("drag",E).on("dragend",H);if(!(l&&l.length&&l.filter(function(a){return a.values.length}).length))return a.utils.noData(b,L),b;if(L.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale(),w)f.yDomain(null);else{var R=l.filter(function(a){return!a.disabled}).map(function(a){var b=d3.extent(a.values,f.y());return b[0]<-.95&&(b[0]=-.95),[(b[0]-b[1])/(1+b[1]),(b[1]-b[0])/(1+b[0])]}),S=[d3.min(R,function(a){return a[0]}),d3.max(R,function(a){return a[1]})];f.yDomain(S)}F.domain([0,l[0].values.length-1]).range([0,N]).clamp(!0);var l=c(G.i,l),T=v?"none":"all",U=L.selectAll("g.nv-wrap.nv-cumulativeLine").data([l]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-cumulativeLine").append("g"),W=U.select("g");if(V.append("g").attr("class","nv-interactive"),V.append("g").attr("class","nv-x nv-axis").style("pointer-events","none"),V.append("g").attr("class","nv-y nv-axis"),V.append("g").attr("class","nv-background"),V.append("g").attr("class","nv-linesWrap").style("pointer-events",T),V.append("g").attr("class","nv-avgLinesWrap").style("pointer-events","none"),V.append("g").attr("class","nv-legendWrap"),V.append("g").attr("class","nv-controlsWrap"),q&&(i.width(N),W.select(".nv-legendWrap").datum(l).call(i),m.top!=i.height()&&(m.top=i.height(),O=a.utils.availableHeight(p,L,m)),W.select(".nv-legendWrap").attr("transform","translate(0,"+-m.top+")")),u){var X=[{key:"Re-scale y-axis",disabled:!w}];j.width(140).color(["#444","#444","#444"]).rightAlign(!1).margin({top:5,right:0,bottom:5,left:20}),W.select(".nv-controlsWrap").datum(X).attr("transform","translate(0,"+-m.top+")").call(j)}U.attr("transform","translate("+m.left+","+m.top+")"),t&&W.select(".nv-y.nv-axis").attr("transform","translate("+N+",0)");var Y=l.filter(function(a){return a.tempDisabled});U.select(".tempDisabled").remove(),Y.length&&U.append("text").attr("class","tempDisabled").attr("x",N/2).attr("y","-.71em").style("text-anchor","end").text(Y.map(function(a){return a.key}).join(", ")+" values cannot be calculated for this time period."),v&&(k.width(N).height(O).margin({left:m.left,top:m.top}).svgContainer(L).xScale(d),U.select(".nv-interactive").call(k)),V.select(".nv-background").append("rect"),W.select(".nv-background rect").attr("width",N).attr("height",O),f.y(function(a){return a.display.y}).width(N).height(O).color(l.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!l[b].disabled&&!l[b].tempDisabled}));var Z=W.select(".nv-linesWrap").datum(l.filter(function(a){return!a.disabled&&!a.tempDisabled}));Z.call(f),l.forEach(function(a,b){a.seriesIndex=b});var $=l.filter(function(a){return!a.disabled&&!!B(a)}),_=W.select(".nv-avgLinesWrap").selectAll("line").data($,function(a){return a.key}),ab=function(a){var b=e(B(a));return 0>b?0:b>O?O:b};_.enter().append("line").style("stroke-width",2).style("stroke-dasharray","10,10").style("stroke",function(a){return f.color()(a,a.seriesIndex)}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.style("stroke-opacity",function(a){var b=e(B(a));return 0>b||b>O?0:1}).attr("x1",0).attr("x2",N).attr("y1",ab).attr("y2",ab),_.exit().remove();var bb=Z.selectAll(".nv-indexLine").data([G]);bb.enter().append("rect").attr("class","nv-indexLine").attr("width",3).attr("x",-2).attr("fill","red").attr("fill-opacity",.5).style("pointer-events","all").call(Q),bb.attr("transform",function(a){return"translate("+F(a.i)+",0)"}).attr("height",O),r&&(g.scale(d)._ticks(a.utils.calcTicksX(N/70,l)).tickSize(-O,0),W.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),W.select(".nv-x.nv-axis").call(g)),s&&(h.scale(e)._ticks(a.utils.calcTicksY(O/36,l)).tickSize(-N,0),W.select(".nv-y.nv-axis").call(h)),W.select(".nv-background rect").on("click",function(){G.x=d3.mouse(this)[0],G.i=Math.round(F.invert(G.x)),y.index=G.i,C.stateChange(y),K()}),f.dispatch.on("elementClick",function(a){G.i=a.pointIndex,G.x=F(G.i),y.index=G.i,C.stateChange(y),K()}),j.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,w=!a.disabled,y.rescaleY=w,C.stateChange(y),b.update()}),i.dispatch.on("stateChange",function(a){for(var c in a)y[c]=a[c];C.stateChange(y),b.update()}),k.dispatch.on("elementMousemove",function(c){f.clearHighlights();var d,e,i,j=[];if(l.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g,h){e=a.interactiveBisect(g.values,c.pointXValue,b.x()),f.highlightPoint(h,e,!0);var k=g.values[e];"undefined"!=typeof k&&("undefined"==typeof d&&(d=k),"undefined"==typeof i&&(i=b.xScale()(b.x()(k,e))),j.push({key:g.key,value:b.y()(k,e),color:n(g,g.seriesIndex)}))}),j.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(j.map(function(a){return a.value}),o,q);null!==r&&(j[r].highlight=!0)}var s=g.tickFormat()(b.x()(d,e),e);k.tooltip.position({left:i+m.left,top:c.mouseY+m.top}).chartContainer(M.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:s,series:j})(),k.renderGuideLine(i)}),k.dispatch.on("elementMouseout",function(){f.clearHighlights()}),C.on("changeState",function(a){"undefined"!=typeof a.disabled&&(l.forEach(function(b,c){b.disabled=a.disabled[c]}),y.disabled=a.disabled),"undefined"!=typeof a.index&&(G.i=a.index,G.x=F(G.i),y.index=a.index,bb.data([G])),"undefined"!=typeof a.rescaleY&&(w=a.rescaleY),b.update()})}),H.renderEnd("cumulativeLineChart immediate"),b}function c(a,b){return K||(K=f.y()),b.map(function(b){if(!b.values)return b;var c=b.values[a];if(null==c)return b;var d=K(c,a);return-.95>d&&!E?(b.tempDisabled=!0,b):(b.tempDisabled=!1,b.values=b.values.map(function(a,b){return a.display={y:(K(a,b)-d)/(1+d)},a}),b)})}var d,e,f=a.models.line(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.models.legend(),k=a.interactiveGuideline(),l=a.models.tooltip(),m={top:30,right:30,bottom:50,left:60},n=a.utils.defaultColor(),o=null,p=null,q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=!0,x=f.id(),y=a.utils.state(),z=null,A=null,B=function(a){return a.average},C=d3.dispatch("stateChange","changeState","renderEnd"),D=250,E=!1;y.index=0,y.rescaleY=w,g.orient("bottom").tickPadding(7),h.orient(t?"right":"left"),l.valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)}),j.updateState(!1);var F=d3.scale.linear(),G={i:0,x:0},H=a.utils.renderWatch(C,D),I=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),index:G.i,rescaleY:w}}},J=function(a){return function(b){void 0!==b.index&&(G.i=b.index),void 0!==b.rescaleY&&(w=b.rescaleY),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};f.dispatch.on("elementMouseover.tooltip",function(a){var c={x:b.x()(a.point),y:b.y()(a.point),color:a.point.color};a.point=c,l.data(a).position(a.pos).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){l.hidden(!0)});var K=null;return b.dispatch=C,b.lines=f,b.legend=i,b.controls=j,b.xAxis=g,b.yAxis=h,b.interactiveLayer=k,b.state=y,b.tooltip=l,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return o},set:function(a){o=a}},height:{get:function(){return p},set:function(a){p=a}},rescaleY:{get:function(){return w},set:function(a){w=a}},showControls:{get:function(){return u},set:function(a){u=a}},showLegend:{get:function(){return q},set:function(a){q=a}},average:{get:function(){return B},set:function(a){B=a}},defaultState:{get:function(){return z},set:function(a){z=a}},noData:{get:function(){return A},set:function(a){A=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},noErrorCheck:{get:function(){return E},set:function(a){E=a}},tooltips:{get:function(){return l.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),l.enabled(!!b)}},tooltipContent:{get:function(){return l.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),l.contentGenerator(b)}},margin:{get:function(){return m},set:function(a){m.top=void 0!==a.top?a.top:m.top,m.right=void 0!==a.right?a.right:m.right,m.bottom=void 0!==a.bottom?a.bottom:m.bottom,m.left=void 0!==a.left?a.left:m.left}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),i.color(n)}},useInteractiveGuideline:{get:function(){return v},set:function(a){v=a,a===!0&&(b.interactive(!1),b.useVoronoi(!1))}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,h.orient(a?"right":"left")}},duration:{get:function(){return D},set:function(a){D=a,f.duration(D),g.duration(D),h.duration(D),H.reset(D)}}}),a.utils.inheritOptions(b,f),a.utils.initOptions(b),b},a.models.discreteBar=function(){"use strict";function b(m){return y.reset(),m.each(function(b){var m=k-j.left-j.right,x=l-j.top-j.bottom;c=d3.select(this),a.utils.initSVG(c),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var z=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),y0:a.y0}})});n.domain(d||d3.merge(z).map(function(a){return a.x})).rangeBands(f||[0,m],.1),o.domain(e||d3.extent(d3.merge(z).map(function(a){return a.y}).concat(r))),o.range(t?g||[x-(o.domain()[0]<0?12:0),o.domain()[1]>0?12:0]:g||[x,0]),h=h||n,i=i||o.copy().range([o(0),o(0)]);{var A=c.selectAll("g.nv-wrap.nv-discretebar").data([b]),B=A.enter().append("g").attr("class","nvd3 nv-wrap nv-discretebar"),C=B.append("g");A.select("g")}C.append("g").attr("class","nv-groups"),A.attr("transform","translate("+j.left+","+j.top+")");var D=A.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});D.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),D.exit().watchTransition(y,"discreteBar: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),D.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),D.watchTransition(y,"discreteBar: groups").style("stroke-opacity",1).style("fill-opacity",.75);var E=D.selectAll("g.nv-bar").data(function(a){return a.values});E.exit().remove();var F=E.enter().append("g").attr("transform",function(a,b){return"translate("+(n(p(a,b))+.05*n.rangeBand())+", "+o(0)+")"}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),v.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),v.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){v.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){v.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()});F.append("rect").attr("height",0).attr("width",.9*n.rangeBand()/b.length),t?(F.append("text").attr("text-anchor","middle"),E.select("text").text(function(a,b){return u(q(a,b))}).watchTransition(y,"discreteBar: bars text").attr("x",.9*n.rangeBand()/2).attr("y",function(a,b){return q(a,b)<0?o(q(a,b))-o(0)+12:-4})):E.selectAll("text").remove(),E.attr("class",function(a,b){return q(a,b)<0?"nv-bar negative":"nv-bar positive"}).style("fill",function(a,b){return a.color||s(a,b)}).style("stroke",function(a,b){return a.color||s(a,b)}).select("rect").attr("class",w).watchTransition(y,"discreteBar: bars rect").attr("width",.9*n.rangeBand()/b.length),E.watchTransition(y,"discreteBar: bars").attr("transform",function(a,b){var c=n(p(a,b))+.05*n.rangeBand(),d=q(a,b)<0?o(0):o(0)-o(q(a,b))<1?o(0)-1:o(q(a,b));return"translate("+c+", "+d+")"}).select("rect").attr("height",function(a,b){return Math.max(Math.abs(o(q(a,b))-o(e&&e[0]||0))||1)}),h=n.copy(),i=o.copy()}),y.renderEnd("discreteBar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=d3.scale.ordinal(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=[0],s=a.utils.defaultColor(),t=!1,u=d3.format(",.2f"),v=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),w="discreteBar",x=250,y=a.utils.renderWatch(v,x);return b.dispatch=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},forceY:{get:function(){return r},set:function(a){r=a}},showValues:{get:function(){return t},set:function(a){t=a}},x:{get:function(){return p},set:function(a){p=a}},y:{get:function(){return q},set:function(a){q=a}},xScale:{get:function(){return n},set:function(a){n=a}},yScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},valueFormat:{get:function(){return u},set:function(a){u=a}},id:{get:function(){return m},set:function(a){m=a}},rectClass:{get:function(){return w},set:function(a){w=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b)}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x)}}}),a.utils.initOptions(b),b},a.models.discreteBarChart=function(){"use strict";function b(h){return t.reset(),t.models(e),m&&t.models(f),n&&t.models(g),h.each(function(h){var l=d3.select(this);a.utils.initSVG(l);var q=a.utils.availableWidth(j,l,i),t=a.utils.availableHeight(k,l,i);if(b.update=function(){r.beforeUpdate(),l.transition().duration(s).call(b)},b.container=this,!(h&&h.length&&h.filter(function(a){return a.values.length}).length))return a.utils.noData(b,l),b;l.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale().clamp(!0);var u=l.selectAll("g.nv-wrap.nv-discreteBarWithAxes").data([h]),v=u.enter().append("g").attr("class","nvd3 nv-wrap nv-discreteBarWithAxes").append("g"),w=v.append("defs"),x=u.select("g");v.append("g").attr("class","nv-x nv-axis"),v.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),v.append("g").attr("class","nv-barsWrap"),x.attr("transform","translate("+i.left+","+i.top+")"),o&&x.select(".nv-y.nv-axis").attr("transform","translate("+q+",0)"),e.width(q).height(t);var y=x.select(".nv-barsWrap").datum(h.filter(function(a){return!a.disabled}));if(y.transition().call(e),w.append("clipPath").attr("id","nv-x-label-clip-"+e.id()).append("rect"),x.select("#nv-x-label-clip-"+e.id()+" rect").attr("width",c.rangeBand()*(p?2:1)).attr("height",16).attr("x",-c.rangeBand()/(p?1:2)),m){f.scale(c)._ticks(a.utils.calcTicksX(q/100,h)).tickSize(-t,0),x.select(".nv-x.nv-axis").attr("transform","translate(0,"+(d.range()[0]+(e.showValues()&&d.domain()[0]<0?16:0))+")"),x.select(".nv-x.nv-axis").call(f); +var z=x.select(".nv-x.nv-axis").selectAll("g");p&&z.selectAll("text").attr("transform",function(a,b,c){return"translate(0,"+(c%2==0?"5":"17")+")"})}n&&(g.scale(d)._ticks(a.utils.calcTicksY(t/36,h)).tickSize(-q,0),x.select(".nv-y.nv-axis").call(g)),x.select(".nv-zeroLine line").attr("x1",0).attr("x2",q).attr("y1",d(0)).attr("y2",d(0))}),t.renderEnd("discreteBar chart immediate"),b}var c,d,e=a.models.discreteBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.tooltip(),i={top:15,right:10,bottom:50,left:60},j=null,k=null,l=a.utils.getColor(),m=!0,n=!0,o=!1,p=!1,q=null,r=d3.dispatch("beforeUpdate","renderEnd"),s=250;f.orient("bottom").showMaxMin(!1).tickFormat(function(a){return a}),g.orient(o?"right":"left").tickFormat(d3.format(",.1f")),h.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).keyFormatter(function(a,b){return f.tickFormat()(a,b)});var t=a.utils.renderWatch(r,s);return e.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},h.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){h.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){h.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=r,b.discretebar=e,b.xAxis=f,b.yAxis=g,b.tooltip=h,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return j},set:function(a){j=a}},height:{get:function(){return k},set:function(a){k=a}},staggerLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return m},set:function(a){m=a}},showYAxis:{get:function(){return n},set:function(a){n=a}},noData:{get:function(){return q},set:function(a){q=a}},tooltips:{get:function(){return h.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),h.enabled(!!b)}},tooltipContent:{get:function(){return h.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),h.contentGenerator(b)}},margin:{get:function(){return i},set:function(a){i.top=void 0!==a.top?a.top:i.top,i.right=void 0!==a.right?a.right:i.right,i.bottom=void 0!==a.bottom?a.bottom:i.bottom,i.left=void 0!==a.left?a.left:i.left}},duration:{get:function(){return s},set:function(a){s=a,t.reset(s),e.duration(s),f.duration(s),g.duration(s)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),e.color(l)}},rightAlignYAxis:{get:function(){return o},set:function(a){o=a,g.orient(a?"right":"left")}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.distribution=function(){"use strict";function b(k){return m.reset(),k.each(function(b){var k=(e-("x"===g?d.left+d.right:d.top+d.bottom),"x"==g?"y":"x"),l=d3.select(this);a.utils.initSVG(l),c=c||j;var n=l.selectAll("g.nv-distribution").data([b]),o=n.enter().append("g").attr("class","nvd3 nv-distribution"),p=(o.append("g"),n.select("g"));n.attr("transform","translate("+d.left+","+d.top+")");var q=p.selectAll("g.nv-dist").data(function(a){return a},function(a){return a.key});q.enter().append("g"),q.attr("class",function(a,b){return"nv-dist nv-series-"+b}).style("stroke",function(a,b){return i(a,b)});var r=q.selectAll("line.nv-dist"+g).data(function(a){return a.values});r.enter().append("line").attr(g+"1",function(a,b){return c(h(a,b))}).attr(g+"2",function(a,b){return c(h(a,b))}),m.transition(q.exit().selectAll("line.nv-dist"+g),"dist exit").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}).style("stroke-opacity",0).remove(),r.attr("class",function(a,b){return"nv-dist"+g+" nv-dist"+g+"-"+b}).attr(k+"1",0).attr(k+"2",f),m.transition(r,"dist").attr(g+"1",function(a,b){return j(h(a,b))}).attr(g+"2",function(a,b){return j(h(a,b))}),c=j.copy()}),m.renderEnd("distribution immediate"),b}var c,d={top:0,right:0,bottom:0,left:0},e=400,f=8,g="x",h=function(a){return a[g]},i=a.utils.defaultColor(),j=d3.scale.linear(),k=250,l=d3.dispatch("renderEnd"),m=a.utils.renderWatch(l,k);return b.options=a.utils.optionsFunc.bind(b),b.dispatch=l,b.margin=function(a){return arguments.length?(d.top="undefined"!=typeof a.top?a.top:d.top,d.right="undefined"!=typeof a.right?a.right:d.right,d.bottom="undefined"!=typeof a.bottom?a.bottom:d.bottom,d.left="undefined"!=typeof a.left?a.left:d.left,b):d},b.width=function(a){return arguments.length?(e=a,b):e},b.axis=function(a){return arguments.length?(g=a,b):g},b.size=function(a){return arguments.length?(f=a,b):f},b.getData=function(a){return arguments.length?(h=d3.functor(a),b):h},b.scale=function(a){return arguments.length?(j=a,b):j},b.color=function(c){return arguments.length?(i=a.utils.getColor(c),b):i},b.duration=function(a){return arguments.length?(k=a,m.reset(k),b):k},b},a.models.furiousLegend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?g(a,b):"#fff":m?void 0:a.disabled?g(a,b):"#fff"}function r(a,b){return m&&"furious"==o?a.disengaged?"#fff":g(a,b):a.disabled?"#fff":g(a,b)}return p.each(function(b){var p=d-c.left-c.right,s=d3.select(this);a.utils.initSVG(s);var t=s.selectAll("g.nv-legend").data([b]),u=(t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),t.select("g"));t.attr("transform","translate("+c.left+","+c.top+")");var v,w=u.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),x=w.enter().append("g").attr("class","nv-series");if("classic"==o)x.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),v=w.select("circle");else if("furious"==o){x.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),v=w.select("rect"),x.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var y=w.select(".nv-check-box");y.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}x.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var z=w.select("text.nv-legend-text");w.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=w.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=w.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),w.classed("nv-disabled",function(a){return a.userDisabled}),w.exit().remove(),z.attr("fill",q).text(f);var A;switch(o){case"furious":A=23;break;case"classic":A=20}if(h){var B=[];w.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}B.push(b+i)});for(var C=0,D=0,E=[];p>D&&Cp&&C>1;){E=[],C--;for(var F=0;F(E[F%C]||0)&&(E[F%C]=B[F]);D=E.reduce(function(a,b){return a+b})}for(var G=[],H=0,I=0;C>H;H++)G[H]=I,I+=E[H];w.attr("transform",function(a,b){return"translate("+G[b%C]+","+(5+Math.floor(b/C)*A)+")"}),j?u.attr("transform","translate("+(d-c.right-D)+","+c.top+")"):u.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(B.length/C)*A}else{var J,K=5,L=5,M=0;w.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return J=L,dM&&(M=L),"translate("+J+","+K+")"}),u.attr("transform","translate("+(d-c.right-M)+","+c.top+")"),e=c.top+c.bottom+K+15}"furious"==o&&v.attr("width",function(a,b){return z[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),v.style("fill",r).style("stroke",function(a,b){return a.color||g(a,b)})}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=28,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBar=function(){"use strict";function b(x){return x.each(function(b){w.reset(),k=d3.select(this);var x=a.utils.availableWidth(h,k,g),y=a.utils.availableHeight(i,k,g);a.utils.initSVG(k),l.domain(c||d3.extent(b[0].values.map(n).concat(p))),l.range(r?e||[.5*x/b[0].values.length,x*(b[0].values.length-.5)/b[0].values.length]:e||[0,x]),m.domain(d||d3.extent(b[0].values.map(o).concat(q))).range(f||[y,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var z=k.selectAll("g.nv-wrap.nv-historicalBar-"+j).data([b[0].values]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBar-"+j),B=A.append("defs"),C=A.append("g"),D=z.select("g");C.append("g").attr("class","nv-bars"),z.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){u.chartClick({data:a,index:b,pos:d3.event,id:j})}),B.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),z.select("#nv-chart-clip-path-"+j+" rect").attr("width",x).attr("height",y),D.attr("clip-path",s?"url(#nv-chart-clip-path-"+j+")":"");var E=z.select(".nv-bars").selectAll(".nv-bar").data(function(a){return a},function(a,b){return n(a,b)});E.exit().remove(),E.enter().append("rect").attr("x",0).attr("y",function(b,c){return a.utils.NaNtoZero(m(Math.max(0,o(b,c))))}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.abs(m(o(b,c))-m(0)))}).attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).on("mouseover",function(a,b){v&&(d3.select(this).classed("hover",!0),u.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mouseout",function(a,b){v&&(d3.select(this).classed("hover",!1),u.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")}))}).on("mousemove",function(a,b){v&&u.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){v&&(u.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}).on("dblclick",function(a,b){v&&(u.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation())}),E.attr("fill",function(a,b){return t(a,b)}).attr("class",function(a,b,c){return(o(a,b)<0?"nv-bar negative":"nv-bar positive")+" nv-bar-"+c+"-"+b}).watchTransition(w,"bars").attr("transform",function(a,c){return"translate("+(l(n(a,c))-x/b[0].values.length*.45)+",0)"}).attr("width",x/b[0].values.length*.9),E.watchTransition(w,"bars").attr("y",function(b,c){var d=o(b,c)<0?m(0):m(0)-m(o(b,c))<1?m(0)-1:m(o(b,c));return a.utils.NaNtoZero(d)}).attr("height",function(b,c){return a.utils.NaNtoZero(Math.max(Math.abs(m(o(b,c))-m(0)),1))})}),w.renderEnd("historicalBar immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=[],q=[0],r=!1,s=!0,t=a.utils.defaultColor(),u=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),v=!0,w=a.utils.renderWatch(u,0);return b.highlightPoint=function(a,b){k.select(".nv-bars .nv-bar-0-"+a).classed("hover",b)},b.clearHighlights=function(){k.select(".nv-bars .nv-bar.hover").classed("hover",!1)},b.dispatch=u,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},forceX:{get:function(){return p},set:function(a){p=a}},forceY:{get:function(){return q},set:function(a){q=a}},padData:{get:function(){return r},set:function(a){r=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},clipEdge:{get:function(){return s},set:function(a){s=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return v},set:function(a){v=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return t},set:function(b){t=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.historicalBarChart=function(b){"use strict";function c(b){return b.each(function(k){z.reset(),z.models(f),q&&z.models(g),r&&z.models(h);var w=d3.select(this),A=this;a.utils.initSVG(w);var B=a.utils.availableWidth(n,w,l),C=a.utils.availableHeight(o,w,l);if(c.update=function(){w.transition().duration(y).call(c)},c.container=this,u.disabled=k.map(function(a){return!!a.disabled}),!v){var D;v={};for(D in u)v[D]=u[D]instanceof Array?u[D].slice(0):u[D]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(c,w),c;w.selectAll(".nv-noData").remove(),d=f.xScale(),e=f.yScale();var E=w.selectAll("g.nv-wrap.nv-historicalBarChart").data([k]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-historicalBarChart").append("g"),G=E.select("g");F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-barsWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),p&&(i.width(B),G.select(".nv-legendWrap").datum(k).call(i),l.top!=i.height()&&(l.top=i.height(),C=a.utils.availableHeight(o,w,l)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-l.top+")")),E.attr("transform","translate("+l.left+","+l.top+")"),s&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),t&&(j.width(B).height(C).margin({left:l.left,top:l.top}).svgContainer(w).xScale(d),E.select(".nv-interactive").call(j)),f.width(B).height(C).color(k.map(function(a,b){return a.color||m(a,b)}).filter(function(a,b){return!k[b].disabled}));var H=G.select(".nv-barsWrap").datum(k.filter(function(a){return!a.disabled}));H.transition().call(f),q&&(g.scale(d)._ticks(a.utils.calcTicksX(B/100,k)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+e.range()[0]+")"),G.select(".nv-x.nv-axis").transition().call(g)),r&&(h.scale(e)._ticks(a.utils.calcTicksY(C/36,k)).tickSize(-B,0),G.select(".nv-y.nv-axis").transition().call(h)),j.dispatch.on("elementMousemove",function(b){f.clearHighlights();var d,e,i,n=[];k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(g){e=a.interactiveBisect(g.values,b.pointXValue,c.x()),f.highlightPoint(e,!0);var h=g.values[e];void 0!==h&&(void 0===d&&(d=h),void 0===i&&(i=c.xScale()(c.x()(h,e))),n.push({key:g.key,value:c.y()(h,e),color:m(g,g.seriesIndex),data:g.values[e]}))});var o=g.tickFormat()(c.x()(d,e));j.tooltip.position({left:i+l.left,top:b.mouseY+l.top}).chartContainer(A.parentNode).valueFormatter(function(a){return h.tickFormat()(a)}).data({value:o,index:e,series:n})(),j.renderGuideLine(i)}),j.dispatch.on("elementMouseout",function(){x.tooltipHide(),f.clearHighlights()}),i.dispatch.on("legendClick",function(a){a.disabled=!a.disabled,k.filter(function(a){return!a.disabled}).length||k.map(function(a){return a.disabled=!1,E.selectAll(".nv-series").classed("disabled",!1),a}),u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),b.transition().call(c)}),i.dispatch.on("legendDblclick",function(a){k.forEach(function(a){a.disabled=!0}),a.disabled=!1,u.disabled=k.map(function(a){return!!a.disabled}),x.stateChange(u),c.update()}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),c.update()})}),z.renderEnd("historicalBarChart immediate"),c}var d,e,f=b||a.models.historicalBar(),g=a.models.axis(),h=a.models.axis(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:90,bottom:50,left:90},m=a.utils.defaultColor(),n=null,o=null,p=!1,q=!0,r=!0,s=!1,t=!1,u={},v=null,w=null,x=d3.dispatch("tooltipHide","stateChange","changeState","renderEnd"),y=250;g.orient("bottom").tickPadding(7),h.orient(s?"right":"left"),k.duration(0).headerEnabled(!1).valueFormatter(function(a,b){return h.tickFormat()(a,b)}).headerFormatter(function(a,b){return g.tickFormat()(a,b)});var z=a.utils.renderWatch(x,0);return f.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:c.x()(a.data),value:c.y()(a.data),color:a.color},k.data(a).hidden(!1)}),f.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),f.dispatch.on("elementMousemove.tooltip",function(){k.position({top:d3.event.pageY,left:d3.event.pageX})()}),c.dispatch=x,c.bars=f,c.legend=i,c.xAxis=g,c.yAxis=h,c.interactiveLayer=j,c.tooltip=k,c.options=a.utils.optionsFunc.bind(c),c._options=Object.create({},{width:{get:function(){return n},set:function(a){n=a}},height:{get:function(){return o},set:function(a){o=a}},showLegend:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return q},set:function(a){q=a}},showYAxis:{get:function(){return r},set:function(a){r=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b),i.color(m),f.color(m)}},duration:{get:function(){return y},set:function(a){y=a,z.reset(y),h.duration(y),g.duration(y)}},rightAlignYAxis:{get:function(){return s},set:function(a){s=a,h.orient(a?"right":"left")}},useInteractiveGuideline:{get:function(){return t},set:function(a){t=a,a===!0&&c.interactive(!1)}}}),a.utils.inheritOptions(c,f),a.utils.initOptions(c),c},a.models.ohlcBarChart=function(){var b=a.models.historicalBarChart(a.models.ohlcBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
open:"+b.yAxis.tickFormat()(c.open)+"
close:"+b.yAxis.tickFormat()(c.close)+"
high"+b.yAxis.tickFormat()(c.high)+"
low:"+b.yAxis.tickFormat()(c.low)+"
"}),b},a.models.candlestickBarChart=function(){var b=a.models.historicalBarChart(a.models.candlestickBar());return b.useInteractiveGuideline(!0),b.interactiveLayer.tooltip.contentGenerator(function(a){var c=a.series[0].data,d=c.open'+a.value+"
open:"+b.yAxis.tickFormat()(c.open)+"
close:"+b.yAxis.tickFormat()(c.close)+"
high"+b.yAxis.tickFormat()(c.high)+"
low:"+b.yAxis.tickFormat()(c.low)+"
"}),b},a.models.legend=function(){"use strict";function b(p){function q(a,b){return"furious"!=o?"#000":m?a.disengaged?"#000":"#fff":m?void 0:(a.color||(a.color=g(a,b)),a.disabled?a.color:"#fff")}function r(a,b){return m&&"furious"==o&&a.disengaged?"#eee":a.color||g(a,b)}function s(a){return m&&"furious"==o?1:a.disabled?0:1}return p.each(function(b){var g=d-c.left-c.right,p=d3.select(this);a.utils.initSVG(p);var t=p.selectAll("g.nv-legend").data([b]),u=t.enter().append("g").attr("class","nvd3 nv-legend").append("g"),v=t.select("g");t.attr("transform","translate("+c.left+","+c.top+")");var w,x,y=v.selectAll(".nv-series").data(function(a){return"furious"!=o?a:a.filter(function(a){return m?!0:!a.disengaged})}),z=y.enter().append("g").attr("class","nv-series");switch(o){case"furious":x=23;break;case"classic":x=20}if("classic"==o)z.append("circle").style("stroke-width",2).attr("class","nv-legend-symbol").attr("r",5),w=y.select("circle");else if("furious"==o){z.append("rect").style("stroke-width",2).attr("class","nv-legend-symbol").attr("rx",3).attr("ry",3),w=y.select(".nv-legend-symbol"),z.append("g").attr("class","nv-check-box").property("innerHTML",'').attr("transform","translate(-10,-8)scale(0.5)");var A=y.select(".nv-check-box");A.each(function(a,b){d3.select(this).selectAll("path").attr("stroke",q(a,b))})}z.append("text").attr("text-anchor","start").attr("class","nv-legend-text").attr("dy",".32em").attr("dx","8");var B=y.select("text.nv-legend-text");y.on("mouseover",function(a,b){n.legendMouseover(a,b)}).on("mouseout",function(a,b){n.legendMouseout(a,b)}).on("click",function(a,b){n.legendClick(a,b);var c=y.data();if(k){if("classic"==o)l?(c.forEach(function(a){a.disabled=!0}),a.disabled=!1):(a.disabled=!a.disabled,c.every(function(a){return a.disabled})&&c.forEach(function(a){a.disabled=!1}));else if("furious"==o)if(m)a.disengaged=!a.disengaged,a.userDisabled=void 0==a.userDisabled?!!a.disabled:a.userDisabled,a.disabled=a.disengaged||a.userDisabled;else if(!m){a.disabled=!a.disabled,a.userDisabled=a.disabled;var d=c.filter(function(a){return!a.disengaged});d.every(function(a){return a.userDisabled})&&c.forEach(function(a){a.disabled=a.userDisabled=!1})}n.stateChange({disabled:c.map(function(a){return!!a.disabled}),disengaged:c.map(function(a){return!!a.disengaged})})}}).on("dblclick",function(a,b){if(("furious"!=o||!m)&&(n.legendDblclick(a,b),k)){var c=y.data();c.forEach(function(a){a.disabled=!0,"furious"==o&&(a.userDisabled=a.disabled)}),a.disabled=!1,"furious"==o&&(a.userDisabled=a.disabled),n.stateChange({disabled:c.map(function(a){return!!a.disabled})})}}),y.classed("nv-disabled",function(a){return a.userDisabled}),y.exit().remove(),B.attr("fill",q).text(f);var C=0;if(h){var D=[];y.each(function(){var b,c=d3.select(this).select("text");try{if(b=c.node().getComputedTextLength(),0>=b)throw Error()}catch(d){b=a.utils.calcApproxTextWidth(c)}D.push(b+i)});var E=0,F=[];for(C=0;g>C&&Eg&&E>1;){F=[],E--;for(var G=0;G(F[G%E]||0)&&(F[G%E]=D[G]);C=F.reduce(function(a,b){return a+b})}for(var H=[],I=0,J=0;E>I;I++)H[I]=J,J+=F[I];y.attr("transform",function(a,b){return"translate("+H[b%E]+","+(5+Math.floor(b/E)*x)+")"}),j?v.attr("transform","translate("+(d-c.right-C)+","+c.top+")"):v.attr("transform","translate(0,"+c.top+")"),e=c.top+c.bottom+Math.ceil(D.length/E)*x}else{var K,L=5,M=5,N=0;y.attr("transform",function(){var a=d3.select(this).select("text").node().getComputedTextLength()+i;return K=M,dN&&(N=M),K+N>C&&(C=K+N),"translate("+K+","+L+")"}),v.attr("transform","translate("+(d-c.right-N)+","+c.top+")"),e=c.top+c.bottom+L+15}if("furious"==o){w.attr("width",function(a,b){return B[0][b].getComputedTextLength()+27}).attr("height",18).attr("y",-9).attr("x",-15),u.insert("rect",":first-child").attr("class","nv-legend-bg").attr("fill","#eee").attr("opacity",0);var O=v.select(".nv-legend-bg");O.transition().duration(300).attr("x",-x).attr("width",C+x-12).attr("height",e+10).attr("y",-c.top-10).attr("opacity",m?1:0)}w.style("fill",r).style("fill-opacity",s).style("stroke",r)}),b}var c={top:5,right:0,bottom:5,left:0},d=400,e=20,f=function(a){return a.key},g=a.utils.getColor(),h=!0,i=32,j=!0,k=!0,l=!1,m=!1,n=d3.dispatch("legendClick","legendDblclick","legendMouseover","legendMouseout","stateChange"),o="classic";return b.dispatch=n,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},key:{get:function(){return f},set:function(a){f=a}},align:{get:function(){return h},set:function(a){h=a}},rightAlign:{get:function(){return j},set:function(a){j=a}},padding:{get:function(){return i},set:function(a){i=a}},updateState:{get:function(){return k},set:function(a){k=a}},radioButtonMode:{get:function(){return l},set:function(a){l=a}},expanded:{get:function(){return m},set:function(a){m=a}},vers:{get:function(){return o},set:function(a){o=a}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return g},set:function(b){g=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.line=function(){"use strict";function b(r){return v.reset(),v.models(e),r.each(function(b){i=d3.select(this);var r=a.utils.availableWidth(g,i,f),s=a.utils.availableHeight(h,i,f);a.utils.initSVG(i),c=e.xScale(),d=e.yScale(),t=t||c,u=u||d;var w=i.selectAll("g.nv-wrap.nv-line").data([b]),x=w.enter().append("g").attr("class","nvd3 nv-wrap nv-line"),y=x.append("defs"),z=x.append("g"),A=w.select("g");z.append("g").attr("class","nv-groups"),z.append("g").attr("class","nv-scatterWrap"),w.attr("transform","translate("+f.left+","+f.top+")"),e.width(r).height(s);var B=w.select(".nv-scatterWrap");B.call(e),y.append("clipPath").attr("id","nv-edge-clip-"+e.id()).append("rect"),w.select("#nv-edge-clip-"+e.id()+" rect").attr("width",r).attr("height",s>0?s:0),A.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":""),B.attr("clip-path",p?"url(#nv-edge-clip-"+e.id()+")":"");var C=w.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});C.enter().append("g").style("stroke-opacity",1e-6).style("stroke-width",function(a){return a.strokeWidth||j}).style("fill-opacity",1e-6),C.exit().remove(),C.attr("class",function(a,b){return(a.classed||"")+" nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return k(a,b)}).style("stroke",function(a,b){return k(a,b)}),C.watchTransition(v,"line: groups").style("stroke-opacity",1).style("fill-opacity",function(a){return a.fillOpacity||.5});var D=C.selectAll("path.nv-area").data(function(a){return o(a)?[a]:[]});D.enter().append("path").attr("class","nv-area").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y0(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))}).y1(function(){return u(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])}),C.exit().selectAll("path.nv-area").remove(),D.watchTransition(v,"line: areaPaths").attr("d",function(b){return d3.svg.area().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y0(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))}).y1(function(){return d(d.domain()[0]<=0?d.domain()[1]>=0?0:d.domain()[1]:d.domain()[0])}).apply(this,[b.values])});var E=C.selectAll("path.nv-line").data(function(a){return[a.values]});E.enter().append("path").attr("class","nv-line").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,c){return a.utils.NaNtoZero(t(l(b,c)))}).y(function(b,c){return a.utils.NaNtoZero(u(m(b,c)))})),E.watchTransition(v,"line: linePaths").attr("d",d3.svg.line().interpolate(q).defined(n).x(function(b,d){return a.utils.NaNtoZero(c(l(b,d)))}).y(function(b,c){return a.utils.NaNtoZero(d(m(b,c)))})),t=c.copy(),u=d.copy()}),v.renderEnd("line immediate"),b}var c,d,e=a.models.scatter(),f={top:0,right:0,bottom:0,left:0},g=960,h=500,i=null,j=1.5,k=a.utils.defaultColor(),l=function(a){return a.x},m=function(a){return a.y},n=function(a,b){return!isNaN(m(a,b))&&null!==m(a,b)},o=function(a){return a.area},p=!1,q="linear",r=250,s=d3.dispatch("elementClick","elementMouseover","elementMouseout","renderEnd");e.pointSize(16).pointDomain([16,256]);var t,u,v=a.utils.renderWatch(s,r);return b.dispatch=s,b.scatter=e,e.dispatch.on("elementClick",function(){s.elementClick.apply(this,arguments)}),e.dispatch.on("elementMouseover",function(){s.elementMouseover.apply(this,arguments)}),e.dispatch.on("elementMouseout",function(){s.elementMouseout.apply(this,arguments)}),b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},defined:{get:function(){return n},set:function(a){n=a}},interpolate:{get:function(){return q},set:function(a){q=a}},clipEdge:{get:function(){return p},set:function(a){p=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}},duration:{get:function(){return r},set:function(a){r=a,v.reset(r),e.duration(r)}},isArea:{get:function(){return o},set:function(a){o=d3.functor(a)}},x:{get:function(){return l},set:function(a){l=a,e.x(a)}},y:{get:function(){return m},set:function(a){m=a,e.y(a)}},color:{get:function(){return k},set:function(b){k=a.utils.getColor(b),e.color(k)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.lineChart=function(){"use strict";function b(j){return y.reset(),y.models(e),p&&y.models(f),q&&y.models(g),j.each(function(j){var v=d3.select(this),y=this;a.utils.initSVG(v);var B=a.utils.availableWidth(m,v,k),C=a.utils.availableHeight(n,v,k);if(b.update=function(){0===x?v.call(b):v.transition().duration(x).call(b)},b.container=this,t.setter(A(j),b.update).getter(z(j)).update(),t.disabled=j.map(function(a){return!!a.disabled}),!u){var D;u={};for(D in t)u[D]=t[D]instanceof Array?t[D].slice(0):t[D] +}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,v),b;v.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var E=v.selectAll("g.nv-wrap.nv-lineChart").data([j]),F=E.enter().append("g").attr("class","nvd3 nv-wrap nv-lineChart").append("g"),G=E.select("g");F.append("rect").style("opacity",0),F.append("g").attr("class","nv-x nv-axis"),F.append("g").attr("class","nv-y nv-axis"),F.append("g").attr("class","nv-linesWrap"),F.append("g").attr("class","nv-legendWrap"),F.append("g").attr("class","nv-interactive"),G.select("rect").attr("width",B).attr("height",C>0?C:0),o&&(h.width(B),G.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),C=a.utils.availableHeight(n,v,k)),E.select(".nv-legendWrap").attr("transform","translate(0,"+-k.top+")")),E.attr("transform","translate("+k.left+","+k.top+")"),r&&G.select(".nv-y.nv-axis").attr("transform","translate("+B+",0)"),s&&(i.width(B).height(C).margin({left:k.left,top:k.top}).svgContainer(v).xScale(c),E.select(".nv-interactive").call(i)),e.width(B).height(C).color(j.map(function(a,b){return a.color||l(a,b)}).filter(function(a,b){return!j[b].disabled}));var H=G.select(".nv-linesWrap").datum(j.filter(function(a){return!a.disabled}));H.call(e),p&&(f.scale(c)._ticks(a.utils.calcTicksX(B/100,j)).tickSize(-C,0),G.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),G.select(".nv-x.nv-axis").call(f)),q&&(g.scale(d)._ticks(a.utils.calcTicksY(C/36,j)).tickSize(-B,0),G.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)t[c]=a[c];w.stateChange(t),b.update()}),i.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,h,m,n=[];if(j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,g){h=a.interactiveBisect(f.values,c.pointXValue,b.x());var i=f.values[h],j=b.y()(i,h);null!=j&&e.highlightPoint(g,h,!0),void 0!==i&&(void 0===d&&(d=i),void 0===m&&(m=b.xScale()(b.x()(i,h))),n.push({key:f.key,value:j,color:l(f,f.seriesIndex)}))}),n.length>2){var o=b.yScale().invert(c.mouseY),p=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),q=.03*p,r=a.nearestValueIndex(n.map(function(a){return a.value}),o,q);null!==r&&(n[r].highlight=!0)}var s=f.tickFormat()(b.x()(d,h));i.tooltip.position({left:c.mouseX+k.left,top:c.mouseY+k.top}).chartContainer(y.parentNode).valueFormatter(function(a){return null==a?"N/A":g.tickFormat()(a)}).data({value:s,index:h,series:n})(),i.renderGuideLine(m)}),i.dispatch.on("elementClick",function(c){var d,f=[];j.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(e){var g=a.interactiveBisect(e.values,c.pointXValue,b.x()),h=e.values[g];if("undefined"!=typeof h){"undefined"==typeof d&&(d=b.xScale()(b.x()(h,g)));var i=b.yScale()(b.y()(h,g));f.push({point:h,pointIndex:g,pos:[d,i],seriesIndex:e.seriesIndex,series:e})}}),e.dispatch.elementClick(f)}),i.dispatch.on("elementMouseout",function(){e.clearHighlights()}),w.on("changeState",function(a){"undefined"!=typeof a.disabled&&j.length===a.disabled.length&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),t.disabled=a.disabled),b.update()})}),y.renderEnd("lineChart immediate"),b}var c,d,e=a.models.line(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.interactiveGuideline(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=a.utils.defaultColor(),m=null,n=null,o=!0,p=!0,q=!0,r=!1,s=!1,t=a.utils.state(),u=null,v=null,w=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),x=250;f.orient("bottom").tickPadding(7),g.orient(r?"right":"left"),j.valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)});var y=a.utils.renderWatch(w,x),z=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},A=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){j.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),b.dispatch=w,b.lines=e,b.legend=h,b.xAxis=f,b.yAxis=g,b.interactiveLayer=i,b.tooltip=j,b.dispatch=w,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return o},set:function(a){o=a}},showXAxis:{get:function(){return p},set:function(a){p=a}},showYAxis:{get:function(){return q},set:function(a){q=a}},defaultState:{get:function(){return u},set:function(a){u=a}},noData:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return x},set:function(a){x=a,y.reset(x),e.duration(x),f.duration(x),g.duration(x)}},color:{get:function(){return l},set:function(b){l=a.utils.getColor(b),h.color(l),e.color(l)}},rightAlignYAxis:{get:function(){return r},set:function(a){r=a,g.orient(r?"right":"left")}},useInteractiveGuideline:{get:function(){return s},set:function(a){s=a,s&&(e.interactive(!1),e.useVoronoi(!1))}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.linePlusBarChart=function(){"use strict";function b(v){return v.each(function(v){function J(a){var b=+("e"==a),c=b?1:-1,d=X/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function S(){u.empty()||u.extent(I),kb.data([u.empty()?e.domain():I]).each(function(a){var b=e(a[0])-e.range()[0],c=e.range()[1]-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>c?0:c)})}function T(){I=u.empty()?null:u.extent(),c=u.empty()?e.domain():u.extent(),K.brush({extent:c,brush:u}),S(),l.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),j.width(V).height(W).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var b=db.select(".nv-focus .nv-barsWrap").datum(Z.length?Z.map(function(a){return{key:a.key,values:a.values.filter(function(a,b){return l.x()(a,b)>=c[0]&&l.x()(a,b)<=c[1]})}}):[{values:[]}]),h=db.select(".nv-focus .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$.map(function(a){return{area:a.area,fillOpacity:a.fillOpacity,key:a.key,values:a.values.filter(function(a,b){return j.x()(a,b)>=c[0]&&j.x()(a,b)<=c[1]})}}));d=Z.length?l.xScale():j.xScale(),n.scale(d)._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-W,0),n.domain([Math.ceil(c[0]),Math.floor(c[1])]),db.select(".nv-x.nv-axis").transition().duration(L).call(n),b.transition().duration(L).call(l),h.transition().duration(L).call(j),db.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),p.scale(f)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(-V,0),q.scale(g)._ticks(a.utils.calcTicksY(W/36,v)).tickSize(Z.length?0:-V,0),db.select(".nv-focus .nv-y1.nv-axis").style("opacity",Z.length?1:0),db.select(".nv-focus .nv-y2.nv-axis").style("opacity",$.length&&!$[0].disabled?1:0).attr("transform","translate("+d.range()[1]+",0)"),db.select(".nv-focus .nv-y1.nv-axis").transition().duration(L).call(p),db.select(".nv-focus .nv-y2.nv-axis").transition().duration(L).call(q)}var U=d3.select(this);a.utils.initSVG(U);var V=a.utils.availableWidth(y,U,w),W=a.utils.availableHeight(z,U,w)-(E?H:0),X=H-x.top-x.bottom;if(b.update=function(){U.transition().duration(L).call(b)},b.container=this,M.setter(R(v),b.update).getter(Q(v)).update(),M.disabled=v.map(function(a){return!!a.disabled}),!N){var Y;N={};for(Y in M)N[Y]=M[Y]instanceof Array?M[Y].slice(0):M[Y]}if(!(v&&v.length&&v.filter(function(a){return a.values.length}).length))return a.utils.noData(b,U),b;U.selectAll(".nv-noData").remove();var Z=v.filter(function(a){return!a.disabled&&a.bar}),$=v.filter(function(a){return!a.bar});d=l.xScale(),e=o.scale(),f=l.yScale(),g=j.yScale(),h=m.yScale(),i=k.yScale();var _=v.filter(function(a){return!a.disabled&&a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})}),ab=v.filter(function(a){return!a.disabled&&!a.bar}).map(function(a){return a.values.map(function(a,b){return{x:A(a,b),y:B(a,b)}})});d.range([0,V]),e.domain(d3.extent(d3.merge(_.concat(ab)),function(a){return a.x})).range([0,V]);var bb=U.selectAll("g.nv-wrap.nv-linePlusBar").data([v]),cb=bb.enter().append("g").attr("class","nvd3 nv-wrap nv-linePlusBar").append("g"),db=bb.select("g");cb.append("g").attr("class","nv-legendWrap");var eb=cb.append("g").attr("class","nv-focus");eb.append("g").attr("class","nv-x nv-axis"),eb.append("g").attr("class","nv-y1 nv-axis"),eb.append("g").attr("class","nv-y2 nv-axis"),eb.append("g").attr("class","nv-barsWrap"),eb.append("g").attr("class","nv-linesWrap");var fb=cb.append("g").attr("class","nv-context");if(fb.append("g").attr("class","nv-x nv-axis"),fb.append("g").attr("class","nv-y1 nv-axis"),fb.append("g").attr("class","nv-y2 nv-axis"),fb.append("g").attr("class","nv-barsWrap"),fb.append("g").attr("class","nv-linesWrap"),fb.append("g").attr("class","nv-brushBackground"),fb.append("g").attr("class","nv-x nv-brush"),D){var gb=t.align()?V/2:V,hb=t.align()?gb:0;t.width(gb),db.select(".nv-legendWrap").datum(v.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(a.bar?O:P),a})).call(t),w.top!=t.height()&&(w.top=t.height(),W=a.utils.availableHeight(z,U,w)-H),db.select(".nv-legendWrap").attr("transform","translate("+hb+","+-w.top+")")}bb.attr("transform","translate("+w.left+","+w.top+")"),db.select(".nv-context").style("display",E?"initial":"none"),m.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&v[b].bar})),k.width(V).height(X).color(v.map(function(a,b){return a.color||C(a,b)}).filter(function(a,b){return!v[b].disabled&&!v[b].bar}));var ib=db.select(".nv-context .nv-barsWrap").datum(Z.length?Z:[{values:[]}]),jb=db.select(".nv-context .nv-linesWrap").datum($[0].disabled?[{values:[]}]:$);db.select(".nv-context").attr("transform","translate(0,"+(W+w.bottom+x.top)+")"),ib.transition().call(m),jb.transition().call(k),G&&(o._ticks(a.utils.calcTicksX(V/100,v)).tickSize(-X,0),db.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+h.range()[0]+")"),db.select(".nv-context .nv-x.nv-axis").transition().call(o)),F&&(r.scale(h)._ticks(X/36).tickSize(-V,0),s.scale(i)._ticks(X/36).tickSize(Z.length?0:-V,0),db.select(".nv-context .nv-y3.nv-axis").style("opacity",Z.length?1:0).attr("transform","translate(0,"+e.range()[0]+")"),db.select(".nv-context .nv-y2.nv-axis").style("opacity",$.length?1:0).attr("transform","translate("+e.range()[1]+",0)"),db.select(".nv-context .nv-y1.nv-axis").transition().call(r),db.select(".nv-context .nv-y2.nv-axis").transition().call(s)),u.x(e).on("brush",T),I&&u.extent(I);var kb=db.select(".nv-brushBackground").selectAll("g").data([I||u.extent()]),lb=kb.enter().append("g");lb.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",X),lb.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",X);var mb=db.select(".nv-x.nv-brush").call(u);mb.selectAll("rect").attr("height",X),mb.selectAll(".resize").append("path").attr("d",J),t.dispatch.on("stateChange",function(a){for(var c in a)M[c]=a[c];K.stateChange(M),b.update()}),K.on("changeState",function(a){"undefined"!=typeof a.disabled&&(v.forEach(function(b,c){b.disabled=a.disabled[c]}),M.disabled=a.disabled),b.update()}),T()}),b}var c,d,e,f,g,h,i,j=a.models.line(),k=a.models.line(),l=a.models.historicalBar(),m=a.models.historicalBar(),n=a.models.axis(),o=a.models.axis(),p=a.models.axis(),q=a.models.axis(),r=a.models.axis(),s=a.models.axis(),t=a.models.legend(),u=d3.svg.brush(),v=a.models.tooltip(),w={top:30,right:30,bottom:30,left:60},x={top:0,right:30,bottom:20,left:60},y=null,z=null,A=function(a){return a.x},B=function(a){return a.y},C=a.utils.defaultColor(),D=!0,E=!0,F=!1,G=!0,H=50,I=null,J=null,K=d3.dispatch("brush","stateChange","changeState"),L=0,M=a.utils.state(),N=null,O=" (left axis)",P=" (right axis)";j.clipEdge(!0),k.interactive(!1),n.orient("bottom").tickPadding(5),p.orient("left"),q.orient("right"),o.orient("bottom").tickPadding(5),r.orient("left"),s.orient("right"),v.headerEnabled(!0).headerFormatter(function(a,b){return n.tickFormat()(a,b)});var Q=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},R=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return j.dispatch.on("elementMouseover.tooltip",function(a){v.duration(100).valueFormatter(function(a,b){return q.tickFormat()(a,b)}).data(a).position(a.pos).hidden(!1)}),j.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={value:b.y()(a.data),color:a.color},v.duration(0).valueFormatter(function(a,b){return p.tickFormat()(a,b)}).data(a).hidden(!1)}),l.dispatch.on("elementMouseout.tooltip",function(){v.hidden(!0)}),l.dispatch.on("elementMousemove.tooltip",function(){v.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=K,b.legend=t,b.lines=j,b.lines2=k,b.bars=l,b.bars2=m,b.xAxis=n,b.x2Axis=o,b.y1Axis=p,b.y2Axis=q,b.y3Axis=r,b.y4Axis=s,b.tooltip=v,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return y},set:function(a){y=a}},height:{get:function(){return z},set:function(a){z=a}},showLegend:{get:function(){return D},set:function(a){D=a}},brushExtent:{get:function(){return I},set:function(a){I=a}},noData:{get:function(){return J},set:function(a){J=a}},focusEnable:{get:function(){return E},set:function(a){E=a}},focusHeight:{get:function(){return H},set:function(a){H=a}},focusShowAxisX:{get:function(){return G},set:function(a){G=a}},focusShowAxisY:{get:function(){return F},set:function(a){F=a}},legendLeftAxisHint:{get:function(){return O},set:function(a){O=a}},legendRightAxisHint:{get:function(){return P},set:function(a){P=a}},tooltips:{get:function(){return v.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),v.enabled(!!b)}},tooltipContent:{get:function(){return v.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),v.contentGenerator(b)}},margin:{get:function(){return w},set:function(a){w.top=void 0!==a.top?a.top:w.top,w.right=void 0!==a.right?a.right:w.right,w.bottom=void 0!==a.bottom?a.bottom:w.bottom,w.left=void 0!==a.left?a.left:w.left}},duration:{get:function(){return L},set:function(a){L=a}},color:{get:function(){return C},set:function(b){C=a.utils.getColor(b),t.color(C)}},x:{get:function(){return A},set:function(a){A=a,j.x(a),k.x(a),l.x(a),m.x(a)}},y:{get:function(){return B},set:function(a){B=a,j.y(a),k.y(a),l.y(a),m.y(a)}}}),a.utils.inheritOptions(b,j),a.utils.initOptions(b),b},a.models.lineWithFocusChart=function(){"use strict";function b(o){return o.each(function(o){function z(a){var b=+("e"==a),c=b?1:-1,d=M/3;return"M"+.5*c+","+d+"A6,6 0 0 "+b+" "+6.5*c+","+(d+6)+"V"+(2*d-6)+"A6,6 0 0 "+b+" "+.5*c+","+2*d+"ZM"+2.5*c+","+(d+8)+"V"+(2*d-8)+"M"+4.5*c+","+(d+8)+"V"+(2*d-8)}function G(){n.empty()||n.extent(y),U.data([n.empty()?e.domain():y]).each(function(a){var b=e(a[0])-c.range()[0],d=K-e(a[1]);d3.select(this).select(".left").attr("width",0>b?0:b),d3.select(this).select(".right").attr("x",e(a[1])).attr("width",0>d?0:d)})}function H(){y=n.empty()?null:n.extent();var a=n.empty()?e.domain():n.extent();if(!(Math.abs(a[0]-a[1])<=1)){A.brush({extent:a,brush:n}),G();var b=Q.select(".nv-focus .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}).map(function(b){return{key:b.key,area:b.area,values:b.values.filter(function(b,c){return g.x()(b,c)>=a[0]&&g.x()(b,c)<=a[1]})}}));b.transition().duration(B).call(g),Q.select(".nv-focus .nv-x.nv-axis").transition().duration(B).call(i),Q.select(".nv-focus .nv-y.nv-axis").transition().duration(B).call(j)}}var I=d3.select(this),J=this;a.utils.initSVG(I);var K=a.utils.availableWidth(t,I,q),L=a.utils.availableHeight(u,I,q)-v,M=v-r.top-r.bottom;if(b.update=function(){I.transition().duration(B).call(b)},b.container=this,C.setter(F(o),b.update).getter(E(o)).update(),C.disabled=o.map(function(a){return!!a.disabled}),!D){var N;D={};for(N in C)D[N]=C[N]instanceof Array?C[N].slice(0):C[N]}if(!(o&&o.length&&o.filter(function(a){return a.values.length}).length))return a.utils.noData(b,I),b;I.selectAll(".nv-noData").remove(),c=g.xScale(),d=g.yScale(),e=h.xScale(),f=h.yScale();var O=I.selectAll("g.nv-wrap.nv-lineWithFocusChart").data([o]),P=O.enter().append("g").attr("class","nvd3 nv-wrap nv-lineWithFocusChart").append("g"),Q=O.select("g");P.append("g").attr("class","nv-legendWrap");var R=P.append("g").attr("class","nv-focus");R.append("g").attr("class","nv-x nv-axis"),R.append("g").attr("class","nv-y nv-axis"),R.append("g").attr("class","nv-linesWrap"),R.append("g").attr("class","nv-interactive");var S=P.append("g").attr("class","nv-context");S.append("g").attr("class","nv-x nv-axis"),S.append("g").attr("class","nv-y nv-axis"),S.append("g").attr("class","nv-linesWrap"),S.append("g").attr("class","nv-brushBackground"),S.append("g").attr("class","nv-x nv-brush"),x&&(m.width(K),Q.select(".nv-legendWrap").datum(o).call(m),q.top!=m.height()&&(q.top=m.height(),L=a.utils.availableHeight(u,I,q)-v),Q.select(".nv-legendWrap").attr("transform","translate(0,"+-q.top+")")),O.attr("transform","translate("+q.left+","+q.top+")"),w&&(p.width(K).height(L).margin({left:q.left,top:q.top}).svgContainer(I).xScale(c),O.select(".nv-interactive").call(p)),g.width(K).height(L).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),h.defined(g.defined()).width(K).height(M).color(o.map(function(a,b){return a.color||s(a,b)}).filter(function(a,b){return!o[b].disabled})),Q.select(".nv-context").attr("transform","translate(0,"+(L+q.bottom+r.top)+")");var T=Q.select(".nv-context .nv-linesWrap").datum(o.filter(function(a){return!a.disabled}));d3.transition(T).call(h),i.scale(c)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-L,0),j.scale(d)._ticks(a.utils.calcTicksY(L/36,o)).tickSize(-K,0),Q.select(".nv-focus .nv-x.nv-axis").attr("transform","translate(0,"+L+")"),n.x(e).on("brush",function(){H()}),y&&n.extent(y);var U=Q.select(".nv-brushBackground").selectAll("g").data([y||n.extent()]),V=U.enter().append("g");V.append("rect").attr("class","left").attr("x",0).attr("y",0).attr("height",M),V.append("rect").attr("class","right").attr("x",0).attr("y",0).attr("height",M);var W=Q.select(".nv-x.nv-brush").call(n);W.selectAll("rect").attr("height",M),W.selectAll(".resize").append("path").attr("d",z),H(),k.scale(e)._ticks(a.utils.calcTicksX(K/100,o)).tickSize(-M,0),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),d3.transition(Q.select(".nv-context .nv-x.nv-axis")).call(k),l.scale(f)._ticks(a.utils.calcTicksY(M/36,o)).tickSize(-K,0),d3.transition(Q.select(".nv-context .nv-y.nv-axis")).call(l),Q.select(".nv-context .nv-x.nv-axis").attr("transform","translate(0,"+f.range()[0]+")"),m.dispatch.on("stateChange",function(a){for(var c in a)C[c]=a[c];A.stateChange(C),b.update()}),p.dispatch.on("elementMousemove",function(c){g.clearHighlights();var d,f,h,k=[];if(o.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(i,j){var l=n.empty()?e.domain():n.extent(),m=i.values.filter(function(a,b){return g.x()(a,b)>=l[0]&&g.x()(a,b)<=l[1]});f=a.interactiveBisect(m,c.pointXValue,g.x());var o=m[f],p=b.y()(o,f);null!=p&&g.highlightPoint(j,f,!0),void 0!==o&&(void 0===d&&(d=o),void 0===h&&(h=b.xScale()(b.x()(o,f))),k.push({key:i.key,value:b.y()(o,f),color:s(i,i.seriesIndex)}))}),k.length>2){var l=b.yScale().invert(c.mouseY),m=Math.abs(b.yScale().domain()[0]-b.yScale().domain()[1]),r=.03*m,t=a.nearestValueIndex(k.map(function(a){return a.value}),l,r);null!==t&&(k[t].highlight=!0)}var u=i.tickFormat()(b.x()(d,f));p.tooltip.position({left:c.mouseX+q.left,top:c.mouseY+q.top}).chartContainer(J.parentNode).valueFormatter(function(a){return null==a?"N/A":j.tickFormat()(a)}).data({value:u,index:f,series:k})(),p.renderGuideLine(h)}),p.dispatch.on("elementMouseout",function(){g.clearHighlights()}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&o.forEach(function(b,c){b.disabled=a.disabled[c]}),b.update()})}),b}var c,d,e,f,g=a.models.line(),h=a.models.line(),i=a.models.axis(),j=a.models.axis(),k=a.models.axis(),l=a.models.axis(),m=a.models.legend(),n=d3.svg.brush(),o=a.models.tooltip(),p=a.interactiveGuideline(),q={top:30,right:30,bottom:30,left:60},r={top:0,right:30,bottom:20,left:60},s=a.utils.defaultColor(),t=null,u=null,v=50,w=!1,x=!0,y=null,z=null,A=d3.dispatch("brush","stateChange","changeState"),B=250,C=a.utils.state(),D=null;g.clipEdge(!0).duration(0),h.interactive(!1),i.orient("bottom").tickPadding(5),j.orient("left"),k.orient("bottom").tickPadding(5),l.orient("left"),o.valueFormatter(function(a,b){return j.tickFormat()(a,b)}).headerFormatter(function(a,b){return i.tickFormat()(a,b)});var E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return g.dispatch.on("elementMouseover.tooltip",function(a){o.data(a).position(a.pos).hidden(!1)}),g.dispatch.on("elementMouseout.tooltip",function(){o.hidden(!0)}),b.dispatch=A,b.legend=m,b.lines=g,b.lines2=h,b.xAxis=i,b.yAxis=j,b.x2Axis=k,b.y2Axis=l,b.interactiveLayer=p,b.tooltip=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return t},set:function(a){t=a}},height:{get:function(){return u},set:function(a){u=a}},focusHeight:{get:function(){return v},set:function(a){v=a}},showLegend:{get:function(){return x},set:function(a){x=a}},brushExtent:{get:function(){return y},set:function(a){y=a}},defaultState:{get:function(){return D},set:function(a){D=a}},noData:{get:function(){return z},set:function(a){z=a}},tooltips:{get:function(){return o.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),o.enabled(!!b)}},tooltipContent:{get:function(){return o.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),o.contentGenerator(b)}},margin:{get:function(){return q},set:function(a){q.top=void 0!==a.top?a.top:q.top,q.right=void 0!==a.right?a.right:q.right,q.bottom=void 0!==a.bottom?a.bottom:q.bottom,q.left=void 0!==a.left?a.left:q.left}},color:{get:function(){return s},set:function(b){s=a.utils.getColor(b),m.color(s)}},interpolate:{get:function(){return g.interpolate()},set:function(a){g.interpolate(a),h.interpolate(a)}},xTickFormat:{get:function(){return i.tickFormat()},set:function(a){i.tickFormat(a),k.tickFormat(a)}},yTickFormat:{get:function(){return j.tickFormat()},set:function(a){j.tickFormat(a),l.tickFormat(a)}},duration:{get:function(){return B},set:function(a){B=a,j.duration(B),l.duration(B),i.duration(B),k.duration(B)}},x:{get:function(){return g.x()},set:function(a){g.x(a),h.x(a)}},y:{get:function(){return g.y()},set:function(a){g.y(a),h.y(a)}},useInteractiveGuideline:{get:function(){return w},set:function(a){w=a,w&&(g.interactive(!1),g.useVoronoi(!1))}}}),a.utils.inheritOptions(b,g),a.utils.initOptions(b),b},a.models.multiBar=function(){"use strict";function b(E){return C.reset(),E.each(function(b){var E=k-j.left-j.right,F=l-j.top-j.bottom;p=d3.select(this),a.utils.initSVG(p);var G=0;if(x&&b.length&&(x=[{values:b[0].values.map(function(a){return{x:a.x,y:0,series:a.series,size:.01}})}]),u){var H=d3.layout.stack().offset(v).values(function(a){return a.values}).y(r)(!b.length&&x?x:b);H.forEach(function(a,c){a.nonStackable?(b[c].nonStackableSeries=G++,H[c]=b[c]):c>0&&H[c-1].nonStackable&&H[c].values.map(function(a,b){a.y0-=H[c-1].values[b].y,a.y1=a.y0+a.y})}),b=H}b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),u&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a,f){if(!b[f].nonStackable){var g=a.values[c];g.size=Math.abs(g.y),g.y<0?(g.y1=e,e-=g.size):(g.y1=g.size+d,d+=g.size)}})});var I=d&&e?[]:b.map(function(a,b){return a.values.map(function(a,c){return{x:q(a,c),y:r(a,c),y0:a.y0,y1:a.y1,idx:b}})});m.domain(d||d3.merge(I).map(function(a){return a.x})).rangeBands(f||[0,E],A),n.domain(e||d3.extent(d3.merge(I).map(function(a){var c=a.y;return u&&!b[a.idx].nonStackable&&(c=a.y>0?a.y1:a.y1+a.y),c}).concat(s))).range(g||[F,0]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]+.01*n.domain()[0],n.domain()[1]-.01*n.domain()[1]]:[-1,1]),h=h||m,i=i||n;var J=p.selectAll("g.nv-wrap.nv-multibar").data([b]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multibar"),L=K.append("defs"),M=K.append("g"),N=J.select("g");M.append("g").attr("class","nv-groups"),J.attr("transform","translate("+j.left+","+j.top+")"),L.append("clipPath").attr("id","nv-edge-clip-"+o).append("rect"),J.select("#nv-edge-clip-"+o+" rect").attr("width",E).attr("height",F),N.attr("clip-path",t?"url(#nv-edge-clip-"+o+")":"");var O=J.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});O.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6);var P=C.transition(O.exit().selectAll("rect.nv-bar"),"multibarExit",Math.min(100,z)).attr("y",function(a){var c=i(0)||0;return u&&b[a.series]&&!b[a.series].nonStackable&&(c=i(a.y0)),c}).attr("height",0).remove();P.delay&&P.delay(function(a,b){var c=b*(z/(D+1))-b;return c}),O.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return w(a,b)}).style("stroke",function(a,b){return w(a,b)}),O.style("stroke-opacity",1).style("fill-opacity",.75);var Q=O.selectAll("rect.nv-bar").data(function(a){return x&&!b.length?x.values:a.values});Q.exit().remove();Q.enter().append("rect").attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("x",function(a,c,d){return u&&!b[d].nonStackable?0:d*m.rangeBand()/b.length}).attr("y",function(a,c,d){return i(u&&!b[d].nonStackable?a.y0:0)||0}).attr("height",0).attr("width",function(a,c,d){return m.rangeBand()/(u&&!b[d].nonStackable?1:b.length)}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"});Q.style("fill",function(a,b,c){return w(a,c,b)}).style("stroke",function(a,b,c){return w(a,c,b)}).on("mouseover",function(a,b){d3.select(this).classed("hover",!0),B.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),B.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){B.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){B.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){B.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),Q.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}).attr("transform",function(a,b){return"translate("+m(q(a,b))+",0)"}),y&&(c||(c=b.map(function(){return!0})),Q.style("fill",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(y(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}));var R=Q.watchTransition(C,"multibar",Math.min(250,z)).delay(function(a,c){return c*z/b[0].values.length});u?R.attr("y",function(a,c,d){var e=0;return e=b[d].nonStackable?r(a,c)<0?n(0):n(0)-n(r(a,c))<-1?n(0)-1:n(r(a,c))||0:n(a.y1)}).attr("height",function(a,c,d){return b[d].nonStackable?Math.max(Math.abs(n(r(a,c))-n(0)),1)||0:Math.max(Math.abs(n(a.y+a.y0)-n(a.y0)),1)}).attr("x",function(a,c,d){var e=0;return b[d].nonStackable&&(e=a.series*m.rangeBand()/b.length,b.length!==G&&(e=b[d].nonStackableSeries*m.rangeBand()/(2*G))),e}).attr("width",function(a,c,d){if(b[d].nonStackable){var e=m.rangeBand()/G;return b.length!==G&&(e=m.rangeBand()/(2*G)),e}return m.rangeBand()}):R.attr("x",function(a){return a.series*m.rangeBand()/b.length}).attr("width",m.rangeBand()/b.length).attr("y",function(a,b){return r(a,b)<0?n(0):n(0)-n(r(a,b))<1?n(0)-1:n(r(a,b))||0}).attr("height",function(a,b){return Math.max(Math.abs(n(r(a,b))-n(0)),1)||0}),h=m.copy(),i=n.copy(),b[0]&&b[0].values&&(D=b[0].values.length)}),C.renderEnd("multibar immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=d3.scale.ordinal(),n=d3.scale.linear(),o=Math.floor(1e4*Math.random()),p=null,q=function(a){return a.x},r=function(a){return a.y},s=[0],t=!0,u=!1,v="zero",w=a.utils.defaultColor(),x=!1,y=null,z=500,A=.1,B=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),C=a.utils.renderWatch(B,z),D=0;return b.dispatch=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return s},set:function(a){s=a}},stacked:{get:function(){return u},set:function(a){u=a}},stackOffset:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return t},set:function(a){t=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return o},set:function(a){o=a}},hideable:{get:function(){return x},set:function(a){x=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z)}},color:{get:function(){return w},set:function(b){w=a.utils.getColor(b)}},barColor:{get:function(){return y},set:function(b){y=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarChart=function(){"use strict";function b(j){return D.reset(),D.models(e),r&&D.models(f),s&&D.models(g),j.each(function(j){var z=d3.select(this);a.utils.initSVG(z);var D=a.utils.availableWidth(l,z,k),H=a.utils.availableHeight(m,z,k);if(b.update=function(){0===C?z.call(b):z.transition().duration(C).call(b)},b.container=this,x.setter(G(j),b.update).getter(F(j)).update(),x.disabled=j.map(function(a){return!!a.disabled}),!y){var I;y={};for(I in x)y[I]=x[I]instanceof Array?x[I].slice(0):x[I]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,z),b;z.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale(); +var J=z.selectAll("g.nv-wrap.nv-multiBarWithLegend").data([j]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarWithLegend").append("g"),L=J.select("g");if(K.append("g").attr("class","nv-x nv-axis"),K.append("g").attr("class","nv-y nv-axis"),K.append("g").attr("class","nv-barsWrap"),K.append("g").attr("class","nv-legendWrap"),K.append("g").attr("class","nv-controlsWrap"),q&&(h.width(D-B()),L.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),H=a.utils.availableHeight(m,z,k)),L.select(".nv-legendWrap").attr("transform","translate("+B()+","+-k.top+")")),o){var M=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(B()).color(["#444","#444","#444"]),L.select(".nv-controlsWrap").datum(M).attr("transform","translate(0,"+-k.top+")").call(i)}J.attr("transform","translate("+k.left+","+k.top+")"),t&&L.select(".nv-y.nv-axis").attr("transform","translate("+D+",0)"),e.disabled(j.map(function(a){return a.disabled})).width(D).height(H).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var N=L.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(N.call(e),r){f.scale(c)._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-H,0),L.select(".nv-x.nv-axis").attr("transform","translate(0,"+d.range()[0]+")"),L.select(".nv-x.nv-axis").call(f);var O=L.select(".nv-x.nv-axis > g").selectAll("g");if(O.selectAll("line, text").style("opacity",1),v){var P=function(a,b){return"translate("+a+","+b+")"},Q=5,R=17;O.selectAll("text").attr("transform",function(a,b,c){return P(0,c%2==0?Q:R)});var S=d3.selectAll(".nv-x.nv-axis .nv-wrap g g text")[0].length;L.selectAll(".nv-x.nv-axis .nv-axisMaxMin text").attr("transform",function(a,b){return P(0,0===b||S%2!==0?R:Q)})}u&&O.filter(function(a,b){return b%Math.ceil(j[0].values.length/(D/100))!==0}).selectAll("text, line").style("opacity",0),w&&O.selectAll(".tick text").attr("transform","rotate("+w+" 0,0)").style("text-anchor",w>0?"start":"end"),L.select(".nv-x.nv-axis").selectAll("g.nv-axisMaxMin text").style("opacity",1)}s&&(g.scale(d)._ticks(a.utils.calcTicksY(H/36,j)).tickSize(-D,0),L.select(".nv-y.nv-axis").call(g)),h.dispatch.on("stateChange",function(a){for(var c in a)x[c]=a[c];A.stateChange(x),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(M=M.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":case p.grouped:e.stacked(!1);break;case"Stacked":case p.stacked:e.stacked(!0)}x.stacked=e.stacked(),A.stateChange(x),b.update()}}),A.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),x.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),x.stacked=a.stacked,E=a.stacked),b.update()})}),D.renderEnd("multibarchart immediate"),b}var c,d,e=a.models.multiBar(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=!0,v=!1,w=0,x=a.utils.state(),y=null,z=null,A=d3.dispatch("stateChange","changeState","renderEnd"),B=function(){return o?180:0},C=250;x.stacked=!1,e.stacked(!1),f.orient("bottom").tickPadding(7).showMaxMin(!1).tickFormat(function(a){return a}),g.orient(t?"right":"left").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var D=a.utils.renderWatch(A),E=!1,F=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:E}}},G=function(a){return function(b){void 0!==b.stacked&&(E=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=A,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=x,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return y},set:function(a){y=a}},noData:{get:function(){return z},set:function(a){z=a}},reduceXTicks:{get:function(){return u},set:function(a){u=a}},rotateLabels:{get:function(){return w},set:function(a){w=a}},staggerLabels:{get:function(){return v},set:function(a){v=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return C},set:function(a){C=a,e.duration(C),f.duration(C),g.duration(C),D.reset(C)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiBarHorizontal=function(){"use strict";function b(m){return E.reset(),m.each(function(b){var m=k-j.left-j.right,C=l-j.top-j.bottom;n=d3.select(this),a.utils.initSVG(n),w&&(b=d3.layout.stack().offset("zero").values(function(a){return a.values}).y(r)(b)),b.forEach(function(a,b){a.values.forEach(function(c){c.series=b,c.key=a.key})}),w&&b[0].values.map(function(a,c){var d=0,e=0;b.map(function(a){var b=a.values[c];b.size=Math.abs(b.y),b.y<0?(b.y1=e-b.size,e-=b.size):(b.y1=d,d+=b.size)})});var F=d&&e?[]:b.map(function(a){return a.values.map(function(a,b){return{x:q(a,b),y:r(a,b),y0:a.y0,y1:a.y1}})});o.domain(d||d3.merge(F).map(function(a){return a.x})).rangeBands(f||[0,C],A),p.domain(e||d3.extent(d3.merge(F).map(function(a){return w?a.y>0?a.y1+a.y:a.y1:a.y}).concat(t))),p.range(x&&!w?g||[p.domain()[0]<0?z:0,m-(p.domain()[1]>0?z:0)]:g||[0,m]),h=h||o,i=i||d3.scale.linear().domain(p.domain()).range([p(0),p(0)]);{var G=d3.select(this).selectAll("g.nv-wrap.nv-multibarHorizontal").data([b]),H=G.enter().append("g").attr("class","nvd3 nv-wrap nv-multibarHorizontal"),I=(H.append("defs"),H.append("g"));G.select("g")}I.append("g").attr("class","nv-groups"),G.attr("transform","translate("+j.left+","+j.top+")");var J=G.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a,b){return b});J.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),J.exit().watchTransition(E,"multibarhorizontal: exit groups").style("stroke-opacity",1e-6).style("fill-opacity",1e-6).remove(),J.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}).style("fill",function(a,b){return u(a,b)}).style("stroke",function(a,b){return u(a,b)}),J.watchTransition(E,"multibarhorizontal: groups").style("stroke-opacity",1).style("fill-opacity",.75);var K=J.selectAll("g.nv-bar").data(function(a){return a.values});K.exit().remove();var L=K.enter().append("g").attr("transform",function(a,c,d){return"translate("+i(w?a.y0:0)+","+(w?0:d*o.rangeBand()/b.length+o(q(a,c)))+")"});L.append("rect").attr("width",0).attr("height",o.rangeBand()/(w?1:b.length)),K.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),D.elementMouseover({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){d3.select(this).classed("hover",!1),D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mouseout",function(a,b){D.elementMouseout({data:a,index:b,color:d3.select(this).style("fill")})}).on("mousemove",function(a,b){D.elementMousemove({data:a,index:b,color:d3.select(this).style("fill")})}).on("click",function(a,b){D.elementClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}).on("dblclick",function(a,b){D.elementDblClick({data:a,index:b,color:d3.select(this).style("fill")}),d3.event.stopPropagation()}),s(b[0],0)&&(L.append("polyline"),K.select("polyline").attr("fill","none").attr("points",function(a,c){var d=s(a,c),e=.8*o.rangeBand()/(2*(w?1:b.length));d=d.length?d:[-Math.abs(d),Math.abs(d)],d=d.map(function(a){return p(a)-p(0)});var f=[[d[0],-e],[d[0],e],[d[0],0],[d[1],0],[d[1],-e],[d[1],e]];return f.map(function(a){return a.join(",")}).join(" ")}).attr("transform",function(a,c){var d=o.rangeBand()/(2*(w?1:b.length));return"translate("+(r(a,c)<0?0:p(r(a,c))-p(0))+", "+d+")"})),L.append("text"),x&&!w?(K.select("text").attr("text-anchor",function(a,b){return r(a,b)<0?"end":"start"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){var c=B(r(a,b)),d=s(a,b);return void 0===d?c:d.length?c+"+"+B(Math.abs(d[1]))+"-"+B(Math.abs(d[0])):c+"±"+B(Math.abs(d))}),K.watchTransition(E,"multibarhorizontal: bars").select("text").attr("x",function(a,b){return r(a,b)<0?-4:p(r(a,b))-p(0)+4})):K.selectAll("text").text(""),y&&!w?(L.append("text").classed("nv-bar-label",!0),K.select("text.nv-bar-label").attr("text-anchor",function(a,b){return r(a,b)<0?"start":"end"}).attr("y",o.rangeBand()/(2*b.length)).attr("dy",".32em").text(function(a,b){return q(a,b)}),K.watchTransition(E,"multibarhorizontal: bars").select("text.nv-bar-label").attr("x",function(a,b){return r(a,b)<0?p(0)-p(r(a,b))+4:-4})):K.selectAll("text.nv-bar-label").text(""),K.attr("class",function(a,b){return r(a,b)<0?"nv-bar negative":"nv-bar positive"}),v&&(c||(c=b.map(function(){return!0})),K.style("fill",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()}).style("stroke",function(a,b,d){return d3.rgb(v(a,b)).darker(c.map(function(a,b){return b}).filter(function(a,b){return!c[b]})[d]).toString()})),w?K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,b){return"translate("+p(a.y1)+","+o(q(a,b))+")"}).select("rect").attr("width",function(a,b){return Math.abs(p(r(a,b)+a.y0)-p(a.y0))}).attr("height",o.rangeBand()):K.watchTransition(E,"multibarhorizontal: bars").attr("transform",function(a,c){return"translate("+p(r(a,c)<0?r(a,c):0)+","+(a.series*o.rangeBand()/b.length+o(q(a,c)))+")"}).select("rect").attr("height",o.rangeBand()/b.length).attr("width",function(a,b){return Math.max(Math.abs(p(r(a,b))-p(0)),1)}),h=o.copy(),i=p.copy()}),E.renderEnd("multibarHorizontal immediate"),b}var c,d,e,f,g,h,i,j={top:0,right:0,bottom:0,left:0},k=960,l=500,m=Math.floor(1e4*Math.random()),n=null,o=d3.scale.ordinal(),p=d3.scale.linear(),q=function(a){return a.x},r=function(a){return a.y},s=function(a){return a.yErr},t=[0],u=a.utils.defaultColor(),v=null,w=!1,x=!1,y=!1,z=60,A=.1,B=d3.format(",.2f"),C=250,D=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),E=a.utils.renderWatch(D,C);return b.dispatch=D,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},x:{get:function(){return q},set:function(a){q=a}},y:{get:function(){return r},set:function(a){r=a}},yErr:{get:function(){return s},set:function(a){s=a}},xScale:{get:function(){return o},set:function(a){o=a}},yScale:{get:function(){return p},set:function(a){p=a}},xDomain:{get:function(){return d},set:function(a){d=a}},yDomain:{get:function(){return e},set:function(a){e=a}},xRange:{get:function(){return f},set:function(a){f=a}},yRange:{get:function(){return g},set:function(a){g=a}},forceY:{get:function(){return t},set:function(a){t=a}},stacked:{get:function(){return w},set:function(a){w=a}},showValues:{get:function(){return x},set:function(a){x=a}},disabled:{get:function(){return c},set:function(a){c=a}},id:{get:function(){return m},set:function(a){m=a}},valueFormat:{get:function(){return B},set:function(a){B=a}},valuePadding:{get:function(){return z},set:function(a){z=a}},groupSpacing:{get:function(){return A},set:function(a){A=a}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},duration:{get:function(){return C},set:function(a){C=a,E.reset(C)}},color:{get:function(){return u},set:function(b){u=a.utils.getColor(b)}},barColor:{get:function(){return v},set:function(b){v=b?a.utils.getColor(b):null}}}),a.utils.initOptions(b),b},a.models.multiBarHorizontalChart=function(){"use strict";function b(j){return C.reset(),C.models(e),r&&C.models(f),s&&C.models(g),j.each(function(j){var w=d3.select(this);a.utils.initSVG(w);var C=a.utils.availableWidth(l,w,k),D=a.utils.availableHeight(m,w,k);if(b.update=function(){w.transition().duration(z).call(b)},b.container=this,t=e.stacked(),u.setter(B(j),b.update).getter(A(j)).update(),u.disabled=j.map(function(a){return!!a.disabled}),!v){var E;v={};for(E in u)v[E]=u[E]instanceof Array?u[E].slice(0):u[E]}if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,w),b;w.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var F=w.selectAll("g.nv-wrap.nv-multiBarHorizontalChart").data([j]),G=F.enter().append("g").attr("class","nvd3 nv-wrap nv-multiBarHorizontalChart").append("g"),H=F.select("g");if(G.append("g").attr("class","nv-x nv-axis"),G.append("g").attr("class","nv-y nv-axis").append("g").attr("class","nv-zeroLine").append("line"),G.append("g").attr("class","nv-barsWrap"),G.append("g").attr("class","nv-legendWrap"),G.append("g").attr("class","nv-controlsWrap"),q&&(h.width(C-y()),H.select(".nv-legendWrap").datum(j).call(h),k.top!=h.height()&&(k.top=h.height(),D=a.utils.availableHeight(m,w,k)),H.select(".nv-legendWrap").attr("transform","translate("+y()+","+-k.top+")")),o){var I=[{key:p.grouped||"Grouped",disabled:e.stacked()},{key:p.stacked||"Stacked",disabled:!e.stacked()}];i.width(y()).color(["#444","#444","#444"]),H.select(".nv-controlsWrap").datum(I).attr("transform","translate(0,"+-k.top+")").call(i)}F.attr("transform","translate("+k.left+","+k.top+")"),e.disabled(j.map(function(a){return a.disabled})).width(C).height(D).color(j.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!j[b].disabled}));var J=H.select(".nv-barsWrap").datum(j.filter(function(a){return!a.disabled}));if(J.transition().call(e),r){f.scale(c)._ticks(a.utils.calcTicksY(D/24,j)).tickSize(-C,0),H.select(".nv-x.nv-axis").call(f);var K=H.select(".nv-x.nv-axis").selectAll("g");K.selectAll("line, text")}s&&(g.scale(d)._ticks(a.utils.calcTicksX(C/100,j)).tickSize(-D,0),H.select(".nv-y.nv-axis").attr("transform","translate(0,"+D+")"),H.select(".nv-y.nv-axis").call(g)),H.select(".nv-zeroLine line").attr("x1",d(0)).attr("x2",d(0)).attr("y1",0).attr("y2",-D),h.dispatch.on("stateChange",function(a){for(var c in a)u[c]=a[c];x.stateChange(u),b.update()}),i.dispatch.on("legendClick",function(a){if(a.disabled){switch(I=I.map(function(a){return a.disabled=!0,a}),a.disabled=!1,a.key){case"Grouped":e.stacked(!1);break;case"Stacked":e.stacked(!0)}u.stacked=e.stacked(),x.stateChange(u),t=e.stacked(),b.update()}}),x.on("changeState",function(a){"undefined"!=typeof a.disabled&&(j.forEach(function(b,c){b.disabled=a.disabled[c]}),u.disabled=a.disabled),"undefined"!=typeof a.stacked&&(e.stacked(a.stacked),u.stacked=a.stacked,t=a.stacked),b.update()})}),C.renderEnd("multibar horizontal chart immediate"),b}var c,d,e=a.models.multiBarHorizontal(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend().height(30),i=a.models.legend().height(30),j=a.models.tooltip(),k={top:30,right:20,bottom:50,left:60},l=null,m=null,n=a.utils.defaultColor(),o=!0,p={},q=!0,r=!0,s=!0,t=!1,u=a.utils.state(),v=null,w=null,x=d3.dispatch("stateChange","changeState","renderEnd"),y=function(){return o?180:0},z=250;u.stacked=!1,e.stacked(t),f.orient("left").tickPadding(5).showMaxMin(!1).tickFormat(function(a){return a}),g.orient("bottom").tickFormat(d3.format(",.1f")),j.duration(0).valueFormatter(function(a,b){return g.tickFormat()(a,b)}).headerFormatter(function(a,b){return f.tickFormat()(a,b)}),i.updateState(!1);var A=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),stacked:t}}},B=function(a){return function(b){void 0!==b.stacked&&(t=b.stacked),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},C=a.utils.renderWatch(x,z);return e.dispatch.on("elementMouseover.tooltip",function(a){a.value=b.x()(a.data),a.series={key:a.data.key,value:b.y()(a.data),color:a.color},j.data(a).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){j.hidden(!0)}),e.dispatch.on("elementMousemove.tooltip",function(){j.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=x,b.multibar=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.state=u,b.tooltip=j,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return l},set:function(a){l=a}},height:{get:function(){return m},set:function(a){m=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showControls:{get:function(){return o},set:function(a){o=a}},controlLabels:{get:function(){return p},set:function(a){p=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return v},set:function(a){v=a}},noData:{get:function(){return w},set:function(a){w=a}},tooltips:{get:function(){return j.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),j.enabled(!!b)}},tooltipContent:{get:function(){return j.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),j.contentGenerator(b)}},margin:{get:function(){return k},set:function(a){k.top=void 0!==a.top?a.top:k.top,k.right=void 0!==a.right?a.right:k.right,k.bottom=void 0!==a.bottom?a.bottom:k.bottom,k.left=void 0!==a.left?a.left:k.left}},duration:{get:function(){return z},set:function(a){z=a,C.reset(z),e.duration(z),f.duration(z),g.duration(z)}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),h.color(n)}},barColor:{get:function(){return e.barColor},set:function(a){e.barColor(a),h.color(function(a,b){return d3.rgb("#ccc").darker(1.5*b).toString()})}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.multiChart=function(){"use strict";function b(j){return j.each(function(j){function k(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.value=a.point.x,a.series={value:a.point.y,color:a.point.color},B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function l(a){var b=2===j[a.seriesIndex].yAxis?z:y;a.point.x=v.x()(a.point),a.point.y=v.y()(a.point),B.duration(100).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).position(a.pos).hidden(!1)}function n(a){var b=2===j[a.data.series].yAxis?z:y;a.value=t.x()(a.data),a.series={value:t.y()(a.data),color:a.color},B.duration(0).valueFormatter(function(a,c){return b.tickFormat()(a,c)}).data(a).hidden(!1)}var C=d3.select(this);a.utils.initSVG(C),b.update=function(){C.transition().call(b)},b.container=this;var D=a.utils.availableWidth(g,C,e),E=a.utils.availableHeight(h,C,e),F=j.filter(function(a){return"line"==a.type&&1==a.yAxis}),G=j.filter(function(a){return"line"==a.type&&2==a.yAxis}),H=j.filter(function(a){return"bar"==a.type&&1==a.yAxis}),I=j.filter(function(a){return"bar"==a.type&&2==a.yAxis}),J=j.filter(function(a){return"area"==a.type&&1==a.yAxis}),K=j.filter(function(a){return"area"==a.type&&2==a.yAxis});if(!(j&&j.length&&j.filter(function(a){return a.values.length}).length))return a.utils.noData(b,C),b;C.selectAll(".nv-noData").remove();var L=j.filter(function(a){return!a.disabled&&1==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})}),M=j.filter(function(a){return!a.disabled&&2==a.yAxis}).map(function(a){return a.values.map(function(a){return{x:a.x,y:a.y}})});o.domain(d3.extent(d3.merge(L.concat(M)),function(a){return a.x})).range([0,D]);var N=C.selectAll("g.wrap.multiChart").data([j]),O=N.enter().append("g").attr("class","wrap nvd3 multiChart").append("g");O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y1 nv-axis"),O.append("g").attr("class","nv-y2 nv-axis"),O.append("g").attr("class","lines1Wrap"),O.append("g").attr("class","lines2Wrap"),O.append("g").attr("class","bars1Wrap"),O.append("g").attr("class","bars2Wrap"),O.append("g").attr("class","stack1Wrap"),O.append("g").attr("class","stack2Wrap"),O.append("g").attr("class","legendWrap");var P=N.select("g"),Q=j.map(function(a,b){return j[b].color||f(a,b)});if(i){var R=A.align()?D/2:D,S=A.align()?R:0;A.width(R),A.color(Q),P.select(".legendWrap").datum(j.map(function(a){return a.originalKey=void 0===a.originalKey?a.key:a.originalKey,a.key=a.originalKey+(1==a.yAxis?"":" (right axis)"),a})).call(A),e.top!=A.height()&&(e.top=A.height(),E=a.utils.availableHeight(h,C,e)),P.select(".legendWrap").attr("transform","translate("+S+","+-e.top+")")}r.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"line"==j[b].type})),s.width(D).height(E).interpolate(m).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"line"==j[b].type})),t.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"bar"==j[b].type})),u.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"bar"==j[b].type})),v.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&1==j[b].yAxis&&"area"==j[b].type})),w.width(D).height(E).color(Q.filter(function(a,b){return!j[b].disabled&&2==j[b].yAxis&&"area"==j[b].type})),P.attr("transform","translate("+e.left+","+e.top+")");var T=P.select(".lines1Wrap").datum(F.filter(function(a){return!a.disabled})),U=P.select(".bars1Wrap").datum(H.filter(function(a){return!a.disabled})),V=P.select(".stack1Wrap").datum(J.filter(function(a){return!a.disabled})),W=P.select(".lines2Wrap").datum(G.filter(function(a){return!a.disabled})),X=P.select(".bars2Wrap").datum(I.filter(function(a){return!a.disabled})),Y=P.select(".stack2Wrap").datum(K.filter(function(a){return!a.disabled})),Z=J.length?J.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[],$=K.length?K.map(function(a){return a.values}).reduce(function(a,b){return a.map(function(a,c){return{x:a.x,y:a.y+b[c].y}})}).concat([{x:0,y:0}]):[];p.domain(c||d3.extent(d3.merge(L).concat(Z),function(a){return a.y})).range([0,E]),q.domain(d||d3.extent(d3.merge(M).concat($),function(a){return a.y})).range([0,E]),r.yDomain(p.domain()),t.yDomain(p.domain()),v.yDomain(p.domain()),s.yDomain(q.domain()),u.yDomain(q.domain()),w.yDomain(q.domain()),J.length&&d3.transition(V).call(v),K.length&&d3.transition(Y).call(w),H.length&&d3.transition(U).call(t),I.length&&d3.transition(X).call(u),F.length&&d3.transition(T).call(r),G.length&&d3.transition(W).call(s),x._ticks(a.utils.calcTicksX(D/100,j)).tickSize(-E,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+E+")"),d3.transition(P.select(".nv-x.nv-axis")).call(x),y._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y1.nv-axis")).call(y),z._ticks(a.utils.calcTicksY(E/36,j)).tickSize(-D,0),d3.transition(P.select(".nv-y2.nv-axis")).call(z),P.select(".nv-y1.nv-axis").classed("nv-disabled",L.length?!1:!0).attr("transform","translate("+o.range()[0]+",0)"),P.select(".nv-y2.nv-axis").classed("nv-disabled",M.length?!1:!0).attr("transform","translate("+o.range()[1]+",0)"),A.dispatch.on("stateChange",function(){b.update()}),r.dispatch.on("elementMouseover.tooltip",k),s.dispatch.on("elementMouseover.tooltip",k),r.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),s.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),v.dispatch.on("elementMouseover.tooltip",l),w.dispatch.on("elementMouseover.tooltip",l),v.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),w.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMouseover.tooltip",n),u.dispatch.on("elementMouseover.tooltip",n),t.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),u.dispatch.on("elementMouseout.tooltip",function(){B.hidden(!0)}),t.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()}),u.dispatch.on("elementMousemove.tooltip",function(){B.position({top:d3.event.pageY,left:d3.event.pageX})()})}),b}var c,d,e={top:30,right:20,bottom:50,left:60},f=a.utils.defaultColor(),g=null,h=null,i=!0,j=null,k=function(a){return a.x},l=function(a){return a.y},m="monotone",n=!0,o=d3.scale.linear(),p=d3.scale.linear(),q=d3.scale.linear(),r=a.models.line().yScale(p),s=a.models.line().yScale(q),t=a.models.multiBar().stacked(!1).yScale(p),u=a.models.multiBar().stacked(!1).yScale(q),v=a.models.stackedArea().yScale(p),w=a.models.stackedArea().yScale(q),x=a.models.axis().scale(o).orient("bottom").tickPadding(5),y=a.models.axis().scale(p).orient("left"),z=a.models.axis().scale(q).orient("right"),A=a.models.legend().height(30),B=a.models.tooltip(),C=d3.dispatch();return b.dispatch=C,b.lines1=r,b.lines2=s,b.bars1=t,b.bars2=u,b.stack1=v,b.stack2=w,b.xAxis=x,b.yAxis1=y,b.yAxis2=z,b.tooltip=B,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},showLegend:{get:function(){return i},set:function(a){i=a}},yDomain1:{get:function(){return c},set:function(a){c=a}},yDomain2:{get:function(){return d},set:function(a){d=a}},noData:{get:function(){return j},set:function(a){j=a}},interpolate:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return B.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),B.enabled(!!b)}},tooltipContent:{get:function(){return B.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),B.contentGenerator(b)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return f},set:function(b){f=a.utils.getColor(b)}},x:{get:function(){return k},set:function(a){k=a,r.x(a),s.x(a),t.x(a),u.x(a),v.x(a),w.x(a)}},y:{get:function(){return l},set:function(a){l=a,r.y(a),s.y(a),v.y(a),w.y(a),t.y(a),u.y(a)}},useVoronoi:{get:function(){return n},set:function(a){n=a,r.useVoronoi(a),s.useVoronoi(a),v.useVoronoi(a),w.useVoronoi(a)}}}),a.utils.initOptions(b),b},a.models.ohlcBar=function(){"use strict";function b(y){return y.each(function(b){k=d3.select(this);var y=a.utils.availableWidth(h,k,g),A=a.utils.availableHeight(i,k,g);a.utils.initSVG(k);var B=y/b[0].values.length*.9;l.domain(c||d3.extent(b[0].values.map(n).concat(t))),l.range(v?e||[.5*y/b[0].values.length,y*(b[0].values.length-.5)/b[0].values.length]:e||[5+B/2,y-B/2-5]),m.domain(d||[d3.min(b[0].values.map(s).concat(u)),d3.max(b[0].values.map(r).concat(u))]).range(f||[A,0]),l.domain()[0]===l.domain()[1]&&l.domain(l.domain()[0]?[l.domain()[0]-.01*l.domain()[0],l.domain()[1]+.01*l.domain()[1]]:[-1,1]),m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]+.01*m.domain()[0],m.domain()[1]-.01*m.domain()[1]]:[-1,1]);var C=d3.select(this).selectAll("g.nv-wrap.nv-ohlcBar").data([b[0].values]),D=C.enter().append("g").attr("class","nvd3 nv-wrap nv-ohlcBar"),E=D.append("defs"),F=D.append("g"),G=C.select("g");F.append("g").attr("class","nv-ticks"),C.attr("transform","translate("+g.left+","+g.top+")"),k.on("click",function(a,b){z.chartClick({data:a,index:b,pos:d3.event,id:j})}),E.append("clipPath").attr("id","nv-chart-clip-path-"+j).append("rect"),C.select("#nv-chart-clip-path-"+j+" rect").attr("width",y).attr("height",A),G.attr("clip-path",w?"url(#nv-chart-clip-path-"+j+")":"");var H=C.select(".nv-ticks").selectAll(".nv-tick").data(function(a){return a});H.exit().remove(),H.enter().append("path").attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}).attr("d",function(a,b){return"m0,0l0,"+(m(p(a,b))-m(r(a,b)))+"l"+-B/2+",0l"+B/2+",0l0,"+(m(s(a,b))-m(p(a,b)))+"l0,"+(m(q(a,b))-m(s(a,b)))+"l"+B/2+",0l"+-B/2+",0z"}).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("fill",function(){return x[0]}).attr("stroke",function(){return x[0]}).attr("x",0).attr("y",function(a,b){return m(Math.max(0,o(a,b)))}).attr("height",function(a,b){return Math.abs(m(o(a,b))-m(0))}),H.attr("class",function(a,b,c){return(p(a,b)>q(a,b)?"nv-tick negative":"nv-tick positive")+" nv-tick-"+c+"-"+b}),d3.transition(H).attr("transform",function(a,b){return"translate("+l(n(a,b))+","+m(r(a,b))+")"}).attr("d",function(a,c){var d=y/b[0].values.length*.9;return"m0,0l0,"+(m(p(a,c))-m(r(a,c)))+"l"+-d/2+",0l"+d/2+",0l0,"+(m(s(a,c))-m(p(a,c)))+"l0,"+(m(q(a,c))-m(s(a,c)))+"l"+d/2+",0l"+-d/2+",0z"})}),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=Math.floor(1e4*Math.random()),k=null,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=function(a){return a.open},q=function(a){return a.close},r=function(a){return a.high},s=function(a){return a.low},t=[],u=[],v=!1,w=!0,x=a.utils.defaultColor(),y=!1,z=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd","chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove");return b.highlightPoint=function(a,c){b.clearHighlights(),k.select(".nv-ohlcBar .nv-tick-0-"+a).classed("hover",c)},b.clearHighlights=function(){k.select(".nv-ohlcBar .nv-tick.hover").classed("hover",!1)},b.dispatch=z,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},padData:{get:function(){return v},set:function(a){v=a}},clipEdge:{get:function(){return w},set:function(a){w=a}},id:{get:function(){return j},set:function(a){j=a}},interactive:{get:function(){return y},set:function(a){y=a}},x:{get:function(){return n},set:function(a){n=a}},y:{get:function(){return o},set:function(a){o=a}},open:{get:function(){return p()},set:function(a){p=a}},close:{get:function(){return q()},set:function(a){q=a}},high:{get:function(){return r},set:function(a){r=a}},low:{get:function(){return s},set:function(a){s=a}},margin:{get:function(){return g},set:function(a){g.top=void 0!=a.top?a.top:g.top,g.right=void 0!=a.right?a.right:g.right,g.bottom=void 0!=a.bottom?a.bottom:g.bottom,g.left=void 0!=a.left?a.left:g.left +}},color:{get:function(){return x},set:function(b){x=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.parallelCoordinates=function(){"use strict";function b(p){return p.each(function(b){function p(a){return F(h.map(function(b){if(isNaN(a[b])||isNaN(parseFloat(a[b]))){var c=g[b].domain(),d=g[b].range(),e=c[0]-(c[1]-c[0])/9;if(J.indexOf(b)<0){var h=d3.scale.linear().domain([e,c[1]]).range([x-12,d[1]]);g[b].brush.y(h),J.push(b)}return[f(b),g[b](e)]}return J.length>0?(D.style("display","inline"),E.style("display","inline")):(D.style("display","none"),E.style("display","none")),[f(b),g[b](a[b])]}))}function q(){var a=h.filter(function(a){return!g[a].brush.empty()}),b=a.map(function(a){return g[a].brush.extent()});k=[],a.forEach(function(a,c){k[c]={dimension:a,extent:b[c]}}),l=[],M.style("display",function(c){var d=a.every(function(a,d){return isNaN(c[a])&&b[d][0]==g[a].brush.y().domain()[0]?!0:b[d][0]<=c[a]&&c[a]<=b[d][1]});return d&&l.push(c),d?null:"none"}),o.brush({filters:k,active:l})}function r(a){m[a]=this.parentNode.__origin__=f(a),L.attr("visibility","hidden")}function s(a){m[a]=Math.min(w,Math.max(0,this.parentNode.__origin__+=d3.event.x)),M.attr("d",p),h.sort(function(a,b){return u(a)-u(b)}),f.domain(h),N.attr("transform",function(a){return"translate("+u(a)+")"})}function t(a){delete this.parentNode.__origin__,delete m[a],d3.select(this.parentNode).attr("transform","translate("+f(a)+")"),M.attr("d",p),L.attr("d",p).attr("visibility",null)}function u(a){var b=m[a];return null==b?f(a):b}var v=d3.select(this),w=a.utils.availableWidth(d,v,c),x=a.utils.availableHeight(e,v,c);a.utils.initSVG(v),l=b,f.rangePoints([0,w],1).domain(h);var y={};h.forEach(function(a){var c=d3.extent(b,function(b){return+b[a]});return y[a]=!1,void 0===c[0]&&(y[a]=!0,c[0]=0,c[1]=0),c[0]===c[1]&&(c[0]=c[0]-1,c[1]=c[1]+1),g[a]=d3.scale.linear().domain(c).range([.9*(x-12),0]),g[a].brush=d3.svg.brush().y(g[a]).on("brush",q),"name"!=a});var z=v.selectAll("g.nv-wrap.nv-parallelCoordinates").data([b]),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-parallelCoordinates"),B=A.append("g"),C=z.select("g");B.append("g").attr("class","nv-parallelCoordinates background"),B.append("g").attr("class","nv-parallelCoordinates foreground"),B.append("g").attr("class","nv-parallelCoordinates missingValuesline"),z.attr("transform","translate("+c.left+","+c.top+")");var D,E,F=d3.svg.line().interpolate("cardinal").tension(n),G=d3.svg.axis().orient("left"),H=d3.behavior.drag().on("dragstart",r).on("drag",s).on("dragend",t),I=f.range()[1]-f.range()[0],J=[],K=[0+I/2,x-12,w-I/2,x-12];D=z.select(".missingValuesline").selectAll("line").data([K]),D.enter().append("line"),D.exit().remove(),D.attr("x1",function(a){return a[0]}).attr("y1",function(a){return a[1]}).attr("x2",function(a){return a[2]}).attr("y2",function(a){return a[3]}),E=z.select(".missingValuesline").selectAll("text").data(["undefined values"]),E.append("text").data(["undefined values"]),E.enter().append("text"),E.exit().remove(),E.attr("y",x).attr("x",w-92-I/2).text(function(a){return a});var L=z.select(".background").selectAll("path").data(b);L.enter().append("path"),L.exit().remove(),L.attr("d",p);var M=z.select(".foreground").selectAll("path").data(b);M.enter().append("path"),M.exit().remove(),M.attr("d",p).attr("stroke",j),M.on("mouseover",function(a,b){d3.select(this).classed("hover",!0),o.elementMouseover({label:a.name,data:a.data,index:b,pos:[d3.mouse(this.parentNode)[0],d3.mouse(this.parentNode)[1]]})}),M.on("mouseout",function(a,b){d3.select(this).classed("hover",!1),o.elementMouseout({label:a.name,data:a.data,index:b})});var N=C.selectAll(".dimension").data(h),O=N.enter().append("g").attr("class","nv-parallelCoordinates dimension");O.append("g").attr("class","nv-parallelCoordinates nv-axis"),O.append("g").attr("class","nv-parallelCoordinates-brush"),O.append("text").attr("class","nv-parallelCoordinates nv-label"),N.attr("transform",function(a){return"translate("+f(a)+",0)"}),N.exit().remove(),N.select(".nv-label").style("cursor","move").attr("dy","-1em").attr("text-anchor","middle").text(String).on("mouseover",function(a){o.elementMouseover({dim:a,pos:[d3.mouse(this.parentNode.parentNode)[0],d3.mouse(this.parentNode.parentNode)[1]]})}).on("mouseout",function(a){o.elementMouseout({dim:a})}).call(H),N.select(".nv-axis").each(function(a,b){d3.select(this).call(G.scale(g[a]).tickFormat(d3.format(i[b])))}),N.select(".nv-parallelCoordinates-brush").each(function(a){d3.select(this).call(g[a].brush)}).selectAll("rect").attr("x",-8).attr("width",16)}),b}var c={top:30,right:0,bottom:10,left:0},d=null,e=null,f=d3.scale.ordinal(),g={},h=[],i=[],j=a.utils.defaultColor(),k=[],l=[],m=[],n=1,o=d3.dispatch("brush","elementMouseover","elementMouseout");return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},dimensionNames:{get:function(){return h},set:function(a){h=a}},dimensionFormats:{get:function(){return i},set:function(a){i=a}},lineTension:{get:function(){return n},set:function(a){n=a}},dimensions:{get:function(){return h},set:function(b){a.deprecated("dimensions","use dimensionNames instead"),h=b}},margin:{get:function(){return c},set:function(a){c.top=void 0!==a.top?a.top:c.top,c.right=void 0!==a.right?a.right:c.right,c.bottom=void 0!==a.bottom?a.bottom:c.bottom,c.left=void 0!==a.left?a.left:c.left}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.pie=function(){"use strict";function b(E){return D.reset(),E.each(function(b){function E(a,b){a.endAngle=isNaN(a.endAngle)?0:a.endAngle,a.startAngle=isNaN(a.startAngle)?0:a.startAngle,p||(a.innerRadius=0);var c=d3.interpolate(this._current,a);return this._current=c(0),function(a){return B[b](c(a))}}var F=d-c.left-c.right,G=e-c.top-c.bottom,H=Math.min(F,G)/2,I=[],J=[];if(i=d3.select(this),0===z.length)for(var K=H-H/5,L=y*H,M=0;Mc)return"";if("function"==typeof n)d=n(a,b,{key:f(a.data),value:g(a.data),percent:k(c)});else switch(n){case"key":d=f(a.data);break;case"value":d=k(g(a.data));break;case"percent":d=d3.format("%")(c)}return d})}}),D.renderEnd("pie immediate"),b}var c={top:0,right:0,bottom:0,left:0},d=500,e=500,f=function(a){return a.x},g=function(a){return a.y},h=Math.floor(1e4*Math.random()),i=null,j=a.utils.defaultColor(),k=d3.format(",.2f"),l=!0,m=!1,n="key",o=.02,p=!1,q=!1,r=!0,s=0,t=!1,u=!1,v=!1,w=!1,x=0,y=.5,z=[],A=d3.dispatch("chartClick","elementClick","elementDblClick","elementMouseover","elementMouseout","elementMousemove","renderEnd"),B=[],C=[],D=a.utils.renderWatch(A);return b.dispatch=A,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{arcsRadius:{get:function(){return z},set:function(a){z=a}},width:{get:function(){return d},set:function(a){d=a}},height:{get:function(){return e},set:function(a){e=a}},showLabels:{get:function(){return l},set:function(a){l=a}},title:{get:function(){return q},set:function(a){q=a}},titleOffset:{get:function(){return s},set:function(a){s=a}},labelThreshold:{get:function(){return o},set:function(a){o=a}},valueFormat:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return f},set:function(a){f=a}},id:{get:function(){return h},set:function(a){h=a}},endAngle:{get:function(){return w},set:function(a){w=a}},startAngle:{get:function(){return u},set:function(a){u=a}},padAngle:{get:function(){return v},set:function(a){v=a}},cornerRadius:{get:function(){return x},set:function(a){x=a}},donutRatio:{get:function(){return y},set:function(a){y=a}},labelsOutside:{get:function(){return m},set:function(a){m=a}},labelSunbeamLayout:{get:function(){return t},set:function(a){t=a}},donut:{get:function(){return p},set:function(a){p=a}},growOnHover:{get:function(){return r},set:function(a){r=a}},pieLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("pieLabelsOutside","use labelsOutside instead")}},donutLabelsOutside:{get:function(){return m},set:function(b){m=b,a.deprecated("donutLabelsOutside","use labelsOutside instead")}},labelFormat:{get:function(){return k},set:function(b){k=b,a.deprecated("labelFormat","use valueFormat instead")}},margin:{get:function(){return c},set:function(a){c.top="undefined"!=typeof a.top?a.top:c.top,c.right="undefined"!=typeof a.right?a.right:c.right,c.bottom="undefined"!=typeof a.bottom?a.bottom:c.bottom,c.left="undefined"!=typeof a.left?a.left:c.left}},y:{get:function(){return g},set:function(a){g=d3.functor(a)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},labelType:{get:function(){return n},set:function(a){n=a||"key"}}}),a.utils.initOptions(b),b},a.models.pieChart=function(){"use strict";function b(e){return q.reset(),q.models(c),e.each(function(e){var k=d3.select(this);a.utils.initSVG(k);var n=a.utils.availableWidth(g,k,f),o=a.utils.availableHeight(h,k,f);if(b.update=function(){k.transition().call(b)},b.container=this,l.setter(s(e),b.update).getter(r(e)).update(),l.disabled=e.map(function(a){return!!a.disabled}),!m){var q;m={};for(q in l)m[q]=l[q]instanceof Array?l[q].slice(0):l[q]}if(!e||!e.length)return a.utils.noData(b,k),b;k.selectAll(".nv-noData").remove();var t=k.selectAll("g.nv-wrap.nv-pieChart").data([e]),u=t.enter().append("g").attr("class","nvd3 nv-wrap nv-pieChart").append("g"),v=t.select("g");if(u.append("g").attr("class","nv-pieWrap"),u.append("g").attr("class","nv-legendWrap"),i)if("top"===j)d.width(n).key(c.x()),t.select(".nv-legendWrap").datum(e).call(d),f.top!=d.height()&&(f.top=d.height(),o=a.utils.availableHeight(h,k,f)),t.select(".nv-legendWrap").attr("transform","translate(0,"+-f.top+")");else if("right"===j){var w=a.models.legend().width();w>n/2&&(w=n/2),d.height(o).key(c.x()),d.width(w),n-=d.width(),t.select(".nv-legendWrap").datum(e).call(d).attr("transform","translate("+n+",0)")}t.attr("transform","translate("+f.left+","+f.top+")"),c.width(n).height(o);var x=v.select(".nv-pieWrap").datum([e]);d3.transition(x).call(c),d.dispatch.on("stateChange",function(a){for(var c in a)l[c]=a[c];p.stateChange(l),b.update()}),p.on("changeState",function(a){"undefined"!=typeof a.disabled&&(e.forEach(function(b,c){b.disabled=a.disabled[c]}),l.disabled=a.disabled),b.update()})}),q.renderEnd("pieChart immediate"),b}var c=a.models.pie(),d=a.models.legend(),e=a.models.tooltip(),f={top:30,right:20,bottom:20,left:20},g=null,h=null,i=!0,j="top",k=a.utils.defaultColor(),l=a.utils.state(),m=null,n=null,o=250,p=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd");e.headerEnabled(!1).duration(0).valueFormatter(function(a,b){return c.valueFormat()(a,b)});var q=a.utils.renderWatch(p),r=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},s=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:b.x()(a.data),value:b.y()(a.data),color:a.color},e.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){e.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){e.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.legend=d,b.dispatch=p,b.pie=c,b.tooltip=e,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return i},set:function(a){i=a}},legendPosition:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return m},set:function(a){m=a}},tooltips:{get:function(){return e.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),e.enabled(!!b)}},tooltipContent:{get:function(){return e.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),e.contentGenerator(b)}},color:{get:function(){return k},set:function(a){k=a,d.color(k),c.color(k)}},duration:{get:function(){return o},set:function(a){o=a,q.reset(o)}},margin:{get:function(){return f},set:function(a){f.top=void 0!==a.top?a.top:f.top,f.right=void 0!==a.right?a.right:f.right,f.bottom=void 0!==a.bottom?a.bottom:f.bottom,f.left=void 0!==a.left?a.left:f.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.scatter=function(){"use strict";function b(N){return P.reset(),N.each(function(b){function N(){if(O=!1,!w)return!1;if(M===!0){var a=d3.merge(b.map(function(a,b){return a.values.map(function(a,c){var d=p(a,c),e=q(a,c);return[m(d)+1e-4*Math.random(),n(e)+1e-4*Math.random(),b,c,a]}).filter(function(a,b){return x(a[4],b)})}));if(0==a.length)return!1;a.length<3&&(a.push([m.range()[0]-20,n.range()[0]-20,null,null]),a.push([m.range()[1]+20,n.range()[1]+20,null,null]),a.push([m.range()[0]-20,n.range()[0]+20,null,null]),a.push([m.range()[1]+20,n.range()[1]-20,null,null]));var c=d3.geom.polygon([[-10,-10],[-10,i+10],[h+10,i+10],[h+10,-10]]),d=d3.geom.voronoi(a).map(function(b,d){return{data:c.clip(b),series:a[d][2],point:a[d][3]}});U.select(".nv-point-paths").selectAll("path").remove();var e=U.select(".nv-point-paths").selectAll("path").data(d),f=e.enter().append("svg:path").attr("d",function(a){return a&&a.data&&0!==a.data.length?"M"+a.data.join(",")+"Z":"M 0 0"}).attr("id",function(a,b){return"nv-path-"+b}).attr("clip-path",function(a,b){return"url(#nv-clip-"+b+")"});C&&f.style("fill",d3.rgb(230,230,230)).style("fill-opacity",.4).style("stroke-opacity",1).style("stroke",d3.rgb(200,200,200)),B&&(U.select(".nv-point-clips").selectAll("clipPath").remove(),U.select(".nv-point-clips").selectAll("clipPath").data(a).enter().append("svg:clipPath").attr("id",function(a,b){return"nv-clip-"+b}).append("svg:circle").attr("cx",function(a){return a[0]}).attr("cy",function(a){return a[1]}).attr("r",D));var k=function(a,c){if(O)return 0;var d=b[a.series];if(void 0!==d){var e=d.values[a.point];e.color=j(d,a.series),e.x=p(e),e.y=q(e);var f=l.node().getBoundingClientRect(),h=window.pageYOffset||document.documentElement.scrollTop,i=window.pageXOffset||document.documentElement.scrollLeft,k={left:m(p(e,a.point))+f.left+i+g.left+10,top:n(q(e,a.point))+f.top+h+g.top+10};c({point:e,series:d,pos:k,seriesIndex:a.series,pointIndex:a.point})}};e.on("click",function(a){k(a,L.elementClick)}).on("dblclick",function(a){k(a,L.elementDblClick)}).on("mouseover",function(a){k(a,L.elementMouseover)}).on("mouseout",function(a){k(a,L.elementMouseout)})}else U.select(".nv-groups").selectAll(".nv-group").selectAll(".nv-point").on("click",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("dblclick",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementDblClick({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c})}).on("mouseover",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseover({point:e,series:d,pos:[m(p(e,c))+g.left,n(q(e,c))+g.top],seriesIndex:a.series,pointIndex:c,color:j(a,c)})}).on("mouseout",function(a,c){if(O||!b[a.series])return 0;var d=b[a.series],e=d.values[c];L.elementMouseout({point:e,series:d,seriesIndex:a.series,pointIndex:c,color:j(a,c)})})}l=d3.select(this);var R=a.utils.availableWidth(h,l,g),S=a.utils.availableHeight(i,l,g);a.utils.initSVG(l),b.forEach(function(a,b){a.values.forEach(function(a){a.series=b})});var T=E&&F&&I?[]:d3.merge(b.map(function(a){return a.values.map(function(a,b){return{x:p(a,b),y:q(a,b),size:r(a,b)}})}));m.domain(E||d3.extent(T.map(function(a){return a.x}).concat(t))),m.range(y&&b[0]?G||[(R*z+R)/(2*b[0].values.length),R-R*(1+z)/(2*b[0].values.length)]:G||[0,R]),n.domain(F||d3.extent(T.map(function(a){return a.y}).concat(u))).range(H||[S,0]),o.domain(I||d3.extent(T.map(function(a){return a.size}).concat(v))).range(J||Q),K=m.domain()[0]===m.domain()[1]||n.domain()[0]===n.domain()[1],m.domain()[0]===m.domain()[1]&&m.domain(m.domain()[0]?[m.domain()[0]-.01*m.domain()[0],m.domain()[1]+.01*m.domain()[1]]:[-1,1]),n.domain()[0]===n.domain()[1]&&n.domain(n.domain()[0]?[n.domain()[0]-.01*n.domain()[0],n.domain()[1]+.01*n.domain()[1]]:[-1,1]),isNaN(m.domain()[0])&&m.domain([-1,1]),isNaN(n.domain()[0])&&n.domain([-1,1]),c=c||m,d=d||n,e=e||o;var U=l.selectAll("g.nv-wrap.nv-scatter").data([b]),V=U.enter().append("g").attr("class","nvd3 nv-wrap nv-scatter nv-chart-"+k),W=V.append("defs"),X=V.append("g"),Y=U.select("g");U.classed("nv-single-point",K),X.append("g").attr("class","nv-groups"),X.append("g").attr("class","nv-point-paths"),V.append("g").attr("class","nv-point-clips"),U.attr("transform","translate("+g.left+","+g.top+")"),W.append("clipPath").attr("id","nv-edge-clip-"+k).append("rect"),U.select("#nv-edge-clip-"+k+" rect").attr("width",R).attr("height",S>0?S:0),Y.attr("clip-path",A?"url(#nv-edge-clip-"+k+")":""),O=!0;var Z=U.select(".nv-groups").selectAll(".nv-group").data(function(a){return a},function(a){return a.key});Z.enter().append("g").style("stroke-opacity",1e-6).style("fill-opacity",1e-6),Z.exit().remove(),Z.attr("class",function(a,b){return"nv-group nv-series-"+b}).classed("hover",function(a){return a.hover}),Z.watchTransition(P,"scatter: groups").style("fill",function(a,b){return j(a,b)}).style("stroke",function(a,b){return j(a,b)}).style("stroke-opacity",1).style("fill-opacity",.5);var $=Z.selectAll("path.nv-point").data(function(a){return a.values.map(function(a,b){return[a,b]}).filter(function(a,b){return x(a[0],b)})});$.enter().append("path").style("fill",function(a){return a.color}).style("stroke",function(a){return a.color}).attr("transform",function(a){return"translate("+c(p(a[0],a[1]))+","+d(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),$.exit().remove(),Z.exit().selectAll("path.nv-point").watchTransition(P,"scatter exit").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).remove(),$.each(function(a){d3.select(this).classed("nv-point",!0).classed("nv-point-"+a[1],!0).classed("nv-noninteractive",!w).classed("hover",!1)}),$.watchTransition(P,"scatter points").attr("transform",function(a){return"translate("+m(p(a[0],a[1]))+","+n(q(a[0],a[1]))+")"}).attr("d",a.utils.symbol().type(function(a){return s(a[0])}).size(function(a){return o(r(a[0],a[1]))})),clearTimeout(f),f=setTimeout(N,300),c=m.copy(),d=n.copy(),e=o.copy()}),P.renderEnd("scatter immediate"),b}var c,d,e,f,g={top:0,right:0,bottom:0,left:0},h=null,i=null,j=a.utils.defaultColor(),k=Math.floor(1e5*Math.random()),l=null,m=d3.scale.linear(),n=d3.scale.linear(),o=d3.scale.linear(),p=function(a){return a.x},q=function(a){return a.y},r=function(a){return a.size||1},s=function(a){return a.shape||"circle"},t=[],u=[],v=[],w=!0,x=function(a){return!a.notActive},y=!1,z=.1,A=!1,B=!0,C=!1,D=function(){return 25},E=null,F=null,G=null,H=null,I=null,J=null,K=!1,L=d3.dispatch("elementClick","elementDblClick","elementMouseover","elementMouseout","renderEnd"),M=!0,N=250,O=!1,P=a.utils.renderWatch(L,N),Q=[16,256];return b.dispatch=L,b.options=a.utils.optionsFunc.bind(b),b._calls=new function(){this.clearHighlights=function(){return a.dom.write(function(){l.selectAll(".nv-point.hover").classed("hover",!1)}),null},this.highlightPoint=function(b,c,d){a.dom.write(function(){l.select(" .nv-series-"+b+" .nv-point-"+c).classed("hover",d)})}},L.on("elementMouseover.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!0)}),L.on("elementMouseout.point",function(a){w&&b._calls.highlightPoint(a.seriesIndex,a.pointIndex,!1)}),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xScale:{get:function(){return m},set:function(a){m=a}},yScale:{get:function(){return n},set:function(a){n=a}},pointScale:{get:function(){return o},set:function(a){o=a}},xDomain:{get:function(){return E},set:function(a){E=a}},yDomain:{get:function(){return F},set:function(a){F=a}},pointDomain:{get:function(){return I},set:function(a){I=a}},xRange:{get:function(){return G},set:function(a){G=a}},yRange:{get:function(){return H},set:function(a){H=a}},pointRange:{get:function(){return J},set:function(a){J=a}},forceX:{get:function(){return t},set:function(a){t=a}},forceY:{get:function(){return u},set:function(a){u=a}},forcePoint:{get:function(){return v},set:function(a){v=a}},interactive:{get:function(){return w},set:function(a){w=a}},pointActive:{get:function(){return x},set:function(a){x=a}},padDataOuter:{get:function(){return z},set:function(a){z=a}},padData:{get:function(){return y},set:function(a){y=a}},clipEdge:{get:function(){return A},set:function(a){A=a}},clipVoronoi:{get:function(){return B},set:function(a){B=a}},clipRadius:{get:function(){return D},set:function(a){D=a}},showVoronoi:{get:function(){return C},set:function(a){C=a}},id:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return p},set:function(a){p=d3.functor(a)}},y:{get:function(){return q},set:function(a){q=d3.functor(a)}},pointSize:{get:function(){return r},set:function(a){r=d3.functor(a)}},pointShape:{get:function(){return s},set:function(a){s=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},duration:{get:function(){return N},set:function(a){N=a,P.reset(N)}},color:{get:function(){return j},set:function(b){j=a.utils.getColor(b)}},useVoronoi:{get:function(){return M},set:function(a){M=a,M===!1&&(B=!1)}}}),a.utils.initOptions(b),b},a.models.scatterChart=function(){"use strict";function b(z){return D.reset(),D.models(c),t&&D.models(d),u&&D.models(e),q&&D.models(g),r&&D.models(h),z.each(function(z){m=d3.select(this),a.utils.initSVG(m);var G=a.utils.availableWidth(k,m,j),H=a.utils.availableHeight(l,m,j);if(b.update=function(){0===A?m.call(b):m.transition().duration(A).call(b)},b.container=this,w.setter(F(z),b.update).getter(E(z)).update(),w.disabled=z.map(function(a){return!!a.disabled}),!x){var I;x={};for(I in w)x[I]=w[I]instanceof Array?w[I].slice(0):w[I]}if(!(z&&z.length&&z.filter(function(a){return a.values.length}).length))return a.utils.noData(b,m),D.renderEnd("scatter immediate"),b;m.selectAll(".nv-noData").remove(),o=c.xScale(),p=c.yScale();var J=m.selectAll("g.nv-wrap.nv-scatterChart").data([z]),K=J.enter().append("g").attr("class","nvd3 nv-wrap nv-scatterChart nv-chart-"+c.id()),L=K.append("g"),M=J.select("g");if(L.append("rect").attr("class","nvd3 nv-background").style("pointer-events","none"),L.append("g").attr("class","nv-x nv-axis"),L.append("g").attr("class","nv-y nv-axis"),L.append("g").attr("class","nv-scatterWrap"),L.append("g").attr("class","nv-regressionLinesWrap"),L.append("g").attr("class","nv-distWrap"),L.append("g").attr("class","nv-legendWrap"),v&&M.select(".nv-y.nv-axis").attr("transform","translate("+G+",0)"),s){var N=G;f.width(N),J.select(".nv-legendWrap").datum(z).call(f),j.top!=f.height()&&(j.top=f.height(),H=a.utils.availableHeight(l,m,j)),J.select(".nv-legendWrap").attr("transform","translate(0,"+-j.top+")")}J.attr("transform","translate("+j.left+","+j.top+")"),c.width(G).height(H).color(z.map(function(a,b){return a.color=a.color||n(a,b),a.color}).filter(function(a,b){return!z[b].disabled})),J.select(".nv-scatterWrap").datum(z.filter(function(a){return!a.disabled})).call(c),J.select(".nv-regressionLinesWrap").attr("clip-path","url(#nv-edge-clip-"+c.id()+")");var O=J.select(".nv-regressionLinesWrap").selectAll(".nv-regLines").data(function(a){return a});O.enter().append("g").attr("class","nv-regLines");var P=O.selectAll(".nv-regLine").data(function(a){return[a]});P.enter().append("line").attr("class","nv-regLine").style("stroke-opacity",0),P.filter(function(a){return a.intercept&&a.slope}).watchTransition(D,"scatterPlusLineChart: regline").attr("x1",o.range()[0]).attr("x2",o.range()[1]).attr("y1",function(a){return p(o.domain()[0]*a.slope+a.intercept)}).attr("y2",function(a){return p(o.domain()[1]*a.slope+a.intercept)}).style("stroke",function(a,b,c){return n(a,c)}).style("stroke-opacity",function(a){return a.disabled||"undefined"==typeof a.slope||"undefined"==typeof a.intercept?0:1}),t&&(d.scale(o)._ticks(a.utils.calcTicksX(G/100,z)).tickSize(-H,0),M.select(".nv-x.nv-axis").attr("transform","translate(0,"+p.range()[0]+")").call(d)),u&&(e.scale(p)._ticks(a.utils.calcTicksY(H/36,z)).tickSize(-G,0),M.select(".nv-y.nv-axis").call(e)),q&&(g.getData(c.x()).scale(o).width(G).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionX"),M.select(".nv-distributionX").attr("transform","translate(0,"+p.range()[0]+")").datum(z.filter(function(a){return!a.disabled})).call(g)),r&&(h.getData(c.y()).scale(p).width(H).color(z.map(function(a,b){return a.color||n(a,b)}).filter(function(a,b){return!z[b].disabled})),L.select(".nv-distWrap").append("g").attr("class","nv-distributionY"),M.select(".nv-distributionY").attr("transform","translate("+(v?G:-h.size())+",0)").datum(z.filter(function(a){return!a.disabled})).call(h)),f.dispatch.on("stateChange",function(a){for(var c in a)w[c]=a[c];y.stateChange(w),b.update()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&(z.forEach(function(b,c){b.disabled=a.disabled[c]}),w.disabled=a.disabled),b.update()}),c.dispatch.on("elementMouseout.tooltip",function(a){i.hidden(!0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",0),m.select(".nv-chart-"+c.id()+" .nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",h.size())}),c.dispatch.on("elementMouseover.tooltip",function(a){m.select(".nv-series-"+a.seriesIndex+" .nv-distx-"+a.pointIndex).attr("y1",a.pos.top-H-j.top),m.select(".nv-series-"+a.seriesIndex+" .nv-disty-"+a.pointIndex).attr("x2",a.pos.left+g.size()-j.left),i.position(a.pos).data(a).hidden(!1)}),B=o.copy(),C=p.copy()}),D.renderEnd("scatter with line immediate"),b}var c=a.models.scatter(),d=a.models.axis(),e=a.models.axis(),f=a.models.legend(),g=a.models.distribution(),h=a.models.distribution(),i=a.models.tooltip(),j={top:30,right:20,bottom:50,left:75},k=null,l=null,m=null,n=a.utils.defaultColor(),o=c.xScale(),p=c.yScale(),q=!1,r=!1,s=!0,t=!0,u=!0,v=!1,w=a.utils.state(),x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=null,A=250;c.xScale(o).yScale(p),d.orient("bottom").tickPadding(10),e.orient(v?"right":"left").tickPadding(10),g.axis("x"),h.axis("y"),i.headerFormatter(function(a,b){return d.tickFormat()(a,b)}).valueFormatter(function(a,b){return e.tickFormat()(a,b)});var B,C,D=a.utils.renderWatch(y,A),E=function(a){return function(){return{active:a.map(function(a){return!a.disabled})}}},F=function(a){return function(b){void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}};return b.dispatch=y,b.scatter=c,b.legend=f,b.xAxis=d,b.yAxis=e,b.distX=g,b.distY=h,b.tooltip=i,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return k},set:function(a){k=a}},height:{get:function(){return l},set:function(a){l=a}},container:{get:function(){return m},set:function(a){m=a}},showDistX:{get:function(){return q},set:function(a){q=a}},showDistY:{get:function(){return r},set:function(a){r=a}},showLegend:{get:function(){return s},set:function(a){s=a}},showXAxis:{get:function(){return t},set:function(a){t=a}},showYAxis:{get:function(){return u},set:function(a){u=a}},defaultState:{get:function(){return x},set:function(a){x=a}},noData:{get:function(){return z},set:function(a){z=a}},duration:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return i.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),i.enabled(!!b) +}},tooltipContent:{get:function(){return i.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),i.contentGenerator(b)}},tooltipXContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},tooltipYContent:{get:function(){return i.contentGenerator()},set:function(){a.deprecated("tooltipContent","This option is removed, put values into main tooltip.")}},margin:{get:function(){return j},set:function(a){j.top=void 0!==a.top?a.top:j.top,j.right=void 0!==a.right?a.right:j.right,j.bottom=void 0!==a.bottom?a.bottom:j.bottom,j.left=void 0!==a.left?a.left:j.left}},rightAlignYAxis:{get:function(){return v},set:function(a){v=a,e.orient(a?"right":"left")}},color:{get:function(){return n},set:function(b){n=a.utils.getColor(b),f.color(n),g.color(n),h.color(n)}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.models.sparkline=function(){"use strict";function b(k){return k.each(function(b){var k=h-g.left-g.right,q=i-g.top-g.bottom;j=d3.select(this),a.utils.initSVG(j),l.domain(c||d3.extent(b,n)).range(e||[0,k]),m.domain(d||d3.extent(b,o)).range(f||[q,0]);{var r=j.selectAll("g.nv-wrap.nv-sparkline").data([b]),s=r.enter().append("g").attr("class","nvd3 nv-wrap nv-sparkline");s.append("g"),r.select("g")}r.attr("transform","translate("+g.left+","+g.top+")");var t=r.selectAll("path").data(function(a){return[a]});t.enter().append("path"),t.exit().remove(),t.style("stroke",function(a,b){return a.color||p(a,b)}).attr("d",d3.svg.line().x(function(a,b){return l(n(a,b))}).y(function(a,b){return m(o(a,b))}));var u=r.selectAll("circle.nv-point").data(function(a){function b(b){if(-1!=b){var c=a[b];return c.pointIndex=b,c}return null}var c=a.map(function(a,b){return o(a,b)}),d=b(c.lastIndexOf(m.domain()[1])),e=b(c.indexOf(m.domain()[0])),f=b(c.length-1);return[e,d,f].filter(function(a){return null!=a})});u.enter().append("circle"),u.exit().remove(),u.attr("cx",function(a){return l(n(a,a.pointIndex))}).attr("cy",function(a){return m(o(a,a.pointIndex))}).attr("r",2).attr("class",function(a){return n(a,a.pointIndex)==l.domain()[1]?"nv-point nv-currentValue":o(a,a.pointIndex)==m.domain()[0]?"nv-point nv-minValue":"nv-point nv-maxValue"})}),b}var c,d,e,f,g={top:2,right:0,bottom:2,left:0},h=400,i=32,j=null,k=!0,l=d3.scale.linear(),m=d3.scale.linear(),n=function(a){return a.x},o=function(a){return a.y},p=a.utils.getColor(["#000"]);return b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return h},set:function(a){h=a}},height:{get:function(){return i},set:function(a){i=a}},xDomain:{get:function(){return c},set:function(a){c=a}},yDomain:{get:function(){return d},set:function(a){d=a}},xRange:{get:function(){return e},set:function(a){e=a}},yRange:{get:function(){return f},set:function(a){f=a}},xScale:{get:function(){return l},set:function(a){l=a}},yScale:{get:function(){return m},set:function(a){m=a}},animate:{get:function(){return k},set:function(a){k=a}},x:{get:function(){return n},set:function(a){n=d3.functor(a)}},y:{get:function(){return o},set:function(a){o=d3.functor(a)}},margin:{get:function(){return g},set:function(a){g.top=void 0!==a.top?a.top:g.top,g.right=void 0!==a.right?a.right:g.right,g.bottom=void 0!==a.bottom?a.bottom:g.bottom,g.left=void 0!==a.left?a.left:g.left}},color:{get:function(){return p},set:function(b){p=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sparklinePlus=function(){"use strict";function b(p){return p.each(function(p){function q(){if(!j){var a=z.selectAll(".nv-hoverValue").data(i),b=a.enter().append("g").attr("class","nv-hoverValue").style("stroke-opacity",0).style("fill-opacity",0);a.exit().transition().duration(250).style("stroke-opacity",0).style("fill-opacity",0).remove(),a.attr("transform",function(a){return"translate("+c(e.x()(p[a],a))+",0)"}).transition().duration(250).style("stroke-opacity",1).style("fill-opacity",1),i.length&&(b.append("line").attr("x1",0).attr("y1",-f.top).attr("x2",0).attr("y2",u),b.append("text").attr("class","nv-xValue").attr("x",-6).attr("y",-f.top).attr("text-anchor","end").attr("dy",".9em"),z.select(".nv-hoverValue .nv-xValue").text(k(e.x()(p[i[0]],i[0]))),b.append("text").attr("class","nv-yValue").attr("x",6).attr("y",-f.top).attr("text-anchor","start").attr("dy",".9em"),z.select(".nv-hoverValue .nv-yValue").text(l(e.y()(p[i[0]],i[0]))))}}function r(){function a(a,b){for(var c=Math.abs(e.x()(a[0],0)-b),d=0,f=0;fc;++c){for(b=0,d=0;bb;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=0}for(c=0;f>c;++c)g[c]=0;return g}}),u.renderEnd("stackedArea immediate"),b}var c,d,e={top:0,right:0,bottom:0,left:0},f=960,g=500,h=a.utils.defaultColor(),i=Math.floor(1e5*Math.random()),j=null,k=function(a){return a.x},l=function(a){return a.y},m="stack",n="zero",o="default",p="linear",q=!1,r=a.models.scatter(),s=250,t=d3.dispatch("areaClick","areaMouseover","areaMouseout","renderEnd","elementClick","elementMouseover","elementMouseout");r.pointSize(2.2).pointDomain([2.2,2.2]);var u=a.utils.renderWatch(t,s);return b.dispatch=t,b.scatter=r,r.dispatch.on("elementClick",function(){t.elementClick.apply(this,arguments)}),r.dispatch.on("elementMouseover",function(){t.elementMouseover.apply(this,arguments)}),r.dispatch.on("elementMouseout",function(){t.elementMouseout.apply(this,arguments)}),b.interpolate=function(a){return arguments.length?(p=a,b):p},b.duration=function(a){return arguments.length?(s=a,u.reset(s),r.duration(s),b):s},b.dispatch=t,b.scatter=r,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return f},set:function(a){f=a}},height:{get:function(){return g},set:function(a){g=a}},clipEdge:{get:function(){return q},set:function(a){q=a}},offset:{get:function(){return n},set:function(a){n=a}},order:{get:function(){return o},set:function(a){o=a}},interpolate:{get:function(){return p},set:function(a){p=a}},x:{get:function(){return k},set:function(a){k=d3.functor(a)}},y:{get:function(){return l},set:function(a){l=d3.functor(a)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}},color:{get:function(){return h},set:function(b){h=a.utils.getColor(b)}},style:{get:function(){return m},set:function(a){switch(m=a){case"stack":b.offset("zero"),b.order("default");break;case"stream":b.offset("wiggle"),b.order("inside-out");break;case"stream-center":b.offset("silhouette"),b.order("inside-out");break;case"expand":b.offset("expand"),b.order("default");break;case"stack_percent":b.offset(b.d3_stackedOffset_stackPercent),b.order("default")}}},duration:{get:function(){return s},set:function(a){s=a,u.reset(s),r.duration(s)}}}),a.utils.inheritOptions(b,r),a.utils.initOptions(b),b},a.models.stackedAreaChart=function(){"use strict";function b(k){return F.reset(),F.models(e),r&&F.models(f),s&&F.models(g),k.each(function(k){var x=d3.select(this),F=this;a.utils.initSVG(x);var K=a.utils.availableWidth(m,x,l),L=a.utils.availableHeight(n,x,l);if(b.update=function(){x.transition().duration(C).call(b)},b.container=this,v.setter(I(k),b.update).getter(H(k)).update(),v.disabled=k.map(function(a){return!!a.disabled}),!w){var M;w={};for(M in v)w[M]=v[M]instanceof Array?v[M].slice(0):v[M]}if(!(k&&k.length&&k.filter(function(a){return a.values.length}).length))return a.utils.noData(b,x),b;x.selectAll(".nv-noData").remove(),c=e.xScale(),d=e.yScale();var N=x.selectAll("g.nv-wrap.nv-stackedAreaChart").data([k]),O=N.enter().append("g").attr("class","nvd3 nv-wrap nv-stackedAreaChart").append("g"),P=N.select("g");if(O.append("rect").style("opacity",0),O.append("g").attr("class","nv-x nv-axis"),O.append("g").attr("class","nv-y nv-axis"),O.append("g").attr("class","nv-stackedWrap"),O.append("g").attr("class","nv-legendWrap"),O.append("g").attr("class","nv-controlsWrap"),O.append("g").attr("class","nv-interactive"),P.select("rect").attr("width",K).attr("height",L),q){var Q=p?K-z:K;h.width(Q),P.select(".nv-legendWrap").datum(k).call(h),l.top!=h.height()&&(l.top=h.height(),L=a.utils.availableHeight(n,x,l)),P.select(".nv-legendWrap").attr("transform","translate("+(K-Q)+","+-l.top+")")}if(p){var R=[{key:B.stacked||"Stacked",metaKey:"Stacked",disabled:"stack"!=e.style(),style:"stack"},{key:B.stream||"Stream",metaKey:"Stream",disabled:"stream"!=e.style(),style:"stream"},{key:B.expanded||"Expanded",metaKey:"Expanded",disabled:"expand"!=e.style(),style:"expand"},{key:B.stack_percent||"Stack %",metaKey:"Stack_Percent",disabled:"stack_percent"!=e.style(),style:"stack_percent"}];z=A.length/3*260,R=R.filter(function(a){return-1!==A.indexOf(a.metaKey)}),i.width(z).color(["#444","#444","#444"]),P.select(".nv-controlsWrap").datum(R).call(i),l.top!=Math.max(i.height(),h.height())&&(l.top=Math.max(i.height(),h.height()),L=a.utils.availableHeight(n,x,l)),P.select(".nv-controlsWrap").attr("transform","translate(0,"+-l.top+")")}N.attr("transform","translate("+l.left+","+l.top+")"),t&&P.select(".nv-y.nv-axis").attr("transform","translate("+K+",0)"),u&&(j.width(K).height(L).margin({left:l.left,top:l.top}).svgContainer(x).xScale(c),N.select(".nv-interactive").call(j)),e.width(K).height(L);var S=P.select(".nv-stackedWrap").datum(k);if(S.transition().call(e),r&&(f.scale(c)._ticks(a.utils.calcTicksX(K/100,k)).tickSize(-L,0),P.select(".nv-x.nv-axis").attr("transform","translate(0,"+L+")"),P.select(".nv-x.nv-axis").transition().duration(0).call(f)),s){var T;if(T="wiggle"===e.offset()?0:a.utils.calcTicksY(L/36,k),g.scale(d)._ticks(T).tickSize(-K,0),"expand"===e.style()||"stack_percent"===e.style()){var U=g.tickFormat();D&&U===J||(D=U),g.tickFormat(J)}else D&&(g.tickFormat(D),D=null);P.select(".nv-y.nv-axis").transition().duration(0).call(g)}e.dispatch.on("areaClick.toggle",function(a){k.forEach(1===k.filter(function(a){return!a.disabled}).length?function(a){a.disabled=!1}:function(b,c){b.disabled=c!=a.seriesIndex}),v.disabled=k.map(function(a){return!!a.disabled}),y.stateChange(v),b.update()}),h.dispatch.on("stateChange",function(a){for(var c in a)v[c]=a[c];y.stateChange(v),b.update()}),i.dispatch.on("legendClick",function(a){a.disabled&&(R=R.map(function(a){return a.disabled=!0,a}),a.disabled=!1,e.style(a.style),v.style=e.style(),y.stateChange(v),b.update())}),j.dispatch.on("elementMousemove",function(c){e.clearHighlights();var d,g,h,i=[];if(k.filter(function(a,b){return a.seriesIndex=b,!a.disabled}).forEach(function(f,j){g=a.interactiveBisect(f.values,c.pointXValue,b.x());var k=f.values[g],l=b.y()(k,g);if(null!=l&&e.highlightPoint(j,g,!0),"undefined"!=typeof k){"undefined"==typeof d&&(d=k),"undefined"==typeof h&&(h=b.xScale()(b.x()(k,g)));var m="expand"==e.style()?k.display.y:b.y()(k,g);i.push({key:f.key,value:m,color:o(f,f.seriesIndex),stackedValue:k.display})}}),i.reverse(),i.length>2){var m=b.yScale().invert(c.mouseY),n=null;i.forEach(function(a,b){m=Math.abs(m);var c=Math.abs(a.stackedValue.y0),d=Math.abs(a.stackedValue.y);return m>=c&&d+c>=m?void(n=b):void 0}),null!=n&&(i[n].highlight=!0)}var p=f.tickFormat()(b.x()(d,g)),q=j.tooltip.valueFormatter();"expand"===e.style()||"stack_percent"===e.style()?(E||(E=q),q=d3.format(".1%")):E&&(q=E,E=null),j.tooltip.position({left:h+l.left,top:c.mouseY+l.top}).chartContainer(F.parentNode).valueFormatter(q).data({value:p,series:i})(),j.renderGuideLine(h)}),j.dispatch.on("elementMouseout",function(){e.clearHighlights()}),y.on("changeState",function(a){"undefined"!=typeof a.disabled&&k.length===a.disabled.length&&(k.forEach(function(b,c){b.disabled=a.disabled[c]}),v.disabled=a.disabled),"undefined"!=typeof a.style&&(e.style(a.style),G=a.style),b.update()})}),F.renderEnd("stacked Area chart immediate"),b}var c,d,e=a.models.stackedArea(),f=a.models.axis(),g=a.models.axis(),h=a.models.legend(),i=a.models.legend(),j=a.interactiveGuideline(),k=a.models.tooltip(),l={top:30,right:25,bottom:50,left:60},m=null,n=null,o=a.utils.defaultColor(),p=!0,q=!0,r=!0,s=!0,t=!1,u=!1,v=a.utils.state(),w=null,x=null,y=d3.dispatch("stateChange","changeState","renderEnd"),z=250,A=["Stacked","Stream","Expanded"],B={},C=250;v.style=e.style(),f.orient("bottom").tickPadding(7),g.orient(t?"right":"left"),k.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)}),j.tooltip.headerFormatter(function(a,b){return f.tickFormat()(a,b)}).valueFormatter(function(a,b){return g.tickFormat()(a,b)});var D=null,E=null;i.updateState(!1);var F=a.utils.renderWatch(y),G=e.style(),H=function(a){return function(){return{active:a.map(function(a){return!a.disabled}),style:e.style()}}},I=function(a){return function(b){void 0!==b.style&&(G=b.style),void 0!==b.active&&a.forEach(function(a,c){a.disabled=!b.active[c]})}},J=d3.format("%");return e.dispatch.on("elementMouseover.tooltip",function(a){a.point.x=e.x()(a.point),a.point.y=e.y()(a.point),k.data(a).position(a.pos).hidden(!1)}),e.dispatch.on("elementMouseout.tooltip",function(){k.hidden(!0)}),b.dispatch=y,b.stacked=e,b.legend=h,b.controls=i,b.xAxis=f,b.yAxis=g,b.interactiveLayer=j,b.tooltip=k,b.dispatch=y,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return m},set:function(a){m=a}},height:{get:function(){return n},set:function(a){n=a}},showLegend:{get:function(){return q},set:function(a){q=a}},showXAxis:{get:function(){return r},set:function(a){r=a}},showYAxis:{get:function(){return s},set:function(a){s=a}},defaultState:{get:function(){return w},set:function(a){w=a}},noData:{get:function(){return x},set:function(a){x=a}},showControls:{get:function(){return p},set:function(a){p=a}},controlLabels:{get:function(){return B},set:function(a){B=a}},controlOptions:{get:function(){return A},set:function(a){A=a}},tooltips:{get:function(){return k.enabled()},set:function(b){a.deprecated("tooltips","use chart.tooltip.enabled() instead"),k.enabled(!!b)}},tooltipContent:{get:function(){return k.contentGenerator()},set:function(b){a.deprecated("tooltipContent","use chart.tooltip.contentGenerator() instead"),k.contentGenerator(b)}},margin:{get:function(){return l},set:function(a){l.top=void 0!==a.top?a.top:l.top,l.right=void 0!==a.right?a.right:l.right,l.bottom=void 0!==a.bottom?a.bottom:l.bottom,l.left=void 0!==a.left?a.left:l.left}},duration:{get:function(){return C},set:function(a){C=a,F.reset(C),e.duration(C),f.duration(C),g.duration(C)}},color:{get:function(){return o},set:function(b){o=a.utils.getColor(b),h.color(o),e.color(o)}},rightAlignYAxis:{get:function(){return t},set:function(a){t=a,g.orient(t?"right":"left")}},useInteractiveGuideline:{get:function(){return u},set:function(a){u=!!a,b.interactive(!a),b.useVoronoi(!a),e.scatter.interactive(!a)}}}),a.utils.inheritOptions(b,e),a.utils.initOptions(b),b},a.models.sunburst=function(){"use strict";function b(u){return t.reset(),u.each(function(b){function t(a){a.x0=a.x,a.dx0=a.dx}function u(a){var b=d3.interpolate(p.domain(),[a.x,a.x+a.dx]),c=d3.interpolate(q.domain(),[a.y,1]),d=d3.interpolate(q.range(),[a.y?20:0,y]);return function(a,e){return e?function(){return s(a)}:function(e){return p.domain(b(e)),q.domain(c(e)).range(d(e)),s(a)}}}l=d3.select(this);var v,w=a.utils.availableWidth(g,l,f),x=a.utils.availableHeight(h,l,f),y=Math.min(w,x)/2;a.utils.initSVG(l);var z=l.selectAll(".nv-wrap.nv-sunburst").data(b),A=z.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburst nv-chart-"+k),B=A.selectAll("nv-sunburst");z.attr("transform","translate("+w/2+","+x/2+")"),l.on("click",function(a,b){o.chartClick({data:a,index:b,pos:d3.event,id:k})}),q.range([0,y]),c=c||b,e=b[0],r.value(j[i]||j.count),v=B.data(r.nodes).enter().append("path").attr("d",s).style("fill",function(a){return m((a.children?a:a.parent).name)}).style("stroke","#FFF").on("click",function(a){d!==c&&c!==a&&(d=c),c=a,v.transition().duration(n).attrTween("d",u(a))}).each(t).on("dblclick",function(a){d.parent==a&&v.transition().duration(n).attrTween("d",u(e))}).each(t).on("mouseover",function(a){d3.select(this).classed("hover",!0).style("opacity",.8),o.elementMouseover({data:a,color:d3.select(this).style("fill")})}).on("mouseout",function(a){d3.select(this).classed("hover",!1).style("opacity",1),o.elementMouseout({data:a})}).on("mousemove",function(a){o.elementMousemove({data:a})})}),t.renderEnd("sunburst immediate"),b}var c,d,e,f={top:0,right:0,bottom:0,left:0},g=null,h=null,i="count",j={count:function(){return 1},size:function(a){return a.size}},k=Math.floor(1e4*Math.random()),l=null,m=a.utils.defaultColor(),n=500,o=d3.dispatch("chartClick","elementClick","elementDblClick","elementMousemove","elementMouseover","elementMouseout","renderEnd"),p=d3.scale.linear().range([0,2*Math.PI]),q=d3.scale.sqrt(),r=d3.layout.partition().sort(null).value(function(){return 1}),s=d3.svg.arc().startAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x)))}).endAngle(function(a){return Math.max(0,Math.min(2*Math.PI,p(a.x+a.dx)))}).innerRadius(function(a){return Math.max(0,q(a.y))}).outerRadius(function(a){return Math.max(0,q(a.y+a.dy))}),t=a.utils.renderWatch(o);return b.dispatch=o,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{width:{get:function(){return g},set:function(a){g=a}},height:{get:function(){return h},set:function(a){h=a}},mode:{get:function(){return i},set:function(a){i=a}},id:{get:function(){return k},set:function(a){k=a}},duration:{get:function(){return n},set:function(a){n=a}},margin:{get:function(){return f},set:function(a){f.top=void 0!=a.top?a.top:f.top,f.right=void 0!=a.right?a.right:f.right,f.bottom=void 0!=a.bottom?a.bottom:f.bottom,f.left=void 0!=a.left?a.left:f.left}},color:{get:function(){return m},set:function(b){m=a.utils.getColor(b)}}}),a.utils.initOptions(b),b},a.models.sunburstChart=function(){"use strict";function b(d){return m.reset(),m.models(c),d.each(function(d){var h=d3.select(this);a.utils.initSVG(h);var i=a.utils.availableWidth(f,h,e),j=a.utils.availableHeight(g,h,e);if(b.update=function(){0===k?h.call(b):h.transition().duration(k).call(b)},b.container=this,!d||!d.length)return a.utils.noData(b,h),b;h.selectAll(".nv-noData").remove();var l=h.selectAll("g.nv-wrap.nv-sunburstChart").data(d),m=l.enter().append("g").attr("class","nvd3 nv-wrap nv-sunburstChart").append("g"),n=l.select("g");m.append("g").attr("class","nv-sunburstWrap"),l.attr("transform","translate("+e.left+","+e.top+")"),c.width(i).height(j);var o=n.select(".nv-sunburstWrap").datum(d);d3.transition(o).call(c)}),m.renderEnd("sunburstChart immediate"),b}var c=a.models.sunburst(),d=a.models.tooltip(),e={top:30,right:20,bottom:20,left:20},f=null,g=null,h=a.utils.defaultColor(),i=(Math.round(1e5*Math.random()),null),j=null,k=250,l=d3.dispatch("tooltipShow","tooltipHide","stateChange","changeState","renderEnd"),m=a.utils.renderWatch(l);return d.headerEnabled(!1).duration(0).valueFormatter(function(a){return a}),c.dispatch.on("elementMouseover.tooltip",function(a){a.series={key:a.data.name,value:a.data.size,color:a.color},d.data(a).hidden(!1)}),c.dispatch.on("elementMouseout.tooltip",function(){d.hidden(!0)}),c.dispatch.on("elementMousemove.tooltip",function(){d.position({top:d3.event.pageY,left:d3.event.pageX})()}),b.dispatch=l,b.sunburst=c,b.tooltip=d,b.options=a.utils.optionsFunc.bind(b),b._options=Object.create({},{noData:{get:function(){return j},set:function(a){j=a}},defaultState:{get:function(){return i},set:function(a){i=a}},color:{get:function(){return h},set:function(a){h=a,c.color(h)}},duration:{get:function(){return k},set:function(a){k=a,m.reset(k),c.duration(k)}},margin:{get:function(){return e},set:function(a){e.top=void 0!==a.top?a.top:e.top,e.right=void 0!==a.right?a.right:e.right,e.bottom=void 0!==a.bottom?a.bottom:e.bottom,e.left=void 0!==a.left?a.left:e.left}}}),a.utils.inheritOptions(b,c),a.utils.initOptions(b),b},a.version="1.8.1"}(); \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js new file mode 100644 index 0000000000..36c2aeb998 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/js/popper.min.js @@ -0,0 +1,5 @@ +/* + Copyright (C) Federico Zivolo 2019 + Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). + */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=e.ownerDocument.defaultView,n=o.getComputedStyle(e,null);return t?n[t]:n}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?pe:10===e?se:pe||se}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent||null;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TH','TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1=o.clientWidth&&n>=o.clientHeight}),l=0a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),le({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=fe({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=Z,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!K(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-us[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=ee(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},le(n,m,$(v)),le(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case ge.FLIP:p=[n,i];break;case ge.CLOCKWISE:p=G(n);break;case ge.COUNTERCLOCKWISE:p=G(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=Z,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)f(l.top)||'bottom'===n&&f(a.top)f(o.right),g=f(a.top)f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,w=-1!==['top','bottom'].indexOf(n),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u),E=!!t.flipVariationsByContent&&(w&&'start'===r&&c||w&&'end'===r&&h||!w&&'start'===r&&u||!w&&'end'===r&&g),v=y||E;(m||b||v)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),v&&(r=z(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=fe({},e.offsets.popper,C(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport',flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!K(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=D(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottomo.right||t.top>o.bottom||t.rightwindow.devicePixelRatio||!me),c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=B('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==g?-1:1;m[c]=d*w,m[g]=s*y,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=fe({},E,e.attributes),e.styles=fe({},m,e.styles),e.arrowStyles=fe({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return V(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&V(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),V(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ue}); +//# sourceMappingURL=popper.min.js.map diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist new file mode 100644 index 0000000000..d8890ed279 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Html/Renderer/Template/method_item.html.dist @@ -0,0 +1,11 @@ + + {{name}} + {{methods_bar}} +
{{methods_tested_percent}}
+
{{methods_number}}
+ {{crap}} + {{lines_bar}} +
{{lines_executed_percent}}
+
{{lines_number}}
+ + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/PHP.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/PHP.php new file mode 100644 index 0000000000..73e2f4ddf1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/PHP.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\RuntimeException; + +/** + * Uses var_export() to write a SebastianBergmann\CodeCoverage\CodeCoverage object to a file. + */ +final class PHP +{ + /** + * @throws \SebastianBergmann\CodeCoverage\RuntimeException + */ + public function process(CodeCoverage $coverage, ?string $target = null): string + { + $filter = $coverage->filter(); + + $buffer = \sprintf( + 'setData(%s); +$coverage->setTests(%s); + +$filter = $coverage->filter(); +$filter->setWhitelistedFiles(%s); + +return $coverage;', + \var_export($coverage->getData(true), true), + \var_export($coverage->getTests(), true), + \var_export($filter->getWhitelistedFiles(), true) + ); + + if ($target !== null) { + if (!$this->createDirectory(\dirname($target))) { + throw new \RuntimeException(\sprintf('Directory "%s" was not created', \dirname($target))); + } + + if (@\file_put_contents($target, $buffer) === false) { + throw new RuntimeException( + \sprintf( + 'Could not write to "%s', + $target + ) + ); + } + } + + return $buffer; + } + + private function createDirectory(string $directory): bool + { + return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Text.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Text.php new file mode 100644 index 0000000000..9593a2285d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Text.php @@ -0,0 +1,283 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Node\File; +use SebastianBergmann\CodeCoverage\Util; + +/** + * Generates human readable output from a code coverage object. + * + * The output gets put into a text file our written to the CLI. + */ +final class Text +{ + /** + * @var string + */ + private const COLOR_GREEN = "\x1b[30;42m"; + + /** + * @var string + */ + private const COLOR_YELLOW = "\x1b[30;43m"; + + /** + * @var string + */ + private const COLOR_RED = "\x1b[37;41m"; + + /** + * @var string + */ + private const COLOR_HEADER = "\x1b[1;37;40m"; + + /** + * @var string + */ + private const COLOR_RESET = "\x1b[0m"; + + /** + * @var string + */ + private const COLOR_EOL = "\x1b[2K"; + + /** + * @var int + */ + private $lowUpperBound; + + /** + * @var int + */ + private $highLowerBound; + + /** + * @var bool + */ + private $showUncoveredFiles; + + /** + * @var bool + */ + private $showOnlySummary; + + public function __construct(int $lowUpperBound = 50, int $highLowerBound = 90, bool $showUncoveredFiles = false, bool $showOnlySummary = false) + { + $this->lowUpperBound = $lowUpperBound; + $this->highLowerBound = $highLowerBound; + $this->showUncoveredFiles = $showUncoveredFiles; + $this->showOnlySummary = $showOnlySummary; + } + + public function process(CodeCoverage $coverage, bool $showColors = false): string + { + $output = \PHP_EOL . \PHP_EOL; + $report = $coverage->getReport(); + + $colors = [ + 'header' => '', + 'classes' => '', + 'methods' => '', + 'lines' => '', + 'reset' => '', + 'eol' => '', + ]; + + if ($showColors) { + $colors['classes'] = $this->getCoverageColor( + $report->getNumTestedClassesAndTraits(), + $report->getNumClassesAndTraits() + ); + + $colors['methods'] = $this->getCoverageColor( + $report->getNumTestedMethods(), + $report->getNumMethods() + ); + + $colors['lines'] = $this->getCoverageColor( + $report->getNumExecutedLines(), + $report->getNumExecutableLines() + ); + + $colors['reset'] = self::COLOR_RESET; + $colors['header'] = self::COLOR_HEADER; + $colors['eol'] = self::COLOR_EOL; + } + + $classes = \sprintf( + ' Classes: %6s (%d/%d)', + Util::percent( + $report->getNumTestedClassesAndTraits(), + $report->getNumClassesAndTraits(), + true + ), + $report->getNumTestedClassesAndTraits(), + $report->getNumClassesAndTraits() + ); + + $methods = \sprintf( + ' Methods: %6s (%d/%d)', + Util::percent( + $report->getNumTestedMethods(), + $report->getNumMethods(), + true + ), + $report->getNumTestedMethods(), + $report->getNumMethods() + ); + + $lines = \sprintf( + ' Lines: %6s (%d/%d)', + Util::percent( + $report->getNumExecutedLines(), + $report->getNumExecutableLines(), + true + ), + $report->getNumExecutedLines(), + $report->getNumExecutableLines() + ); + + $padding = \max(\array_map('strlen', [$classes, $methods, $lines])); + + if ($this->showOnlySummary) { + $title = 'Code Coverage Report Summary:'; + $padding = \max($padding, \strlen($title)); + + $output .= $this->format($colors['header'], $padding, $title); + } else { + $date = \date(' Y-m-d H:i:s', $_SERVER['REQUEST_TIME']); + $title = 'Code Coverage Report:'; + + $output .= $this->format($colors['header'], $padding, $title); + $output .= $this->format($colors['header'], $padding, $date); + $output .= $this->format($colors['header'], $padding, ''); + $output .= $this->format($colors['header'], $padding, ' Summary:'); + } + + $output .= $this->format($colors['classes'], $padding, $classes); + $output .= $this->format($colors['methods'], $padding, $methods); + $output .= $this->format($colors['lines'], $padding, $lines); + + if ($this->showOnlySummary) { + return $output . \PHP_EOL; + } + + $classCoverage = []; + + foreach ($report as $item) { + if (!$item instanceof File) { + continue; + } + + $classes = $item->getClassesAndTraits(); + + foreach ($classes as $className => $class) { + $classStatements = 0; + $coveredClassStatements = 0; + $coveredMethods = 0; + $classMethods = 0; + + foreach ($class['methods'] as $method) { + if ($method['executableLines'] == 0) { + continue; + } + + $classMethods++; + $classStatements += $method['executableLines']; + $coveredClassStatements += $method['executedLines']; + + if ($method['coverage'] == 100) { + $coveredMethods++; + } + } + + $namespace = ''; + + if (!empty($class['package']['namespace'])) { + $namespace = '\\' . $class['package']['namespace'] . '::'; + } elseif (!empty($class['package']['fullPackage'])) { + $namespace = '@' . $class['package']['fullPackage'] . '::'; + } + + $classCoverage[$namespace . $className] = [ + 'namespace' => $namespace, + 'className ' => $className, + 'methodsCovered' => $coveredMethods, + 'methodCount' => $classMethods, + 'statementsCovered' => $coveredClassStatements, + 'statementCount' => $classStatements, + ]; + } + } + + \ksort($classCoverage); + + $methodColor = ''; + $linesColor = ''; + $resetColor = ''; + + foreach ($classCoverage as $fullQualifiedPath => $classInfo) { + if ($this->showUncoveredFiles || $classInfo['statementsCovered'] != 0) { + if ($showColors) { + $methodColor = $this->getCoverageColor($classInfo['methodsCovered'], $classInfo['methodCount']); + $linesColor = $this->getCoverageColor($classInfo['statementsCovered'], $classInfo['statementCount']); + $resetColor = $colors['reset']; + } + + $output .= \PHP_EOL . $fullQualifiedPath . \PHP_EOL + . ' ' . $methodColor . 'Methods: ' . $this->printCoverageCounts($classInfo['methodsCovered'], $classInfo['methodCount'], 2) . $resetColor . ' ' + . ' ' . $linesColor . 'Lines: ' . $this->printCoverageCounts($classInfo['statementsCovered'], $classInfo['statementCount'], 3) . $resetColor; + } + } + + return $output . \PHP_EOL; + } + + private function getCoverageColor(int $numberOfCoveredElements, int $totalNumberOfElements): string + { + $coverage = Util::percent( + $numberOfCoveredElements, + $totalNumberOfElements + ); + + if ($coverage >= $this->highLowerBound) { + return self::COLOR_GREEN; + } + + if ($coverage > $this->lowUpperBound) { + return self::COLOR_YELLOW; + } + + return self::COLOR_RED; + } + + private function printCoverageCounts(int $numberOfCoveredElements, int $totalNumberOfElements, int $precision): string + { + $format = '%' . $precision . 's'; + + return Util::percent( + $numberOfCoveredElements, + $totalNumberOfElements, + true, + true + ) . + ' (' . \sprintf($format, $numberOfCoveredElements) . '/' . + \sprintf($format, $totalNumberOfElements) . ')'; + } + + private function format($color, $padding, $string): string + { + $reset = $color ? self::COLOR_RESET : ''; + + return $color . \str_pad($string, $padding) . $reset . \PHP_EOL; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php new file mode 100644 index 0000000000..c12a5d2cfe --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/BuildInformation.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\Environment\Runtime; + +final class BuildInformation +{ + /** + * @var \DOMElement + */ + private $contextNode; + + public function __construct(\DOMElement $contextNode) + { + $this->contextNode = $contextNode; + } + + public function setRuntimeInformation(Runtime $runtime): void + { + $runtimeNode = $this->getNodeByName('runtime'); + + $runtimeNode->setAttribute('name', $runtime->getName()); + $runtimeNode->setAttribute('version', $runtime->getVersion()); + $runtimeNode->setAttribute('url', $runtime->getVendorUrl()); + + $driverNode = $this->getNodeByName('driver'); + + if ($runtime->hasPHPDBGCodeCoverage()) { + $driverNode->setAttribute('name', 'phpdbg'); + $driverNode->setAttribute('version', \constant('PHPDBG_VERSION')); + } + + if ($runtime->hasXdebug()) { + $driverNode->setAttribute('name', 'xdebug'); + $driverNode->setAttribute('version', \phpversion('xdebug')); + } + + if ($runtime->hasPCOV()) { + $driverNode->setAttribute('name', 'pcov'); + $driverNode->setAttribute('version', \phpversion('pcov')); + } + } + + public function setBuildTime(\DateTime $date): void + { + $this->contextNode->setAttribute('time', $date->format('D M j G:i:s T Y')); + } + + public function setGeneratorVersions(string $phpUnitVersion, string $coverageVersion): void + { + $this->contextNode->setAttribute('phpunit', $phpUnitVersion); + $this->contextNode->setAttribute('coverage', $coverageVersion); + } + + private function getNodeByName(string $name): \DOMElement + { + $node = $this->contextNode->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + $name + )->item(0); + + if (!$node) { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + $name + ) + ); + } + + return $node; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php new file mode 100644 index 0000000000..996a6196a5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Coverage.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\CodeCoverage\RuntimeException; + +final class Coverage +{ + /** + * @var \XMLWriter + */ + private $writer; + + /** + * @var \DOMElement + */ + private $contextNode; + + /** + * @var bool + */ + private $finalized = false; + + public function __construct(\DOMElement $context, string $line) + { + $this->contextNode = $context; + + $this->writer = new \XMLWriter(); + $this->writer->openMemory(); + $this->writer->startElementNS(null, $context->nodeName, 'https://schema.phpunit.de/coverage/1.0'); + $this->writer->writeAttribute('nr', $line); + } + + /** + * @throws RuntimeException + */ + public function addTest(string $test): void + { + if ($this->finalized) { + throw new RuntimeException('Coverage Report already finalized'); + } + + $this->writer->startElement('covered'); + $this->writer->writeAttribute('by', $test); + $this->writer->endElement(); + } + + public function finalize(): void + { + $this->writer->endElement(); + + $fragment = $this->contextNode->ownerDocument->createDocumentFragment(); + $fragment->appendXML($this->writer->outputMemory()); + + $this->contextNode->parentNode->replaceChild( + $fragment, + $this->contextNode + ); + + $this->finalized = true; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php new file mode 100644 index 0000000000..b1823214c4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Directory.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +final class Directory extends Node +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php new file mode 100644 index 0000000000..c908a15076 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Facade.php @@ -0,0 +1,287 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Node\AbstractNode; +use SebastianBergmann\CodeCoverage\Node\Directory as DirectoryNode; +use SebastianBergmann\CodeCoverage\Node\File as FileNode; +use SebastianBergmann\CodeCoverage\RuntimeException; +use SebastianBergmann\CodeCoverage\Version; +use SebastianBergmann\Environment\Runtime; + +final class Facade +{ + /** + * @var string + */ + private $target; + + /** + * @var Project + */ + private $project; + + /** + * @var string + */ + private $phpUnitVersion; + + public function __construct(string $version) + { + $this->phpUnitVersion = $version; + } + + /** + * @throws RuntimeException + */ + public function process(CodeCoverage $coverage, string $target): void + { + if (\substr($target, -1, 1) !== \DIRECTORY_SEPARATOR) { + $target .= \DIRECTORY_SEPARATOR; + } + + $this->target = $target; + $this->initTargetDirectory($target); + + $report = $coverage->getReport(); + + $this->project = new Project( + $coverage->getReport()->getName() + ); + + $this->setBuildInformation(); + $this->processTests($coverage->getTests()); + $this->processDirectory($report, $this->project); + + $this->saveDocument($this->project->asDom(), 'index'); + } + + private function setBuildInformation(): void + { + $buildNode = $this->project->getBuildInformation(); + $buildNode->setRuntimeInformation(new Runtime()); + $buildNode->setBuildTime(\DateTime::createFromFormat('U', (string) $_SERVER['REQUEST_TIME'])); + $buildNode->setGeneratorVersions($this->phpUnitVersion, Version::id()); + } + + /** + * @throws RuntimeException + */ + private function initTargetDirectory(string $directory): void + { + if (\file_exists($directory)) { + if (!\is_dir($directory)) { + throw new RuntimeException( + "'$directory' exists but is not a directory." + ); + } + + if (!\is_writable($directory)) { + throw new RuntimeException( + "'$directory' exists but is not writable." + ); + } + } elseif (!$this->createDirectory($directory)) { + throw new RuntimeException( + "'$directory' could not be created." + ); + } + } + + private function processDirectory(DirectoryNode $directory, Node $context): void + { + $directoryName = $directory->getName(); + + if ($this->project->getProjectSourceDirectory() === $directoryName) { + $directoryName = '/'; + } + + $directoryObject = $context->addDirectory($directoryName); + + $this->setTotals($directory, $directoryObject->getTotals()); + + foreach ($directory->getDirectories() as $node) { + $this->processDirectory($node, $directoryObject); + } + + foreach ($directory->getFiles() as $node) { + $this->processFile($node, $directoryObject); + } + } + + /** + * @throws RuntimeException + */ + private function processFile(FileNode $file, Directory $context): void + { + $fileObject = $context->addFile( + $file->getName(), + $file->getId() . '.xml' + ); + + $this->setTotals($file, $fileObject->getTotals()); + + $path = \substr( + $file->getPath(), + \strlen($this->project->getProjectSourceDirectory()) + ); + + $fileReport = new Report($path); + + $this->setTotals($file, $fileReport->getTotals()); + + foreach ($file->getClassesAndTraits() as $unit) { + $this->processUnit($unit, $fileReport); + } + + foreach ($file->getFunctions() as $function) { + $this->processFunction($function, $fileReport); + } + + foreach ($file->getCoverageData() as $line => $tests) { + if (!\is_array($tests) || \count($tests) === 0) { + continue; + } + + $coverage = $fileReport->getLineCoverage((string) $line); + + foreach ($tests as $test) { + $coverage->addTest($test); + } + + $coverage->finalize(); + } + + $fileReport->getSource()->setSourceCode( + \file_get_contents($file->getPath()) + ); + + $this->saveDocument($fileReport->asDom(), $file->getId()); + } + + private function processUnit(array $unit, Report $report): void + { + if (isset($unit['className'])) { + $unitObject = $report->getClassObject($unit['className']); + } else { + $unitObject = $report->getTraitObject($unit['traitName']); + } + + $unitObject->setLines( + $unit['startLine'], + $unit['executableLines'], + $unit['executedLines'] + ); + + $unitObject->setCrap((float) $unit['crap']); + + $unitObject->setPackage( + $unit['package']['fullPackage'], + $unit['package']['package'], + $unit['package']['subpackage'], + $unit['package']['category'] + ); + + $unitObject->setNamespace($unit['package']['namespace']); + + foreach ($unit['methods'] as $method) { + $methodObject = $unitObject->addMethod($method['methodName']); + $methodObject->setSignature($method['signature']); + $methodObject->setLines((string) $method['startLine'], (string) $method['endLine']); + $methodObject->setCrap($method['crap']); + $methodObject->setTotals( + (string) $method['executableLines'], + (string) $method['executedLines'], + (string) $method['coverage'] + ); + } + } + + private function processFunction(array $function, Report $report): void + { + $functionObject = $report->getFunctionObject($function['functionName']); + + $functionObject->setSignature($function['signature']); + $functionObject->setLines((string) $function['startLine']); + $functionObject->setCrap($function['crap']); + $functionObject->setTotals((string) $function['executableLines'], (string) $function['executedLines'], (string) $function['coverage']); + } + + private function processTests(array $tests): void + { + $testsObject = $this->project->getTests(); + + foreach ($tests as $test => $result) { + if ($test === 'UNCOVERED_FILES_FROM_WHITELIST') { + continue; + } + + $testsObject->addTest($test, $result); + } + } + + private function setTotals(AbstractNode $node, Totals $totals): void + { + $loc = $node->getLinesOfCode(); + + $totals->setNumLines( + $loc['loc'], + $loc['cloc'], + $loc['ncloc'], + $node->getNumExecutableLines(), + $node->getNumExecutedLines() + ); + + $totals->setNumClasses( + $node->getNumClasses(), + $node->getNumTestedClasses() + ); + + $totals->setNumTraits( + $node->getNumTraits(), + $node->getNumTestedTraits() + ); + + $totals->setNumMethods( + $node->getNumMethods(), + $node->getNumTestedMethods() + ); + + $totals->setNumFunctions( + $node->getNumFunctions(), + $node->getNumTestedFunctions() + ); + } + + private function getTargetDirectory(): string + { + return $this->target; + } + + /** + * @throws RuntimeException + */ + private function saveDocument(\DOMDocument $document, string $name): void + { + $filename = \sprintf('%s/%s.xml', $this->getTargetDirectory(), $name); + + $document->formatOutput = true; + $document->preserveWhiteSpace = false; + $this->initTargetDirectory(\dirname($filename)); + + $document->save($filename); + } + + private function createDirectory(string $directory): bool + { + return !(!\is_dir($directory) && !@\mkdir($directory, 0777, true) && !\is_dir($directory)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php new file mode 100644 index 0000000000..02af644771 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/File.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +class File +{ + /** + * @var \DOMDocument + */ + private $dom; + + /** + * @var \DOMElement + */ + private $contextNode; + + public function __construct(\DOMElement $context) + { + $this->dom = $context->ownerDocument; + $this->contextNode = $context; + } + + public function getTotals(): Totals + { + $totalsContainer = $this->contextNode->firstChild; + + if (!$totalsContainer) { + $totalsContainer = $this->contextNode->appendChild( + $this->dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'totals' + ) + ); + } + + return new Totals($totalsContainer); + } + + public function getLineCoverage(string $line): Coverage + { + $coverage = $this->contextNode->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'coverage' + )->item(0); + + if (!$coverage) { + $coverage = $this->contextNode->appendChild( + $this->dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'coverage' + ) + ); + } + + $lineNode = $coverage->appendChild( + $this->dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'line' + ) + ); + + return new Coverage($lineNode, $line); + } + + protected function getContextNode(): \DOMElement + { + return $this->contextNode; + } + + protected function getDomDocument(): \DOMDocument + { + return $this->dom; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php new file mode 100644 index 0000000000..b6a7f16028 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Method.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +final class Method +{ + /** + * @var \DOMElement + */ + private $contextNode; + + public function __construct(\DOMElement $context, string $name) + { + $this->contextNode = $context; + + $this->setName($name); + } + + public function setSignature(string $signature): void + { + $this->contextNode->setAttribute('signature', $signature); + } + + public function setLines(string $start, ?string $end = null): void + { + $this->contextNode->setAttribute('start', $start); + + if ($end !== null) { + $this->contextNode->setAttribute('end', $end); + } + } + + public function setTotals(string $executable, string $executed, string $coverage): void + { + $this->contextNode->setAttribute('executable', $executable); + $this->contextNode->setAttribute('executed', $executed); + $this->contextNode->setAttribute('coverage', $coverage); + } + + public function setCrap(string $crap): void + { + $this->contextNode->setAttribute('crap', $crap); + } + + private function setName(string $name): void + { + $this->contextNode->setAttribute('name', $name); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php new file mode 100644 index 0000000000..d3ba223a55 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Node.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +abstract class Node +{ + /** + * @var \DOMDocument + */ + private $dom; + + /** + * @var \DOMElement + */ + private $contextNode; + + public function __construct(\DOMElement $context) + { + $this->setContextNode($context); + } + + public function getDom(): \DOMDocument + { + return $this->dom; + } + + public function getTotals(): Totals + { + $totalsContainer = $this->getContextNode()->firstChild; + + if (!$totalsContainer) { + $totalsContainer = $this->getContextNode()->appendChild( + $this->dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'totals' + ) + ); + } + + return new Totals($totalsContainer); + } + + public function addDirectory(string $name): Directory + { + $dirNode = $this->getDom()->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'directory' + ); + + $dirNode->setAttribute('name', $name); + $this->getContextNode()->appendChild($dirNode); + + return new Directory($dirNode); + } + + public function addFile(string $name, string $href): File + { + $fileNode = $this->getDom()->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'file' + ); + + $fileNode->setAttribute('name', $name); + $fileNode->setAttribute('href', $href); + $this->getContextNode()->appendChild($fileNode); + + return new File($fileNode); + } + + protected function setContextNode(\DOMElement $context): void + { + $this->dom = $context->ownerDocument; + $this->contextNode = $context; + } + + protected function getContextNode(): \DOMElement + { + return $this->contextNode; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php new file mode 100644 index 0000000000..5f32852f8e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Project.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +final class Project extends Node +{ + public function __construct(string $directory) + { + $this->init(); + $this->setProjectSourceDirectory($directory); + } + + public function getProjectSourceDirectory(): string + { + return $this->getContextNode()->getAttribute('source'); + } + + public function getBuildInformation(): BuildInformation + { + $buildNode = $this->getDom()->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'build' + )->item(0); + + if (!$buildNode) { + $buildNode = $this->getDom()->documentElement->appendChild( + $this->getDom()->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'build' + ) + ); + } + + return new BuildInformation($buildNode); + } + + public function getTests(): Tests + { + $testsNode = $this->getContextNode()->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'tests' + )->item(0); + + if (!$testsNode) { + $testsNode = $this->getContextNode()->appendChild( + $this->getDom()->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'tests' + ) + ); + } + + return new Tests($testsNode); + } + + public function asDom(): \DOMDocument + { + return $this->getDom(); + } + + private function init(): void + { + $dom = new \DOMDocument; + $dom->loadXML(''); + + $this->setContextNode( + $dom->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'project' + )->item(0) + ); + } + + private function setProjectSourceDirectory(string $name): void + { + $this->getContextNode()->setAttribute('source', $name); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php new file mode 100644 index 0000000000..6ec94c1000 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Report.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +final class Report extends File +{ + public function __construct(string $name) + { + $dom = new \DOMDocument(); + $dom->loadXML(''); + + $contextNode = $dom->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'file' + )->item(0); + + parent::__construct($contextNode); + + $this->setName($name); + } + + public function asDom(): \DOMDocument + { + return $this->getDomDocument(); + } + + public function getFunctionObject($name): Method + { + $node = $this->getContextNode()->appendChild( + $this->getDomDocument()->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'function' + ) + ); + + return new Method($node, $name); + } + + public function getClassObject($name): Unit + { + return $this->getUnitObject('class', $name); + } + + public function getTraitObject($name): Unit + { + return $this->getUnitObject('trait', $name); + } + + public function getSource(): Source + { + $source = $this->getContextNode()->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'source' + )->item(0); + + if (!$source) { + $source = $this->getContextNode()->appendChild( + $this->getDomDocument()->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'source' + ) + ); + } + + return new Source($source); + } + + private function setName($name): void + { + $this->getContextNode()->setAttribute('name', \basename($name)); + $this->getContextNode()->setAttribute('path', \dirname($name)); + } + + private function getUnitObject($tagName, $name): Unit + { + $node = $this->getContextNode()->appendChild( + $this->getDomDocument()->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + $tagName + ) + ); + + return new Unit($node, $name); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php new file mode 100644 index 0000000000..67bf9cb9b2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Source.php @@ -0,0 +1,38 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use TheSeer\Tokenizer\NamespaceUri; +use TheSeer\Tokenizer\Tokenizer; +use TheSeer\Tokenizer\XMLSerializer; + +final class Source +{ + /** @var \DOMElement */ + private $context; + + public function __construct(\DOMElement $context) + { + $this->context = $context; + } + + public function setSourceCode(string $source): void + { + $context = $this->context; + + $tokens = (new Tokenizer())->parse($source); + $srcDom = (new XMLSerializer(new NamespaceUri($context->namespaceURI)))->toDom($tokens); + + $context->parentNode->replaceChild( + $context->ownerDocument->importNode($srcDom->documentElement, true), + $context + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php new file mode 100644 index 0000000000..c1bcd25d96 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Tests.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +final class Tests +{ + private $contextNode; + + private $codeMap = [ + -1 => 'UNKNOWN', // PHPUnit_Runner_BaseTestRunner::STATUS_UNKNOWN + 0 => 'PASSED', // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED + 1 => 'SKIPPED', // PHPUnit_Runner_BaseTestRunner::STATUS_SKIPPED + 2 => 'INCOMPLETE', // PHPUnit_Runner_BaseTestRunner::STATUS_INCOMPLETE + 3 => 'FAILURE', // PHPUnit_Runner_BaseTestRunner::STATUS_FAILURE + 4 => 'ERROR', // PHPUnit_Runner_BaseTestRunner::STATUS_ERROR + 5 => 'RISKY', // PHPUnit_Runner_BaseTestRunner::STATUS_RISKY + 6 => 'WARNING', // PHPUnit_Runner_BaseTestRunner::STATUS_WARNING + ]; + + public function __construct(\DOMElement $context) + { + $this->contextNode = $context; + } + + public function addTest(string $test, array $result): void + { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'test' + ) + ); + + $node->setAttribute('name', $test); + $node->setAttribute('size', $result['size']); + $node->setAttribute('result', (string) $result['status']); + $node->setAttribute('status', $this->codeMap[(int) $result['status']]); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php new file mode 100644 index 0000000000..019f348cbc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Totals.php @@ -0,0 +1,140 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\CodeCoverage\Util; + +final class Totals +{ + /** + * @var \DOMNode + */ + private $container; + + /** + * @var \DOMElement + */ + private $linesNode; + + /** + * @var \DOMElement + */ + private $methodsNode; + + /** + * @var \DOMElement + */ + private $functionsNode; + + /** + * @var \DOMElement + */ + private $classesNode; + + /** + * @var \DOMElement + */ + private $traitsNode; + + public function __construct(\DOMElement $container) + { + $this->container = $container; + $dom = $container->ownerDocument; + + $this->linesNode = $dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'lines' + ); + + $this->methodsNode = $dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'methods' + ); + + $this->functionsNode = $dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'functions' + ); + + $this->classesNode = $dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'classes' + ); + + $this->traitsNode = $dom->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'traits' + ); + + $container->appendChild($this->linesNode); + $container->appendChild($this->methodsNode); + $container->appendChild($this->functionsNode); + $container->appendChild($this->classesNode); + $container->appendChild($this->traitsNode); + } + + public function getContainer(): \DOMNode + { + return $this->container; + } + + public function setNumLines(int $loc, int $cloc, int $ncloc, int $executable, int $executed): void + { + $this->linesNode->setAttribute('total', (string) $loc); + $this->linesNode->setAttribute('comments', (string) $cloc); + $this->linesNode->setAttribute('code', (string) $ncloc); + $this->linesNode->setAttribute('executable', (string) $executable); + $this->linesNode->setAttribute('executed', (string) $executed); + $this->linesNode->setAttribute( + 'percent', + $executable === 0 ? '0' : \sprintf('%01.2F', Util::percent($executed, $executable)) + ); + } + + public function setNumClasses(int $count, int $tested): void + { + $this->classesNode->setAttribute('count', (string) $count); + $this->classesNode->setAttribute('tested', (string) $tested); + $this->classesNode->setAttribute( + 'percent', + $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) + ); + } + + public function setNumTraits(int $count, int $tested): void + { + $this->traitsNode->setAttribute('count', (string) $count); + $this->traitsNode->setAttribute('tested', (string) $tested); + $this->traitsNode->setAttribute( + 'percent', + $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) + ); + } + + public function setNumMethods(int $count, int $tested): void + { + $this->methodsNode->setAttribute('count', (string) $count); + $this->methodsNode->setAttribute('tested', (string) $tested); + $this->methodsNode->setAttribute( + 'percent', + $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) + ); + } + + public function setNumFunctions(int $count, int $tested): void + { + $this->functionsNode->setAttribute('count', (string) $count); + $this->functionsNode->setAttribute('tested', (string) $tested); + $this->functionsNode->setAttribute( + 'percent', + $count === 0 ? '0' : \sprintf('%01.2F', Util::percent($tested, $count)) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php new file mode 100644 index 0000000000..c235dfb6c3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Report/Xml/Unit.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +final class Unit +{ + /** + * @var \DOMElement + */ + private $contextNode; + + public function __construct(\DOMElement $context, string $name) + { + $this->contextNode = $context; + + $this->setName($name); + } + + public function setLines(int $start, int $executable, int $executed): void + { + $this->contextNode->setAttribute('start', (string) $start); + $this->contextNode->setAttribute('executable', (string) $executable); + $this->contextNode->setAttribute('executed', (string) $executed); + } + + public function setCrap(float $crap): void + { + $this->contextNode->setAttribute('crap', (string) $crap); + } + + public function setPackage(string $full, string $package, string $sub, string $category): void + { + $node = $this->contextNode->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'package' + )->item(0); + + if (!$node) { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'package' + ) + ); + } + + $node->setAttribute('full', $full); + $node->setAttribute('name', $package); + $node->setAttribute('sub', $sub); + $node->setAttribute('category', $category); + } + + public function setNamespace(string $namespace): void + { + $node = $this->contextNode->getElementsByTagNameNS( + 'https://schema.phpunit.de/coverage/1.0', + 'namespace' + )->item(0); + + if (!$node) { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'namespace' + ) + ); + } + + $node->setAttribute('name', $namespace); + } + + public function addMethod(string $name): Method + { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS( + 'https://schema.phpunit.de/coverage/1.0', + 'method' + ) + ); + + return new Method($node, $name); + } + + private function setName(string $name): void + { + $this->contextNode->setAttribute('name', $name); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Util.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Util.php new file mode 100644 index 0000000000..ee8894c14c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Util.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage; + +/** + * Utility methods. + */ +final class Util +{ + /** + * @return float|int|string + */ + public static function percent(float $a, float $b, bool $asString = false, bool $fixedWidth = false) + { + if ($asString && $b == 0) { + return ''; + } + + $percent = 100; + + if ($b > 0) { + $percent = ($a / $b) * 100; + } + + if ($asString) { + $format = $fixedWidth ? '%6.2F%%' : '%01.2F%%'; + + return \sprintf($format, $percent); + } + + return $percent; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Version.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Version.php new file mode 100644 index 0000000000..1c193fe045 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/src/Version.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage; + +use SebastianBergmann\Version as VersionId; + +final class Version +{ + /** + * @var string + */ + private static $version; + + public static function id(): string + { + if (self::$version === null) { + $version = new VersionId('7.0.14', \dirname(__DIR__)); + self::$version = $version->getVersion(); + } + + return self::$version; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/TestCase.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/TestCase.php new file mode 100644 index 0000000000..6a9824e88c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/TestCase.php @@ -0,0 +1,395 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\CodeCoverage; + +use SebastianBergmann\CodeCoverage\Driver\Driver; +use SebastianBergmann\CodeCoverage\Report\Xml\Coverage; + +abstract class TestCase extends \PHPUnit\Framework\TestCase +{ + protected static $TEST_TMP_PATH; + + public static function setUpBeforeClass(): void + { + self::$TEST_TMP_PATH = TEST_FILES_PATH . 'tmp'; + } + + protected function getXdebugDataForBankAccount() + { + return [ + [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 8 => 1, + 9 => -2, + 13 => -1, + 14 => -1, + 15 => -1, + 16 => -1, + 18 => -1, + 22 => -1, + 24 => -1, + 25 => -2, + 29 => -1, + 31 => -1, + 32 => -2 + ] + ], + [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 8 => 1, + 13 => 1, + 16 => 1, + 29 => 1, + ] + ], + [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 8 => 1, + 13 => 1, + 16 => 1, + 22 => 1, + ] + ], + [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 8 => 1, + 13 => 1, + 14 => 1, + 15 => 1, + 18 => 1, + 22 => 1, + 24 => 1, + 29 => 1, + 31 => 1, + ] + ] + ]; + } + + protected function getCoverageForBankAccount(): CodeCoverage + { + $data = $this->getXdebugDataForBankAccount(); + + $stub = $this->createMock(Driver::class); + + $stub->expects($this->any()) + ->method('stop') + ->will($this->onConsecutiveCalls( + $data[0], + $data[1], + $data[2], + $data[3] + )); + + $filter = new Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); + + $coverage = new CodeCoverage($stub, $filter); + + $coverage->start( + new \BankAccountTest('testBalanceIsInitiallyZero'), + true + ); + + $coverage->stop( + true, + [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)] + ); + + $coverage->start( + new \BankAccountTest('testBalanceCannotBecomeNegative') + ); + + $coverage->stop( + true, + [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)] + ); + + $coverage->start( + new \BankAccountTest('testBalanceCannotBecomeNegative2') + ); + + $coverage->stop( + true, + [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)] + ); + + $coverage->start( + new \BankAccountTest('testDepositWithdrawMoney') + ); + + $coverage->stop( + true, + [ + TEST_FILES_PATH . 'BankAccount.php' => array_merge( + range(6, 9), + range(20, 25), + range(27, 32) + ) + ] + ); + + return $coverage; + } + + protected function getCoverageForBankAccountForFirstTwoTests(): CodeCoverage + { + $data = $this->getXdebugDataForBankAccount(); + + $stub = $this->createMock(Driver::class); + + $stub->expects($this->any()) + ->method('stop') + ->will($this->onConsecutiveCalls( + $data[0], + $data[1] + )); + + $filter = new Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); + + $coverage = new CodeCoverage($stub, $filter); + + $coverage->start( + new \BankAccountTest('testBalanceIsInitiallyZero'), + true + ); + + $coverage->stop( + true, + [TEST_FILES_PATH . 'BankAccount.php' => range(6, 9)] + ); + + $coverage->start( + new \BankAccountTest('testBalanceCannotBecomeNegative') + ); + + $coverage->stop( + true, + [TEST_FILES_PATH . 'BankAccount.php' => range(27, 32)] + ); + + return $coverage; + } + + protected function getCoverageForBankAccountForLastTwoTests() + { + $data = $this->getXdebugDataForBankAccount(); + + $stub = $this->createMock(Driver::class); + + $stub->expects($this->any()) + ->method('stop') + ->will($this->onConsecutiveCalls( + $data[2], + $data[3] + )); + + $filter = new Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'BankAccount.php'); + + $coverage = new CodeCoverage($stub, $filter); + + $coverage->start( + new \BankAccountTest('testBalanceCannotBecomeNegative2') + ); + + $coverage->stop( + true, + [TEST_FILES_PATH . 'BankAccount.php' => range(20, 25)] + ); + + $coverage->start( + new \BankAccountTest('testDepositWithdrawMoney') + ); + + $coverage->stop( + true, + [ + TEST_FILES_PATH . 'BankAccount.php' => array_merge( + range(6, 9), + range(20, 25), + range(27, 32) + ) + ] + ); + + return $coverage; + } + + protected function getExpectedDataArrayForBankAccount(): array + { + return [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 8 => [ + 0 => 'BankAccountTest::testBalanceIsInitiallyZero', + 1 => 'BankAccountTest::testDepositWithdrawMoney' + ], + 9 => null, + 13 => [], + 14 => [], + 15 => [], + 16 => [], + 18 => [], + 22 => [ + 0 => 'BankAccountTest::testBalanceCannotBecomeNegative2', + 1 => 'BankAccountTest::testDepositWithdrawMoney' + ], + 24 => [ + 0 => 'BankAccountTest::testDepositWithdrawMoney', + ], + 25 => null, + 29 => [ + 0 => 'BankAccountTest::testBalanceCannotBecomeNegative', + 1 => 'BankAccountTest::testDepositWithdrawMoney' + ], + 31 => [ + 0 => 'BankAccountTest::testDepositWithdrawMoney' + ], + 32 => null + ] + ]; + } + + protected function getExpectedDataArrayForBankAccountInReverseOrder(): array + { + return [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 8 => [ + 0 => 'BankAccountTest::testDepositWithdrawMoney', + 1 => 'BankAccountTest::testBalanceIsInitiallyZero' + ], + 9 => null, + 13 => [], + 14 => [], + 15 => [], + 16 => [], + 18 => [], + 22 => [ + 0 => 'BankAccountTest::testBalanceCannotBecomeNegative2', + 1 => 'BankAccountTest::testDepositWithdrawMoney' + ], + 24 => [ + 0 => 'BankAccountTest::testDepositWithdrawMoney', + ], + 25 => null, + 29 => [ + 0 => 'BankAccountTest::testDepositWithdrawMoney', + 1 => 'BankAccountTest::testBalanceCannotBecomeNegative' + ], + 31 => [ + 0 => 'BankAccountTest::testDepositWithdrawMoney' + ], + 32 => null + ] + ]; + } + + protected function getCoverageForFileWithIgnoredLines(): CodeCoverage + { + $filter = new Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_ignore.php'); + + $coverage = new CodeCoverage( + $this->setUpXdebugStubForFileWithIgnoredLines(), + $filter + ); + + $coverage->start('FileWithIgnoredLines', true); + $coverage->stop(); + + return $coverage; + } + + protected function setUpXdebugStubForFileWithIgnoredLines(): Driver + { + $stub = $this->createMock(Driver::class); + + $stub->expects($this->any()) + ->method('stop') + ->will($this->returnValue( + [ + TEST_FILES_PATH . 'source_with_ignore.php' => [ + 2 => 1, + 4 => -1, + 6 => -1, + 7 => 1 + ] + ] + )); + + return $stub; + } + + protected function getCoverageForClassWithAnonymousFunction(): CodeCoverage + { + $filter = new Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php'); + + $coverage = new CodeCoverage( + $this->setUpXdebugStubForClassWithAnonymousFunction(), + $filter + ); + + $coverage->start('ClassWithAnonymousFunction', true); + $coverage->stop(); + + return $coverage; + } + + protected function setUpXdebugStubForClassWithAnonymousFunction(): Driver + { + $stub = $this->createMock(Driver::class); + + $stub->expects($this->any()) + ->method('stop') + ->will($this->returnValue( + [ + TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' => [ + 7 => 1, + 9 => 1, + 10 => -1, + 11 => 1, + 12 => 1, + 13 => 1, + 14 => 1, + 17 => 1, + 18 => 1 + ] + ] + )); + + return $stub; + } + + protected function getCoverageForCrashParsing(): CodeCoverage + { + $filter = new Filter; + $filter->addFileToWhitelist(TEST_FILES_PATH . 'Crash.php'); + + // This is a file with invalid syntax, so it isn't executed. + return new CodeCoverage( + $this->setUpXdebugStubForCrashParsing(), + $filter + ); + } + + protected function setUpXdebugStubForCrashParsing(): Driver + { + $stub = $this->createMock(Driver::class); + + $stub->expects($this->any()) + ->method('stop') + ->will($this->returnValue([])); + return $stub; + } + +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml new file mode 100644 index 0000000000..2f11d819c7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-clover.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml new file mode 100644 index 0000000000..f2f56eabba --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-crap4j.xml @@ -0,0 +1,59 @@ + + + BankAccount + %s + + Method Crap Stats + 4 + 0 + 0 + 9 + 0 + + + + global + BankAccount + getBalance + getBalance() + getBalance() + 1 + 1 + 100 + 0 + + + global + BankAccount + setBalance + setBalance($balance) + setBalance($balance) + 6 + 2 + 0 + 0 + + + global + BankAccount + depositMoney + depositMoney($balance) + depositMoney($balance) + 1 + 1 + 100 + 0 + + + global + BankAccount + withdrawMoney + withdrawMoney($balance) + withdrawMoney($balance) + 1 + 1 + 100 + 0 + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt new file mode 100644 index 0000000000..892d83464c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount-text.txt @@ -0,0 +1,12 @@ + + +Code Coverage Report: + %s + + Summary: + Classes: 0.00% (0/1) + Methods: 75.00% (3/4) + Lines: 50.00% (5/10) + +BankAccount + Methods: 75.00% ( 3/ 4) Lines: 50.00% ( 5/ 10) diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php new file mode 100644 index 0000000000..4238c1559c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccount.php @@ -0,0 +1,33 @@ +balance; + } + + protected function setBalance($balance) + { + if ($balance >= 0) { + $this->balance = $balance; + } else { + throw new RuntimeException; + } + } + + public function depositMoney($balance) + { + $this->setBalance($this->getBalance() + $balance); + + return $this->getBalance(); + } + + public function withdrawMoney($balance) + { + $this->setBalance($this->getBalance() - $balance); + + return $this->getBalance(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php new file mode 100644 index 0000000000..803c892acd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/BankAccountTest.php @@ -0,0 +1,66 @@ +ba = new BankAccount; + } + + /** + * @covers BankAccount::getBalance + */ + public function testBalanceIsInitiallyZero() + { + $this->assertEquals(0, $this->ba->getBalance()); + } + + /** + * @covers BankAccount::withdrawMoney + */ + public function testBalanceCannotBecomeNegative() + { + try { + $this->ba->withdrawMoney(1); + } catch (RuntimeException $e) { + $this->assertEquals(0, $this->ba->getBalance()); + + return; + } + + $this->fail(); + } + + /** + * @covers BankAccount::depositMoney + */ + public function testBalanceCannotBecomeNegative2() + { + try { + $this->ba->depositMoney(-1); + } catch (RuntimeException $e) { + $this->assertEquals(0, $this->ba->getBalance()); + + return; + } + + $this->fail(); + } + + /** + * @covers BankAccount::getBalance + * @covers BankAccount::depositMoney + * @covers BankAccount::withdrawMoney + */ + public function testDepositWithdrawMoney() + { + $this->assertEquals(0, $this->ba->getBalance()); + $this->ba->depositMoney(1); + $this->assertEquals(1, $this->ba->getBalance()); + $this->ba->withdrawMoney(1); + $this->assertEquals(0, $this->ba->getBalance()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php new file mode 100644 index 0000000000..e6d496e4ac --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassExtendedTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php new file mode 100644 index 0000000000..baa04d8c7d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageClassTest.php @@ -0,0 +1,14 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php new file mode 100644 index 0000000000..560e381758 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageFunctionParenthesesTest.php @@ -0,0 +1,13 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php new file mode 100644 index 0000000000..b624ed95a1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesTest.php @@ -0,0 +1,14 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php new file mode 100644 index 0000000000..20d2e751ac --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodParenthesesWhitespaceTest.php @@ -0,0 +1,14 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php new file mode 100644 index 0000000000..fb7a88277d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageMethodTest.php @@ -0,0 +1,14 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php new file mode 100644 index 0000000000..d8d9cae672 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNoneTest.php @@ -0,0 +1,11 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php new file mode 100644 index 0000000000..e98efd8537 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPrivateTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php new file mode 100644 index 0000000000..7c9c488cf2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotProtectedTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php new file mode 100644 index 0000000000..202724a05b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNotPublicTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php new file mode 100644 index 0000000000..4e1c0d0f56 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageNothingTest.php @@ -0,0 +1,15 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php new file mode 100644 index 0000000000..849c3480d4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePrivateTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php new file mode 100644 index 0000000000..6ae3544ca0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageProtectedTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php new file mode 100644 index 0000000000..d977090ccd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveragePublicTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php new file mode 100644 index 0000000000..06949cb7e1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoverageTwoDefaultClassAnnotations.php @@ -0,0 +1,17 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } + +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php new file mode 100644 index 0000000000..f382ce99b5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredClass.php @@ -0,0 +1,36 @@ +privateMethod(); + } + + public function publicMethod() + { + $this->protectedMethod(); + } +} + +class CoveredClass extends CoveredParentClass +{ + private function privateMethod() + { + } + + protected function protectedMethod() + { + parent::protectedMethod(); + $this->privateMethod(); + } + + public function publicMethod() + { + parent::publicMethod(); + $this->protectedMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php new file mode 100644 index 0000000000..9989eb02ed --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/CoveredFunction.php @@ -0,0 +1,4 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php new file mode 100644 index 0000000000..2b91f1fdd7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageClassTest.php @@ -0,0 +1,14 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php new file mode 100644 index 0000000000..d3bc1a93b0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassPublicTest.php @@ -0,0 +1,17 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php new file mode 100644 index 0000000000..67752dd9c5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageCoversClassTest.php @@ -0,0 +1,22 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php new file mode 100644 index 0000000000..f83ae5f0e5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageMethodTest.php @@ -0,0 +1,14 @@ +publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php new file mode 100644 index 0000000000..b4983c7476 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPrivateTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php new file mode 100644 index 0000000000..ceb7b35bf9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotProtectedTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php new file mode 100644 index 0000000000..60aff7a018 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageNotPublicTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php new file mode 100644 index 0000000000..d5eb77ec02 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePrivateTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php new file mode 100644 index 0000000000..6a6eaca47e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoverageProtectedTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php new file mode 100644 index 0000000000..f32803ecf8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveragePublicTest.php @@ -0,0 +1,14 @@ + + */ + public function testSomething() + { + $o = new Foo\CoveredClass; + $o->publicMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php new file mode 100644 index 0000000000..5bd0ddfb23 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NamespaceCoveredClass.php @@ -0,0 +1,38 @@ +privateMethod(); + } + + public function publicMethod() + { + $this->protectedMethod(); + } +} + +class CoveredClass extends CoveredParentClass +{ + private function privateMethod() + { + } + + protected function protectedMethod() + { + parent::protectedMethod(); + $this->privateMethod(); + } + + public function publicMethod() + { + parent::publicMethod(); + $this->protectedMethod(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php new file mode 100644 index 0000000000..0836a8c84a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/NotExistingCoveredElementTest.php @@ -0,0 +1,26 @@ + + */ + public function testThree() + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html new file mode 100644 index 0000000000..467602ee9d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/BankAccount.php.html @@ -0,0 +1,249 @@ + + + + + Code Coverage for %s%eBankAccount.php + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
CRAP
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
BankAccount
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
8.12
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
 getBalance
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
 setBalance
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
6
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 5
 depositMoney
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
 withdrawMoney
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
1
+
+ 100.00% covered (success) +
+
+
100.00%
2 / 2
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<?php
class BankAccount
{
    protected $balance = 0;
    public function getBalance()
    {
        return $this->balance;
    }
    protected function setBalance($balance)
    {
        if ($balance >= 0) {
            $this->balance = $balance;
        } else {
            throw new RuntimeException;
        }
    }
    public function depositMoney($balance)
    {
        $this->setBalance($this->getBalance() + $balance);
        return $this->getBalance();
    }
    public function withdrawMoney($balance)
    {
        $this->setBalance($this->getBalance() - $balance);
        return $this->getBalance();
    }
}
+ +
+ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html new file mode 100644 index 0000000000..e47929fbd5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/dashboard.html @@ -0,0 +1,287 @@ + + + + + Dashboard for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+

Classes

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
ClassCoverage
BankAccount50%
+
+
+
+

Project Risks

+
+ + + + + + + + + + + +
ClassCRAP
BankAccount8
+
+
+
+
+
+

Methods

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
MethodCoverage
setBalance0%
+
+
+
+

Project Risks

+
+ + + + + + + + + + + +
MethodCRAP
setBalance6
+
+
+
+ +
+ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html new file mode 100644 index 0000000000..e0c9ed9d9b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForBankAccount/index.html @@ -0,0 +1,118 @@ + + + + + Code Coverage for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
BankAccount.php
+
+ 50.00% covered (danger) +
+
+
50.00%
5 / 10
+
+ 75.00% covered (warning) +
+
+
75.00%
3 / 4
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+
+
+

Legend

+

+ Low: 0% to 50% + Medium: 50% to 90% + High: 90% to 100% +

+

+ Generated by php-code-coverage %s using %s at %s. +

+
+
+ + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html new file mode 100644 index 0000000000..8b27809c7f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/dashboard.html @@ -0,0 +1,285 @@ + + + + + Dashboard for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+

Classes

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
ClassCoverage
CoveredClassWithAnonymousFunctionInStaticMethod87%
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
ClassCRAP
+
+
+
+
+
+

Methods

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + + +
MethodCoverage
runAnonymous87%
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
MethodCRAP
+
+
+
+ +
+ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html new file mode 100644 index 0000000000..68318d0552 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/index.html @@ -0,0 +1,118 @@ + + + + + Code Coverage for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
source_with_class_and_anonymous_function.php
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+
+
+

Legend

+

+ Low: 0% to 50% + Medium: 50% to 90% + High: 90% to 100% +

+

+ Generated by php-code-coverage %s using %s at %s. +

+
+
+ + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html new file mode 100644 index 0000000000..c261c6e1ef --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.html @@ -0,0 +1,172 @@ + + + + + Code Coverage for %s%esource_with_class_and_anonymous_function.php + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
CRAP
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
CoveredClassWithAnonymousFunctionInStaticMethod
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
1.00
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
 runAnonymous
+
+ 0.00% covered (danger) +
+
+
0.00%
0 / 1
1.00
+
+ 87.50% covered (warning) +
+
+
87.50%
7 / 8
+
+ + + + + + + + + + + + + + + + + + + + + + + +
<?php
class CoveredClassWithAnonymousFunctionInStaticMethod
{
    public static function runAnonymous()
    {
        $filter = ['abc124', 'abc123', '123'];
        array_walk(
            $filter,
            function (&$val, $key) {
                $val = preg_replace('|[^0-9]|', '', $val);
            }
        );
        // Should be covered
        $extravar = true;
    }
}
+ +
+ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html new file mode 100644 index 0000000000..4cf93adb5d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/dashboard.html @@ -0,0 +1,283 @@ + + + + + Dashboard for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+
+

Classes

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + +
ClassCoverage
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
ClassCRAP
+
+
+
+
+
+

Methods

+
+
+
+
+

Coverage Distribution

+
+ +
+
+
+

Complexity

+
+ +
+
+
+
+
+

Insufficient Coverage

+
+ + + + + + + + + + +
MethodCoverage
+
+
+
+

Project Risks

+
+ + + + + + + + + + +
MethodCRAP
+
+
+
+ +
+ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html new file mode 100644 index 0000000000..7d4cfffce3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/index.html @@ -0,0 +1,108 @@ + + + + + Code Coverage for %s + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
n/a
0 / 0
source_with_ignore.php
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
n/a
0 / 0
+
+
+
+

Legend

+

+ Low: 0% to 50% + Medium: 50% to 90% + High: 90% to 100% +

+

+ Generated by php-code-coverage %s using %s at %s. +

+
+
+ + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html new file mode 100644 index 0000000000..a18a5aa561 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/HTML/CoverageForFileWithIgnoredLines/source_with_ignore.php.html @@ -0,0 +1,196 @@ + + + + + Code Coverage for %s%esource_with_ignore.php + + + + + + + +
+
+
+
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
n/a
0 / 0
+
+ 100.00% covered (success) +
+
+
100.00%
1 / 1
CRAP
+
+ 50.00% covered (danger) +
+
+
50.00%
1 / 2
baz
n/a
0 / 0
1
n/a
0 / 0
Foo
n/a
0 / 0
n/a
0 / 0
1
n/a
0 / 0
 bar
n/a
0 / 0
1
n/a
0 / 0
Bar
n/a
0 / 0
n/a
0 / 0
1
n/a
0 / 0
 foo
n/a
0 / 0
1
n/a
0 / 0
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
<?php
if ($neverHappens) {
    // @codeCoverageIgnoreStart
    print '*';
    // @codeCoverageIgnoreEnd
}
/**
 * @codeCoverageIgnore
 */
class Foo
{
    public function bar()
    {
    }
}
class Bar
{
    /**
     * @codeCoverageIgnore
     */
    public function foo()
    {
    }
}
function baz()
{
    print '*'; // @codeCoverageIgnore
}
interface Bor
{
    public function foo();
}
+ +
+ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml new file mode 100644 index 0000000000..238548b086 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/BankAccount.php.xml @@ -0,0 +1,262 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?php + + + class + + BankAccount + + + { + + + + protected + + $balance + + = + + 0 + ; + + + + + public + + function + + getBalance + ( + ) + + + + { + + + + return + + $this + -> + balance + ; + + + + } + + + + + protected + + function + + setBalance + ( + $balance + ) + + + + { + + + + if + + ( + $balance + + >= + + 0 + ) + + { + + + + $this + -> + balance + + = + + $balance + ; + + + + } + + else + + { + + + + throw + + new + + RuntimeException + ; + + + + } + + + + } + + + + + public + + function + + depositMoney + ( + $balance + ) + + + + { + + + + $this + -> + setBalance + ( + $this + -> + getBalance + ( + ) + + + + + $balance + ) + ; + + + + + return + + $this + -> + getBalance + ( + ) + ; + + + + } + + + + + public + + function + + withdrawMoney + ( + $balance + ) + + + + { + + + + $this + -> + setBalance + ( + $this + -> + getBalance + ( + ) + + - + + $balance + ) + ; + + + + + return + + $this + -> + getBalance + ( + ) + ; + + + + } + + + } + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml new file mode 100644 index 0000000000..df433b0858 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForBankAccount/index.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml new file mode 100644 index 0000000000..c8d90baa92 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/index.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml new file mode 100644 index 0000000000..a4131745d1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForClassWithAnonymousFunction/source_with_class_and_anonymous_function.php.xml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?php + + + + class + + CoveredClassWithAnonymousFunctionInStaticMethod + + + { + + + + public + + static + + function + + runAnonymous + ( + ) + + + + { + + + + $filter + + = + + [ + 'abc124' + , + + 'abc123' + , + + '123' + ] + ; + + + + + array_walk + ( + + + + $filter + , + + + + function + + ( + & + $val + , + + $key + ) + + { + + + + $val + + = + + preg_replace + ( + '|[^0-9]|' + , + + '' + , + + $val + ) + ; + + + + } + + + + ) + ; + + + + + // Should be covered + + + + $extravar + + = + + true + ; + + + + } + + + } + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml new file mode 100644 index 0000000000..d44f97062f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/index.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml new file mode 100644 index 0000000000..5ff1d6b823 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/Report/XML/CoverageForFileWithIgnoredLines/source_with_ignore.php.xml @@ -0,0 +1,187 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <?php + + + if + + ( + $neverHappens + ) + + { + + + + // @codeCoverageIgnoreStart + + + + print + + '*' + ; + + + + // @codeCoverageIgnoreEnd + + + } + + + + /** + + + * @codeCoverageIgnore + + + */ + + + class + + Foo + + + { + + + + public + + function + + bar + ( + ) + + + + { + + + + } + + + } + + + + class + + Bar + + + { + + + + /** + + + * @codeCoverageIgnore + + + */ + + + + public + + function + + foo + ( + ) + + + + { + + + + } + + + } + + + + function + + baz + ( + ) + + + { + + + + print + + '*' + ; + + // @codeCoverageIgnore + + + } + + + + interface + + Bor + + + { + + + + public + + function + + foo + ( + ) + ; + + + + } + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml new file mode 100644 index 0000000000..008db55f17 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-clover.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml new file mode 100644 index 0000000000..5bd2535e19 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-crap4j.xml @@ -0,0 +1,26 @@ + + + CoverageForClassWithAnonymousFunction + %s + + Method Crap Stats + 1 + 0 + 0 + 1 + 0 + + + + global + CoveredClassWithAnonymousFunctionInStaticMethod + runAnonymous + runAnonymous() + runAnonymous() + 1 + 1 + 87.5 + 0 + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt new file mode 100644 index 0000000000..e4204cc647 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/class-with-anonymous-function-text.txt @@ -0,0 +1,12 @@ + + +Code Coverage Report: + %s + + Summary: + Classes: 0.00% (0/1) + Methods: 0.00% (0/1) + Lines: 87.50% (7/8) + +CoveredClassWithAnonymousFunctionInStaticMethod + Methods: 0.00% ( 0/ 1) Lines: 87.50% ( 7/ 8) diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml new file mode 100644 index 0000000000..efd38014af --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-clover.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml new file mode 100644 index 0000000000..2607b59acd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-crap4j.xml @@ -0,0 +1,37 @@ + + + CoverageForFileWithIgnoredLines + %s + + Method Crap Stats + 2 + 0 + 0 + 2 + 0 + + + + global + Foo + bar + bar() + bar() + 1 + 1 + 100 + 0 + + + global + Bar + foo + foo() + foo() + 1 + 1 + 100 + 0 + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt new file mode 100644 index 0000000000..6e8e1494ff --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/ignored-lines-text.txt @@ -0,0 +1,10 @@ + + +Code Coverage Report:%w + %s +%w + Summary:%w + Classes: (0/0) + Methods: (0/0) + Lines: 50.00% (1/2) + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php new file mode 100644 index 0000000000..72aa938e90 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_with_class_and_anonymous_function.php @@ -0,0 +1,19 @@ + 1, 'b' => 2, 'c' => 3, 'd' => 4], + static function ($v, $k) + { + return $k === 'b' || $v === 4; + }, + ARRAY_FILTER_USE_BOTH + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php new file mode 100644 index 0000000000..be4e83641c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/_files/source_without_ignore.php @@ -0,0 +1,4 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\Node\Builder; +use SebastianBergmann\CodeCoverage\TestCase; + +class BuilderTest extends TestCase +{ + protected $factory; + + protected function setUp(): void + { + $this->factory = new Builder; + } + + public function testSomething(): void + { + $root = $this->getCoverageForBankAccount()->getReport(); + + $expectedPath = \rtrim(TEST_FILES_PATH, \DIRECTORY_SEPARATOR); + $this->assertEquals($expectedPath, $root->getName()); + $this->assertEquals($expectedPath, $root->getPath()); + $this->assertEquals(10, $root->getNumExecutableLines()); + $this->assertEquals(5, $root->getNumExecutedLines()); + $this->assertEquals(1, $root->getNumClasses()); + $this->assertEquals(0, $root->getNumTestedClasses()); + $this->assertEquals(4, $root->getNumMethods()); + $this->assertEquals(3, $root->getNumTestedMethods()); + $this->assertEquals('0.00%', $root->getTestedClassesPercent()); + $this->assertEquals('75.00%', $root->getTestedMethodsPercent()); + $this->assertEquals('50.00%', $root->getLineExecutedPercent()); + $this->assertEquals(0, $root->getNumFunctions()); + $this->assertEquals(0, $root->getNumTestedFunctions()); + $this->assertNull($root->getParent()); + $this->assertEquals([], $root->getDirectories()); + #$this->assertEquals(array(), $root->getFiles()); + #$this->assertEquals(array(), $root->getChildNodes()); + + $this->assertEquals( + [ + 'BankAccount' => [ + 'methods' => [ + 'getBalance' => [ + 'signature' => 'getBalance()', + 'startLine' => 6, + 'endLine' => 9, + 'executableLines' => 1, + 'executedLines' => 1, + 'ccn' => 1, + 'coverage' => 100, + 'crap' => '1', + 'link' => 'BankAccount.php.html#6', + 'methodName' => 'getBalance', + 'visibility' => 'public', + ], + 'setBalance' => [ + 'signature' => 'setBalance($balance)', + 'startLine' => 11, + 'endLine' => 18, + 'executableLines' => 5, + 'executedLines' => 0, + 'ccn' => 2, + 'coverage' => 0, + 'crap' => 6, + 'link' => 'BankAccount.php.html#11', + 'methodName' => 'setBalance', + 'visibility' => 'protected', + ], + 'depositMoney' => [ + 'signature' => 'depositMoney($balance)', + 'startLine' => 20, + 'endLine' => 25, + 'executableLines' => 2, + 'executedLines' => 2, + 'ccn' => 1, + 'coverage' => 100, + 'crap' => '1', + 'link' => 'BankAccount.php.html#20', + 'methodName' => 'depositMoney', + 'visibility' => 'public', + ], + 'withdrawMoney' => [ + 'signature' => 'withdrawMoney($balance)', + 'startLine' => 27, + 'endLine' => 32, + 'executableLines' => 2, + 'executedLines' => 2, + 'ccn' => 1, + 'coverage' => 100, + 'crap' => '1', + 'link' => 'BankAccount.php.html#27', + 'methodName' => 'withdrawMoney', + 'visibility' => 'public', + ], + ], + 'startLine' => 2, + 'executableLines' => 10, + 'executedLines' => 5, + 'ccn' => 5, + 'coverage' => 50, + 'crap' => '8.12', + 'package' => [ + 'namespace' => '', + 'fullPackage' => '', + 'category' => '', + 'package' => '', + 'subpackage' => '', + ], + 'link' => 'BankAccount.php.html#2', + 'className' => 'BankAccount', + ], + ], + $root->getClasses() + ); + + $this->assertEquals([], $root->getFunctions()); + } + + public function testNotCrashParsing(): void + { + $coverage = $this->getCoverageForCrashParsing(); + $root = $coverage->getReport(); + + $expectedPath = \rtrim(TEST_FILES_PATH, \DIRECTORY_SEPARATOR); + $this->assertEquals($expectedPath, $root->getName()); + $this->assertEquals($expectedPath, $root->getPath()); + $this->assertEquals(2, $root->getNumExecutableLines()); + $this->assertEquals(0, $root->getNumExecutedLines()); + $data = $coverage->getData(); + $expectedFile = $expectedPath . \DIRECTORY_SEPARATOR . 'Crash.php'; + $this->assertSame([$expectedFile => [1 => [], 2 => []]], $data); + } + + public function testBuildDirectoryStructure(): void + { + $s = \DIRECTORY_SEPARATOR; + + $method = new \ReflectionMethod( + Builder::class, + 'buildDirectoryStructure' + ); + + $method->setAccessible(true); + + $this->assertEquals( + [ + 'src' => [ + 'Money.php/f' => [], + 'MoneyBag.php/f' => [], + 'Foo' => [ + 'Bar' => [ + 'Baz' => [ + 'Foo.php/f' => [], + ], + ], + ], + ], + ], + $method->invoke( + $this->factory, + [ + "src{$s}Money.php" => [], + "src{$s}MoneyBag.php" => [], + "src{$s}Foo{$s}Bar{$s}Baz{$s}Foo.php" => [], + ] + ) + ); + } + + /** + * @dataProvider reducePathsProvider + */ + public function testReducePaths($reducedPaths, $commonPath, $paths): void + { + $method = new \ReflectionMethod( + Builder::class, + 'reducePaths' + ); + + $method->setAccessible(true); + + $_commonPath = $method->invokeArgs($this->factory, [&$paths]); + + $this->assertEquals($reducedPaths, $paths); + $this->assertEquals($commonPath, $_commonPath); + } + + public function reducePathsProvider() + { + $s = \DIRECTORY_SEPARATOR; + + yield [ + [], + '.', + [], + ]; + + $prefixes = ["C:$s", "$s"]; + + foreach ($prefixes as $p) { + yield [ + [ + 'Money.php' => [], + ], + "{$p}home{$s}sb{$s}Money{$s}", + [ + "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], + ], + ]; + + yield [ + [ + 'Money.php' => [], + 'MoneyBag.php' => [], + ], + "{$p}home{$s}sb{$s}Money", + [ + "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], + "{$p}home{$s}sb{$s}Money{$s}MoneyBag.php" => [], + ], + ]; + + yield [ + [ + 'Money.php' => [], + 'MoneyBag.php' => [], + "Cash.phar{$s}Cash.php" => [], + ], + "{$p}home{$s}sb{$s}Money", + [ + "{$p}home{$s}sb{$s}Money{$s}Money.php" => [], + "{$p}home{$s}sb{$s}Money{$s}MoneyBag.php" => [], + "phar://{$p}home{$s}sb{$s}Money{$s}Cash.phar{$s}Cash.php" => [], + ], + ]; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php new file mode 100644 index 0000000000..7fdbf7da6f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CloverTest.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\TestCase; + +/** + * @covers SebastianBergmann\CodeCoverage\Report\Clover + */ +class CloverTest extends TestCase +{ + public function testCloverForBankAccountTest(): void + { + $clover = new Clover; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'BankAccount-clover.xml', + $clover->process($this->getCoverageForBankAccount(), null, 'BankAccount') + ); + } + + public function testCloverForFileWithIgnoredLines(): void + { + $clover = new Clover; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'ignored-lines-clover.xml', + $clover->process($this->getCoverageForFileWithIgnoredLines()) + ); + } + + public function testCloverForClassWithAnonymousFunction(): void + { + $clover = new Clover; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'class-with-anonymous-function-clover.xml', + $clover->process($this->getCoverageForClassWithAnonymousFunction()) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php new file mode 100644 index 0000000000..ce2471ae56 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/CodeCoverageTest.php @@ -0,0 +1,359 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage; + +use SebastianBergmann\CodeCoverage\Driver\Driver; +use SebastianBergmann\Environment\Runtime; + +/** + * @covers SebastianBergmann\CodeCoverage\CodeCoverage + */ +class CodeCoverageTest extends TestCase +{ + /** + * @var CodeCoverage + */ + private $coverage; + + protected function setUp(): void + { + $runtime = new Runtime; + + if (!$runtime->canCollectCodeCoverage()) { + $this->markTestSkipped('No code coverage driver available'); + } + + $this->coverage = new CodeCoverage; + } + + public function testCannotStopWithInvalidSecondArgument(): void + { + $this->expectException(Exception::class); + + $this->coverage->stop(true, null); + } + + public function testCannotAppendWithInvalidArgument(): void + { + $this->expectException(Exception::class); + + $this->coverage->append([], null); + } + + public function testCollect(): void + { + $coverage = $this->getCoverageForBankAccount(); + + $this->assertEquals( + $this->getExpectedDataArrayForBankAccount(), + $coverage->getData() + ); + + $this->assertEquals( + [ + 'BankAccountTest::testBalanceIsInitiallyZero' => ['size' => 'unknown', 'status' => -1], + 'BankAccountTest::testBalanceCannotBecomeNegative' => ['size' => 'unknown', 'status' => -1], + 'BankAccountTest::testBalanceCannotBecomeNegative2' => ['size' => 'unknown', 'status' => -1], + 'BankAccountTest::testDepositWithdrawMoney' => ['size' => 'unknown', 'status' => -1], + ], + $coverage->getTests() + ); + } + + public function testMerge(): void + { + $coverage = $this->getCoverageForBankAccountForFirstTwoTests(); + $coverage->merge($this->getCoverageForBankAccountForLastTwoTests()); + + $this->assertEquals( + $this->getExpectedDataArrayForBankAccount(), + $coverage->getData() + ); + } + + public function testMergeReverseOrder(): void + { + $coverage = $this->getCoverageForBankAccountForLastTwoTests(); + $coverage->merge($this->getCoverageForBankAccountForFirstTwoTests()); + + $this->assertEquals( + $this->getExpectedDataArrayForBankAccountInReverseOrder(), + $coverage->getData() + ); + } + + public function testMerge2(): void + { + $coverage = new CodeCoverage( + $this->createMock(Driver::class), + new Filter + ); + + $coverage->merge($this->getCoverageForBankAccount()); + + $this->assertEquals( + $this->getExpectedDataArrayForBankAccount(), + $coverage->getData() + ); + } + + public function testGetLinesToBeIgnored(): void + { + $this->assertEquals( + [ + 1, + 3, + 4, + 5, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 30, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + ], + $this->getLinesToBeIgnored()->invoke( + $this->coverage, + TEST_FILES_PATH . 'source_with_ignore.php' + ) + ); + } + + public function testGetLinesToBeIgnored2(): void + { + $this->assertEquals( + [1, 5], + $this->getLinesToBeIgnored()->invoke( + $this->coverage, + TEST_FILES_PATH . 'source_without_ignore.php' + ) + ); + } + + public function testGetLinesToBeIgnored3(): void + { + $this->assertEquals( + [ + 1, + 2, + 3, + 4, + 5, + 8, + 11, + 15, + 16, + 19, + 20, + ], + $this->getLinesToBeIgnored()->invoke( + $this->coverage, + TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php' + ) + ); + } + + public function testGetLinesToBeIgnoredOneLineAnnotations(): void + { + $this->assertEquals( + [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 14, + 15, + 16, + 18, + 20, + 21, + 23, + 24, + 25, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 37, + ], + $this->getLinesToBeIgnored()->invoke( + $this->coverage, + TEST_FILES_PATH . 'source_with_oneline_annotations.php' + ) + ); + } + + public function testGetLinesToBeIgnoredWhenIgnoreIsDisabled(): void + { + $this->coverage->setDisableIgnoredLines(true); + + $this->assertEquals( + [ + 7, + 11, + 12, + 13, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 26, + 27, + 32, + 33, + 34, + 35, + 36, + 37, + ], + $this->getLinesToBeIgnored()->invoke( + $this->coverage, + TEST_FILES_PATH . 'source_with_ignore.php' + ) + ); + } + + public function testUseStatementsAreIgnored(): void + { + $this->assertEquals( + [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 13, + 16, + 23, + 24, + ], + $this->getLinesToBeIgnored()->invoke( + $this->coverage, + TEST_FILES_PATH . 'source_with_use_statements.php' + ) + ); + } + + public function testAppendThrowsExceptionIfCoveredCodeWasNotExecuted(): void + { + $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); + $this->coverage->setCheckForUnexecutedCoveredCode(true); + + $data = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 29 => -1, + 31 => -1, + ], + ]; + + $linesToBeCovered = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 22, + 24, + ], + ]; + + $linesToBeUsed = []; + + $this->expectException(CoveredCodeNotExecutedException::class); + + $this->coverage->append($data, 'File1.php', true, $linesToBeCovered, $linesToBeUsed); + } + + public function testAppendThrowsExceptionIfUsedCodeWasNotExecuted(): void + { + $this->coverage->filter()->addDirectoryToWhitelist(TEST_FILES_PATH); + $this->coverage->setCheckForUnexecutedCoveredCode(true); + + $data = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 29 => -1, + 31 => -1, + ], + ]; + + $linesToBeCovered = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 29, + 31, + ], + ]; + + $linesToBeUsed = [ + TEST_FILES_PATH . 'BankAccount.php' => [ + 22, + 24, + ], + ]; + + $this->expectException(CoveredCodeNotExecutedException::class); + + $this->coverage->append($data, 'File1.php', true, $linesToBeCovered, $linesToBeUsed); + } + + /** + * @return \ReflectionMethod + */ + private function getLinesToBeIgnored() + { + $getLinesToBeIgnored = new \ReflectionMethod( + 'SebastianBergmann\CodeCoverage\CodeCoverage', + 'getLinesToBeIgnored' + ); + + $getLinesToBeIgnored->setAccessible(true); + + return $getLinesToBeIgnored; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php new file mode 100644 index 0000000000..033fe4c748 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Crap4jTest.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\TestCase; + +/** + * @covers SebastianBergmann\CodeCoverage\Report\Crap4j + */ +class Crap4jTest extends TestCase +{ + public function testForBankAccountTest(): void + { + $crap4j = new Crap4j; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'BankAccount-crap4j.xml', + $crap4j->process($this->getCoverageForBankAccount(), null, 'BankAccount') + ); + } + + public function testForFileWithIgnoredLines(): void + { + $crap4j = new Crap4j; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'ignored-lines-crap4j.xml', + $crap4j->process($this->getCoverageForFileWithIgnoredLines(), null, 'CoverageForFileWithIgnoredLines') + ); + } + + public function testForClassWithAnonymousFunction(): void + { + $crap4j = new Crap4j; + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'class-with-anonymous-function-crap4j.xml', + $crap4j->process($this->getCoverageForClassWithAnonymousFunction(), null, 'CoverageForClassWithAnonymousFunction') + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php new file mode 100644 index 0000000000..dffc227418 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/Exception/UnintentionallyCoveredCodeExceptionTest.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\tests\Exception; + +use PHPUnit\Framework\TestCase; +use SebastianBergmann\CodeCoverage\RuntimeException; +use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; + +final class UnintentionallyCoveredCodeExceptionTest extends TestCase +{ + public function testCanConstructWithEmptyArray(): void + { + $unintentionallyCoveredUnits = []; + + $exception = new UnintentionallyCoveredCodeException($unintentionallyCoveredUnits); + + $this->assertInstanceOf(RuntimeException::class, $exception); + $this->assertSame($unintentionallyCoveredUnits, $exception->getUnintentionallyCoveredUnits()); + $this->assertSame('', $exception->getMessage()); + } + + public function testCanConstructWithNonEmptyArray(): void + { + $unintentionallyCoveredUnits = [ + 'foo', + 'bar', + 'baz', + ]; + + $exception = new UnintentionallyCoveredCodeException($unintentionallyCoveredUnits); + + $this->assertInstanceOf(RuntimeException::class, $exception); + $this->assertSame($unintentionallyCoveredUnits, $exception->getUnintentionallyCoveredUnits()); + + $expected = <<assertSame($expected, $exception->getMessage()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php new file mode 100644 index 0000000000..373b349291 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/FilterTest.php @@ -0,0 +1,213 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage; + +use PHPUnit\Framework\TestCase; +use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; + +class FilterTest extends TestCase +{ + /** + * @var Filter + */ + private $filter; + + /** + * @var array + */ + private $files = []; + + protected function setUp(): void + { + $this->filter = \unserialize('O:37:"SebastianBergmann\CodeCoverage\Filter":0:{}'); + + $this->files = [ + TEST_FILES_PATH . 'BankAccount.php', + TEST_FILES_PATH . 'BankAccountTest.php', + TEST_FILES_PATH . 'CoverageClassExtendedTest.php', + TEST_FILES_PATH . 'CoverageClassTest.php', + TEST_FILES_PATH . 'CoverageFunctionParenthesesTest.php', + TEST_FILES_PATH . 'CoverageFunctionParenthesesWhitespaceTest.php', + TEST_FILES_PATH . 'CoverageFunctionTest.php', + TEST_FILES_PATH . 'CoverageMethodOneLineAnnotationTest.php', + TEST_FILES_PATH . 'CoverageMethodParenthesesTest.php', + TEST_FILES_PATH . 'CoverageMethodParenthesesWhitespaceTest.php', + TEST_FILES_PATH . 'CoverageMethodTest.php', + TEST_FILES_PATH . 'CoverageNoneTest.php', + TEST_FILES_PATH . 'CoverageNotPrivateTest.php', + TEST_FILES_PATH . 'CoverageNotProtectedTest.php', + TEST_FILES_PATH . 'CoverageNotPublicTest.php', + TEST_FILES_PATH . 'CoverageNothingTest.php', + TEST_FILES_PATH . 'CoveragePrivateTest.php', + TEST_FILES_PATH . 'CoverageProtectedTest.php', + TEST_FILES_PATH . 'CoveragePublicTest.php', + TEST_FILES_PATH . 'CoverageTwoDefaultClassAnnotations.php', + TEST_FILES_PATH . 'CoveredClass.php', + TEST_FILES_PATH . 'CoveredFunction.php', + TEST_FILES_PATH . 'Crash.php', + TEST_FILES_PATH . 'NamespaceCoverageClassExtendedTest.php', + TEST_FILES_PATH . 'NamespaceCoverageClassTest.php', + TEST_FILES_PATH . 'NamespaceCoverageCoversClassPublicTest.php', + TEST_FILES_PATH . 'NamespaceCoverageCoversClassTest.php', + TEST_FILES_PATH . 'NamespaceCoverageMethodTest.php', + TEST_FILES_PATH . 'NamespaceCoverageNotPrivateTest.php', + TEST_FILES_PATH . 'NamespaceCoverageNotProtectedTest.php', + TEST_FILES_PATH . 'NamespaceCoverageNotPublicTest.php', + TEST_FILES_PATH . 'NamespaceCoveragePrivateTest.php', + TEST_FILES_PATH . 'NamespaceCoverageProtectedTest.php', + TEST_FILES_PATH . 'NamespaceCoveragePublicTest.php', + TEST_FILES_PATH . 'NamespaceCoveredClass.php', + TEST_FILES_PATH . 'NotExistingCoveredElementTest.php', + TEST_FILES_PATH . 'source_with_class_and_anonymous_function.php', + TEST_FILES_PATH . 'source_with_ignore.php', + TEST_FILES_PATH . 'source_with_namespace.php', + TEST_FILES_PATH . 'source_with_oneline_annotations.php', + TEST_FILES_PATH . 'source_with_use_statements.php', + TEST_FILES_PATH . 'source_without_ignore.php', + TEST_FILES_PATH . 'source_without_namespace.php', + ]; + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::addFileToWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist + */ + public function testAddingAFileToTheWhitelistWorks(): void + { + $this->filter->addFileToWhitelist($this->files[0]); + + $this->assertEquals( + [$this->files[0]], + $this->filter->getWhitelist() + ); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::removeFileFromWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist + */ + public function testRemovingAFileFromTheWhitelistWorks(): void + { + $this->filter->addFileToWhitelist($this->files[0]); + $this->filter->removeFileFromWhitelist($this->files[0]); + + $this->assertEquals([], $this->filter->getWhitelist()); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::addDirectoryToWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist + * @depends testAddingAFileToTheWhitelistWorks + */ + public function testAddingADirectoryToTheWhitelistWorks(): void + { + $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH); + + $whitelist = $this->filter->getWhitelist(); + \sort($whitelist); + + $this->assertEquals($this->files, $whitelist); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::addFilesToWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist + */ + public function testAddingFilesToTheWhitelistWorks(): void + { + $facade = new FileIteratorFacade; + + $files = $facade->getFilesAsArray( + TEST_FILES_PATH, + $suffixes = '.php' + ); + + $this->filter->addFilesToWhitelist($files); + + $whitelist = $this->filter->getWhitelist(); + \sort($whitelist); + + $this->assertEquals($this->files, $whitelist); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::removeDirectoryFromWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist + * @depends testAddingADirectoryToTheWhitelistWorks + */ + public function testRemovingADirectoryFromTheWhitelistWorks(): void + { + $this->filter->addDirectoryToWhitelist(TEST_FILES_PATH); + $this->filter->removeDirectoryFromWhitelist(TEST_FILES_PATH); + + $this->assertEquals([], $this->filter->getWhitelist()); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::isFile + */ + public function testIsFile(): void + { + $this->assertFalse($this->filter->isFile('vfs://root/a/path')); + $this->assertFalse($this->filter->isFile('xdebug://debug-eval')); + $this->assertFalse($this->filter->isFile('eval()\'d code')); + $this->assertFalse($this->filter->isFile('runtime-created function')); + $this->assertFalse($this->filter->isFile('assert code')); + $this->assertFalse($this->filter->isFile('regexp code')); + $this->assertTrue($this->filter->isFile(__FILE__)); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered + */ + public function testWhitelistedFileIsNotFiltered(): void + { + $this->filter->addFileToWhitelist($this->files[0]); + $this->assertFalse($this->filter->isFiltered($this->files[0])); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered + */ + public function testNotWhitelistedFileIsFiltered(): void + { + $this->filter->addFileToWhitelist($this->files[0]); + $this->assertTrue($this->filter->isFiltered($this->files[1])); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::isFiltered + * @covers SebastianBergmann\CodeCoverage\Filter::isFile + */ + public function testNonFilesAreFiltered(): void + { + $this->assertTrue($this->filter->isFiltered('vfs://root/a/path')); + $this->assertTrue($this->filter->isFiltered('xdebug://debug-eval')); + $this->assertTrue($this->filter->isFiltered('eval()\'d code')); + $this->assertTrue($this->filter->isFiltered('runtime-created function')); + $this->assertTrue($this->filter->isFiltered('assert code')); + $this->assertTrue($this->filter->isFiltered('regexp code')); + } + + /** + * @covers SebastianBergmann\CodeCoverage\Filter::addFileToWhitelist + * @covers SebastianBergmann\CodeCoverage\Filter::getWhitelist + * + * @ticket https://github.com/sebastianbergmann/php-code-coverage/issues/664 + */ + public function testTryingToAddFileThatDoesNotExistDoesNotChangeFilter(): void + { + $filter = new Filter; + + $filter->addFileToWhitelist('does_not_exist'); + + $this->assertEmpty($filter->getWhitelistedFiles()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php new file mode 100644 index 0000000000..0ddd85d66a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/HTMLTest.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Html; + +use SebastianBergmann\CodeCoverage\TestCase; + +class HTMLTest extends TestCase +{ + private static $TEST_REPORT_PATH_SOURCE; + + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + self::$TEST_REPORT_PATH_SOURCE = TEST_FILES_PATH . 'Report' . \DIRECTORY_SEPARATOR . 'HTML'; + } + + protected function tearDown(): void + { + parent::tearDown(); + + $tmpFilesIterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator(self::$TEST_TMP_PATH, \RecursiveDirectoryIterator::SKIP_DOTS), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ($tmpFilesIterator as $path => $fileInfo) { + /* @var \SplFileInfo $fileInfo */ + $pathname = $fileInfo->getPathname(); + $fileInfo->isDir() ? \rmdir($pathname) : \unlink($pathname); + } + } + + public function testForBankAccountTest(): void + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; + + $report = new Facade; + $report->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + public function testForFileWithIgnoredLines(): void + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; + + $report = new Facade; + $report->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + public function testForClassWithAnonymousFunction(): void + { + $expectedFilesPath = + self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; + + $report = new Facade; + $report->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @param string $expectedFilesPath + * @param string $actualFilesPath + */ + private function assertFilesEquals($expectedFilesPath, $actualFilesPath): void + { + $expectedFilesIterator = new \FilesystemIterator($expectedFilesPath); + $actualFilesIterator = new \RegexIterator(new \FilesystemIterator($actualFilesPath), '/.html/'); + + $this->assertEquals( + \iterator_count($expectedFilesIterator), + \iterator_count($actualFilesIterator), + 'Generated files and expected files not match' + ); + + foreach ($expectedFilesIterator as $path => $fileInfo) { + /* @var \SplFileInfo $fileInfo */ + $filename = $fileInfo->getFilename(); + + $actualFile = $actualFilesPath . \DIRECTORY_SEPARATOR . $filename; + + $this->assertFileExists($actualFile); + + $this->assertStringMatchesFormatFile( + $fileInfo->getPathname(), + \str_replace(\PHP_EOL, "\n", \file_get_contents($actualFile)), + "${filename} not match" + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/TextTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/TextTest.php new file mode 100644 index 0000000000..501226f8bf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/TextTest.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report; + +use SebastianBergmann\CodeCoverage\TestCase; + +/** + * @covers SebastianBergmann\CodeCoverage\Report\Text + */ +class TextTest extends TestCase +{ + public function testTextForBankAccountTest(): void + { + $text = new Text(50, 90, false, false); + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'BankAccount-text.txt', + \str_replace(\PHP_EOL, "\n", $text->process($this->getCoverageForBankAccount())) + ); + } + + public function testTextForFileWithIgnoredLines(): void + { + $text = new Text(50, 90, false, false); + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'ignored-lines-text.txt', + \str_replace(\PHP_EOL, "\n", $text->process($this->getCoverageForFileWithIgnoredLines())) + ); + } + + public function testTextForClassWithAnonymousFunction(): void + { + $text = new Text(50, 90, false, false); + + $this->assertStringMatchesFormatFile( + TEST_FILES_PATH . 'class-with-anonymous-function-text.txt', + \str_replace(\PHP_EOL, "\n", $text->process($this->getCoverageForClassWithAnonymousFunction())) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php new file mode 100644 index 0000000000..2ebfb61e7f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/UtilTest.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage; + +use PHPUnit\Framework\TestCase; + +/** + * @covers SebastianBergmann\CodeCoverage\Util + */ +class UtilTest extends TestCase +{ + public function testPercent(): void + { + $this->assertEquals(100, Util::percent(100, 0)); + $this->assertEquals(100, Util::percent(100, 100)); + $this->assertEquals( + '100.00%', + Util::percent(100, 100, true) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php new file mode 100644 index 0000000000..13045a74cd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-code-coverage/tests/tests/XmlTest.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\CodeCoverage\Report\Xml; + +use SebastianBergmann\CodeCoverage\TestCase; + +class XmlTest extends TestCase +{ + private static $TEST_REPORT_PATH_SOURCE; + + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + self::$TEST_REPORT_PATH_SOURCE = TEST_FILES_PATH . 'Report' . \DIRECTORY_SEPARATOR . 'XML'; + } + + protected function tearDown(): void + { + parent::tearDown(); + + $tmpFilesIterator = new \FilesystemIterator(self::$TEST_TMP_PATH); + + foreach ($tmpFilesIterator as $path => $fileInfo) { + /* @var \SplFileInfo $fileInfo */ + \unlink($fileInfo->getPathname()); + } + } + + public function testForBankAccountTest(): void + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForBankAccount'; + + $xml = new Facade('1.0.0'); + $xml->process($this->getCoverageForBankAccount(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + public function testForFileWithIgnoredLines(): void + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForFileWithIgnoredLines'; + + $xml = new Facade('1.0.0'); + $xml->process($this->getCoverageForFileWithIgnoredLines(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + public function testForClassWithAnonymousFunction(): void + { + $expectedFilesPath = self::$TEST_REPORT_PATH_SOURCE . \DIRECTORY_SEPARATOR . 'CoverageForClassWithAnonymousFunction'; + + $xml = new Facade('1.0.0'); + $xml->process($this->getCoverageForClassWithAnonymousFunction(), self::$TEST_TMP_PATH); + + $this->assertFilesEquals($expectedFilesPath, self::$TEST_TMP_PATH); + } + + /** + * @param string $expectedFilesPath + * @param string $actualFilesPath + */ + private function assertFilesEquals($expectedFilesPath, $actualFilesPath): void + { + $expectedFilesIterator = new \FilesystemIterator($expectedFilesPath); + $actualFilesIterator = new \FilesystemIterator($actualFilesPath); + + $this->assertEquals( + \iterator_count($expectedFilesIterator), + \iterator_count($actualFilesIterator), + 'Generated files and expected files not match' + ); + + foreach ($expectedFilesIterator as $path => $fileInfo) { + /* @var \SplFileInfo $fileInfo */ + $filename = $fileInfo->getFilename(); + + $actualFile = $actualFilesPath . \DIRECTORY_SEPARATOR . $filename; + + $this->assertFileExists($actualFile); + + $this->assertStringMatchesFormatFile( + $fileInfo->getPathname(), + \file_get_contents($actualFile), + "${filename} not match" + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitattributes b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitattributes new file mode 100644 index 0000000000..461090b7ec --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitattributes @@ -0,0 +1 @@ +*.php diff=php diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.github/stale.yml b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.github/stale.yml new file mode 100644 index 0000000000..4eadca3278 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.github/stale.yml @@ -0,0 +1,40 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitignore b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitignore new file mode 100644 index 0000000000..5ad7a64f13 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.gitignore @@ -0,0 +1,5 @@ +/.idea +/vendor/ +/.php_cs +/.php_cs.cache +/composer.lock diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.php_cs.dist b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.php_cs.dist new file mode 100644 index 0000000000..efc649f8ff --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.php_cs.dist @@ -0,0 +1,168 @@ + + +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'], + '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') + ->notName('*.phpt') + ); diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.travis.yml b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.travis.yml new file mode 100644 index 0000000000..16b399c4f0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/.travis.yml @@ -0,0 +1,32 @@ +language: php + +sudo: false + +php: + - 7.1 + - 7.2 + - master + +env: + matrix: + - DEPENDENCIES="high" + - DEPENDENCIES="low" + global: + - DEFAULT_COMPOSER_FLAGS="--no-interaction --no-ansi --no-progress --no-suggest" + +before_install: + - composer self-update + - composer clear-cache + +install: + - if [[ "$DEPENDENCIES" = 'high' ]]; then travis_retry composer update $DEFAULT_COMPOSER_FLAGS; fi + - if [[ "$DEPENDENCIES" = 'low' ]]; then travis_retry 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 diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/ChangeLog.md b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/ChangeLog.md new file mode 100644 index 0000000000..635891eb0a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/ChangeLog.md @@ -0,0 +1,77 @@ +# Change Log + +All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). + +## [2.0.3] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` + +## [2.0.2] - 2018-09-13 + +### Fixed + +* Fixed [#48](https://github.com/sebastianbergmann/php-file-iterator/issues/48): Excluding an array that contains false ends up excluding the current working directory + +## [2.0.1] - 2018-06-11 + +### Fixed + +* Fixed [#46](https://github.com/sebastianbergmann/php-file-iterator/issues/46): Regression with hidden parent directory + +## [2.0.0] - 2018-05-28 + +### Fixed + +* Fixed [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path + +### Changed + +* This component now uses namespaces + +### Removed + +* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 + +## [1.4.5] - 2017-11-27 + +### Fixed + +* Fixed [#37](https://github.com/sebastianbergmann/php-file-iterator/issues/37): Regression caused by fix for [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30) + +## [1.4.4] - 2017-11-27 + +### Fixed + +* Fixed [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path + +## [1.4.3] - 2017-11-25 + +### Fixed + +* Fixed [#34](https://github.com/sebastianbergmann/php-file-iterator/issues/34): Factory should use canonical directory names + +## [1.4.2] - 2016-11-26 + +No changes + +## [1.4.1] - 2015-07-26 + +No changes + +## 1.4.0 - 2015-04-02 + +### Added + +* [Added support for wildcards (glob) in exclude](https://github.com/sebastianbergmann/php-file-iterator/pull/23) + +[2.0.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.2...2.0.3 +[2.0.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.1...2.0.2 +[2.0.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4...master +[1.4.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.4...1.4.5 +[1.4.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.3...1.4.4 +[1.4.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.2...1.4.3 +[1.4.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.0...1.4.1 diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/LICENSE b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/LICENSE new file mode 100644 index 0000000000..87c3b51246 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/LICENSE @@ -0,0 +1,33 @@ +php-file-iterator + +Copyright (c) 2009-2018, 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. diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/README.md b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/README.md new file mode 100644 index 0000000000..3cbfdaae7e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/README.md @@ -0,0 +1,14 @@ +[![Build Status](https://travis-ci.org/sebastianbergmann/php-file-iterator.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-file-iterator) + +# php-file-iterator + +## Installation + +You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): + + composer require phpunit/php-file-iterator + +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 phpunit/php-file-iterator + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/composer.json b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/composer.json new file mode 100644 index 0000000000..b1717b8ad3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/composer.json @@ -0,0 +1,37 @@ +{ + "name": "phpunit/php-file-iterator", + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "type": "library", + "keywords": [ + "iterator", + "filesystem" + ], + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/phpunit.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/phpunit.xml new file mode 100644 index 0000000000..3e12be416e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/phpunit.xml @@ -0,0 +1,21 @@ + + + + + tests + + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Facade.php b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Facade.php new file mode 100644 index 0000000000..2456e16d93 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Facade.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\FileIterator; + +class Facade +{ + /** + * @param array|string $paths + * @param array|string $suffixes + * @param array|string $prefixes + * @param array $exclude + * @param bool $commonPath + * + * @return array + */ + public function getFilesAsArray($paths, $suffixes = '', $prefixes = '', array $exclude = [], bool $commonPath = false): array + { + if (\is_string($paths)) { + $paths = [$paths]; + } + + $factory = new Factory; + + $iterator = $factory->getFileIterator($paths, $suffixes, $prefixes, $exclude); + + $files = []; + + foreach ($iterator as $file) { + $file = $file->getRealPath(); + + if ($file) { + $files[] = $file; + } + } + + foreach ($paths as $path) { + if (\is_file($path)) { + $files[] = \realpath($path); + } + } + + $files = \array_unique($files); + \sort($files); + + if ($commonPath) { + return [ + 'commonPath' => $this->getCommonPath($files), + 'files' => $files + ]; + } + + return $files; + } + + protected function getCommonPath(array $files): string + { + $count = \count($files); + + if ($count === 0) { + return ''; + } + + if ($count === 1) { + return \dirname($files[0]) . DIRECTORY_SEPARATOR; + } + + $_files = []; + + foreach ($files as $file) { + $_files[] = $_fileParts = \explode(DIRECTORY_SEPARATOR, $file); + + if (empty($_fileParts[0])) { + $_fileParts[0] = DIRECTORY_SEPARATOR; + } + } + + $common = ''; + $done = false; + $j = 0; + $count--; + + while (!$done) { + for ($i = 0; $i < $count; $i++) { + if ($_files[$i][$j] != $_files[$i + 1][$j]) { + $done = true; + + break; + } + } + + if (!$done) { + $common .= $_files[0][$j]; + + if ($j > 0) { + $common .= DIRECTORY_SEPARATOR; + } + } + + $j++; + } + + return DIRECTORY_SEPARATOR . $common; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Factory.php b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Factory.php new file mode 100644 index 0000000000..02e2f385a4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Factory.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\FileIterator; + +class Factory +{ + /** + * @param array|string $paths + * @param array|string $suffixes + * @param array|string $prefixes + * @param array $exclude + * + * @return \AppendIterator + */ + public function getFileIterator($paths, $suffixes = '', $prefixes = '', array $exclude = []): \AppendIterator + { + if (\is_string($paths)) { + $paths = [$paths]; + } + + $paths = $this->getPathsAfterResolvingWildcards($paths); + $exclude = $this->getPathsAfterResolvingWildcards($exclude); + + if (\is_string($prefixes)) { + if ($prefixes !== '') { + $prefixes = [$prefixes]; + } else { + $prefixes = []; + } + } + + if (\is_string($suffixes)) { + if ($suffixes !== '') { + $suffixes = [$suffixes]; + } else { + $suffixes = []; + } + } + + $iterator = new \AppendIterator; + + foreach ($paths as $path) { + if (\is_dir($path)) { + $iterator->append( + new Iterator( + $path, + new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($path, \RecursiveDirectoryIterator::FOLLOW_SYMLINKS | \RecursiveDirectoryIterator::SKIP_DOTS) + ), + $suffixes, + $prefixes, + $exclude + ) + ); + } + } + + return $iterator; + } + + protected function getPathsAfterResolvingWildcards(array $paths): array + { + $_paths = []; + + foreach ($paths as $path) { + if ($locals = \glob($path, GLOB_ONLYDIR)) { + $_paths = \array_merge($_paths, \array_map('\realpath', $locals)); + } else { + $_paths[] = \realpath($path); + } + } + + return \array_filter($_paths); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Iterator.php b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Iterator.php new file mode 100644 index 0000000000..84882d4a7c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/src/Iterator.php @@ -0,0 +1,112 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\FileIterator; + +class Iterator extends \FilterIterator +{ + const PREFIX = 0; + const SUFFIX = 1; + + /** + * @var string + */ + private $basePath; + + /** + * @var array + */ + private $suffixes = []; + + /** + * @var array + */ + private $prefixes = []; + + /** + * @var array + */ + private $exclude = []; + + /** + * @param string $basePath + * @param \Iterator $iterator + * @param array $suffixes + * @param array $prefixes + * @param array $exclude + */ + public function __construct(string $basePath, \Iterator $iterator, array $suffixes = [], array $prefixes = [], array $exclude = []) + { + $this->basePath = \realpath($basePath); + $this->prefixes = $prefixes; + $this->suffixes = $suffixes; + $this->exclude = \array_filter(\array_map('realpath', $exclude)); + + parent::__construct($iterator); + } + + public function accept() + { + $current = $this->getInnerIterator()->current(); + $filename = $current->getFilename(); + $realPath = $current->getRealPath(); + + return $this->acceptPath($realPath) && + $this->acceptPrefix($filename) && + $this->acceptSuffix($filename); + } + + private function acceptPath(string $path): bool + { + // Filter files in hidden directories by checking path that is relative to the base path. + if (\preg_match('=/\.[^/]*/=', \str_replace($this->basePath, '', $path))) { + return false; + } + + foreach ($this->exclude as $exclude) { + if (\strpos($path, $exclude) === 0) { + return false; + } + } + + return true; + } + + private function acceptPrefix(string $filename): bool + { + return $this->acceptSubString($filename, $this->prefixes, self::PREFIX); + } + + private function acceptSuffix(string $filename): bool + { + return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX); + } + + private function acceptSubString(string $filename, array $subStrings, int $type): bool + { + if (empty($subStrings)) { + return true; + } + + $matched = false; + + foreach ($subStrings as $string) { + if (($type === self::PREFIX && \strpos($filename, $string) === 0) || + ($type === self::SUFFIX && + \substr($filename, -1 * \strlen($string)) === $string)) { + $matched = true; + + break; + } + } + + return $matched; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/tests/FactoryTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/tests/FactoryTest.php new file mode 100644 index 0000000000..ba4bdbf261 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-file-iterator/tests/FactoryTest.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\FileIterator; + +use PHPUnit\Framework\TestCase; + +/** + * @covers \SebastianBergmann\FileIterator\Factory + */ +class FactoryTest extends TestCase +{ + /** + * @var string + */ + private $root; + + /** + * @var Factory + */ + private $factory; + + protected function setUp(): void + { + $this->root = __DIR__; + $this->factory = new Factory; + } + + public function testFindFilesInTestDirectory(): void + { + $iterator = $this->factory->getFileIterator($this->root, 'Test.php'); + $files = \iterator_to_array($iterator); + + $this->assertGreaterThanOrEqual(1, \count($files)); + } + + public function testFindFilesWithExcludedNonExistingSubdirectory(): void + { + $iterator = $this->factory->getFileIterator($this->root, 'Test.php', '', [$this->root . '/nonExistingDir']); + $files = \iterator_to_array($iterator); + + $this->assertGreaterThanOrEqual(1, \count($files)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitattributes b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitattributes new file mode 100644 index 0000000000..461090b7ec --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitattributes @@ -0,0 +1 @@ +*.php diff=php diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitignore b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitignore new file mode 100644 index 0000000000..c599212484 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/.gitignore @@ -0,0 +1,5 @@ +/composer.lock +/composer.phar +/.idea +/vendor + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/LICENSE b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/LICENSE new file mode 100644 index 0000000000..9f9a32d9b4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/LICENSE @@ -0,0 +1,33 @@ +Text_Template + +Copyright (c) 2009-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. diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/README.md b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/README.md new file mode 100644 index 0000000000..ec8f59360f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/README.md @@ -0,0 +1,14 @@ +# Text_Template + +## Installation + +## Installation + +To add this package as a local, per-project dependency to your project, simply add a dependency on `phpunit/php-text-template` to your project's `composer.json` file. Here is a minimal example of a `composer.json` file that just defines a dependency on Text_Template: + + { + "require": { + "phpunit/php-text-template": "~1.2" + } + } + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/composer.json b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/composer.json new file mode 100644 index 0000000000..a5779c8357 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/composer.json @@ -0,0 +1,29 @@ +{ + "name": "phpunit/php-text-template", + "description": "Simple template engine.", + "type": "library", + "keywords": [ + "template" + ], + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues" + }, + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "classmap": [ + "src/" + ] + } +} + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/src/Template.php b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/src/Template.php new file mode 100644 index 0000000000..9eb39ad5d6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-text-template/src/Template.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * A simple template engine. + * + * @since Class available since Release 1.0.0 + */ +class Text_Template +{ + /** + * @var string + */ + protected $template = ''; + + /** + * @var string + */ + protected $openDelimiter = '{'; + + /** + * @var string + */ + protected $closeDelimiter = '}'; + + /** + * @var array + */ + protected $values = array(); + + /** + * Constructor. + * + * @param string $file + * @throws InvalidArgumentException + */ + public function __construct($file = '', $openDelimiter = '{', $closeDelimiter = '}') + { + $this->setFile($file); + $this->openDelimiter = $openDelimiter; + $this->closeDelimiter = $closeDelimiter; + } + + /** + * Sets the template file. + * + * @param string $file + * @throws InvalidArgumentException + */ + public function setFile($file) + { + $distFile = $file . '.dist'; + + if (file_exists($file)) { + $this->template = file_get_contents($file); + } + + else if (file_exists($distFile)) { + $this->template = file_get_contents($distFile); + } + + else { + throw new InvalidArgumentException( + 'Template file could not be loaded.' + ); + } + } + + /** + * Sets one or more template variables. + * + * @param array $values + * @param bool $merge + */ + public function setVar(array $values, $merge = TRUE) + { + if (!$merge || empty($this->values)) { + $this->values = $values; + } else { + $this->values = array_merge($this->values, $values); + } + } + + /** + * Renders the template and returns the result. + * + * @return string + */ + public function render() + { + $keys = array(); + + foreach ($this->values as $key => $value) { + $keys[] = $this->openDelimiter . $key . $this->closeDelimiter; + } + + return str_replace($keys, $this->values, $this->template); + } + + /** + * Renders the template and writes the result to a file. + * + * @param string $target + */ + public function renderTo($target) + { + $fp = @fopen($target, 'wt'); + + if ($fp) { + fwrite($fp, $this->render()); + fclose($fp); + } else { + $error = error_get_last(); + + throw new RuntimeException( + sprintf( + 'Could not write to %s: %s', + $target, + substr( + $error['message'], + strpos($error['message'], ':') + 2 + ) + ) + ); + } + } +} + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitattributes b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitattributes new file mode 100644 index 0000000000..461090b7ec --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitattributes @@ -0,0 +1 @@ +*.php diff=php diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/FUNDING.yml b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/FUNDING.yml new file mode 100644 index 0000000000..b19ea81a02 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/FUNDING.yml @@ -0,0 +1 @@ +patreon: s_bergmann diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/stale.yml b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/stale.yml new file mode 100644 index 0000000000..4eadca3278 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.github/stale.yml @@ -0,0 +1,40 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitignore b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitignore new file mode 100644 index 0000000000..953d2a219f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.gitignore @@ -0,0 +1,5 @@ +/.idea +/.php_cs.cache +/vendor +/composer.lock + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.php_cs.dist b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.php_cs.dist new file mode 100644 index 0000000000..c4422644ca --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.php_cs.dist @@ -0,0 +1,197 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.travis.yml b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.travis.yml new file mode 100644 index 0000000000..a217292fdb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/.travis.yml @@ -0,0 +1,23 @@ +language: php + +php: + - 7.1 + - 7.2 + - 7.3 + - 7.4snapshot + +before_install: + - composer self-update + - composer clear-cache + +install: + - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest + +script: + - ./vendor/bin/phpunit --coverage-clover=coverage.xml + +after_success: + - bash <(curl -s https://codecov.io/bash) + +notifications: + email: false diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/ChangeLog.md b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/ChangeLog.md new file mode 100644 index 0000000000..378d4539f4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/ChangeLog.md @@ -0,0 +1,43 @@ +# ChangeLog + +All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [2.1.3] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` + +## [2.1.2] - 2019-06-07 + +### Fixed + +* Fixed [#21](https://github.com/sebastianbergmann/php-timer/pull/3352): Formatting of memory consumption does not work on 32bit systems + +## [2.1.1] - 2019-02-20 + +### Changed + +* Improved formatting of memory consumption for `resourceUsage()` + +## [2.1.0] - 2019-02-20 + +### Changed + +* Improved formatting of memory consumption for `resourceUsage()` + +## [2.0.0] - 2018-02-01 + +### Changed + +* This component now uses namespaces + +### Removed + +* This component is no longer supported on PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, and PHP 7.0 + +[2.1.3]: https://github.com/sebastianbergmann/diff/compare/2.1.2...2.1.3 +[2.1.2]: https://github.com/sebastianbergmann/diff/compare/2.1.1...2.1.2 +[2.1.1]: https://github.com/sebastianbergmann/diff/compare/2.1.0...2.1.1 +[2.1.0]: https://github.com/sebastianbergmann/diff/compare/2.0.0...2.1.0 +[2.0.0]: https://github.com/sebastianbergmann/diff/compare/1.0.9...2.0.0 diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/LICENSE b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/LICENSE new file mode 100644 index 0000000000..a4eb9446bc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/LICENSE @@ -0,0 +1,33 @@ +phpunit/php-timer + +Copyright (c) 2010-2019, 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. diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/README.md b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/README.md new file mode 100644 index 0000000000..61725c20b5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/README.md @@ -0,0 +1,49 @@ +[![Build Status](https://travis-ci.org/sebastianbergmann/php-timer.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-timer) + +# phpunit/php-timer + +Utility class for timing things, 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 phpunit/php-timer + +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 phpunit/php-timer + +## Usage + +### Basic Timing + +```php +use SebastianBergmann\Timer\Timer; + +Timer::start(); + +// ... + +$time = Timer::stop(); +var_dump($time); + +print Timer::secondsToTimeString($time); +``` + +The code above yields the output below: + + double(1.0967254638672E-5) + 0 ms + +### Resource Consumption Since PHP Startup + +```php +use SebastianBergmann\Timer\Timer; + +print Timer::resourceUsage(); +``` + +The code above yields the output below: + + Time: 0 ms, Memory: 0.50MB diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/build.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/build.xml new file mode 100644 index 0000000000..b8d325661f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/build.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/composer.json b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/composer.json new file mode 100644 index 0000000000..340d944b37 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/composer.json @@ -0,0 +1,42 @@ +{ + "name": "phpunit/php-timer", + "description": "Utility class for timing", + "type": "library", + "keywords": [ + "timer" + ], + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues" + }, + "prefer-stable": true, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + } +} + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/phpunit.xml b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/phpunit.xml new file mode 100644 index 0000000000..28a95de474 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/phpunit.xml @@ -0,0 +1,19 @@ + + + + tests + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Exception.php new file mode 100644 index 0000000000..7f9a26b202 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Exception.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +interface Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/RuntimeException.php b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/RuntimeException.php new file mode 100644 index 0000000000..aff06fa30f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/RuntimeException.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +final class RuntimeException extends \RuntimeException implements Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Timer.php b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Timer.php new file mode 100644 index 0000000000..378ff7249c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/src/Timer.php @@ -0,0 +1,100 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +final class Timer +{ + /** + * @var int[] + */ + private static $sizes = [ + 'GB' => 1073741824, + 'MB' => 1048576, + 'KB' => 1024, + ]; + + /** + * @var int[] + */ + private static $times = [ + 'hour' => 3600000, + 'minute' => 60000, + 'second' => 1000, + ]; + + /** + * @var float[] + */ + private static $startTimes = []; + + public static function start(): void + { + self::$startTimes[] = \microtime(true); + } + + public static function stop(): float + { + return \microtime(true) - \array_pop(self::$startTimes); + } + + public static function bytesToString(float $bytes): string + { + foreach (self::$sizes as $unit => $value) { + if ($bytes >= $value) { + return \sprintf('%.2f %s', $bytes >= 1024 ? $bytes / $value : $bytes, $unit); + } + } + + return $bytes . ' byte' . ((int) $bytes !== 1 ? 's' : ''); + } + + public static function secondsToTimeString(float $time): string + { + $ms = \round($time * 1000); + + foreach (self::$times as $unit => $value) { + if ($ms >= $value) { + $time = \floor($ms / $value * 100.0) / 100.0; + + return $time . ' ' . ($time == 1 ? $unit : $unit . 's'); + } + } + + return $ms . ' ms'; + } + + /** + * @throws RuntimeException + */ + public static function timeSinceStartOfRequest(): string + { + if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { + $startOfRequest = $_SERVER['REQUEST_TIME_FLOAT']; + } elseif (isset($_SERVER['REQUEST_TIME'])) { + $startOfRequest = $_SERVER['REQUEST_TIME']; + } else { + throw new RuntimeException('Cannot determine time at which the request started'); + } + + return self::secondsToTimeString(\microtime(true) - $startOfRequest); + } + + /** + * @throws RuntimeException + */ + public static function resourceUsage(): string + { + return \sprintf( + 'Time: %s, Memory: %s', + self::timeSinceStartOfRequest(), + self::bytesToString(\memory_get_peak_usage(true)) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-timer/tests/TimerTest.php b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/tests/TimerTest.php new file mode 100644 index 0000000000..93cc4749d7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-timer/tests/TimerTest.php @@ -0,0 +1,134 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Timer; + +use PHPUnit\Framework\TestCase; + +/** + * @covers \SebastianBergmann\Timer\Timer + */ +final class TimerTest extends TestCase +{ + public function testCanBeStartedAndStopped(): void + { + $this->assertIsFloat(Timer::stop()); + } + + public function testCanFormatTimeSinceStartOfRequest(): void + { + $this->assertStringMatchesFormat('%f %s', Timer::timeSinceStartOfRequest()); + } + + /** + * @backupGlobals enabled + */ + public function testCanFormatSinceStartOfRequestWhenRequestTimeIsNotAvailableAsFloat(): void + { + if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { + unset($_SERVER['REQUEST_TIME_FLOAT']); + } + + $this->assertStringMatchesFormat('%f %s', Timer::timeSinceStartOfRequest()); + } + + /** + * @backupGlobals enabled + */ + public function testCannotFormatTimeSinceStartOfRequestWhenRequestTimeIsNotAvailable(): void + { + if (isset($_SERVER['REQUEST_TIME_FLOAT'])) { + unset($_SERVER['REQUEST_TIME_FLOAT']); + } + + if (isset($_SERVER['REQUEST_TIME'])) { + unset($_SERVER['REQUEST_TIME']); + } + + $this->expectException(RuntimeException::class); + + Timer::timeSinceStartOfRequest(); + } + + public function testCanFormatResourceUsage(): void + { + $this->assertStringMatchesFormat('Time: %s, Memory: %f %s', Timer::resourceUsage()); + } + + /** + * @dataProvider secondsProvider + */ + public function testCanFormatSecondsAsString(string $string, float $seconds): void + { + $this->assertEquals($string, Timer::secondsToTimeString($seconds)); + } + + public function secondsProvider(): array + { + return [ + ['0 ms', 0], + ['1 ms', .001], + ['10 ms', .01], + ['100 ms', .1], + ['999 ms', .999], + ['1 second', .9999], + ['1 second', 1], + ['2 seconds', 2], + ['59.9 seconds', 59.9], + ['59.99 seconds', 59.99], + ['59.99 seconds', 59.999], + ['1 minute', 59.9999], + ['59 seconds', 59.001], + ['59.01 seconds', 59.01], + ['1 minute', 60], + ['1.01 minutes', 61], + ['2 minutes', 120], + ['2.01 minutes', 121], + ['59.99 minutes', 3599.9], + ['59.99 minutes', 3599.99], + ['59.99 minutes', 3599.999], + ['1 hour', 3599.9999], + ['59.98 minutes', 3599.001], + ['59.98 minutes', 3599.01], + ['1 hour', 3600], + ['1 hour', 3601], + ['1 hour', 3601.9], + ['1 hour', 3601.99], + ['1 hour', 3601.999], + ['1 hour', 3601.9999], + ['1.01 hours', 3659.9999], + ['1.01 hours', 3659.001], + ['1.01 hours', 3659.01], + ['2 hours', 7199.9999], + ]; + } + + /** + * @dataProvider bytesProvider + */ + public function testCanFormatBytesAsString(string $string, float $bytes): void + { + $this->assertEquals($string, Timer::bytesToString($bytes)); + } + + public function bytesProvider(): array + { + return [ + ['0 bytes', 0], + ['1 byte', 1], + ['1023 bytes', 1023], + ['1.00 KB', 1024], + ['1.50 KB', 1.5 * 1024], + ['2.00 MB', 2 * 1048576], + ['2.50 MB', 2.5 * 1048576], + ['3.00 GB', 3 * 1073741824], + ['3.50 GB', 3.5 * 1073741824], + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitattributes b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitattributes new file mode 100644 index 0000000000..a88b8c68e3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitattributes @@ -0,0 +1,12 @@ +/.github export-ignore +/.phive export-ignore +/.php_cs.dist export-ignore +/.psalm export-ignore +/bin export-ignore +/build.xml export-ignore +/phpunit.xml export-ignore +/tests export-ignore +/tools export-ignore +/tools/* binary + +*.php diff=php diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitignore b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitignore new file mode 100644 index 0000000000..93a0be47b2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/.gitignore @@ -0,0 +1,7 @@ +/.idea +/.php_cs +/.php_cs.cache +/.phpunit.result.cache +/.psalm/cache +/composer.lock +/vendor diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/ChangeLog.md b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/ChangeLog.md new file mode 100644 index 0000000000..4a93f524bf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/ChangeLog.md @@ -0,0 +1,92 @@ +# Change Log + +All notable changes to `sebastianbergmann/php-token-stream` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [4.0.4] - 2020-08-04 + +### Added + +* Support for `NAME_FULLY_QUALIFIED`, `NAME_QUALIFIED`, and `NAME_RELATIVE` tokens + +## [4.0.3] - 2020-06-27 + +### Added + +* This component is now supported on PHP 8 + +## [4.0.2] - 2020-06-16 + +### Fixed + +* Fixed backward compatibility breaks introduced in version 4.0.1 + +## [4.0.1] - 2020-05-06 + +### Fixed + +* [#93](https://github.com/sebastianbergmann/php-token-stream/issues/93): Class with method that uses anonymous class is not processed correctly + +## [4.0.0] - 2020-02-07 + +### Removed + +* This component is no longer supported PHP 7.1 and PHP 7.2 + +## [3.1.1] - 2019-09-17 + +### Fixed + +* [#84](https://github.com/sebastianbergmann/php-token-stream/issues/84): Methods named `class` are not handled correctly + +## [3.1.0] - 2019-07-25 + +### Added + +* Added support for `FN` and `COALESCE_EQUAL` tokens introduced in PHP 7.4 + +## [3.0.2] - 2019-07-08 + +### Changed + +* [#82](https://github.com/sebastianbergmann/php-token-stream/issues/82): Make sure this component works when its classes are prefixed using php-scoper + +## [3.0.1] - 2018-10-30 + +### Fixed + +* [#78](https://github.com/sebastianbergmann/php-token-stream/pull/78): `getEndTokenId()` does not handle string-dollar (`"${var}"`) interpolation + +## [3.0.0] - 2018-02-01 + +### Removed + +* [#71](https://github.com/sebastianbergmann/php-token-stream/issues/71): Remove code specific to Hack language constructs +* [#72](https://github.com/sebastianbergmann/php-token-stream/issues/72): Drop support for PHP 7.0 + +## [2.0.2] - 2017-11-27 + +### Fixed + +* [#69](https://github.com/sebastianbergmann/php-token-stream/issues/69): `PHP_Token_USE_FUNCTION` does not serialize correctly + +## [2.0.1] - 2017-08-20 + +### Fixed + +* [#68](https://github.com/sebastianbergmann/php-token-stream/issues/68): Method with name `empty` wrongly recognized as anonymous function + +## [2.0.0] - 2017-08-03 + +[4.0.4]: https://github.com/sebastianbergmann/php-token-stream/compare/4.0.3...4.0.4 +[4.0.3]: https://github.com/sebastianbergmann/php-token-stream/compare/4.0.2...4.0.3 +[4.0.2]: https://github.com/sebastianbergmann/php-token-stream/compare/4.0.1...4.0.2 +[4.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/4.0.0...4.0.1 +[4.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/3.1.1...4.0.0 +[3.1.1]: https://github.com/sebastianbergmann/php-token-stream/compare/3.1.0...3.1.1 +[3.1.0]: https://github.com/sebastianbergmann/php-token-stream/compare/3.0.2...3.1.0 +[3.0.2]: https://github.com/sebastianbergmann/php-token-stream/compare/3.0.1...3.0.2 +[3.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/3.0.0...3.0.1 +[3.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0...3.0.0 +[2.0.2]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.1...2.0.2 +[2.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.0...2.0.1 +[2.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/1.4.11...2.0.0 diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/LICENSE b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/LICENSE new file mode 100644 index 0000000000..a6d0c8c4f4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/LICENSE @@ -0,0 +1,33 @@ +php-token-stream + +Copyright (c) 2009-2020, 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. diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/README.md b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/README.md new file mode 100644 index 0000000000..162de8d190 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/README.md @@ -0,0 +1,18 @@ +# phpunit/php-token-stream + +[![CI Status](https://github.com/sebastianbergmann/php-token-stream/workflows/CI/badge.svg)](https://github.com/sebastianbergmann/php-token-stream/actions) +[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/php-token-stream/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/php-token-stream) + +## Installation + +You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): + +``` +composer require phpunit/php-token-stream +``` + +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 phpunit/php-token-stream +``` diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/composer.json b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/composer.json new file mode 100644 index 0000000000..e0d0b4de75 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/composer.json @@ -0,0 +1,42 @@ +{ + "name": "phpunit/php-token-stream", + "description": "Wrapper around PHP's tokenizer extension.", + "type": "library", + "keywords": ["tokenizer"], + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues" + }, + "prefer-stable": true, + "require": { + "php": "^7.3 || ^8.0", + "ext-tokenizer": "*" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "config": { + "platform": { + "php": "7.3.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Abstract.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Abstract.php new file mode 100644 index 0000000000..7bbb555d30 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Abstract.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ABSTRACT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ampersand.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ampersand.php new file mode 100644 index 0000000000..3996f34464 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ampersand.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_AMPERSAND extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/AndEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/AndEqual.php new file mode 100644 index 0000000000..9984442a62 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/AndEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_AND_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Array.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Array.php new file mode 100644 index 0000000000..72041e9441 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Array.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ARRAY extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ArrayCast.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ArrayCast.php new file mode 100644 index 0000000000..9d113db528 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ArrayCast.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ARRAY_CAST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/As.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/As.php new file mode 100644 index 0000000000..286578e46c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/As.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_AS extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/At.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/At.php new file mode 100644 index 0000000000..d8d2468572 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/At.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_AT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Backtick.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Backtick.php new file mode 100644 index 0000000000..3d8b55b7f2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Backtick.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_BACKTICK extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BadCharacter.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BadCharacter.php new file mode 100644 index 0000000000..dfc7a40fff --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BadCharacter.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_BAD_CHARACTER extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BoolCast.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BoolCast.php new file mode 100644 index 0000000000..201cfeab62 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BoolCast.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_BOOL_CAST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanAnd.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanAnd.php new file mode 100644 index 0000000000..03f9833119 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanAnd.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_BOOLEAN_AND extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanOr.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanOr.php new file mode 100644 index 0000000000..0f339245b6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/BooleanOr.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_BOOLEAN_OR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CachingFactory.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CachingFactory.php new file mode 100644 index 0000000000..c557a84f3c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CachingFactory.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_Stream_CachingFactory +{ + /** + * @var array + */ + protected static $cache = []; + + /** + * @param string $filename + * + * @return PHP_Token_Stream + */ + public static function get($filename) + { + if (!isset(self::$cache[$filename])) { + self::$cache[$filename] = new PHP_Token_Stream($filename); + } + + return self::$cache[$filename]; + } + + /** + * @param string $filename + */ + public static function clear($filename = null)/*: void*/ + { + if (\is_string($filename)) { + unset(self::$cache[$filename]); + } else { + self::$cache = []; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Callable.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Callable.php new file mode 100644 index 0000000000..4f5751259c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Callable.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CALLABLE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Caret.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Caret.php new file mode 100644 index 0000000000..af453d897a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Caret.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CARET extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Case.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Case.php new file mode 100644 index 0000000000..ab9b906db1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Case.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CASE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Catch.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Catch.php new file mode 100644 index 0000000000..8c244acae6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Catch.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CATCH extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Character.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Character.php new file mode 100644 index 0000000000..eea0db0990 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Character.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CHARACTER extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Class.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Class.php new file mode 100644 index 0000000000..09167f21ca --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Class.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLASS extends PHP_Token_INTERFACE +{ + /** + * @var bool + */ + private $anonymous = false; + + /** + * @var string + */ + private $name; + + /** + * @return string + */ + public function getName() + { + if ($this->name !== null) { + return $this->name; + } + + $next = $this->tokenStream[$this->id + 1]; + + if ($next instanceof PHP_Token_WHITESPACE) { + $next = $this->tokenStream[$this->id + 2]; + } + + if ($next instanceof PHP_Token_STRING) { + $this->name =(string) $next; + + return $this->name; + } + + if ($next instanceof PHP_Token_OPEN_CURLY || + $next instanceof PHP_Token_EXTENDS || + $next instanceof PHP_Token_IMPLEMENTS) { + $this->name = \sprintf( + 'AnonymousClass:%s#%s', + $this->getLine(), + $this->getId() + ); + + $this->anonymous = true; + + return $this->name; + } + } + + public function isAnonymous() + { + return $this->anonymous; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassC.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassC.php new file mode 100644 index 0000000000..2350c99bd4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassC.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLASS_C extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassNameConstant.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassNameConstant.php new file mode 100644 index 0000000000..1b557e3c7c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ClassNameConstant.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Clone.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Clone.php new file mode 100644 index 0000000000..24e6610475 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Clone.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLONE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseBracket.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseBracket.php new file mode 100644 index 0000000000..b86b745750 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseBracket.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLOSE_BRACKET extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseCurly.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseCurly.php new file mode 100644 index 0000000000..aa86cdc4d9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseCurly.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLOSE_CURLY extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseSquare.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseSquare.php new file mode 100644 index 0000000000..fc819d0159 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseSquare.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLOSE_SQUARE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseTag.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseTag.php new file mode 100644 index 0000000000..419510cf80 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CloseTag.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CLOSE_TAG extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Coalesce.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Coalesce.php new file mode 100644 index 0000000000..55b2beb4a9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Coalesce.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_COALESCE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CoalesceEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CoalesceEqual.php new file mode 100644 index 0000000000..b60096181a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CoalesceEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_COALESCE_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Colon.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Colon.php new file mode 100644 index 0000000000..66dd840895 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Colon.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_COLON extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comma.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comma.php new file mode 100644 index 0000000000..b57ba370cc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comma.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_COMMA extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comment.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comment.php new file mode 100644 index 0000000000..c50c80b80c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Comment.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_COMMENT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConcatEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConcatEqual.php new file mode 100644 index 0000000000..f57c748f33 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConcatEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CONCAT_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Const.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Const.php new file mode 100644 index 0000000000..a5376422c2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Const.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CONST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConstantEncapsedString.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConstantEncapsedString.php new file mode 100644 index 0000000000..2a030cd3c7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ConstantEncapsedString.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Continue.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Continue.php new file mode 100644 index 0000000000..a21c8ba104 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Continue.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CONTINUE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CurlyOpen.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CurlyOpen.php new file mode 100644 index 0000000000..7c3e9bceaf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/CurlyOpen.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_CURLY_OPEN extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DNumber.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DNumber.php new file mode 100644 index 0000000000..bf5751f323 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DNumber.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DNUMBER extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dec.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dec.php new file mode 100644 index 0000000000..6f06341c4f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dec.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DEC extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Declare.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Declare.php new file mode 100644 index 0000000000..60dab6f880 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Declare.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DECLARE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Default.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Default.php new file mode 100644 index 0000000000..81f3bfd025 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Default.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DEFAULT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dir.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dir.php new file mode 100644 index 0000000000..add4bf84d6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dir.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DIR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Div.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Div.php new file mode 100644 index 0000000000..87e11d7864 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Div.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DIV extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DivEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DivEqual.php new file mode 100644 index 0000000000..cb558a89d6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DivEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DIV_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Do.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Do.php new file mode 100644 index 0000000000..32ceff1c92 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Do.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DO extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DocComment.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DocComment.php new file mode 100644 index 0000000000..2ca6f22161 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DocComment.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOC_COMMENT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dollar.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dollar.php new file mode 100644 index 0000000000..a2a8d59556 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dollar.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOLLAR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DollarOpenCurlyBraces.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DollarOpenCurlyBraces.php new file mode 100644 index 0000000000..030bcb29b8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DollarOpenCurlyBraces.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dot.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dot.php new file mode 100644 index 0000000000..b50a49eedc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Dot.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleArrow.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleArrow.php new file mode 100644 index 0000000000..bc2c6d06a7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleArrow.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOUBLE_ARROW extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleCast.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleCast.php new file mode 100644 index 0000000000..eb72f36425 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleCast.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOUBLE_CAST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleColon.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleColon.php new file mode 100644 index 0000000000..46ff6e7f21 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleColon.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOUBLE_COLON extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleQuotes.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleQuotes.php new file mode 100644 index 0000000000..10779806e2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/DoubleQuotes.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_DOUBLE_QUOTES extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Echo.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Echo.php new file mode 100644 index 0000000000..bfee30cffb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Echo.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ECHO extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ellipsis.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ellipsis.php new file mode 100644 index 0000000000..d932cedb67 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Ellipsis.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ELLIPSIS extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Else.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Else.php new file mode 100644 index 0000000000..a3266f8633 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Else.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ELSE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Elseif.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Elseif.php new file mode 100644 index 0000000000..76a7d4e7c3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Elseif.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ELSEIF extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Empty.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Empty.php new file mode 100644 index 0000000000..15f662cdbe --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Empty.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_EMPTY extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EncapsedAndWhitespace.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EncapsedAndWhitespace.php new file mode 100644 index 0000000000..5224806db4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EncapsedAndWhitespace.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EndHeredoc.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EndHeredoc.php new file mode 100644 index 0000000000..e95930cf47 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/EndHeredoc.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_END_HEREDOC extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Enddeclare.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Enddeclare.php new file mode 100644 index 0000000000..dd96d7f167 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Enddeclare.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ENDDECLARE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endfor.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endfor.php new file mode 100644 index 0000000000..a5382a273f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endfor.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ENDFOR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endforeach.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endforeach.php new file mode 100644 index 0000000000..d2ab78a52f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endforeach.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ENDFOREACH extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endif.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endif.php new file mode 100644 index 0000000000..910eeea5c5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endif.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ENDIF extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endswitch.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endswitch.php new file mode 100644 index 0000000000..0fc81462db --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endswitch.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ENDSWITCH extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endwhile.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endwhile.php new file mode 100644 index 0000000000..9a289f110e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Endwhile.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ENDWHILE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Equal.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Equal.php new file mode 100644 index 0000000000..c8ecb0b705 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Equal.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Eval.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Eval.php new file mode 100644 index 0000000000..fb82bfd7b1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Eval.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_EVAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ExclamationMark.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ExclamationMark.php new file mode 100644 index 0000000000..009ea238ee --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ExclamationMark.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_EXCLAMATION_MARK extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Exit.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Exit.php new file mode 100644 index 0000000000..9475887c69 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Exit.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_EXIT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Extends.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Extends.php new file mode 100644 index 0000000000..bf51160609 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Extends.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_EXTENDS extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/File.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/File.php new file mode 100644 index 0000000000..a89449c3b8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/File.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FILE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Final.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Final.php new file mode 100644 index 0000000000..f1355d239f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Final.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FINAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Finally.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Finally.php new file mode 100644 index 0000000000..8d31fc326f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Finally.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FINALLY extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Fn.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Fn.php new file mode 100644 index 0000000000..8c1ceecb14 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Fn.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FN extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/For.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/For.php new file mode 100644 index 0000000000..5b7bcbf8f7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/For.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FOR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Foreach.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Foreach.php new file mode 100644 index 0000000000..76906b0d13 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Foreach.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FOREACH extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/FuncC.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/FuncC.php new file mode 100644 index 0000000000..853446f125 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/FuncC.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FUNC_C extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Function.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Function.php new file mode 100644 index 0000000000..8cc9eb1ad3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Function.php @@ -0,0 +1,196 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility +{ + /** + * @var array + */ + protected $arguments; + + /** + * @var int + */ + protected $ccn; + + /** + * @var string + */ + protected $name; + + /** + * @var string + */ + protected $signature; + + /** + * @var bool + */ + private $anonymous = false; + + /** + * @return array + */ + public function getArguments() + { + if ($this->arguments !== null) { + return $this->arguments; + } + + $this->arguments = []; + $tokens = $this->tokenStream->tokens(); + $typeDeclaration = null; + + // Search for first token inside brackets + $i = $this->id + 2; + + while (!$tokens[$i - 1] instanceof PHP_Token_OPEN_BRACKET) { + $i++; + } + + while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) { + if ($tokens[$i] instanceof PHP_Token_STRING) { + $typeDeclaration = (string) $tokens[$i]; + } elseif ($tokens[$i] instanceof PHP_Token_VARIABLE) { + $this->arguments[(string) $tokens[$i]] = $typeDeclaration; + $typeDeclaration = null; + } + + $i++; + } + + return $this->arguments; + } + + /** + * @return string + */ + public function getName() + { + if ($this->name !== null) { + return $this->name; + } + + $tokens = $this->tokenStream->tokens(); + + $i = $this->id + 1; + + if ($tokens[$i] instanceof PHP_Token_WHITESPACE) { + $i++; + } + + if ($tokens[$i] instanceof PHP_Token_AMPERSAND) { + $i++; + } + + if ($tokens[$i + 1] instanceof PHP_Token_OPEN_BRACKET) { + $this->name = (string) $tokens[$i]; + } elseif ($tokens[$i + 1] instanceof PHP_Token_WHITESPACE && $tokens[$i + 2] instanceof PHP_Token_OPEN_BRACKET) { + $this->name = (string) $tokens[$i]; + } else { + $this->anonymous = true; + + $this->name = \sprintf( + 'anonymousFunction:%s#%s', + $this->getLine(), + $this->getId() + ); + } + + if (!$this->isAnonymous()) { + for ($i = $this->id; $i; --$i) { + if ($tokens[$i] instanceof PHP_Token_NAMESPACE) { + $this->name = $tokens[$i]->getName() . '\\' . $this->name; + + break; + } + + if ($tokens[$i] instanceof PHP_Token_INTERFACE) { + break; + } + } + } + + return $this->name; + } + + /** + * @return int + */ + public function getCCN() + { + if ($this->ccn !== null) { + return $this->ccn; + } + + $this->ccn = 1; + $end = $this->getEndTokenId(); + $tokens = $this->tokenStream->tokens(); + + for ($i = $this->id; $i <= $end; $i++) { + switch (\get_class($tokens[$i])) { + case PHP_Token_IF::class: + case PHP_Token_ELSEIF::class: + case PHP_Token_FOR::class: + case PHP_Token_FOREACH::class: + case PHP_Token_WHILE::class: + case PHP_Token_CASE::class: + case PHP_Token_CATCH::class: + case PHP_Token_BOOLEAN_AND::class: + case PHP_Token_LOGICAL_AND::class: + case PHP_Token_BOOLEAN_OR::class: + case PHP_Token_LOGICAL_OR::class: + case PHP_Token_QUESTION_MARK::class: + $this->ccn++; + + break; + } + } + + return $this->ccn; + } + + /** + * @return string + */ + public function getSignature() + { + if ($this->signature !== null) { + return $this->signature; + } + + if ($this->isAnonymous()) { + $this->signature = 'anonymousFunction'; + $i = $this->id + 1; + } else { + $this->signature = ''; + $i = $this->id + 2; + } + + $tokens = $this->tokenStream->tokens(); + + while (isset($tokens[$i]) && + !$tokens[$i] instanceof PHP_Token_OPEN_CURLY && + !$tokens[$i] instanceof PHP_Token_SEMICOLON) { + $this->signature .= $tokens[$i++]; + } + + $this->signature = \trim($this->signature); + + return $this->signature; + } + + /** + * @return bool + */ + public function isAnonymous() + { + return $this->anonymous; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Global.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Global.php new file mode 100644 index 0000000000..15d34c0f9f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Global.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_GLOBAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Goto.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Goto.php new file mode 100644 index 0000000000..68cbce0dbc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Goto.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_GOTO extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Gt.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Gt.php new file mode 100644 index 0000000000..1df2bc974c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Gt.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_GT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/HaltCompiler.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/HaltCompiler.php new file mode 100644 index 0000000000..1976e9b7d8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/HaltCompiler.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_HALT_COMPILER extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/If.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/If.php new file mode 100644 index 0000000000..2f888f1ce7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/If.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IF extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Implements.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Implements.php new file mode 100644 index 0000000000..bfb035bcc6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Implements.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IMPLEMENTS extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Inc.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Inc.php new file mode 100644 index 0000000000..ca19c33ab7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Inc.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INC extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Include.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Include.php new file mode 100644 index 0000000000..cffb378e73 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Include.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INCLUDE extends PHP_Token_Includes +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IncludeOnce.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IncludeOnce.php new file mode 100644 index 0000000000..da28d61785 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IncludeOnce.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Includes.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Includes.php new file mode 100644 index 0000000000..285dfbf651 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Includes.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +abstract class PHP_Token_Includes extends PHP_Token +{ + /** + * @var string + */ + protected $name; + + /** + * @var string + */ + protected $type; + + /** + * @return string + */ + public function getName() + { + if ($this->name === null) { + $this->process(); + } + + return $this->name; + } + + /** + * @return string + */ + public function getType() + { + if ($this->type === null) { + $this->process(); + } + + return $this->type; + } + + private function process(): void + { + $tokens = $this->tokenStream->tokens(); + + if ($tokens[$this->id + 2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) { + $this->name = \trim((string) $tokens[$this->id + 2], "'\""); + $this->type = \strtolower( + \str_replace('PHP_Token_', '', PHP_Token_Util::getClass($tokens[$this->id])) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/InlineHtml.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/InlineHtml.php new file mode 100644 index 0000000000..a4fc15e05b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/InlineHtml.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INLINE_HTML extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Instanceof.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Instanceof.php new file mode 100644 index 0000000000..c41dd0e60d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Instanceof.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INSTANCEOF extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Insteadof.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Insteadof.php new file mode 100644 index 0000000000..d8c0bc4707 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Insteadof.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INSTEADOF extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IntCast.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IntCast.php new file mode 100644 index 0000000000..2b256017cd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IntCast.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INT_CAST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Interface.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Interface.php new file mode 100644 index 0000000000..d2732f561e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Interface.php @@ -0,0 +1,166 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility +{ + /** + * @var array + */ + protected $interfaces; + + /** + * @return string + */ + public function getName() + { + return (string) $this->tokenStream[$this->id + 2]; + } + + /** + * @return bool + */ + public function hasParent() + { + return $this->tokenStream[$this->id + 4] instanceof PHP_Token_EXTENDS; + } + + /** + * @return array + */ + public function getPackage() + { + $result = [ + 'namespace' => '', + 'fullPackage' => '', + 'category' => '', + 'package' => '', + 'subpackage' => '', + ]; + + $docComment = $this->getDocblock(); + $className = $this->getName(); + + for ($i = $this->id; $i; --$i) { + if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) { + $result['namespace'] = $this->tokenStream[$i]->getName(); + + break; + } + } + + if ($docComment === null) { + return $result; + } + + if (\preg_match('/@category[\s]+([\.\w]+)/', $docComment, $matches)) { + $result['category'] = $matches[1]; + } + + if (\preg_match('/@package[\s]+([\.\w]+)/', $docComment, $matches)) { + $result['package'] = $matches[1]; + $result['fullPackage'] = $matches[1]; + } + + if (\preg_match('/@subpackage[\s]+([\.\w]+)/', $docComment, $matches)) { + $result['subpackage'] = $matches[1]; + $result['fullPackage'] .= '.' . $matches[1]; + } + + if (empty($result['fullPackage'])) { + $result['fullPackage'] = $this->arrayToName( + \explode('_', \str_replace('\\', '_', $className)), + '.' + ); + } + + return $result; + } + + /** + * @return bool|string + */ + public function getParent() + { + if (!$this->hasParent()) { + return false; + } + + $i = $this->id + 6; + $tokens = $this->tokenStream->tokens(); + $className = (string) $tokens[$i]; + + while (isset($tokens[$i + 1]) && + !$tokens[$i + 1] instanceof PHP_Token_WHITESPACE) { + $className .= (string) $tokens[++$i]; + } + + return $className; + } + + /** + * @return bool + */ + public function hasInterfaces() + { + return (isset($this->tokenStream[$this->id + 4]) && + $this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) || + (isset($this->tokenStream[$this->id + 8]) && + $this->tokenStream[$this->id + 8] instanceof PHP_Token_IMPLEMENTS); + } + + /** + * @return array|bool + */ + public function getInterfaces() + { + if ($this->interfaces !== null) { + return $this->interfaces; + } + + if (!$this->hasInterfaces()) { + return $this->interfaces = false; + } + + if ($this->tokenStream[$this->id + 4] instanceof PHP_Token_IMPLEMENTS) { + $i = $this->id + 3; + } else { + $i = $this->id + 7; + } + + $tokens = $this->tokenStream->tokens(); + + while (!$tokens[$i + 1] instanceof PHP_Token_OPEN_CURLY) { + $i++; + + if ($tokens[$i] instanceof PHP_Token_STRING) { + $this->interfaces[] = (string) $tokens[$i]; + } + } + + return $this->interfaces; + } + + /** + * @param string $join + * + * @return string + */ + protected function arrayToName(array $parts, $join = '\\') + { + $result = ''; + + if (\count($parts) > 1) { + \array_pop($parts); + + $result = \implode($join, $parts); + } + + return $result; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsEqual.php new file mode 100644 index 0000000000..70f00af5d6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IS_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsGreaterOrEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsGreaterOrEqual.php new file mode 100644 index 0000000000..0227baf46f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsGreaterOrEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsIdentical.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsIdentical.php new file mode 100644 index 0000000000..28388df5b4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsIdentical.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IS_IDENTICAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotEqual.php new file mode 100644 index 0000000000..f70f2290ea --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IS_NOT_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotIdentical.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotIdentical.php new file mode 100644 index 0000000000..9fe3a71a29 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsNotIdentical.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsSmallerOrEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsSmallerOrEqual.php new file mode 100644 index 0000000000..7ac0c2fa2d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/IsSmallerOrEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Isset.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Isset.php new file mode 100644 index 0000000000..47941d6437 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Isset.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_ISSET extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Line.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Line.php new file mode 100644 index 0000000000..ffed4dbcc4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Line.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_LINE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/List.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/List.php new file mode 100644 index 0000000000..9410fc5a7b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/List.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_LIST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lnumber.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lnumber.php new file mode 100644 index 0000000000..e996bd0f87 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lnumber.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_LNUMBER extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalAnd.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalAnd.php new file mode 100644 index 0000000000..72beb476c0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalAnd.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_LOGICAL_AND extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalOr.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalOr.php new file mode 100644 index 0000000000..ec8be7030c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalOr.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_LOGICAL_OR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalXor.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalXor.php new file mode 100644 index 0000000000..e1e223b994 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/LogicalXor.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_LOGICAL_XOR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lt.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lt.php new file mode 100644 index 0000000000..288a413301 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Lt.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_LT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MethodC.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MethodC.php new file mode 100644 index 0000000000..1bebf001a9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MethodC.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_METHOD_C extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Minus.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Minus.php new file mode 100644 index 0000000000..6ca52f523b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Minus.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_MINUS extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MinusEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MinusEqual.php new file mode 100644 index 0000000000..1bfb24c5ec --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MinusEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_MINUS_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ModEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ModEqual.php new file mode 100644 index 0000000000..28aab58634 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ModEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_MOD_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MulEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MulEqual.php new file mode 100644 index 0000000000..16a0d242e9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/MulEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_MUL_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Mult.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Mult.php new file mode 100644 index 0000000000..bd6daed76a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Mult.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_MULT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameFullyQualified.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameFullyQualified.php new file mode 100644 index 0000000000..744118abcf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameFullyQualified.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NAME_FULLY_QUALIFIED extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameQualified.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameQualified.php new file mode 100644 index 0000000000..a893144c06 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameQualified.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NAME_QUALIFIED extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameRelative.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameRelative.php new file mode 100644 index 0000000000..0b358cc648 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NameRelative.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NAME_RELATIVE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Namespace.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Namespace.php new file mode 100644 index 0000000000..634d8ad76a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Namespace.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NAMESPACE extends PHP_TokenWithScope +{ + /** + * @return string + */ + public function getName() + { + $tokens = $this->tokenStream->tokens(); + $namespace = (string) $tokens[$this->id + 2]; + + for ($i = $this->id + 3;; $i += 2) { + if (isset($tokens[$i]) && + $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) { + $namespace .= '\\' . $tokens[$i + 1]; + } else { + break; + } + } + + return $namespace; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/New.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/New.php new file mode 100644 index 0000000000..bd67af28bf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/New.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NEW extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsC.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsC.php new file mode 100644 index 0000000000..2778ea4cdb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsC.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NS_C extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsSeparator.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsSeparator.php new file mode 100644 index 0000000000..950291ed93 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NsSeparator.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NS_SEPARATOR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NumString.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NumString.php new file mode 100644 index 0000000000..a073e3d069 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/NumString.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_NUM_STRING extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectCast.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectCast.php new file mode 100644 index 0000000000..c0ec7d5b74 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectCast.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OBJECT_CAST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectOperator.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectOperator.php new file mode 100644 index 0000000000..a4ca75b81c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/ObjectOperator.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OBJECT_OPERATOR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenBracket.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenBracket.php new file mode 100644 index 0000000000..2cb93ed207 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenBracket.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OPEN_BRACKET extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenCurly.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenCurly.php new file mode 100644 index 0000000000..59c118d1b8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenCurly.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OPEN_CURLY extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenSquare.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenSquare.php new file mode 100644 index 0000000000..04cfefab0a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenSquare.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OPEN_SQUARE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTag.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTag.php new file mode 100644 index 0000000000..d3e00239e5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTag.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OPEN_TAG extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTagWithEcho.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTagWithEcho.php new file mode 100644 index 0000000000..ec981a2a38 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OpenTagWithEcho.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OrEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OrEqual.php new file mode 100644 index 0000000000..8e7005df2e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/OrEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_OR_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PaamayimNekudotayim.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PaamayimNekudotayim.php new file mode 100644 index 0000000000..3185555d9c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PaamayimNekudotayim.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Percent.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Percent.php new file mode 100644 index 0000000000..a2baab533e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Percent.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PERCENT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pipe.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pipe.php new file mode 100644 index 0000000000..4e9438fd98 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pipe.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PIPE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Plus.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Plus.php new file mode 100644 index 0000000000..5a4ae324cd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Plus.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PLUS extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PlusEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PlusEqual.php new file mode 100644 index 0000000000..23825f3779 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PlusEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PLUS_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pow.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pow.php new file mode 100644 index 0000000000..84276d73de --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Pow.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_POW extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PowEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PowEqual.php new file mode 100644 index 0000000000..5e5288db72 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/PowEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_POW_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Print.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Print.php new file mode 100644 index 0000000000..72ef8e6abf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Print.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PRINT extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Private.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Private.php new file mode 100644 index 0000000000..0eb36d522c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Private.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PRIVATE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Protected.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Protected.php new file mode 100644 index 0000000000..9c9cc33bae --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Protected.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PROTECTED extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Public.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Public.php new file mode 100644 index 0000000000..b37d4a94d6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Public.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_PUBLIC extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/QuestionMark.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/QuestionMark.php new file mode 100644 index 0000000000..4202d59212 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/QuestionMark.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_QUESTION_MARK extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Require.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Require.php new file mode 100644 index 0000000000..e18c03fcc9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Require.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_REQUIRE extends PHP_Token_Includes +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/RequireOnce.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/RequireOnce.php new file mode 100644 index 0000000000..15628a3a80 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/RequireOnce.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Return.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Return.php new file mode 100644 index 0000000000..acdbc23b1b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Return.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_RETURN extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Semicolon.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Semicolon.php new file mode 100644 index 0000000000..47bfa5e163 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Semicolon.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_SEMICOLON extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sl.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sl.php new file mode 100644 index 0000000000..cda5ecc11c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sl.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_SL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SlEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SlEqual.php new file mode 100644 index 0000000000..3d8a17e5af --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SlEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_SL_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Spaceship.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Spaceship.php new file mode 100644 index 0000000000..639a2e30a4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Spaceship.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_SPACESHIP extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sr.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sr.php new file mode 100644 index 0000000000..749bf0da59 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Sr.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_SR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SrEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SrEqual.php new file mode 100644 index 0000000000..674039fbd2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/SrEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_SR_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StartHeredoc.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StartHeredoc.php new file mode 100644 index 0000000000..867a35760c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StartHeredoc.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_START_HEREDOC extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Static.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Static.php new file mode 100644 index 0000000000..53307ce297 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Static.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_STATIC extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Stream.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Stream.php new file mode 100644 index 0000000000..bcdb48a73c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Stream.php @@ -0,0 +1,658 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator +{ + /** + * @var array> + */ + protected static $customTokens = [ + '(' => PHP_Token_OPEN_BRACKET::class, + ')' => PHP_Token_CLOSE_BRACKET::class, + '[' => PHP_Token_OPEN_SQUARE::class, + ']' => PHP_Token_CLOSE_SQUARE::class, + '{' => PHP_Token_OPEN_CURLY::class, + '}' => PHP_Token_CLOSE_CURLY::class, + ';' => PHP_Token_SEMICOLON::class, + '.' => PHP_Token_DOT::class, + ',' => PHP_Token_COMMA::class, + '=' => PHP_Token_EQUAL::class, + '<' => PHP_Token_LT::class, + '>' => PHP_Token_GT::class, + '+' => PHP_Token_PLUS::class, + '-' => PHP_Token_MINUS::class, + '*' => PHP_Token_MULT::class, + '/' => PHP_Token_DIV::class, + '?' => PHP_Token_QUESTION_MARK::class, + '!' => PHP_Token_EXCLAMATION_MARK::class, + ':' => PHP_Token_COLON::class, + '"' => PHP_Token_DOUBLE_QUOTES::class, + '@' => PHP_Token_AT::class, + '&' => PHP_Token_AMPERSAND::class, + '%' => PHP_Token_PERCENT::class, + '|' => PHP_Token_PIPE::class, + '$' => PHP_Token_DOLLAR::class, + '^' => PHP_Token_CARET::class, + '~' => PHP_Token_TILDE::class, + '`' => PHP_Token_BACKTICK::class, + ]; + + /** + * @var string + */ + protected $filename; + + /** + * @var array + */ + protected $tokens = []; + + /** + * @var array + */ + protected $tokensByLine = []; + + /** + * @var int + */ + protected $position = 0; + + /** + * @var array + */ + protected $linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0]; + + /** + * @var array + */ + protected $classes; + + /** + * @var array + */ + protected $functions; + + /** + * @var array + */ + protected $includes; + + /** + * @var array + */ + protected $interfaces; + + /** + * @var array + */ + protected $traits; + + /** + * @var array + */ + protected $lineToFunctionMap = []; + + /** + * Constructor. + * + * @param string $sourceCode + */ + public function __construct($sourceCode) + { + if (\is_file($sourceCode)) { + $this->filename = $sourceCode; + $sourceCode = \file_get_contents($sourceCode); + } + + $this->scan($sourceCode); + } + + /** + * Destructor. + */ + public function __destruct() + { + $this->tokens = []; + $this->tokensByLine = []; + } + + /** + * @return string + */ + public function __toString() + { + $buffer = ''; + + foreach ($this as $token) { + $buffer .= $token; + } + + return $buffer; + } + + /** + * @return string + */ + public function getFilename() + { + return $this->filename; + } + + /** + * @return int + */ + public function count() + { + return \count($this->tokens); + } + + /** + * @return PHP_Token[] + */ + public function tokens() + { + return $this->tokens; + } + + /** + * @return array + */ + public function getClasses() + { + if ($this->classes !== null) { + return $this->classes; + } + + $this->parse(); + + return $this->classes; + } + + /** + * @return array + */ + public function getFunctions() + { + if ($this->functions !== null) { + return $this->functions; + } + + $this->parse(); + + return $this->functions; + } + + /** + * @return array + */ + public function getInterfaces() + { + if ($this->interfaces !== null) { + return $this->interfaces; + } + + $this->parse(); + + return $this->interfaces; + } + + /** + * @return array + */ + public function getTraits() + { + if ($this->traits !== null) { + return $this->traits; + } + + $this->parse(); + + return $this->traits; + } + + /** + * Gets the names of all files that have been included + * using include(), include_once(), require() or require_once(). + * + * Parameter $categorize set to TRUE causing this function to return a + * multi-dimensional array with categories in the keys of the first dimension + * and constants and their values in the second dimension. + * + * Parameter $category allow to filter following specific inclusion type + * + * @param bool $categorize OPTIONAL + * @param string $category OPTIONAL Either 'require_once', 'require', + * 'include_once', 'include' + * + * @return array + */ + public function getIncludes($categorize = false, $category = null) + { + if ($this->includes === null) { + $this->includes = [ + 'require_once' => [], + 'require' => [], + 'include_once' => [], + 'include' => [], + ]; + + foreach ($this->tokens as $token) { + switch (\get_class($token)) { + case PHP_Token_REQUIRE_ONCE::class: + case PHP_Token_REQUIRE::class: + case PHP_Token_INCLUDE_ONCE::class: + case PHP_Token_INCLUDE::class: + $this->includes[$token->getType()][] = $token->getName(); + + break; + } + } + } + + if (isset($this->includes[$category])) { + $includes = $this->includes[$category]; + } elseif ($categorize === false) { + $includes = \array_merge( + $this->includes['require_once'], + $this->includes['require'], + $this->includes['include_once'], + $this->includes['include'] + ); + } else { + $includes = $this->includes; + } + + return $includes; + } + + /** + * Returns the name of the function or method a line belongs to. + * + * @return string or null if the line is not in a function or method + */ + public function getFunctionForLine($line) + { + $this->parse(); + + if (isset($this->lineToFunctionMap[$line])) { + return $this->lineToFunctionMap[$line]; + } + } + + /** + * @return array + */ + public function getLinesOfCode() + { + return $this->linesOfCode; + } + + public function rewind()/*: void*/ + { + $this->position = 0; + } + + /** + * @return bool + */ + public function valid() + { + return isset($this->tokens[$this->position]); + } + + /** + * @return int + */ + public function key() + { + return $this->position; + } + + /** + * @return PHP_Token + */ + public function current() + { + return $this->tokens[$this->position]; + } + + public function next()/*: void*/ + { + $this->position++; + } + + /** + * @param int $offset + * + * @return bool + */ + public function offsetExists($offset) + { + return isset($this->tokens[$offset]); + } + + /** + * @param int $offset + * + * @throws OutOfBoundsException + */ + public function offsetGet($offset) + { + if (!$this->offsetExists($offset)) { + throw new OutOfBoundsException( + \sprintf( + 'No token at position "%s"', + $offset + ) + ); + } + + return $this->tokens[$offset]; + } + + /** + * @param int $offset + */ + public function offsetSet($offset, $value)/*: void*/ + { + $this->tokens[$offset] = $value; + } + + /** + * @param int $offset + * + * @throws OutOfBoundsException + */ + public function offsetUnset($offset)/*: void*/ + { + if (!$this->offsetExists($offset)) { + throw new OutOfBoundsException( + \sprintf( + 'No token at position "%s"', + $offset + ) + ); + } + + unset($this->tokens[$offset]); + } + + /** + * Seek to an absolute position. + * + * @param int $position + * + * @throws OutOfBoundsException + */ + public function seek($position)/*: void*/ + { + $this->position = $position; + + if (!$this->valid()) { + throw new OutOfBoundsException( + \sprintf( + 'No token at position "%s"', + $this->position + ) + ); + } + } + + /** + * Scans the source for sequences of characters and converts them into a + * stream of tokens. + * + * @param string $sourceCode + */ + protected function scan($sourceCode)/*: void*/ + { + $id = 0; + $line = 1; + $tokens = \token_get_all($sourceCode); + $numTokens = \count($tokens); + + $lastNonWhitespaceTokenWasDoubleColon = false; + + $name = null; + + for ($i = 0; $i < $numTokens; ++$i) { + $token = $tokens[$i]; + $skip = 0; + + if (\is_array($token)) { + $name = \substr(\token_name($token[0]), 2); + $text = $token[1]; + + if ($lastNonWhitespaceTokenWasDoubleColon && $name == 'CLASS') { + $name = 'CLASS_NAME_CONSTANT'; + } elseif ($name == 'USE' && isset($tokens[$i + 2][0]) && $tokens[$i + 2][0] == \T_FUNCTION) { + $name = 'USE_FUNCTION'; + $text .= $tokens[$i + 1][1] . $tokens[$i + 2][1]; + $skip = 2; + } + + /** @var class-string $tokenClass */ + $tokenClass = 'PHP_Token_' . $name; + } else { + $text = $token; + $tokenClass = self::$customTokens[$token]; + } + + /* + * @see https://github.com/sebastianbergmann/php-token-stream/issues/95 + */ + if (PHP_MAJOR_VERSION >= 8 && + $name === 'WHITESPACE' && // Current token is T_WHITESPACE + isset($this->tokens[$id - 1]) && // Current token is not the first token + $this->tokens[$id - 1] instanceof PHP_Token_COMMENT && // Previous token is T_COMMENT + strpos((string) $this->tokens[$id - 1], '/*') === false && // Previous token is comment that starts with '#' or '//' + strpos($text, "\n") === 0 // Text of current token begins with newline + ) { + $this->tokens[$id - 1] = new PHP_Token_COMMENT( + $this->tokens[$id - 1] . "\n", + $this->tokens[$id - 1]->getLine(), + $this, + $id - 1 + ); + + $text = substr($text, 1); + + $line++; + + if (empty($text)) { + continue; + } + } + + if (!isset($this->tokensByLine[$line])) { + $this->tokensByLine[$line] = []; + } + + $token = new $tokenClass($text, $line, $this, $id++); + + $this->tokens[] = $token; + $this->tokensByLine[$line][] = $token; + + $line += \substr_count($text, "\n"); + + if ($tokenClass == PHP_Token_HALT_COMPILER::class) { + break; + } + + if ($name == 'DOUBLE_COLON') { + $lastNonWhitespaceTokenWasDoubleColon = true; + } elseif ($name != 'WHITESPACE') { + $lastNonWhitespaceTokenWasDoubleColon = false; + } + + $i += $skip; + } + + foreach ($this->tokens as $token) { + if (!$token instanceof PHP_Token_COMMENT && !$token instanceof PHP_Token_DOC_COMMENT) { + continue; + } + + foreach ($this->tokensByLine[$token->getLine()] as $_token) { + if (!$_token instanceof PHP_Token_COMMENT && !$_token instanceof PHP_Token_DOC_COMMENT && !$_token instanceof PHP_Token_WHITESPACE) { + continue 2; + } + } + + $this->linesOfCode['cloc'] += max(1, \substr_count((string) $token, "\n")); + } + + $this->linesOfCode['loc'] = \substr_count($sourceCode, "\n"); + $this->linesOfCode['ncloc'] = $this->linesOfCode['loc'] - + $this->linesOfCode['cloc']; + } + + protected function parse()/*: void*/ + { + $this->interfaces = []; + $this->classes = []; + $this->traits = []; + $this->functions = []; + $class = []; + $classEndLine = []; + $trait = false; + $traitEndLine = false; + $interface = false; + $interfaceEndLine = false; + + foreach ($this->tokens as $token) { + switch (\get_class($token)) { + case PHP_Token_HALT_COMPILER::class: + return; + + case PHP_Token_INTERFACE::class: + $interface = $token->getName(); + $interfaceEndLine = $token->getEndLine(); + + $this->interfaces[$interface] = [ + 'methods' => [], + 'parent' => $token->getParent(), + 'keywords' => $token->getKeywords(), + 'docblock' => $token->getDocblock(), + 'startLine' => $token->getLine(), + 'endLine' => $interfaceEndLine, + 'package' => $token->getPackage(), + 'file' => $this->filename, + ]; + + break; + + case PHP_Token_CLASS::class: + case PHP_Token_TRAIT::class: + $tmp = [ + 'methods' => [], + 'parent' => $token->getParent(), + 'interfaces'=> $token->getInterfaces(), + 'keywords' => $token->getKeywords(), + 'docblock' => $token->getDocblock(), + 'startLine' => $token->getLine(), + 'endLine' => $token->getEndLine(), + 'package' => $token->getPackage(), + 'file' => $this->filename, + ]; + + if ($token instanceof PHP_Token_CLASS) { + $class[] = $token->getName(); + $classEndLine[] = $token->getEndLine(); + + if ($token->getName() !== null) { + $this->classes[$class[\count($class) - 1]] = $tmp; + } + } else { + $trait = $token->getName(); + $traitEndLine = $token->getEndLine(); + $this->traits[$trait] = $tmp; + } + + break; + + case PHP_Token_FUNCTION::class: + $name = $token->getName(); + $tmp = [ + 'docblock' => $token->getDocblock(), + 'keywords' => $token->getKeywords(), + 'visibility'=> $token->getVisibility(), + 'signature' => $token->getSignature(), + 'startLine' => $token->getLine(), + 'endLine' => $token->getEndLine(), + 'ccn' => $token->getCCN(), + 'file' => $this->filename, + ]; + + if (empty($class) && + $trait === false && + $interface === false) { + $this->functions[$name] = $tmp; + + $this->addFunctionToMap( + $name, + $tmp['startLine'], + $tmp['endLine'] + ); + } elseif (!empty($class)) { + if ($class[\count($class) - 1] !== null) { + $this->classes[$class[\count($class) - 1]]['methods'][$name] = $tmp; + + $this->addFunctionToMap( + $class[\count($class) - 1] . '::' . $name, + $tmp['startLine'], + $tmp['endLine'] + ); + } + } elseif ($trait !== false) { + $this->traits[$trait]['methods'][$name] = $tmp; + + $this->addFunctionToMap( + $trait . '::' . $name, + $tmp['startLine'], + $tmp['endLine'] + ); + } else { + $this->interfaces[$interface]['methods'][$name] = $tmp; + } + + break; + + case PHP_Token_CLOSE_CURLY::class: + if (!empty($classEndLine) && + $classEndLine[\count($classEndLine) - 1] == $token->getLine()) { + \array_pop($classEndLine); + \array_pop($class); + } elseif ($traitEndLine !== false && + $traitEndLine == $token->getLine()) { + $trait = false; + $traitEndLine = false; + } elseif ($interfaceEndLine !== false && + $interfaceEndLine == $token->getLine()) { + $interface = false; + $interfaceEndLine = false; + } + + break; + } + } + } + + /** + * @param string $name + * @param int $startLine + * @param int $endLine + */ + private function addFunctionToMap($name, $startLine, $endLine): void + { + for ($line = $startLine; $line <= $endLine; $line++) { + $this->lineToFunctionMap[$line] = $name; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/String.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/String.php new file mode 100644 index 0000000000..89deb00484 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/String.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_STRING extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringCast.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringCast.php new file mode 100644 index 0000000000..f2df377cea --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringCast.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_STRING_CAST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringVarname.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringVarname.php new file mode 100644 index 0000000000..9012f1f9b7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/StringVarname.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_STRING_VARNAME extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Switch.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Switch.php new file mode 100644 index 0000000000..030d43b521 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Switch.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_SWITCH extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Throw.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Throw.php new file mode 100644 index 0000000000..213fda067b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Throw.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_THROW extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Tilde.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Tilde.php new file mode 100644 index 0000000000..c6c6ca5b9f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Tilde.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_TILDE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Token.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Token.php new file mode 100644 index 0000000000..d6280f3e90 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Token.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +abstract class PHP_Token +{ + /** + * @var string + */ + protected $text; + + /** + * @var int + */ + protected $line; + + /** + * @var PHP_Token_Stream + */ + protected $tokenStream; + + /** + * @var int + */ + protected $id; + + /** + * @param string $text + * @param int $line + * @param int $id + */ + public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id) + { + $this->text = $text; + $this->line = $line; + $this->tokenStream = $tokenStream; + $this->id = $id; + } + + /** + * @return string + */ + public function __toString() + { + return $this->text; + } + + /** + * @return int + */ + public function getLine() + { + return $this->line; + } + + /** + * @return int + */ + public function getId() + { + return $this->id; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScope.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScope.php new file mode 100644 index 0000000000..876b3508b9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScope.php @@ -0,0 +1,107 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +abstract class PHP_TokenWithScope extends PHP_Token +{ + /** + * @var int + */ + protected $endTokenId; + + /** + * Get the docblock for this token. + * + * This method will fetch the docblock belonging to the current token. The + * docblock must be placed on the line directly above the token to be + * recognized. + * + * @return null|string Returns the docblock as a string if found + */ + public function getDocblock() + { + $tokens = $this->tokenStream->tokens(); + $currentLineNumber = $tokens[$this->id]->getLine(); + $prevLineNumber = $currentLineNumber - 1; + + for ($i = $this->id - 1; $i; $i--) { + if (!isset($tokens[$i])) { + return; + } + + if ($tokens[$i] instanceof PHP_Token_FUNCTION || + $tokens[$i] instanceof PHP_Token_CLASS || + $tokens[$i] instanceof PHP_Token_TRAIT) { + // Some other trait, class or function, no docblock can be + // used for the current token + break; + } + + $line = $tokens[$i]->getLine(); + + if ($line == $currentLineNumber || + ($line == $prevLineNumber && + $tokens[$i] instanceof PHP_Token_WHITESPACE)) { + continue; + } + + if ($line < $currentLineNumber && + !$tokens[$i] instanceof PHP_Token_DOC_COMMENT) { + break; + } + + return (string) $tokens[$i]; + } + } + + /** + * @return int + */ + public function getEndTokenId() + { + $block = 0; + $i = $this->id; + $tokens = $this->tokenStream->tokens(); + + while ($this->endTokenId === null && isset($tokens[$i])) { + if ($tokens[$i] instanceof PHP_Token_OPEN_CURLY || + $tokens[$i] instanceof PHP_Token_DOLLAR_OPEN_CURLY_BRACES || + $tokens[$i] instanceof PHP_Token_CURLY_OPEN) { + $block++; + } elseif ($tokens[$i] instanceof PHP_Token_CLOSE_CURLY) { + $block--; + + if ($block === 0) { + $this->endTokenId = $i; + } + } elseif (($this instanceof PHP_Token_FUNCTION || + $this instanceof PHP_Token_NAMESPACE) && + $tokens[$i] instanceof PHP_Token_SEMICOLON) { + if ($block === 0) { + $this->endTokenId = $i; + } + } + + $i++; + } + + if ($this->endTokenId === null) { + $this->endTokenId = $this->id; + } + + return $this->endTokenId; + } + + /** + * @return int + */ + public function getEndLine() + { + return $this->tokenStream[$this->getEndTokenId()]->getLine(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScopeAndVisibility.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScopeAndVisibility.php new file mode 100644 index 0000000000..fce0c8ea22 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TokenWithScopeAndVisibility.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope +{ + /** + * @return string + */ + public function getVisibility() + { + $tokens = $this->tokenStream->tokens(); + + for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) { + if (isset($tokens[$i]) && + ($tokens[$i] instanceof PHP_Token_PRIVATE || + $tokens[$i] instanceof PHP_Token_PROTECTED || + $tokens[$i] instanceof PHP_Token_PUBLIC)) { + return \strtolower( + \str_replace('PHP_Token_', '', PHP_Token_Util::getClass($tokens[$i])) + ); + } + + if (isset($tokens[$i]) && + !($tokens[$i] instanceof PHP_Token_STATIC || + $tokens[$i] instanceof PHP_Token_FINAL || + $tokens[$i] instanceof PHP_Token_ABSTRACT)) { + // no keywords; stop visibility search + break; + } + } + } + + /** + * @return string + */ + public function getKeywords() + { + $keywords = []; + $tokens = $this->tokenStream->tokens(); + + for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) { + if (isset($tokens[$i]) && + ($tokens[$i] instanceof PHP_Token_PRIVATE || + $tokens[$i] instanceof PHP_Token_PROTECTED || + $tokens[$i] instanceof PHP_Token_PUBLIC)) { + continue; + } + + if (isset($tokens[$i]) && + ($tokens[$i] instanceof PHP_Token_STATIC || + $tokens[$i] instanceof PHP_Token_FINAL || + $tokens[$i] instanceof PHP_Token_ABSTRACT)) { + $keywords[] = \strtolower( + \str_replace('PHP_Token_', '', PHP_Token_Util::getClass($tokens[$i])) + ); + } + } + + return \implode(',', $keywords); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Trait.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Trait.php new file mode 100644 index 0000000000..f635f5dfb2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Trait.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_TRAIT extends PHP_Token_INTERFACE +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TraitC.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TraitC.php new file mode 100644 index 0000000000..ae4b2a5ae5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/TraitC.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_TRAIT_C extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Try.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Try.php new file mode 100644 index 0000000000..8c3783e89d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Try.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_TRY extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Unset.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Unset.php new file mode 100644 index 0000000000..3d39d0b680 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Unset.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_UNSET extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UnsetCast.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UnsetCast.php new file mode 100644 index 0000000000..133ef29fcb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UnsetCast.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_UNSET_CAST extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Use.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Use.php new file mode 100644 index 0000000000..e62a549728 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Use.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_USE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UseFunction.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UseFunction.php new file mode 100644 index 0000000000..8250864a99 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/UseFunction.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_USE_FUNCTION extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Util.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Util.php new file mode 100644 index 0000000000..13b636c210 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Util.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +final class PHP_Token_Util +{ + public static function getClass($object): string + { + $parts = \explode('\\', \get_class($object)); + + return \array_pop($parts); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Var.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Var.php new file mode 100644 index 0000000000..3dbd16ff27 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Var.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_VAR extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Variable.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Variable.php new file mode 100644 index 0000000000..921e3ae85d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Variable.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_VARIABLE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/While.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/While.php new file mode 100644 index 0000000000..e92409fff2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/While.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_WHILE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Whitespace.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Whitespace.php new file mode 100644 index 0000000000..6b5b641ca9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Whitespace.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_WHITESPACE extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/XorEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/XorEqual.php new file mode 100644 index 0000000000..0095b283e8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/XorEqual.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_XOR_EQUAL extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Yield.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Yield.php new file mode 100644 index 0000000000..3fecb6c105 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/Yield.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_YIELD extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/YieldFrom.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/YieldFrom.php new file mode 100644 index 0000000000..8f1a716809 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/YieldFrom.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_YIELD_FROM extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/break.php b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/break.php new file mode 100644 index 0000000000..97e96fee45 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/php-token-stream/src/break.php @@ -0,0 +1,12 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +class PHP_Token_BREAK extends PHP_Token +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/.phpstorm.meta.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/.phpstorm.meta.php new file mode 100644 index 0000000000..5e4c4c2d7d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/.phpstorm.meta.php @@ -0,0 +1,45 @@ +=7.2` to allow the installation of PHPUnit 8.5 on PHP 8. Please note that the code coverage functionality is not available for PHPUnit 8.5 on PHP 8. + +### Fixed + +* [#4529](https://github.com/sebastianbergmann/phpunit/issues/4529): Debug mode of Xdebug 2 is not disabled for PHPT tests + +## [8.5.11] - 2020-11-27 + +### Changed + +* Bumped required version of `phpunit/php-code-coverage` + +## [8.5.10] - 2020-11-27 + +### Added + +* Support for Xdebug 3 + +### Fixed + +* [#4516](https://github.com/sebastianbergmann/phpunit/issues/4516): `phpunit/phpunit-selenium` does not work with PHPUnit 8.5.9 + +## [8.5.9] - 2020-11-10 + +### Fixed + +* [#3965](https://github.com/sebastianbergmann/phpunit/issues/3965): Process Isolation throws exceptions when PHPDBG is used +* [#4470](https://github.com/sebastianbergmann/phpunit/pull/4470): Infinite recursion when `--static-backup --strict-global-state` is used + +## [8.5.8] - 2020-06-22 + +### Fixed + +* [#4312](https://github.com/sebastianbergmann/phpunit/issues/4312): Fix for [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299) breaks backward compatibility + +## [8.5.7] - 2020-06-21 + +### Fixed + +* [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299): "No tests executed" does not always result in exit code `1` +* [#4306](https://github.com/sebastianbergmann/phpunit/issues/4306): Exceptions during code coverage driver initialization are not handled correctly + +## [8.5.6] - 2020-06-15 + +### Fixed + +* [#4211](https://github.com/sebastianbergmann/phpunit/issues/4211): `phpdbg_*()` functions are scoped to `PHPUnit\phpdbg_*()` + +## [8.5.5] - 2020-05-22 + +### Fixed + +* [#4033](https://github.com/sebastianbergmann/phpunit/issues/4033): Unexpected behaviour when `$GLOBALS` is deleted + +## [8.5.4] - 2020-04-23 + +### Changed + +* Changed how `PHPUnit\TextUI\Command` passes warnings to `PHPUnit\TextUI\TestRunner` + +## [8.5.3] - 2020-03-31 + +### Fixed + +* [#4017](https://github.com/sebastianbergmann/phpunit/issues/4017): Do not suggest refactoring to something that is also deprecated +* [#4133](https://github.com/sebastianbergmann/phpunit/issues/4133): `expectExceptionMessageRegExp()` has been removed in PHPUnit 9 without a deprecation warning being given in PHPUnit 8 +* [#4139](https://github.com/sebastianbergmann/phpunit/issues/4139): Cannot double interfaces that declare a constructor with PHP 8 +* [#4144](https://github.com/sebastianbergmann/phpunit/issues/4144): Empty objects are converted to empty arrays in JSON comparison failure diff + +## [8.5.2] - 2020-01-08 + +### Removed + +* `eval-stdin.php` has been removed, it was not used anymore since PHPUnit 7.2.7 + +## [8.5.1] - 2019-12-25 + +### Changed + +* `eval-stdin.php` can now only be executed with `cli` and `phpdbg` + +### Fixed + +* [#3983](https://github.com/sebastianbergmann/phpunit/issues/3983): Deprecation warning given too eagerly + +## [8.5.0] - 2019-12-06 + +### Added + +* [#3911](https://github.com/sebastianbergmann/phpunit/issues/3911): Support combined use of `addMethods()` and `onlyMethods()` +* [#3949](https://github.com/sebastianbergmann/phpunit/issues/3949): Introduce specialized assertions `assertFileEqualsCanonicalizing()`, `assertFileEqualsIgnoringCase()`, `assertStringEqualsFileCanonicalizing()`, `assertStringEqualsFileIgnoringCase()`, `assertFileNotEqualsCanonicalizing()`, `assertFileNotEqualsIgnoringCase()`, `assertStringNotEqualsFileCanonicalizing()`, and `assertStringNotEqualsFileIgnoringCase()` as alternative to using `assertFileEquals()` etc. with optional parameters + +### Changed + +* [#3860](https://github.com/sebastianbergmann/phpunit/pull/3860): Deprecate invoking PHPUnit commandline test runner with just a class name +* [#3950](https://github.com/sebastianbergmann/phpunit/issues/3950): Deprecate optional parameters of `assertFileEquals()` etc. +* [#3955](https://github.com/sebastianbergmann/phpunit/issues/3955): Deprecate support for doubling multiple interfaces + +### Fixed + +* [#3953](https://github.com/sebastianbergmann/phpunit/issues/3953): Code Coverage for test executed in isolation does not work when the PHAR is used +* [#3967](https://github.com/sebastianbergmann/phpunit/issues/3967): Cannot double interface that extends interface that extends `\Throwable` +* [#3968](https://github.com/sebastianbergmann/phpunit/pull/3968): Test class run in a separate PHP process are passing when `exit` called inside + +[8.5.14]: https://github.com/sebastianbergmann/phpunit/compare/8.5.13...8.5.14 +[8.5.13]: https://github.com/sebastianbergmann/phpunit/compare/8.5.12...8.5.13 +[8.5.12]: https://github.com/sebastianbergmann/phpunit/compare/8.5.11...8.5.12 +[8.5.11]: https://github.com/sebastianbergmann/phpunit/compare/8.5.10...8.5.11 +[8.5.10]: https://github.com/sebastianbergmann/phpunit/compare/8.5.9...8.5.10 +[8.5.9]: https://github.com/sebastianbergmann/phpunit/compare/8.5.8...8.5.9 +[8.5.8]: https://github.com/sebastianbergmann/phpunit/compare/8.5.7...8.5.8 +[8.5.7]: https://github.com/sebastianbergmann/phpunit/compare/8.5.6...8.5.7 +[8.5.6]: https://github.com/sebastianbergmann/phpunit/compare/8.5.5...8.5.6 +[8.5.5]: https://github.com/sebastianbergmann/phpunit/compare/8.5.4...8.5.5 +[8.5.4]: https://github.com/sebastianbergmann/phpunit/compare/8.5.3...8.5.4 +[8.5.3]: https://github.com/sebastianbergmann/phpunit/compare/8.5.2...8.5.3 +[8.5.2]: https://github.com/sebastianbergmann/phpunit/compare/8.5.1...8.5.2 +[8.5.1]: https://github.com/sebastianbergmann/phpunit/compare/8.5.0...8.5.1 +[8.5.0]: https://github.com/sebastianbergmann/phpunit/compare/8.4.3...8.5.0 diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/LICENSE b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/LICENSE new file mode 100644 index 0000000000..0e3c9a0d58 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/LICENSE @@ -0,0 +1,33 @@ +PHPUnit + +Copyright (c) 2001-2021, 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. diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/README.md b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/README.md new file mode 100644 index 0000000000..edf80e4a28 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/README.md @@ -0,0 +1,41 @@ +# PHPUnit + +PHPUnit is a programmer-oriented testing framework for PHP. It is an instance of the xUnit architecture for unit testing frameworks. + +[![Latest Stable Version](https://img.shields.io/packagist/v/phpunit/phpunit.svg?style=flat-square)](https://packagist.org/packages/phpunit/phpunit) +[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.2-8892BF.svg?style=flat-square)](https://php.net/) +[![CI Status](https://github.com/sebastianbergmann/phpunit/workflows/CI/badge.svg?branch=8.5&event=push)](https://phpunit.de/build-status.html) +[![Type Coverage](https://shepherd.dev/github/sebastianbergmann/phpunit/coverage.svg)](https://shepherd.dev/github/sebastianbergmann/phpunit) + +## Installation + +We distribute a [PHP Archive (PHAR)](https://php.net/phar) that has all required (as well as some optional) dependencies of PHPUnit 8.5 bundled in a single file: + +```bash +$ wget https://phar.phpunit.de/phpunit-8.5.phar + +$ php phpunit-8.5.phar --version +``` + +Alternatively, you may use [Composer](https://getcomposer.org/) to download and install PHPUnit as well as its dependencies. Please refer to the "[Getting Started](https://phpunit.de/getting-started-with-phpunit.html)" guide for details on how to install PHPUnit. + +## Contribute + +Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects. + +## List of Contributors + +Thanks to everyone who has contributed to PHPUnit! You can find a detailed list of contributors on every PHPUnit related package on GitHub. This list shows only the major components: + +* [PHPUnit](https://github.com/sebastianbergmann/phpunit/graphs/contributors) +* [php-code-coverage](https://github.com/sebastianbergmann/php-code-coverage/graphs/contributors) + +A very special thanks to everyone who has contributed to the documentation and helps maintain the translations: + +* [English](https://github.com/sebastianbergmann/phpunit-documentation-english/graphs/contributors) +* [Spanish](https://github.com/sebastianbergmann/phpunit-documentation-spanish/graphs/contributors) +* [French](https://github.com/sebastianbergmann/phpunit-documentation-french/graphs/contributors) +* [Japanese](https://github.com/sebastianbergmann/phpunit-documentation-japanese/graphs/contributors) +* [Brazilian Portuguese](https://github.com/sebastianbergmann/phpunit-documentation-brazilian-portuguese/graphs/contributors) +* [Simplified Chinese](https://github.com/sebastianbergmann/phpunit-documentation-chinese/graphs/contributors) + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/composer.json b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/composer.json new file mode 100644 index 0000000000..86f7b21ee8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/composer.json @@ -0,0 +1,89 @@ +{ + "name": "phpunit/phpunit", + "description": "The PHP Unit Testing framework.", + "type": "library", + "keywords": [ + "phpunit", + "xunit", + "testing" + ], + "homepage": "https://phpunit.de/", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues" + }, + "prefer-stable": true, + "require": { + "php": ">=7.2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "doctrine/instantiator": "^1.3.1", + "myclabs/deep-copy": "^1.10.0", + "phar-io/manifest": "^2.0.1", + "phar-io/version": "^3.0.2", + "phpspec/prophecy": "^1.10.3", + "phpunit/php-code-coverage": "^7.0.12", + "phpunit/php-file-iterator": "^2.0.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^2.1.2", + "sebastian/comparator": "^3.0.2", + "sebastian/diff": "^3.0.2", + "sebastian/environment": "^4.2.3", + "sebastian/exporter": "^3.1.2", + "sebastian/global-state": "^3.0.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^2.0.1", + "sebastian/type": "^1.1.3", + "sebastian/version": "^2.0.1" + }, + "require-dev": { + "ext-PDO": "*" + }, + "config": { + "platform": { + "php": "7.2.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "suggest": { + "phpunit/php-invoker": "^2.0.0", + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/" + ], + "files": [ + "src/Framework/Assert/Functions.php", + "tests/_files/CoverageNamespacedFunctionTest.php", + "tests/_files/CoveredFunction.php", + "tests/_files/NamespaceCoveredFunction.php" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "8.5-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit new file mode 100755 index 0000000000..be046cc927 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit @@ -0,0 +1,61 @@ +#!/usr/bin/env php + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (version_compare('7.2.0', PHP_VERSION, '>')) { + fwrite( + STDERR, + sprintf( + 'This version of PHPUnit requires PHP >= 7.2.' . PHP_EOL . + 'You are using PHP %s (%s).' . PHP_EOL, + PHP_VERSION, + PHP_BINARY + ) + ); + + die(1); +} + +if (!ini_get('date.timezone')) { + ini_set('date.timezone', 'UTC'); +} + +foreach (array(__DIR__ . '/../../autoload.php', __DIR__ . '/../vendor/autoload.php', __DIR__ . '/vendor/autoload.php') as $file) { + if (file_exists($file)) { + define('PHPUNIT_COMPOSER_INSTALL', $file); + + break; + } +} + +unset($file); + +if (!defined('PHPUNIT_COMPOSER_INSTALL')) { + fwrite( + STDERR, + 'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL . + ' composer install' . PHP_EOL . PHP_EOL . + 'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL + ); + + die(1); +} + +$options = getopt('', array('prepend:')); + +if (isset($options['prepend'])) { + require $options['prepend']; +} + +unset($options); + +require PHPUNIT_COMPOSER_INSTALL; + +PHPUnit\TextUI\Command::main(); diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit.xsd b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit.xsd new file mode 100644 index 0000000000..29cfcf2be8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/phpunit.xsd @@ -0,0 +1,317 @@ + + + + + This Schema file defines the rules by which the XML configuration file of PHPUnit 8.5 may be structured. + + + + + + Root Element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The main type specifying the document structure + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Exception.php new file mode 100644 index 0000000000..4e7c33353b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Exception.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit; + +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface Exception extends Throwable +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert.php new file mode 100644 index 0000000000..12746ca45f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert.php @@ -0,0 +1,3645 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use const DEBUG_BACKTRACE_IGNORE_ARGS; +use const PHP_EOL; +use function array_key_exists; +use function array_shift; +use function array_unshift; +use function assert; +use function class_exists; +use function count; +use function debug_backtrace; +use function explode; +use function file_get_contents; +use function func_get_args; +use function implode; +use function interface_exists; +use function is_array; +use function is_bool; +use function is_int; +use function is_iterable; +use function is_object; +use function is_string; +use function preg_match; +use function preg_split; +use function sprintf; +use function strpos; +use ArrayAccess; +use Countable; +use DOMAttr; +use DOMDocument; +use DOMElement; +use PHPUnit\Framework\Constraint\ArrayHasKey; +use PHPUnit\Framework\Constraint\ArraySubset; +use PHPUnit\Framework\Constraint\Attribute; +use PHPUnit\Framework\Constraint\Callback; +use PHPUnit\Framework\Constraint\ClassHasAttribute; +use PHPUnit\Framework\Constraint\ClassHasStaticAttribute; +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\Constraint\Count; +use PHPUnit\Framework\Constraint\DirectoryExists; +use PHPUnit\Framework\Constraint\FileExists; +use PHPUnit\Framework\Constraint\GreaterThan; +use PHPUnit\Framework\Constraint\IsAnything; +use PHPUnit\Framework\Constraint\IsEmpty; +use PHPUnit\Framework\Constraint\IsEqual; +use PHPUnit\Framework\Constraint\IsFalse; +use PHPUnit\Framework\Constraint\IsFinite; +use PHPUnit\Framework\Constraint\IsIdentical; +use PHPUnit\Framework\Constraint\IsInfinite; +use PHPUnit\Framework\Constraint\IsInstanceOf; +use PHPUnit\Framework\Constraint\IsJson; +use PHPUnit\Framework\Constraint\IsNan; +use PHPUnit\Framework\Constraint\IsNull; +use PHPUnit\Framework\Constraint\IsReadable; +use PHPUnit\Framework\Constraint\IsTrue; +use PHPUnit\Framework\Constraint\IsType; +use PHPUnit\Framework\Constraint\IsWritable; +use PHPUnit\Framework\Constraint\JsonMatches; +use PHPUnit\Framework\Constraint\LessThan; +use PHPUnit\Framework\Constraint\LogicalAnd; +use PHPUnit\Framework\Constraint\LogicalNot; +use PHPUnit\Framework\Constraint\LogicalOr; +use PHPUnit\Framework\Constraint\LogicalXor; +use PHPUnit\Framework\Constraint\ObjectHasAttribute; +use PHPUnit\Framework\Constraint\RegularExpression; +use PHPUnit\Framework\Constraint\SameSize; +use PHPUnit\Framework\Constraint\StringContains; +use PHPUnit\Framework\Constraint\StringEndsWith; +use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; +use PHPUnit\Framework\Constraint\StringStartsWith; +use PHPUnit\Framework\Constraint\TraversableContains; +use PHPUnit\Framework\Constraint\TraversableContainsEqual; +use PHPUnit\Framework\Constraint\TraversableContainsIdentical; +use PHPUnit\Framework\Constraint\TraversableContainsOnly; +use PHPUnit\Util\Type; +use PHPUnit\Util\Xml; +use ReflectionClass; +use ReflectionException; +use ReflectionObject; +use Traversable; + +/** + * A set of assertion methods. + */ +abstract class Assert +{ + /** + * @var int + */ + private static $count = 0; + + /** + * Asserts that an array has a specified key. + * + * @param int|string $key + * @param array|ArrayAccess $array + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertArrayHasKey($key, $array, string $message = ''): void + { + if (!(is_int($key) || is_string($key))) { + throw InvalidArgumentException::create( + 1, + 'integer or string' + ); + } + + if (!(is_array($array) || $array instanceof ArrayAccess)) { + throw InvalidArgumentException::create( + 2, + 'array or ArrayAccess' + ); + } + + $constraint = new ArrayHasKey($key); + + static::assertThat($array, $constraint, $message); + } + + /** + * Asserts that an array has a specified subset. + * + * @param array|ArrayAccess $subset + * @param array|ArrayAccess $array + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @codeCoverageIgnore + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494 + */ + public static function assertArraySubset($subset, $array, bool $checkForObjectIdentity = false, string $message = ''): void + { + self::createWarning('assertArraySubset() is deprecated and will be removed in PHPUnit 9.'); + + if (!(is_array($subset) || $subset instanceof ArrayAccess)) { + throw InvalidArgumentException::create( + 1, + 'array or ArrayAccess' + ); + } + + if (!(is_array($array) || $array instanceof ArrayAccess)) { + throw InvalidArgumentException::create( + 2, + 'array or ArrayAccess' + ); + } + + $constraint = new ArraySubset($subset, $checkForObjectIdentity); + + static::assertThat($array, $constraint, $message); + } + + /** + * Asserts that an array does not have a specified key. + * + * @param int|string $key + * @param array|ArrayAccess $array + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertArrayNotHasKey($key, $array, string $message = ''): void + { + if (!(is_int($key) || is_string($key))) { + throw InvalidArgumentException::create( + 1, + 'integer or string' + ); + } + + if (!(is_array($array) || $array instanceof ArrayAccess)) { + throw InvalidArgumentException::create( + 2, + 'array or ArrayAccess' + ); + } + + $constraint = new LogicalNot( + new ArrayHasKey($key) + ); + + static::assertThat($array, $constraint, $message); + } + + /** + * Asserts that a haystack contains a needle. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + // @codeCoverageIgnoreStart + if (is_string($haystack)) { + self::createWarning('Using assertContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringContainsString() or assertStringContainsStringIgnoringCase() instead.'); + } + + if (!$checkForObjectIdentity) { + self::createWarning('The optional $checkForObjectIdentity parameter of assertContains() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertContainsEquals() instead.'); + } + + if ($checkForNonObjectIdentity) { + self::createWarning('The optional $checkForNonObjectIdentity parameter of assertContains() is deprecated and will be removed in PHPUnit 9.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertContains() is deprecated and will be removed in PHPUnit 9.'); + } + // @codeCoverageIgnoreEnd + + if (is_array($haystack) || + (is_object($haystack) && $haystack instanceof Traversable)) { + $constraint = new TraversableContains( + $needle, + $checkForObjectIdentity, + $checkForNonObjectIdentity + ); + } elseif (is_string($haystack)) { + if (!is_string($needle)) { + throw InvalidArgumentException::create( + 1, + 'string' + ); + } + + $constraint = new StringContains( + $needle, + $ignoreCase + ); + } else { + throw InvalidArgumentException::create( + 2, + 'array, traversable or string' + ); + } + + static::assertThat($haystack, $constraint, $message); + } + + public static function assertContainsEquals($needle, iterable $haystack, string $message = ''): void + { + $constraint = new TraversableContainsEqual($needle); + + static::assertThat($haystack, $constraint, $message); + } + + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object contains a needle. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + self::createWarning('assertAttributeContains() is deprecated and will be removed in PHPUnit 9.'); + + static::assertContains( + $needle, + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $message, + $ignoreCase, + $checkForObjectIdentity, + $checkForNonObjectIdentity + ); + } + + /** + * Asserts that a haystack does not contain a needle. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertNotContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + // @codeCoverageIgnoreStart + if (is_string($haystack)) { + self::createWarning('Using assertNotContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringNotContainsString() or assertStringNotContainsStringIgnoringCase() instead.'); + } + + if (!$checkForObjectIdentity) { + self::createWarning('The optional $checkForObjectIdentity parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotContainsEquals() instead.'); + } + + if ($checkForNonObjectIdentity) { + self::createWarning('The optional $checkForNonObjectIdentity parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9.'); + } + // @codeCoverageIgnoreEnd + + if (is_array($haystack) || + (is_object($haystack) && $haystack instanceof Traversable)) { + $constraint = new LogicalNot( + new TraversableContains( + $needle, + $checkForObjectIdentity, + $checkForNonObjectIdentity + ) + ); + } elseif (is_string($haystack)) { + if (!is_string($needle)) { + throw InvalidArgumentException::create( + 1, + 'string' + ); + } + + $constraint = new LogicalNot( + new StringContains( + $needle, + $ignoreCase + ) + ); + } else { + throw InvalidArgumentException::create( + 2, + 'array, traversable or string' + ); + } + + static::assertThat($haystack, $constraint, $message); + } + + public static function assertNotContainsEquals($needle, iterable $haystack, string $message = ''): void + { + $constraint = new LogicalNot(new TraversableContainsEqual($needle)); + + static::assertThat($haystack, $constraint, $message); + } + + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object does not contain a needle. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeNotContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + self::createWarning('assertAttributeNotContains() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotContains( + $needle, + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $message, + $ignoreCase, + $checkForObjectIdentity, + $checkForNonObjectIdentity + ); + } + + /** + * Asserts that a haystack contains only values of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void + { + if ($isNativeType === null) { + $isNativeType = Type::isType($type); + } + + static::assertThat( + $haystack, + new TraversableContainsOnly( + $type, + $isNativeType + ), + $message + ); + } + + /** + * Asserts that a haystack contains only instances of a given class name. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void + { + static::assertThat( + $haystack, + new TraversableContainsOnly( + $className, + false + ), + $message + ); + } + + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object contains only values of a given type. + * + * @param object|string $haystackClassOrObject + * @param bool $isNativeType + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void + { + self::createWarning('assertAttributeContainsOnly() is deprecated and will be removed in PHPUnit 9.'); + + static::assertContainsOnly( + $type, + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $isNativeType, + $message + ); + } + + /** + * Asserts that a haystack does not contain only values of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void + { + if ($isNativeType === null) { + $isNativeType = Type::isType($type); + } + + static::assertThat( + $haystack, + new LogicalNot( + new TraversableContainsOnly( + $type, + $isNativeType + ) + ), + $message + ); + } + + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object does not contain only values of a given + * type. + * + * @param object|string $haystackClassOrObject + * @param bool $isNativeType + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeNotContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void + { + self::createWarning('assertAttributeNotContainsOnly() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotContainsOnly( + $type, + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $isNativeType, + $message + ); + } + + /** + * Asserts the number of elements of an array, Countable or Traversable. + * + * @param Countable|iterable $haystack + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertCount(int $expectedCount, $haystack, string $message = ''): void + { + if (!$haystack instanceof Countable && !is_iterable($haystack)) { + throw InvalidArgumentException::create(2, 'countable or iterable'); + } + + static::assertThat( + $haystack, + new Count($expectedCount), + $message + ); + } + + /** + * Asserts the number of elements of an array, Countable or Traversable + * that is stored in an attribute. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeCount() is deprecated and will be removed in PHPUnit 9.'); + + static::assertCount( + $expectedCount, + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $message + ); + } + + /** + * Asserts the number of elements of an array, Countable or Traversable. + * + * @param Countable|iterable $haystack + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertNotCount(int $expectedCount, $haystack, string $message = ''): void + { + if (!$haystack instanceof Countable && !is_iterable($haystack)) { + throw InvalidArgumentException::create(2, 'countable or iterable'); + } + + $constraint = new LogicalNot( + new Count($expectedCount) + ); + + static::assertThat($haystack, $constraint, $message); + } + + /** + * Asserts the number of elements of an array, Countable or Traversable + * that is stored in an attribute. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeNotCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeNotCount() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotCount( + $expectedCount, + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $message + ); + } + + /** + * Asserts that two variables are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertEquals($expected, $actual, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void + { + // @codeCoverageIgnoreStart + if ($delta !== 0.0) { + self::createWarning('The optional $delta parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsWithDelta() instead.'); + } + + if ($maxDepth !== 10) { + self::createWarning('The optional $maxDepth parameter of assertEquals() is deprecated and will be removed in PHPUnit 9.'); + } + + if ($canonicalize) { + self::createWarning('The optional $canonicalize parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsCanonicalizing() instead.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsIgnoringCase() instead.'); + } + // @codeCoverageIgnoreEnd + + $constraint = new IsEqual( + $expected, + $delta, + $maxDepth, + $canonicalize, + $ignoreCase + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are equal (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void + { + $constraint = new IsEqual( + $expected, + 0.0, + 10, + true, + false + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are equal (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void + { + $constraint = new IsEqual( + $expected, + 0.0, + 10, + false, + true + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are equal (with delta). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void + { + $constraint = new IsEqual( + $expected, + $delta + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that a variable is equal to an attribute of an object. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void + { + self::createWarning('assertAttributeEquals() is deprecated and will be removed in PHPUnit 9.'); + + static::assertEquals( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message, + $delta, + $maxDepth, + $canonicalize, + $ignoreCase + ); + } + + /** + * Asserts that two variables are not equal. + * + * @param float $delta + * @param int $maxDepth + * @param bool $canonicalize + * @param bool $ignoreCase + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotEquals($expected, $actual, string $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false): void + { + // @codeCoverageIgnoreStart + if ($delta !== 0.0) { + self::createWarning('The optional $delta parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsWithDelta() instead.'); + } + + if ($maxDepth !== 10) { + self::createWarning('The optional $maxDepth parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9.'); + } + + if ($canonicalize) { + self::createWarning('The optional $canonicalize parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsCanonicalizing() instead.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsIgnoringCase() instead.'); + } + // @codeCoverageIgnoreEnd + + $constraint = new LogicalNot( + new IsEqual( + $expected, + $delta, + $maxDepth, + $canonicalize, + $ignoreCase + ) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are not equal (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void + { + $constraint = new LogicalNot( + new IsEqual( + $expected, + 0.0, + 10, + true, + false + ) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are not equal (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void + { + $constraint = new LogicalNot( + new IsEqual( + $expected, + 0.0, + 10, + false, + true + ) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that two variables are not equal (with delta). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void + { + $constraint = new LogicalNot( + new IsEqual( + $expected, + $delta + ) + ); + + static::assertThat($actual, $constraint, $message); + } + + /** + * Asserts that a variable is not equal to an attribute of an object. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeNotEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void + { + self::createWarning('assertAttributeNotEquals() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotEquals( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message, + $delta, + $maxDepth, + $canonicalize, + $ignoreCase + ); + } + + /** + * Asserts that a variable is empty. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert empty $actual + */ + public static function assertEmpty($actual, string $message = ''): void + { + static::assertThat($actual, static::isEmpty(), $message); + } + + /** + * Asserts that a static attribute of a class or an attribute of an object + * is empty. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeEmpty() is deprecated and will be removed in PHPUnit 9.'); + + static::assertEmpty( + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $message + ); + } + + /** + * Asserts that a variable is not empty. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !empty $actual + */ + public static function assertNotEmpty($actual, string $message = ''): void + { + static::assertThat($actual, static::logicalNot(static::isEmpty()), $message); + } + + /** + * Asserts that a static attribute of a class or an attribute of an object + * is not empty. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeNotEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeNotEmpty() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotEmpty( + static::readAttribute($haystackClassOrObject, $haystackAttributeName), + $message + ); + } + + /** + * Asserts that a value is greater than another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertGreaterThan($expected, $actual, string $message = ''): void + { + static::assertThat($actual, static::greaterThan($expected), $message); + } + + /** + * Asserts that an attribute is greater than another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeGreaterThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeGreaterThan() is deprecated and will be removed in PHPUnit 9.'); + + static::assertGreaterThan( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that a value is greater than or equal to another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertGreaterThanOrEqual($expected, $actual, string $message = ''): void + { + static::assertThat( + $actual, + static::greaterThanOrEqual($expected), + $message + ); + } + + /** + * Asserts that an attribute is greater than or equal to another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeGreaterThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeGreaterThanOrEqual() is deprecated and will be removed in PHPUnit 9.'); + + static::assertGreaterThanOrEqual( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that a value is smaller than another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertLessThan($expected, $actual, string $message = ''): void + { + static::assertThat($actual, static::lessThan($expected), $message); + } + + /** + * Asserts that an attribute is smaller than another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeLessThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeLessThan() is deprecated and will be removed in PHPUnit 9.'); + + static::assertLessThan( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that a value is smaller than or equal to another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertLessThanOrEqual($expected, $actual, string $message = ''): void + { + static::assertThat($actual, static::lessThanOrEqual($expected), $message); + } + + /** + * Asserts that an attribute is smaller than or equal to another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeLessThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeLessThanOrEqual() is deprecated and will be removed in PHPUnit 9.'); + + static::assertLessThanOrEqual( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that the contents of one file is equal to the contents of another + * file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + // @codeCoverageIgnoreStart + if ($canonicalize) { + self::createWarning('The optional $canonicalize parameter of assertFileEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileEqualsCanonicalizing() instead.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertFileEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileEqualsIgnoringCase() instead.'); + } + // @codeCoverageIgnoreEnd + + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + $constraint = new IsEqual( + file_get_contents($expected), + 0.0, + 10, + $canonicalize, + $ignoreCase + ); + + static::assertThat(file_get_contents($actual), $constraint, $message); + } + + /** + * Asserts that the contents of one file is equal to the contents of another + * file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void + { + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + $constraint = new IsEqual( + file_get_contents($expected), + 0.0, + 10, + true + ); + + static::assertThat(file_get_contents($actual), $constraint, $message); + } + + /** + * Asserts that the contents of one file is equal to the contents of another + * file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void + { + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + $constraint = new IsEqual( + file_get_contents($expected), + 0.0, + 10, + false, + true + ); + + static::assertThat(file_get_contents($actual), $constraint, $message); + } + + /** + * Asserts that the contents of one file is not equal to the contents of + * another file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileNotEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + // @codeCoverageIgnoreStart + if ($canonicalize) { + self::createWarning('The optional $canonicalize parameter of assertFileNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileNotEqualsCanonicalizing() instead.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertFileNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertFileNotEqualsIgnoringCase() instead.'); + } + // @codeCoverageIgnoreEnd + + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + $constraint = new LogicalNot( + new IsEqual( + file_get_contents($expected), + 0.0, + 10, + $canonicalize, + $ignoreCase + ) + ); + + static::assertThat(file_get_contents($actual), $constraint, $message); + } + + /** + * Asserts that the contents of one file is not equal to the contents of another + * file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void + { + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + $constraint = new LogicalNot( + new IsEqual( + file_get_contents($expected), + 0.0, + 10, + true + ) + ); + + static::assertThat(file_get_contents($actual), $constraint, $message); + } + + /** + * Asserts that the contents of one file is not equal to the contents of another + * file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void + { + static::assertFileExists($expected, $message); + static::assertFileExists($actual, $message); + + $constraint = new LogicalNot( + new IsEqual( + file_get_contents($expected), + 0.0, + 10, + false, + true + ) + ); + + static::assertThat(file_get_contents($actual), $constraint, $message); + } + + /** + * Asserts that the contents of a string is equal + * to the contents of a file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + // @codeCoverageIgnoreStart + if ($canonicalize) { + self::createWarning('The optional $canonicalize parameter of assertStringEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringEqualsFileCanonicalizing() instead.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertStringEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringEqualsFileIgnoringCase() instead.'); + } + // @codeCoverageIgnoreEnd + + static::assertFileExists($expectedFile, $message); + + $constraint = new IsEqual( + file_get_contents($expectedFile), + 0.0, + 10, + $canonicalize, + $ignoreCase + ); + + static::assertThat($actualString, $constraint, $message); + } + + /** + * Asserts that the contents of a string is equal + * to the contents of a file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + + $constraint = new IsEqual( + file_get_contents($expectedFile), + 0.0, + 10, + true + ); + + static::assertThat($actualString, $constraint, $message); + } + + /** + * Asserts that the contents of a string is equal + * to the contents of a file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + + $constraint = new IsEqual( + file_get_contents($expectedFile), + 0.0, + 10, + false, + true + ); + + static::assertThat($actualString, $constraint, $message); + } + + /** + * Asserts that the contents of a string is not equal + * to the contents of a file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + // @codeCoverageIgnoreStart + if ($canonicalize) { + self::createWarning('The optional $canonicalize parameter of assertStringNotEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringNotEqualsFileCanonicalizing() instead.'); + } + + if ($ignoreCase) { + self::createWarning('The optional $ignoreCase parameter of assertStringNotEqualsFile() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertStringNotEqualsFileIgnoringCase() instead.'); + } + // @codeCoverageIgnoreEnd + + static::assertFileExists($expectedFile, $message); + + $constraint = new LogicalNot( + new IsEqual( + file_get_contents($expectedFile), + 0.0, + 10, + $canonicalize, + $ignoreCase + ) + ); + + static::assertThat($actualString, $constraint, $message); + } + + /** + * Asserts that the contents of a string is not equal + * to the contents of a file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + + $constraint = new LogicalNot( + new IsEqual( + file_get_contents($expectedFile), + 0.0, + 10, + true + ) + ); + + static::assertThat($actualString, $constraint, $message); + } + + /** + * Asserts that the contents of a string is not equal + * to the contents of a file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + + $constraint = new LogicalNot( + new IsEqual( + file_get_contents($expectedFile), + 0.0, + 10, + false, + true + ) + ); + + static::assertThat($actualString, $constraint, $message); + } + + /** + * Asserts that a file/dir is readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertIsReadable(string $filename, string $message = ''): void + { + static::assertThat($filename, new IsReadable, $message); + } + + /** + * Asserts that a file/dir exists and is not readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotIsReadable(string $filename, string $message = ''): void + { + static::assertThat($filename, new LogicalNot(new IsReadable), $message); + } + + /** + * Asserts that a file/dir exists and is writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertIsWritable(string $filename, string $message = ''): void + { + static::assertThat($filename, new IsWritable, $message); + } + + /** + * Asserts that a file/dir exists and is not writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotIsWritable(string $filename, string $message = ''): void + { + static::assertThat($filename, new LogicalNot(new IsWritable), $message); + } + + /** + * Asserts that a directory exists. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertDirectoryExists(string $directory, string $message = ''): void + { + static::assertThat($directory, new DirectoryExists, $message); + } + + /** + * Asserts that a directory does not exist. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertDirectoryNotExists(string $directory, string $message = ''): void + { + static::assertThat($directory, new LogicalNot(new DirectoryExists), $message); + } + + /** + * Asserts that a directory exists and is readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertDirectoryIsReadable(string $directory, string $message = ''): void + { + self::assertDirectoryExists($directory, $message); + self::assertIsReadable($directory, $message); + } + + /** + * Asserts that a directory exists and is not readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertDirectoryNotIsReadable(string $directory, string $message = ''): void + { + self::assertDirectoryExists($directory, $message); + self::assertNotIsReadable($directory, $message); + } + + /** + * Asserts that a directory exists and is writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertDirectoryIsWritable(string $directory, string $message = ''): void + { + self::assertDirectoryExists($directory, $message); + self::assertIsWritable($directory, $message); + } + + /** + * Asserts that a directory exists and is not writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertDirectoryNotIsWritable(string $directory, string $message = ''): void + { + self::assertDirectoryExists($directory, $message); + self::assertNotIsWritable($directory, $message); + } + + /** + * Asserts that a file exists. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileExists(string $filename, string $message = ''): void + { + static::assertThat($filename, new FileExists, $message); + } + + /** + * Asserts that a file does not exist. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileNotExists(string $filename, string $message = ''): void + { + static::assertThat($filename, new LogicalNot(new FileExists), $message); + } + + /** + * Asserts that a file exists and is readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileIsReadable(string $file, string $message = ''): void + { + self::assertFileExists($file, $message); + self::assertIsReadable($file, $message); + } + + /** + * Asserts that a file exists and is not readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileNotIsReadable(string $file, string $message = ''): void + { + self::assertFileExists($file, $message); + self::assertNotIsReadable($file, $message); + } + + /** + * Asserts that a file exists and is writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileIsWritable(string $file, string $message = ''): void + { + self::assertFileExists($file, $message); + self::assertIsWritable($file, $message); + } + + /** + * Asserts that a file exists and is not writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFileNotIsWritable(string $file, string $message = ''): void + { + self::assertFileExists($file, $message); + self::assertNotIsWritable($file, $message); + } + + /** + * Asserts that a condition is true. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert true $condition + */ + public static function assertTrue($condition, string $message = ''): void + { + static::assertThat($condition, static::isTrue(), $message); + } + + /** + * Asserts that a condition is not true. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !true $condition + */ + public static function assertNotTrue($condition, string $message = ''): void + { + static::assertThat($condition, static::logicalNot(static::isTrue()), $message); + } + + /** + * Asserts that a condition is false. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert false $condition + */ + public static function assertFalse($condition, string $message = ''): void + { + static::assertThat($condition, static::isFalse(), $message); + } + + /** + * Asserts that a condition is not false. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !false $condition + */ + public static function assertNotFalse($condition, string $message = ''): void + { + static::assertThat($condition, static::logicalNot(static::isFalse()), $message); + } + + /** + * Asserts that a variable is null. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert null $actual + */ + public static function assertNull($actual, string $message = ''): void + { + static::assertThat($actual, static::isNull(), $message); + } + + /** + * Asserts that a variable is not null. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !null $actual + */ + public static function assertNotNull($actual, string $message = ''): void + { + static::assertThat($actual, static::logicalNot(static::isNull()), $message); + } + + /** + * Asserts that a variable is finite. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertFinite($actual, string $message = ''): void + { + static::assertThat($actual, static::isFinite(), $message); + } + + /** + * Asserts that a variable is infinite. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertInfinite($actual, string $message = ''): void + { + static::assertThat($actual, static::isInfinite(), $message); + } + + /** + * Asserts that a variable is nan. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNan($actual, string $message = ''): void + { + static::assertThat($actual, static::isNan(), $message); + } + + /** + * Asserts that a class has a specified attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void + { + if (!self::isValidClassAttributeName($attributeName)) { + throw InvalidArgumentException::create(1, 'valid attribute name'); + } + + if (!class_exists($className)) { + throw InvalidArgumentException::create(2, 'class name'); + } + + static::assertThat($className, new ClassHasAttribute($attributeName), $message); + } + + /** + * Asserts that a class does not have a specified attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void + { + if (!self::isValidClassAttributeName($attributeName)) { + throw InvalidArgumentException::create(1, 'valid attribute name'); + } + + if (!class_exists($className)) { + throw InvalidArgumentException::create(2, 'class name'); + } + + static::assertThat( + $className, + new LogicalNot( + new ClassHasAttribute($attributeName) + ), + $message + ); + } + + /** + * Asserts that a class has a specified static attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void + { + if (!self::isValidClassAttributeName($attributeName)) { + throw InvalidArgumentException::create(1, 'valid attribute name'); + } + + if (!class_exists($className)) { + throw InvalidArgumentException::create(2, 'class name'); + } + + static::assertThat( + $className, + new ClassHasStaticAttribute($attributeName), + $message + ); + } + + /** + * Asserts that a class does not have a specified static attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void + { + if (!self::isValidClassAttributeName($attributeName)) { + throw InvalidArgumentException::create(1, 'valid attribute name'); + } + + if (!class_exists($className)) { + throw InvalidArgumentException::create(2, 'class name'); + } + + static::assertThat( + $className, + new LogicalNot( + new ClassHasStaticAttribute($attributeName) + ), + $message + ); + } + + /** + * Asserts that an object has a specified attribute. + * + * @param object $object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void + { + if (!self::isValidObjectAttributeName($attributeName)) { + throw InvalidArgumentException::create(1, 'valid attribute name'); + } + + if (!is_object($object)) { + throw InvalidArgumentException::create(2, 'object'); + } + + static::assertThat( + $object, + new ObjectHasAttribute($attributeName), + $message + ); + } + + /** + * Asserts that an object does not have a specified attribute. + * + * @param object $object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void + { + if (!self::isValidObjectAttributeName($attributeName)) { + throw InvalidArgumentException::create(1, 'valid attribute name'); + } + + if (!is_object($object)) { + throw InvalidArgumentException::create(2, 'object'); + } + + static::assertThat( + $object, + new LogicalNot( + new ObjectHasAttribute($attributeName) + ), + $message + ); + } + + /** + * Asserts that two variables have the same type and value. + * Used on objects, it asserts that two variables reference + * the same object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-template ExpectedType + * @psalm-param ExpectedType $expected + * @psalm-assert =ExpectedType $actual + */ + public static function assertSame($expected, $actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsIdentical($expected), + $message + ); + } + + /** + * Asserts that a variable and an attribute of an object have the same type + * and value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeSame() is deprecated and will be removed in PHPUnit 9.'); + + static::assertSame( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that two variables do not have the same type and value. + * Used on objects, it asserts that two variables do not reference + * the same object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotSame($expected, $actual, string $message = ''): void + { + if (is_bool($expected) && is_bool($actual)) { + static::assertNotEquals($expected, $actual, $message); + } + + static::assertThat( + $actual, + new LogicalNot( + new IsIdentical($expected) + ), + $message + ); + } + + /** + * Asserts that a variable and an attribute of an object do not have the + * same type and value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeNotSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + self::createWarning('assertAttributeNotSame() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotSame( + $expected, + static::readAttribute($actualClassOrObject, $actualAttributeName), + $message + ); + } + + /** + * Asserts that a variable is of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @psalm-template ExpectedType of object + * @psalm-param class-string $expected + * @psalm-assert =ExpectedType $actual + */ + public static function assertInstanceOf(string $expected, $actual, string $message = ''): void + { + if (!class_exists($expected) && !interface_exists($expected)) { + throw InvalidArgumentException::create(1, 'class or interface name'); + } + + static::assertThat( + $actual, + new IsInstanceOf($expected), + $message + ); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @psalm-param class-string $expected + */ + public static function assertAttributeInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + self::createWarning('assertAttributeInstanceOf() is deprecated and will be removed in PHPUnit 9.'); + + static::assertInstanceOf( + $expected, + static::readAttribute($classOrObject, $attributeName), + $message + ); + } + + /** + * Asserts that a variable is not of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @psalm-template ExpectedType of object + * @psalm-param class-string $expected + * @psalm-assert !ExpectedType $actual + */ + public static function assertNotInstanceOf(string $expected, $actual, string $message = ''): void + { + if (!class_exists($expected) && !interface_exists($expected)) { + throw InvalidArgumentException::create(1, 'class or interface name'); + } + + static::assertThat( + $actual, + new LogicalNot( + new IsInstanceOf($expected) + ), + $message + ); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @psalm-param class-string $expected + */ + public static function assertAttributeNotInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + self::createWarning('assertAttributeNotInstanceOf() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotInstanceOf( + $expected, + static::readAttribute($classOrObject, $attributeName), + $message + ); + } + + /** + * Asserts that a variable is of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 + * @codeCoverageIgnore + */ + public static function assertInternalType(string $expected, $actual, string $message = ''): void + { + self::createWarning( + sprintf( + 'assertInternalType() is deprecated and will be removed in PHPUnit 9. Refactor your test to use %s() instead.', + self::assertInternalTypeReplacement($expected, false) + ) + ); + + static::assertThat( + $actual, + new IsType($expected), + $message + ); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + self::createWarning('assertAttributeInternalType() is deprecated and will be removed in PHPUnit 9.'); + + static::assertInternalType( + $expected, + static::readAttribute($classOrObject, $attributeName), + $message + ); + } + + /** + * Asserts that a variable is of type array. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert array $actual + */ + public static function assertIsArray($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_ARRAY), + $message + ); + } + + /** + * Asserts that a variable is of type bool. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert bool $actual + */ + public static function assertIsBool($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_BOOL), + $message + ); + } + + /** + * Asserts that a variable is of type float. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert float $actual + */ + public static function assertIsFloat($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_FLOAT), + $message + ); + } + + /** + * Asserts that a variable is of type int. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert int $actual + */ + public static function assertIsInt($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_INT), + $message + ); + } + + /** + * Asserts that a variable is of type numeric. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert numeric $actual + */ + public static function assertIsNumeric($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_NUMERIC), + $message + ); + } + + /** + * Asserts that a variable is of type object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert object $actual + */ + public static function assertIsObject($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_OBJECT), + $message + ); + } + + /** + * Asserts that a variable is of type resource. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert resource $actual + */ + public static function assertIsResource($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_RESOURCE), + $message + ); + } + + /** + * Asserts that a variable is of type string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert string $actual + */ + public static function assertIsString($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_STRING), + $message + ); + } + + /** + * Asserts that a variable is of type scalar. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert scalar $actual + */ + public static function assertIsScalar($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_SCALAR), + $message + ); + } + + /** + * Asserts that a variable is of type callable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert callable $actual + */ + public static function assertIsCallable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_CALLABLE), + $message + ); + } + + /** + * Asserts that a variable is of type iterable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert iterable $actual + */ + public static function assertIsIterable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new IsType(IsType::TYPE_ITERABLE), + $message + ); + } + + /** + * Asserts that a variable is not of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 + * @codeCoverageIgnore + */ + public static function assertNotInternalType(string $expected, $actual, string $message = ''): void + { + self::createWarning( + sprintf( + 'assertNotInternalType() is deprecated and will be removed in PHPUnit 9. Refactor your test to use %s() instead.', + self::assertInternalTypeReplacement($expected, true) + ) + ); + + static::assertThat( + $actual, + new LogicalNot( + new IsType($expected) + ), + $message + ); + } + + /** + * Asserts that a variable is not of type array. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !array $actual + */ + public static function assertIsNotArray($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_ARRAY)), + $message + ); + } + + /** + * Asserts that a variable is not of type bool. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !bool $actual + */ + public static function assertIsNotBool($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_BOOL)), + $message + ); + } + + /** + * Asserts that a variable is not of type float. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !float $actual + */ + public static function assertIsNotFloat($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_FLOAT)), + $message + ); + } + + /** + * Asserts that a variable is not of type int. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !int $actual + */ + public static function assertIsNotInt($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_INT)), + $message + ); + } + + /** + * Asserts that a variable is not of type numeric. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !numeric $actual + */ + public static function assertIsNotNumeric($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_NUMERIC)), + $message + ); + } + + /** + * Asserts that a variable is not of type object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !object $actual + */ + public static function assertIsNotObject($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_OBJECT)), + $message + ); + } + + /** + * Asserts that a variable is not of type resource. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !resource $actual + */ + public static function assertIsNotResource($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_RESOURCE)), + $message + ); + } + + /** + * Asserts that a variable is not of type string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !string $actual + */ + public static function assertIsNotString($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_STRING)), + $message + ); + } + + /** + * Asserts that a variable is not of type scalar. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !scalar $actual + */ + public static function assertIsNotScalar($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_SCALAR)), + $message + ); + } + + /** + * Asserts that a variable is not of type callable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !callable $actual + */ + public static function assertIsNotCallable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_CALLABLE)), + $message + ); + } + + /** + * Asserts that a variable is not of type iterable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !iterable $actual + */ + public static function assertIsNotIterable($actual, string $message = ''): void + { + static::assertThat( + $actual, + new LogicalNot(new IsType(IsType::TYPE_ITERABLE)), + $message + ); + } + + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function assertAttributeNotInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + self::createWarning('assertAttributeNotInternalType() is deprecated and will be removed in PHPUnit 9.'); + + static::assertNotInternalType( + $expected, + static::readAttribute($classOrObject, $attributeName), + $message + ); + } + + /** + * Asserts that a string matches a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertRegExp(string $pattern, string $string, string $message = ''): void + { + static::assertThat($string, new RegularExpression($pattern), $message); + } + + /** + * Asserts that a string does not match a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertNotRegExp(string $pattern, string $string, string $message = ''): void + { + static::assertThat( + $string, + new LogicalNot( + new RegularExpression($pattern) + ), + $message + ); + } + + /** + * Assert that the size of two arrays (or `Countable` or `Traversable` objects) + * is the same. + * + * @param Countable|iterable $expected + * @param Countable|iterable $actual + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertSameSize($expected, $actual, string $message = ''): void + { + if (!$expected instanceof Countable && !is_iterable($expected)) { + throw InvalidArgumentException::create(1, 'countable or iterable'); + } + + if (!$actual instanceof Countable && !is_iterable($actual)) { + throw InvalidArgumentException::create(2, 'countable or iterable'); + } + + static::assertThat( + $actual, + new SameSize($expected), + $message + ); + } + + /** + * Assert that the size of two arrays (or `Countable` or `Traversable` objects) + * is not the same. + * + * @param Countable|iterable $expected + * @param Countable|iterable $actual + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertNotSameSize($expected, $actual, string $message = ''): void + { + if (!$expected instanceof Countable && !is_iterable($expected)) { + throw InvalidArgumentException::create(1, 'countable or iterable'); + } + + if (!$actual instanceof Countable && !is_iterable($actual)) { + throw InvalidArgumentException::create(2, 'countable or iterable'); + } + + static::assertThat( + $actual, + new LogicalNot( + new SameSize($expected) + ), + $message + ); + } + + /** + * Asserts that a string matches a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringMatchesFormat(string $format, string $string, string $message = ''): void + { + static::assertThat($string, new StringMatchesFormatDescription($format), $message); + } + + /** + * Asserts that a string does not match a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void + { + static::assertThat( + $string, + new LogicalNot( + new StringMatchesFormatDescription($format) + ), + $message + ); + } + + /** + * Asserts that a string matches a given format file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void + { + static::assertFileExists($formatFile, $message); + + static::assertThat( + $string, + new StringMatchesFormatDescription( + file_get_contents($formatFile) + ), + $message + ); + } + + /** + * Asserts that a string does not match a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void + { + static::assertFileExists($formatFile, $message); + + static::assertThat( + $string, + new LogicalNot( + new StringMatchesFormatDescription( + file_get_contents($formatFile) + ) + ), + $message + ); + } + + /** + * Asserts that a string starts with a given prefix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringStartsWith(string $prefix, string $string, string $message = ''): void + { + static::assertThat($string, new StringStartsWith($prefix), $message); + } + + /** + * Asserts that a string starts not with a given prefix. + * + * @param string $prefix + * @param string $string + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringStartsNotWith($prefix, $string, string $message = ''): void + { + static::assertThat( + $string, + new LogicalNot( + new StringStartsWith($prefix) + ), + $message + ); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringContainsString(string $needle, string $haystack, string $message = ''): void + { + $constraint = new StringContains($needle, false); + + static::assertThat($haystack, $constraint, $message); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void + { + $constraint = new StringContains($needle, true); + + static::assertThat($haystack, $constraint, $message); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void + { + $constraint = new LogicalNot(new StringContains($needle)); + + static::assertThat($haystack, $constraint, $message); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void + { + $constraint = new LogicalNot(new StringContains($needle, true)); + + static::assertThat($haystack, $constraint, $message); + } + + /** + * Asserts that a string ends with a given suffix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringEndsWith(string $suffix, string $string, string $message = ''): void + { + static::assertThat($string, new StringEndsWith($suffix), $message); + } + + /** + * Asserts that a string ends not with a given suffix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void + { + static::assertThat( + $string, + new LogicalNot( + new StringEndsWith($suffix) + ), + $message + ); + } + + /** + * Asserts that two XML files are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void + { + $expected = Xml::loadFile($expectedFile); + $actual = Xml::loadFile($actualFile); + + static::assertEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML files are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void + { + $expected = Xml::loadFile($expectedFile); + $actual = Xml::loadFile($actualFile); + + static::assertNotEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are equal. + * + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void + { + $expected = Xml::loadFile($expectedFile); + $actual = Xml::load($actualXml); + + static::assertEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are not equal. + * + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void + { + $expected = Xml::loadFile($expectedFile); + $actual = Xml::load($actualXml); + + static::assertNotEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are equal. + * + * @param DOMDocument|string $expectedXml + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = ''): void + { + $expected = Xml::load($expectedXml); + $actual = Xml::load($actualXml); + + static::assertEquals($expected, $actual, $message); + } + + /** + * Asserts that two XML documents are not equal. + * + * @param DOMDocument|string $expectedXml + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = ''): void + { + $expected = Xml::load($expectedXml); + $actual = Xml::load($actualXml); + + static::assertNotEquals($expected, $actual, $message); + } + + /** + * Asserts that a hierarchy of DOMElements matches. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws AssertionFailedError + * @throws ExpectationFailedException + */ + public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = false, string $message = ''): void + { + $expectedElement = Xml::import($expectedElement); + $actualElement = Xml::import($actualElement); + + static::assertSame( + $expectedElement->tagName, + $actualElement->tagName, + $message + ); + + if ($checkAttributes) { + static::assertSame( + $expectedElement->attributes->length, + $actualElement->attributes->length, + sprintf( + '%s%sNumber of attributes on node "%s" does not match', + $message, + !empty($message) ? "\n" : '', + $expectedElement->tagName + ) + ); + + for ($i = 0; $i < $expectedElement->attributes->length; $i++) { + $expectedAttribute = $expectedElement->attributes->item($i); + $actualAttribute = $actualElement->attributes->getNamedItem($expectedAttribute->name); + + assert($expectedAttribute instanceof DOMAttr); + + if (!$actualAttribute) { + static::fail( + sprintf( + '%s%sCould not find attribute "%s" on node "%s"', + $message, + !empty($message) ? "\n" : '', + $expectedAttribute->name, + $expectedElement->tagName + ) + ); + } + } + } + + Xml::removeCharacterDataNodes($expectedElement); + Xml::removeCharacterDataNodes($actualElement); + + static::assertSame( + $expectedElement->childNodes->length, + $actualElement->childNodes->length, + sprintf( + '%s%sNumber of child nodes of "%s" differs', + $message, + !empty($message) ? "\n" : '', + $expectedElement->tagName + ) + ); + + for ($i = 0; $i < $expectedElement->childNodes->length; $i++) { + static::assertEqualXMLStructure( + $expectedElement->childNodes->item($i), + $actualElement->childNodes->item($i), + $checkAttributes, + $message + ); + } + } + + /** + * Evaluates a PHPUnit\Framework\Constraint matcher object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertThat($value, Constraint $constraint, string $message = ''): void + { + self::$count += count($constraint); + + $constraint->evaluate($value, $message); + } + + /** + * Asserts that a string is a valid JSON string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJson(string $actualJson, string $message = ''): void + { + static::assertThat($actualJson, static::isJson(), $message); + } + + /** + * Asserts that two given JSON encoded objects or arrays are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void + { + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + static::assertThat($actualJson, new JsonMatches($expectedJson), $message); + } + + /** + * Asserts that two given JSON encoded objects or arrays are not equal. + * + * @param string $expectedJson + * @param string $actualJson + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = ''): void + { + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + static::assertThat( + $actualJson, + new LogicalNot( + new JsonMatches($expectedJson) + ), + $message + ); + } + + /** + * Asserts that the generated JSON encoded object and the content of the given file are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + static::assertThat($actualJson, new JsonMatches($expectedJson), $message); + } + + /** + * Asserts that the generated JSON encoded object and the content of the given file are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + static::assertThat( + $actualJson, + new LogicalNot( + new JsonMatches($expectedJson) + ), + $message + ); + } + + /** + * Asserts that two JSON files are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + static::assertFileExists($actualFile, $message); + + $actualJson = file_get_contents($actualFile); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + $constraintExpected = new JsonMatches( + $expectedJson + ); + + $constraintActual = new JsonMatches($actualJson); + + static::assertThat($expectedJson, $constraintActual, $message); + static::assertThat($actualJson, $constraintExpected, $message); + } + + /** + * Asserts that two JSON files are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public static function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void + { + static::assertFileExists($expectedFile, $message); + static::assertFileExists($actualFile, $message); + + $actualJson = file_get_contents($actualFile); + $expectedJson = file_get_contents($expectedFile); + + static::assertJson($expectedJson, $message); + static::assertJson($actualJson, $message); + + $constraintExpected = new JsonMatches( + $expectedJson + ); + + $constraintActual = new JsonMatches($actualJson); + + static::assertThat($expectedJson, new LogicalNot($constraintActual), $message); + static::assertThat($actualJson, new LogicalNot($constraintExpected), $message); + } + + /** + * @throws Exception + */ + public static function logicalAnd(): LogicalAnd + { + $constraints = func_get_args(); + + $constraint = new LogicalAnd; + $constraint->setConstraints($constraints); + + return $constraint; + } + + public static function logicalOr(): LogicalOr + { + $constraints = func_get_args(); + + $constraint = new LogicalOr; + $constraint->setConstraints($constraints); + + return $constraint; + } + + public static function logicalNot(Constraint $constraint): LogicalNot + { + return new LogicalNot($constraint); + } + + public static function logicalXor(): LogicalXor + { + $constraints = func_get_args(); + + $constraint = new LogicalXor; + $constraint->setConstraints($constraints); + + return $constraint; + } + + public static function anything(): IsAnything + { + return new IsAnything; + } + + public static function isTrue(): IsTrue + { + return new IsTrue; + } + + public static function callback(callable $callback): Callback + { + return new Callback($callback); + } + + public static function isFalse(): IsFalse + { + return new IsFalse; + } + + public static function isJson(): IsJson + { + return new IsJson; + } + + public static function isNull(): IsNull + { + return new IsNull; + } + + public static function isFinite(): IsFinite + { + return new IsFinite; + } + + public static function isInfinite(): IsInfinite + { + return new IsInfinite; + } + + public static function isNan(): IsNan + { + return new IsNan; + } + + /** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function attribute(Constraint $constraint, string $attributeName): Attribute + { + self::createWarning('attribute() is deprecated and will be removed in PHPUnit 9.'); + + return new Attribute($constraint, $attributeName); + } + + /** + * @deprecated Use containsEqual() or containsIdentical() instead + */ + public static function contains($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): TraversableContains + { + return new TraversableContains($value, $checkForObjectIdentity, $checkForNonObjectIdentity); + } + + public static function containsEqual($value): TraversableContainsEqual + { + return new TraversableContainsEqual($value); + } + + public static function containsIdentical($value): TraversableContainsIdentical + { + return new TraversableContainsIdentical($value); + } + + public static function containsOnly(string $type): TraversableContainsOnly + { + return new TraversableContainsOnly($type); + } + + public static function containsOnlyInstancesOf(string $className): TraversableContainsOnly + { + return new TraversableContainsOnly($className, false); + } + + /** + * @param int|string $key + */ + public static function arrayHasKey($key): ArrayHasKey + { + return new ArrayHasKey($key); + } + + public static function equalTo($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): IsEqual + { + return new IsEqual($value, $delta, $maxDepth, $canonicalize, $ignoreCase); + } + + /** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function attributeEqualTo(string $attributeName, $value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): Attribute + { + self::createWarning('attributeEqualTo() is deprecated and will be removed in PHPUnit 9.'); + + return static::attribute( + static::equalTo( + $value, + $delta, + $maxDepth, + $canonicalize, + $ignoreCase + ), + $attributeName + ); + } + + public static function isEmpty(): IsEmpty + { + return new IsEmpty; + } + + public static function isWritable(): IsWritable + { + return new IsWritable; + } + + public static function isReadable(): IsReadable + { + return new IsReadable; + } + + public static function directoryExists(): DirectoryExists + { + return new DirectoryExists; + } + + public static function fileExists(): FileExists + { + return new FileExists; + } + + public static function greaterThan($value): GreaterThan + { + return new GreaterThan($value); + } + + public static function greaterThanOrEqual($value): LogicalOr + { + return static::logicalOr( + new IsEqual($value), + new GreaterThan($value) + ); + } + + public static function classHasAttribute(string $attributeName): ClassHasAttribute + { + return new ClassHasAttribute($attributeName); + } + + public static function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute + { + return new ClassHasStaticAttribute($attributeName); + } + + public static function objectHasAttribute($attributeName): ObjectHasAttribute + { + return new ObjectHasAttribute($attributeName); + } + + public static function identicalTo($value): IsIdentical + { + return new IsIdentical($value); + } + + public static function isInstanceOf(string $className): IsInstanceOf + { + return new IsInstanceOf($className); + } + + public static function isType(string $type): IsType + { + return new IsType($type); + } + + public static function lessThan($value): LessThan + { + return new LessThan($value); + } + + public static function lessThanOrEqual($value): LogicalOr + { + return static::logicalOr( + new IsEqual($value), + new LessThan($value) + ); + } + + public static function matchesRegularExpression(string $pattern): RegularExpression + { + return new RegularExpression($pattern); + } + + public static function matches(string $string): StringMatchesFormatDescription + { + return new StringMatchesFormatDescription($string); + } + + public static function stringStartsWith($prefix): StringStartsWith + { + return new StringStartsWith($prefix); + } + + public static function stringContains(string $string, bool $case = true): StringContains + { + return new StringContains($string, $case); + } + + public static function stringEndsWith(string $suffix): StringEndsWith + { + return new StringEndsWith($suffix); + } + + public static function countOf(int $count): Count + { + return new Count($count); + } + + /** + * Fails a test with the given message. + * + * @throws AssertionFailedError + * + * @psalm-return never-return + */ + public static function fail(string $message = ''): void + { + self::$count++; + + throw new AssertionFailedError($message); + } + + /** + * Returns the value of an attribute of a class or an object. + * This also works for attributes that are declared protected or private. + * + * @param object|string $classOrObject + * + * @throws Exception + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function readAttribute($classOrObject, string $attributeName) + { + self::createWarning('readAttribute() is deprecated and will be removed in PHPUnit 9.'); + + if (!self::isValidClassAttributeName($attributeName)) { + throw InvalidArgumentException::create(2, 'valid attribute name'); + } + + if (is_string($classOrObject)) { + if (!class_exists($classOrObject)) { + throw InvalidArgumentException::create( + 1, + 'class name' + ); + } + + return static::getStaticAttribute( + $classOrObject, + $attributeName + ); + } + + if (is_object($classOrObject)) { + return static::getObjectAttribute( + $classOrObject, + $attributeName + ); + } + + throw InvalidArgumentException::create( + 1, + 'class name or object' + ); + } + + /** + * Returns the value of a static attribute. + * This also works for attributes that are declared protected or private. + * + * @throws Exception + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function getStaticAttribute(string $className, string $attributeName) + { + self::createWarning('getStaticAttribute() is deprecated and will be removed in PHPUnit 9.'); + + if (!class_exists($className)) { + throw InvalidArgumentException::create(1, 'class name'); + } + + if (!self::isValidClassAttributeName($attributeName)) { + throw InvalidArgumentException::create(2, 'valid attribute name'); + } + + try { + $class = new ReflectionClass($className); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + while ($class) { + $attributes = $class->getStaticProperties(); + + if (array_key_exists($attributeName, $attributes)) { + return $attributes[$attributeName]; + } + + $class = $class->getParentClass(); + } + + throw new Exception( + sprintf( + 'Attribute "%s" not found in class.', + $attributeName + ) + ); + } + + /** + * Returns the value of an object's attribute. + * This also works for attributes that are declared protected or private. + * + * @param object $object + * + * @throws Exception + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ + public static function getObjectAttribute($object, string $attributeName) + { + self::createWarning('getObjectAttribute() is deprecated and will be removed in PHPUnit 9.'); + + if (!is_object($object)) { + throw InvalidArgumentException::create(1, 'object'); + } + + if (!self::isValidClassAttributeName($attributeName)) { + throw InvalidArgumentException::create(2, 'valid attribute name'); + } + + $reflector = new ReflectionObject($object); + + do { + try { + $attribute = $reflector->getProperty($attributeName); + + if (!$attribute || $attribute->isPublic()) { + return $object->{$attributeName}; + } + + $attribute->setAccessible(true); + $value = $attribute->getValue($object); + $attribute->setAccessible(false); + + return $value; + } catch (ReflectionException $e) { + } + } while ($reflector = $reflector->getParentClass()); + + throw new Exception( + sprintf( + 'Attribute "%s" not found in object.', + $attributeName + ) + ); + } + + /** + * Mark the test as incomplete. + * + * @throws IncompleteTestError + * + * @psalm-return never-return + */ + public static function markTestIncomplete(string $message = ''): void + { + throw new IncompleteTestError($message); + } + + /** + * Mark the test as skipped. + * + * @throws SkippedTestError + * @throws SyntheticSkippedError + * + * @psalm-return never-return + */ + public static function markTestSkipped(string $message = ''): void + { + if ($hint = self::detectLocationHint($message)) { + $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + array_unshift($trace, $hint); + + throw new SyntheticSkippedError($hint['message'], 0, $hint['file'], (int) $hint['line'], $trace); + } + + throw new SkippedTestError($message); + } + + /** + * Return the current assertion count. + */ + public static function getCount(): int + { + return self::$count; + } + + /** + * Reset the assertion counter. + */ + public static function resetCount(): void + { + self::$count = 0; + } + + private static function detectLocationHint(string $message): ?array + { + $hint = null; + $lines = preg_split('/\r\n|\r|\n/', $message); + + while (strpos($lines[0], '__OFFSET') !== false) { + $offset = explode('=', array_shift($lines)); + + if ($offset[0] === '__OFFSET_FILE') { + $hint['file'] = $offset[1]; + } + + if ($offset[0] === '__OFFSET_LINE') { + $hint['line'] = $offset[1]; + } + } + + if ($hint) { + $hint['message'] = implode(PHP_EOL, $lines); + } + + return $hint; + } + + private static function isValidObjectAttributeName(string $attributeName): bool + { + return (bool) preg_match('/[^\x00-\x1f\x7f-\x9f]+/', $attributeName); + } + + private static function isValidClassAttributeName(string $attributeName): bool + { + return (bool) preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName); + } + + /** + * @codeCoverageIgnore + */ + private static function createWarning(string $warning): void + { + foreach (debug_backtrace() as $step) { + if (isset($step['object']) && $step['object'] instanceof TestCase) { + assert($step['object'] instanceof TestCase); + + $step['object']->addWarning($warning); + + break; + } + } + } + + private static function assertInternalTypeReplacement(string $type, bool $not): string + { + switch ($type) { + case 'numeric': + return 'assertIs' . ($not ? 'Not' : '') . 'Numeric'; + + case 'integer': + case 'int': + return 'assertIs' . ($not ? 'Not' : '') . 'Int'; + + case 'double': + case 'float': + case 'real': + return 'assertIs' . ($not ? 'Not' : '') . 'Float'; + + case 'string': + return 'assertIs' . ($not ? 'Not' : '') . 'String'; + + case 'boolean': + case 'bool': + return 'assertIs' . ($not ? 'Not' : '') . 'Bool'; + + case 'null': + return 'assert' . ($not ? 'Not' : '') . 'Null'; + + case 'array': + return 'assertIs' . ($not ? 'Not' : '') . 'Array'; + + case 'object': + return 'assertIs' . ($not ? 'Not' : '') . 'Object'; + + case 'resource': + return 'assertIs' . ($not ? 'Not' : '') . 'Resource'; + + case 'scalar': + return 'assertIs' . ($not ? 'Not' : '') . 'Scalar'; + + case 'callable': + return 'assertIs' . ($not ? 'Not' : '') . 'Callable'; + + case 'iterable': + return 'assertIs' . ($not ? 'Not' : '') . 'Iterable'; + } + + throw new Exception( + sprintf( + '"%s" is not a type supported by assertInternalType() / assertNotInternalType()', + $type + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php new file mode 100644 index 0000000000..6af388b2cd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php @@ -0,0 +1,3009 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +use PHPUnit\Framework\Assert; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Constraint\ArrayHasKey; +use PHPUnit\Framework\Constraint\Attribute; +use PHPUnit\Framework\Constraint\Callback; +use PHPUnit\Framework\Constraint\ClassHasAttribute; +use PHPUnit\Framework\Constraint\ClassHasStaticAttribute; +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\Constraint\Count; +use PHPUnit\Framework\Constraint\DirectoryExists; +use PHPUnit\Framework\Constraint\FileExists; +use PHPUnit\Framework\Constraint\GreaterThan; +use PHPUnit\Framework\Constraint\IsAnything; +use PHPUnit\Framework\Constraint\IsEmpty; +use PHPUnit\Framework\Constraint\IsEqual; +use PHPUnit\Framework\Constraint\IsFalse; +use PHPUnit\Framework\Constraint\IsFinite; +use PHPUnit\Framework\Constraint\IsIdentical; +use PHPUnit\Framework\Constraint\IsInfinite; +use PHPUnit\Framework\Constraint\IsInstanceOf; +use PHPUnit\Framework\Constraint\IsJson; +use PHPUnit\Framework\Constraint\IsNan; +use PHPUnit\Framework\Constraint\IsNull; +use PHPUnit\Framework\Constraint\IsReadable; +use PHPUnit\Framework\Constraint\IsTrue; +use PHPUnit\Framework\Constraint\IsType; +use PHPUnit\Framework\Constraint\IsWritable; +use PHPUnit\Framework\Constraint\LessThan; +use PHPUnit\Framework\Constraint\LogicalAnd; +use PHPUnit\Framework\Constraint\LogicalNot; +use PHPUnit\Framework\Constraint\LogicalOr; +use PHPUnit\Framework\Constraint\LogicalXor; +use PHPUnit\Framework\Constraint\ObjectHasAttribute; +use PHPUnit\Framework\Constraint\RegularExpression; +use PHPUnit\Framework\Constraint\StringContains; +use PHPUnit\Framework\Constraint\StringEndsWith; +use PHPUnit\Framework\Constraint\StringMatchesFormatDescription; +use PHPUnit\Framework\Constraint\StringStartsWith; +use PHPUnit\Framework\Constraint\TraversableContains; +use PHPUnit\Framework\Constraint\TraversableContainsEqual; +use PHPUnit\Framework\Constraint\TraversableContainsIdentical; +use PHPUnit\Framework\Constraint\TraversableContainsOnly; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtIndex as InvokedAtIndexMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; +use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; +use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; +use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; +use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; +use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; +use PHPUnit\Framework\MockObject\Stub\ReturnStub; +use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; + +if (!function_exists('PHPUnit\Framework\assertArrayHasKey')) { + /** + * Asserts that an array has a specified key. + * + * @param int|string $key + * @param array|ArrayAccess $array + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertArrayHasKey + */ + function assertArrayHasKey($key, $array, string $message = ''): void + { + Assert::assertArrayHasKey(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertArraySubset')) { + /** + * Asserts that an array has a specified subset. + * + * @param array|ArrayAccess $subset + * @param array|ArrayAccess $array + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @codeCoverageIgnore + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494 + * @see Assert::assertArraySubset + */ + function assertArraySubset($subset, $array, bool $checkForObjectIdentity = false, string $message = ''): void + { + Assert::assertArraySubset(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertArrayNotHasKey')) { + /** + * Asserts that an array does not have a specified key. + * + * @param int|string $key + * @param array|ArrayAccess $array + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertArrayNotHasKey + */ + function assertArrayNotHasKey($key, $array, string $message = ''): void + { + Assert::assertArrayNotHasKey(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertContains')) { + /** + * Asserts that a haystack contains a needle. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertContains + */ + function assertContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + Assert::assertContains(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertContainsEquals')) { + function assertContainsEquals($needle, iterable $haystack, string $message = ''): void + { + Assert::assertContainsEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeContains')) { + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object contains a needle. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeContains + */ + function assertAttributeContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + Assert::assertAttributeContains(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotContains')) { + /** + * Asserts that a haystack does not contain a needle. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertNotContains + */ + function assertNotContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + Assert::assertNotContains(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotContainsEquals')) { + function assertNotContainsEquals($needle, iterable $haystack, string $message = ''): void + { + Assert::assertNotContainsEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotContains')) { + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object does not contain a needle. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeNotContains + */ + function assertAttributeNotContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void + { + Assert::assertAttributeNotContains(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertContainsOnly')) { + /** + * Asserts that a haystack contains only values of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertContainsOnly + */ + function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void + { + Assert::assertContainsOnly(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertContainsOnlyInstancesOf')) { + /** + * Asserts that a haystack contains only instances of a given class name. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertContainsOnlyInstancesOf + */ + function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void + { + Assert::assertContainsOnlyInstancesOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeContainsOnly')) { + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object contains only values of a given type. + * + * @param object|string $haystackClassOrObject + * @param bool $isNativeType + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeContainsOnly + */ + function assertAttributeContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void + { + Assert::assertAttributeContainsOnly(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotContainsOnly')) { + /** + * Asserts that a haystack does not contain only values of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotContainsOnly + */ + function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void + { + Assert::assertNotContainsOnly(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotContainsOnly')) { + /** + * Asserts that a haystack that is stored in a static attribute of a class + * or an attribute of an object does not contain only values of a given + * type. + * + * @param object|string $haystackClassOrObject + * @param bool $isNativeType + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeNotContainsOnly + */ + function assertAttributeNotContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void + { + Assert::assertAttributeNotContainsOnly(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertCount')) { + /** + * Asserts the number of elements of an array, Countable or Traversable. + * + * @param Countable|iterable $haystack + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertCount + */ + function assertCount(int $expectedCount, $haystack, string $message = ''): void + { + Assert::assertCount(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeCount')) { + /** + * Asserts the number of elements of an array, Countable or Traversable + * that is stored in an attribute. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeCount + */ + function assertAttributeCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + Assert::assertAttributeCount(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotCount')) { + /** + * Asserts the number of elements of an array, Countable or Traversable. + * + * @param Countable|iterable $haystack + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertNotCount + */ + function assertNotCount(int $expectedCount, $haystack, string $message = ''): void + { + Assert::assertNotCount(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotCount')) { + /** + * Asserts the number of elements of an array, Countable or Traversable + * that is stored in an attribute. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeNotCount + */ + function assertAttributeNotCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + Assert::assertAttributeNotCount(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertEquals')) { + /** + * Asserts that two variables are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertEquals + */ + function assertEquals($expected, $actual, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void + { + Assert::assertEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertEqualsCanonicalizing')) { + /** + * Asserts that two variables are equal (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertEqualsCanonicalizing + */ + function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void + { + Assert::assertEqualsCanonicalizing(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertEqualsIgnoringCase')) { + /** + * Asserts that two variables are equal (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertEqualsIgnoringCase + */ + function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void + { + Assert::assertEqualsIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertEqualsWithDelta')) { + /** + * Asserts that two variables are equal (with delta). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertEqualsWithDelta + */ + function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void + { + Assert::assertEqualsWithDelta(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeEquals')) { + /** + * Asserts that a variable is equal to an attribute of an object. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeEquals + */ + function assertAttributeEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void + { + Assert::assertAttributeEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotEquals')) { + /** + * Asserts that two variables are not equal. + * + * @param float $delta + * @param int $maxDepth + * @param bool $canonicalize + * @param bool $ignoreCase + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotEquals + */ + function assertNotEquals($expected, $actual, string $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false): void + { + Assert::assertNotEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotEqualsCanonicalizing')) { + /** + * Asserts that two variables are not equal (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotEqualsCanonicalizing + */ + function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void + { + Assert::assertNotEqualsCanonicalizing(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotEqualsIgnoringCase')) { + /** + * Asserts that two variables are not equal (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotEqualsIgnoringCase + */ + function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void + { + Assert::assertNotEqualsIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotEqualsWithDelta')) { + /** + * Asserts that two variables are not equal (with delta). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotEqualsWithDelta + */ + function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void + { + Assert::assertNotEqualsWithDelta(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotEquals')) { + /** + * Asserts that a variable is not equal to an attribute of an object. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeNotEquals + */ + function assertAttributeNotEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void + { + Assert::assertAttributeNotEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertEmpty')) { + /** + * Asserts that a variable is empty. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert empty $actual + * + * @see Assert::assertEmpty + */ + function assertEmpty($actual, string $message = ''): void + { + Assert::assertEmpty(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeEmpty')) { + /** + * Asserts that a static attribute of a class or an attribute of an object + * is empty. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeEmpty + */ + function assertAttributeEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + Assert::assertAttributeEmpty(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotEmpty')) { + /** + * Asserts that a variable is not empty. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !empty $actual + * + * @see Assert::assertNotEmpty + */ + function assertNotEmpty($actual, string $message = ''): void + { + Assert::assertNotEmpty(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotEmpty')) { + /** + * Asserts that a static attribute of a class or an attribute of an object + * is not empty. + * + * @param object|string $haystackClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeNotEmpty + */ + function assertAttributeNotEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void + { + Assert::assertAttributeNotEmpty(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertGreaterThan')) { + /** + * Asserts that a value is greater than another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertGreaterThan + */ + function assertGreaterThan($expected, $actual, string $message = ''): void + { + Assert::assertGreaterThan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeGreaterThan')) { + /** + * Asserts that an attribute is greater than another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeGreaterThan + */ + function assertAttributeGreaterThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + Assert::assertAttributeGreaterThan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertGreaterThanOrEqual')) { + /** + * Asserts that a value is greater than or equal to another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertGreaterThanOrEqual + */ + function assertGreaterThanOrEqual($expected, $actual, string $message = ''): void + { + Assert::assertGreaterThanOrEqual(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeGreaterThanOrEqual')) { + /** + * Asserts that an attribute is greater than or equal to another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeGreaterThanOrEqual + */ + function assertAttributeGreaterThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + Assert::assertAttributeGreaterThanOrEqual(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertLessThan')) { + /** + * Asserts that a value is smaller than another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertLessThan + */ + function assertLessThan($expected, $actual, string $message = ''): void + { + Assert::assertLessThan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeLessThan')) { + /** + * Asserts that an attribute is smaller than another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeLessThan + */ + function assertAttributeLessThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + Assert::assertAttributeLessThan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertLessThanOrEqual')) { + /** + * Asserts that a value is smaller than or equal to another value. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertLessThanOrEqual + */ + function assertLessThanOrEqual($expected, $actual, string $message = ''): void + { + Assert::assertLessThanOrEqual(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeLessThanOrEqual')) { + /** + * Asserts that an attribute is smaller than or equal to another value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeLessThanOrEqual + */ + function assertAttributeLessThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + Assert::assertAttributeLessThanOrEqual(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileEquals')) { + /** + * Asserts that the contents of one file is equal to the contents of another + * file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileEquals + */ + function assertFileEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + Assert::assertFileEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileEqualsCanonicalizing')) { + /** + * Asserts that the contents of one file is equal to the contents of another + * file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileEqualsCanonicalizing + */ + function assertFileEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void + { + Assert::assertFileEqualsCanonicalizing(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileEqualsIgnoringCase')) { + /** + * Asserts that the contents of one file is equal to the contents of another + * file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileEqualsIgnoringCase + */ + function assertFileEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void + { + Assert::assertFileEqualsIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileNotEquals')) { + /** + * Asserts that the contents of one file is not equal to the contents of + * another file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileNotEquals + */ + function assertFileNotEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + Assert::assertFileNotEquals(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileNotEqualsCanonicalizing')) { + /** + * Asserts that the contents of one file is not equal to the contents of another + * file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileNotEqualsCanonicalizing + */ + function assertFileNotEqualsCanonicalizing(string $expected, string $actual, string $message = ''): void + { + Assert::assertFileNotEqualsCanonicalizing(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileNotEqualsIgnoringCase')) { + /** + * Asserts that the contents of one file is not equal to the contents of another + * file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileNotEqualsIgnoringCase + */ + function assertFileNotEqualsIgnoringCase(string $expected, string $actual, string $message = ''): void + { + Assert::assertFileNotEqualsIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringEqualsFile')) { + /** + * Asserts that the contents of a string is equal + * to the contents of a file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringEqualsFile + */ + function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + Assert::assertStringEqualsFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringEqualsFileCanonicalizing')) { + /** + * Asserts that the contents of a string is equal + * to the contents of a file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringEqualsFileCanonicalizing + */ + function assertStringEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void + { + Assert::assertStringEqualsFileCanonicalizing(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringEqualsFileIgnoringCase')) { + /** + * Asserts that the contents of a string is equal + * to the contents of a file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringEqualsFileIgnoringCase + */ + function assertStringEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void + { + Assert::assertStringEqualsFileIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFile')) { + /** + * Asserts that the contents of a string is not equal + * to the contents of a file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringNotEqualsFile + */ + function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void + { + Assert::assertStringNotEqualsFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFileCanonicalizing')) { + /** + * Asserts that the contents of a string is not equal + * to the contents of a file (canonicalizing). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringNotEqualsFileCanonicalizing + */ + function assertStringNotEqualsFileCanonicalizing(string $expectedFile, string $actualString, string $message = ''): void + { + Assert::assertStringNotEqualsFileCanonicalizing(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringNotEqualsFileIgnoringCase')) { + /** + * Asserts that the contents of a string is not equal + * to the contents of a file (ignoring case). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringNotEqualsFileIgnoringCase + */ + function assertStringNotEqualsFileIgnoringCase(string $expectedFile, string $actualString, string $message = ''): void + { + Assert::assertStringNotEqualsFileIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsReadable')) { + /** + * Asserts that a file/dir is readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertIsReadable + */ + function assertIsReadable(string $filename, string $message = ''): void + { + Assert::assertIsReadable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotIsReadable')) { + /** + * Asserts that a file/dir exists and is not readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotIsReadable + */ + function assertNotIsReadable(string $filename, string $message = ''): void + { + Assert::assertNotIsReadable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsWritable')) { + /** + * Asserts that a file/dir exists and is writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertIsWritable + */ + function assertIsWritable(string $filename, string $message = ''): void + { + Assert::assertIsWritable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotIsWritable')) { + /** + * Asserts that a file/dir exists and is not writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotIsWritable + */ + function assertNotIsWritable(string $filename, string $message = ''): void + { + Assert::assertNotIsWritable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertDirectoryExists')) { + /** + * Asserts that a directory exists. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertDirectoryExists + */ + function assertDirectoryExists(string $directory, string $message = ''): void + { + Assert::assertDirectoryExists(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertDirectoryNotExists')) { + /** + * Asserts that a directory does not exist. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertDirectoryNotExists + */ + function assertDirectoryNotExists(string $directory, string $message = ''): void + { + Assert::assertDirectoryNotExists(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertDirectoryIsReadable')) { + /** + * Asserts that a directory exists and is readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertDirectoryIsReadable + */ + function assertDirectoryIsReadable(string $directory, string $message = ''): void + { + Assert::assertDirectoryIsReadable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertDirectoryNotIsReadable')) { + /** + * Asserts that a directory exists and is not readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertDirectoryNotIsReadable + */ + function assertDirectoryNotIsReadable(string $directory, string $message = ''): void + { + Assert::assertDirectoryNotIsReadable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertDirectoryIsWritable')) { + /** + * Asserts that a directory exists and is writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertDirectoryIsWritable + */ + function assertDirectoryIsWritable(string $directory, string $message = ''): void + { + Assert::assertDirectoryIsWritable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertDirectoryNotIsWritable')) { + /** + * Asserts that a directory exists and is not writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertDirectoryNotIsWritable + */ + function assertDirectoryNotIsWritable(string $directory, string $message = ''): void + { + Assert::assertDirectoryNotIsWritable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileExists')) { + /** + * Asserts that a file exists. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileExists + */ + function assertFileExists(string $filename, string $message = ''): void + { + Assert::assertFileExists(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileNotExists')) { + /** + * Asserts that a file does not exist. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileNotExists + */ + function assertFileNotExists(string $filename, string $message = ''): void + { + Assert::assertFileNotExists(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileIsReadable')) { + /** + * Asserts that a file exists and is readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileIsReadable + */ + function assertFileIsReadable(string $file, string $message = ''): void + { + Assert::assertFileIsReadable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileNotIsReadable')) { + /** + * Asserts that a file exists and is not readable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileNotIsReadable + */ + function assertFileNotIsReadable(string $file, string $message = ''): void + { + Assert::assertFileNotIsReadable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileIsWritable')) { + /** + * Asserts that a file exists and is writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileIsWritable + */ + function assertFileIsWritable(string $file, string $message = ''): void + { + Assert::assertFileIsWritable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFileNotIsWritable')) { + /** + * Asserts that a file exists and is not writable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFileNotIsWritable + */ + function assertFileNotIsWritable(string $file, string $message = ''): void + { + Assert::assertFileNotIsWritable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertTrue')) { + /** + * Asserts that a condition is true. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert true $condition + * + * @see Assert::assertTrue + */ + function assertTrue($condition, string $message = ''): void + { + Assert::assertTrue(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotTrue')) { + /** + * Asserts that a condition is not true. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !true $condition + * + * @see Assert::assertNotTrue + */ + function assertNotTrue($condition, string $message = ''): void + { + Assert::assertNotTrue(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFalse')) { + /** + * Asserts that a condition is false. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert false $condition + * + * @see Assert::assertFalse + */ + function assertFalse($condition, string $message = ''): void + { + Assert::assertFalse(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotFalse')) { + /** + * Asserts that a condition is not false. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !false $condition + * + * @see Assert::assertNotFalse + */ + function assertNotFalse($condition, string $message = ''): void + { + Assert::assertNotFalse(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNull')) { + /** + * Asserts that a variable is null. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert null $actual + * + * @see Assert::assertNull + */ + function assertNull($actual, string $message = ''): void + { + Assert::assertNull(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotNull')) { + /** + * Asserts that a variable is not null. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !null $actual + * + * @see Assert::assertNotNull + */ + function assertNotNull($actual, string $message = ''): void + { + Assert::assertNotNull(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertFinite')) { + /** + * Asserts that a variable is finite. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertFinite + */ + function assertFinite($actual, string $message = ''): void + { + Assert::assertFinite(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertInfinite')) { + /** + * Asserts that a variable is infinite. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertInfinite + */ + function assertInfinite($actual, string $message = ''): void + { + Assert::assertInfinite(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNan')) { + /** + * Asserts that a variable is nan. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNan + */ + function assertNan($actual, string $message = ''): void + { + Assert::assertNan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertClassHasAttribute')) { + /** + * Asserts that a class has a specified attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertClassHasAttribute + */ + function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void + { + Assert::assertClassHasAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertClassNotHasAttribute')) { + /** + * Asserts that a class does not have a specified attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertClassNotHasAttribute + */ + function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void + { + Assert::assertClassNotHasAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertClassHasStaticAttribute')) { + /** + * Asserts that a class has a specified static attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertClassHasStaticAttribute + */ + function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void + { + Assert::assertClassHasStaticAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertClassNotHasStaticAttribute')) { + /** + * Asserts that a class does not have a specified static attribute. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertClassNotHasStaticAttribute + */ + function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void + { + Assert::assertClassNotHasStaticAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertObjectHasAttribute')) { + /** + * Asserts that an object has a specified attribute. + * + * @param object $object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertObjectHasAttribute + */ + function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void + { + Assert::assertObjectHasAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertObjectNotHasAttribute')) { + /** + * Asserts that an object does not have a specified attribute. + * + * @param object $object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertObjectNotHasAttribute + */ + function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void + { + Assert::assertObjectNotHasAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertSame')) { + /** + * Asserts that two variables have the same type and value. + * Used on objects, it asserts that two variables reference + * the same object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-template ExpectedType + * @psalm-param ExpectedType $expected + * @psalm-assert =ExpectedType $actual + * + * @see Assert::assertSame + */ + function assertSame($expected, $actual, string $message = ''): void + { + Assert::assertSame(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeSame')) { + /** + * Asserts that a variable and an attribute of an object have the same type + * and value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeSame + */ + function assertAttributeSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + Assert::assertAttributeSame(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotSame')) { + /** + * Asserts that two variables do not have the same type and value. + * Used on objects, it asserts that two variables do not reference + * the same object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotSame + */ + function assertNotSame($expected, $actual, string $message = ''): void + { + Assert::assertNotSame(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotSame')) { + /** + * Asserts that a variable and an attribute of an object do not have the + * same type and value. + * + * @param object|string $actualClassOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeNotSame + */ + function assertAttributeNotSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void + { + Assert::assertAttributeNotSame(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertInstanceOf')) { + /** + * Asserts that a variable is of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @psalm-template ExpectedType of object + * @psalm-param class-string $expected + * @psalm-assert =ExpectedType $actual + * + * @see Assert::assertInstanceOf + */ + function assertInstanceOf(string $expected, $actual, string $message = ''): void + { + Assert::assertInstanceOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeInstanceOf')) { + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @psalm-param class-string $expected + * + * @see Assert::assertAttributeInstanceOf + */ + function assertAttributeInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + Assert::assertAttributeInstanceOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotInstanceOf')) { + /** + * Asserts that a variable is not of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @psalm-template ExpectedType of object + * @psalm-param class-string $expected + * @psalm-assert !ExpectedType $actual + * + * @see Assert::assertNotInstanceOf + */ + function assertNotInstanceOf(string $expected, $actual, string $message = ''): void + { + Assert::assertNotInstanceOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotInstanceOf')) { + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @psalm-param class-string $expected + * + * @see Assert::assertAttributeNotInstanceOf + */ + function assertAttributeNotInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + Assert::assertAttributeNotInstanceOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertInternalType')) { + /** + * Asserts that a variable is of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 + * @codeCoverageIgnore + * + * @see Assert::assertInternalType + */ + function assertInternalType(string $expected, $actual, string $message = ''): void + { + Assert::assertInternalType(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeInternalType')) { + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeInternalType + */ + function assertAttributeInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + Assert::assertAttributeInternalType(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsArray')) { + /** + * Asserts that a variable is of type array. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert array $actual + * + * @see Assert::assertIsArray + */ + function assertIsArray($actual, string $message = ''): void + { + Assert::assertIsArray(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsBool')) { + /** + * Asserts that a variable is of type bool. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert bool $actual + * + * @see Assert::assertIsBool + */ + function assertIsBool($actual, string $message = ''): void + { + Assert::assertIsBool(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsFloat')) { + /** + * Asserts that a variable is of type float. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert float $actual + * + * @see Assert::assertIsFloat + */ + function assertIsFloat($actual, string $message = ''): void + { + Assert::assertIsFloat(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsInt')) { + /** + * Asserts that a variable is of type int. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert int $actual + * + * @see Assert::assertIsInt + */ + function assertIsInt($actual, string $message = ''): void + { + Assert::assertIsInt(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNumeric')) { + /** + * Asserts that a variable is of type numeric. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert numeric $actual + * + * @see Assert::assertIsNumeric + */ + function assertIsNumeric($actual, string $message = ''): void + { + Assert::assertIsNumeric(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsObject')) { + /** + * Asserts that a variable is of type object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert object $actual + * + * @see Assert::assertIsObject + */ + function assertIsObject($actual, string $message = ''): void + { + Assert::assertIsObject(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsResource')) { + /** + * Asserts that a variable is of type resource. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert resource $actual + * + * @see Assert::assertIsResource + */ + function assertIsResource($actual, string $message = ''): void + { + Assert::assertIsResource(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsString')) { + /** + * Asserts that a variable is of type string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert string $actual + * + * @see Assert::assertIsString + */ + function assertIsString($actual, string $message = ''): void + { + Assert::assertIsString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsScalar')) { + /** + * Asserts that a variable is of type scalar. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert scalar $actual + * + * @see Assert::assertIsScalar + */ + function assertIsScalar($actual, string $message = ''): void + { + Assert::assertIsScalar(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsCallable')) { + /** + * Asserts that a variable is of type callable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert callable $actual + * + * @see Assert::assertIsCallable + */ + function assertIsCallable($actual, string $message = ''): void + { + Assert::assertIsCallable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsIterable')) { + /** + * Asserts that a variable is of type iterable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert iterable $actual + * + * @see Assert::assertIsIterable + */ + function assertIsIterable($actual, string $message = ''): void + { + Assert::assertIsIterable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotInternalType')) { + /** + * Asserts that a variable is not of a given type. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369 + * @codeCoverageIgnore + * + * @see Assert::assertNotInternalType + */ + function assertNotInternalType(string $expected, $actual, string $message = ''): void + { + Assert::assertNotInternalType(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotArray')) { + /** + * Asserts that a variable is not of type array. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !array $actual + * + * @see Assert::assertIsNotArray + */ + function assertIsNotArray($actual, string $message = ''): void + { + Assert::assertIsNotArray(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotBool')) { + /** + * Asserts that a variable is not of type bool. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !bool $actual + * + * @see Assert::assertIsNotBool + */ + function assertIsNotBool($actual, string $message = ''): void + { + Assert::assertIsNotBool(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotFloat')) { + /** + * Asserts that a variable is not of type float. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !float $actual + * + * @see Assert::assertIsNotFloat + */ + function assertIsNotFloat($actual, string $message = ''): void + { + Assert::assertIsNotFloat(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotInt')) { + /** + * Asserts that a variable is not of type int. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !int $actual + * + * @see Assert::assertIsNotInt + */ + function assertIsNotInt($actual, string $message = ''): void + { + Assert::assertIsNotInt(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotNumeric')) { + /** + * Asserts that a variable is not of type numeric. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !numeric $actual + * + * @see Assert::assertIsNotNumeric + */ + function assertIsNotNumeric($actual, string $message = ''): void + { + Assert::assertIsNotNumeric(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotObject')) { + /** + * Asserts that a variable is not of type object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !object $actual + * + * @see Assert::assertIsNotObject + */ + function assertIsNotObject($actual, string $message = ''): void + { + Assert::assertIsNotObject(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotResource')) { + /** + * Asserts that a variable is not of type resource. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !resource $actual + * + * @see Assert::assertIsNotResource + */ + function assertIsNotResource($actual, string $message = ''): void + { + Assert::assertIsNotResource(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotString')) { + /** + * Asserts that a variable is not of type string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !string $actual + * + * @see Assert::assertIsNotString + */ + function assertIsNotString($actual, string $message = ''): void + { + Assert::assertIsNotString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotScalar')) { + /** + * Asserts that a variable is not of type scalar. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !scalar $actual + * + * @see Assert::assertIsNotScalar + */ + function assertIsNotScalar($actual, string $message = ''): void + { + Assert::assertIsNotScalar(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotCallable')) { + /** + * Asserts that a variable is not of type callable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !callable $actual + * + * @see Assert::assertIsNotCallable + */ + function assertIsNotCallable($actual, string $message = ''): void + { + Assert::assertIsNotCallable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertIsNotIterable')) { + /** + * Asserts that a variable is not of type iterable. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-assert !iterable $actual + * + * @see Assert::assertIsNotIterable + */ + function assertIsNotIterable($actual, string $message = ''): void + { + Assert::assertIsNotIterable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertAttributeNotInternalType')) { + /** + * Asserts that an attribute is of a given type. + * + * @param object|string $classOrObject + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + * + * @see Assert::assertAttributeNotInternalType + */ + function assertAttributeNotInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void + { + Assert::assertAttributeNotInternalType(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertRegExp')) { + /** + * Asserts that a string matches a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertRegExp + */ + function assertRegExp(string $pattern, string $string, string $message = ''): void + { + Assert::assertRegExp(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotRegExp')) { + /** + * Asserts that a string does not match a given regular expression. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertNotRegExp + */ + function assertNotRegExp(string $pattern, string $string, string $message = ''): void + { + Assert::assertNotRegExp(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertSameSize')) { + /** + * Assert that the size of two arrays (or `Countable` or `Traversable` objects) + * is the same. + * + * @param Countable|iterable $expected + * @param Countable|iterable $actual + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertSameSize + */ + function assertSameSize($expected, $actual, string $message = ''): void + { + Assert::assertSameSize(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertNotSameSize')) { + /** + * Assert that the size of two arrays (or `Countable` or `Traversable` objects) + * is not the same. + * + * @param Countable|iterable $expected + * @param Countable|iterable $actual + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertNotSameSize + */ + function assertNotSameSize($expected, $actual, string $message = ''): void + { + Assert::assertNotSameSize(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringMatchesFormat')) { + /** + * Asserts that a string matches a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringMatchesFormat + */ + function assertStringMatchesFormat(string $format, string $string, string $message = ''): void + { + Assert::assertStringMatchesFormat(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormat')) { + /** + * Asserts that a string does not match a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringNotMatchesFormat + */ + function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void + { + Assert::assertStringNotMatchesFormat(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringMatchesFormatFile')) { + /** + * Asserts that a string matches a given format file. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringMatchesFormatFile + */ + function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void + { + Assert::assertStringMatchesFormatFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringNotMatchesFormatFile')) { + /** + * Asserts that a string does not match a given format string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringNotMatchesFormatFile + */ + function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void + { + Assert::assertStringNotMatchesFormatFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringStartsWith')) { + /** + * Asserts that a string starts with a given prefix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringStartsWith + */ + function assertStringStartsWith(string $prefix, string $string, string $message = ''): void + { + Assert::assertStringStartsWith(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringStartsNotWith')) { + /** + * Asserts that a string starts not with a given prefix. + * + * @param string $prefix + * @param string $string + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringStartsNotWith + */ + function assertStringStartsNotWith($prefix, $string, string $message = ''): void + { + Assert::assertStringStartsNotWith(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringContainsString')) { + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringContainsString + */ + function assertStringContainsString(string $needle, string $haystack, string $message = ''): void + { + Assert::assertStringContainsString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringContainsStringIgnoringCase')) { + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringContainsStringIgnoringCase + */ + function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void + { + Assert::assertStringContainsStringIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringNotContainsString')) { + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringNotContainsString + */ + function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void + { + Assert::assertStringNotContainsString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringNotContainsStringIgnoringCase')) { + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringNotContainsStringIgnoringCase + */ + function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void + { + Assert::assertStringNotContainsStringIgnoringCase(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringEndsWith')) { + /** + * Asserts that a string ends with a given suffix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringEndsWith + */ + function assertStringEndsWith(string $suffix, string $string, string $message = ''): void + { + Assert::assertStringEndsWith(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertStringEndsNotWith')) { + /** + * Asserts that a string ends not with a given suffix. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertStringEndsNotWith + */ + function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void + { + Assert::assertStringEndsNotWith(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertXmlFileEqualsXmlFile')) { + /** + * Asserts that two XML files are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertXmlFileEqualsXmlFile + */ + function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void + { + Assert::assertXmlFileEqualsXmlFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertXmlFileNotEqualsXmlFile')) { + /** + * Asserts that two XML files are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertXmlFileNotEqualsXmlFile + */ + function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void + { + Assert::assertXmlFileNotEqualsXmlFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertXmlStringEqualsXmlFile')) { + /** + * Asserts that two XML documents are equal. + * + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertXmlStringEqualsXmlFile + */ + function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void + { + Assert::assertXmlStringEqualsXmlFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertXmlStringNotEqualsXmlFile')) { + /** + * Asserts that two XML documents are not equal. + * + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertXmlStringNotEqualsXmlFile + */ + function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void + { + Assert::assertXmlStringNotEqualsXmlFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertXmlStringEqualsXmlString')) { + /** + * Asserts that two XML documents are equal. + * + * @param DOMDocument|string $expectedXml + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertXmlStringEqualsXmlString + */ + function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = ''): void + { + Assert::assertXmlStringEqualsXmlString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertXmlStringNotEqualsXmlString')) { + /** + * Asserts that two XML documents are not equal. + * + * @param DOMDocument|string $expectedXml + * @param DOMDocument|string $actualXml + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + * + * @see Assert::assertXmlStringNotEqualsXmlString + */ + function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = ''): void + { + Assert::assertXmlStringNotEqualsXmlString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertEqualXMLStructure')) { + /** + * Asserts that a hierarchy of DOMElements matches. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws AssertionFailedError + * @throws ExpectationFailedException + * + * @see Assert::assertEqualXMLStructure + */ + function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = false, string $message = ''): void + { + Assert::assertEqualXMLStructure(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertThat')) { + /** + * Evaluates a PHPUnit\Framework\Constraint matcher object. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertThat + */ + function assertThat($value, Constraint $constraint, string $message = ''): void + { + Assert::assertThat(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertJson')) { + /** + * Asserts that a string is a valid JSON string. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertJson + */ + function assertJson(string $actualJson, string $message = ''): void + { + Assert::assertJson(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertJsonStringEqualsJsonString')) { + /** + * Asserts that two given JSON encoded objects or arrays are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertJsonStringEqualsJsonString + */ + function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void + { + Assert::assertJsonStringEqualsJsonString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertJsonStringNotEqualsJsonString')) { + /** + * Asserts that two given JSON encoded objects or arrays are not equal. + * + * @param string $expectedJson + * @param string $actualJson + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertJsonStringNotEqualsJsonString + */ + function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = ''): void + { + Assert::assertJsonStringNotEqualsJsonString(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertJsonStringEqualsJsonFile')) { + /** + * Asserts that the generated JSON encoded object and the content of the given file are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertJsonStringEqualsJsonFile + */ + function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void + { + Assert::assertJsonStringEqualsJsonFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertJsonStringNotEqualsJsonFile')) { + /** + * Asserts that the generated JSON encoded object and the content of the given file are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertJsonStringNotEqualsJsonFile + */ + function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void + { + Assert::assertJsonStringNotEqualsJsonFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertJsonFileEqualsJsonFile')) { + /** + * Asserts that two JSON files are equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertJsonFileEqualsJsonFile + */ + function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void + { + Assert::assertJsonFileEqualsJsonFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertJsonFileNotEqualsJsonFile')) { + /** + * Asserts that two JSON files are not equal. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @see Assert::assertJsonFileNotEqualsJsonFile + */ + function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void + { + Assert::assertJsonFileNotEqualsJsonFile(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\logicalAnd')) { + function logicalAnd(): LogicalAnd + { + return Assert::logicalAnd(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\logicalOr')) { + function logicalOr(): LogicalOr + { + return Assert::logicalOr(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\logicalNot')) { + function logicalNot(Constraint $constraint): LogicalNot + { + return Assert::logicalNot(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\logicalXor')) { + function logicalXor(): LogicalXor + { + return Assert::logicalXor(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\anything')) { + function anything(): IsAnything + { + return Assert::anything(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isTrue')) { + function isTrue(): IsTrue + { + return Assert::isTrue(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\callback')) { + function callback(callable $callback): Callback + { + return Assert::callback(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isFalse')) { + function isFalse(): IsFalse + { + return Assert::isFalse(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isJson')) { + function isJson(): IsJson + { + return Assert::isJson(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isNull')) { + function isNull(): IsNull + { + return Assert::isNull(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isFinite')) { + function isFinite(): IsFinite + { + return Assert::isFinite(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isInfinite')) { + function isInfinite(): IsInfinite + { + return Assert::isInfinite(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isNan')) { + function isNan(): IsNan + { + return Assert::isNan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\attribute')) { + function attribute(Constraint $constraint, string $attributeName): Attribute + { + return Assert::attribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\contains')) { + function contains($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): TraversableContains + { + return Assert::contains(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\containsEqual')) { + function containsEqual($value): TraversableContainsEqual + { + return Assert::containsEqual(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\containsIdentical')) { + function containsIdentical($value): TraversableContainsIdentical + { + return Assert::containsIdentical(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\containsOnly')) { + function containsOnly(string $type): TraversableContainsOnly + { + return Assert::containsOnly(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\containsOnlyInstancesOf')) { + function containsOnlyInstancesOf(string $className): TraversableContainsOnly + { + return Assert::containsOnlyInstancesOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\arrayHasKey')) { + function arrayHasKey($key): ArrayHasKey + { + return Assert::arrayHasKey(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\equalTo')) { + function equalTo($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): IsEqual + { + return Assert::equalTo(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\attributeEqualTo')) { + function attributeEqualTo(string $attributeName, $value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): Attribute + { + return Assert::attributeEqualTo(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isEmpty')) { + function isEmpty(): IsEmpty + { + return Assert::isEmpty(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isWritable')) { + function isWritable(): IsWritable + { + return Assert::isWritable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isReadable')) { + function isReadable(): IsReadable + { + return Assert::isReadable(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\directoryExists')) { + function directoryExists(): DirectoryExists + { + return Assert::directoryExists(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\fileExists')) { + function fileExists(): FileExists + { + return Assert::fileExists(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\greaterThan')) { + function greaterThan($value): GreaterThan + { + return Assert::greaterThan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\greaterThanOrEqual')) { + function greaterThanOrEqual($value): LogicalOr + { + return Assert::greaterThanOrEqual(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\classHasAttribute')) { + function classHasAttribute(string $attributeName): ClassHasAttribute + { + return Assert::classHasAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\classHasStaticAttribute')) { + function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute + { + return Assert::classHasStaticAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\objectHasAttribute')) { + function objectHasAttribute($attributeName): ObjectHasAttribute + { + return Assert::objectHasAttribute(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\identicalTo')) { + function identicalTo($value): IsIdentical + { + return Assert::identicalTo(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isInstanceOf')) { + function isInstanceOf(string $className): IsInstanceOf + { + return Assert::isInstanceOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\isType')) { + function isType(string $type): IsType + { + return Assert::isType(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\lessThan')) { + function lessThan($value): LessThan + { + return Assert::lessThan(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\lessThanOrEqual')) { + function lessThanOrEqual($value): LogicalOr + { + return Assert::lessThanOrEqual(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\matchesRegularExpression')) { + function matchesRegularExpression(string $pattern): RegularExpression + { + return Assert::matchesRegularExpression(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\matches')) { + function matches(string $string): StringMatchesFormatDescription + { + return Assert::matches(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\stringStartsWith')) { + function stringStartsWith($prefix): StringStartsWith + { + return Assert::stringStartsWith(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\stringContains')) { + function stringContains(string $string, bool $case = true): StringContains + { + return Assert::stringContains(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\stringEndsWith')) { + function stringEndsWith(string $suffix): StringEndsWith + { + return Assert::stringEndsWith(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\countOf')) { + function countOf(int $count): Count + { + return Assert::countOf(...\func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\any')) { + /** + * Returns a matcher that matches when the method is executed + * zero or more times. + */ + function any(): AnyInvokedCountMatcher + { + return new AnyInvokedCountMatcher; + } +} + +if (!function_exists('PHPUnit\Framework\never')) { + /** + * Returns a matcher that matches when the method is never executed. + */ + function never(): InvokedCountMatcher + { + return new InvokedCountMatcher(0); + } +} + +if (!function_exists('PHPUnit\Framework\atLeast')) { + /** + * Returns a matcher that matches when the method is executed + * at least N times. + */ + function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher + { + return new InvokedAtLeastCountMatcher( + $requiredInvocations + ); + } +} + +if (!function_exists('PHPUnit\Framework\atLeastOnce')) { + /** + * Returns a matcher that matches when the method is executed at least once. + */ + function atLeastOnce(): InvokedAtLeastOnceMatcher + { + return new InvokedAtLeastOnceMatcher; + } +} + +if (!function_exists('PHPUnit\Framework\once')) { + /** + * Returns a matcher that matches when the method is executed exactly once. + */ + function once(): InvokedCountMatcher + { + return new InvokedCountMatcher(1); + } +} + +if (!function_exists('PHPUnit\Framework\exactly')) { + /** + * Returns a matcher that matches when the method is executed + * exactly $count times. + */ + function exactly(int $count): InvokedCountMatcher + { + return new InvokedCountMatcher($count); + } +} + +if (!function_exists('PHPUnit\Framework\atMost')) { + /** + * Returns a matcher that matches when the method is executed + * at most N times. + */ + function atMost(int $allowedInvocations): InvokedAtMostCountMatcher + { + return new InvokedAtMostCountMatcher($allowedInvocations); + } +} + +if (!function_exists('PHPUnit\Framework\at')) { + /** + * Returns a matcher that matches when the method is executed + * at the given index. + */ + function at(int $index): InvokedAtIndexMatcher + { + return new InvokedAtIndexMatcher($index); + } +} + +if (!function_exists('PHPUnit\Framework\returnValue')) { + function returnValue($value): ReturnStub + { + return new ReturnStub($value); + } +} + +if (!function_exists('PHPUnit\Framework\returnValueMap')) { + function returnValueMap(array $valueMap): ReturnValueMapStub + { + return new ReturnValueMapStub($valueMap); + } +} + +if (!function_exists('PHPUnit\Framework\returnArgument')) { + function returnArgument(int $argumentIndex): ReturnArgumentStub + { + return new ReturnArgumentStub($argumentIndex); + } +} + +if (!function_exists('PHPUnit\Framework\returnCallback')) { + function returnCallback($callback): ReturnCallbackStub + { + return new ReturnCallbackStub($callback); + } +} + +if (!function_exists('PHPUnit\Framework\returnSelf')) { + /** + * Returns the current object. + * + * This method is useful when mocking a fluent interface. + */ + function returnSelf(): ReturnSelfStub + { + return new ReturnSelfStub; + } +} + +if (!function_exists('PHPUnit\Framework\throwException')) { + function throwException(Throwable $exception): ExceptionStub + { + return new ExceptionStub($exception); + } +} + +if (!function_exists('PHPUnit\Framework\onConsecutiveCalls')) { + function onConsecutiveCalls(): ConsecutiveCallsStub + { + $args = \func_get_args(); + + return new ConsecutiveCallsStub($args); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php new file mode 100644 index 0000000000..0ba5be92a4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function array_key_exists; +use function is_array; +use ArrayAccess; + +/** + * Constraint that asserts that the array it is evaluated for has a given key. + * + * Uses array_key_exists() to check if the key is found in the input array, if + * not found the evaluation fails. + * + * The array key is passed in the constructor. + */ +final class ArrayHasKey extends Constraint +{ + /** + * @var int|string + */ + private $key; + + /** + * @param int|string $key + */ + public function __construct($key) + { + $this->key = $key; + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + return 'has the key ' . $this->exporter()->export($this->key); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if (is_array($other)) { + return array_key_exists($this->key, $other); + } + + if ($other instanceof ArrayAccess) { + return $other->offsetExists($this->key); + } + + return false; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return 'an array ' . $this->toString(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php new file mode 100644 index 0000000000..34c61e3d40 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function array_replace_recursive; +use function is_array; +use function iterator_to_array; +use function var_export; +use ArrayObject; +use PHPUnit\Framework\ExpectationFailedException; +use SebastianBergmann\Comparator\ComparisonFailure; +use Traversable; + +/** + * Constraint that asserts that the array it is evaluated for has a specified subset. + * + * Uses array_replace_recursive() to check if a key value subset is part of the + * subject array. + * + * @codeCoverageIgnore + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494 + */ +final class ArraySubset extends Constraint +{ + /** + * @var iterable + */ + private $subset; + + /** + * @var bool + */ + private $strict; + + public function __construct(iterable $subset, bool $strict = false) + { + $this->strict = $strict; + $this->subset = $subset; + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + //type cast $other & $this->subset as an array to allow + //support in standard array functions. + $other = $this->toArray($other); + $this->subset = $this->toArray($this->subset); + + $patched = array_replace_recursive($other, $this->subset); + + if ($this->strict) { + $result = $other === $patched; + } else { + $result = $other == $patched; + } + + if ($returnResult) { + return $result; + } + + if (!$result) { + $f = new ComparisonFailure( + $patched, + $other, + var_export($patched, true), + var_export($other, true) + ); + + $this->fail($other, $description, $f); + } + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + return 'has the subset ' . $this->exporter()->export($this->subset); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return 'an array ' . $this->toString(); + } + + private function toArray(iterable $other): array + { + if (is_array($other)) { + return $other; + } + + if ($other instanceof ArrayObject) { + return $other->getArrayCopy(); + } + + if ($other instanceof Traversable) { + return iterator_to_array($other); + } + + // Keep BC even if we know that array would not be the expected one + return (array) $other; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php new file mode 100644 index 0000000000..ad4e2f9845 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Attribute.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use PHPUnit\Framework\Assert; +use PHPUnit\Framework\ExpectationFailedException; + +/** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ +final class Attribute extends Composite +{ + /** + * @var string + */ + private $attributeName; + + public function __construct(Constraint $constraint, string $attributeName) + { + parent::__construct($constraint); + + $this->attributeName = $attributeName; + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \PHPUnit\Framework\Exception + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + return parent::evaluate( + Assert::readAttribute( + $other, + $this->attributeName + ), + $description, + $returnResult + ); + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'attribute "' . $this->attributeName . '" ' . $this->innerConstraint()->toString(); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return $this->toString(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php new file mode 100644 index 0000000000..97ec763dfd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Callback.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function call_user_func; + +/** + * Constraint that evaluates against a specified closure. + */ +final class Callback extends Constraint +{ + /** + * @var callable + */ + private $callback; + + public function __construct(callable $callback) + { + $this->callback = $callback; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is accepted by specified callback'; + } + + /** + * Evaluates the constraint for parameter $value. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return call_user_func($this->callback, $other); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php new file mode 100644 index 0000000000..c42964cf56 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php @@ -0,0 +1,91 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function get_class; +use function is_object; +use function sprintf; +use PHPUnit\Framework\Exception; +use ReflectionClass; +use ReflectionException; + +/** + * Constraint that asserts that the class it is evaluated for has a given + * attribute. + * + * The attribute name is passed in the constructor. + */ +class ClassHasAttribute extends Constraint +{ + /** + * @var string + */ + private $attributeName; + + public function __construct(string $attributeName) + { + $this->attributeName = $attributeName; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return sprintf( + 'has attribute "%s"', + $this->attributeName + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + try { + return (new ReflectionClass($other))->hasProperty($this->attributeName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return sprintf( + '%sclass "%s" %s', + is_object($other) ? 'object of ' : '', + is_object($other) ? get_class($other) : $other, + $this->toString() + ); + } + + protected function attributeName(): string + { + return $this->attributeName; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php new file mode 100644 index 0000000000..16e2917f6e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function sprintf; +use PHPUnit\Framework\Exception; +use ReflectionClass; +use ReflectionException; + +/** + * Constraint that asserts that the class it is evaluated for has a given + * static attribute. + * + * The attribute name is passed in the constructor. + */ +final class ClassHasStaticAttribute extends ClassHasAttribute +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return sprintf( + 'has static attribute "%s"', + $this->attributeName() + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + try { + $class = new ReflectionClass($other); + + if ($class->hasProperty($this->attributeName())) { + return $class->getProperty($this->attributeName())->isStatic(); + } + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + return false; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php new file mode 100644 index 0000000000..c9074ead60 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Composite.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function count; +use PHPUnit\Framework\ExpectationFailedException; + +/** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338 + * @codeCoverageIgnore + */ +abstract class Composite extends Constraint +{ + /** + * @var Constraint + */ + private $innerConstraint; + + public function __construct(Constraint $innerConstraint) + { + $this->innerConstraint = $innerConstraint; + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + try { + return $this->innerConstraint->evaluate( + $other, + $description, + $returnResult + ); + } catch (ExpectationFailedException $e) { + $this->fail($other, $description, $e->getComparisonFailure()); + } + } + + /** + * Counts the number of constraint elements. + */ + public function count(): int + { + return count($this->innerConstraint); + } + + protected function innerConstraint(): Constraint + { + return $this->innerConstraint; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php new file mode 100644 index 0000000000..52972b1325 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php @@ -0,0 +1,155 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function sprintf; +use Countable; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\SelfDescribing; +use SebastianBergmann\Comparator\ComparisonFailure; +use SebastianBergmann\Exporter\Exporter; + +/** + * Abstract base class for constraints which can be applied to any value. + */ +abstract class Constraint implements Countable, SelfDescribing +{ + /** + * @var Exporter + */ + private $exporter; + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + $success = false; + + if ($this->matches($other)) { + $success = true; + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + } + + /** + * Counts the number of constraint elements. + */ + public function count(): int + { + return 1; + } + + protected function exporter(): Exporter + { + if ($this->exporter === null) { + $this->exporter = new Exporter; + } + + return $this->exporter; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * This method can be overridden to implement the evaluation algorithm. + * + * @param mixed $other value or object to evaluate + * @codeCoverageIgnore + */ + protected function matches($other): bool + { + return false; + } + + /** + * Throws an exception for the given compared value and test description. + * + * @param mixed $other evaluated value or object + * @param string $description Additional information about the test + * @param ComparisonFailure $comparisonFailure + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-return never-return + */ + protected function fail($other, $description, ComparisonFailure $comparisonFailure = null): void + { + $failureDescription = sprintf( + 'Failed asserting that %s.', + $this->failureDescription($other) + ); + + $additionalFailureDescription = $this->additionalFailureDescription($other); + + if ($additionalFailureDescription) { + $failureDescription .= "\n" . $additionalFailureDescription; + } + + if (!empty($description)) { + $failureDescription = $description . "\n" . $failureDescription; + } + + throw new ExpectationFailedException( + $failureDescription, + $comparisonFailure + ); + } + + /** + * Return additional failure description where needed. + * + * The function can be overridden to provide additional failure + * information like a diff + * + * @param mixed $other evaluated value or object + */ + protected function additionalFailureDescription($other): string + { + return ''; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * To provide additional failure information additionalFailureDescription + * can be used. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return $this->exporter()->export($other) . ' ' . $this->toString(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Count.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Count.php new file mode 100644 index 0000000000..944d90800a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Count.php @@ -0,0 +1,128 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function count; +use function is_array; +use function iterator_count; +use function sprintf; +use Countable; +use EmptyIterator; +use Generator; +use Iterator; +use IteratorAggregate; +use Traversable; + +class Count extends Constraint +{ + /** + * @var int + */ + private $expectedCount; + + public function __construct(int $expected) + { + $this->expectedCount = $expected; + } + + public function toString(): string + { + return sprintf( + 'count matches %d', + $this->expectedCount + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + */ + protected function matches($other): bool + { + return $this->expectedCount === $this->getCountOf($other); + } + + /** + * @param iterable $other + */ + protected function getCountOf($other): ?int + { + if ($other instanceof Countable || is_array($other)) { + return count($other); + } + + if ($other instanceof EmptyIterator) { + return 0; + } + + if ($other instanceof Traversable) { + while ($other instanceof IteratorAggregate) { + $other = $other->getIterator(); + } + + $iterator = $other; + + if ($iterator instanceof Generator) { + return $this->getCountOfGenerator($iterator); + } + + if (!$iterator instanceof Iterator) { + return iterator_count($iterator); + } + + $key = $iterator->key(); + $count = iterator_count($iterator); + + // Manually rewind $iterator to previous key, since iterator_count + // moves pointer. + if ($key !== null) { + $iterator->rewind(); + + while ($iterator->valid() && $key !== $iterator->key()) { + $iterator->next(); + } + } + + return $count; + } + + return null; + } + + /** + * Returns the total number of iterations from a generator. + * This will fully exhaust the generator. + */ + protected function getCountOfGenerator(Generator $generator): int + { + for ($count = 0; $generator->valid(); $generator->next()) { + $count++; + } + + return $count; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return sprintf( + 'actual size %d matches expected size %d', + $this->getCountOf($other), + $this->expectedCount + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php new file mode 100644 index 0000000000..ecdad816ff --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/DirectoryExists.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_dir; +use function sprintf; + +/** + * Constraint that checks if the directory(name) that it is evaluated for exists. + * + * The file path to check is passed as $other in evaluate(). + */ +final class DirectoryExists extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'directory exists'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return is_dir($other); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return sprintf( + 'directory "%s" exists', + $other + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php new file mode 100644 index 0000000000..5119071e04 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/Exception.php @@ -0,0 +1,82 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function get_class; +use function sprintf; +use PHPUnit\Util\Filter; +use Throwable; + +final class Exception extends Constraint +{ + /** + * @var string + */ + private $className; + + public function __construct(string $className) + { + $this->className = $className; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return sprintf( + 'exception of type "%s"', + $this->className + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return $other instanceof $this->className; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + if ($other !== null) { + $message = ''; + + if ($other instanceof Throwable) { + $message = '. Message was: "' . $other->getMessage() . '" at' + . "\n" . Filter::getFilteredStacktrace($other); + } + + return sprintf( + 'exception of type "%s" matches expected exception "%s"%s', + get_class($other), + $this->className, + $message + ); + } + + return sprintf( + 'exception of type "%s" is thrown', + $this->className + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php new file mode 100644 index 0000000000..682f48cb36 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function sprintf; +use Throwable; + +final class ExceptionCode extends Constraint +{ + /** + * @var int|string + */ + private $expectedCode; + + /** + * @param int|string $expected + */ + public function __construct($expected) + { + $this->expectedCode = $expected; + } + + public function toString(): string + { + return 'exception code is '; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param Throwable $other + */ + protected function matches($other): bool + { + return (string) $other->getCode() === (string) $this->expectedCode; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return sprintf( + '%s is equal to expected exception code %s', + $this->exporter()->export($other->getCode()), + $this->exporter()->export($this->expectedCode) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php new file mode 100644 index 0000000000..4836b15057 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function sprintf; +use function strpos; +use Throwable; + +final class ExceptionMessage extends Constraint +{ + /** + * @var string + */ + private $expectedMessage; + + public function __construct(string $expected) + { + $this->expectedMessage = $expected; + } + + public function toString(): string + { + if ($this->expectedMessage === '') { + return 'exception message is empty'; + } + + return 'exception message contains '; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param Throwable $other + */ + protected function matches($other): bool + { + if ($this->expectedMessage === '') { + return $other->getMessage() === ''; + } + + return strpos((string) $other->getMessage(), $this->expectedMessage) !== false; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + if ($this->expectedMessage === '') { + return sprintf( + "exception message is empty but is '%s'", + $other->getMessage() + ); + } + + return sprintf( + "exception message '%s' contains '%s'", + $other->getMessage(), + $this->expectedMessage + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php new file mode 100644 index 0000000000..1b03482f7b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegularExpression.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function sprintf; +use Exception; +use PHPUnit\Util\RegularExpression as RegularExpressionUtil; + +final class ExceptionMessageRegularExpression extends Constraint +{ + /** + * @var string + */ + private $expectedMessageRegExp; + + public function __construct(string $expected) + { + $this->expectedMessageRegExp = $expected; + } + + public function toString(): string + { + return 'exception message matches '; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param \PHPUnit\Framework\Exception $other + * + * @throws \PHPUnit\Framework\Exception + * @throws Exception + */ + protected function matches($other): bool + { + $match = RegularExpressionUtil::safeMatch($this->expectedMessageRegExp, $other->getMessage()); + + if ($match === false) { + throw new \PHPUnit\Framework\Exception( + "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'" + ); + } + + return $match === 1; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return sprintf( + "exception message '%s' matches '%s'", + $other->getMessage(), + $this->expectedMessageRegExp + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php new file mode 100644 index 0000000000..8637359a52 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/FileExists.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function file_exists; +use function sprintf; + +/** + * Constraint that checks if the file(name) that it is evaluated for exists. + * + * The file path to check is passed as $other in evaluate(). + */ +final class FileExists extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'file exists'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return file_exists($other); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return sprintf( + 'file "%s" exists', + $other + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php new file mode 100644 index 0000000000..b007615ca3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +/** + * Constraint that asserts that the value it is evaluated for is greater + * than a given value. + */ +final class GreaterThan extends Constraint +{ + /** + * @var float|int + */ + private $value; + + /** + * @param float|int $value + */ + public function __construct($value) + { + $this->value = $value; + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + return 'is greater than ' . $this->exporter()->export($this->value); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return $this->value < $other; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php new file mode 100644 index 0000000000..0407ef1e21 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsAnything.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use PHPUnit\Framework\ExpectationFailedException; + +/** + * Constraint that accepts any input value. + */ +final class IsAnything extends Constraint +{ + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + return $returnResult ? true : null; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is anything'; + } + + /** + * Counts the number of constraint elements. + */ + public function count(): int + { + return 0; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php new file mode 100644 index 0000000000..555afa7633 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php @@ -0,0 +1,70 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function count; +use function gettype; +use function sprintf; +use function strpos; +use Countable; +use EmptyIterator; + +/** + * Constraint that checks whether a variable is empty(). + */ +final class IsEmpty extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is empty'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if ($other instanceof EmptyIterator) { + return true; + } + + if ($other instanceof Countable) { + return count($other) === 0; + } + + return empty($other); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + $type = gettype($other); + + return sprintf( + '%s %s %s', + strpos($type, 'a') === 0 || strpos($type, 'o') === 0 ? 'an' : 'a', + $type, + $this->toString() + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php new file mode 100644 index 0000000000..bf90a78384 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsEqual.php @@ -0,0 +1,142 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_string; +use function sprintf; +use function strpos; +use function trim; +use PHPUnit\Framework\ExpectationFailedException; +use SebastianBergmann\Comparator\ComparisonFailure; +use SebastianBergmann\Comparator\Factory as ComparatorFactory; + +/** + * Constraint that checks if one value is equal to another. + * + * Equality is checked with PHP's == operator, the operator is explained in + * detail at {@url https://php.net/manual/en/types.comparisons.php}. + * Two values are equal if they have the same value disregarding type. + * + * The expected value is passed in the constructor. + */ +final class IsEqual extends Constraint +{ + /** + * @var mixed + */ + private $value; + + /** + * @var float + */ + private $delta; + + /** + * @var bool + */ + private $canonicalize; + + /** + * @var bool + */ + private $ignoreCase; + + public function __construct($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false) + { + $this->value = $value; + $this->delta = $delta; + $this->canonicalize = $canonicalize; + $this->ignoreCase = $ignoreCase; + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + // If $this->value and $other are identical, they are also equal. + // This is the most common path and will allow us to skip + // initialization of all the comparators. + if ($this->value === $other) { + return true; + } + + $comparatorFactory = ComparatorFactory::getInstance(); + + try { + $comparator = $comparatorFactory->getComparatorFor( + $this->value, + $other + ); + + $comparator->assertEquals( + $this->value, + $other, + $this->delta, + $this->canonicalize, + $this->ignoreCase + ); + } catch (ComparisonFailure $f) { + if ($returnResult) { + return false; + } + + throw new ExpectationFailedException( + trim($description . "\n" . $f->getMessage()), + $f + ); + } + + return true; + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + $delta = ''; + + if (is_string($this->value)) { + if (strpos($this->value, "\n") !== false) { + return 'is equal to '; + } + + return sprintf( + "is equal to '%s'", + $this->value + ); + } + + if ($this->delta != 0) { + $delta = sprintf( + ' with delta <%F>', + $this->delta + ); + } + + return sprintf( + 'is equal to %s%s', + $this->exporter()->export($this->value), + $delta + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php new file mode 100644 index 0000000000..8b11e0ac57 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFalse.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +/** + * Constraint that accepts false. + */ +final class IsFalse extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is false'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return $other === false; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php new file mode 100644 index 0000000000..ed727d5978 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsFinite.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_finite; + +/** + * Constraint that accepts finite. + */ +final class IsFinite extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is finite'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return is_finite($other); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php new file mode 100644 index 0000000000..ed0d6f4c6f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php @@ -0,0 +1,147 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function abs; +use function get_class; +use function is_array; +use function is_float; +use function is_infinite; +use function is_nan; +use function is_object; +use function is_string; +use function sprintf; +use PHPUnit\Framework\ExpectationFailedException; +use SebastianBergmann\Comparator\ComparisonFailure; + +/** + * Constraint that asserts that one value is identical to another. + * + * Identical check is performed with PHP's === operator, the operator is + * explained in detail at + * {@url https://php.net/manual/en/types.comparisons.php}. + * Two values are identical if they have the same value and are of the same + * type. + * + * The expected value is passed in the constructor. + */ +final class IsIdentical extends Constraint +{ + /** + * @var float + */ + private const EPSILON = 0.0000000001; + + /** + * @var mixed + */ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + if (is_float($this->value) && is_float($other) && + !is_infinite($this->value) && !is_infinite($other) && + !is_nan($this->value) && !is_nan($other)) { + $success = abs($this->value - $other) < self::EPSILON; + } else { + $success = $this->value === $other; + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $f = null; + + // if both values are strings, make sure a diff is generated + if (is_string($this->value) && is_string($other)) { + $f = new ComparisonFailure( + $this->value, + $other, + sprintf("'%s'", $this->value), + sprintf("'%s'", $other) + ); + } + + // if both values are array, make sure a diff is generated + if (is_array($this->value) && is_array($other)) { + $f = new ComparisonFailure( + $this->value, + $other, + $this->exporter()->export($this->value), + $this->exporter()->export($other) + ); + } + + $this->fail($other, $description, $f); + } + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + if (is_object($this->value)) { + return 'is identical to an object of class "' . + get_class($this->value) . '"'; + } + + return 'is identical to ' . $this->exporter()->export($this->value); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + if (is_object($this->value) && is_object($other)) { + return 'two variables reference the same object'; + } + + if (is_string($this->value) && is_string($other)) { + return 'two strings are identical'; + } + + if (is_array($this->value) && is_array($other)) { + return 'two arrays are identical'; + } + + return parent::failureDescription($other); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php new file mode 100644 index 0000000000..0ada7f1bdf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInfinite.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_infinite; + +/** + * Constraint that accepts infinite. + */ +final class IsInfinite extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is infinite'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return is_infinite($other); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php new file mode 100644 index 0000000000..02631f8f46 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function sprintf; +use ReflectionClass; +use ReflectionException; + +/** + * Constraint that asserts that the object it is evaluated for is an instance + * of a given class. + * + * The expected class name is passed in the constructor. + */ +final class IsInstanceOf extends Constraint +{ + /** + * @var string + */ + private $className; + + public function __construct(string $className) + { + $this->className = $className; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return sprintf( + 'is instance of %s "%s"', + $this->getType(), + $this->className + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return $other instanceof $this->className; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return sprintf( + '%s is an instance of %s "%s"', + $this->exporter()->shortenedExport($other), + $this->getType(), + $this->className + ); + } + + private function getType(): string + { + try { + $reflection = new ReflectionClass($this->className); + + if ($reflection->isInterface()) { + return 'interface'; + } + } catch (ReflectionException $e) { + } + + return 'class'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php new file mode 100644 index 0000000000..e10e6c1d86 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsJson.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function json_decode; +use function json_last_error; +use function sprintf; + +/** + * Constraint that asserts that a string is valid JSON. + */ +final class IsJson extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is valid JSON'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if ($other === '') { + return false; + } + + json_decode($other); + + if (json_last_error()) { + return false; + } + + return true; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + if ($other === '') { + return 'an empty string is valid JSON'; + } + + json_decode($other); + $error = JsonMatchesErrorMessageProvider::determineJsonError( + (string) json_last_error() + ); + + return sprintf( + '%s is valid JSON (%s)', + $this->exporter()->shortenedExport($other), + $error + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php new file mode 100644 index 0000000000..9dde4c6f40 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNan.php @@ -0,0 +1,37 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_nan; + +/** + * Constraint that accepts nan. + */ +final class IsNan extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is nan'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return is_nan($other); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php new file mode 100644 index 0000000000..1538138b7f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsNull.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +/** + * Constraint that accepts null. + */ +final class IsNull extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is null'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return $other === null; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php new file mode 100644 index 0000000000..bcf8274e84 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsReadable.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_readable; +use function sprintf; + +/** + * Constraint that checks if the file/dir(name) that it is evaluated for is readable. + * + * The file path to check is passed as $other in evaluate(). + */ +final class IsReadable extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is readable'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return is_readable($other); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return sprintf( + '"%s" is readable', + $other + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php new file mode 100644 index 0000000000..7948c8fa0d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsTrue.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +/** + * Constraint that accepts true. + */ +final class IsTrue extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is true'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return $other === true; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php new file mode 100644 index 0000000000..977be34bc1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsType.php @@ -0,0 +1,214 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function get_resource_type; +use function is_array; +use function is_bool; +use function is_callable; +use function is_float; +use function is_int; +use function is_iterable; +use function is_numeric; +use function is_object; +use function is_resource; +use function is_scalar; +use function is_string; +use function sprintf; +use TypeError; + +/** + * Constraint that asserts that the value it is evaluated for is of a + * specified type. + * + * The expected value is passed in the constructor. + */ +final class IsType extends Constraint +{ + /** + * @var string + */ + public const TYPE_ARRAY = 'array'; + + /** + * @var string + */ + public const TYPE_BOOL = 'bool'; + + /** + * @var string + */ + public const TYPE_FLOAT = 'float'; + + /** + * @var string + */ + public const TYPE_INT = 'int'; + + /** + * @var string + */ + public const TYPE_NULL = 'null'; + + /** + * @var string + */ + public const TYPE_NUMERIC = 'numeric'; + + /** + * @var string + */ + public const TYPE_OBJECT = 'object'; + + /** + * @var string + */ + public const TYPE_RESOURCE = 'resource'; + + /** + * @var string + */ + public const TYPE_STRING = 'string'; + + /** + * @var string + */ + public const TYPE_SCALAR = 'scalar'; + + /** + * @var string + */ + public const TYPE_CALLABLE = 'callable'; + + /** + * @var string + */ + public const TYPE_ITERABLE = 'iterable'; + + /** + * @var array + */ + private const KNOWN_TYPES = [ + 'array' => true, + 'boolean' => true, + 'bool' => true, + 'double' => true, + 'float' => true, + 'integer' => true, + 'int' => true, + 'null' => true, + 'numeric' => true, + 'object' => true, + 'real' => true, + 'resource' => true, + 'string' => true, + 'scalar' => true, + 'callable' => true, + 'iterable' => true, + ]; + + /** + * @var string + */ + private $type; + + /** + * @throws \PHPUnit\Framework\Exception + */ + public function __construct(string $type) + { + if (!isset(self::KNOWN_TYPES[$type])) { + throw new \PHPUnit\Framework\Exception( + sprintf( + 'Type specified for PHPUnit\Framework\Constraint\IsType <%s> ' . + 'is not a valid type.', + $type + ) + ); + } + + $this->type = $type; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return sprintf( + 'is of type "%s"', + $this->type + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + switch ($this->type) { + case 'numeric': + return is_numeric($other); + + case 'integer': + case 'int': + return is_int($other); + + case 'double': + case 'float': + case 'real': + return is_float($other); + + case 'string': + return is_string($other); + + case 'boolean': + case 'bool': + return is_bool($other); + + case 'null': + return null === $other; + + case 'array': + return is_array($other); + + case 'object': + return is_object($other); + + case 'resource': + if (is_resource($other)) { + return true; + } + + try { + $resource = @get_resource_type($other); + + if (is_string($resource)) { + return true; + } + } catch (TypeError $e) { + } + + return false; + + case 'scalar': + return is_scalar($other); + + case 'callable': + return is_callable($other); + + case 'iterable': + return is_iterable($other); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php new file mode 100644 index 0000000000..8dd86b562b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/IsWritable.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_writable; +use function sprintf; + +/** + * Constraint that checks if the file/dir(name) that it is evaluated for is writable. + * + * The file path to check is passed as $other in evaluate(). + */ +final class IsWritable extends Constraint +{ + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'is writable'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return is_writable($other); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + return sprintf( + '"%s" is writable', + $other + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php new file mode 100644 index 0000000000..818a0ee3a1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php @@ -0,0 +1,109 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function json_decode; +use function sprintf; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Util\Json; +use SebastianBergmann\Comparator\ComparisonFailure; + +/** + * Asserts whether or not two JSON objects are equal. + */ +final class JsonMatches extends Constraint +{ + /** + * @var string + */ + private $value; + + public function __construct(string $value) + { + $this->value = $value; + } + + /** + * Returns a string representation of the object. + */ + public function toString(): string + { + return sprintf( + 'matches JSON string "%s"', + $this->value + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * This method can be overridden to implement the evaluation algorithm. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + [$error, $recodedOther] = Json::canonicalize($other); + + if ($error) { + return false; + } + + [$error, $recodedValue] = Json::canonicalize($this->value); + + if ($error) { + return false; + } + + return $recodedOther == $recodedValue; + } + + /** + * Throws an exception for the given compared value and test description. + * + * @param mixed $other evaluated value or object + * @param string $description Additional information about the test + * @param ComparisonFailure $comparisonFailure + * + * @throws \PHPUnit\Framework\Exception + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * + * @psalm-return never-return + */ + protected function fail($other, $description, ComparisonFailure $comparisonFailure = null): void + { + if ($comparisonFailure === null) { + [$error, $recodedOther] = Json::canonicalize($other); + + if ($error) { + parent::fail($other, $description); + } + + [$error, $recodedValue] = Json::canonicalize($this->value); + + if ($error) { + parent::fail($other, $description); + } + + $comparisonFailure = new ComparisonFailure( + json_decode($this->value), + json_decode($other), + Json::prettify($recodedValue), + Json::prettify($recodedOther), + false, + 'Failed asserting that two json values are equal.' + ); + } + + parent::fail($other, $description, $comparisonFailure); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php new file mode 100644 index 0000000000..2d28c27618 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatchesErrorMessageProvider.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use const JSON_ERROR_CTRL_CHAR; +use const JSON_ERROR_DEPTH; +use const JSON_ERROR_NONE; +use const JSON_ERROR_STATE_MISMATCH; +use const JSON_ERROR_SYNTAX; +use const JSON_ERROR_UTF8; +use function strtolower; + +/** + * Provides human readable messages for each JSON error. + */ +final class JsonMatchesErrorMessageProvider +{ + /** + * Translates JSON error to a human readable string. + */ + public static function determineJsonError(string $error, string $prefix = ''): ?string + { + switch ($error) { + case JSON_ERROR_NONE: + return null; + case JSON_ERROR_DEPTH: + return $prefix . 'Maximum stack depth exceeded'; + case JSON_ERROR_STATE_MISMATCH: + return $prefix . 'Underflow or the modes mismatch'; + case JSON_ERROR_CTRL_CHAR: + return $prefix . 'Unexpected control character found'; + case JSON_ERROR_SYNTAX: + return $prefix . 'Syntax error, malformed JSON'; + case JSON_ERROR_UTF8: + return $prefix . 'Malformed UTF-8 characters, possibly incorrectly encoded'; + + default: + return $prefix . 'Unknown error'; + } + } + + /** + * Translates a given type to a human readable message prefix. + */ + public static function translateTypeToPrefix(string $type): string + { + switch (strtolower($type)) { + case 'expected': + $prefix = 'Expected value JSON decode error - '; + + break; + case 'actual': + $prefix = 'Actual value JSON decode error - '; + + break; + + default: + $prefix = ''; + + break; + } + + return $prefix; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php new file mode 100644 index 0000000000..781c81744a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LessThan.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +/** + * Constraint that asserts that the value it is evaluated for is less than + * a given value. + */ +final class LessThan extends Constraint +{ + /** + * @var float|int + */ + private $value; + + /** + * @param float|int $value + */ + public function __construct($value) + { + $this->value = $value; + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + return 'is less than ' . $this->exporter()->export($this->value); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return $this->value > $other; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php new file mode 100644 index 0000000000..6714bf6947 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalAnd.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function array_values; +use function count; +use PHPUnit\Framework\ExpectationFailedException; + +/** + * Logical AND. + */ +final class LogicalAnd extends Constraint +{ + /** + * @var Constraint[] + */ + private $constraints = []; + + public static function fromConstraints(Constraint ...$constraints): self + { + $constraint = new self; + + $constraint->constraints = array_values($constraints); + + return $constraint; + } + + /** + * @param Constraint[] $constraints + * + * @throws \PHPUnit\Framework\Exception + */ + public function setConstraints(array $constraints): void + { + $this->constraints = []; + + foreach ($constraints as $constraint) { + if (!($constraint instanceof Constraint)) { + throw new \PHPUnit\Framework\Exception( + 'All parameters to ' . __CLASS__ . + ' must be a constraint object.' + ); + } + + $this->constraints[] = $constraint; + } + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + $success = true; + + foreach ($this->constraints as $constraint) { + if (!$constraint->evaluate($other, $description, true)) { + $success = false; + + break; + } + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + $text = ''; + + foreach ($this->constraints as $key => $constraint) { + if ($key > 0) { + $text .= ' and '; + } + + $text .= $constraint->toString(); + } + + return $text; + } + + /** + * Counts the number of constraint elements. + */ + public function count(): int + { + $count = 0; + + foreach ($this->constraints as $constraint) { + $count += count($constraint); + } + + return $count; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php new file mode 100644 index 0000000000..e37b4a17fd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalNot.php @@ -0,0 +1,169 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function count; +use function get_class; +use function preg_match; +use function str_replace; +use PHPUnit\Framework\ExpectationFailedException; + +/** + * Logical NOT. + */ +final class LogicalNot extends Constraint +{ + /** + * @var Constraint + */ + private $constraint; + + public static function negate(string $string): string + { + $positives = [ + 'contains ', + 'exists', + 'has ', + 'is ', + 'are ', + 'matches ', + 'starts with ', + 'ends with ', + 'reference ', + 'not not ', + ]; + + $negatives = [ + 'does not contain ', + 'does not exist', + 'does not have ', + 'is not ', + 'are not ', + 'does not match ', + 'starts not with ', + 'ends not with ', + 'don\'t reference ', + 'not ', + ]; + + preg_match('/(\'[\w\W]*\')([\w\W]*)("[\w\W]*")/i', $string, $matches); + + if (count($matches) > 0) { + $nonInput = $matches[2]; + + $negatedString = str_replace( + $nonInput, + str_replace( + $positives, + $negatives, + $nonInput + ), + $string + ); + } else { + $negatedString = str_replace( + $positives, + $negatives, + $string + ); + } + + return $negatedString; + } + + /** + * @param Constraint|mixed $constraint + */ + public function __construct($constraint) + { + if (!($constraint instanceof Constraint)) { + $constraint = new IsEqual($constraint); + } + + $this->constraint = $constraint; + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + $success = !$this->constraint->evaluate($other, $description, true); + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + switch (get_class($this->constraint)) { + case LogicalAnd::class: + case self::class: + case LogicalOr::class: + return 'not( ' . $this->constraint->toString() . ' )'; + + default: + return self::negate( + $this->constraint->toString() + ); + } + } + + /** + * Counts the number of constraint elements. + */ + public function count(): int + { + return count($this->constraint); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + switch (get_class($this->constraint)) { + case LogicalAnd::class: + case self::class: + case LogicalOr::class: + return 'not( ' . $this->constraint->failureDescription($other) . ' )'; + + default: + return self::negate( + $this->constraint->failureDescription($other) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php new file mode 100644 index 0000000000..98bd866483 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalOr.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function array_values; +use function count; +use PHPUnit\Framework\ExpectationFailedException; + +/** + * Logical OR. + */ +final class LogicalOr extends Constraint +{ + /** + * @var Constraint[] + */ + private $constraints = []; + + public static function fromConstraints(Constraint ...$constraints): self + { + $constraint = new self; + + $constraint->constraints = array_values($constraints); + + return $constraint; + } + + /** + * @param Constraint[] $constraints + */ + public function setConstraints(array $constraints): void + { + $this->constraints = []; + + foreach ($constraints as $constraint) { + if (!($constraint instanceof Constraint)) { + $constraint = new IsEqual( + $constraint + ); + } + + $this->constraints[] = $constraint; + } + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + $success = false; + + foreach ($this->constraints as $constraint) { + if ($constraint->evaluate($other, $description, true)) { + $success = true; + + break; + } + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + $text = ''; + + foreach ($this->constraints as $key => $constraint) { + if ($key > 0) { + $text .= ' or '; + } + + $text .= $constraint->toString(); + } + + return $text; + } + + /** + * Counts the number of constraint elements. + */ + public function count(): int + { + $count = 0; + + foreach ($this->constraints as $constraint) { + $count += count($constraint); + } + + return $count; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php new file mode 100644 index 0000000000..12cfff877d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/LogicalXor.php @@ -0,0 +1,123 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function array_values; +use function count; +use PHPUnit\Framework\ExpectationFailedException; + +/** + * Logical XOR. + */ +final class LogicalXor extends Constraint +{ + /** + * @var Constraint[] + */ + private $constraints = []; + + public static function fromConstraints(Constraint ...$constraints): self + { + $constraint = new self; + + $constraint->constraints = array_values($constraints); + + return $constraint; + } + + /** + * @param Constraint[] $constraints + */ + public function setConstraints(array $constraints): void + { + $this->constraints = []; + + foreach ($constraints as $constraint) { + if (!($constraint instanceof Constraint)) { + $constraint = new IsEqual( + $constraint + ); + } + + $this->constraints[] = $constraint; + } + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + $success = true; + $lastResult = null; + + foreach ($this->constraints as $constraint) { + $result = $constraint->evaluate($other, $description, true); + + if ($result === $lastResult) { + $success = false; + + break; + } + + $lastResult = $result; + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + $text = ''; + + foreach ($this->constraints as $key => $constraint) { + if ($key > 0) { + $text .= ' xor '; + } + + $text .= $constraint->toString(); + } + + return $text; + } + + /** + * Counts the number of constraint elements. + */ + public function count(): int + { + $count = 0; + + foreach ($this->constraints as $constraint) { + $count += count($constraint); + } + + return $count; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php new file mode 100644 index 0000000000..8543c220ff --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use ReflectionObject; + +/** + * Constraint that asserts that the object it is evaluated for has a given + * attribute. + * + * The attribute name is passed in the constructor. + */ +final class ObjectHasAttribute extends ClassHasAttribute +{ + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return (new ReflectionObject($other))->hasProperty($this->attributeName()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php new file mode 100644 index 0000000000..963bfd05d1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/RegularExpression.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function preg_match; +use function sprintf; + +/** + * Constraint that asserts that the string it is evaluated for matches + * a regular expression. + * + * Checks a given value using the Perl Compatible Regular Expression extension + * in PHP. The pattern is matched by executing preg_match(). + * + * The pattern string passed in the constructor. + */ +class RegularExpression extends Constraint +{ + /** + * @var string + */ + private $pattern; + + public function __construct(string $pattern) + { + $this->pattern = $pattern; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return sprintf( + 'matches PCRE pattern "%s"', + $this->pattern + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return preg_match($this->pattern, $other) > 0; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php new file mode 100644 index 0000000000..c6b8703a43 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/SameSize.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +final class SameSize extends Count +{ + public function __construct(iterable $expected) + { + parent::__construct($this->getCountOf($expected)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php new file mode 100644 index 0000000000..54606364c6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringContains.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function mb_stripos; +use function mb_strpos; +use function mb_strtolower; +use function sprintf; + +/** + * Constraint that asserts that the string it is evaluated for contains + * a given string. + * + * Uses mb_strpos() to find the position of the string in the input, if not + * found the evaluation fails. + * + * The sub-string is passed in the constructor. + */ +final class StringContains extends Constraint +{ + /** + * @var string + */ + private $string; + + /** + * @var bool + */ + private $ignoreCase; + + public function __construct(string $string, bool $ignoreCase = false) + { + $this->string = $string; + $this->ignoreCase = $ignoreCase; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + if ($this->ignoreCase) { + $string = mb_strtolower($this->string); + } else { + $string = $this->string; + } + + return sprintf( + 'contains "%s"', + $string + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if ('' === $this->string) { + return true; + } + + if ($this->ignoreCase) { + return mb_stripos($other, $this->string) !== false; + } + + return mb_strpos($other, $this->string) !== false; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php new file mode 100644 index 0000000000..ed11b01d17 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function strlen; +use function substr; + +/** + * Constraint that asserts that the string it is evaluated for ends with a given + * suffix. + */ +final class StringEndsWith extends Constraint +{ + /** + * @var string + */ + private $suffix; + + public function __construct(string $suffix) + { + $this->suffix = $suffix; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'ends with "' . $this->suffix . '"'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return substr($other, 0 - strlen($this->suffix)) === $this->suffix; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php new file mode 100644 index 0000000000..f2324bb3f4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringMatchesFormatDescription.php @@ -0,0 +1,108 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use const DIRECTORY_SEPARATOR; +use function explode; +use function implode; +use function preg_match; +use function preg_quote; +use function preg_replace; +use function strtr; +use SebastianBergmann\Diff\Differ; + +/** + * ... + */ +final class StringMatchesFormatDescription extends RegularExpression +{ + /** + * @var string + */ + private $string; + + public function __construct(string $string) + { + parent::__construct( + $this->createPatternFromFormat( + $this->convertNewlines($string) + ) + ); + + $this->string = $string; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return parent::matches( + $this->convertNewlines($other) + ); + } + + protected function failureDescription($other): string + { + return 'string matches format description'; + } + + protected function additionalFailureDescription($other): string + { + $from = explode("\n", $this->string); + $to = explode("\n", $this->convertNewlines($other)); + + foreach ($from as $index => $line) { + if (isset($to[$index]) && $line !== $to[$index]) { + $line = $this->createPatternFromFormat($line); + + if (preg_match($line, $to[$index]) > 0) { + $from[$index] = $to[$index]; + } + } + } + + $this->string = implode("\n", $from); + $other = implode("\n", $to); + + return (new Differ("--- Expected\n+++ Actual\n"))->diff($this->string, $other); + } + + private function createPatternFromFormat(string $string): string + { + $string = strtr( + preg_quote($string, '/'), + [ + '%%' => '%', + '%e' => '\\' . DIRECTORY_SEPARATOR, + '%s' => '[^\r\n]+', + '%S' => '[^\r\n]*', + '%a' => '.+', + '%A' => '.*', + '%w' => '\s*', + '%i' => '[+-]?\d+', + '%d' => '\d+', + '%x' => '[0-9a-fA-F]+', + '%f' => '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', + '%c' => '.', + ] + ); + + return '/^' . $string . '$/s'; + } + + private function convertNewlines($text): string + { + return preg_replace('/\r\n/', "\n", $text); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php new file mode 100644 index 0000000000..a80a3f6b00 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function strlen; +use function strpos; +use PHPUnit\Framework\InvalidArgumentException; + +/** + * Constraint that asserts that the string it is evaluated for begins with a + * given prefix. + */ +final class StringStartsWith extends Constraint +{ + /** + * @var string + */ + private $prefix; + + public function __construct(string $prefix) + { + if (strlen($prefix) === 0) { + throw InvalidArgumentException::create(1, 'non-empty string'); + } + + $this->prefix = $prefix; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'starts with "' . $this->prefix . '"'; + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + return strpos((string) $other, $this->prefix) === 0; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php new file mode 100644 index 0000000000..1cae5a3065 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_array; +use function is_object; +use function is_string; +use function sprintf; +use function strpos; +use SplObjectStorage; + +/** + * Constraint that asserts that the Traversable it is applied to contains + * a given value. + * + * @deprecated Use TraversableContainsEqual or TraversableContainsIdentical instead + */ +final class TraversableContains extends Constraint +{ + /** + * @var bool + */ + private $checkForObjectIdentity; + + /** + * @var bool + */ + private $checkForNonObjectIdentity; + + /** + * @var mixed + */ + private $value; + + public function __construct($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false) + { + $this->checkForObjectIdentity = $checkForObjectIdentity; + $this->checkForNonObjectIdentity = $checkForNonObjectIdentity; + $this->value = $value; + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + if (is_string($this->value) && strpos($this->value, "\n") !== false) { + return 'contains "' . $this->value . '"'; + } + + return 'contains ' . $this->exporter()->export($this->value); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if ($other instanceof SplObjectStorage) { + return $other->contains($this->value); + } + + if (is_object($this->value)) { + foreach ($other as $element) { + if ($this->checkForObjectIdentity && $element === $this->value) { + return true; + } + + /* @noinspection TypeUnsafeComparisonInspection */ + if (!$this->checkForObjectIdentity && $element == $this->value) { + return true; + } + } + } else { + foreach ($other as $element) { + if ($this->checkForNonObjectIdentity && $element === $this->value) { + return true; + } + + /* @noinspection TypeUnsafeComparisonInspection */ + if (!$this->checkForNonObjectIdentity && $element == $this->value) { + return true; + } + } + } + + return false; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return sprintf( + '%s %s', + is_array($other) ? 'an array' : 'a traversable', + $this->toString() + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php new file mode 100644 index 0000000000..1357332f18 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsEqual.php @@ -0,0 +1,88 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_array; +use function is_string; +use function sprintf; +use function strpos; +use SplObjectStorage; + +/** + * Constraint that asserts that the Traversable it is applied to contains + * a given value (using non-strict comparison). + */ +final class TraversableContainsEqual extends Constraint +{ + /** + * @var mixed + */ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + if (is_string($this->value) && strpos($this->value, "\n") !== false) { + return 'contains "' . $this->value . '"'; + } + + return 'contains ' . $this->exporter()->export($this->value); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if ($other instanceof SplObjectStorage) { + return $other->contains($this->value); + } + + foreach ($other as $element) { + /* @noinspection TypeUnsafeComparisonInspection */ + if ($this->value == $element) { + return true; + } + } + + return false; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return sprintf( + '%s %s', + is_array($other) ? 'an array' : 'a traversable', + $this->toString() + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php new file mode 100644 index 0000000000..b455629acb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsIdentical.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function is_array; +use function is_string; +use function sprintf; +use function strpos; +use SplObjectStorage; + +/** + * Constraint that asserts that the Traversable it is applied to contains + * a given value (using strict comparison). + */ +final class TraversableContainsIdentical extends Constraint +{ + /** + * @var mixed + */ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + /** + * Returns a string representation of the constraint. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + if (is_string($this->value) && strpos($this->value, "\n") !== false) { + return 'contains "' . $this->value . '"'; + } + + return 'contains ' . $this->exporter()->export($this->value); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if ($other instanceof SplObjectStorage) { + return $other->contains($this->value); + } + + foreach ($other as $element) { + if ($this->value === $element) { + return true; + } + } + + return false; + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function failureDescription($other): string + { + return sprintf( + '%s %s', + is_array($other) ? 'an array' : 'a traversable', + $this->toString() + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php new file mode 100644 index 0000000000..a78cfcd8fe --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php @@ -0,0 +1,87 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use PHPUnit\Framework\ExpectationFailedException; + +/** + * Constraint that asserts that the Traversable it is applied to contains + * only values of a given type. + */ +final class TraversableContainsOnly extends Constraint +{ + /** + * @var Constraint + */ + private $constraint; + + /** + * @var string + */ + private $type; + + /** + * @throws \PHPUnit\Framework\Exception + */ + public function __construct(string $type, bool $isNativeType = true) + { + if ($isNativeType) { + $this->constraint = new IsType($type); + } else { + $this->constraint = new IsInstanceOf( + $type + ); + } + + $this->type = $type; + } + + /** + * Evaluates the constraint for parameter $other. + * + * If $returnResult is set to false (the default), an exception is thrown + * in case of a failure. null is returned otherwise. + * + * If $returnResult is true, the result of the evaluation is returned as + * a boolean value instead: true in case of success, false in case of a + * failure. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function evaluate($other, string $description = '', bool $returnResult = false) + { + $success = true; + + foreach ($other as $item) { + if (!$this->constraint->evaluate($item, '', true)) { + $success = false; + + break; + } + } + + if ($returnResult) { + return $success; + } + + if (!$success) { + $this->fail($other, $description); + } + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return 'contains only values of type "' . $this->type . '"'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php new file mode 100644 index 0000000000..2769a2dc2e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/DataProviderTestSuite.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use function count; +use function explode; +use PHPUnit\Util\Test as TestUtil; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class DataProviderTestSuite extends TestSuite +{ + /** + * @var string[] + */ + private $dependencies = []; + + /** + * @param string[] $dependencies + */ + public function setDependencies(array $dependencies): void + { + $this->dependencies = $dependencies; + + foreach ($this->tests as $test) { + if (!$test instanceof TestCase) { + continue; + } + + $test->setDependencies($dependencies); + } + } + + public function getDependencies(): array + { + return $this->dependencies; + } + + public function hasDependencies(): bool + { + return count($this->dependencies) > 0; + } + + /** + * Returns the size of the each test created using the data provider(s). + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function getSize(): int + { + [$className, $methodName] = explode('::', $this->getName()); + + return TestUtil::getSize($className, $methodName); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php new file mode 100644 index 0000000000..607c965c1e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Deprecated.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Error; + +final class Deprecated extends Error +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Error.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Error.php new file mode 100644 index 0000000000..61e80f8b62 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Error.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Error; + +use PHPUnit\Framework\Exception; + +class Error extends Exception +{ + public function __construct(string $message, int $code, string $file, int $line, \Exception $previous = null) + { + parent::__construct($message, $code, $previous); + + $this->file = $file; + $this->line = $line; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Notice.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Notice.php new file mode 100644 index 0000000000..4a3d01da06 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Notice.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Error; + +final class Notice extends Error +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Warning.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Warning.php new file mode 100644 index 0000000000..d49f99144c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Error/Warning.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Error; + +final class Warning extends Error +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php new file mode 100644 index 0000000000..0ba25286f6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/AssertionFailedError.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class AssertionFailedError extends Exception implements SelfDescribing +{ + /** + * Wrapper for getMessage() which is declared as final. + */ + public function toString(): string + { + return $this->getMessage(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php new file mode 100644 index 0000000000..36b0723130 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CodeCoverageException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class CodeCoverageException extends Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php new file mode 100644 index 0000000000..78f89bc39e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/CoveredCodeNotExecutedException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class CoveredCodeNotExecutedException extends RiskyTestError +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php new file mode 100644 index 0000000000..0b21e6de30 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Exception.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use function array_keys; +use function get_object_vars; +use PHPUnit\Util\Filter; +use RuntimeException; +use Throwable; + +/** + * Base class for all PHPUnit Framework exceptions. + * + * Ensures that exceptions thrown during a test run do not leave stray + * references behind. + * + * Every Exception contains a stack trace. Each stack frame contains the 'args' + * of the called function. The function arguments can contain references to + * instantiated objects. The references prevent the objects from being + * destructed (until test results are eventually printed), so memory cannot be + * freed up. + * + * With enabled process isolation, test results are serialized in the child + * process and unserialized in the parent process. The stack trace of Exceptions + * may contain objects that cannot be serialized or unserialized (e.g., PDO + * connections). Unserializing user-space objects from the child process into + * the parent would break the intended encapsulation of process isolation. + * + * @see http://fabien.potencier.org/article/9/php-serialization-stack-traces-and-exceptions + * + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class Exception extends RuntimeException implements \PHPUnit\Exception +{ + /** + * @var array + */ + protected $serializableTrace; + + public function __construct($message = '', $code = 0, Throwable $previous = null) + { + parent::__construct($message, $code, $previous); + + $this->serializableTrace = $this->getTrace(); + + foreach (array_keys($this->serializableTrace) as $key) { + unset($this->serializableTrace[$key]['args']); + } + } + + public function __toString(): string + { + $string = TestFailure::exceptionToString($this); + + if ($trace = Filter::getFilteredStacktrace($this)) { + $string .= "\n" . $trace; + } + + return $string; + } + + public function __sleep(): array + { + return array_keys(get_object_vars($this)); + } + + /** + * Returns the serializable trace (without 'args'). + */ + public function getSerializableTrace(): array + { + return $this->serializableTrace; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php new file mode 100644 index 0000000000..b9a595a88c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/ExpectationFailedException.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use Exception; +use SebastianBergmann\Comparator\ComparisonFailure; + +/** + * Exception for expectations which failed their check. + * + * The exception contains the error message and optionally a + * SebastianBergmann\Comparator\ComparisonFailure which is used to + * generate diff output of the failed expectations. + * + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ExpectationFailedException extends AssertionFailedError +{ + /** + * @var ComparisonFailure + */ + protected $comparisonFailure; + + public function __construct(string $message, ComparisonFailure $comparisonFailure = null, Exception $previous = null) + { + $this->comparisonFailure = $comparisonFailure; + + parent::__construct($message, 0, $previous); + } + + public function getComparisonFailure(): ?ComparisonFailure + { + return $this->comparisonFailure; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php new file mode 100644 index 0000000000..65f9c8bc34 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/IncompleteTestError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class IncompleteTestError extends AssertionFailedError implements IncompleteTest +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000..aec29f432a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use function debug_backtrace; +use function in_array; +use function lcfirst; +use function sprintf; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvalidArgumentException extends Exception +{ + public static function create(int $argument, string $type): self + { + $stack = debug_backtrace(); + + return new self( + sprintf( + 'Argument #%d of %s::%s() must be %s %s', + $argument, + $stack[1]['class'], + $stack[1]['function'], + in_array(lcfirst($type)[0], ['a', 'e', 'i', 'o', 'u'], true) ? 'an' : 'a', + $type + ) + ); + } + + private function __construct(string $message = '', int $code = 0, \Exception $previous = null) + { + parent::__construct($message, $code, $previous); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php new file mode 100644 index 0000000000..ebf2994a94 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidCoversTargetException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvalidCoversTargetException extends CodeCoverageException +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php new file mode 100644 index 0000000000..7e2ef24c63 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/InvalidDataProviderException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvalidDataProviderException extends Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php new file mode 100644 index 0000000000..567a6c4c58 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/MissingCoversAnnotationException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class MissingCoversAnnotationException extends RiskyTestError +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php new file mode 100644 index 0000000000..7ef4153b0f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/NoChildTestSuiteException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class NoChildTestSuiteException extends Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php new file mode 100644 index 0000000000..1c8b37e561 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/OutputError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class OutputError extends AssertionFailedError +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php new file mode 100644 index 0000000000..17126139f9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/PHPTAssertionFailedError.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class PHPTAssertionFailedError extends SyntheticError +{ + /** + * @var string + */ + private $diff; + + public function __construct(string $message, int $code, string $file, int $line, array $trace, string $diff) + { + parent::__construct($message, $code, $file, $line, $trace); + $this->diff = $diff; + } + + public function getDiff(): string + { + return $this->diff; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php new file mode 100644 index 0000000000..a66552c0d6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/RiskyTestError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class RiskyTestError extends AssertionFailedError +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php new file mode 100644 index 0000000000..7d553dcf3f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class SkippedTestError extends AssertionFailedError implements SkippedTest +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php new file mode 100644 index 0000000000..5448508a1e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SkippedTestSuiteError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class SkippedTestSuiteError extends AssertionFailedError implements SkippedTest +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php new file mode 100644 index 0000000000..c3124ba0c7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticError.php @@ -0,0 +1,61 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class SyntheticError extends AssertionFailedError +{ + /** + * The synthetic file. + * + * @var string + */ + protected $syntheticFile = ''; + + /** + * The synthetic line number. + * + * @var int + */ + protected $syntheticLine = 0; + + /** + * The synthetic trace. + * + * @var array + */ + protected $syntheticTrace = []; + + public function __construct(string $message, int $code, string $file, int $line, array $trace) + { + parent::__construct($message, $code); + + $this->syntheticFile = $file; + $this->syntheticLine = $line; + $this->syntheticTrace = $trace; + } + + public function getSyntheticFile(): string + { + return $this->syntheticFile; + } + + public function getSyntheticLine(): int + { + return $this->syntheticLine; + } + + public function getSyntheticTrace(): array + { + return $this->syntheticTrace; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php new file mode 100644 index 0000000000..f6e155d7b9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/SyntheticSkippedError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class SyntheticSkippedError extends SyntheticError implements SkippedTest +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php new file mode 100644 index 0000000000..fcd1d82496 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/UnintentionallyCoveredCodeError.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class UnintentionallyCoveredCodeError extends RiskyTestError +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php new file mode 100644 index 0000000000..35e94493cf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Exception/Warning.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Warning extends Exception implements SelfDescribing +{ + /** + * Wrapper for getMessage() which is declared as final. + */ + public function toString(): string + { + return $this->getMessage(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php new file mode 100644 index 0000000000..ec7415372e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/ExceptionWrapper.php @@ -0,0 +1,120 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use function array_keys; +use function get_class; +use function spl_object_hash; +use PHPUnit\Util\Filter; +use Throwable; + +/** + * Wraps Exceptions thrown by code under test. + * + * Re-instantiates Exceptions thrown by user-space code to retain their original + * class names, properties, and stack traces (but without arguments). + * + * Unlike PHPUnit\Framework_\Exception, the complete stack of previous Exceptions + * is processed. + * + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ExceptionWrapper extends Exception +{ + /** + * @var string + */ + protected $className; + + /** + * @var null|ExceptionWrapper + */ + protected $previous; + + public function __construct(Throwable $t) + { + // PDOException::getCode() is a string. + // @see https://php.net/manual/en/class.pdoexception.php#95812 + parent::__construct($t->getMessage(), (int) $t->getCode()); + $this->setOriginalException($t); + } + + public function __toString(): string + { + $string = TestFailure::exceptionToString($this); + + if ($trace = Filter::getFilteredStacktrace($this)) { + $string .= "\n" . $trace; + } + + if ($this->previous) { + $string .= "\nCaused by\n" . $this->previous; + } + + return $string; + } + + public function getClassName(): string + { + return $this->className; + } + + public function getPreviousWrapped(): ?self + { + return $this->previous; + } + + public function setClassName(string $className): void + { + $this->className = $className; + } + + public function setOriginalException(Throwable $t): void + { + $this->originalException($t); + + $this->className = get_class($t); + $this->file = $t->getFile(); + $this->line = $t->getLine(); + + $this->serializableTrace = $t->getTrace(); + + foreach (array_keys($this->serializableTrace) as $key) { + unset($this->serializableTrace[$key]['args']); + } + + if ($t->getPrevious()) { + $this->previous = new self($t->getPrevious()); + } + } + + public function getOriginalException(): ?Throwable + { + return $this->originalException(); + } + + /** + * Method to contain static originalException to exclude it from stacktrace to prevent the stacktrace contents, + * which can be quite big, from being garbage-collected, thus blocking memory until shutdown. + * Approach works both for var_dump() and var_export() and print_r(). + */ + private function originalException(Throwable $exceptionToStore = null): ?Throwable + { + static $originalExceptions; + + $instanceId = spl_object_hash($this); + + if ($exceptionToStore) { + $originalExceptions[$instanceId] = $exceptionToStore; + } + + return $originalExceptions[$instanceId] ?? null; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php new file mode 100644 index 0000000000..268957c03d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTest.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface IncompleteTest +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php new file mode 100644 index 0000000000..ee1e3e9fe0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class IncompleteTestCase extends TestCase +{ + /** + * @var bool + */ + protected $backupGlobals = false; + + /** + * @var bool + */ + protected $backupStaticAttributes = false; + + /** + * @var bool + */ + protected $runTestInSeparateProcess = false; + + /** + * @var string + */ + private $message; + + public function __construct(string $className, string $methodName, string $message = '') + { + parent::__construct($className . '::' . $methodName); + + $this->message = $message; + } + + public function getMessage(): string + { + return $this->message; + } + + /** + * Returns a string representation of the test case. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + return $this->getName(); + } + + /** + * @throws Exception + */ + protected function runTest(): void + { + $this->markTestIncomplete($this->message); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php new file mode 100644 index 0000000000..feb9cc989f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/InvalidParameterGroupException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvalidParameterGroupException extends Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php new file mode 100644 index 0000000000..e2f0a2802d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php @@ -0,0 +1,97 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use PHPUnit\Framework\MockObject\Builder\InvocationMocker as InvocationMockerBuilder; +use PHPUnit\Framework\MockObject\Rule\InvocationOrder; + +/** + * @internal This trait is not covered by the backward compatibility promise for PHPUnit + */ +trait Api +{ + /** + * @var ConfigurableMethod[] + */ + private static $__phpunit_configurableMethods; + + /** + * @var object + */ + private $__phpunit_originalObject; + + /** + * @var bool + */ + private $__phpunit_returnValueGeneration = true; + + /** + * @var InvocationHandler + */ + private $__phpunit_invocationMocker; + + /** @noinspection MagicMethodsValidityInspection */ + public static function __phpunit_initConfigurableMethods(ConfigurableMethod ...$configurableMethods): void + { + if (isset(static::$__phpunit_configurableMethods)) { + throw new ConfigurableMethodsAlreadyInitializedException( + 'Configurable methods is already initialized and can not be reinitialized' + ); + } + + static::$__phpunit_configurableMethods = $configurableMethods; + } + + /** @noinspection MagicMethodsValidityInspection */ + public function __phpunit_setOriginalObject($originalObject): void + { + $this->__phpunit_originalObject = $originalObject; + } + + /** @noinspection MagicMethodsValidityInspection */ + public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void + { + $this->__phpunit_returnValueGeneration = $returnValueGeneration; + } + + /** @noinspection MagicMethodsValidityInspection */ + public function __phpunit_getInvocationHandler(): InvocationHandler + { + if ($this->__phpunit_invocationMocker === null) { + $this->__phpunit_invocationMocker = new InvocationHandler( + static::$__phpunit_configurableMethods, + $this->__phpunit_returnValueGeneration + ); + } + + return $this->__phpunit_invocationMocker; + } + + /** @noinspection MagicMethodsValidityInspection */ + public function __phpunit_hasMatchers(): bool + { + return $this->__phpunit_getInvocationHandler()->hasMatchers(); + } + + /** @noinspection MagicMethodsValidityInspection */ + public function __phpunit_verify(bool $unsetInvocationMocker = true): void + { + $this->__phpunit_getInvocationHandler()->verify(); + + if ($unsetInvocationMocker) { + $this->__phpunit_invocationMocker = null; + } + } + + public function expects(InvocationOrder $matcher): InvocationMockerBuilder + { + return $this->__phpunit_getInvocationHandler()->expects($matcher); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php new file mode 100644 index 0000000000..f6df7533c1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function call_user_func_array; +use function func_get_args; +use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; + +/** + * @internal This trait is not covered by the backward compatibility promise for PHPUnit + */ +trait Method +{ + public function method() + { + $expects = $this->expects(new AnyInvokedCount); + + return call_user_func_array( + [$expects, 'method'], + func_get_args() + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php new file mode 100644 index 0000000000..91e35f937f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/MockedCloneMethod.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +/** + * @internal This trait is not covered by the backward compatibility promise for PHPUnit + */ +trait MockedCloneMethod +{ + public function __clone() + { + $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php new file mode 100644 index 0000000000..3f493d203d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Api/UnmockedCloneMethod.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +/** + * @internal This trait is not covered by the backward compatibility promise for PHPUnit + */ +trait UnmockedCloneMethod +{ + public function __clone() + { + $this->__phpunit_invocationMocker = clone $this->__phpunit_getInvocationHandler(); + + parent::__clone(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php new file mode 100644 index 0000000000..a68bfadf9d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Identity.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Builder; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface Identity +{ + /** + * Sets the identification of the expectation to $id. + * + * @note The identifier is unique per mock object. + * + * @param string $id unique identification of expectation + */ + public function id($id); +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php new file mode 100644 index 0000000000..ee4dd20a66 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php @@ -0,0 +1,299 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Builder; + +use function array_map; +use function array_merge; +use function count; +use function get_class; +use function gettype; +use function in_array; +use function is_object; +use function is_string; +use function sprintf; +use function strtolower; +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\MockObject\ConfigurableMethod; +use PHPUnit\Framework\MockObject\IncompatibleReturnValueException; +use PHPUnit\Framework\MockObject\InvocationHandler; +use PHPUnit\Framework\MockObject\Matcher; +use PHPUnit\Framework\MockObject\Rule; +use PHPUnit\Framework\MockObject\RuntimeException; +use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls; +use PHPUnit\Framework\MockObject\Stub\Exception; +use PHPUnit\Framework\MockObject\Stub\ReturnArgument; +use PHPUnit\Framework\MockObject\Stub\ReturnCallback; +use PHPUnit\Framework\MockObject\Stub\ReturnReference; +use PHPUnit\Framework\MockObject\Stub\ReturnSelf; +use PHPUnit\Framework\MockObject\Stub\ReturnStub; +use PHPUnit\Framework\MockObject\Stub\ReturnValueMap; +use PHPUnit\Framework\MockObject\Stub\Stub; +use Throwable; + +final class InvocationMocker implements InvocationStubber, MethodNameMatch +{ + /** + * @var InvocationHandler + */ + private $invocationHandler; + + /** + * @var Matcher + */ + private $matcher; + + /** + * @var ConfigurableMethod[] + */ + private $configurableMethods; + + public function __construct(InvocationHandler $handler, Matcher $matcher, ConfigurableMethod ...$configurableMethods) + { + $this->invocationHandler = $handler; + $this->matcher = $matcher; + $this->configurableMethods = $configurableMethods; + } + + /** + * @return $this + */ + public function id($id): self + { + $this->invocationHandler->registerMatcher($id, $this->matcher); + + return $this; + } + + /** + * @return $this + */ + public function will(Stub $stub): Identity + { + $this->matcher->setStub($stub); + + return $this; + } + + public function willReturn($value, ...$nextValues): self + { + if (count($nextValues) === 0) { + $this->ensureTypeOfReturnValues([$value]); + + $stub = $value instanceof Stub ? $value : new ReturnStub($value); + } else { + $values = array_merge([$value], $nextValues); + + $this->ensureTypeOfReturnValues($values); + + $stub = new ConsecutiveCalls($values); + } + + return $this->will($stub); + } + + public function willReturnReference(&$reference): self + { + $stub = new ReturnReference($reference); + + return $this->will($stub); + } + + public function willReturnMap(array $valueMap): self + { + $stub = new ReturnValueMap($valueMap); + + return $this->will($stub); + } + + public function willReturnArgument($argumentIndex): self + { + $stub = new ReturnArgument($argumentIndex); + + return $this->will($stub); + } + + public function willReturnCallback($callback): self + { + $stub = new ReturnCallback($callback); + + return $this->will($stub); + } + + public function willReturnSelf(): self + { + $stub = new ReturnSelf; + + return $this->will($stub); + } + + public function willReturnOnConsecutiveCalls(...$values): self + { + $stub = new ConsecutiveCalls($values); + + return $this->will($stub); + } + + public function willThrowException(Throwable $exception): self + { + $stub = new Exception($exception); + + return $this->will($stub); + } + + /** + * @return $this + */ + public function after($id): self + { + $this->matcher->setAfterMatchBuilderId($id); + + return $this; + } + + /** + * @throws RuntimeException + * + * @return $this + */ + public function with(...$arguments): self + { + $this->canDefineParameters(); + + $this->matcher->setParametersRule(new Rule\Parameters($arguments)); + + return $this; + } + + /** + * @param array ...$arguments + * + * @throws RuntimeException + * + * @return $this + */ + public function withConsecutive(...$arguments): self + { + $this->canDefineParameters(); + + $this->matcher->setParametersRule(new Rule\ConsecutiveParameters($arguments)); + + return $this; + } + + /** + * @throws RuntimeException + * + * @return $this + */ + public function withAnyParameters(): self + { + $this->canDefineParameters(); + + $this->matcher->setParametersRule(new Rule\AnyParameters); + + return $this; + } + + /** + * @param Constraint|string $constraint + * + * @throws RuntimeException + * + * @return $this + */ + public function method($constraint): self + { + if ($this->matcher->hasMethodNameRule()) { + throw new RuntimeException( + 'Rule for method name is already defined, cannot redefine' + ); + } + + $configurableMethodNames = array_map( + static function (ConfigurableMethod $configurable) { + return strtolower($configurable->getName()); + }, + $this->configurableMethods + ); + + if (is_string($constraint) && !in_array(strtolower($constraint), $configurableMethodNames, true)) { + throw new RuntimeException( + sprintf( + 'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static', + $constraint + ) + ); + } + + $this->matcher->setMethodNameRule(new Rule\MethodName($constraint)); + + return $this; + } + + /** + * Validate that a parameters rule can be defined, throw exceptions otherwise. + * + * @throws RuntimeException + */ + private function canDefineParameters(): void + { + if (!$this->matcher->hasMethodNameRule()) { + throw new RuntimeException( + 'Rule for method name is not defined, cannot define rule for parameters ' . + 'without one' + ); + } + + if ($this->matcher->hasParametersRule()) { + throw new RuntimeException( + 'Rule for parameters is already defined, cannot redefine' + ); + } + } + + private function getConfiguredMethod(): ?ConfigurableMethod + { + $configuredMethod = null; + + foreach ($this->configurableMethods as $configurableMethod) { + if ($this->matcher->getMethodNameRule()->matchesName($configurableMethod->getName())) { + if ($configuredMethod !== null) { + return null; + } + + $configuredMethod = $configurableMethod; + } + } + + return $configuredMethod; + } + + private function ensureTypeOfReturnValues(array $values): void + { + $configuredMethod = $this->getConfiguredMethod(); + + if ($configuredMethod === null) { + return; + } + + foreach ($values as $value) { + if (!$configuredMethod->mayReturn($value)) { + throw new IncompatibleReturnValueException( + sprintf( + 'Method %s may not return value of type %s, its return declaration is "%s"', + $configuredMethod->getName(), + is_object($value) ? get_class($value) : gettype($value), + $configuredMethod->getReturnTypeDeclaration() + ) + ); + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php new file mode 100644 index 0000000000..c0e51b00e7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php @@ -0,0 +1,62 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Builder; + +use PHPUnit\Framework\MockObject\Stub\Stub; +use Throwable; + +interface InvocationStubber +{ + public function will(Stub $stub): Identity; + + /** @return self */ + public function willReturn($value, ...$nextValues)/*: self */; + + /** + * @param mixed $reference + * + * @return self + */ + public function willReturnReference(&$reference)/*: self */; + + /** + * @param array> $valueMap + * + * @return self + */ + public function willReturnMap(array $valueMap)/*: self */; + + /** + * @param int $argumentIndex + * + * @return self + */ + public function willReturnArgument($argumentIndex)/*: self */; + + /** + * @param callable $callback + * + * @return self + */ + public function willReturnCallback($callback)/*: self */; + + /** @return self */ + public function willReturnSelf()/*: self */; + + /** + * @param mixed $values + * + * @return self + */ + public function willReturnOnConsecutiveCalls(...$values)/*: self */; + + /** @return self */ + public function willThrowException(Throwable $exception)/*: self */; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match_.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match_.php new file mode 100644 index 0000000000..6cec73ae97 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Match_.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Builder; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface Match_ extends Stub +{ + /** + * Defines the expectation which must occur before the current is valid. + * + * @param string $id the identification of the expectation that should + * occur before this one + * + * @return Stub + */ + public function after($id); +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php new file mode 100644 index 0000000000..f4b1150b5a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/MethodNameMatch.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Builder; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface MethodNameMatch extends ParametersMatch +{ + /** + * Adds a new method name match and returns the parameter match object for + * further matching possibilities. + * + * @param \PHPUnit\Framework\Constraint\Constraint $name Constraint for matching method, if a string is passed it will use the PHPUnit_Framework_Constraint_IsEqual + * + * @return ParametersMatch + */ + public function method($name); +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php new file mode 100644 index 0000000000..6f5fecdd31 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/ParametersMatch.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Builder; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface ParametersMatch extends Match_ +{ + /** + * Sets the parameters to match for, each parameter to this function will + * be part of match. To perform specific matches or constraints create a + * new PHPUnit\Framework\Constraint\Constraint and use it for the parameter. + * If the parameter value is not a constraint it will use the + * PHPUnit\Framework\Constraint\IsEqual for the value. + * + * Some examples: + * + * // match first parameter with value 2 + * $b->with(2); + * // match first parameter with value 'smock' and second identical to 42 + * $b->with('smock', new PHPUnit\Framework\Constraint\IsEqual(42)); + * + * + * @return ParametersMatch + */ + public function with(...$arguments); + + /** + * Sets a rule which allows any kind of parameters. + * + * Some examples: + * + * // match any number of parameters + * $b->withAnyParameters(); + * + * + * @return ParametersMatch + */ + public function withAnyParameters(); +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php new file mode 100644 index 0000000000..d7cb78fc4e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/Stub.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Builder; + +use PHPUnit\Framework\MockObject\Stub\Stub as BaseStub; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface Stub extends Identity +{ + /** + * Stubs the matching method with the stub object $stub. Any invocations of + * the matched method will now be handled by the stub instead. + */ + public function will(BaseStub $stub): Identity; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php new file mode 100644 index 0000000000..f65983d322 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/ConfigurableMethod.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use SebastianBergmann\Type\Type; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ConfigurableMethod +{ + /** + * @var string + */ + private $name; + + /** + * @var Type + */ + private $returnType; + + public function __construct(string $name, Type $returnType) + { + $this->name = $name; + $this->returnType = $returnType; + } + + public function getName(): string + { + return $this->name; + } + + public function mayReturn($value): bool + { + if ($value === null && $this->returnType->allowsNull()) { + return true; + } + + return $this->returnType->isAssignable(Type::fromValue($value, false)); + } + + public function getReturnTypeDeclaration(): string + { + return $this->returnType->getReturnTypeDeclaration(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php new file mode 100644 index 0000000000..7e655e235a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/BadMethodCallException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class BadMethodCallException extends \BadMethodCallException implements Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php new file mode 100644 index 0000000000..d12ac99738 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ConfigurableMethodsAlreadyInitializedException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ConfigurableMethodsAlreadyInitializedException extends \PHPUnit\Framework\Exception implements Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php new file mode 100644 index 0000000000..5880bc033e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/Exception.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface Exception extends Throwable +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php new file mode 100644 index 0000000000..f1ceb1debf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class IncompatibleReturnValueException extends \PHPUnit\Framework\Exception implements Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php new file mode 100644 index 0000000000..33b6a5be32 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/RuntimeException.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class RuntimeException extends \RuntimeException implements Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php new file mode 100644 index 0000000000..e0e1d5bc36 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php @@ -0,0 +1,1101 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use const DIRECTORY_SEPARATOR; +use const PHP_EOL; +use const PHP_MAJOR_VERSION; +use const PREG_OFFSET_CAPTURE; +use const WSDL_CACHE_NONE; +use function array_diff_assoc; +use function array_map; +use function array_merge; +use function array_pop; +use function array_unique; +use function class_exists; +use function count; +use function explode; +use function extension_loaded; +use function implode; +use function in_array; +use function interface_exists; +use function is_array; +use function is_object; +use function is_string; +use function md5; +use function mt_rand; +use function preg_match; +use function preg_match_all; +use function range; +use function serialize; +use function sort; +use function sprintf; +use function str_replace; +use function strlen; +use function strpos; +use function strtolower; +use function substr; +use function trait_exists; +use Doctrine\Instantiator\Exception\ExceptionInterface as InstantiatorException; +use Doctrine\Instantiator\Instantiator; +use Exception; +use Iterator; +use IteratorAggregate; +use PHPUnit\Framework\InvalidArgumentException; +use ReflectionClass; +use ReflectionException; +use ReflectionMethod; +use SoapClient; +use SoapFault; +use Text_Template; +use Throwable; +use Traversable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Generator +{ + /** + * @var array + */ + private const BLACKLISTED_METHOD_NAMES = [ + '__CLASS__' => true, + '__DIR__' => true, + '__FILE__' => true, + '__FUNCTION__' => true, + '__LINE__' => true, + '__METHOD__' => true, + '__NAMESPACE__' => true, + '__TRAIT__' => true, + '__clone' => true, + '__halt_compiler' => true, + ]; + + /** + * @var array + */ + private static $cache = []; + + /** + * @var Text_Template[] + */ + private static $templates = []; + + /** + * Returns a mock object for the specified class. + * + * @param string|string[] $type + * @param null|array $methods + * + * @throws RuntimeException + */ + public function getMock($type, $methods = [], array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false, object $proxyTarget = null, bool $allowMockingUnknownTypes = true, bool $returnValueGeneration = true): MockObject + { + if (!is_array($type) && !is_string($type)) { + throw InvalidArgumentException::create(1, 'array or string'); + } + + if (!is_array($methods) && null !== $methods) { + throw InvalidArgumentException::create(2, 'array'); + } + + if ($type === 'Traversable' || $type === '\\Traversable') { + $type = 'Iterator'; + } + + if (is_array($type)) { + $type = array_unique( + array_map( + static function ($type) { + if ($type === 'Traversable' || + $type === '\\Traversable' || + $type === '\\Iterator') { + return 'Iterator'; + } + + return $type; + }, + $type + ) + ); + } + + if (!$allowMockingUnknownTypes) { + if (is_array($type)) { + foreach ($type as $_type) { + if (!class_exists($_type, $callAutoload) && + !interface_exists($_type, $callAutoload)) { + throw new RuntimeException( + sprintf( + 'Cannot stub or mock class or interface "%s" which does not exist', + $_type + ) + ); + } + } + } elseif (!class_exists($type, $callAutoload) && !interface_exists($type, $callAutoload)) { + throw new RuntimeException( + sprintf( + 'Cannot stub or mock class or interface "%s" which does not exist', + $type + ) + ); + } + } + + if (null !== $methods) { + foreach ($methods as $method) { + if (!preg_match('~[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*~', (string) $method)) { + throw new RuntimeException( + sprintf( + 'Cannot stub or mock method with invalid name "%s"', + $method + ) + ); + } + } + + if ($methods !== array_unique($methods)) { + throw new RuntimeException( + sprintf( + 'Cannot stub or mock using a method list that contains duplicates: "%s" (duplicate: "%s")', + implode(', ', $methods), + implode(', ', array_unique(array_diff_assoc($methods, array_unique($methods)))) + ) + ); + } + } + + if ($mockClassName !== '' && class_exists($mockClassName, false)) { + try { + $reflector = new ReflectionClass($mockClassName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (!$reflector->implementsInterface(MockObject::class)) { + throw new RuntimeException( + sprintf( + 'Class "%s" already exists.', + $mockClassName + ) + ); + } + } + + if (!$callOriginalConstructor && $callOriginalMethods) { + throw new RuntimeException( + 'Proxying to original methods requires invoking the original constructor' + ); + } + + $mock = $this->generate( + $type, + $methods, + $mockClassName, + $callOriginalClone, + $callAutoload, + $cloneArguments, + $callOriginalMethods + ); + + return $this->getObject( + $mock, + $type, + $callOriginalConstructor, + $callAutoload, + $arguments, + $callOriginalMethods, + $proxyTarget, + $returnValueGeneration + ); + } + + /** + * Returns a mock object for the specified abstract class with all abstract + * methods of the class mocked. Concrete methods to mock can be specified with + * the $mockedMethods parameter. + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string $originalClassName + * @psalm-return MockObject&RealInstanceType + * + * @throws RuntimeException + */ + public function getMockForAbstractClass(string $originalClassName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = null, bool $cloneArguments = true): MockObject + { + if (class_exists($originalClassName, $callAutoload) || + interface_exists($originalClassName, $callAutoload)) { + try { + $reflector = new ReflectionClass($originalClassName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $methods = $mockedMethods; + + foreach ($reflector->getMethods() as $method) { + if ($method->isAbstract() && !in_array($method->getName(), $methods ?? [], true)) { + $methods[] = $method->getName(); + } + } + + if (empty($methods)) { + $methods = null; + } + + return $this->getMock( + $originalClassName, + $methods, + $arguments, + $mockClassName, + $callOriginalConstructor, + $callOriginalClone, + $callAutoload, + $cloneArguments + ); + } + + throw new RuntimeException( + sprintf('Class "%s" does not exist.', $originalClassName) + ); + } + + /** + * Returns a mock object for the specified trait with all abstract methods + * of the trait mocked. Concrete methods to mock can be specified with the + * `$mockedMethods` parameter. + * + * @throws RuntimeException + */ + public function getMockForTrait(string $traitName, array $arguments = [], string $mockClassName = '', bool $callOriginalConstructor = true, bool $callOriginalClone = true, bool $callAutoload = true, array $mockedMethods = null, bool $cloneArguments = true): MockObject + { + if (!trait_exists($traitName, $callAutoload)) { + throw new RuntimeException( + sprintf( + 'Trait "%s" does not exist.', + $traitName + ) + ); + } + + $className = $this->generateClassName( + $traitName, + '', + 'Trait_' + ); + + $classTemplate = $this->getTemplate('trait_class.tpl'); + + $classTemplate->setVar( + [ + 'prologue' => 'abstract ', + 'class_name' => $className['className'], + 'trait_name' => $traitName, + ] + ); + + $mockTrait = new MockTrait($classTemplate->render(), $className['className']); + $mockTrait->generate(); + + return $this->getMockForAbstractClass($className['className'], $arguments, $mockClassName, $callOriginalConstructor, $callOriginalClone, $callAutoload, $mockedMethods, $cloneArguments); + } + + /** + * Returns an object for the specified trait. + * + * @throws RuntimeException + */ + public function getObjectForTrait(string $traitName, string $traitClassName = '', bool $callAutoload = true, bool $callOriginalConstructor = false, array $arguments = []): object + { + if (!trait_exists($traitName, $callAutoload)) { + throw new RuntimeException( + sprintf( + 'Trait "%s" does not exist.', + $traitName + ) + ); + } + + $className = $this->generateClassName( + $traitName, + $traitClassName, + 'Trait_' + ); + + $classTemplate = $this->getTemplate('trait_class.tpl'); + + $classTemplate->setVar( + [ + 'prologue' => '', + 'class_name' => $className['className'], + 'trait_name' => $traitName, + ] + ); + + return $this->getObject( + new MockTrait( + $classTemplate->render(), + $className['className'] + ), + '', + $callOriginalConstructor, + $callAutoload, + $arguments + ); + } + + public function generate($type, array $methods = null, string $mockClassName = '', bool $callOriginalClone = true, bool $callAutoload = true, bool $cloneArguments = true, bool $callOriginalMethods = false): MockClass + { + if (is_array($type)) { + sort($type); + } + + if ($mockClassName !== '') { + return $this->generateMock( + $type, + $methods, + $mockClassName, + $callOriginalClone, + $callAutoload, + $cloneArguments, + $callOriginalMethods + ); + } + + $key = md5( + is_array($type) ? implode('_', $type) : $type . + serialize($methods) . + serialize($callOriginalClone) . + serialize($cloneArguments) . + serialize($callOriginalMethods) + ); + + if (!isset(self::$cache[$key])) { + self::$cache[$key] = $this->generateMock( + $type, + $methods, + $mockClassName, + $callOriginalClone, + $callAutoload, + $cloneArguments, + $callOriginalMethods + ); + } + + return self::$cache[$key]; + } + + /** + * @throws RuntimeException + */ + public function generateClassFromWsdl(string $wsdlFile, string $className, array $methods = [], array $options = []): string + { + if (!extension_loaded('soap')) { + throw new RuntimeException( + 'The SOAP extension is required to generate a mock object from WSDL.' + ); + } + + $options = array_merge($options, ['cache_wsdl' => WSDL_CACHE_NONE]); + + try { + $client = new SoapClient($wsdlFile, $options); + $_methods = array_unique($client->__getFunctions()); + unset($client); + } catch (SoapFault $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + + sort($_methods); + + $methodTemplate = $this->getTemplate('wsdl_method.tpl'); + $methodsBuffer = ''; + + foreach ($_methods as $method) { + preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\(/', $method, $matches, PREG_OFFSET_CAPTURE); + $lastFunction = array_pop($matches[0]); + $nameStart = $lastFunction[1]; + $nameEnd = $nameStart + strlen($lastFunction[0]) - 1; + $name = str_replace('(', '', $lastFunction[0]); + + if (empty($methods) || in_array($name, $methods, true)) { + $args = explode( + ',', + str_replace(')', '', substr($method, $nameEnd + 1)) + ); + + foreach (range(0, count($args) - 1) as $i) { + $parameterStart = strpos($args[$i], '$'); + + if (!$parameterStart) { + continue; + } + + $args[$i] = substr($args[$i], $parameterStart); + } + + $methodTemplate->setVar( + [ + 'method_name' => $name, + 'arguments' => implode(', ', $args), + ] + ); + + $methodsBuffer .= $methodTemplate->render(); + } + } + + $optionsBuffer = '['; + + foreach ($options as $key => $value) { + $optionsBuffer .= $key . ' => ' . $value; + } + + $optionsBuffer .= ']'; + + $classTemplate = $this->getTemplate('wsdl_class.tpl'); + $namespace = ''; + + if (strpos($className, '\\') !== false) { + $parts = explode('\\', $className); + $className = array_pop($parts); + $namespace = 'namespace ' . implode('\\', $parts) . ';' . "\n\n"; + } + + $classTemplate->setVar( + [ + 'namespace' => $namespace, + 'class_name' => $className, + 'wsdl' => $wsdlFile, + 'options' => $optionsBuffer, + 'methods' => $methodsBuffer, + ] + ); + + return $classTemplate->render(); + } + + /** + * @throws RuntimeException + * + * @return string[] + */ + public function getClassMethods(string $className): array + { + try { + $class = new ReflectionClass($className); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $methods = []; + + foreach ($class->getMethods() as $method) { + if ($method->isPublic() || $method->isAbstract()) { + $methods[] = $method->getName(); + } + } + + return $methods; + } + + /** + * @throws RuntimeException + * + * @return MockMethod[] + */ + public function mockClassMethods(string $className, bool $callOriginalMethods, bool $cloneArguments): array + { + try { + $class = new ReflectionClass($className); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $methods = []; + + foreach ($class->getMethods() as $method) { + if (($method->isPublic() || $method->isAbstract()) && $this->canMockMethod($method)) { + $methods[] = MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments); + } + } + + return $methods; + } + + /** + * @throws RuntimeException + * + * @return MockMethod[] + */ + public function mockInterfaceMethods(string $interfaceName, bool $cloneArguments): array + { + try { + $class = new ReflectionClass($interfaceName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $methods = []; + + foreach ($class->getMethods() as $method) { + $methods[] = MockMethod::fromReflection($method, false, $cloneArguments); + } + + return $methods; + } + + /** + * @psalm-param class-string $interfaceName + * + * @return ReflectionMethod[] + */ + private function userDefinedInterfaceMethods(string $interfaceName): array + { + try { + // @codeCoverageIgnoreStart + $interface = new ReflectionClass($interfaceName); + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $methods = []; + + foreach ($interface->getMethods() as $method) { + if (!$method->isUserDefined()) { + continue; + } + + $methods[] = $method; + } + + return $methods; + } + + private function getObject(MockType $mockClass, $type = '', bool $callOriginalConstructor = false, bool $callAutoload = false, array $arguments = [], bool $callOriginalMethods = false, object $proxyTarget = null, bool $returnValueGeneration = true) + { + $className = $mockClass->generate(); + + if ($callOriginalConstructor) { + if (count($arguments) === 0) { + $object = new $className; + } else { + try { + $class = new ReflectionClass($className); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $object = $class->newInstanceArgs($arguments); + } + } else { + try { + $object = (new Instantiator)->instantiate($className); + } catch (InstantiatorException $exception) { + throw new RuntimeException($exception->getMessage()); + } + } + + if ($callOriginalMethods) { + if (!is_object($proxyTarget)) { + if (count($arguments) === 0) { + $proxyTarget = new $type; + } else { + try { + $class = new ReflectionClass($type); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $proxyTarget = $class->newInstanceArgs($arguments); + } + } + + $object->__phpunit_setOriginalObject($proxyTarget); + } + + if ($object instanceof MockObject) { + $object->__phpunit_setReturnValueGeneration($returnValueGeneration); + } + + return $object; + } + + /** + * @param array|string $type + * + * @throws RuntimeException + */ + private function generateMock($type, ?array $explicitMethods, string $mockClassName, bool $callOriginalClone, bool $callAutoload, bool $cloneArguments, bool $callOriginalMethods): MockClass + { + $classTemplate = $this->getTemplate('mocked_class.tpl'); + $additionalInterfaces = []; + $mockedCloneMethod = false; + $unmockedCloneMethod = false; + $isClass = false; + $isInterface = false; + $class = null; + $mockMethods = new MockMethodSet; + + if (is_array($type)) { + $interfaceMethods = []; + + foreach ($type as $_type) { + if (!interface_exists($_type, $callAutoload)) { + throw new RuntimeException( + sprintf( + 'Interface "%s" does not exist.', + $_type + ) + ); + } + + $additionalInterfaces[] = $_type; + + try { + $typeClass = new ReflectionClass($_type); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + foreach ($this->getClassMethods($_type) as $method) { + if (in_array($method, $interfaceMethods, true)) { + throw new RuntimeException( + sprintf( + 'Duplicate method "%s" not allowed.', + $method + ) + ); + } + + try { + $methodReflection = $typeClass->getMethod($method); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($this->canMockMethod($methodReflection)) { + $mockMethods->addMethods( + MockMethod::fromReflection($methodReflection, $callOriginalMethods, $cloneArguments) + ); + + $interfaceMethods[] = $method; + } + } + } + + unset($interfaceMethods); + } + + $mockClassName = $this->generateClassName( + $type, + $mockClassName, + 'Mock_' + ); + + if (class_exists($mockClassName['fullClassName'], $callAutoload)) { + $isClass = true; + } elseif (interface_exists($mockClassName['fullClassName'], $callAutoload)) { + $isInterface = true; + } + + if (!$isClass && !$isInterface) { + $prologue = 'class ' . $mockClassName['originalClassName'] . "\n{\n}\n\n"; + + if (!empty($mockClassName['namespaceName'])) { + $prologue = 'namespace ' . $mockClassName['namespaceName'] . + " {\n\n" . $prologue . "}\n\n" . + "namespace {\n\n"; + + $epilogue = "\n\n}"; + } + + $mockedCloneMethod = true; + } else { + try { + $class = new ReflectionClass($mockClassName['fullClassName']); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($class->isFinal()) { + throw new RuntimeException( + sprintf( + 'Class "%s" is declared "final" and cannot be mocked.', + $mockClassName['fullClassName'] + ) + ); + } + + // @see https://github.com/sebastianbergmann/phpunit/issues/2995 + if ($isInterface && $class->implementsInterface(Throwable::class)) { + $actualClassName = Exception::class; + $additionalInterfaces[] = $class->getName(); + $isInterface = false; + + try { + $class = new ReflectionClass($actualClassName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + foreach ($this->userDefinedInterfaceMethods($mockClassName['fullClassName']) as $method) { + $methodName = $method->getName(); + + if ($class->hasMethod($methodName)) { + try { + $classMethod = $class->getMethod($methodName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (!$this->canMockMethod($classMethod)) { + continue; + } + } + + $mockMethods->addMethods( + MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) + ); + } + + $mockClassName = $this->generateClassName( + $actualClassName, + $mockClassName['className'], + 'Mock_' + ); + } + + // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/103 + if ($isInterface && $class->implementsInterface(Traversable::class) && + !$class->implementsInterface(Iterator::class) && + !$class->implementsInterface(IteratorAggregate::class)) { + $additionalInterfaces[] = Iterator::class; + + $mockMethods->addMethods( + ...$this->mockClassMethods(Iterator::class, $callOriginalMethods, $cloneArguments) + ); + } + + if ($class->hasMethod('__clone')) { + try { + $cloneMethod = $class->getMethod('__clone'); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (!$cloneMethod->isFinal()) { + if ($callOriginalClone && !$isInterface) { + $unmockedCloneMethod = true; + } else { + $mockedCloneMethod = true; + } + } + } else { + $mockedCloneMethod = true; + } + } + + if ($isClass && $explicitMethods === []) { + $mockMethods->addMethods( + ...$this->mockClassMethods($mockClassName['fullClassName'], $callOriginalMethods, $cloneArguments) + ); + } + + if ($isInterface && ($explicitMethods === [] || $explicitMethods === null)) { + $mockMethods->addMethods( + ...$this->mockInterfaceMethods($mockClassName['fullClassName'], $cloneArguments) + ); + } + + if (is_array($explicitMethods)) { + foreach ($explicitMethods as $methodName) { + if ($class !== null && $class->hasMethod($methodName)) { + try { + $method = $class->getMethod($methodName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($this->canMockMethod($method)) { + $mockMethods->addMethods( + MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) + ); + } + } else { + $mockMethods->addMethods( + MockMethod::fromName( + $mockClassName['fullClassName'], + $methodName, + $cloneArguments + ) + ); + } + } + } + + $mockedMethods = ''; + $configurable = []; + + foreach ($mockMethods->asArray() as $mockMethod) { + $mockedMethods .= $mockMethod->generateCode(); + $configurable[] = new ConfigurableMethod($mockMethod->getName(), $mockMethod->getReturnType()); + } + + $method = ''; + + if (!$mockMethods->hasMethod('method') && (!isset($class) || !$class->hasMethod('method'))) { + $method = PHP_EOL . ' use \PHPUnit\Framework\MockObject\Method;'; + } + + $cloneTrait = ''; + + if ($mockedCloneMethod) { + $cloneTrait = PHP_EOL . ' use \PHPUnit\Framework\MockObject\MockedCloneMethod;'; + } + + if ($unmockedCloneMethod) { + $cloneTrait = PHP_EOL . ' use \PHPUnit\Framework\MockObject\UnmockedCloneMethod;'; + } + + $classTemplate->setVar( + [ + 'prologue' => $prologue ?? '', + 'epilogue' => $epilogue ?? '', + 'class_declaration' => $this->generateMockClassDeclaration( + $mockClassName, + $isInterface, + $additionalInterfaces + ), + 'clone' => $cloneTrait, + 'mock_class_name' => $mockClassName['className'], + 'mocked_methods' => $mockedMethods, + 'method' => $method, + ] + ); + + return new MockClass( + $classTemplate->render(), + $mockClassName['className'], + $configurable + ); + } + + /** + * @param array|string $type + */ + private function generateClassName($type, string $className, string $prefix): array + { + if (is_array($type)) { + $type = implode('_', $type); + } + + if ($type[0] === '\\') { + $type = substr($type, 1); + } + + $classNameParts = explode('\\', $type); + + if (count($classNameParts) > 1) { + $type = array_pop($classNameParts); + $namespaceName = implode('\\', $classNameParts); + $fullClassName = $namespaceName . '\\' . $type; + } else { + $namespaceName = ''; + $fullClassName = $type; + } + + if ($className === '') { + do { + $className = $prefix . $type . '_' . + substr(md5((string) mt_rand()), 0, 8); + } while (class_exists($className, false)); + } + + return [ + 'className' => $className, + 'originalClassName' => $type, + 'fullClassName' => $fullClassName, + 'namespaceName' => $namespaceName, + ]; + } + + private function generateMockClassDeclaration(array $mockClassName, bool $isInterface, array $additionalInterfaces = []): string + { + $buffer = 'class '; + + $additionalInterfaces[] = MockObject::class; + $interfaces = implode(', ', $additionalInterfaces); + + if ($isInterface) { + $buffer .= sprintf( + '%s implements %s', + $mockClassName['className'], + $interfaces + ); + + if (!in_array($mockClassName['originalClassName'], $additionalInterfaces, true)) { + $buffer .= ', '; + + if (!empty($mockClassName['namespaceName'])) { + $buffer .= $mockClassName['namespaceName'] . '\\'; + } + + $buffer .= $mockClassName['originalClassName']; + } + } else { + $buffer .= sprintf( + '%s extends %s%s implements %s', + $mockClassName['className'], + !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '', + $mockClassName['originalClassName'], + $interfaces + ); + } + + return $buffer; + } + + private function canMockMethod(ReflectionMethod $method): bool + { + return !($this->isConstructor($method) || $method->isFinal() || $method->isPrivate() || $this->isMethodNameBlacklisted($method->getName())); + } + + private function isMethodNameBlacklisted(string $name): bool + { + return isset(self::BLACKLISTED_METHOD_NAMES[$name]); + } + + private function getTemplate(string $template): Text_Template + { + $filename = __DIR__ . DIRECTORY_SEPARATOR . 'Generator' . DIRECTORY_SEPARATOR . $template; + + if (!isset(self::$templates[$filename])) { + self::$templates[$filename] = new Text_Template($filename); + } + + return self::$templates[$filename]; + } + + /** + * @see https://github.com/sebastianbergmann/phpunit/issues/4139#issuecomment-605409765 + */ + private function isConstructor(ReflectionMethod $method): bool + { + $methodName = strtolower($method->getName()); + + if ($methodName === '__construct') { + return true; + } + + if (PHP_MAJOR_VERSION >= 8) { + return false; + } + + $className = strtolower($method->getDeclaringClass()->getName()); + + return $methodName === $className; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl new file mode 100644 index 0000000000..5bf06f52de --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/deprecation.tpl @@ -0,0 +1,2 @@ + + @trigger_error({deprecation}, E_USER_DEPRECATED); diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl new file mode 100644 index 0000000000..593119fb26 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_class.tpl @@ -0,0 +1,6 @@ +declare(strict_types=1); + +{prologue}{class_declaration} +{ + use \PHPUnit\Framework\MockObject\Api;{method}{clone} +{mocked_methods}}{epilogue} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl new file mode 100644 index 0000000000..32304f30c8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method.tpl @@ -0,0 +1,22 @@ + + {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} + {{deprecation} + $__phpunit_arguments = [{arguments_call}]; + $__phpunit_count = func_num_args(); + + if ($__phpunit_count > {arguments_count}) { + $__phpunit_arguments_tmp = func_get_args(); + + for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { + $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; + } + } + + $__phpunit_result = $this->__phpunit_getInvocationHandler()->invoke( + new \PHPUnit\Framework\MockObject\Invocation( + '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments} + ) + ); + + return $__phpunit_result; + } diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl new file mode 100644 index 0000000000..6ea6f45177 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_method_void.tpl @@ -0,0 +1,20 @@ + + {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} + {{deprecation} + $__phpunit_arguments = [{arguments_call}]; + $__phpunit_count = func_num_args(); + + if ($__phpunit_count > {arguments_count}) { + $__phpunit_arguments_tmp = func_get_args(); + + for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { + $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; + } + } + + $this->__phpunit_getInvocationHandler()->invoke( + new \PHPUnit\Framework\MockObject\Invocation( + '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments} + ) + ); + } diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl new file mode 100644 index 0000000000..5e5cf23cdd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/mocked_static_method.tpl @@ -0,0 +1,5 @@ + + {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} + { + throw new \PHPUnit\Framework\MockObject\BadMethodCallException('Static method "{method_name}" cannot be invoked on mock object'); + } diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl new file mode 100644 index 0000000000..6f699becbc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method.tpl @@ -0,0 +1,22 @@ + + {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} + { + $__phpunit_arguments = [{arguments_call}]; + $__phpunit_count = func_num_args(); + + if ($__phpunit_count > {arguments_count}) { + $__phpunit_arguments_tmp = func_get_args(); + + for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { + $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; + } + } + + $this->__phpunit_getInvocationHandler()->invoke( + new \PHPUnit\Framework\MockObject\Invocation( + '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments}, true + ) + ); + + return call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $__phpunit_arguments); + } diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl new file mode 100644 index 0000000000..b2f963dfbf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/proxied_method_void.tpl @@ -0,0 +1,22 @@ + + {modifier} function {reference}{method_name}({arguments_decl}){return_declaration} + { + $__phpunit_arguments = [{arguments_call}]; + $__phpunit_count = func_num_args(); + + if ($__phpunit_count > {arguments_count}) { + $__phpunit_arguments_tmp = func_get_args(); + + for ($__phpunit_i = {arguments_count}; $__phpunit_i < $__phpunit_count; $__phpunit_i++) { + $__phpunit_arguments[] = $__phpunit_arguments_tmp[$__phpunit_i]; + } + } + + $this->__phpunit_getInvocationHandler()->invoke( + new \PHPUnit\Framework\MockObject\Invocation( + '{class_name}', '{method_name}', $__phpunit_arguments, '{return_declaration}', $this, {clone_arguments}, true + ) + ); + + call_user_func_array(array($this->__phpunit_originalObject, "{method_name}"), $__phpunit_arguments); + } diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl new file mode 100644 index 0000000000..a8fe470fdc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/trait_class.tpl @@ -0,0 +1,6 @@ +declare(strict_types=1); + +{prologue}class {class_name} +{ + use {trait_name}; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl new file mode 100644 index 0000000000..b3100b4141 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_class.tpl @@ -0,0 +1,9 @@ +declare(strict_types=1); + +{namespace}class {class_name} extends \SoapClient +{ + public function __construct($wsdl, array $options) + { + parent::__construct('{wsdl}', $options); + } +{methods}} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl new file mode 100644 index 0000000000..bb16e763eb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Generator/wsdl_method.tpl @@ -0,0 +1,4 @@ + + public function {method_name}({arguments}) + { + } diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php new file mode 100644 index 0000000000..bedfebf1be --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php @@ -0,0 +1,199 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function array_map; +use function implode; +use function is_object; +use function ltrim; +use function sprintf; +use function strpos; +use function strtolower; +use function substr; +use PHPUnit\Framework\SelfDescribing; +use PHPUnit\Util\Type; +use SebastianBergmann\Exporter\Exporter; +use stdClass; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Invocation implements SelfDescribing +{ + /** + * @var string + */ + private $className; + + /** + * @var string + */ + private $methodName; + + /** + * @var array + */ + private $parameters; + + /** + * @var string + */ + private $returnType; + + /** + * @var bool + */ + private $isReturnTypeNullable = false; + + /** + * @var bool + */ + private $proxiedCall; + + /** + * @var object + */ + private $object; + + public function __construct(string $className, string $methodName, array $parameters, string $returnType, object $object, bool $cloneObjects = false, bool $proxiedCall = false) + { + $this->className = $className; + $this->methodName = $methodName; + $this->parameters = $parameters; + $this->object = $object; + $this->proxiedCall = $proxiedCall; + + $returnType = ltrim($returnType, ': '); + + if (strtolower($methodName) === '__tostring') { + $returnType = 'string'; + } + + if (strpos($returnType, '?') === 0) { + $returnType = substr($returnType, 1); + $this->isReturnTypeNullable = true; + } + + $this->returnType = $returnType; + + if (!$cloneObjects) { + return; + } + + foreach ($this->parameters as $key => $value) { + if (is_object($value)) { + $this->parameters[$key] = $this->cloneObject($value); + } + } + } + + public function getClassName(): string + { + return $this->className; + } + + public function getMethodName(): string + { + return $this->methodName; + } + + public function getParameters(): array + { + return $this->parameters; + } + + /** + * @throws RuntimeException + * + * @return mixed Mocked return value + */ + public function generateReturnValue() + { + if ($this->isReturnTypeNullable || $this->proxiedCall) { + return; + } + + switch (strtolower($this->returnType)) { + case '': + case 'void': + return; + + case 'string': + return ''; + + case 'float': + return 0.0; + + case 'int': + return 0; + + case 'bool': + return false; + + case 'array': + return []; + + case 'object': + return new stdClass; + + case 'callable': + case 'closure': + return static function (): void { + }; + + case 'traversable': + case 'generator': + case 'iterable': + $generator = static function () { + yield; + }; + + return $generator(); + + default: + $generator = new Generator; + + return $generator->getMock($this->returnType, [], [], '', false); + } + } + + public function toString(): string + { + $exporter = new Exporter; + + return sprintf( + '%s::%s(%s)%s', + $this->className, + $this->methodName, + implode( + ', ', + array_map( + [$exporter, 'shortenedExport'], + $this->parameters + ) + ), + $this->returnType ? sprintf(': %s', $this->returnType) : '' + ); + } + + public function getObject(): object + { + return $this->object; + } + + private function cloneObject(object $original): object + { + if (Type::isCloneable($original)) { + return clone $original; + } + + return $original; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php new file mode 100644 index 0000000000..77d7825a23 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php @@ -0,0 +1,197 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function sprintf; +use function strtolower; +use Exception; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Builder\InvocationMocker; +use PHPUnit\Framework\MockObject\Rule\InvocationOrder; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvocationHandler +{ + /** + * @var Matcher[] + */ + private $matchers = []; + + /** + * @var Matcher[] + */ + private $matcherMap = []; + + /** + * @var ConfigurableMethod[] + */ + private $configurableMethods; + + /** + * @var bool + */ + private $returnValueGeneration; + + /** + * @var Throwable + */ + private $deferredError; + + public function __construct(array $configurableMethods, bool $returnValueGeneration) + { + $this->configurableMethods = $configurableMethods; + $this->returnValueGeneration = $returnValueGeneration; + } + + public function hasMatchers(): bool + { + foreach ($this->matchers as $matcher) { + if ($matcher->hasMatchers()) { + return true; + } + } + + return false; + } + + /** + * Looks up the match builder with identification $id and returns it. + * + * @param string $id The identification of the match builder + */ + public function lookupMatcher(string $id): ?Matcher + { + if (isset($this->matcherMap[$id])) { + return $this->matcherMap[$id]; + } + + return null; + } + + /** + * Registers a matcher with the identification $id. The matcher can later be + * looked up using lookupMatcher() to figure out if it has been invoked. + * + * @param string $id The identification of the matcher + * @param Matcher $matcher The builder which is being registered + * + * @throws RuntimeException + */ + public function registerMatcher(string $id, Matcher $matcher): void + { + if (isset($this->matcherMap[$id])) { + throw new RuntimeException( + 'Matcher with id <' . $id . '> is already registered.' + ); + } + + $this->matcherMap[$id] = $matcher; + } + + public function expects(InvocationOrder $rule): InvocationMocker + { + $matcher = new Matcher($rule); + $this->addMatcher($matcher); + + return new InvocationMocker( + $this, + $matcher, + ...$this->configurableMethods + ); + } + + /** + * @throws Exception + * + * @return mixed|void + */ + public function invoke(Invocation $invocation) + { + $exception = null; + $hasReturnValue = false; + $returnValue = null; + + foreach ($this->matchers as $match) { + try { + if ($match->matches($invocation)) { + $value = $match->invoked($invocation); + + if (!$hasReturnValue) { + $returnValue = $value; + $hasReturnValue = true; + } + } + } catch (Exception $e) { + $exception = $e; + } + } + + if ($exception !== null) { + throw $exception; + } + + if ($hasReturnValue) { + return $returnValue; + } + + if (!$this->returnValueGeneration) { + $exception = new ExpectationFailedException( + sprintf( + 'Return value inference disabled and no expectation set up for %s::%s()', + $invocation->getClassName(), + $invocation->getMethodName() + ) + ); + + if (strtolower($invocation->getMethodName()) === '__tostring') { + $this->deferredError = $exception; + + return ''; + } + + throw $exception; + } + + return $invocation->generateReturnValue(); + } + + public function matches(Invocation $invocation): bool + { + foreach ($this->matchers as $matcher) { + if (!$matcher->matches($invocation)) { + return false; + } + } + + return true; + } + + /** + * @throws \PHPUnit\Framework\ExpectationFailedException + */ + public function verify(): void + { + foreach ($this->matchers as $matcher) { + $matcher->verify(); + } + + if ($this->deferredError) { + throw $this->deferredError; + } + } + + private function addMatcher(Matcher $matcher): void + { + $this->matchers[] = $matcher; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php new file mode 100644 index 0000000000..2b1cd8c86c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php @@ -0,0 +1,278 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function assert; +use function implode; +use function sprintf; +use Exception; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount; +use PHPUnit\Framework\MockObject\Rule\AnyParameters; +use PHPUnit\Framework\MockObject\Rule\InvocationOrder; +use PHPUnit\Framework\MockObject\Rule\InvokedCount; +use PHPUnit\Framework\MockObject\Rule\MethodName; +use PHPUnit\Framework\MockObject\Rule\ParametersRule; +use PHPUnit\Framework\MockObject\Stub\Stub; +use PHPUnit\Framework\TestFailure; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Matcher +{ + /** + * @var InvocationOrder + */ + private $invocationRule; + + /** + * @var mixed + */ + private $afterMatchBuilderId; + + /** + * @var bool + */ + private $afterMatchBuilderIsInvoked = false; + + /** + * @var MethodName + */ + private $methodNameRule; + + /** + * @var ParametersRule + */ + private $parametersRule; + + /** + * @var Stub + */ + private $stub; + + public function __construct(InvocationOrder $rule) + { + $this->invocationRule = $rule; + } + + public function hasMatchers(): bool + { + return !$this->invocationRule instanceof AnyInvokedCount; + } + + public function hasMethodNameRule(): bool + { + return $this->methodNameRule !== null; + } + + public function getMethodNameRule(): MethodName + { + return $this->methodNameRule; + } + + public function setMethodNameRule(MethodName $rule): void + { + $this->methodNameRule = $rule; + } + + public function hasParametersRule(): bool + { + return $this->parametersRule !== null; + } + + public function setParametersRule(ParametersRule $rule): void + { + $this->parametersRule = $rule; + } + + public function setStub(Stub $stub): void + { + $this->stub = $stub; + } + + public function setAfterMatchBuilderId(string $id): void + { + $this->afterMatchBuilderId = $id; + } + + /** + * @throws Exception + * @throws ExpectationFailedException + * @throws RuntimeException + */ + public function invoked(Invocation $invocation) + { + if ($this->methodNameRule === null) { + throw new RuntimeException('No method rule is set'); + } + + if ($this->afterMatchBuilderId !== null) { + $matcher = $invocation->getObject() + ->__phpunit_getInvocationHandler() + ->lookupMatcher($this->afterMatchBuilderId); + + if (!$matcher) { + throw new RuntimeException( + sprintf( + 'No builder found for match builder identification <%s>', + $this->afterMatchBuilderId + ) + ); + } + assert($matcher instanceof self); + + if ($matcher->invocationRule->hasBeenInvoked()) { + $this->afterMatchBuilderIsInvoked = true; + } + } + + $this->invocationRule->invoked($invocation); + + try { + if ($this->parametersRule !== null) { + $this->parametersRule->apply($invocation); + } + } catch (ExpectationFailedException $e) { + throw new ExpectationFailedException( + sprintf( + "Expectation failed for %s when %s\n%s", + $this->methodNameRule->toString(), + $this->invocationRule->toString(), + $e->getMessage() + ), + $e->getComparisonFailure() + ); + } + + if ($this->stub) { + return $this->stub->invoke($invocation); + } + + return $invocation->generateReturnValue(); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * @throws RuntimeException + */ + public function matches(Invocation $invocation): bool + { + if ($this->afterMatchBuilderId !== null) { + $matcher = $invocation->getObject() + ->__phpunit_getInvocationHandler() + ->lookupMatcher($this->afterMatchBuilderId); + + if (!$matcher) { + throw new RuntimeException( + sprintf( + 'No builder found for match builder identification <%s>', + $this->afterMatchBuilderId + ) + ); + } + assert($matcher instanceof self); + + if (!$matcher->invocationRule->hasBeenInvoked()) { + return false; + } + } + + if ($this->methodNameRule === null) { + throw new RuntimeException('No method rule is set'); + } + + if (!$this->invocationRule->matches($invocation)) { + return false; + } + + try { + if (!$this->methodNameRule->matches($invocation)) { + return false; + } + } catch (ExpectationFailedException $e) { + throw new ExpectationFailedException( + sprintf( + "Expectation failed for %s when %s\n%s", + $this->methodNameRule->toString(), + $this->invocationRule->toString(), + $e->getMessage() + ), + $e->getComparisonFailure() + ); + } + + return true; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + * @throws RuntimeException + */ + public function verify(): void + { + if ($this->methodNameRule === null) { + throw new RuntimeException('No method rule is set'); + } + + try { + $this->invocationRule->verify(); + + if ($this->parametersRule === null) { + $this->parametersRule = new AnyParameters; + } + + $invocationIsAny = $this->invocationRule instanceof AnyInvokedCount; + $invocationIsNever = $this->invocationRule instanceof InvokedCount && $this->invocationRule->isNever(); + + if (!$invocationIsAny && !$invocationIsNever) { + $this->parametersRule->verify(); + } + } catch (ExpectationFailedException $e) { + throw new ExpectationFailedException( + sprintf( + "Expectation failed for %s when %s.\n%s", + $this->methodNameRule->toString(), + $this->invocationRule->toString(), + TestFailure::exceptionToString($e) + ) + ); + } + } + + public function toString(): string + { + $list = []; + + if ($this->invocationRule !== null) { + $list[] = $this->invocationRule->toString(); + } + + if ($this->methodNameRule !== null) { + $list[] = 'where ' . $this->methodNameRule->toString(); + } + + if ($this->parametersRule !== null) { + $list[] = 'and ' . $this->parametersRule->toString(); + } + + if ($this->afterMatchBuilderId !== null) { + $list[] = 'after ' . $this->afterMatchBuilderId; + } + + if ($this->stub !== null) { + $list[] = 'will ' . $this->stub->toString(); + } + + return implode(' ', $list); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php new file mode 100644 index 0000000000..3082ab384c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function is_string; +use function sprintf; +use function strtolower; +use PHPUnit\Framework\Constraint\Constraint; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class MethodNameConstraint extends Constraint +{ + /** + * @var string + */ + private $methodName; + + public function __construct(string $methodName) + { + $this->methodName = $methodName; + } + + public function toString(): string + { + return sprintf( + 'is "%s"', + $this->methodName + ); + } + + protected function matches($other): bool + { + if (!is_string($other)) { + return false; + } + + return strtolower($this->methodName) === strtolower($other); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php new file mode 100644 index 0000000000..6ff2b264ed --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php @@ -0,0 +1,511 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function array_diff; +use function array_merge; +use function sprintf; +use PHPUnit\Framework\TestCase; +use ReflectionClass; +use ReflectionException; + +/** + * @psalm-template MockedType + */ +final class MockBuilder +{ + /** + * @var TestCase + */ + private $testCase; + + /** + * @var string + */ + private $type; + + /** + * @var null|string[] + */ + private $methods = []; + + /** + * @var bool + */ + private $emptyMethodsArray = false; + + /** + * @var string + */ + private $mockClassName = ''; + + /** + * @var array + */ + private $constructorArgs = []; + + /** + * @var bool + */ + private $originalConstructor = true; + + /** + * @var bool + */ + private $originalClone = true; + + /** + * @var bool + */ + private $autoload = true; + + /** + * @var bool + */ + private $cloneArguments = false; + + /** + * @var bool + */ + private $callOriginalMethods = false; + + /** + * @var ?object + */ + private $proxyTarget; + + /** + * @var bool + */ + private $allowMockingUnknownTypes = true; + + /** + * @var bool + */ + private $returnValueGeneration = true; + + /** + * @var Generator + */ + private $generator; + + /** + * @param string|string[] $type + * + * @psalm-param class-string|string|string[] $type + */ + public function __construct(TestCase $testCase, $type) + { + $this->testCase = $testCase; + $this->type = $type; + $this->generator = new Generator; + } + + /** + * Creates a mock object using a fluent interface. + * + * @throws RuntimeException + * + * @psalm-return MockObject&MockedType + */ + public function getMock(): MockObject + { + $object = $this->generator->getMock( + $this->type, + !$this->emptyMethodsArray ? $this->methods : null, + $this->constructorArgs, + $this->mockClassName, + $this->originalConstructor, + $this->originalClone, + $this->autoload, + $this->cloneArguments, + $this->callOriginalMethods, + $this->proxyTarget, + $this->allowMockingUnknownTypes, + $this->returnValueGeneration + ); + + $this->testCase->registerMockObject($object); + + return $object; + } + + /** + * Creates a mock object for an abstract class using a fluent interface. + * + * @throws \PHPUnit\Framework\Exception + * @throws RuntimeException + * + * @psalm-return MockObject&MockedType + */ + public function getMockForAbstractClass(): MockObject + { + $object = $this->generator->getMockForAbstractClass( + $this->type, + $this->constructorArgs, + $this->mockClassName, + $this->originalConstructor, + $this->originalClone, + $this->autoload, + $this->methods, + $this->cloneArguments + ); + + $this->testCase->registerMockObject($object); + + return $object; + } + + /** + * Creates a mock object for a trait using a fluent interface. + * + * @throws \PHPUnit\Framework\Exception + * @throws RuntimeException + * + * @psalm-return MockObject&MockedType + */ + public function getMockForTrait(): MockObject + { + $object = $this->generator->getMockForTrait( + $this->type, + $this->constructorArgs, + $this->mockClassName, + $this->originalConstructor, + $this->originalClone, + $this->autoload, + $this->methods, + $this->cloneArguments + ); + + $this->testCase->registerMockObject($object); + + return $object; + } + + /** + * Specifies the subset of methods to mock. Default is to mock none of them. + * + * @deprecated https://github.com/sebastianbergmann/phpunit/pull/3687 + * + * @return $this + */ + public function setMethods(?array $methods = null): self + { + if ($methods === null) { + $this->methods = $methods; + } else { + $this->methods = array_merge($this->methods ?? [], $methods); + } + + return $this; + } + + /** + * Specifies the subset of methods to mock, requiring each to exist in the class. + * + * @param string[] $methods + * + * @throws RuntimeException + * + * @return $this + */ + public function onlyMethods(array $methods): self + { + if (empty($methods)) { + $this->emptyMethodsArray = true; + + return $this; + } + + try { + $reflector = new ReflectionClass($this->type); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + foreach ($methods as $method) { + if (!$reflector->hasMethod($method)) { + throw new RuntimeException( + sprintf( + 'Trying to set mock method "%s" with onlyMethods, but it does not exist in class "%s". Use addMethods() for methods that don\'t exist in the class.', + $method, + $this->type + ) + ); + } + } + + $this->methods = array_merge($this->methods ?? [], $methods); + + return $this; + } + + /** + * Specifies methods that don't exist in the class which you want to mock. + * + * @param string[] $methods + * + * @throws RuntimeException + * + * @return $this + */ + public function addMethods(array $methods): self + { + if (empty($methods)) { + $this->emptyMethodsArray = true; + + return $this; + } + + try { + $reflector = new ReflectionClass($this->type); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new RuntimeException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + foreach ($methods as $method) { + if ($reflector->hasMethod($method)) { + throw new RuntimeException( + sprintf( + 'Trying to set mock method "%s" with addMethods(), but it exists in class "%s". Use onlyMethods() for methods that exist in the class.', + $method, + $this->type + ) + ); + } + } + + $this->methods = array_merge($this->methods ?? [], $methods); + + return $this; + } + + /** + * Specifies the subset of methods to not mock. Default is to mock all of them. + */ + public function setMethodsExcept(array $methods = []): self + { + return $this->setMethods( + array_diff( + $this->generator->getClassMethods($this->type), + $methods + ) + ); + } + + /** + * Specifies the arguments for the constructor. + * + * @return $this + */ + public function setConstructorArgs(array $args): self + { + $this->constructorArgs = $args; + + return $this; + } + + /** + * Specifies the name for the mock class. + * + * @return $this + */ + public function setMockClassName(string $name): self + { + $this->mockClassName = $name; + + return $this; + } + + /** + * Disables the invocation of the original constructor. + * + * @return $this + */ + public function disableOriginalConstructor(): self + { + $this->originalConstructor = false; + + return $this; + } + + /** + * Enables the invocation of the original constructor. + * + * @return $this + */ + public function enableOriginalConstructor(): self + { + $this->originalConstructor = true; + + return $this; + } + + /** + * Disables the invocation of the original clone constructor. + * + * @return $this + */ + public function disableOriginalClone(): self + { + $this->originalClone = false; + + return $this; + } + + /** + * Enables the invocation of the original clone constructor. + * + * @return $this + */ + public function enableOriginalClone(): self + { + $this->originalClone = true; + + return $this; + } + + /** + * Disables the use of class autoloading while creating the mock object. + * + * @return $this + */ + public function disableAutoload(): self + { + $this->autoload = false; + + return $this; + } + + /** + * Enables the use of class autoloading while creating the mock object. + * + * @return $this + */ + public function enableAutoload(): self + { + $this->autoload = true; + + return $this; + } + + /** + * Disables the cloning of arguments passed to mocked methods. + * + * @return $this + */ + public function disableArgumentCloning(): self + { + $this->cloneArguments = false; + + return $this; + } + + /** + * Enables the cloning of arguments passed to mocked methods. + * + * @return $this + */ + public function enableArgumentCloning(): self + { + $this->cloneArguments = true; + + return $this; + } + + /** + * Enables the invocation of the original methods. + * + * @return $this + */ + public function enableProxyingToOriginalMethods(): self + { + $this->callOriginalMethods = true; + + return $this; + } + + /** + * Disables the invocation of the original methods. + * + * @return $this + */ + public function disableProxyingToOriginalMethods(): self + { + $this->callOriginalMethods = false; + $this->proxyTarget = null; + + return $this; + } + + /** + * Sets the proxy target. + * + * @return $this + */ + public function setProxyTarget(object $object): self + { + $this->proxyTarget = $object; + + return $this; + } + + /** + * @return $this + */ + public function allowMockingUnknownTypes(): self + { + $this->allowMockingUnknownTypes = true; + + return $this; + } + + /** + * @return $this + */ + public function disallowMockingUnknownTypes(): self + { + $this->allowMockingUnknownTypes = false; + + return $this; + } + + /** + * @return $this + */ + public function enableAutoReturnValueGeneration(): self + { + $this->returnValueGeneration = true; + + return $this; + } + + /** + * @return $this + */ + public function disableAutoReturnValueGeneration(): self + { + $this->returnValueGeneration = false; + + return $this; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php new file mode 100644 index 0000000000..4aaac1b431 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function call_user_func; +use function class_exists; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class MockClass implements MockType +{ + /** + * @var string + */ + private $classCode; + + /** + * @var string + */ + private $mockName; + + /** + * @var ConfigurableMethod[] + */ + private $configurableMethods; + + public function __construct(string $classCode, string $mockName, array $configurableMethods) + { + $this->classCode = $classCode; + $this->mockName = $mockName; + $this->configurableMethods = $configurableMethods; + } + + public function generate(): string + { + if (!class_exists($this->mockName, false)) { + eval($this->classCode); + + call_user_func( + [ + $this->mockName, + '__phpunit_initConfigurableMethods', + ], + ...$this->configurableMethods + ); + } + + return $this->mockName; + } + + public function getClassCode(): string + { + return $this->classCode; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php new file mode 100644 index 0000000000..1aa728f1a9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php @@ -0,0 +1,385 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use const DIRECTORY_SEPARATOR; +use function implode; +use function is_string; +use function preg_match; +use function preg_replace; +use function sprintf; +use function substr_count; +use function trim; +use function var_export; +use ReflectionException; +use ReflectionMethod; +use ReflectionNamedType; +use SebastianBergmann\Type\ObjectType; +use SebastianBergmann\Type\Type; +use SebastianBergmann\Type\UnknownType; +use SebastianBergmann\Type\VoidType; +use Text_Template; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class MockMethod +{ + /** + * @var Text_Template[] + */ + private static $templates = []; + + /** + * @var string + */ + private $className; + + /** + * @var string + */ + private $methodName; + + /** + * @var bool + */ + private $cloneArguments; + + /** + * @var string string + */ + private $modifier; + + /** + * @var string + */ + private $argumentsForDeclaration; + + /** + * @var string + */ + private $argumentsForCall; + + /** + * @var Type + */ + private $returnType; + + /** + * @var string + */ + private $reference; + + /** + * @var bool + */ + private $callOriginalMethod; + + /** + * @var bool + */ + private $static; + + /** + * @var ?string + */ + private $deprecation; + + /** + * @var bool + */ + private $allowsReturnNull; + + /** + * @throws RuntimeException + */ + public static function fromReflection(ReflectionMethod $method, bool $callOriginalMethod, bool $cloneArguments): self + { + if ($method->isPrivate()) { + $modifier = 'private'; + } elseif ($method->isProtected()) { + $modifier = 'protected'; + } else { + $modifier = 'public'; + } + + if ($method->isStatic()) { + $modifier .= ' static'; + } + + if ($method->returnsReference()) { + $reference = '&'; + } else { + $reference = ''; + } + + $docComment = $method->getDocComment(); + + if (is_string($docComment) && + preg_match('#\*[ \t]*+@deprecated[ \t]*+(.*?)\r?+\n[ \t]*+\*(?:[ \t]*+@|/$)#s', $docComment, $deprecation)) { + $deprecation = trim(preg_replace('#[ \t]*\r?\n[ \t]*+\*[ \t]*+#', ' ', $deprecation[1])); + } else { + $deprecation = null; + } + + return new self( + $method->getDeclaringClass()->getName(), + $method->getName(), + $cloneArguments, + $modifier, + self::getMethodParametersForDeclaration($method), + self::getMethodParametersForCall($method), + self::deriveReturnType($method), + $reference, + $callOriginalMethod, + $method->isStatic(), + $deprecation, + $method->hasReturnType() && $method->getReturnType()->allowsNull() + ); + } + + public static function fromName(string $fullClassName, string $methodName, bool $cloneArguments): self + { + return new self( + $fullClassName, + $methodName, + $cloneArguments, + 'public', + '', + '', + new UnknownType, + '', + false, + false, + null, + false + ); + } + + public function __construct(string $className, string $methodName, bool $cloneArguments, string $modifier, string $argumentsForDeclaration, string $argumentsForCall, Type $returnType, string $reference, bool $callOriginalMethod, bool $static, ?string $deprecation, bool $allowsReturnNull) + { + $this->className = $className; + $this->methodName = $methodName; + $this->cloneArguments = $cloneArguments; + $this->modifier = $modifier; + $this->argumentsForDeclaration = $argumentsForDeclaration; + $this->argumentsForCall = $argumentsForCall; + $this->returnType = $returnType; + $this->reference = $reference; + $this->callOriginalMethod = $callOriginalMethod; + $this->static = $static; + $this->deprecation = $deprecation; + $this->allowsReturnNull = $allowsReturnNull; + } + + public function getName(): string + { + return $this->methodName; + } + + /** + * @throws RuntimeException + */ + public function generateCode(): string + { + if ($this->static) { + $templateFile = 'mocked_static_method.tpl'; + } elseif ($this->returnType instanceof VoidType) { + $templateFile = sprintf( + '%s_method_void.tpl', + $this->callOriginalMethod ? 'proxied' : 'mocked' + ); + } else { + $templateFile = sprintf( + '%s_method.tpl', + $this->callOriginalMethod ? 'proxied' : 'mocked' + ); + } + + $deprecation = $this->deprecation; + + if (null !== $this->deprecation) { + $deprecation = "The {$this->className}::{$this->methodName} method is deprecated ({$this->deprecation})."; + $deprecationTemplate = $this->getTemplate('deprecation.tpl'); + + $deprecationTemplate->setVar([ + 'deprecation' => var_export($deprecation, true), + ]); + + $deprecation = $deprecationTemplate->render(); + } + + $template = $this->getTemplate($templateFile); + + $template->setVar( + [ + 'arguments_decl' => $this->argumentsForDeclaration, + 'arguments_call' => $this->argumentsForCall, + 'return_declaration' => $this->returnType->getReturnTypeDeclaration(), + 'arguments_count' => !empty($this->argumentsForCall) ? substr_count($this->argumentsForCall, ',') + 1 : 0, + 'class_name' => $this->className, + 'method_name' => $this->methodName, + 'modifier' => $this->modifier, + 'reference' => $this->reference, + 'clone_arguments' => $this->cloneArguments ? 'true' : 'false', + 'deprecation' => $deprecation, + ] + ); + + return $template->render(); + } + + public function getReturnType(): Type + { + return $this->returnType; + } + + private function getTemplate(string $template): Text_Template + { + $filename = __DIR__ . DIRECTORY_SEPARATOR . 'Generator' . DIRECTORY_SEPARATOR . $template; + + if (!isset(self::$templates[$filename])) { + self::$templates[$filename] = new Text_Template($filename); + } + + return self::$templates[$filename]; + } + + /** + * Returns the parameters of a function or method. + * + * @throws RuntimeException + */ + private static function getMethodParametersForDeclaration(ReflectionMethod $method): string + { + $parameters = []; + + foreach ($method->getParameters() as $i => $parameter) { + $name = '$' . $parameter->getName(); + + /* Note: PHP extensions may use empty names for reference arguments + * or "..." for methods taking a variable number of arguments. + */ + if ($name === '$' || $name === '$...') { + $name = '$arg' . $i; + } + + $nullable = ''; + $default = ''; + $reference = ''; + $typeDeclaration = ''; + $type = null; + $typeName = null; + + if ($parameter->hasType()) { + $type = $parameter->getType(); + + if ($type instanceof ReflectionNamedType) { + $typeName = $type->getName(); + } + } + + if ($parameter->isVariadic()) { + $name = '...' . $name; + } elseif ($parameter->isDefaultValueAvailable()) { + $default = ' = ' . var_export($parameter->getDefaultValue(), true); + } elseif ($parameter->isOptional()) { + $default = ' = null'; + } + + if ($type !== null) { + if ($typeName !== 'mixed' && $parameter->allowsNull()) { + $nullable = '?'; + } + + if ($typeName === 'self') { + $typeDeclaration = $method->getDeclaringClass()->getName() . ' '; + } elseif ($typeName !== null) { + $typeDeclaration = $typeName . ' '; + } + } + + if ($parameter->isPassedByReference()) { + $reference = '&'; + } + + $parameters[] = $nullable . $typeDeclaration . $reference . $name . $default; + } + + return implode(', ', $parameters); + } + + /** + * Returns the parameters of a function or method. + * + * @throws ReflectionException + */ + private static function getMethodParametersForCall(ReflectionMethod $method): string + { + $parameters = []; + + foreach ($method->getParameters() as $i => $parameter) { + $name = '$' . $parameter->getName(); + + /* Note: PHP extensions may use empty names for reference arguments + * or "..." for methods taking a variable number of arguments. + */ + if ($name === '$' || $name === '$...') { + $name = '$arg' . $i; + } + + if ($parameter->isVariadic()) { + continue; + } + + if ($parameter->isPassedByReference()) { + $parameters[] = '&' . $name; + } else { + $parameters[] = $name; + } + } + + return implode(', ', $parameters); + } + + private static function deriveReturnType(ReflectionMethod $method): Type + { + $returnType = $method->getReturnType(); + + if ($returnType === null) { + return new UnknownType(); + } + + // @see https://bugs.php.net/bug.php?id=70722 + if ($returnType->getName() === 'self') { + return ObjectType::fromName($method->getDeclaringClass()->getName(), $returnType->allowsNull()); + } + + // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/406 + if ($returnType->getName() === 'parent') { + $parentClass = $method->getDeclaringClass()->getParentClass(); + + if ($parentClass === false) { + throw new RuntimeException( + sprintf( + 'Cannot mock %s::%s because "parent" return type declaration is used but %s does not have a parent class', + $method->getDeclaringClass()->getName(), + $method->getName(), + $method->getDeclaringClass()->getName() + ) + ); + } + + return ObjectType::fromName($parentClass->getName(), $returnType->allowsNull()); + } + + return Type::fromName($returnType->getName(), $returnType->allowsNull()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php new file mode 100644 index 0000000000..1c78963c08 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethodSet.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function array_key_exists; +use function array_values; +use function strtolower; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class MockMethodSet +{ + /** + * @var MockMethod[] + */ + private $methods = []; + + public function addMethods(MockMethod ...$methods): void + { + foreach ($methods as $method) { + $this->methods[strtolower($method->getName())] = $method; + } + } + + /** + * @return MockMethod[] + */ + public function asArray(): array + { + return array_values($this->methods); + } + + public function hasMethod(string $methodName): bool + { + return array_key_exists(strtolower($methodName), $this->methods); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php new file mode 100644 index 0000000000..4db11e1524 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockObject.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use PHPUnit\Framework\MockObject\Builder\InvocationMocker as BuilderInvocationMocker; +use PHPUnit\Framework\MockObject\Rule\InvocationOrder; + +/** + * @method BuilderInvocationMocker method($constraint) + */ +interface MockObject extends Stub +{ + public function __phpunit_setOriginalObject($originalObject): void; + + public function __phpunit_verify(bool $unsetInvocationMocker = true): void; + + public function expects(InvocationOrder $invocationRule): BuilderInvocationMocker; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php new file mode 100644 index 0000000000..7b9f45003c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockTrait.php @@ -0,0 +1,48 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use function class_exists; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class MockTrait implements MockType +{ + /** + * @var string + */ + private $classCode; + + /** + * @var string + */ + private $mockName; + + public function __construct(string $classCode, string $mockName) + { + $this->classCode = $classCode; + $this->mockName = $mockName; + } + + public function generate(): string + { + if (!class_exists($this->mockName, false)) { + eval($this->classCode); + } + + return $this->mockName; + } + + public function getClassCode(): string + { + return $this->classCode; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php new file mode 100644 index 0000000000..b35ac306d2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/MockType.php @@ -0,0 +1,18 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface MockType +{ + public function generate(): string; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php new file mode 100644 index 0000000000..f93e5686bc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyInvokedCount.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class AnyInvokedCount extends InvocationOrder +{ + public function toString(): string + { + return 'invoked zero or more times'; + } + + public function verify(): void + { + } + + public function matches(BaseInvocation $invocation): bool + { + return true; + } + + protected function invokedDo(BaseInvocation $invocation): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php new file mode 100644 index 0000000000..61de788786 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/AnyParameters.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class AnyParameters implements ParametersRule +{ + public function toString(): string + { + return 'with any parameters'; + } + + public function apply(BaseInvocation $invocation): void + { + } + + public function verify(): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php new file mode 100644 index 0000000000..9cb8137d1b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php @@ -0,0 +1,136 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use function count; +use function gettype; +use function is_iterable; +use function sprintf; +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\Constraint\IsEqual; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\InvalidParameterGroupException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ConsecutiveParameters implements ParametersRule +{ + /** + * @var array + */ + private $parameterGroups = []; + + /** + * @var array + */ + private $invocations = []; + + /** + * @throws \PHPUnit\Framework\Exception + */ + public function __construct(array $parameterGroups) + { + foreach ($parameterGroups as $index => $parameters) { + if (!is_iterable($parameters)) { + throw new InvalidParameterGroupException( + sprintf( + 'Parameter group #%d must be an array or Traversable, got %s', + $index, + gettype($parameters) + ) + ); + } + + foreach ($parameters as $parameter) { + if (!$parameter instanceof Constraint) { + $parameter = new IsEqual($parameter); + } + + $this->parameterGroups[$index][] = $parameter; + } + } + } + + public function toString(): string + { + return 'with consecutive parameters'; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function apply(BaseInvocation $invocation): void + { + $this->invocations[] = $invocation; + $callIndex = count($this->invocations) - 1; + + $this->verifyInvocation($invocation, $callIndex); + } + + /** + * @throws \PHPUnit\Framework\ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function verify(): void + { + foreach ($this->invocations as $callIndex => $invocation) { + $this->verifyInvocation($invocation, $callIndex); + } + } + + /** + * Verify a single invocation. + * + * @param int $callIndex + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + private function verifyInvocation(BaseInvocation $invocation, $callIndex): void + { + if (!isset($this->parameterGroups[$callIndex])) { + // no parameter assertion for this call index + return; + } + + if ($invocation === null) { + throw new ExpectationFailedException( + 'Mocked method does not exist.' + ); + } + + $parameters = $this->parameterGroups[$callIndex]; + + if (count($invocation->getParameters()) < count($parameters)) { + throw new ExpectationFailedException( + sprintf( + 'Parameter count for invocation %s is too low.', + $invocation->toString() + ) + ); + } + + foreach ($parameters as $i => $parameter) { + $parameter->evaluate( + $invocation->getParameters()[$i], + sprintf( + 'Parameter %s for invocation #%d %s does not match expected ' . + 'value.', + $i, + $callIndex, + $invocation->toString() + ) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php new file mode 100644 index 0000000000..90aa49350d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvocationOrder.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use function count; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; +use PHPUnit\Framework\MockObject\Verifiable; +use PHPUnit\Framework\SelfDescribing; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +abstract class InvocationOrder implements SelfDescribing, Verifiable +{ + /** + * @var BaseInvocation[] + */ + private $invocations = []; + + public function getInvocationCount(): int + { + return count($this->invocations); + } + + public function hasBeenInvoked(): bool + { + return count($this->invocations) > 0; + } + + final public function invoked(BaseInvocation $invocation) + { + $this->invocations[] = $invocation; + + return $this->invokedDo($invocation); + } + + abstract public function matches(BaseInvocation $invocation): bool; + + abstract protected function invokedDo(BaseInvocation $invocation); +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php new file mode 100644 index 0000000000..3d8446c939 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php @@ -0,0 +1,72 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use function sprintf; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class InvokedAtIndex extends InvocationOrder +{ + /** + * @var int + */ + private $sequenceIndex; + + /** + * @var int + */ + private $currentIndex = -1; + + /** + * @param int $sequenceIndex + */ + public function __construct($sequenceIndex) + { + $this->sequenceIndex = $sequenceIndex; + } + + public function toString(): string + { + return 'invoked at sequence index ' . $this->sequenceIndex; + } + + public function matches(BaseInvocation $invocation): bool + { + $this->currentIndex++; + + return $this->currentIndex == $this->sequenceIndex; + } + + /** + * Verifies that the current expectation is valid. If everything is OK the + * code should just return, if not it must throw an exception. + * + * @throws ExpectationFailedException + */ + public function verify(): void + { + if ($this->currentIndex < $this->sequenceIndex) { + throw new ExpectationFailedException( + sprintf( + 'The expected invocation at index %s was never reached.', + $this->sequenceIndex + ) + ); + } + } + + protected function invokedDo(BaseInvocation $invocation): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php new file mode 100644 index 0000000000..a84aa65590 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvokedAtLeastCount extends InvocationOrder +{ + /** + * @var int + */ + private $requiredInvocations; + + /** + * @param int $requiredInvocations + */ + public function __construct($requiredInvocations) + { + $this->requiredInvocations = $requiredInvocations; + } + + public function toString(): string + { + return 'invoked at least ' . $this->requiredInvocations . ' times'; + } + + /** + * Verifies that the current expectation is valid. If everything is OK the + * code should just return, if not it must throw an exception. + * + * @throws ExpectationFailedException + */ + public function verify(): void + { + $count = $this->getInvocationCount(); + + if ($count < $this->requiredInvocations) { + throw new ExpectationFailedException( + 'Expected invocation at least ' . $this->requiredInvocations . + ' times but it occurred ' . $count . ' time(s).' + ); + } + } + + public function matches(BaseInvocation $invocation): bool + { + return true; + } + + protected function invokedDo(BaseInvocation $invocation): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php new file mode 100644 index 0000000000..d0ad1f8015 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvokedAtLeastOnce extends InvocationOrder +{ + public function toString(): string + { + return 'invoked at least once'; + } + + /** + * Verifies that the current expectation is valid. If everything is OK the + * code should just return, if not it must throw an exception. + * + * @throws ExpectationFailedException + */ + public function verify(): void + { + $count = $this->getInvocationCount(); + + if ($count < 1) { + throw new ExpectationFailedException( + 'Expected invocation at least once but it never occurred.' + ); + } + } + + public function matches(BaseInvocation $invocation): bool + { + return true; + } + + protected function invokedDo(BaseInvocation $invocation): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php new file mode 100644 index 0000000000..c3b815aa45 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvokedAtMostCount extends InvocationOrder +{ + /** + * @var int + */ + private $allowedInvocations; + + /** + * @param int $allowedInvocations + */ + public function __construct($allowedInvocations) + { + $this->allowedInvocations = $allowedInvocations; + } + + public function toString(): string + { + return 'invoked at most ' . $this->allowedInvocations . ' times'; + } + + /** + * Verifies that the current expectation is valid. If everything is OK the + * code should just return, if not it must throw an exception. + * + * @throws ExpectationFailedException + */ + public function verify(): void + { + $count = $this->getInvocationCount(); + + if ($count > $this->allowedInvocations) { + throw new ExpectationFailedException( + 'Expected invocation at most ' . $this->allowedInvocations . + ' times but it occurred ' . $count . ' time(s).' + ); + } + } + + public function matches(BaseInvocation $invocation): bool + { + return true; + } + + protected function invokedDo(BaseInvocation $invocation): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php new file mode 100644 index 0000000000..188326c91f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use function sprintf; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvokedCount extends InvocationOrder +{ + /** + * @var int + */ + private $expectedCount; + + /** + * @param int $expectedCount + */ + public function __construct($expectedCount) + { + $this->expectedCount = $expectedCount; + } + + public function isNever(): bool + { + return $this->expectedCount === 0; + } + + public function toString(): string + { + return 'invoked ' . $this->expectedCount . ' time(s)'; + } + + public function matches(BaseInvocation $invocation): bool + { + return true; + } + + /** + * Verifies that the current expectation is valid. If everything is OK the + * code should just return, if not it must throw an exception. + * + * @throws ExpectationFailedException + */ + public function verify(): void + { + $count = $this->getInvocationCount(); + + if ($count !== $this->expectedCount) { + throw new ExpectationFailedException( + sprintf( + 'Method was expected to be called %d times, ' . + 'actually called %d times.', + $this->expectedCount, + $count + ) + ); + } + } + + /** + * @throws ExpectationFailedException + */ + protected function invokedDo(BaseInvocation $invocation): void + { + $count = $this->getInvocationCount(); + + if ($count > $this->expectedCount) { + $message = $invocation->toString() . ' '; + + switch ($this->expectedCount) { + case 0: + $message .= 'was not expected to be called.'; + + break; + + case 1: + $message .= 'was not expected to be called more than once.'; + + break; + + default: + $message .= sprintf( + 'was not expected to be called more than %d times.', + $this->expectedCount + ); + } + + throw new ExpectationFailedException($message); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php new file mode 100644 index 0000000000..39fb333326 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/MethodName.php @@ -0,0 +1,64 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use function is_string; +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\InvalidArgumentException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; +use PHPUnit\Framework\MockObject\MethodNameConstraint; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class MethodName +{ + /** + * @var Constraint + */ + private $constraint; + + /** + * @param Constraint|string $constraint + * + * @throws InvalidArgumentException + */ + public function __construct($constraint) + { + if (is_string($constraint)) { + $constraint = new MethodNameConstraint($constraint); + } + + if (!$constraint instanceof Constraint) { + throw InvalidArgumentException::create(1, 'PHPUnit\Framework\Constraint\Constraint object or string'); + } + + $this->constraint = $constraint; + } + + public function toString(): string + { + return 'method name ' . $this->constraint->toString(); + } + + /** + * @throws \PHPUnit\Framework\ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function matches(BaseInvocation $invocation): bool + { + return $this->matchesName($invocation->getMethodName()); + } + + public function matchesName(string $methodName): bool + { + return $this->constraint->evaluate($methodName, '', true); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php new file mode 100644 index 0000000000..3f1cc53ae0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php @@ -0,0 +1,160 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use function count; +use function get_class; +use function sprintf; +use Exception; +use PHPUnit\Framework\Constraint\Constraint; +use PHPUnit\Framework\Constraint\IsAnything; +use PHPUnit\Framework\Constraint\IsEqual; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Parameters implements ParametersRule +{ + /** + * @var Constraint[] + */ + private $parameters = []; + + /** + * @var BaseInvocation + */ + private $invocation; + + /** + * @var bool|ExpectationFailedException + */ + private $parameterVerificationResult; + + /** + * @throws \PHPUnit\Framework\Exception + */ + public function __construct(array $parameters) + { + foreach ($parameters as $parameter) { + if (!($parameter instanceof Constraint)) { + $parameter = new IsEqual( + $parameter + ); + } + + $this->parameters[] = $parameter; + } + } + + public function toString(): string + { + $text = 'with parameter'; + + foreach ($this->parameters as $index => $parameter) { + if ($index > 0) { + $text .= ' and'; + } + + $text .= ' ' . $index . ' ' . $parameter->toString(); + } + + return $text; + } + + /** + * @throws Exception + */ + public function apply(BaseInvocation $invocation): void + { + $this->invocation = $invocation; + $this->parameterVerificationResult = null; + + try { + $this->parameterVerificationResult = $this->doVerify(); + } catch (ExpectationFailedException $e) { + $this->parameterVerificationResult = $e; + + throw $this->parameterVerificationResult; + } + } + + /** + * Checks if the invocation $invocation matches the current rules. If it + * does the rule will get the invoked() method called which should check + * if an expectation is met. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + public function verify(): void + { + $this->doVerify(); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws ExpectationFailedException + */ + private function doVerify(): bool + { + if (isset($this->parameterVerificationResult)) { + return $this->guardAgainstDuplicateEvaluationOfParameterConstraints(); + } + + if ($this->invocation === null) { + throw new ExpectationFailedException('Mocked method does not exist.'); + } + + if (count($this->invocation->getParameters()) < count($this->parameters)) { + $message = 'Parameter count for invocation %s is too low.'; + + // The user called `->with($this->anything())`, but may have meant + // `->withAnyParameters()`. + // + // @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/199 + if (count($this->parameters) === 1 && + get_class($this->parameters[0]) === IsAnything::class) { + $message .= "\nTo allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead."; + } + + throw new ExpectationFailedException( + sprintf($message, $this->invocation->toString()) + ); + } + + foreach ($this->parameters as $i => $parameter) { + $parameter->evaluate( + $this->invocation->getParameters()[$i], + sprintf( + 'Parameter %s for invocation %s does not match expected ' . + 'value.', + $i, + $this->invocation->toString() + ) + ); + } + + return true; + } + + /** + * @throws ExpectationFailedException + */ + private function guardAgainstDuplicateEvaluationOfParameterConstraints(): bool + { + if ($this->parameterVerificationResult instanceof ExpectationFailedException) { + throw $this->parameterVerificationResult; + } + + return (bool) $this->parameterVerificationResult; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php new file mode 100644 index 0000000000..0c9f1910d5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ParametersRule.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Rule; + +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\MockObject\Invocation as BaseInvocation; +use PHPUnit\Framework\MockObject\Verifiable; +use PHPUnit\Framework\SelfDescribing; + +interface ParametersRule extends SelfDescribing, Verifiable +{ + /** + * @throws ExpectationFailedException if the invocation violates the rule + */ + public function apply(BaseInvocation $invocation): void; + + public function verify(): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php new file mode 100644 index 0000000000..f7358afabf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub.php @@ -0,0 +1,24 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use PHPUnit\Framework\MockObject\Builder\InvocationStubber; + +/** + * @method InvocationStubber method($constraint) + */ +interface Stub +{ + public function __phpunit_getInvocationHandler(): InvocationHandler; + + public function __phpunit_hasMatchers(): bool; + + public function __phpunit_setReturnValueGeneration(bool $returnValueGeneration): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php new file mode 100644 index 0000000000..0dcf386b3f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use function array_shift; +use function sprintf; +use PHPUnit\Framework\MockObject\Invocation; +use SebastianBergmann\Exporter\Exporter; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ConsecutiveCalls implements Stub +{ + /** + * @var array + */ + private $stack; + + /** + * @var mixed + */ + private $value; + + public function __construct(array $stack) + { + $this->stack = $stack; + } + + public function invoke(Invocation $invocation) + { + $this->value = array_shift($this->stack); + + if ($this->value instanceof Stub) { + $this->value = $this->value->invoke($invocation); + } + + return $this->value; + } + + public function toString(): string + { + $exporter = new Exporter; + + return sprintf( + 'return user-specified value %s', + $exporter->export($this->value) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php new file mode 100644 index 0000000000..5d64c96a50 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use function sprintf; +use PHPUnit\Framework\MockObject\Invocation; +use SebastianBergmann\Exporter\Exporter; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Exception implements Stub +{ + private $exception; + + public function __construct(Throwable $exception) + { + $this->exception = $exception; + } + + /** + * @throws Throwable + */ + public function invoke(Invocation $invocation): void + { + throw $this->exception; + } + + public function toString(): string + { + $exporter = new Exporter; + + return sprintf( + 'raise user-specified exception %s', + $exporter->export($this->exception) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php new file mode 100644 index 0000000000..c7b3f8f410 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnArgument.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use function sprintf; +use PHPUnit\Framework\MockObject\Invocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ReturnArgument implements Stub +{ + /** + * @var int + */ + private $argumentIndex; + + public function __construct($argumentIndex) + { + $this->argumentIndex = $argumentIndex; + } + + public function invoke(Invocation $invocation) + { + if (isset($invocation->getParameters()[$this->argumentIndex])) { + return $invocation->getParameters()[$this->argumentIndex]; + } + } + + public function toString(): string + { + return sprintf('return argument #%d', $this->argumentIndex); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php new file mode 100644 index 0000000000..e02181e90b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use function call_user_func_array; +use function get_class; +use function is_array; +use function is_object; +use function sprintf; +use PHPUnit\Framework\MockObject\Invocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ReturnCallback implements Stub +{ + private $callback; + + public function __construct($callback) + { + $this->callback = $callback; + } + + public function invoke(Invocation $invocation) + { + return call_user_func_array($this->callback, $invocation->getParameters()); + } + + public function toString(): string + { + if (is_array($this->callback)) { + if (is_object($this->callback[0])) { + $class = get_class($this->callback[0]); + $type = '->'; + } else { + $class = $this->callback[0]; + $type = '::'; + } + + return sprintf( + 'return result of user defined callback %s%s%s() with the ' . + 'passed arguments', + $class, + $type, + $this->callback[1] + ); + } + + return 'return result of user defined callback ' . $this->callback . + ' with the passed arguments'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php new file mode 100644 index 0000000000..0d288cebe0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use function sprintf; +use PHPUnit\Framework\MockObject\Invocation; +use SebastianBergmann\Exporter\Exporter; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ReturnReference implements Stub +{ + /** + * @var mixed + */ + private $reference; + + public function __construct(&$reference) + { + $this->reference = &$reference; + } + + public function invoke(Invocation $invocation) + { + return $this->reference; + } + + public function toString(): string + { + $exporter = new Exporter; + + return sprintf( + 'return user-specified reference %s', + $exporter->export($this->reference) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php new file mode 100644 index 0000000000..6d2137bfbf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnSelf.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use PHPUnit\Framework\MockObject\Invocation; +use PHPUnit\Framework\MockObject\RuntimeException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ReturnSelf implements Stub +{ + /** + * @throws RuntimeException + */ + public function invoke(Invocation $invocation) + { + return $invocation->getObject(); + } + + public function toString(): string + { + return 'return the current object'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php new file mode 100644 index 0000000000..fbcd0a07a8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use function sprintf; +use PHPUnit\Framework\MockObject\Invocation; +use SebastianBergmann\Exporter\Exporter; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ReturnStub implements Stub +{ + /** + * @var mixed + */ + private $value; + + public function __construct($value) + { + $this->value = $value; + } + + public function invoke(Invocation $invocation) + { + return $this->value; + } + + public function toString(): string + { + $exporter = new Exporter; + + return sprintf( + 'return user-specified value %s', + $exporter->export($this->value) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php new file mode 100644 index 0000000000..5fcd3a09ad --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnValueMap.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use function array_pop; +use function count; +use function is_array; +use PHPUnit\Framework\MockObject\Invocation; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ReturnValueMap implements Stub +{ + /** + * @var array + */ + private $valueMap; + + public function __construct(array $valueMap) + { + $this->valueMap = $valueMap; + } + + public function invoke(Invocation $invocation) + { + $parameterCount = count($invocation->getParameters()); + + foreach ($this->valueMap as $map) { + if (!is_array($map) || $parameterCount !== (count($map) - 1)) { + continue; + } + + $return = array_pop($map); + + if ($invocation->getParameters() === $map) { + return $return; + } + } + } + + public function toString(): string + { + return 'return value from a map'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php new file mode 100644 index 0000000000..15cfce5c3c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Stub.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject\Stub; + +use PHPUnit\Framework\MockObject\Invocation; +use PHPUnit\Framework\SelfDescribing; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface Stub extends SelfDescribing +{ + /** + * Fakes the processing of the invocation $invocation by returning a + * specific value. + * + * @param Invocation $invocation The invocation which was mocked and matched by the current method and argument matchers + */ + public function invoke(Invocation $invocation); +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php new file mode 100644 index 0000000000..8c9a82c5aa --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/MockObject/Verifiable.php @@ -0,0 +1,26 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\MockObject; + +use PHPUnit\Framework\ExpectationFailedException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface Verifiable +{ + /** + * Verifies that the current expectation is valid. If everything is OK the + * code should just return, if not it must throw an exception. + * + * @throws ExpectationFailedException + */ + public function verify(): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php new file mode 100644 index 0000000000..73034f650a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SelfDescribing.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface SelfDescribing +{ + /** + * Returns a string representation of the object. + */ + public function toString(): string; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTest.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTest.php new file mode 100644 index 0000000000..c5ac84e679 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTest.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface SkippedTest +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php new file mode 100644 index 0000000000..51c00619c5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class SkippedTestCase extends TestCase +{ + /** + * @var bool + */ + protected $backupGlobals = false; + + /** + * @var bool + */ + protected $backupStaticAttributes = false; + + /** + * @var bool + */ + protected $runTestInSeparateProcess = false; + + /** + * @var string + */ + private $message; + + public function __construct(string $className, string $methodName, string $message = '') + { + parent::__construct($className . '::' . $methodName); + + $this->message = $message; + } + + public function getMessage(): string + { + return $this->message; + } + + /** + * Returns a string representation of the test case. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function toString(): string + { + return $this->getName(); + } + + /** + * @throws Exception + */ + protected function runTest(): void + { + $this->markTestSkipped($this->message); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Test.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Test.php new file mode 100644 index 0000000000..7740afc271 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/Test.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use Countable; + +/** + * A Test can be run and collect its results. + */ +interface Test extends Countable +{ + /** + * Runs a test and collects its result in a TestResult instance. + */ + public function run(TestResult $result = null): TestResult; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestBuilder.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestBuilder.php new file mode 100644 index 0000000000..583a9f2c48 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestBuilder.php @@ -0,0 +1,239 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use function assert; +use function count; +use function get_class; +use function sprintf; +use function trim; +use PHPUnit\Util\Filter; +use PHPUnit\Util\InvalidDataSetException; +use PHPUnit\Util\Test as TestUtil; +use ReflectionClass; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestBuilder +{ + public function build(ReflectionClass $theClass, string $methodName): Test + { + $className = $theClass->getName(); + + if (!$theClass->isInstantiable()) { + return new WarningTestCase( + sprintf('Cannot instantiate class "%s".', $className) + ); + } + + $backupSettings = TestUtil::getBackupSettings( + $className, + $methodName + ); + + $preserveGlobalState = TestUtil::getPreserveGlobalStateSettings( + $className, + $methodName + ); + + $runTestInSeparateProcess = TestUtil::getProcessIsolationSettings( + $className, + $methodName + ); + + $runClassInSeparateProcess = TestUtil::getClassProcessIsolationSettings( + $className, + $methodName + ); + + $constructor = $theClass->getConstructor(); + + if ($constructor === null) { + throw new Exception('No valid test provided.'); + } + + $parameters = $constructor->getParameters(); + + // TestCase() or TestCase($name) + if (count($parameters) < 2) { + $test = $this->buildTestWithoutData($className); + } // TestCase($name, $data) + else { + try { + $data = TestUtil::getProvidedData( + $className, + $methodName + ); + } catch (IncompleteTestError $e) { + $message = sprintf( + "Test for %s::%s marked incomplete by data provider\n%s", + $className, + $methodName, + $this->throwableToString($e) + ); + + $data = new IncompleteTestCase($className, $methodName, $message); + } catch (SkippedTestError $e) { + $message = sprintf( + "Test for %s::%s skipped by data provider\n%s", + $className, + $methodName, + $this->throwableToString($e) + ); + + $data = new SkippedTestCase($className, $methodName, $message); + } catch (Throwable $t) { + $message = sprintf( + "The data provider specified for %s::%s is invalid.\n%s", + $className, + $methodName, + $this->throwableToString($t) + ); + + $data = new WarningTestCase($message); + } + + // Test method with @dataProvider. + if (isset($data)) { + $test = $this->buildDataProviderTestSuite( + $methodName, + $className, + $data, + $runTestInSeparateProcess, + $preserveGlobalState, + $runClassInSeparateProcess, + $backupSettings + ); + } else { + $test = $this->buildTestWithoutData($className); + } + } + + if ($test instanceof TestCase) { + $test->setName($methodName); + $this->configureTestCase( + $test, + $runTestInSeparateProcess, + $preserveGlobalState, + $runClassInSeparateProcess, + $backupSettings + ); + } + + return $test; + } + + /** @psalm-param class-string $className */ + private function buildTestWithoutData(string $className) + { + return new $className; + } + + /** @psalm-param class-string $className */ + private function buildDataProviderTestSuite( + string $methodName, + string $className, + $data, + bool $runTestInSeparateProcess, + ?bool $preserveGlobalState, + bool $runClassInSeparateProcess, + array $backupSettings + ): DataProviderTestSuite { + $dataProviderTestSuite = new DataProviderTestSuite( + $className . '::' . $methodName + ); + + $groups = TestUtil::getGroups($className, $methodName); + + if ($data instanceof WarningTestCase || + $data instanceof SkippedTestCase || + $data instanceof IncompleteTestCase) { + $dataProviderTestSuite->addTest($data, $groups); + } else { + foreach ($data as $_dataName => $_data) { + $_test = new $className($methodName, $_data, $_dataName); + + assert($_test instanceof TestCase); + + $this->configureTestCase( + $_test, + $runTestInSeparateProcess, + $preserveGlobalState, + $runClassInSeparateProcess, + $backupSettings + ); + + $dataProviderTestSuite->addTest($_test, $groups); + } + } + + return $dataProviderTestSuite; + } + + private function configureTestCase( + TestCase $test, + bool $runTestInSeparateProcess, + ?bool $preserveGlobalState, + bool $runClassInSeparateProcess, + array $backupSettings + ): void { + if ($runTestInSeparateProcess) { + $test->setRunTestInSeparateProcess(true); + + if ($preserveGlobalState !== null) { + $test->setPreserveGlobalState($preserveGlobalState); + } + } + + if ($runClassInSeparateProcess) { + $test->setRunClassInSeparateProcess(true); + + if ($preserveGlobalState !== null) { + $test->setPreserveGlobalState($preserveGlobalState); + } + } + + if ($backupSettings['backupGlobals'] !== null) { + $test->setBackupGlobals($backupSettings['backupGlobals']); + } + + if ($backupSettings['backupStaticAttributes'] !== null) { + $test->setBackupStaticAttributes( + $backupSettings['backupStaticAttributes'] + ); + } + } + + private function throwableToString(Throwable $t): string + { + $message = $t->getMessage(); + + if (empty(trim($message))) { + $message = ''; + } + + if ($t instanceof InvalidDataSetException) { + return sprintf( + "%s\n%s", + $message, + Filter::getFilteredStacktrace($t) + ); + } + + return sprintf( + "%s: %s\n%s", + get_class($t), + $message, + Filter::getFilteredStacktrace($t) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestCase.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestCase.php new file mode 100644 index 0000000000..988431763f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestCase.php @@ -0,0 +1,2582 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use const LC_ALL; +use const LC_COLLATE; +use const LC_CTYPE; +use const LC_MESSAGES; +use const LC_MONETARY; +use const LC_NUMERIC; +use const LC_TIME; +use const PATHINFO_FILENAME; +use const PHP_EOL; +use const PHP_URL_PATH; +use function array_filter; +use function array_flip; +use function array_keys; +use function array_merge; +use function array_unique; +use function array_values; +use function assert; +use function basename; +use function call_user_func; +use function chdir; +use function class_exists; +use function clearstatcache; +use function count; +use function defined; +use function explode; +use function get_class; +use function get_include_path; +use function getcwd; +use function implode; +use function in_array; +use function ini_set; +use function is_array; +use function is_int; +use function is_object; +use function is_string; +use function libxml_clear_errors; +use function method_exists; +use function ob_end_clean; +use function ob_get_contents; +use function ob_get_level; +use function ob_start; +use function parse_url; +use function pathinfo; +use function preg_replace; +use function serialize; +use function setlocale; +use function sprintf; +use function strlen; +use function strpos; +use function substr; +use function trim; +use function var_export; +use DeepCopy\DeepCopy; +use PHPUnit\Framework\Constraint\Exception as ExceptionConstraint; +use PHPUnit\Framework\Constraint\ExceptionCode; +use PHPUnit\Framework\Constraint\ExceptionMessage; +use PHPUnit\Framework\Constraint\ExceptionMessageRegularExpression; +use PHPUnit\Framework\Error\Deprecated; +use PHPUnit\Framework\Error\Error; +use PHPUnit\Framework\Error\Notice; +use PHPUnit\Framework\Error\Warning as WarningError; +use PHPUnit\Framework\MockObject\Generator as MockGenerator; +use PHPUnit\Framework\MockObject\MockBuilder; +use PHPUnit\Framework\MockObject\MockObject; +use PHPUnit\Framework\MockObject\Rule\AnyInvokedCount as AnyInvokedCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtIndex as InvokedAtIndexMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastCount as InvokedAtLeastCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtLeastOnce as InvokedAtLeastOnceMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedAtMostCount as InvokedAtMostCountMatcher; +use PHPUnit\Framework\MockObject\Rule\InvokedCount as InvokedCountMatcher; +use PHPUnit\Framework\MockObject\Stub; +use PHPUnit\Framework\MockObject\Stub\ConsecutiveCalls as ConsecutiveCallsStub; +use PHPUnit\Framework\MockObject\Stub\Exception as ExceptionStub; +use PHPUnit\Framework\MockObject\Stub\ReturnArgument as ReturnArgumentStub; +use PHPUnit\Framework\MockObject\Stub\ReturnCallback as ReturnCallbackStub; +use PHPUnit\Framework\MockObject\Stub\ReturnSelf as ReturnSelfStub; +use PHPUnit\Framework\MockObject\Stub\ReturnStub; +use PHPUnit\Framework\MockObject\Stub\ReturnValueMap as ReturnValueMapStub; +use PHPUnit\Runner\BaseTestRunner; +use PHPUnit\Runner\PhptTestCase; +use PHPUnit\Util\Exception as UtilException; +use PHPUnit\Util\GlobalState; +use PHPUnit\Util\PHP\AbstractPhpProcess; +use PHPUnit\Util\Test as TestUtil; +use PHPUnit\Util\Type; +use Prophecy\Exception\Prediction\PredictionException; +use Prophecy\Prophecy\MethodProphecy; +use Prophecy\Prophecy\ObjectProphecy; +use Prophecy\Prophet; +use ReflectionClass; +use ReflectionException; +use SebastianBergmann\Comparator\Comparator; +use SebastianBergmann\Comparator\Factory as ComparatorFactory; +use SebastianBergmann\Diff\Differ; +use SebastianBergmann\Exporter\Exporter; +use SebastianBergmann\GlobalState\Blacklist; +use SebastianBergmann\GlobalState\Restorer; +use SebastianBergmann\GlobalState\Snapshot; +use SebastianBergmann\ObjectEnumerator\Enumerator; +use Text_Template; +use Throwable; + +abstract class TestCase extends Assert implements SelfDescribing, Test +{ + private const LOCALE_CATEGORIES = [LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, LC_NUMERIC, LC_TIME]; + + /** + * @var ?bool + */ + protected $backupGlobals; + + /** + * @var string[] + */ + protected $backupGlobalsBlacklist = []; + + /** + * @var bool + */ + protected $backupStaticAttributes; + + /** + * @var array> + */ + protected $backupStaticAttributesBlacklist = []; + + /** + * @var bool + */ + protected $runTestInSeparateProcess; + + /** + * @var bool + */ + protected $preserveGlobalState = true; + + /** + * @var bool + */ + private $runClassInSeparateProcess; + + /** + * @var bool + */ + private $inIsolation = false; + + /** + * @var array + */ + private $data; + + /** + * @var string + */ + private $dataName; + + /** + * @var null|string + */ + private $expectedException; + + /** + * @var null|string + */ + private $expectedExceptionMessage; + + /** + * @var null|string + */ + private $expectedExceptionMessageRegExp; + + /** + * @var null|int|string + */ + private $expectedExceptionCode; + + /** + * @var string + */ + private $name = ''; + + /** + * @var string[] + */ + private $dependencies = []; + + /** + * @var array + */ + private $dependencyInput = []; + + /** + * @var array + */ + private $iniSettings = []; + + /** + * @var array + */ + private $locale = []; + + /** + * @var MockObject[] + */ + private $mockObjects = []; + + /** + * @var MockGenerator + */ + private $mockObjectGenerator; + + /** + * @var int + */ + private $status = BaseTestRunner::STATUS_UNKNOWN; + + /** + * @var string + */ + private $statusMessage = ''; + + /** + * @var int + */ + private $numAssertions = 0; + + /** + * @var TestResult + */ + private $result; + + /** + * @var mixed + */ + private $testResult; + + /** + * @var string + */ + private $output = ''; + + /** + * @var string + */ + private $outputExpectedRegex; + + /** + * @var string + */ + private $outputExpectedString; + + /** + * @var mixed + */ + private $outputCallback = false; + + /** + * @var bool + */ + private $outputBufferingActive = false; + + /** + * @var int + */ + private $outputBufferingLevel; + + /** + * @var bool + */ + private $outputRetrievedForAssertion = false; + + /** + * @var Snapshot + */ + private $snapshot; + + /** + * @var \Prophecy\Prophet + */ + private $prophet; + + /** + * @var bool + */ + private $beStrictAboutChangesToGlobalState = false; + + /** + * @var bool + */ + private $registerMockObjectsFromTestArgumentsRecursively = false; + + /** + * @var string[] + */ + private $warnings = []; + + /** + * @var string[] + */ + private $groups = []; + + /** + * @var bool + */ + private $doesNotPerformAssertions = false; + + /** + * @var Comparator[] + */ + private $customComparators = []; + + /** + * @var string[] + */ + private $doubledTypes = []; + + /** + * @var bool + */ + private $deprecatedExpectExceptionMessageRegExpUsed = false; + + /** + * Returns a matcher that matches when the method is executed + * zero or more times. + */ + public static function any(): AnyInvokedCountMatcher + { + return new AnyInvokedCountMatcher; + } + + /** + * Returns a matcher that matches when the method is never executed. + */ + public static function never(): InvokedCountMatcher + { + return new InvokedCountMatcher(0); + } + + /** + * Returns a matcher that matches when the method is executed + * at least N times. + */ + public static function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher + { + return new InvokedAtLeastCountMatcher( + $requiredInvocations + ); + } + + /** + * Returns a matcher that matches when the method is executed at least once. + */ + public static function atLeastOnce(): InvokedAtLeastOnceMatcher + { + return new InvokedAtLeastOnceMatcher; + } + + /** + * Returns a matcher that matches when the method is executed exactly once. + */ + public static function once(): InvokedCountMatcher + { + return new InvokedCountMatcher(1); + } + + /** + * Returns a matcher that matches when the method is executed + * exactly $count times. + */ + public static function exactly(int $count): InvokedCountMatcher + { + return new InvokedCountMatcher($count); + } + + /** + * Returns a matcher that matches when the method is executed + * at most N times. + */ + public static function atMost(int $allowedInvocations): InvokedAtMostCountMatcher + { + return new InvokedAtMostCountMatcher($allowedInvocations); + } + + /** + * Returns a matcher that matches when the method is executed + * at the given index. + */ + public static function at(int $index): InvokedAtIndexMatcher + { + return new InvokedAtIndexMatcher($index); + } + + public static function returnValue($value): ReturnStub + { + return new ReturnStub($value); + } + + public static function returnValueMap(array $valueMap): ReturnValueMapStub + { + return new ReturnValueMapStub($valueMap); + } + + public static function returnArgument(int $argumentIndex): ReturnArgumentStub + { + return new ReturnArgumentStub($argumentIndex); + } + + public static function returnCallback($callback): ReturnCallbackStub + { + return new ReturnCallbackStub($callback); + } + + /** + * Returns the current object. + * + * This method is useful when mocking a fluent interface. + */ + public static function returnSelf(): ReturnSelfStub + { + return new ReturnSelfStub; + } + + public static function throwException(Throwable $exception): ExceptionStub + { + return new ExceptionStub($exception); + } + + public static function onConsecutiveCalls(...$args): ConsecutiveCallsStub + { + return new ConsecutiveCallsStub($args); + } + + /** + * @param string $name + * @param string $dataName + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function __construct($name = null, array $data = [], $dataName = '') + { + if ($name !== null) { + $this->setName($name); + } + + $this->data = $data; + $this->dataName = $dataName; + } + + /** + * This method is called before the first test of this test class is run. + */ + public static function setUpBeforeClass(): void + { + } + + /** + * This method is called after the last test of this test class is run. + */ + public static function tearDownAfterClass(): void + { + } + + /** + * This method is called before each test. + */ + protected function setUp(): void + { + } + + /** + * This method is called after each test. + */ + protected function tearDown(): void + { + } + + /** + * Returns a string representation of the test case. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + */ + public function toString(): string + { + try { + $class = new ReflectionClass($this); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $buffer = sprintf( + '%s::%s', + $class->name, + $this->getName(false) + ); + + return $buffer . $this->getDataSetAsString(); + } + + public function count(): int + { + return 1; + } + + public function getActualOutputForAssertion(): string + { + $this->outputRetrievedForAssertion = true; + + return $this->getActualOutput(); + } + + public function expectOutputRegex(string $expectedRegex): void + { + $this->outputExpectedRegex = $expectedRegex; + } + + public function expectOutputString(string $expectedString): void + { + $this->outputExpectedString = $expectedString; + } + + /** + * @psalm-param class-string<\Throwable> $exception + */ + public function expectException(string $exception): void + { + $this->expectedException = $exception; + } + + /** + * @param int|string $code + */ + public function expectExceptionCode($code): void + { + $this->expectedExceptionCode = $code; + } + + public function expectExceptionMessage(string $message): void + { + $this->expectedExceptionMessage = $message; + } + + public function expectExceptionMessageMatches(string $regularExpression): void + { + $this->expectedExceptionMessageRegExp = $regularExpression; + } + + /** + * @deprecated Use expectExceptionMessageMatches() instead + */ + public function expectExceptionMessageRegExp(string $regularExpression): void + { + $this->deprecatedExpectExceptionMessageRegExpUsed = true; + + $this->expectExceptionMessageMatches($regularExpression); + } + + /** + * Sets up an expectation for an exception to be raised by the code under test. + * Information for expected exception class, expected exception message, and + * expected exception code are retrieved from a given Exception object. + */ + public function expectExceptionObject(\Exception $exception): void + { + $this->expectException(get_class($exception)); + $this->expectExceptionMessage($exception->getMessage()); + $this->expectExceptionCode($exception->getCode()); + } + + public function expectNotToPerformAssertions(): void + { + $this->doesNotPerformAssertions = true; + } + + public function expectDeprecation(): void + { + $this->expectException(Deprecated::class); + } + + public function expectDeprecationMessage(string $message): void + { + $this->expectExceptionMessage($message); + } + + public function expectDeprecationMessageMatches(string $regularExpression): void + { + $this->expectExceptionMessageMatches($regularExpression); + } + + public function expectNotice(): void + { + $this->expectException(Notice::class); + } + + public function expectNoticeMessage(string $message): void + { + $this->expectExceptionMessage($message); + } + + public function expectNoticeMessageMatches(string $regularExpression): void + { + $this->expectExceptionMessageMatches($regularExpression); + } + + public function expectWarning(): void + { + $this->expectException(WarningError::class); + } + + public function expectWarningMessage(string $message): void + { + $this->expectExceptionMessage($message); + } + + public function expectWarningMessageMatches(string $regularExpression): void + { + $this->expectExceptionMessageMatches($regularExpression); + } + + public function expectError(): void + { + $this->expectException(Error::class); + } + + public function expectErrorMessage(string $message): void + { + $this->expectExceptionMessage($message); + } + + public function expectErrorMessageMatches(string $regularExpression): void + { + $this->expectExceptionMessageMatches($regularExpression); + } + + public function getStatus(): int + { + return $this->status; + } + + public function markAsRisky(): void + { + $this->status = BaseTestRunner::STATUS_RISKY; + } + + public function getStatusMessage(): string + { + return $this->statusMessage; + } + + public function hasFailed(): bool + { + $status = $this->getStatus(); + + return $status === BaseTestRunner::STATUS_FAILURE || $status === BaseTestRunner::STATUS_ERROR; + } + + /** + * Runs the test case and collects the results in a TestResult object. + * If no TestResult object is passed a new one will be created. + * + * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException + * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException + * @throws \SebastianBergmann\CodeCoverage\MissingCoversAnnotationException + * @throws \SebastianBergmann\CodeCoverage\RuntimeException + * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws CodeCoverageException + * @throws UtilException + */ + public function run(TestResult $result = null): TestResult + { + if ($result === null) { + $result = $this->createResult(); + } + + if (!$this instanceof WarningTestCase) { + $this->setTestResultObject($result); + } + + if (!$this instanceof WarningTestCase && + !$this instanceof SkippedTestCase && + !$this->handleDependencies()) { + return $result; + } + + if ($this->runInSeparateProcess()) { + $runEntireClass = $this->runClassInSeparateProcess && !$this->runTestInSeparateProcess; + + try { + $class = new ReflectionClass($this); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($runEntireClass) { + $template = new Text_Template( + __DIR__ . '/../Util/PHP/Template/TestCaseClass.tpl' + ); + } else { + $template = new Text_Template( + __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl' + ); + } + + if ($this->preserveGlobalState) { + $constants = GlobalState::getConstantsAsString(); + $globals = GlobalState::getGlobalsAsString(); + $includedFiles = GlobalState::getIncludedFilesAsString(); + $iniSettings = GlobalState::getIniSettingsAsString(); + } else { + $constants = ''; + + if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { + $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export($GLOBALS['__PHPUNIT_BOOTSTRAP'], true) . ";\n"; + } else { + $globals = ''; + } + + $includedFiles = ''; + $iniSettings = ''; + } + + $coverage = $result->getCollectCodeCoverageInformation() ? 'true' : 'false'; + $isStrictAboutTestsThatDoNotTestAnything = $result->isStrictAboutTestsThatDoNotTestAnything() ? 'true' : 'false'; + $isStrictAboutOutputDuringTests = $result->isStrictAboutOutputDuringTests() ? 'true' : 'false'; + $enforcesTimeLimit = $result->enforcesTimeLimit() ? 'true' : 'false'; + $isStrictAboutTodoAnnotatedTests = $result->isStrictAboutTodoAnnotatedTests() ? 'true' : 'false'; + $isStrictAboutResourceUsageDuringSmallTests = $result->isStrictAboutResourceUsageDuringSmallTests() ? 'true' : 'false'; + + if (defined('PHPUNIT_COMPOSER_INSTALL')) { + $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); + } else { + $composerAutoload = '\'\''; + } + + if (defined('__PHPUNIT_PHAR__')) { + $phar = var_export(__PHPUNIT_PHAR__, true); + } else { + $phar = '\'\''; + } + + if ($result->getCodeCoverage()) { + $codeCoverageFilter = $result->getCodeCoverage()->filter(); + } else { + $codeCoverageFilter = null; + } + + $data = var_export(serialize($this->data), true); + $dataName = var_export($this->dataName, true); + $dependencyInput = var_export(serialize($this->dependencyInput), true); + $includePath = var_export(get_include_path(), true); + $codeCoverageFilter = var_export(serialize($codeCoverageFilter), true); + // must do these fixes because TestCaseMethod.tpl has unserialize('{data}') in it, and we can't break BC + // the lines above used to use addcslashes() rather than var_export(), which breaks null byte escape sequences + $data = "'." . $data . ".'"; + $dataName = "'.(" . $dataName . ").'"; + $dependencyInput = "'." . $dependencyInput . ".'"; + $includePath = "'." . $includePath . ".'"; + $codeCoverageFilter = "'." . $codeCoverageFilter . ".'"; + + $configurationFilePath = $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] ?? ''; + + $var = [ + 'composerAutoload' => $composerAutoload, + 'phar' => $phar, + 'filename' => $class->getFileName(), + 'className' => $class->getName(), + 'collectCodeCoverageInformation' => $coverage, + 'data' => $data, + 'dataName' => $dataName, + 'dependencyInput' => $dependencyInput, + 'constants' => $constants, + 'globals' => $globals, + 'include_path' => $includePath, + 'included_files' => $includedFiles, + 'iniSettings' => $iniSettings, + 'isStrictAboutTestsThatDoNotTestAnything' => $isStrictAboutTestsThatDoNotTestAnything, + 'isStrictAboutOutputDuringTests' => $isStrictAboutOutputDuringTests, + 'enforcesTimeLimit' => $enforcesTimeLimit, + 'isStrictAboutTodoAnnotatedTests' => $isStrictAboutTodoAnnotatedTests, + 'isStrictAboutResourceUsageDuringSmallTests' => $isStrictAboutResourceUsageDuringSmallTests, + 'codeCoverageFilter' => $codeCoverageFilter, + 'configurationFilePath' => $configurationFilePath, + 'name' => $this->getName(false), + ]; + + if (!$runEntireClass) { + $var['methodName'] = $this->name; + } + + $template->setVar($var); + + $php = AbstractPhpProcess::factory(); + $php->runTestJob($template->render(), $this, $result); + } else { + $result->run($this); + } + + $this->result = null; + + return $result; + } + + /** + * Returns a builder object to create mock objects using a fluent interface. + * + * @param string|string[] $className + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string|string[] $className + * @psalm-return MockBuilder + */ + public function getMockBuilder($className): MockBuilder + { + if (!is_string($className)) { + $this->addWarning('Passing an array of interface names to getMockBuilder() for creating a test double that implements multiple interfaces is deprecated and will no longer be supported in PHPUnit 9.'); + } + + $this->recordDoubledType($className); + + return new MockBuilder($this, $className); + } + + public function registerComparator(Comparator $comparator): void + { + ComparatorFactory::getInstance()->register($comparator); + + $this->customComparators[] = $comparator; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + * + * @deprecated Invoking this method has no effect; it will be removed in PHPUnit 9 + */ + public function setUseErrorHandler(bool $useErrorHandler): void + { + } + + /** + * @return string[] + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function doubledTypes(): array + { + return array_unique($this->doubledTypes); + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getGroups(): array + { + return $this->groups; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setGroups(array $groups): void + { + $this->groups = $groups; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getAnnotations(): array + { + return TestUtil::parseTestMethodAnnotations( + static::class, + $this->name + ); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getName(bool $withDataSet = true): string + { + if ($withDataSet) { + return $this->name . $this->getDataSetAsString(false); + } + + return $this->name; + } + + /** + * Returns the size of the test. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getSize(): int + { + return TestUtil::getSize( + static::class, + $this->getName(false) + ); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function hasSize(): bool + { + return $this->getSize() !== TestUtil::UNKNOWN; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function isSmall(): bool + { + return $this->getSize() === TestUtil::SMALL; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function isMedium(): bool + { + return $this->getSize() === TestUtil::MEDIUM; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function isLarge(): bool + { + return $this->getSize() === TestUtil::LARGE; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getActualOutput(): string + { + if (!$this->outputBufferingActive) { + return $this->output; + } + + return (string) ob_get_contents(); + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function hasOutput(): bool + { + if ($this->output === '') { + return false; + } + + if ($this->hasExpectationOnOutput()) { + return false; + } + + return true; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function doesNotPerformAssertions(): bool + { + return $this->doesNotPerformAssertions; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function hasExpectationOnOutput(): bool + { + return is_string($this->outputExpectedString) || is_string($this->outputExpectedRegex) || $this->outputRetrievedForAssertion; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getExpectedException(): ?string + { + return $this->expectedException; + } + + /** + * @return null|int|string + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getExpectedExceptionCode() + { + return $this->expectedExceptionCode; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getExpectedExceptionMessage(): ?string + { + return $this->expectedExceptionMessage; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getExpectedExceptionMessageRegExp(): ?string + { + return $this->expectedExceptionMessageRegExp; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setRegisterMockObjectsFromTestArgumentsRecursively(bool $flag): void + { + $this->registerMockObjectsFromTestArgumentsRecursively = $flag; + } + + /** + * @throws Throwable + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function runBare(): void + { + $this->numAssertions = 0; + + $this->snapshotGlobalState(); + $this->startOutputBuffering(); + clearstatcache(); + $currentWorkingDirectory = getcwd(); + + $hookMethods = TestUtil::getHookMethods(static::class); + + $hasMetRequirements = false; + + try { + $this->checkRequirements(); + $hasMetRequirements = true; + + if ($this->inIsolation) { + foreach ($hookMethods['beforeClass'] as $method) { + $this->{$method}(); + } + } + + $this->setExpectedExceptionFromAnnotation(); + $this->setDoesNotPerformAssertionsFromAnnotation(); + + foreach ($hookMethods['before'] as $method) { + $this->{$method}(); + } + + $this->assertPreConditions(); + $this->testResult = $this->runTest(); + $this->verifyMockObjects(); + $this->assertPostConditions(); + + if (!empty($this->warnings)) { + throw new Warning( + implode( + "\n", + array_unique($this->warnings) + ) + ); + } + + $this->status = BaseTestRunner::STATUS_PASSED; + } catch (IncompleteTest $e) { + $this->status = BaseTestRunner::STATUS_INCOMPLETE; + $this->statusMessage = $e->getMessage(); + } catch (SkippedTest $e) { + $this->status = BaseTestRunner::STATUS_SKIPPED; + $this->statusMessage = $e->getMessage(); + } catch (Warning $e) { + $this->status = BaseTestRunner::STATUS_WARNING; + $this->statusMessage = $e->getMessage(); + } catch (AssertionFailedError $e) { + $this->status = BaseTestRunner::STATUS_FAILURE; + $this->statusMessage = $e->getMessage(); + } catch (PredictionException $e) { + $this->status = BaseTestRunner::STATUS_FAILURE; + $this->statusMessage = $e->getMessage(); + } catch (Throwable $_e) { + $e = $_e; + $this->status = BaseTestRunner::STATUS_ERROR; + $this->statusMessage = $_e->getMessage(); + } + + $this->mockObjects = []; + $this->prophet = null; + + // Tear down the fixture. An exception raised in tearDown() will be + // caught and passed on when no exception was raised before. + try { + if ($hasMetRequirements) { + foreach ($hookMethods['after'] as $method) { + $this->{$method}(); + } + + if ($this->inIsolation) { + foreach ($hookMethods['afterClass'] as $method) { + $this->{$method}(); + } + } + } + } catch (Throwable $_e) { + $e = $e ?? $_e; + } + + try { + $this->stopOutputBuffering(); + } catch (RiskyTestError $_e) { + $e = $e ?? $_e; + } + + if (isset($_e)) { + $this->status = BaseTestRunner::STATUS_ERROR; + $this->statusMessage = $_e->getMessage(); + } + + clearstatcache(); + + if ($currentWorkingDirectory !== getcwd()) { + chdir($currentWorkingDirectory); + } + + $this->restoreGlobalState(); + $this->unregisterCustomComparators(); + $this->cleanupIniSettings(); + $this->cleanupLocaleSettings(); + libxml_clear_errors(); + + // Perform assertion on output. + if (!isset($e)) { + try { + if ($this->outputExpectedRegex !== null) { + $this->assertRegExp($this->outputExpectedRegex, $this->output); + } elseif ($this->outputExpectedString !== null) { + $this->assertEquals($this->outputExpectedString, $this->output); + } + } catch (Throwable $_e) { + $e = $_e; + } + } + + // Workaround for missing "finally". + if (isset($e)) { + if ($e instanceof PredictionException) { + $e = new AssertionFailedError($e->getMessage()); + } + + $this->onNotSuccessfulTest($e); + } + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setName(string $name): void + { + $this->name = $name; + } + + /** + * @param string[] $dependencies + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setDependencies(array $dependencies): void + { + $this->dependencies = $dependencies; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getDependencies(): array + { + return $this->dependencies; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function hasDependencies(): bool + { + return count($this->dependencies) > 0; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setDependencyInput(array $dependencyInput): void + { + $this->dependencyInput = $dependencyInput; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getDependencyInput(): array + { + return $this->dependencyInput; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setBeStrictAboutChangesToGlobalState(?bool $beStrictAboutChangesToGlobalState): void + { + $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setBackupGlobals(?bool $backupGlobals): void + { + if ($this->backupGlobals === null && $backupGlobals !== null) { + $this->backupGlobals = $backupGlobals; + } + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setBackupStaticAttributes(?bool $backupStaticAttributes): void + { + if ($this->backupStaticAttributes === null && $backupStaticAttributes !== null) { + $this->backupStaticAttributes = $backupStaticAttributes; + } + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void + { + if ($this->runTestInSeparateProcess === null) { + $this->runTestInSeparateProcess = $runTestInSeparateProcess; + } + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setRunClassInSeparateProcess(bool $runClassInSeparateProcess): void + { + if ($this->runClassInSeparateProcess === null) { + $this->runClassInSeparateProcess = $runClassInSeparateProcess; + } + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setPreserveGlobalState(bool $preserveGlobalState): void + { + $this->preserveGlobalState = $preserveGlobalState; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setInIsolation(bool $inIsolation): void + { + $this->inIsolation = $inIsolation; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function isInIsolation(): bool + { + return $this->inIsolation; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getResult() + { + return $this->testResult; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setResult($result): void + { + $this->testResult = $result; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setOutputCallback(callable $callback): void + { + $this->outputCallback = $callback; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getTestResultObject(): ?TestResult + { + return $this->result; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function setTestResultObject(TestResult $result): void + { + $this->result = $result; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function registerMockObject(MockObject $mockObject): void + { + $this->mockObjects[] = $mockObject; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function addToAssertionCount(int $count): void + { + $this->numAssertions += $count; + } + + /** + * Returns the number of assertions performed by this test. + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getNumAssertions(): int + { + return $this->numAssertions; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function usesDataProvider(): bool + { + return !empty($this->data); + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function dataDescription(): string + { + return is_string($this->dataName) ? $this->dataName : ''; + } + + /** + * @return int|string + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function dataName() + { + return $this->dataName; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getDataSetAsString(bool $includeData = true): string + { + $buffer = ''; + + if (!empty($this->data)) { + if (is_int($this->dataName)) { + $buffer .= sprintf(' with data set #%d', $this->dataName); + } else { + $buffer .= sprintf(' with data set "%s"', $this->dataName); + } + + $exporter = new Exporter; + + if ($includeData) { + $buffer .= sprintf(' (%s)', $exporter->shortenedRecursiveExport($this->data)); + } + } + + return $buffer; + } + + /** + * Gets the data set of a TestCase. + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function getProvidedData(): array + { + return $this->data; + } + + /** + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + public function addWarning(string $warning): void + { + $this->warnings[] = $warning; + } + + /** + * Override to run the test and assert its state. + * + * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException + * @throws AssertionFailedError + * @throws Exception + * @throws ExpectationFailedException + * @throws Throwable + */ + protected function runTest() + { + if (trim($this->name) === '') { + throw new Exception( + 'PHPUnit\Framework\TestCase::$name must be a non-blank string.' + ); + } + + $testArguments = array_merge($this->data, $this->dependencyInput); + + $this->registerMockObjectsFromTestArguments($testArguments); + + try { + $testResult = $this->{$this->name}(...array_values($testArguments)); + } catch (Throwable $exception) { + if (!$this->checkExceptionExpectations($exception)) { + throw $exception; + } + + if ($this->expectedException !== null) { + $this->assertThat( + $exception, + new ExceptionConstraint( + $this->expectedException + ) + ); + } + + if ($this->expectedExceptionMessage !== null) { + $this->assertThat( + $exception, + new ExceptionMessage( + $this->expectedExceptionMessage + ) + ); + } + + if ($this->expectedExceptionMessageRegExp !== null) { + $this->assertThat( + $exception, + new ExceptionMessageRegularExpression( + $this->expectedExceptionMessageRegExp + ) + ); + } + + if ($this->expectedExceptionCode !== null) { + $this->assertThat( + $exception, + new ExceptionCode( + $this->expectedExceptionCode + ) + ); + } + + if ($this->deprecatedExpectExceptionMessageRegExpUsed) { + $this->addWarning('expectExceptionMessageRegExp() is deprecated in PHPUnit 8 and will be removed in PHPUnit 9. Use expectExceptionMessageMatches() instead.'); + } + + return; + } + + if ($this->expectedException !== null) { + $this->assertThat( + null, + new ExceptionConstraint( + $this->expectedException + ) + ); + } elseif ($this->expectedExceptionMessage !== null) { + $this->numAssertions++; + + throw new AssertionFailedError( + sprintf( + 'Failed asserting that exception with message "%s" is thrown', + $this->expectedExceptionMessage + ) + ); + } elseif ($this->expectedExceptionMessageRegExp !== null) { + $this->numAssertions++; + + throw new AssertionFailedError( + sprintf( + 'Failed asserting that exception with message matching "%s" is thrown', + $this->expectedExceptionMessageRegExp + ) + ); + } elseif ($this->expectedExceptionCode !== null) { + $this->numAssertions++; + + throw new AssertionFailedError( + sprintf( + 'Failed asserting that exception with code "%s" is thrown', + $this->expectedExceptionCode + ) + ); + } + + return $testResult; + } + + /** + * This method is a wrapper for the ini_set() function that automatically + * resets the modified php.ini setting to its original value after the + * test is run. + * + * @throws Exception + */ + protected function iniSet(string $varName, string $newValue): void + { + $currentValue = ini_set($varName, $newValue); + + if ($currentValue !== false) { + $this->iniSettings[$varName] = $currentValue; + } else { + throw new Exception( + sprintf( + 'INI setting "%s" could not be set to "%s".', + $varName, + $newValue + ) + ); + } + } + + /** + * This method is a wrapper for the setlocale() function that automatically + * resets the locale to its original value after the test is run. + * + * @throws Exception + */ + protected function setLocale(...$args): void + { + if (count($args) < 2) { + throw new Exception; + } + + [$category, $locale] = $args; + + if (defined('LC_MESSAGES')) { + $categories[] = LC_MESSAGES; + } + + if (!in_array($category, self::LOCALE_CATEGORIES, true)) { + throw new Exception; + } + + if (!is_array($locale) && !is_string($locale)) { + throw new Exception; + } + + $this->locale[$category] = setlocale($category, 0); + + $result = setlocale(...$args); + + if ($result === false) { + throw new Exception( + 'The locale functionality is not implemented on your platform, ' . + 'the specified locale does not exist or the category name is ' . + 'invalid.' + ); + } + } + + /** + * Makes configurable stub for the specified class. + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string $originalClassName + * @psalm-return Stub&RealInstanceType + */ + protected function createStub(string $originalClassName): Stub + { + return $this->createMock($originalClassName); + } + + /** + * Returns a mock object for the specified class. + * + * @param string|string[] $originalClassName + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string|string[] $originalClassName + * @psalm-return MockObject&RealInstanceType + */ + protected function createMock($originalClassName): MockObject + { + if (!is_string($originalClassName)) { + $this->addWarning('Passing an array of interface names to createMock() for creating a test double that implements multiple interfaces is deprecated and will no longer be supported in PHPUnit 9.'); + } + + return $this->getMockBuilder($originalClassName) + ->disableOriginalConstructor() + ->disableOriginalClone() + ->disableArgumentCloning() + ->disallowMockingUnknownTypes() + ->getMock(); + } + + /** + * Returns a configured mock object for the specified class. + * + * @param string|string[] $originalClassName + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string|string[] $originalClassName + * @psalm-return MockObject&RealInstanceType + */ + protected function createConfiguredMock($originalClassName, array $configuration): MockObject + { + $o = $this->createMock($originalClassName); + + foreach ($configuration as $method => $return) { + $o->method($method)->willReturn($return); + } + + return $o; + } + + /** + * Returns a partial mock object for the specified class. + * + * @param string|string[] $originalClassName + * @param string[] $methods + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string|string[] $originalClassName + * @psalm-return MockObject&RealInstanceType + */ + protected function createPartialMock($originalClassName, array $methods): MockObject + { + if (!is_string($originalClassName)) { + $this->addWarning('Passing an array of interface names to createPartialMock() for creating a test double that implements multiple interfaces is deprecated and will no longer be supported in PHPUnit 9.'); + } + + $class_names = is_array($originalClassName) ? $originalClassName : [$originalClassName]; + + foreach ($class_names as $class_name) { + $reflection = new ReflectionClass($class_name); + + $mockedMethodsThatDontExist = array_filter( + $methods, + static function (string $method) use ($reflection) { + return !$reflection->hasMethod($method); + } + ); + + if ($mockedMethodsThatDontExist) { + $this->addWarning( + sprintf( + 'createPartialMock called with method(s) %s that do not exist in %s. This will not be allowed in future versions of PHPUnit.', + implode(', ', $mockedMethodsThatDontExist), + $class_name + ) + ); + } + } + + return $this->getMockBuilder($originalClassName) + ->disableOriginalConstructor() + ->disableOriginalClone() + ->disableArgumentCloning() + ->disallowMockingUnknownTypes() + ->setMethods(empty($methods) ? null : $methods) + ->getMock(); + } + + /** + * Returns a test proxy for the specified class. + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string $originalClassName + * @psalm-return MockObject&RealInstanceType + */ + protected function createTestProxy(string $originalClassName, array $constructorArguments = []): MockObject + { + return $this->getMockBuilder($originalClassName) + ->setConstructorArgs($constructorArguments) + ->enableProxyingToOriginalMethods() + ->getMock(); + } + + /** + * Mocks the specified class and returns the name of the mocked class. + * + * @param string $originalClassName + * @param array $methods + * @param string $mockClassName + * @param bool $callOriginalConstructor + * @param bool $callOriginalClone + * @param bool $callAutoload + * @param bool $cloneArguments + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string|string $originalClassName + * @psalm-return class-string + */ + protected function getMockClass($originalClassName, $methods = [], array $arguments = [], $mockClassName = '', $callOriginalConstructor = false, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false): string + { + $this->recordDoubledType($originalClassName); + + $mock = $this->getMockObjectGenerator()->getMock( + $originalClassName, + $methods, + $arguments, + $mockClassName, + $callOriginalConstructor, + $callOriginalClone, + $callAutoload, + $cloneArguments + ); + + return get_class($mock); + } + + /** + * Returns a mock object for the specified abstract class with all abstract + * methods of the class mocked. Concrete methods are not mocked by default. + * To mock concrete methods, use the 7th parameter ($mockedMethods). + * + * @param string $originalClassName + * @param string $mockClassName + * @param bool $callOriginalConstructor + * @param bool $callOriginalClone + * @param bool $callAutoload + * @param array $mockedMethods + * @param bool $cloneArguments + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string $originalClassName + * @psalm-return MockObject&RealInstanceType + */ + protected function getMockForAbstractClass($originalClassName, array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = [], $cloneArguments = false): MockObject + { + $this->recordDoubledType($originalClassName); + + $mockObject = $this->getMockObjectGenerator()->getMockForAbstractClass( + $originalClassName, + $arguments, + $mockClassName, + $callOriginalConstructor, + $callOriginalClone, + $callAutoload, + $mockedMethods, + $cloneArguments + ); + + $this->registerMockObject($mockObject); + + return $mockObject; + } + + /** + * Returns a mock object based on the given WSDL file. + * + * @param string $wsdlFile + * @param string $originalClassName + * @param string $mockClassName + * @param bool $callOriginalConstructor + * @param array $options An array of options passed to SOAPClient::_construct + * + * @psalm-template RealInstanceType of object + * @psalm-param class-string|string $originalClassName + * @psalm-return MockObject&RealInstanceType + */ + protected function getMockFromWsdl($wsdlFile, $originalClassName = '', $mockClassName = '', array $methods = [], $callOriginalConstructor = true, array $options = []): MockObject + { + $this->recordDoubledType('SoapClient'); + + if ($originalClassName === '') { + $fileName = pathinfo(basename(parse_url($wsdlFile, PHP_URL_PATH)), PATHINFO_FILENAME); + $originalClassName = preg_replace('/\W/', '', $fileName); + } + + if (!class_exists($originalClassName)) { + eval( + $this->getMockObjectGenerator()->generateClassFromWsdl( + $wsdlFile, + $originalClassName, + $methods, + $options + ) + ); + } + + $mockObject = $this->getMockObjectGenerator()->getMock( + $originalClassName, + $methods, + ['', $options], + $mockClassName, + $callOriginalConstructor, + false, + false + ); + + $this->registerMockObject($mockObject); + + return $mockObject; + } + + /** + * Returns a mock object for the specified trait with all abstract methods + * of the trait mocked. Concrete methods to mock can be specified with the + * `$mockedMethods` parameter. + * + * @param string $traitName + * @param string $mockClassName + * @param bool $callOriginalConstructor + * @param bool $callOriginalClone + * @param bool $callAutoload + * @param array $mockedMethods + * @param bool $cloneArguments + */ + protected function getMockForTrait($traitName, array $arguments = [], $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $mockedMethods = [], $cloneArguments = false): MockObject + { + $this->recordDoubledType($traitName); + + $mockObject = $this->getMockObjectGenerator()->getMockForTrait( + $traitName, + $arguments, + $mockClassName, + $callOriginalConstructor, + $callOriginalClone, + $callAutoload, + $mockedMethods, + $cloneArguments + ); + + $this->registerMockObject($mockObject); + + return $mockObject; + } + + /** + * Returns an object for the specified trait. + * + * @param string $traitName + * @param string $traitClassName + * @param bool $callOriginalConstructor + * @param bool $callOriginalClone + * @param bool $callAutoload + * + * @return object + */ + protected function getObjectForTrait($traitName, array $arguments = [], $traitClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true)/*: object*/ + { + $this->recordDoubledType($traitName); + + return $this->getMockObjectGenerator()->getObjectForTrait( + $traitName, + $traitClassName, + $callAutoload, + $callOriginalConstructor, + $arguments + ); + } + + /** + * @param null|string $classOrInterface + * + * @throws \Prophecy\Exception\Doubler\ClassNotFoundException + * @throws \Prophecy\Exception\Doubler\DoubleException + * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException + * + * @psalm-param class-string|null $classOrInterface + */ + protected function prophesize($classOrInterface = null): ObjectProphecy + { + if (is_string($classOrInterface)) { + $this->recordDoubledType($classOrInterface); + } + + return $this->getProphet()->prophesize($classOrInterface); + } + + /** + * Creates a default TestResult object. + * + * @internal This method is not covered by the backward compatibility promise for PHPUnit + */ + protected function createResult(): TestResult + { + return new TestResult; + } + + /** + * Performs assertions shared by all tests of a test case. + * + * This method is called between setUp() and test. + */ + protected function assertPreConditions(): void + { + } + + /** + * Performs assertions shared by all tests of a test case. + * + * This method is called between test and tearDown(). + */ + protected function assertPostConditions(): void + { + } + + /** + * This method is called when a test method did not execute successfully. + * + * @throws Throwable + */ + protected function onNotSuccessfulTest(Throwable $t): void + { + throw $t; + } + + private function setExpectedExceptionFromAnnotation(): void + { + if ($this->name === null) { + return; + } + + try { + $expectedException = TestUtil::getExpectedException( + static::class, + $this->name + ); + + if ($expectedException !== false) { + $this->addWarning('The @expectedException, @expectedExceptionCode, @expectedExceptionMessage, and @expectedExceptionMessageRegExp annotations are deprecated. They will be removed in PHPUnit 9. Refactor your test to use expectException(), expectExceptionCode(), expectExceptionMessage(), or expectExceptionMessageMatches() instead.'); + + $this->expectException($expectedException['class']); + + if ($expectedException['code'] !== null) { + $this->expectExceptionCode($expectedException['code']); + } + + if ($expectedException['message'] !== '') { + $this->expectExceptionMessage($expectedException['message']); + } elseif ($expectedException['message_regex'] !== '') { + $this->expectExceptionMessageMatches($expectedException['message_regex']); + } + } + } catch (UtilException $e) { + } + } + + /** + * @throws SkippedTestError + * @throws SyntheticSkippedError + * @throws Warning + */ + private function checkRequirements(): void + { + if (!$this->name || !method_exists($this, $this->name)) { + return; + } + + $missingRequirements = TestUtil::getMissingRequirements( + static::class, + $this->name + ); + + if (!empty($missingRequirements)) { + $this->markTestSkipped(implode(PHP_EOL, $missingRequirements)); + } + } + + /** + * @throws Throwable + */ + private function verifyMockObjects(): void + { + foreach ($this->mockObjects as $mockObject) { + if ($mockObject->__phpunit_hasMatchers()) { + $this->numAssertions++; + } + + $mockObject->__phpunit_verify( + $this->shouldInvocationMockerBeReset($mockObject) + ); + } + + if ($this->prophet !== null) { + try { + $this->prophet->checkPredictions(); + } finally { + foreach ($this->prophet->getProphecies() as $objectProphecy) { + foreach ($objectProphecy->getMethodProphecies() as $methodProphecies) { + foreach ($methodProphecies as $methodProphecy) { + assert($methodProphecy instanceof MethodProphecy); + + $this->numAssertions += count($methodProphecy->getCheckedPredictions()); + } + } + } + } + } + } + + private function handleDependencies(): bool + { + if (!empty($this->dependencies) && !$this->inIsolation) { + $passed = $this->result->passed(); + $passedKeys = array_keys($passed); + + foreach ($passedKeys as $key => $value) { + $pos = strpos($value, ' with data set'); + + if ($pos !== false) { + $passedKeys[$key] = substr($value, 0, $pos); + } + } + + $passedKeys = array_flip(array_unique($passedKeys)); + + foreach ($this->dependencies as $dependency) { + $deepClone = false; + $shallowClone = false; + + if (empty($dependency)) { + $this->markSkippedForNotSpecifyingDependency(); + + return false; + } + + if (strpos($dependency, 'clone ') === 0) { + $deepClone = true; + $dependency = substr($dependency, strlen('clone ')); + } elseif (strpos($dependency, '!clone ') === 0) { + $deepClone = false; + $dependency = substr($dependency, strlen('!clone ')); + } + + if (strpos($dependency, 'shallowClone ') === 0) { + $shallowClone = true; + $dependency = substr($dependency, strlen('shallowClone ')); + } elseif (strpos($dependency, '!shallowClone ') === 0) { + $shallowClone = false; + $dependency = substr($dependency, strlen('!shallowClone ')); + } + + if (strpos($dependency, '::') === false) { + $dependency = static::class . '::' . $dependency; + } + + if (!isset($passedKeys[$dependency])) { + if (!$this->isCallableTestMethod($dependency)) { + $this->warnAboutDependencyThatDoesNotExist($dependency); + } else { + $this->markSkippedForMissingDependency($dependency); + } + + return false; + } + + if (isset($passed[$dependency])) { + if ($passed[$dependency]['size'] !== TestUtil::UNKNOWN && + $this->getSize() !== TestUtil::UNKNOWN && + $passed[$dependency]['size'] > $this->getSize()) { + $this->result->addError( + $this, + new SkippedTestError( + 'This test depends on a test that is larger than itself.' + ), + 0 + ); + + return false; + } + + if ($deepClone) { + $deepCopy = new DeepCopy; + $deepCopy->skipUncloneable(false); + + $this->dependencyInput[$dependency] = $deepCopy->copy($passed[$dependency]['result']); + } elseif ($shallowClone) { + $this->dependencyInput[$dependency] = clone $passed[$dependency]['result']; + } else { + $this->dependencyInput[$dependency] = $passed[$dependency]['result']; + } + } else { + $this->dependencyInput[$dependency] = null; + } + } + } + + return true; + } + + private function markSkippedForNotSpecifyingDependency(): void + { + $this->status = BaseTestRunner::STATUS_SKIPPED; + + $this->result->startTest($this); + + $this->result->addError( + $this, + new SkippedTestError( + 'This method has an invalid @depends annotation.' + ), + 0 + ); + + $this->result->endTest($this, 0); + } + + private function markSkippedForMissingDependency(string $dependency): void + { + $this->status = BaseTestRunner::STATUS_SKIPPED; + + $this->result->startTest($this); + + $this->result->addError( + $this, + new SkippedTestError( + sprintf( + 'This test depends on "%s" to pass.', + $dependency + ) + ), + 0 + ); + + $this->result->endTest($this, 0); + } + + private function warnAboutDependencyThatDoesNotExist(string $dependency): void + { + $this->status = BaseTestRunner::STATUS_WARNING; + + $this->result->startTest($this); + + $this->result->addWarning( + $this, + new Warning( + sprintf( + 'This test depends on "%s" which does not exist.', + $dependency + ) + ), + 0 + ); + + $this->result->endTest($this, 0); + } + + /** + * Get the mock object generator, creating it if it doesn't exist. + */ + private function getMockObjectGenerator(): MockGenerator + { + if ($this->mockObjectGenerator === null) { + $this->mockObjectGenerator = new MockGenerator; + } + + return $this->mockObjectGenerator; + } + + private function startOutputBuffering(): void + { + ob_start(); + + $this->outputBufferingActive = true; + $this->outputBufferingLevel = ob_get_level(); + } + + /** + * @throws RiskyTestError + */ + private function stopOutputBuffering(): void + { + if (ob_get_level() !== $this->outputBufferingLevel) { + while (ob_get_level() >= $this->outputBufferingLevel) { + ob_end_clean(); + } + + throw new RiskyTestError( + 'Test code or tested code did not (only) close its own output buffers' + ); + } + + $this->output = ob_get_contents(); + + if ($this->outputCallback !== false) { + $this->output = (string) call_user_func($this->outputCallback, $this->output); + } + + ob_end_clean(); + + $this->outputBufferingActive = false; + $this->outputBufferingLevel = ob_get_level(); + } + + private function snapshotGlobalState(): void + { + if ($this->runTestInSeparateProcess || $this->inIsolation || + (!$this->backupGlobals && !$this->backupStaticAttributes)) { + return; + } + + $this->snapshot = $this->createGlobalStateSnapshot($this->backupGlobals === true); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws RiskyTestError + */ + private function restoreGlobalState(): void + { + if (!$this->snapshot instanceof Snapshot) { + return; + } + + if ($this->beStrictAboutChangesToGlobalState) { + try { + $this->compareGlobalStateSnapshots( + $this->snapshot, + $this->createGlobalStateSnapshot($this->backupGlobals === true) + ); + } catch (RiskyTestError $rte) { + // Intentionally left empty + } + } + + $restorer = new Restorer; + + if ($this->backupGlobals) { + $restorer->restoreGlobalVariables($this->snapshot); + } + + if ($this->backupStaticAttributes) { + $restorer->restoreStaticAttributes($this->snapshot); + } + + $this->snapshot = null; + + if (isset($rte)) { + throw $rte; + } + } + + private function createGlobalStateSnapshot(bool $backupGlobals): Snapshot + { + $blacklist = new Blacklist; + + foreach ($this->backupGlobalsBlacklist as $globalVariable) { + $blacklist->addGlobalVariable($globalVariable); + } + + if (!defined('PHPUNIT_TESTSUITE')) { + $blacklist->addClassNamePrefix('PHPUnit'); + $blacklist->addClassNamePrefix('SebastianBergmann\CodeCoverage'); + $blacklist->addClassNamePrefix('SebastianBergmann\FileIterator'); + $blacklist->addClassNamePrefix('SebastianBergmann\Invoker'); + $blacklist->addClassNamePrefix('SebastianBergmann\Timer'); + $blacklist->addClassNamePrefix('PHP_Token'); + $blacklist->addClassNamePrefix('Symfony'); + $blacklist->addClassNamePrefix('Text_Template'); + $blacklist->addClassNamePrefix('Doctrine\Instantiator'); + $blacklist->addClassNamePrefix('Prophecy'); + $blacklist->addStaticAttribute(ComparatorFactory::class, 'instance'); + + foreach ($this->backupStaticAttributesBlacklist as $class => $attributes) { + foreach ($attributes as $attribute) { + $blacklist->addStaticAttribute($class, $attribute); + } + } + } + + return new Snapshot( + $blacklist, + $backupGlobals, + (bool) $this->backupStaticAttributes, + false, + false, + false, + false, + false, + false, + false + ); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws RiskyTestError + */ + private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after): void + { + $backupGlobals = $this->backupGlobals === null || $this->backupGlobals; + + if ($backupGlobals) { + $this->compareGlobalStateSnapshotPart( + $before->globalVariables(), + $after->globalVariables(), + "--- Global variables before the test\n+++ Global variables after the test\n" + ); + + $this->compareGlobalStateSnapshotPart( + $before->superGlobalVariables(), + $after->superGlobalVariables(), + "--- Super-global variables before the test\n+++ Super-global variables after the test\n" + ); + } + + if ($this->backupStaticAttributes) { + $this->compareGlobalStateSnapshotPart( + $before->staticAttributes(), + $after->staticAttributes(), + "--- Static attributes before the test\n+++ Static attributes after the test\n" + ); + } + } + + /** + * @throws RiskyTestError + */ + private function compareGlobalStateSnapshotPart(array $before, array $after, string $header): void + { + if ($before != $after) { + $differ = new Differ($header); + $exporter = new Exporter; + + $diff = $differ->diff( + $exporter->export($before), + $exporter->export($after) + ); + + throw new RiskyTestError( + $diff + ); + } + } + + private function getProphet(): Prophet + { + if ($this->prophet === null) { + $this->prophet = new Prophet; + } + + return $this->prophet; + } + + /** + * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException + */ + private function shouldInvocationMockerBeReset(MockObject $mock): bool + { + $enumerator = new Enumerator; + + foreach ($enumerator->enumerate($this->dependencyInput) as $object) { + if ($mock === $object) { + return false; + } + } + + if (!is_array($this->testResult) && !is_object($this->testResult)) { + return true; + } + + return !in_array($mock, $enumerator->enumerate($this->testResult), true); + } + + /** + * @throws \SebastianBergmann\ObjectEnumerator\InvalidArgumentException + * @throws \SebastianBergmann\ObjectReflector\InvalidArgumentException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function registerMockObjectsFromTestArguments(array $testArguments, array &$visited = []): void + { + if ($this->registerMockObjectsFromTestArgumentsRecursively) { + foreach ((new Enumerator)->enumerate($testArguments) as $object) { + if ($object instanceof MockObject) { + $this->registerMockObject($object); + } + } + } else { + foreach ($testArguments as $testArgument) { + if ($testArgument instanceof MockObject) { + if (Type::isCloneable($testArgument)) { + $testArgument = clone $testArgument; + } + + $this->registerMockObject($testArgument); + } elseif (is_array($testArgument) && !in_array($testArgument, $visited, true)) { + $visited[] = $testArgument; + + $this->registerMockObjectsFromTestArguments( + $testArgument, + $visited + ); + } + } + } + } + + private function setDoesNotPerformAssertionsFromAnnotation(): void + { + $annotations = $this->getAnnotations(); + + if (isset($annotations['method']['doesNotPerformAssertions'])) { + $this->doesNotPerformAssertions = true; + } + } + + private function unregisterCustomComparators(): void + { + $factory = ComparatorFactory::getInstance(); + + foreach ($this->customComparators as $comparator) { + $factory->unregister($comparator); + } + + $this->customComparators = []; + } + + private function cleanupIniSettings(): void + { + foreach ($this->iniSettings as $varName => $oldValue) { + ini_set($varName, $oldValue); + } + + $this->iniSettings = []; + } + + private function cleanupLocaleSettings(): void + { + foreach ($this->locale as $category => $locale) { + setlocale($category, $locale); + } + + $this->locale = []; + } + + /** + * @throws Exception + */ + private function checkExceptionExpectations(Throwable $throwable): bool + { + $result = false; + + if ($this->expectedException !== null || $this->expectedExceptionCode !== null || $this->expectedExceptionMessage !== null || $this->expectedExceptionMessageRegExp !== null) { + $result = true; + } + + if ($throwable instanceof Exception) { + $result = false; + } + + if (is_string($this->expectedException)) { + try { + $reflector = new ReflectionClass($this->expectedException); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($this->expectedException === 'PHPUnit\Framework\Exception' || + $this->expectedException === '\PHPUnit\Framework\Exception' || + $reflector->isSubclassOf(Exception::class)) { + $result = true; + } + } + + return $result; + } + + private function runInSeparateProcess(): bool + { + return ($this->runTestInSeparateProcess || $this->runClassInSeparateProcess) && + !$this->inIsolation && !$this instanceof PhptTestCase; + } + + /** + * @param string|string[] $originalClassName + */ + private function recordDoubledType($originalClassName): void + { + if (is_string($originalClassName)) { + $this->doubledTypes[] = $originalClassName; + } + + if (is_array($originalClassName)) { + foreach ($originalClassName as $_originalClassName) { + if (is_string($_originalClassName)) { + $this->doubledTypes[] = $_originalClassName; + } + } + } + } + + private function isCallableTestMethod(string $dependency): bool + { + [$className, $methodName] = explode('::', $dependency); + + if (!class_exists($className)) { + return false; + } + + try { + $class = new ReflectionClass($className); + } catch (ReflectionException $e) { + return false; + } + + if (!$class->isSubclassOf(__CLASS__)) { + return false; + } + + if (!$class->hasMethod($methodName)) { + return false; + } + + try { + $method = $class->getMethod($methodName); + } catch (ReflectionException $e) { + return false; + } + + return TestUtil::isTestMethod($method); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestFailure.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestFailure.php new file mode 100644 index 0000000000..5849d36ede --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestFailure.php @@ -0,0 +1,157 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use function get_class; +use function sprintf; +use function trim; +use PHPUnit\Framework\Error\Error; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestFailure +{ + /** + * @var null|Test + */ + private $failedTest; + + /** + * @var Throwable + */ + private $thrownException; + + /** + * @var string + */ + private $testName; + + /** + * Returns a description for an exception. + */ + public static function exceptionToString(Throwable $e): string + { + if ($e instanceof SelfDescribing) { + $buffer = $e->toString(); + + if ($e instanceof ExpectationFailedException && $e->getComparisonFailure()) { + $buffer .= $e->getComparisonFailure()->getDiff(); + } + + if ($e instanceof PHPTAssertionFailedError) { + $buffer .= $e->getDiff(); + } + + if (!empty($buffer)) { + $buffer = trim($buffer) . "\n"; + } + + return $buffer; + } + + if ($e instanceof Error) { + return $e->getMessage() . "\n"; + } + + if ($e instanceof ExceptionWrapper) { + return $e->getClassName() . ': ' . $e->getMessage() . "\n"; + } + + return get_class($e) . ': ' . $e->getMessage() . "\n"; + } + + /** + * Constructs a TestFailure with the given test and exception. + * + * @param Throwable $t + */ + public function __construct(Test $failedTest, $t) + { + if ($failedTest instanceof SelfDescribing) { + $this->testName = $failedTest->toString(); + } else { + $this->testName = get_class($failedTest); + } + + if (!$failedTest instanceof TestCase || !$failedTest->isInIsolation()) { + $this->failedTest = $failedTest; + } + + $this->thrownException = $t; + } + + /** + * Returns a short description of the failure. + */ + public function toString(): string + { + return sprintf( + '%s: %s', + $this->testName, + $this->thrownException->getMessage() + ); + } + + /** + * Returns a description for the thrown exception. + */ + public function getExceptionAsString(): string + { + return self::exceptionToString($this->thrownException); + } + + /** + * Returns the name of the failing test (including data set, if any). + */ + public function getTestName(): string + { + return $this->testName; + } + + /** + * Returns the failing test. + * + * Note: The test object is not set when the test is executed in process + * isolation. + * + * @see Exception + */ + public function failedTest(): ?Test + { + return $this->failedTest; + } + + /** + * Gets the thrown exception. + */ + public function thrownException(): Throwable + { + return $this->thrownException; + } + + /** + * Returns the exception's message. + */ + public function exceptionMessage(): string + { + return $this->thrownException()->getMessage(); + } + + /** + * Returns true if the thrown exception + * is of type AssertionFailedError. + */ + public function isFailure(): bool + { + return $this->thrownException() instanceof AssertionFailedError; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListener.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListener.php new file mode 100644 index 0000000000..96ce4eec73 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListener.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use Throwable; + +/** + * @deprecated Use the `TestHook` interfaces instead + */ +interface TestListener +{ + /** + * An error occurred. + * + * @deprecated Use `AfterTestErrorHook::executeAfterTestError` instead + */ + public function addError(Test $test, Throwable $t, float $time): void; + + /** + * A warning occurred. + * + * @deprecated Use `AfterTestWarningHook::executeAfterTestWarning` instead + */ + public function addWarning(Test $test, Warning $e, float $time): void; + + /** + * A failure occurred. + * + * @deprecated Use `AfterTestFailureHook::executeAfterTestFailure` instead + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void; + + /** + * Incomplete test. + * + * @deprecated Use `AfterIncompleteTestHook::executeAfterIncompleteTest` instead + */ + public function addIncompleteTest(Test $test, Throwable $t, float $time): void; + + /** + * Risky test. + * + * @deprecated Use `AfterRiskyTestHook::executeAfterRiskyTest` instead + */ + public function addRiskyTest(Test $test, Throwable $t, float $time): void; + + /** + * Skipped test. + * + * @deprecated Use `AfterSkippedTestHook::executeAfterSkippedTest` instead + */ + public function addSkippedTest(Test $test, Throwable $t, float $time): void; + + /** + * A test suite started. + */ + public function startTestSuite(TestSuite $suite): void; + + /** + * A test suite ended. + */ + public function endTestSuite(TestSuite $suite): void; + + /** + * A test started. + * + * @deprecated Use `BeforeTestHook::executeBeforeTest` instead + */ + public function startTest(Test $test): void; + + /** + * A test ended. + * + * @deprecated Use `AfterTestHook::executeAfterTest` instead + */ + public function endTest(Test $test, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php new file mode 100644 index 0000000000..7c99f5cb24 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestListenerDefaultImplementation.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use Throwable; + +/** + * @deprecated The `TestListener` interface is deprecated + */ +trait TestListenerDefaultImplementation +{ + public function addError(Test $test, Throwable $t, float $time): void + { + } + + public function addWarning(Test $test, Warning $e, float $time): void + { + } + + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + } + + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + } + + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + } + + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + } + + public function startTestSuite(TestSuite $suite): void + { + } + + public function endTestSuite(TestSuite $suite): void + { + } + + public function startTest(Test $test): void + { + } + + public function endTest(Test $test, float $time): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestResult.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestResult.php new file mode 100644 index 0000000000..8c333b5407 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestResult.php @@ -0,0 +1,1232 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use const PHP_EOL; +use function class_exists; +use function count; +use function extension_loaded; +use function function_exists; +use function get_class; +use function sprintf; +use function xdebug_get_monitored_functions; +use function xdebug_start_function_monitor; +use function xdebug_stop_function_monitor; +use AssertionError; +use Countable; +use Error; +use PHPUnit\Framework\MockObject\Exception as MockObjectException; +use PHPUnit\Util\Blacklist; +use PHPUnit\Util\ErrorHandler; +use PHPUnit\Util\Printer; +use PHPUnit\Util\Test as TestUtil; +use ReflectionClass; +use ReflectionException; +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException as OriginalCoveredCodeNotExecutedException; +use SebastianBergmann\CodeCoverage\Exception as OriginalCodeCoverageException; +use SebastianBergmann\CodeCoverage\MissingCoversAnnotationException as OriginalMissingCoversAnnotationException; +use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException; +use SebastianBergmann\Invoker\Invoker; +use SebastianBergmann\Invoker\TimeoutException; +use SebastianBergmann\ResourceOperations\ResourceOperations; +use SebastianBergmann\Timer\Timer; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestResult implements Countable +{ + /** + * @var array + */ + private $passed = []; + + /** + * @var TestFailure[] + */ + private $errors = []; + + /** + * @var TestFailure[] + */ + private $failures = []; + + /** + * @var TestFailure[] + */ + private $warnings = []; + + /** + * @var TestFailure[] + */ + private $notImplemented = []; + + /** + * @var TestFailure[] + */ + private $risky = []; + + /** + * @var TestFailure[] + */ + private $skipped = []; + + /** + * @deprecated Use the `TestHook` interfaces instead + * + * @var TestListener[] + */ + private $listeners = []; + + /** + * @var int + */ + private $runTests = 0; + + /** + * @var float + */ + private $time = 0; + + /** + * @var TestSuite + */ + private $topTestSuite; + + /** + * Code Coverage information. + * + * @var CodeCoverage + */ + private $codeCoverage; + + /** + * @var bool + */ + private $convertDeprecationsToExceptions = true; + + /** + * @var bool + */ + private $convertErrorsToExceptions = true; + + /** + * @var bool + */ + private $convertNoticesToExceptions = true; + + /** + * @var bool + */ + private $convertWarningsToExceptions = true; + + /** + * @var bool + */ + private $stop = false; + + /** + * @var bool + */ + private $stopOnError = false; + + /** + * @var bool + */ + private $stopOnFailure = false; + + /** + * @var bool + */ + private $stopOnWarning = false; + + /** + * @var bool + */ + private $beStrictAboutTestsThatDoNotTestAnything = true; + + /** + * @var bool + */ + private $beStrictAboutOutputDuringTests = false; + + /** + * @var bool + */ + private $beStrictAboutTodoAnnotatedTests = false; + + /** + * @var bool + */ + private $beStrictAboutResourceUsageDuringSmallTests = false; + + /** + * @var bool + */ + private $enforceTimeLimit = false; + + /** + * @var int + */ + private $timeoutForSmallTests = 1; + + /** + * @var int + */ + private $timeoutForMediumTests = 10; + + /** + * @var int + */ + private $timeoutForLargeTests = 60; + + /** + * @var bool + */ + private $stopOnRisky = false; + + /** + * @var bool + */ + private $stopOnIncomplete = false; + + /** + * @var bool + */ + private $stopOnSkipped = false; + + /** + * @var bool + */ + private $lastTestFailed = false; + + /** + * @var int + */ + private $defaultTimeLimit = 0; + + /** + * @var bool + */ + private $stopOnDefect = false; + + /** + * @var bool + */ + private $registerMockObjectsFromTestArgumentsRecursively = false; + + /** + * @deprecated Use the `TestHook` interfaces instead + * + * @codeCoverageIgnore + * + * Registers a TestListener. + */ + public function addListener(TestListener $listener): void + { + $this->listeners[] = $listener; + } + + /** + * @deprecated Use the `TestHook` interfaces instead + * + * @codeCoverageIgnore + * + * Unregisters a TestListener. + */ + public function removeListener(TestListener $listener): void + { + foreach ($this->listeners as $key => $_listener) { + if ($listener === $_listener) { + unset($this->listeners[$key]); + } + } + } + + /** + * @deprecated Use the `TestHook` interfaces instead + * + * @codeCoverageIgnore + * + * Flushes all flushable TestListeners. + */ + public function flushListeners(): void + { + foreach ($this->listeners as $listener) { + if ($listener instanceof Printer) { + $listener->flush(); + } + } + } + + /** + * Adds an error to the list of errors. + */ + public function addError(Test $test, Throwable $t, float $time): void + { + if ($t instanceof RiskyTestError) { + $this->risky[] = new TestFailure($test, $t); + $notifyMethod = 'addRiskyTest'; + + if ($test instanceof TestCase) { + $test->markAsRisky(); + } + + if ($this->stopOnRisky || $this->stopOnDefect) { + $this->stop(); + } + } elseif ($t instanceof IncompleteTest) { + $this->notImplemented[] = new TestFailure($test, $t); + $notifyMethod = 'addIncompleteTest'; + + if ($this->stopOnIncomplete) { + $this->stop(); + } + } elseif ($t instanceof SkippedTest) { + $this->skipped[] = new TestFailure($test, $t); + $notifyMethod = 'addSkippedTest'; + + if ($this->stopOnSkipped) { + $this->stop(); + } + } else { + $this->errors[] = new TestFailure($test, $t); + $notifyMethod = 'addError'; + + if ($this->stopOnError || $this->stopOnFailure) { + $this->stop(); + } + } + + // @see https://github.com/sebastianbergmann/phpunit/issues/1953 + if ($t instanceof Error) { + $t = new ExceptionWrapper($t); + } + + foreach ($this->listeners as $listener) { + $listener->{$notifyMethod}($test, $t, $time); + } + + $this->lastTestFailed = true; + $this->time += $time; + } + + /** + * Adds a warning to the list of warnings. + * The passed in exception caused the warning. + */ + public function addWarning(Test $test, Warning $e, float $time): void + { + if ($this->stopOnWarning || $this->stopOnDefect) { + $this->stop(); + } + + $this->warnings[] = new TestFailure($test, $e); + + foreach ($this->listeners as $listener) { + $listener->addWarning($test, $e, $time); + } + + $this->time += $time; + } + + /** + * Adds a failure to the list of failures. + * The passed in exception caused the failure. + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + if ($e instanceof RiskyTestError || $e instanceof OutputError) { + $this->risky[] = new TestFailure($test, $e); + $notifyMethod = 'addRiskyTest'; + + if ($test instanceof TestCase) { + $test->markAsRisky(); + } + + if ($this->stopOnRisky || $this->stopOnDefect) { + $this->stop(); + } + } elseif ($e instanceof IncompleteTest) { + $this->notImplemented[] = new TestFailure($test, $e); + $notifyMethod = 'addIncompleteTest'; + + if ($this->stopOnIncomplete) { + $this->stop(); + } + } elseif ($e instanceof SkippedTest) { + $this->skipped[] = new TestFailure($test, $e); + $notifyMethod = 'addSkippedTest'; + + if ($this->stopOnSkipped) { + $this->stop(); + } + } else { + $this->failures[] = new TestFailure($test, $e); + $notifyMethod = 'addFailure'; + + if ($this->stopOnFailure || $this->stopOnDefect) { + $this->stop(); + } + } + + foreach ($this->listeners as $listener) { + $listener->{$notifyMethod}($test, $e, $time); + } + + $this->lastTestFailed = true; + $this->time += $time; + } + + /** + * Informs the result that a test suite will be started. + */ + public function startTestSuite(TestSuite $suite): void + { + if ($this->topTestSuite === null) { + $this->topTestSuite = $suite; + } + + foreach ($this->listeners as $listener) { + $listener->startTestSuite($suite); + } + } + + /** + * Informs the result that a test suite was completed. + */ + public function endTestSuite(TestSuite $suite): void + { + foreach ($this->listeners as $listener) { + $listener->endTestSuite($suite); + } + } + + /** + * Informs the result that a test will be started. + */ + public function startTest(Test $test): void + { + $this->lastTestFailed = false; + $this->runTests += count($test); + + foreach ($this->listeners as $listener) { + $listener->startTest($test); + } + } + + /** + * Informs the result that a test was completed. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function endTest(Test $test, float $time): void + { + foreach ($this->listeners as $listener) { + $listener->endTest($test, $time); + } + + if (!$this->lastTestFailed && $test instanceof TestCase) { + $class = get_class($test); + $key = $class . '::' . $test->getName(); + + $this->passed[$key] = [ + 'result' => $test->getResult(), + 'size' => \PHPUnit\Util\Test::getSize( + $class, + $test->getName(false) + ), + ]; + + $this->time += $time; + } + } + + /** + * Returns true if no risky test occurred. + */ + public function allHarmless(): bool + { + return $this->riskyCount() == 0; + } + + /** + * Gets the number of risky tests. + */ + public function riskyCount(): int + { + return count($this->risky); + } + + /** + * Returns true if no incomplete test occurred. + */ + public function allCompletelyImplemented(): bool + { + return $this->notImplementedCount() == 0; + } + + /** + * Gets the number of incomplete tests. + */ + public function notImplementedCount(): int + { + return count($this->notImplemented); + } + + /** + * Returns an array of TestFailure objects for the risky tests. + * + * @return TestFailure[] + */ + public function risky(): array + { + return $this->risky; + } + + /** + * Returns an array of TestFailure objects for the incomplete tests. + * + * @return TestFailure[] + */ + public function notImplemented(): array + { + return $this->notImplemented; + } + + /** + * Returns true if no test has been skipped. + */ + public function noneSkipped(): bool + { + return $this->skippedCount() == 0; + } + + /** + * Gets the number of skipped tests. + */ + public function skippedCount(): int + { + return count($this->skipped); + } + + /** + * Returns an array of TestFailure objects for the skipped tests. + * + * @return TestFailure[] + */ + public function skipped(): array + { + return $this->skipped; + } + + /** + * Gets the number of detected errors. + */ + public function errorCount(): int + { + return count($this->errors); + } + + /** + * Returns an array of TestFailure objects for the errors. + * + * @return TestFailure[] + */ + public function errors(): array + { + return $this->errors; + } + + /** + * Gets the number of detected failures. + */ + public function failureCount(): int + { + return count($this->failures); + } + + /** + * Returns an array of TestFailure objects for the failures. + * + * @return TestFailure[] + */ + public function failures(): array + { + return $this->failures; + } + + /** + * Gets the number of detected warnings. + */ + public function warningCount(): int + { + return count($this->warnings); + } + + /** + * Returns an array of TestFailure objects for the warnings. + * + * @return TestFailure[] + */ + public function warnings(): array + { + return $this->warnings; + } + + /** + * Returns the names of the tests that have passed. + */ + public function passed(): array + { + return $this->passed; + } + + /** + * Returns the (top) test suite. + */ + public function topTestSuite(): TestSuite + { + return $this->topTestSuite; + } + + /** + * Returns whether code coverage information should be collected. + */ + public function getCollectCodeCoverageInformation(): bool + { + return $this->codeCoverage !== null; + } + + /** + * Runs a TestCase. + * + * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException + * @throws \SebastianBergmann\CodeCoverage\RuntimeException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws CodeCoverageException + * @throws OriginalCoveredCodeNotExecutedException + * @throws OriginalMissingCoversAnnotationException + * @throws UnintentionallyCoveredCodeException + */ + public function run(Test $test): void + { + Assert::resetCount(); + + if ($test instanceof TestCase) { + $test->setRegisterMockObjectsFromTestArgumentsRecursively( + $this->registerMockObjectsFromTestArgumentsRecursively + ); + + $isAnyCoverageRequired = TestUtil::requiresCodeCoverageDataCollection($test); + } + + $error = false; + $failure = false; + $warning = false; + $incomplete = false; + $risky = false; + $skipped = false; + + $this->startTest($test); + + if ($this->convertDeprecationsToExceptions || $this->convertErrorsToExceptions || $this->convertNoticesToExceptions || $this->convertWarningsToExceptions) { + $errorHandler = new ErrorHandler( + $this->convertDeprecationsToExceptions, + $this->convertErrorsToExceptions, + $this->convertNoticesToExceptions, + $this->convertWarningsToExceptions + ); + + $errorHandler->register(); + } + + $collectCodeCoverage = $this->codeCoverage !== null && + !$test instanceof WarningTestCase && + $isAnyCoverageRequired; + + if ($collectCodeCoverage) { + $this->codeCoverage->start($test); + } + + $monitorFunctions = $this->beStrictAboutResourceUsageDuringSmallTests && + !$test instanceof WarningTestCase && + $test->getSize() == \PHPUnit\Util\Test::SMALL && + function_exists('xdebug_start_function_monitor'); + + if ($monitorFunctions) { + /* @noinspection ForgottenDebugOutputInspection */ + xdebug_start_function_monitor(ResourceOperations::getFunctions()); + } + + Timer::start(); + + try { + if (!$test instanceof WarningTestCase && + $this->enforceTimeLimit && + ($this->defaultTimeLimit || $test->getSize() != \PHPUnit\Util\Test::UNKNOWN) && + extension_loaded('pcntl') && class_exists(Invoker::class)) { + switch ($test->getSize()) { + case \PHPUnit\Util\Test::SMALL: + $_timeout = $this->timeoutForSmallTests; + + break; + + case \PHPUnit\Util\Test::MEDIUM: + $_timeout = $this->timeoutForMediumTests; + + break; + + case \PHPUnit\Util\Test::LARGE: + $_timeout = $this->timeoutForLargeTests; + + break; + + case \PHPUnit\Util\Test::UNKNOWN: + $_timeout = $this->defaultTimeLimit; + + break; + } + + $invoker = new Invoker; + $invoker->invoke([$test, 'runBare'], [], $_timeout); + } else { + $test->runBare(); + } + } catch (TimeoutException $e) { + $this->addFailure( + $test, + new RiskyTestError( + $e->getMessage() + ), + $_timeout + ); + + $risky = true; + } catch (MockObjectException $e) { + $e = new Warning( + $e->getMessage() + ); + + $warning = true; + } catch (AssertionFailedError $e) { + $failure = true; + + if ($e instanceof RiskyTestError) { + $risky = true; + } elseif ($e instanceof IncompleteTestError) { + $incomplete = true; + } elseif ($e instanceof SkippedTestError) { + $skipped = true; + } + } catch (AssertionError $e) { + $test->addToAssertionCount(1); + + $failure = true; + $frame = $e->getTrace()[0]; + + $e = new AssertionFailedError( + sprintf( + '%s in %s:%s', + $e->getMessage(), + $frame['file'], + $frame['line'] + ) + ); + } catch (Warning $e) { + $warning = true; + } catch (Exception $e) { + $error = true; + } catch (Throwable $e) { + $e = new ExceptionWrapper($e); + $error = true; + } + + $time = Timer::stop(); + $test->addToAssertionCount(Assert::getCount()); + + if ($monitorFunctions) { + $blacklist = new Blacklist; + + /** @noinspection ForgottenDebugOutputInspection */ + $functions = xdebug_get_monitored_functions(); + + /* @noinspection ForgottenDebugOutputInspection */ + xdebug_stop_function_monitor(); + + foreach ($functions as $function) { + if (!$blacklist->isBlacklisted($function['filename'])) { + $this->addFailure( + $test, + new RiskyTestError( + sprintf( + '%s() used in %s:%s', + $function['function'], + $function['filename'], + $function['lineno'] + ) + ), + $time + ); + } + } + } + + if ($this->beStrictAboutTestsThatDoNotTestAnything && + $test->getNumAssertions() == 0) { + $risky = true; + } + + if ($collectCodeCoverage) { + $append = !$risky && !$incomplete && !$skipped; + $linesToBeCovered = []; + $linesToBeUsed = []; + + if ($append && $test instanceof TestCase) { + try { + $linesToBeCovered = \PHPUnit\Util\Test::getLinesToBeCovered( + get_class($test), + $test->getName(false) + ); + + $linesToBeUsed = \PHPUnit\Util\Test::getLinesToBeUsed( + get_class($test), + $test->getName(false) + ); + } catch (InvalidCoversTargetException $cce) { + $this->addWarning( + $test, + new Warning( + $cce->getMessage() + ), + $time + ); + } + } + + try { + $this->codeCoverage->stop( + $append, + $linesToBeCovered, + $linesToBeUsed + ); + } catch (UnintentionallyCoveredCodeException $cce) { + $this->addFailure( + $test, + new UnintentionallyCoveredCodeError( + 'This test executed code that is not listed as code to be covered or used:' . + PHP_EOL . $cce->getMessage() + ), + $time + ); + } catch (OriginalCoveredCodeNotExecutedException $cce) { + $this->addFailure( + $test, + new CoveredCodeNotExecutedException( + 'This test did not execute all the code that is listed as code to be covered:' . + PHP_EOL . $cce->getMessage() + ), + $time + ); + } catch (OriginalMissingCoversAnnotationException $cce) { + if ($linesToBeCovered !== false) { + $this->addFailure( + $test, + new MissingCoversAnnotationException( + 'This test does not have a @covers annotation but is expected to have one' + ), + $time + ); + } + } catch (OriginalCodeCoverageException $cce) { + $error = true; + + $e = $e ?? $cce; + } + } + + if (isset($errorHandler)) { + $errorHandler->unregister(); + + unset($errorHandler); + } + + if ($error) { + $this->addError($test, $e, $time); + } elseif ($failure) { + $this->addFailure($test, $e, $time); + } elseif ($warning) { + $this->addWarning($test, $e, $time); + } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && + !$test->doesNotPerformAssertions() && + $test->getNumAssertions() == 0) { + try { + $reflected = new ReflectionClass($test); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $name = $test->getName(false); + + if ($name && $reflected->hasMethod($name)) { + try { + $reflected = $reflected->getMethod($name); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } + + $this->addFailure( + $test, + new RiskyTestError( + sprintf( + "This test did not perform any assertions\n\n%s:%d", + $reflected->getFileName(), + $reflected->getStartLine() + ) + ), + $time + ); + } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && + $test->doesNotPerformAssertions() && + $test->getNumAssertions() > 0) { + $this->addFailure( + $test, + new RiskyTestError( + sprintf( + 'This test is annotated with "@doesNotPerformAssertions" but performed %d assertions', + $test->getNumAssertions() + ) + ), + $time + ); + } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) { + $this->addFailure( + $test, + new OutputError( + sprintf( + 'This test printed output: %s', + $test->getActualOutput() + ) + ), + $time + ); + } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof TestCase) { + $annotations = $test->getAnnotations(); + + if (isset($annotations['method']['todo'])) { + $this->addFailure( + $test, + new RiskyTestError( + 'Test method is annotated with @todo' + ), + $time + ); + } + } + + $this->endTest($test, $time); + } + + /** + * Gets the number of run tests. + */ + public function count(): int + { + return $this->runTests; + } + + /** + * Checks whether the test run should stop. + */ + public function shouldStop(): bool + { + return $this->stop; + } + + /** + * Marks that the test run should stop. + */ + public function stop(): void + { + $this->stop = true; + } + + /** + * Returns the code coverage object. + */ + public function getCodeCoverage(): ?CodeCoverage + { + return $this->codeCoverage; + } + + /** + * Sets the code coverage object. + */ + public function setCodeCoverage(CodeCoverage $codeCoverage): void + { + $this->codeCoverage = $codeCoverage; + } + + /** + * Enables or disables the deprecation-to-exception conversion. + */ + public function convertDeprecationsToExceptions(bool $flag): void + { + $this->convertDeprecationsToExceptions = $flag; + } + + /** + * Returns the deprecation-to-exception conversion setting. + */ + public function getConvertDeprecationsToExceptions(): bool + { + return $this->convertDeprecationsToExceptions; + } + + /** + * Enables or disables the error-to-exception conversion. + */ + public function convertErrorsToExceptions(bool $flag): void + { + $this->convertErrorsToExceptions = $flag; + } + + /** + * Returns the error-to-exception conversion setting. + */ + public function getConvertErrorsToExceptions(): bool + { + return $this->convertErrorsToExceptions; + } + + /** + * Enables or disables the notice-to-exception conversion. + */ + public function convertNoticesToExceptions(bool $flag): void + { + $this->convertNoticesToExceptions = $flag; + } + + /** + * Returns the notice-to-exception conversion setting. + */ + public function getConvertNoticesToExceptions(): bool + { + return $this->convertNoticesToExceptions; + } + + /** + * Enables or disables the warning-to-exception conversion. + */ + public function convertWarningsToExceptions(bool $flag): void + { + $this->convertWarningsToExceptions = $flag; + } + + /** + * Returns the warning-to-exception conversion setting. + */ + public function getConvertWarningsToExceptions(): bool + { + return $this->convertWarningsToExceptions; + } + + /** + * Enables or disables the stopping when an error occurs. + */ + public function stopOnError(bool $flag): void + { + $this->stopOnError = $flag; + } + + /** + * Enables or disables the stopping when a failure occurs. + */ + public function stopOnFailure(bool $flag): void + { + $this->stopOnFailure = $flag; + } + + /** + * Enables or disables the stopping when a warning occurs. + */ + public function stopOnWarning(bool $flag): void + { + $this->stopOnWarning = $flag; + } + + public function beStrictAboutTestsThatDoNotTestAnything(bool $flag): void + { + $this->beStrictAboutTestsThatDoNotTestAnything = $flag; + } + + public function isStrictAboutTestsThatDoNotTestAnything(): bool + { + return $this->beStrictAboutTestsThatDoNotTestAnything; + } + + public function beStrictAboutOutputDuringTests(bool $flag): void + { + $this->beStrictAboutOutputDuringTests = $flag; + } + + public function isStrictAboutOutputDuringTests(): bool + { + return $this->beStrictAboutOutputDuringTests; + } + + public function beStrictAboutResourceUsageDuringSmallTests(bool $flag): void + { + $this->beStrictAboutResourceUsageDuringSmallTests = $flag; + } + + public function isStrictAboutResourceUsageDuringSmallTests(): bool + { + return $this->beStrictAboutResourceUsageDuringSmallTests; + } + + public function enforceTimeLimit(bool $flag): void + { + $this->enforceTimeLimit = $flag; + } + + public function enforcesTimeLimit(): bool + { + return $this->enforceTimeLimit; + } + + public function beStrictAboutTodoAnnotatedTests(bool $flag): void + { + $this->beStrictAboutTodoAnnotatedTests = $flag; + } + + public function isStrictAboutTodoAnnotatedTests(): bool + { + return $this->beStrictAboutTodoAnnotatedTests; + } + + /** + * Enables or disables the stopping for risky tests. + */ + public function stopOnRisky(bool $flag): void + { + $this->stopOnRisky = $flag; + } + + /** + * Enables or disables the stopping for incomplete tests. + */ + public function stopOnIncomplete(bool $flag): void + { + $this->stopOnIncomplete = $flag; + } + + /** + * Enables or disables the stopping for skipped tests. + */ + public function stopOnSkipped(bool $flag): void + { + $this->stopOnSkipped = $flag; + } + + /** + * Enables or disables the stopping for defects: error, failure, warning. + */ + public function stopOnDefect(bool $flag): void + { + $this->stopOnDefect = $flag; + } + + /** + * Returns the time spent running the tests. + */ + public function time(): float + { + return $this->time; + } + + /** + * Returns whether the entire test was successful or not. + */ + public function wasSuccessful(): bool + { + return $this->wasSuccessfulIgnoringWarnings() && empty($this->warnings); + } + + public function wasSuccessfulIgnoringWarnings(): bool + { + return empty($this->errors) && empty($this->failures); + } + + public function wasSuccessfulAndNoTestIsRiskyOrSkippedOrIncomplete(): bool + { + return $this->wasSuccessful() && $this->allHarmless() && $this->allCompletelyImplemented() && $this->noneSkipped(); + } + + /** + * Sets the default timeout for tests. + */ + public function setDefaultTimeLimit(int $timeout): void + { + $this->defaultTimeLimit = $timeout; + } + + /** + * Sets the timeout for small tests. + */ + public function setTimeoutForSmallTests(int $timeout): void + { + $this->timeoutForSmallTests = $timeout; + } + + /** + * Sets the timeout for medium tests. + */ + public function setTimeoutForMediumTests(int $timeout): void + { + $this->timeoutForMediumTests = $timeout; + } + + /** + * Sets the timeout for large tests. + */ + public function setTimeoutForLargeTests(int $timeout): void + { + $this->timeoutForLargeTests = $timeout; + } + + /** + * Returns the set timeout for large tests. + */ + public function getTimeoutForLargeTests(): int + { + return $this->timeoutForLargeTests; + } + + public function setRegisterMockObjectsFromTestArgumentsRecursively(bool $flag): void + { + $this->registerMockObjectsFromTestArgumentsRecursively = $flag; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuite.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuite.php new file mode 100644 index 0000000000..144cb6f1b8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuite.php @@ -0,0 +1,796 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use const PHP_EOL; +use function array_diff; +use function array_keys; +use function array_merge; +use function basename; +use function call_user_func; +use function class_exists; +use function count; +use function dirname; +use function file_exists; +use function get_declared_classes; +use function implode; +use function is_bool; +use function is_object; +use function is_string; +use function method_exists; +use function preg_match; +use function preg_quote; +use function sprintf; +use function substr; +use Iterator; +use IteratorAggregate; +use PHPUnit\Runner\BaseTestRunner; +use PHPUnit\Runner\Filter\Factory; +use PHPUnit\Runner\PhptTestCase; +use PHPUnit\Util\FileLoader; +use PHPUnit\Util\Test as TestUtil; +use ReflectionClass; +use ReflectionException; +use ReflectionMethod; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class TestSuite implements IteratorAggregate, SelfDescribing, Test +{ + /** + * Enable or disable the backup and restoration of the $GLOBALS array. + * + * @var bool + */ + protected $backupGlobals; + + /** + * Enable or disable the backup and restoration of static attributes. + * + * @var bool + */ + protected $backupStaticAttributes; + + /** + * @var bool + */ + protected $runTestInSeparateProcess = false; + + /** + * The name of the test suite. + * + * @var string + */ + protected $name = ''; + + /** + * The test groups of the test suite. + * + * @var array + */ + protected $groups = []; + + /** + * The tests in the test suite. + * + * @var Test[] + */ + protected $tests = []; + + /** + * The number of tests in the test suite. + * + * @var int + */ + protected $numTests = -1; + + /** + * @var bool + */ + protected $testCase = false; + + /** + * @var string[] + */ + protected $foundClasses = []; + + /** + * Last count of tests in this suite. + * + * @var null|int + */ + private $cachedNumTests; + + /** + * @var bool + */ + private $beStrictAboutChangesToGlobalState; + + /** + * @var Factory + */ + private $iteratorFilter; + + /** + * @var string[] + */ + private $declaredClasses; + + /** + * Constructs a new TestSuite:. + * + * - PHPUnit\Framework\TestSuite() constructs an empty TestSuite. + * + * - PHPUnit\Framework\TestSuite(ReflectionClass) constructs a + * TestSuite from the given class. + * + * - PHPUnit\Framework\TestSuite(ReflectionClass, String) + * constructs a TestSuite from the given class with the given + * name. + * + * - PHPUnit\Framework\TestSuite(String) either constructs a + * TestSuite from the given class (if the passed string is the + * name of an existing class) or constructs an empty TestSuite + * with the given name. + * + * @param ReflectionClass|string $theClass + * + * @throws Exception + */ + public function __construct($theClass = '', string $name = '') + { + if (!is_string($theClass) && !$theClass instanceof ReflectionClass) { + throw InvalidArgumentException::create( + 1, + 'ReflectionClass object or string' + ); + } + + $this->declaredClasses = get_declared_classes(); + + if (!$theClass instanceof ReflectionClass) { + if (class_exists($theClass, true)) { + if ($name === '') { + $name = $theClass; + } + + try { + $theClass = new ReflectionClass($theClass); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } else { + $this->setName($theClass); + + return; + } + } + + if (!$theClass->isSubclassOf(TestCase::class)) { + $this->setName((string) $theClass); + + return; + } + + if ($name !== '') { + $this->setName($name); + } else { + $this->setName($theClass->getName()); + } + + $constructor = $theClass->getConstructor(); + + if ($constructor !== null && + !$constructor->isPublic()) { + $this->addTest( + new WarningTestCase( + sprintf( + 'Class "%s" has no public constructor.', + $theClass->getName() + ) + ) + ); + + return; + } + + foreach ($theClass->getMethods() as $method) { + if ($method->getDeclaringClass()->getName() === Assert::class) { + continue; + } + + if ($method->getDeclaringClass()->getName() === TestCase::class) { + continue; + } + + if (!TestUtil::isTestMethod($method)) { + continue; + } + + $this->addTestMethod($theClass, $method); + } + + if (empty($this->tests)) { + $this->addTest( + new WarningTestCase( + sprintf( + 'No tests found in class "%s".', + $theClass->getName() + ) + ) + ); + } + + $this->testCase = true; + } + + /** + * Returns a string representation of the test suite. + */ + public function toString(): string + { + return $this->getName(); + } + + /** + * Adds a test to the suite. + * + * @param array $groups + */ + public function addTest(Test $test, $groups = []): void + { + try { + $class = new ReflectionClass($test); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (!$class->isAbstract()) { + $this->tests[] = $test; + $this->numTests = -1; + + if ($test instanceof self && empty($groups)) { + $groups = $test->getGroups(); + } + + if (empty($groups)) { + $groups = ['default']; + } + + foreach ($groups as $group) { + if (!isset($this->groups[$group])) { + $this->groups[$group] = [$test]; + } else { + $this->groups[$group][] = $test; + } + } + + if ($test instanceof TestCase) { + $test->setGroups($groups); + } + } + } + + /** + * Adds the tests from the given class to the suite. + * + * @param object|string $testClass + * + * @throws Exception + */ + public function addTestSuite($testClass): void + { + if (!(is_object($testClass) || (is_string($testClass) && class_exists($testClass)))) { + throw InvalidArgumentException::create( + 1, + 'class name or object' + ); + } + + if (!is_object($testClass)) { + try { + $testClass = new ReflectionClass($testClass); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } + + if ($testClass instanceof self) { + $this->addTest($testClass); + } elseif ($testClass instanceof ReflectionClass) { + $suiteMethod = false; + + if (!$testClass->isAbstract() && $testClass->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { + try { + $method = $testClass->getMethod( + BaseTestRunner::SUITE_METHODNAME + ); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($method->isStatic()) { + $this->addTest( + $method->invoke(null, $testClass->getName()) + ); + + $suiteMethod = true; + } + } + + if (!$suiteMethod && !$testClass->isAbstract() && $testClass->isSubclassOf(TestCase::class)) { + $this->addTest(new self($testClass)); + } + } else { + throw new Exception; + } + } + + /** + * Wraps both addTest() and addTestSuite + * as well as the separate import statements for the user's convenience. + * + * If the named file cannot be read or there are no new tests that can be + * added, a PHPUnit\Framework\WarningTestCase will be created instead, + * leaving the current test run untouched. + * + * @throws Exception + */ + public function addTestFile(string $filename): void + { + if (file_exists($filename) && substr($filename, -5) === '.phpt') { + $this->addTest( + new PhptTestCase($filename) + ); + + return; + } + + // The given file may contain further stub classes in addition to the + // test class itself. Figure out the actual test class. + $filename = FileLoader::checkAndLoad($filename); + $newClasses = array_diff(get_declared_classes(), $this->declaredClasses); + + // The diff is empty in case a parent class (with test methods) is added + // AFTER a child class that inherited from it. To account for that case, + // accumulate all discovered classes, so the parent class may be found in + // a later invocation. + if (!empty($newClasses)) { + // On the assumption that test classes are defined first in files, + // process discovered classes in approximate LIFO order, so as to + // avoid unnecessary reflection. + $this->foundClasses = array_merge($newClasses, $this->foundClasses); + $this->declaredClasses = get_declared_classes(); + } + + // The test class's name must match the filename, either in full, or as + // a PEAR/PSR-0 prefixed short name ('NameSpace_ShortName'), or as a + // PSR-1 local short name ('NameSpace\ShortName'). The comparison must be + // anchored to prevent false-positive matches (e.g., 'OtherShortName'). + $shortName = basename($filename, '.php'); + $shortNameRegEx = '/(?:^|_|\\\\)' . preg_quote($shortName, '/') . '$/'; + + foreach ($this->foundClasses as $i => $className) { + if (preg_match($shortNameRegEx, $className)) { + try { + $class = new ReflectionClass($className); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($class->getFileName() == $filename) { + $newClasses = [$className]; + unset($this->foundClasses[$i]); + + break; + } + } + } + + foreach ($newClasses as $className) { + try { + $class = new ReflectionClass($className); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (dirname($class->getFileName()) === __DIR__) { + continue; + } + + if (!$class->isAbstract()) { + if ($class->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { + try { + $method = $class->getMethod( + BaseTestRunner::SUITE_METHODNAME + ); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($method->isStatic()) { + $this->addTest($method->invoke(null, $className)); + } + } elseif ($class->implementsInterface(Test::class)) { + $this->addTestSuite($class); + } + } + } + + $this->numTests = -1; + } + + /** + * Wrapper for addTestFile() that adds multiple test files. + * + * @throws Exception + */ + public function addTestFiles(iterable $fileNames): void + { + foreach ($fileNames as $filename) { + $this->addTestFile((string) $filename); + } + } + + /** + * Counts the number of test cases that will be run by this test. + */ + public function count(bool $preferCache = false): int + { + if ($preferCache && $this->cachedNumTests !== null) { + return $this->cachedNumTests; + } + + $numTests = 0; + + foreach ($this as $test) { + $numTests += count($test); + } + + $this->cachedNumTests = $numTests; + + return $numTests; + } + + /** + * Returns the name of the suite. + */ + public function getName(): string + { + return $this->name; + } + + /** + * Returns the test groups of the suite. + */ + public function getGroups(): array + { + return array_keys($this->groups); + } + + public function getGroupDetails(): array + { + return $this->groups; + } + + /** + * Set tests groups of the test case. + */ + public function setGroupDetails(array $groups): void + { + $this->groups = $groups; + } + + /** + * Runs the tests and collects their result in a TestResult. + * + * @throws \PHPUnit\Framework\CodeCoverageException + * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException + * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException + * @throws \SebastianBergmann\CodeCoverage\MissingCoversAnnotationException + * @throws \SebastianBergmann\CodeCoverage\RuntimeException + * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Warning + */ + public function run(TestResult $result = null): TestResult + { + if ($result === null) { + $result = $this->createResult(); + } + + if (count($this) === 0) { + return $result; + } + + /** @psalm-var class-string $className */ + $className = $this->name; + $hookMethods = TestUtil::getHookMethods($className); + + $result->startTestSuite($this); + + try { + foreach ($hookMethods['beforeClass'] as $beforeClassMethod) { + if ($this->testCase && + class_exists($this->name, false) && + method_exists($this->name, $beforeClassMethod)) { + if ($missingRequirements = TestUtil::getMissingRequirements($this->name, $beforeClassMethod)) { + $this->markTestSuiteSkipped(implode(PHP_EOL, $missingRequirements)); + } + + call_user_func([$this->name, $beforeClassMethod]); + } + } + } catch (SkippedTestSuiteError $error) { + foreach ($this->tests() as $test) { + $result->startTest($test); + $result->addFailure($test, $error, 0); + $result->endTest($test, 0); + } + + $result->endTestSuite($this); + + return $result; + } catch (Throwable $t) { + $errorAdded = false; + + foreach ($this->tests() as $test) { + if ($result->shouldStop()) { + break; + } + + $result->startTest($test); + + if (!$errorAdded) { + $result->addError($test, $t, 0); + + $errorAdded = true; + } else { + $result->addFailure( + $test, + new SkippedTestError('Test skipped because of an error in hook method'), + 0 + ); + } + + $result->endTest($test, 0); + } + + $result->endTestSuite($this); + + return $result; + } + + foreach ($this as $test) { + if ($result->shouldStop()) { + break; + } + + if ($test instanceof TestCase || $test instanceof self) { + $test->setBeStrictAboutChangesToGlobalState($this->beStrictAboutChangesToGlobalState); + $test->setBackupGlobals($this->backupGlobals); + $test->setBackupStaticAttributes($this->backupStaticAttributes); + $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess); + } + + $test->run($result); + } + + try { + foreach ($hookMethods['afterClass'] as $afterClassMethod) { + if ($this->testCase && + class_exists($this->name, false) && + method_exists($this->name, $afterClassMethod)) { + call_user_func([$this->name, $afterClassMethod]); + } + } + } catch (Throwable $t) { + $message = "Exception in {$this->name}::{$afterClassMethod}" . PHP_EOL . $t->getMessage(); + $error = new SyntheticError($message, 0, $t->getFile(), $t->getLine(), $t->getTrace()); + + $placeholderTest = clone $test; + $placeholderTest->setName($afterClassMethod); + + $result->startTest($placeholderTest); + $result->addFailure($placeholderTest, $error, 0); + $result->endTest($placeholderTest, 0); + } + + $result->endTestSuite($this); + + return $result; + } + + public function setRunTestInSeparateProcess(bool $runTestInSeparateProcess): void + { + $this->runTestInSeparateProcess = $runTestInSeparateProcess; + } + + public function setName(string $name): void + { + $this->name = $name; + } + + /** + * Returns the test at the given index. + * + * @return false|Test + */ + public function testAt(int $index) + { + return $this->tests[$index] ?? false; + } + + /** + * Returns the tests as an enumeration. + * + * @return Test[] + */ + public function tests(): array + { + return $this->tests; + } + + /** + * Set tests of the test suite. + * + * @param Test[] $tests + */ + public function setTests(array $tests): void + { + $this->tests = $tests; + } + + /** + * Mark the test suite as skipped. + * + * @param string $message + * + * @throws SkippedTestSuiteError + * + * @psalm-return never-return + */ + public function markTestSuiteSkipped($message = ''): void + { + throw new SkippedTestSuiteError($message); + } + + /** + * @param bool $beStrictAboutChangesToGlobalState + */ + public function setBeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState): void + { + if (null === $this->beStrictAboutChangesToGlobalState && is_bool($beStrictAboutChangesToGlobalState)) { + $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState; + } + } + + /** + * @param bool $backupGlobals + */ + public function setBackupGlobals($backupGlobals): void + { + if (null === $this->backupGlobals && is_bool($backupGlobals)) { + $this->backupGlobals = $backupGlobals; + } + } + + /** + * @param bool $backupStaticAttributes + */ + public function setBackupStaticAttributes($backupStaticAttributes): void + { + if (null === $this->backupStaticAttributes && is_bool($backupStaticAttributes)) { + $this->backupStaticAttributes = $backupStaticAttributes; + } + } + + /** + * Returns an iterator for this test suite. + */ + public function getIterator(): Iterator + { + $iterator = new TestSuiteIterator($this); + + if ($this->iteratorFilter !== null) { + $iterator = $this->iteratorFilter->factory($iterator, $this); + } + + return $iterator; + } + + public function injectFilter(Factory $filter): void + { + $this->iteratorFilter = $filter; + + foreach ($this as $test) { + if ($test instanceof self) { + $test->injectFilter($filter); + } + } + } + + /** + * Creates a default TestResult object. + */ + protected function createResult(): TestResult + { + return new TestResult; + } + + /** + * @throws Exception + */ + protected function addTestMethod(ReflectionClass $class, ReflectionMethod $method): void + { + if (!TestUtil::isTestMethod($method)) { + return; + } + + $methodName = $method->getName(); + + $test = (new TestBuilder)->build($class, $methodName); + + if ($test instanceof TestCase || $test instanceof DataProviderTestSuite) { + $test->setDependencies( + TestUtil::getDependencies($class->getName(), $methodName) + ); + } + + $this->addTest( + $test, + TestUtil::getGroups($class->getName(), $methodName) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php new file mode 100644 index 0000000000..e351622f39 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +use function assert; +use function count; +use RecursiveIterator; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestSuiteIterator implements RecursiveIterator +{ + /** + * @var int + */ + private $position = 0; + + /** + * @var Test[] + */ + private $tests; + + public function __construct(TestSuite $testSuite) + { + $this->tests = $testSuite->tests(); + } + + public function rewind(): void + { + $this->position = 0; + } + + public function valid(): bool + { + return $this->position < count($this->tests); + } + + public function key(): int + { + return $this->position; + } + + public function current(): Test + { + return $this->tests[$this->position]; + } + + public function next(): void + { + $this->position++; + } + + /** + * @throws NoChildTestSuiteException + */ + public function getChildren(): self + { + if (!$this->hasChildren()) { + throw new NoChildTestSuiteException( + 'The current item is not a TestSuite instance and therefore does not have any children.' + ); + } + + $current = $this->current(); + + assert($current instanceof TestSuite); + + return new self($current); + } + + public function hasChildren(): bool + { + return $this->valid() && $this->current() instanceof TestSuite; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php new file mode 100644 index 0000000000..e1e41bc44b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class WarningTestCase extends TestCase +{ + /** + * @var bool + */ + protected $backupGlobals = false; + + /** + * @var bool + */ + protected $backupStaticAttributes = false; + + /** + * @var bool + */ + protected $runTestInSeparateProcess = false; + + /** + * @var string + */ + private $message; + + public function __construct(string $message = '') + { + $this->message = $message; + + parent::__construct('Warning'); + } + + public function getMessage(): string + { + return $this->message; + } + + /** + * Returns a string representation of the test case. + */ + public function toString(): string + { + return 'Warning'; + } + + /** + * @throws Exception + * + * @psalm-return never-return + */ + protected function runTest(): void + { + throw new Warning($this->message); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php new file mode 100644 index 0000000000..3e5e0f71c4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php @@ -0,0 +1,160 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use function is_dir; +use function is_file; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestSuite; +use ReflectionClass; +use ReflectionException; +use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +abstract class BaseTestRunner +{ + /** + * @var int + */ + public const STATUS_UNKNOWN = -1; + + /** + * @var int + */ + public const STATUS_PASSED = 0; + + /** + * @var int + */ + public const STATUS_SKIPPED = 1; + + /** + * @var int + */ + public const STATUS_INCOMPLETE = 2; + + /** + * @var int + */ + public const STATUS_FAILURE = 3; + + /** + * @var int + */ + public const STATUS_ERROR = 4; + + /** + * @var int + */ + public const STATUS_RISKY = 5; + + /** + * @var int + */ + public const STATUS_WARNING = 6; + + /** + * @var string + */ + public const SUITE_METHODNAME = 'suite'; + + /** + * Returns the loader to be used. + */ + public function getLoader(): TestSuiteLoader + { + return new StandardTestSuiteLoader; + } + + /** + * Returns the Test corresponding to the given suite. + * This is a template method, subclasses override + * the runFailed() and clearStatus() methods. + * + * @param string|string[] $suffixes + * + * @throws Exception + */ + public function getTest(string $suiteClassName, string $suiteClassFile = '', $suffixes = ''): ?Test + { + if (empty($suiteClassFile) && is_dir($suiteClassName) && !is_file($suiteClassName . '.php')) { + /** @var string[] $files */ + $files = (new FileIteratorFacade)->getFilesAsArray( + $suiteClassName, + $suffixes + ); + + $suite = new TestSuite($suiteClassName); + $suite->addTestFiles($files); + + return $suite; + } + + try { + $testClass = $this->loadSuiteClass( + $suiteClassName, + $suiteClassFile + ); + } catch (Exception $e) { + $this->runFailed($e->getMessage()); + + return null; + } + + try { + $suiteMethod = $testClass->getMethod(self::SUITE_METHODNAME); + + if (!$suiteMethod->isStatic()) { + $this->runFailed( + 'suite() method must be static.' + ); + + return null; + } + + $test = $suiteMethod->invoke(null, $testClass->getName()); + } catch (ReflectionException $e) { + try { + $test = new TestSuite($testClass); + } catch (Exception $e) { + $test = new TestSuite; + $test->setName($suiteClassName); + } + } + + $this->clearStatus(); + + return $test; + } + + /** + * Returns the loaded ReflectionClass for a suite name. + */ + protected function loadSuiteClass(string $suiteClassName, string $suiteClassFile = ''): ReflectionClass + { + return $this->getLoader()->load($suiteClassName, $suiteClassFile); + } + + /** + * Clears the status message. + */ + protected function clearStatus(): void + { + } + + /** + * Override to define how to handle a failed loading of + * a test suite. + */ + abstract protected function runFailed(string $message): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php new file mode 100644 index 0000000000..906a28f6d5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php @@ -0,0 +1,233 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use const DIRECTORY_SEPARATOR; +use function assert; +use function defined; +use function dirname; +use function file_get_contents; +use function file_put_contents; +use function in_array; +use function is_dir; +use function is_file; +use function is_float; +use function is_int; +use function is_string; +use function serialize; +use function sprintf; +use function unserialize; +use PHPUnit\Util\ErrorHandler; +use PHPUnit\Util\Filesystem; +use Serializable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class DefaultTestResultCache implements Serializable, TestResultCache +{ + /** + * @var string + */ + public const DEFAULT_RESULT_CACHE_FILENAME = '.phpunit.result.cache'; + + /** + * Provide extra protection against incomplete or corrupt caches. + * + * @var int[] + */ + private const ALLOWED_CACHE_TEST_STATUSES = [ + BaseTestRunner::STATUS_SKIPPED, + BaseTestRunner::STATUS_INCOMPLETE, + BaseTestRunner::STATUS_FAILURE, + BaseTestRunner::STATUS_ERROR, + BaseTestRunner::STATUS_RISKY, + BaseTestRunner::STATUS_WARNING, + ]; + + /** + * Path and filename for result cache file. + * + * @var string + */ + private $cacheFilename; + + /** + * The list of defective tests. + * + * + * // Mark a test skipped + * $this->defects[$testName] = BaseTestRunner::TEST_SKIPPED; + * + * + * @var array + */ + private $defects = []; + + /** + * The list of execution duration of suites and tests (in seconds). + * + * + * // Record running time for test + * $this->times[$testName] = 1.234; + * + * + * @var array + */ + private $times = []; + + public function __construct(?string $filepath = null) + { + if ($filepath !== null && is_dir($filepath)) { + // cache path provided, use default cache filename in that location + $filepath .= DIRECTORY_SEPARATOR . self::DEFAULT_RESULT_CACHE_FILENAME; + } + + $this->cacheFilename = $filepath ?? $_ENV['PHPUNIT_RESULT_CACHE'] ?? self::DEFAULT_RESULT_CACHE_FILENAME; + } + + /** + * @throws Exception + */ + public function persist(): void + { + $this->saveToFile(); + } + + /** + * @throws Exception + */ + public function saveToFile(): void + { + if (defined('PHPUNIT_TESTSUITE_RESULTCACHE')) { + return; + } + + if (!Filesystem::createDirectory(dirname($this->cacheFilename))) { + throw new Exception( + sprintf( + 'Cannot create directory "%s" for result cache file', + $this->cacheFilename + ) + ); + } + + file_put_contents( + $this->cacheFilename, + serialize($this) + ); + } + + public function setState(string $testName, int $state): void + { + if ($state !== BaseTestRunner::STATUS_PASSED) { + $this->defects[$testName] = $state; + } + } + + public function getState(string $testName): int + { + return $this->defects[$testName] ?? BaseTestRunner::STATUS_UNKNOWN; + } + + public function setTime(string $testName, float $time): void + { + $this->times[$testName] = $time; + } + + public function getTime(string $testName): float + { + return $this->times[$testName] ?? 0.0; + } + + public function load(): void + { + $this->clear(); + + if (!is_file($this->cacheFilename)) { + return; + } + + $cacheData = @file_get_contents($this->cacheFilename); + + // @codeCoverageIgnoreStart + if ($cacheData === false) { + return; + } + // @codeCoverageIgnoreEnd + + $cache = ErrorHandler::invokeIgnoringWarnings( + static function () use ($cacheData) { + return @unserialize($cacheData, ['allowed_classes' => [self::class]]); + } + ); + + if ($cache === false) { + return; + } + + if ($cache instanceof self) { + /* @var DefaultTestResultCache $cache */ + $cache->copyStateToCache($this); + } + } + + public function copyStateToCache(self $targetCache): void + { + foreach ($this->defects as $name => $state) { + $targetCache->setState($name, $state); + } + + foreach ($this->times as $name => $time) { + $targetCache->setTime($name, $time); + } + } + + public function clear(): void + { + $this->defects = []; + $this->times = []; + } + + public function serialize(): string + { + return serialize([ + 'defects' => $this->defects, + 'times' => $this->times, + ]); + } + + /** + * @param string $serialized + */ + public function unserialize($serialized): void + { + $data = unserialize($serialized); + + if (isset($data['times'])) { + foreach ($data['times'] as $testName => $testTime) { + assert(is_string($testName)); + assert(is_float($testTime)); + $this->times[$testName] = $testTime; + } + } + + if (isset($data['defects'])) { + foreach ($data['defects'] as $testName => $testResult) { + assert(is_string($testName)); + assert(is_int($testResult)); + + if (in_array($testResult, self::ALLOWED_CACHE_TEST_STATUSES, true)) { + $this->defects[$testName] = $testResult; + } + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Exception.php new file mode 100644 index 0000000000..adcd115580 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Exception.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use RuntimeException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Exception extends RuntimeException implements \PHPUnit\Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php new file mode 100644 index 0000000000..4b26e5716e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/ExcludeGroupFilterIterator.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner\Filter; + +use function in_array; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ExcludeGroupFilterIterator extends GroupFilterIterator +{ + protected function doAccept(string $hash): bool + { + return !in_array($hash, $this->groupTests, true); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php new file mode 100644 index 0000000000..82dc1b7e0f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner\Filter; + +use function sprintf; +use FilterIterator; +use InvalidArgumentException; +use Iterator; +use PHPUnit\Framework\TestSuite; +use RecursiveFilterIterator; +use ReflectionClass; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Factory +{ + /** + * @var array + */ + private $filters = []; + + /** + * @throws InvalidArgumentException + */ + public function addFilter(ReflectionClass $filter, $args): void + { + if (!$filter->isSubclassOf(RecursiveFilterIterator::class)) { + throw new InvalidArgumentException( + sprintf( + 'Class "%s" does not extend RecursiveFilterIterator', + $filter->name + ) + ); + } + + $this->filters[] = [$filter, $args]; + } + + public function factory(Iterator $iterator, TestSuite $suite): FilterIterator + { + foreach ($this->filters as $filter) { + [$class, $args] = $filter; + $iterator = $class->newInstance($iterator, $args, $suite); + } + + return $iterator; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php new file mode 100644 index 0000000000..42ca77a381 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner\Filter; + +use function array_map; +use function array_merge; +use function in_array; +use function spl_object_hash; +use PHPUnit\Framework\TestSuite; +use RecursiveFilterIterator; +use RecursiveIterator; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +abstract class GroupFilterIterator extends RecursiveFilterIterator +{ + /** + * @var string[] + */ + protected $groupTests = []; + + public function __construct(RecursiveIterator $iterator, array $groups, TestSuite $suite) + { + parent::__construct($iterator); + + foreach ($suite->getGroupDetails() as $group => $tests) { + if (in_array((string) $group, $groups, true)) { + $testHashes = array_map( + 'spl_object_hash', + $tests + ); + + $this->groupTests = array_merge($this->groupTests, $testHashes); + } + } + } + + public function accept(): bool + { + $test = $this->getInnerIterator()->current(); + + if ($test instanceof TestSuite) { + return true; + } + + return $this->doAccept(spl_object_hash($test)); + } + + abstract protected function doAccept(string $hash); +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php new file mode 100644 index 0000000000..0346c60131 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/IncludeGroupFilterIterator.php @@ -0,0 +1,23 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner\Filter; + +use function in_array; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class IncludeGroupFilterIterator extends GroupFilterIterator +{ + protected function doAccept(string $hash): bool + { + return in_array($hash, $this->groupTests, true); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php new file mode 100644 index 0000000000..d90054d84c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php @@ -0,0 +1,135 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner\Filter; + +use function end; +use function implode; +use function preg_match; +use function sprintf; +use function str_replace; +use Exception; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\WarningTestCase; +use PHPUnit\Util\RegularExpression; +use RecursiveFilterIterator; +use RecursiveIterator; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class NameFilterIterator extends RecursiveFilterIterator +{ + /** + * @var string + */ + private $filter; + + /** + * @var int + */ + private $filterMin; + + /** + * @var int + */ + private $filterMax; + + /** + * @throws Exception + */ + public function __construct(RecursiveIterator $iterator, string $filter) + { + parent::__construct($iterator); + + $this->setFilter($filter); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function accept(): bool + { + $test = $this->getInnerIterator()->current(); + + if ($test instanceof TestSuite) { + return true; + } + + $tmp = \PHPUnit\Util\Test::describe($test); + + if ($test instanceof WarningTestCase) { + $name = $test->getMessage(); + } elseif ($tmp[0] !== '') { + $name = implode('::', $tmp); + } else { + $name = $tmp[1]; + } + + $accepted = @preg_match($this->filter, $name, $matches); + + if ($accepted && isset($this->filterMax)) { + $set = end($matches); + $accepted = $set >= $this->filterMin && $set <= $this->filterMax; + } + + return (bool) $accepted; + } + + /** + * @throws Exception + */ + private function setFilter(string $filter): void + { + if (RegularExpression::safeMatch($filter, '') === false) { + // Handles: + // * testAssertEqualsSucceeds#4 + // * testAssertEqualsSucceeds#4-8 + if (preg_match('/^(.*?)#(\d+)(?:-(\d+))?$/', $filter, $matches)) { + if (isset($matches[3]) && $matches[2] < $matches[3]) { + $filter = sprintf( + '%s.*with data set #(\d+)$', + $matches[1] + ); + + $this->filterMin = (int) $matches[2]; + $this->filterMax = (int) $matches[3]; + } else { + $filter = sprintf( + '%s.*with data set #%s$', + $matches[1], + $matches[2] + ); + } + } // Handles: + // * testDetermineJsonError@JSON_ERROR_NONE + // * testDetermineJsonError@JSON.* + elseif (preg_match('/^(.*?)@(.+)$/', $filter, $matches)) { + $filter = sprintf( + '%s.*with data set "%s"$', + $matches[1], + $matches[2] + ); + } + + // Escape delimiters in regular expression. Do NOT use preg_quote, + // to keep magic characters. + $filter = sprintf( + '/%s/i', + str_replace( + '/', + '\\/', + $filter + ) + ); + } + + $this->filter = $filter; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php new file mode 100644 index 0000000000..35ded5d09d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterIncompleteTestHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterIncompleteTestHook extends TestHook +{ + public function executeAfterIncompleteTest(string $test, string $message, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php new file mode 100644 index 0000000000..7dee9f9e8b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterLastTestHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterLastTestHook extends Hook +{ + public function executeAfterLastTest(): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php new file mode 100644 index 0000000000..7fe9ee72ec --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterRiskyTestHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterRiskyTestHook extends TestHook +{ + public function executeAfterRiskyTest(string $test, string $message, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php new file mode 100644 index 0000000000..f9253b5ba4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSkippedTestHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterSkippedTestHook extends TestHook +{ + public function executeAfterSkippedTest(string $test, string $message, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php new file mode 100644 index 0000000000..6b55cc877e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterSuccessfulTestHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterSuccessfulTestHook extends TestHook +{ + public function executeAfterSuccessfulTest(string $test, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php new file mode 100644 index 0000000000..f5c23fb215 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestErrorHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterTestErrorHook extends TestHook +{ + public function executeAfterTestError(string $test, string $message, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php new file mode 100644 index 0000000000..9ed2939bf1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestFailureHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterTestFailureHook extends TestHook +{ + public function executeAfterTestFailure(string $test, string $message, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php new file mode 100644 index 0000000000..7e0af80b12 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestHook.php @@ -0,0 +1,21 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterTestHook extends TestHook +{ + /** + * This hook will fire after any test, regardless of the result. + * + * For more fine grained control, have a look at the other hooks + * that extend PHPUnit\Runner\Hook. + */ + public function executeAfterTest(string $test, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php new file mode 100644 index 0000000000..12de80f9c9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/AfterTestWarningHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface AfterTestWarningHook extends TestHook +{ + public function executeAfterTestWarning(string $test, string $message, float $time): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php new file mode 100644 index 0000000000..59b6666498 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeFirstTestHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface BeforeFirstTestHook extends Hook +{ + public function executeBeforeFirstTest(): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php new file mode 100644 index 0000000000..8bbf8a99d7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/BeforeTestHook.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface BeforeTestHook extends TestHook +{ + public function executeBeforeTest(string $test): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php new file mode 100644 index 0000000000..546f1a3516 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/Hook.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface Hook +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php new file mode 100644 index 0000000000..47c41f9eba --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestHook.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +interface TestHook extends Hook +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php new file mode 100644 index 0000000000..60fbfba318 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Hook/TestListenerAdapter.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; +use PHPUnit\Util\Test as TestUtil; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestListenerAdapter implements TestListener +{ + /** + * @var TestHook[] + */ + private $hooks = []; + + /** + * @var bool + */ + private $lastTestWasNotSuccessful; + + public function add(TestHook $hook): void + { + $this->hooks[] = $hook; + } + + public function startTest(Test $test): void + { + foreach ($this->hooks as $hook) { + if ($hook instanceof BeforeTestHook) { + $hook->executeBeforeTest(TestUtil::describeAsString($test)); + } + } + + $this->lastTestWasNotSuccessful = false; + } + + public function addError(Test $test, Throwable $t, float $time): void + { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterTestErrorHook) { + $hook->executeAfterTestError(TestUtil::describeAsString($test), $t->getMessage(), $time); + } + } + + $this->lastTestWasNotSuccessful = true; + } + + public function addWarning(Test $test, Warning $e, float $time): void + { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterTestWarningHook) { + $hook->executeAfterTestWarning(TestUtil::describeAsString($test), $e->getMessage(), $time); + } + } + + $this->lastTestWasNotSuccessful = true; + } + + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterTestFailureHook) { + $hook->executeAfterTestFailure(TestUtil::describeAsString($test), $e->getMessage(), $time); + } + } + + $this->lastTestWasNotSuccessful = true; + } + + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterIncompleteTestHook) { + $hook->executeAfterIncompleteTest(TestUtil::describeAsString($test), $t->getMessage(), $time); + } + } + + $this->lastTestWasNotSuccessful = true; + } + + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterRiskyTestHook) { + $hook->executeAfterRiskyTest(TestUtil::describeAsString($test), $t->getMessage(), $time); + } + } + + $this->lastTestWasNotSuccessful = true; + } + + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterSkippedTestHook) { + $hook->executeAfterSkippedTest(TestUtil::describeAsString($test), $t->getMessage(), $time); + } + } + + $this->lastTestWasNotSuccessful = true; + } + + public function endTest(Test $test, float $time): void + { + if (!$this->lastTestWasNotSuccessful) { + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterSuccessfulTestHook) { + $hook->executeAfterSuccessfulTest(TestUtil::describeAsString($test), $time); + } + } + } + + foreach ($this->hooks as $hook) { + if ($hook instanceof AfterTestHook) { + $hook->executeAfterTest(TestUtil::describeAsString($test), $time); + } + } + } + + public function startTestSuite(TestSuite $suite): void + { + } + + public function endTestSuite(TestSuite $suite): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php new file mode 100644 index 0000000000..2aa86534a9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/NullTestResultCache.php @@ -0,0 +1,42 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class NullTestResultCache implements TestResultCache +{ + public function setState(string $testName, int $state): void + { + } + + public function getState(string $testName): int + { + return BaseTestRunner::STATUS_UNKNOWN; + } + + public function setTime(string $testName, float $time): void + { + } + + public function getTime(string $testName): float + { + return 0; + } + + public function load(): void + { + } + + public function persist(): void + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php new file mode 100644 index 0000000000..e29b3dba30 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php @@ -0,0 +1,819 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use const DEBUG_BACKTRACE_IGNORE_ARGS; +use const DIRECTORY_SEPARATOR; +use function array_merge; +use function basename; +use function debug_backtrace; +use function defined; +use function dirname; +use function explode; +use function extension_loaded; +use function file; +use function file_exists; +use function file_get_contents; +use function file_put_contents; +use function is_array; +use function is_file; +use function is_readable; +use function is_string; +use function ltrim; +use function phpversion; +use function preg_match; +use function preg_replace; +use function preg_split; +use function realpath; +use function rtrim; +use function sprintf; +use function str_replace; +use function strncasecmp; +use function strpos; +use function substr; +use function trim; +use function unlink; +use function unserialize; +use function var_export; +use function version_compare; +use PHPUnit\Framework\Assert; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\IncompleteTestError; +use PHPUnit\Framework\PHPTAssertionFailedError; +use PHPUnit\Framework\SelfDescribing; +use PHPUnit\Framework\SkippedTestError; +use PHPUnit\Framework\SyntheticSkippedError; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestResult; +use PHPUnit\Util\PHP\AbstractPhpProcess; +use SebastianBergmann\Timer\Timer; +use Text_Template; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class PhptTestCase implements SelfDescribing, Test +{ + /** + * @var string + */ + private $filename; + + /** + * @var AbstractPhpProcess + */ + private $phpUtil; + + /** + * @var string + */ + private $output = ''; + + /** + * Constructs a test case with the given filename. + * + * @throws Exception + */ + public function __construct(string $filename, AbstractPhpProcess $phpUtil = null) + { + if (!is_file($filename)) { + throw new Exception( + sprintf( + 'File "%s" does not exist.', + $filename + ) + ); + } + + $this->filename = $filename; + $this->phpUtil = $phpUtil ?: AbstractPhpProcess::factory(); + } + + /** + * Counts the number of test cases executed by run(TestResult result). + */ + public function count(): int + { + return 1; + } + + /** + * Runs a test and collects its result in a TestResult instance. + * + * @throws \SebastianBergmann\CodeCoverage\CoveredCodeNotExecutedException + * @throws \SebastianBergmann\CodeCoverage\InvalidArgumentException + * @throws \SebastianBergmann\CodeCoverage\MissingCoversAnnotationException + * @throws \SebastianBergmann\CodeCoverage\RuntimeException + * @throws \SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + */ + public function run(TestResult $result = null): TestResult + { + if ($result === null) { + $result = new TestResult; + } + + try { + $sections = $this->parse(); + } catch (Exception $e) { + $result->startTest($this); + $result->addFailure($this, new SkippedTestError($e->getMessage()), 0); + $result->endTest($this, 0); + + return $result; + } + + $code = $this->render($sections['FILE']); + $xfail = false; + $settings = $this->parseIniSection($this->settings($result->getCollectCodeCoverageInformation())); + + $result->startTest($this); + + if (isset($sections['INI'])) { + $settings = $this->parseIniSection($sections['INI'], $settings); + } + + if (isset($sections['ENV'])) { + $env = $this->parseEnvSection($sections['ENV']); + $this->phpUtil->setEnv($env); + } + + $this->phpUtil->setUseStderrRedirection(true); + + if ($result->enforcesTimeLimit()) { + $this->phpUtil->setTimeout($result->getTimeoutForLargeTests()); + } + + $skip = $this->runSkip($sections, $result, $settings); + + if ($skip) { + return $result; + } + + if (isset($sections['XFAIL'])) { + $xfail = trim($sections['XFAIL']); + } + + if (isset($sections['STDIN'])) { + $this->phpUtil->setStdin($sections['STDIN']); + } + + if (isset($sections['ARGS'])) { + $this->phpUtil->setArgs($sections['ARGS']); + } + + if ($result->getCollectCodeCoverageInformation()) { + $this->renderForCoverage($code); + } + + Timer::start(); + + $jobResult = $this->phpUtil->runJob($code, $this->stringifyIni($settings)); + $time = Timer::stop(); + $this->output = $jobResult['stdout'] ?? ''; + + if ($result->getCollectCodeCoverageInformation() && ($coverage = $this->cleanupForCoverage())) { + $result->getCodeCoverage()->append($coverage, $this, true, [], [], true); + } + + try { + $this->assertPhptExpectation($sections, $this->output); + } catch (AssertionFailedError $e) { + $failure = $e; + + if ($xfail !== false) { + $failure = new IncompleteTestError($xfail, 0, $e); + } elseif ($e instanceof ExpectationFailedException) { + $comparisonFailure = $e->getComparisonFailure(); + + if ($comparisonFailure) { + $diff = $comparisonFailure->getDiff(); + } else { + $diff = $e->getMessage(); + } + + $hint = $this->getLocationHintFromDiff($diff, $sections); + $trace = array_merge($hint, debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); + $failure = new PHPTAssertionFailedError( + $e->getMessage(), + 0, + $trace[0]['file'], + $trace[0]['line'], + $trace, + $comparisonFailure ? $diff : '' + ); + } + + $result->addFailure($this, $failure, $time); + } catch (Throwable $t) { + $result->addError($this, $t, $time); + } + + if ($xfail !== false && $result->allCompletelyImplemented()) { + $result->addFailure($this, new IncompleteTestError('XFAIL section but test passes'), $time); + } + + $this->runClean($sections, $result->getCollectCodeCoverageInformation()); + + $result->endTest($this, $time); + + return $result; + } + + /** + * Returns the name of the test case. + */ + public function getName(): string + { + return $this->toString(); + } + + /** + * Returns a string representation of the test case. + */ + public function toString(): string + { + return $this->filename; + } + + public function usesDataProvider(): bool + { + return false; + } + + public function getNumAssertions(): int + { + return 1; + } + + public function getActualOutput(): string + { + return $this->output; + } + + public function hasOutput(): bool + { + return !empty($this->output); + } + + /** + * Parse --INI-- section key value pairs and return as array. + * + * @param array|string + */ + private function parseIniSection($content, $ini = []): array + { + if (is_string($content)) { + $content = explode("\n", trim($content)); + } + + foreach ($content as $setting) { + if (strpos($setting, '=') === false) { + continue; + } + + $setting = explode('=', $setting, 2); + $name = trim($setting[0]); + $value = trim($setting[1]); + + if ($name === 'extension' || $name === 'zend_extension') { + if (!isset($ini[$name])) { + $ini[$name] = []; + } + + $ini[$name][] = $value; + + continue; + } + + $ini[$name] = $value; + } + + return $ini; + } + + private function parseEnvSection(string $content): array + { + $env = []; + + foreach (explode("\n", trim($content)) as $e) { + $e = explode('=', trim($e), 2); + + if (!empty($e[0]) && isset($e[1])) { + $env[$e[0]] = $e[1]; + } + } + + return $env; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * @throws ExpectationFailedException + */ + private function assertPhptExpectation(array $sections, string $output): void + { + $assertions = [ + 'EXPECT' => 'assertEquals', + 'EXPECTF' => 'assertStringMatchesFormat', + 'EXPECTREGEX' => 'assertRegExp', + ]; + + $actual = preg_replace('/\r\n/', "\n", trim($output)); + + foreach ($assertions as $sectionName => $sectionAssertion) { + if (isset($sections[$sectionName])) { + $sectionContent = preg_replace('/\r\n/', "\n", trim($sections[$sectionName])); + $expected = $sectionName === 'EXPECTREGEX' ? "/{$sectionContent}/" : $sectionContent; + + if ($expected === null) { + throw new Exception('No PHPT expectation found'); + } + + Assert::$sectionAssertion($expected, $actual); + + return; + } + } + + throw new Exception('No PHPT assertion found'); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function runSkip(array &$sections, TestResult $result, array $settings): bool + { + if (!isset($sections['SKIPIF'])) { + return false; + } + + $skipif = $this->render($sections['SKIPIF']); + $jobResult = $this->phpUtil->runJob($skipif, $this->stringifyIni($settings)); + + if (!strncasecmp('skip', ltrim($jobResult['stdout']), 4)) { + $message = ''; + + if (preg_match('/^\s*skip\s*(.+)\s*/i', $jobResult['stdout'], $skipMatch)) { + $message = substr($skipMatch[1], 2); + } + + $hint = $this->getLocationHint($message, $sections, 'SKIPIF'); + $trace = array_merge($hint, debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); + $result->addFailure( + $this, + new SyntheticSkippedError($message, 0, $trace[0]['file'], $trace[0]['line'], $trace), + 0 + ); + $result->endTest($this, 0); + + return true; + } + + return false; + } + + private function runClean(array &$sections, bool $collectCoverage): void + { + $this->phpUtil->setStdin(''); + $this->phpUtil->setArgs(''); + + if (isset($sections['CLEAN'])) { + $cleanCode = $this->render($sections['CLEAN']); + + $this->phpUtil->runJob($cleanCode, $this->settings($collectCoverage)); + } + } + + /** + * @throws Exception + */ + private function parse(): array + { + $sections = []; + $section = ''; + + $unsupportedSections = [ + 'CGI', + 'COOKIE', + 'DEFLATE_POST', + 'EXPECTHEADERS', + 'EXTENSIONS', + 'GET', + 'GZIP_POST', + 'HEADERS', + 'PHPDBG', + 'POST', + 'POST_RAW', + 'PUT', + 'REDIRECTTEST', + 'REQUEST', + ]; + + $lineNr = 0; + + foreach (file($this->filename) as $line) { + $lineNr++; + + if (preg_match('/^--([_A-Z]+)--/', $line, $result)) { + $section = $result[1]; + $sections[$section] = ''; + $sections[$section . '_offset'] = $lineNr; + + continue; + } + + if (empty($section)) { + throw new Exception('Invalid PHPT file: empty section header'); + } + + $sections[$section] .= $line; + } + + if (isset($sections['FILEEOF'])) { + $sections['FILE'] = rtrim($sections['FILEEOF'], "\r\n"); + unset($sections['FILEEOF']); + } + + $this->parseExternal($sections); + + if (!$this->validate($sections)) { + throw new Exception('Invalid PHPT file'); + } + + foreach ($unsupportedSections as $section) { + if (isset($sections[$section])) { + throw new Exception( + "PHPUnit does not support PHPT {$section} sections" + ); + } + } + + return $sections; + } + + /** + * @throws Exception + */ + private function parseExternal(array &$sections): void + { + $allowSections = [ + 'FILE', + 'EXPECT', + 'EXPECTF', + 'EXPECTREGEX', + ]; + $testDirectory = dirname($this->filename) . DIRECTORY_SEPARATOR; + + foreach ($allowSections as $section) { + if (isset($sections[$section . '_EXTERNAL'])) { + $externalFilename = trim($sections[$section . '_EXTERNAL']); + + if (!is_file($testDirectory . $externalFilename) || + !is_readable($testDirectory . $externalFilename)) { + throw new Exception( + sprintf( + 'Could not load --%s-- %s for PHPT file', + $section . '_EXTERNAL', + $testDirectory . $externalFilename + ) + ); + } + + $sections[$section] = file_get_contents($testDirectory . $externalFilename); + } + } + } + + private function validate(array &$sections): bool + { + $requiredSections = [ + 'FILE', + [ + 'EXPECT', + 'EXPECTF', + 'EXPECTREGEX', + ], + ]; + + foreach ($requiredSections as $section) { + if (is_array($section)) { + $foundSection = false; + + foreach ($section as $anySection) { + if (isset($sections[$anySection])) { + $foundSection = true; + + break; + } + } + + if (!$foundSection) { + return false; + } + + continue; + } + + if (!isset($sections[$section])) { + return false; + } + } + + return true; + } + + private function render(string $code): string + { + return str_replace( + [ + '__DIR__', + '__FILE__', + ], + [ + "'" . dirname($this->filename) . "'", + "'" . $this->filename . "'", + ], + $code + ); + } + + private function getCoverageFiles(): array + { + $baseDir = dirname(realpath($this->filename)) . DIRECTORY_SEPARATOR; + $basename = basename($this->filename, 'phpt'); + + return [ + 'coverage' => $baseDir . $basename . 'coverage', + 'job' => $baseDir . $basename . 'php', + ]; + } + + private function renderForCoverage(string &$job): void + { + $files = $this->getCoverageFiles(); + + $template = new Text_Template( + __DIR__ . '/../Util/PHP/Template/PhptTestCase.tpl' + ); + + $composerAutoload = '\'\''; + + if (defined('PHPUNIT_COMPOSER_INSTALL') && !defined('PHPUNIT_TESTSUITE')) { + $composerAutoload = var_export(PHPUNIT_COMPOSER_INSTALL, true); + } + + $phar = '\'\''; + + if (defined('__PHPUNIT_PHAR__')) { + $phar = var_export(__PHPUNIT_PHAR__, true); + } + + $globals = ''; + + if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { + $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export( + $GLOBALS['__PHPUNIT_BOOTSTRAP'], + true + ) . ";\n"; + } + + $template->setVar( + [ + 'composerAutoload' => $composerAutoload, + 'phar' => $phar, + 'globals' => $globals, + 'job' => $files['job'], + 'coverageFile' => $files['coverage'], + ] + ); + + file_put_contents($files['job'], $job); + $job = $template->render(); + } + + private function cleanupForCoverage(): array + { + $coverage = []; + $files = $this->getCoverageFiles(); + + if (file_exists($files['coverage'])) { + $buffer = @file_get_contents($files['coverage']); + + if ($buffer !== false) { + $coverage = @unserialize($buffer); + + if ($coverage === false) { + $coverage = []; + } + } + } + + foreach ($files as $file) { + @unlink($file); + } + + return $coverage; + } + + private function stringifyIni(array $ini): array + { + $settings = []; + + foreach ($ini as $key => $value) { + if (is_array($value)) { + foreach ($value as $val) { + $settings[] = $key . '=' . $val; + } + + continue; + } + + $settings[] = $key . '=' . $value; + } + + return $settings; + } + + private function getLocationHintFromDiff(string $message, array $sections): array + { + $needle = ''; + $previousLine = ''; + $block = 'message'; + + foreach (preg_split('/\r\n|\r|\n/', $message) as $line) { + $line = trim($line); + + if ($block === 'message' && $line === '--- Expected') { + $block = 'expected'; + } + + if ($block === 'expected' && $line === '@@ @@') { + $block = 'diff'; + } + + if ($block === 'diff') { + if (strpos($line, '+') === 0) { + $needle = $this->getCleanDiffLine($previousLine); + + break; + } + + if (strpos($line, '-') === 0) { + $needle = $this->getCleanDiffLine($line); + + break; + } + } + + if (!empty($line)) { + $previousLine = $line; + } + } + + return $this->getLocationHint($needle, $sections); + } + + private function getCleanDiffLine(string $line): string + { + if (preg_match('/^[\-+]([\'\"]?)(.*)\1$/', $line, $matches)) { + $line = $matches[2]; + } + + return $line; + } + + private function getLocationHint(string $needle, array $sections, ?string $sectionName = null): array + { + $needle = trim($needle); + + if (empty($needle)) { + return [[ + 'file' => realpath($this->filename), + 'line' => 1, + ]]; + } + + if ($sectionName) { + $search = [$sectionName]; + } else { + $search = [ + // 'FILE', + 'EXPECT', + 'EXPECTF', + 'EXPECTREGEX', + ]; + } + + foreach ($search as $section) { + if (!isset($sections[$section])) { + continue; + } + + if (isset($sections[$section . '_EXTERNAL'])) { + $externalFile = trim($sections[$section . '_EXTERNAL']); + + return [ + [ + 'file' => realpath(dirname($this->filename) . DIRECTORY_SEPARATOR . $externalFile), + 'line' => 1, + ], + [ + 'file' => realpath($this->filename), + 'line' => ($sections[$section . '_EXTERNAL_offset'] ?? 0) + 1, + ], + ]; + } + + $sectionOffset = $sections[$section . '_offset'] ?? 0; + $offset = $sectionOffset + 1; + + foreach (preg_split('/\r\n|\r|\n/', $sections[$section]) as $line) { + if (strpos($line, $needle) !== false) { + return [[ + 'file' => realpath($this->filename), + 'line' => $offset, + ]]; + } + $offset++; + } + } + + if ($sectionName) { + // String not found in specified section, show user the start of the named section + return [[ + 'file' => realpath($this->filename), + 'line' => $sectionOffset, + ]]; + } + + // No section specified, show user start of code + return [[ + 'file' => realpath($this->filename), + 'line' => 1, + ]]; + } + + /** + * @psalm-return list + */ + private function settings(bool $collectCoverage): array + { + $settings = [ + 'allow_url_fopen=1', + 'auto_append_file=', + 'auto_prepend_file=', + 'disable_functions=', + 'display_errors=1', + 'docref_ext=.html', + 'docref_root=', + 'error_append_string=', + 'error_prepend_string=', + 'error_reporting=-1', + 'html_errors=0', + 'log_errors=0', + 'open_basedir=', + 'output_buffering=Off', + 'output_handler=', + 'report_memleaks=0', + 'report_zend_debug=0', + ]; + + if (extension_loaded('pcov')) { + if ($collectCoverage) { + $settings[] = 'pcov.enabled=1'; + } else { + $settings[] = 'pcov.enabled=0'; + } + } + + if (extension_loaded('xdebug')) { + if (version_compare(phpversion('xdebug'), '3', '>=')) { + if ($collectCoverage) { + $settings[] = 'xdebug.mode=coverage'; + } else { + $settings[] = 'xdebug.mode=off'; + } + } else { + $settings[] = 'xdebug.default_enable=0'; + + if ($collectCoverage) { + $settings[] = 'xdebug.coverage_enable=1'; + } + } + } + + return $settings; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php new file mode 100644 index 0000000000..31d7610e2b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/ResultCacheExtension.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use function preg_match; +use function round; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ResultCacheExtension implements AfterIncompleteTestHook, AfterLastTestHook, AfterRiskyTestHook, AfterSkippedTestHook, AfterSuccessfulTestHook, AfterTestErrorHook, AfterTestFailureHook, AfterTestWarningHook +{ + /** + * @var TestResultCache + */ + private $cache; + + public function __construct(TestResultCache $cache) + { + $this->cache = $cache; + } + + public function flush(): void + { + $this->cache->persist(); + } + + public function executeAfterSuccessfulTest(string $test, float $time): void + { + $testName = $this->getTestName($test); + + $this->cache->setTime($testName, round($time, 3)); + } + + public function executeAfterIncompleteTest(string $test, string $message, float $time): void + { + $testName = $this->getTestName($test); + + $this->cache->setTime($testName, round($time, 3)); + $this->cache->setState($testName, BaseTestRunner::STATUS_INCOMPLETE); + } + + public function executeAfterRiskyTest(string $test, string $message, float $time): void + { + $testName = $this->getTestName($test); + + $this->cache->setTime($testName, round($time, 3)); + $this->cache->setState($testName, BaseTestRunner::STATUS_RISKY); + } + + public function executeAfterSkippedTest(string $test, string $message, float $time): void + { + $testName = $this->getTestName($test); + + $this->cache->setTime($testName, round($time, 3)); + $this->cache->setState($testName, BaseTestRunner::STATUS_SKIPPED); + } + + public function executeAfterTestError(string $test, string $message, float $time): void + { + $testName = $this->getTestName($test); + + $this->cache->setTime($testName, round($time, 3)); + $this->cache->setState($testName, BaseTestRunner::STATUS_ERROR); + } + + public function executeAfterTestFailure(string $test, string $message, float $time): void + { + $testName = $this->getTestName($test); + + $this->cache->setTime($testName, round($time, 3)); + $this->cache->setState($testName, BaseTestRunner::STATUS_FAILURE); + } + + public function executeAfterTestWarning(string $test, string $message, float $time): void + { + $testName = $this->getTestName($test); + + $this->cache->setTime($testName, round($time, 3)); + $this->cache->setState($testName, BaseTestRunner::STATUS_WARNING); + } + + public function executeAfterLastTest(): void + { + $this->flush(); + } + + /** + * @param string $test A long description format of the current test + * + * @return string The test name without TestSuiteClassName:: and @dataprovider details + */ + private function getTestName(string $test): string + { + $matches = []; + + if (preg_match('/^(?\S+::\S+)(?:(? with data set (?:#\d+|"[^"]+"))\s\()?/', $test, $matches)) { + $test = $matches['name'] . ($matches['dataname'] ?? ''); + } + + return $test; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php new file mode 100644 index 0000000000..b658dfcc42 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use function array_diff; +use function array_values; +use function class_exists; +use function get_declared_classes; +use function realpath; +use function sprintf; +use function str_replace; +use function strlen; +use function substr; +use PHPUnit\Framework\TestCase; +use PHPUnit\Util\FileLoader; +use PHPUnit\Util\Filesystem; +use ReflectionClass; +use ReflectionException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class StandardTestSuiteLoader implements TestSuiteLoader +{ + /** + * @throws \PHPUnit\Framework\Exception + * @throws Exception + */ + public function load(string $suiteClassName, string $suiteClassFile = ''): ReflectionClass + { + $suiteClassName = str_replace('.php', '', $suiteClassName); + $filename = null; + + if (empty($suiteClassFile)) { + $suiteClassFile = Filesystem::classNameToFilename( + $suiteClassName + ); + } + + if (!class_exists($suiteClassName, false)) { + $loadedClasses = get_declared_classes(); + + $filename = FileLoader::checkAndLoad($suiteClassFile); + + $loadedClasses = array_values( + array_diff(get_declared_classes(), $loadedClasses) + ); + } + + if (!empty($loadedClasses) && !class_exists($suiteClassName, false)) { + $offset = 0 - strlen($suiteClassName); + + foreach ($loadedClasses as $loadedClass) { + try { + $class = new ReflectionClass($loadedClass); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (substr($loadedClass, $offset) === $suiteClassName && + $class->getFileName() == $filename) { + $suiteClassName = $loadedClass; + + break; + } + } + } + + if (!empty($loadedClasses) && !class_exists($suiteClassName, false)) { + $testCaseClass = TestCase::class; + + foreach ($loadedClasses as $loadedClass) { + try { + $class = new ReflectionClass($loadedClass); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $classFile = $class->getFileName(); + + if ($class->isSubclassOf($testCaseClass) && !$class->isAbstract()) { + $suiteClassName = $loadedClass; + $testCaseClass = $loadedClass; + + if ($classFile == realpath($suiteClassFile)) { + break; + } + } + + if ($class->hasMethod('suite')) { + try { + $method = $class->getMethod('suite'); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (!$method->isAbstract() && $method->isPublic() && $method->isStatic()) { + $suiteClassName = $loadedClass; + + if ($classFile == realpath($suiteClassFile)) { + break; + } + } + } + } + } + + if (class_exists($suiteClassName, false)) { + try { + $class = new ReflectionClass($suiteClassName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($class->getFileName() == realpath($suiteClassFile)) { + return $class; + } + } + + throw new Exception( + sprintf( + "Class '%s' could not be found in '%s'.", + $suiteClassName, + $suiteClassFile + ) + ); + } + + public function reload(ReflectionClass $aClass): ReflectionClass + { + return $aClass; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestResultCache.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestResultCache.php new file mode 100644 index 0000000000..69e6282891 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestResultCache.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +interface TestResultCache +{ + public function setState(string $testName, int $state): void; + + public function getState(string $testName): int; + + public function setTime(string $testName, float $time): void; + + public function getTime(string $testName): float; + + public function load(): void; + + public function persist(): void; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php new file mode 100644 index 0000000000..f059688924 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteLoader.php @@ -0,0 +1,22 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use ReflectionClass; + +/** + * An interface to define how a test suite should be loaded. + */ +interface TestSuiteLoader +{ + public function load(string $suiteClassName, string $suiteClassFile = ''): ReflectionClass; + + public function reload(ReflectionClass $aClass): ReflectionClass; +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php new file mode 100644 index 0000000000..f44b92ced2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php @@ -0,0 +1,448 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use function array_intersect; +use function array_map; +use function array_merge; +use function array_reduce; +use function array_reverse; +use function array_splice; +use function count; +use function get_class; +use function in_array; +use function max; +use function shuffle; +use function strpos; +use function substr; +use function usort; +use PHPUnit\Framework\DataProviderTestSuite; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Util\Test as TestUtil; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestSuiteSorter +{ + /** + * @var int + */ + public const ORDER_DEFAULT = 0; + + /** + * @var int + */ + public const ORDER_RANDOMIZED = 1; + + /** + * @var int + */ + public const ORDER_REVERSED = 2; + + /** + * @var int + */ + public const ORDER_DEFECTS_FIRST = 3; + + /** + * @var int + */ + public const ORDER_DURATION = 4; + + /** + * Order tests by @size annotation 'small', 'medium', 'large'. + * + * @var int + */ + public const ORDER_SIZE = 5; + + /** + * List of sorting weights for all test result codes. A higher number gives higher priority. + */ + private const DEFECT_SORT_WEIGHT = [ + BaseTestRunner::STATUS_ERROR => 6, + BaseTestRunner::STATUS_FAILURE => 5, + BaseTestRunner::STATUS_WARNING => 4, + BaseTestRunner::STATUS_INCOMPLETE => 3, + BaseTestRunner::STATUS_RISKY => 2, + BaseTestRunner::STATUS_SKIPPED => 1, + BaseTestRunner::STATUS_UNKNOWN => 0, + ]; + + private const SIZE_SORT_WEIGHT = [ + TestUtil::SMALL => 1, + TestUtil::MEDIUM => 2, + TestUtil::LARGE => 3, + TestUtil::UNKNOWN => 4, + ]; + + /** + * @var array Associative array of (string => DEFECT_SORT_WEIGHT) elements + */ + private $defectSortOrder = []; + + /** + * @var TestResultCache + */ + private $cache; + + /** + * @var string[] A list of normalized names of tests before reordering + */ + private $originalExecutionOrder = []; + + /** + * @var string[] A list of normalized names of tests affected by reordering + */ + private $executionOrder = []; + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function getTestSorterUID(Test $test): string + { + if ($test instanceof PhptTestCase) { + return $test->getName(); + } + + if ($test instanceof TestCase) { + $testName = $test->getName(true); + + if (strpos($testName, '::') === false) { + $testName = get_class($test) . '::' . $testName; + } + + return $testName; + } + + return $test->getName(); + } + + public function __construct(?TestResultCache $cache = null) + { + $this->cache = $cache ?? new NullTestResultCache; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + */ + public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDependencies, int $orderDefects, bool $isRootTestSuite = true): void + { + $allowedOrders = [ + self::ORDER_DEFAULT, + self::ORDER_REVERSED, + self::ORDER_RANDOMIZED, + self::ORDER_DURATION, + self::ORDER_SIZE, + ]; + + if (!in_array($order, $allowedOrders, true)) { + throw new Exception( + '$order must be one of TestSuiteSorter::ORDER_[DEFAULT|REVERSED|RANDOMIZED|DURATION|SIZE]' + ); + } + + $allowedOrderDefects = [ + self::ORDER_DEFAULT, + self::ORDER_DEFECTS_FIRST, + ]; + + if (!in_array($orderDefects, $allowedOrderDefects, true)) { + throw new Exception( + '$orderDefects must be one of TestSuiteSorter::ORDER_DEFAULT, TestSuiteSorter::ORDER_DEFECTS_FIRST' + ); + } + + if ($isRootTestSuite) { + $this->originalExecutionOrder = $this->calculateTestExecutionOrder($suite); + } + + if ($suite instanceof TestSuite) { + foreach ($suite as $_suite) { + $this->reorderTestsInSuite($_suite, $order, $resolveDependencies, $orderDefects, false); + } + + if ($orderDefects === self::ORDER_DEFECTS_FIRST) { + $this->addSuiteToDefectSortOrder($suite); + } + + $this->sort($suite, $order, $resolveDependencies, $orderDefects); + } + + if ($isRootTestSuite) { + $this->executionOrder = $this->calculateTestExecutionOrder($suite); + } + } + + public function getOriginalExecutionOrder(): array + { + return $this->originalExecutionOrder; + } + + public function getExecutionOrder(): array + { + return $this->executionOrder; + } + + private function sort(TestSuite $suite, int $order, bool $resolveDependencies, int $orderDefects): void + { + if (empty($suite->tests())) { + return; + } + + if ($order === self::ORDER_REVERSED) { + $suite->setTests($this->reverse($suite->tests())); + } elseif ($order === self::ORDER_RANDOMIZED) { + $suite->setTests($this->randomize($suite->tests())); + } elseif ($order === self::ORDER_DURATION && $this->cache !== null) { + $suite->setTests($this->sortByDuration($suite->tests())); + } elseif ($order === self::ORDER_SIZE) { + $suite->setTests($this->sortBySize($suite->tests())); + } + + if ($orderDefects === self::ORDER_DEFECTS_FIRST && $this->cache !== null) { + $suite->setTests($this->sortDefectsFirst($suite->tests())); + } + + if ($resolveDependencies && !($suite instanceof DataProviderTestSuite) && $this->suiteOnlyContainsTests($suite)) { + /** @var TestCase[] $tests */ + $tests = $suite->tests(); + + $suite->setTests($this->resolveDependencies($tests)); + } + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function addSuiteToDefectSortOrder(TestSuite $suite): void + { + $max = 0; + + foreach ($suite->tests() as $test) { + $testname = self::getTestSorterUID($test); + + if (!isset($this->defectSortOrder[$testname])) { + $this->defectSortOrder[$testname] = self::DEFECT_SORT_WEIGHT[$this->cache->getState($testname)]; + $max = max($max, $this->defectSortOrder[$testname]); + } + } + + $this->defectSortOrder[$suite->getName()] = $max; + } + + private function suiteOnlyContainsTests(TestSuite $suite): bool + { + return array_reduce( + $suite->tests(), + static function ($carry, $test) { + return $carry && ($test instanceof TestCase || $test instanceof DataProviderTestSuite); + }, + true + ); + } + + private function reverse(array $tests): array + { + return array_reverse($tests); + } + + private function randomize(array $tests): array + { + shuffle($tests); + + return $tests; + } + + private function sortDefectsFirst(array $tests): array + { + usort( + $tests, + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + function ($left, $right) { + return $this->cmpDefectPriorityAndTime($left, $right); + } + ); + + return $tests; + } + + private function sortByDuration(array $tests): array + { + usort( + $tests, + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + function ($left, $right) { + return $this->cmpDuration($left, $right); + } + ); + + return $tests; + } + + private function sortBySize(array $tests): array + { + usort( + $tests, + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + function ($left, $right) { + return $this->cmpSize($left, $right); + } + ); + + return $tests; + } + + /** + * Comparator callback function to sort tests for "reach failure as fast as possible": + * 1. sort tests by defect weight defined in self::DEFECT_SORT_WEIGHT + * 2. when tests are equally defective, sort the fastest to the front + * 3. do not reorder successful tests. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function cmpDefectPriorityAndTime(Test $a, Test $b): int + { + $priorityA = $this->defectSortOrder[self::getTestSorterUID($a)] ?? 0; + $priorityB = $this->defectSortOrder[self::getTestSorterUID($b)] ?? 0; + + if ($priorityB <=> $priorityA) { + // Sort defect weight descending + return $priorityB <=> $priorityA; + } + + if ($priorityA || $priorityB) { + return $this->cmpDuration($a, $b); + } + + // do not change execution order + return 0; + } + + /** + * Compares test duration for sorting tests by duration ascending. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function cmpDuration(Test $a, Test $b): int + { + return $this->cache->getTime(self::getTestSorterUID($a)) <=> $this->cache->getTime(self::getTestSorterUID($b)); + } + + /** + * Compares test size for sorting tests small->medium->large->unknown. + */ + private function cmpSize(Test $a, Test $b): int + { + $sizeA = ($a instanceof TestCase || $a instanceof DataProviderTestSuite) + ? $a->getSize() + : TestUtil::UNKNOWN; + $sizeB = ($b instanceof TestCase || $b instanceof DataProviderTestSuite) + ? $b->getSize() + : TestUtil::UNKNOWN; + + return self::SIZE_SORT_WEIGHT[$sizeA] <=> self::SIZE_SORT_WEIGHT[$sizeB]; + } + + /** + * Reorder Tests within a TestCase in such a way as to resolve as many dependencies as possible. + * The algorithm will leave the tests in original running order when it can. + * For more details see the documentation for test dependencies. + * + * Short description of algorithm: + * 1. Pick the next Test from remaining tests to be checked for dependencies. + * 2. If the test has no dependencies: mark done, start again from the top + * 3. If the test has dependencies but none left to do: mark done, start again from the top + * 4. When we reach the end add any leftover tests to the end. These will be marked 'skipped' during execution. + * + * @param array $tests + * + * @return array + */ + private function resolveDependencies(array $tests): array + { + $newTestOrder = []; + $i = 0; + + do { + $todoNames = array_map( + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + static function ($test) { + return self::getTestSorterUID($test); + }, + $tests + ); + + if (!$tests[$i]->hasDependencies() || empty(array_intersect($this->getNormalizedDependencyNames($tests[$i]), $todoNames))) { + $newTestOrder = array_merge($newTestOrder, array_splice($tests, $i, 1)); + $i = 0; + } else { + $i++; + } + } while (!empty($tests) && ($i < count($tests))); + + return array_merge($newTestOrder, $tests); + } + + /** + * @param DataProviderTestSuite|TestCase $test + * + * @return array A list of full test names as "TestSuiteClassName::testMethodName" + */ + private function getNormalizedDependencyNames($test): array + { + if ($test instanceof DataProviderTestSuite) { + $testClass = substr($test->getName(), 0, strpos($test->getName(), '::')); + } else { + $testClass = get_class($test); + } + + $names = array_map( + static function ($name) use ($testClass) { + return strpos($name, '::') === false ? $testClass . '::' . $name : $name; + }, + $test->getDependencies() + ); + + return $names; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function calculateTestExecutionOrder(Test $suite): array + { + $tests = []; + + if ($suite instanceof TestSuite) { + foreach ($suite->tests() as $test) { + if (!($test instanceof TestSuite)) { + $tests[] = self::getTestSorterUID($test); + } else { + $tests = array_merge($tests, $this->calculateTestExecutionOrder($test)); + } + } + } + + return $tests; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Version.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Version.php new file mode 100644 index 0000000000..0f52974663 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Runner/Version.php @@ -0,0 +1,71 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Runner; + +use function array_slice; +use function dirname; +use function explode; +use function implode; +use function strpos; +use SebastianBergmann\Version as VersionId; + +final class Version +{ + /** + * @var string + */ + private static $pharVersion = ''; + + /** + * @var string + */ + private static $version = ''; + + /** + * Returns the current version of PHPUnit. + */ + public static function id(): string + { + if (self::$pharVersion !== '') { + return self::$pharVersion; + } + + if (self::$version === '') { + self::$version = (new VersionId('8.5.14', dirname(__DIR__, 2)))->getVersion(); + } + + return self::$version; + } + + public static function series(): string + { + if (strpos(self::id(), '-')) { + $version = explode('-', self::id())[0]; + } else { + $version = self::id(); + } + + return implode('.', array_slice(explode('.', $version), 0, 2)); + } + + public static function getVersionString(): string + { + return 'PHPUnit ' . self::id() . ' by Sebastian Bergmann and contributors.'; + } + + public static function getReleaseChannel(): string + { + if (strpos(self::$pharVersion, '-') !== false) { + return '-nightly'; + } + + return ''; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Command.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Command.php new file mode 100644 index 0000000000..7c245d8909 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Command.php @@ -0,0 +1,1368 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TextUI; + +use const PATH_SEPARATOR; +use const PHP_EOL; +use const STDIN; +use function array_keys; +use function assert; +use function class_exists; +use function explode; +use function extension_loaded; +use function fgets; +use function file_exists; +use function file_get_contents; +use function file_put_contents; +use function getcwd; +use function ini_get; +use function ini_set; +use function is_callable; +use function is_dir; +use function is_file; +use function is_numeric; +use function is_string; +use function printf; +use function realpath; +use function sort; + +use function sprintf; +use function str_replace; +use function stream_resolve_include_path; +use function strrpos; +use function substr; +use function trim; +use function version_compare; +use PharIo\Manifest\ApplicationName; +use PharIo\Manifest\Exception as ManifestException; +use PharIo\Manifest\ManifestLoader; +use PharIo\Version\Version as PharIoVersion; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\StandardTestSuiteLoader; +use PHPUnit\Runner\TestSuiteLoader; +use PHPUnit\Runner\TestSuiteSorter; +use PHPUnit\Runner\Version; +use PHPUnit\Util\Configuration; +use PHPUnit\Util\ConfigurationGenerator; +use PHPUnit\Util\FileLoader; +use PHPUnit\Util\Filesystem; +use PHPUnit\Util\Getopt; +use PHPUnit\Util\Log\TeamCity; +use PHPUnit\Util\Printer; +use PHPUnit\Util\TestDox\CliTestDoxPrinter; +use PHPUnit\Util\TextTestListRenderer; +use PHPUnit\Util\XmlTestListRenderer; +use ReflectionClass; +use ReflectionException; +use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; +use Throwable; + +/** + * A TestRunner for the Command Line Interface (CLI) + * PHP SAPI Module. + */ +class Command +{ + /** + * @var array + */ + protected $arguments = [ + 'listGroups' => false, + 'listSuites' => false, + 'listTests' => false, + 'listTestsXml' => false, + 'loader' => null, + 'useDefaultConfiguration' => true, + 'loadedExtensions' => [], + 'notLoadedExtensions' => [], + ]; + + /** + * @var array + */ + protected $options = []; + + /** + * @var array + */ + protected $longOptions = [ + 'atleast-version=' => null, + 'prepend=' => null, + 'bootstrap=' => null, + 'cache-result' => null, + 'do-not-cache-result' => null, + 'cache-result-file=' => null, + 'check-version' => null, + 'colors==' => null, + 'columns=' => null, + 'configuration=' => null, + 'coverage-clover=' => null, + 'coverage-crap4j=' => null, + 'coverage-html=' => null, + 'coverage-php=' => null, + 'coverage-text==' => null, + 'coverage-xml=' => null, + 'debug' => null, + 'disallow-test-output' => null, + 'disallow-resource-usage' => null, + 'disallow-todo-tests' => null, + 'default-time-limit=' => null, + 'enforce-time-limit' => null, + 'exclude-group=' => null, + 'filter=' => null, + 'generate-configuration' => null, + 'globals-backup' => null, + 'group=' => null, + 'help' => null, + 'resolve-dependencies' => null, + 'ignore-dependencies' => null, + 'include-path=' => null, + 'list-groups' => null, + 'list-suites' => null, + 'list-tests' => null, + 'list-tests-xml=' => null, + 'loader=' => null, + 'log-junit=' => null, + 'log-teamcity=' => null, + 'no-configuration' => null, + 'no-coverage' => null, + 'no-logging' => null, + 'no-interaction' => null, + 'no-extensions' => null, + 'order-by=' => null, + 'printer=' => null, + 'process-isolation' => null, + 'repeat=' => null, + 'dont-report-useless-tests' => null, + 'random-order' => null, + 'random-order-seed=' => null, + 'reverse-order' => null, + 'reverse-list' => null, + 'static-backup' => null, + 'stderr' => null, + 'stop-on-defect' => null, + 'stop-on-error' => null, + 'stop-on-failure' => null, + 'stop-on-warning' => null, + 'stop-on-incomplete' => null, + 'stop-on-risky' => null, + 'stop-on-skipped' => null, + 'fail-on-warning' => null, + 'fail-on-risky' => null, + 'strict-coverage' => null, + 'disable-coverage-ignore' => null, + 'strict-global-state' => null, + 'teamcity' => null, + 'testdox' => null, + 'testdox-group=' => null, + 'testdox-exclude-group=' => null, + 'testdox-html=' => null, + 'testdox-text=' => null, + 'testdox-xml=' => null, + 'test-suffix=' => null, + 'testsuite=' => null, + 'verbose' => null, + 'version' => null, + 'whitelist=' => null, + 'dump-xdebug-filter=' => null, + ]; + + /** + * @var @psalm-var list + */ + private $warnings = []; + + /** + * @var bool + */ + private $versionStringPrinted = false; + + /** + * @throws \PHPUnit\Framework\Exception + */ + public static function main(bool $exit = true): int + { + return (new static)->run($_SERVER['argv'], $exit); + } + + /** + * @throws Exception + */ + public function run(array $argv, bool $exit = true): int + { + $this->handleArguments($argv); + + $runner = $this->createRunner(); + + if ($this->arguments['test'] instanceof Test) { + $suite = $this->arguments['test']; + } else { + $suite = $runner->getTest( + $this->arguments['test'], + $this->arguments['testFile'], + $this->arguments['testSuffixes'] + ); + } + + if ($this->arguments['listGroups']) { + return $this->handleListGroups($suite, $exit); + } + + if ($this->arguments['listSuites']) { + return $this->handleListSuites($exit); + } + + if ($this->arguments['listTests']) { + return $this->handleListTests($suite, $exit); + } + + if ($this->arguments['listTestsXml']) { + return $this->handleListTestsXml($suite, $this->arguments['listTestsXml'], $exit); + } + + unset($this->arguments['test'], $this->arguments['testFile']); + + try { + $result = $runner->doRun($suite, $this->arguments, $this->warnings, $exit); + } catch (Exception $e) { + print $e->getMessage() . PHP_EOL; + } + + $return = TestRunner::FAILURE_EXIT; + + if (isset($result) && $result->wasSuccessful()) { + $return = TestRunner::SUCCESS_EXIT; + } elseif (!isset($result) || $result->errorCount() > 0) { + $return = TestRunner::EXCEPTION_EXIT; + } + + if ($exit) { + exit($return); + } + + return $return; + } + + /** + * Create a TestRunner, override in subclasses. + */ + protected function createRunner(): TestRunner + { + return new TestRunner($this->arguments['loader']); + } + + /** + * Handles the command-line arguments. + * + * A child class of PHPUnit\TextUI\Command can hook into the argument + * parsing by adding the switch(es) to the $longOptions array and point to a + * callback method that handles the switch(es) in the child class like this + * + * + * longOptions['my-switch'] = 'myHandler'; + * // my-secondswitch will accept a value - note the equals sign + * $this->longOptions['my-secondswitch='] = 'myOtherHandler'; + * } + * + * // --my-switch -> myHandler() + * protected function myHandler() + * { + * } + * + * // --my-secondswitch foo -> myOtherHandler('foo') + * protected function myOtherHandler ($value) + * { + * } + * + * // You will also need this - the static keyword in the + * // PHPUnit\TextUI\Command will mean that it'll be + * // PHPUnit\TextUI\Command that gets instantiated, + * // not MyCommand + * public static function main($exit = true) + * { + * $command = new static; + * + * return $command->run($_SERVER['argv'], $exit); + * } + * + * } + * + * + * @throws Exception + */ + protected function handleArguments(array $argv): void + { + try { + $this->options = Getopt::parse( + $argv, + 'd:c:hv', + array_keys($this->longOptions) + ); + } catch (Exception $t) { + $this->exitWithErrorMessage($t->getMessage()); + } + + foreach ($this->options[0] as $option) { + switch ($option[0]) { + case '--colors': + $this->arguments['colors'] = $option[1] ?: ResultPrinter::COLOR_AUTO; + + break; + + case '--bootstrap': + $this->arguments['bootstrap'] = $option[1]; + + break; + + case '--cache-result': + $this->arguments['cacheResult'] = true; + + break; + + case '--do-not-cache-result': + $this->arguments['cacheResult'] = false; + + break; + + case '--cache-result-file': + $this->arguments['cacheResultFile'] = $option[1]; + + break; + + case '--columns': + if (is_numeric($option[1])) { + $this->arguments['columns'] = (int) $option[1]; + } elseif ($option[1] === 'max') { + $this->arguments['columns'] = 'max'; + } + + break; + + case 'c': + case '--configuration': + $this->arguments['configuration'] = $option[1]; + + break; + + case '--coverage-clover': + $this->arguments['coverageClover'] = $option[1]; + + break; + + case '--coverage-crap4j': + $this->arguments['coverageCrap4J'] = $option[1]; + + break; + + case '--coverage-html': + $this->arguments['coverageHtml'] = $option[1]; + + break; + + case '--coverage-php': + $this->arguments['coveragePHP'] = $option[1]; + + break; + + case '--coverage-text': + if ($option[1] === null) { + $option[1] = 'php://stdout'; + } + + $this->arguments['coverageText'] = $option[1]; + $this->arguments['coverageTextShowUncoveredFiles'] = false; + $this->arguments['coverageTextShowOnlySummary'] = false; + + break; + + case '--coverage-xml': + $this->arguments['coverageXml'] = $option[1]; + + break; + + case 'd': + $ini = explode('=', $option[1]); + + if (isset($ini[0])) { + if (isset($ini[1])) { + ini_set($ini[0], $ini[1]); + } else { + ini_set($ini[0], '1'); + } + } + + break; + + case '--debug': + $this->arguments['debug'] = true; + + break; + + case 'h': + case '--help': + $this->showHelp(); + + exit(TestRunner::SUCCESS_EXIT); + + break; + + case '--filter': + $this->arguments['filter'] = $option[1]; + + break; + + case '--testsuite': + $this->arguments['testsuite'] = $option[1]; + + break; + + case '--generate-configuration': + $this->printVersionString(); + + print 'Generating phpunit.xml in ' . getcwd() . PHP_EOL . PHP_EOL; + + print 'Bootstrap script (relative to path shown above; default: vendor/autoload.php): '; + $bootstrapScript = trim(fgets(STDIN)); + + print 'Tests directory (relative to path shown above; default: tests): '; + $testsDirectory = trim(fgets(STDIN)); + + print 'Source directory (relative to path shown above; default: src): '; + $src = trim(fgets(STDIN)); + + if ($bootstrapScript === '') { + $bootstrapScript = 'vendor/autoload.php'; + } + + if ($testsDirectory === '') { + $testsDirectory = 'tests'; + } + + if ($src === '') { + $src = 'src'; + } + + $generator = new ConfigurationGenerator; + + file_put_contents( + 'phpunit.xml', + $generator->generateDefaultConfiguration( + Version::series(), + $bootstrapScript, + $testsDirectory, + $src + ) + ); + + print PHP_EOL . 'Generated phpunit.xml in ' . getcwd() . PHP_EOL; + + exit(TestRunner::SUCCESS_EXIT); + + break; + + case '--group': + $this->arguments['groups'] = explode(',', $option[1]); + + break; + + case '--exclude-group': + $this->arguments['excludeGroups'] = explode( + ',', + $option[1] + ); + + break; + + case '--test-suffix': + $this->arguments['testSuffixes'] = explode( + ',', + $option[1] + ); + + break; + + case '--include-path': + $includePath = $option[1]; + + break; + + case '--list-groups': + $this->arguments['listGroups'] = true; + + break; + + case '--list-suites': + $this->arguments['listSuites'] = true; + + break; + + case '--list-tests': + $this->arguments['listTests'] = true; + + break; + + case '--list-tests-xml': + $this->arguments['listTestsXml'] = $option[1]; + + break; + + case '--printer': + $this->arguments['printer'] = $option[1]; + + break; + + case '--loader': + $this->arguments['loader'] = $option[1]; + + break; + + case '--log-junit': + $this->arguments['junitLogfile'] = $option[1]; + + break; + + case '--log-teamcity': + $this->arguments['teamcityLogfile'] = $option[1]; + + break; + + case '--order-by': + $this->handleOrderByOption($option[1]); + + break; + + case '--process-isolation': + $this->arguments['processIsolation'] = true; + + break; + + case '--repeat': + $this->arguments['repeat'] = (int) $option[1]; + + break; + + case '--stderr': + $this->arguments['stderr'] = true; + + break; + + case '--stop-on-defect': + $this->arguments['stopOnDefect'] = true; + + break; + + case '--stop-on-error': + $this->arguments['stopOnError'] = true; + + break; + + case '--stop-on-failure': + $this->arguments['stopOnFailure'] = true; + + break; + + case '--stop-on-warning': + $this->arguments['stopOnWarning'] = true; + + break; + + case '--stop-on-incomplete': + $this->arguments['stopOnIncomplete'] = true; + + break; + + case '--stop-on-risky': + $this->arguments['stopOnRisky'] = true; + + break; + + case '--stop-on-skipped': + $this->arguments['stopOnSkipped'] = true; + + break; + + case '--fail-on-warning': + $this->arguments['failOnWarning'] = true; + + break; + + case '--fail-on-risky': + $this->arguments['failOnRisky'] = true; + + break; + + case '--teamcity': + $this->arguments['printer'] = TeamCity::class; + + break; + + case '--testdox': + $this->arguments['printer'] = CliTestDoxPrinter::class; + + break; + + case '--testdox-group': + $this->arguments['testdoxGroups'] = explode( + ',', + $option[1] + ); + + break; + + case '--testdox-exclude-group': + $this->arguments['testdoxExcludeGroups'] = explode( + ',', + $option[1] + ); + + break; + + case '--testdox-html': + $this->arguments['testdoxHTMLFile'] = $option[1]; + + break; + + case '--testdox-text': + $this->arguments['testdoxTextFile'] = $option[1]; + + break; + + case '--testdox-xml': + $this->arguments['testdoxXMLFile'] = $option[1]; + + break; + + case '--no-configuration': + $this->arguments['useDefaultConfiguration'] = false; + + break; + + case '--no-extensions': + $this->arguments['noExtensions'] = true; + + break; + + case '--no-coverage': + $this->arguments['noCoverage'] = true; + + break; + + case '--no-logging': + $this->arguments['noLogging'] = true; + + break; + + case '--no-interaction': + $this->arguments['noInteraction'] = true; + + break; + + case '--globals-backup': + $this->arguments['backupGlobals'] = true; + + break; + + case '--static-backup': + $this->arguments['backupStaticAttributes'] = true; + + break; + + case 'v': + case '--verbose': + $this->arguments['verbose'] = true; + + break; + + case '--atleast-version': + if (version_compare(Version::id(), $option[1], '>=')) { + exit(TestRunner::SUCCESS_EXIT); + } + + exit(TestRunner::FAILURE_EXIT); + + break; + + case '--version': + $this->printVersionString(); + + exit(TestRunner::SUCCESS_EXIT); + + break; + + case '--dont-report-useless-tests': + $this->arguments['reportUselessTests'] = false; + + break; + + case '--strict-coverage': + $this->arguments['strictCoverage'] = true; + + break; + + case '--disable-coverage-ignore': + $this->arguments['disableCodeCoverageIgnore'] = true; + + break; + + case '--strict-global-state': + $this->arguments['beStrictAboutChangesToGlobalState'] = true; + + break; + + case '--disallow-test-output': + $this->arguments['disallowTestOutput'] = true; + + break; + + case '--disallow-resource-usage': + $this->arguments['beStrictAboutResourceUsageDuringSmallTests'] = true; + + break; + + case '--default-time-limit': + $this->arguments['defaultTimeLimit'] = (int) $option[1]; + + break; + + case '--enforce-time-limit': + $this->arguments['enforceTimeLimit'] = true; + + break; + + case '--disallow-todo-tests': + $this->arguments['disallowTodoAnnotatedTests'] = true; + + break; + + case '--reverse-list': + $this->arguments['reverseList'] = true; + + break; + + case '--check-version': + $this->handleVersionCheck(); + + break; + + case '--whitelist': + $this->arguments['whitelist'] = $option[1]; + + break; + + case '--random-order': + $this->handleOrderByOption('random'); + + break; + + case '--random-order-seed': + $this->arguments['randomOrderSeed'] = (int) $option[1]; + + break; + + case '--resolve-dependencies': + $this->handleOrderByOption('depends'); + + break; + + case '--ignore-dependencies': + $this->handleOrderByOption('no-depends'); + + break; + + case '--reverse-order': + $this->handleOrderByOption('reverse'); + + break; + + case '--dump-xdebug-filter': + $this->arguments['xdebugFilterFile'] = $option[1]; + + break; + + default: + $optionName = str_replace('--', '', $option[0]); + + $handler = null; + + if (isset($this->longOptions[$optionName])) { + $handler = $this->longOptions[$optionName]; + } elseif (isset($this->longOptions[$optionName . '='])) { + $handler = $this->longOptions[$optionName . '=']; + } + + if (isset($handler) && is_callable([$this, $handler])) { + $this->{$handler}($option[1]); + } + } + } + + $this->handleCustomTestSuite(); + + if (!isset($this->arguments['testSuffixes'])) { + $this->arguments['testSuffixes'] = ['Test.php', '.phpt']; + } + + if (isset($this->options[1][0]) && + substr($this->options[1][0], -5, 5) !== '.phpt' && + substr($this->options[1][0], -4, 4) !== '.php' && + substr($this->options[1][0], -1, 1) !== '/' && + !is_dir($this->options[1][0])) { + $this->warnings[] = 'Invocation with class name is deprecated'; + } + + if (!isset($this->arguments['test'])) { + if (isset($this->options[1][0])) { + $this->arguments['test'] = $this->options[1][0]; + } + + if (isset($this->options[1][1])) { + $testFile = realpath($this->options[1][1]); + + if ($testFile === false) { + $this->exitWithErrorMessage( + sprintf( + 'Cannot open file "%s".', + $this->options[1][1] + ) + ); + } + $this->arguments['testFile'] = $testFile; + } else { + $this->arguments['testFile'] = ''; + } + + if (isset($this->arguments['test']) && + is_file($this->arguments['test']) && + strrpos($this->arguments['test'], '.') !== false && + substr($this->arguments['test'], -5, 5) !== '.phpt') { + $this->arguments['testFile'] = realpath($this->arguments['test']); + $this->arguments['test'] = substr($this->arguments['test'], 0, strrpos($this->arguments['test'], '.')); + } + + if (isset($this->arguments['test']) && + is_string($this->arguments['test']) && + substr($this->arguments['test'], -5, 5) === '.phpt') { + $suite = new TestSuite; + $suite->addTestFile($this->arguments['test']); + $this->arguments['test'] = $suite; + } + } + + if (isset($includePath)) { + ini_set( + 'include_path', + $includePath . PATH_SEPARATOR . ini_get('include_path') + ); + } + + if ($this->arguments['loader'] !== null) { + $this->arguments['loader'] = $this->handleLoader($this->arguments['loader']); + } + + if (isset($this->arguments['configuration']) && + is_dir($this->arguments['configuration'])) { + $configurationFile = $this->arguments['configuration'] . '/phpunit.xml'; + + if (file_exists($configurationFile)) { + $this->arguments['configuration'] = realpath( + $configurationFile + ); + } elseif (file_exists($configurationFile . '.dist')) { + $this->arguments['configuration'] = realpath( + $configurationFile . '.dist' + ); + } + } elseif (!isset($this->arguments['configuration']) && + $this->arguments['useDefaultConfiguration']) { + if (file_exists('phpunit.xml')) { + $this->arguments['configuration'] = realpath('phpunit.xml'); + } elseif (file_exists('phpunit.xml.dist')) { + $this->arguments['configuration'] = realpath( + 'phpunit.xml.dist' + ); + } + } + + if (isset($this->arguments['configuration'])) { + try { + $configuration = Configuration::getInstance( + $this->arguments['configuration'] + ); + } catch (Throwable $t) { + print $t->getMessage() . PHP_EOL; + + exit(TestRunner::FAILURE_EXIT); + } + + $phpunitConfiguration = $configuration->getPHPUnitConfiguration(); + + $configuration->handlePHPConfiguration(); + + /* + * Issue #1216 + */ + if (isset($this->arguments['bootstrap'])) { + $this->handleBootstrap($this->arguments['bootstrap']); + } elseif (isset($phpunitConfiguration['bootstrap'])) { + $this->handleBootstrap($phpunitConfiguration['bootstrap']); + } + + /* + * Issue #657 + */ + if (isset($phpunitConfiguration['stderr']) && !isset($this->arguments['stderr'])) { + $this->arguments['stderr'] = $phpunitConfiguration['stderr']; + } + + if (isset($phpunitConfiguration['extensionsDirectory']) && !isset($this->arguments['noExtensions']) && extension_loaded('phar')) { + $this->handleExtensions($phpunitConfiguration['extensionsDirectory']); + } + + if (isset($phpunitConfiguration['columns']) && !isset($this->arguments['columns'])) { + $this->arguments['columns'] = $phpunitConfiguration['columns']; + } + + if (!isset($this->arguments['printer']) && isset($phpunitConfiguration['printerClass'])) { + $file = $phpunitConfiguration['printerFile'] ?? ''; + + $this->arguments['printer'] = $this->handlePrinter( + $phpunitConfiguration['printerClass'], + $file + ); + } + + if (isset($phpunitConfiguration['testSuiteLoaderClass'])) { + $file = $phpunitConfiguration['testSuiteLoaderFile'] ?? ''; + + $this->arguments['loader'] = $this->handleLoader( + $phpunitConfiguration['testSuiteLoaderClass'], + $file + ); + } + + if (!isset($this->arguments['testsuite']) && isset($phpunitConfiguration['defaultTestSuite'])) { + $this->arguments['testsuite'] = $phpunitConfiguration['defaultTestSuite']; + } + + if (!isset($this->arguments['test'])) { + $testSuite = $configuration->getTestSuiteConfiguration($this->arguments['testsuite'] ?? ''); + + if ($testSuite !== null) { + $this->arguments['test'] = $testSuite; + } + } + } elseif (isset($this->arguments['bootstrap'])) { + $this->handleBootstrap($this->arguments['bootstrap']); + } + + if (isset($this->arguments['printer']) && + is_string($this->arguments['printer'])) { + $this->arguments['printer'] = $this->handlePrinter($this->arguments['printer']); + } + + if (!isset($this->arguments['test'])) { + $this->showHelp(); + + exit(TestRunner::EXCEPTION_EXIT); + } + } + + /** + * Handles the loading of the PHPUnit\Runner\TestSuiteLoader implementation. + */ + protected function handleLoader(string $loaderClass, string $loaderFile = ''): ?TestSuiteLoader + { + if (!class_exists($loaderClass, false)) { + if ($loaderFile == '') { + $loaderFile = Filesystem::classNameToFilename( + $loaderClass + ); + } + + $loaderFile = stream_resolve_include_path($loaderFile); + + if ($loaderFile) { + require $loaderFile; + } + } + + if (class_exists($loaderClass, false)) { + try { + $class = new ReflectionClass($loaderClass); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if ($class->implementsInterface(TestSuiteLoader::class) && $class->isInstantiable()) { + $object = $class->newInstance(); + + assert($object instanceof TestSuiteLoader); + + return $object; + } + } + + if ($loaderClass == StandardTestSuiteLoader::class) { + return null; + } + + $this->exitWithErrorMessage( + sprintf( + 'Could not use "%s" as loader.', + $loaderClass + ) + ); + + return null; + } + + /** + * Handles the loading of the PHPUnit\Util\Printer implementation. + * + * @return null|Printer|string + */ + protected function handlePrinter(string $printerClass, string $printerFile = '') + { + if (!class_exists($printerClass, false)) { + if ($printerFile == '') { + $printerFile = Filesystem::classNameToFilename( + $printerClass + ); + } + + $printerFile = stream_resolve_include_path($printerFile); + + if ($printerFile) { + require $printerFile; + } + } + + if (!class_exists($printerClass)) { + $this->exitWithErrorMessage( + sprintf( + 'Could not use "%s" as printer: class does not exist', + $printerClass + ) + ); + } + + try { + $class = new ReflectionClass($printerClass); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + // @codeCoverageIgnoreEnd + } + + if (!$class->implementsInterface(TestListener::class)) { + $this->exitWithErrorMessage( + sprintf( + 'Could not use "%s" as printer: class does not implement %s', + $printerClass, + TestListener::class + ) + ); + } + + if (!$class->isSubclassOf(Printer::class)) { + $this->exitWithErrorMessage( + sprintf( + 'Could not use "%s" as printer: class does not extend %s', + $printerClass, + Printer::class + ) + ); + } + + if (!$class->isInstantiable()) { + $this->exitWithErrorMessage( + sprintf( + 'Could not use "%s" as printer: class cannot be instantiated', + $printerClass + ) + ); + } + + if ($class->isSubclassOf(ResultPrinter::class)) { + return $printerClass; + } + + $outputStream = isset($this->arguments['stderr']) ? 'php://stderr' : null; + + return $class->newInstance($outputStream); + } + + /** + * Loads a bootstrap file. + */ + protected function handleBootstrap(string $filename): void + { + try { + FileLoader::checkAndLoad($filename); + } catch (Exception $e) { + $this->exitWithErrorMessage($e->getMessage()); + } + } + + protected function handleVersionCheck(): void + { + $this->printVersionString(); + + $latestVersion = file_get_contents('https://phar.phpunit.de/latest-version-of/phpunit'); + $isOutdated = version_compare($latestVersion, Version::id(), '>'); + + if ($isOutdated) { + printf( + 'You are not using the latest version of PHPUnit.' . PHP_EOL . + 'The latest version is PHPUnit %s.' . PHP_EOL, + $latestVersion + ); + } else { + print 'You are using the latest version of PHPUnit.' . PHP_EOL; + } + + exit(TestRunner::SUCCESS_EXIT); + } + + /** + * Show the help message. + */ + protected function showHelp(): void + { + $this->printVersionString(); + (new Help)->writeToConsole(); + } + + /** + * Custom callback for test suite discovery. + */ + protected function handleCustomTestSuite(): void + { + } + + private function printVersionString(): void + { + if ($this->versionStringPrinted) { + return; + } + + print Version::getVersionString() . PHP_EOL . PHP_EOL; + + $this->versionStringPrinted = true; + } + + private function exitWithErrorMessage(string $message): void + { + $this->printVersionString(); + + print $message . PHP_EOL; + + exit(TestRunner::FAILURE_EXIT); + } + + private function handleExtensions(string $directory): void + { + foreach ((new FileIteratorFacade)->getFilesAsArray($directory, '.phar') as $file) { + if (!file_exists('phar://' . $file . '/manifest.xml')) { + $this->arguments['notLoadedExtensions'][] = $file . ' is not an extension for PHPUnit'; + + continue; + } + + try { + $applicationName = new ApplicationName('phpunit/phpunit'); + $version = new PharIoVersion(Version::series()); + $manifest = ManifestLoader::fromFile('phar://' . $file . '/manifest.xml'); + + if (!$manifest->isExtensionFor($applicationName)) { + $this->arguments['notLoadedExtensions'][] = $file . ' is not an extension for PHPUnit'; + + continue; + } + + if (!$manifest->isExtensionFor($applicationName, $version)) { + $this->arguments['notLoadedExtensions'][] = $file . ' is not compatible with this version of PHPUnit'; + + continue; + } + } catch (ManifestException $e) { + $this->arguments['notLoadedExtensions'][] = $file . ': ' . $e->getMessage(); + + continue; + } + + require $file; + + $this->arguments['loadedExtensions'][] = $manifest->getName()->asString() . ' ' . $manifest->getVersion()->getVersionString(); + } + } + + private function handleListGroups(TestSuite $suite, bool $exit): int + { + $this->printVersionString(); + + print 'Available test group(s):' . PHP_EOL; + + $groups = $suite->getGroups(); + sort($groups); + + foreach ($groups as $group) { + printf( + ' - %s' . PHP_EOL, + $group + ); + } + + if ($exit) { + exit(TestRunner::SUCCESS_EXIT); + } + + return TestRunner::SUCCESS_EXIT; + } + + /** + * @throws \PHPUnit\Framework\Exception + */ + private function handleListSuites(bool $exit): int + { + $this->printVersionString(); + + print 'Available test suite(s):' . PHP_EOL; + + $configuration = Configuration::getInstance( + $this->arguments['configuration'] + ); + + foreach ($configuration->getTestSuiteNames() as $suiteName) { + printf( + ' - %s' . PHP_EOL, + $suiteName + ); + } + + if ($exit) { + exit(TestRunner::SUCCESS_EXIT); + } + + return TestRunner::SUCCESS_EXIT; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function handleListTests(TestSuite $suite, bool $exit): int + { + $this->printVersionString(); + + $renderer = new TextTestListRenderer; + + print $renderer->render($suite); + + if ($exit) { + exit(TestRunner::SUCCESS_EXIT); + } + + return TestRunner::SUCCESS_EXIT; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function handleListTestsXml(TestSuite $suite, string $target, bool $exit): int + { + $this->printVersionString(); + + $renderer = new XmlTestListRenderer; + + file_put_contents($target, $renderer->render($suite)); + + printf( + 'Wrote list of tests that would have been run to %s' . PHP_EOL, + $target + ); + + if ($exit) { + exit(TestRunner::SUCCESS_EXIT); + } + + return TestRunner::SUCCESS_EXIT; + } + + private function handleOrderByOption(string $value): void + { + foreach (explode(',', $value) as $order) { + switch ($order) { + case 'default': + $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_DEFAULT; + $this->arguments['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFAULT; + $this->arguments['resolveDependencies'] = true; + + break; + + case 'defects': + $this->arguments['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFECTS_FIRST; + + break; + + case 'depends': + $this->arguments['resolveDependencies'] = true; + + break; + + case 'duration': + $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_DURATION; + + break; + + case 'no-depends': + $this->arguments['resolveDependencies'] = false; + + break; + + case 'random': + $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_RANDOMIZED; + + break; + + case 'reverse': + $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_REVERSED; + + break; + + case 'size': + $this->arguments['executionOrder'] = TestSuiteSorter::ORDER_SIZE; + + break; + + default: + $this->exitWithErrorMessage("unrecognized --order-by option: {$order}"); + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Exception.php new file mode 100644 index 0000000000..7c261e58e7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Exception.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TextUI; + +use RuntimeException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Exception extends RuntimeException implements \PHPUnit\Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Help.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Help.php new file mode 100644 index 0000000000..f5af31147f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/Help.php @@ -0,0 +1,255 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TextUI; + +use const PHP_EOL; +use function count; +use function explode; +use function max; +use function preg_replace_callback; +use function str_pad; +use function str_repeat; +use function strlen; +use function wordwrap; +use PHPUnit\Util\Color; +use SebastianBergmann\Environment\Console; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Help +{ + private const LEFT_MARGIN = ' '; + + private const HELP_TEXT = [ + 'Usage' => [ + ['text' => 'phpunit [options] UnitTest [UnitTest.php]'], + ['text' => 'phpunit [options] '], + ], + 'Code Coverage Options' => [ + ['arg' => '--coverage-clover ', 'desc' => 'Generate code coverage report in Clover XML format'], + ['arg' => '--coverage-crap4j ', 'desc' => 'Generate code coverage report in Crap4J XML format'], + ['arg' => '--coverage-html ', 'desc' => 'Generate code coverage report in HTML format'], + ['arg' => '--coverage-php ', 'desc' => 'Export PHP_CodeCoverage object to file'], + ['arg' => '--coverage-text=', 'desc' => 'Generate code coverage report in text format [default: standard output]'], + ['arg' => '--coverage-xml ', 'desc' => 'Generate code coverage report in PHPUnit XML format'], + ['arg' => '--whitelist ', 'desc' => 'Whitelist for code coverage analysis'], + ['arg' => '--disable-coverage-ignore', 'desc' => 'Disable annotations for ignoring code coverage'], + ['arg' => '--no-coverage', 'desc' => 'Ignore code coverage configuration'], + ['arg' => '--dump-xdebug-filter ', 'desc' => 'Generate script to set Xdebug code coverage filter'], + ], + + 'Logging Options' => [ + ['arg' => '--log-junit ', 'desc' => 'Log test execution in JUnit XML format to file'], + ['arg' => '--log-teamcity ', 'desc' => 'Log test execution in TeamCity format to file'], + ['arg' => '--testdox-html ', 'desc' => 'Write agile documentation in HTML format to file'], + ['arg' => '--testdox-text ', 'desc' => 'Write agile documentation in Text format to file'], + ['arg' => '--testdox-xml ', 'desc' => 'Write agile documentation in XML format to file'], + ['arg' => '--reverse-list', 'desc' => 'Print defects in reverse order'], + ['arg' => '--no-logging', 'desc' => 'Ignore logging configuration'], + ], + + 'Test Selection Options' => [ + ['arg' => '--filter ', 'desc' => 'Filter which tests to run'], + ['arg' => '--testsuite ', 'desc' => 'Filter which testsuite to run'], + ['arg' => '--group ', 'desc' => 'Only runs tests from the specified group(s)'], + ['arg' => '--exclude-group ', 'desc' => 'Exclude tests from the specified group(s)'], + ['arg' => '--list-groups', 'desc' => 'List available test groups'], + ['arg' => '--list-suites', 'desc' => 'List available test suites'], + ['arg' => '--list-tests', 'desc' => 'List available tests'], + ['arg' => '--list-tests-xml ', 'desc' => 'List available tests in XML format'], + ['arg' => '--test-suffix ', 'desc' => 'Only search for test in files with specified suffix(es). Default: Test.php,.phpt'], + ], + + 'Test Execution Options' => [ + ['arg' => '--dont-report-useless-tests', 'desc' => 'Do not report tests that do not test anything'], + ['arg' => '--strict-coverage', 'desc' => 'Be strict about @covers annotation usage'], + ['arg' => '--strict-global-state', 'desc' => 'Be strict about changes to global state'], + ['arg' => '--disallow-test-output', 'desc' => 'Be strict about output during tests'], + ['arg' => '--disallow-resource-usage', 'desc' => 'Be strict about resource usage during small tests'], + ['arg' => '--enforce-time-limit', 'desc' => 'Enforce time limit based on test size'], + ['arg' => '--default-time-limit=', 'desc' => 'Timeout in seconds for tests without @small, @medium or @large'], + ['arg' => '--disallow-todo-tests', 'desc' => 'Disallow @todo-annotated tests'], + ['spacer' => ''], + + ['arg' => '--process-isolation', 'desc' => 'Run each test in a separate PHP process'], + ['arg' => '--globals-backup', 'desc' => 'Backup and restore $GLOBALS for each test'], + ['arg' => '--static-backup', 'desc' => 'Backup and restore static attributes for each test'], + ['spacer' => ''], + + ['arg' => '--colors=', 'desc' => 'Use colors in output ("never", "auto" or "always")'], + ['arg' => '--columns ', 'desc' => 'Number of columns to use for progress output'], + ['arg' => '--columns max', 'desc' => 'Use maximum number of columns for progress output'], + ['arg' => '--stderr', 'desc' => 'Write to STDERR instead of STDOUT'], + ['arg' => '--stop-on-defect', 'desc' => 'Stop execution upon first not-passed test'], + ['arg' => '--stop-on-error', 'desc' => 'Stop execution upon first error'], + ['arg' => '--stop-on-failure', 'desc' => 'Stop execution upon first error or failure'], + ['arg' => '--stop-on-warning', 'desc' => 'Stop execution upon first warning'], + ['arg' => '--stop-on-risky', 'desc' => 'Stop execution upon first risky test'], + ['arg' => '--stop-on-skipped', 'desc' => 'Stop execution upon first skipped test'], + ['arg' => '--stop-on-incomplete', 'desc' => 'Stop execution upon first incomplete test'], + ['arg' => '--fail-on-warning', 'desc' => 'Treat tests with warnings as failures'], + ['arg' => '--fail-on-risky', 'desc' => 'Treat risky tests as failures'], + ['arg' => '-v|--verbose', 'desc' => 'Output more verbose information'], + ['arg' => '--debug', 'desc' => 'Display debugging information'], + ['spacer' => ''], + + ['arg' => '--loader ', 'desc' => 'TestSuiteLoader implementation to use'], + ['arg' => '--repeat ', 'desc' => 'Runs the test(s) repeatedly'], + ['arg' => '--teamcity', 'desc' => 'Report test execution progress in TeamCity format'], + ['arg' => '--testdox', 'desc' => 'Report test execution progress in TestDox format'], + ['arg' => '--testdox-group', 'desc' => 'Only include tests from the specified group(s)'], + ['arg' => '--testdox-exclude-group', 'desc' => 'Exclude tests from the specified group(s)'], + ['arg' => '--no-interaction', 'desc' => 'Disable TestDox progress animation'], + ['arg' => '--printer ', 'desc' => 'TestListener implementation to use'], + ['spacer' => ''], + + ['arg' => '--order-by=', 'desc' => 'Run tests in order: default|defects|duration|no-depends|random|reverse|size'], + ['arg' => '--random-order-seed=', 'desc' => 'Use a specific random seed for random order'], + ['arg' => '--cache-result', 'desc' => 'Write test results to cache file'], + ['arg' => '--do-not-cache-result', 'desc' => 'Do not write test results to cache file'], + ], + + 'Configuration Options' => [ + ['arg' => '--prepend ', 'desc' => 'A PHP script that is included as early as possible'], + ['arg' => '--bootstrap ', 'desc' => 'A PHP script that is included before the tests run'], + ['arg' => '-c|--configuration ', 'desc' => 'Read configuration from XML file'], + ['arg' => '--no-configuration', 'desc' => 'Ignore default configuration file (phpunit.xml)'], + ['arg' => '--no-extensions', 'desc' => 'Do not load PHPUnit extensions'], + ['arg' => '--include-path ', 'desc' => 'Prepend PHP\'s include_path with given path(s)'], + ['arg' => '-d ', 'desc' => 'Sets a php.ini value'], + ['arg' => '--generate-configuration', 'desc' => 'Generate configuration file with suggested settings'], + ['arg' => '--cache-result-file=', 'desc' => 'Specify result cache path and filename'], + ], + + 'Miscellaneous Options' => [ + ['arg' => '-h|--help', 'desc' => 'Prints this usage information'], + ['arg' => '--version', 'desc' => 'Prints the version and exits'], + ['arg' => '--atleast-version ', 'desc' => 'Checks that version is greater than min and exits'], + ['arg' => '--check-version', 'desc' => 'Check whether PHPUnit is the latest version'], + ], + + ]; + + /** + * @var int Number of columns required to write the longest option name to the console + */ + private $maxArgLength = 0; + + /** + * @var int Number of columns left for the description field after padding and option + */ + private $maxDescLength; + + /** + * @var bool Use color highlights for sections, options and parameters + */ + private $hasColor = false; + + public function __construct(?int $width = null, ?bool $withColor = null) + { + if ($width === null) { + $width = (new Console)->getNumberOfColumns(); + } + + if ($withColor === null) { + $this->hasColor = (new Console)->hasColorSupport(); + } else { + $this->hasColor = $withColor; + } + + foreach (self::HELP_TEXT as $options) { + foreach ($options as $option) { + if (isset($option['arg'])) { + $this->maxArgLength = max($this->maxArgLength, isset($option['arg']) ? strlen($option['arg']) : 0); + } + } + } + + $this->maxDescLength = $width - $this->maxArgLength - 4; + } + + /** + * Write the help file to the CLI, adapting width and colors to the console. + */ + public function writeToConsole(): void + { + if ($this->hasColor) { + $this->writeWithColor(); + } else { + $this->writePlaintext(); + } + } + + private function writePlaintext(): void + { + foreach (self::HELP_TEXT as $section => $options) { + print "{$section}:" . PHP_EOL; + + if ($section !== 'Usage') { + print PHP_EOL; + } + + foreach ($options as $option) { + if (isset($option['spacer'])) { + print PHP_EOL; + } + + if (isset($option['text'])) { + print self::LEFT_MARGIN . $option['text'] . PHP_EOL; + } + + if (isset($option['arg'])) { + $arg = str_pad($option['arg'], $this->maxArgLength); + print self::LEFT_MARGIN . $arg . ' ' . $option['desc'] . PHP_EOL; + } + } + + print PHP_EOL; + } + } + + private function writeWithColor(): void + { + foreach (self::HELP_TEXT as $section => $options) { + print Color::colorize('fg-yellow', "{$section}:") . PHP_EOL; + + foreach ($options as $option) { + if (isset($option['spacer'])) { + print PHP_EOL; + } + + if (isset($option['text'])) { + print self::LEFT_MARGIN . $option['text'] . PHP_EOL; + } + + if (isset($option['arg'])) { + $arg = Color::colorize('fg-green', str_pad($option['arg'], $this->maxArgLength)); + $arg = preg_replace_callback( + '/(<[^>]+>)/', + static function ($matches) { + return Color::colorize('fg-cyan', $matches[0]); + }, + $arg + ); + $desc = explode(PHP_EOL, wordwrap($option['desc'], $this->maxDescLength, PHP_EOL)); + + print self::LEFT_MARGIN . $arg . ' ' . $desc[0] . PHP_EOL; + + for ($i = 1; $i < count($desc); $i++) { + print str_repeat(' ', $this->maxArgLength + 3) . $desc[$i] . PHP_EOL; + } + } + } + + print PHP_EOL; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php new file mode 100644 index 0000000000..c4d06b3d24 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/ResultPrinter.php @@ -0,0 +1,588 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TextUI; + +use const PHP_EOL; +use function array_map; +use function array_reverse; +use function count; +use function floor; +use function implode; +use function in_array; +use function is_int; +use function max; +use function preg_split; +use function sprintf; +use function str_pad; +use function str_repeat; +use function strlen; +use function vsprintf; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\InvalidArgumentException; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestFailure; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestResult; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; +use PHPUnit\Runner\PhptTestCase; +use PHPUnit\Util\Color; +use PHPUnit\Util\Printer; +use SebastianBergmann\Environment\Console; +use SebastianBergmann\Timer\Timer; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class ResultPrinter extends Printer implements TestListener +{ + public const EVENT_TEST_START = 0; + + public const EVENT_TEST_END = 1; + + public const EVENT_TESTSUITE_START = 2; + + public const EVENT_TESTSUITE_END = 3; + + public const COLOR_NEVER = 'never'; + + public const COLOR_AUTO = 'auto'; + + public const COLOR_ALWAYS = 'always'; + + public const COLOR_DEFAULT = self::COLOR_NEVER; + + private const AVAILABLE_COLORS = [self::COLOR_NEVER, self::COLOR_AUTO, self::COLOR_ALWAYS]; + + /** + * @var int + */ + protected $column = 0; + + /** + * @var int + */ + protected $maxColumn; + + /** + * @var bool + */ + protected $lastTestFailed = false; + + /** + * @var int + */ + protected $numAssertions = 0; + + /** + * @var int + */ + protected $numTests = -1; + + /** + * @var int + */ + protected $numTestsRun = 0; + + /** + * @var int + */ + protected $numTestsWidth; + + /** + * @var bool + */ + protected $colors = false; + + /** + * @var bool + */ + protected $debug = false; + + /** + * @var bool + */ + protected $verbose = false; + + /** + * @var int + */ + private $numberOfColumns; + + /** + * @var bool + */ + private $reverse; + + /** + * @var bool + */ + private $defectListPrinted = false; + + /** + * Constructor. + * + * @param null|resource|string $out + * @param int|string $numberOfColumns + * + * @throws Exception + */ + public function __construct($out = null, bool $verbose = false, string $colors = self::COLOR_DEFAULT, bool $debug = false, $numberOfColumns = 80, bool $reverse = false) + { + parent::__construct($out); + + if (!in_array($colors, self::AVAILABLE_COLORS, true)) { + throw InvalidArgumentException::create( + 3, + vsprintf('value from "%s", "%s" or "%s"', self::AVAILABLE_COLORS) + ); + } + + if (!is_int($numberOfColumns) && $numberOfColumns !== 'max') { + throw InvalidArgumentException::create(5, 'integer or "max"'); + } + + $console = new Console; + $maxNumberOfColumns = $console->getNumberOfColumns(); + + if ($numberOfColumns === 'max' || ($numberOfColumns !== 80 && $numberOfColumns > $maxNumberOfColumns)) { + $numberOfColumns = $maxNumberOfColumns; + } + + $this->numberOfColumns = $numberOfColumns; + $this->verbose = $verbose; + $this->debug = $debug; + $this->reverse = $reverse; + + if ($colors === self::COLOR_AUTO && $console->hasColorSupport()) { + $this->colors = true; + } else { + $this->colors = (self::COLOR_ALWAYS === $colors); + } + } + + /** + * @throws \SebastianBergmann\Timer\RuntimeException + */ + public function printResult(TestResult $result): void + { + $this->printHeader($result); + $this->printErrors($result); + $this->printWarnings($result); + $this->printFailures($result); + $this->printRisky($result); + + if ($this->verbose) { + $this->printIncompletes($result); + $this->printSkipped($result); + } + + $this->printFooter($result); + } + + /** + * An error occurred. + */ + public function addError(Test $test, Throwable $t, float $time): void + { + $this->writeProgressWithColor('fg-red, bold', 'E'); + $this->lastTestFailed = true; + } + + /** + * A failure occurred. + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + $this->writeProgressWithColor('bg-red, fg-white', 'F'); + $this->lastTestFailed = true; + } + + /** + * A warning occurred. + */ + public function addWarning(Test $test, Warning $e, float $time): void + { + $this->writeProgressWithColor('fg-yellow, bold', 'W'); + $this->lastTestFailed = true; + } + + /** + * Incomplete test. + */ + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + $this->writeProgressWithColor('fg-yellow, bold', 'I'); + $this->lastTestFailed = true; + } + + /** + * Risky test. + */ + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + $this->writeProgressWithColor('fg-yellow, bold', 'R'); + $this->lastTestFailed = true; + } + + /** + * Skipped test. + */ + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + $this->writeProgressWithColor('fg-cyan, bold', 'S'); + $this->lastTestFailed = true; + } + + /** + * A testsuite started. + */ + public function startTestSuite(TestSuite $suite): void + { + if ($this->numTests == -1) { + $this->numTests = count($suite); + $this->numTestsWidth = strlen((string) $this->numTests); + $this->maxColumn = $this->numberOfColumns - strlen(' / (XXX%)') - (2 * $this->numTestsWidth); + } + } + + /** + * A testsuite ended. + */ + public function endTestSuite(TestSuite $suite): void + { + } + + /** + * A test started. + */ + public function startTest(Test $test): void + { + if ($this->debug) { + $this->write( + sprintf( + "Test '%s' started\n", + \PHPUnit\Util\Test::describeAsString($test) + ) + ); + } + } + + /** + * A test ended. + */ + public function endTest(Test $test, float $time): void + { + if ($this->debug) { + $this->write( + sprintf( + "Test '%s' ended\n", + \PHPUnit\Util\Test::describeAsString($test) + ) + ); + } + + if (!$this->lastTestFailed) { + $this->writeProgress('.'); + } + + if ($test instanceof TestCase) { + $this->numAssertions += $test->getNumAssertions(); + } elseif ($test instanceof PhptTestCase) { + $this->numAssertions++; + } + + $this->lastTestFailed = false; + + if ($test instanceof TestCase && !$test->hasExpectationOnOutput()) { + $this->write($test->getActualOutput()); + } + } + + protected function printDefects(array $defects, string $type): void + { + $count = count($defects); + + if ($count == 0) { + return; + } + + if ($this->defectListPrinted) { + $this->write("\n--\n\n"); + } + + $this->write( + sprintf( + "There %s %d %s%s:\n", + ($count == 1) ? 'was' : 'were', + $count, + $type, + ($count == 1) ? '' : 's' + ) + ); + + $i = 1; + + if ($this->reverse) { + $defects = array_reverse($defects); + } + + foreach ($defects as $defect) { + $this->printDefect($defect, $i++); + } + + $this->defectListPrinted = true; + } + + protected function printDefect(TestFailure $defect, int $count): void + { + $this->printDefectHeader($defect, $count); + $this->printDefectTrace($defect); + } + + protected function printDefectHeader(TestFailure $defect, int $count): void + { + $this->write( + sprintf( + "\n%d) %s\n", + $count, + $defect->getTestName() + ) + ); + } + + protected function printDefectTrace(TestFailure $defect): void + { + $e = $defect->thrownException(); + $this->write((string) $e); + + while ($e = $e->getPrevious()) { + $this->write("\nCaused by\n" . $e); + } + } + + protected function printErrors(TestResult $result): void + { + $this->printDefects($result->errors(), 'error'); + } + + protected function printFailures(TestResult $result): void + { + $this->printDefects($result->failures(), 'failure'); + } + + protected function printWarnings(TestResult $result): void + { + $this->printDefects($result->warnings(), 'warning'); + } + + protected function printIncompletes(TestResult $result): void + { + $this->printDefects($result->notImplemented(), 'incomplete test'); + } + + protected function printRisky(TestResult $result): void + { + $this->printDefects($result->risky(), 'risky test'); + } + + protected function printSkipped(TestResult $result): void + { + $this->printDefects($result->skipped(), 'skipped test'); + } + + /** + * @throws \SebastianBergmann\Timer\RuntimeException + */ + protected function printHeader(TestResult $result): void + { + if (count($result) > 0) { + $this->write(PHP_EOL . PHP_EOL . Timer::resourceUsage() . PHP_EOL . PHP_EOL); + } + } + + protected function printFooter(TestResult $result): void + { + if (count($result) === 0) { + $this->writeWithColor( + 'fg-black, bg-yellow', + 'No tests executed!' + ); + + return; + } + + if ($result->wasSuccessfulAndNoTestIsRiskyOrSkippedOrIncomplete()) { + $this->writeWithColor( + 'fg-black, bg-green', + sprintf( + 'OK (%d test%s, %d assertion%s)', + count($result), + (count($result) == 1) ? '' : 's', + $this->numAssertions, + ($this->numAssertions == 1) ? '' : 's' + ) + ); + + return; + } + + $color = 'fg-black, bg-yellow'; + + if ($result->wasSuccessful()) { + if ($this->verbose || !$result->allHarmless()) { + $this->write("\n"); + } + + $this->writeWithColor( + $color, + 'OK, but incomplete, skipped, or risky tests!' + ); + } else { + $this->write("\n"); + + if ($result->errorCount()) { + $color = 'fg-white, bg-red'; + + $this->writeWithColor( + $color, + 'ERRORS!' + ); + } elseif ($result->failureCount()) { + $color = 'fg-white, bg-red'; + + $this->writeWithColor( + $color, + 'FAILURES!' + ); + } elseif ($result->warningCount()) { + $color = 'fg-black, bg-yellow'; + + $this->writeWithColor( + $color, + 'WARNINGS!' + ); + } + } + + $this->writeCountString(count($result), 'Tests', $color, true); + $this->writeCountString($this->numAssertions, 'Assertions', $color, true); + $this->writeCountString($result->errorCount(), 'Errors', $color); + $this->writeCountString($result->failureCount(), 'Failures', $color); + $this->writeCountString($result->warningCount(), 'Warnings', $color); + $this->writeCountString($result->skippedCount(), 'Skipped', $color); + $this->writeCountString($result->notImplementedCount(), 'Incomplete', $color); + $this->writeCountString($result->riskyCount(), 'Risky', $color); + $this->writeWithColor($color, '.'); + } + + protected function writeProgress(string $progress): void + { + if ($this->debug) { + return; + } + + $this->write($progress); + $this->column++; + $this->numTestsRun++; + + if ($this->column == $this->maxColumn || $this->numTestsRun == $this->numTests) { + if ($this->numTestsRun == $this->numTests) { + $this->write(str_repeat(' ', $this->maxColumn - $this->column)); + } + + $this->write( + sprintf( + ' %' . $this->numTestsWidth . 'd / %' . + $this->numTestsWidth . 'd (%3s%%)', + $this->numTestsRun, + $this->numTests, + floor(($this->numTestsRun / $this->numTests) * 100) + ) + ); + + if ($this->column == $this->maxColumn) { + $this->writeNewLine(); + } + } + } + + protected function writeNewLine(): void + { + $this->column = 0; + $this->write("\n"); + } + + /** + * Formats a buffer with a specified ANSI color sequence if colors are + * enabled. + */ + protected function colorizeTextBox(string $color, string $buffer): string + { + if (!$this->colors) { + return $buffer; + } + + $lines = preg_split('/\r\n|\r|\n/', $buffer); + $padding = max(array_map('\strlen', $lines)); + + $styledLines = []; + + foreach ($lines as $line) { + $styledLines[] = Color::colorize($color, str_pad($line, $padding)); + } + + return implode(PHP_EOL, $styledLines); + } + + /** + * Writes a buffer out with a color sequence if colors are enabled. + */ + protected function writeWithColor(string $color, string $buffer, bool $lf = true): void + { + $this->write($this->colorizeTextBox($color, $buffer)); + + if ($lf) { + $this->write(PHP_EOL); + } + } + + /** + * Writes progress with a color sequence if colors are enabled. + */ + protected function writeProgressWithColor(string $color, string $buffer): void + { + $buffer = $this->colorizeTextBox($color, $buffer); + $this->writeProgress($buffer); + } + + private function writeCountString(int $count, string $name, string $color, bool $always = false): void + { + static $first = true; + + if ($always || $count > 0) { + $this->writeWithColor( + $color, + sprintf( + '%s%s: %d', + !$first ? ', ' : '', + $name, + $count + ), + false + ); + + $first = false; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/TestRunner.php new file mode 100644 index 0000000000..017b63a63f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/TextUI/TestRunner.php @@ -0,0 +1,1392 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\TextUI; + +use const PHP_EOL; +use const PHP_MAJOR_VERSION; +use const PHP_SAPI; +use function array_diff; +use function assert; +use function class_exists; +use function count; +use function dirname; +use function extension_loaded; +use function file_put_contents; +use function htmlspecialchars; +use function ini_get; +use function is_int; +use function is_string; +use function is_subclass_of; +use function mt_srand; +use function range; +use function realpath; +use function sprintf; +use function strpos; +use function time; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestResult; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\AfterLastTestHook; +use PHPUnit\Runner\BaseTestRunner; +use PHPUnit\Runner\BeforeFirstTestHook; +use PHPUnit\Runner\DefaultTestResultCache; +use PHPUnit\Runner\Filter\ExcludeGroupFilterIterator; +use PHPUnit\Runner\Filter\Factory; +use PHPUnit\Runner\Filter\IncludeGroupFilterIterator; +use PHPUnit\Runner\Filter\NameFilterIterator; +use PHPUnit\Runner\Hook; +use PHPUnit\Runner\NullTestResultCache; +use PHPUnit\Runner\ResultCacheExtension; +use PHPUnit\Runner\StandardTestSuiteLoader; +use PHPUnit\Runner\TestHook; +use PHPUnit\Runner\TestListenerAdapter; +use PHPUnit\Runner\TestSuiteLoader; +use PHPUnit\Runner\TestSuiteSorter; +use PHPUnit\Runner\Version; +use PHPUnit\Util\Configuration; +use PHPUnit\Util\Filesystem; +use PHPUnit\Util\Log\JUnit; +use PHPUnit\Util\Log\TeamCity; +use PHPUnit\Util\Printer; +use PHPUnit\Util\TestDox\CliTestDoxPrinter; +use PHPUnit\Util\TestDox\HtmlResultPrinter; +use PHPUnit\Util\TestDox\TextResultPrinter; +use PHPUnit\Util\TestDox\XmlResultPrinter; +use PHPUnit\Util\XdebugFilterScriptGenerator; +use ReflectionClass; +use ReflectionException; +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException; +use SebastianBergmann\CodeCoverage\Filter as CodeCoverageFilter; +use SebastianBergmann\CodeCoverage\Report\Clover as CloverReport; +use SebastianBergmann\CodeCoverage\Report\Crap4j as Crap4jReport; +use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport; +use SebastianBergmann\CodeCoverage\Report\PHP as PhpReport; +use SebastianBergmann\CodeCoverage\Report\Text as TextReport; +use SebastianBergmann\CodeCoverage\Report\Xml\Facade as XmlReport; +use SebastianBergmann\Comparator\Comparator; +use SebastianBergmann\Environment\Runtime; +use SebastianBergmann\Invoker\Invoker; +use SebastianBergmann\Timer\Timer; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TestRunner extends BaseTestRunner +{ + public const SUCCESS_EXIT = 0; + + public const FAILURE_EXIT = 1; + + public const EXCEPTION_EXIT = 2; + + /** + * @var bool + */ + private static $versionStringPrinted = false; + + /** + * @var CodeCoverageFilter + */ + private $codeCoverageFilter; + + /** + * @var TestSuiteLoader + */ + private $loader; + + /** + * @psalm-var Printer&TestListener + */ + private $printer; + + /** + * @var Runtime + */ + private $runtime; + + /** + * @var bool + */ + private $messagePrinted = false; + + /** + * @var Hook[] + */ + private $extensions = []; + + public function __construct(TestSuiteLoader $loader = null, CodeCoverageFilter $filter = null) + { + if ($filter === null) { + $filter = new CodeCoverageFilter; + } + + $this->codeCoverageFilter = $filter; + $this->loader = $loader; + $this->runtime = new Runtime; + } + + /** + * @throws \PHPUnit\Runner\Exception + * @throws Exception + */ + public function doRun(Test $suite, array $arguments = [], array $warnings = [], bool $exit = true): TestResult + { + if (isset($arguments['configuration'])) { + $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] = $arguments['configuration']; + } + + $this->handleConfiguration($arguments); + + if (is_int($arguments['columns']) && $arguments['columns'] < 16) { + $arguments['columns'] = 16; + $tooFewColumnsRequested = true; + } + + if (isset($arguments['bootstrap'])) { + $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap']; + } + + if ($suite instanceof TestCase || $suite instanceof TestSuite) { + if ($arguments['backupGlobals'] === true) { + $suite->setBackupGlobals(true); + } + + if ($arguments['backupStaticAttributes'] === true) { + $suite->setBackupStaticAttributes(true); + } + + if ($arguments['beStrictAboutChangesToGlobalState'] === true) { + $suite->setBeStrictAboutChangesToGlobalState(true); + } + } + + if ($arguments['executionOrder'] === TestSuiteSorter::ORDER_RANDOMIZED) { + mt_srand($arguments['randomOrderSeed']); + } + + if ($arguments['cacheResult']) { + if (!isset($arguments['cacheResultFile'])) { + if (isset($arguments['configuration']) && $arguments['configuration'] instanceof Configuration) { + $cacheLocation = $arguments['configuration']->getFilename(); + } else { + $cacheLocation = $_SERVER['PHP_SELF']; + } + + $arguments['cacheResultFile'] = null; + + $cacheResultFile = realpath($cacheLocation); + + if ($cacheResultFile !== false) { + $arguments['cacheResultFile'] = dirname($cacheResultFile); + } + } + + $cache = new DefaultTestResultCache($arguments['cacheResultFile']); + + $this->addExtension(new ResultCacheExtension($cache)); + } + + if ($arguments['executionOrder'] !== TestSuiteSorter::ORDER_DEFAULT || $arguments['executionOrderDefects'] !== TestSuiteSorter::ORDER_DEFAULT || $arguments['resolveDependencies']) { + $cache = $cache ?? new NullTestResultCache; + + $cache->load(); + + $sorter = new TestSuiteSorter($cache); + + $sorter->reorderTestsInSuite($suite, $arguments['executionOrder'], $arguments['resolveDependencies'], $arguments['executionOrderDefects']); + $originalExecutionOrder = $sorter->getOriginalExecutionOrder(); + + unset($sorter); + } + + if (is_int($arguments['repeat']) && $arguments['repeat'] > 0) { + $_suite = new TestSuite; + + /* @noinspection PhpUnusedLocalVariableInspection */ + foreach (range(1, $arguments['repeat']) as $step) { + $_suite->addTest($suite); + } + + $suite = $_suite; + + unset($_suite); + } + + $result = $this->createTestResult(); + + $listener = new TestListenerAdapter; + $listenerNeeded = false; + + foreach ($this->extensions as $extension) { + if ($extension instanceof TestHook) { + $listener->add($extension); + + $listenerNeeded = true; + } + } + + if ($listenerNeeded) { + $result->addListener($listener); + } + + unset($listener, $listenerNeeded); + + if (!$arguments['convertDeprecationsToExceptions']) { + $result->convertDeprecationsToExceptions(false); + } + + if (!$arguments['convertErrorsToExceptions']) { + $result->convertErrorsToExceptions(false); + } + + if (!$arguments['convertNoticesToExceptions']) { + $result->convertNoticesToExceptions(false); + } + + if (!$arguments['convertWarningsToExceptions']) { + $result->convertWarningsToExceptions(false); + } + + if ($arguments['stopOnError']) { + $result->stopOnError(true); + } + + if ($arguments['stopOnFailure']) { + $result->stopOnFailure(true); + } + + if ($arguments['stopOnWarning']) { + $result->stopOnWarning(true); + } + + if ($arguments['stopOnIncomplete']) { + $result->stopOnIncomplete(true); + } + + if ($arguments['stopOnRisky']) { + $result->stopOnRisky(true); + } + + if ($arguments['stopOnSkipped']) { + $result->stopOnSkipped(true); + } + + if ($arguments['stopOnDefect']) { + $result->stopOnDefect(true); + } + + if ($arguments['registerMockObjectsFromTestArgumentsRecursively']) { + $result->setRegisterMockObjectsFromTestArgumentsRecursively(true); + } + + if ($this->printer === null) { + if (isset($arguments['printer'])) { + if ($arguments['printer'] instanceof Printer && $arguments['printer'] instanceof TestListener) { + $this->printer = $arguments['printer']; + } elseif (is_string($arguments['printer']) && class_exists($arguments['printer'], false)) { + try { + new ReflectionClass($arguments['printer']); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (is_subclass_of($arguments['printer'], ResultPrinter::class)) { + $this->printer = $this->createPrinter($arguments['printer'], $arguments); + } + } + } else { + $this->printer = $this->createPrinter(ResultPrinter::class, $arguments); + } + } + + if (isset($originalExecutionOrder) && $this->printer instanceof CliTestDoxPrinter) { + assert($this->printer instanceof CliTestDoxPrinter); + + $this->printer->setOriginalExecutionOrder($originalExecutionOrder); + $this->printer->setShowProgressAnimation(!$arguments['noInteraction']); + } + + $this->printer->write( + Version::getVersionString() . "\n" + ); + + self::$versionStringPrinted = true; + + if ($arguments['verbose']) { + $this->writeMessage('Runtime', $this->runtime->getNameWithVersionAndCodeCoverageDriver()); + + if (isset($arguments['configuration'])) { + $this->writeMessage( + 'Configuration', + $arguments['configuration']->getFilename() + ); + } + + foreach ($arguments['loadedExtensions'] as $extension) { + $this->writeMessage( + 'Extension', + $extension + ); + } + + foreach ($arguments['notLoadedExtensions'] as $extension) { + $this->writeMessage( + 'Extension', + $extension + ); + } + } + + foreach ($warnings as $warning) { + $this->writeMessage('Warning', $warning); + } + + if ($arguments['executionOrder'] === TestSuiteSorter::ORDER_RANDOMIZED) { + $this->writeMessage( + 'Random seed', + (string) $arguments['randomOrderSeed'] + ); + } + + if (isset($tooFewColumnsRequested)) { + $this->writeMessage('Error', 'Less than 16 columns requested, number of columns set to 16'); + } + + if ($this->runtime->discardsComments()) { + $this->writeMessage('Warning', 'opcache.save_comments=0 set; annotations will not work'); + } + + if (isset($arguments['configuration']) && $arguments['configuration']->hasValidationErrors()) { + $this->write( + "\n Warning - The configuration file did not pass validation!\n The following problems have been detected:\n" + ); + + foreach ($arguments['configuration']->getValidationErrors() as $line => $errors) { + $this->write(sprintf("\n Line %d:\n", $line)); + + foreach ($errors as $msg) { + $this->write(sprintf(" - %s\n", $msg)); + } + } + + $this->write("\n Test results may not be as expected.\n\n"); + } + + if (isset($arguments['conflictBetweenPrinterClassAndTestdox'])) { + $this->writeMessage('Warning', 'Directives printerClass and testdox are mutually exclusive'); + } + + foreach ($arguments['listeners'] as $listener) { + $result->addListener($listener); + } + + $result->addListener($this->printer); + + $codeCoverageReports = 0; + + if (!isset($arguments['noLogging'])) { + if (isset($arguments['testdoxHTMLFile'])) { + $result->addListener( + new HtmlResultPrinter( + $arguments['testdoxHTMLFile'], + $arguments['testdoxGroups'], + $arguments['testdoxExcludeGroups'] + ) + ); + } + + if (isset($arguments['testdoxTextFile'])) { + $result->addListener( + new TextResultPrinter( + $arguments['testdoxTextFile'], + $arguments['testdoxGroups'], + $arguments['testdoxExcludeGroups'] + ) + ); + } + + if (isset($arguments['testdoxXMLFile'])) { + $result->addListener( + new XmlResultPrinter( + $arguments['testdoxXMLFile'] + ) + ); + } + + if (isset($arguments['teamcityLogfile'])) { + $result->addListener( + new TeamCity($arguments['teamcityLogfile']) + ); + } + + if (isset($arguments['junitLogfile'])) { + $result->addListener( + new JUnit( + $arguments['junitLogfile'], + $arguments['reportUselessTests'] + ) + ); + } + + if (isset($arguments['coverageClover'])) { + $codeCoverageReports++; + } + + if (isset($arguments['coverageCrap4J'])) { + $codeCoverageReports++; + } + + if (isset($arguments['coverageHtml'])) { + $codeCoverageReports++; + } + + if (isset($arguments['coveragePHP'])) { + $codeCoverageReports++; + } + + if (isset($arguments['coverageText'])) { + $codeCoverageReports++; + } + + if (isset($arguments['coverageXml'])) { + $codeCoverageReports++; + } + } + + if (isset($arguments['noCoverage'])) { + $codeCoverageReports = 0; + } + + if ($codeCoverageReports > 0 && PHP_MAJOR_VERSION < 8 && !$this->runtime->canCollectCodeCoverage()) { + $this->writeMessage('Error', 'No code coverage driver is available'); + + $codeCoverageReports = 0; + } + + if ($codeCoverageReports > 0 || isset($arguments['xdebugFilterFile'])) { + $whitelistFromConfigurationFile = false; + $whitelistFromOption = false; + + if (isset($arguments['whitelist'])) { + $this->codeCoverageFilter->addDirectoryToWhitelist($arguments['whitelist']); + + $whitelistFromOption = true; + } + + if (isset($arguments['configuration'])) { + $filterConfiguration = $arguments['configuration']->getFilterConfiguration(); + + if (!empty($filterConfiguration['whitelist'])) { + $whitelistFromConfigurationFile = true; + } + + if (!empty($filterConfiguration['whitelist'])) { + foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) { + $this->codeCoverageFilter->addDirectoryToWhitelist( + $dir['path'], + $dir['suffix'], + $dir['prefix'] + ); + } + + foreach ($filterConfiguration['whitelist']['include']['file'] as $file) { + $this->codeCoverageFilter->addFileToWhitelist($file); + } + + foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) { + $this->codeCoverageFilter->removeDirectoryFromWhitelist( + $dir['path'], + $dir['suffix'], + $dir['prefix'] + ); + } + + foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) { + $this->codeCoverageFilter->removeFileFromWhitelist($file); + } + } + } + } + + if ($codeCoverageReports > 0) { + if (PHP_MAJOR_VERSION >= 8) { + $this->writeMessage('Error', 'This version of PHPUnit does not support code coverage on PHP 8'); + + $codeCoverageReports = 0; + } else { + try { + $codeCoverage = new CodeCoverage( + null, + $this->codeCoverageFilter + ); + + $codeCoverage->setUnintentionallyCoveredSubclassesWhitelist( + [Comparator::class] + ); + + $codeCoverage->setCheckForUnintentionallyCoveredCode( + $arguments['strictCoverage'] + ); + + $codeCoverage->setCheckForMissingCoversAnnotation( + $arguments['strictCoverage'] + ); + + if (isset($arguments['forceCoversAnnotation'])) { + $codeCoverage->setForceCoversAnnotation( + $arguments['forceCoversAnnotation'] + ); + } + + if (isset($arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'])) { + $codeCoverage->setIgnoreDeprecatedCode( + $arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'] + ); + } + + if (isset($arguments['disableCodeCoverageIgnore'])) { + $codeCoverage->setDisableIgnoredLines(true); + } + + if (!empty($filterConfiguration['whitelist'])) { + $codeCoverage->setAddUncoveredFilesFromWhitelist( + $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist'] + ); + + $codeCoverage->setProcessUncoveredFilesFromWhitelist( + $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist'] + ); + } + + if (!$this->codeCoverageFilter->hasWhitelist()) { + if (!$whitelistFromConfigurationFile && !$whitelistFromOption) { + $this->writeMessage('Error', 'No whitelist is configured, no code coverage will be generated.'); + } else { + $this->writeMessage('Error', 'Incorrect whitelist config, no code coverage will be generated.'); + } + + $codeCoverageReports = 0; + + unset($codeCoverage); + } + } catch (CodeCoverageException $e) { + $this->writeMessage('Error', $e->getMessage()); + + $codeCoverageReports = 0; + } + } + } + + if (isset($arguments['xdebugFilterFile'], $filterConfiguration)) { + $this->write("\n"); + + $script = (new XdebugFilterScriptGenerator)->generate($filterConfiguration['whitelist']); + + if ($arguments['xdebugFilterFile'] !== 'php://stdout' && $arguments['xdebugFilterFile'] !== 'php://stderr' && !Filesystem::createDirectory(dirname($arguments['xdebugFilterFile']))) { + $this->write(sprintf('Cannot write Xdebug filter script to %s ' . PHP_EOL, $arguments['xdebugFilterFile'])); + + exit(self::EXCEPTION_EXIT); + } + + file_put_contents($arguments['xdebugFilterFile'], $script); + + $this->write(sprintf('Wrote Xdebug filter script to %s ' . PHP_EOL, $arguments['xdebugFilterFile'])); + + exit(self::SUCCESS_EXIT); + } + + $this->printer->write("\n"); + + if (isset($codeCoverage)) { + $result->setCodeCoverage($codeCoverage); + + if ($codeCoverageReports > 1 && isset($arguments['cacheTokens'])) { + $codeCoverage->setCacheTokens($arguments['cacheTokens']); + } + } + + $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']); + $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']); + $result->beStrictAboutTodoAnnotatedTests($arguments['disallowTodoAnnotatedTests']); + $result->beStrictAboutResourceUsageDuringSmallTests($arguments['beStrictAboutResourceUsageDuringSmallTests']); + + if ($arguments['enforceTimeLimit'] === true) { + if (!class_exists(Invoker::class)) { + $this->writeMessage('Error', 'Package phpunit/php-invoker is required for enforcing time limits'); + } + + if (!extension_loaded('pcntl') || strpos(ini_get('disable_functions'), 'pcntl') !== false) { + $this->writeMessage('Error', 'PHP extension pcntl is required for enforcing time limits'); + } + } + $result->enforceTimeLimit($arguments['enforceTimeLimit']); + $result->setDefaultTimeLimit($arguments['defaultTimeLimit']); + $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']); + $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']); + $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']); + + if ($suite instanceof TestSuite) { + $this->processSuiteFilters($suite, $arguments); + $suite->setRunTestInSeparateProcess($arguments['processIsolation']); + } + + foreach ($this->extensions as $extension) { + if ($extension instanceof BeforeFirstTestHook) { + $extension->executeBeforeFirstTest(); + } + } + + $suite->run($result); + + foreach ($this->extensions as $extension) { + if ($extension instanceof AfterLastTestHook) { + $extension->executeAfterLastTest(); + } + } + + $result->flushListeners(); + + if ($this->printer instanceof ResultPrinter) { + $this->printer->printResult($result); + } + + if (isset($codeCoverage)) { + if (isset($arguments['coverageClover'])) { + $this->codeCoverageGenerationStart('Clover XML'); + + try { + $writer = new CloverReport; + $writer->process($codeCoverage, $arguments['coverageClover']); + + $this->codeCoverageGenerationSucceeded(); + + unset($writer); + } catch (CodeCoverageException $e) { + $this->codeCoverageGenerationFailed($e); + } + } + + if (isset($arguments['coverageCrap4J'])) { + $this->codeCoverageGenerationStart('Crap4J XML'); + + try { + $writer = new Crap4jReport($arguments['crap4jThreshold']); + $writer->process($codeCoverage, $arguments['coverageCrap4J']); + + $this->codeCoverageGenerationSucceeded(); + + unset($writer); + } catch (CodeCoverageException $e) { + $this->codeCoverageGenerationFailed($e); + } + } + + if (isset($arguments['coverageHtml'])) { + $this->codeCoverageGenerationStart('HTML'); + + try { + $writer = new HtmlReport( + $arguments['reportLowUpperBound'], + $arguments['reportHighLowerBound'], + sprintf( + ' and PHPUnit %s', + Version::id() + ) + ); + + $writer->process($codeCoverage, $arguments['coverageHtml']); + + $this->codeCoverageGenerationSucceeded(); + + unset($writer); + } catch (CodeCoverageException $e) { + $this->codeCoverageGenerationFailed($e); + } + } + + if (isset($arguments['coveragePHP'])) { + $this->codeCoverageGenerationStart('PHP'); + + try { + $writer = new PhpReport; + $writer->process($codeCoverage, $arguments['coveragePHP']); + + $this->codeCoverageGenerationSucceeded(); + + unset($writer); + } catch (CodeCoverageException $e) { + $this->codeCoverageGenerationFailed($e); + } + } + + if (isset($arguments['coverageText'])) { + if ($arguments['coverageText'] === 'php://stdout') { + $outputStream = $this->printer; + $colors = $arguments['colors'] && $arguments['colors'] !== ResultPrinter::COLOR_NEVER; + } else { + $outputStream = new Printer($arguments['coverageText']); + $colors = false; + } + + $processor = new TextReport( + $arguments['reportLowUpperBound'], + $arguments['reportHighLowerBound'], + $arguments['coverageTextShowUncoveredFiles'], + $arguments['coverageTextShowOnlySummary'] + ); + + $outputStream->write( + $processor->process($codeCoverage, $colors) + ); + } + + if (isset($arguments['coverageXml'])) { + $this->codeCoverageGenerationStart('PHPUnit XML'); + + try { + $writer = new XmlReport(Version::id()); + $writer->process($codeCoverage, $arguments['coverageXml']); + + $this->codeCoverageGenerationSucceeded(); + + unset($writer); + } catch (CodeCoverageException $e) { + $this->codeCoverageGenerationFailed($e); + } + } + } + + if ($exit) { + if ($result->wasSuccessfulIgnoringWarnings()) { + if ($arguments['failOnRisky'] && !$result->allHarmless()) { + exit(self::FAILURE_EXIT); + } + + if ($arguments['failOnWarning'] && $result->warningCount() > 0) { + exit(self::FAILURE_EXIT); + } + + exit(self::SUCCESS_EXIT); + } + + if ($result->errorCount() > 0) { + exit(self::EXCEPTION_EXIT); + } + + if ($result->failureCount() > 0) { + exit(self::FAILURE_EXIT); + } + } + + return $result; + } + + public function setPrinter(ResultPrinter $resultPrinter): void + { + $this->printer = $resultPrinter; + } + + /** + * Returns the loader to be used. + */ + public function getLoader(): TestSuiteLoader + { + if ($this->loader === null) { + $this->loader = new StandardTestSuiteLoader; + } + + return $this->loader; + } + + public function addExtension(Hook $extension): void + { + $this->extensions[] = $extension; + } + + /** + * Override to define how to handle a failed loading of + * a test suite. + */ + protected function runFailed(string $message): void + { + $this->write($message . PHP_EOL); + + exit(self::FAILURE_EXIT); + } + + private function createTestResult(): TestResult + { + return new TestResult; + } + + private function write(string $buffer): void + { + if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') { + $buffer = htmlspecialchars($buffer); + } + + if ($this->printer !== null) { + $this->printer->write($buffer); + } else { + print $buffer; + } + } + + /** + * @throws Exception + */ + private function handleConfiguration(array &$arguments): void + { + if (isset($arguments['configuration']) && + !$arguments['configuration'] instanceof Configuration) { + $arguments['configuration'] = Configuration::getInstance( + $arguments['configuration'] + ); + } + + $arguments['debug'] = $arguments['debug'] ?? false; + $arguments['filter'] = $arguments['filter'] ?? false; + $arguments['listeners'] = $arguments['listeners'] ?? []; + + if (isset($arguments['configuration'])) { + $arguments['configuration']->handlePHPConfiguration(); + + $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration(); + + if (isset($phpunitConfiguration['backupGlobals']) && !isset($arguments['backupGlobals'])) { + $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals']; + } + + if (isset($phpunitConfiguration['backupStaticAttributes']) && !isset($arguments['backupStaticAttributes'])) { + $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes']; + } + + if (isset($phpunitConfiguration['beStrictAboutChangesToGlobalState']) && !isset($arguments['beStrictAboutChangesToGlobalState'])) { + $arguments['beStrictAboutChangesToGlobalState'] = $phpunitConfiguration['beStrictAboutChangesToGlobalState']; + } + + if (isset($phpunitConfiguration['bootstrap']) && !isset($arguments['bootstrap'])) { + $arguments['bootstrap'] = $phpunitConfiguration['bootstrap']; + } + + if (isset($phpunitConfiguration['cacheResult']) && !isset($arguments['cacheResult'])) { + $arguments['cacheResult'] = $phpunitConfiguration['cacheResult']; + } + + if (isset($phpunitConfiguration['cacheResultFile']) && !isset($arguments['cacheResultFile'])) { + $arguments['cacheResultFile'] = $phpunitConfiguration['cacheResultFile']; + } + + if (isset($phpunitConfiguration['cacheTokens']) && !isset($arguments['cacheTokens'])) { + $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens']; + } + + if (isset($phpunitConfiguration['cacheTokens']) && !isset($arguments['cacheTokens'])) { + $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens']; + } + + if (isset($phpunitConfiguration['colors']) && !isset($arguments['colors'])) { + $arguments['colors'] = $phpunitConfiguration['colors']; + } + + if (isset($phpunitConfiguration['convertDeprecationsToExceptions']) && !isset($arguments['convertDeprecationsToExceptions'])) { + $arguments['convertDeprecationsToExceptions'] = $phpunitConfiguration['convertDeprecationsToExceptions']; + } + + if (isset($phpunitConfiguration['convertErrorsToExceptions']) && !isset($arguments['convertErrorsToExceptions'])) { + $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions']; + } + + if (isset($phpunitConfiguration['convertNoticesToExceptions']) && !isset($arguments['convertNoticesToExceptions'])) { + $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions']; + } + + if (isset($phpunitConfiguration['convertWarningsToExceptions']) && !isset($arguments['convertWarningsToExceptions'])) { + $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions']; + } + + if (isset($phpunitConfiguration['processIsolation']) && !isset($arguments['processIsolation'])) { + $arguments['processIsolation'] = $phpunitConfiguration['processIsolation']; + } + + if (isset($phpunitConfiguration['stopOnDefect']) && !isset($arguments['stopOnDefect'])) { + $arguments['stopOnDefect'] = $phpunitConfiguration['stopOnDefect']; + } + + if (isset($phpunitConfiguration['stopOnError']) && !isset($arguments['stopOnError'])) { + $arguments['stopOnError'] = $phpunitConfiguration['stopOnError']; + } + + if (isset($phpunitConfiguration['stopOnFailure']) && !isset($arguments['stopOnFailure'])) { + $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure']; + } + + if (isset($phpunitConfiguration['stopOnWarning']) && !isset($arguments['stopOnWarning'])) { + $arguments['stopOnWarning'] = $phpunitConfiguration['stopOnWarning']; + } + + if (isset($phpunitConfiguration['stopOnIncomplete']) && !isset($arguments['stopOnIncomplete'])) { + $arguments['stopOnIncomplete'] = $phpunitConfiguration['stopOnIncomplete']; + } + + if (isset($phpunitConfiguration['stopOnRisky']) && !isset($arguments['stopOnRisky'])) { + $arguments['stopOnRisky'] = $phpunitConfiguration['stopOnRisky']; + } + + if (isset($phpunitConfiguration['stopOnSkipped']) && !isset($arguments['stopOnSkipped'])) { + $arguments['stopOnSkipped'] = $phpunitConfiguration['stopOnSkipped']; + } + + if (isset($phpunitConfiguration['failOnWarning']) && !isset($arguments['failOnWarning'])) { + $arguments['failOnWarning'] = $phpunitConfiguration['failOnWarning']; + } + + if (isset($phpunitConfiguration['failOnRisky']) && !isset($arguments['failOnRisky'])) { + $arguments['failOnRisky'] = $phpunitConfiguration['failOnRisky']; + } + + if (isset($phpunitConfiguration['timeoutForSmallTests']) && !isset($arguments['timeoutForSmallTests'])) { + $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests']; + } + + if (isset($phpunitConfiguration['timeoutForMediumTests']) && !isset($arguments['timeoutForMediumTests'])) { + $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests']; + } + + if (isset($phpunitConfiguration['timeoutForLargeTests']) && !isset($arguments['timeoutForLargeTests'])) { + $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests']; + } + + if (isset($phpunitConfiguration['reportUselessTests']) && !isset($arguments['reportUselessTests'])) { + $arguments['reportUselessTests'] = $phpunitConfiguration['reportUselessTests']; + } + + if (isset($phpunitConfiguration['strictCoverage']) && !isset($arguments['strictCoverage'])) { + $arguments['strictCoverage'] = $phpunitConfiguration['strictCoverage']; + } + + if (isset($phpunitConfiguration['ignoreDeprecatedCodeUnitsFromCodeCoverage']) && !isset($arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'])) { + $arguments['ignoreDeprecatedCodeUnitsFromCodeCoverage'] = $phpunitConfiguration['ignoreDeprecatedCodeUnitsFromCodeCoverage']; + } + + if (isset($phpunitConfiguration['disallowTestOutput']) && !isset($arguments['disallowTestOutput'])) { + $arguments['disallowTestOutput'] = $phpunitConfiguration['disallowTestOutput']; + } + + if (isset($phpunitConfiguration['defaultTimeLimit']) && !isset($arguments['defaultTimeLimit'])) { + $arguments['defaultTimeLimit'] = $phpunitConfiguration['defaultTimeLimit']; + } + + if (isset($phpunitConfiguration['enforceTimeLimit']) && !isset($arguments['enforceTimeLimit'])) { + $arguments['enforceTimeLimit'] = $phpunitConfiguration['enforceTimeLimit']; + } + + if (isset($phpunitConfiguration['disallowTodoAnnotatedTests']) && !isset($arguments['disallowTodoAnnotatedTests'])) { + $arguments['disallowTodoAnnotatedTests'] = $phpunitConfiguration['disallowTodoAnnotatedTests']; + } + + if (isset($phpunitConfiguration['beStrictAboutResourceUsageDuringSmallTests']) && !isset($arguments['beStrictAboutResourceUsageDuringSmallTests'])) { + $arguments['beStrictAboutResourceUsageDuringSmallTests'] = $phpunitConfiguration['beStrictAboutResourceUsageDuringSmallTests']; + } + + if (isset($phpunitConfiguration['verbose']) && !isset($arguments['verbose'])) { + $arguments['verbose'] = $phpunitConfiguration['verbose']; + } + + if (isset($phpunitConfiguration['reverseDefectList']) && !isset($arguments['reverseList'])) { + $arguments['reverseList'] = $phpunitConfiguration['reverseDefectList']; + } + + if (isset($phpunitConfiguration['forceCoversAnnotation']) && !isset($arguments['forceCoversAnnotation'])) { + $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation']; + } + + if (isset($phpunitConfiguration['disableCodeCoverageIgnore']) && !isset($arguments['disableCodeCoverageIgnore'])) { + $arguments['disableCodeCoverageIgnore'] = $phpunitConfiguration['disableCodeCoverageIgnore']; + } + + if (isset($phpunitConfiguration['registerMockObjectsFromTestArgumentsRecursively']) && !isset($arguments['registerMockObjectsFromTestArgumentsRecursively'])) { + $arguments['registerMockObjectsFromTestArgumentsRecursively'] = $phpunitConfiguration['registerMockObjectsFromTestArgumentsRecursively']; + } + + if (isset($phpunitConfiguration['executionOrder']) && !isset($arguments['executionOrder'])) { + $arguments['executionOrder'] = $phpunitConfiguration['executionOrder']; + } + + if (isset($phpunitConfiguration['executionOrderDefects']) && !isset($arguments['executionOrderDefects'])) { + $arguments['executionOrderDefects'] = $phpunitConfiguration['executionOrderDefects']; + } + + if (isset($phpunitConfiguration['resolveDependencies']) && !isset($arguments['resolveDependencies'])) { + $arguments['resolveDependencies'] = $phpunitConfiguration['resolveDependencies']; + } + + if (isset($phpunitConfiguration['noInteraction']) && !isset($arguments['noInteraction'])) { + $arguments['noInteraction'] = $phpunitConfiguration['noInteraction']; + } + + if (isset($phpunitConfiguration['conflictBetweenPrinterClassAndTestdox'])) { + $arguments['conflictBetweenPrinterClassAndTestdox'] = true; + } + + $groupCliArgs = []; + + if (!empty($arguments['groups'])) { + $groupCliArgs = $arguments['groups']; + } + + $groupConfiguration = $arguments['configuration']->getGroupConfiguration(); + + if (!empty($groupConfiguration['include']) && !isset($arguments['groups'])) { + $arguments['groups'] = $groupConfiguration['include']; + } + + if (!empty($groupConfiguration['exclude']) && !isset($arguments['excludeGroups'])) { + $arguments['excludeGroups'] = array_diff($groupConfiguration['exclude'], $groupCliArgs); + } + + foreach ($arguments['configuration']->getExtensionConfiguration() as $extension) { + if ($extension['file'] !== '' && !class_exists($extension['class'], false)) { + require_once $extension['file']; + } + + if (!class_exists($extension['class'])) { + throw new Exception( + sprintf( + 'Class "%s" does not exist', + $extension['class'] + ) + ); + } + + try { + $extensionClass = new ReflectionClass($extension['class']); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (!$extensionClass->implementsInterface(Hook::class)) { + throw new Exception( + sprintf( + 'Class "%s" does not implement a PHPUnit\Runner\Hook interface', + $extension['class'] + ) + ); + } + + if (count($extension['arguments']) === 0) { + $extensionObject = $extensionClass->newInstance(); + } else { + $extensionObject = $extensionClass->newInstanceArgs( + $extension['arguments'] + ); + } + + assert($extensionObject instanceof Hook); + + $this->addExtension($extensionObject); + } + + foreach ($arguments['configuration']->getListenerConfiguration() as $listener) { + if ($listener['file'] !== '' && !class_exists($listener['class'], false)) { + require_once $listener['file']; + } + + if (!class_exists($listener['class'])) { + throw new Exception( + sprintf( + 'Class "%s" does not exist', + $listener['class'] + ) + ); + } + + try { + $listenerClass = new ReflectionClass($listener['class']); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + if (!$listenerClass->implementsInterface(TestListener::class)) { + throw new Exception( + sprintf( + 'Class "%s" does not implement the PHPUnit\Framework\TestListener interface', + $listener['class'] + ) + ); + } + + if (count($listener['arguments']) === 0) { + $listener = new $listener['class']; + } else { + $listener = $listenerClass->newInstanceArgs( + $listener['arguments'] + ); + } + + $arguments['listeners'][] = $listener; + } + + $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration(); + + if (isset($loggingConfiguration['coverage-clover']) && !isset($arguments['coverageClover'])) { + $arguments['coverageClover'] = $loggingConfiguration['coverage-clover']; + } + + if (isset($loggingConfiguration['coverage-crap4j']) && !isset($arguments['coverageCrap4J'])) { + $arguments['coverageCrap4J'] = $loggingConfiguration['coverage-crap4j']; + + if (isset($loggingConfiguration['crap4jThreshold']) && !isset($arguments['crap4jThreshold'])) { + $arguments['crap4jThreshold'] = $loggingConfiguration['crap4jThreshold']; + } + } + + if (isset($loggingConfiguration['coverage-html']) && !isset($arguments['coverageHtml'])) { + if (isset($loggingConfiguration['lowUpperBound']) && !isset($arguments['reportLowUpperBound'])) { + $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound']; + } + + if (isset($loggingConfiguration['highLowerBound']) && !isset($arguments['reportHighLowerBound'])) { + $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound']; + } + + $arguments['coverageHtml'] = $loggingConfiguration['coverage-html']; + } + + if (isset($loggingConfiguration['coverage-php']) && !isset($arguments['coveragePHP'])) { + $arguments['coveragePHP'] = $loggingConfiguration['coverage-php']; + } + + if (isset($loggingConfiguration['coverage-text']) && !isset($arguments['coverageText'])) { + $arguments['coverageText'] = $loggingConfiguration['coverage-text']; + $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles'] ?? false; + $arguments['coverageTextShowOnlySummary'] = $loggingConfiguration['coverageTextShowOnlySummary'] ?? false; + } + + if (isset($loggingConfiguration['coverage-xml']) && !isset($arguments['coverageXml'])) { + $arguments['coverageXml'] = $loggingConfiguration['coverage-xml']; + } + + if (isset($loggingConfiguration['plain'])) { + $arguments['listeners'][] = new ResultPrinter( + $loggingConfiguration['plain'], + true + ); + } + + if (isset($loggingConfiguration['teamcity']) && !isset($arguments['teamcityLogfile'])) { + $arguments['teamcityLogfile'] = $loggingConfiguration['teamcity']; + } + + if (isset($loggingConfiguration['junit']) && !isset($arguments['junitLogfile'])) { + $arguments['junitLogfile'] = $loggingConfiguration['junit']; + } + + if (isset($loggingConfiguration['testdox-html']) && !isset($arguments['testdoxHTMLFile'])) { + $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html']; + } + + if (isset($loggingConfiguration['testdox-text']) && !isset($arguments['testdoxTextFile'])) { + $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text']; + } + + if (isset($loggingConfiguration['testdox-xml']) && !isset($arguments['testdoxXMLFile'])) { + $arguments['testdoxXMLFile'] = $loggingConfiguration['testdox-xml']; + } + + $testdoxGroupConfiguration = $arguments['configuration']->getTestdoxGroupConfiguration(); + + if (isset($testdoxGroupConfiguration['include']) && + !isset($arguments['testdoxGroups'])) { + $arguments['testdoxGroups'] = $testdoxGroupConfiguration['include']; + } + + if (isset($testdoxGroupConfiguration['exclude']) && + !isset($arguments['testdoxExcludeGroups'])) { + $arguments['testdoxExcludeGroups'] = $testdoxGroupConfiguration['exclude']; + } + } + + $arguments['addUncoveredFilesFromWhitelist'] = $arguments['addUncoveredFilesFromWhitelist'] ?? true; + $arguments['backupGlobals'] = $arguments['backupGlobals'] ?? null; + $arguments['backupStaticAttributes'] = $arguments['backupStaticAttributes'] ?? null; + $arguments['beStrictAboutChangesToGlobalState'] = $arguments['beStrictAboutChangesToGlobalState'] ?? null; + $arguments['beStrictAboutResourceUsageDuringSmallTests'] = $arguments['beStrictAboutResourceUsageDuringSmallTests'] ?? false; + $arguments['cacheResult'] = $arguments['cacheResult'] ?? true; + $arguments['cacheTokens'] = $arguments['cacheTokens'] ?? false; + $arguments['colors'] = $arguments['colors'] ?? ResultPrinter::COLOR_DEFAULT; + $arguments['columns'] = $arguments['columns'] ?? 80; + $arguments['convertDeprecationsToExceptions'] = $arguments['convertDeprecationsToExceptions'] ?? true; + $arguments['convertErrorsToExceptions'] = $arguments['convertErrorsToExceptions'] ?? true; + $arguments['convertNoticesToExceptions'] = $arguments['convertNoticesToExceptions'] ?? true; + $arguments['convertWarningsToExceptions'] = $arguments['convertWarningsToExceptions'] ?? true; + $arguments['crap4jThreshold'] = $arguments['crap4jThreshold'] ?? 30; + $arguments['disallowTestOutput'] = $arguments['disallowTestOutput'] ?? false; + $arguments['disallowTodoAnnotatedTests'] = $arguments['disallowTodoAnnotatedTests'] ?? false; + $arguments['defaultTimeLimit'] = $arguments['defaultTimeLimit'] ?? 0; + $arguments['enforceTimeLimit'] = $arguments['enforceTimeLimit'] ?? false; + $arguments['excludeGroups'] = $arguments['excludeGroups'] ?? []; + $arguments['executionOrder'] = $arguments['executionOrder'] ?? TestSuiteSorter::ORDER_DEFAULT; + $arguments['executionOrderDefects'] = $arguments['executionOrderDefects'] ?? TestSuiteSorter::ORDER_DEFAULT; + $arguments['failOnRisky'] = $arguments['failOnRisky'] ?? false; + $arguments['failOnWarning'] = $arguments['failOnWarning'] ?? false; + $arguments['groups'] = $arguments['groups'] ?? []; + $arguments['noInteraction'] = $arguments['noInteraction'] ?? false; + $arguments['processIsolation'] = $arguments['processIsolation'] ?? false; + $arguments['processUncoveredFilesFromWhitelist'] = $arguments['processUncoveredFilesFromWhitelist'] ?? false; + $arguments['randomOrderSeed'] = $arguments['randomOrderSeed'] ?? time(); + $arguments['registerMockObjectsFromTestArgumentsRecursively'] = $arguments['registerMockObjectsFromTestArgumentsRecursively'] ?? false; + $arguments['repeat'] = $arguments['repeat'] ?? false; + $arguments['reportHighLowerBound'] = $arguments['reportHighLowerBound'] ?? 90; + $arguments['reportLowUpperBound'] = $arguments['reportLowUpperBound'] ?? 50; + $arguments['reportUselessTests'] = $arguments['reportUselessTests'] ?? true; + $arguments['reverseList'] = $arguments['reverseList'] ?? false; + $arguments['resolveDependencies'] = $arguments['resolveDependencies'] ?? true; + $arguments['stopOnError'] = $arguments['stopOnError'] ?? false; + $arguments['stopOnFailure'] = $arguments['stopOnFailure'] ?? false; + $arguments['stopOnIncomplete'] = $arguments['stopOnIncomplete'] ?? false; + $arguments['stopOnRisky'] = $arguments['stopOnRisky'] ?? false; + $arguments['stopOnSkipped'] = $arguments['stopOnSkipped'] ?? false; + $arguments['stopOnWarning'] = $arguments['stopOnWarning'] ?? false; + $arguments['stopOnDefect'] = $arguments['stopOnDefect'] ?? false; + $arguments['strictCoverage'] = $arguments['strictCoverage'] ?? false; + $arguments['testdoxExcludeGroups'] = $arguments['testdoxExcludeGroups'] ?? []; + $arguments['testdoxGroups'] = $arguments['testdoxGroups'] ?? []; + $arguments['timeoutForLargeTests'] = $arguments['timeoutForLargeTests'] ?? 60; + $arguments['timeoutForMediumTests'] = $arguments['timeoutForMediumTests'] ?? 10; + $arguments['timeoutForSmallTests'] = $arguments['timeoutForSmallTests'] ?? 1; + $arguments['verbose'] = $arguments['verbose'] ?? false; + } + + private function processSuiteFilters(TestSuite $suite, array $arguments): void + { + if (!$arguments['filter'] && + empty($arguments['groups']) && + empty($arguments['excludeGroups'])) { + return; + } + + $filterFactory = new Factory; + + if (!empty($arguments['excludeGroups'])) { + $filterFactory->addFilter( + new ReflectionClass(ExcludeGroupFilterIterator::class), + $arguments['excludeGroups'] + ); + } + + if (!empty($arguments['groups'])) { + $filterFactory->addFilter( + new ReflectionClass(IncludeGroupFilterIterator::class), + $arguments['groups'] + ); + } + + if ($arguments['filter']) { + $filterFactory->addFilter( + new ReflectionClass(NameFilterIterator::class), + $arguments['filter'] + ); + } + + $suite->injectFilter($filterFactory); + } + + private function writeMessage(string $type, string $message): void + { + if (!$this->messagePrinted) { + $this->write("\n"); + } + + $this->write( + sprintf( + "%-15s%s\n", + $type . ':', + $message + ) + ); + + $this->messagePrinted = true; + } + + /** + * @template T as Printer + * + * @param class-string $class + * + * @return T + */ + private function createPrinter(string $class, array $arguments): Printer + { + return new $class( + (isset($arguments['stderr']) && $arguments['stderr'] === true) ? 'php://stderr' : null, + $arguments['verbose'], + $arguments['colors'], + $arguments['debug'], + $arguments['columns'], + $arguments['reverseList'] + ); + } + + private function codeCoverageGenerationStart(string $format): void + { + $this->printer->write( + sprintf( + "\nGenerating code coverage report in %s format ... ", + $format + ) + ); + + Timer::start(); + } + + private function codeCoverageGenerationSucceeded(): void + { + $this->printer->write( + sprintf( + "done [%s]\n", + Timer::secondsToTimeString(Timer::stop()) + ) + ); + } + + private function codeCoverageGenerationFailed(\Exception $e): void + { + $this->printer->write( + sprintf( + "failed [%s]\n%s\n", + Timer::secondsToTimeString(Timer::stop()), + $e->getMessage() + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php new file mode 100644 index 0000000000..024c19b113 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php @@ -0,0 +1,620 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\Annotation; + +use const JSON_ERROR_NONE; +use const PREG_OFFSET_CAPTURE; +use function array_filter; +use function array_key_exists; +use function array_map; +use function array_merge; +use function array_pop; +use function array_slice; +use function array_values; +use function constant; +use function count; +use function defined; +use function explode; +use function file; +use function implode; +use function is_array; +use function is_int; +use function is_numeric; +use function is_string; +use function json_decode; +use function json_last_error; +use function json_last_error_msg; +use function preg_match; +use function preg_match_all; +use function preg_replace; +use function preg_split; +use function realpath; +use function rtrim; +use function sprintf; +use function str_replace; +use function strlen; +use function strpos; +use function strtolower; +use function substr; +use function substr_count; +use function trim; +use PharIo\Version\VersionConstraintParser; +use PHPUnit\Framework\InvalidDataProviderException; +use PHPUnit\Framework\SkippedTestError; +use PHPUnit\Framework\Warning; +use PHPUnit\Util\Exception; +use PHPUnit\Util\InvalidDataSetException; +use ReflectionClass; +use ReflectionException; +use ReflectionFunctionAbstract; +use ReflectionMethod; +use Reflector; +use Traversable; + +/** + * This is an abstraction around a PHPUnit-specific docBlock, + * allowing us to ask meaningful questions about a specific + * reflection symbol. + * + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class DocBlock +{ + /** + * @todo This constant should be private (it's public because of TestTest::testGetProvidedDataRegEx) + */ + public const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/'; + + private const REGEX_REQUIRES_VERSION = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[<>=!]{0,2})\s*(?P[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m'; + + private const REGEX_REQUIRES_VERSION_CONSTRAINT = '/@requires\s+(?PPHP(?:Unit)?)\s+(?P[\d\t \-.|~^]+)[ \t]*\r?$/m'; + + private const REGEX_REQUIRES_OS = '/@requires\s+(?POS(?:FAMILY)?)\s+(?P.+?)[ \t]*\r?$/m'; + + private const REGEX_REQUIRES_SETTING = '/@requires\s+(?Psetting)\s+(?P([^ ]+?))\s*(?P[\w\.-]+[\w\.]?)?[ \t]*\r?$/m'; + + private const REGEX_REQUIRES = '/@requires\s+(?Pfunction|extension)\s+(?P([^\s<>=!]+))\s*(?P[<>=!]{0,2})\s*(?P[\d\.-]+[\d\.]?)?[ \t]*\r?$/m'; + + private const REGEX_TEST_WITH = '/@testWith\s+/'; + + private const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m'; + + /** @var string */ + private $docComment; + + /** @var bool */ + private $isMethod; + + /** @var array> pre-parsed annotations indexed by name and occurrence index */ + private $symbolAnnotations; + + /** + * @var null|array + * + * @psalm-var null|(array{ + * __OFFSET: array&array{__FILE: string}, + * setting?: array, + * extension_versions?: array + * }&array< + * string, + * string|array{version: string, operator: string}|array{constraint: string}|array + * >) + */ + private $parsedRequirements; + + /** @var int */ + private $startLine; + + /** @var int */ + private $endLine; + + /** @var string */ + private $fileName; + + /** @var string */ + private $name; + + /** + * @var string + * + * @psalm-var class-string + */ + private $className; + + public static function ofClass(ReflectionClass $class): self + { + $className = $class->getName(); + + return new self( + (string) $class->getDocComment(), + false, + self::extractAnnotationsFromReflector($class), + $class->getStartLine(), + $class->getEndLine(), + $class->getFileName(), + $className, + $className + ); + } + + /** + * @psalm-param class-string $classNameInHierarchy + */ + public static function ofMethod(ReflectionMethod $method, string $classNameInHierarchy): self + { + return new self( + (string) $method->getDocComment(), + true, + self::extractAnnotationsFromReflector($method), + $method->getStartLine(), + $method->getEndLine(), + $method->getFileName(), + $method->getName(), + $classNameInHierarchy + ); + } + + /** + * Note: we do not preserve an instance of the reflection object, since it cannot be safely (de-)serialized. + * + * @param array> $symbolAnnotations + * + * @psalm-param class-string $className + */ + private function __construct(string $docComment, bool $isMethod, array $symbolAnnotations, int $startLine, int $endLine, string $fileName, string $name, string $className) + { + $this->docComment = $docComment; + $this->isMethod = $isMethod; + $this->symbolAnnotations = $symbolAnnotations; + $this->startLine = $startLine; + $this->endLine = $endLine; + $this->fileName = $fileName; + $this->name = $name; + $this->className = $className; + } + + /** + * @psalm-return array{ + * __OFFSET: array&array{__FILE: string}, + * setting?: array, + * extension_versions?: array + * }&array< + * string, + * string|array{version: string, operator: string}|array{constraint: string}|array + * > + * + * @throws Warning if the requirements version constraint is not well-formed + */ + public function requirements(): array + { + if ($this->parsedRequirements !== null) { + return $this->parsedRequirements; + } + + $offset = $this->startLine; + $requires = []; + $recordedSettings = []; + $extensionVersions = []; + $recordedOffsets = [ + '__FILE' => realpath($this->fileName), + ]; + + // Split docblock into lines and rewind offset to start of docblock + $lines = preg_split('/\r\n|\r|\n/', $this->docComment); + $offset -= count($lines); + + foreach ($lines as $line) { + if (preg_match(self::REGEX_REQUIRES_OS, $line, $matches)) { + $requires[$matches['name']] = $matches['value']; + $recordedOffsets[$matches['name']] = $offset; + } + + if (preg_match(self::REGEX_REQUIRES_VERSION, $line, $matches)) { + $requires[$matches['name']] = [ + 'version' => $matches['version'], + 'operator' => $matches['operator'], + ]; + $recordedOffsets[$matches['name']] = $offset; + } + + if (preg_match(self::REGEX_REQUIRES_VERSION_CONSTRAINT, $line, $matches)) { + if (!empty($requires[$matches['name']])) { + $offset++; + + continue; + } + + try { + $versionConstraintParser = new VersionConstraintParser; + + $requires[$matches['name'] . '_constraint'] = [ + 'constraint' => $versionConstraintParser->parse(trim($matches['constraint'])), + ]; + $recordedOffsets[$matches['name'] . '_constraint'] = $offset; + } catch (\PharIo\Version\Exception $e) { + /* @TODO this catch is currently not valid, see https://github.com/phar-io/version/issues/16 */ + throw new Warning($e->getMessage(), $e->getCode(), $e); + } + } + + if (preg_match(self::REGEX_REQUIRES_SETTING, $line, $matches)) { + $recordedSettings[$matches['setting']] = $matches['value']; + $recordedOffsets['__SETTING_' . $matches['setting']] = $offset; + } + + if (preg_match(self::REGEX_REQUIRES, $line, $matches)) { + $name = $matches['name'] . 's'; + + if (!isset($requires[$name])) { + $requires[$name] = []; + } + + $requires[$name][] = $matches['value']; + $recordedOffsets[$matches['name'] . '_' . $matches['value']] = $offset; + + if ($name === 'extensions' && !empty($matches['version'])) { + $extensionVersions[$matches['value']] = [ + 'version' => $matches['version'], + 'operator' => $matches['operator'], + ]; + } + } + + $offset++; + } + + return $this->parsedRequirements = array_merge( + $requires, + ['__OFFSET' => $recordedOffsets], + array_filter([ + 'setting' => $recordedSettings, + 'extension_versions' => $extensionVersions, + ]) + ); + } + + /** + * @return array|bool + * + * @psalm-return false|array{ + * class: class-string, + * code: int|string|null, + * message: string, + * message_regex: string + * } + */ + public function expectedException() + { + $docComment = (string) substr($this->docComment, 3, -2); + + if (1 !== preg_match(self::REGEX_EXPECTED_EXCEPTION, $docComment, $matches)) { + return false; + } + + /** @psalm-var class-string $class */ + $class = $matches[1]; + $annotations = $this->symbolAnnotations(); + $code = null; + $message = ''; + $messageRegExp = ''; + + if (isset($matches[2])) { + $message = trim($matches[2]); + } elseif (isset($annotations['expectedExceptionMessage'])) { + $message = $this->parseAnnotationContent($annotations['expectedExceptionMessage'][0]); + } + + if (isset($annotations['expectedExceptionMessageRegExp'])) { + $messageRegExp = $this->parseAnnotationContent($annotations['expectedExceptionMessageRegExp'][0]); + } + + if (isset($matches[3])) { + $code = $matches[3]; + } elseif (isset($annotations['expectedExceptionCode'])) { + $code = $this->parseAnnotationContent($annotations['expectedExceptionCode'][0]); + } + + if (is_numeric($code)) { + $code = (int) $code; + } elseif (is_string($code) && defined($code)) { + $code = (int) constant($code); + } + + return [ + 'class' => $class, + 'code' => $code, + 'message' => $message, + 'message_regex' => $messageRegExp, + ]; + } + + /** + * Returns the provided data for a method. + * + * @throws Exception + */ + public function getProvidedData(): ?array + { + /** @noinspection SuspiciousBinaryOperationInspection */ + $data = $this->getDataFromDataProviderAnnotation($this->docComment) ?? $this->getDataFromTestWithAnnotation($this->docComment); + + if ($data === null) { + return null; + } + + if ($data === []) { + throw new SkippedTestError; + } + + foreach ($data as $key => $value) { + if (!is_array($value)) { + throw new InvalidDataSetException( + sprintf( + 'Data set %s is invalid.', + is_int($key) ? '#' . $key : '"' . $key . '"' + ) + ); + } + } + + return $data; + } + + /** + * @psalm-return array + */ + public function getInlineAnnotations(): array + { + $code = file($this->fileName); + $lineNumber = $this->startLine; + $startLine = $this->startLine - 1; + $endLine = $this->endLine - 1; + $codeLines = array_slice($code, $startLine, $endLine - $startLine + 1); + $annotations = []; + + foreach ($codeLines as $line) { + if (preg_match('#/\*\*?\s*@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?\*/$#m', $line, $matches)) { + $annotations[strtolower($matches['name'])] = [ + 'line' => $lineNumber, + 'value' => $matches['value'], + ]; + } + + $lineNumber++; + } + + return $annotations; + } + + public function symbolAnnotations(): array + { + return $this->symbolAnnotations; + } + + public function isHookToBeExecutedBeforeClass(): bool + { + return $this->isMethod && + false !== strpos($this->docComment, '@beforeClass'); + } + + public function isHookToBeExecutedAfterClass(): bool + { + return $this->isMethod && + false !== strpos($this->docComment, '@afterClass'); + } + + public function isToBeExecutedBeforeTest(): bool + { + return 1 === preg_match('/@before\b/', $this->docComment); + } + + public function isToBeExecutedAfterTest(): bool + { + return 1 === preg_match('/@after\b/', $this->docComment); + } + + /** + * Parse annotation content to use constant/class constant values. + * + * Constants are specified using a starting '@'. For example: @ClassName::CONST_NAME + * + * If the constant is not found the string is used as is to ensure maximum BC. + */ + private function parseAnnotationContent(string $message): string + { + if (defined($message) && + (strpos($message, '::') !== false && substr_count($message, '::') + 1 === 2)) { + return constant($message); + } + + return $message; + } + + private function getDataFromDataProviderAnnotation(string $docComment): ?array + { + $methodName = null; + $className = $this->className; + + if ($this->isMethod) { + $methodName = $this->name; + } + + if (!preg_match_all(self::REGEX_DATA_PROVIDER, $docComment, $matches)) { + return null; + } + + $result = []; + + foreach ($matches[1] as $match) { + $dataProviderMethodNameNamespace = explode('\\', $match); + $leaf = explode('::', array_pop($dataProviderMethodNameNamespace)); + $dataProviderMethodName = array_pop($leaf); + + if (empty($dataProviderMethodNameNamespace)) { + $dataProviderMethodNameNamespace = ''; + } else { + $dataProviderMethodNameNamespace = implode('\\', $dataProviderMethodNameNamespace) . '\\'; + } + + if (empty($leaf)) { + $dataProviderClassName = $className; + } else { + /** @psalm-var class-string $dataProviderClassName */ + $dataProviderClassName = $dataProviderMethodNameNamespace . array_pop($leaf); + } + + try { + $dataProviderClass = new ReflectionClass($dataProviderClassName); + + $dataProviderMethod = $dataProviderClass->getMethod( + $dataProviderMethodName + ); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + // @codeCoverageIgnoreEnd + } + + if ($dataProviderMethod->isStatic()) { + $object = null; + } else { + $object = $dataProviderClass->newInstance(); + } + + if ($dataProviderMethod->getNumberOfParameters() === 0) { + $data = $dataProviderMethod->invoke($object); + } else { + $data = $dataProviderMethod->invoke($object, $methodName); + } + + if ($data instanceof Traversable) { + $origData = $data; + $data = []; + + foreach ($origData as $key => $value) { + if (is_int($key)) { + $data[] = $value; + } elseif (array_key_exists($key, $data)) { + throw new InvalidDataProviderException( + sprintf( + 'The key "%s" has already been defined in the data provider "%s".', + $key, + $match + ) + ); + } else { + $data[$key] = $value; + } + } + } + + if (is_array($data)) { + $result = array_merge($result, $data); + } + } + + return $result; + } + + /** + * @throws Exception + */ + private function getDataFromTestWithAnnotation(string $docComment): ?array + { + $docComment = $this->cleanUpMultiLineAnnotation($docComment); + + if (!preg_match(self::REGEX_TEST_WITH, $docComment, $matches, PREG_OFFSET_CAPTURE)) { + return null; + } + + $offset = strlen($matches[0][0]) + $matches[0][1]; + $annotationContent = substr($docComment, $offset); + $data = []; + + foreach (explode("\n", $annotationContent) as $candidateRow) { + $candidateRow = trim($candidateRow); + + if ($candidateRow[0] !== '[') { + break; + } + + $dataSet = json_decode($candidateRow, true); + + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Exception( + 'The data set for the @testWith annotation cannot be parsed: ' . json_last_error_msg() + ); + } + + $data[] = $dataSet; + } + + if (!$data) { + throw new Exception('The data set for the @testWith annotation cannot be parsed.'); + } + + return $data; + } + + private function cleanUpMultiLineAnnotation(string $docComment): string + { + //removing initial ' * ' for docComment + $docComment = str_replace("\r\n", "\n", $docComment); + $docComment = preg_replace('/' . '\n' . '\s*' . '\*' . '\s?' . '/', "\n", $docComment); + $docComment = (string) substr($docComment, 0, -1); + + return rtrim($docComment, "\n"); + } + + /** @return array> */ + private static function parseDocBlock(string $docBlock): array + { + // Strip away the docblock header and footer to ease parsing of one line annotations + $docBlock = (string) substr($docBlock, 3, -2); + $annotations = []; + + if (preg_match_all('/@(?P[A-Za-z_-]+)(?:[ \t]+(?P.*?))?[ \t]*\r?$/m', $docBlock, $matches)) { + $numMatches = count($matches[0]); + + for ($i = 0; $i < $numMatches; $i++) { + $annotations[$matches['name'][$i]][] = (string) $matches['value'][$i]; + } + } + + return $annotations; + } + + /** @param ReflectionClass|ReflectionFunctionAbstract $reflector */ + private static function extractAnnotationsFromReflector(Reflector $reflector): array + { + $annotations = []; + + if ($reflector instanceof ReflectionClass) { + $annotations = array_merge( + $annotations, + ...array_map( + static function (ReflectionClass $trait): array { + return self::parseDocBlock((string) $trait->getDocComment()); + }, + array_values($reflector->getTraits()) + ) + ); + } + + return array_merge( + $annotations, + self::parseDocBlock((string) $reflector->getDocComment()) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php new file mode 100644 index 0000000000..8df14cfc0c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\Annotation; + +use function array_key_exists; +use PHPUnit\Util\Exception; +use ReflectionClass; +use ReflectionException; +use ReflectionMethod; + +/** + * Reflection information, and therefore DocBlock information, is static within + * a single PHP process. It is therefore okay to use a Singleton registry here. + * + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Registry +{ + /** @var null|self */ + private static $instance; + + /** @var array indexed by class name */ + private $classDocBlocks = []; + + /** @var array> indexed by class name and method name */ + private $methodDocBlocks = []; + + public static function getInstance(): self + { + return self::$instance ?? self::$instance = new self; + } + + private function __construct() + { + } + + /** + * @throws Exception + * @psalm-param class-string $class + */ + public function forClassName(string $class): DocBlock + { + if (array_key_exists($class, $this->classDocBlocks)) { + return $this->classDocBlocks[$class]; + } + + try { + $reflection = new ReflectionClass($class); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + return $this->classDocBlocks[$class] = DocBlock::ofClass($reflection); + } + + /** + * @throws Exception + * @psalm-param class-string $classInHierarchy + */ + public function forMethod(string $classInHierarchy, string $method): DocBlock + { + if (isset($this->methodDocBlocks[$classInHierarchy][$method])) { + return $this->methodDocBlocks[$classInHierarchy][$method]; + } + + try { + $reflection = new ReflectionMethod($classInHierarchy, $method); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + return $this->methodDocBlocks[$classInHierarchy][$method] = DocBlock::ofMethod($reflection, $classInHierarchy); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Blacklist.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Blacklist.php new file mode 100644 index 0000000000..dd89dcd552 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Blacklist.php @@ -0,0 +1,224 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const DIRECTORY_SEPARATOR; +use function class_exists; +use function defined; +use function dirname; +use function strpos; +use function sys_get_temp_dir; +use Composer\Autoload\ClassLoader; +use DeepCopy\DeepCopy; +use Doctrine\Instantiator\Instantiator; +use PharIo\Manifest\Manifest; +use PharIo\Version\Version as PharIoVersion; +use PHP_Token; +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\Project; +use phpDocumentor\Reflection\Type; +use PHPUnit\Framework\TestCase; +use Prophecy\Prophet; +use ReflectionClass; +use ReflectionException; +use SebastianBergmann\CodeCoverage\CodeCoverage; +use SebastianBergmann\CodeUnitReverseLookup\Wizard; +use SebastianBergmann\Comparator\Comparator; +use SebastianBergmann\Diff\Diff; +use SebastianBergmann\Environment\Runtime; +use SebastianBergmann\Exporter\Exporter; +use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; +use SebastianBergmann\GlobalState\Snapshot; +use SebastianBergmann\Invoker\Invoker; +use SebastianBergmann\ObjectEnumerator\Enumerator; +use SebastianBergmann\RecursionContext\Context; +use SebastianBergmann\ResourceOperations\ResourceOperations; +use SebastianBergmann\Timer\Timer; +use SebastianBergmann\Type\TypeName; +use SebastianBergmann\Version; +use Text_Template; +use TheSeer\Tokenizer\Tokenizer; +use Webmozart\Assert\Assert; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Blacklist +{ + /** + * @var array + */ + public static $blacklistedClassNames = [ + // composer + ClassLoader::class => 1, + + // doctrine/instantiator + Instantiator::class => 1, + + // myclabs/deepcopy + DeepCopy::class => 1, + + // phar-io/manifest + Manifest::class => 1, + + // phar-io/version + PharIoVersion::class => 1, + + // phpdocumentor/reflection-common + Project::class => 1, + + // phpdocumentor/reflection-docblock + DocBlock::class => 1, + + // phpdocumentor/type-resolver + Type::class => 1, + + // phpspec/prophecy + Prophet::class => 1, + + // phpunit/phpunit + TestCase::class => 2, + + // phpunit/php-code-coverage + CodeCoverage::class => 1, + + // phpunit/php-file-iterator + FileIteratorFacade::class => 1, + + // phpunit/php-invoker + Invoker::class => 1, + + // phpunit/php-text-template + Text_Template::class => 1, + + // phpunit/php-timer + Timer::class => 1, + + // phpunit/php-token-stream + PHP_Token::class => 1, + + // sebastian/code-unit-reverse-lookup + Wizard::class => 1, + + // sebastian/comparator + Comparator::class => 1, + + // sebastian/diff + Diff::class => 1, + + // sebastian/environment + Runtime::class => 1, + + // sebastian/exporter + Exporter::class => 1, + + // sebastian/global-state + Snapshot::class => 1, + + // sebastian/object-enumerator + Enumerator::class => 1, + + // sebastian/recursion-context + Context::class => 1, + + // sebastian/resource-operations + ResourceOperations::class => 1, + + // sebastian/type + TypeName::class => 1, + + // sebastian/version + Version::class => 1, + + // theseer/tokenizer + Tokenizer::class => 1, + + // webmozart/assert + Assert::class => 1, + ]; + + /** + * @var string[] + */ + private static $directories; + + /** + * @throws Exception + * + * @return string[] + */ + public function getBlacklistedDirectories(): array + { + $this->initialize(); + + return self::$directories; + } + + /** + * @throws Exception + */ + public function isBlacklisted(string $file): bool + { + if (defined('PHPUNIT_TESTSUITE')) { + return false; + } + + $this->initialize(); + + foreach (self::$directories as $directory) { + if (strpos($file, $directory) === 0) { + return true; + } + } + + return false; + } + + /** + * @throws Exception + */ + private function initialize(): void + { + if (self::$directories === null) { + self::$directories = []; + + foreach (self::$blacklistedClassNames as $className => $parent) { + if (!class_exists($className)) { + continue; + } + + try { + $directory = (new ReflectionClass($className))->getFileName(); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + for ($i = 0; $i < $parent; $i++) { + $directory = dirname($directory); + } + + self::$directories[] = $directory; + } + + // Hide process isolation workaround on Windows. + if (DIRECTORY_SEPARATOR === '\\') { + // tempnam() prefix is limited to first 3 chars. + // @see https://php.net/manual/en/function.tempnam.php + self::$directories[] = sys_get_temp_dir() . '\\PHP'; + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Color.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Color.php new file mode 100644 index 0000000000..a756953b66 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Color.php @@ -0,0 +1,157 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const DIRECTORY_SEPARATOR; +use function array_keys; +use function array_map; +use function array_values; +use function count; +use function explode; +use function implode; +use function min; +use function preg_replace; +use function preg_replace_callback; +use function sprintf; +use function strtr; +use function trim; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Color +{ + /** + * @var array + */ + private const WHITESPACE_MAP = [ + ' ' => '·', + "\t" => '⇥', + ]; + + /** + * @var array + */ + private const WHITESPACE_EOL_MAP = [ + ' ' => '·', + "\t" => '⇥', + "\n" => '↵', + "\r" => '⟵', + ]; + + /** + * @var array + */ + private static $ansiCodes = [ + 'reset' => '0', + 'bold' => '1', + 'dim' => '2', + 'dim-reset' => '22', + 'underlined' => '4', + 'fg-default' => '39', + 'fg-black' => '30', + 'fg-red' => '31', + 'fg-green' => '32', + 'fg-yellow' => '33', + 'fg-blue' => '34', + 'fg-magenta' => '35', + 'fg-cyan' => '36', + 'fg-white' => '37', + 'bg-default' => '49', + 'bg-black' => '40', + 'bg-red' => '41', + 'bg-green' => '42', + 'bg-yellow' => '43', + 'bg-blue' => '44', + 'bg-magenta' => '45', + 'bg-cyan' => '46', + 'bg-white' => '47', + ]; + + public static function colorize(string $color, string $buffer): string + { + if (trim($buffer) === '') { + return $buffer; + } + + $codes = array_map('\trim', explode(',', $color)); + $styles = []; + + foreach ($codes as $code) { + if (isset(self::$ansiCodes[$code])) { + $styles[] = self::$ansiCodes[$code] ?? ''; + } + } + + if (empty($styles)) { + return $buffer; + } + + return self::optimizeColor(sprintf("\x1b[%sm", implode(';', $styles)) . $buffer . "\x1b[0m"); + } + + public static function colorizePath(string $path, ?string $prevPath = null, bool $colorizeFilename = false): string + { + if ($prevPath === null) { + $prevPath = ''; + } + + $path = explode(DIRECTORY_SEPARATOR, $path); + $prevPath = explode(DIRECTORY_SEPARATOR, $prevPath); + + for ($i = 0; $i < min(count($path), count($prevPath)); $i++) { + if ($path[$i] == $prevPath[$i]) { + $path[$i] = self::dim($path[$i]); + } + } + + if ($colorizeFilename) { + $last = count($path) - 1; + $path[$last] = preg_replace_callback( + '/([\-_\.]+|phpt$)/', + static function ($matches) { + return self::dim($matches[0]); + }, + $path[$last] + ); + } + + return self::optimizeColor(implode(self::dim(DIRECTORY_SEPARATOR), $path)); + } + + public static function dim(string $buffer): string + { + if (trim($buffer) === '') { + return $buffer; + } + + return "\e[2m{$buffer}\e[22m"; + } + + public static function visualizeWhitespace(string $buffer, bool $visualizeEOL = false): string + { + $replaceMap = $visualizeEOL ? self::WHITESPACE_EOL_MAP : self::WHITESPACE_MAP; + + return preg_replace_callback('/\s+/', static function ($matches) use ($replaceMap) { + return self::dim(strtr($matches[0], $replaceMap)); + }, $buffer); + } + + private static function optimizeColor(string $buffer): string + { + $patterns = [ + "/\e\\[22m\e\\[2m/" => '', + "/\e\\[([^m]*)m\e\\[([1-9][0-9;]*)m/" => "\e[$1;$2m", + "/(\e\\[[^m]*m)+(\e\\[0m)/" => '$2', + ]; + + return preg_replace(array_keys($patterns), array_values($patterns), $buffer); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Configuration.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Configuration.php new file mode 100644 index 0000000000..dfc4e241fe --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Configuration.php @@ -0,0 +1,1231 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const DIRECTORY_SEPARATOR; +use const PATH_SEPARATOR; +use const PHP_VERSION; +use function assert; +use function constant; +use function count; +use function define; +use function defined; +use function dirname; +use function explode; +use function file_exists; +use function file_get_contents; +use function getenv; +use function implode; +use function in_array; +use function ini_get; +use function ini_set; +use function is_numeric; +use function libxml_clear_errors; +use function libxml_get_errors; +use function libxml_use_internal_errors; +use function preg_match; +use function putenv; +use function realpath; +use function sprintf; +use function stream_resolve_include_path; +use function strlen; +use function strpos; +use function strtolower; +use function strtoupper; +use function substr; +use function trim; +use function version_compare; +use DOMDocument; +use DOMElement; +use DOMNodeList; +use DOMXPath; +use LibXMLError; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\TestSuiteSorter; +use PHPUnit\TextUI\ResultPrinter; +use PHPUnit\Util\TestDox\CliTestDoxPrinter; +use SebastianBergmann\FileIterator\Facade as FileIteratorFacade; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Configuration +{ + /** + * @var self[] + */ + private static $instances = []; + + /** + * @var DOMDocument + */ + private $document; + + /** + * @var DOMXPath + */ + private $xpath; + + /** + * @var string + */ + private $filename; + + /** + * @var LibXMLError[] + */ + private $errors = []; + + /** + * Returns a PHPUnit configuration object. + * + * @throws Exception + */ + public static function getInstance(string $filename): self + { + $realPath = realpath($filename); + + if ($realPath === false) { + throw new Exception( + sprintf( + 'Could not read "%s".', + $filename + ) + ); + } + + if (!isset(self::$instances[$realPath])) { + self::$instances[$realPath] = new self($realPath); + } + + return self::$instances[$realPath]; + } + + /** + * Loads a PHPUnit configuration file. + * + * @throws Exception + */ + private function __construct(string $filename) + { + $this->filename = $filename; + $this->document = Xml::loadFile($filename, false, true, true); + $this->xpath = new DOMXPath($this->document); + + $this->validateConfigurationAgainstSchema(); + } + + /** + * @codeCoverageIgnore + */ + private function __clone() + { + } + + public function hasValidationErrors(): bool + { + return count($this->errors) > 0; + } + + public function getValidationErrors(): array + { + $result = []; + + foreach ($this->errors as $error) { + if (!isset($result[$error->line])) { + $result[$error->line] = []; + } + $result[$error->line][] = trim($error->message); + } + + return $result; + } + + /** + * Returns the real path to the configuration file. + */ + public function getFilename(): string + { + return $this->filename; + } + + public function getExtensionConfiguration(): array + { + $result = []; + + foreach ($this->xpath->query('extensions/extension') as $extension) { + $result[] = $this->getElementConfigurationParameters($extension); + } + + return $result; + } + + /** + * Returns the configuration for SUT filtering. + */ + public function getFilterConfiguration(): array + { + $addUncoveredFilesFromWhitelist = true; + $processUncoveredFilesFromWhitelist = false; + $includeDirectory = []; + $includeFile = []; + $excludeDirectory = []; + $excludeFile = []; + + $tmp = $this->xpath->query('filter/whitelist'); + + if ($tmp->length === 1) { + if ($tmp->item(0)->hasAttribute('addUncoveredFilesFromWhitelist')) { + $addUncoveredFilesFromWhitelist = $this->getBoolean( + (string) $tmp->item(0)->getAttribute( + 'addUncoveredFilesFromWhitelist' + ), + true + ); + } + + if ($tmp->item(0)->hasAttribute('processUncoveredFilesFromWhitelist')) { + $processUncoveredFilesFromWhitelist = $this->getBoolean( + (string) $tmp->item(0)->getAttribute( + 'processUncoveredFilesFromWhitelist' + ), + false + ); + } + + $includeDirectory = $this->readFilterDirectories( + 'filter/whitelist/directory' + ); + + $includeFile = $this->readFilterFiles( + 'filter/whitelist/file' + ); + + $excludeDirectory = $this->readFilterDirectories( + 'filter/whitelist/exclude/directory' + ); + + $excludeFile = $this->readFilterFiles( + 'filter/whitelist/exclude/file' + ); + } + + return [ + 'whitelist' => [ + 'addUncoveredFilesFromWhitelist' => $addUncoveredFilesFromWhitelist, + 'processUncoveredFilesFromWhitelist' => $processUncoveredFilesFromWhitelist, + 'include' => [ + 'directory' => $includeDirectory, + 'file' => $includeFile, + ], + 'exclude' => [ + 'directory' => $excludeDirectory, + 'file' => $excludeFile, + ], + ], + ]; + } + + /** + * Returns the configuration for groups. + */ + public function getGroupConfiguration(): array + { + return $this->parseGroupConfiguration('groups'); + } + + /** + * Returns the configuration for testdox groups. + */ + public function getTestdoxGroupConfiguration(): array + { + return $this->parseGroupConfiguration('testdoxGroups'); + } + + /** + * Returns the configuration for listeners. + */ + public function getListenerConfiguration(): array + { + $result = []; + + foreach ($this->xpath->query('listeners/listener') as $listener) { + $result[] = $this->getElementConfigurationParameters($listener); + } + + return $result; + } + + /** + * Returns the logging configuration. + */ + public function getLoggingConfiguration(): array + { + $result = []; + + foreach ($this->xpath->query('logging/log') as $log) { + assert($log instanceof DOMElement); + + $type = (string) $log->getAttribute('type'); + $target = (string) $log->getAttribute('target'); + + if (!$target) { + continue; + } + + $target = $this->toAbsolutePath($target); + + if ($type === 'coverage-html') { + if ($log->hasAttribute('lowUpperBound')) { + $result['lowUpperBound'] = $this->getInteger( + (string) $log->getAttribute('lowUpperBound'), + 50 + ); + } + + if ($log->hasAttribute('highLowerBound')) { + $result['highLowerBound'] = $this->getInteger( + (string) $log->getAttribute('highLowerBound'), + 90 + ); + } + } elseif ($type === 'coverage-crap4j') { + if ($log->hasAttribute('threshold')) { + $result['crap4jThreshold'] = $this->getInteger( + (string) $log->getAttribute('threshold'), + 30 + ); + } + } elseif ($type === 'coverage-text') { + if ($log->hasAttribute('showUncoveredFiles')) { + $result['coverageTextShowUncoveredFiles'] = $this->getBoolean( + (string) $log->getAttribute('showUncoveredFiles'), + false + ); + } + + if ($log->hasAttribute('showOnlySummary')) { + $result['coverageTextShowOnlySummary'] = $this->getBoolean( + (string) $log->getAttribute('showOnlySummary'), + false + ); + } + } + + $result[$type] = $target; + } + + return $result; + } + + /** + * Returns the PHP configuration. + */ + public function getPHPConfiguration(): array + { + $result = [ + 'include_path' => [], + 'ini' => [], + 'const' => [], + 'var' => [], + 'env' => [], + 'post' => [], + 'get' => [], + 'cookie' => [], + 'server' => [], + 'files' => [], + 'request' => [], + ]; + + foreach ($this->xpath->query('php/includePath') as $includePath) { + $path = (string) $includePath->textContent; + + if ($path) { + $result['include_path'][] = $this->toAbsolutePath($path); + } + } + + foreach ($this->xpath->query('php/ini') as $ini) { + assert($ini instanceof DOMElement); + + $name = (string) $ini->getAttribute('name'); + $value = (string) $ini->getAttribute('value'); + + $result['ini'][$name]['value'] = $value; + } + + foreach ($this->xpath->query('php/const') as $const) { + assert($const instanceof DOMElement); + + $name = (string) $const->getAttribute('name'); + $value = (string) $const->getAttribute('value'); + + $result['const'][$name]['value'] = $this->getBoolean($value, $value); + } + + foreach (['var', 'env', 'post', 'get', 'cookie', 'server', 'files', 'request'] as $array) { + foreach ($this->xpath->query('php/' . $array) as $var) { + assert($var instanceof DOMElement); + + $name = (string) $var->getAttribute('name'); + $value = (string) $var->getAttribute('value'); + $verbatim = false; + + if ($var->hasAttribute('verbatim')) { + $verbatim = $this->getBoolean($var->getAttribute('verbatim'), false); + $result[$array][$name]['verbatim'] = $verbatim; + } + + if ($var->hasAttribute('force')) { + $force = $this->getBoolean($var->getAttribute('force'), false); + $result[$array][$name]['force'] = $force; + } + + if (!$verbatim) { + $value = $this->getBoolean($value, $value); + } + + $result[$array][$name]['value'] = $value; + } + } + + return $result; + } + + /** + * Handles the PHP configuration. + */ + public function handlePHPConfiguration(): void + { + $configuration = $this->getPHPConfiguration(); + + if (!empty($configuration['include_path'])) { + ini_set( + 'include_path', + implode(PATH_SEPARATOR, $configuration['include_path']) . + PATH_SEPARATOR . + ini_get('include_path') + ); + } + + foreach ($configuration['ini'] as $name => $data) { + $value = $data['value']; + + if (defined($value)) { + $value = (string) constant($value); + } + + ini_set($name, $value); + } + + foreach ($configuration['const'] as $name => $data) { + $value = $data['value']; + + if (!defined($name)) { + define($name, $value); + } + } + + foreach ($configuration['var'] as $name => $data) { + $GLOBALS[$name] = $data['value']; + } + + foreach ($configuration['server'] as $name => $data) { + $_SERVER[$name] = $data['value']; + } + + foreach (['post', 'get', 'cookie', 'files', 'request'] as $array) { + $target = &$GLOBALS['_' . strtoupper($array)]; + + foreach ($configuration[$array] as $name => $data) { + $target[$name] = $data['value']; + } + } + + foreach ($configuration['env'] as $name => $data) { + $value = $data['value']; + $force = $data['force'] ?? false; + + if ($force || getenv($name) === false) { + putenv("{$name}={$value}"); + } + + $value = getenv($name); + + if (!isset($_ENV[$name])) { + $_ENV[$name] = $value; + } + + if ($force) { + $_ENV[$name] = $value; + } + } + } + + /** + * Returns the PHPUnit configuration. + */ + public function getPHPUnitConfiguration(): array + { + $result = []; + $root = $this->document->documentElement; + + if ($root->hasAttribute('cacheTokens')) { + $result['cacheTokens'] = $this->getBoolean( + (string) $root->getAttribute('cacheTokens'), + false + ); + } + + if ($root->hasAttribute('columns')) { + $columns = (string) $root->getAttribute('columns'); + + if ($columns === 'max') { + $result['columns'] = 'max'; + } else { + $result['columns'] = $this->getInteger($columns, 80); + } + } + + if ($root->hasAttribute('colors')) { + /* only allow boolean for compatibility with previous versions + 'always' only allowed from command line */ + if ($this->getBoolean($root->getAttribute('colors'), false)) { + $result['colors'] = ResultPrinter::COLOR_AUTO; + } else { + $result['colors'] = ResultPrinter::COLOR_NEVER; + } + } + + /* + * @see https://github.com/sebastianbergmann/phpunit/issues/657 + */ + if ($root->hasAttribute('stderr')) { + $result['stderr'] = $this->getBoolean( + (string) $root->getAttribute('stderr'), + false + ); + } + + if ($root->hasAttribute('backupGlobals')) { + $result['backupGlobals'] = $this->getBoolean( + (string) $root->getAttribute('backupGlobals'), + false + ); + } + + if ($root->hasAttribute('backupStaticAttributes')) { + $result['backupStaticAttributes'] = $this->getBoolean( + (string) $root->getAttribute('backupStaticAttributes'), + false + ); + } + + if ($root->getAttribute('bootstrap')) { + $result['bootstrap'] = $this->toAbsolutePath( + (string) $root->getAttribute('bootstrap') + ); + } + + if ($root->hasAttribute('convertDeprecationsToExceptions')) { + $result['convertDeprecationsToExceptions'] = $this->getBoolean( + (string) $root->getAttribute('convertDeprecationsToExceptions'), + true + ); + } + + if ($root->hasAttribute('convertErrorsToExceptions')) { + $result['convertErrorsToExceptions'] = $this->getBoolean( + (string) $root->getAttribute('convertErrorsToExceptions'), + true + ); + } + + if ($root->hasAttribute('convertNoticesToExceptions')) { + $result['convertNoticesToExceptions'] = $this->getBoolean( + (string) $root->getAttribute('convertNoticesToExceptions'), + true + ); + } + + if ($root->hasAttribute('convertWarningsToExceptions')) { + $result['convertWarningsToExceptions'] = $this->getBoolean( + (string) $root->getAttribute('convertWarningsToExceptions'), + true + ); + } + + if ($root->hasAttribute('forceCoversAnnotation')) { + $result['forceCoversAnnotation'] = $this->getBoolean( + (string) $root->getAttribute('forceCoversAnnotation'), + false + ); + } + + if ($root->hasAttribute('disableCodeCoverageIgnore')) { + $result['disableCodeCoverageIgnore'] = $this->getBoolean( + (string) $root->getAttribute('disableCodeCoverageIgnore'), + false + ); + } + + if ($root->hasAttribute('processIsolation')) { + $result['processIsolation'] = $this->getBoolean( + (string) $root->getAttribute('processIsolation'), + false + ); + } + + if ($root->hasAttribute('stopOnDefect')) { + $result['stopOnDefect'] = $this->getBoolean( + (string) $root->getAttribute('stopOnDefect'), + false + ); + } + + if ($root->hasAttribute('stopOnError')) { + $result['stopOnError'] = $this->getBoolean( + (string) $root->getAttribute('stopOnError'), + false + ); + } + + if ($root->hasAttribute('stopOnFailure')) { + $result['stopOnFailure'] = $this->getBoolean( + (string) $root->getAttribute('stopOnFailure'), + false + ); + } + + if ($root->hasAttribute('stopOnWarning')) { + $result['stopOnWarning'] = $this->getBoolean( + (string) $root->getAttribute('stopOnWarning'), + false + ); + } + + if ($root->hasAttribute('stopOnIncomplete')) { + $result['stopOnIncomplete'] = $this->getBoolean( + (string) $root->getAttribute('stopOnIncomplete'), + false + ); + } + + if ($root->hasAttribute('stopOnRisky')) { + $result['stopOnRisky'] = $this->getBoolean( + (string) $root->getAttribute('stopOnRisky'), + false + ); + } + + if ($root->hasAttribute('stopOnSkipped')) { + $result['stopOnSkipped'] = $this->getBoolean( + (string) $root->getAttribute('stopOnSkipped'), + false + ); + } + + if ($root->hasAttribute('failOnWarning')) { + $result['failOnWarning'] = $this->getBoolean( + (string) $root->getAttribute('failOnWarning'), + false + ); + } + + if ($root->hasAttribute('failOnRisky')) { + $result['failOnRisky'] = $this->getBoolean( + (string) $root->getAttribute('failOnRisky'), + false + ); + } + + if ($root->hasAttribute('testSuiteLoaderClass')) { + $result['testSuiteLoaderClass'] = (string) $root->getAttribute( + 'testSuiteLoaderClass' + ); + } + + if ($root->hasAttribute('defaultTestSuite')) { + $result['defaultTestSuite'] = (string) $root->getAttribute( + 'defaultTestSuite' + ); + } + + if ($root->getAttribute('testSuiteLoaderFile')) { + $result['testSuiteLoaderFile'] = $this->toAbsolutePath( + (string) $root->getAttribute('testSuiteLoaderFile') + ); + } + + if ($root->hasAttribute('printerClass')) { + $result['printerClass'] = (string) $root->getAttribute( + 'printerClass' + ); + } + + if ($root->getAttribute('printerFile')) { + $result['printerFile'] = $this->toAbsolutePath( + (string) $root->getAttribute('printerFile') + ); + } + + if ($root->hasAttribute('beStrictAboutChangesToGlobalState')) { + $result['beStrictAboutChangesToGlobalState'] = $this->getBoolean( + (string) $root->getAttribute('beStrictAboutChangesToGlobalState'), + false + ); + } + + if ($root->hasAttribute('beStrictAboutOutputDuringTests')) { + $result['disallowTestOutput'] = $this->getBoolean( + (string) $root->getAttribute('beStrictAboutOutputDuringTests'), + false + ); + } + + if ($root->hasAttribute('beStrictAboutResourceUsageDuringSmallTests')) { + $result['beStrictAboutResourceUsageDuringSmallTests'] = $this->getBoolean( + (string) $root->getAttribute('beStrictAboutResourceUsageDuringSmallTests'), + false + ); + } + + if ($root->hasAttribute('beStrictAboutTestsThatDoNotTestAnything')) { + $result['reportUselessTests'] = $this->getBoolean( + (string) $root->getAttribute('beStrictAboutTestsThatDoNotTestAnything'), + true + ); + } + + if ($root->hasAttribute('beStrictAboutTodoAnnotatedTests')) { + $result['disallowTodoAnnotatedTests'] = $this->getBoolean( + (string) $root->getAttribute('beStrictAboutTodoAnnotatedTests'), + false + ); + } + + if ($root->hasAttribute('beStrictAboutCoversAnnotation')) { + $result['strictCoverage'] = $this->getBoolean( + (string) $root->getAttribute('beStrictAboutCoversAnnotation'), + false + ); + } + + if ($root->hasAttribute('defaultTimeLimit')) { + $result['defaultTimeLimit'] = $this->getInteger( + (string) $root->getAttribute('defaultTimeLimit'), + 1 + ); + } + + if ($root->hasAttribute('enforceTimeLimit')) { + $result['enforceTimeLimit'] = $this->getBoolean( + (string) $root->getAttribute('enforceTimeLimit'), + false + ); + } + + if ($root->hasAttribute('ignoreDeprecatedCodeUnitsFromCodeCoverage')) { + $result['ignoreDeprecatedCodeUnitsFromCodeCoverage'] = $this->getBoolean( + (string) $root->getAttribute('ignoreDeprecatedCodeUnitsFromCodeCoverage'), + false + ); + } + + if ($root->hasAttribute('timeoutForSmallTests')) { + $result['timeoutForSmallTests'] = $this->getInteger( + (string) $root->getAttribute('timeoutForSmallTests'), + 1 + ); + } + + if ($root->hasAttribute('timeoutForMediumTests')) { + $result['timeoutForMediumTests'] = $this->getInteger( + (string) $root->getAttribute('timeoutForMediumTests'), + 10 + ); + } + + if ($root->hasAttribute('timeoutForLargeTests')) { + $result['timeoutForLargeTests'] = $this->getInteger( + (string) $root->getAttribute('timeoutForLargeTests'), + 60 + ); + } + + if ($root->hasAttribute('reverseDefectList')) { + $result['reverseDefectList'] = $this->getBoolean( + (string) $root->getAttribute('reverseDefectList'), + false + ); + } + + if ($root->hasAttribute('verbose')) { + $result['verbose'] = $this->getBoolean( + (string) $root->getAttribute('verbose'), + false + ); + } + + if ($root->hasAttribute('testdox')) { + $testdox = $this->getBoolean( + (string) $root->getAttribute('testdox'), + false + ); + + if ($testdox) { + if (isset($result['printerClass'])) { + $result['conflictBetweenPrinterClassAndTestdox'] = true; + } else { + $result['printerClass'] = CliTestDoxPrinter::class; + } + } + } + + if ($root->hasAttribute('registerMockObjectsFromTestArgumentsRecursively')) { + $result['registerMockObjectsFromTestArgumentsRecursively'] = $this->getBoolean( + (string) $root->getAttribute('registerMockObjectsFromTestArgumentsRecursively'), + false + ); + } + + if ($root->hasAttribute('extensionsDirectory')) { + $result['extensionsDirectory'] = $this->toAbsolutePath( + (string) $root->getAttribute( + 'extensionsDirectory' + ) + ); + } + + if ($root->hasAttribute('cacheResult')) { + $result['cacheResult'] = $this->getBoolean( + (string) $root->getAttribute('cacheResult'), + true + ); + } + + if ($root->hasAttribute('cacheResultFile')) { + $result['cacheResultFile'] = $this->toAbsolutePath( + (string) $root->getAttribute('cacheResultFile') + ); + } + + if ($root->hasAttribute('executionOrder')) { + foreach (explode(',', $root->getAttribute('executionOrder')) as $order) { + switch ($order) { + case 'default': + $result['executionOrder'] = TestSuiteSorter::ORDER_DEFAULT; + $result['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFAULT; + $result['resolveDependencies'] = false; + + break; + + case 'defects': + $result['executionOrderDefects'] = TestSuiteSorter::ORDER_DEFECTS_FIRST; + + break; + + case 'depends': + $result['resolveDependencies'] = true; + + break; + + case 'duration': + $result['executionOrder'] = TestSuiteSorter::ORDER_DURATION; + + break; + + case 'no-depends': + $result['resolveDependencies'] = false; + + break; + + case 'random': + $result['executionOrder'] = TestSuiteSorter::ORDER_RANDOMIZED; + + break; + + case 'reverse': + $result['executionOrder'] = TestSuiteSorter::ORDER_REVERSED; + + break; + + case 'size': + $result['executionOrder'] = TestSuiteSorter::ORDER_SIZE; + + break; + } + } + } + + if ($root->hasAttribute('resolveDependencies')) { + $result['resolveDependencies'] = $this->getBoolean( + (string) $root->getAttribute('resolveDependencies'), + false + ); + } + + if ($root->hasAttribute('noInteraction')) { + $result['noInteraction'] = $this->getBoolean( + (string) $root->getAttribute('noInteraction'), + false + ); + } + + return $result; + } + + /** + * Returns the test suite configuration. + * + * @throws Exception + */ + public function getTestSuiteConfiguration(string $testSuiteFilter = ''): TestSuite + { + $testSuiteNodes = $this->xpath->query('testsuites/testsuite'); + + if ($testSuiteNodes->length === 0) { + $testSuiteNodes = $this->xpath->query('testsuite'); + } + + if ($testSuiteNodes->length === 1) { + return $this->getTestSuite($testSuiteNodes->item(0), $testSuiteFilter); + } + + $suite = new TestSuite; + + foreach ($testSuiteNodes as $testSuiteNode) { + $suite->addTestSuite( + $this->getTestSuite($testSuiteNode, $testSuiteFilter) + ); + } + + return $suite; + } + + /** + * Returns the test suite names from the configuration. + */ + public function getTestSuiteNames(): array + { + $names = []; + + foreach ($this->xpath->query('*/testsuite') as $node) { + /* @var DOMElement $node */ + $names[] = $node->getAttribute('name'); + } + + return $names; + } + + private function validateConfigurationAgainstSchema(): void + { + $original = libxml_use_internal_errors(true); + $xsdFilename = __DIR__ . '/../../phpunit.xsd'; + + if (defined('__PHPUNIT_PHAR_ROOT__')) { + $xsdFilename = __PHPUNIT_PHAR_ROOT__ . '/phpunit.xsd'; + } + + $this->document->schemaValidateSource(file_get_contents($xsdFilename)); + $this->errors = libxml_get_errors(); + libxml_clear_errors(); + libxml_use_internal_errors($original); + } + + /** + * Collects and returns the configuration arguments from the PHPUnit + * XML configuration. + */ + private function getConfigurationArguments(DOMNodeList $nodes): array + { + $arguments = []; + + if ($nodes->length === 0) { + return $arguments; + } + + foreach ($nodes as $node) { + if (!$node instanceof DOMElement) { + continue; + } + + if ($node->tagName !== 'arguments') { + continue; + } + + foreach ($node->childNodes as $argument) { + if (!$argument instanceof DOMElement) { + continue; + } + + if ($argument->tagName === 'file' || $argument->tagName === 'directory') { + $arguments[] = $this->toAbsolutePath((string) $argument->textContent); + } else { + $arguments[] = Xml::xmlToVariable($argument); + } + } + } + + return $arguments; + } + + /** + * @throws \PHPUnit\Framework\Exception + */ + private function getTestSuite(DOMElement $testSuiteNode, string $testSuiteFilter = ''): TestSuite + { + if ($testSuiteNode->hasAttribute('name')) { + $suite = new TestSuite( + (string) $testSuiteNode->getAttribute('name') + ); + } else { + $suite = new TestSuite; + } + + $exclude = []; + + foreach ($testSuiteNode->getElementsByTagName('exclude') as $excludeNode) { + $excludeFile = (string) $excludeNode->textContent; + + if ($excludeFile) { + $exclude[] = $this->toAbsolutePath($excludeFile); + } + } + + $fileIteratorFacade = new FileIteratorFacade; + $testSuiteFilter = $testSuiteFilter ? explode(',', $testSuiteFilter) : []; + + foreach ($testSuiteNode->getElementsByTagName('directory') as $directoryNode) { + assert($directoryNode instanceof DOMElement); + + if (!empty($testSuiteFilter) && !in_array($directoryNode->parentNode->getAttribute('name'), $testSuiteFilter, true)) { + continue; + } + + $directory = (string) $directoryNode->textContent; + + if (empty($directory)) { + continue; + } + + if (!$this->satisfiesPhpVersion($directoryNode)) { + continue; + } + + $files = $fileIteratorFacade->getFilesAsArray( + $this->toAbsolutePath($directory), + $directoryNode->hasAttribute('suffix') ? (string) $directoryNode->getAttribute('suffix') : 'Test.php', + $directoryNode->hasAttribute('prefix') ? (string) $directoryNode->getAttribute('prefix') : '', + $exclude + ); + + $suite->addTestFiles($files); + } + + foreach ($testSuiteNode->getElementsByTagName('file') as $fileNode) { + assert($fileNode instanceof DOMElement); + + if (!empty($testSuiteFilter) && !in_array($fileNode->parentNode->getAttribute('name'), $testSuiteFilter, true)) { + continue; + } + + $file = (string) $fileNode->textContent; + + if (empty($file)) { + continue; + } + + $file = $fileIteratorFacade->getFilesAsArray( + $this->toAbsolutePath($file) + ); + + if (!isset($file[0])) { + continue; + } + + $file = $file[0]; + + if (!$this->satisfiesPhpVersion($fileNode)) { + continue; + } + + $suite->addTestFile($file); + } + + return $suite; + } + + private function satisfiesPhpVersion(DOMElement $node): bool + { + $phpVersion = PHP_VERSION; + $phpVersionOperator = '>='; + + if ($node->hasAttribute('phpVersion')) { + $phpVersion = (string) $node->getAttribute('phpVersion'); + } + + if ($node->hasAttribute('phpVersionOperator')) { + $phpVersionOperator = (string) $node->getAttribute('phpVersionOperator'); + } + + return version_compare(PHP_VERSION, $phpVersion, (new VersionComparisonOperator($phpVersionOperator))->asString()); + } + + /** + * if $value is 'false' or 'true', this returns the value that $value represents. + * Otherwise, returns $default, which may be a string in rare cases. + * See PHPUnit\Util\ConfigurationTest::testPHPConfigurationIsReadCorrectly. + * + * @param bool|string $default + * + * @return bool|string + */ + private function getBoolean(string $value, $default) + { + if (strtolower($value) === 'false') { + return false; + } + + if (strtolower($value) === 'true') { + return true; + } + + return $default; + } + + private function getInteger(string $value, int $default): int + { + if (is_numeric($value)) { + return (int) $value; + } + + return $default; + } + + private function readFilterDirectories(string $query): array + { + $directories = []; + + foreach ($this->xpath->query($query) as $directoryNode) { + assert($directoryNode instanceof DOMElement); + + $directoryPath = (string) $directoryNode->textContent; + + if (!$directoryPath) { + continue; + } + + $directories[] = [ + 'path' => $this->toAbsolutePath($directoryPath), + 'prefix' => $directoryNode->hasAttribute('prefix') ? (string) $directoryNode->getAttribute('prefix') : '', + 'suffix' => $directoryNode->hasAttribute('suffix') ? (string) $directoryNode->getAttribute('suffix') : '.php', + 'group' => $directoryNode->hasAttribute('group') ? (string) $directoryNode->getAttribute('group') : 'DEFAULT', + ]; + } + + return $directories; + } + + /** + * @return string[] + */ + private function readFilterFiles(string $query): array + { + $files = []; + + foreach ($this->xpath->query($query) as $file) { + $filePath = (string) $file->textContent; + + if ($filePath) { + $files[] = $this->toAbsolutePath($filePath); + } + } + + return $files; + } + + private function toAbsolutePath(string $path, bool $useIncludePath = false): string + { + $path = trim($path); + + if (strpos($path, '/') === 0) { + return $path; + } + + // Matches the following on Windows: + // - \\NetworkComputer\Path + // - \\.\D: + // - \\.\c: + // - C:\Windows + // - C:\windows + // - C:/windows + // - c:/windows + if (defined('PHP_WINDOWS_VERSION_BUILD') && + ($path[0] === '\\' || (strlen($path) >= 3 && preg_match('#^[A-Z]\:[/\\\]#i', substr($path, 0, 3))))) { + return $path; + } + + if (strpos($path, '://') !== false) { + return $path; + } + + $file = dirname($this->filename) . DIRECTORY_SEPARATOR . $path; + + if ($useIncludePath && !file_exists($file)) { + $includePathFile = stream_resolve_include_path($path); + + if ($includePathFile) { + $file = $includePathFile; + } + } + + return $file; + } + + private function parseGroupConfiguration(string $root): array + { + $groups = [ + 'include' => [], + 'exclude' => [], + ]; + + foreach ($this->xpath->query($root . '/include/group') as $group) { + $groups['include'][] = (string) $group->textContent; + } + + foreach ($this->xpath->query($root . '/exclude/group') as $group) { + $groups['exclude'][] = (string) $group->textContent; + } + + return $groups; + } + + private function getElementConfigurationParameters(DOMElement $element): array + { + $class = (string) $element->getAttribute('class'); + $file = ''; + $arguments = $this->getConfigurationArguments($element->childNodes); + + if ($element->getAttribute('file')) { + $file = $this->toAbsolutePath( + (string) $element->getAttribute('file'), + true + ); + } + + return [ + 'class' => $class, + 'file' => $file, + 'arguments' => $arguments, + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php new file mode 100644 index 0000000000..fcf9891bd1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use function str_replace; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ConfigurationGenerator +{ + /** + * @var string + */ + private const TEMPLATE = <<<'EOT' + + + + + {tests_directory} + + + + + + {src_directory} + + + + +EOT; + + public function generateDefaultConfiguration(string $phpunitVersion, string $bootstrapScript, string $testsDirectory, string $srcDirectory): string + { + return str_replace( + [ + '{phpunit_version}', + '{bootstrap_script}', + '{tests_directory}', + '{src_directory}', + ], + [ + $phpunitVersion, + $bootstrapScript, + $testsDirectory, + $srcDirectory, + ], + self::TEMPLATE + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ErrorHandler.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ErrorHandler.php new file mode 100644 index 0000000000..61dbbbc137 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/ErrorHandler.php @@ -0,0 +1,155 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const E_DEPRECATED; +use const E_NOTICE; +use const E_STRICT; +use const E_USER_DEPRECATED; +use const E_USER_NOTICE; +use const E_USER_WARNING; +use const E_WARNING; +use function error_reporting; +use function restore_error_handler; +use function set_error_handler; +use PHPUnit\Framework\Error\Deprecated; +use PHPUnit\Framework\Error\Error; +use PHPUnit\Framework\Error\Notice; +use PHPUnit\Framework\Error\Warning; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class ErrorHandler +{ + /** + * @var bool + */ + private $convertDeprecationsToExceptions; + + /** + * @var bool + */ + private $convertErrorsToExceptions; + + /** + * @var bool + */ + private $convertNoticesToExceptions; + + /** + * @var bool + */ + private $convertWarningsToExceptions; + + /** + * @var bool + */ + private $registered = false; + + public static function invokeIgnoringWarnings(callable $callable) + { + set_error_handler( + static function ($errorNumber, $errorString) { + if ($errorNumber === E_WARNING) { + return; + } + + return false; + } + ); + + $result = $callable(); + + restore_error_handler(); + + return $result; + } + + public function __construct(bool $convertDeprecationsToExceptions, bool $convertErrorsToExceptions, bool $convertNoticesToExceptions, bool $convertWarningsToExceptions) + { + $this->convertDeprecationsToExceptions = $convertDeprecationsToExceptions; + $this->convertErrorsToExceptions = $convertErrorsToExceptions; + $this->convertNoticesToExceptions = $convertNoticesToExceptions; + $this->convertWarningsToExceptions = $convertWarningsToExceptions; + } + + public function __invoke(int $errorNumber, string $errorString, string $errorFile, int $errorLine): bool + { + /* + * Do not raise an exception when the error suppression operator (@) was used. + * + * @see https://github.com/sebastianbergmann/phpunit/issues/3739 + */ + if (!($errorNumber & error_reporting())) { + return false; + } + + switch ($errorNumber) { + case E_NOTICE: + case E_USER_NOTICE: + case E_STRICT: + if (!$this->convertNoticesToExceptions) { + return false; + } + + throw new Notice($errorString, $errorNumber, $errorFile, $errorLine); + + case E_WARNING: + case E_USER_WARNING: + if (!$this->convertWarningsToExceptions) { + return false; + } + + throw new Warning($errorString, $errorNumber, $errorFile, $errorLine); + + case E_DEPRECATED: + case E_USER_DEPRECATED: + if (!$this->convertDeprecationsToExceptions) { + return false; + } + + throw new Deprecated($errorString, $errorNumber, $errorFile, $errorLine); + + default: + if (!$this->convertErrorsToExceptions) { + return false; + } + + throw new Error($errorString, $errorNumber, $errorFile, $errorLine); + } + } + + public function register(): void + { + if ($this->registered) { + return; + } + + $oldErrorHandler = set_error_handler($this); + + if ($oldErrorHandler !== null) { + restore_error_handler(); + + return; + } + + $this->registered = true; + } + + public function unregister(): void + { + if (!$this->registered) { + return; + } + + restore_error_handler(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Exception.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Exception.php new file mode 100644 index 0000000000..6bcb3d140a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Exception.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use RuntimeException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Exception extends RuntimeException implements \PHPUnit\Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/FileLoader.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/FileLoader.php new file mode 100644 index 0000000000..1390d8cf43 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/FileLoader.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const DIRECTORY_SEPARATOR; +use function array_diff; +use function array_keys; +use function fopen; +use function get_defined_vars; +use function sprintf; +use function stream_resolve_include_path; +use PHPUnit\Framework\Exception; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class FileLoader +{ + /** + * Checks if a PHP sourcecode file is readable. The sourcecode file is loaded through the load() method. + * + * As a fallback, PHP looks in the directory of the file executing the stream_resolve_include_path function. + * We do not want to load the Test.php file here, so skip it if it found that. + * PHP prioritizes the include_path setting, so if the current directory is in there, it will first look in the + * current working directory. + * + * @throws Exception + */ + public static function checkAndLoad(string $filename): string + { + $includePathFilename = stream_resolve_include_path($filename); + + if (!$includePathFilename) { + throw new Exception( + sprintf('Cannot open file "%s".' . "\n", $filename) + ); + } + + $localFile = __DIR__ . DIRECTORY_SEPARATOR . $filename; + + if ($includePathFilename === $localFile || !self::isReadable($includePathFilename)) { + throw new Exception( + sprintf('Cannot open file "%s".' . "\n", $filename) + ); + } + + self::load($includePathFilename); + + return $includePathFilename; + } + + /** + * Loads a PHP sourcefile. + */ + public static function load(string $filename): void + { + $oldVariableNames = array_keys(get_defined_vars()); + + include_once $filename; + + $newVariables = get_defined_vars(); + + foreach (array_diff(array_keys($newVariables), $oldVariableNames) as $variableName) { + if ($variableName !== 'oldVariableNames') { + $GLOBALS[$variableName] = $newVariables[$variableName]; + } + } + } + + /** + * @see https://github.com/sebastianbergmann/phpunit/pull/2751 + */ + private static function isReadable(string $filename): bool + { + return @fopen($filename, 'r') !== false; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filesystem.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filesystem.php new file mode 100644 index 0000000000..cd0c125f72 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filesystem.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const DIRECTORY_SEPARATOR; +use function is_dir; +use function mkdir; +use function str_replace; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Filesystem +{ + /** + * Maps class names to source file names: + * - PEAR CS: Foo_Bar_Baz -> Foo/Bar/Baz.php + * - Namespace: Foo\Bar\Baz -> Foo/Bar/Baz.php. + */ + public static function classNameToFilename(string $className): string + { + return str_replace( + ['_', '\\'], + DIRECTORY_SEPARATOR, + $className + ) . '.php'; + } + + public static function createDirectory(string $directory): bool + { + return !(!is_dir($directory) && !@mkdir($directory, 0777, true) && !is_dir($directory)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filter.php new file mode 100644 index 0000000000..06f58d55d0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Filter.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use function array_unshift; +use function defined; +use function in_array; +use function is_file; +use function realpath; +use function sprintf; +use function strpos; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\SyntheticError; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Filter +{ + /** + * @throws Exception + */ + public static function getFilteredStacktrace(Throwable $t): string + { + $filteredStacktrace = ''; + + if ($t instanceof SyntheticError) { + $eTrace = $t->getSyntheticTrace(); + $eFile = $t->getSyntheticFile(); + $eLine = $t->getSyntheticLine(); + } elseif ($t instanceof Exception) { + $eTrace = $t->getSerializableTrace(); + $eFile = $t->getFile(); + $eLine = $t->getLine(); + } else { + if ($t->getPrevious()) { + $t = $t->getPrevious(); + } + + $eTrace = $t->getTrace(); + $eFile = $t->getFile(); + $eLine = $t->getLine(); + } + + if (!self::frameExists($eTrace, $eFile, $eLine)) { + array_unshift( + $eTrace, + ['file' => $eFile, 'line' => $eLine] + ); + } + + $prefix = defined('__PHPUNIT_PHAR_ROOT__') ? __PHPUNIT_PHAR_ROOT__ : false; + $blacklist = new Blacklist; + + foreach ($eTrace as $frame) { + if (self::shouldPrintFrame($frame, $prefix, $blacklist)) { + $filteredStacktrace .= sprintf( + "%s:%s\n", + $frame['file'], + $frame['line'] ?? '?' + ); + } + } + + return $filteredStacktrace; + } + + private static function shouldPrintFrame($frame, $prefix, Blacklist $blacklist): bool + { + if (!isset($frame['file'])) { + return false; + } + + $file = $frame['file']; + $fileIsNotPrefixed = $prefix === false || strpos($file, $prefix) !== 0; + + // @see https://github.com/sebastianbergmann/phpunit/issues/4033 + if (isset($GLOBALS['_SERVER']['SCRIPT_NAME'])) { + $script = realpath($GLOBALS['_SERVER']['SCRIPT_NAME']); + } else { + $script = ''; + } + + return is_file($file) && + self::fileIsBlacklisted($file, $blacklist) && + $fileIsNotPrefixed && + $file !== $script; + } + + private static function fileIsBlacklisted($file, Blacklist $blacklist): bool + { + return (empty($GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST']) || + !in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST'], true)) && + !$blacklist->isBlacklisted($file); + } + + private static function frameExists(array $trace, string $file, int $line): bool + { + foreach ($trace as $frame) { + if (isset($frame['file'], $frame['line']) && $frame['file'] === $file && $frame['line'] === $line) { + return true; + } + } + + return false; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Getopt.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Getopt.php new file mode 100644 index 0000000000..878e2a43fe --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Getopt.php @@ -0,0 +1,197 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use function array_map; +use function array_merge; +use function array_shift; +use function array_slice; +use function count; +use function current; +use function explode; +use function key; +use function next; +use function preg_replace; +use function reset; +use function sort; +use function strlen; +use function strpos; +use function strstr; +use function substr; +use PHPUnit\Framework\Exception; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Getopt +{ + /** + * @throws Exception + */ + public static function parse(array $args, string $short_options, array $long_options = null): array + { + if (empty($args)) { + return [[], []]; + } + + $opts = []; + $non_opts = []; + + if ($long_options) { + sort($long_options); + } + + if (isset($args[0][0]) && $args[0][0] !== '-') { + array_shift($args); + } + + reset($args); + + $args = array_map('trim', $args); + + /* @noinspection ComparisonOperandsOrderInspection */ + while (false !== $arg = current($args)) { + $i = key($args); + next($args); + + if ($arg === '') { + continue; + } + + if ($arg === '--') { + $non_opts = array_merge($non_opts, array_slice($args, $i + 1)); + + break; + } + + if ($arg[0] !== '-' || (strlen($arg) > 1 && $arg[1] === '-' && !$long_options)) { + $non_opts[] = $args[$i]; + + continue; + } + + if (strlen($arg) > 1 && $arg[1] === '-') { + self::parseLongOption( + substr($arg, 2), + $long_options, + $opts, + $args + ); + } else { + self::parseShortOption( + substr($arg, 1), + $short_options, + $opts, + $args + ); + } + } + + return [$opts, $non_opts]; + } + + /** + * @throws Exception + */ + private static function parseShortOption(string $arg, string $short_options, array &$opts, array &$args): void + { + $argLen = strlen($arg); + + for ($i = 0; $i < $argLen; $i++) { + $opt = $arg[$i]; + $opt_arg = null; + + if ($arg[$i] === ':' || ($spec = strstr($short_options, $opt)) === false) { + throw new Exception( + "unrecognized option -- {$opt}" + ); + } + + if (strlen($spec) > 1 && $spec[1] === ':') { + if ($i + 1 < $argLen) { + $opts[] = [$opt, substr($arg, $i + 1)]; + + break; + } + + if (!(strlen($spec) > 2 && $spec[2] === ':')) { + /* @noinspection ComparisonOperandsOrderInspection */ + if (false === $opt_arg = current($args)) { + throw new Exception( + "option requires an argument -- {$opt}" + ); + } + + next($args); + } + } + + $opts[] = [$opt, $opt_arg]; + } + } + + /** + * @throws Exception + */ + private static function parseLongOption(string $arg, array $long_options, array &$opts, array &$args): void + { + $count = count($long_options); + $list = explode('=', $arg); + $opt = $list[0]; + $opt_arg = null; + + if (count($list) > 1) { + $opt_arg = $list[1]; + } + + $opt_len = strlen($opt); + + foreach ($long_options as $i => $long_opt) { + $opt_start = substr($long_opt, 0, $opt_len); + + if ($opt_start !== $opt) { + continue; + } + + $opt_rest = substr($long_opt, $opt_len); + + if ($opt_rest !== '' && $i + 1 < $count && $opt[0] !== '=' && strpos($long_options[$i + 1], $opt) === 0) { + throw new Exception( + "option --{$opt} is ambiguous" + ); + } + + if (substr($long_opt, -1) === '=') { + /* @noinspection StrlenInEmptyStringCheckContextInspection */ + if (substr($long_opt, -2) !== '==' && !strlen((string) $opt_arg)) { + /* @noinspection ComparisonOperandsOrderInspection */ + if (false === $opt_arg = current($args)) { + throw new Exception( + "option --{$opt} requires an argument" + ); + } + + next($args); + } + } elseif ($opt_arg) { + throw new Exception( + "option --{$opt} doesn't allow an argument" + ); + } + + $full_option = '--' . preg_replace('/={1,2}$/', '', $long_opt); + $opts[] = [$full_option, $opt_arg]; + + return; + } + + throw new Exception("unrecognized option --{$opt}"); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/GlobalState.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/GlobalState.php new file mode 100644 index 0000000000..0bd52de25e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/GlobalState.php @@ -0,0 +1,194 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use function array_keys; +use function count; +use function defined; +use function get_defined_constants; +use function get_included_files; +use function in_array; +use function ini_get_all; +use function is_array; +use function is_file; +use function is_scalar; +use function preg_match; +use function serialize; +use function sprintf; +use function strpos; +use function var_export; +use Closure; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class GlobalState +{ + /** + * @var string[] + */ + private const SUPER_GLOBAL_ARRAYS = [ + '_ENV', + '_POST', + '_GET', + '_COOKIE', + '_SERVER', + '_FILES', + '_REQUEST', + ]; + + /** + * @throws Exception + */ + public static function getIncludedFilesAsString(): string + { + return self::processIncludedFilesAsString(get_included_files()); + } + + /** + * @param string[] $files + * + * @throws Exception + */ + public static function processIncludedFilesAsString(array $files): string + { + $blacklist = new Blacklist; + $prefix = false; + $result = ''; + + if (defined('__PHPUNIT_PHAR__')) { + $prefix = 'phar://' . __PHPUNIT_PHAR__ . '/'; + } + + for ($i = count($files) - 1; $i > 0; $i--) { + $file = $files[$i]; + + if (!empty($GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST']) && + in_array($file, $GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST'], true)) { + continue; + } + + if ($prefix !== false && strpos($file, $prefix) === 0) { + continue; + } + + // Skip virtual file system protocols + if (preg_match('/^(vfs|phpvfs[a-z0-9]+):/', $file)) { + continue; + } + + if (!$blacklist->isBlacklisted($file) && is_file($file)) { + $result = 'require_once \'' . $file . "';\n" . $result; + } + } + + return $result; + } + + public static function getIniSettingsAsString(): string + { + $result = ''; + + foreach (ini_get_all(null, false) as $key => $value) { + $result .= sprintf( + '@ini_set(%s, %s);' . "\n", + self::exportVariable($key), + self::exportVariable((string) $value) + ); + } + + return $result; + } + + public static function getConstantsAsString(): string + { + $constants = get_defined_constants(true); + $result = ''; + + if (isset($constants['user'])) { + foreach ($constants['user'] as $name => $value) { + $result .= sprintf( + 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", + $name, + $name, + self::exportVariable($value) + ); + } + } + + return $result; + } + + public static function getGlobalsAsString(): string + { + $result = ''; + + foreach (self::SUPER_GLOBAL_ARRAYS as $superGlobalArray) { + if (isset($GLOBALS[$superGlobalArray]) && is_array($GLOBALS[$superGlobalArray])) { + foreach (array_keys($GLOBALS[$superGlobalArray]) as $key) { + if ($GLOBALS[$superGlobalArray][$key] instanceof Closure) { + continue; + } + + $result .= sprintf( + '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n", + $superGlobalArray, + $key, + self::exportVariable($GLOBALS[$superGlobalArray][$key]) + ); + } + } + } + + $blacklist = self::SUPER_GLOBAL_ARRAYS; + $blacklist[] = 'GLOBALS'; + + foreach (array_keys($GLOBALS) as $key) { + if (!$GLOBALS[$key] instanceof Closure && !in_array($key, $blacklist, true)) { + $result .= sprintf( + '$GLOBALS[\'%s\'] = %s;' . "\n", + $key, + self::exportVariable($GLOBALS[$key]) + ); + } + } + + return $result; + } + + private static function exportVariable($variable): string + { + if (is_scalar($variable) || $variable === null || + (is_array($variable) && self::arrayOnlyContainsScalars($variable))) { + return var_export($variable, true); + } + + return 'unserialize(' . var_export(serialize($variable), true) . ')'; + } + + private static function arrayOnlyContainsScalars(array $array): bool + { + $result = true; + + foreach ($array as $element) { + if (is_array($element)) { + $result = self::arrayOnlyContainsScalars($element); + } elseif (!is_scalar($element) && $element !== null) { + $result = false; + } + + if (!$result) { + break; + } + } + + return $result; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php new file mode 100644 index 0000000000..3493d113aa --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/InvalidDataSetException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use RuntimeException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class InvalidDataSetException extends RuntimeException implements \PHPUnit\Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Json.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Json.php new file mode 100644 index 0000000000..752c1fd600 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Json.php @@ -0,0 +1,98 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const JSON_PRETTY_PRINT; +use const JSON_UNESCAPED_SLASHES; +use const JSON_UNESCAPED_UNICODE; +use function count; +use function is_array; +use function is_object; +use function json_decode; +use function json_encode; +use function json_last_error; +use function ksort; +use PHPUnit\Framework\Exception; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Json +{ + /** + * Prettify json string. + * + * @throws \PHPUnit\Framework\Exception + */ + public static function prettify(string $json): string + { + $decodedJson = json_decode($json, false); + + if (json_last_error()) { + throw new Exception( + 'Cannot prettify invalid json' + ); + } + + return json_encode($decodedJson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + } + + /** + * To allow comparison of JSON strings, first process them into a consistent + * format so that they can be compared as strings. + * + * @return array ($error, $canonicalized_json) The $error parameter is used + * to indicate an error decoding the json. This is used to avoid ambiguity + * with JSON strings consisting entirely of 'null' or 'false'. + */ + public static function canonicalize(string $json): array + { + $decodedJson = json_decode($json); + + if (json_last_error()) { + return [true, null]; + } + + self::recursiveSort($decodedJson); + + $reencodedJson = json_encode($decodedJson); + + return [false, $reencodedJson]; + } + + /** + * JSON object keys are unordered while PHP array keys are ordered. + * + * Sort all array keys to ensure both the expected and actual values have + * their keys in the same order. + */ + private static function recursiveSort(&$json): void + { + if (!is_array($json)) { + // If the object is not empty, change it to an associative array + // so we can sort the keys (and we will still re-encode it + // correctly, since PHP encodes associative arrays as JSON objects.) + // But EMPTY objects MUST remain empty objects. (Otherwise we will + // re-encode it as a JSON array rather than a JSON object.) + // See #2919. + if (is_object($json) && count((array) $json) > 0) { + $json = (array) $json; + } else { + return; + } + } + + ksort($json); + + foreach ($json as $key => &$value) { + self::recursiveSort($value); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/JUnit.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/JUnit.php new file mode 100644 index 0000000000..710e2c47da --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/JUnit.php @@ -0,0 +1,432 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\Log; + +use function class_exists; +use function get_class; +use function method_exists; +use function sprintf; +use function str_replace; +use DOMDocument; +use DOMElement; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\ExceptionWrapper; +use PHPUnit\Framework\SelfDescribing; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestFailure; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; +use PHPUnit\Util\Exception; +use PHPUnit\Util\Filter; +use PHPUnit\Util\Printer; +use PHPUnit\Util\Xml; +use ReflectionClass; +use ReflectionException; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class JUnit extends Printer implements TestListener +{ + /** + * @var DOMDocument + */ + private $document; + + /** + * @var DOMElement + */ + private $root; + + /** + * @var bool + */ + private $reportRiskyTests = false; + + /** + * @var DOMElement[] + */ + private $testSuites = []; + + /** + * @var int[] + */ + private $testSuiteTests = [0]; + + /** + * @var int[] + */ + private $testSuiteAssertions = [0]; + + /** + * @var int[] + */ + private $testSuiteErrors = [0]; + + /** + * @var int[] + */ + private $testSuiteWarnings = [0]; + + /** + * @var int[] + */ + private $testSuiteFailures = [0]; + + /** + * @var int[] + */ + private $testSuiteSkipped = [0]; + + /** + * @var int[] + */ + private $testSuiteTimes = [0]; + + /** + * @var int + */ + private $testSuiteLevel = 0; + + /** + * @var DOMElement + */ + private $currentTestCase; + + /** + * @param null|mixed $out + */ + public function __construct($out = null, bool $reportRiskyTests = false) + { + $this->document = new DOMDocument('1.0', 'UTF-8'); + $this->document->formatOutput = true; + + $this->root = $this->document->createElement('testsuites'); + $this->document->appendChild($this->root); + + parent::__construct($out); + + $this->reportRiskyTests = $reportRiskyTests; + } + + /** + * Flush buffer and close output. + */ + public function flush(): void + { + $this->write($this->getXML()); + + parent::flush(); + } + + /** + * An error occurred. + */ + public function addError(Test $test, Throwable $t, float $time): void + { + $this->doAddFault($test, $t, $time, 'error'); + $this->testSuiteErrors[$this->testSuiteLevel]++; + } + + /** + * A warning occurred. + */ + public function addWarning(Test $test, Warning $e, float $time): void + { + $this->doAddFault($test, $e, $time, 'warning'); + $this->testSuiteWarnings[$this->testSuiteLevel]++; + } + + /** + * A failure occurred. + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + $this->doAddFault($test, $e, $time, 'failure'); + $this->testSuiteFailures[$this->testSuiteLevel]++; + } + + /** + * Incomplete test. + */ + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + $this->doAddSkipped(); + } + + /** + * Risky test. + */ + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + if (!$this->reportRiskyTests || $this->currentTestCase === null) { + return; + } + + $error = $this->document->createElement( + 'error', + Xml::prepareString( + "Risky Test\n" . + Filter::getFilteredStacktrace($t) + ) + ); + + $error->setAttribute('type', get_class($t)); + + $this->currentTestCase->appendChild($error); + + $this->testSuiteErrors[$this->testSuiteLevel]++; + } + + /** + * Skipped test. + */ + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + $this->doAddSkipped(); + } + + /** + * A testsuite started. + */ + public function startTestSuite(TestSuite $suite): void + { + $testSuite = $this->document->createElement('testsuite'); + $testSuite->setAttribute('name', $suite->getName()); + + if (class_exists($suite->getName(), false)) { + try { + $class = new ReflectionClass($suite->getName()); + + $testSuite->setAttribute('file', $class->getFileName()); + } catch (ReflectionException $e) { + } + } + + if ($this->testSuiteLevel > 0) { + $this->testSuites[$this->testSuiteLevel]->appendChild($testSuite); + } else { + $this->root->appendChild($testSuite); + } + + $this->testSuiteLevel++; + $this->testSuites[$this->testSuiteLevel] = $testSuite; + $this->testSuiteTests[$this->testSuiteLevel] = 0; + $this->testSuiteAssertions[$this->testSuiteLevel] = 0; + $this->testSuiteErrors[$this->testSuiteLevel] = 0; + $this->testSuiteWarnings[$this->testSuiteLevel] = 0; + $this->testSuiteFailures[$this->testSuiteLevel] = 0; + $this->testSuiteSkipped[$this->testSuiteLevel] = 0; + $this->testSuiteTimes[$this->testSuiteLevel] = 0; + } + + /** + * A testsuite ended. + */ + public function endTestSuite(TestSuite $suite): void + { + $this->testSuites[$this->testSuiteLevel]->setAttribute( + 'tests', + (string) $this->testSuiteTests[$this->testSuiteLevel] + ); + + $this->testSuites[$this->testSuiteLevel]->setAttribute( + 'assertions', + (string) $this->testSuiteAssertions[$this->testSuiteLevel] + ); + + $this->testSuites[$this->testSuiteLevel]->setAttribute( + 'errors', + (string) $this->testSuiteErrors[$this->testSuiteLevel] + ); + + $this->testSuites[$this->testSuiteLevel]->setAttribute( + 'warnings', + (string) $this->testSuiteWarnings[$this->testSuiteLevel] + ); + + $this->testSuites[$this->testSuiteLevel]->setAttribute( + 'failures', + (string) $this->testSuiteFailures[$this->testSuiteLevel] + ); + + $this->testSuites[$this->testSuiteLevel]->setAttribute( + 'skipped', + (string) $this->testSuiteSkipped[$this->testSuiteLevel] + ); + + $this->testSuites[$this->testSuiteLevel]->setAttribute( + 'time', + sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]) + ); + + if ($this->testSuiteLevel > 1) { + $this->testSuiteTests[$this->testSuiteLevel - 1] += $this->testSuiteTests[$this->testSuiteLevel]; + $this->testSuiteAssertions[$this->testSuiteLevel - 1] += $this->testSuiteAssertions[$this->testSuiteLevel]; + $this->testSuiteErrors[$this->testSuiteLevel - 1] += $this->testSuiteErrors[$this->testSuiteLevel]; + $this->testSuiteWarnings[$this->testSuiteLevel - 1] += $this->testSuiteWarnings[$this->testSuiteLevel]; + $this->testSuiteFailures[$this->testSuiteLevel - 1] += $this->testSuiteFailures[$this->testSuiteLevel]; + $this->testSuiteSkipped[$this->testSuiteLevel - 1] += $this->testSuiteSkipped[$this->testSuiteLevel]; + $this->testSuiteTimes[$this->testSuiteLevel - 1] += $this->testSuiteTimes[$this->testSuiteLevel]; + } + + $this->testSuiteLevel--; + } + + /** + * A test started. + */ + public function startTest(Test $test): void + { + $usesDataprovider = false; + + if (method_exists($test, 'usesDataProvider')) { + $usesDataprovider = $test->usesDataProvider(); + } + + $testCase = $this->document->createElement('testcase'); + $testCase->setAttribute('name', $test->getName()); + + try { + $class = new ReflectionClass($test); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $methodName = $test->getName(!$usesDataprovider); + + if ($class->hasMethod($methodName)) { + try { + $method = $class->getMethod($methodName); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $testCase->setAttribute('class', $class->getName()); + $testCase->setAttribute('classname', str_replace('\\', '.', $class->getName())); + $testCase->setAttribute('file', $class->getFileName()); + $testCase->setAttribute('line', (string) $method->getStartLine()); + } + + $this->currentTestCase = $testCase; + } + + /** + * A test ended. + */ + public function endTest(Test $test, float $time): void + { + $numAssertions = 0; + + if (method_exists($test, 'getNumAssertions')) { + $numAssertions = $test->getNumAssertions(); + } + + $this->testSuiteAssertions[$this->testSuiteLevel] += $numAssertions; + + $this->currentTestCase->setAttribute( + 'assertions', + (string) $numAssertions + ); + + $this->currentTestCase->setAttribute( + 'time', + sprintf('%F', $time) + ); + + $this->testSuites[$this->testSuiteLevel]->appendChild( + $this->currentTestCase + ); + + $this->testSuiteTests[$this->testSuiteLevel]++; + $this->testSuiteTimes[$this->testSuiteLevel] += $time; + + $testOutput = ''; + + if (method_exists($test, 'hasOutput') && method_exists($test, 'getActualOutput')) { + $testOutput = $test->hasOutput() ? $test->getActualOutput() : ''; + } + + if (!empty($testOutput)) { + $systemOut = $this->document->createElement( + 'system-out', + Xml::prepareString($testOutput) + ); + + $this->currentTestCase->appendChild($systemOut); + } + + $this->currentTestCase = null; + } + + /** + * Returns the XML as a string. + */ + public function getXML(): string + { + return $this->document->saveXML(); + } + + private function doAddFault(Test $test, Throwable $t, float $time, $type): void + { + if ($this->currentTestCase === null) { + return; + } + + if ($test instanceof SelfDescribing) { + $buffer = $test->toString() . "\n"; + } else { + $buffer = ''; + } + + $buffer .= TestFailure::exceptionToString($t) . "\n" . + Filter::getFilteredStacktrace($t); + + $fault = $this->document->createElement( + $type, + Xml::prepareString($buffer) + ); + + if ($t instanceof ExceptionWrapper) { + $fault->setAttribute('type', $t->getClassName()); + } else { + $fault->setAttribute('type', get_class($t)); + } + + $this->currentTestCase->appendChild($fault); + } + + private function doAddSkipped(): void + { + if ($this->currentTestCase === null) { + return; + } + + $skipped = $this->document->createElement('skipped'); + + $this->currentTestCase->appendChild($skipped); + + $this->testSuiteSkipped[$this->testSuiteLevel]++; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php new file mode 100644 index 0000000000..56c11a78b7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php @@ -0,0 +1,394 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\Log; + +use function class_exists; +use function count; +use function explode; +use function get_class; +use function getmypid; +use function ini_get; +use function is_bool; +use function is_scalar; +use function method_exists; +use function print_r; +use function round; +use function str_replace; +use function stripos; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\ExceptionWrapper; +use PHPUnit\Framework\ExpectationFailedException; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestFailure; +use PHPUnit\Framework\TestResult; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; +use PHPUnit\TextUI\ResultPrinter; +use PHPUnit\Util\Exception; +use PHPUnit\Util\Filter; +use ReflectionClass; +use ReflectionException; +use SebastianBergmann\Comparator\ComparisonFailure; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TeamCity extends ResultPrinter +{ + /** + * @var bool + */ + private $isSummaryTestCountPrinted = false; + + /** + * @var string + */ + private $startedTestName; + + /** + * @var false|int + */ + private $flowId; + + /** + * @throws \SebastianBergmann\Timer\RuntimeException + */ + public function printResult(TestResult $result): void + { + $this->printHeader($result); + $this->printFooter($result); + } + + /** + * An error occurred. + */ + public function addError(Test $test, Throwable $t, float $time): void + { + $this->printEvent( + 'testFailed', + [ + 'name' => $test->getName(), + 'message' => self::getMessage($t), + 'details' => self::getDetails($t), + 'duration' => self::toMilliseconds($time), + ] + ); + } + + /** + * A warning occurred. + */ + public function addWarning(Test $test, Warning $e, float $time): void + { + $this->printEvent( + 'testFailed', + [ + 'name' => $test->getName(), + 'message' => self::getMessage($e), + 'details' => self::getDetails($e), + 'duration' => self::toMilliseconds($time), + ] + ); + } + + /** + * A failure occurred. + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + $parameters = [ + 'name' => $test->getName(), + 'message' => self::getMessage($e), + 'details' => self::getDetails($e), + 'duration' => self::toMilliseconds($time), + ]; + + if ($e instanceof ExpectationFailedException) { + $comparisonFailure = $e->getComparisonFailure(); + + if ($comparisonFailure instanceof ComparisonFailure) { + $expectedString = $comparisonFailure->getExpectedAsString(); + + if ($expectedString === null || empty($expectedString)) { + $expectedString = self::getPrimitiveValueAsString($comparisonFailure->getExpected()); + } + + $actualString = $comparisonFailure->getActualAsString(); + + if ($actualString === null || empty($actualString)) { + $actualString = self::getPrimitiveValueAsString($comparisonFailure->getActual()); + } + + if ($actualString !== null && $expectedString !== null) { + $parameters['type'] = 'comparisonFailure'; + $parameters['actual'] = $actualString; + $parameters['expected'] = $expectedString; + } + } + } + + $this->printEvent('testFailed', $parameters); + } + + /** + * Incomplete test. + */ + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + $this->printIgnoredTest($test->getName(), $t, $time); + } + + /** + * Risky test. + */ + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + $this->addError($test, $t, $time); + } + + /** + * Skipped test. + */ + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + $testName = $test->getName(); + + if ($this->startedTestName !== $testName) { + $this->startTest($test); + $this->printIgnoredTest($testName, $t, $time); + $this->endTest($test, $time); + } else { + $this->printIgnoredTest($testName, $t, $time); + } + } + + public function printIgnoredTest($testName, Throwable $t, float $time): void + { + $this->printEvent( + 'testIgnored', + [ + 'name' => $testName, + 'message' => self::getMessage($t), + 'details' => self::getDetails($t), + 'duration' => self::toMilliseconds($time), + ] + ); + } + + /** + * A testsuite started. + */ + public function startTestSuite(TestSuite $suite): void + { + if (stripos(ini_get('disable_functions'), 'getmypid') === false) { + $this->flowId = getmypid(); + } else { + $this->flowId = false; + } + + if (!$this->isSummaryTestCountPrinted) { + $this->isSummaryTestCountPrinted = true; + + $this->printEvent( + 'testCount', + ['count' => count($suite)] + ); + } + + $suiteName = $suite->getName(); + + if (empty($suiteName)) { + return; + } + + $parameters = ['name' => $suiteName]; + + if (class_exists($suiteName, false)) { + $fileName = self::getFileName($suiteName); + $parameters['locationHint'] = "php_qn://{$fileName}::\\{$suiteName}"; + } else { + $split = explode('::', $suiteName); + + if (count($split) === 2 && class_exists($split[0]) && method_exists($split[0], $split[1])) { + $fileName = self::getFileName($split[0]); + $parameters['locationHint'] = "php_qn://{$fileName}::\\{$suiteName}"; + $parameters['name'] = $split[1]; + } + } + + $this->printEvent('testSuiteStarted', $parameters); + } + + /** + * A testsuite ended. + */ + public function endTestSuite(TestSuite $suite): void + { + $suiteName = $suite->getName(); + + if (empty($suiteName)) { + return; + } + + $parameters = ['name' => $suiteName]; + + if (!class_exists($suiteName, false)) { + $split = explode('::', $suiteName); + + if (count($split) === 2 && class_exists($split[0]) && method_exists($split[0], $split[1])) { + $parameters['name'] = $split[1]; + } + } + + $this->printEvent('testSuiteFinished', $parameters); + } + + /** + * A test started. + */ + public function startTest(Test $test): void + { + $testName = $test->getName(); + $this->startedTestName = $testName; + $params = ['name' => $testName]; + + if ($test instanceof TestCase) { + $className = get_class($test); + $fileName = self::getFileName($className); + $params['locationHint'] = "php_qn://{$fileName}::\\{$className}::{$testName}"; + } + + $this->printEvent('testStarted', $params); + } + + /** + * A test ended. + */ + public function endTest(Test $test, float $time): void + { + parent::endTest($test, $time); + + $this->printEvent( + 'testFinished', + [ + 'name' => $test->getName(), + 'duration' => self::toMilliseconds($time), + ] + ); + } + + protected function writeProgress(string $progress): void + { + } + + private function printEvent(string $eventName, array $params = []): void + { + $this->write("\n##teamcity[{$eventName}"); + + if ($this->flowId) { + $params['flowId'] = $this->flowId; + } + + foreach ($params as $key => $value) { + $escapedValue = self::escapeValue((string) $value); + $this->write(" {$key}='{$escapedValue}'"); + } + + $this->write("]\n"); + } + + private static function getMessage(Throwable $t): string + { + $message = ''; + + if ($t instanceof ExceptionWrapper) { + if ($t->getClassName() !== '') { + $message .= $t->getClassName(); + } + + if ($message !== '' && $t->getMessage() !== '') { + $message .= ' : '; + } + } + + return $message . $t->getMessage(); + } + + private static function getDetails(Throwable $t): string + { + $stackTrace = Filter::getFilteredStacktrace($t); + $previous = $t instanceof ExceptionWrapper ? $t->getPreviousWrapped() : $t->getPrevious(); + + while ($previous) { + $stackTrace .= "\nCaused by\n" . + TestFailure::exceptionToString($previous) . "\n" . + Filter::getFilteredStacktrace($previous); + + $previous = $previous instanceof ExceptionWrapper ? + $previous->getPreviousWrapped() : $previous->getPrevious(); + } + + return ' ' . str_replace("\n", "\n ", $stackTrace); + } + + private static function getPrimitiveValueAsString($value): ?string + { + if ($value === null) { + return 'null'; + } + + if (is_bool($value)) { + return $value ? 'true' : 'false'; + } + + if (is_scalar($value)) { + return print_r($value, true); + } + + return null; + } + + private static function escapeValue(string $text): string + { + return str_replace( + ['|', "'", "\n", "\r", ']', '['], + ['||', "|'", '|n', '|r', '|]', '|['], + $text + ); + } + + /** + * @param string $className + */ + private static function getFileName($className): string + { + try { + return (new ReflectionClass($className))->getFileName(); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } + + /** + * @param float $time microseconds + */ + private static function toMilliseconds(float $time): int + { + return (int) round($time * 1000); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php new file mode 100644 index 0000000000..b5de7144fe --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php @@ -0,0 +1,415 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\PHP; + +use const DIRECTORY_SEPARATOR; +use const PHP_SAPI; +use function array_keys; +use function array_merge; +use function assert; +use function escapeshellarg; +use function ini_get_all; +use function restore_error_handler; +use function set_error_handler; +use function sprintf; +use function str_replace; +use function strpos; +use function strrpos; +use function substr; +use function trim; +use function unserialize; +use __PHP_Incomplete_Class; +use ErrorException; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\SyntheticError; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestFailure; +use PHPUnit\Framework\TestResult; +use SebastianBergmann\Environment\Runtime; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +abstract class AbstractPhpProcess +{ + /** + * @var Runtime + */ + protected $runtime; + + /** + * @var bool + */ + protected $stderrRedirection = false; + + /** + * @var string + */ + protected $stdin = ''; + + /** + * @var string + */ + protected $args = ''; + + /** + * @var array + */ + protected $env = []; + + /** + * @var int + */ + protected $timeout = 0; + + public static function factory(): self + { + if (DIRECTORY_SEPARATOR === '\\') { + return new WindowsPhpProcess; + } + + return new DefaultPhpProcess; + } + + public function __construct() + { + $this->runtime = new Runtime; + } + + /** + * Defines if should use STDERR redirection or not. + * + * Then $stderrRedirection is TRUE, STDERR is redirected to STDOUT. + */ + public function setUseStderrRedirection(bool $stderrRedirection): void + { + $this->stderrRedirection = $stderrRedirection; + } + + /** + * Returns TRUE if uses STDERR redirection or FALSE if not. + */ + public function useStderrRedirection(): bool + { + return $this->stderrRedirection; + } + + /** + * Sets the input string to be sent via STDIN. + */ + public function setStdin(string $stdin): void + { + $this->stdin = $stdin; + } + + /** + * Returns the input string to be sent via STDIN. + */ + public function getStdin(): string + { + return $this->stdin; + } + + /** + * Sets the string of arguments to pass to the php job. + */ + public function setArgs(string $args): void + { + $this->args = $args; + } + + /** + * Returns the string of arguments to pass to the php job. + */ + public function getArgs(): string + { + return $this->args; + } + + /** + * Sets the array of environment variables to start the child process with. + * + * @param array $env + */ + public function setEnv(array $env): void + { + $this->env = $env; + } + + /** + * Returns the array of environment variables to start the child process with. + */ + public function getEnv(): array + { + return $this->env; + } + + /** + * Sets the amount of seconds to wait before timing out. + */ + public function setTimeout(int $timeout): void + { + $this->timeout = $timeout; + } + + /** + * Returns the amount of seconds to wait before timing out. + */ + public function getTimeout(): int + { + return $this->timeout; + } + + /** + * Runs a single test in a separate PHP process. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function runTestJob(string $job, Test $test, TestResult $result): void + { + $result->startTest($test); + + $_result = $this->runJob($job); + + $this->processChildResult( + $test, + $result, + $_result['stdout'], + $_result['stderr'] + ); + } + + /** + * Returns the command based into the configurations. + */ + public function getCommand(array $settings, string $file = null): string + { + $command = $this->runtime->getBinary(); + + if ($this->runtime->hasPCOV()) { + $settings = array_merge( + $settings, + $this->runtime->getCurrentSettings( + array_keys(ini_get_all('pcov')) + ) + ); + } elseif ($this->runtime->hasXdebug()) { + $settings = array_merge( + $settings, + $this->runtime->getCurrentSettings( + array_keys(ini_get_all('xdebug')) + ) + ); + } + + $command .= $this->settingsToParameters($settings); + + if (PHP_SAPI === 'phpdbg') { + $command .= ' -qrr'; + + if (!$file) { + $command .= 's='; + } + } + + if ($file) { + $command .= ' ' . escapeshellarg($file); + } + + if ($this->args) { + if (!$file) { + $command .= ' --'; + } + $command .= ' ' . $this->args; + } + + if ($this->stderrRedirection) { + $command .= ' 2>&1'; + } + + return $command; + } + + /** + * Runs a single job (PHP code) using a separate PHP process. + */ + abstract public function runJob(string $job, array $settings = []): array; + + protected function settingsToParameters(array $settings): string + { + $buffer = ''; + + foreach ($settings as $setting) { + $buffer .= ' -d ' . escapeshellarg($setting); + } + + return $buffer; + } + + /** + * Processes the TestResult object from an isolated process. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function processChildResult(Test $test, TestResult $result, string $stdout, string $stderr): void + { + $time = 0; + + if (!empty($stderr)) { + $result->addError( + $test, + new Exception(trim($stderr)), + $time + ); + } else { + set_error_handler( + /** + * @throws ErrorException + */ + static function ($errno, $errstr, $errfile, $errline): void { + throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); + } + ); + + try { + if (strpos($stdout, "#!/usr/bin/env php\n") === 0) { + $stdout = substr($stdout, 19); + } + + $childResult = unserialize(str_replace("#!/usr/bin/env php\n", '', $stdout)); + restore_error_handler(); + + if ($childResult === false) { + $result->addFailure( + $test, + new AssertionFailedError('Test was run in child process and ended unexpectedly'), + $time + ); + } + } catch (ErrorException $e) { + restore_error_handler(); + $childResult = false; + + $result->addError( + $test, + new Exception(trim($stdout), 0, $e), + $time + ); + } + + if ($childResult !== false) { + if (!empty($childResult['output'])) { + $output = $childResult['output']; + } + + /* @var TestCase $test */ + + $test->setResult($childResult['testResult']); + $test->addToAssertionCount($childResult['numAssertions']); + + $childResult = $childResult['result']; + assert($childResult instanceof TestResult); + + if ($result->getCollectCodeCoverageInformation()) { + $result->getCodeCoverage()->merge( + $childResult->getCodeCoverage() + ); + } + + $time = $childResult->time(); + $notImplemented = $childResult->notImplemented(); + $risky = $childResult->risky(); + $skipped = $childResult->skipped(); + $errors = $childResult->errors(); + $warnings = $childResult->warnings(); + $failures = $childResult->failures(); + + if (!empty($notImplemented)) { + $result->addError( + $test, + $this->getException($notImplemented[0]), + $time + ); + } elseif (!empty($risky)) { + $result->addError( + $test, + $this->getException($risky[0]), + $time + ); + } elseif (!empty($skipped)) { + $result->addError( + $test, + $this->getException($skipped[0]), + $time + ); + } elseif (!empty($errors)) { + $result->addError( + $test, + $this->getException($errors[0]), + $time + ); + } elseif (!empty($warnings)) { + $result->addWarning( + $test, + $this->getException($warnings[0]), + $time + ); + } elseif (!empty($failures)) { + $result->addFailure( + $test, + $this->getException($failures[0]), + $time + ); + } + } + } + + $result->endTest($test, $time); + + if (!empty($output)) { + print $output; + } + } + + /** + * Gets the thrown exception from a PHPUnit\Framework\TestFailure. + * + * @see https://github.com/sebastianbergmann/phpunit/issues/74 + */ + private function getException(TestFailure $error): Exception + { + $exception = $error->thrownException(); + + if ($exception instanceof __PHP_Incomplete_Class) { + $exceptionArray = []; + + foreach ((array) $exception as $key => $value) { + $key = substr($key, strrpos($key, "\0") + 1); + $exceptionArray[$key] = $value; + } + + $exception = new SyntheticError( + sprintf( + '%s: %s', + $exceptionArray['_PHP_Incomplete_Class_Name'], + $exceptionArray['message'] + ), + $exceptionArray['code'], + $exceptionArray['file'], + $exceptionArray['line'], + $exceptionArray['trace'] + ); + } + + return $exception; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php new file mode 100644 index 0000000000..b835043d8e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php @@ -0,0 +1,233 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\PHP; + +use function array_merge; +use function fclose; +use function file_put_contents; +use function fread; +use function fwrite; +use function is_array; +use function is_resource; +use function proc_close; +use function proc_open; +use function proc_terminate; +use function rewind; +use function sprintf; +use function stream_get_contents; +use function stream_select; +use function sys_get_temp_dir; +use function tempnam; +use function unlink; +use PHPUnit\Framework\Exception; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class DefaultPhpProcess extends AbstractPhpProcess +{ + /** + * @var string + */ + protected $tempFile; + + /** + * Runs a single job (PHP code) using a separate PHP process. + * + * @throws Exception + */ + public function runJob(string $job, array $settings = []): array + { + if ($this->stdin || $this->useTemporaryFile()) { + if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) || + file_put_contents($this->tempFile, $job) === false) { + throw new Exception( + 'Unable to write temporary file' + ); + } + + $job = $this->stdin; + } + + return $this->runProcess($job, $settings); + } + + /** + * Returns an array of file handles to be used in place of pipes. + */ + protected function getHandles(): array + { + return []; + } + + /** + * Handles creating the child process and returning the STDOUT and STDERR. + * + * @throws Exception + */ + protected function runProcess(string $job, array $settings): array + { + $handles = $this->getHandles(); + + $env = null; + + if ($this->env) { + $env = $_SERVER ?? []; + unset($env['argv'], $env['argc']); + $env = array_merge($env, $this->env); + + foreach ($env as $envKey => $envVar) { + if (is_array($envVar)) { + unset($env[$envKey]); + } + } + } + + $pipeSpec = [ + 0 => $handles[0] ?? ['pipe', 'r'], + 1 => $handles[1] ?? ['pipe', 'w'], + 2 => $handles[2] ?? ['pipe', 'w'], + ]; + + $process = proc_open( + $this->getCommand($settings, $this->tempFile), + $pipeSpec, + $pipes, + null, + $env + ); + + if (!is_resource($process)) { + throw new Exception( + 'Unable to spawn worker process' + ); + } + + if ($job) { + $this->process($pipes[0], $job); + } + + fclose($pipes[0]); + + $stderr = $stdout = ''; + + if ($this->timeout) { + unset($pipes[0]); + + while (true) { + $r = $pipes; + $w = null; + $e = null; + + $n = @stream_select($r, $w, $e, $this->timeout); + + if ($n === false) { + break; + } + + if ($n === 0) { + proc_terminate($process, 9); + + throw new Exception( + sprintf( + 'Job execution aborted after %d seconds', + $this->timeout + ) + ); + } + + if ($n > 0) { + foreach ($r as $pipe) { + $pipeOffset = 0; + + foreach ($pipes as $i => $origPipe) { + if ($pipe === $origPipe) { + $pipeOffset = $i; + + break; + } + } + + if (!$pipeOffset) { + break; + } + + $line = fread($pipe, 8192); + + if ($line === '' || $line === false) { + fclose($pipes[$pipeOffset]); + + unset($pipes[$pipeOffset]); + } elseif ($pipeOffset === 1) { + $stdout .= $line; + } else { + $stderr .= $line; + } + } + + if (empty($pipes)) { + break; + } + } + } + } else { + if (isset($pipes[1])) { + $stdout = stream_get_contents($pipes[1]); + + fclose($pipes[1]); + } + + if (isset($pipes[2])) { + $stderr = stream_get_contents($pipes[2]); + + fclose($pipes[2]); + } + } + + if (isset($handles[1])) { + rewind($handles[1]); + + $stdout = stream_get_contents($handles[1]); + + fclose($handles[1]); + } + + if (isset($handles[2])) { + rewind($handles[2]); + + $stderr = stream_get_contents($handles[2]); + + fclose($handles[2]); + } + + proc_close($process); + + $this->cleanup(); + + return ['stdout' => $stdout, 'stderr' => $stderr]; + } + + protected function process($pipe, string $job): void + { + fwrite($pipe, $job); + } + + protected function cleanup(): void + { + if ($this->tempFile) { + unlink($this->tempFile); + } + } + + protected function useTemporaryFile(): bool + { + return false; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl new file mode 100644 index 0000000000..14c3e7e6ef --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/PhptTestCase.tpl @@ -0,0 +1,40 @@ +start(__FILE__); +} + +register_shutdown_function(function() use ($coverage) { + $output = null; + if ($coverage) { + $output = $coverage->stop(); + } + file_put_contents('{coverageFile}', serialize($output)); +}); + +ob_end_clean(); + +require '{job}'; diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl new file mode 100644 index 0000000000..5d2ea0252a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl @@ -0,0 +1,108 @@ +setCodeCoverage( + new CodeCoverage( + null, + unserialize('{codeCoverageFilter}') + ) + ); + } + + $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); + $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); + $result->enforceTimeLimit({enforcesTimeLimit}); + $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests}); + $result->beStrictAboutResourceUsageDuringSmallTests({isStrictAboutResourceUsageDuringSmallTests}); + + $test = new {className}('{name}', unserialize('{data}'), '{dataName}'); + $test->setDependencyInput(unserialize('{dependencyInput}')); + $test->setInIsolation(TRUE); + + ob_end_clean(); + $test->run($result); + $output = ''; + if (!$test->hasExpectationOnOutput()) { + $output = $test->getActualOutput(); + } + + ini_set('xdebug.scream', '0'); + @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ + if ($stdout = @stream_get_contents(STDOUT)) { + $output = $stdout . $output; + $streamMetaData = stream_get_meta_data(STDOUT); + if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { + @ftruncate(STDOUT, 0); + @rewind(STDOUT); + } + } + + print serialize( + [ + 'testResult' => $test->getResult(), + 'numAssertions' => $test->getNumAssertions(), + 'result' => $result, + 'output' => $output + ] + ); +} + +$configurationFilePath = '{configurationFilePath}'; + +if ('' !== $configurationFilePath) { + $configuration = PHPUnit\Util\Configuration::getInstance($configurationFilePath); + $configuration->handlePHPConfiguration(); + unset($configuration); +} + +function __phpunit_error_handler($errno, $errstr, $errfile, $errline) +{ + return true; +} + +set_error_handler('__phpunit_error_handler'); + +{constants} +{included_files} +{globals} + +restore_error_handler(); + +if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { + require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; + unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); +} + +__phpunit_run_isolated_test(); diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl new file mode 100644 index 0000000000..9dd6c92034 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl @@ -0,0 +1,111 @@ +setCodeCoverage( + new CodeCoverage( + null, + unserialize('{codeCoverageFilter}') + ) + ); + } + + $result->beStrictAboutTestsThatDoNotTestAnything({isStrictAboutTestsThatDoNotTestAnything}); + $result->beStrictAboutOutputDuringTests({isStrictAboutOutputDuringTests}); + $result->enforceTimeLimit({enforcesTimeLimit}); + $result->beStrictAboutTodoAnnotatedTests({isStrictAboutTodoAnnotatedTests}); + $result->beStrictAboutResourceUsageDuringSmallTests({isStrictAboutResourceUsageDuringSmallTests}); + + $test = new {className}('{methodName}', unserialize('{data}'), '{dataName}'); + \assert($test instanceof TestCase); + + $test->setDependencyInput(unserialize('{dependencyInput}')); + $test->setInIsolation(true); + + ob_end_clean(); + $test->run($result); + $output = ''; + if (!$test->hasExpectationOnOutput()) { + $output = $test->getActualOutput(); + } + + ini_set('xdebug.scream', '0'); + @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ + if ($stdout = @stream_get_contents(STDOUT)) { + $output = $stdout . $output; + $streamMetaData = stream_get_meta_data(STDOUT); + if (!empty($streamMetaData['stream_type']) && 'STDIO' === $streamMetaData['stream_type']) { + @ftruncate(STDOUT, 0); + @rewind(STDOUT); + } + } + + print serialize( + [ + 'testResult' => $test->getResult(), + 'numAssertions' => $test->getNumAssertions(), + 'result' => $result, + 'output' => $output + ] + ); +} + +$configurationFilePath = '{configurationFilePath}'; + +if ('' !== $configurationFilePath) { + $configuration = PHPUnit\Util\Configuration::getInstance($configurationFilePath); + $configuration->handlePHPConfiguration(); + unset($configuration); +} + +function __phpunit_error_handler($errno, $errstr, $errfile, $errline) +{ + return true; +} + +set_error_handler('__phpunit_error_handler'); + +{constants} +{included_files} +{globals} + +restore_error_handler(); + +if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { + require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; + unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); +} + +__phpunit_run_isolated_test(); diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php new file mode 100644 index 0000000000..9ef9255567 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\PHP; + +use const PHP_MAJOR_VERSION; +use function tmpfile; +use PHPUnit\Framework\Exception; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + * + * @see https://bugs.php.net/bug.php?id=51800 + */ +final class WindowsPhpProcess extends DefaultPhpProcess +{ + public function getCommand(array $settings, string $file = null): string + { + if (PHP_MAJOR_VERSION < 8) { + return '"' . parent::getCommand($settings, $file) . '"'; + } + + return parent::getCommand($settings, $file); + } + + /** + * @throws Exception + */ + protected function getHandles(): array + { + if (false === $stdout_handle = tmpfile()) { + throw new Exception( + 'A temporary file could not be created; verify that your TEMP environment variable is writable' + ); + } + + return [ + 1 => $stdout_handle, + ]; + } + + protected function useTemporaryFile(): bool + { + return true; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Printer.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Printer.php new file mode 100644 index 0000000000..c99abfed5b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Printer.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const ENT_SUBSTITUTE; +use const PHP_SAPI; +use function assert; +use function count; +use function dirname; +use function explode; +use function fclose; +use function fflush; +use function flush; +use function fopen; +use function fsockopen; +use function fwrite; +use function htmlspecialchars; +use function is_resource; +use function is_string; +use function sprintf; +use function str_replace; +use function strncmp; +use function strpos; +use PHPUnit\Framework\Exception; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class Printer +{ + /** + * If true, flush output after every write. + * + * @var bool + */ + protected $autoFlush = false; + + /** + * @psalm-var resource|closed-resource + */ + protected $out; + + /** + * @var string + */ + protected $outTarget; + + /** + * Constructor. + * + * @param null|resource|string $out + * + * @throws Exception + */ + public function __construct($out = null) + { + if ($out === null) { + return; + } + + if (is_string($out) === false) { + $this->out = $out; + + return; + } + + if (strpos($out, 'socket://') === 0) { + $out = explode(':', str_replace('socket://', '', $out)); + + if (count($out) !== 2) { + throw new Exception; + } + + $this->out = fsockopen($out[0], $out[1]); + } else { + if (strpos($out, 'php://') === false && !Filesystem::createDirectory(dirname($out))) { + throw new Exception(sprintf('Directory "%s" was not created', dirname($out))); + } + + $this->out = fopen($out, 'wt'); + } + + $this->outTarget = $out; + } + + /** + * Flush buffer and close output if it's not to a PHP stream. + */ + public function flush(): void + { + if ($this->out && strncmp($this->outTarget, 'php://', 6) !== 0) { + assert(is_resource($this->out)); + + fclose($this->out); + } + } + + /** + * Performs a safe, incremental flush. + * + * Do not confuse this function with the flush() function of this class, + * since the flush() function may close the file being written to, rendering + * the current object no longer usable. + */ + public function incrementalFlush(): void + { + if ($this->out) { + assert(is_resource($this->out)); + + fflush($this->out); + } else { + flush(); + } + } + + public function write(string $buffer): void + { + if ($this->out) { + assert(is_resource($this->out)); + + fwrite($this->out, $buffer); + + if ($this->autoFlush) { + $this->incrementalFlush(); + } + } else { + if (PHP_SAPI !== 'cli' && PHP_SAPI !== 'phpdbg') { + $buffer = htmlspecialchars($buffer, ENT_SUBSTITUTE); + } + + print $buffer; + + if ($this->autoFlush) { + $this->incrementalFlush(); + } + } + } + + /** + * Check auto-flush mode. + */ + public function getAutoFlush(): bool + { + return $this->autoFlush; + } + + /** + * Set auto-flushing mode. + * + * If set, *incremental* flushes will be done after each write. This should + * not be confused with the different effects of this class' flush() method. + */ + public function setAutoFlush(bool $autoFlush): void + { + $this->autoFlush = $autoFlush; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/RegularExpression.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/RegularExpression.php new file mode 100644 index 0000000000..167b9215c2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/RegularExpression.php @@ -0,0 +1,30 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use function preg_match; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class RegularExpression +{ + /** + * @return false|int + */ + public static function safeMatch(string $pattern, string $subject) + { + return ErrorHandler::invokeIgnoringWarnings( + static function () use ($pattern, $subject) { + return preg_match($pattern, $subject); + } + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Test.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Test.php new file mode 100644 index 0000000000..4d0e79db04 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Test.php @@ -0,0 +1,934 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const PHP_OS; +use const PHP_VERSION; +use function addcslashes; +use function array_flip; +use function array_key_exists; +use function array_keys; +use function array_merge; +use function array_unique; +use function array_unshift; +use function class_exists; +use function class_implements; +use function class_parents; +use function count; +use function explode; +use function extension_loaded; +use function function_exists; +use function get_class; +use function ini_get; +use function interface_exists; +use function is_array; +use function is_int; +use function method_exists; +use function phpversion; +use function preg_match; +use function preg_replace; +use function range; +use function sprintf; +use function str_replace; +use function strncmp; +use function strpos; +use function trait_exists; +use function version_compare; +use PHPUnit\Framework\Assert; +use PHPUnit\Framework\CodeCoverageException; +use PHPUnit\Framework\InvalidCoversTargetException; +use PHPUnit\Framework\SelfDescribing; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\Warning; +use PHPUnit\Runner\Version; +use PHPUnit\Util\Annotation\Registry; +use ReflectionClass; +use ReflectionException; +use ReflectionFunction; +use ReflectionMethod; +use SebastianBergmann\Environment\OperatingSystem; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Test +{ + /** + * @var int + */ + public const UNKNOWN = -1; + + /** + * @var int + */ + public const SMALL = 0; + + /** + * @var int + */ + public const MEDIUM = 1; + + /** + * @var int + */ + public const LARGE = 2; + + /** + * @var array + */ + private static $hookMethods = []; + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public static function describe(\PHPUnit\Framework\Test $test): array + { + if ($test instanceof TestCase) { + return [get_class($test), $test->getName()]; + } + + if ($test instanceof SelfDescribing) { + return ['', $test->toString()]; + } + + return ['', get_class($test)]; + } + + public static function describeAsString(\PHPUnit\Framework\Test $test): string + { + if ($test instanceof SelfDescribing) { + return $test->toString(); + } + + return get_class($test); + } + + /** + * @throws CodeCoverageException + * + * @return array|bool + * @psalm-param class-string $className + */ + public static function getLinesToBeCovered(string $className, string $methodName) + { + $annotations = self::parseTestMethodAnnotations( + $className, + $methodName + ); + + if (!self::shouldCoversAnnotationBeUsed($annotations)) { + return false; + } + + return self::getLinesToBeCoveredOrUsed($className, $methodName, 'covers'); + } + + /** + * Returns lines of code specified with the @uses annotation. + * + * @throws CodeCoverageException + * @psalm-param class-string $className + */ + public static function getLinesToBeUsed(string $className, string $methodName): array + { + return self::getLinesToBeCoveredOrUsed($className, $methodName, 'uses'); + } + + public static function requiresCodeCoverageDataCollection(TestCase $test): bool + { + $annotations = $test->getAnnotations(); + + // If there is no @covers annotation but a @coversNothing annotation on + // the test method then code coverage data does not need to be collected + if (isset($annotations['method']['coversNothing'])) { + return false; + } + + // If there is at least one @covers annotation then + // code coverage data needs to be collected + if (isset($annotations['method']['covers'])) { + return true; + } + + // If there is no @covers annotation but a @coversNothing annotation + // then code coverage data does not need to be collected + if (isset($annotations['class']['coversNothing'])) { + return false; + } + + // If there is no @coversNothing annotation then + // code coverage data may be collected + return true; + } + + /** + * @throws Exception + * @psalm-param class-string $className + */ + public static function getRequirements(string $className, string $methodName): array + { + return self::mergeArraysRecursively( + Registry::getInstance()->forClassName($className)->requirements(), + Registry::getInstance()->forMethod($className, $methodName)->requirements() + ); + } + + /** + * Returns the missing requirements for a test. + * + * @throws Exception + * @throws Warning + * @psalm-param class-string $className + */ + public static function getMissingRequirements(string $className, string $methodName): array + { + $required = self::getRequirements($className, $methodName); + $missing = []; + $hint = null; + + if (!empty($required['PHP'])) { + $operator = new VersionComparisonOperator(empty($required['PHP']['operator']) ? '>=' : $required['PHP']['operator']); + + if (!version_compare(PHP_VERSION, $required['PHP']['version'], $operator->asString())) { + $missing[] = sprintf('PHP %s %s is required.', $operator->asString(), $required['PHP']['version']); + $hint = 'PHP'; + } + } elseif (!empty($required['PHP_constraint'])) { + $version = new \PharIo\Version\Version(self::sanitizeVersionNumber(PHP_VERSION)); + + if (!$required['PHP_constraint']['constraint']->complies($version)) { + $missing[] = sprintf( + 'PHP version does not match the required constraint %s.', + $required['PHP_constraint']['constraint']->asString() + ); + + $hint = 'PHP_constraint'; + } + } + + if (!empty($required['PHPUnit'])) { + $phpunitVersion = Version::id(); + + $operator = new VersionComparisonOperator(empty($required['PHPUnit']['operator']) ? '>=' : $required['PHPUnit']['operator']); + + if (!version_compare($phpunitVersion, $required['PHPUnit']['version'], $operator->asString())) { + $missing[] = sprintf('PHPUnit %s %s is required.', $operator->asString(), $required['PHPUnit']['version']); + $hint = $hint ?? 'PHPUnit'; + } + } elseif (!empty($required['PHPUnit_constraint'])) { + $phpunitVersion = new \PharIo\Version\Version(self::sanitizeVersionNumber(Version::id())); + + if (!$required['PHPUnit_constraint']['constraint']->complies($phpunitVersion)) { + $missing[] = sprintf( + 'PHPUnit version does not match the required constraint %s.', + $required['PHPUnit_constraint']['constraint']->asString() + ); + + $hint = $hint ?? 'PHPUnit_constraint'; + } + } + + if (!empty($required['OSFAMILY']) && $required['OSFAMILY'] !== (new OperatingSystem)->getFamily()) { + $missing[] = sprintf('Operating system %s is required.', $required['OSFAMILY']); + $hint = $hint ?? 'OSFAMILY'; + } + + if (!empty($required['OS'])) { + $requiredOsPattern = sprintf('/%s/i', addcslashes($required['OS'], '/')); + + if (!preg_match($requiredOsPattern, PHP_OS)) { + $missing[] = sprintf('Operating system matching %s is required.', $requiredOsPattern); + $hint = $hint ?? 'OS'; + } + } + + if (!empty($required['functions'])) { + foreach ($required['functions'] as $function) { + $pieces = explode('::', $function); + + if (count($pieces) === 2 && class_exists($pieces[0]) && method_exists($pieces[0], $pieces[1])) { + continue; + } + + if (function_exists($function)) { + continue; + } + + $missing[] = sprintf('Function %s is required.', $function); + $hint = $hint ?? 'function_' . $function; + } + } + + if (!empty($required['setting'])) { + foreach ($required['setting'] as $setting => $value) { + if (ini_get($setting) !== $value) { + $missing[] = sprintf('Setting "%s" must be "%s".', $setting, $value); + $hint = $hint ?? '__SETTING_' . $setting; + } + } + } + + if (!empty($required['extensions'])) { + foreach ($required['extensions'] as $extension) { + if (isset($required['extension_versions'][$extension])) { + continue; + } + + if (!extension_loaded($extension)) { + $missing[] = sprintf('Extension %s is required.', $extension); + $hint = $hint ?? 'extension_' . $extension; + } + } + } + + if (!empty($required['extension_versions'])) { + foreach ($required['extension_versions'] as $extension => $req) { + $actualVersion = phpversion($extension); + + $operator = new VersionComparisonOperator(empty($req['operator']) ? '>=' : $req['operator']); + + if ($actualVersion === false || !version_compare($actualVersion, $req['version'], $operator->asString())) { + $missing[] = sprintf('Extension %s %s %s is required.', $extension, $operator->asString(), $req['version']); + $hint = $hint ?? 'extension_' . $extension; + } + } + } + + if ($hint && isset($required['__OFFSET'])) { + array_unshift($missing, '__OFFSET_FILE=' . $required['__OFFSET']['__FILE']); + array_unshift($missing, '__OFFSET_LINE=' . ($required['__OFFSET'][$hint] ?? 1)); + } + + return $missing; + } + + /** + * Returns the expected exception for a test. + * + * @return array|false + * + * @deprecated + * @codeCoverageIgnore + * @psalm-param class-string $className + */ + public static function getExpectedException(string $className, string $methodName) + { + return Registry::getInstance()->forMethod($className, $methodName)->expectedException(); + } + + /** + * Returns the provided data for a method. + * + * @throws Exception + * @psalm-param class-string $className + */ + public static function getProvidedData(string $className, string $methodName): ?array + { + return Registry::getInstance()->forMethod($className, $methodName)->getProvidedData(); + } + + /** + * @psalm-param class-string $className + */ + public static function parseTestMethodAnnotations(string $className, ?string $methodName = ''): array + { + $registry = Registry::getInstance(); + + if ($methodName !== null) { + try { + return [ + 'method' => $registry->forMethod($className, $methodName)->symbolAnnotations(), + 'class' => $registry->forClassName($className)->symbolAnnotations(), + ]; + } catch (Exception $methodNotFound) { + // ignored + } + } + + return [ + 'method' => null, + 'class' => $registry->forClassName($className)->symbolAnnotations(), + ]; + } + + /** + * @psalm-param class-string $className + */ + public static function getInlineAnnotations(string $className, string $methodName): array + { + return Registry::getInstance()->forMethod($className, $methodName)->getInlineAnnotations(); + } + + /** @psalm-param class-string $className */ + public static function getBackupSettings(string $className, string $methodName): array + { + return [ + 'backupGlobals' => self::getBooleanAnnotationSetting( + $className, + $methodName, + 'backupGlobals' + ), + 'backupStaticAttributes' => self::getBooleanAnnotationSetting( + $className, + $methodName, + 'backupStaticAttributes' + ), + ]; + } + + /** @psalm-param class-string $className */ + public static function getDependencies(string $className, string $methodName): array + { + $annotations = self::parseTestMethodAnnotations( + $className, + $methodName + ); + + $dependencies = $annotations['class']['depends'] ?? []; + + if (isset($annotations['method']['depends'])) { + $dependencies = array_merge( + $dependencies, + $annotations['method']['depends'] + ); + } + + return array_unique($dependencies); + } + + /** @psalm-param class-string $className */ + public static function getGroups(string $className, ?string $methodName = ''): array + { + $annotations = self::parseTestMethodAnnotations( + $className, + $methodName + ); + + $groups = []; + + if (isset($annotations['method']['author'])) { + $groups[] = $annotations['method']['author']; + } elseif (isset($annotations['class']['author'])) { + $groups[] = $annotations['class']['author']; + } + + if (isset($annotations['class']['group'])) { + $groups[] = $annotations['class']['group']; + } + + if (isset($annotations['method']['group'])) { + $groups[] = $annotations['method']['group']; + } + + if (isset($annotations['class']['ticket'])) { + $groups[] = $annotations['class']['ticket']; + } + + if (isset($annotations['method']['ticket'])) { + $groups[] = $annotations['method']['ticket']; + } + + foreach (['method', 'class'] as $element) { + foreach (['small', 'medium', 'large'] as $size) { + if (isset($annotations[$element][$size])) { + $groups[] = [$size]; + + break 2; + } + } + } + + return array_unique(array_merge([], ...$groups)); + } + + /** @psalm-param class-string $className */ + public static function getSize(string $className, ?string $methodName): int + { + $groups = array_flip(self::getGroups($className, $methodName)); + + if (isset($groups['large'])) { + return self::LARGE; + } + + if (isset($groups['medium'])) { + return self::MEDIUM; + } + + if (isset($groups['small'])) { + return self::SMALL; + } + + return self::UNKNOWN; + } + + /** @psalm-param class-string $className */ + public static function getProcessIsolationSettings(string $className, string $methodName): bool + { + $annotations = self::parseTestMethodAnnotations( + $className, + $methodName + ); + + return isset($annotations['class']['runTestsInSeparateProcesses']) || isset($annotations['method']['runInSeparateProcess']); + } + + /** @psalm-param class-string $className */ + public static function getClassProcessIsolationSettings(string $className, string $methodName): bool + { + $annotations = self::parseTestMethodAnnotations( + $className, + $methodName + ); + + return isset($annotations['class']['runClassInSeparateProcess']); + } + + /** @psalm-param class-string $className */ + public static function getPreserveGlobalStateSettings(string $className, string $methodName): ?bool + { + return self::getBooleanAnnotationSetting( + $className, + $methodName, + 'preserveGlobalState' + ); + } + + /** @psalm-param class-string $className */ + public static function getHookMethods(string $className): array + { + if (!class_exists($className, false)) { + return self::emptyHookMethodsArray(); + } + + if (!isset(self::$hookMethods[$className])) { + self::$hookMethods[$className] = self::emptyHookMethodsArray(); + + try { + foreach ((new ReflectionClass($className))->getMethods() as $method) { + if ($method->getDeclaringClass()->getName() === Assert::class) { + continue; + } + + if ($method->getDeclaringClass()->getName() === TestCase::class) { + continue; + } + + $docBlock = Registry::getInstance()->forMethod($className, $method->getName()); + + if ($method->isStatic()) { + if ($docBlock->isHookToBeExecutedBeforeClass()) { + array_unshift( + self::$hookMethods[$className]['beforeClass'], + $method->getName() + ); + } + + if ($docBlock->isHookToBeExecutedAfterClass()) { + self::$hookMethods[$className]['afterClass'][] = $method->getName(); + } + } + + if ($docBlock->isToBeExecutedBeforeTest()) { + array_unshift( + self::$hookMethods[$className]['before'], + $method->getName() + ); + } + + if ($docBlock->isToBeExecutedAfterTest()) { + self::$hookMethods[$className]['after'][] = $method->getName(); + } + } + } catch (ReflectionException $e) { + } + } + + return self::$hookMethods[$className]; + } + + public static function isTestMethod(ReflectionMethod $method): bool + { + if (!$method->isPublic()) { + return false; + } + + if (strpos($method->getName(), 'test') === 0) { + return true; + } + + return array_key_exists( + 'test', + Registry::getInstance()->forMethod( + $method->getDeclaringClass()->getName(), + $method->getName() + ) + ->symbolAnnotations() + ); + } + + /** + * @throws CodeCoverageException + * @psalm-param class-string $className + */ + private static function getLinesToBeCoveredOrUsed(string $className, string $methodName, string $mode): array + { + $annotations = self::parseTestMethodAnnotations( + $className, + $methodName + ); + + $classShortcut = null; + + if (!empty($annotations['class'][$mode . 'DefaultClass'])) { + if (count($annotations['class'][$mode . 'DefaultClass']) > 1) { + throw new CodeCoverageException( + sprintf( + 'More than one @%sClass annotation in class or interface "%s".', + $mode, + $className + ) + ); + } + + $classShortcut = $annotations['class'][$mode . 'DefaultClass'][0]; + } + + $list = $annotations['class'][$mode] ?? []; + + if (isset($annotations['method'][$mode])) { + $list = array_merge($list, $annotations['method'][$mode]); + } + + $codeList = []; + + foreach (array_unique($list) as $element) { + if ($classShortcut && strncmp($element, '::', 2) === 0) { + $element = $classShortcut . $element; + } + + $element = preg_replace('/[\s()]+$/', '', $element); + $element = explode(' ', $element); + $element = $element[0]; + + if ($mode === 'covers' && interface_exists($element)) { + throw new InvalidCoversTargetException( + sprintf( + 'Trying to @cover interface "%s".', + $element + ) + ); + } + + $codeList[] = self::resolveElementToReflectionObjects($element); + } + + return self::resolveReflectionObjectsToLines(array_merge([], ...$codeList)); + } + + private static function emptyHookMethodsArray(): array + { + return [ + 'beforeClass' => ['setUpBeforeClass'], + 'before' => ['setUp'], + 'after' => ['tearDown'], + 'afterClass' => ['tearDownAfterClass'], + ]; + } + + /** @psalm-param class-string $className */ + private static function getBooleanAnnotationSetting(string $className, ?string $methodName, string $settingName): ?bool + { + $annotations = self::parseTestMethodAnnotations( + $className, + $methodName + ); + + if (isset($annotations['method'][$settingName])) { + if ($annotations['method'][$settingName][0] === 'enabled') { + return true; + } + + if ($annotations['method'][$settingName][0] === 'disabled') { + return false; + } + } + + if (isset($annotations['class'][$settingName])) { + if ($annotations['class'][$settingName][0] === 'enabled') { + return true; + } + + if ($annotations['class'][$settingName][0] === 'disabled') { + return false; + } + } + + return null; + } + + /** + * @throws InvalidCoversTargetException + */ + private static function resolveElementToReflectionObjects(string $element): array + { + $codeToCoverList = []; + + if (function_exists($element) && strpos($element, '\\') !== false) { + try { + $codeToCoverList[] = new ReflectionFunction($element); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } elseif (strpos($element, '::') !== false) { + [$className, $methodName] = explode('::', $element); + + if (isset($methodName[0]) && $methodName[0] === '<') { + $classes = [$className]; + + foreach ($classes as $className) { + if (!class_exists($className) && + !interface_exists($className) && + !trait_exists($className)) { + throw new InvalidCoversTargetException( + sprintf( + 'Trying to @cover or @use not existing class or ' . + 'interface "%s".', + $className + ) + ); + } + + try { + $methods = (new ReflectionClass($className))->getMethods(); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $inverse = isset($methodName[1]) && $methodName[1] === '!'; + $visibility = 'isPublic'; + + if (strpos($methodName, 'protected')) { + $visibility = 'isProtected'; + } elseif (strpos($methodName, 'private')) { + $visibility = 'isPrivate'; + } + + foreach ($methods as $method) { + if ($inverse && !$method->{$visibility}()) { + $codeToCoverList[] = $method; + } elseif (!$inverse && $method->{$visibility}()) { + $codeToCoverList[] = $method; + } + } + } + } else { + $classes = [$className]; + + foreach ($classes as $className) { + if ($className === '' && function_exists($methodName)) { + try { + $codeToCoverList[] = new ReflectionFunction( + $methodName + ); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } else { + if (!((class_exists($className) || interface_exists($className) || trait_exists($className)) && + method_exists($className, $methodName))) { + throw new InvalidCoversTargetException( + sprintf( + 'Trying to @cover or @use not existing method "%s::%s".', + $className, + $methodName + ) + ); + } + + try { + $codeToCoverList[] = new ReflectionMethod( + $className, + $methodName + ); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } + } + } + } else { + $extended = false; + + if (strpos($element, '') !== false) { + $element = str_replace('', '', $element); + $extended = true; + } + + $classes = [$element]; + + if ($extended) { + $classes = array_merge( + $classes, + class_implements($element), + class_parents($element) + ); + } + + foreach ($classes as $className) { + if (!class_exists($className) && + !interface_exists($className) && + !trait_exists($className)) { + throw new InvalidCoversTargetException( + sprintf( + 'Trying to @cover or @use not existing class or ' . + 'interface "%s".', + $className + ) + ); + } + + try { + $codeToCoverList[] = new ReflectionClass($className); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } + } + + return $codeToCoverList; + } + + private static function resolveReflectionObjectsToLines(array $reflectors): array + { + $result = []; + + foreach ($reflectors as $reflector) { + if ($reflector instanceof ReflectionClass) { + foreach ($reflector->getTraits() as $trait) { + $reflectors[] = $trait; + } + } + } + + foreach ($reflectors as $reflector) { + $filename = $reflector->getFileName(); + + if (!isset($result[$filename])) { + $result[$filename] = []; + } + + $result[$filename] = array_merge( + $result[$filename], + range($reflector->getStartLine(), $reflector->getEndLine()) + ); + } + + foreach ($result as $filename => $lineNumbers) { + $result[$filename] = array_keys(array_flip($lineNumbers)); + } + + return $result; + } + + /** + * Trims any extensions from version string that follows after + * the .[.] format. + */ + private static function sanitizeVersionNumber(string $version) + { + return preg_replace( + '/^(\d+\.\d+(?:.\d+)?).*$/', + '$1', + $version + ); + } + + private static function shouldCoversAnnotationBeUsed(array $annotations): bool + { + if (isset($annotations['method']['coversNothing'])) { + return false; + } + + if (isset($annotations['method']['covers'])) { + return true; + } + + if (isset($annotations['class']['coversNothing'])) { + return false; + } + + return true; + } + + /** + * Merge two arrays together. + * + * If an integer key exists in both arrays and preserveNumericKeys is false, the value + * from the second array will be appended to the first array. If both values are arrays, they + * are merged together, else the value of the second array overwrites the one of the first array. + * + * This implementation is copied from https://github.com/zendframework/zend-stdlib/blob/76b653c5e99b40eccf5966e3122c90615134ae46/src/ArrayUtils.php + * + * Zend Framework (http://framework.zend.com/) + * + * @see http://github.com/zendframework/zf2 for the canonical source repository + * + * @copyright Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com) + * @license http://framework.zend.com/license/new-bsd New BSD License + */ + private static function mergeArraysRecursively(array $a, array $b): array + { + foreach ($b as $key => $value) { + if (array_key_exists($key, $a)) { + if (is_int($key)) { + $a[] = $value; + } elseif (is_array($value) && is_array($a[$key])) { + $a[$key] = self::mergeArraysRecursively($a[$key], $value); + } else { + $a[$key] = $value; + } + } else { + $a[$key] = $value; + } + } + + return $a; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php new file mode 100644 index 0000000000..49badb8be1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php @@ -0,0 +1,365 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\TestDox; + +use const PHP_EOL; +use function array_map; +use function ceil; +use function count; +use function explode; +use function get_class; +use function implode; +use function preg_match; +use function sprintf; +use function strlen; +use function strpos; +use function trim; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestResult; +use PHPUnit\Runner\BaseTestRunner; +use PHPUnit\Runner\PhptTestCase; +use PHPUnit\Util\Color; +use SebastianBergmann\Timer\Timer; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class CliTestDoxPrinter extends TestDoxPrinter +{ + /** + * The default Testdox left margin for messages is a vertical line. + */ + private const PREFIX_SIMPLE = [ + 'default' => '│', + 'start' => '│', + 'message' => '│', + 'diff' => '│', + 'trace' => '│', + 'last' => '│', + ]; + + /** + * Colored Testdox use box-drawing for a more textured map of the message. + */ + private const PREFIX_DECORATED = [ + 'default' => '│', + 'start' => '┐', + 'message' => '├', + 'diff' => '┊', + 'trace' => '╵', + 'last' => '┴', + ]; + + private const SPINNER_ICONS = [ + " \e[36m◐\e[0m running tests", + " \e[36m◓\e[0m running tests", + " \e[36m◑\e[0m running tests", + " \e[36m◒\e[0m running tests", + ]; + + private const STATUS_STYLES = [ + BaseTestRunner::STATUS_PASSED => [ + 'symbol' => '✔', + 'color' => 'fg-green', + ], + BaseTestRunner::STATUS_ERROR => [ + 'symbol' => '✘', + 'color' => 'fg-yellow', + 'message' => 'bg-yellow,fg-black', + ], + BaseTestRunner::STATUS_FAILURE => [ + 'symbol' => '✘', + 'color' => 'fg-red', + 'message' => 'bg-red,fg-white', + ], + BaseTestRunner::STATUS_SKIPPED => [ + 'symbol' => '↩', + 'color' => 'fg-cyan', + 'message' => 'fg-cyan', + ], + BaseTestRunner::STATUS_RISKY => [ + 'symbol' => '☢', + 'color' => 'fg-yellow', + 'message' => 'fg-yellow', + ], + BaseTestRunner::STATUS_INCOMPLETE => [ + 'symbol' => '∅', + 'color' => 'fg-yellow', + 'message' => 'fg-yellow', + ], + BaseTestRunner::STATUS_WARNING => [ + 'symbol' => '⚠', + 'color' => 'fg-yellow', + 'message' => 'fg-yellow', + ], + BaseTestRunner::STATUS_UNKNOWN => [ + 'symbol' => '?', + 'color' => 'fg-blue', + 'message' => 'fg-white,bg-blue', + ], + ]; + + /** + * @var int[] + */ + private $nonSuccessfulTestResults = []; + + /** + * @throws \SebastianBergmann\Timer\RuntimeException + */ + public function printResult(TestResult $result): void + { + $this->printHeader($result); + + $this->printNonSuccessfulTestsSummary($result->count()); + + $this->printFooter($result); + } + + /** + * @throws \SebastianBergmann\Timer\RuntimeException + */ + protected function printHeader(TestResult $result): void + { + $this->write("\n" . Timer::resourceUsage() . "\n\n"); + } + + protected function formatClassName(Test $test): string + { + if ($test instanceof TestCase) { + return $this->prettifier->prettifyTestClass(get_class($test)); + } + + return get_class($test); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function registerTestResult(Test $test, ?Throwable $t, int $status, float $time, bool $verbose): void + { + if ($status !== BaseTestRunner::STATUS_PASSED) { + $this->nonSuccessfulTestResults[] = $this->testIndex; + } + + parent::registerTestResult($test, $t, $status, $time, $verbose); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function formatTestName(Test $test): string + { + if ($test instanceof TestCase) { + return $this->prettifier->prettifyTestCase($test); + } + + return parent::formatTestName($test); + } + + protected function writeTestResult(array $prevResult, array $result): void + { + // spacer line for new suite headers and after verbose messages + if ($prevResult['testName'] !== '' && + (!empty($prevResult['message']) || $prevResult['className'] !== $result['className'])) { + $this->write(PHP_EOL); + } + + // suite header + if ($prevResult['className'] !== $result['className']) { + $this->write($this->colorizeTextBox('underlined', $result['className']) . PHP_EOL); + } + + // test result line + if ($this->colors && $result['className'] === PhptTestCase::class) { + $testName = Color::colorizePath($result['testName'], $prevResult['testName'], true); + } else { + $testName = $result['testMethod']; + } + + $style = self::STATUS_STYLES[$result['status']]; + $line = sprintf( + ' %s %s%s' . PHP_EOL, + $this->colorizeTextBox($style['color'], $style['symbol']), + $testName, + $this->verbose ? ' ' . $this->formatRuntime($result['time'], $style['color']) : '' + ); + + $this->write($line); + + // additional information when verbose + $this->write($result['message']); + } + + protected function formatThrowable(Throwable $t, ?int $status = null): string + { + return trim(\PHPUnit\Framework\TestFailure::exceptionToString($t)); + } + + protected function colorizeMessageAndDiff(string $style, string $buffer): array + { + $lines = $buffer ? array_map('\rtrim', explode(PHP_EOL, $buffer)) : []; + $message = []; + $diff = []; + $insideDiff = false; + + foreach ($lines as $line) { + if ($line === '--- Expected') { + $insideDiff = true; + } + + if (!$insideDiff) { + $message[] = $line; + } else { + if (strpos($line, '-') === 0) { + $line = Color::colorize('fg-red', Color::visualizeWhitespace($line, true)); + } elseif (strpos($line, '+') === 0) { + $line = Color::colorize('fg-green', Color::visualizeWhitespace($line, true)); + } elseif ($line === '@@ @@') { + $line = Color::colorize('fg-cyan', $line); + } + $diff[] = $line; + } + } + $diff = implode(PHP_EOL, $diff); + + if (!empty($message)) { + $message = $this->colorizeTextBox($style, implode(PHP_EOL, $message)); + } + + return [$message, $diff]; + } + + protected function formatStacktrace(Throwable $t): string + { + $trace = \PHPUnit\Util\Filter::getFilteredStacktrace($t); + + if (!$this->colors) { + return $trace; + } + + $lines = []; + $prevPath = ''; + + foreach (explode(PHP_EOL, $trace) as $line) { + if (preg_match('/^(.*):(\d+)$/', $line, $matches)) { + $lines[] = Color::colorizePath($matches[1], $prevPath) . + Color::dim(':') . + Color::colorize('fg-blue', $matches[2]) . + "\n"; + $prevPath = $matches[1]; + } else { + $lines[] = $line; + $prevPath = ''; + } + } + + return implode('', $lines); + } + + protected function formatTestResultMessage(Throwable $t, array $result, ?string $prefix = null): string + { + $message = $this->formatThrowable($t, $result['status']); + $diff = ''; + + if (!($this->verbose || $result['verbose'])) { + return ''; + } + + if ($message && $this->colors) { + $style = self::STATUS_STYLES[$result['status']]['message'] ?? ''; + [$message, $diff] = $this->colorizeMessageAndDiff($style, $message); + } + + if ($prefix === null || !$this->colors) { + $prefix = self::PREFIX_SIMPLE; + } + + if ($this->colors) { + $color = self::STATUS_STYLES[$result['status']]['color'] ?? ''; + $prefix = array_map(static function ($p) use ($color) { + return Color::colorize($color, $p); + }, self::PREFIX_DECORATED); + } + + $trace = $this->formatStacktrace($t); + $out = $this->prefixLines($prefix['start'], PHP_EOL) . PHP_EOL; + + if ($message) { + $out .= $this->prefixLines($prefix['message'], $message . PHP_EOL) . PHP_EOL; + } + + if ($diff) { + $out .= $this->prefixLines($prefix['diff'], $diff . PHP_EOL) . PHP_EOL; + } + + if ($trace) { + if ($message || $diff) { + $out .= $this->prefixLines($prefix['default'], PHP_EOL) . PHP_EOL; + } + $out .= $this->prefixLines($prefix['trace'], $trace . PHP_EOL) . PHP_EOL; + } + $out .= $this->prefixLines($prefix['last'], PHP_EOL) . PHP_EOL; + + return $out; + } + + protected function drawSpinner(): void + { + if ($this->colors) { + $id = $this->spinState % count(self::SPINNER_ICONS); + $this->write(self::SPINNER_ICONS[$id]); + } + } + + protected function undrawSpinner(): void + { + if ($this->colors) { + $id = $this->spinState % count(self::SPINNER_ICONS); + $this->write("\e[1K\e[" . strlen(self::SPINNER_ICONS[$id]) . 'D'); + } + } + + private function formatRuntime(float $time, string $color = ''): string + { + if (!$this->colors) { + return sprintf('[%.2f ms]', $time * 1000); + } + + if ($time > 1) { + $color = 'fg-magenta'; + } + + return Color::colorize($color, ' ' . (int) ceil($time * 1000) . ' ' . Color::dim('ms')); + } + + private function printNonSuccessfulTestsSummary(int $numberOfExecutedTests): void + { + if (empty($this->nonSuccessfulTestResults)) { + return; + } + + if ((count($this->nonSuccessfulTestResults) / $numberOfExecutedTests) >= 0.7) { + return; + } + + $this->write("Summary of non-successful tests:\n\n"); + + $prevResult = $this->getEmptyTestResult(); + + foreach ($this->nonSuccessfulTestResults as $testIndex) { + $result = $this->testResults[$testIndex]; + $this->writeTestResult($prevResult, $result); + $prevResult = $result; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php new file mode 100644 index 0000000000..c57480327a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php @@ -0,0 +1,133 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\TestDox; + +use function sprintf; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class HtmlResultPrinter extends ResultPrinter +{ + /** + * @var string + */ + private const PAGE_HEADER = <<<'EOT' + + + + + Test Documentation + + + +EOT; + + /** + * @var string + */ + private const CLASS_HEADER = <<<'EOT' + +

%s

+
    + +EOT; + + /** + * @var string + */ + private const CLASS_FOOTER = <<<'EOT' +
+EOT; + + /** + * @var string + */ + private const PAGE_FOOTER = <<<'EOT' + + + +EOT; + + /** + * Handler for 'start run' event. + */ + protected function startRun(): void + { + $this->write(self::PAGE_HEADER); + } + + /** + * Handler for 'start class' event. + */ + protected function startClass(string $name): void + { + $this->write( + sprintf( + self::CLASS_HEADER, + $name, + $this->currentTestClassPrettified + ) + ); + } + + /** + * Handler for 'on test' event. + */ + protected function onTest($name, bool $success = true): void + { + $this->write( + sprintf( + "
  • %s %s
  • \n", + $success ? '#555753' : '#ef2929', + $success ? '✓' : '❌', + $name + ) + ); + } + + /** + * Handler for 'end class' event. + */ + protected function endClass(string $name): void + { + $this->write(self::CLASS_FOOTER); + } + + /** + * Handler for 'end run' event. + */ + protected function endRun(): void + { + $this->write(self::PAGE_FOOTER); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php new file mode 100644 index 0000000000..b7da1c2daa --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php @@ -0,0 +1,324 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\TestDox; + +use function array_key_exists; +use function array_keys; +use function array_map; +use function array_pop; +use function array_values; +use function explode; +use function get_class; +use function gettype; +use function implode; +use function in_array; +use function is_bool; +use function is_float; +use function is_int; +use function is_numeric; +use function is_object; +use function is_scalar; +use function is_string; +use function mb_strtolower; +use function ord; +use function preg_quote; +use function preg_replace; +use function range; +use function sprintf; +use function str_replace; +use function strlen; +use function strpos; +use function strtolower; +use function strtoupper; +use function substr; +use function trim; +use PHPUnit\Framework\TestCase; +use PHPUnit\Util\Color; +use PHPUnit\Util\Exception as UtilException; +use PHPUnit\Util\Test; +use ReflectionException; +use ReflectionMethod; +use ReflectionObject; +use SebastianBergmann\Exporter\Exporter; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class NamePrettifier +{ + /** + * @var string[] + */ + private $strings = []; + + /** + * @var bool + */ + private $useColor; + + public function __construct($useColor = false) + { + $this->useColor = $useColor; + } + + /** + * Prettifies the name of a test class. + * + * @psalm-param class-string $className + */ + public function prettifyTestClass(string $className): string + { + try { + $annotations = Test::parseTestMethodAnnotations($className); + + if (isset($annotations['class']['testdox'][0])) { + return $annotations['class']['testdox'][0]; + } + } catch (UtilException $e) { + // ignore, determine className by parsing the provided name + } + + $parts = explode('\\', $className); + $className = array_pop($parts); + + if (substr($className, -1 * strlen('Test')) === 'Test') { + $className = substr($className, 0, strlen($className) - strlen('Test')); + } + + if (strpos($className, 'Tests') === 0) { + $className = substr($className, strlen('Tests')); + } elseif (strpos($className, 'Test') === 0) { + $className = substr($className, strlen('Test')); + } + + if (empty($className)) { + $className = 'UnnamedTests'; + } + + if (!empty($parts)) { + $parts[] = $className; + $fullyQualifiedName = implode('\\', $parts); + } else { + $fullyQualifiedName = $className; + } + + $result = ''; + $wasLowerCase = false; + + foreach (range(0, strlen($className) - 1) as $i) { + $isLowerCase = mb_strtolower($className[$i], 'UTF-8') === $className[$i]; + + if ($wasLowerCase && !$isLowerCase) { + $result .= ' '; + } + + $result .= $className[$i]; + + if ($isLowerCase) { + $wasLowerCase = true; + } else { + $wasLowerCase = false; + } + } + + if ($fullyQualifiedName !== $className) { + return $result . ' (' . $fullyQualifiedName . ')'; + } + + return $result; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function prettifyTestCase(TestCase $test): string + { + $annotations = $test->getAnnotations(); + $annotationWithPlaceholders = false; + + $callback = static function (string $variable): string { + return sprintf('/%s(?=\b)/', preg_quote($variable, '/')); + }; + + if (isset($annotations['method']['testdox'][0])) { + $result = $annotations['method']['testdox'][0]; + + if (strpos($result, '$') !== false) { + $annotation = $annotations['method']['testdox'][0]; + $providedData = $this->mapTestMethodParameterNamesToProvidedDataValues($test); + $variables = array_map($callback, array_keys($providedData)); + + $result = trim(preg_replace($variables, $providedData, $annotation)); + + $annotationWithPlaceholders = true; + } + } else { + $result = $this->prettifyTestMethod($test->getName(false)); + } + + if (!$annotationWithPlaceholders && $test->usesDataProvider()) { + $result .= $this->prettifyDataSet($test); + } + + return $result; + } + + public function prettifyDataSet(TestCase $test): string + { + if (!$this->useColor) { + return $test->getDataSetAsString(false); + } + + if (is_int($test->dataName())) { + $data = Color::dim(' with data set ') . Color::colorize('fg-cyan', (string) $test->dataName()); + } else { + $data = Color::dim(' with ') . Color::colorize('fg-cyan', Color::visualizeWhitespace((string) $test->dataName())); + } + + return $data; + } + + /** + * Prettifies the name of a test method. + */ + public function prettifyTestMethod(string $name): string + { + $buffer = ''; + + if ($name === '') { + return $buffer; + } + + $string = (string) preg_replace('#\d+$#', '', $name, -1, $count); + + if (in_array($string, $this->strings, true)) { + $name = $string; + } elseif ($count === 0) { + $this->strings[] = $string; + } + + if (strpos($name, 'test_') === 0) { + $name = substr($name, 5); + } elseif (strpos($name, 'test') === 0) { + $name = substr($name, 4); + } + + if ($name === '') { + return $buffer; + } + + $name[0] = strtoupper($name[0]); + + if (strpos($name, '_') !== false) { + return trim(str_replace('_', ' ', $name)); + } + + $wasNumeric = false; + + foreach (range(0, strlen($name) - 1) as $i) { + if ($i > 0 && ord($name[$i]) >= 65 && ord($name[$i]) <= 90) { + $buffer .= ' ' . strtolower($name[$i]); + } else { + $isNumeric = is_numeric($name[$i]); + + if (!$wasNumeric && $isNumeric) { + $buffer .= ' '; + $wasNumeric = true; + } + + if ($wasNumeric && !$isNumeric) { + $wasNumeric = false; + } + + $buffer .= $name[$i]; + } + } + + return $buffer; + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + private function mapTestMethodParameterNamesToProvidedDataValues(TestCase $test): array + { + try { + $reflector = new ReflectionMethod(get_class($test), $test->getName(false)); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new UtilException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + $providedData = []; + $providedDataValues = array_values($test->getProvidedData()); + $i = 0; + + $providedData['$_dataName'] = $test->dataName(); + + foreach ($reflector->getParameters() as $parameter) { + if (!array_key_exists($i, $providedDataValues) && $parameter->isDefaultValueAvailable()) { + try { + $providedDataValues[$i] = $parameter->getDefaultValue(); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new UtilException( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } + + $value = $providedDataValues[$i++] ?? null; + + if (is_object($value)) { + $reflector = new ReflectionObject($value); + + if ($reflector->hasMethod('__toString')) { + $value = (string) $value; + } else { + $value = get_class($value); + } + } + + if (!is_scalar($value)) { + $value = gettype($value); + } + + if (is_bool($value) || is_int($value) || is_float($value)) { + $value = (new Exporter)->export($value); + } + + if (is_string($value) && $value === '') { + if ($this->useColor) { + $value = Color::colorize('dim,underlined', 'empty'); + } else { + $value = "''"; + } + } + + $providedData['$' . $parameter->getName()] = $value; + } + + if ($this->useColor) { + $providedData = array_map(static function ($value) { + return Color::colorize('fg-cyan', Color::visualizeWhitespace((string) $value, true)); + }, $providedData); + } + + return $providedData; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php new file mode 100644 index 0000000000..1c2a5c93d8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php @@ -0,0 +1,342 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\TestDox; + +use function get_class; +use function in_array; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; +use PHPUnit\Framework\WarningTestCase; +use PHPUnit\Runner\BaseTestRunner; +use PHPUnit\Util\Printer; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +abstract class ResultPrinter extends Printer implements TestListener +{ + /** + * @var NamePrettifier + */ + protected $prettifier; + + /** + * @var string + */ + protected $testClass = ''; + + /** + * @var int + */ + protected $testStatus; + + /** + * @var array + */ + protected $tests = []; + + /** + * @var int + */ + protected $successful = 0; + + /** + * @var int + */ + protected $warned = 0; + + /** + * @var int + */ + protected $failed = 0; + + /** + * @var int + */ + protected $risky = 0; + + /** + * @var int + */ + protected $skipped = 0; + + /** + * @var int + */ + protected $incomplete = 0; + + /** + * @var null|string + */ + protected $currentTestClassPrettified; + + /** + * @var null|string + */ + protected $currentTestMethodPrettified; + + /** + * @var array + */ + private $groups; + + /** + * @var array + */ + private $excludeGroups; + + /** + * @param resource $out + * + * @throws \PHPUnit\Framework\Exception + */ + public function __construct($out = null, array $groups = [], array $excludeGroups = []) + { + parent::__construct($out); + + $this->groups = $groups; + $this->excludeGroups = $excludeGroups; + + $this->prettifier = new NamePrettifier; + $this->startRun(); + } + + /** + * Flush buffer and close output. + */ + public function flush(): void + { + $this->doEndClass(); + $this->endRun(); + + parent::flush(); + } + + /** + * An error occurred. + */ + public function addError(Test $test, Throwable $t, float $time): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $this->testStatus = BaseTestRunner::STATUS_ERROR; + $this->failed++; + } + + /** + * A warning occurred. + */ + public function addWarning(Test $test, Warning $e, float $time): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $this->testStatus = BaseTestRunner::STATUS_WARNING; + $this->warned++; + } + + /** + * A failure occurred. + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $this->testStatus = BaseTestRunner::STATUS_FAILURE; + $this->failed++; + } + + /** + * Incomplete test. + */ + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $this->testStatus = BaseTestRunner::STATUS_INCOMPLETE; + $this->incomplete++; + } + + /** + * Risky test. + */ + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $this->testStatus = BaseTestRunner::STATUS_RISKY; + $this->risky++; + } + + /** + * Skipped test. + */ + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $this->testStatus = BaseTestRunner::STATUS_SKIPPED; + $this->skipped++; + } + + /** + * A testsuite started. + */ + public function startTestSuite(TestSuite $suite): void + { + } + + /** + * A testsuite ended. + */ + public function endTestSuite(TestSuite $suite): void + { + } + + /** + * A test started. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function startTest(Test $test): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $class = get_class($test); + + if ($this->testClass !== $class) { + if ($this->testClass !== '') { + $this->doEndClass(); + } + + $this->currentTestClassPrettified = $this->prettifier->prettifyTestClass($class); + $this->testClass = $class; + $this->tests = []; + + $this->startClass($class); + } + + if ($test instanceof TestCase) { + $this->currentTestMethodPrettified = $this->prettifier->prettifyTestCase($test); + } + + $this->testStatus = BaseTestRunner::STATUS_PASSED; + } + + /** + * A test ended. + */ + public function endTest(Test $test, float $time): void + { + if (!$this->isOfInterest($test)) { + return; + } + + $this->tests[] = [$this->currentTestMethodPrettified, $this->testStatus]; + + $this->currentTestClassPrettified = null; + $this->currentTestMethodPrettified = null; + } + + protected function doEndClass(): void + { + foreach ($this->tests as $test) { + $this->onTest($test[0], $test[1] === BaseTestRunner::STATUS_PASSED); + } + + $this->endClass($this->testClass); + } + + /** + * Handler for 'start run' event. + */ + protected function startRun(): void + { + } + + /** + * Handler for 'start class' event. + */ + protected function startClass(string $name): void + { + } + + /** + * Handler for 'on test' event. + */ + protected function onTest($name, bool $success = true): void + { + } + + /** + * Handler for 'end class' event. + */ + protected function endClass(string $name): void + { + } + + /** + * Handler for 'end run' event. + */ + protected function endRun(): void + { + } + + private function isOfInterest(Test $test): bool + { + if (!$test instanceof TestCase) { + return false; + } + + if ($test instanceof WarningTestCase) { + return false; + } + + if (!empty($this->groups)) { + foreach ($test->getGroups() as $group) { + if (in_array($group, $this->groups, true)) { + return true; + } + } + + return false; + } + + if (!empty($this->excludeGroups)) { + foreach ($test->getGroups() as $group) { + if (in_array($group, $this->excludeGroups, true)) { + return false; + } + } + + return true; + } + + return true; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php new file mode 100644 index 0000000000..c19ba2699d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php @@ -0,0 +1,384 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\TestDox; + +use const PHP_EOL; +use function array_map; +use function get_class; +use function implode; +use function preg_split; +use function trim; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestResult; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; +use PHPUnit\Runner\BaseTestRunner; +use PHPUnit\Runner\PhptTestCase; +use PHPUnit\Runner\TestSuiteSorter; +use PHPUnit\TextUI\ResultPrinter; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +class TestDoxPrinter extends ResultPrinter +{ + /** + * @var NamePrettifier + */ + protected $prettifier; + + /** + * @var int The number of test results received from the TestRunner + */ + protected $testIndex = 0; + + /** + * @var int The number of test results already sent to the output + */ + protected $testFlushIndex = 0; + + /** + * @var array Buffer for test results + */ + protected $testResults = []; + + /** + * @var array Lookup table for testname to testResults[index] + */ + protected $testNameResultIndex = []; + + /** + * @var bool + */ + protected $enableOutputBuffer = false; + + /** + * @var array array + */ + protected $originalExecutionOrder = []; + + /** + * @var int + */ + protected $spinState = 0; + + /** + * @var bool + */ + protected $showProgress = true; + + /** + * @param null|resource|string $out + * + * @throws \PHPUnit\Framework\Exception + */ + public function __construct($out = null, bool $verbose = false, string $colors = self::COLOR_DEFAULT, bool $debug = false, $numberOfColumns = 80, bool $reverse = false) + { + parent::__construct($out, $verbose, $colors, $debug, $numberOfColumns, $reverse); + + $this->prettifier = new NamePrettifier($this->colors); + } + + public function setOriginalExecutionOrder(array $order): void + { + $this->originalExecutionOrder = $order; + $this->enableOutputBuffer = !empty($order); + } + + public function setShowProgressAnimation(bool $showProgress): void + { + $this->showProgress = $showProgress; + } + + public function printResult(TestResult $result): void + { + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function endTest(Test $test, float $time): void + { + if (!$test instanceof TestCase && !$test instanceof PhptTestCase && !$test instanceof TestSuite) { + return; + } + + if ($this->testHasPassed()) { + $this->registerTestResult($test, null, BaseTestRunner::STATUS_PASSED, $time, false); + } + + if ($test instanceof TestCase || $test instanceof PhptTestCase) { + $this->testIndex++; + } + + parent::endTest($test, $time); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function addError(Test $test, Throwable $t, float $time): void + { + $this->registerTestResult($test, $t, BaseTestRunner::STATUS_ERROR, $time, true); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function addWarning(Test $test, Warning $e, float $time): void + { + $this->registerTestResult($test, $e, BaseTestRunner::STATUS_WARNING, $time, true); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + $this->registerTestResult($test, $e, BaseTestRunner::STATUS_FAILURE, $time, true); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + $this->registerTestResult($test, $t, BaseTestRunner::STATUS_INCOMPLETE, $time, false); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + $this->registerTestResult($test, $t, BaseTestRunner::STATUS_RISKY, $time, false); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + $this->registerTestResult($test, $t, BaseTestRunner::STATUS_SKIPPED, $time, false); + } + + public function writeProgress(string $progress): void + { + $this->flushOutputBuffer(); + } + + public function flush(): void + { + $this->flushOutputBuffer(true); + } + + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + protected function registerTestResult(Test $test, ?Throwable $t, int $status, float $time, bool $verbose): void + { + $testName = TestSuiteSorter::getTestSorterUID($test); + + $result = [ + 'className' => $this->formatClassName($test), + 'testName' => $testName, + 'testMethod' => $this->formatTestName($test), + 'message' => '', + 'status' => $status, + 'time' => $time, + 'verbose' => $verbose, + ]; + + if ($t !== null) { + $result['message'] = $this->formatTestResultMessage($t, $result); + } + + $this->testResults[$this->testIndex] = $result; + $this->testNameResultIndex[$testName] = $this->testIndex; + } + + protected function formatTestName(Test $test): string + { + return $test->getName(); + } + + protected function formatClassName(Test $test): string + { + return get_class($test); + } + + protected function testHasPassed(): bool + { + if (!isset($this->testResults[$this->testIndex]['status'])) { + return true; + } + + if ($this->testResults[$this->testIndex]['status'] === BaseTestRunner::STATUS_PASSED) { + return true; + } + + return false; + } + + protected function flushOutputBuffer(bool $forceFlush = false): void + { + if ($this->testFlushIndex === $this->testIndex) { + return; + } + + if ($this->testFlushIndex > 0) { + if ($this->enableOutputBuffer) { + $prevResult = $this->getTestResultByName($this->originalExecutionOrder[$this->testFlushIndex - 1]); + } else { + $prevResult = $this->testResults[$this->testFlushIndex - 1]; + } + } else { + $prevResult = $this->getEmptyTestResult(); + } + + if (!$this->enableOutputBuffer) { + $this->writeTestResult($prevResult, $this->testResults[$this->testFlushIndex++]); + } else { + do { + $flushed = false; + + if (!$forceFlush && isset($this->originalExecutionOrder[$this->testFlushIndex])) { + $result = $this->getTestResultByName($this->originalExecutionOrder[$this->testFlushIndex]); + } else { + // This test(name) cannot found in original execution order, + // flush result to output stream right away + $result = $this->testResults[$this->testFlushIndex]; + } + + if (!empty($result)) { + $this->hideSpinner(); + $this->writeTestResult($prevResult, $result); + $this->testFlushIndex++; + $prevResult = $result; + $flushed = true; + } else { + $this->showSpinner(); + } + } while ($flushed && $this->testFlushIndex < $this->testIndex); + } + } + + protected function showSpinner(): void + { + if (!$this->showProgress) { + return; + } + + if ($this->spinState) { + $this->undrawSpinner(); + } + + $this->spinState++; + $this->drawSpinner(); + } + + protected function hideSpinner(): void + { + if (!$this->showProgress) { + return; + } + + if ($this->spinState) { + $this->undrawSpinner(); + } + + $this->spinState = 0; + } + + protected function drawSpinner(): void + { + // optional for CLI printers: show the user a 'buffering output' spinner + } + + protected function undrawSpinner(): void + { + // remove the spinner from the current line + } + + protected function writeTestResult(array $prevResult, array $result): void + { + } + + protected function getEmptyTestResult(): array + { + return [ + 'className' => '', + 'testName' => '', + 'message' => '', + 'failed' => '', + 'verbose' => '', + ]; + } + + protected function getTestResultByName(?string $testName): array + { + if (isset($this->testNameResultIndex[$testName])) { + return $this->testResults[$this->testNameResultIndex[$testName]]; + } + + return []; + } + + protected function formatThrowable(Throwable $t, ?int $status = null): string + { + $message = trim(\PHPUnit\Framework\TestFailure::exceptionToString($t)); + + if ($message) { + $message .= PHP_EOL . PHP_EOL . $this->formatStacktrace($t); + } else { + $message = $this->formatStacktrace($t); + } + + return $message; + } + + protected function formatStacktrace(Throwable $t): string + { + return \PHPUnit\Util\Filter::getFilteredStacktrace($t); + } + + protected function formatTestResultMessage(Throwable $t, array $result, string $prefix = '│'): string + { + $message = $this->formatThrowable($t, $result['status']); + + if ($message === '') { + return ''; + } + + if (!($this->verbose || $result['verbose'])) { + return ''; + } + + return $this->prefixLines($prefix, $message); + } + + protected function prefixLines(string $prefix, string $message): string + { + $message = trim($message); + + return implode( + PHP_EOL, + array_map( + static function (string $text) use ($prefix) { + return ' ' . $prefix . ($text ? ' ' . $text : ''); + }, + preg_split('/\r\n|\r|\n/', $message) + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php new file mode 100644 index 0000000000..ee080039a7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/TextResultPrinter.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\TestDox; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TextResultPrinter extends ResultPrinter +{ + /** + * Handler for 'start class' event. + */ + protected function startClass(string $name): void + { + $this->write($this->currentTestClassPrettified . "\n"); + } + + /** + * Handler for 'on test' event. + */ + protected function onTest($name, bool $success = true): void + { + if ($success) { + $this->write(' [x] '); + } else { + $this->write(' [ ] '); + } + + $this->write($name . "\n"); + } + + /** + * Handler for 'end class' event. + */ + protected function endClass(string $name): void + { + $this->write("\n"); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php new file mode 100644 index 0000000000..7a8d7d7692 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php @@ -0,0 +1,254 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util\TestDox; + +use function array_filter; +use function get_class; +use function implode; +use DOMDocument; +use DOMElement; +use PHPUnit\Framework\AssertionFailedError; +use PHPUnit\Framework\Exception; +use PHPUnit\Framework\Test; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestListener; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Framework\Warning; +use PHPUnit\Util\Printer; +use ReflectionClass; +use ReflectionException; +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class XmlResultPrinter extends Printer implements TestListener +{ + /** + * @var DOMDocument + */ + private $document; + + /** + * @var DOMElement + */ + private $root; + + /** + * @var NamePrettifier + */ + private $prettifier; + + /** + * @var null|Throwable + */ + private $exception; + + /** + * @param resource|string $out + * + * @throws Exception + */ + public function __construct($out = null) + { + $this->document = new DOMDocument('1.0', 'UTF-8'); + $this->document->formatOutput = true; + + $this->root = $this->document->createElement('tests'); + $this->document->appendChild($this->root); + + $this->prettifier = new NamePrettifier; + + parent::__construct($out); + } + + /** + * Flush buffer and close output. + */ + public function flush(): void + { + $this->write($this->document->saveXML()); + + parent::flush(); + } + + /** + * An error occurred. + */ + public function addError(Test $test, Throwable $t, float $time): void + { + $this->exception = $t; + } + + /** + * A warning occurred. + */ + public function addWarning(Test $test, Warning $e, float $time): void + { + } + + /** + * A failure occurred. + */ + public function addFailure(Test $test, AssertionFailedError $e, float $time): void + { + $this->exception = $e; + } + + /** + * Incomplete test. + */ + public function addIncompleteTest(Test $test, Throwable $t, float $time): void + { + } + + /** + * Risky test. + */ + public function addRiskyTest(Test $test, Throwable $t, float $time): void + { + } + + /** + * Skipped test. + */ + public function addSkippedTest(Test $test, Throwable $t, float $time): void + { + } + + /** + * A test suite started. + */ + public function startTestSuite(TestSuite $suite): void + { + } + + /** + * A test suite ended. + */ + public function endTestSuite(TestSuite $suite): void + { + } + + /** + * A test started. + */ + public function startTest(Test $test): void + { + $this->exception = null; + } + + /** + * A test ended. + * + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function endTest(Test $test, float $time): void + { + if (!$test instanceof TestCase) { + return; + } + + $groups = array_filter( + $test->getGroups(), + static function ($group) { + return !($group === 'small' || $group === 'medium' || $group === 'large'); + } + ); + + $testNode = $this->document->createElement('test'); + + $testNode->setAttribute('className', get_class($test)); + $testNode->setAttribute('methodName', $test->getName()); + $testNode->setAttribute('prettifiedClassName', $this->prettifier->prettifyTestClass(get_class($test))); + $testNode->setAttribute('prettifiedMethodName', $this->prettifier->prettifyTestCase($test)); + $testNode->setAttribute('status', (string) $test->getStatus()); + $testNode->setAttribute('time', (string) $time); + $testNode->setAttribute('size', (string) $test->getSize()); + $testNode->setAttribute('groups', implode(',', $groups)); + + foreach ($groups as $group) { + $groupNode = $this->document->createElement('group'); + + $groupNode->setAttribute('name', $group); + + $testNode->appendChild($groupNode); + } + + $annotations = $test->getAnnotations(); + + foreach (['class', 'method'] as $type) { + foreach ($annotations[$type] as $annotation => $values) { + if ($annotation !== 'covers' && $annotation !== 'uses') { + continue; + } + + foreach ($values as $value) { + $coversNode = $this->document->createElement($annotation); + + $coversNode->setAttribute('target', $value); + + $testNode->appendChild($coversNode); + } + } + } + + foreach ($test->doubledTypes() as $doubledType) { + $testDoubleNode = $this->document->createElement('testDouble'); + + $testDoubleNode->setAttribute('type', $doubledType); + + $testNode->appendChild($testDoubleNode); + } + + $inlineAnnotations = \PHPUnit\Util\Test::getInlineAnnotations(get_class($test), $test->getName(false)); + + if (isset($inlineAnnotations['given'], $inlineAnnotations['when'], $inlineAnnotations['then'])) { + $testNode->setAttribute('given', $inlineAnnotations['given']['value']); + $testNode->setAttribute('givenStartLine', (string) $inlineAnnotations['given']['line']); + $testNode->setAttribute('when', $inlineAnnotations['when']['value']); + $testNode->setAttribute('whenStartLine', (string) $inlineAnnotations['when']['line']); + $testNode->setAttribute('then', $inlineAnnotations['then']['value']); + $testNode->setAttribute('thenStartLine', (string) $inlineAnnotations['then']['line']); + } + + if ($this->exception !== null) { + if ($this->exception instanceof Exception) { + $steps = $this->exception->getSerializableTrace(); + } else { + $steps = $this->exception->getTrace(); + } + + try { + $file = (new ReflectionClass($test))->getFileName(); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + + foreach ($steps as $step) { + if (isset($step['file']) && $step['file'] === $file) { + $testNode->setAttribute('exceptionLine', (string) $step['line']); + + break; + } + } + + $testNode->setAttribute('exceptionMessage', $this->exception->getMessage()); + } + + $this->root->appendChild($testNode); + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php new file mode 100644 index 0000000000..67168a67f3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const PHP_EOL; +use function get_class; +use function sprintf; +use function str_replace; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\PhptTestCase; +use RecursiveIteratorIterator; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class TextTestListRenderer +{ + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function render(TestSuite $suite): string + { + $buffer = 'Available test(s):' . PHP_EOL; + + foreach (new RecursiveIteratorIterator($suite->getIterator()) as $test) { + if ($test instanceof TestCase) { + $name = sprintf( + '%s::%s', + get_class($test), + str_replace(' with data set ', '', $test->getName()) + ); + } elseif ($test instanceof PhptTestCase) { + $name = $test->getName(); + } else { + continue; + } + + $buffer .= sprintf( + ' - %s' . PHP_EOL, + $name + ); + } + + return $buffer; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Type.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Type.php new file mode 100644 index 0000000000..01a6b1931e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/Type.php @@ -0,0 +1,52 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use Throwable; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Type +{ + public static function isType(string $type): bool + { + switch ($type) { + case 'numeric': + case 'integer': + case 'int': + case 'iterable': + case 'float': + case 'string': + case 'boolean': + case 'bool': + case 'null': + case 'array': + case 'object': + case 'resource': + case 'scalar': + return true; + + default: + return false; + } + } + + public static function isCloneable(object $object): bool + { + try { + $clone = clone $object; + } catch (Throwable $t) { + return false; + } + + return $clone instanceof $object; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php new file mode 100644 index 0000000000..ab65dbf359 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use function in_array; +use function sprintf; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + * @psalm-immutable + */ +final class VersionComparisonOperator +{ + /** + * @psalm-var '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' + */ + private $operator; + + public function __construct(string $operator) + { + $this->ensureOperatorIsValid($operator); + + $this->operator = $operator; + } + + /** + * @return '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' + */ + public function asString(): string + { + return $this->operator; + } + + /** + * @throws Exception + * + * @psalm-assert '<'|'lt'|'<='|'le'|'>'|'gt'|'>='|'ge'|'=='|'='|'eq'|'!='|'<>'|'ne' $operator + */ + private function ensureOperatorIsValid(string $operator): void + { + if (!in_array($operator, ['<', 'lt', '<=', 'le', '>', 'gt', '>=', 'ge', '==', '=', 'eq', '!=', '<>', 'ne'], true)) { + throw new Exception( + sprintf( + '"%s" is not a valid version_compare() operator', + $operator + ) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php new file mode 100644 index 0000000000..fc35101929 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php @@ -0,0 +1,83 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const DIRECTORY_SEPARATOR; +use function addslashes; +use function array_map; +use function implode; +use function is_string; +use function realpath; +use function sprintf; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class XdebugFilterScriptGenerator +{ + public function generate(array $filterData): string + { + $items = $this->getWhitelistItems($filterData); + + $files = array_map( + static function ($item) { + return sprintf( + " '%s'", + $item + ); + }, + $items + ); + + $files = implode(",\n", $files); + + return << + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use const ENT_QUOTES; +use function assert; +use function chdir; +use function class_exists; +use function dirname; +use function error_reporting; +use function file_get_contents; +use function getcwd; +use function gettype; +use function htmlspecialchars; +use function is_string; +use function libxml_get_errors; +use function libxml_use_internal_errors; +use function mb_convert_encoding; +use function ord; +use function preg_replace; +use function settype; +use function sprintf; +use function strlen; +use DOMCharacterData; +use DOMDocument; +use DOMElement; +use DOMNode; +use DOMText; +use PHPUnit\Framework\Exception; +use ReflectionClass; +use ReflectionException; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class Xml +{ + public static function import(DOMElement $element): DOMElement + { + return (new DOMDocument)->importNode($element, true); + } + + /** + * Load an $actual document into a DOMDocument. This is called + * from the selector assertions. + * + * If $actual is already a DOMDocument, it is returned with + * no changes. Otherwise, $actual is loaded into a new DOMDocument + * as either HTML or XML, depending on the value of $isHtml. If $isHtml is + * false and $xinclude is true, xinclude is performed on the loaded + * DOMDocument. + * + * Note: prior to PHPUnit 3.3.0, this method loaded a file and + * not a string as it currently does. To load a file into a + * DOMDocument, use loadFile() instead. + * + * @param DOMDocument|string $actual + * + * @throws Exception + */ + public static function load($actual, bool $isHtml = false, string $filename = '', bool $xinclude = false, bool $strict = false): DOMDocument + { + if ($actual instanceof DOMDocument) { + return $actual; + } + + if (!is_string($actual)) { + throw new Exception('Could not load XML from ' . gettype($actual)); + } + + if ($actual === '') { + throw new Exception('Could not load XML from empty string'); + } + + // Required for XInclude on Windows. + if ($xinclude) { + $cwd = getcwd(); + @chdir(dirname($filename)); + } + + $document = new DOMDocument; + $document->preserveWhiteSpace = false; + + $internal = libxml_use_internal_errors(true); + $message = ''; + $reporting = error_reporting(0); + + if ($filename !== '') { + // Required for XInclude + $document->documentURI = $filename; + } + + if ($isHtml) { + $loaded = $document->loadHTML($actual); + } else { + $loaded = $document->loadXML($actual); + } + + if (!$isHtml && $xinclude) { + $document->xinclude(); + } + + foreach (libxml_get_errors() as $error) { + $message .= "\n" . $error->message; + } + + libxml_use_internal_errors($internal); + error_reporting($reporting); + + if (isset($cwd)) { + @chdir($cwd); + } + + if ($loaded === false || ($strict && $message !== '')) { + if ($filename !== '') { + throw new Exception( + sprintf( + 'Could not load "%s".%s', + $filename, + $message !== '' ? "\n" . $message : '' + ) + ); + } + + if ($message === '') { + $message = 'Could not load XML for unknown reason'; + } + + throw new Exception($message); + } + + return $document; + } + + /** + * Loads an XML (or HTML) file into a DOMDocument object. + * + * @throws Exception + */ + public static function loadFile(string $filename, bool $isHtml = false, bool $xinclude = false, bool $strict = false): DOMDocument + { + $reporting = error_reporting(0); + $contents = file_get_contents($filename); + + error_reporting($reporting); + + if ($contents === false) { + throw new Exception( + sprintf( + 'Could not read "%s".', + $filename + ) + ); + } + + return self::load($contents, $isHtml, $filename, $xinclude, $strict); + } + + public static function removeCharacterDataNodes(DOMNode $node): void + { + if ($node->hasChildNodes()) { + for ($i = $node->childNodes->length - 1; $i >= 0; $i--) { + if (($child = $node->childNodes->item($i)) instanceof DOMCharacterData) { + $node->removeChild($child); + } + } + } + } + + /** + * Escapes a string for the use in XML documents. + * + * Any Unicode character is allowed, excluding the surrogate blocks, FFFE, + * and FFFF (not even as character reference). + * + * @see https://www.w3.org/TR/xml/#charsets + */ + public static function prepareString(string $string): string + { + return preg_replace( + '/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/', + '', + htmlspecialchars( + self::convertToUtf8($string), + ENT_QUOTES + ) + ); + } + + /** + * "Convert" a DOMElement object into a PHP variable. + */ + public static function xmlToVariable(DOMElement $element) + { + $variable = null; + + switch ($element->tagName) { + case 'array': + $variable = []; + + foreach ($element->childNodes as $entry) { + if (!$entry instanceof DOMElement || $entry->tagName !== 'element') { + continue; + } + $item = $entry->childNodes->item(0); + + if ($item instanceof DOMText) { + $item = $entry->childNodes->item(1); + } + + $value = self::xmlToVariable($item); + + if ($entry->hasAttribute('key')) { + $variable[(string) $entry->getAttribute('key')] = $value; + } else { + $variable[] = $value; + } + } + + break; + + case 'object': + $className = $element->getAttribute('class'); + + if ($element->hasChildNodes()) { + $arguments = $element->childNodes->item(0)->childNodes; + $constructorArgs = []; + + foreach ($arguments as $argument) { + if ($argument instanceof DOMElement) { + $constructorArgs[] = self::xmlToVariable($argument); + } + } + + try { + assert(class_exists($className)); + + $variable = (new ReflectionClass($className))->newInstanceArgs($constructorArgs); + // @codeCoverageIgnoreStart + } catch (ReflectionException $e) { + throw new Exception( + $e->getMessage(), + (int) $e->getCode(), + $e + ); + } + // @codeCoverageIgnoreEnd + } else { + $variable = new $className; + } + + break; + + case 'boolean': + $variable = $element->textContent === 'true'; + + break; + + case 'integer': + case 'double': + case 'string': + $variable = $element->textContent; + + settype($variable, $element->tagName); + + break; + } + + return $variable; + } + + private static function convertToUtf8(string $string): string + { + if (!self::isUtf8($string)) { + $string = mb_convert_encoding($string, 'UTF-8'); + } + + return $string; + } + + private static function isUtf8(string $string): bool + { + $length = strlen($string); + + for ($i = 0; $i < $length; $i++) { + if (ord($string[$i]) < 0x80) { + $n = 0; + } elseif ((ord($string[$i]) & 0xE0) === 0xC0) { + $n = 1; + } elseif ((ord($string[$i]) & 0xF0) === 0xE0) { + $n = 2; + } elseif ((ord($string[$i]) & 0xF0) === 0xF0) { + $n = 3; + } else { + return false; + } + + for ($j = 0; $j < $n; $j++) { + if ((++$i === $length) || ((ord($string[$i]) & 0xC0) !== 0x80)) { + return false; + } + } + } + + return true; + } +} diff --git a/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php new file mode 100644 index 0000000000..d92e1fe262 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Util; + +use function get_class; +use function implode; +use function str_replace; +use PHPUnit\Framework\TestCase; +use PHPUnit\Framework\TestSuite; +use PHPUnit\Runner\PhptTestCase; +use RecursiveIteratorIterator; +use XMLWriter; + +/** + * @internal This class is not covered by the backward compatibility promise for PHPUnit + */ +final class XmlTestListRenderer +{ + /** + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + */ + public function render(TestSuite $suite): string + { + $writer = new XMLWriter; + + $writer->openMemory(); + $writer->setIndent(true); + $writer->startDocument(); + $writer->startElement('tests'); + + $currentTestCase = null; + + foreach (new RecursiveIteratorIterator($suite->getIterator()) as $test) { + if ($test instanceof TestCase) { + if (get_class($test) !== $currentTestCase) { + if ($currentTestCase !== null) { + $writer->endElement(); + } + + $writer->startElement('testCaseClass'); + $writer->writeAttribute('name', get_class($test)); + + $currentTestCase = get_class($test); + } + + $writer->startElement('testCaseMethod'); + $writer->writeAttribute('name', $test->getName(false)); + $writer->writeAttribute('groups', implode(',', $test->getGroups())); + + if (!empty($test->getDataSetAsString(false))) { + $writer->writeAttribute( + 'dataSet', + str_replace( + ' with data set ', + '', + $test->getDataSetAsString(false) + ) + ); + } + + $writer->endElement(); + } elseif ($test instanceof PhptTestCase) { + if ($currentTestCase !== null) { + $writer->endElement(); + + $currentTestCase = null; + } + + $writer->startElement('phptFile'); + $writer->writeAttribute('path', $test->getName()); + $writer->endElement(); + } + } + + if ($currentTestCase !== null) { + $writer->endElement(); + } + + $writer->endElement(); + + return $writer->outputMemory(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.gitignore new file mode 100644 index 0000000000..9e5f1db31e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.gitignore @@ -0,0 +1,4 @@ +/.idea +/composer.lock +/vendor + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.php_cs b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.php_cs new file mode 100644 index 0000000000..b7393bdace --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.php_cs @@ -0,0 +1,67 @@ +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); + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.travis.yml new file mode 100644 index 0000000000..9d9c9d978a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/.travis.yml @@ -0,0 +1,25 @@ +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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md new file mode 100644 index 0000000000..d136bf58f4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/ChangeLog.md @@ -0,0 +1,15 @@ +# 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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/LICENSE new file mode 100644 index 0000000000..8f243844c7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/LICENSE @@ -0,0 +1,33 @@ +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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/README.md b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/README.md new file mode 100644 index 0000000000..2bf26afd39 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/README.md @@ -0,0 +1,14 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/build.xml new file mode 100644 index 0000000000..24cf32e89c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/build.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/composer.json new file mode 100644 index 0000000000..ba32ed6356 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/composer.json @@ -0,0 +1,28 @@ +{ + "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" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/phpunit.xml new file mode 100644 index 0000000000..2c0569e4a3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/phpunit.xml @@ -0,0 +1,21 @@ + + + + tests + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php new file mode 100644 index 0000000000..20f8880fe1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/src/Wizard.php @@ -0,0 +1,111 @@ + + * + * 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; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/tests/WizardTest.php b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/tests/WizardTest.php new file mode 100644 index 0000000000..711ad28644 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/code-unit-reverse-lookup/tests/WizardTest.php @@ -0,0 +1,45 @@ + + * + * 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) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/.github/stale.yml b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.github/stale.yml new file mode 100644 index 0000000000..4eadca3278 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.github/stale.yml @@ -0,0 +1,40 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.gitignore new file mode 100644 index 0000000000..c3e9d7e3c0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.gitignore @@ -0,0 +1,4 @@ +/.idea +/.php_cs.cache +/composer.lock +/vendor diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/.php_cs.dist b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.php_cs.dist new file mode 100644 index 0000000000..acf47b3579 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.php_cs.dist @@ -0,0 +1,189 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.travis.yml new file mode 100644 index 0000000000..7583d0ffcd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/.travis.yml @@ -0,0 +1,33 @@ +language: php + +sudo: false + +php: + - 7.1 + - 7.2 + - master + +env: + matrix: + - DEPENDENCIES="high" + - DEPENDENCIES="low" + global: + - DEFAULT_COMPOSER_FLAGS="--no-interaction --no-ansi --no-progress --no-suggest" + +before_install: + - composer self-update + - composer clear-cache + +install: + - if [[ "$DEPENDENCIES" = 'high' ]]; then travis_retry composer update $DEFAULT_COMPOSER_FLAGS; fi + - if [[ "$DEPENDENCIES" = 'low' ]]; then travis_retry 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/comparator/ChangeLog.md new file mode 100644 index 0000000000..f4d97872c5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/ChangeLog.md @@ -0,0 +1,66 @@ +# ChangeLog + +All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [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 + +* Fixed [#53](https://github.com/sebastianbergmann/comparator/pull/53): `DOMNodeComparator` ignores `$ignoreCase` parameter +* Fixed [#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 + +* 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 + +* 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` + +[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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/comparator/LICENSE new file mode 100644 index 0000000000..46d0f2547e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/LICENSE @@ -0,0 +1,33 @@ +Comparator + +Copyright (c) 2002-2018, 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/README.md b/pandora_console/godmode/um_client/vendor/sebastian/comparator/README.md new file mode 100644 index 0000000000..524211af0a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/README.md @@ -0,0 +1,37 @@ +[![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"; +} +``` + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/comparator/build.xml new file mode 100644 index 0000000000..8e2799978e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/build.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/comparator/composer.json new file mode 100644 index 0000000000..00dfc2977a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/composer.json @@ -0,0 +1,54 @@ +{ + "name": "sebastian/comparator", + "description": "Provides the functionality to compare PHP values for equality", + "keywords": ["comparator","compare","equality"], + "homepage": "https://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" + } + ], + "prefer-stable": true, + "require": { + "php": ">=7.1", + "sebastian/diff": "^3.0", + "sebastian/exporter": "^3.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/_fixture" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + } +} + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/comparator/phpunit.xml new file mode 100644 index 0000000000..3e12be416e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/phpunit.xml @@ -0,0 +1,21 @@ + + + + + tests + + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ArrayComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ArrayComparator.php new file mode 100644 index 0000000000..4b2fadf9fb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ArrayComparator.php @@ -0,0 +1,130 @@ + + * + * 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 = []) + { + if ($canonicalize) { + \sort($expected); + \sort($actual); + } + + $remaining = $actual; + $actualAsString = "Array (\n"; + $expectedAsString = "Array (\n"; + $equal = true; + + foreach ($expected as $key => $value) { + unset($remaining[$key]); + + if (!\array_key_exists($key, $actual)) { + $expectedAsString .= \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); + + $expectedAsString .= \sprintf( + " %s => %s\n", + $this->exporter->export($key), + $this->exporter->shortenedExport($value) + ); + + $actualAsString .= \sprintf( + " %s => %s\n", + $this->exporter->export($key), + $this->exporter->shortenedExport($actual[$key]) + ); + } catch (ComparisonFailure $e) { + $expectedAsString .= \sprintf( + " %s => %s\n", + $this->exporter->export($key), + $e->getExpectedAsString() ? $this->indent($e->getExpectedAsString()) : $this->exporter->shortenedExport($e->getExpected()) + ); + + $actualAsString .= \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) { + $actualAsString .= \sprintf( + " %s => %s\n", + $this->exporter->export($key), + $this->exporter->shortenedExport($value) + ); + + $equal = false; + } + + $expectedAsString .= ')'; + $actualAsString .= ')'; + + if (!$equal) { + throw new ComparisonFailure( + $expected, + $actual, + $expectedAsString, + $actualAsString, + false, + 'Failed asserting that two arrays are equal.' + ); + } + } + + protected function indent($lines) + { + return \trim(\str_replace("\n", "\n ", $lines)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Comparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Comparator.php new file mode 100644 index 0000000000..661746dc27 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Comparator.php @@ -0,0 +1,61 @@ + + * + * 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; + } + + 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); +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ComparisonFailure.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ComparisonFailure.php new file mode 100644 index 0000000000..d043288771 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ComparisonFailure.php @@ -0,0 +1,128 @@ + + * + * 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; +use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; + +/** + * 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; + } + + public function getActual() + { + return $this->actual; + } + + 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(new UnifiedDiffOutputBuilder("\n--- Expected\n+++ Actual\n")); + + return $differ->diff($this->expectedAsString, $this->actualAsString); + } + + /** + * @return string + */ + public function toString() + { + return $this->message . $this->getDiff(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DOMNodeComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DOMNodeComparator.php new file mode 100644 index 0000000000..c0ad70c31a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DOMNodeComparator.php @@ -0,0 +1,86 @@ + + * + * 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 = []) + { + $expectedAsString = $this->nodeToText($expected, true, $ignoreCase); + $actualAsString = $this->nodeToText($actual, true, $ignoreCase); + + if ($expectedAsString !== $actualAsString) { + $type = $expected instanceof DOMDocument ? 'documents' : '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. + */ + private function nodeToText(DOMNode $node, bool $canonicalize, bool $ignoreCase): string + { + if ($canonicalize) { + $document = new DOMDocument; + @$document->loadXML($node->C14N()); + + $node = $document; + } + + $document = $node instanceof DOMDocument ? $node : $node->ownerDocument; + + $document->formatOutput = true; + $document->normalizeDocument(); + + $text = $node instanceof DOMDocument ? $node->saveXML() : $document->saveXML($node); + + return $ignoreCase ? \strtolower($text) : $text; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DateTimeComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DateTimeComparator.php new file mode 100644 index 0000000000..af94b5cdbd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DateTimeComparator.php @@ -0,0 +1,86 @@ + + * + * 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 \Exception + * @throws ComparisonFailure + */ + public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = []) + { + /** @var \DateTimeInterface $expected */ + /** @var \DateTimeInterface $actual */ + $absDelta = \abs($delta); + $delta = new \DateInterval(\sprintf('PT%dS', $absDelta)); + $delta->f = $absDelta - \floor($absDelta); + + $actualClone = (clone $actual) + ->setTimezone(new \DateTimeZone('UTC')); + + $expectedLower = (clone $expected) + ->setTimezone(new \DateTimeZone('UTC')) + ->sub($delta); + + $expectedUpper = (clone $expected) + ->setTimezone(new \DateTimeZone('UTC')) + ->add($delta); + + if ($actualClone < $expectedLower || $actualClone > $expectedUpper) { + 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. + */ + private function dateTimeToString(\DateTimeInterface $datetime): string + { + $string = $datetime->format('Y-m-d\TH:i:s.uO'); + + return $string ?: 'Invalid DateTimeInterface object'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DoubleComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DoubleComparator.php new file mode 100644 index 0000000000..f2b0c4e121 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/DoubleComparator.php @@ -0,0 +1,56 @@ + + * + * 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_float($expected) || \is_float($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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ExceptionComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ExceptionComparator.php new file mode 100644 index 0000000000..42c40cfcfa --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ExceptionComparator.php @@ -0,0 +1,52 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Factory.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Factory.php new file mode 100644 index 0000000000..53d1c79723 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/Factory.php @@ -0,0 +1,138 @@ + + * + * 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 Factory + */ + private static $instance; + + /** + * @var Comparator[] + */ + private $customComparators = []; + + /** + * @var Comparator[] + */ + private $defaultComparators = []; + + /** + * @return Factory + */ + public static function getInstance() + { + if (self::$instance === null) { + self::$instance = new self; + } + + return self::$instance; + } + + /** + * Constructs a new factory. + */ + public function __construct() + { + $this->registerDefaultComparators(); + } + + /** + * 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->customComparators as $comparator) { + if ($comparator->accepts($expected, $actual)) { + return $comparator; + } + } + + foreach ($this->defaultComparators as $comparator) { + if ($comparator->accepts($expected, $actual)) { + return $comparator; + } + } + } + + /** + * Registers a new comparator. + * + * This comparator will be returned by getComparatorFor() 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 invoked + * before those of the other comparators. + * + * @param Comparator $comparator The comparator to be registered + */ + public function register(Comparator $comparator) + { + \array_unshift($this->customComparators, $comparator); + + $comparator->setFactory($this); + } + + /** + * Unregisters a comparator. + * + * This comparator will no longer be considered by getComparatorFor(). + * + * @param Comparator $comparator The comparator to be unregistered + */ + public function unregister(Comparator $comparator) + { + foreach ($this->customComparators as $key => $_comparator) { + if ($comparator === $_comparator) { + unset($this->customComparators[$key]); + } + } + } + + /** + * Unregisters all non-default comparators. + */ + public function reset() + { + $this->customComparators = []; + } + + private function registerDefaultComparators() + { + $this->registerDefaultComparator(new MockObjectComparator); + $this->registerDefaultComparator(new DateTimeComparator); + $this->registerDefaultComparator(new DOMNodeComparator); + $this->registerDefaultComparator(new SplObjectStorageComparator); + $this->registerDefaultComparator(new ExceptionComparator); + $this->registerDefaultComparator(new ObjectComparator); + $this->registerDefaultComparator(new ResourceComparator); + $this->registerDefaultComparator(new ArrayComparator); + $this->registerDefaultComparator(new DoubleComparator); + $this->registerDefaultComparator(new NumericComparator); + $this->registerDefaultComparator(new ScalarComparator); + $this->registerDefaultComparator(new TypeComparator); + } + + private function registerDefaultComparator(Comparator $comparator) + { + $this->defaultComparators[] = $comparator; + + $comparator->setFactory($this); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/MockObjectComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/MockObjectComparator.php new file mode 100644 index 0000000000..f439d842f7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/MockObjectComparator.php @@ -0,0 +1,47 @@ + + * + * 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 || $expected instanceof \PHPUnit\Framework\MockObject\MockObject) && + ($actual 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/NumericComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/NumericComparator.php new file mode 100644 index 0000000000..8a03ffcf90 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/NumericComparator.php @@ -0,0 +1,68 @@ + + * + * 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_float($expected) || \is_float($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; // @codeCoverageIgnore + } + + if ((\is_infinite($actual) xor \is_infinite($expected)) || + (\is_nan($actual) || \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) + ) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ObjectComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ObjectComparator.php new file mode 100644 index 0000000000..54fce8244d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ObjectComparator.php @@ -0,0 +1,106 @@ + + * + * 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 = []) + { + 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([$actual, $expected], $processed, true) || + \in_array([$expected, $actual], $processed, true)) { + return; + } + + $processed[] = [$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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ResourceComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ResourceComparator.php new file mode 100644 index 0000000000..547182643a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ResourceComparator.php @@ -0,0 +1,52 @@ + + * + * 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) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ScalarComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ScalarComparator.php new file mode 100644 index 0000000000..e19df4de51 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/ScalarComparator.php @@ -0,0 +1,91 @@ + + * + * 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 && \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.' + ); + } + + if ($expectedToCompare != $actualToCompare) { + 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) + ) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/SplObjectStorageComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/SplObjectStorageComparator.php new file mode 100644 index 0000000000..5900d57f2f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/SplObjectStorageComparator.php @@ -0,0 +1,69 @@ + + * + * 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.' + ); + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/TypeComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/TypeComparator.php new file mode 100644 index 0000000000..e7f551f89d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/src/TypeComparator.php @@ -0,0 +1,59 @@ + + * + * 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) + ) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ArrayComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ArrayComparatorTest.php new file mode 100644 index 0000000000..25906bb590 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ArrayComparatorTest.php @@ -0,0 +1,161 @@ + + * + * 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\ArrayComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class ArrayComparatorTest extends TestCase +{ + /** + * @var ArrayComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new ArrayComparator; + $this->comparator->setFactory(new Factory); + } + + public function acceptsFailsProvider() + { + return [ + [[], null], + [null, []], + [null, null] + ]; + } + + public function assertEqualsSucceedsProvider() + { + return [ + [ + ['a' => 1, 'b' => 2], + ['b' => 2, 'a' => 1] + ], + [ + [1], + ['1'] + ], + [ + [3, 2, 1], + [2, 3, 1], + 0, + true + ], + [ + [2.3], + [2.5], + 0.5 + ], + [ + [[2.3]], + [[2.5]], + 0.5 + ], + [ + [new Struct(2.3)], + [new Struct(2.5)], + 0.5 + ], + ]; + } + + public function assertEqualsFailsProvider() + { + return [ + [ + [], + [0 => 1] + ], + [ + [0 => 1], + [] + ], + [ + [0 => null], + [] + ], + [ + [0 => 1, 1 => 2], + [0 => 1, 1 => 3] + ], + [ + ['a', 'b' => [1, 2]], + ['a', 'b' => [2, 1]] + ], + [ + [2.3], + [4.2], + 0.5 + ], + [ + [[2.3]], + [[4.2]], + 0.5 + ], + [ + [new Struct(2.3)], + [new Struct(4.2)], + 0.5 + ] + ]; + } + + public function testAcceptsSucceeds(): void + { + $this->assertTrue( + $this->comparator->accepts([], []) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0, $canonicalize = false): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual, $delta, $canonicalize); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $delta = 0.0, $canonicalize = false): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('Failed asserting that two arrays are equal'); + + $this->comparator->assertEquals($expected, $actual, $delta, $canonicalize); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ComparisonFailureTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ComparisonFailureTest.php new file mode 100644 index 0000000000..3b438b761b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ComparisonFailureTest.php @@ -0,0 +1,59 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DOMNodeComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DOMNodeComparatorTest.php new file mode 100644 index 0000000000..18451e0ac3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DOMNodeComparatorTest.php @@ -0,0 +1,180 @@ + + * + * 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; +use PHPUnit\Framework\TestCase; + +/** + * @covers \SebastianBergmann\Comparator\DOMNodeComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class DOMNodeComparatorTest extends TestCase +{ + /** + * @var DOMNodeComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new DOMNodeComparator; + } + + public function acceptsSucceedsProvider() + { + $document = new DOMDocument; + $node = new DOMNode; + + return [ + [$document, $document], + [$node, $node], + [$document, $node], + [$node, $document] + ]; + } + + public function acceptsFailsProvider() + { + $document = new DOMDocument; + + return [ + [$document, null], + [null, $document], + [null, null] + ]; + } + + public function assertEqualsSucceedsProvider() + { + return [ + [ + $this->createDOMDocument(''), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(''), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(''), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument("\n \n"), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(''), + $this->createDOMDocument(''), + $ignoreCase = true + ], + [ + $this->createDOMDocument(""), + $this->createDOMDocument(""), + ], + ]; + } + + public function assertEqualsFailsProvider() + { + return [ + [ + $this->createDOMDocument(''), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(''), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(' bar '), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(''), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(' bar '), + $this->createDOMDocument(' bir ') + ], + [ + $this->createDOMDocument(''), + $this->createDOMDocument('') + ], + [ + $this->createDOMDocument(' bar '), + $this->createDOMDocument(' BAR ') + ] + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $ignoreCase = false): void + { + $exception = null; + + try { + $delta = 0.0; + $canonicalize = false; + $this->comparator->assertEquals($expected, $actual, $delta, $canonicalize, $ignoreCase); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('Failed asserting that two DOM'); + + $this->comparator->assertEquals($expected, $actual); + } + + private function createDOMDocument($content) + { + $document = new DOMDocument; + $document->preserveWhiteSpace = false; + $document->loadXML($content); + + return $document; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DateTimeComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DateTimeComparatorTest.php new file mode 100644 index 0000000000..41e1086193 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DateTimeComparatorTest.php @@ -0,0 +1,213 @@ + + * + * 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; +use PHPUnit\Framework\TestCase; + +/** + * @covers \SebastianBergmann\Comparator\DateTimeComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class DateTimeComparatorTest extends TestCase +{ + /** + * @var DateTimeComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new DateTimeComparator; + } + + public function acceptsFailsProvider() + { + $datetime = new DateTime; + + return [ + [$datetime, null], + [null, $datetime], + [null, null] + ]; + } + + public function assertEqualsSucceedsProvider() + { + return [ + [ + 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 + ], + [ + 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 + ], + [ + new DateTime('2013-03-29', new DateTimeZone('America/New_York')), + new DateTime('2013-03-29', new DateTimeZone('America/New_York')) + ], + [ + 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')) + ], + [ + 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 + ], + [ + new DateTime('2013-03-30', new DateTimeZone('America/New_York')), + new DateTime('2013-03-29 23:00:00', new DateTimeZone('America/Chicago')) + ], + [ + new DateTime('2013-03-30', new DateTimeZone('America/New_York')), + new DateTime('2013-03-29 23:01:30', new DateTimeZone('America/Chicago')), + 100 + ], + [ + new DateTime('@1364616000'), + new DateTime('2013-03-29 23:00:00', new DateTimeZone('America/Chicago')) + ], + [ + new DateTime('2013-03-29T05:13:35-0500'), + new DateTime('2013-03-29T04:13:35-0600') + ], + [ + new DateTimeImmutable('2013-03-30', new DateTimeZone('America/New_York')), + new DateTimeImmutable('2013-03-29 23:01:30', new DateTimeZone('America/Chicago')), + 100 + ], + [ + new DateTimeImmutable('2013-03-30 12:00:00', new DateTimeZone('UTC')), + new DateTimeImmutable('2013-03-30 12:00:00.5', new DateTimeZone('UTC')), + 0.5 + ], + ]; + } + + public function assertEqualsFailsProvider() + { + return [ + [ + 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')) + ], + [ + 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 + ], + [ + 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 + ], + [ + new DateTime('2013-03-29', new DateTimeZone('America/New_York')), + new DateTime('2013-03-30', new DateTimeZone('America/New_York')) + ], + [ + new DateTime('2013-03-29', new DateTimeZone('America/New_York')), + new DateTime('2013-03-30', new DateTimeZone('America/New_York')), + 43200 + ], + [ + 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')), + ], + [ + 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 + ], + [ + new DateTime('2013-03-30', new DateTimeZone('America/New_York')), + new DateTime('2013-03-30', new DateTimeZone('America/Chicago')) + ], + [ + new DateTime('2013-03-29T05:13:35-0600'), + new DateTime('2013-03-29T04:13:35-0600') + ], + [ + new DateTime('2013-03-29T05:13:35-0600'), + new DateTime('2013-03-29T05:13:35-0500') + ], + ]; + } + + public function testAcceptsSucceeds(): void + { + $this->assertTrue( + $this->comparator->accepts( + new DateTime, + new DateTime + ) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual, $delta); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $delta = 0.0): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('Failed asserting that two DateTime objects are equal.'); + + $this->comparator->assertEquals($expected, $actual, $delta); + } + + public function testAcceptsDateTimeInterface(): void + { + $this->assertTrue($this->comparator->accepts(new DateTime, new DateTimeImmutable)); + } + + public function testSupportsDateTimeInterface(): void + { + $this->assertNull( + $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')) + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DoubleComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DoubleComparatorTest.php new file mode 100644 index 0000000000..1a577a2183 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/DoubleComparatorTest.php @@ -0,0 +1,135 @@ + + * + * 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\DoubleComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class DoubleComparatorTest extends TestCase +{ + /** + * @var DoubleComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new DoubleComparator; + } + + public function acceptsSucceedsProvider() + { + return [ + [0, 5.0], + [5.0, 0], + ['5', 4.5], + [1.2e3, 7E-10], + [3, \acos(8)], + [\acos(8), 3], + [\acos(8), \acos(8)] + ]; + } + + public function acceptsFailsProvider() + { + return [ + [5, 5], + ['4.5', 5], + [0x539, 02471], + [5.0, false], + [null, 5.0] + ]; + } + + public function assertEqualsSucceedsProvider() + { + return [ + [2.3, 2.3], + ['2.3', 2.3], + [5.0, 5], + [5, 5.0], + [5.0, '5'], + [1.2e3, 1200], + [2.3, 2.5, 0.5], + [3, 3.05, 0.05], + [1.2e3, 1201, 1], + [(string) (1 / 3), 1 - 2 / 3], + [1 / 3, (string) (1 - 2 / 3)] + ]; + } + + public function assertEqualsFailsProvider() + { + return [ + [2.3, 4.2], + ['2.3', 4.2], + [5.0, '4'], + [5.0, 6], + [1.2e3, 1201], + [2.3, 2.5, 0.2], + [3, 3.05, 0.04], + [3, \acos(8)], + [\acos(8), 3], + [\acos(8), \acos(8)] + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual, $delta); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $delta = 0.0): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('matches expected'); + + $this->comparator->assertEquals($expected, $actual, $delta); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ExceptionComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ExceptionComparatorTest.php new file mode 100644 index 0000000000..12330eaa26 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ExceptionComparatorTest.php @@ -0,0 +1,136 @@ + + * + * 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 PHPUnit\Framework\TestCase; +use RuntimeException; + +/** + * @covers \SebastianBergmann\Comparator\ExceptionComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class ExceptionComparatorTest extends TestCase +{ + /** + * @var ExceptionComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new ExceptionComparator; + $this->comparator->setFactory(new Factory); + } + + public function acceptsSucceedsProvider() + { + return [ + [new Exception, new Exception], + [new RuntimeException, new RuntimeException], + [new Exception, new RuntimeException] + ]; + } + + public function acceptsFailsProvider() + { + return [ + [new Exception, null], + [null, new Exception], + [null, null] + ]; + } + + public function assertEqualsSucceedsProvider() + { + $exception1 = new Exception; + $exception2 = new Exception; + + $exception3 = new RuntimeException('Error', 100); + $exception4 = new RuntimeException('Error', 100); + + return [ + [$exception1, $exception1], + [$exception1, $exception2], + [$exception3, $exception3], + [$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 [ + [$exception1, $exception2, $equalMessage], + [$exception1, $exception3, $equalMessage], + [$exception1, $exception4, $typeMessage], + [$exception2, $exception3, $equalMessage], + [$exception4, $exception5, $equalMessage] + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $message): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage($message); + + $this->comparator->assertEquals($expected, $actual); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/FactoryTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/FactoryTest.php new file mode 100644 index 0000000000..82f53433e4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/FactoryTest.php @@ -0,0 +1,117 @@ + + * + * 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\Factory + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class FactoryTest extends TestCase +{ + public function instanceProvider() + { + $tmpfile = \tmpfile(); + + return [ + [null, null, 'SebastianBergmann\\Comparator\\ScalarComparator'], + [null, true, 'SebastianBergmann\\Comparator\\ScalarComparator'], + [true, null, 'SebastianBergmann\\Comparator\\ScalarComparator'], + [true, true, 'SebastianBergmann\\Comparator\\ScalarComparator'], + [false, false, 'SebastianBergmann\\Comparator\\ScalarComparator'], + [true, false, 'SebastianBergmann\\Comparator\\ScalarComparator'], + [false, true, 'SebastianBergmann\\Comparator\\ScalarComparator'], + ['', '', 'SebastianBergmann\\Comparator\\ScalarComparator'], + ['0', '0', 'SebastianBergmann\\Comparator\\ScalarComparator'], + ['0', 0, 'SebastianBergmann\\Comparator\\NumericComparator'], + [0, '0', 'SebastianBergmann\\Comparator\\NumericComparator'], + [0, 0, 'SebastianBergmann\\Comparator\\NumericComparator'], + [1.0, 0, 'SebastianBergmann\\Comparator\\DoubleComparator'], + [0, 1.0, 'SebastianBergmann\\Comparator\\DoubleComparator'], + [1.0, 1.0, 'SebastianBergmann\\Comparator\\DoubleComparator'], + [[1], [1], 'SebastianBergmann\\Comparator\\ArrayComparator'], + [$tmpfile, $tmpfile, 'SebastianBergmann\\Comparator\\ResourceComparator'], + [new \stdClass, new \stdClass, 'SebastianBergmann\\Comparator\\ObjectComparator'], + [new \DateTime, new \DateTime, 'SebastianBergmann\\Comparator\\DateTimeComparator'], + [new \SplObjectStorage, new \SplObjectStorage, 'SebastianBergmann\\Comparator\\SplObjectStorageComparator'], + [new \Exception, new \Exception, 'SebastianBergmann\\Comparator\\ExceptionComparator'], + [new \DOMDocument, new \DOMDocument, 'SebastianBergmann\\Comparator\\DOMNodeComparator'], + // mixed types + [$tmpfile, [1], 'SebastianBergmann\\Comparator\\TypeComparator'], + [[1], $tmpfile, 'SebastianBergmann\\Comparator\\TypeComparator'], + [$tmpfile, '1', 'SebastianBergmann\\Comparator\\TypeComparator'], + ['1', $tmpfile, 'SebastianBergmann\\Comparator\\TypeComparator'], + [$tmpfile, new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'], + [new \stdClass, $tmpfile, 'SebastianBergmann\\Comparator\\TypeComparator'], + [new \stdClass, [1], 'SebastianBergmann\\Comparator\\TypeComparator'], + [[1], new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'], + [new \stdClass, '1', 'SebastianBergmann\\Comparator\\TypeComparator'], + ['1', new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'], + [new ClassWithToString, '1', 'SebastianBergmann\\Comparator\\ScalarComparator'], + ['1', new ClassWithToString, 'SebastianBergmann\\Comparator\\ScalarComparator'], + [1.0, new \stdClass, 'SebastianBergmann\\Comparator\\TypeComparator'], + [new \stdClass, 1.0, 'SebastianBergmann\\Comparator\\TypeComparator'], + [1.0, [1], 'SebastianBergmann\\Comparator\\TypeComparator'], + [[1], 1.0, 'SebastianBergmann\\Comparator\\TypeComparator'], + ]; + } + + /** + * @dataProvider instanceProvider + */ + public function testGetComparatorFor($a, $b, $expected): void + { + $factory = new Factory; + $actual = $factory->getComparatorFor($a, $b); + $this->assertInstanceOf($expected, $actual); + } + + public function testRegister(): void + { + $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); + } + + public function testUnregister(): void + { + $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); + } + + public function testIsSingleton(): void + { + $f = Factory::getInstance(); + $this->assertSame($f, Factory::getInstance()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/MockObjectComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/MockObjectComparatorTest.php new file mode 100644 index 0000000000..922e9d6943 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/MockObjectComparatorTest.php @@ -0,0 +1,168 @@ + + * + * 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; +use stdClass; + +/** + * @covers \SebastianBergmann\Comparator\MockObjectComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class MockObjectComparatorTest extends TestCase +{ + /** + * @var MockObjectComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new MockObjectComparator; + $this->comparator->setFactory(new Factory); + } + + public function acceptsSucceedsProvider() + { + $testmock = $this->createMock(TestClass::class); + $stdmock = $this->createMock(stdClass::class); + + return [ + [$testmock, $testmock], + [$stdmock, $stdmock], + [$stdmock, $testmock] + ]; + } + + public function acceptsFailsProvider() + { + $stdmock = $this->createMock(stdClass::class); + + return [ + [$stdmock, null], + [null, $stdmock], + [null, null] + ]; + } + + public function assertEqualsSucceedsProvider() + { + // cyclic dependencies + $book1 = $this->getMockBuilder(Book::class)->setMethods(null)->getMock(); + $book1->author = $this->getMockBuilder(Author::class)->setMethods(null)->setConstructorArgs(['Terry Pratchett'])->getMock(); + $book1->author->books[] = $book1; + $book2 = $this->getMockBuilder(Book::class)->setMethods(null)->getMock(); + $book2->author = $this->getMockBuilder(Author::class)->setMethods(null)->setConstructorArgs(['Terry Pratchett'])->getMock(); + $book2->author->books[] = $book2; + + $object1 = $this->getMockBuilder(SampleClass::class)->setMethods(null)->setConstructorArgs([4, 8, 15])->getMock(); + $object2 = $this->getMockBuilder(SampleClass::class)->setMethods(null)->setConstructorArgs([4, 8, 15])->getMock(); + + return [ + [$object1, $object1], + [$object1, $object2], + [$book1, $book1], + [$book1, $book2], + [ + $this->getMockBuilder(Struct::class)->setMethods(null)->setConstructorArgs([2.3])->getMock(), + $this->getMockBuilder(Struct::class)->setMethods(null)->setConstructorArgs([2.5])->getMock(), + 0.5 + ] + ]; + } + + public function assertEqualsFailsProvider() + { + $typeMessage = 'is not instance of expected class'; + $equalMessage = 'Failed asserting that two objects are equal.'; + + // cyclic dependencies + $book1 = $this->getMockBuilder(Book::class)->setMethods(null)->getMock(); + $book1->author = $this->getMockBuilder(Author::class)->setMethods(null)->setConstructorArgs(['Terry Pratchett'])->getMock(); + $book1->author->books[] = $book1; + $book2 = $this->getMockBuilder(Book::class)->setMethods(null)->getMock(); + $book1->author = $this->getMockBuilder(Author::class)->setMethods(null)->setConstructorArgs(['Terry Pratch'])->getMock(); + $book2->author->books[] = $book2; + + $book3 = $this->getMockBuilder(Book::class)->setMethods(null)->getMock(); + $book3->author = 'Terry Pratchett'; + $book4 = $this->createMock(stdClass::class); + $book4->author = 'Terry Pratchett'; + + $object1 = $this->getMockBuilder(SampleClass::class)->setMethods(null)->setConstructorArgs([4, 8, 15])->getMock(); + $object2 = $this->getMockBuilder(SampleClass::class)->setMethods(null)->setConstructorArgs([16, 23, 42])->getMock(); + + return [ + [ + $this->getMockBuilder(SampleClass::class)->setMethods(null)->setConstructorArgs([4, 8, 15])->getMock(), + $this->getMockBuilder(SampleClass::class)->setMethods(null)->setConstructorArgs([16, 23, 42])->getMock(), + $equalMessage + ], + [$object1, $object2, $equalMessage], + [$book1, $book2, $equalMessage], + [$book3, $book4, $typeMessage], + [ + $this->getMockBuilder(Struct::class)->setMethods(null)->setConstructorArgs([2.3])->getMock(), + $this->getMockBuilder(Struct::class)->setMethods(null)->setConstructorArgs([4.2])->getMock(), + $equalMessage, + 0.5 + ] + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual, $delta); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $message, $delta = 0.0): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage($message); + + $this->comparator->assertEquals($expected, $actual, $delta); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/NumericComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/NumericComparatorTest.php new file mode 100644 index 0000000000..504172f4a0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/NumericComparatorTest.php @@ -0,0 +1,123 @@ + + * + * 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\NumericComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class NumericComparatorTest extends TestCase +{ + /** + * @var NumericComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new NumericComparator; + } + + public function acceptsSucceedsProvider() + { + return [ + [5, 10], + [8, '0'], + ['10', 0], + [0x74c3b00c, 42], + [0755, 0777] + ]; + } + + public function acceptsFailsProvider() + { + return [ + ['5', '10'], + [8, 5.0], + [5.0, 8], + [10, null], + [false, 12] + ]; + } + + public function assertEqualsSucceedsProvider() + { + return [ + [1337, 1337], + ['1337', 1337], + [0x539, 1337], + [02471, 1337], + [1337, 1338, 1], + ['1337', 1340, 5], + ]; + } + + public function assertEqualsFailsProvider() + { + return [ + [1337, 1338], + ['1338', 1337], + [0x539, 1338], + [1337, 1339, 1], + ['1337', 1340, 2], + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual, $delta); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $delta = 0.0): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('matches expected'); + + $this->comparator->assertEquals($expected, $actual, $delta); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ObjectComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ObjectComparatorTest.php new file mode 100644 index 0000000000..30ef2306ac --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ObjectComparatorTest.php @@ -0,0 +1,150 @@ + + * + * 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; +use stdClass; + +/** + * @covers \SebastianBergmann\Comparator\ObjectComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class ObjectComparatorTest extends TestCase +{ + /** + * @var ObjectComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new ObjectComparator; + $this->comparator->setFactory(new Factory); + } + + public function acceptsSucceedsProvider() + { + return [ + [new TestClass, new TestClass], + [new stdClass, new stdClass], + [new stdClass, new TestClass] + ]; + } + + public function acceptsFailsProvider() + { + return [ + [new stdClass, null], + [null, new stdClass], + [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 [ + [$object1, $object1], + [$object1, $object2], + [$book1, $book1], + [$book1, $book2], + [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 [ + [new SampleClass(4, 8, 15), new SampleClass(16, 23, 42), $equalMessage], + [$object1, $object2, $equalMessage], + [$book1, $book2, $equalMessage], + [$book3, $book4, $typeMessage], + [new Struct(2.3), new Struct(4.2), $equalMessage, 0.5] + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $delta = 0.0): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual, $delta); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $message, $delta = 0.0): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage($message); + + $this->comparator->assertEquals($expected, $actual, $delta); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ResourceComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ResourceComparatorTest.php new file mode 100644 index 0000000000..158aaa9037 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ResourceComparatorTest.php @@ -0,0 +1,122 @@ + + * + * 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\ResourceComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class ResourceComparatorTest extends TestCase +{ + /** + * @var ResourceComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new ResourceComparator; + } + + public function acceptsSucceedsProvider() + { + $tmpfile1 = \tmpfile(); + $tmpfile2 = \tmpfile(); + + return [ + [$tmpfile1, $tmpfile1], + [$tmpfile2, $tmpfile2], + [$tmpfile1, $tmpfile2] + ]; + } + + public function acceptsFailsProvider() + { + $tmpfile1 = \tmpfile(); + + return [ + [$tmpfile1, null], + [null, $tmpfile1], + [null, null] + ]; + } + + public function assertEqualsSucceedsProvider() + { + $tmpfile1 = \tmpfile(); + $tmpfile2 = \tmpfile(); + + return [ + [$tmpfile1, $tmpfile1], + [$tmpfile2, $tmpfile2] + ]; + } + + public function assertEqualsFailsProvider() + { + $tmpfile1 = \tmpfile(); + $tmpfile2 = \tmpfile(); + + return [ + [$tmpfile1, $tmpfile2], + [$tmpfile2, $tmpfile1] + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual): void + { + $this->expectException(ComparisonFailure::class); + + $this->comparator->assertEquals($expected, $actual); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ScalarComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ScalarComparatorTest.php new file mode 100644 index 0000000000..11feae274f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/ScalarComparatorTest.php @@ -0,0 +1,164 @@ + + * + * 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\ScalarComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class ScalarComparatorTest extends TestCase +{ + /** + * @var ScalarComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new ScalarComparator; + } + + public function acceptsSucceedsProvider() + { + return [ + ['string', 'string'], + [new ClassWithToString, 'string'], + ['string', new ClassWithToString], + ['string', null], + [false, 'string'], + [false, true], + [null, false], + [null, null], + ['10', 10], + ['', false], + ['1', true], + [1, true], + [0, false], + [0.1, '0.1'] + ]; + } + + public function acceptsFailsProvider() + { + return [ + [[], []], + ['string', []], + [new ClassWithToString, new ClassWithToString], + [false, new ClassWithToString], + [\tmpfile(), \tmpfile()] + ]; + } + + public function assertEqualsSucceedsProvider() + { + return [ + ['string', 'string'], + [new ClassWithToString, new ClassWithToString], + ['string representation', new ClassWithToString], + [new ClassWithToString, 'string representation'], + ['string', 'STRING', true], + ['STRING', 'string', true], + ['String Representation', new ClassWithToString, true], + [new ClassWithToString, 'String Representation', true], + ['10', 10], + ['', false], + ['1', true], + [1, true], + [0, false], + [0.1, '0.1'], + [false, null], + [false, false], + [true, true], + [null, null] + ]; + } + + public function assertEqualsFailsProvider() + { + $stringException = 'Failed asserting that two strings are equal.'; + $otherException = 'matches expected'; + + return [ + ['string', 'other string', $stringException], + ['string', 'STRING', $stringException], + ['STRING', 'string', $stringException], + ['string', 'other string', $stringException], + // https://github.com/sebastianbergmann/phpunit/issues/1023 + ['9E6666666', '9E7777777', $stringException], + [new ClassWithToString, 'does not match', $otherException], + ['does not match', new ClassWithToString, $otherException], + [0, 'Foobar', $otherException], + ['Foobar', 0, $otherException], + ['10', 25, $otherException], + ['1', false, $otherException], + ['', true, $otherException], + [false, true, $otherException], + [true, false, $otherException], + [null, true, $otherException], + [0, true, $otherException], + ['0', '0.0', $stringException], + ['0.', '0.0', $stringException], + ['0e1', '0e2', $stringException], + ["\n\n\n0.0", ' 0.', $stringException], + ['0.0', '25e-10000', $stringException], + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual, $ignoreCase = false): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual, 0.0, false, $ignoreCase); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual, $message): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage($message); + + $this->comparator->assertEquals($expected, $actual); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/SplObjectStorageComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/SplObjectStorageComparatorTest.php new file mode 100644 index 0000000000..19cbe716a2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/SplObjectStorageComparatorTest.php @@ -0,0 +1,145 @@ + + * + * 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; +use SplObjectStorage; +use stdClass; + +/** + * @covers \SebastianBergmann\Comparator\SplObjectStorageComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class SplObjectStorageComparatorTest extends TestCase +{ + /** + * @var SplObjectStorageComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new SplObjectStorageComparator; + } + + public function acceptsFailsProvider() + { + return [ + [new SplObjectStorage, new stdClass], + [new stdClass, new SplObjectStorage], + [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 [ + [$storage1, $storage1], + [$storage1, $storage2], + [$storage3, $storage3], + [$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 [ + [$storage1, $storage2], + [$storage1, $storage3], + [$storage2, $storage3], + ]; + } + + public function testAcceptsSucceeds(): void + { + $this->assertTrue( + $this->comparator->accepts( + new SplObjectStorage, + new SplObjectStorage + ) + ); + } + + /** + * @dataProvider acceptsFailsProvider + */ + public function testAcceptsFails($expected, $actual): void + { + $this->assertFalse( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('Failed asserting that two objects are equal.'); + + $this->comparator->assertEquals($expected, $actual); + } + + public function testAssertEqualsFails2(): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('Failed asserting that two objects are equal.'); + + $t = new SplObjectStorage(); + $t->attach(new \stdClass()); + + $this->comparator->assertEquals($t, new \SplObjectStorage()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/TypeComparatorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/TypeComparatorTest.php new file mode 100644 index 0000000000..b8586a5ae8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/TypeComparatorTest.php @@ -0,0 +1,107 @@ + + * + * 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; +use stdClass; + +/** + * @covers \SebastianBergmann\Comparator\TypeComparator + * + * @uses \SebastianBergmann\Comparator\Comparator + * @uses \SebastianBergmann\Comparator\Factory + * @uses \SebastianBergmann\Comparator\ComparisonFailure + */ +final class TypeComparatorTest extends TestCase +{ + /** + * @var TypeComparator + */ + private $comparator; + + protected function setUp(): void + { + $this->comparator = new TypeComparator; + } + + public function acceptsSucceedsProvider() + { + return [ + [true, 1], + [false, [1]], + [null, new stdClass], + [1.0, 5], + ['', ''] + ]; + } + + public function assertEqualsSucceedsProvider() + { + return [ + [true, true], + [true, false], + [false, false], + [null, null], + [new stdClass, new stdClass], + [0, 0], + [1.0, 2.0], + ['hello', 'world'], + ['', ''], + [[], [1, 2, 3]] + ]; + } + + public function assertEqualsFailsProvider() + { + return [ + [true, null], + [null, false], + [1.0, 0], + [new stdClass, []], + ['1', 1] + ]; + } + + /** + * @dataProvider acceptsSucceedsProvider + */ + public function testAcceptsSucceeds($expected, $actual): void + { + $this->assertTrue( + $this->comparator->accepts($expected, $actual) + ); + } + + /** + * @dataProvider assertEqualsSucceedsProvider + */ + public function testAssertEqualsSucceeds($expected, $actual): void + { + $exception = null; + + try { + $this->comparator->assertEquals($expected, $actual); + } catch (ComparisonFailure $exception) { + } + + $this->assertNull($exception, 'Unexpected ComparisonFailure'); + } + + /** + * @dataProvider assertEqualsFailsProvider + */ + public function testAssertEqualsFails($expected, $actual): void + { + $this->expectException(ComparisonFailure::class); + $this->expectExceptionMessage('does not match expected type'); + + $this->comparator->assertEquals($expected, $actual); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Author.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Author.php new file mode 100644 index 0000000000..efcb6c0342 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Author.php @@ -0,0 +1,26 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Book.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Book.php new file mode 100644 index 0000000000..73a5c1b10b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Book.php @@ -0,0 +1,19 @@ + + * + * 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; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/ClassWithToString.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/ClassWithToString.php new file mode 100644 index 0000000000..488e85aef6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/ClassWithToString.php @@ -0,0 +1,18 @@ + + * + * 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'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/SampleClass.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/SampleClass.php new file mode 100644 index 0000000000..7e455e8ad0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/SampleClass.php @@ -0,0 +1,29 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Struct.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Struct.php new file mode 100644 index 0000000000..7710de8b3c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/Struct.php @@ -0,0 +1,23 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClass.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClass.php new file mode 100644 index 0000000000..fd10c1baba --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClass.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Comparator; + +class TestClass +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClassComparator.php b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClassComparator.php new file mode 100644 index 0000000000..014de67dba --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/comparator/tests/_fixture/TestClassComparator.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/.github/stale.yml b/pandora_console/godmode/um_client/vendor/sebastian/diff/.github/stale.yml new file mode 100644 index 0000000000..1c523ab308 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/.github/stale.yml @@ -0,0 +1,40 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/diff/.gitignore new file mode 100644 index 0000000000..35dc211856 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/.gitignore @@ -0,0 +1,6 @@ +/.idea +/composer.lock +/vendor +/.php_cs.cache +/.phpunit.result.cache +/from.txt.orig \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/.php_cs.dist b/pandora_console/godmode/um_client/vendor/sebastian/diff/.php_cs.dist new file mode 100644 index 0000000000..9214607564 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/.php_cs.dist @@ -0,0 +1,168 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/diff/.travis.yml new file mode 100644 index 0000000000..13cd9ff831 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/.travis.yml @@ -0,0 +1,26 @@ +language: php + +php: + - 7.1 + - 7.2 + - 7.3 + - 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/diff/ChangeLog.md new file mode 100644 index 0000000000..88332f7da6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/ChangeLog.md @@ -0,0 +1,60 @@ +# ChangeLog + +All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [3.0.3] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` + +## [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 + +* Fixed [#70](https://github.com/sebastianbergmann/diff/issues/70): Diffing of arrays no longer works + +## [2.0.1] - 2017-08-03 + +### Fixed + +* 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 + +* Implemented [#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 + +[3.0.3]: https://github.com/sebastianbergmann/diff/compare/3.0.2...3.0.3 +[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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/diff/LICENSE new file mode 100644 index 0000000000..3ad1d7c3ca --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/LICENSE @@ -0,0 +1,33 @@ +sebastian/diff + +Copyright (c) 2002-2019, 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/README.md b/pandora_console/godmode/um_client/vendor/sebastian/diff/README.md new file mode 100644 index 0000000000..78dbecd5df --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/README.md @@ -0,0 +1,195 @@ +# 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 + +#### Generating diff + +The `Differ` class can be used to generate a textual representation of the difference between two strings: + +```php +diff('foo', 'bar'); +``` + +The code above yields the output below: +```diff +--- Original ++++ New +@@ @@ +-foo ++bar +``` + +There are three output builders available in this package: + +#### UnifiedDiffOutputBuilder + +This is default builder, which generates the output close to udiff and is used by PHPUnit. + +```php +diff('foo', 'bar'); +``` + +#### StrictUnifiedDiffOutputBuilder + +Generates (strict) Unified diff's (unidiffs) with hunks, +similar to `diff -u` and compatible with `patch` and `git apply`. + +```php + 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, +]); + +$differ = new Differ($builder); +print $differ->diff('foo', 'bar'); +``` + +#### DiffOnlyOutputBuilder + +Output only the lines that differ. + +```php +diff('foo', 'bar'); +``` + +#### DiffOutputBuilderInterface + +You can pass any output builder to the `Differ` class as longs as it implements the `DiffOutputBuilderInterface`. + +#### Parsing diff + +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')); + ) + ) + ) + ) + ) + ) diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/diff/build.xml new file mode 100644 index 0000000000..fa7b7e2b9e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/build.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/diff/composer.json new file mode 100644 index 0000000000..fe2d77fe3d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/composer.json @@ -0,0 +1,39 @@ +{ + "name": "sebastian/diff", + "description": "Diff implementation", + "keywords": ["diff", "udiff", "unidiff", "unified 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": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^2 || ^3.3 || ^4" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/diff/phpunit.xml new file mode 100644 index 0000000000..3e12be416e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/phpunit.xml @@ -0,0 +1,21 @@ + + + + + tests + + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Chunk.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Chunk.php new file mode 100644 index 0000000000..d030954ab7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Chunk.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff; + +final class Chunk +{ + /** + * @var int + */ + private $start; + + /** + * @var int + */ + private $startRange; + + /** + * @var int + */ + private $end; + + /** + * @var int + */ + private $endRange; + + /** + * @var Line[] + */ + private $lines; + + public function __construct(int $start = 0, int $startRange = 1, int $end = 0, int $endRange = 1, array $lines = []) + { + $this->start = $start; + $this->startRange = $startRange; + $this->end = $end; + $this->endRange = $endRange; + $this->lines = $lines; + } + + public function getStart(): int + { + return $this->start; + } + + public function getStartRange(): int + { + return $this->startRange; + } + + public function getEnd(): int + { + return $this->end; + } + + public function getEndRange(): int + { + return $this->endRange; + } + + /** + * @return Line[] + */ + public function getLines(): array + { + return $this->lines; + } + + /** + * @param Line[] $lines + */ + public function setLines(array $lines): void + { + foreach ($lines as $line) { + if (!$line instanceof Line) { + throw new InvalidArgumentException; + } + } + + $this->lines = $lines; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Diff.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Diff.php new file mode 100644 index 0000000000..3029e5915d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Diff.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff; + +final 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(string $from, string $to, array $chunks = []) + { + $this->from = $from; + $this->to = $to; + $this->chunks = $chunks; + } + + public function getFrom(): string + { + return $this->from; + } + + public function getTo(): string + { + return $this->to; + } + + /** + * @return Chunk[] + */ + public function getChunks(): array + { + return $this->chunks; + } + + /** + * @param Chunk[] $chunks + */ + public function setChunks(array $chunks): void + { + $this->chunks = $chunks; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Differ.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Differ.php new file mode 100644 index 0000000000..3c90a5a13d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Differ.php @@ -0,0 +1,330 @@ + + * + * 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\Output\DiffOutputBuilderInterface; +use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; + +/** + * Diff implementation. + */ +final class Differ +{ + public const OLD = 0; + public const ADDED = 1; + public const REMOVED = 2; + public const DIFF_LINE_END_WARNING = 3; + public const NO_LINE_END_EOF_WARNING = 4; + + /** + * @var DiffOutputBuilderInterface + */ + private $outputBuilder; + + /** + * @param DiffOutputBuilderInterface $outputBuilder + * + * @throws InvalidArgumentException + */ + public function __construct($outputBuilder = null) + { + if ($outputBuilder instanceof DiffOutputBuilderInterface) { + $this->outputBuilder = $outputBuilder; + } elseif (null === $outputBuilder) { + $this->outputBuilder = new UnifiedDiffOutputBuilder; + } elseif (\is_string($outputBuilder)) { + // PHPUnit 6.1.4, 6.2.0, 6.2.1, 6.2.2, and 6.2.3 support + // @see https://github.com/sebastianbergmann/phpunit/issues/2734#issuecomment-314514056 + // @deprecated + $this->outputBuilder = new UnifiedDiffOutputBuilder($outputBuilder); + } else { + throw new InvalidArgumentException( + \sprintf( + 'Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got %s.', + \is_object($outputBuilder) ? 'instance of "' . \get_class($outputBuilder) . '"' : \gettype($outputBuilder) . ' "' . $outputBuilder . '"' + ) + ); + } + } + + /** + * Returns the diff between two arrays or strings as string. + * + * @param array|string $from + * @param array|string $to + * @param null|LongestCommonSubsequenceCalculator $lcs + * + * @return string + */ + public function diff($from, $to, LongestCommonSubsequenceCalculator $lcs = null): string + { + $diff = $this->diffToArray( + $this->normalizeDiffInput($from), + $this->normalizeDiffInput($to), + $lcs + ); + + return $this->outputBuilder->getDiff($diff); + } + + /** + * 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 LongestCommonSubsequenceCalculator $lcs + * + * @return array + */ + public function diffToArray($from, $to, LongestCommonSubsequenceCalculator $lcs = null): array + { + if (\is_string($from)) { + $from = $this->splitStringByLines($from); + } elseif (!\is_array($from)) { + throw new InvalidArgumentException('"from" must be an array or string.'); + } + + if (\is_string($to)) { + $to = $this->splitStringByLines($to); + } elseif (!\is_array($to)) { + throw new InvalidArgumentException('"to" must be an array or string.'); + } + + [$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 = []; + + foreach ($start as $token) { + $diff[] = [$token, self::OLD]; + } + + \reset($from); + \reset($to); + + foreach ($common as $token) { + while (($fromToken = \reset($from)) !== $token) { + $diff[] = [\array_shift($from), self::REMOVED]; + } + + while (($toToken = \reset($to)) !== $token) { + $diff[] = [\array_shift($to), self::ADDED]; + } + + $diff[] = [$token, self::OLD]; + + \array_shift($from); + \array_shift($to); + } + + while (($token = \array_shift($from)) !== null) { + $diff[] = [$token, self::REMOVED]; + } + + while (($token = \array_shift($to)) !== null) { + $diff[] = [$token, self::ADDED]; + } + + foreach ($end as $token) { + $diff[] = [$token, self::OLD]; + } + + if ($this->detectUnmatchedLineEndings($diff)) { + \array_unshift($diff, ["#Warning: Strings contain different line endings!\n", self::DIFF_LINE_END_WARNING]); + } + + return $diff; + } + + /** + * Casts variable to string if it is not a string or array. + * + * @param mixed $input + * + * @return array|string + */ + private function normalizeDiffInput($input) + { + if (!\is_array($input) && !\is_string($input)) { + return (string) $input; + } + + return $input; + } + + /** + * Checks if input is string, if so it will split it line-by-line. + * + * @param string $input + * + * @return array + */ + private function splitStringByLines(string $input): array + { + return \preg_split('/(.*\R)/', $input, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + } + + /** + * @param array $from + * @param array $to + * + * @return LongestCommonSubsequenceCalculator + */ + private function selectLcsImplementation(array $from, array $to): LongestCommonSubsequenceCalculator + { + // 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 MemoryEfficientLongestCommonSubsequenceCalculator; + } + + return new TimeEfficientLongestCommonSubsequenceCalculator; + } + + /** + * Calculates the estimated memory footprint for the DP-based method. + * + * @param array $from + * @param array $to + * + * @return float|int + */ + private function calculateEstimatedFootprint(array $from, array $to) + { + $itemSize = PHP_INT_SIZE === 4 ? 76 : 144; + + return $itemSize * \min(\count($from), \count($to)) ** 2; + } + + /** + * Returns true if line ends don't match in a diff. + * + * @param array $diff + * + * @return bool + */ + private function detectUnmatchedLineEndings(array $diff): bool + { + $newLineBreaks = ['' => true]; + $oldLineBreaks = ['' => true]; + + foreach ($diff as $entry) { + if (self::OLD === $entry[1]) { + $ln = $this->getLinebreak($entry[0]); + $oldLineBreaks[$ln] = true; + $newLineBreaks[$ln] = true; + } elseif (self::ADDED === $entry[1]) { + $newLineBreaks[$this->getLinebreak($entry[0])] = true; + } elseif (self::REMOVED === $entry[1]) { + $oldLineBreaks[$this->getLinebreak($entry[0])] = true; + } + } + + // if either input or output is a single line without breaks than no warning should be raised + if (['' => true] === $newLineBreaks || ['' => true] === $oldLineBreaks) { + return false; + } + + // two way compare + foreach ($newLineBreaks as $break => $set) { + if (!isset($oldLineBreaks[$break])) { + return true; + } + } + + foreach ($oldLineBreaks as $break => $set) { + if (!isset($newLineBreaks[$break])) { + return true; + } + } + + return false; + } + + private function getLinebreak($line): string + { + if (!\is_string($line)) { + return ''; + } + + $lc = \substr($line, -1); + + if ("\r" === $lc) { + return "\r"; + } + + if ("\n" !== $lc) { + return ''; + } + + if ("\r\n" === \substr($line, -2)) { + return "\r\n"; + } + + return "\n"; + } + + private static function getArrayDiffParted(array &$from, array &$to): array + { + $start = []; + $end = []; + + \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 = [$fromK => $from[$fromK]] + $end; + unset($from[$fromK], $to[$toK]); + } while (true); + + return [$from, $to, $start, $end]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/ConfigurationException.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/ConfigurationException.php new file mode 100644 index 0000000000..78f16fde44 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/ConfigurationException.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff; + +final class ConfigurationException extends InvalidArgumentException +{ + /** + * @param string $option + * @param string $expected + * @param mixed $value + * @param int $code + * @param null|\Exception $previous + */ + 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) ? \get_class($value) : (null === $value ? '' : \gettype($value) . '#' . $value) + ), + $code, + $previous + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/Exception.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/Exception.php new file mode 100644 index 0000000000..249a2ba01d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/Exception.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff; + +interface Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php new file mode 100644 index 0000000000..7bca77dc6c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Exception/InvalidArgumentException.php @@ -0,0 +1,15 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Line.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Line.php new file mode 100644 index 0000000000..125bafd3b1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Line.php @@ -0,0 +1,44 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff; + +final class Line +{ + public const ADDED = 1; + public const REMOVED = 2; + public const UNCHANGED = 3; + + /** + * @var int + */ + private $type; + + /** + * @var string + */ + private $content; + + public function __construct(int $type = self::UNCHANGED, string $content = '') + { + $this->type = $type; + $this->content = $content; + } + + public function getContent(): string + { + return $this->content; + } + + public function getType(): int + { + return $this->type; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php new file mode 100644 index 0000000000..7eb1707ec8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/LongestCommonSubsequenceCalculator.php @@ -0,0 +1,24 @@ + + * + * 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. + * + * @param array $from + * @param array $to + * + * @return array + */ + public function calculate(array $from, array $to): array; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php new file mode 100644 index 0000000000..82dc20c8af --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff; + +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 { + $current[$j + 1] = \max($current[$j], $prev[$j + 1]); + } + } + } + + return $current; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php new file mode 100644 index 0000000000..6e590b0ba1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/AbstractChunkOutputBuilder.php @@ -0,0 +1,56 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff\Output; + +abstract class AbstractChunkOutputBuilder implements DiffOutputBuilderInterface +{ + /** + * Takes input of the diff array and returns the common parts. + * Iterates through diff line by line. + * + * @param array $diff + * @param int $lineThreshold + * + * @return array + */ + 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php new file mode 100644 index 0000000000..8a186b53b5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOnlyOutputBuilder.php @@ -0,0 +1,68 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff\Output; + +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 +{ + /** + * @var string + */ + private $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 ("\n" !== \substr($this->header, -1, 1)) { + \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 non changs 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php new file mode 100644 index 0000000000..f6e6afd464 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/DiffOutputBuilderInterface.php @@ -0,0 +1,20 @@ + + * + * 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; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php new file mode 100644 index 0000000000..941b1a7466 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/StrictUnifiedDiffOutputBuilder.php @@ -0,0 +1,318 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff\Output; + +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 $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, + ]; + /** + * @var bool + */ + private $changed; + + /** + * @var bool + */ + private $collapseRanges; + + /** + * @var int >= 0 + */ + private $commonLineThreshold; + + /** + * @var string + */ + private $header; + + /** + * @var int >= 0 + */ + private $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']); + } + + foreach (['fromFile', 'toFile'] as $option) { + if (!\is_string($options[$option])) { + throw new ConfigurationException($option, 'a string', $options[$option]); + } + } + + foreach (['fromFileDate', 'toFileDate'] as $option) { + if (null !== $options[$option] && !\is_string($options[$option])) { + throw new ConfigurationException($option, 'a string or ', $options[$option]); + } + } + + $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 has trailing linebreak, else add under it 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; + + 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 where 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 + //} + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php new file mode 100644 index 0000000000..e7f0a9d064 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Output/UnifiedDiffOutputBuilder.php @@ -0,0 +1,264 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff\Output; + +use SebastianBergmann\Diff\Differ; + +/** + * Builds a diff string representation in unified diff format in chunks. + */ +final class UnifiedDiffOutputBuilder extends AbstractChunkOutputBuilder +{ + /** + * @var bool + */ + private $collapseRanges = true; + + /** + * @var int >= 0 + */ + private $commonLineThreshold = 6; + + /** + * @var int >= 0 + */ + private $contextLines = 3; + + /** + * @var string + */ + private $header; + + /** + * @var bool + */ + private $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 ("\n" !== \substr($this->header, -1, 1)) { + \fwrite($buffer, "\n"); + } + } + + if (0 !== \count($diff)) { + $this->writeDiffHunks($buffer, $diff); + } + + $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 has trailing linebreak, else add under it 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; + + 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 where 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]); + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Parser.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Parser.php new file mode 100644 index 0000000000..3c52f4365b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/Parser.php @@ -0,0 +1,106 @@ + + * + * 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. + */ +final class Parser +{ + /** + * @param string $string + * + * @return Diff[] + */ + public function parse(string $string): array + { + $lines = \preg_split('(\r\n|\r|\n)', $string); + + if (!empty($lines) && $lines[\count($lines) - 1] === '') { + \array_pop($lines); + } + + $lineCount = \count($lines); + $diffs = []; + $diff = null; + $collected = []; + + 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 = []; + } + + $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; + } + + private function parseFileDiff(Diff $diff, array $lines): void + { + $chunks = []; + $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( + (int) $match['start'], + isset($match['startrange']) ? \max(1, (int) $match['startrange']) : 1, + (int) $match['end'], + isset($match['endrange']) ? \max(1, (int) $match['endrange']) : 1 + ); + + $chunks[] = $chunk; + $diffLines = []; + + 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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php new file mode 100644 index 0000000000..97dadbd587 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\Diff; + +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; + $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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ChunkTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ChunkTest.php new file mode 100644 index 0000000000..40106c0ee7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ChunkTest.php @@ -0,0 +1,73 @@ + + * + * 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 + */ +final class ChunkTest extends TestCase +{ + /** + * @var Chunk + */ + private $chunk; + + protected function setUp(): void + { + $this->chunk = new Chunk; + } + + public function testHasInitiallyNoLines(): void + { + $this->assertSame([], $this->chunk->getLines()); + } + + public function testCanBeCreatedWithoutArguments(): void + { + $this->assertInstanceOf(Chunk::class, $this->chunk); + } + + public function testStartCanBeRetrieved(): void + { + $this->assertSame(0, $this->chunk->getStart()); + } + + public function testStartRangeCanBeRetrieved(): void + { + $this->assertSame(1, $this->chunk->getStartRange()); + } + + public function testEndCanBeRetrieved(): void + { + $this->assertSame(0, $this->chunk->getEnd()); + } + + public function testEndRangeCanBeRetrieved(): void + { + $this->assertSame(1, $this->chunk->getEndRange()); + } + + public function testLinesCanBeRetrieved(): void + { + $this->assertSame([], $this->chunk->getLines()); + } + + public function testLinesCanBeSet(): void + { + $lines = [new Line(Line::ADDED, 'added'), new Line(Line::REMOVED, 'removed')]; + + $this->chunk->setLines($lines); + + $this->assertSame($lines, $this->chunk->getLines()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DiffTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DiffTest.php new file mode 100644 index 0000000000..20f76e15d3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DiffTest.php @@ -0,0 +1,55 @@ + + * + * 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(): void + { + $from = 'line1a'; + $to = 'line2a'; + $diff = new Diff($from, $to); + + $this->assertSame($from, $diff->getFrom()); + $this->assertSame($to, $diff->getTo()); + $this->assertSame([], $diff->getChunks(), 'Expect chunks to be default value "array()".'); + } + + public function testGettersAfterConstructionWithChunks(): void + { + $from = 'line1b'; + $to = 'line2b'; + $chunks = [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(): void + { + $diff = new Diff('line1c', 'line2c'); + $this->assertSame([], $diff->getChunks(), 'Expect chunks to be default value "array()".'); + + $chunks = [new Chunk(), new Chunk(2, 3)]; + $diff->setChunks($chunks); + $this->assertSame($chunks, $diff->getChunks(), 'Expect chunks to be passed value.'); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DifferTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DifferTest.php new file mode 100644 index 0000000000..5a8962ef05 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/DifferTest.php @@ -0,0 +1,444 @@ + + * + * 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; +use SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder; + +/** + * @covers SebastianBergmann\Diff\Differ + * @covers SebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder + * + * @uses SebastianBergmann\Diff\MemoryEfficientLongestCommonSubsequenceCalculator + * @uses SebastianBergmann\Diff\TimeEfficientLongestCommonSubsequenceCalculator + * @uses SebastianBergmann\Diff\Output\AbstractChunkOutputBuilder + */ +final class DifferTest extends TestCase +{ + /** + * @var Differ + */ + private $differ; + + protected function setUp(): void + { + $this->differ = new Differ; + } + + /** + * @param array $expected + * @param array|string $from + * @param array|string $to + * + * @dataProvider arrayProvider + */ + public function testArrayRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation(array $expected, $from, $to): void + { + $this->assertSame($expected, $this->differ->diffToArray($from, $to, new TimeEfficientLongestCommonSubsequenceCalculator)); + } + + /** + * @param string $expected + * @param string $from + * @param string $to + * + * @dataProvider textProvider + */ + public function testTextRepresentationOfDiffCanBeRenderedUsingTimeEfficientLcsImplementation(string $expected, string $from, string $to): void + { + $this->assertSame($expected, $this->differ->diff($from, $to, new TimeEfficientLongestCommonSubsequenceCalculator)); + } + + /** + * @param array $expected + * @param array|string $from + * @param array|string $to + * + * @dataProvider arrayProvider + */ + public function testArrayRepresentationOfDiffCanBeRenderedUsingMemoryEfficientLcsImplementation(array $expected, $from, $to): void + { + $this->assertSame($expected, $this->differ->diffToArray($from, $to, new MemoryEfficientLongestCommonSubsequenceCalculator)); + } + + /** + * @param string $expected + * @param string $from + * @param string $to + * + * @dataProvider textProvider + */ + public function testTextRepresentationOfDiffCanBeRenderedUsingMemoryEfficientLcsImplementation(string $expected, string $from, string $to): void + { + $this->assertSame($expected, $this->differ->diff($from, $to, new MemoryEfficientLongestCommonSubsequenceCalculator)); + } + + public function testTypesOtherThanArrayAndStringCanBePassed(): void + { + $this->assertSame( + "--- Original\n+++ New\n@@ @@\n-1\n+2\n", + $this->differ->diff(1, 2) + ); + } + + public function testArrayDiffs(): void + { + $this->assertSame( + '--- Original ++++ New +@@ @@ +-one ++two +', + $this->differ->diff(['one'], ['two']) + ); + } + + public function arrayProvider(): array + { + return [ + [ + [ + ['a', Differ::REMOVED], + ['b', Differ::ADDED], + ], + 'a', + 'b', + ], + [ + [ + ['ba', Differ::REMOVED], + ['bc', Differ::ADDED], + ], + 'ba', + 'bc', + ], + [ + [ + ['ab', Differ::REMOVED], + ['cb', Differ::ADDED], + ], + 'ab', + 'cb', + ], + [ + [ + ['abc', Differ::REMOVED], + ['adc', Differ::ADDED], + ], + 'abc', + 'adc', + ], + [ + [ + ['ab', Differ::REMOVED], + ['abc', Differ::ADDED], + ], + 'ab', + 'abc', + ], + [ + [ + ['bc', Differ::REMOVED], + ['abc', Differ::ADDED], + ], + 'bc', + 'abc', + ], + [ + [ + ['abc', Differ::REMOVED], + ['abbc', Differ::ADDED], + ], + 'abc', + 'abbc', + ], + [ + [ + ['abcdde', Differ::REMOVED], + ['abcde', Differ::ADDED], + ], + 'abcdde', + 'abcde', + ], + 'same start' => [ + [ + [17, Differ::OLD], + ['b', Differ::REMOVED], + ['d', Differ::ADDED], + ], + [30 => 17, 'a' => 'b'], + [30 => 17, 'c' => 'd'], + ], + 'same end' => [ + [ + [1, Differ::REMOVED], + [2, Differ::ADDED], + ['b', Differ::OLD], + ], + [1 => 1, 'a' => 'b'], + [1 => 2, 'a' => 'b'], + ], + 'same start (2), same end (1)' => [ + [ + [17, Differ::OLD], + [2, Differ::OLD], + [4, Differ::REMOVED], + ['a', Differ::ADDED], + [5, Differ::ADDED], + ['x', Differ::OLD], + ], + [30 => 17, 1 => 2, 2 => 4, 'z' => 'x'], + [30 => 17, 1 => 2, 3 => 'a', 2 => 5, 'z' => 'x'], + ], + 'same' => [ + [ + ['x', Differ::OLD], + ], + ['z' => 'x'], + ['z' => 'x'], + ], + 'diff' => [ + [ + ['y', Differ::REMOVED], + ['x', Differ::ADDED], + ], + ['x' => 'y'], + ['z' => 'x'], + ], + 'diff 2' => [ + [ + ['y', Differ::REMOVED], + ['b', Differ::REMOVED], + ['x', Differ::ADDED], + ['d', Differ::ADDED], + ], + ['x' => 'y', 'a' => 'b'], + ['z' => 'x', 'c' => 'd'], + ], + 'test line diff detection' => [ + [ + [ + "#Warning: Strings contain different line endings!\n", + Differ::DIFF_LINE_END_WARNING, + ], + [ + " [ + [ + [ + "#Warning: Strings contain different line endings!\n", + Differ::DIFF_LINE_END_WARNING, + ], + [ + "expectException(InvalidArgumentException::class); + $this->expectExceptionMessageRegExp('#^"from" must be an array or string\.$#'); + + $this->differ->diffToArray(null, ''); + } + + public function testDiffInvalidToType(): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessageRegExp('#^"to" must be an array or string\.$#'); + + $this->differ->diffToArray('', new \stdClass); + } + + /** + * @param array $expected + * @param string $input + * + * @dataProvider provideSplitStringByLinesCases + */ + public function testSplitStringByLines(array $expected, string $input): void + { + $reflection = new \ReflectionObject($this->differ); + $method = $reflection->getMethod('splitStringByLines'); + $method->setAccessible(true); + + $this->assertSame($expected, $method->invoke($this->differ, $input)); + } + + public function provideSplitStringByLinesCases(): array + { + return [ + [ + [], + '', + ], + [ + ['a'], + 'a', + ], + [ + ["a\n"], + "a\n", + ], + [ + ["a\r"], + "a\r", + ], + [ + ["a\r\n"], + "a\r\n", + ], + [ + ["\n"], + "\n", + ], + [ + ["\r"], + "\r", + ], + [ + ["\r\n"], + "\r\n", + ], + [ + [ + "A\n", + "B\n", + "\n", + "C\n", + ], + "A\nB\n\nC\n", + ], + [ + [ + "A\r\n", + "B\n", + "\n", + "C\r", + ], + "A\r\nB\n\nC\r", + ], + [ + [ + "\n", + "A\r\n", + "B\n", + "\n", + 'C', + ], + "\nA\r\nB\n\nC", + ], + ]; + } + + public function testConstructorInvalidArgInt(): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessageRegExp('/^Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got integer "1"\.$/'); + + new Differ(1); + } + + public function testConstructorInvalidArgObject(): void + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessageRegExp('/^Expected builder to be an instance of DiffOutputBuilderInterface, or a string, got instance of "SplFileInfo"\.$/'); + + new Differ(new \SplFileInfo(__FILE__)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/ConfigurationExceptionTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/ConfigurationExceptionTest.php new file mode 100644 index 0000000000..1ce887a733 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/ConfigurationExceptionTest.php @@ -0,0 +1,41 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/InvalidArgumentExceptionTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/InvalidArgumentExceptionTest.php new file mode 100644 index 0000000000..a112920c41 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Exception/InvalidArgumentExceptionTest.php @@ -0,0 +1,33 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LineTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LineTest.php new file mode 100644 index 0000000000..5aca39b25b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LineTest.php @@ -0,0 +1,44 @@ + + * + * 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 + */ +final class LineTest extends TestCase +{ + /** + * @var Line + */ + private $line; + + protected function setUp(): void + { + $this->line = new Line; + } + + public function testCanBeCreatedWithoutArguments(): void + { + $this->assertInstanceOf(Line::class, $this->line); + } + + public function testTypeCanBeRetrieved(): void + { + $this->assertSame(Line::UNCHANGED, $this->line->getType()); + } + + public function testContentCanBeRetrieved(): void + { + $this->assertSame('', $this->line->getContent()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LongestCommonSubsequenceTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LongestCommonSubsequenceTest.php new file mode 100644 index 0000000000..28d2809fbb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/LongestCommonSubsequenceTest.php @@ -0,0 +1,201 @@ + + * + * 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; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/MemoryEfficientImplementationTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/MemoryEfficientImplementationTest.php new file mode 100644 index 0000000000..a8a21e2eac --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/MemoryEfficientImplementationTest.php @@ -0,0 +1,22 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/AbstractChunkOutputBuilderTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/AbstractChunkOutputBuilderTest.php new file mode 100644 index 0000000000..ad6ceb2c44 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/AbstractChunkOutputBuilderTest.php @@ -0,0 +1,152 @@ + + * + * 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", + ], + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/DiffOnlyOutputBuilderTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/DiffOnlyOutputBuilderTest.php new file mode 100644 index 0000000000..87c0176017 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/DiffOnlyOutputBuilderTest.php @@ -0,0 +1,76 @@ + + * + * 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", + ], + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php new file mode 100644 index 0000000000..d15f445781 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php @@ -0,0 +1,299 @@ + + * + * 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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php new file mode 100644 index 0000000000..c3fe0575bd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php @@ -0,0 +1,163 @@ + + * + * 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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.php new file mode 100644 index 0000000000..56d3a1e24b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderDataProvider.php @@ -0,0 +1,189 @@ + + * + * 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', + ], + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderTest.php new file mode 100644 index 0000000000..64cb25b2cf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/StrictUnifiedDiffOutputBuilderTest.php @@ -0,0 +1,684 @@ + + * + * 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)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/UnifiedDiffOutputBuilderDataProvider.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/UnifiedDiffOutputBuilderDataProvider.php new file mode 100644 index 0000000000..391a9b1510 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Output/UnifiedDiffOutputBuilderDataProvider.php @@ -0,0 +1,396 @@ + + * + * 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\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(); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ParserTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ParserTest.php new file mode 100644 index 0000000000..69bf4644a9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/ParserTest.php @@ -0,0 +1,170 @@ + + * + * 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; +use SebastianBergmann\Diff\Utils\FileUtils; + +/** + * @covers SebastianBergmann\Diff\Parser + * + * @uses SebastianBergmann\Diff\Chunk + * @uses SebastianBergmann\Diff\Diff + * @uses SebastianBergmann\Diff\Line + */ +final class ParserTest extends TestCase +{ + /** + * @var Parser + */ + private $parser; + + protected function setUp(): void + { + $this->parser = new Parser; + } + + public function testParse(): void + { + $content = FileUtils::getFileContent(__DIR__ . '/fixtures/patch.txt'); + + $diffs = $this->parser->parse($content); + + $this->assertContainsOnlyInstancesOf(Diff::class, $diffs); + $this->assertCount(1, $diffs); + + $chunks = $diffs[0]->getChunks(); + $this->assertContainsOnlyInstancesOf(Chunk::class, $chunks); + + $this->assertCount(1, $chunks); + + $this->assertSame(20, $chunks[0]->getStart()); + + $this->assertCount(4, $chunks[0]->getLines()); + } + + public function testParseWithMultipleChunks(): void + { + $content = FileUtils::getFileContent(__DIR__ . '/fixtures/patch2.txt'); + + $diffs = $this->parser->parse($content); + + $this->assertCount(1, $diffs); + + $chunks = $diffs[0]->getChunks(); + $this->assertCount(3, $chunks); + + $this->assertSame(20, $chunks[0]->getStart()); + $this->assertSame(320, $chunks[1]->getStart()); + $this->assertSame(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(): void + { + $content = <<parser->parse($content); + $this->assertContainsOnlyInstancesOf(Diff::class, $diffs); + $this->assertCount(1, $diffs); + + $chunks = $diffs[0]->getChunks(); + + $this->assertContainsOnlyInstancesOf(Chunk::class, $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->assertContainsOnlyInstancesOf(Line::class, $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(): void + { + $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()); + } + + /** + * @param string $diff + * @param Diff[] $expected + * + * @dataProvider diffProvider + */ + public function testParser(string $diff, array $expected): void + { + $result = $this->parser->parse($diff); + + $this->assertEquals($expected, $result); + } + + public function diffProvider(): array + { + return [ + [ + "--- old.txt 2014-11-04 08:51:02.661868729 +0300\n+++ new.txt 2014-11-04 08:51:02.665868730 +0300\n@@ -1,3 +1,4 @@\n+2222111\n 1111111\n 1111111\n 1111111\n@@ -5,10 +6,8 @@\n 1111111\n 1111111\n 1111111\n +1121211\n 1111111\n -1111111\n -1111111\n -2222222\n 2222222\n 2222222\n 2222222\n@@ -17,5 +16,6 @@\n 2222222\n 2222222\n 2222222\n +2122212\n 2222222\n 2222222\n", + \unserialize(FileUtils::getFileContent(__DIR__ . '/fixtures/serialized_diff.bin')), + ], + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/TimeEfficientImplementationTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/TimeEfficientImplementationTest.php new file mode 100644 index 0000000000..2bb683d67d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/TimeEfficientImplementationTest.php @@ -0,0 +1,22 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/FileUtils.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/FileUtils.php new file mode 100644 index 0000000000..36e76fa015 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/FileUtils.php @@ -0,0 +1,31 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTrait.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTrait.php new file mode 100644 index 0000000000..40ab44cc41 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTrait.php @@ -0,0 +1,277 @@ + + * + * 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), + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.php new file mode 100644 index 0000000000..c88dc52e7d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitIntegrationTest.php @@ -0,0 +1,129 @@ + + * + * 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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitTest.php b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitTest.php new file mode 100644 index 0000000000..7d5cc65451 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/Utils/UnifiedDiffAssertTraitTest.php @@ -0,0 +1,434 @@ + + * + * 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 + ' . ' +' + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/.editorconfig b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/.editorconfig new file mode 100644 index 0000000000..78b36ca083 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/.editorconfig @@ -0,0 +1 @@ +root = true diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txt b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txt new file mode 100644 index 0000000000..2e65efe2a1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_a.txt @@ -0,0 +1 @@ +a \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txt b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/1_b.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txt b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txt new file mode 100644 index 0000000000..c7fe26e985 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_a.txt @@ -0,0 +1,35 @@ +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 +a \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txt b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txt new file mode 100644 index 0000000000..377a70f808 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/UnifiedDiffAssertTraitIntegrationTest/2_b.txt @@ -0,0 +1,18 @@ +a +a +a +a +a +a +a +a +a +a +b +a +a +a +a +a +a +c \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.editorconfig b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.editorconfig new file mode 100644 index 0000000000..78b36ca083 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.editorconfig @@ -0,0 +1 @@ +root = true diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.gitignore new file mode 100644 index 0000000000..f6f7a47845 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/out/.gitignore @@ -0,0 +1,2 @@ +# reset all ignore rules to create sandbox for integration test +!/** \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch.txt b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch.txt new file mode 100644 index 0000000000..144b61d015 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch.txt @@ -0,0 +1,9 @@ +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; diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch2.txt b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch2.txt new file mode 100644 index 0000000000..41fbc9597a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/patch2.txt @@ -0,0 +1,21 @@ +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'; + } diff --git a/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/serialized_diff.bin b/pandora_console/godmode/um_client/vendor/sebastian/diff/tests/fixtures/serialized_diff.bin new file mode 100644 index 0000000000000000000000000000000000000000..377404d442d6e690beef8f276a647492d1b5c850 GIT binary patch literal 4143 zcmeH~O;5ux42Jt#az&t}X}jUxfFlwTT)C7j8x>oM)*wLB{yVn2l_Jqk4K)W+snR4n zeQd{hy#yreQkcYd;7>t3=%*yNX=1MQcC|^2dAv!NOMVGZu**Ry5MG0sx7=nM5$Axr zW$VR-{jl^)$rd-89h{7QFP*{`r}^`ndC5hb5ZfV&S#1>8WGx`%FdDXIJ1@7%7SU6X zh#ySqNh;>|iCJm#Q514RrV1Zz7RL`L#I8$gXoIYF76`V!xwu>ilV z#AN2#&sUC;GNYn;a5kQ2#%jZd0Ke|zl2VFzPl;_jbVGBaiNVCcE6FBOL4hMnetz + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/environment/.travis.yml new file mode 100644 index 0000000000..e066fa935c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/.travis.yml @@ -0,0 +1,28 @@ +language: php + +php: + - 7.1 + - 7.2 + - 7.3 + - 7.4snapshot + +env: + matrix: + - DRIVER="phpdbg" + - DRIVER="xdebug" + +before_install: + - composer clear-cache + +install: + - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest + +script: + - if [[ "$DRIVER" = 'phpdbg' ]]; then phpdbg -qrr vendor/bin/phpunit --coverage-clover=coverage.xml; fi + - if [[ "$DRIVER" != 'phpdbg' ]]; then vendor/bin/phpunit --coverage-clover=coverage.xml; fi + +after_success: + - bash <(curl -s https://codecov.io/bash) + +notifications: + email: false diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/environment/ChangeLog.md new file mode 100644 index 0000000000..172a8db8cf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/ChangeLog.md @@ -0,0 +1,127 @@ +# Changes in sebastianbergmann/environment + +All notable changes in `sebastianbergmann/environment` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [4.2.4] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` + +## [4.2.3] - 2019-11-20 + +### Changed + +* Implemented [#50](https://github.com/sebastianbergmann/environment/pull/50): Windows improvements to console capabilities + +### Fixed + +* 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 + +* 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 + +* Implemented [#36](https://github.com/sebastianbergmann/environment/pull/36): `Runtime::getCurrentSettings()` + +## [4.1.0] - 2019-02-01 + +### Added + +* Implemented `Runtime::getNameWithVersionAndCodeCoverageDriver()` method +* Implemented [#34](https://github.com/sebastianbergmann/environment/pull/34): Support for PCOV extension + +## [4.0.2] - 2019-01-28 + +### Fixed + +* 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 + +* Fixed [#31](https://github.com/sebastianbergmann/environment/issues/31): Regressions in `Console` class + +## [4.0.0] - 2018-10-23 [YANKED] + +### Fixed + +* 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 + +* Implemented [#21](https://github.com/sebastianbergmann/environment/issues/21): Equivalent of `PHP_OS_FAMILY` (for PHP < 7.2) + +## [3.0.4] - 2017-06-20 + +### Fixed + +* Fixed [#20](https://github.com/sebastianbergmann/environment/pull/20): PHP 7 mode of HHVM not forced + +## [3.0.3] - 2017-05-18 + +### Fixed + +* 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 + +* 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 + +[4.2.4]: https://github.com/sebastianbergmann/phpunit/compare/4.2.3...4.2.4 +[4.2.3]: https://github.com/sebastianbergmann/phpunit/compare/4.2.2...4.2.3 +[4.2.2]: https://github.com/sebastianbergmann/phpunit/compare/4.2.1...4.2.2 +[4.2.1]: https://github.com/sebastianbergmann/phpunit/compare/4.2.0...4.2.1 +[4.2.0]: https://github.com/sebastianbergmann/phpunit/compare/4.1.0...4.2.0 +[4.1.0]: https://github.com/sebastianbergmann/phpunit/compare/4.0.2...4.1.0 +[4.0.2]: https://github.com/sebastianbergmann/phpunit/compare/4.0.1...4.0.2 +[4.0.1]: https://github.com/sebastianbergmann/phpunit/compare/66691f8e2dc4641909166b275a9a4f45c0e89092...4.0.1 +[4.0.0]: https://github.com/sebastianbergmann/phpunit/compare/3.1.0...66691f8e2dc4641909166b275a9a4f45c0e89092 +[3.1.0]: https://github.com/sebastianbergmann/phpunit/compare/3.0...3.1.0 +[3.0.4]: https://github.com/sebastianbergmann/phpunit/compare/3.0.3...3.0.4 +[3.0.3]: https://github.com/sebastianbergmann/phpunit/compare/3.0.2...3.0.3 +[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...3.0.0 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/environment/LICENSE new file mode 100644 index 0000000000..3291fbdfa8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/LICENSE @@ -0,0 +1,33 @@ +sebastian/environment + +Copyright (c) 2014-2019, 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/README.md b/pandora_console/godmode/um_client/vendor/sebastian/environment/README.md new file mode 100644 index 0000000000..3e854af354 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/README.md @@ -0,0 +1,17 @@ +# sebastian/environment + +This component provides functionality that helps writing PHP code that has runtime-specific (PHP / HHVM) execution paths. + +[![Latest Stable Version](https://img.shields.io/packagist/v/sebastian/environment.svg?style=flat-square)](https://packagist.org/packages/sebastian/environment) +[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%207.1-8892BF.svg?style=flat-square)](https://php.net/) +[![Build Status](https://travis-ci.org/sebastianbergmann/environment.svg?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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/environment/build.xml new file mode 100644 index 0000000000..591a58bbfc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/build.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/environment/composer.json new file mode 100644 index 0000000000..d02bb384aa --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/composer.json @@ -0,0 +1,37 @@ +{ + "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" + } + ], + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "prefer-stable": true, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "suggest": { + "ext-posix": "*" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/environment/phpunit.xml new file mode 100644 index 0000000000..01852650c1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/phpunit.xml @@ -0,0 +1,20 @@ + + + + + tests + + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/src/Console.php b/pandora_console/godmode/um_client/vendor/sebastian/environment/src/Console.php new file mode 100644 index 0000000000..947dacfc77 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/src/Console.php @@ -0,0 +1,164 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Environment; + +final class Console +{ + /** + * @var int + */ + public const STDIN = 0; + + /** + * @var int + */ + public const STDOUT = 1; + + /** + * @var int + */ + public const STDERR = 2; + + /** + * Returns true if STDOUT supports colorization. + * + * This code has been copied and adapted from + * Symfony\Component\Console\Output\StreamOutput. + */ + public function hasColorSupport(): bool + { + if ('Hyper' === \getenv('TERM_PROGRAM')) { + return true; + } + + if ($this->isWindows()) { + // @codeCoverageIgnoreStart + return (\defined('STDOUT') && \function_exists('sapi_windows_vt100_support') && @\sapi_windows_vt100_support(\STDOUT)) + || false !== \getenv('ANSICON') + || 'ON' === \getenv('ConEmuANSI') + || 'xterm' === \getenv('TERM'); + // @codeCoverageIgnoreEnd + } + + if (!\defined('STDOUT')) { + // @codeCoverageIgnoreStart + return false; + // @codeCoverageIgnoreEnd + } + + return $this->isInteractive(\STDOUT); + } + + /** + * Returns the number of columns of the terminal. + * + * @codeCoverageIgnore + */ + public function getNumberOfColumns(): int + { + if (!$this->isInteractive(\defined('STDIN') ? \STDIN : self::STDIN)) { + return 80; + } + + if ($this->isWindows()) { + return $this->getNumberOfColumnsWindows(); + } + + return $this->getNumberOfColumnsInteractive(); + } + + /** + * Returns if the file descriptor is an interactive terminal or not. + * + * Normally, we want to use a resource as a parameter, yet sadly it's not always awailable, + * eg when running code in interactive console (`php -a`), STDIN/STDOUT/STDERR constants are not defined. + * + * @param int|resource $fileDescriptor + */ + public function isInteractive($fileDescriptor = self::STDOUT): bool + { + if (\is_resource($fileDescriptor)) { + // These functions require a descriptor that is a real resource, not a numeric ID of it + if (\function_exists('stream_isatty') && @\stream_isatty($fileDescriptor)) { + return true; + } + + $stat = @\fstat(\STDOUT); + // Check if formatted mode is S_IFCHR + return $stat ? 0020000 === ($stat['mode'] & 0170000) : false; + } + + return \function_exists('posix_isatty') && @\posix_isatty($fileDescriptor); + } + + private function isWindows(): bool + { + return \DIRECTORY_SEPARATOR === '\\'; + } + + /** + * @codeCoverageIgnore + */ + private function getNumberOfColumnsInteractive(): int + { + 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; + } + + /** + * @codeCoverageIgnore + */ + private function getNumberOfColumnsWindows(): int + { + $ansicon = \getenv('ANSICON'); + $columns = 80; + + if (\is_string($ansicon) && \preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', \trim($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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/src/OperatingSystem.php b/pandora_console/godmode/um_client/vendor/sebastian/environment/src/OperatingSystem.php new file mode 100644 index 0000000000..67a35bc9a7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/src/OperatingSystem.php @@ -0,0 +1,48 @@ + + * + * 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'; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/src/Runtime.php b/pandora_console/godmode/um_client/vendor/sebastian/environment/src/Runtime.php new file mode 100644 index 0000000000..0cbc4db672 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/src/Runtime.php @@ -0,0 +1,265 @@ + + * + * 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. + */ +final class Runtime +{ + /** + * @var string + */ + private static $binary; + + /** + * Returns true when Xdebug or PCOV is available or + * the runtime used is PHPDBG. + */ + public function canCollectCodeCoverage(): bool + { + return $this->hasXdebug() || $this->hasPCOV() || $this->hasPHPDBGCodeCoverage(); + } + + /** + * Returns true when Zend OPcache is loaded, enabled, and is configured to discard comments. + */ + public function discardsComments(): bool + { + if (!\extension_loaded('Zend OPcache')) { + return false; + } + + if (\ini_get('opcache.save_comments') !== '0') { + return false; + } + + if ((\PHP_SAPI === 'cli' || \PHP_SAPI === 'phpdbg') && \ini_get('opcache.enable_cli') === '1') { + return true; + } + + if (\PHP_SAPI !== 'cli' && \PHP_SAPI !== 'phpdbg' && \ini_get('opcache.enable') === '1') { + return true; + } + + return false; + } + + /** + * Returns the path to the binary of the current runtime. + * Appends ' --php' to the path when the runtime is HHVM. + */ + public function getBinary(): string + { + // HHVM + if (self::$binary === null && $this->isHHVM()) { + // @codeCoverageIgnoreStart + if ((self::$binary = \getenv('PHP_BINARY')) === false) { + self::$binary = \PHP_BINARY; + } + + self::$binary = \escapeshellarg(self::$binary) . ' --php' . + ' -d hhvm.php7.all=1'; + // @codeCoverageIgnoreEnd + } + + if (self::$binary === null && \PHP_BINARY !== '') { + self::$binary = \escapeshellarg(\PHP_BINARY); + } + + if (self::$binary === null) { + // @codeCoverageIgnoreStart + $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; + } + } + // @codeCoverageIgnoreEnd + } + + if (self::$binary === null) { + // @codeCoverageIgnoreStart + self::$binary = 'php'; + // @codeCoverageIgnoreEnd + } + + return self::$binary; + } + + public function getNameWithVersion(): string + { + return $this->getName() . ' ' . $this->getVersion(); + } + + public function getNameWithVersionAndCodeCoverageDriver(): string + { + if (!$this->canCollectCodeCoverage() || $this->hasPHPDBGCodeCoverage()) { + return $this->getNameWithVersion(); + } + + if ($this->hasXdebug()) { + return \sprintf( + '%s with Xdebug %s', + $this->getNameWithVersion(), + \phpversion('xdebug') + ); + } + + if ($this->hasPCOV()) { + return \sprintf( + '%s with PCOV %s', + $this->getNameWithVersion(), + \phpversion('pcov') + ); + } + } + + public function getName(): string + { + if ($this->isHHVM()) { + // @codeCoverageIgnoreStart + return 'HHVM'; + // @codeCoverageIgnoreEnd + } + + if ($this->isPHPDBG()) { + // @codeCoverageIgnoreStart + return 'PHPDBG'; + // @codeCoverageIgnoreEnd + } + + return 'PHP'; + } + + public function getVendorUrl(): string + { + if ($this->isHHVM()) { + // @codeCoverageIgnoreStart + return 'http://hhvm.com/'; + // @codeCoverageIgnoreEnd + } + + return 'https://secure.php.net/'; + } + + public function getVersion(): string + { + if ($this->isHHVM()) { + // @codeCoverageIgnoreStart + return HHVM_VERSION; + // @codeCoverageIgnoreEnd + } + + return \PHP_VERSION; + } + + /** + * Returns true when the runtime used is PHP and Xdebug is loaded. + */ + public function hasXdebug(): bool + { + return ($this->isPHP() || $this->isHHVM()) && \extension_loaded('xdebug'); + } + + /** + * Returns true when the runtime used is HHVM. + */ + public function isHHVM(): bool + { + return \defined('HHVM_VERSION'); + } + + /** + * Returns true when the runtime used is PHP without the PHPDBG SAPI. + */ + public function isPHP(): bool + { + return !$this->isHHVM() && !$this->isPHPDBG(); + } + + /** + * Returns true when the runtime used is PHP with the PHPDBG SAPI. + */ + public function isPHPDBG(): bool + { + 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). + */ + public function hasPHPDBGCodeCoverage(): bool + { + return $this->isPHPDBG(); + } + + /** + * Returns true when the runtime used is PHP with PCOV loaded and enabled + */ + public function hasPCOV(): bool + { + return $this->isPHP() && \extension_loaded('pcov') && \ini_get('pcov.enabled'); + } + + /** + * Parses the loaded php.ini file (if any) as well as all + * additional php.ini files from the additional ini dir for + * a list of all configuration settings loaded from files + * at startup. Then checks for each php.ini setting passed + * via the `$values` parameter whether this setting has + * been changed at runtime. Returns an array of strings + * where each string has the format `key=value` denoting + * the name of a changed php.ini setting with its new value. + * + * @return string[] + */ + public function getCurrentSettings(array $values): array + { + $diff = []; + $files = []; + + if ($file = \php_ini_loaded_file()) { + $files[] = $file; + } + + if ($scanned = \php_ini_scanned_files()) { + $files = \array_merge( + $files, + \array_map( + 'trim', + \explode(",\n", $scanned) + ) + ); + } + + foreach ($files as $ini) { + $config = \parse_ini_file($ini, true); + + foreach ($values as $value) { + $set = \ini_get($value); + + if (isset($config[$value]) && $set != $config[$value]) { + $diff[] = \sprintf('%s=%s', $value, $set); + } + } + } + + return $diff; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/ConsoleTest.php b/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/ConsoleTest.php new file mode 100644 index 0000000000..e7f6704693 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/ConsoleTest.php @@ -0,0 +1,64 @@ + + * + * 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\Console + */ +final class ConsoleTest extends TestCase +{ + /** + * @var \SebastianBergmann\Environment\Console + */ + private $console; + + protected function setUp(): void + { + $this->console = new Console; + } + + /** + * @todo Now that this component is PHP 7-only and uses return type declarations + * this test makes even less sense than before + */ + public function testCanDetectIfStdoutIsInteractiveByDefault(): void + { + $this->assertIsBool($this->console->isInteractive()); + } + + /** + * @todo Now that this component is PHP 7-only and uses return type declarations + * this test makes even less sense than before + */ + public function testCanDetectIfFileDescriptorIsInteractive(): void + { + $this->assertIsBool($this->console->isInteractive(\STDOUT)); + } + + /** + * @todo Now that this component is PHP 7-only and uses return type declarations + * this test makes even less sense than before + */ + public function testCanDetectColorSupport(): void + { + $this->assertIsBool($this->console->hasColorSupport()); + } + + /** + * @todo Now that this component is PHP 7-only and uses return type declarations + * this test makes even less sense than before + */ + public function testCanDetectNumberOfColumns(): void + { + $this->assertIsInt($this->console->getNumberOfColumns()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/OperatingSystemTest.php b/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/OperatingSystemTest.php new file mode 100644 index 0000000000..f48618e0ae --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/OperatingSystemTest.php @@ -0,0 +1,60 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/RuntimeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/RuntimeTest.php new file mode 100644 index 0000000000..12be2e5965 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/environment/tests/RuntimeTest.php @@ -0,0 +1,165 @@ + + * + * 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\Runtime + */ +final class RuntimeTest extends TestCase +{ + /** + * @var \SebastianBergmann\Environment\Runtime + */ + private $env; + + protected function setUp(): void + { + $this->env = new Runtime; + } + + /** + * @requires extension xdebug + */ + public function testCanCollectCodeCoverageWhenXdebugExtensionIsEnabled(): void + { + $this->assertTrue($this->env->canCollectCodeCoverage()); + } + + /** + * @requires extension pcov + */ + public function testCanCollectCodeCoverageWhenPcovExtensionIsEnabled(): void + { + $this->assertTrue($this->env->canCollectCodeCoverage()); + } + + public function testCanCollectCodeCoverageWhenRunningOnPhpdbg(): void + { + $this->markTestSkippedWhenNotRunningOnPhpdbg(); + + $this->assertTrue($this->env->canCollectCodeCoverage()); + } + + public function testBinaryCanBeRetrieved(): void + { + $this->assertNotEmpty($this->env->getBinary()); + } + + /** + * @requires PHP + */ + public function testIsHhvmReturnsFalseWhenRunningOnPhp(): void + { + $this->assertFalse($this->env->isHHVM()); + } + + /** + * @requires PHP + */ + public function testIsPhpReturnsTrueWhenRunningOnPhp(): void + { + $this->markTestSkippedWhenRunningOnPhpdbg(); + + $this->assertTrue($this->env->isPHP()); + } + + /** + * @requires extension pcov + */ + public function testPCOVCanBeDetected(): void + { + $this->assertTrue($this->env->hasPCOV()); + } + + public function testPhpdbgCanBeDetected(): void + { + $this->markTestSkippedWhenNotRunningOnPhpdbg(); + + $this->assertTrue($this->env->hasPHPDBGCodeCoverage()); + } + + /** + * @requires extension xdebug + */ + public function testXdebugCanBeDetected(): void + { + $this->markTestSkippedWhenRunningOnPhpdbg(); + + $this->assertTrue($this->env->hasXdebug()); + } + + public function testNameAndVersionCanBeRetrieved(): void + { + $this->assertNotEmpty($this->env->getNameWithVersion()); + } + + public function testGetNameReturnsPhpdbgWhenRunningOnPhpdbg(): void + { + $this->markTestSkippedWhenNotRunningOnPhpdbg(); + + $this->assertSame('PHPDBG', $this->env->getName()); + } + + /** + * @requires PHP + */ + public function testGetNameReturnsPhpdbgWhenRunningOnPhp(): void + { + $this->markTestSkippedWhenRunningOnPhpdbg(); + + $this->assertSame('PHP', $this->env->getName()); + } + + public function testNameAndCodeCoverageDriverCanBeRetrieved(): void + { + $this->assertNotEmpty($this->env->getNameWithVersionAndCodeCoverageDriver()); + } + + /** + * @requires PHP + */ + public function testGetVersionReturnsPhpVersionWhenRunningPhp(): void + { + $this->assertSame(\PHP_VERSION, $this->env->getVersion()); + } + + /** + * @requires PHP + */ + public function testGetVendorUrlReturnsPhpDotNetWhenRunningPhp(): void + { + $this->assertSame('https://secure.php.net/', $this->env->getVendorUrl()); + } + + private function markTestSkippedWhenNotRunningOnPhpdbg(): void + { + if ($this->isRunningOnPhpdbg()) { + return; + } + + $this->markTestSkipped('PHPDBG is required.'); + } + + private function markTestSkippedWhenRunningOnPhpdbg(): void + { + if (!$this->isRunningOnPhpdbg()) { + return; + } + + $this->markTestSkipped('Cannot run on PHPDBG'); + } + + private function isRunningOnPhpdbg(): bool + { + return \PHP_SAPI === 'phpdbg'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/.github/FUNDING.yml b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.github/FUNDING.yml new file mode 100644 index 0000000000..b19ea81a02 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.github/FUNDING.yml @@ -0,0 +1 @@ +patreon: s_bergmann diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.gitignore new file mode 100644 index 0000000000..c79ecfa8be --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.gitignore @@ -0,0 +1,5 @@ +/.idea +/composer.lock +/vendor +/.php_cs +/.php_cs.cache diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/.php_cs.dist b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.php_cs.dist new file mode 100644 index 0000000000..c072f5b111 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.php_cs.dist @@ -0,0 +1,190 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.travis.yml new file mode 100644 index 0000000000..7f3e35bb87 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/.travis.yml @@ -0,0 +1,24 @@ +language: php + +php: + - 7.0 + - 7.1 + - 7.2 + - 7.3 + - 7.4snapshot + +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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/exporter/ChangeLog.md new file mode 100644 index 0000000000..150eeaa15a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/ChangeLog.md @@ -0,0 +1,22 @@ +# ChangeLog + +All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. + +## [3.1.3] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.0` to `>=7.0` + +## [3.1.2] - 2019-09-14 + +### Fixed + +* Fixed [#29](https://github.com/sebastianbergmann/exporter/pull/29): Second parameter for `str_repeat()` must be an integer + +### Removed + +* Remove HHVM-specific code that is no longer needed + +[3.1.3]: https://github.com/sebastianbergmann/exporter/compare/3.1.2...3.1.3 +[3.1.2]: https://github.com/sebastianbergmann/exporter/compare/3.1.1...3.1.2 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/exporter/LICENSE new file mode 100644 index 0000000000..f77dc5af55 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/LICENSE @@ -0,0 +1,33 @@ +Exporter + +Copyright (c) 2002-2019, 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/README.md b/pandora_console/godmode/um_client/vendor/sebastian/exporter/README.md new file mode 100644 index 0000000000..4c838ab3b7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/README.md @@ -0,0 +1,171 @@ +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 + '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( +<< + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/exporter/composer.json new file mode 100644 index 0000000000..50e3be75c9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/composer.json @@ -0,0 +1,53 @@ +{ + "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@gmail.com" + } + ], + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "prefer-stable": true, + "require": { + "php": ">=7.0", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0", + "ext-mbstring": "*" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + } +} + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/exporter/phpunit.xml new file mode 100644 index 0000000000..68febeb04d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/phpunit.xml @@ -0,0 +1,19 @@ + + + + tests + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/src/Exporter.php b/pandora_console/godmode/um_client/vendor/sebastian/exporter/src/Exporter.php new file mode 100644 index 0000000000..ea31b8091e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/src/Exporter.php @@ -0,0 +1,303 @@ + + * + * 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 int $indentation The indentation level of the 2nd+ line + * + * @return string + */ + public function export($value, $indentation = 0) + { + return $this->recursiveExport($value, $indentation); + } + + /** + * @param array $data + * @param Context $context + * + * @return string + */ + public function shortenedRecursiveExport(&$data, Context $context = null) + { + $result = []; + $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 '...'. + * + * @return string + * + * @see SebastianBergmann\Exporter\Exporter::export + */ + public function shortenedExport($value) + { + if (\is_string($value)) { + $string = \str_replace("\n", '', $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 $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. + * + * @return array + */ + public function toArray($value) + { + if (!\is_object($value)) { + return (array) $value; + } + + $array = []; + + foreach ((array) $value as $key => $val) { + // Exception traces commonly reference hundreds to thousands of + // objects currently loaded in memory. Including them in the result + // has a severe negative performance impact. + if ("\0Error\0trace" === $key || "\0Exception\0trace" === $key) { + continue; + } + + // 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(.+)$/', (string) $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) { + foreach ($value as $key => $val) { + $array[\spl_object_hash($val)] = [ + '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) && (float) ((int) $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( + '', + "\n", + \str_replace( + ["\r\n", "\n\r", "\r", "\n"], + ['\r\n', '\n\r', '\r', '\n'], + $value + ) + ) . + "'"; + } + + $whitespace = \str_repeat(' ', (int)(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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/exporter/tests/ExporterTest.php b/pandora_console/godmode/um_client/vendor/sebastian/exporter/tests/ExporterTest.php new file mode 100644 index 0000000000..7fac74cce3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/exporter/tests/ExporterTest.php @@ -0,0 +1,432 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Exporter; + +use PHPUnit\Framework\TestCase; +use SebastianBergmann\RecursionContext\Context; + +/** + * @covers SebastianBergmann\Exporter\Exporter + */ +class ExporterTest extends TestCase +{ + /** + * @var Exporter + */ + private $exporter; + + protected function setUp() + { + $this->exporter = new Exporter; + } + + public function exportProvider() + { + $obj2 = new \stdClass; + $obj2->foo = 'bar'; + + $obj3 = (object) [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 = ['foo' => 'bar']; + $obj->self = $obj; + + $storage = new \SplObjectStorage; + $storage->attach($obj2); + $storage->foo = $obj2; + + return [ + 'export null' => [null, 'null'], + 'export boolean true' => [true, 'true'], + 'export boolean false' => [false, 'false'], + 'export int 1' => [1, '1'], + 'export float 1.0' => [1.0, '1.0'], + 'export float 1.2' => [1.2, '1.2'], + 'export stream' => [\fopen('php://memory', 'r'), 'resource(%d) of type (stream)'], + 'export numeric string' => ['1', "'1'"], + 'export multidimentional array' => [[[1, 2, 3], [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 + 'export multiline text' => ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", + << [new \stdClass, 'stdClass Object &%x ()'], + 'export non empty stdclass' => [$obj, + << null + 'boolean' => true + 'integer' => 1 + 'double' => 1.2 + 'string' => '1' + 'text' => 'this\\n +is\\n +a\\n +very\\n +very\\n +very\\n +very\\n +very\\n +very\\r +long\\n\\r +text' + 'object' => stdClass Object &%x ( + 'foo' => 'bar' + ) + 'objectagain' => stdClass Object &%x + 'array' => Array &%d ( + 'foo' => 'bar' + ) + 'self' => stdClass Object &%x +) +EOF + ], + 'export empty array' => [[], 'Array &%d ()'], + 'export splObjectStorage' => [$storage, + << stdClass Object &%x ( + 'foo' => 'bar' + ) + '%x' => Array &0 ( + 'obj' => stdClass Object &%x + 'inf' => null + ) +) +EOF + ], + 'export stdClass with numeric properties' => [$obj3, + << 1 + 1 => 2 + 2 => 'Test\\r\\n +' + 3 => 4 + 4 => 5 + 5 => 6 + 6 => 7 + 7 => 8 +) +EOF + ], + [ + \chr(0) . \chr(1) . \chr(2) . \chr(3) . \chr(4) . \chr(5), + 'Binary String: 0x000102030405' + ], + [ + \implode('', \array_map('chr', \range(0x0e, 0x1f))), + 'Binary String: 0x0e0f101112131415161718191a1b1c1d1e1f' + ], + [ + \chr(0x00) . \chr(0x09), + 'Binary String: 0x0009' + ], + [ + '', + "''" + ], + 'export Exception without trace' => [ + new \Exception('The exception message', 42), + << 'The exception message' + 'string' => '' + 'code' => 42 + 'file' => '%s/tests/ExporterTest.php' + 'line' => %d + 'previous' => null +) +EOF + ], + 'export Error without trace' => [ + new \Error('The exception message', 42), + << 'The exception message' + 'string' => '' + 'code' => 42 + 'file' => '%s/tests/ExporterTest.php' + 'line' => %d + 'previous' => null +) +EOF + ], + ]; + } + + /** + * @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 = [ + 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' => ['foo' => 'bar'], + ]; + + $array['self'] = &$array; + + $expected = << 0 + 'null' => null + 'boolean' => true + 'integer' => 1 + 'double' => 1.2 + 'string' => '1' + 'text' => 'this\\n +is\\n +a\\n +very\\n +very\\n +very\\n +very\\n +very\\n +very\\r +long\\n\\r +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\\n +is\\n +a\\n +very\\n +very\\n +very\\n +very\\n +very\\n +very\\r +long\\n\\r +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 = [ + 'foo' => 'bar', + ]; + + return [ + 'shortened export null' => [null, 'null'], + 'shortened export boolean true' => [true, 'true'], + 'shortened export integer 1' => [1, '1'], + 'shortened export float 1.0' => [1.0, '1.0'], + 'shortened export float 1.2' => [1.2, '1.2'], + 'shortened export numeric string' => ['1', "'1'"], + // \n\r and \r is converted to \n + 'shortened export multilinestring' => ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", "'this\\nis\\na\\nvery\\nvery\\nvery...\\rtext'"], + 'shortened export empty stdClass' => [new \stdClass, 'stdClass Object ()'], + 'shortened export not empty stdClass' => [$obj, 'stdClass Object (...)'], + 'shortened export empty array' => [[], 'Array ()'], + 'shortened export not empty 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 [ + [\implode('', \array_map('chr', \range(0x09, 0x0d))), 9], + [\implode('', \array_map('chr', \range(0x20, 0x7f))), 96], + [\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([true], $this->exporter->toArray(true)); + } + + public function testIgnoreKeysInValue() + { + // Find out what the actual use case was with the PHP bug + $array = []; + $array["\0gcdata"] = ''; + + $this->assertEquals([], $this->exporter->toArray((object) $array)); + } + + private function trimNewline($string) + { + return \preg_replace('/[ ]*\n/', "\n", $string); + } + + /** + * @dataProvider shortenedRecursiveExportProvider + */ + public function testShortenedRecursiveExport(array $value, string $expected) + { + $this->assertEquals($expected, $this->exporter->shortenedRecursiveExport($value)); + } + + public function shortenedRecursiveExportProvider() + { + return [ + 'export null' => [[null], 'null'], + 'export boolean true' => [[true], 'true'], + 'export boolean false' => [[false], 'false'], + 'export int 1' => [[1], '1'], + 'export float 1.0' => [[1.0], '1.0'], + 'export float 1.2' => [[1.2], '1.2'], + 'export numeric string' => [['1'], "'1'"], + 'export with numeric array key' => [[2 => 1], '1'], + 'export with assoc array key' => [['foo' => 'bar'], '\'bar\''], + 'export multidimentional array' => [[[1, 2, 3], [3, 4, 5]], 'array(1, 2, 3), array(3, 4, 5)'], + 'export object' => [[new \stdClass], 'stdClass Object ()'], + ]; + } + + public function testShortenedRecursiveOccurredRecursion() + { + $recursiveValue = [1]; + $context = new Context(); + $context->add($recursiveValue); + + $value = [$recursiveValue]; + + $this->assertEquals('*RECURSION*', $this->exporter->shortenedRecursiveExport($value, $context)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/.github/stale.yml b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.github/stale.yml new file mode 100644 index 0000000000..4eadca3278 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.github/stale.yml @@ -0,0 +1,40 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.gitignore new file mode 100644 index 0000000000..96c0f28a61 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.gitignore @@ -0,0 +1,6 @@ +/.idea +/.php_cs +/.php_cs.cache +/.phpunit.result.cache +/composer.lock +/vendor diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/.php_cs.dist b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.php_cs.dist new file mode 100644 index 0000000000..c42d7e8b7a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.php_cs.dist @@ -0,0 +1,197 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.travis.yml new file mode 100644 index 0000000000..3a84127834 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/.travis.yml @@ -0,0 +1,24 @@ +language: php + +php: + - 7.2 + - 7.3 + - master + +sudo: false + +before_install: + - composer self-update + - composer clear-cache + +install: + - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest + +script: + - ./vendor/bin/phpunit --coverage-clover=coverage.xml + +after_success: + - bash <(curl -s https://codecov.io/bash) + +notifications: + email: false diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/global-state/ChangeLog.md new file mode 100644 index 0000000000..095cd55e9a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/ChangeLog.md @@ -0,0 +1,23 @@ +# 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. + +## [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 + +[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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/global-state/LICENSE new file mode 100644 index 0000000000..1756a1ff73 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/LICENSE @@ -0,0 +1,33 @@ +sebastian/global-state + +Copyright (c) 2001-2019, 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/README.md b/pandora_console/godmode/um_client/vendor/sebastian/global-state/README.md new file mode 100644 index 0000000000..a804f85c0f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/README.md @@ -0,0 +1,16 @@ +# global-state + +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 + +You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): + + composer require sebastian/global-state + +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/global-state + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/global-state/build.xml new file mode 100644 index 0000000000..35c179054a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/build.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/global-state/composer.json new file mode 100644 index 0000000000..0cbc33d7bb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/composer.json @@ -0,0 +1,48 @@ +{ + "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" + } + ], + "prefer-stable": true, + "config": { + "optimize-autoloader": true, + "sort-packages": true + }, + "require": { + "php": ">=7.2", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^8.0" + }, + "suggest": { + "ext-uopz": "*" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/_fixture/" + ], + "files": [ + "tests/_fixture/SnapshotFunctions.php" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/global-state/phpunit.xml new file mode 100644 index 0000000000..c02c9bc6a4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/phpunit.xml @@ -0,0 +1,27 @@ + + + + + tests + + + + + + + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Blacklist.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Blacklist.php new file mode 100644 index 0000000000..ce8f25c2f9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Blacklist.php @@ -0,0 +1,118 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\GlobalState; + +/** + * A blacklist for global state elements that should not be snapshotted. + */ +final class Blacklist +{ + /** + * @var array + */ + private $globalVariables = []; + + /** + * @var string[] + */ + private $classes = []; + + /** + * @var string[] + */ + private $classNamePrefixes = []; + + /** + * @var string[] + */ + private $parentClasses = []; + + /** + * @var string[] + */ + private $interfaces = []; + + /** + * @var array + */ + private $staticAttributes = []; + + 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 addStaticAttribute(string $className, string $attributeName): void + { + if (!isset($this->staticAttributes[$className])) { + $this->staticAttributes[$className] = []; + } + + $this->staticAttributes[$className][$attributeName] = true; + } + + public function isGlobalVariableBlacklisted(string $variableName): bool + { + return isset($this->globalVariables[$variableName]); + } + + public function isStaticAttributeBlacklisted(string $className, string $attributeName): bool + { + 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/CodeExporter.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/CodeExporter.php new file mode 100644 index 0000000000..860457b131 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/CodeExporter.php @@ -0,0 +1,91 @@ + + * + * 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. + */ +final class CodeExporter +{ + public function constants(Snapshot $snapshot): string + { + $result = ''; + + foreach ($snapshot->constants() as $name => $value) { + $result .= \sprintf( + 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", + $name, + $name, + $this->exportVariable($value) + ); + } + + return $result; + } + + public function globalVariables(Snapshot $snapshot): string + { + $result = '$GLOBALS = [];' . \PHP_EOL; + + foreach ($snapshot->globalVariables() as $name => $value) { + $result .= \sprintf( + '$GLOBALS[%s] = %s;' . \PHP_EOL, + $this->exportVariable($name), + $this->exportVariable($value) + ); + } + + return $result; + } + + public function iniSettings(Snapshot $snapshot): string + { + $result = ''; + + foreach ($snapshot->iniSettings() as $key => $value) { + $result .= \sprintf( + '@ini_set(%s, %s);' . "\n", + $this->exportVariable($key), + $this->exportVariable($value) + ); + } + + return $result; + } + + private function exportVariable($variable): string + { + if (\is_scalar($variable) || null === $variable || + (\is_array($variable) && $this->arrayOnlyContainsScalars($variable))) { + return \var_export($variable, true); + } + + return 'unserialize(' . \var_export(\serialize($variable), true) . ')'; + } + + private function arrayOnlyContainsScalars(array $array): bool + { + $result = true; + + foreach ($array as $element) { + if (\is_array($element)) { + $result = $this->arrayOnlyContainsScalars($element); + } elseif (!\is_scalar($element) && null !== $element) { + $result = false; + } + + if ($result === false) { + break; + } + } + + return $result; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Restorer.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Restorer.php new file mode 100644 index 0000000000..ed55d9fe0c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Restorer.php @@ -0,0 +1,132 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\GlobalState; + +/** + * Restorer of snapshots of global state. + */ +class Restorer +{ + /** + * Deletes function definitions that are not defined in a snapshot. + * + * @throws RuntimeException when the uopz_delete() function is not available + * + * @see https://github.com/krakjoe/uopz + */ + public function restoreFunctions(Snapshot $snapshot): void + { + 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. + */ + public function restoreGlobalVariables(Snapshot $snapshot): void + { + $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 (\array_key_exists($key, $globalVariables)) { + $GLOBALS[$key] = $globalVariables[$key]; + } else { + unset($GLOBALS[$key]); + } + } + } + } + + /** + * Restores all static attributes in user-defined classes from this snapshot. + */ + public function restoreStaticAttributes(Snapshot $snapshot): void + { + $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. + */ + private function restoreSuperGlobalArray(Snapshot $snapshot, string $superGlobalArray): void + { + $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]); + } + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Snapshot.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Snapshot.php new file mode 100644 index 0000000000..5a0e5c7a9c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/Snapshot.php @@ -0,0 +1,419 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\GlobalState; + +use SebastianBergmann\ObjectReflector\ObjectReflector; +use SebastianBergmann\RecursionContext\Context; + +/** + * A snapshot of global state. + */ +class Snapshot +{ + /** + * @var Blacklist + */ + private $blacklist; + + /** + * @var array + */ + private $globalVariables = []; + + /** + * @var array + */ + private $superGlobalArrays = []; + + /** + * @var array + */ + private $superGlobalVariables = []; + + /** + * @var array + */ + private $staticAttributes = []; + + /** + * @var array + */ + private $iniSettings = []; + + /** + * @var array + */ + private $includedFiles = []; + + /** + * @var array + */ + private $constants = []; + + /** + * @var array + */ + private $functions = []; + + /** + * @var array + */ + private $interfaces = []; + + /** + * @var array + */ + private $classes = []; + + /** + * @var array + */ + private $traits = []; + + /** + * Creates a snapshot of the current global state. + */ + public function __construct(Blacklist $blacklist = null, bool $includeGlobalVariables = true, bool $includeStaticAttributes = true, bool $includeConstants = true, bool $includeFunctions = true, bool $includeClasses = true, bool $includeInterfaces = true, bool $includeTraits = true, bool $includeIniSettings = true, bool $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(); + } + + $this->traits = \get_declared_traits(); + } + + public function blacklist(): Blacklist + { + return $this->blacklist; + } + + public function globalVariables(): array + { + return $this->globalVariables; + } + + public function superGlobalVariables(): array + { + return $this->superGlobalVariables; + } + + public function superGlobalArrays(): array + { + return $this->superGlobalArrays; + } + + public function staticAttributes(): array + { + return $this->staticAttributes; + } + + public function iniSettings(): array + { + return $this->iniSettings; + } + + public function includedFiles(): array + { + return $this->includedFiles; + } + + public function constants(): array + { + return $this->constants; + } + + public function functions(): array + { + return $this->functions; + } + + public function interfaces(): array + { + return $this->interfaces; + } + + public function classes(): array + { + return $this->classes; + } + + public function traits(): array + { + return $this->traits; + } + + /** + * Creates a snapshot user-defined constants. + */ + private function snapshotConstants(): void + { + $constants = \get_defined_constants(true); + + if (isset($constants['user'])) { + $this->constants = $constants['user']; + } + } + + /** + * Creates a snapshot user-defined functions. + */ + private function snapshotFunctions(): void + { + $functions = \get_defined_functions(); + + $this->functions = $functions['user']; + } + + /** + * Creates a snapshot user-defined classes. + */ + private function snapshotClasses(): void + { + 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(): void + { + 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(): void + { + $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)) { + /* @noinspection UnserializeExploitsInspection */ + $this->globalVariables[$key] = \unserialize(\serialize($GLOBALS[$key])); + } + } + } + + /** + * Creates a snapshot a super-global variable array. + */ + private function snapshotSuperGlobalArray(string $superGlobalArray): void + { + $this->superGlobalVariables[$superGlobalArray] = []; + + if (isset($GLOBALS[$superGlobalArray]) && \is_array($GLOBALS[$superGlobalArray])) { + foreach ($GLOBALS[$superGlobalArray] as $key => $value) { + /* @noinspection UnserializeExploitsInspection */ + $this->superGlobalVariables[$superGlobalArray][$key] = \unserialize(\serialize($value)); + } + } + } + + /** + * Creates a snapshot of all static attributes in user-defined classes. + */ + private function snapshotStaticAttributes(): void + { + foreach ($this->classes as $className) { + $class = new \ReflectionClass($className); + $snapshot = []; + + 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)) { + /* @noinspection UnserializeExploitsInspection */ + $snapshot[$name] = \unserialize(\serialize($value)); + } + } + } + + if (!empty($snapshot)) { + $this->staticAttributes[$className] = $snapshot; + } + } + } + + /** + * Returns a list of all super-global variable arrays. + */ + private function setupSuperGlobalArrays(): void + { + $this->superGlobalArrays = [ + '_ENV', + '_POST', + '_GET', + '_COOKIE', + '_SERVER', + '_FILES', + '_REQUEST', + ]; + } + + private function canBeSerialized($variable): bool + { + if (\is_scalar($variable) || $variable === null) { + return true; + } + + if (\is_resource($variable)) { + return false; + } + + foreach ($this->enumerateObjectsAndResources($variable) as $value) { + if (\is_resource($value)) { + return false; + } + + if (\is_object($value)) { + $class = new \ReflectionClass($value); + + if ($class->isAnonymous()) { + return false; + } + + try { + @\serialize($value); + } catch (\Throwable $t) { + return false; + } + } + } + + return true; + } + + private function enumerateObjectsAndResources($variable): array + { + if (isset(\func_get_args()[1])) { + $processed = \func_get_args()[1]; + } else { + $processed = new Context; + } + + $result = []; + + if ($processed->contains($variable)) { + return $result; + } + + $array = $variable; + $processed->add($variable); + + if (\is_array($variable)) { + foreach ($array as $element) { + if (!\is_array($element) && !\is_object($element) && !\is_resource($element)) { + continue; + } + + if (!\is_resource($element)) { + /** @noinspection SlowArrayOperationsInLoopInspection */ + $result = \array_merge( + $result, + $this->enumerateObjectsAndResources($element, $processed) + ); + } else { + $result[] = $element; + } + } + } else { + $result[] = $variable; + + foreach ((new ObjectReflector)->getAttributes($variable) as $value) { + if (!\is_array($value) && !\is_object($value) && !\is_resource($value)) { + continue; + } + + if (!\is_resource($value)) { + /** @noinspection SlowArrayOperationsInLoopInspection */ + $result = \array_merge( + $result, + $this->enumerateObjectsAndResources($value, $processed) + ); + } else { + $result[] = $value; + } + } + } + + return $result; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/Exception.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/Exception.php new file mode 100644 index 0000000000..d8fd3c3aaf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/Exception.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\GlobalState; + +interface Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/RuntimeException.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/RuntimeException.php new file mode 100644 index 0000000000..79f02a1141 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/src/exceptions/RuntimeException.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/BlacklistTest.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/BlacklistTest.php new file mode 100644 index 0000000000..4d1b64d381 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/BlacklistTest.php @@ -0,0 +1,117 @@ + + * + * 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; +use SebastianBergmann\GlobalState\TestFixture\BlacklistedChildClass; +use SebastianBergmann\GlobalState\TestFixture\BlacklistedClass; +use SebastianBergmann\GlobalState\TestFixture\BlacklistedImplementor; +use SebastianBergmann\GlobalState\TestFixture\BlacklistedInterface; + +/** + * @covers \SebastianBergmann\GlobalState\Blacklist + */ +final class BlacklistTest extends TestCase +{ + /** + * @var \SebastianBergmann\GlobalState\Blacklist + */ + private $blacklist; + + protected function setUp(): void + { + $this->blacklist = new Blacklist; + } + + public function testGlobalVariableThatIsNotBlacklistedIsNotTreatedAsBlacklisted(): void + { + $this->assertFalse($this->blacklist->isGlobalVariableBlacklisted('variable')); + } + + public function testGlobalVariableCanBeBlacklisted(): void + { + $this->blacklist->addGlobalVariable('variable'); + + $this->assertTrue($this->blacklist->isGlobalVariableBlacklisted('variable')); + } + + public function testStaticAttributeThatIsNotBlacklistedIsNotTreatedAsBlacklisted(): void + { + $this->assertFalse( + $this->blacklist->isStaticAttributeBlacklisted( + BlacklistedClass::class, + 'attribute' + ) + ); + } + + public function testClassCanBeBlacklisted(): void + { + $this->blacklist->addClass(BlacklistedClass::class); + + $this->assertTrue( + $this->blacklist->isStaticAttributeBlacklisted( + BlacklistedClass::class, + 'attribute' + ) + ); + } + + public function testSubclassesCanBeBlacklisted(): void + { + $this->blacklist->addSubclassesOf(BlacklistedClass::class); + + $this->assertTrue( + $this->blacklist->isStaticAttributeBlacklisted( + BlacklistedChildClass::class, + 'attribute' + ) + ); + } + + public function testImplementorsCanBeBlacklisted(): void + { + $this->blacklist->addImplementorsOf(BlacklistedInterface::class); + + $this->assertTrue( + $this->blacklist->isStaticAttributeBlacklisted( + BlacklistedImplementor::class, + 'attribute' + ) + ); + } + + public function testClassNamePrefixesCanBeBlacklisted(): void + { + $this->blacklist->addClassNamePrefix('SebastianBergmann\GlobalState'); + + $this->assertTrue( + $this->blacklist->isStaticAttributeBlacklisted( + BlacklistedClass::class, + 'attribute' + ) + ); + } + + public function testStaticAttributeCanBeBlacklisted(): void + { + $this->blacklist->addStaticAttribute( + BlacklistedClass::class, + 'attribute' + ); + + $this->assertTrue( + $this->blacklist->isStaticAttributeBlacklisted( + BlacklistedClass::class, + 'attribute' + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/CodeExporterTest.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/CodeExporterTest.php new file mode 100644 index 0000000000..b121d7e261 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/CodeExporterTest.php @@ -0,0 +1,35 @@ + + * + * 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) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/RestorerTest.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/RestorerTest.php new file mode 100644 index 0000000000..6dcb94e99b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/RestorerTest.php @@ -0,0 +1,68 @@ + + * + * 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']); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/SnapshotTest.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/SnapshotTest.php new file mode 100644 index 0000000000..56d5849799 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/SnapshotTest.php @@ -0,0 +1,120 @@ + + * + * 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; +use SebastianBergmann\GlobalState\TestFixture\BlacklistedInterface; +use SebastianBergmann\GlobalState\TestFixture\SnapshotClass; +use SebastianBergmann\GlobalState\TestFixture\SnapshotTrait; + +/** + * @covers \SebastianBergmann\GlobalState\Snapshot + * + * @uses \SebastianBergmann\GlobalState\Blacklist + */ +final class SnapshotTest extends TestCase +{ + /** + * @var Blacklist + */ + private $blacklist; + + protected function setUp(): void + { + $this->blacklist = new Blacklist; + } + + public function testStaticAttributes(): void + { + SnapshotClass::init(); + + $this->blacklistAllLoadedClassesExceptSnapshotClass(); + + $snapshot = new Snapshot($this->blacklist, false, true, false, false, false, false, false, false, false); + + $expected = [ + SnapshotClass::class => [ + 'string' => 'string', + 'objects' => [new \stdClass], + ], + ]; + + $this->assertEquals($expected, $snapshot->staticAttributes()); + } + + public function testConstants(): void + { + $snapshot = new Snapshot($this->blacklist, false, false, true, false, false, false, false, false, false); + + $this->assertArrayHasKey('GLOBALSTATE_TESTSUITE', $snapshot->constants()); + } + + public function testFunctions(): void + { + $snapshot = new Snapshot($this->blacklist, false, false, false, true, false, false, false, false, false); + $functions = $snapshot->functions(); + + $this->assertContains('sebastianbergmann\globalstate\testfixture\snapshotfunction', $functions); + $this->assertNotContains('assert', $functions); + } + + public function testClasses(): void + { + $snapshot = new Snapshot($this->blacklist, false, false, false, false, true, false, false, false, false); + $classes = $snapshot->classes(); + + $this->assertContains(TestCase::class, $classes); + $this->assertNotContains(Exception::class, $classes); + } + + public function testInterfaces(): void + { + $snapshot = new Snapshot($this->blacklist, false, false, false, false, false, true, false, false, false); + $interfaces = $snapshot->interfaces(); + + $this->assertContains(BlacklistedInterface::class, $interfaces); + $this->assertNotContains(\Countable::class, $interfaces); + } + + public function testTraits(): void + { + \spl_autoload_call('SebastianBergmann\GlobalState\TestFixture\SnapshotTrait'); + + $snapshot = new Snapshot($this->blacklist, false, false, false, false, false, false, true, false, false); + + $this->assertContains(SnapshotTrait::class, $snapshot->traits()); + } + + public function testIniSettings(): void + { + $snapshot = new Snapshot($this->blacklist, 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(): void + { + $snapshot = new Snapshot($this->blacklist, false, false, false, false, false, false, false, false, true); + $this->assertContains(__FILE__, $snapshot->includedFiles()); + } + + private function blacklistAllLoadedClassesExceptSnapshotClass(): void + { + foreach (\get_declared_classes() as $class) { + if ($class === SnapshotClass::class) { + continue; + } + + $this->blacklist->addClass($class); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php new file mode 100644 index 0000000000..585c396604 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedChildClass.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php new file mode 100644 index 0000000000..c1dc25983a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedClass.php @@ -0,0 +1,15 @@ + + * + * 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; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php new file mode 100644 index 0000000000..c42751eddc --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedImplementor.php @@ -0,0 +1,15 @@ + + * + * 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; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php new file mode 100644 index 0000000000..f531a3abae --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/BlacklistedInterface.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php new file mode 100644 index 0000000000..bf3305d592 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotClass.php @@ -0,0 +1,35 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\GlobalState\TestFixture; + +class SnapshotClass +{ + private static $string = 'string'; + + private static $closures = []; + + private static $files = []; + + private static $resources = []; + + private static $objects = []; + + public static function init(): void + { + self::$closures[] = function (): void { + }; + + self::$files[] = new \SplFileInfo(__FILE__); + + self::$resources[] = \fopen('php://memory', 'r'); + + self::$objects[] = new \stdClass; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php new file mode 100644 index 0000000000..42eafd090e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotDomDocument.php @@ -0,0 +1,16 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php new file mode 100644 index 0000000000..b3e8d007a3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotFunctions.php @@ -0,0 +1,14 @@ + + * + * 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(): void +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php new file mode 100644 index 0000000000..c3490a6ef3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/global-state/tests/_fixture/SnapshotTrait.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.gitignore new file mode 100644 index 0000000000..5d748a85c3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.gitignore @@ -0,0 +1,8 @@ +.idea +composer.lock +composer.phar +vendor/ +cache.properties +build/LICENSE +build/README.md +build/*.tgz diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.php_cs b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.php_cs new file mode 100644 index 0000000000..b7393bdace --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.php_cs @@ -0,0 +1,67 @@ +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); + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.travis.yml new file mode 100644 index 0000000000..5ea0f53113 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/.travis.yml @@ -0,0 +1,26 @@ +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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/ChangeLog.md new file mode 100644 index 0000000000..2bf007bd6c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/ChangeLog.md @@ -0,0 +1,60 @@ +# Change Log + +All notable changes to `sebastianbergmann/object-enumerator` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [3.0.4] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.0` to `>=7.0` + +## [3.0.3] - 2017-08-03 + +### Changed + +* Bumped required version of `sebastian/object-reflector` + +## [3.0.2] - 2017-03-12 + +### Changed + +* `sebastian/object-reflector` is now a dependency + +## [3.0.1] - 2017-03-12 + +### Fixed + +* Objects aggregated in inherited attributes are not enumerated + +## [3.0.0] - 2017-03-03 + +### Removed + +* This component is no longer supported on PHP 5.6 + +## [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 + +[3.0.4]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.3...3.0.4 +[3.0.3]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.2...3.0.3 +[3.0.2]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.1...3.0.2 +[3.0.1]: https://github.com/sebastianbergmann/object-enumerator/compare/3.0.0...3.0.1 +[3.0.0]: https://github.com/sebastianbergmann/object-enumerator/compare/2.0...3.0.0 +[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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/LICENSE new file mode 100644 index 0000000000..ab8b704898 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/LICENSE @@ -0,0 +1,33 @@ +Object Enumerator + +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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/README.md b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/README.md new file mode 100644 index 0000000000..be6f2dd260 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/README.md @@ -0,0 +1,14 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/build.xml new file mode 100644 index 0000000000..086694f67e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/build.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/composer.json new file mode 100644 index 0000000000..33a9465978 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/composer.json @@ -0,0 +1,35 @@ +{ + "name": "sebastian/object-enumerator", + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "require": { + "php": ">=7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/_fixture/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/phpunit.xml new file mode 100644 index 0000000000..c401ba82c7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/phpunit.xml @@ -0,0 +1,20 @@ + + + + tests + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Enumerator.php b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Enumerator.php new file mode 100644 index 0000000000..3a40f6d987 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Enumerator.php @@ -0,0 +1,85 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\ObjectEnumerator; + +use SebastianBergmann\ObjectReflector\ObjectReflector; +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 ObjectReflector; + + foreach ($reflector->getAttributes($variable) as $value) { + if (!is_array($value) && !is_object($value)) { + continue; + } + + $objects = array_merge( + $objects, + $this->enumerate($value, $processed) + ); + } + } + + return $objects; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Exception.php b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Exception.php new file mode 100644 index 0000000000..903b0b1105 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/Exception.php @@ -0,0 +1,15 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\ObjectEnumerator; + +interface Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php new file mode 100644 index 0000000000..5250c1a167 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/src/InvalidArgumentException.php @@ -0,0 +1,15 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/EnumeratorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/EnumeratorTest.php new file mode 100644 index 0000000000..a6bd29a6ac --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/EnumeratorTest.php @@ -0,0 +1,139 @@ + + * + * 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; +use PHPUnit\Framework\TestCase; + +/** + * @covers SebastianBergmann\ObjectEnumerator\Enumerator + */ +class EnumeratorTest extends 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->expectException(InvalidArgumentException::class); + + $this->enumerator->enumerate(null); + } + + public function testExceptionIsRaisedForInvalidArgument2() + { + $this->expectException(InvalidArgumentException::class); + + $this->enumerator->enumerate([], ''); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/_fixture/ExceptionThrower.php b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/_fixture/ExceptionThrower.php new file mode 100644 index 0000000000..a75f58522c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-enumerator/tests/_fixture/ExceptionThrower.php @@ -0,0 +1,28 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.gitignore new file mode 100644 index 0000000000..c3e9d7e3c0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.gitignore @@ -0,0 +1,4 @@ +/.idea +/.php_cs.cache +/composer.lock +/vendor diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.php_cs b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.php_cs new file mode 100644 index 0000000000..cb814f3958 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.php_cs @@ -0,0 +1,79 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.travis.yml new file mode 100644 index 0000000000..5ea0f53113 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/.travis.yml @@ -0,0 +1,26 @@ +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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/ChangeLog.md new file mode 100644 index 0000000000..89b0346285 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/ChangeLog.md @@ -0,0 +1,27 @@ +# Change Log + +All notable changes to `sebastianbergmann/object-reflector` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## 1.1.2 - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.0` to `>=7.1` + +## 1.1.1 - 2017-03-29 + +* Fixed [#1](https://github.com/sebastianbergmann/object-reflector/issues/1): Attributes that 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 + +[1.1.2]: https://github.com/sebastianbergmann/object-enumerator/compare/1.1.1...1.1.2 +[1.1.1]: https://github.com/sebastianbergmann/object-enumerator/compare/1.1.0...1.1.1 +[1.1.0]: https://github.com/sebastianbergmann/object-enumerator/compare/1.0.0...1.1.0 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/LICENSE new file mode 100644 index 0000000000..54b1fd8319 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/LICENSE @@ -0,0 +1,33 @@ +Object Reflector + +Copyright (c) 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/README.md b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/README.md new file mode 100644 index 0000000000..13b24f1f8c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/README.md @@ -0,0 +1,14 @@ +# Object Reflector + +Allows reflection of object attributes, including inherited and non-public 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/build.xml new file mode 100644 index 0000000000..3368432aa2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/build.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/composer.json new file mode 100644 index 0000000000..14b7c5c6c3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/composer.json @@ -0,0 +1,33 @@ +{ + "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" + } + ], + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/_fixture/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/phpunit.xml new file mode 100644 index 0000000000..68febeb04d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/phpunit.xml @@ -0,0 +1,19 @@ + + + + tests + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/Exception.php b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/Exception.php new file mode 100644 index 0000000000..9964b0924a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/Exception.php @@ -0,0 +1,17 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/InvalidArgumentException.php b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/InvalidArgumentException.php new file mode 100644 index 0000000000..e63c5d5eea --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/InvalidArgumentException.php @@ -0,0 +1,17 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/ObjectReflector.php b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/ObjectReflector.php new file mode 100644 index 0000000000..8b0390ad47 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/src/ObjectReflector.php @@ -0,0 +1,51 @@ + + * + * 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 ObjectReflector +{ + /** + * @param object $object + * + * @return array + * + * @throws InvalidArgumentException + */ + public function getAttributes($object): array + { + if (!is_object($object)) { + throw new InvalidArgumentException; + } + + $attributes = []; + $className = get_class($object); + + foreach ((array) $object as $name => $value) { + $name = explode("\0", (string) $name); + + if (count($name) === 1) { + $name = $name[0]; + } else { + if ($name[1] !== $className) { + $name = $name[1] . '::' . $name[2]; + } else { + $name = $name[2]; + } + } + + $attributes[$name] = $value; + } + + return $attributes; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/ObjectReflectorTest.php b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/ObjectReflectorTest.php new file mode 100644 index 0000000000..ba0d97fc1f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/ObjectReflectorTest.php @@ -0,0 +1,70 @@ + + * + * 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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ChildClass.php b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ChildClass.php new file mode 100644 index 0000000000..5ee05f36a9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ChildClass.php @@ -0,0 +1,25 @@ + + * + * 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'; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ClassWithIntegerAttributeName.php b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ClassWithIntegerAttributeName.php new file mode 100644 index 0000000000..ee49df3b11 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ClassWithIntegerAttributeName.php @@ -0,0 +1,22 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ParentClass.php b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ParentClass.php new file mode 100644 index 0000000000..b6886be95f --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/object-reflector/tests/_fixture/ParentClass.php @@ -0,0 +1,20 @@ + + * + * 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'; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.gitignore new file mode 100644 index 0000000000..77aae3df6e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.gitignore @@ -0,0 +1,3 @@ +/.idea +/composer.lock +/vendor diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.travis.yml new file mode 100644 index 0000000000..ee0e40b21e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/.travis.yml @@ -0,0 +1,23 @@ +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 + +notifications: + email: false diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/LICENSE new file mode 100644 index 0000000000..00bfec5e88 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/LICENSE @@ -0,0 +1,33 @@ +Recursion Context + +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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/README.md b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/README.md new file mode 100644 index 0000000000..0b8949626d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/README.md @@ -0,0 +1,14 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/build.xml new file mode 100644 index 0000000000..896bd34ea7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/build.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/composer.json new file mode 100644 index 0000000000..f2bef36213 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/composer.json @@ -0,0 +1,36 @@ +{ + "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": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/phpunit.xml new file mode 100644 index 0000000000..68febeb04d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/phpunit.xml @@ -0,0 +1,19 @@ + + + + tests + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Context.php b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Context.php new file mode 100644 index 0000000000..0b4b8a0dd8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Context.php @@ -0,0 +1,167 @@ + + * + * 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); + } + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Exception.php b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Exception.php new file mode 100644 index 0000000000..4a1557ba33 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/Exception.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace SebastianBergmann\RecursionContext; + +/** + */ +interface Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/InvalidArgumentException.php b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/InvalidArgumentException.php new file mode 100644 index 0000000000..032c504328 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/src/InvalidArgumentException.php @@ -0,0 +1,17 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/tests/ContextTest.php b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/tests/ContextTest.php new file mode 100644 index 0000000000..6e7af68a13 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/recursion-context/tests/ContextTest.php @@ -0,0 +1,142 @@ + + * + * 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 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->expectException(Exception::class); + $this->expectExceptionMessage('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->expectException(Exception::class); + $this->expectExceptionMessage('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)); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.github/stale.yml b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.github/stale.yml new file mode 100644 index 0000000000..4eadca3278 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.github/stale.yml @@ -0,0 +1,40 @@ +# 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 + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.gitignore new file mode 100644 index 0000000000..4f9b2392f5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.gitignore @@ -0,0 +1,5 @@ +/.idea +/.php_cs.cache +/build/FunctionSignatureMap.php +/composer.lock +/vendor diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.php_cs.dist b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.php_cs.dist new file mode 100644 index 0000000000..22641a643e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/.php_cs.dist @@ -0,0 +1,191 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/ChangeLog.md new file mode 100644 index 0000000000..311f2d4b0d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/ChangeLog.md @@ -0,0 +1,33 @@ +# ChangeLog + +All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. + +## [2.0.2] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.1` to `>=7.1` + +## [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.2]: https://github.com/sebastianbergmann/comparator/compare/2.0.1...2.0.2 +[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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/LICENSE new file mode 100644 index 0000000000..272721811e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/LICENSE @@ -0,0 +1,33 @@ +Resource Operations + +Copyright (c) 2015-2018, 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/README.md b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/README.md new file mode 100644 index 0000000000..88b05ccb61 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/README.md @@ -0,0 +1,14 @@ +# Resource Operations + +Provides a list of PHP built-in functions that operate on resources. + +## Installation + +You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): + + composer require sebastian/resource-operations + +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/resource-operations + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build.xml new file mode 100644 index 0000000000..695ffa88eb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build/generate.php b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build/generate.php new file mode 100755 index 0000000000..0354dc45f9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/build/generate.php @@ -0,0 +1,65 @@ +#!/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__ . '/FunctionSignatureMap.php'; +$resourceFunctions = []; + +foreach ($functions as $function => $arguments) { + foreach ($arguments as $argument) { + if (strpos($argument, '?') === 0) { + $argument = substr($argument, 1); + } + + if ($argument === 'resource') { + $resourceFunctions[] = explode('\'', $function)[0]; + } + } +} + +$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; + +final class ResourceOperations +{ + /** + * @return string[] + */ + public static function getFunctions(): array + { + return [ + +EOT; + +foreach ($resourceFunctions as $function) { + $buffer .= sprintf(" '%s',\n", $function); +} + +$buffer .= <<< EOT + ]; + } +} + +EOT; + +file_put_contents(__DIR__ . '/../src/ResourceOperations.php', $buffer); + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/composer.json new file mode 100644 index 0000000000..733a3f829e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/composer.json @@ -0,0 +1,33 @@ +{ + "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": ">=7.1" + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "config": { + "platform": { + "php": "7.1.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + } +} + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/src/ResourceOperations.php b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/src/ResourceOperations.php new file mode 100644 index 0000000000..f3911f36c7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/src/ResourceOperations.php @@ -0,0 +1,2232 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\ResourceOperations; + +final class ResourceOperations +{ + /** + * @return string[] + */ + public static function getFunctions(): array + { + return [ + 'Directory::close', + 'Directory::read', + 'Directory::rewind', + 'DirectoryIterator::openFile', + 'FilesystemIterator::openFile', + 'Gmagick::readimagefile', + 'HttpResponse::getRequestBodyStream', + 'HttpResponse::getStream', + 'HttpResponse::setStream', + 'Imagick::pingImageFile', + 'Imagick::readImageFile', + 'Imagick::writeImageFile', + 'Imagick::writeImagesFile', + 'MongoGridFSCursor::__construct', + 'MongoGridFSFile::getResource', + 'MysqlndUhConnection::stmtInit', + 'MysqlndUhConnection::storeResult', + 'MysqlndUhConnection::useResult', + 'PDF_activate_item', + 'PDF_add_launchlink', + 'PDF_add_locallink', + 'PDF_add_nameddest', + 'PDF_add_note', + 'PDF_add_pdflink', + 'PDF_add_table_cell', + 'PDF_add_textflow', + 'PDF_add_thumbnail', + 'PDF_add_weblink', + 'PDF_arc', + 'PDF_arcn', + 'PDF_attach_file', + 'PDF_begin_document', + 'PDF_begin_font', + 'PDF_begin_glyph', + 'PDF_begin_item', + 'PDF_begin_layer', + 'PDF_begin_page', + 'PDF_begin_page_ext', + 'PDF_begin_pattern', + 'PDF_begin_template', + 'PDF_begin_template_ext', + 'PDF_circle', + 'PDF_clip', + 'PDF_close', + 'PDF_close_image', + 'PDF_close_pdi', + 'PDF_close_pdi_page', + 'PDF_closepath', + 'PDF_closepath_fill_stroke', + 'PDF_closepath_stroke', + 'PDF_concat', + 'PDF_continue_text', + 'PDF_create_3dview', + 'PDF_create_action', + 'PDF_create_annotation', + 'PDF_create_bookmark', + 'PDF_create_field', + 'PDF_create_fieldgroup', + 'PDF_create_gstate', + 'PDF_create_pvf', + 'PDF_create_textflow', + 'PDF_curveto', + 'PDF_define_layer', + 'PDF_delete', + 'PDF_delete_pvf', + 'PDF_delete_table', + 'PDF_delete_textflow', + 'PDF_encoding_set_char', + 'PDF_end_document', + 'PDF_end_font', + 'PDF_end_glyph', + 'PDF_end_item', + 'PDF_end_layer', + 'PDF_end_page', + 'PDF_end_page_ext', + 'PDF_end_pattern', + 'PDF_end_template', + 'PDF_endpath', + 'PDF_fill', + 'PDF_fill_imageblock', + 'PDF_fill_pdfblock', + 'PDF_fill_stroke', + 'PDF_fill_textblock', + 'PDF_findfont', + 'PDF_fit_image', + 'PDF_fit_pdi_page', + 'PDF_fit_table', + 'PDF_fit_textflow', + 'PDF_fit_textline', + 'PDF_get_apiname', + 'PDF_get_buffer', + 'PDF_get_errmsg', + 'PDF_get_errnum', + 'PDF_get_parameter', + 'PDF_get_pdi_parameter', + 'PDF_get_pdi_value', + 'PDF_get_value', + 'PDF_info_font', + 'PDF_info_matchbox', + 'PDF_info_table', + 'PDF_info_textflow', + 'PDF_info_textline', + 'PDF_initgraphics', + 'PDF_lineto', + 'PDF_load_3ddata', + 'PDF_load_font', + 'PDF_load_iccprofile', + 'PDF_load_image', + 'PDF_makespotcolor', + 'PDF_moveto', + 'PDF_new', + 'PDF_open_ccitt', + 'PDF_open_file', + 'PDF_open_image', + 'PDF_open_image_file', + 'PDF_open_memory_image', + 'PDF_open_pdi', + 'PDF_open_pdi_document', + 'PDF_open_pdi_page', + 'PDF_pcos_get_number', + 'PDF_pcos_get_stream', + 'PDF_pcos_get_string', + 'PDF_place_image', + 'PDF_place_pdi_page', + 'PDF_process_pdi', + 'PDF_rect', + 'PDF_restore', + 'PDF_resume_page', + 'PDF_rotate', + 'PDF_save', + 'PDF_scale', + 'PDF_set_border_color', + 'PDF_set_border_dash', + 'PDF_set_border_style', + 'PDF_set_gstate', + 'PDF_set_info', + 'PDF_set_layer_dependency', + 'PDF_set_parameter', + 'PDF_set_text_pos', + 'PDF_set_value', + 'PDF_setcolor', + 'PDF_setdash', + 'PDF_setdashpattern', + 'PDF_setflat', + 'PDF_setfont', + 'PDF_setgray', + 'PDF_setgray_fill', + 'PDF_setgray_stroke', + 'PDF_setlinecap', + 'PDF_setlinejoin', + 'PDF_setlinewidth', + 'PDF_setmatrix', + 'PDF_setmiterlimit', + 'PDF_setrgbcolor', + 'PDF_setrgbcolor_fill', + 'PDF_setrgbcolor_stroke', + 'PDF_shading', + 'PDF_shading_pattern', + 'PDF_shfill', + 'PDF_show', + 'PDF_show_boxed', + 'PDF_show_xy', + 'PDF_skew', + 'PDF_stringwidth', + 'PDF_stroke', + 'PDF_suspend_page', + 'PDF_translate', + 'PDF_utf16_to_utf8', + 'PDF_utf32_to_utf16', + 'PDF_utf8_to_utf16', + 'PDO::pgsqlLOBOpen', + 'RarEntry::getStream', + 'SQLite3::openBlob', + 'SWFMovie::saveToFile', + 'SplFileInfo::openFile', + 'SplFileObject::openFile', + 'SplTempFileObject::openFile', + 'V8Js::compileString', + 'V8Js::executeScript', + 'Vtiful\Kernel\Excel::setColumn', + 'Vtiful\Kernel\Excel::setRow', + 'Vtiful\Kernel\Format::align', + 'Vtiful\Kernel\Format::bold', + 'Vtiful\Kernel\Format::italic', + 'Vtiful\Kernel\Format::underline', + 'XMLWriter::openMemory', + 'XMLWriter::openURI', + 'ZipArchive::getStream', + 'Zookeeper::setLogStream', + 'apc_bin_dumpfile', + 'apc_bin_loadfile', + 'bbcode_add_element', + 'bbcode_add_smiley', + 'bbcode_create', + 'bbcode_destroy', + 'bbcode_parse', + 'bbcode_set_arg_parser', + 'bbcode_set_flags', + 'bcompiler_read', + 'bcompiler_write_class', + 'bcompiler_write_constant', + 'bcompiler_write_exe_footer', + 'bcompiler_write_file', + 'bcompiler_write_footer', + 'bcompiler_write_function', + 'bcompiler_write_functions_from_file', + 'bcompiler_write_header', + 'bcompiler_write_included_filename', + 'bzclose', + 'bzerrno', + 'bzerror', + 'bzerrstr', + 'bzflush', + 'bzopen', + 'bzread', + 'bzwrite', + 'cairo_surface_write_to_png', + 'closedir', + 'copy', + 'crack_closedict', + 'crack_opendict', + 'cubrid_bind', + 'cubrid_close_prepare', + 'cubrid_close_request', + 'cubrid_col_get', + 'cubrid_col_size', + 'cubrid_column_names', + 'cubrid_column_types', + 'cubrid_commit', + 'cubrid_connect', + 'cubrid_connect_with_url', + 'cubrid_current_oid', + 'cubrid_db_parameter', + 'cubrid_disconnect', + 'cubrid_drop', + 'cubrid_fetch', + 'cubrid_free_result', + 'cubrid_get', + 'cubrid_get_autocommit', + 'cubrid_get_charset', + 'cubrid_get_class_name', + 'cubrid_get_db_parameter', + 'cubrid_get_query_timeout', + 'cubrid_get_server_info', + 'cubrid_insert_id', + 'cubrid_is_instance', + '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_lob_export', + 'cubrid_lob_get', + 'cubrid_lob_send', + 'cubrid_lob_size', + 'cubrid_lock_read', + 'cubrid_lock_write', + 'cubrid_move_cursor', + 'cubrid_next_result', + 'cubrid_num_cols', + 'cubrid_num_rows', + 'cubrid_pconnect', + 'cubrid_pconnect_with_url', + 'cubrid_prepare', + 'cubrid_put', + 'cubrid_query', + 'cubrid_rollback', + 'cubrid_schema', + 'cubrid_seq_add', + 'cubrid_seq_drop', + 'cubrid_seq_insert', + 'cubrid_seq_put', + 'cubrid_set_add', + 'cubrid_set_autocommit', + 'cubrid_set_db_parameter', + 'cubrid_set_drop', + 'cubrid_set_query_timeout', + 'cubrid_unbuffered_query', + 'curl_close', + 'curl_copy_handle', + 'curl_errno', + 'curl_error', + 'curl_escape', + 'curl_exec', + 'curl_getinfo', + 'curl_multi_add_handle', + 'curl_multi_close', + 'curl_multi_errno', + 'curl_multi_exec', + 'curl_multi_getcontent', + 'curl_multi_info_read', + 'curl_multi_remove_handle', + 'curl_multi_select', + 'curl_multi_setopt', + 'curl_pause', + 'curl_reset', + 'curl_setopt', + 'curl_setopt_array', + 'curl_share_close', + 'curl_share_errno', + 'curl_share_init', + 'curl_share_setopt', + 'curl_unescape', + 'cyrus_authenticate', + 'cyrus_bind', + 'cyrus_close', + 'cyrus_connect', + 'cyrus_query', + 'cyrus_unbind', + 'db2_autocommit', + 'db2_bind_param', + 'db2_client_info', + 'db2_close', + 'db2_column_privileges', + 'db2_columns', + 'db2_commit', + 'db2_conn_error', + 'db2_conn_errormsg', + 'db2_connect', + 'db2_cursor_type', + 'db2_exec', + 'db2_execute', + 'db2_fetch_array', + 'db2_fetch_assoc', + 'db2_fetch_both', + 'db2_fetch_object', + 'db2_fetch_row', + 'db2_field_display_size', + 'db2_field_name', + 'db2_field_num', + 'db2_field_precision', + 'db2_field_scale', + 'db2_field_type', + 'db2_field_width', + 'db2_foreign_keys', + 'db2_free_result', + 'db2_free_stmt', + 'db2_get_option', + 'db2_last_insert_id', + 'db2_lob_read', + 'db2_next_result', + 'db2_num_fields', + 'db2_num_rows', + 'db2_pclose', + 'db2_pconnect', + 'db2_prepare', + 'db2_primary_keys', + 'db2_procedure_columns', + 'db2_procedures', + 'db2_result', + 'db2_rollback', + 'db2_server_info', + 'db2_set_option', + 'db2_special_columns', + 'db2_statistics', + 'db2_stmt_error', + 'db2_stmt_errormsg', + 'db2_table_privileges', + 'db2_tables', + 'dba_close', + 'dba_delete', + 'dba_exists', + 'dba_fetch', + 'dba_firstkey', + 'dba_insert', + 'dba_nextkey', + 'dba_open', + 'dba_optimize', + 'dba_popen', + 'dba_replace', + 'dba_sync', + 'dbplus_add', + 'dbplus_aql', + 'dbplus_close', + 'dbplus_curr', + 'dbplus_find', + 'dbplus_first', + 'dbplus_flush', + 'dbplus_freelock', + 'dbplus_freerlocks', + 'dbplus_getlock', + 'dbplus_getunique', + 'dbplus_info', + 'dbplus_last', + 'dbplus_lockrel', + 'dbplus_next', + 'dbplus_open', + 'dbplus_prev', + 'dbplus_rchperm', + 'dbplus_rcreate', + 'dbplus_rcrtexact', + 'dbplus_rcrtlike', + 'dbplus_restorepos', + 'dbplus_rkeys', + 'dbplus_ropen', + 'dbplus_rquery', + 'dbplus_rrename', + 'dbplus_rsecindex', + 'dbplus_runlink', + 'dbplus_rzap', + 'dbplus_savepos', + 'dbplus_setindex', + 'dbplus_setindexbynumber', + 'dbplus_sql', + 'dbplus_tremove', + 'dbplus_undo', + 'dbplus_undoprepare', + 'dbplus_unlockrel', + 'dbplus_unselect', + 'dbplus_update', + 'dbplus_xlockrel', + 'dbplus_xunlockrel', + 'deflate_add', + 'dio_close', + 'dio_fcntl', + 'dio_open', + 'dio_read', + 'dio_seek', + 'dio_stat', + 'dio_tcsetattr', + 'dio_truncate', + 'dio_write', + 'dir', + '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_describe', + 'enchant_broker_dict_exists', + 'enchant_broker_free', + 'enchant_broker_free_dict', + 'enchant_broker_get_dict_path', + 'enchant_broker_get_error', + 'enchant_broker_init', + 'enchant_broker_list_dicts', + 'enchant_broker_request_dict', + 'enchant_broker_request_pwl_dict', + 'enchant_broker_set_dict_path', + 'enchant_broker_set_ordering', + 'enchant_dict_add_to_personal', + 'enchant_dict_add_to_session', + 'enchant_dict_check', + 'enchant_dict_describe', + 'enchant_dict_get_error', + 'enchant_dict_is_in_session', + 'enchant_dict_quick_check', + 'enchant_dict_store_replacement', + 'enchant_dict_suggest', + 'event_add', + 'event_base_free', + 'event_base_loop', + 'event_base_loopbreak', + 'event_base_loopexit', + 'event_base_new', + 'event_base_priority_init', + 'event_base_reinit', + 'event_base_set', + 'event_buffer_base_set', + 'event_buffer_disable', + 'event_buffer_enable', + 'event_buffer_fd_set', + 'event_buffer_free', + 'event_buffer_new', + 'event_buffer_priority_set', + 'event_buffer_read', + 'event_buffer_set_callback', + 'event_buffer_timeout_set', + 'event_buffer_watermark_set', + 'event_buffer_write', + 'event_del', + 'event_free', + 'event_new', + 'event_priority_set', + 'event_set', + 'event_timer_add', + 'event_timer_del', + 'event_timer_pending', + 'event_timer_set', + 'expect_expectl', + 'expect_popen', + 'fam_cancel_monitor', + 'fam_close', + 'fam_monitor_collection', + 'fam_monitor_directory', + 'fam_monitor_file', + 'fam_next_event', + 'fam_open', + 'fam_pending', + 'fam_resume_monitor', + 'fam_suspend_monitor', + '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_affected_rows', + 'fbsql_autocommit', + 'fbsql_blob_size', + 'fbsql_change_user', + 'fbsql_clob_size', + 'fbsql_close', + 'fbsql_commit', + 'fbsql_connect', + 'fbsql_create_blob', + 'fbsql_create_clob', + 'fbsql_create_db', + 'fbsql_data_seek', + 'fbsql_database', + 'fbsql_database_password', + 'fbsql_db_query', + 'fbsql_db_status', + 'fbsql_drop_db', + 'fbsql_errno', + 'fbsql_error', + 'fbsql_fetch_array', + 'fbsql_fetch_assoc', + 'fbsql_fetch_field', + 'fbsql_fetch_lengths', + 'fbsql_fetch_object', + 'fbsql_fetch_row', + 'fbsql_field_flags', + 'fbsql_field_len', + 'fbsql_field_name', + 'fbsql_field_seek', + 'fbsql_field_table', + 'fbsql_field_type', + 'fbsql_free_result', + 'fbsql_get_autostart_info', + 'fbsql_hostname', + 'fbsql_insert_id', + 'fbsql_list_dbs', + 'fbsql_list_fields', + 'fbsql_list_tables', + 'fbsql_next_result', + 'fbsql_num_fields', + 'fbsql_num_rows', + 'fbsql_password', + 'fbsql_pconnect', + 'fbsql_query', + 'fbsql_read_blob', + 'fbsql_read_clob', + 'fbsql_result', + 'fbsql_rollback', + 'fbsql_rows_fetched', + 'fbsql_select_db', + 'fbsql_set_characterset', + 'fbsql_set_lob_mode', + 'fbsql_set_password', + 'fbsql_set_transaction', + 'fbsql_start_db', + 'fbsql_stop_db', + 'fbsql_table_name', + 'fbsql_username', + 'fclose', + 'fdf_add_doc_javascript', + 'fdf_add_template', + 'fdf_close', + 'fdf_create', + 'fdf_enum_values', + 'fdf_get_ap', + 'fdf_get_attachment', + 'fdf_get_encoding', + 'fdf_get_file', + 'fdf_get_flags', + 'fdf_get_opt', + 'fdf_get_status', + 'fdf_get_value', + 'fdf_get_version', + 'fdf_next_field_name', + 'fdf_open', + 'fdf_open_string', + 'fdf_remove_item', + 'fdf_save', + 'fdf_save_string', + 'fdf_set_ap', + 'fdf_set_encoding', + 'fdf_set_file', + 'fdf_set_flags', + 'fdf_set_javascript_action', + 'fdf_set_on_import_javascript', + 'fdf_set_opt', + 'fdf_set_status', + 'fdf_set_submit_form_action', + 'fdf_set_target_frame', + 'fdf_set_value', + 'fdf_set_version', + 'feof', + 'fflush', + 'ffmpeg_frame::__construct', + 'ffmpeg_frame::toGDImage', + 'fgetc', + 'fgetcsv', + 'fgets', + 'fgetss', + 'file', + 'file_get_contents', + 'file_put_contents', + 'finfo::buffer', + 'finfo::file', + 'finfo_buffer', + 'finfo_close', + 'finfo_file', + 'finfo_open', + 'finfo_set_flags', + 'flock', + 'fopen', + 'fpassthru', + 'fprintf', + 'fputcsv', + 'fputs', + 'fread', + 'fscanf', + 'fseek', + 'fstat', + 'ftell', + 'ftp_alloc', + 'ftp_append', + 'ftp_cdup', + 'ftp_chdir', + 'ftp_chmod', + 'ftp_close', + 'ftp_delete', + 'ftp_exec', + 'ftp_fget', + 'ftp_fput', + 'ftp_get', + 'ftp_get_option', + 'ftp_login', + 'ftp_mdtm', + 'ftp_mkdir', + 'ftp_mlsd', + 'ftp_nb_continue', + 'ftp_nb_fget', + 'ftp_nb_fput', + 'ftp_nb_get', + 'ftp_nb_put', + 'ftp_nlist', + 'ftp_pasv', + 'ftp_put', + 'ftp_pwd', + 'ftp_quit', + 'ftp_raw', + 'ftp_rawlist', + 'ftp_rename', + 'ftp_rmdir', + 'ftp_set_option', + 'ftp_site', + 'ftp_size', + 'ftp_systype', + 'ftruncate', + 'fwrite', + 'get_resource_type', + 'gmp_div', + 'gnupg::init', + 'gnupg_adddecryptkey', + 'gnupg_addencryptkey', + 'gnupg_addsignkey', + 'gnupg_cleardecryptkeys', + 'gnupg_clearencryptkeys', + 'gnupg_clearsignkeys', + 'gnupg_decrypt', + 'gnupg_decryptverify', + 'gnupg_encrypt', + 'gnupg_encryptsign', + 'gnupg_export', + 'gnupg_geterror', + 'gnupg_getprotocol', + 'gnupg_import', + 'gnupg_init', + 'gnupg_keyinfo', + 'gnupg_setarmor', + 'gnupg_seterrormode', + 'gnupg_setsignmode', + 'gnupg_sign', + 'gnupg_verify', + 'gupnp_context_get_host_ip', + 'gupnp_context_get_port', + 'gupnp_context_get_subscription_timeout', + 'gupnp_context_host_path', + 'gupnp_context_new', + 'gupnp_context_set_subscription_timeout', + 'gupnp_context_timeout_add', + 'gupnp_context_unhost_path', + 'gupnp_control_point_browse_start', + 'gupnp_control_point_browse_stop', + 'gupnp_control_point_callback_set', + 'gupnp_control_point_new', + 'gupnp_device_action_callback_set', + 'gupnp_device_info_get', + 'gupnp_device_info_get_service', + 'gupnp_root_device_get_available', + 'gupnp_root_device_get_relative_location', + 'gupnp_root_device_new', + 'gupnp_root_device_set_available', + 'gupnp_root_device_start', + 'gupnp_root_device_stop', + 'gupnp_service_action_get', + 'gupnp_service_action_return', + 'gupnp_service_action_return_error', + 'gupnp_service_action_set', + 'gupnp_service_freeze_notify', + 'gupnp_service_info_get', + 'gupnp_service_info_get_introspection', + 'gupnp_service_introspection_get_state_variable', + 'gupnp_service_notify', + 'gupnp_service_proxy_action_get', + 'gupnp_service_proxy_action_set', + 'gupnp_service_proxy_add_notify', + 'gupnp_service_proxy_callback_set', + 'gupnp_service_proxy_get_subscribed', + 'gupnp_service_proxy_remove_notify', + 'gupnp_service_proxy_send_action', + 'gupnp_service_proxy_set_subscribed', + 'gupnp_service_thaw_notify', + 'gzclose', + 'gzeof', + 'gzgetc', + 'gzgets', + 'gzgetss', + 'gzpassthru', + 'gzputs', + 'gzread', + 'gzrewind', + 'gzseek', + 'gztell', + 'gzwrite', + 'hash_update_stream', + 'http\Env\Response::send', + 'http_get_request_body_stream', + 'ibase_add_user', + 'ibase_affected_rows', + 'ibase_backup', + 'ibase_blob_add', + 'ibase_blob_cancel', + 'ibase_blob_close', + 'ibase_blob_create', + 'ibase_blob_get', + 'ibase_blob_open', + 'ibase_close', + 'ibase_commit', + 'ibase_commit_ret', + 'ibase_connect', + 'ibase_db_info', + 'ibase_delete_user', + 'ibase_drop_db', + 'ibase_execute', + 'ibase_fetch_assoc', + 'ibase_fetch_object', + 'ibase_fetch_row', + 'ibase_field_info', + 'ibase_free_event_handler', + 'ibase_free_query', + 'ibase_free_result', + 'ibase_gen_id', + 'ibase_maintain_db', + 'ibase_modify_user', + 'ibase_name_result', + 'ibase_num_fields', + 'ibase_num_params', + 'ibase_param_info', + 'ibase_pconnect', + 'ibase_prepare', + 'ibase_query', + 'ibase_restore', + 'ibase_rollback', + 'ibase_rollback_ret', + 'ibase_server_info', + 'ibase_service_attach', + 'ibase_service_detach', + 'ibase_set_event_handler', + 'ibase_trans', + 'ifx_affected_rows', + 'ifx_close', + 'ifx_connect', + 'ifx_do', + 'ifx_error', + 'ifx_fetch_row', + 'ifx_fieldproperties', + 'ifx_fieldtypes', + 'ifx_free_result', + 'ifx_getsqlca', + 'ifx_htmltbl_result', + 'ifx_num_fields', + 'ifx_num_rows', + 'ifx_pconnect', + 'ifx_prepare', + 'ifx_query', + 'image2wbmp', + 'imageaffine', + 'imagealphablending', + 'imageantialias', + 'imagearc', + 'imagebmp', + 'imagechar', + 'imagecharup', + 'imagecolorallocate', + 'imagecolorallocatealpha', + 'imagecolorat', + 'imagecolorclosest', + 'imagecolorclosestalpha', + 'imagecolorclosesthwb', + 'imagecolordeallocate', + 'imagecolorexact', + 'imagecolorexactalpha', + 'imagecolormatch', + 'imagecolorresolve', + 'imagecolorresolvealpha', + 'imagecolorset', + 'imagecolorsforindex', + 'imagecolorstotal', + 'imagecolortransparent', + 'imageconvolution', + 'imagecopy', + 'imagecopymerge', + 'imagecopymergegray', + 'imagecopyresampled', + 'imagecopyresized', + 'imagecrop', + 'imagecropauto', + 'imagedashedline', + 'imagedestroy', + 'imageellipse', + 'imagefill', + 'imagefilledarc', + 'imagefilledellipse', + 'imagefilledpolygon', + 'imagefilledrectangle', + 'imagefilltoborder', + 'imagefilter', + 'imageflip', + 'imagefttext', + 'imagegammacorrect', + 'imagegd', + 'imagegd2', + 'imagegetclip', + 'imagegif', + 'imagegrabscreen', + 'imagegrabwindow', + 'imageinterlace', + 'imageistruecolor', + 'imagejpeg', + 'imagelayereffect', + 'imageline', + 'imageopenpolygon', + 'imagepalettecopy', + 'imagepalettetotruecolor', + 'imagepng', + 'imagepolygon', + 'imagepsencodefont', + 'imagepsextendfont', + 'imagepsfreefont', + 'imagepsloadfont', + 'imagepsslantfont', + 'imagepstext', + 'imagerectangle', + 'imageresolution', + 'imagerotate', + 'imagesavealpha', + 'imagescale', + 'imagesetbrush', + 'imagesetclip', + 'imagesetinterpolation', + 'imagesetpixel', + 'imagesetstyle', + 'imagesetthickness', + 'imagesettile', + 'imagestring', + 'imagestringup', + 'imagesx', + 'imagesy', + 'imagetruecolortopalette', + 'imagettftext', + 'imagewbmp', + 'imagewebp', + 'imagexbm', + 'imap_append', + 'imap_body', + 'imap_bodystruct', + 'imap_check', + 'imap_clearflag_full', + 'imap_close', + 'imap_create', + 'imap_createmailbox', + 'imap_delete', + 'imap_deletemailbox', + 'imap_expunge', + 'imap_fetch_overview', + 'imap_fetchbody', + 'imap_fetchheader', + 'imap_fetchmime', + 'imap_fetchstructure', + 'imap_fetchtext', + 'imap_gc', + 'imap_get_quota', + 'imap_get_quotaroot', + 'imap_getacl', + 'imap_getmailboxes', + 'imap_getsubscribed', + 'imap_header', + 'imap_headerinfo', + 'imap_headers', + 'imap_list', + 'imap_listmailbox', + 'imap_listscan', + 'imap_listsubscribed', + 'imap_lsub', + 'imap_mail_copy', + 'imap_mail_move', + 'imap_mailboxmsginfo', + 'imap_msgno', + 'imap_num_msg', + 'imap_num_recent', + 'imap_ping', + 'imap_rename', + 'imap_renamemailbox', + 'imap_reopen', + 'imap_savebody', + 'imap_scan', + 'imap_scanmailbox', + 'imap_search', + 'imap_set_quota', + 'imap_setacl', + 'imap_setflag_full', + 'imap_sort', + 'imap_status', + 'imap_subscribe', + 'imap_thread', + 'imap_uid', + 'imap_undelete', + 'imap_unsubscribe', + 'inflate_add', + 'inflate_get_read_len', + 'inflate_get_status', + 'ingres_autocommit', + 'ingres_autocommit_state', + 'ingres_charset', + 'ingres_close', + 'ingres_commit', + 'ingres_connect', + 'ingres_cursor', + 'ingres_errno', + 'ingres_error', + 'ingres_errsqlstate', + 'ingres_escape_string', + 'ingres_execute', + 'ingres_fetch_array', + 'ingres_fetch_assoc', + 'ingres_fetch_object', + 'ingres_fetch_proc_return', + 'ingres_fetch_row', + 'ingres_field_length', + 'ingres_field_name', + 'ingres_field_nullable', + 'ingres_field_precision', + 'ingres_field_scale', + 'ingres_field_type', + 'ingres_free_result', + 'ingres_next_error', + 'ingres_num_fields', + 'ingres_num_rows', + 'ingres_pconnect', + 'ingres_prepare', + 'ingres_query', + 'ingres_result_seek', + 'ingres_rollback', + 'ingres_set_environment', + 'ingres_unbuffered_query', + 'inotify_add_watch', + 'inotify_init', + 'inotify_queue_len', + 'inotify_read', + 'inotify_rm_watch', + 'kadm5_chpass_principal', + 'kadm5_create_principal', + 'kadm5_delete_principal', + 'kadm5_destroy', + 'kadm5_flush', + 'kadm5_get_policies', + 'kadm5_get_principal', + 'kadm5_get_principals', + 'kadm5_init_with_password', + 'kadm5_modify_principal', + 'ldap_add', + 'ldap_bind', + 'ldap_close', + 'ldap_compare', + 'ldap_control_paged_result', + 'ldap_control_paged_result_response', + 'ldap_count_entries', + 'ldap_delete', + 'ldap_errno', + 'ldap_error', + 'ldap_exop', + 'ldap_exop_passwd', + 'ldap_exop_refresh', + 'ldap_exop_whoami', + 'ldap_first_attribute', + 'ldap_first_entry', + 'ldap_first_reference', + 'ldap_free_result', + 'ldap_get_attributes', + 'ldap_get_dn', + 'ldap_get_entries', + 'ldap_get_option', + 'ldap_get_values', + 'ldap_get_values_len', + 'ldap_mod_add', + 'ldap_mod_del', + 'ldap_mod_replace', + 'ldap_modify', + 'ldap_modify_batch', + 'ldap_next_attribute', + 'ldap_next_entry', + 'ldap_next_reference', + 'ldap_parse_exop', + 'ldap_parse_reference', + 'ldap_parse_result', + 'ldap_rename', + 'ldap_sasl_bind', + 'ldap_set_option', + 'ldap_set_rebind_proc', + 'ldap_sort', + 'ldap_start_tls', + 'ldap_unbind', + 'libxml_set_streams_context', + 'm_checkstatus', + 'm_completeauthorizations', + 'm_connect', + 'm_connectionerror', + 'm_deletetrans', + 'm_destroyconn', + 'm_getcell', + 'm_getcellbynum', + 'm_getcommadelimited', + 'm_getheader', + 'm_initconn', + 'm_iscommadelimited', + 'm_maxconntimeout', + 'm_monitor', + 'm_numcolumns', + 'm_numrows', + 'm_parsecommadelimited', + 'm_responsekeys', + 'm_responseparam', + 'm_returnstatus', + 'm_setblocking', + 'm_setdropfile', + 'm_setip', + 'm_setssl', + 'm_setssl_cafile', + 'm_setssl_files', + 'm_settimeout', + 'm_transactionssent', + 'm_transinqueue', + 'm_transkeyval', + 'm_transnew', + 'm_transsend', + 'm_validateidentifier', + 'm_verifyconnection', + 'm_verifysslcert', + 'mailparse_determine_best_xfer_encoding', + 'mailparse_msg_create', + 'mailparse_msg_extract_part', + 'mailparse_msg_extract_part_file', + 'mailparse_msg_extract_whole_part_file', + 'mailparse_msg_free', + 'mailparse_msg_get_part', + 'mailparse_msg_get_part_data', + 'mailparse_msg_get_structure', + 'mailparse_msg_parse', + 'mailparse_msg_parse_file', + 'mailparse_stream_encode', + 'mailparse_uudecode_all', + 'maxdb::use_result', + 'maxdb_affected_rows', + 'maxdb_connect', + 'maxdb_disable_rpl_parse', + 'maxdb_dump_debug_info', + 'maxdb_embedded_connect', + 'maxdb_enable_reads_from_master', + 'maxdb_enable_rpl_parse', + 'maxdb_errno', + 'maxdb_error', + 'maxdb_fetch_lengths', + 'maxdb_field_tell', + 'maxdb_get_host_info', + 'maxdb_get_proto_info', + 'maxdb_get_server_info', + 'maxdb_get_server_version', + 'maxdb_info', + 'maxdb_init', + 'maxdb_insert_id', + 'maxdb_master_query', + 'maxdb_more_results', + 'maxdb_next_result', + 'maxdb_num_fields', + 'maxdb_num_rows', + 'maxdb_rpl_parse_enabled', + 'maxdb_rpl_probe', + 'maxdb_select_db', + 'maxdb_sqlstate', + 'maxdb_stmt::result_metadata', + 'maxdb_stmt_affected_rows', + 'maxdb_stmt_errno', + 'maxdb_stmt_error', + 'maxdb_stmt_num_rows', + 'maxdb_stmt_param_count', + 'maxdb_stmt_result_metadata', + 'maxdb_stmt_sqlstate', + 'maxdb_thread_id', + 'maxdb_use_result', + 'maxdb_warning_count', + 'mcrypt_enc_get_algorithms_name', + 'mcrypt_enc_get_block_size', + 'mcrypt_enc_get_iv_size', + 'mcrypt_enc_get_key_size', + 'mcrypt_enc_get_modes_name', + 'mcrypt_enc_get_supported_key_sizes', + 'mcrypt_enc_is_block_algorithm', + 'mcrypt_enc_is_block_algorithm_mode', + 'mcrypt_enc_is_block_mode', + 'mcrypt_enc_self_test', + 'mcrypt_generic', + 'mcrypt_generic_deinit', + 'mcrypt_generic_end', + 'mcrypt_generic_init', + 'mcrypt_module_close', + 'mcrypt_module_open', + 'mdecrypt_generic', + 'mkdir', + 'mqseries_back', + 'mqseries_begin', + 'mqseries_close', + 'mqseries_cmit', + 'mqseries_conn', + 'mqseries_connx', + 'mqseries_disc', + 'mqseries_get', + 'mqseries_inq', + 'mqseries_open', + 'mqseries_put', + 'mqseries_put1', + 'mqseries_set', + 'msg_get_queue', + 'msg_receive', + 'msg_remove_queue', + 'msg_send', + 'msg_set_queue', + 'msg_stat_queue', + 'msql_affected_rows', + 'msql_close', + 'msql_connect', + 'msql_create_db', + 'msql_data_seek', + 'msql_db_query', + 'msql_drop_db', + 'msql_fetch_array', + 'msql_fetch_field', + 'msql_fetch_object', + 'msql_fetch_row', + 'msql_field_flags', + 'msql_field_len', + 'msql_field_name', + 'msql_field_seek', + 'msql_field_table', + 'msql_field_type', + 'msql_free_result', + 'msql_list_dbs', + 'msql_list_fields', + 'msql_list_tables', + 'msql_num_fields', + 'msql_num_rows', + 'msql_pconnect', + 'msql_query', + 'msql_result', + 'msql_select_db', + 'mssql_bind', + 'mssql_close', + 'mssql_connect', + 'mssql_data_seek', + 'mssql_execute', + 'mssql_fetch_array', + 'mssql_fetch_assoc', + 'mssql_fetch_batch', + 'mssql_fetch_field', + 'mssql_fetch_object', + 'mssql_fetch_row', + 'mssql_field_length', + 'mssql_field_name', + 'mssql_field_seek', + 'mssql_field_type', + 'mssql_free_result', + 'mssql_free_statement', + 'mssql_init', + 'mssql_next_result', + 'mssql_num_fields', + 'mssql_num_rows', + 'mssql_pconnect', + 'mssql_query', + 'mssql_result', + 'mssql_rows_affected', + 'mssql_select_db', + 'mysql_affected_rows', + 'mysql_client_encoding', + 'mysql_close', + 'mysql_connect', + 'mysql_create_db', + 'mysql_data_seek', + 'mysql_db_name', + 'mysql_db_query', + 'mysql_drop_db', + 'mysql_errno', + 'mysql_error', + 'mysql_fetch_array', + 'mysql_fetch_assoc', + 'mysql_fetch_field', + 'mysql_fetch_lengths', + 'mysql_fetch_object', + 'mysql_fetch_row', + 'mysql_field_flags', + 'mysql_field_len', + 'mysql_field_name', + 'mysql_field_seek', + 'mysql_field_table', + 'mysql_field_type', + 'mysql_free_result', + 'mysql_get_host_info', + 'mysql_get_proto_info', + 'mysql_get_server_info', + 'mysql_info', + 'mysql_insert_id', + 'mysql_list_dbs', + 'mysql_list_fields', + 'mysql_list_processes', + 'mysql_list_tables', + 'mysql_num_fields', + 'mysql_num_rows', + 'mysql_pconnect', + 'mysql_ping', + 'mysql_query', + 'mysql_real_escape_string', + 'mysql_result', + 'mysql_select_db', + 'mysql_set_charset', + 'mysql_stat', + 'mysql_tablename', + 'mysql_thread_id', + 'mysql_unbuffered_query', + 'mysqlnd_uh_convert_to_mysqlnd', + 'ncurses_bottom_panel', + 'ncurses_del_panel', + 'ncurses_delwin', + 'ncurses_getmaxyx', + 'ncurses_getyx', + 'ncurses_hide_panel', + 'ncurses_keypad', + 'ncurses_meta', + 'ncurses_move_panel', + 'ncurses_mvwaddstr', + 'ncurses_new_panel', + 'ncurses_newpad', + 'ncurses_newwin', + 'ncurses_panel_above', + 'ncurses_panel_below', + 'ncurses_panel_window', + 'ncurses_pnoutrefresh', + 'ncurses_prefresh', + 'ncurses_replace_panel', + 'ncurses_show_panel', + 'ncurses_top_panel', + 'ncurses_waddch', + 'ncurses_waddstr', + 'ncurses_wattroff', + 'ncurses_wattron', + 'ncurses_wattrset', + 'ncurses_wborder', + 'ncurses_wclear', + 'ncurses_wcolor_set', + 'ncurses_werase', + 'ncurses_wgetch', + 'ncurses_whline', + 'ncurses_wmouse_trafo', + 'ncurses_wmove', + 'ncurses_wnoutrefresh', + 'ncurses_wrefresh', + 'ncurses_wstandend', + 'ncurses_wstandout', + 'ncurses_wvline', + 'newt_button', + 'newt_button_bar', + 'newt_checkbox', + 'newt_checkbox_get_value', + 'newt_checkbox_set_flags', + 'newt_checkbox_set_value', + 'newt_checkbox_tree', + 'newt_checkbox_tree_add_item', + 'newt_checkbox_tree_find_item', + 'newt_checkbox_tree_get_current', + 'newt_checkbox_tree_get_entry_value', + 'newt_checkbox_tree_get_multi_selection', + 'newt_checkbox_tree_get_selection', + 'newt_checkbox_tree_multi', + 'newt_checkbox_tree_set_current', + 'newt_checkbox_tree_set_entry', + 'newt_checkbox_tree_set_entry_value', + 'newt_checkbox_tree_set_width', + 'newt_compact_button', + 'newt_component_add_callback', + 'newt_component_takes_focus', + 'newt_create_grid', + 'newt_draw_form', + 'newt_entry', + 'newt_entry_get_value', + 'newt_entry_set', + 'newt_entry_set_filter', + 'newt_entry_set_flags', + 'newt_form', + 'newt_form_add_component', + 'newt_form_add_components', + 'newt_form_add_hot_key', + 'newt_form_destroy', + 'newt_form_get_current', + 'newt_form_run', + 'newt_form_set_background', + 'newt_form_set_height', + 'newt_form_set_size', + 'newt_form_set_timer', + 'newt_form_set_width', + 'newt_form_watch_fd', + 'newt_grid_add_components_to_form', + 'newt_grid_basic_window', + 'newt_grid_free', + 'newt_grid_get_size', + 'newt_grid_h_close_stacked', + 'newt_grid_h_stacked', + 'newt_grid_place', + 'newt_grid_set_field', + 'newt_grid_simple_window', + 'newt_grid_v_close_stacked', + 'newt_grid_v_stacked', + 'newt_grid_wrapped_window', + 'newt_grid_wrapped_window_at', + 'newt_label', + 'newt_label_set_text', + 'newt_listbox', + 'newt_listbox_append_entry', + 'newt_listbox_clear', + 'newt_listbox_clear_selection', + 'newt_listbox_delete_entry', + 'newt_listbox_get_current', + 'newt_listbox_get_selection', + 'newt_listbox_insert_entry', + 'newt_listbox_item_count', + 'newt_listbox_select_item', + 'newt_listbox_set_current', + 'newt_listbox_set_current_by_key', + 'newt_listbox_set_data', + 'newt_listbox_set_entry', + 'newt_listbox_set_width', + 'newt_listitem', + 'newt_listitem_get_data', + 'newt_listitem_set', + 'newt_radio_get_current', + 'newt_radiobutton', + 'newt_run_form', + 'newt_scale', + 'newt_scale_set', + 'newt_scrollbar_set', + 'newt_textbox', + 'newt_textbox_get_num_lines', + 'newt_textbox_reflowed', + 'newt_textbox_set_height', + 'newt_textbox_set_text', + 'newt_vertical_scrollbar', + 'oci_bind_array_by_name', + 'oci_bind_by_name', + 'oci_cancel', + 'oci_close', + 'oci_commit', + 'oci_connect', + 'oci_define_by_name', + 'oci_error', + 'oci_execute', + 'oci_fetch', + 'oci_fetch_all', + 'oci_fetch_array', + 'oci_fetch_assoc', + 'oci_fetch_object', + 'oci_fetch_row', + 'oci_field_is_null', + 'oci_field_name', + 'oci_field_precision', + 'oci_field_scale', + 'oci_field_size', + 'oci_field_type', + 'oci_field_type_raw', + 'oci_free_cursor', + 'oci_free_statement', + 'oci_get_implicit_resultset', + 'oci_new_collection', + 'oci_new_connect', + 'oci_new_cursor', + 'oci_new_descriptor', + 'oci_num_fields', + 'oci_num_rows', + 'oci_parse', + 'oci_pconnect', + 'oci_register_taf_callback', + 'oci_result', + 'oci_rollback', + 'oci_server_version', + 'oci_set_action', + 'oci_set_client_identifier', + 'oci_set_client_info', + 'oci_set_module_name', + 'oci_set_prefetch', + 'oci_statement_type', + 'oci_unregister_taf_callback', + 'odbc_autocommit', + 'odbc_close', + 'odbc_columnprivileges', + 'odbc_columns', + 'odbc_commit', + 'odbc_connect', + 'odbc_cursor', + 'odbc_data_source', + 'odbc_do', + 'odbc_error', + 'odbc_errormsg', + 'odbc_exec', + 'odbc_execute', + 'odbc_fetch_array', + 'odbc_fetch_into', + 'odbc_fetch_row', + 'odbc_field_len', + 'odbc_field_name', + 'odbc_field_num', + 'odbc_field_precision', + 'odbc_field_scale', + 'odbc_field_type', + 'odbc_foreignkeys', + 'odbc_free_result', + 'odbc_gettypeinfo', + 'odbc_next_result', + 'odbc_num_fields', + 'odbc_num_rows', + 'odbc_pconnect', + 'odbc_prepare', + 'odbc_primarykeys', + 'odbc_procedurecolumns', + 'odbc_procedures', + 'odbc_result', + 'odbc_result_all', + 'odbc_rollback', + 'odbc_setoption', + 'odbc_specialcolumns', + 'odbc_statistics', + 'odbc_tableprivileges', + 'odbc_tables', + 'openal_buffer_create', + 'openal_buffer_data', + 'openal_buffer_destroy', + 'openal_buffer_get', + 'openal_buffer_loadwav', + 'openal_context_create', + 'openal_context_current', + 'openal_context_destroy', + 'openal_context_process', + 'openal_context_suspend', + 'openal_device_close', + 'openal_device_open', + 'openal_source_create', + 'openal_source_destroy', + 'openal_source_get', + 'openal_source_pause', + 'openal_source_play', + 'openal_source_rewind', + 'openal_source_set', + 'openal_source_stop', + 'openal_stream', + 'opendir', + 'openssl_csr_new', + 'openssl_dh_compute_key', + 'openssl_free_key', + 'openssl_pkey_export', + 'openssl_pkey_free', + 'openssl_pkey_get_details', + 'openssl_spki_new', + 'openssl_x509_free', + 'pclose', + 'pfsockopen', + 'pg_affected_rows', + 'pg_cancel_query', + 'pg_client_encoding', + 'pg_close', + 'pg_connect_poll', + 'pg_connection_busy', + 'pg_connection_reset', + 'pg_connection_status', + 'pg_consume_input', + 'pg_convert', + 'pg_copy_from', + 'pg_copy_to', + 'pg_dbname', + 'pg_delete', + 'pg_end_copy', + 'pg_escape_bytea', + 'pg_escape_identifier', + 'pg_escape_literal', + 'pg_escape_string', + 'pg_execute', + 'pg_fetch_all', + 'pg_fetch_all_columns', + 'pg_fetch_array', + 'pg_fetch_assoc', + 'pg_fetch_row', + 'pg_field_name', + 'pg_field_num', + 'pg_field_size', + 'pg_field_table', + 'pg_field_type', + 'pg_field_type_oid', + 'pg_flush', + 'pg_free_result', + 'pg_get_notify', + 'pg_get_pid', + 'pg_get_result', + 'pg_host', + 'pg_insert', + 'pg_last_error', + 'pg_last_notice', + 'pg_last_oid', + 'pg_lo_close', + 'pg_lo_create', + 'pg_lo_export', + 'pg_lo_import', + 'pg_lo_open', + 'pg_lo_read', + 'pg_lo_read_all', + 'pg_lo_seek', + 'pg_lo_tell', + 'pg_lo_truncate', + 'pg_lo_unlink', + 'pg_lo_write', + 'pg_meta_data', + 'pg_num_fields', + 'pg_num_rows', + 'pg_options', + 'pg_parameter_status', + 'pg_ping', + 'pg_port', + 'pg_prepare', + 'pg_put_line', + 'pg_query', + 'pg_query_params', + 'pg_result_error', + 'pg_result_error_field', + 'pg_result_seek', + 'pg_result_status', + 'pg_select', + 'pg_send_execute', + 'pg_send_prepare', + 'pg_send_query', + 'pg_send_query_params', + 'pg_set_client_encoding', + 'pg_set_error_verbosity', + 'pg_socket', + 'pg_trace', + 'pg_transaction_status', + 'pg_tty', + 'pg_untrace', + 'pg_update', + 'pg_version', + 'php_user_filter::filter', + 'proc_close', + 'proc_get_status', + 'proc_terminate', + 'ps_add_bookmark', + 'ps_add_launchlink', + 'ps_add_locallink', + 'ps_add_note', + 'ps_add_pdflink', + 'ps_add_weblink', + 'ps_arc', + 'ps_arcn', + 'ps_begin_page', + 'ps_begin_pattern', + 'ps_begin_template', + 'ps_circle', + 'ps_clip', + 'ps_close', + 'ps_close_image', + 'ps_closepath', + 'ps_closepath_stroke', + 'ps_continue_text', + 'ps_curveto', + 'ps_delete', + 'ps_end_page', + 'ps_end_pattern', + 'ps_end_template', + 'ps_fill', + 'ps_fill_stroke', + 'ps_findfont', + 'ps_get_buffer', + 'ps_get_parameter', + 'ps_get_value', + 'ps_hyphenate', + 'ps_include_file', + 'ps_lineto', + 'ps_makespotcolor', + 'ps_moveto', + 'ps_new', + 'ps_open_file', + 'ps_open_image', + 'ps_open_image_file', + 'ps_open_memory_image', + 'ps_place_image', + 'ps_rect', + 'ps_restore', + 'ps_rotate', + 'ps_save', + 'ps_scale', + 'ps_set_border_color', + 'ps_set_border_dash', + 'ps_set_border_style', + 'ps_set_info', + 'ps_set_parameter', + 'ps_set_text_pos', + 'ps_set_value', + 'ps_setcolor', + 'ps_setdash', + 'ps_setflat', + 'ps_setfont', + 'ps_setgray', + 'ps_setlinecap', + 'ps_setlinejoin', + 'ps_setlinewidth', + 'ps_setmiterlimit', + 'ps_setoverprintmode', + 'ps_setpolydash', + 'ps_shading', + 'ps_shading_pattern', + 'ps_shfill', + 'ps_show', + 'ps_show2', + 'ps_show_boxed', + 'ps_show_xy', + 'ps_show_xy2', + 'ps_string_geometry', + 'ps_stringwidth', + 'ps_stroke', + 'ps_symbol', + 'ps_symbol_name', + 'ps_symbol_width', + 'ps_translate', + 'px_close', + 'px_create_fp', + 'px_date2string', + 'px_delete', + 'px_delete_record', + 'px_get_field', + 'px_get_info', + 'px_get_parameter', + 'px_get_record', + 'px_get_schema', + 'px_get_value', + 'px_insert_record', + 'px_new', + 'px_numfields', + 'px_numrecords', + 'px_open_fp', + 'px_put_record', + 'px_retrieve_record', + 'px_set_blob_file', + 'px_set_parameter', + 'px_set_tablename', + 'px_set_targetencoding', + 'px_set_value', + 'px_timestamp2string', + 'px_update_record', + 'radius_acct_open', + 'radius_add_server', + 'radius_auth_open', + 'radius_close', + 'radius_config', + 'radius_create_request', + 'radius_demangle', + 'radius_demangle_mppe_key', + 'radius_get_attr', + 'radius_put_addr', + 'radius_put_attr', + 'radius_put_int', + 'radius_put_string', + 'radius_put_vendor_addr', + 'radius_put_vendor_attr', + 'radius_put_vendor_int', + 'radius_put_vendor_string', + 'radius_request_authenticator', + 'radius_salt_encrypt_attr', + 'radius_send_request', + 'radius_server_secret', + 'radius_strerror', + 'readdir', + 'readfile', + 'recode_file', + 'rename', + 'rewind', + 'rewinddir', + 'rmdir', + 'rpm_close', + 'rpm_get_tag', + 'rpm_open', + 'sapi_windows_vt100_support', + 'scandir', + 'sem_acquire', + 'sem_get', + 'sem_release', + 'sem_remove', + 'set_file_buffer', + 'shm_attach', + 'shm_detach', + 'shm_get_var', + 'shm_has_var', + 'shm_put_var', + 'shm_remove', + 'shm_remove_var', + 'shmop_close', + 'shmop_delete', + 'shmop_open', + 'shmop_read', + 'shmop_size', + 'shmop_write', + 'socket_accept', + 'socket_addrinfo_bind', + 'socket_addrinfo_connect', + 'socket_addrinfo_explain', + 'socket_bind', + 'socket_clear_error', + 'socket_close', + 'socket_connect', + 'socket_export_stream', + 'socket_get_option', + 'socket_get_status', + 'socket_getopt', + 'socket_getpeername', + 'socket_getsockname', + 'socket_import_stream', + 'socket_last_error', + 'socket_listen', + 'socket_read', + 'socket_recv', + 'socket_recvfrom', + 'socket_recvmsg', + 'socket_send', + 'socket_sendmsg', + 'socket_sendto', + 'socket_set_block', + 'socket_set_blocking', + 'socket_set_nonblock', + 'socket_set_option', + 'socket_set_timeout', + 'socket_shutdown', + 'socket_write', + 'sqlite_close', + 'sqlite_fetch_string', + 'sqlite_has_more', + '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_auth_hostbased_file', + 'ssh2_auth_none', + 'ssh2_auth_password', + 'ssh2_auth_pubkey_file', + 'ssh2_disconnect', + 'ssh2_exec', + 'ssh2_fetch_stream', + 'ssh2_fingerprint', + 'ssh2_methods_negotiated', + 'ssh2_publickey_add', + 'ssh2_publickey_init', + 'ssh2_publickey_list', + 'ssh2_publickey_remove', + 'ssh2_scp_recv', + 'ssh2_scp_send', + 'ssh2_sftp', + 'ssh2_sftp_chmod', + 'ssh2_sftp_lstat', + 'ssh2_sftp_mkdir', + 'ssh2_sftp_readlink', + 'ssh2_sftp_realpath', + 'ssh2_sftp_rename', + 'ssh2_sftp_rmdir', + 'ssh2_sftp_stat', + 'ssh2_sftp_symlink', + 'ssh2_sftp_unlink', + 'ssh2_shell', + 'ssh2_tunnel', + 'stomp_connect', + 'streamWrapper::stream_cast', + 'stream_bucket_append', + 'stream_bucket_make_writeable', + 'stream_bucket_new', + 'stream_bucket_prepend', + 'stream_context_create', + 'stream_context_get_default', + 'stream_context_get_options', + 'stream_context_get_params', + 'stream_context_set_default', + 'stream_context_set_params', + 'stream_copy_to_stream', + 'stream_encoding', + 'stream_filter_append', + 'stream_filter_prepend', + 'stream_filter_remove', + 'stream_get_contents', + 'stream_get_line', + 'stream_get_meta_data', + 'stream_isatty', + 'stream_set_blocking', + 'stream_set_chunk_size', + 'stream_set_read_buffer', + 'stream_set_timeout', + 'stream_set_write_buffer', + 'stream_socket_accept', + 'stream_socket_client', + 'stream_socket_enable_crypto', + 'stream_socket_get_name', + 'stream_socket_recvfrom', + 'stream_socket_sendto', + 'stream_socket_server', + 'stream_socket_shutdown', + 'stream_supports_lock', + 'svn_fs_abort_txn', + 'svn_fs_apply_text', + 'svn_fs_begin_txn2', + 'svn_fs_change_node_prop', + 'svn_fs_check_path', + 'svn_fs_contents_changed', + 'svn_fs_copy', + 'svn_fs_delete', + 'svn_fs_dir_entries', + 'svn_fs_file_contents', + 'svn_fs_file_length', + 'svn_fs_is_dir', + 'svn_fs_is_file', + 'svn_fs_make_dir', + 'svn_fs_make_file', + 'svn_fs_node_created_rev', + 'svn_fs_node_prop', + 'svn_fs_props_changed', + 'svn_fs_revision_prop', + 'svn_fs_revision_root', + 'svn_fs_txn_root', + 'svn_fs_youngest_rev', + 'svn_repos_create', + 'svn_repos_fs', + 'svn_repos_fs_begin_txn_for_commit', + 'svn_repos_fs_commit_txn', + 'svn_repos_open', + 'sybase_affected_rows', + 'sybase_close', + 'sybase_connect', + 'sybase_data_seek', + 'sybase_fetch_array', + 'sybase_fetch_assoc', + 'sybase_fetch_field', + 'sybase_fetch_object', + 'sybase_fetch_row', + 'sybase_field_seek', + 'sybase_free_result', + 'sybase_num_fields', + 'sybase_num_rows', + 'sybase_pconnect', + 'sybase_query', + 'sybase_result', + 'sybase_select_db', + 'sybase_set_message_handler', + 'sybase_unbuffered_query', + 'tmpfile', + 'udm_add_search_limit', + 'udm_alloc_agent', + 'udm_alloc_agent_array', + 'udm_cat_list', + 'udm_cat_path', + 'udm_check_charset', + 'udm_clear_search_limits', + 'udm_crc32', + 'udm_errno', + 'udm_error', + 'udm_find', + 'udm_free_agent', + 'udm_free_res', + 'udm_get_doc_count', + 'udm_get_res_field', + 'udm_get_res_param', + 'udm_hash32', + 'udm_load_ispell_data', + 'udm_set_agent_param', + 'unlink', + 'vfprintf', + 'w32api_init_dtype', + 'wddx_add_vars', + 'wddx_packet_end', + 'wddx_packet_start', + 'xml_get_current_byte_index', + 'xml_get_current_column_number', + 'xml_get_current_line_number', + 'xml_get_error_code', + 'xml_parse', + 'xml_parse_into_struct', + 'xml_parser_create', + 'xml_parser_create_ns', + 'xml_parser_free', + 'xml_parser_get_option', + 'xml_parser_set_option', + 'xml_set_character_data_handler', + 'xml_set_default_handler', + 'xml_set_element_handler', + 'xml_set_end_namespace_decl_handler', + 'xml_set_external_entity_ref_handler', + 'xml_set_notation_decl_handler', + 'xml_set_object', + 'xml_set_processing_instruction_handler', + 'xml_set_start_namespace_decl_handler', + 'xml_set_unparsed_entity_decl_handler', + 'xmlrpc_server_add_introspection_data', + 'xmlrpc_server_call_method', + 'xmlrpc_server_create', + 'xmlrpc_server_destroy', + 'xmlrpc_server_register_introspection_callback', + 'xmlrpc_server_register_method', + 'xmlwriter_end_attribute', + 'xmlwriter_end_cdata', + 'xmlwriter_end_comment', + 'xmlwriter_end_document', + 'xmlwriter_end_dtd', + 'xmlwriter_end_dtd_attlist', + 'xmlwriter_end_dtd_element', + 'xmlwriter_end_dtd_entity', + 'xmlwriter_end_element', + 'xmlwriter_end_pi', + 'xmlwriter_flush', + 'xmlwriter_full_end_element', + 'xmlwriter_open_memory', + 'xmlwriter_open_uri', + 'xmlwriter_output_memory', + 'xmlwriter_set_indent', + 'xmlwriter_set_indent_string', + 'xmlwriter_start_attribute', + 'xmlwriter_start_attribute_ns', + 'xmlwriter_start_cdata', + 'xmlwriter_start_comment', + 'xmlwriter_start_document', + 'xmlwriter_start_dtd', + 'xmlwriter_start_dtd_attlist', + 'xmlwriter_start_dtd_element', + 'xmlwriter_start_dtd_entity', + 'xmlwriter_start_element', + 'xmlwriter_start_element_ns', + 'xmlwriter_start_pi', + 'xmlwriter_text', + 'xmlwriter_write_attribute', + 'xmlwriter_write_attribute_ns', + 'xmlwriter_write_cdata', + 'xmlwriter_write_comment', + 'xmlwriter_write_dtd', + 'xmlwriter_write_dtd_attlist', + 'xmlwriter_write_dtd_element', + 'xmlwriter_write_dtd_entity', + 'xmlwriter_write_element', + 'xmlwriter_write_element_ns', + 'xmlwriter_write_pi', + 'xmlwriter_write_raw', + 'xslt_create', + 'yaz_addinfo', + 'yaz_ccl_conf', + 'yaz_ccl_parse', + 'yaz_close', + 'yaz_database', + 'yaz_element', + 'yaz_errno', + 'yaz_error', + 'yaz_es', + 'yaz_es_result', + 'yaz_get_option', + 'yaz_hits', + 'yaz_itemorder', + 'yaz_present', + 'yaz_range', + 'yaz_record', + 'yaz_scan', + 'yaz_scan_result', + 'yaz_schema', + 'yaz_search', + 'yaz_sort', + 'yaz_syntax', + 'zip_close', + 'zip_entry_close', + 'zip_entry_compressedsize', + 'zip_entry_compressionmethod', + 'zip_entry_filesize', + 'zip_entry_name', + 'zip_entry_open', + 'zip_entry_read', + 'zip_open', + 'zip_read', + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/tests/ResourceOperationsTest.php b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/tests/ResourceOperationsTest.php new file mode 100644 index 0000000000..f05ea0d502 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/resource-operations/tests/ResourceOperationsTest.php @@ -0,0 +1,26 @@ + + * + * 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); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.gitattributes b/pandora_console/godmode/um_client/vendor/sebastian/type/.gitattributes new file mode 100644 index 0000000000..15e41cb1b8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.gitattributes @@ -0,0 +1,2 @@ +/tools export-ignore + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.github/FUNDING.yml b/pandora_console/godmode/um_client/vendor/sebastian/type/.github/FUNDING.yml new file mode 100644 index 0000000000..b19ea81a02 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.github/FUNDING.yml @@ -0,0 +1 @@ +patreon: s_bergmann diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/type/.gitignore new file mode 100644 index 0000000000..832c68a7bd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.gitignore @@ -0,0 +1,72 @@ +/.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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/inspectionProfiles/Project_Default.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000000..272394b899 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,499 @@ + + + + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/misc.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/misc.xml new file mode 100644 index 0000000000..28a804d893 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/modules.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/modules.xml new file mode 100644 index 0000000000..cfc6039c35 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php-inspections-ea-ultimate.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php-inspections-ea-ultimate.xml new file mode 100644 index 0000000000..26c2a682bd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php-inspections-ea-ultimate.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php.xml new file mode 100644 index 0000000000..b4dab66537 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/php.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/type.iml b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/type.iml new file mode 100644 index 0000000000..24c4e40421 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/type.iml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/vcs.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.php_cs.dist b/pandora_console/godmode/um_client/vendor/sebastian/type/.php_cs.dist new file mode 100644 index 0000000000..00eae398f4 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.php_cs.dist @@ -0,0 +1,200 @@ + + +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') + ); diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/.travis.yml b/pandora_console/godmode/um_client/vendor/sebastian/type/.travis.yml new file mode 100644 index 0000000000..961341b36a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/.travis.yml @@ -0,0 +1,53 @@ +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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/ChangeLog.md b/pandora_console/godmode/um_client/vendor/sebastian/type/ChangeLog.md new file mode 100644 index 0000000000..3618db10f1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/ChangeLog.md @@ -0,0 +1,45 @@ +# ChangeLog + +All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [1.1.4] - 2020-11-30 + +### Changed + +* Changed PHP version constraint in `composer.json` from `^7.2` to `>=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) + +[1.1.4]: https://github.com/sebastianbergmann/type/compare/1.1.3...1.1.4 +[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 diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/type/LICENSE new file mode 100644 index 0000000000..c58cd4ef1e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/LICENSE @@ -0,0 +1,33 @@ +sebastian/type + +Copyright (c) 2019, 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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/README.md b/pandora_console/godmode/um_client/vendor/sebastian/type/README.md new file mode 100644 index 0000000000..c7c8da64e5 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/README.md @@ -0,0 +1,17 @@ +# 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 +``` diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/build.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/build.xml new file mode 100644 index 0000000000..d081430501 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/build.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/type/composer.json new file mode 100644 index 0000000000..5a2d6222b1 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/composer.json @@ -0,0 +1,49 @@ +{ + "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": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.2" + }, + "config": { + "platform": { + "php": "7.2.0" + }, + "optimize-autoloader": true, + "sort-packages": true + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "autoload-dev": { + "classmap": [ + "tests/_fixture" + ], + "files": [ + "tests/_fixture/callback_function.php" + ] + }, + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/phive.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/phive.xml new file mode 100644 index 0000000000..8c97a15469 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/phive.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/phpunit.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/phpunit.xml new file mode 100644 index 0000000000..0007cf7ea2 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/phpunit.xml @@ -0,0 +1,23 @@ + + + + + tests/unit + + + + + + src + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/psalm.xml b/pandora_console/godmode/um_client/vendor/sebastian/type/psalm.xml new file mode 100644 index 0000000000..c94bb67e7a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/psalm.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/CallableType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/CallableType.php new file mode 100644 index 0000000000..28b5df8c99 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/CallableType.php @@ -0,0 +1,182 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/GenericObjectType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/GenericObjectType.php new file mode 100644 index 0000000000..7e0a6d2b94 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/GenericObjectType.php @@ -0,0 +1,46 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/IterableType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/IterableType.php new file mode 100644 index 0000000000..49830d3e19 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/IterableType.php @@ -0,0 +1,67 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/NullType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/NullType.php new file mode 100644 index 0000000000..0efe107648 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/NullType.php @@ -0,0 +1,28 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/ObjectType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/ObjectType.php new file mode 100644 index 0000000000..9a8d99e0d9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/ObjectType.php @@ -0,0 +1,63 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/SimpleType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/SimpleType.php new file mode 100644 index 0000000000..07662b8f4e --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/SimpleType.php @@ -0,0 +1,86 @@ + + * + * 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; + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/Type.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/Type.php new file mode 100644 index 0000000000..df7dce680b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/Type.php @@ -0,0 +1,75 @@ + + * + * 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; +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/TypeName.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/TypeName.php new file mode 100644 index 0000000000..fbbe36e344 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/TypeName.php @@ -0,0 +1,77 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Type; + +final class TypeName +{ + /** + * @var ?string + */ + private $namespaceName; + + /** + * @var string + */ + private $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 getNamespaceName(): ?string + { + return $this->namespaceName; + } + + public function getSimpleName(): string + { + return $this->simpleName; + } + + public function getQualifiedName(): string + { + return $this->namespaceName === null + ? $this->simpleName + : $this->namespaceName . '\\' . $this->simpleName; + } + + public function isNamespaced(): bool + { + return $this->namespaceName !== null; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/UnknownType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/UnknownType.php new file mode 100644 index 0000000000..859f01de44 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/UnknownType.php @@ -0,0 +1,28 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/VoidType.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/VoidType.php new file mode 100644 index 0000000000..f6fabaadc6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/VoidType.php @@ -0,0 +1,28 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/Exception.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/Exception.php new file mode 100644 index 0000000000..9f0de24ded --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/Exception.php @@ -0,0 +1,14 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace SebastianBergmann\Type; + +interface Exception +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/RuntimeException.php b/pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/RuntimeException.php new file mode 100644 index 0000000000..4dfea6a6a8 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/src/exception/RuntimeException.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ChildClass.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ChildClass.php new file mode 100644 index 0000000000..41e424549b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ChildClass.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithCallbackMethods.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithCallbackMethods.php new file mode 100644 index 0000000000..46137b4645 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithCallbackMethods.php @@ -0,0 +1,21 @@ + + * + * 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 + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithInvokeMethod.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithInvokeMethod.php new file mode 100644 index 0000000000..1765570b1a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ClassWithInvokeMethod.php @@ -0,0 +1,17 @@ + + * + * 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 + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/Iterator.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/Iterator.php new file mode 100644 index 0000000000..e234dbe853 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/Iterator.php @@ -0,0 +1,33 @@ + + * + * 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 + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ParentClass.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ParentClass.php new file mode 100644 index 0000000000..4c28a5ea45 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/ParentClass.php @@ -0,0 +1,17 @@ + + * + * 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 + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/callback_function.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/callback_function.php new file mode 100644 index 0000000000..8dc1807d29 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/_fixture/callback_function.php @@ -0,0 +1,14 @@ + + * + * 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 +{ +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/CallableTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/CallableTypeTest.php new file mode 100644 index 0000000000..126ceddd06 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/CallableTypeTest.php @@ -0,0 +1,150 @@ + + * + * 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) + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/GenericObjectTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/GenericObjectTypeTest.php new file mode 100644 index 0000000000..2017371d11 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/GenericObjectTypeTest.php @@ -0,0 +1,86 @@ + + * + * 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) + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/IterableTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/IterableTypeTest.php new file mode 100644 index 0000000000..5493222f2c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/IterableTypeTest.php @@ -0,0 +1,97 @@ + + * + * 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) + ) + ); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/NullTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/NullTypeTest.php new file mode 100644 index 0000000000..7f4862eb34 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/NullTypeTest.php @@ -0,0 +1,72 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/ObjectTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/ObjectTypeTest.php new file mode 100644 index 0000000000..bbf64bb317 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/ObjectTypeTest.php @@ -0,0 +1,140 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/SimpleTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/SimpleTypeTest.php new file mode 100644 index 0000000000..d795e8c280 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/SimpleTypeTest.php @@ -0,0 +1,162 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeNameTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeNameTest.php new file mode 100644 index 0000000000..4e24a9ab98 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeNameTest.php @@ -0,0 +1,59 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeTest.php new file mode 100644 index 0000000000..5bc4b7d518 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/TypeTest.php @@ -0,0 +1,85 @@ + + * + * 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)], + ]; + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/UnknownTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/UnknownTypeTest.php new file mode 100644 index 0000000000..bfa90f60b6 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/UnknownTypeTest.php @@ -0,0 +1,58 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/VoidTypeTest.php b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/VoidTypeTest.php new file mode 100644 index 0000000000..794052fddd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/type/tests/unit/VoidTypeTest.php @@ -0,0 +1,70 @@ + + * + * 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()); + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/version/.gitattributes b/pandora_console/godmode/um_client/vendor/sebastian/version/.gitattributes new file mode 100644 index 0000000000..461090b7ec --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/version/.gitattributes @@ -0,0 +1 @@ +*.php diff=php diff --git a/pandora_console/godmode/um_client/vendor/sebastian/version/.gitignore b/pandora_console/godmode/um_client/vendor/sebastian/version/.gitignore new file mode 100644 index 0000000000..a09c56df5c --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/version/.gitignore @@ -0,0 +1 @@ +/.idea diff --git a/pandora_console/godmode/um_client/vendor/sebastian/version/.php_cs b/pandora_console/godmode/um_client/vendor/sebastian/version/.php_cs new file mode 100644 index 0000000000..8cbc57c79b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/version/.php_cs @@ -0,0 +1,66 @@ +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); + diff --git a/pandora_console/godmode/um_client/vendor/sebastian/version/LICENSE b/pandora_console/godmode/um_client/vendor/sebastian/version/LICENSE new file mode 100644 index 0000000000..5b79c41f63 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/version/LICENSE @@ -0,0 +1,33 @@ +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. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/version/README.md b/pandora_console/godmode/um_client/vendor/sebastian/version/README.md new file mode 100644 index 0000000000..2864c81269 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/version/README.md @@ -0,0 +1,43 @@ +# 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`. diff --git a/pandora_console/godmode/um_client/vendor/sebastian/version/composer.json b/pandora_console/godmode/um_client/vendor/sebastian/version/composer.json new file mode 100644 index 0000000000..3b87814c13 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/version/composer.json @@ -0,0 +1,29 @@ +{ + "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" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/sebastian/version/src/Version.php b/pandora_console/godmode/um_client/vendor/sebastian/version/src/Version.php new file mode 100644 index 0000000000..fc4cfecbf9 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/sebastian/version/src/Version.php @@ -0,0 +1,109 @@ + + * + * 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; + } +} diff --git a/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/Ctype.php b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/Ctype.php new file mode 100644 index 0000000000..58414dc73b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/Ctype.php @@ -0,0 +1,227 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Ctype; + +/** + * Ctype implementation through regex. + * + * @internal + * + * @author Gert de Pagter + */ +final class Ctype +{ + /** + * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise. + * + * @see https://php.net/ctype-alnum + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alnum($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is a letter, FALSE otherwise. + * + * @see https://php.net/ctype-alpha + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_alpha($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text); + } + + /** + * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise. + * + * @see https://php.net/ctype-cntrl + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_cntrl($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text); + } + + /** + * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise. + * + * @see https://php.net/ctype-digit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_digit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text); + } + + /** + * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise. + * + * @see https://php.net/ctype-graph + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_graph($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text); + } + + /** + * Returns TRUE if every character in text is a lowercase letter. + * + * @see https://php.net/ctype-lower + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_lower($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text); + } + + /** + * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all. + * + * @see https://php.net/ctype-print + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_print($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text); + } + + /** + * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise. + * + * @see https://php.net/ctype-punct + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_punct($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text); + } + + /** + * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters. + * + * @see https://php.net/ctype-space + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_space($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text); + } + + /** + * Returns TRUE if every character in text is an uppercase letter. + * + * @see https://php.net/ctype-upper + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_upper($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text); + } + + /** + * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise. + * + * @see https://php.net/ctype-xdigit + * + * @param string|int $text + * + * @return bool + */ + public static function ctype_xdigit($text) + { + $text = self::convert_int_to_char_for_ctype($text); + + return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text); + } + + /** + * Converts integers to their char versions according to normal ctype behaviour, if needed. + * + * If an integer between -128 and 255 inclusive is provided, + * it is interpreted as the ASCII value of a single character + * (negative values have 256 added in order to allow characters in the Extended ASCII range). + * Any other integer is interpreted as a string containing the decimal digits of the integer. + * + * @param string|int $int + * + * @return mixed + */ + private static function convert_int_to_char_for_ctype($int) + { + if (!\is_int($int)) { + return $int; + } + + if ($int < -128 || $int > 255) { + return (string) $int; + } + + if ($int < 0) { + $int += 256; + } + + return \chr($int); + } +} diff --git a/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/LICENSE b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/LICENSE new file mode 100644 index 0000000000..3f853aaf35 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/README.md b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/README.md new file mode 100644 index 0000000000..8add1ab009 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Ctype +======================== + +This component provides `ctype_*` functions to users who run php versions without the ctype extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap.php b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap.php new file mode 100644 index 0000000000..d54524b31b --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap.php @@ -0,0 +1,50 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (\PHP_VERSION_ID >= 80000) { + return require __DIR__.'/bootstrap80.php'; +} + +if (!function_exists('ctype_alnum')) { + function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit($text) { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph($text) { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower($text) { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print($text) { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct($text) { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space($text) { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper($text) { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); } +} diff --git a/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap80.php b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap80.php new file mode 100644 index 0000000000..ab2f8611da --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/bootstrap80.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Ctype as p; + +if (!function_exists('ctype_alnum')) { + function ctype_alnum(mixed $text): bool { return p\Ctype::ctype_alnum($text); } +} +if (!function_exists('ctype_alpha')) { + function ctype_alpha(mixed $text): bool { return p\Ctype::ctype_alpha($text); } +} +if (!function_exists('ctype_cntrl')) { + function ctype_cntrl(mixed $text): bool { return p\Ctype::ctype_cntrl($text); } +} +if (!function_exists('ctype_digit')) { + function ctype_digit(mixed $text): bool { return p\Ctype::ctype_digit($text); } +} +if (!function_exists('ctype_graph')) { + function ctype_graph(mixed $text): bool { return p\Ctype::ctype_graph($text); } +} +if (!function_exists('ctype_lower')) { + function ctype_lower(mixed $text): bool { return p\Ctype::ctype_lower($text); } +} +if (!function_exists('ctype_print')) { + function ctype_print(mixed $text): bool { return p\Ctype::ctype_print($text); } +} +if (!function_exists('ctype_punct')) { + function ctype_punct(mixed $text): bool { return p\Ctype::ctype_punct($text); } +} +if (!function_exists('ctype_space')) { + function ctype_space(mixed $text): bool { return p\Ctype::ctype_space($text); } +} +if (!function_exists('ctype_upper')) { + function ctype_upper(mixed $text): bool { return p\Ctype::ctype_upper($text); } +} +if (!function_exists('ctype_xdigit')) { + function ctype_xdigit(mixed $text): bool { return p\Ctype::ctype_xdigit($text); } +} diff --git a/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/composer.json b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/composer.json new file mode 100644 index 0000000000..995978c0a7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/symfony/polyfill-ctype/composer.json @@ -0,0 +1,38 @@ +{ + "name": "symfony/polyfill-ctype", + "type": "library", + "description": "Symfony polyfill for ctype functions", + "keywords": ["polyfill", "compatibility", "portable", "ctype"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=7.1" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/.php_cs.dist b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/.php_cs.dist new file mode 100644 index 0000000000..8ac26d0966 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/.php_cs.dist @@ -0,0 +1,213 @@ +registerCustomFixers([ + new \PharIo\CSFixer\PhpdocSingleLineVarFixer() + ]) + ->setRiskyAllowed(true) + ->setRules( + [ + 'PharIo/phpdoc_single_line_var_fixer' => true, + + 'align_multiline_comment' => true, + 'array_indentation' => true, + 'array_syntax' => ['syntax' => 'short'], + 'binary_operator_spaces' => [ + 'operators' => [ + '=' => 'align_single_space_minimal', + '=>' => 'align', + ], + ], + 'blank_line_after_namespace' => true, + 'blank_line_after_opening_tag' => false, + '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' => [ + 'allow_single_line_closure' => false, + 'position_after_anonymous_constructs' => 'same', + 'position_after_control_structures' => 'same', + 'position_after_functions_and_oop_constructs' => 'same' + ], + 'cast_spaces' => ['space' => 'none'], + + // This fixer removes the blank line at class start, no way to disable that, so we disable the fixer :( + //'class_attributes_separation' => ['elements' => ['const', 'method', 'property']], + + 'combine_consecutive_issets' => true, + 'combine_consecutive_unsets' => true, + 'compact_nullable_typehint' => true, + 'concat_space' => ['spacing' => 'one'], + 'date_time_immutable' => true, + 'declare_equal_normalize' => ['space' => 'single'], + 'declare_strict_types' => true, + 'dir_constant' => true, + 'elseif' => true, + 'encoding' => true, + 'full_opening_tag' => true, + 'fully_qualified_strict_types' => true, + 'function_declaration' => [ + 'closure_function_spacing' => 'one' + ], + 'header_comment' => false, + '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' => false, + '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' => false, + 'no_unneeded_curly_braces' => false, + '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' => false, + 'phpdoc_trim' => true, + 'phpdoc_trim_consecutive_blank_line_separation' => true, + 'phpdoc_types' => ['groups' => ['simple', 'meta']], + 'phpdoc_types_order' => true, + 'phpdoc_to_return_type' => 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' => false, + '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' => false, + 'trim_array_spaces' => true, + 'unary_operator_spaces' => true, + 'visibility_required' => [ + 'elements' => [ + 'const', + 'method', + 'property', + ], + ], + 'void_return' => true, + 'whitespace_after_comma_in_array' => true, + 'yoda_style' => false + ] + ) + ->setFinder( + PhpCsFixer\Finder::create() + ->files() + ->in(__DIR__ . '/src') + ->in(__DIR__ . '/tests') + ->notName('*.phpt') + ->notName('autoload.php') + ); diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/CHANGELOG.md b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/CHANGELOG.md new file mode 100644 index 0000000000..314934f127 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/CHANGELOG.md @@ -0,0 +1,63 @@ +# Changelog + +All notable changes to Tokenizer are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. + +## [1.2.0] - 2020-07-13 + +This release is now PHP 8.0 compliant. + +### Fixed + +* Whitespace handling in general (only noticable in the intermediate `TokenCollection`) is now consitent + +### Changed + +* Updated `Tokenizer` to deal with changed whitespace handling in PHP 8.0 + The XMLSerializer was unaffected. + + +## [1.1.3] - 2019-06-14 + +### Changed + +* Ensure XMLSerializer can deal with empty token collections + +### Fixed + +* [#2](https://github.com/theseer/tokenizer/issues/2): Fatal error in infection / phpunit + + +## [1.1.2] - 2019-04-04 + +### Changed + +* Reverted PHPUnit 8 test update to stay PHP 7.0 compliant + + +## [1.1.1] - 2019-04-03 + +### Fixed + +* [#1](https://github.com/theseer/tokenizer/issues/1): Empty file causes invalid array read + +### Changed + +* Tests should now be PHPUnit 8 compliant + + +## [1.1.0] - 2017-04-07 + +### Added + +* Allow use of custom namespace for XML serialization + + +## [1.0.0] - 2017-04-05 + +Initial Release + +[1.1.3]: https://github.com/theseer/tokenizer/compare/1.1.2...1.1.3 +[1.1.2]: https://github.com/theseer/tokenizer/compare/1.1.1...1.1.2 +[1.1.1]: https://github.com/theseer/tokenizer/compare/1.1.0...1.1.1 +[1.1.0]: https://github.com/theseer/tokenizer/compare/1.0.0...1.1.0 +[1.0.0]: https://github.com/theseer/tokenizer/compare/b2493e57de80c1b7414219b28503fa5c6b4d0a98...1.0.0 diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/LICENSE b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/LICENSE new file mode 100644 index 0000000000..e9694ad611 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/LICENSE @@ -0,0 +1,30 @@ +Tokenizer + +Copyright (c) 2017 Arne Blankerts and contributors +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 Arne Blankerts nor the names of 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. diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/README.md b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/README.md new file mode 100644 index 0000000000..61ecaffac3 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/README.md @@ -0,0 +1,49 @@ +# Tokenizer + +A small library for converting tokenized PHP source code into XML. + +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) +[![Code Coverage](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/?branch=master) +[![Build Status](https://scrutinizer-ci.com/g/theseer/tokenizer/badges/build.png?b=master)](https://scrutinizer-ci.com/g/theseer/tokenizer/build-status/master) + +## Installation + +You can add this library as a local, per-project dependency to your project using [Composer](https://getcomposer.org/): + + composer require theseer/tokenizer + +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 theseer/tokenizer + +## Usage examples + +```php +$tokenizer = new TheSeer\Tokenizer\Tokenizer(); +$tokens = $tokenizer->parse(file_get_contents(__DIR__ . '/src/XMLSerializer.php')); + +$serializer = new TheSeer\Tokenizer\XMLSerializer(); +$xml = $serializer->toXML($tokens); + +echo $xml; +``` + +The generated XML structure looks something like this: + +```xml + + + + <?php + declare + ( + strict_types + + = + + 1 + ) + ; + + +``` diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/composer.json b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/composer.json new file mode 100644 index 0000000000..3f452a9fc7 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/composer.json @@ -0,0 +1,27 @@ +{ + "name": "theseer/tokenizer", + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "license": "BSD-3-Clause", + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "support": { + "issues": "https://github.com/theseer/tokenizer/issues" + }, + "require": { + "php": "^7.2 || ^8.0", + "ext-xmlwriter": "*", + "ext-dom": "*", + "ext-tokenizer": "*" + }, + "autoload": { + "classmap": [ + "src/" + ] + } +} + diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/Exception.php b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/Exception.php new file mode 100644 index 0000000000..71fc117a51 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/Exception.php @@ -0,0 +1,5 @@ +ensureValidUri($value); + $this->value = $value; + } + + public function asString(): string { + return $this->value; + } + + private function ensureValidUri($value): void { + if (\strpos($value, ':') === false) { + throw new NamespaceUriException( + \sprintf("Namespace URI '%s' must contain at least one colon", $value) + ); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/NamespaceUriException.php b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/NamespaceUriException.php new file mode 100644 index 0000000000..ab1c48d299 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/NamespaceUriException.php @@ -0,0 +1,5 @@ +line = $line; + $this->name = $name; + $this->value = $value; + } + + public function getLine(): int { + return $this->line; + } + + public function getName(): string { + return $this->name; + } + + public function getValue(): string { + return $this->value; + } +} diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollection.php b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollection.php new file mode 100644 index 0000000000..e5e6e401cb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollection.php @@ -0,0 +1,93 @@ +tokens[] = $token; + } + + public function current(): Token { + return \current($this->tokens); + } + + public function key(): int { + return \key($this->tokens); + } + + public function next(): void { + \next($this->tokens); + $this->pos++; + } + + public function valid(): bool { + return $this->count() > $this->pos; + } + + public function rewind(): void { + \reset($this->tokens); + $this->pos = 0; + } + + public function count(): int { + return \count($this->tokens); + } + + public function offsetExists($offset): bool { + return isset($this->tokens[$offset]); + } + + /** + * @throws TokenCollectionException + */ + public function offsetGet($offset): Token { + if (!$this->offsetExists($offset)) { + throw new TokenCollectionException( + \sprintf('No Token at offest %s', $offset) + ); + } + + return $this->tokens[$offset]; + } + + /** + * @param Token $value + * + * @throws TokenCollectionException + */ + public function offsetSet($offset, $value): void { + if (!\is_int($offset)) { + $type = \gettype($offset); + + throw new TokenCollectionException( + \sprintf( + 'Offset must be of type integer, %s given', + $type === 'object' ? \get_class($value) : $type + ) + ); + } + + if (!$value instanceof Token) { + $type = \gettype($value); + + throw new TokenCollectionException( + \sprintf( + 'Value must be of type %s, %s given', + Token::class, + $type === 'object' ? \get_class($value) : $type + ) + ); + } + $this->tokens[$offset] = $value; + } + + public function offsetUnset($offset): void { + unset($this->tokens[$offset]); + } +} diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollectionException.php b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollectionException.php new file mode 100644 index 0000000000..4291ce0c4d --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/TokenCollectionException.php @@ -0,0 +1,5 @@ + 'T_OPEN_BRACKET', + ')' => 'T_CLOSE_BRACKET', + '[' => 'T_OPEN_SQUARE', + ']' => 'T_CLOSE_SQUARE', + '{' => 'T_OPEN_CURLY', + '}' => 'T_CLOSE_CURLY', + ';' => 'T_SEMICOLON', + '.' => 'T_DOT', + ',' => 'T_COMMA', + '=' => 'T_EQUAL', + '<' => 'T_LT', + '>' => 'T_GT', + '+' => 'T_PLUS', + '-' => 'T_MINUS', + '*' => 'T_MULT', + '/' => 'T_DIV', + '?' => 'T_QUESTION_MARK', + '!' => 'T_EXCLAMATION_MARK', + ':' => 'T_COLON', + '"' => 'T_DOUBLE_QUOTES', + '@' => 'T_AT', + '&' => 'T_AMPERSAND', + '%' => 'T_PERCENT', + '|' => 'T_PIPE', + '$' => 'T_DOLLAR', + '^' => 'T_CARET', + '~' => 'T_TILDE', + '`' => 'T_BACKTICK' + ]; + + public function parse(string $source): TokenCollection { + $result = new TokenCollection(); + + if ($source === '') { + return $result; + } + + $tokens = \token_get_all($source); + + $lastToken = new Token( + $tokens[0][2], + 'Placeholder', + '' + ); + + foreach ($tokens as $pos => $tok) { + if (\is_string($tok)) { + $token = new Token( + $lastToken->getLine(), + $this->map[$tok], + $tok + ); + $result->addToken($token); + $lastToken = $token; + + continue; + } + + $line = $tok[2]; + $values = \preg_split('/\R+/Uu', $tok[1]); + + foreach ($values as $v) { + $token = new Token( + $line, + \token_name($tok[0]), + $v + ); + $lastToken = $token; + $line++; + + if ($v === '') { + continue; + } + $result->addToken($token); + } + } + + return $this->fillBlanks($result, $lastToken->getLine()); + } + + private function fillBlanks(TokenCollection $tokens, int $maxLine): TokenCollection { + /** @var Token $prev */ + $prev = null; + $final = new TokenCollection(); + + foreach ($tokens as $token) { + if ($prev === null) { + $final->addToken($token); + $prev = $token; + + continue; + } + + $gap = $token->getLine() - $prev->getLine(); + + while ($gap > 1) { + $linebreak = new Token( + $prev->getLine() + 1, + 'T_WHITESPACE', + '' + ); + $final->addToken($linebreak); + $prev = $linebreak; + $gap--; + } + + $final->addToken($token); + $prev = $token; + } + + $gap = $maxLine - $prev->getLine(); + + while ($gap > 0) { + $linebreak = new Token( + $prev->getLine() + 1, + 'T_WHITESPACE', + '' + ); + $final->addToken($linebreak); + $prev = $linebreak; + $gap--; + } + + return $final; + } +} diff --git a/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/XMLSerializer.php b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/XMLSerializer.php new file mode 100644 index 0000000000..e67a7fe8bf --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/theseer/tokenizer/src/XMLSerializer.php @@ -0,0 +1,79 @@ +xmlns = $xmlns; + } + + public function toDom(TokenCollection $tokens): DOMDocument { + $dom = new DOMDocument(); + $dom->preserveWhiteSpace = false; + $dom->loadXML($this->toXML($tokens)); + + return $dom; + } + + public function toXML(TokenCollection $tokens): string { + $this->writer = new \XMLWriter(); + $this->writer->openMemory(); + $this->writer->setIndent(true); + $this->writer->startDocument(); + $this->writer->startElement('source'); + $this->writer->writeAttribute('xmlns', $this->xmlns->asString()); + + if (\count($tokens) > 0) { + $this->writer->startElement('line'); + $this->writer->writeAttribute('no', '1'); + + $this->previousToken = $tokens[0]; + + foreach ($tokens as $token) { + $this->addToken($token); + } + } + + $this->writer->endElement(); + $this->writer->endElement(); + $this->writer->endDocument(); + + return $this->writer->outputMemory(); + } + + private function addToken(Token $token): void { + if ($this->previousToken->getLine() < $token->getLine()) { + $this->writer->endElement(); + + $this->writer->startElement('line'); + $this->writer->writeAttribute('no', (string)$token->getLine()); + $this->previousToken = $token; + } + + if ($token->getValue() !== '') { + $this->writer->startElement('token'); + $this->writer->writeAttribute('name', $token->getName()); + $this->writer->writeRaw(\htmlspecialchars($token->getValue(), \ENT_NOQUOTES | \ENT_DISALLOWED | \ENT_XML1)); + $this->writer->endElement(); + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/.editorconfig b/pandora_console/godmode/um_client/vendor/webmozart/assert/.editorconfig new file mode 100644 index 0000000000..384453bfb0 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset=utf-8 +end_of_line=lf +trim_trailing_whitespace=true +insert_final_newline=true +indent_style=space +indent_size=4 + +[*.yml] +indent_size=2 diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/CHANGELOG.md b/pandora_console/godmode/um_client/vendor/webmozart/assert/CHANGELOG.md new file mode 100644 index 0000000000..1d379277ff --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/CHANGELOG.md @@ -0,0 +1,175 @@ +Changelog +========= + +## UNRELEASED + +## 1.9.1 + +## Fixed + +* provisional support for PHP 8.0 + +## 1.9.0 + +* added better Psalm support for `all*` & `nullOr*` methods + * These methods are now understood by Psalm through a mixin. You may need a newer version of Psalm in order to use this +* added `@psalm-pure` annotation to `Assert::notFalse()` +* added more `@psalm-assert` annotations where appropriate + +## Changed + +* the `all*` & `nullOr*` methods are now declared on an interface, instead of `@method` annotations. +This interface is linked to the `Assert` class with a `@mixin` annotation. Most IDE's have supported this +for a long time, and you should not lose any autocompletion capabilities. PHPStan has supported this since +version `0.12.20`. This package is marked incompatible (with a composer conflict) with phpstan version prior to that. +If you do not use PHPStan than this does not matter. + +## 1.8.0 + +### Added + +* added `Assert::notStartsWith()` +* added `Assert::notEndsWith()` +* added `Assert::inArray()` +* added `@psalm-pure` annotations to pure assertions + +### Fixed + +* Exception messages of comparisons between `DateTime(Immutable)` objects now display their date & time. +* Custom Exception messages for `Assert::count()` now use the values to render the exception message. + +## 1.7.0 (2020-02-14) + +### Added + +* added `Assert::notFalse()` +* added `Assert::isAOf()` +* added `Assert::isAnyOf()` +* added `Assert::isNotA()` + +## 1.6.0 (2019-11-24) + +### Added + +* added `Assert::validArrayKey()` +* added `Assert::isNonEmptyList()` +* added `Assert::isNonEmptyMap()` +* added `@throws InvalidArgumentException` annotations to all methods that throw. +* added `@psalm-assert` for the list type to the `isList` assertion. + +### Fixed + +* `ResourceBundle` & `SimpleXMLElement` now pass the `isCountable` assertions. +They are countable, without implementing the `Countable` interface. +* The doc block of `range` now has the proper variables. +* An empty array will now pass `isList` and `isMap`. As it is a valid form of both. +If a non-empty variant is needed, use `isNonEmptyList` or `isNonEmptyMap`. + +### Changed + +* Removed some `@psalm-assert` annotations, that were 'side effect' assertions See: + * [#144](https://github.com/webmozart/assert/pull/144) + * [#145](https://github.com/webmozart/assert/issues/145) + * [#146](https://github.com/webmozart/assert/pull/146) + * [#150](https://github.com/webmozart/assert/pull/150) +* If you use Psalm, the minimum version needed is `3.6.0`. Which is enforced through a composer conflict. +If you don't use Psalm, then this has no impact. + +## 1.5.0 (2019-08-24) + +### Added + +* added `Assert::uniqueValues()` +* added `Assert::unicodeLetters()` +* added: `Assert::email()` +* added support for [Psalm](https://github.com/vimeo/psalm), by adding `@psalm-assert` annotations where appropriate. + +### Fixed + +* `Assert::endsWith()` would not give the correct result when dealing with a multibyte suffix. +* `Assert::length(), minLength, maxLength, lengthBetween` would not give the correct result when dealing with multibyte characters. + +**NOTE**: These 2 changes may break your assertions if you relied on the fact that multibyte characters didn't behave correctly. + +### Changed + +* The names of some variables have been updated to better reflect what they are. +* All function calls are now in their FQN form, slightly increasing performance. +* Tests are now properly ran against HHVM-3.30 and PHP nightly. + +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + * This was already done in 1.3.0, but it was only done through a silenced `trigger_error`. It is now annotated as well. + +## 1.4.0 (2018-12-25) + +### Added + +* added `Assert::ip()` +* added `Assert::ipv4()` +* added `Assert::ipv6()` +* added `Assert::notRegex()` +* added `Assert::interfaceExists()` +* added `Assert::isList()` +* added `Assert::isMap()` +* added polyfill for ctype + +### Fixed + +* Special case when comparing objects implementing `__toString()` + +## 1.3.0 (2018-01-29) + +### Added + +* added `Assert::minCount()` +* added `Assert::maxCount()` +* added `Assert::countBetween()` +* added `Assert::isCountable()` +* added `Assert::notWhitespaceOnly()` +* added `Assert::natural()` +* added `Assert::notContains()` +* added `Assert::isArrayAccessible()` +* added `Assert::isInstanceOfAny()` +* added `Assert::isIterable()` + +### Fixed + +* `stringNotEmpty` will no longer report "0" is an empty string + +### Deprecation + +* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()` + +## 1.2.0 (2016-11-23) + + * added `Assert::throws()` + * added `Assert::count()` + * added extension point `Assert::reportInvalidArgument()` for custom subclasses + +## 1.1.0 (2016-08-09) + + * added `Assert::object()` + * added `Assert::propertyExists()` + * added `Assert::propertyNotExists()` + * added `Assert::methodExists()` + * added `Assert::methodNotExists()` + * added `Assert::uuid()` + +## 1.0.2 (2015-08-24) + + * integrated Style CI + * add tests for minimum package dependencies on Travis CI + +## 1.0.1 (2015-05-12) + + * added support for PHP 5.3.3 + +## 1.0.0 (2015-05-12) + + * first stable release + +## 1.0.0-beta (2015-03-19) + + * first beta release diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/LICENSE b/pandora_console/godmode/um_client/vendor/webmozart/assert/LICENSE new file mode 100644 index 0000000000..9e2e3075eb --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bernhard Schussek + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/README.md b/pandora_console/godmode/um_client/vendor/webmozart/assert/README.md new file mode 100644 index 0000000000..1407a9a1bd --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/README.md @@ -0,0 +1,283 @@ +Webmozart Assert +================ + +[![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=master)](https://travis-ci.org/webmozart/assert) +[![Build status](https://ci.appveyor.com/api/projects/status/lyg83bcsisrr94se/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/assert/branch/master) +[![Code Coverage](https://scrutinizer-ci.com/g/webmozart/assert/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/webmozart/assert/?branch=master) +[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) +[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) + +This library contains efficient assertions to test the input and output of +your methods. With these assertions, you can greatly reduce the amount of coding +needed to write a safe implementation. + +All assertions in the [`Assert`] class throw an `\InvalidArgumentException` if +they fail. + +FAQ +--- + +**What's the difference to [beberlei/assert]?** + +This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], +but fixes a usability issue with error messages that can't be fixed there without +breaking backwards compatibility. + +This package features usable error messages by default. However, you can also +easily write custom error messages: + +``` +Assert::string($path, 'The path is expected to be a string. Got: %s'); +``` + +In [beberlei/assert], the ordering of the `%s` placeholders is different for +every assertion. This package, on the contrary, provides consistent placeholder +ordering for all assertions: + +* `%s`: The tested value as string, e.g. `"/foo/bar"`. +* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the + minimum/maximum length, allowed values, etc. + +Check the source code of the assertions to find out details about the additional +available placeholders. + +Installation +------------ + +Use [Composer] to install the package: + +``` +$ composer require webmozart/assert +``` + +Example +------- + +```php +use Webmozart\Assert\Assert; + +class Employee +{ + public function __construct($id) + { + Assert::integer($id, 'The employee ID must be an integer. Got: %s'); + Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); + } +} +``` + +If you create an employee with an invalid ID, an exception is thrown: + +```php +new Employee('foobar'); +// => InvalidArgumentException: +// The employee ID must be an integer. Got: string + +new Employee(-10); +// => InvalidArgumentException: +// The employee ID must be a positive integer. Got: -10 +``` + +Assertions +---------- + +The [`Assert`] class provides the following assertions: + +### Type Assertions + +Method | Description +-------------------------------------------------------- | -------------------------------------------------- +`string($value, $message = '')` | Check that a value is a string +`stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string +`integer($value, $message = '')` | Check that a value is an integer +`integerish($value, $message = '')` | Check that a value casts to an integer +`float($value, $message = '')` | Check that a value is a float +`numeric($value, $message = '')` | Check that a value is numeric +`natural($value, $message= ''')` | Check that a value is a non-negative integer +`boolean($value, $message = '')` | Check that a value is a boolean +`scalar($value, $message = '')` | Check that a value is a scalar +`object($value, $message = '')` | Check that a value is an object +`resource($value, $type = null, $message = '')` | Check that a value is a resource +`isCallable($value, $message = '')` | Check that a value is a callable +`isArray($value, $message = '')` | Check that a value is an array +`isTraversable($value, $message = '')` (deprecated) | Check that a value is an array or a `\Traversable` +`isIterable($value, $message = '')` | Check that a value is an array or a `\Traversable` +`isCountable($value, $message = '')` | Check that a value is an array or a `\Countable` +`isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class +`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` at least one class on the array of classes +`notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class +`isAOf($value, $class, $message = '')` | Check that a value is of the class or has one of its parents +`isAnyOf($value, array $classes, $message = '')` | Check that a value is of at least one of the classes or has one of its parents +`isNotA($value, $class, $message = '')` | Check that a value is not of the class or has not one of its parents +`isArrayAccessible($value, $message = '')` | Check that a value can be accessed as an array +`uniqueValues($values, $message = '')` | Check that the given array contains unique values + +### Comparison Assertions + +Method | Description +----------------------------------------------- | ------------------------------------------------------------------ +`true($value, $message = '')` | Check that a value is `true` +`false($value, $message = '')` | Check that a value is `false` +`notFalse($value, $message = '')` | Check that a value is not `false` +`null($value, $message = '')` | Check that a value is `null` +`notNull($value, $message = '')` | Check that a value is not `null` +`isEmpty($value, $message = '')` | Check that a value is `empty()` +`notEmpty($value, $message = '')` | Check that a value is not `empty()` +`eq($value, $value2, $message = '')` | Check that a value equals another (`==`) +`notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) +`same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) +`notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) +`greaterThan($value, $value2, $message = '')` | Check that a value is greater than another +`greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another +`lessThan($value, $value2, $message = '')` | Check that a value is less than another +`lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another +`range($value, $min, $max, $message = '')` | Check that a value is within a range +`inArray($value, array $values, $message = '')` | Check that a value is one of a list of values +`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values (alias of `inArray`) + +### String Assertions + +You should check that a value is a string with `Assert::string()` before making +any of the following assertions. + +Method | Description +--------------------------------------------------- | ----------------------------------------------------------------- +`contains($value, $subString, $message = '')` | Check that a string contains a substring +`notContains($value, $subString, $message = '')` | Check that a string does not contain a substring +`startsWith($value, $prefix, $message = '')` | Check that a string has a prefix +`notStartsWith($value, $prefix, $message = '')` | Check that a string does not have a prefix +`startsWithLetter($value, $message = '')` | Check that a string starts with a letter +`endsWith($value, $suffix, $message = '')` | Check that a string has a suffix +`notEndsWith($value, $suffix, $message = '')` | Check that a string does not have a suffix +`regex($value, $pattern, $message = '')` | Check that a string matches a regular expression +`notRegex($value, $pattern, $message = '')` | Check that a string does not match a regular expression +`unicodeLetters($value, $message = '')` | Check that a string contains Unicode letters only +`alpha($value, $message = '')` | Check that a string contains letters only +`digits($value, $message = '')` | Check that a string contains digits only +`alnum($value, $message = '')` | Check that a string contains letters and digits only +`lower($value, $message = '')` | Check that a string contains lowercase characters only +`upper($value, $message = '')` | Check that a string contains uppercase characters only +`length($value, $length, $message = '')` | Check that a string has a certain number of characters +`minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters +`maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters +`lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range +`uuid($value, $message = '')` | Check that a string is a valid UUID +`ip($value, $message = '')` | Check that a string is a valid IP (either IPv4 or IPv6) +`ipv4($value, $message = '')` | Check that a string is a valid IPv4 +`ipv6($value, $message = '')` | Check that a string is a valid IPv6 +`email($value, $message = '')` | Check that a string is a valid e-mail address +`notWhitespaceOnly($value, $message = '')` | Check that a string contains at least one non-whitespace character + +### File Assertions + +Method | Description +----------------------------------- | -------------------------------------------------- +`fileExists($value, $message = '')` | Check that a value is an existing path +`file($value, $message = '')` | Check that a value is an existing file +`directory($value, $message = '')` | Check that a value is an existing directory +`readable($value, $message = '')` | Check that a value is a readable path +`writable($value, $message = '')` | Check that a value is a writable path + +### Object Assertions + +Method | Description +----------------------------------------------------- | -------------------------------------------------- +`classExists($value, $message = '')` | Check that a value is an existing class name +`subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another +`interfaceExists($value, $message = '')` | Check that a value is an existing interface name +`implementsInterface($value, $class, $message = '')` | Check that a class implements an interface +`propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object +`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object +`methodExists($value, $method, $message = '')` | Check that a method exists in a class/object +`methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object + +### Array Assertions + +Method | Description +-------------------------------------------------- | ------------------------------------------------------------------ +`keyExists($array, $key, $message = '')` | Check that a key exists in an array +`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array +`validArrayKey($key, $message = '')` | Check that a value is a valid array key (int or string) +`count($array, $number, $message = '')` | Check that an array contains a specific number of elements +`minCount($array, $min, $message = '')` | Check that an array contains at least a certain number of elements +`maxCount($array, $max, $message = '')` | Check that an array contains at most a certain number of elements +`countBetween($array, $min, $max, $message = '')` | Check that an array has a count in the given range +`isList($array, $message = '')` | Check that an array is a non-associative list +`isNonEmptyList($array, $message = '')` | Check that an array is a non-associative list, and not empty +`isMap($array, $message = '')` | Check that an array is associative and has strings as keys +`isNonEmptyMap($array, $message = '')` | Check that an array is associative and has strings as keys, and is not empty + +### Function Assertions + +Method | Description +------------------------------------------- | ----------------------------------------------------------------------------------------------------- +`throws($closure, $class, $message = '')` | Check that a function throws a certain exception. Subclasses of the exception class will be accepted. + +### Collection Assertions + +All of the above assertions can be prefixed with `all*()` to test the contents +of an array or a `\Traversable`: + +```php +Assert::allIsInstanceOf($employees, 'Acme\Employee'); +``` + +### Nullable Assertions + +All of the above assertions can be prefixed with `nullOr*()` to run the +assertion only if it the value is not `null`: + +```php +Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); +``` + +### Extending Assert + +The `Assert` class comes with a few methods, which can be overridden to change the class behaviour. You can also extend it to +add your own assertions. + +#### Overriding methods + +Overriding the following methods in your assertion class allows you to change the behaviour of the assertions: + +* `public static function __callStatic($name, $arguments)` + * This method is used to 'create' the `nullOr` and `all` versions of the assertions. +* `protected static function valueToString($value)` + * This method is used for error messages, to convert the value to a string value for displaying. You could use this for representing a value object with a `__toString` method for example. +* `protected static function typeToString($value)` + * This method is used for error messages, to convert the a value to a string representing its type. +* `protected static function strlen($value)` + * This method is used to calculate string length for relevant methods, using the `mb_strlen` if available and useful. +* `protected static function reportInvalidArgument($message)` + * This method is called when an assertion fails, with the specified error message. Here you can throw your own exception, or log something. + + +Authors +------- + +* [Bernhard Schussek] a.k.a. [@webmozart] +* [The Community Contributors] + +Contribute +---------- + +Contributions to the package are always welcome! + +* Report any bugs or issues you find on the [issue tracker]. +* You can grab the source code at the package's [Git repository]. + +License +------- + +All contents of this package are licensed under the [MIT license]. + +[beberlei/assert]: https://github.com/beberlei/assert +[assert package]: https://github.com/beberlei/assert +[Composer]: https://getcomposer.org +[Bernhard Schussek]: https://webmozarts.com +[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors +[issue tracker]: https://github.com/webmozart/assert/issues +[Git repository]: https://github.com/webmozart/assert +[@webmozart]: https://twitter.com/webmozart +[MIT license]: LICENSE +[`Assert`]: src/Assert.php diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/composer.json b/pandora_console/godmode/um_client/vendor/webmozart/assert/composer.json new file mode 100644 index 0000000000..2e609b6307 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/composer.json @@ -0,0 +1,38 @@ +{ + "name": "webmozart/assert", + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "license": "MIT", + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "require": { + "php": "^5.3.3 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^7.5.13" + }, + "conflict": { + "vimeo/psalm": "<3.9.1", + "phpstan/phpstan": "<0.12.20" + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Webmozart\\Assert\\Tests\\": "tests/", + "Webmozart\\Assert\\Bin\\": "bin/src" + } + } +} diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/psalm.xml b/pandora_console/godmode/um_client/vendor/webmozart/assert/psalm.xml new file mode 100644 index 0000000000..9a43008195 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/psalm.xml @@ -0,0 +1,14 @@ + + + + + + + + diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/src/Assert.php b/pandora_console/godmode/um_client/vendor/webmozart/assert/src/Assert.php new file mode 100644 index 0000000000..b28e17841a --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/src/Assert.php @@ -0,0 +1,2048 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\Assert; + +use ArrayAccess; +use BadMethodCallException; +use Closure; +use Countable; +use DateTime; +use DateTimeImmutable; +use Exception; +use InvalidArgumentException; +use ResourceBundle; +use SimpleXMLElement; +use Throwable; +use Traversable; + +/** + * Efficient assertions to validate the input/output of your methods. + * + * @mixin Mixin + * + * @since 1.0 + * + * @author Bernhard Schussek + */ +class Assert +{ + /** + * @psalm-pure + * @psalm-assert string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function string($value, $message = '') + { + if (!\is_string($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a string. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function stringNotEmpty($value, $message = '') + { + static::string($value, $message); + static::notEq($value, '', $message); + } + + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function integer($value, $message = '') + { + if (!\is_int($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an integer. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function integerish($value, $message = '') + { + if (!\is_numeric($value) || $value != (int) $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an integerish value. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function float($value, $message = '') + { + if (!\is_float($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a float. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function numeric($value, $message = '') + { + if (!\is_numeric($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a numeric. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function natural($value, $message = '') + { + if (!\is_int($value) || $value < 0) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-negative integer. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function boolean($value, $message = '') + { + if (!\is_bool($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a boolean. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function scalar($value, $message = '') + { + if (!\is_scalar($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a scalar. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function object($value, $message = '') + { + if (!\is_object($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an object. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function resource($value, $type = null, $message = '') + { + if (!\is_resource($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a resource. Got: %s', + static::typeToString($value) + )); + } + + if ($type && $type !== \get_resource_type($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a resource of type %2$s. Got: %s', + static::typeToString($value), + $type + )); + } + } + + /** + * @psalm-pure + * @psalm-assert callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isCallable($value, $message = '') + { + if (!\is_callable($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a callable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isArray($value, $message = '') + { + if (!\is_array($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isTraversable($value, $message = '') + { + @\trigger_error( + \sprintf( + 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.', + __METHOD__ + ), + \E_USER_DEPRECATED + ); + + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a traversable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isArrayAccessible($value, $message = '') + { + if (!\is_array($value) && !($value instanceof ArrayAccess)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array accessible. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isCountable($value, $message = '') + { + if ( + !\is_array($value) + && !($value instanceof Countable) + && !($value instanceof ResourceBundle) + && !($value instanceof SimpleXMLElement) + ) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a countable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isIterable($value, $message = '') + { + if (!\is_array($value) && !($value instanceof Traversable)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an iterable. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isInstanceOf($value, $class, $message = '') + { + if (!($value instanceof $class)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an instance of %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert !ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notInstanceOf($value, $class, $message = '') + { + if ($value instanceof $class) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an instance other than %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isInstanceOfAny($value, array $classes, $message = '') + { + foreach ($classes as $class) { + if ($value instanceof $class) { + return; + } + } + + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an instance of any of %2$s. Got: %s', + static::typeToString($value), + \implode(', ', \array_map(array('static', 'valueToString'), $classes)) + )); + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert ExpectedType|class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAOf($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (!\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * @psalm-assert !UnexpectedType $value + * @psalm-assert !class-string $value + * + * @param object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNotA($value, $class, $message = '') + { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s', + static::typeToString($value), + $class + )); + } + } + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isAnyOf($value, array $classes, $message = '') + { + foreach ($classes as $class) { + static::string($class, 'Expected class as a string. Got: %s'); + + if (\is_a($value, $class, \is_string($value))) { + return; + } + } + + static::reportInvalidArgument(sprintf( + $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s', + static::typeToString($value), + \implode(', ', \array_map(array('static', 'valueToString'), $classes)) + )); + } + + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isEmpty($value, $message = '') + { + if (!empty($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an empty value. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEmpty($value, $message = '') + { + if (empty($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-empty value. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function null($value, $message = '') + { + if (null !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected null. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !null $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notNull($value, $message = '') + { + if (null === $value) { + static::reportInvalidArgument( + $message ?: 'Expected a value other than null.' + ); + } + } + + /** + * @psalm-pure + * @psalm-assert true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function true($value, $message = '') + { + if (true !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be true. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function false($value, $message = '') + { + if (false !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be false. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notFalse($value, $message = '') + { + if (false === $value) { + static::reportInvalidArgument( + $message ?: 'Expected a value other than false.' + ); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ip($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IP. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv4($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv4. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function ipv6($value, $message = '') + { + if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be an IPv6. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function email($value, $message = '') + { + if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to be a valid e-mail address. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * Does non strict comparisons on the items, so ['3', 3] will not pass the assertion. + * + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uniqueValues(array $values, $message = '') + { + $allValues = \count($values); + $uniqueValues = \count(\array_unique($values)); + + if ($allValues !== $uniqueValues) { + $difference = $allValues - $uniqueValues; + + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array of unique values, but %s of them %s duplicated', + $difference, + (1 === $difference ? 'is' : 'are') + )); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function eq($value, $expect, $message = '') + { + if ($expect != $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value equal to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($expect) + )); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEq($value, $expect, $message = '') + { + if ($expect == $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a different value than %s.', + static::valueToString($expect) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function same($value, $expect, $message = '') + { + if ($expect !== $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value identical to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($expect) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notSame($value, $expect, $message = '') + { + if ($expect === $value) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not identical to %s.', + static::valueToString($expect) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function greaterThan($value, $limit, $message = '') + { + if ($value <= $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value greater than %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function greaterThanEq($value, $limit, $message = '') + { + if ($value < $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lessThan($value, $limit, $message = '') + { + if ($value >= $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value less than %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lessThanEq($value, $limit, $message = '') + { + if ($value > $limit) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value less than or equal to %2$s. Got: %s', + static::valueToString($value), + static::valueToString($limit) + )); + } + } + + /** + * Inclusive range, so Assert::(3, 3, 5) passes. + * + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function range($value, $min, $max, $message = '') + { + if ($value < $min || $value > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value between %2$s and %3$s. Got: %s', + static::valueToString($value), + static::valueToString($min), + static::valueToString($max) + )); + } + } + + /** + * A more human-readable alias of Assert::inArray(). + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function oneOf($value, array $values, $message = '') + { + static::inArray($value, $values, $message); + } + + /** + * Does strict comparison, so Assert::inArray(3, ['3']) does not pass the assertion. + * + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function inArray($value, array $values, $message = '') + { + if (!\in_array($value, $values, true)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected one of: %2$s. Got: %s', + static::valueToString($value), + \implode(', ', \array_map(array('static', 'valueToString'), $values)) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function contains($value, $subString, $message = '') + { + if (false === \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain %2$s. Got: %s', + static::valueToString($value), + static::valueToString($subString) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notContains($value, $subString, $message = '') + { + if (false !== \strpos($value, $subString)) { + static::reportInvalidArgument(\sprintf( + $message ?: '%2$s was not expected to be contained in a value. Got: %s', + static::valueToString($value), + static::valueToString($subString) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notWhitespaceOnly($value, $message = '') + { + if (\preg_match('/^\s*$/', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a non-whitespace string. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function startsWith($value, $prefix, $message = '') + { + if (0 !== \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to start with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($prefix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notStartsWith($value, $prefix, $message = '') + { + if (0 === \strpos($value, $prefix)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to start with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($prefix) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function startsWithLetter($value, $message = '') + { + static::string($value); + + $valid = isset($value[0]); + + if ($valid) { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = \ctype_alpha($value[0]); + \setlocale(LC_CTYPE, $locale); + } + + if (!$valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to start with a letter. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function endsWith($value, $suffix, $message = '') + { + if ($suffix !== \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to end with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($suffix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notEndsWith($value, $suffix, $message = '') + { + if ($suffix === \substr($value, -\strlen($suffix))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value not to end with %2$s. Got: %s', + static::valueToString($value), + static::valueToString($suffix) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function regex($value, $pattern, $message = '') + { + if (!\preg_match($pattern, $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The value %s does not match the expected pattern.', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function notRegex($value, $pattern, $message = '') + { + if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The value %s matches the pattern %s (at offset %d).', + static::valueToString($value), + static::valueToString($pattern), + $matches[0][1] + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function unicodeLetters($value, $message = '') + { + static::string($value); + + if (!\preg_match('/^\p{L}+$/u', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain only Unicode letters. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function alpha($value, $message = '') + { + static::string($value); + + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alpha($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain only letters. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function digits($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_digit($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain digits only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function alnum($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_alnum($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain letters and digits only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lower($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_lower($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain lowercase characters only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-assert !lowercase-string $value + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function upper($value, $message = '') + { + $locale = \setlocale(LC_CTYPE, 0); + \setlocale(LC_CTYPE, 'C'); + $valid = !\ctype_upper($value); + \setlocale(LC_CTYPE, $locale); + + if ($valid) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain uppercase characters only. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * + * @param string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function length($value, $length, $message = '') + { + if ($length !== static::strlen($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain %2$s characters. Got: %s', + static::valueToString($value), + $length + )); + } + } + + /** + * Inclusive min. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function minLength($value, $min, $message = '') + { + if (static::strlen($value) < $min) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', + static::valueToString($value), + $min + )); + } + } + + /** + * Inclusive max. + * + * @psalm-pure + * + * @param string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function maxLength($value, $max, $message = '') + { + if (static::strlen($value) > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', + static::valueToString($value), + $max + )); + } + } + + /** + * Inclusive , so Assert::lengthBetween('asd', 3, 5); passes the assertion. + * + * @psalm-pure + * + * @param string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function lengthBetween($value, $min, $max, $message = '') + { + $length = static::strlen($value); + + if ($length < $min || $length > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', + static::valueToString($value), + $min, + $max + )); + } + } + + /** + * Will also pass if $value is a directory, use Assert::file() instead if you need to be sure it is a file. + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function fileExists($value, $message = '') + { + static::string($value); + + if (!\file_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The file %s does not exist.', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function file($value, $message = '') + { + static::fileExists($value, $message); + + if (!\is_file($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is not a file.', + static::valueToString($value) + )); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function directory($value, $message = '') + { + static::fileExists($value, $message); + + if (!\is_dir($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is no directory.', + static::valueToString($value) + )); + } + } + + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function readable($value, $message = '') + { + if (!\is_readable($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is not readable.', + static::valueToString($value) + )); + } + } + + /** + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function writable($value, $message = '') + { + if (!\is_writable($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'The path %s is not writable.', + static::valueToString($value) + )); + } + } + + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function classExists($value, $message = '') + { + if (!\class_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an existing class name. Got: %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function subclassOf($value, $class, $message = '') + { + if (!\is_subclass_of($value, $class)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected a sub-class of %2$s. Got: %s', + static::valueToString($value), + static::valueToString($class) + )); + } + } + + /** + * @psalm-assert class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function interfaceExists($value, $message = '') + { + if (!\interface_exists($value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an existing interface name. got %s', + static::valueToString($value) + )); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function implementsInterface($value, $interface, $message = '') + { + if (!\in_array($interface, \class_implements($value))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an implementation of %2$s. Got: %s', + static::valueToString($value), + static::valueToString($interface) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function propertyExists($classOrObject, $property, $message = '') + { + if (!\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the property %s to exist.', + static::valueToString($property) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function propertyNotExists($classOrObject, $property, $message = '') + { + if (\property_exists($classOrObject, $property)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the property %s to not exist.', + static::valueToString($property) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function methodExists($classOrObject, $method, $message = '') + { + if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the method %s to exist.', + static::valueToString($method) + )); + } + } + + /** + * @psalm-pure + * @psalm-param class-string|object $classOrObject + * + * @param string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function methodNotExists($classOrObject, $method, $message = '') + { + if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the method %s to not exist.', + static::valueToString($method) + )); + } + } + + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function keyExists($array, $key, $message = '') + { + if (!(isset($array[$key]) || \array_key_exists($key, $array))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the key %s to exist.', + static::valueToString($key) + )); + } + } + + /** + * @psalm-pure + * + * @param array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function keyNotExists($array, $key, $message = '') + { + if (isset($array[$key]) || \array_key_exists($key, $array)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected the key %s to not exist.', + static::valueToString($key) + )); + } + } + + /** + * Checks if a value is a valid array key (int or string). + * + * @psalm-pure + * @psalm-assert array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function validArrayKey($value, $message = '') + { + if (!(\is_int($value) || \is_string($value))) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected string or integer. Got: %s', + static::typeToString($value) + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function count($array, $number, $message = '') + { + static::eq( + \count($array), + $number, + \sprintf( + $message ?: 'Expected an array to contain %d elements. Got: %d.', + $number, + \count($array) + ) + ); + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function minCount($array, $min, $message = '') + { + if (\count($array) < $min) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array to contain at least %2$d elements. Got: %d', + \count($array), + $min + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function maxCount($array, $max, $message = '') + { + if (\count($array) > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array to contain at most %2$d elements. Got: %d', + \count($array), + $max + )); + } + } + + /** + * Does not check if $array is countable, this can generate a warning on php versions after 7.2. + * + * @param Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function countBetween($array, $min, $max, $message = '') + { + $count = \count($array); + + if ($count < $min || $count > $max) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d', + $count, + $min, + $max + )); + } + } + + /** + * @psalm-pure + * @psalm-assert list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isList($array, $message = '') + { + if (!\is_array($array) || $array !== \array_values($array)) { + static::reportInvalidArgument( + $message ?: 'Expected list - non-associative array.' + ); + } + } + + /** + * @psalm-pure + * @psalm-assert non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyList($array, $message = '') + { + static::isList($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isMap($array, $message = '') + { + if ( + !\is_array($array) || + \array_keys($array) !== \array_filter(\array_keys($array), '\is_string') + ) { + static::reportInvalidArgument( + $message ?: 'Expected map - associative array with string keys.' + ); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param mixed|array $array + * @psalm-assert array $array + * @psalm-assert !empty $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function isNonEmptyMap($array, $message = '') + { + static::isMap($array, $message); + static::notEmpty($array, $message); + } + + /** + * @psalm-pure + * + * @param string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function uuid($value, $message = '') + { + $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); + + // The nil UUID is special form of UUID that is specified to have all + // 128 bits set to zero. + if ('00000000-0000-0000-0000-000000000000' === $value) { + return; + } + + if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { + static::reportInvalidArgument(\sprintf( + $message ?: 'Value %s is not a valid UUID.', + static::valueToString($value) + )); + } + } + + /** + * @psalm-param class-string $class + * + * @param Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function throws(Closure $expression, $class = 'Exception', $message = '') + { + static::string($class); + + $actual = 'none'; + + try { + $expression(); + } catch (Exception $e) { + $actual = \get_class($e); + if ($e instanceof $class) { + return; + } + } catch (Throwable $e) { + $actual = \get_class($e); + if ($e instanceof $class) { + return; + } + } + + static::reportInvalidArgument($message ?: \sprintf( + 'Expected to throw "%s", got "%s"', + $class, + $actual + )); + } + + /** + * @throws BadMethodCallException + */ + public static function __callStatic($name, $arguments) + { + if ('nullOr' === \substr($name, 0, 6)) { + if (null !== $arguments[0]) { + $method = \lcfirst(\substr($name, 6)); + \call_user_func_array(array('static', $method), $arguments); + } + + return; + } + + if ('all' === \substr($name, 0, 3)) { + static::isIterable($arguments[0]); + + $method = \lcfirst(\substr($name, 3)); + $args = $arguments; + + foreach ($arguments[0] as $entry) { + $args[0] = $entry; + + \call_user_func_array(array('static', $method), $args); + } + + return; + } + + throw new BadMethodCallException('No such method: '.$name); + } + + /** + * @param mixed $value + * + * @return string + */ + protected static function valueToString($value) + { + if (null === $value) { + return 'null'; + } + + if (true === $value) { + return 'true'; + } + + if (false === $value) { + return 'false'; + } + + if (\is_array($value)) { + return 'array'; + } + + if (\is_object($value)) { + if (\method_exists($value, '__toString')) { + return \get_class($value).': '.self::valueToString($value->__toString()); + } + + if ($value instanceof DateTime || $value instanceof DateTimeImmutable) { + return \get_class($value).': '.self::valueToString($value->format('c')); + } + + return \get_class($value); + } + + if (\is_resource($value)) { + return 'resource'; + } + + if (\is_string($value)) { + return '"'.$value.'"'; + } + + return (string) $value; + } + + /** + * @param mixed $value + * + * @return string + */ + protected static function typeToString($value) + { + return \is_object($value) ? \get_class($value) : \gettype($value); + } + + protected static function strlen($value) + { + if (!\function_exists('mb_detect_encoding')) { + return \strlen($value); + } + + if (false === $encoding = \mb_detect_encoding($value)) { + return \strlen($value); + } + + return \mb_strlen($value, $encoding); + } + + /** + * @param string $message + * + * @throws InvalidArgumentException + * + * @psalm-pure this method is not supposed to perform side-effects + */ + protected static function reportInvalidArgument($message) + { + throw new InvalidArgumentException($message); + } + + private function __construct() + { + } +} diff --git a/pandora_console/godmode/um_client/vendor/webmozart/assert/src/Mixin.php b/pandora_console/godmode/um_client/vendor/webmozart/assert/src/Mixin.php new file mode 100644 index 0000000000..3ad9b2d042 --- /dev/null +++ b/pandora_console/godmode/um_client/vendor/webmozart/assert/src/Mixin.php @@ -0,0 +1,1971 @@ + $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allString($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|non-empty-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStringNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStringNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInteger($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInteger($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIntegerish($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIntegerish($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|float $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFloat($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFloat($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|numeric $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNumeric($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNumeric($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|int $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNatural($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNatural($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|bool $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrBoolean($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allBoolean($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|scalar $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrScalar($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allScalar($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|object $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrObject($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allObject($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|resource $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrResource($value, $type = null, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allResource($value, $type = null, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|callable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsCallable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsCallable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsArray($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsArray($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsTraversable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsTraversable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array|ArrayAccess $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsArrayAccessible($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsArrayAccessible($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|countable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsCountable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsCountable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsIterable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsIterable($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotInstanceOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsInstanceOfAny($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param mixed $value + * @param array $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsInstanceOfAny($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|ExpectedType|class-string $value + * + * @param null|object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsAOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable> $value + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsAOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param null|object|string $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNotA($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string $class + * + * @param iterable $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNotA($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param null|object|string $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsAnyOf($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-param array $classes + * + * @param iterable $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsAnyOf($value, $classes, $message = ''); + + /** + * @psalm-pure + * @psalm-assert empty $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsEmpty($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEmpty($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNull($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotNull($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|true $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrTrue($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allTrue($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|false $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFalse($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFalse($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotFalse($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotFalse($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIp($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIp($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIpv4($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIpv4($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIpv6($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIpv6($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEmail($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEmail($value, $message = ''); + + /** + * @param null|array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUniqueValues($values, $message = ''); + + /** + * @param iterable $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUniqueValues($values, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEq($value, $expect, $message = ''); + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEq($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotSame($value, $expect, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrGreaterThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allGreaterThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrGreaterThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allGreaterThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLessThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLessThan($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLessThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLessThanEq($value, $limit, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrRange($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allRange($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrOneOf($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allOneOf($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInArray($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInArray($value, $values, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotContains($value, $subString, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotWhitespaceOnly($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotWhitespaceOnly($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotStartsWith($value, $prefix, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrStartsWithLetter($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allStartsWithLetter($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotEndsWith($value, $suffix, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrNotRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allNotRegex($value, $pattern, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUnicodeLetters($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUnicodeLetters($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrAlpha($value, $message = ''); + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allAlpha($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrDigits($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allDigits($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrAlnum($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allAlnum($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|lowercase-string $value + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLower($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLower($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUpper($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUpper($value, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLength($value, $length, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLength($value, $length, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMinLength($value, $min, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMinLength($value, $min, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMaxLength($value, $max, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMaxLength($value, $max, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrLengthBetween($value, $min, $max, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allLengthBetween($value, $min, $max, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFileExists($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFileExists($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrFile($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allFile($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrDirectory($value, $message = ''); + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allDirectory($value, $message = ''); + + /** + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrReadable($value, $message = ''); + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allReadable($value, $message = ''); + + /** + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrWritable($value, $message = ''); + + /** + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allWritable($value, $message = ''); + + /** + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrClassExists($value, $message = ''); + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allClassExists($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert null|class-string|ExpectedType $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrSubclassOf($value, $class, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $class + * @psalm-assert iterable|ExpectedType> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allSubclassOf($value, $class, $message = ''); + + /** + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrInterfaceExists($value, $message = ''); + + /** + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allInterfaceExists($value, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert null|class-string $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrImplementsInterface($value, $interface, $message = ''); + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string $interface + * @psalm-assert iterable> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allImplementsInterface($value, $interface, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrPropertyExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allPropertyExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrPropertyNotExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allPropertyNotExists($classOrObject, $property, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMethodExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMethodExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param null|class-string|object $classOrObject + * + * @param null|string|object $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMethodNotExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * @psalm-param iterable $classOrObject + * + * @param iterable $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMethodNotExists($classOrObject, $method, $message = ''); + + /** + * @psalm-pure + * + * @param null|array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrKeyExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allKeyExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param null|array $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrKeyNotExists($array, $key, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allKeyNotExists($array, $key, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|array-key $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrValidArrayKey($value, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allValidArrayKey($value, $message = ''); + + /** + * @param null|Countable|array $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrCount($array, $number, $message = ''); + + /** + * @param iterable $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allCount($array, $number, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMinCount($array, $min, $message = ''); + + /** + * @param iterable $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMinCount($array, $min, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrMaxCount($array, $max, $message = ''); + + /** + * @param iterable $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allMaxCount($array, $max, $message = ''); + + /** + * @param null|Countable|array $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrCountBetween($array, $min, $max, $message = ''); + + /** + * @param iterable $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allCountBetween($array, $min, $max, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert null|non-empty-list $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNonEmptyList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-assert iterable $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNonEmptyList($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param null|mixed|array $array + * @psalm-assert null|array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * @psalm-assert iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param null|mixed|array $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrIsNonEmptyMap($array, $message = ''); + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allIsNonEmptyMap($array, $message = ''); + + /** + * @psalm-pure + * + * @param null|string $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrUuid($value, $message = ''); + + /** + * @psalm-pure + * + * @param iterable $value + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allUuid($value, $message = ''); + + /** + * @psalm-param class-string $class + * + * @param null|Closure $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function nullOrThrows($expression, $class = 'Exception', $message = ''); + + /** + * @psalm-param class-string $class + * + * @param iterable $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + */ + public static function allThrows($expression, $class = 'Exception', $message = ''); +} diff --git a/pandora_console/godmode/um_client/views/offline.php b/pandora_console/godmode/um_client/views/offline.php new file mode 100644 index 0000000000..ebbf7f6261 --- /dev/null +++ b/pandora_console/godmode/um_client/views/offline.php @@ -0,0 +1,99 @@ + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
      +
      +
      + + diff --git a/pandora_console/godmode/um_client/views/online.php b/pandora_console/godmode/um_client/views/online.php new file mode 100644 index 0000000000..065ea61ee3 --- /dev/null +++ b/pandora_console/godmode/um_client/views/online.php @@ -0,0 +1,206 @@ + + + + + + + + +
      + + +

      The latest version of package installed is:

      +
      + +
      + +

      + +

      + +
      +

      +
      +
      +
      + + +
      +
      +

      +
      + 0 % +
      +
      + +
      +
      + 0 % +
      +
      +
      +
      +
      +
      +
      + + + + +
      + +
      diff --git a/pandora_console/godmode/um_client/views/register.php b/pandora_console/godmode/um_client/views/register.php new file mode 100644 index 0000000000..c0e181cd02 --- /dev/null +++ b/pandora_console/godmode/um_client/views/register.php @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + diff --git a/pandora_console/godmode/update_manager/update_manager.offline.php b/pandora_console/godmode/update_manager/update_manager.offline.php deleted file mode 100644 index eba0fa01c2..0000000000 --- a/pandora_console/godmode/update_manager/update_manager.offline.php +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -
      -
      -
        -
        - - - - - - - - diff --git a/pandora_console/godmode/update_manager/update_manager.online.php b/pandora_console/godmode/update_manager/update_manager.online.php deleted file mode 100644 index 029a37238e..0000000000 --- a/pandora_console/godmode/update_manager/update_manager.online.php +++ /dev/null @@ -1,237 +0,0 @@ - - @import 'styles/meta_pandora.css'; - "; - } - - if (is_metaconsole()) { - $baseurl = ui_get_full_url(false, false, false, false); - echo ' '; - echo "
        "; - } else { - echo "
        "; - } - - if ($php_settings_fine >= $PHP_SETTINGS_REQUIRED) { - echo ""; - echo ""; - echo ''; - } - - echo '

        '.__('The latest version of package installed is:').'

        '; - if ($open) { - echo '
        '.$build_version.'
        '; - } else { - echo '
        '.$current_package.'
        '; - } - - echo "'; - - echo "'; - - echo "
        "; - - echo ""; - - - /* - * ------------------------------------------------------------------------- - * Hello there! :) - * We added some of what seems to be "buggy" messages to the openSource - * version recently. This is not to force open-source users to move to the - * enterprise version, this is just to inform people using Pandora FMS open - * source that it requires skilled people to maintain and keep it running - * smoothly without professional support. This does not imply open-source - * version is limited in any way. If you check the recently added code, it - * contains only warnings and messages, no limitations except one: - * we removed the option to add custom logo in header. - * - * In the Update Manager section, it warns about the 'danger’ of applying - * automated updates without a proper backup, remembering in the process - * that the Enterprise version comes with a human-tested package. - * - * Maintaining an OpenSource version with more than 500 agents is not so - * easy, that's why someone using a Pandora with 8000 agents should consider - * asking for support. It's not a joke, we know of many setups with a huge - * number of agents, and we hate to hear that “its becoming unstable and - * slow” :( - * - * You can of course remove the warnings, that's why we include the source - * and do not use any kind of trick. And that's why we added here this - * comment, to let you know this does not reflect any change in our - * opensource mentality of does the last 14 years. - * ------------------------------------------------------------------------- - */ - - if ($open) { - echo "
        -
        -
        -

        ".__('WARNING: You are just one click away from an automated update. This may result in a damaged system, including loss of data and operativity. Check you have a recent backup. OpenSource updates are automatically created packages, and there is no WARRANTY or SUPPORT. If you need professional support and warranty, please upgrade to Enterprise Version.')."

        -
        - -
        "; - } - - - if ($php_settings_fine >= $PHP_SETTINGS_REQUIRED) { - $enterprise = enterprise_hook('update_manager_enterprise_main'); - - if ($enterprise == ENTERPRISE_NOT_HOOK) { - // Open view. - update_manager_main(); - } - ?> - - - '; +if ((bool) is_metaconsole() === true) { + $action = ui_get_full_url( + 'index.php?sec=advanced&sec2=advanced/metasetup&pure=0&tab=update_manager_setup' + ); +} else { + $action = ui_get_full_url( + 'index.php?sec=gsetup&sec2=godmode/update_manager/update_manager&tab=setup' + ); +} + +echo '
        '; html_print_input_hidden('update_config', 1); $table = new stdClass(); @@ -190,6 +223,8 @@ $table->class = 'databox filters'; $table->style[0] = 'font-weight: bolder;width:250px'; +$url_update_manager = update_manager_get_url(); + $table->data[0][0] = __('URL update manager:'); $table->data[0][1] = html_print_input_text( 'url_update_manager', @@ -200,8 +235,17 @@ $table->data[0][1] = html_print_input_text( true ); -$table->data[1][0] = __('Proxy server:'); -$table->data[1][1] = html_print_input_text( +$table->data[1][0] = __('Use secured update manager:'); +$table->data[1][1] = html_print_input( + [ + 'type' => 'switch', + 'name' => 'secure_update_manager', + 'value' => ($secure_update_manager ?? 1), + ] +); + +$table->data[2][0] = __('Proxy server:'); +$table->data[2][1] = html_print_input_text( 'update_manager_proxy_server', $update_manager_proxy_server, __('Proxy server'), @@ -210,8 +254,8 @@ $table->data[1][1] = html_print_input_text( true ); -$table->data[2][0] = __('Proxy port:'); -$table->data[2][1] = html_print_input_text( +$table->data[3][0] = __('Proxy port:'); +$table->data[3][1] = html_print_input_text( 'update_manager_proxy_port', $update_manager_proxy_port, __('Proxy port'), @@ -220,8 +264,8 @@ $table->data[2][1] = html_print_input_text( true ); -$table->data[3][0] = __('Proxy user:'); -$table->data[3][1] = html_print_input_text( +$table->data[4][0] = __('Proxy user:'); +$table->data[4][1] = html_print_input_text( 'update_manager_proxy_user', $update_manager_proxy_user, __('Proxy user'), @@ -230,8 +274,8 @@ $table->data[3][1] = html_print_input_text( true ); -$table->data[4][0] = __('Proxy password:'); -$table->data[4][1] = html_print_input_password( +$table->data[5][0] = __('Proxy password:'); +$table->data[5][1] = html_print_input_password( 'update_manager_proxy_password', $update_manager_proxy_password, __('Proxy password'), @@ -241,25 +285,32 @@ $table->data[4][1] = html_print_input_password( ); -$table->data[5][0] = __('Registration ID:'); -$table->data[5][1] = ''.$config['pandora_uid'].''; +$table->data[6][0] = __('Registration ID:'); +$table->data[6][1] = ''.$config['pandora_uid'].''; if (update_manager_verify_registration() === true && users_is_admin()) { - $table->data[6][0] = __('Cancel registration:'); - $table->data[6][1] = ''.__('Unregister').''; + $table->data[7][0] = __('Cancel registration:'); + $table->data[7][1] = ''.__('Unregister').''; } if (license_free()) { $config['identification_reminder'] = isset($config['identification_reminder']) ? $config['identification_reminder'] : 1; - $table->data[7][0] = __('Pandora FMS community reminder').ui_print_help_tip(__('Every 8 days, a message is displayed to admin users to remember to register this Pandora instance'), true); - $table->data[7][1] = __('Yes').'   '.html_print_radio_button('identification_reminder', 1, '', $config['identification_reminder'], true).'  '; - $table->data[7][1] .= __('No').'   '.html_print_radio_button('identification_reminder', 0, '', $config['identification_reminder'], true); + $table->data[8][0] = __('Pandora FMS community reminder').ui_print_help_tip(__('Every 8 days, a message is displayed to admin users to remember to register this Pandora instance'), true); + $table->data[8][1] = __('Yes').'   '.html_print_radio_button('identification_reminder', 1, '', $config['identification_reminder'], true).'  '; + $table->data[8][1] .= __('No').'   '.html_print_radio_button('identification_reminder', 0, '', $config['identification_reminder'], true); } html_print_input_hidden('action_update_url_update_manager', 1); diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 31ca0897d0..b3b6bc0b8b 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -1250,20 +1250,6 @@ $default_event_filter .= html_print_select( false ).'
        '; -$newsletter = '

        '.__('Disabled newsletter').'

        '; -if ($user_info['middlename'] >= 0) { - $middlename = false; -} else { - $middlename = true; -} - -$newsletter .= html_print_checkbox_switch( - 'middlename', - -1, - $middlename, - true -).'
        '; - if ($config['ehorus_user_level_conf']) { $ehorus = '

        '.__('eHorus user access enabled').'

        '; $ehorus .= html_print_checkbox_switch( @@ -1388,7 +1374,7 @@ echo '

        Extra info

        '.$email.$phone.$not_login.$session_time.'
        -
        '.$language.$access_or_pagination.$skin.$home_screen.$default_event_filter.$newsletter.$double_authentication.'
        +
        '.$language.$access_or_pagination.$skin.$home_screen.$default_event_filter.$double_authentication.'
        '.$timezone; if (!is_metaconsole()) { diff --git a/pandora_console/images/maintenance.png b/pandora_console/images/maintenance.png new file mode 100644 index 0000000000000000000000000000000000000000..b0fa88444b37ca0181e35225d944b6e0c2b7c52f GIT binary patch literal 94473 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 w4=D^iERzLD
        '; - $message .= '
        '; - - fwrite($error_file, $message); - fclose($error_file); - } else { - if (file_exists($dir) && is_dir($dir)) { - if (is_readable($dir)) { - if (($number > $config['MR'] + 1) || ($number == $config['MR'])) { - $message = 'bad_mr_filename'; - } else if ($config['MR'] > $number) { - if (!file_exists($config['homedir'].'/extras/mr/updated') || !is_dir($config['homedir'].'/extras/mr/updated')) { - mkdir($config['homedir'].'/extras/mr/updated'); - } - - $file_dest = $config['homedir']."/extras/mr/updated/$number.sql"; - copy($file, $file_dest); - - $message = 'bad_mr_filename'; - } else { - $result = db_run_sql_file($file); - - if ($result) { - $update_config = update_config_token('MR', $number); - if ($update_config) { - $config['MR'] = $number; - } - - if ($config['MR'] == $number) { - if (!file_exists($config['homedir'].'/extras/mr/updated') || !is_dir($config['homedir'].'/extras/mr/updated')) { - mkdir($config['homedir'].'/extras/mr/updated'); - } - - $file_dest = $config['homedir']."/extras/mr/updated/$number.sql"; - - copy($file, $file_dest); - - // After successfully update, schedule history - // database upgrade. - enterprise_include_once('include/functions_config.php'); - enterprise_hook('history_db_install'); - } - } else { - $error_file = fopen($config['homedir'].'/extras/mr/error.txt', 'w'); - - $message = '
        '; - $message .= "
        "; - $message .= "

        ERROR

        "; - $message .= "

        ".__('An error occurred while updating the database schema to the minor release ').$number.'

        '; - $message .= '
        '; - - fwrite($error_file, $message); - fclose($error_file); - } - } - } else { - $error_file = fopen($config['homedir'].'/extras/mr/error.txt', 'w'); - - $message = '
        '; - $message .= "
        "; - $message .= "

        ERROR

        "; - $message .= "

        ".__('The directory ').$dir.__(' should have read permissions in order to update the database schema').'

        '; - $message .= '
        '; - - fwrite($error_file, $message); - fclose($error_file); - } - } else { - $error_file = fopen($config['homedir'].'/extras/mr/error.txt', 'w'); - - $message = '
        '; - $message .= "
        "; - $message .= "

        ERROR

        "; - $message .= "

        ".__('The directory ').$dir.__(' does not exist').'

        '; - $message .= '
        '; - - fwrite($error_file, $message); - fclose($error_file); - } - } - - echo $message; - return; - } - - if ($remove_rr) { - $numbers = get_parameter('number', 0); - - foreach ($numbers as $number) { - for ($i = 1; $i <= $number; $i++) { - $file = $config['homedir']."/extras/mr/$i.sql"; - if (file_exists($file)) { - unlink($file); - } - } - } - - return; - } - - if ($remove_rr_extras) { - $dir = $config['homedir'].'/extras/mr/'; - - if (file_exists($dir) && is_dir($dir)) { - if (is_readable($dir)) { - $files = scandir($dir); - // Get all the files from the directory ordered by asc - if ($files !== false) { - $pattern = '/^\d+\.sql$/'; - $sqlfiles = preg_grep($pattern, $files); - // Get the name of the correct files - $files = null; - $pattern = '/\.sql$/'; - $replacement = ''; - $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); - // Get the number of the file - foreach ($sqlfiles_num as $num) { - $file = $dir."$num.sql"; - if (file_exists($file)) { - unlink($file); - } - } - } - } - } - - return; - } -} diff --git a/pandora_console/include/ajax/update_manager.ajax.php b/pandora_console/include/ajax/update_manager.ajax.php deleted file mode 100644 index deb2400b90..0000000000 --- a/pandora_console/include/ajax/update_manager.ajax.php +++ /dev/null @@ -1,772 +0,0 @@ -open($path) === true) { - // The files will be extracted one by one - for ($i = 0; $i < $zip->numFiles; $i++) { - $filename = $zip->getNameIndex($i); - - if ($zip->extractTo($destination, [$filename])) { - // Creates a file with the name of the files extracted - file_put_contents($destination.'/files.txt', $filename."\n", (FILE_APPEND | LOCK_EX)); - } else { - // Deletes the entire extraction directory if a file can not be extracted - delete_directory($destination); - $return['status'] = 'error'; - $return['message'] = __("There was an error extracting the file '".$filename."' from the package."); - echo json_encode($return); - return; - } - } - - // Creates a file with the number of files extracted - file_put_contents($destination.'/files.info.txt', $zip->numFiles); - // Zip close - $zip->close(); - - $return['status'] = 'success'; - $return['package'] = $destination; - echo json_encode($return); - return; - } else { - $return['status'] = 'error'; - $return['message'] = __('The package was not extracted.'); - echo json_encode($return); - return; - } - } else { - $return['status'] = 'error'; - $return['message'] = __('Invalid extension. The package must have the extension .oum.'); - echo json_encode($return); - return; - } - } - - $return['status'] = 'error'; - $return['message'] = __('The file was not uploaded succesfully.'); - echo json_encode($return); - return; -} - -if ($install_package) { - global $config; - ob_clean(); - - $accept = (bool) get_parameter('accept', false); - if ($accept) { - $package = (string) get_parameter('package'); - $package = trim($package); - - $chunks = explode('_', basename($package)); - $chunks = explode('.', $chunks[1]); - if (is_numeric($chunks[0])) { - $version = $chunks[0]; - } else { - $current_package = db_get_value( - 'value', - 'tconfig', - 'token', - 'current_package_enterprise' - ); - if (!empty($current_package)) { - $version = $current_package; - } - } - - // All files extracted - $files_total = $package.'/files.txt'; - // Files copied - $files_copied = $package.'/files.copied.txt'; - $return = []; - - if (file_exists($files_copied)) { - unlink($files_copied); - } - - - if (file_exists($package)) { - if ($files_h = fopen($files_total, 'r')) { - while ($line = stream_get_line($files_h, 65535, "\n")) { - $line = trim($line); - - // Tries to move the old file to the directory backup inside the extracted package - if (file_exists($config['homedir'].'/'.$line)) { - rename( - $config['homedir'].'/'.$line, - $package.'/backup/'.$line - ); - } - - // Tries to move the new file to the Pandora directory - $dirname = dirname($line); - if (!file_exists($config['homedir'].'/'.$dirname)) { - $dir_array = explode('/', $dirname); - $temp_dir = ''; - foreach ($dir_array as $dir) { - $temp_dir .= '/'.$dir; - if (!file_exists($config['homedir'].$temp_dir)) { - mkdir($config['homedir'].$temp_dir); - } - } - } - - if (is_dir($package.'/'.$line)) { - if (!file_exists($config['homedir'].'/'.$line)) { - mkdir($config['homedir'].'/'.$line); - file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX)); - } - } else { - if (rename($package.'/'.$line, $config['homedir'].'/'.$line)) { - // Append the moved file to the copied files txt - if (!file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX))) { - // If the copy process fail, this code tries to restore the files backed up before - if ($files_copied_h = fopen($files_copied, 'r')) { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename($package.'/backup/'.$line, $config['homedir'].'/'.$line_c)) { - $backup_status = __('Some of your files might not be recovered.'); - } - } - - if (!rename($package.'/backup/'.$line, $config['homedir'].'/'.$line)) { - $backup_status = __('Some of your files might not be recovered.'); - } - - fclose($files_copied_h); - } else { - $backup_status = __('Some of your old files might not be recovered.'); - } - - fclose($files_h); - $return['status'] = 'error'; - $return['message'] = __("Line '$line' not copied to the progress file.").' '.$backup_status; - echo json_encode($return); - return; - } - } else { - // If the copy process fail, this code tries to restore the files backed up before - if ($files_copied_h = fopen($files_copied, 'r')) { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename($package.'/backup/'.$line, $config['homedir'].'/'.$line)) { - $backup_status = __('Some of your old files might not be recovered.'); - } - } - - fclose($files_copied_h); - } else { - $backup_status = __('Some of your files might not be recovered.'); - } - - fclose($files_h); - $return['status'] = 'error'; - $return['message'] = __("File '$line' not copied.").' '.$backup_status; - echo json_encode($return); - return; - } - } - } - - fclose($files_h); - } else { - $return['status'] = 'error'; - $return['message'] = __('An error ocurred while reading a file.'); - echo json_encode($return); - return; - } - } else { - $return['status'] = 'error'; - $return['message'] = __('The package does not exist'); - echo json_encode($return); - return; - } - - enterprise_hook( - 'update_manager_enterprise_set_version', - [$version] - ); - - $product_name = io_safe_output(get_product_name()); - db_pandora_audit( - 'Update '.$product_name, - "Update version: $version of ".$product_name.' by '.$config['id_user'] - ); - - // An update have been applied, clean phantomjs cache. - config_update_value( - 'clean_phantomjs_cache', - 1 - ); - - $return['status'] = 'success'; - echo json_encode($return); - return; - } else { - $return['status'] = 'error'; - $return['message'] = __('Package rejected.'); - echo json_encode($return); - return; - } -} - -if ($check_install_package) { - // 1 second - // sleep(1); - // Half second - usleep(500000); - - ob_clean(); - - $package = (string) get_parameter('package'); - // All files extracted - $files_total = $package.'/files.txt'; - // Number of files extracted - $files_num = $package.'/files.info.txt'; - // Files copied - $files_copied = $package.'/files.copied.txt'; - - $files = @file($files_copied); - if (empty($files)) { - $files = []; - } - - $total = (int) @file_get_contents($files_num); - - $progress = 0; - if ((count($files) > 0) && ($total > 0)) { - $progress = format_numeric(((count($files) / $total) * 100), 2); - if ($progress > 100) { - $progress = 100; - } - } - - $return = []; - $return['info'] = (string) implode('
        ', $files); - $return['progress'] = $progress; - - if ($progress >= 100) { - unlink($files_total); - unlink($files_num); - unlink($files_copied); - } - - echo json_encode($return); - return; -} - -if ($check_online_enterprise_packages) { - update_manager_check_online_enterprise_packages(); - - return; -} - -if ($check_online_packages) { - return; -} - -if ($update_last_enterprise_package) { - update_manager_update_last_enterprise_package(); - - return; -} - -if ($update_last_package) { - return; -} - -if ($install_package_online) { - return; -} - -if ($install_package_step2) { - update_manager_install_package_step2(); - - return; -} - -if ($check_progress_enterprise_update) { - update_manager_check_progress_enterprise(); - - return; -} - -if ($check_progress_update) { - return; -} - -if ($enterprise_install_package) { - $package = get_parameter('package', ''); - - - update_manager_enterprise_starting_update( - $package, - $config['attachment_store'].'/downloads/'.$package - ); - - return; -} - -if ($enterprise_install_package_step2) { - update_manager_install_enterprise_package_step2(); - - return; -} - -if ($check_online_free_packages) { - update_manager_check_online_free_packages(); - - return; -} - -if ($search_minor) { - $package = get_parameter('package', ''); - $ent = get_parameter('ent', false); - $offline = get_parameter('offline', false); - - $have_minor_releases = db_check_minor_relase_available_to_um($package, $ent, $offline); - - $return['have_minor'] = false; - if ($have_minor_releases) { - $return['have_minor'] = true; - $size_mr = get_number_of_mr($package, $ent, $offline); - $return['mr'] = $size_mr; - } else { - $product_name = io_safe_output(get_product_name()); - $version = get_parameter('version', ''); - db_pandora_audit( - 'ERROR: Update '.$product_name, - 'Update version of '.$product_name.' by '.$config['id_user'].' has failed.' - ); - } - - echo json_encode($return); - - return; -} - -if ($update_last_free_package) { - $package = get_parameter('package', ''); - $version = get_parameter('version', ''); - $package_url = base64_decode($package); - - $params = [ - 'action' => 'get_package', - 'license' => $license, - 'limit_count' => $users, - 'current_package' => $current_package, - 'package' => $package, - 'version' => $config['version'], - 'build' => $config['build'], - ]; - - $curlObj = curl_init(); - curl_setopt($curlObj, CURLOPT_URL, $package_url); - curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlObj, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false); - if (isset($config['update_manager_proxy_server'])) { - curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']); - } - - if (isset($config['update_manager_proxy_port'])) { - curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']); - } - - if (isset($config['update_manager_proxy_user'])) { - curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'].':'.$config['update_manager_proxy_password']); - } - - $result = curl_exec($curlObj); - $http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE); - - curl_close($curlObj); - - if (empty($result)) { - echo json_encode( - [ - 'in_progress' => false, - 'message' => __('Fail to update to the last package.'), - ] - ); - } else { - file_put_contents( - $config['attachment_store'].'/downloads/last_package.tgz', - $result - ); - - echo json_encode( - [ - 'in_progress' => true, - 'message' => __('Starting to update to the last package.'), - ] - ); - - - $progress_update_status = db_get_value( - 'value', - 'tconfig', - 'token', - 'progress_update_status' - ); - - - - if (empty($progress_update_status)) { - db_process_sql_insert( - 'tconfig', - [ - 'value' => 0, - 'token' => 'progress_update', - ] - ); - - db_process_sql_insert( - 'tconfig', - [ - 'value' => json_encode( - [ - 'status' => 'in_progress', - 'message' => '', - ] - ), - 'token' => 'progress_update_status', - ] - ); - } else { - db_process_sql_update( - 'tconfig', - ['value' => 0], - ['token' => 'progress_update'] - ); - - db_process_sql_update( - 'tconfig', - [ - 'value' => json_encode( - [ - 'status' => 'in_progress', - 'message' => '', - ] - ), - ], - ['token' => 'progress_update_status'] - ); - } - } - - return; -} - -if ($check_update_free_package) { - $progress_update = db_get_value( - 'value', - 'tconfig', - 'token', - 'progress_update' - ); - - $progress_update_status = db_get_value( - 'value', - 'tconfig', - 'token', - 'progress_update_status' - ); - $progress_update_status = json_decode($progress_update_status, true); - - switch ($progress_update_status['status']) { - case 'in_progress': - $correct = true; - $end = false; - break; - - case 'fail': - $correct = false; - $end = false; - break; - - case 'end': - $correct = true; - $end = true; - break; - } - - $progressbar_tag = progressbar( - $progress_update, - 400, - 20, - __('progress'), - $config['fontpath'] - ); - preg_match("/src='(.*)'/", $progressbar_tag, $matches); - $progressbar = $matches[1]; - - echo json_encode( - [ - 'correct' => $correct, - 'end' => $end, - 'message' => $progress_update_status['message'], - 'progressbar' => $progressbar, - ] - ); - - return; -} - -if ($unzip_free_package) { - $version = get_parameter('version', ''); - - $result = update_manager_extract_package(); - - if ($result) { - $return['correct'] = true; - $return['message'] = __('The package is extracted.'); - } else { - $return['correct'] = false; - $return['message'] = __('Error in package extraction.'); - } - - echo json_encode($return); - - return; -} - -if ($install_free_package) { - $version = get_parameter('version', ''); - - $install = update_manager_starting_update(); - - sleep(3); - - if ($install) { - update_manager_set_current_package($version); - $return['status'] = 'success'; - $return['message'] = __('The package is installed.'); - } else { - $return['status'] = 'error'; - $return['message'] = __('An error ocurred in the installation process.'); - } - - echo json_encode($return); - - return; -} - - -/* - * Result info: - * Types of status: - * -1 -> Not exits file. - * 0 -> File or directory deleted successfully. - * 1 -> Problem delete file or directory. - * 2 -> Not found file or directory. - * 3 -> Don`t read file deleet_files.txt. - * 4 -> "deleted" folder could not be created. - * 5 -> "deleted" folder was created. - * 6 -> The "delete files" could not be the "delete" folder. - * 7 -> The "delete files" is moved to the "delete" folder. - * Type: - * f -> File - * d -> Dir. - * route: Path. - */ - -if ($delete_desired_files === true) { - global $config; - - // Initialize result. - $result = []; - $result['status_list'] = []; - - // Flag exist folder "deleted". - $exist_deleted = true; - - // Route delete_files.txt. - $route_delete_files = $config['homedir']; - $route_delete_files .= '/extras/delete_files/delete_files.txt'; - - // Route directory deleted. - $route_dir_deleted = $config['homedir']; - $route_dir_deleted .= '/extras/delete_files/deleted/'; - - // Check isset directory deleted - // if it does not exist, try to create it. - if (is_dir($route_dir_deleted) === false) { - $res_mkdir = mkdir($route_dir_deleted, 0777, true); - $res = []; - if ($res_mkdir !== true) { - $exist_deleted = false; - $res['status'] = 4; - } else { - $res['status'] = 5; - } - - $res['type'] = 'd'; - $res['path'] = $url_to_delete; - array_push($result['status_list'], $res); - } - - // Check isset delete_files.txt. - if (file_exists($route_delete_files) === true && $exist_deleted === true) { - // Open file. - $file_read = fopen($route_delete_files, 'r'); - // Check if read delete_files.txt. - if ($file_read !== false) { - while ($file_to_delete = stream_get_line($file_read, 65535, "\n")) { - $file_to_delete = trim($file_to_delete); - $url_to_delete = $config['homedir'].'/'.$file_to_delete; - // Check is dir or file or not exists. - if (is_dir($url_to_delete) === true) { - $rmdir_recursive = rmdir_recursive( - $url_to_delete, - $result['status_list'] - ); - - array_push( - $result['status_list'], - $rmdir_recursive - ); - } else if (file_exists($url_to_delete) === true) { - $unlink = unlink($url_to_delete); - $res = []; - $res['status'] = ($unlink === true) ? 0 : 1; - $res['type'] = 'f'; - $res['path'] = $url_to_delete; - array_push($result['status_list'], $res); - } else { - $res = []; - $res['status'] = 2; - $res['path'] = $url_to_delete; - array_push($result['status_list'], $res); - } - } - } else { - $res = []; - $res['status'] = 3; - $res['path'] = $url_to_delete; - array_push($result['status_list'], $res); - } - - // Close file. - fclose($route_delete_files); - - // Move delete_files.txt to dir extras/deleted/. - $count_scandir = count(scandir($route_dir_deleted)); - $route_move = $route_dir_deleted.'/delete_files_'.$count_scandir.'.txt'; - $res_rename = rename( - $route_delete_files, - $route_move - ); - - $res = []; - $res['status'] = ($res_rename === true) ? 7 : 6; - $res['type'] = 'f'; - $res['path'] = $route_move; - array_push($result['status_list'], $res); - } else { - if ($exist_deleted === true) { - $res = []; - $res['status'] = -1; - array_push($result['status_list'], $res); - } - } - - // Translation diccionary neccesary. - $result['translation'] = [ - 'title' => __('Delete files'), - 'not_file' => __('The oum has no files to remove'), - 'not_found' => __('Not found'), - 'not_deleted' => __('Not deleted'), - 'not_read' => __('The file delete_file.txt can not be read'), - 'folder_deleted_f' => __('\'deleted\' folder could not be created'), - 'folder_deleted_t' => __('\'deleted\' folder was created'), - 'move_file_f' => __( - 'The "delete files" could not be the "delete" folder' - ), - 'move_file_d' => __( - 'The "delete files" is moved to the "delete" folder' - ), - ]; - - echo json_encode($result); - return; -} diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 6833e14d6f..84c30f8b8f 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -32,7 +32,7 @@ require_once $config['homedir'].'/include/functions_db.php'; require_once $config['homedir'].'/include/functions_io.php'; require_once $config['homedir'].'/include/functions_notifications.php'; require_once $config['homedir'].'/include/functions_servers.php'; -require_once $config['homedir'].'/include/functions_update_manager.php'; +require_once $config['homedir'].'/godmode/um_client/vendor/autoload.php'; // Enterprise includes. enterprise_include_once('include/functions_metaconsole.php'); @@ -1395,7 +1395,7 @@ class ConsoleSupervisor $PHPsafe_mode = ini_get('safe_mode'); $PHPdisable_functions = ini_get('disable_functions'); $PHPupload_max_filesize_min = config_return_in_bytes('800M'); - $PHPmemory_limit_min = config_return_in_bytes('500M'); + $PHPmemory_limit_min = config_return_in_bytes('800M'); $PHPSerialize_precision = ini_get('serialize_precision'); // PhantomJS status. @@ -1511,7 +1511,7 @@ class ConsoleSupervisor ), 'message' => sprintf( __('Recommended value is: %s'), - sprintf(__('%s or greater'), '500M') + sprintf(__('%s or greater'), '800M') ).'

        '.__('Please, change it on your PHP configuration file (php.ini) or contact with administrator'), 'url' => $url, ] @@ -2388,38 +2388,20 @@ class ConsoleSupervisor } // Avoid contact for messages too much often. - if (isset($config['last_um_check']) + if (isset($config['last_um_check']) === true && time() < $config['last_um_check'] ) { return; } - // Only ask for messages once a day. - $future = (time() + 2 * SECONDS_1HOUR); - config_update_value('last_um_check', $future); - - $params = [ - 'pandora_uid' => $config['pandora_uid'], - 'timezone' => $config['timezone'], - 'language' => $config['language'], - ]; - - $result = update_manager_curl_request('get_messages', $params); - - try { - if ($result['success'] === true) { - $messages = json_decode($result['update_message'], true); - } - } catch (Exception $e) { - error_log($e->getMessage()); - }; - - if (is_array($messages)) { + $messages = update_manager_get_messages(); + if (is_array($messages) === true) { $source_id = get_notification_source_id( 'Official communication' ); + foreach ($messages as $message) { - if (!isset($message['url'])) { + if (isset($message['url']) === false) { $message['url'] = '#'; } @@ -2462,7 +2444,7 @@ class ConsoleSupervisor foreach ($server_version_list as $server) { if (strpos( $server['version'], - $config['current_package_enterprise'] + $config['current_package'] ) === false ) { $missed++; diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index e483bebaa8..5edb500e73 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -1709,6 +1709,11 @@ function safe_sql_string($string) function is_metaconsole() { global $config; + + if (isset($config['metaconsole']) === false) { + return false; + } + return (bool) $config['metaconsole']; } diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index ca2330d7c8..1f821dbec0 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -459,10 +459,6 @@ function config_update_config() $error_update[] = __('Enable Update Manager'); } - if (!config_update_value('disabled_newsletter', get_parameter('disabled_newsletter'))) { - $error_update[] = __('Disabled newsletter'); - } - if (!config_update_value('ipam_ocuppied_critical_treshold', get_parameter('ipam_ocuppied_critical_treshold'))) { $error_update[] = __('Ipam Ocuppied Manager Critical'); } diff --git a/pandora_console/include/functions_register.php b/pandora_console/include/functions_register.php new file mode 100644 index 0000000000..b0f88881fa --- /dev/null +++ b/pandora_console/include/functions_register.php @@ -0,0 +1,365 @@ + $email], + ['id_user' => $config['id_user']] + ); + } + + // Update the alert action Mail to XXX/Administrator + // if it is set to default. + $mail_check = 'yourmail@domain.es'; + $mail_alert = alerts_get_alert_action_field1(1); + if ($mail_check === $mail_alert && $email !== false) { + alerts_update_alert_action( + 1, + [ + 'field1' => $email, + 'field1_recovery' => $email, + ] + ); + } + + config_update_value('initial_wizard', 1); +} + + +/** + * Generates base code to print main configuration modal. + * + * Asks for timezone, mail. + * + * @param boolean $return Print output or not. + * @param boolean $launch Process JS modal. + * @param string $callback Call to JS function at end. + * + * @return string HTML. + */ +function config_wiz_modal( + $return=false, + $launch=true, + $callback=false +) { + global $config; + + $email = db_get_value('email', 'tusuario', 'id_user', $config['id_user']); + // Avoid to show default email. + if ($email == 'admin@example.com') { + $email = ''; + } + + $output = ''; + + // Prints first step pandora registration. + $output .= ''; + + $output .= '
        '; + + // Verification modal. + $output .= ''; + + ob_start(); + ?> + + + + listUpdates(); + if (is_array($updates) === false) { + return false; + } + + return (count($updates) > 0); +} + + +/** + * Returns current update manager url. + * + * @return string + */ +function update_manager_get_url() { global $config; - $current_date = date('Ymd'); - if (isset($config['license_expiry_date']) && $current_date >= $config['license_expiry_date']) { - return true; - } - - return false; -} - - -/** - * Parses responses from configuration wizard. - * - * @return void - */ -function config_wiz_process() -{ - global $config; - $email = get_parameter('email', false); - $timezone = get_parameter('timezone', false); - $language = get_parameter('language', false); - - if ($email !== false) { - config_update_value('language', $language); - } - - if ($timezone !== false) { - config_update_value('timezone', $timezone); - } - - if ($email !== false) { - db_process_sql_update( - 'tusuario', - ['email' => $email], - ['id_user' => $config['id_user']] - ); - } - - // Update the alert action Mail to XXX/Administrator - // if it is set to default. - $mail_check = 'yourmail@domain.es'; - $mail_alert = alerts_get_alert_action_field1(1); - if ($mail_check === $mail_alert && $email !== false) { - alerts_update_alert_action( - 1, - [ - 'field1' => $email, - 'field1_recovery' => $email, - ] - ); - } - - config_update_value('initial_wizard', 1); -} - - -/** - * Generates base code to print main configuration modal. - * - * Asks for timezone, mail. - * - * @param boolean $return Print output or not. - * @param boolean $launch Process JS modal. - * @param string $callback Call to JS function at end. - * - * @return string HTML. - */ -function config_wiz_modal( - $return=false, - $launch=true, - $callback=false -) { - global $config; - - $email = db_get_value('email', 'tusuario', 'id_user', $config['id_user']); - // Avoid to show default email. - if ($email == 'admin@example.com') { - $email = ''; - } - - $output = ''; - - // Prints first step pandora registration. - $output .= ''; - - $output .= '
        '; - - // Verification modal. - $output .= ''; - - ob_start(); - ?> - - - - true, - 'message' => '', - ]; - - // Pandora register update. - $um_message = update_manager_register_instance(); - $ui_feedback['message'] .= $um_message['message'].'

        '; - $ui_feedback['status'] = $um_message['success'] && $ui_feedback['status']; - - if ($ui_feedback['status']) { - // Store next identification reminder. - config_update_value( - 'identification_reminder_timestamp', - $next_check - ); - } - - return $ui_feedback; -} - - -/** - * Shows a modal to register current console in UpdateManager. - * - * @param boolean $return Return or show html. - * @param boolean $launch Execute wizard. - * @param string $callback Call function when done. - * - * @return string HTML code. - */ -function registration_wiz_modal( - $return=false, - $launch=true, - $callback=false, - $return_message=false -) { - global $config; - $output = ''; - - // Do not show the wizard for trial licenses. - if (update_manager_verify_trial()) { - ui_print_info_message('Your license is trial. Please contact Artica at info@artica.es for a valid license', '', $return_message); - return ''; - } - - if (update_manager_verify_license_expired()) { - ui_print_error_message('The license has expired. Please contact Artica at info@artica.es', '', $return_message); - return ''; - } - - $product_name = get_product_name(); - - $output .= ''; - - // Verification modal. - $output .= ''; - - // Results modal. - $output .= ''; - - ob_start(); - ?> - - - 1], - ['id_user' => $config['id_user']] - ); - $ui_feedback['status'] = $um_message['success']; - } else { - $ui_feedback['status'] = false; - } - - return $ui_feedback; -} - - -/** - * Show a modal allowing the user register into newsletter. - * - * @param boolean $return Print content o return it. - * @param boolean $launch Launch directly on load or not. - * @param string $callback Call function when done. - * - * @return string HTML code. - */ -function newsletter_wiz_modal( - $return=false, - $launch=true, - $callback=false -) { - global $config; - - $output = ''; - - $product_name = get_product_name(); - $email = db_get_value( - 'email', - 'tusuario', - 'id_user', - $config['id_user'] - ); - - // Avoid to show default email. - if ($email === 'admin@example.com') { - $email = ''; - } - - $modalContent = html_print_div( - [ - 'class' => 'register_update_manager', - 'content' => html_print_image( - 'images/pandora_circle_big.png', - true - ), - ], - true - ); - - $modalContent .= html_print_div( - [ - 'class' => 'newsletter_div', - 'content' => __('Subscribe to our newsletter'), - ], - true - ); - - $modalContent .= html_print_div( - [ - 'class' => 'license_text both', - 'content' => sprintf( - '

        %s

        %s

        ', - __('Stay up to date with updates, upgrades and promotions by subscribing to our newsletter.'), - __( - 'By subscribing to the newsletter, you accept that your email will be transferred to a database owned by %s. These data will be used only to provide you with information about %s and will not be given to third parties. You can unsubscribe from this database at any time from the newsletter subscription options.', - $product_name, - $product_name - ) - ), - ], - true - ); - - // Email Input case. - $emailInputCase = ''.__('Email').' '.html_print_input_text_extended( - 'email-newsletter', - $email, - 'text-email-newsletter', - '', - 30, - 255, - false, - '', - ['style' => 'display: inline-block; width: 200px;'], - true - ); - - // Generate the submit buttons. - // Cancel Button. - $submitButtons = html_print_div( - [ - 'class' => 'left', - 'content' => html_print_submit_button( - __('Cancel'), - 'cancel_newsletter', - false, - 'class="ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd submit-cancel w100px"', - true - ), - ], - true - ); - - // OK Button. - $submitButtons .= html_print_div( - [ - 'class' => 'right', - 'content' => html_print_submit_button( - __('OK!'), - 'newsletter', - false, - 'class="ui-widget ui-state-default ui-corner-all ui-button-text-only sub ok submit-next w100px"', - true - ), - ], - true - ); - - $submitButtonsCase = html_print_div( - [ - 'class' => 'submit_buttons_container', - 'content' => $submitButtons, - ], - true - ); - - $modalContent .= html_print_div( - [ - 'class' => 'mrgn_lft_4em', - 'content' => html_print_div( - [ - 'id' => 'box_newsletter', - 'content' => $emailInputCase.$submitButtonsCase.'

        ', - ], - true - ), - ], - true - ); - - $output .= html_print_div( - [ - 'id' => 'newsletter_wizard', - 'style' => 'display: none;', - 'title' => __('Do you want to be up to date?'), - 'content' => $modalContent, - ], - true - ); - - // Verification modal. - $verificationContent = html_print_div( - [ - 'class' => 'font_12_20', - 'content' => __('Are you sure you don\'t want to subscribe?').'

        '.__('You will miss all news about amazing features and fixes!').'

        ', - ], - true - ); - - $output .= html_print_div( - [ - 'id' => 'news_ensure_cancel', - 'style' => 'display: none;', - 'title' => 'Confirmation Required', - 'content' => $verificationContent, - ], - true - ); - - // Results modal. - $resultsContent = html_print_div( - [ - 'id' => 'news_result_content', - 'class' => 'font_12_20', - ], - true - ); - - $output .= html_print_div( - [ - 'id' => 'news_result', - 'style' => 'display: none;', - 'title' => 'Subscription process result', - 'content' => $resultsContent, - ], - true - ); - - ob_start(); - ?> - - - $config['history_db_host'], + 'port' => $config['history_db_port'], + 'name' => $config['history_db_name'], + 'user' => $config['history_db_user'], + 'pass' => $config['history_db_pass'], + ] + ); + + $historical_dbh = $dbm->getDBH(); + } + + $insecure = false; + if ($config['secure_update_manager'] === '' + || $config['secure_update_manager'] === null + ) { + $insecure = false; + } else { + // Directive defined. + $insecure = !$config['secure_update_manager']; + } + return [ - 'license' => $license, - 'current_update' => update_manager_get_current_package(), - 'limit_count' => $limit_count, - 'build' => $build_version, - 'version' => $pandora_version, - 'puid' => $config['pandora_uid'], + 'url' => update_manager_get_url(), + 'insecure' => $insecure, + 'license' => $license, + 'current_package' => update_manager_get_current_package(), + 'MR' => (int) $config['MR'], + 'limit_count' => $limit_count, + 'build' => $build_version, + 'version' => $pandora_version, + 'registration_code' => $config['pandora_uid'], + 'homedir' => $config['homedir'], + 'remote_config' => $config['remote_config'], + 'dbconnection' => $config['dbconnection'], + 'historydb' => $historical_dbh, + 'language' => $config['language'], + 'timezone' => $config['timezone'], + 'proxy' => [ + 'host' => $config['update_manager_proxy_host'], + 'port' => $config['update_manager_proxy_port'], + 'user' => $config['update_manager_proxy_user'], + 'password' => $config['update_manager_proxy_password'], + ], ]; } +/** + * Return ad campaigns messages from UMS. + * + * @return array|null + */ +function update_manager_get_messages() +{ + $settings = update_manager_get_config_values(); + $umc = new UpdateManager\Client($settings); + + return $umc->getMessages(); +} + + /** * Function to remove dir and files inside. * @@ -1135,948 +267,3 @@ function rrmdir($dir) unlink($dir); } } - - -/** - * Install updates step2. - * - * @return void - */ -function update_manager_install_package_step2() -{ - global $config; - - ob_clean(); - - $package = (string) get_parameter('package'); - $package = trim($package); - - $version = (string) get_parameter('version', 0); - - $path = sys_get_temp_dir().'/pandora_oum/'.$package; - - // All files extracted. - $files_total = $path.'/files.txt'; - // Files copied. - $files_copied = $path.'/files.copied.txt'; - $return = []; - - if (file_exists($files_copied)) { - unlink($files_copied); - } - - if (file_exists($path)) { - $files_h = fopen($files_total, 'r'); - if ($files_h === false) { - $return['status'] = 'error'; - $return['message'] = __('An error ocurred while reading a file.'); - echo json_encode($return); - return; - } - - while ($line = stream_get_line($files_h, 65535, "\n")) { - $line = trim($line); - - // Tries to move the old file to the directory backup - // inside the extracted package. - if (file_exists($config['homedir'].'/'.$line)) { - rename($config['homedir'].'/'.$line, $path.'/backup/'.$line); - } - - // Tries to move the new file to the Integria directory. - $dirname = dirname($line); - if (!file_exists($config['homedir'].'/'.$dirname)) { - $dir_array = explode('/', $dirname); - $temp_dir = ''; - foreach ($dir_array as $dir) { - $temp_dir .= '/'.$dir; - if (!file_exists($config['homedir'].$temp_dir)) { - mkdir($config['homedir'].$temp_dir); - } - } - } - - if (is_dir($path.'/'.$line)) { - if (!file_exists($config['homedir'].'/'.$line)) { - mkdir($config['homedir'].'/'.$line); - file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX)); - } - } else { - // Copy the new file. - if (rename($path.'/'.$line, $config['homedir'].'/'.$line)) { - // Append the moved file to the copied files txt. - if (!file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX))) { - // If the copy process fail, this code tries to - // restore the files backed up before. - $files_copied_h = fopen($files_copied, 'r'); - if ($files_copied_h === false) { - $backup_status = __('Some of your old files might not be recovered.'); - } else { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line_c)) { - $backup_status = __('Some of your files might not be recovered.'); - } - } - - if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line)) { - $backup_status = __('Some of your files might not be recovered.'); - } - - fclose($files_copied_h); - } - - fclose($files_h); - $return['status'] = 'error'; - $return['message'] = __( - 'Line "%s" not copied to the progress file.', - $line - ).' '.$backup_status; - echo json_encode($return); - return; - } - } else { - // If the copy process fail, this code tries to restore - // the files backed up before. - $files_copied_h = fopen($files_copied, 'r'); - if ($files_copied_h === false) { - $backup_status = __('Some of your files might not be recovered.'); - } else { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename( - $path.'/backup/'.$line, - $config['homedir'].'/'.$line - ) - ) { - $backup_status = __('Some of your old files might not be recovered.'); - } - } - - fclose($files_copied_h); - } - - fclose($files_h); - $return['status'] = 'error'; - $return['message'] = __( - 'Line "%s" not copied to the progress file.', - $line - ).' '.$backup_status; - echo json_encode($return); - return; - } - } - } - - fclose($files_h); - } else { - $return['status'] = 'error'; - $return['message'] = __('The package does not exist'); - echo json_encode($return); - return; - } - - update_manager_enterprise_set_version($version); - $product_name = io_safe_output(get_product_name()); - - // Generate audit entry. - db_pandora_audit( - 'Update '.$product_name, - 'Update version: '.$version.' of '.$product_name.' by '.$config['id_user'] - ); - - $return['status'] = 'success'; - $return['message'] = __('The package is installed.'); - echo json_encode($return); - -} - - -/** - * Launch update manager client. - * - * @return void - */ -function update_manager_main() -{ - global $config; - ?> - - - - 'newest_package', - 'license' => $um_config_values['license'], - 'limit_count' => $um_config_values['limit_count'], - 'current_package' => $um_config_values['current_update'], - 'version' => $um_config_values['version'], - 'build' => $um_config_values['build'], - 'puid' => $um_config_values['puid'], - ]; - - $curlObj = curl_init(); - curl_setopt($curlObj, CURLOPT_URL, get_um_url().'server.php'); - curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlObj, CURLOPT_POST, true); - curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params); - curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false); - curl_setopt($curlObj, CURLOPT_CONNECTTIMEOUT, 4); - - if (isset($config['update_manager_proxy_server'])) { - curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']); - } - - if (isset($config['update_manager_proxy_port'])) { - curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']); - } - - if (isset($config['update_manager_proxy_user'])) { - curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'].':'.$config['update_manager_proxy_password']); - } - - $result = curl_exec($curlObj); - $http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE); - curl_close($curlObj); - - if ($result === false) { - return false; - } else if ($http_status >= 400 && $http_status < 500) { - return false; - } else if ($http_status >= 500) { - return false; - } else { - $result = json_decode($result, true); - - if (empty($result)) { - return false; - } else { - return true; - } - } -} - - -/** - * Update process, online packages. - * - * @param boolean $is_ajax Is ajax call o direct call. - * - * @return string HTML update message. - */ -function update_manager_check_online_free_packages($is_ajax=true) -{ - global $config; - - $update_message = ''; - - $um_config_values = update_manager_get_config_values(); - - $params = [ - 'action' => 'newest_package', - 'license' => $um_config_values['license'], - 'limit_count' => $um_config_values['limit_count'], - 'current_package' => $um_config_values['current_update'], - 'version' => $um_config_values['version'], - 'build' => $um_config_values['build'], - 'puid' => $um_config_values['puid'], - ]; - - /* - * To test using shell execute: - * wget https://artica.es/pandoraupdate7/server.php -O- \ - * --no-check-certificate --post-data \ - * "action=newest_package&license=PANDORA_FREE&limit_count=1¤t_package=1&version=v5.1RC1&build=PC140625" - */ - - $curlObj = curl_init(); - curl_setopt($curlObj, CURLOPT_URL, get_um_url().'server.php'); - curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlObj, CURLOPT_POST, true); - curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params); - curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false); - if (isset($config['update_manager_proxy_server'])) { - curl_setopt( - $curlObj, - CURLOPT_PROXY, - $config['update_manager_proxy_server'] - ); - } - - if (isset($config['update_manager_proxy_port'])) { - curl_setopt( - $curlObj, - CURLOPT_PROXYPORT, - $config['update_manager_proxy_port'] - ); - } - - if (isset($config['update_manager_proxy_user'])) { - curl_setopt( - $curlObj, - CURLOPT_PROXYUSERPWD, - $config['update_manager_proxy_user'].':'.$config['update_manager_proxy_password'] - ); - } - - $result = curl_exec($curlObj); - $http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE); - curl_close($curlObj); - - if ($result === false) { - if ($is_ajax) { - echo __('Could not connect to internet'); - } else { - $update_message = __('Could not connect to internet'); - } - } else if ($http_status >= 400 && $http_status < 500) { - if ($is_ajax) { - echo __('Server not found.'); - } else { - $update_message = __('Server not found.'); - } - } else if ($http_status >= 500) { - if ($is_ajax) { - echo $result; - } else { - $update_message = $result; - } - } else { - if ($is_ajax) { - $result = json_decode($result, true); - - if (!empty($result)) { - ?> - - There is a new version: '.$result[0]['version'].'

        '; - echo "".__('Update').''; - } else { - echo __('There is no update available.'); - } - - return $update_message; - } else { - if (!empty($result)) { - $result = json_decode($result, true); - $update_message = 'There is a new version: '.$result[0]['version']; - } - - return $update_message; - } - } - -} - - -/** - * Executes an action against UpdateManager. - * - * @param string $action Action to perform. - * @param boolean $additional_params Extra parameters (optional). - * - * @return array With UM response. - */ -function update_manager_curl_request($action, $additional_params=false) -{ - global $config; - - $error_array = [ - 'success' => true, - 'update_message' => '', - ]; - $update_message = ''; - - $um_config_values = update_manager_get_config_values(); - - $params = [ - 'license' => $um_config_values['license'], - 'limit_count' => $um_config_values['limit_count'], - 'current_package' => $um_config_values['current_update'], - 'version' => $um_config_values['version'], - 'build' => $um_config_values['build'], - 'puid' => $um_config_values['puid'], - ]; - if ($additional_params !== false) { - $params = array_merge($params, $additional_params); - } - - $params['action'] = $action; - - $curlObj = curl_init(); - curl_setopt($curlObj, CURLOPT_URL, get_um_url().'server.php'); - curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlObj, CURLOPT_POST, true); - curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params); - curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false); - if (isset($config['update_manager_proxy_server'])) { - curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']); - } - - if (isset($config['update_manager_proxy_port'])) { - curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']); - } - - if (isset($config['update_manager_proxy_user'])) { - curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'].':'.$config['update_manager_proxy_password']); - } - - $result = curl_exec($curlObj); - $http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE); - curl_close($curlObj); - - $error_array['http_status'] = $http_status; - - if ($result === false) { - $error_array['success'] = false; - if ($is_ajax) { - echo __('Could not connect to internet'); - return $error_array; - } else { - $error_array['update_message'] = __('Could not connect to internet'); - return $error_array; - } - } else if ($http_status >= 400 && $http_status < 500) { - $error_array['success'] = false; - if ($is_ajax) { - echo __('Server not found.'); - return $error_array; - } else { - $error_array['update_message'] = __('Server not found.'); - return $error_array; - } - } else if ($http_status >= 500) { - $error_array['success'] = false; - if ($is_ajax) { - echo $result; - return $error_array; - } else { - $error_array['update_message'] = $result; - return $error_array; - } - } - - $error_array['update_message'] = $result; - return $error_array; - -} - - -/** - * Subscribes an email account into newsletter. - * - * @param string $email E-mail. - * - * @return array With success [true/false], message [string]. - */ -function update_manager_insert_newsletter($email) -{ - global $config; - - if ($email === '') { - return false; - } - - $params = [ - 'email' => $email, - 'language' => $config['language'], - 'license' => db_get_value_filter( - 'value', - 'tupdate_settings', - ['key' => 'customer_key'] - ), - ]; - - $result = update_manager_curl_request('new_newsletter', $params); - - if (!$result['success']) { - return [ - 'success' => false, - 'message' => __('Remote server error on newsletter request'), - ]; - } - - switch ($result['http_status']) { - case 200: - $message = json_decode($result['update_message'], true); - if ($message['success'] == 1) { - return [ - 'success' => true, - 'message' => __('E-mail successfully subscribed to newsletter.'), - ]; - } else { - return [ - 'success' => true, - 'message' => __('E-mail has already subscribed to newsletter.'), - ]; - } - - default: - return [ - 'success' => false, - 'message' => __('Update manager returns error code: ').$result['http_status'].'.', - ]; - } -} - - -/** - * Registers this console into UpdateManager. - * - * @return array With success [true/false], message [string]. - */ -function update_manager_register_instance() -{ - global $config; - - $email = db_get_value('email', 'tusuario', 'id_user', $config['id_user']); - - $um_config_values = update_manager_get_config_values(); - - $params = [ - 'action' => 'newest_package', - 'license' => $um_config_values['license'], - 'limit_count' => $um_config_values['limit_count'], - 'current_package' => $um_config_values['current_update'], - 'version' => $um_config_values['version'], - 'build' => $um_config_values['build'], - 'puid' => $um_config_values['puid'], - 'email' => $email, - 'language' => $config['language'], - 'timezone' => $config['timezone'], - ]; - - $result = update_manager_curl_request('new_register', $params); - - if (!$result['success']) { - return [ - 'success' => false, - 'message' => __('Error while registering console.').'
        '.$result['update_message'], - ]; - } - - switch ($result['http_status']) { - case 200: - // Retrieve the PUID. - $message = json_decode($result['update_message'], true); - - if ($message['success'] == 1) { - $puid = $message['pandora_uid']; - config_update_value('pandora_uid', $puid); - - // The tupdate table is reused to display messages. - // A specific entry to tupdate_package is required. - // Then, this tupdate_package id is saved in tconfig. - db_process_sql_insert( - 'tupdate_package', - ['description' => '__UMMESSAGES__'] - ); - $id_um_package_messages = db_get_value( - 'id', - 'tupdate_package', - 'description', - '__UMMESSAGES__' - ); - config_update_value( - 'id_um_package_messages', - $id_um_package_messages - ); - return [ - 'success' => true, - 'message' => __('Pandora successfully subscribed with UID: ').$puid.'.', - ]; - } else { - return [ - 'success' => false, - 'message' => __('Unsuccessful subscription.'), - ]; - } - - default: - return [ - 'success' => false, - 'message' => __('Update manager returns error code: ').$result['http_status'].'.', - ]; - } -} - - -/** - * Extracts OUM package. - * - * @return boolean Success or not. - */ -function update_manager_extract_package() -{ - global $config; - - $path_package = $config['attachment_store'].'/downloads/last_package.tgz'; - - ob_start(); - - if (!defined('PHP_VERSION_ID')) { - $version = explode('.', PHP_VERSION); - define( - 'PHP_VERSION_ID', - ($version[0] * 10000 + $version[1] * 100 + $version[2]) - ); - } - - $extracted = false; - - // Phar and exception working fine in 5.5.0 or higher. - if (PHP_VERSION_ID >= 50505) { - $phar = new PharData($path_package); - try { - $result = $phar->extractTo( - $config['attachment_store'].'/downloads/', - null, - true - ); - $extracted = true; - } catch (Exception $e) { - echo ' There\'s a problem ... -> '.$e->getMessage(); - $extracted = false; - } - } - - $return = true; - - if ($extracted === false) { - // Phar extraction failed. Fallback to OS extraction. - $return = false; - - if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { - // Unsupported OS. - echo 'This OS ['.PHP_OS.'] does not support direct extraction of tgz files. Upgrade PHP version to be > 5.5.0'; - } else { - $return = true; - system('tar xzf "'.$path_package.'" -C '.$config['attachment_store'].'/downloads/'); - } - } - - ob_end_clean(); - - rrmdir($path_package); - - if ($result == 0) { - db_process_sql_update( - 'tconfig', - [ - 'value' => json_encode( - [ - 'status' => 'fail', - 'message' => __('Failed extracting the package to temp directory.'), - ] - ), - ], - ['token' => 'progress_update_status'] - ); - - return false; - } - - // An update have been applied, clean phantomjs cache. - config_update_value( - 'clean_phantomjs_cache', - 1 - ); - - db_process_sql_update( - 'tconfig', - ['value' => 50], - ['token' => 'progress_update'] - ); - - return $return; -} - - -/** - * The update copy entire tgz or fail (leaving some parts copied - * and others not). - * This does not make changes on DB. - * - * @return boolean Success or not. - */ -function update_manager_starting_update() -{ - global $config; - - $full_path = $config['attachment_store'].'/downloads'; - - $homedir = $config['homedir']; - - $result = update_manager_recurse_copy( - $full_path, - $homedir, - ['install.php'] - ); - - rrmdir($full_path.'/pandora_console'); - - if (!$result) { - db_process_sql_update( - 'tconfig', - [ - 'value' => json_encode( - [ - 'status' => 'fail', - 'message' => __('Failed the copying of the files.'), - ] - ), - ], - ['token' => 'progress_update_status'] - ); - - return false; - } else { - db_process_sql_update( - 'tconfig', - ['value' => 100], - ['token' => 'progress_update'] - ); - db_process_sql_update( - 'tconfig', - [ - 'value' => json_encode( - [ - 'status' => 'end', - 'message' => __('Package extracted successfully.'), - ] - ), - ], - ['token' => 'progress_update_status'] - ); - - return true; - } -} - - -/** - * Copies recursively extracted package updates to target path. - * - * @param string $src Path. - * @param string $dst Path. - * @param string $black_list Path. - * - * @return boolean Success or not. - */ -function update_manager_recurse_copy($src, $dst, $black_list) -{ - $dir = opendir($src); - @mkdir($dst); - @trigger_error('NONE'); - - while (false !== ( $file = readdir($dir))) { - if (( $file != '.' ) && ( $file != '..' ) && (!in_array($file, $black_list))) { - if (is_dir($src.'/'.$file)) { - $dir_dst = $dst; - - if ($file != 'pandora_console') { - $dir_dst .= '/'.$file; - } - - if (!update_manager_recurse_copy( - $src.'/'.$file, - $dir_dst, - $black_list - ) - ) { - return false; - } - } else { - $result = copy($src.'/'.$file, $dst.'/'.$file); - $error = error_get_last(); - - if (strstr($error['message'], 'copy(')) { - return false; - } - } - } - } - - closedir($dir); - - return true; -} - - -/** - * Updates current update (DB). - * - * @param string $current_package Current package. - * - * @return void - */ -function update_manager_set_current_package($current_package) -{ - if (enterprise_installed()) { - $token = 'current_package_enterprise'; - } else { - $token = 'current_package'; - } - - $col_value = db_escape_key_identifier('value'); - $col_key = db_escape_key_identifier('key'); - - $value = db_get_value( - $col_value, - 'tupdate_settings', - $col_key, - $token - ); - - if ($value === false) { - db_process_sql_insert( - 'tupdate_settings', - [ - $col_value => $current_package, - $col_key => $token, - ] - ); - } else { - db_process_sql_update( - 'tupdate_settings', - [$col_value => $current_package], - [$col_key => $token] - ); - } -} - - -/** - * Retrieves current update from DB. - * - * @return string Current update. - */ -function update_manager_get_current_package() -{ - global $config; - - if (enterprise_installed()) { - $token = 'current_package_enterprise'; - } else { - $token = 'current_package'; - } - - $current_update = db_get_value( - db_escape_key_identifier('value'), - 'tupdate_settings', - db_escape_key_identifier('key'), - $token - ); - - if ($current_update === false) { - $current_update = 0; - if (isset($config[$token])) { - $current_update = $config[$token]; - } - } - - return $current_update; -} - - -/** - * Function recursive delete directory. - * - * @param string $dir Directory to delete. - * @param array $result Array result state and message. - * - * @return array Return result array with status 0 valid or 1 false and - * type 'f' file and 'd' dir and route path file or directory. - */ -function rmdir_recursive(string $dir, array &$result) -{ - foreach (scandir($dir) as $file) { - if ('.' === $file || '..' === $file) { - continue; - } - - if (is_dir($dir.'/'.$file) === true) { - rmdir_recursive($dir.'/'.$file, $result); - } else { - $unlink = unlink($dir.'/'.$file); - $res = []; - $res['status'] = ($unlink === true) ? 0 : 1; - $res['type'] = 'f'; - $res['path'] = $dir.'/'.$file; - array_push($result, $res); - } - } - - $rmdir = rmdir($dir); - $res = []; - $res['status'] = ($rmdir === true) ? 0 : 1; - $res['type'] = 'd'; - $res['path'] = $dir; - array_push($result, $res); - - return $result; -} diff --git a/pandora_console/include/javascript/pandora_ui.js b/pandora_console/include/javascript/pandora_ui.js index 9b23bb93cd..1652aab421 100644 --- a/pandora_console/include/javascript/pandora_ui.js +++ b/pandora_console/include/javascript/pandora_ui.js @@ -478,7 +478,7 @@ function confirmDialog(settings) { buttons: [ { id: "cancel_btn_dialog", - text: "Cancel", + text: settings.cancelText ? settings.cancelText : "Cancel", class: "ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd submit-cancel", click: function() { @@ -488,7 +488,7 @@ function confirmDialog(settings) { } }, { - text: "Ok", + text: settings.okText ? settings.okText : "Ok", class: hideOkButton + "ui-widget ui-state-default ui-corner-all ui-button-text-only sub ok submit-next", diff --git a/pandora_console/include/javascript/update_manager.js b/pandora_console/include/javascript/update_manager.js deleted file mode 100644 index 6f0aeda5c6..0000000000 --- a/pandora_console/include/javascript/update_manager.js +++ /dev/null @@ -1,2425 +0,0 @@ -/* - globals $, jQuery -*/ - -var correct_install_progress = true; - -function form_upload(homeurl, current_package) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - //Thanks to: http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/ - var ul = $("#form-offline_update ul"); - - $("#form-offline_update div").prop("id", "drop_file"); - $("#drop_file").html( - drop_the_package_here_or + - "   " + - browse_it + - "" + - '' - ); - $("#drop_file a").click(function() { - // Simulate a click on the file input button to show the file browser dialog - $(this) - .parent() - .find("input") - .click(); - }); - - // Initialize the jQuery File Upload plugin - $("#form-offline_update").fileupload({ - url: - home_url + - "ajax.php?page=include/ajax/update_manager.ajax&upload_file=true", - - // This element will accept file drag/drop uploading - dropZone: $("#drop_file"), - - // This function is called when a file is added to the queue; - // either via the browse button, or via drag/drop: - add: function(e, data) { - $("#drop_file").slideUp(); - - var tpl = $( - "
      • " + - '' + - "

        " + - "
      • " - ); - - // Append the file name and file size - tpl - .find("p") - .text(data.files[0].name) - .append("" + formatFileSize(data.files[0].size) + ""); - - // Add the HTML to the UL element - ul.html(""); - data.context = tpl.appendTo(ul); - - // Initialize the knob plugin - tpl.find("input").val(0); - tpl.find("input").knob({ - draw: function() { - $(this.i).val(this.cv + "%"); - } - }); - - // Listen for clicks on the cancel icon - tpl.find("span").click(function() { - if (tpl.hasClass("working") && typeof jqXHR != "undefined") { - jqXHR.abort(); - } - - tpl.fadeOut(function() { - tpl.remove(); - $("#drop_file").slideDown(); - }); - }); - - // Automatically upload the file once it is added to the queue - data.context.addClass("working"); - var jqXHR = data.submit(); - }, - - progress: function(e, data) { - // Calculate the completion percentage of the upload - var progress = parseInt((data.loaded / data.total) * 100, 10); - - // Update the hidden input field and trigger a change - // so that the jQuery knob plugin knows to update the dial - data.context - .find("input") - .val(progress) - .change(); - - if (progress == 100) { - data.context.removeClass("working"); - // Class loading while the zip is extracted - data.context.addClass("loading"); - } - }, - - fail: function(e, data) { - // Something has gone wrong! - data.context.removeClass("working"); - data.context.removeClass("loading"); - data.context.addClass("error"); - }, - - done: function(e, data) { - var res = JSON.parse(data.result); - - if (res.status == "success") { - data.context.removeClass("loading"); - data.context.addClass("suc"); - - ul.find("li") - .find("span") - .unbind("click"); - - // Transform the file input zone to show messages - $("#drop_file").prop("id", "log_zone"); - - // Success messages - $("#log_zone").html( - "
        " + the_package_has_been_uploaded_successfully + "
        " - ); - $("#log_zone").append( - "
        " + remember_that_this_package_will + "
        " - ); - $("#log_zone").append( - "
        " + click_on_the_file_below_to_begin + "
        " - ); - - // Show messages - $("#log_zone").slideDown(400, function() { - $("#log_zone").height(75); - $("#log_zone").css("overflow", "auto"); - }); - - // Bind the the begin of the installation to the package li - ul.find("li").css("cursor", "pointer"); - ul.find("li").click(function() { - ul.find("li").unbind("click"); - ul.find("li").css("cursor", "default"); - - // Change the log zone to show the copied files - $("#log_zone").html(""); - $("#log_zone").slideUp(200, function() { - $("#log_zone").slideDown(200, function() { - $("#log_zone").height(200); - $("#log_zone").css("overflow", "auto"); - }); - }); - - // Changed the data that shows the file li - data.context.find("p").text(updating + "..."); - data.context - .find("input") - .val(0) - .change(); - - // Begin the installation - install_package(res.package, homeurl, current_package); - }); - } else { - // Something has gone wrong! - data.context.removeClass("loading"); - data.context.addClass("error"); - ul.find("li") - .find("span") - .click(function() { - window.location.reload(); - }); - - // Transform the file input zone to show messages - $("#drop_file").prop("id", "log_zone"); - - // Error messages - $("#log_zone").html("
        " + res.message + "
        "); - - // Show error messages - $("#log_zone").slideDown(400, function() { - $("#log_zone").height(75); - $("#log_zone").css("overflow", "auto"); - }); - } - } - }); - - // Prevent the default action when a file is dropped on the window - $(document).on("drop_file dragover", function(e) { - e.preventDefault(); - }); -} - -// Helper function that formats the file sizes -function formatFileSize(bytes) { - if (typeof bytes !== "number") { - return ""; - } - - if (bytes >= 1000000000) { - return (bytes / 1000000000).toFixed(2) + " GB"; - } - - if (bytes >= 1000000) { - return (bytes / 1000000).toFixed(2) + " MB"; - } - - return (bytes / 1000).toFixed(2) + " KB"; -} - -function install_package(package, homeurl, current_package) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["search_minor"] = 1; - parameters["package"] = package; - parameters["ent"] = 1; - parameters["offline"] = 1; - - $.ajax({ - type: "POST", - url: home_url + "ajax.php", - data: parameters, - dataType: "json", - success: function(data) { - if (data["have_minor"]) { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 270, - buttons: [ - { - text: apply_mr_button, - click: function() { - var err = []; - err = apply_minor_release( - data["mr"], - package, - 1, - 1, - home_url - ); - - if (!err["error"]) { - if (err["message"] == "bad_mr_filename") { - $("#mr_dialog2").dialog("close"); - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 270, - buttons: [ - { - text: apply_button, - click: function() { - $(this).dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_accept_package_mr_fail_text = - "
        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "

        INFO

        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "

        " + - mr_not_accepted_code_yes + - "

        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "
        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "
        "; - - $("#accept_package_mr_fail").html( - dialog_accept_package_mr_fail_text - ); - $("#accept_package_mr_fail").dialog("open"); - - var parameters = {}; - parameters["page"] = - "include/ajax/update_manager.ajax"; - parameters["install_package"] = 1; - parameters["package"] = package; - parameters["accept"] = 1; - - $("#form-offline_update ul") - .find("li") - .removeClass("suc"); - $("#form-offline_update ul") - .find("li") - .addClass("loading"); - - $.ajax({ - type: "POST", - url: home_url + "ajax.php", - data: parameters, - dataType: "json", - success: function(data) { - $("#form-offline_update ul") - .find("li") - .removeClass("loading"); - if (data.status == "success") { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_success_pkg_text = - "
        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "

        SUCCESS

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "

        " + - package_success + - "

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "
        "; - dialog_success_pkg_text = - dialog_success_pkg_text + "
        "; - - $("#success_pkg").html( - dialog_success_pkg_text - ); - $("#success_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .addClass("suc"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_updated_successfully) - .append( - "" + - if_there_are_any_database_change + - "" - ); - } else { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_pkg_text = - "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "

        ERROR

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "

        " + - package_error + - "

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "
        "; - - $("#error_pkg").html( - dialog_error_pkg_text - ); - $("#error_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_not_updated) - .append( - "" + data.message + "" - ); - } - $("#form-offline_update ul") - .find("li") - .css("cursor", "pointer"); - $("#form-offline_update ul") - .find("li") - .click(function() { - window.location.reload(); - }); - } - }); - - // Check the status of the update - check_install_package(package, homeurl); - } - }, - { - text: cancel_button, - click: function() { - $(this).dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 220, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_cancel_pkg_text = - "
        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "

        INFO

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "

        " + - package_cancel + - "

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "
        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + "
        "; - - $("#cancel_pkg").html( - dialog_cancel_pkg_text - ); - $("#cancel_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .removeClass("loading"); - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(mr_not_accepted) - .append("" + data.message + ""); - } - } - ] - }); - - var dialog_bad_message_text = - "
        "; - dialog_bad_message_text = - dialog_bad_message_text + - "

        ERROR

        "; - dialog_bad_message_text = - dialog_bad_message_text + - "

        " + - bad_mr_file + - "

        "; - dialog_bad_message_text = - dialog_bad_message_text + - "
        "; - dialog_bad_message_text = - dialog_bad_message_text + "
        "; - - $("#bad_message").html(dialog_bad_message_text); - $("#bad_message").dialog("open"); - } else { - $("#mr_dialog2").dialog("close"); - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_success_mr_text = - "
        "; - dialog_success_mr_text = - dialog_success_mr_text + - "

        SUCCESS

        "; - dialog_success_mr_text = - dialog_success_mr_text + - "

        " + - mr_success + - "

        "; - dialog_success_mr_text = - dialog_success_mr_text + - "
        "; - dialog_success_mr_text = - dialog_success_mr_text + "
        "; - - $("#success_mr").html(dialog_success_mr_text); - $("#success_mr").dialog("open"); - - var parameters = {}; - parameters["page"] = - "include/ajax/update_manager.ajax"; - parameters["install_package"] = 1; - parameters["package"] = package; - parameters["accept"] = 1; - - $("#form-offline_update ul") - .find("li") - .removeClass("suc"); - $("#form-offline_update ul") - .find("li") - .addClass("loading"); - - $.ajax({ - type: "POST", - url: home_url + "ajax.php", - data: parameters, - dataType: "json", - success: function(data) { - $("#form-offline_update ul") - .find("li") - .removeClass("loading"); - if (data.status == "success") { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_success_pkg_text = - "
        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "

        SUCCESS

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "

        " + - package_success + - "

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "
        "; - dialog_success_pkg_text = - dialog_success_pkg_text + "
        "; - - $("#success_pkg").html( - dialog_success_pkg_text - ); - $("#success_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .addClass("suc"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_updated_successfully) - .append( - "" + - if_there_are_any_database_change + - "" - ); - } else { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_pkg_text = - "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "

        ERROR

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "

        " + - package_error + - "

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "
        "; - - $("#error_pkg").html(dialog_error_pkg_text); - $("#error_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_not_updated) - .append("" + data.message + ""); - } - $("#form-offline_update ul") - .find("li") - .css("cursor", "pointer"); - $("#form-offline_update ul") - .find("li") - .click(function() { - window.location.reload(); - }); - } - }); - - // Check the status of the update - check_install_package(package, homeurl); - - remove_rr_file(data["mr"], home_url); - } - } else { - $("#mr_dialog2").dialog("close"); - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_mr_text = - "
        "; - dialog_error_mr_text = - dialog_error_mr_text + - "

        ERROR

        "; - dialog_error_mr_text = - dialog_error_mr_text + - "

        " + - mr_error + - "

        "; - dialog_error_mr_text = - dialog_error_mr_text + - "
        "; - dialog_error_mr_text = - dialog_error_mr_text + "
        "; - - $("#error_mr").html(dialog_error_mr_text); - $("#error_mr").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(error_in_mr) - .append("" + data.message + ""); - } - } - }, - { - text: cancel_button, - click: function() { - $("#mr_dialog2").dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 220, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_cancel_mr_text = - "
        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + - "

        INFO

        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + - "

        " + - mr_cancel + - "

        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + - "
        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + "
        "; - - $("#cancel_mr").html(dialog_cancel_mr_text); - $("#cancel_mr").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .removeClass("loading"); - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(mr_not_accepted) - .append("" + data.message + ""); - } - } - ] - }); - - $("button:contains(Apply MR)") - .attr("id", "apply_rr_button") - .addClass("success_button"); - $("button:contains(Cancel)").attr("id", "cancel_rr_button"); - - var dialog_have_mr_text = "
        "; - dialog_have_mr_text = - dialog_have_mr_text + - "

        " + - mr_available_header + - "

        "; - dialog_have_mr_text = - dialog_have_mr_text + "

        " + text1_mr_file + "

        "; - dialog_have_mr_text = - dialog_have_mr_text + - "

        " + - text2_mr_file + - '' + - text3_mr_file + - "" + - text4_mr_file + - "

        "; - dialog_have_mr_text = - dialog_have_mr_text + - "
        "; - dialog_have_mr_text = dialog_have_mr_text + "
        "; - - $("#mr_dialog2").html(dialog_have_mr_text); - $("#mr_dialog2").dialog("open"); - } else { - $("#pkg_apply_dialog").dialog("close"); - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["install_package"] = 1; - parameters["package"] = package; - parameters["accept"] = 1; - - $("#form-offline_update ul") - .find("li") - .removeClass("suc"); - $("#form-offline_update ul") - .find("li") - .addClass("loading"); - - $.ajax({ - type: "POST", - url: home_url + "ajax.php", - data: parameters, - dataType: "json", - success: function(data) { - $("#form-offline_update ul") - .find("li") - .removeClass("loading"); - if (data.status == "success") { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_success_pkg_text = - "
        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "

        SUCCESS

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "

        " + - package_success + - "

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "
        "; - dialog_success_pkg_text = - dialog_success_pkg_text + "
        "; - - $("#success_pkg").html(dialog_success_pkg_text); - $("#success_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .addClass("suc"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_updated_successfully) - .append( - "" + if_there_are_any_database_change + "" - ); - } else { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_pkg_text = "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "

        ERROR

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "

        " + - package_error + - "

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "
        "; - dialog_error_pkg_text = dialog_error_pkg_text + "
        "; - - $("#error_pkg").html(dialog_error_pkg_text); - $("#error_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_not_updated) - .append("" + data.message + ""); - } - $("#form-offline_update ul") - .find("li") - .css("cursor", "pointer"); - $("#form-offline_update ul") - .find("li") - .click(function() { - window.location.reload(); - }); - } - }); - - // Check the status of the update - check_install_package(package, homeurl); - - remove_rr_file_to_extras(home_url); - } - } - }); - } - }, - { - text: cancel_button, - click: function() { - $(this).dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 220, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_cancel_pkg_text = "
        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + "

        INFO

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + "

        " + package_cancel + "

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "
        "; - dialog_cancel_pkg_text = dialog_cancel_pkg_text + "
        "; - - $("#cancel_pkg").html(dialog_cancel_pkg_text); - $("#cancel_pkg").dialog("open"); - - $("#form-offline_update ul") - .find("li") - .removeClass("loading"); - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_not_accepted) - .append("" + data.message + ""); - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["install_package"] = 1; - parameters["package"] = package; - parameters["accept"] = 0; - - $("#form-offline_update ul") - .find("li") - .removeClass("suc"); - $("#form-offline_update ul") - .find("li") - .addClass("loading"); - - $.ajax({ - type: "POST", - url: home_url + "ajax.php", - data: parameters, - dataType: "json", - success: function(data) { - $("#form-offline_update ul") - .find("li") - .removeClass("loading"); - if (data.status == "success") { - $("#form-offline_update ul") - .find("li") - .addClass("suc"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_updated_successfully) - .append("" + if_there_are_any_database_change + ""); - } else { - $("#form-offline_update ul") - .find("li") - .addClass("error"); - $("#form-offline_update ul") - .find("li") - .find("p") - .html(package_not_updated) - .append("" + data.message + ""); - } - $("#form-offline_update ul") - .find("li") - .css("cursor", "pointer"); - $("#form-offline_update ul") - .find("li") - .click(function() { - window.location.reload(); - }); - } - }); - - // Check the status of the update - check_install_package(package, homeurl); - } - } - ] - }); - - var dialog_text = "
        "; - dialog_text = - dialog_text + - "

        " + - text1_package_file + - "

        "; - dialog_text = dialog_text + "

        " + text2_package_file + "

        "; - dialog_text = - dialog_text + - "
        "; - dialog_text = dialog_text + "
        "; - - $("#pkg_apply_dialog").html(dialog_text); - $("#pkg_apply_dialog").dialog("open"); - - const number_update = package.match(/package_(\d+).oum/); - - if (number_update === null || number_update[1] != current_package - 0 + 1) { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_warning = "
        "; - dialog_warning = - dialog_warning + - "

        " + - text1_warning + - "

        "; - dialog_warning = dialog_warning + "

        " + text2_warning + "

        "; - dialog_warning = - dialog_warning + - "
        "; - dialog_warning = dialog_warning + "
        "; - - $("#warning_pkg").html(dialog_warning); - } -} - -function check_install_package(package, homeurl) { - var home_url = typeof homeurl !== "undefined" ? (homeurl += "/") : ""; - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["check_install_package"] = 1; - parameters["package"] = package; - - $.ajax({ - type: "POST", - url: home_url + "ajax.php", - data: parameters, - dataType: "json", - success: function(data) { - // Print the updated files and take the scroll to the bottom. - $("#log_zone").append(data.info); - $("#log_zone").scrollTop($("#log_zone").prop("scrollHeight")); - - // Change the progress bar. - if ( - $("#form-offline_update ul") - .find("li") - .hasClass("suc") - ) { - $("#form-offline_update") - .find("ul") - .find("li") - .find("input") - .val(100) - .trigger("change"); - } else { - $("#form-offline_update") - .find("ul") - .find("li") - .find("input") - .val(data["progress"]) - .trigger("change"); - } - - // The class loading is present until the update ends. - var isInstalling = $("#form-offline_update ul") - .find("li") - .hasClass("loading"); - if (data.progress < 100 && isInstalling) { - // Recursive call to check the update status. - check_install_package(package, homeurl); - } - - if (!isInstalling) { - //Check if exist remove files. - delete_desired_files(homeurl); - } - } - }); -} - -function check_online_free_packages(homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - $("#box_online .checking_package").show(); - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["check_online_free_packages"] = 1; - - jQuery.post( - home_url + "ajax.php", - parameters, - function(data) { - $("#box_online .checking_package").hide(); - - $("#box_online .loading").hide(); - $("#box_online .content").html(data); - }, - "html" - ); -} - -function update_last_package(package, version, homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - version_update = version; - - $("#box_online .content").html(""); - $("#box_online .loading").show(); - $("#box_online .downloading_package").show(); - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["update_last_free_package"] = 1; - parameters["package"] = package; - parameters["version"] = version; - parameters["accept"] = 0; - - jQuery.post( - home_url + "ajax.php", - parameters, - function(data) { - if (data["in_progress"]) { - $("#box_online .downloading_package").hide(); - - $("#box_online .content").html(data["message"]); - - var parameters2 = {}; - parameters2["page"] = "include/ajax/update_manager.ajax"; - parameters2["unzip_free_package"] = 1; - parameters2["package"] = package; - parameters2["version"] = version; - - jQuery.post( - home_url + "ajax.php", - parameters2, - function(data) { - if (data["correct"]) { - $("#box_online .downloading_package").hide(); - - $("#box_online .content").html(data["message"]); - - install_free_package_prev_step(package, version, home_url); - } else { - $("#box_online .content").html(data["message"]); - } - }, - "json" - ); - } else { - $("#box_online .content").html(data["message"]); - } - }, - "json" - ); -} - -function check_progress_update(homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - if (stop_check_progress) { - return; - } - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["check_update_free_package"] = 1; - - jQuery.post( - home_url + "ajax.php", - parameters, - function(data) { - if (stop_check_progress) { - return; - } - - if (data["correct"]) { - if (data["end"]) { - //$("#box_online .content").html(data['message']); - } else { - $("#box_online .progressbar").show(); - - $("#box_online .progressbar .progressbar_img").attr( - "src", - data["progressbar"] - ); - - setTimeout(function() { - check_progress_update(homeurl); - }, 1000); - } - } else { - correct_install_progress = false; - $("#box_online .content").html(data["message"]); - } - }, - "json" - ); -} - -function install_free_package_prev_step(package, version, homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["search_minor"] = 1; - parameters["ent"] = 0; - parameters["package"] = package; - parameters["offline"] = 0; - - jQuery.post( - home_url + "ajax.php", - parameters, - function(data) { - $("#box_online .downloading_package").hide(); - if (data["have_minor"]) { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 270, - buttons: [ - { - text: apply_mr_button, - click: function() { - var err = []; - err = apply_minor_release( - data["mr"], - package, - 0, - 0, - home_url - ); - if (!err["error"]) { - if (err["message"] == "bad_mr_filename") { - $("#mr_dialog2").dialog("close"); - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 270, - buttons: [ - { - text: apply_button, - click: function() { - $(this).dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_accept_package_mr_fail_text = - "
        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "

        INFO

        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "

        " + - mr_not_accepted_code_yes + - "

        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "
        "; - dialog_accept_package_mr_fail_text = - dialog_accept_package_mr_fail_text + - "
        "; - - $("#accept_package_mr_fail").html( - dialog_accept_package_mr_fail_text - ); - $("#accept_package_mr_fail").dialog("open"); - - var parameters2 = {}; - parameters2["page"] = - "include/ajax/update_manager.ajax"; - parameters2["update_last_free_package"] = 1; - parameters2["package"] = package; - parameters2["version"] = version; - - jQuery.post( - home_url + "ajax.php", - parameters2, - function(data) { - if (data["in_progress"]) { - $( - "#box_online .download_package" - ).hide(); - - $("#box_online .content").html( - data["message"] - ); - - install_free_package( - package, - version, - homeurl - ); - setTimeout(function() { - check_progress_update(homeurl); - }, 1000); - } else { - $("#box_online .content").html( - data["message"] - ); - } - }, - "json" - ); - - remove_rr_file_to_extras(home_url); - } - }, - { - text: cancel_button, - click: function() { - $(this).dialog("close"); - - $(this).dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 220, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_cancel_pkg_text = - "
        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "

        INFO

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "

        " + - package_cancel + - "

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "
        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + "
        "; - - $("#cancel_pkg").html( - dialog_cancel_pkg_text - ); - $("#cancel_pkg").dialog("open"); - - $("#box_online .content").html( - package_not_accepted - ); - } - } - ] - }); - - var dialog_bad_message_text = - "
        "; - dialog_bad_message_text = - dialog_bad_message_text + - "

        ERROR

        "; - dialog_bad_message_text = - dialog_bad_message_text + - "

        " + - bad_mr_file + - "

        "; - dialog_bad_message_text = - dialog_bad_message_text + - "
        "; - dialog_bad_message_text = - dialog_bad_message_text + "
        "; - - $("#bad_message").html(dialog_bad_message_text); - $("#bad_message").dialog("open"); - } else { - $("#mr_dialog2").dialog("close"); - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_success_mr_text = - "
        "; - dialog_success_mr_text = - dialog_success_mr_text + - "

        SUCCESS

        "; - dialog_success_mr_text = - dialog_success_mr_text + - "

        " + - mr_success + - "

        "; - dialog_success_mr_text = - dialog_success_mr_text + - "
        "; - dialog_success_mr_text = - dialog_success_mr_text + "
        "; - - $("#success_mr").html(dialog_success_mr_text); - $("#success_mr").dialog("open"); - - var parameters2 = {}; - parameters2["page"] = - "include/ajax/update_manager.ajax"; - parameters2["update_last_free_package"] = 1; - parameters2["package"] = package; - parameters2["version"] = version; - - jQuery.post( - home_url + "ajax.php", - parameters2, - function(data) { - if (data["in_progress"]) { - $("#box_online .download_package").hide(); - - $("#box_online .content").html( - data["message"] - ); - - install_free_package( - package, - version, - homeurl - ); - setTimeout(function() { - check_progress_update(homeurl); - }, 1000); - } else { - $("#box_online .content").html( - data["message"] - ); - } - }, - "json" - ); - - remove_rr_file_to_extras(home_url); - } - } else { - $("#mr_dialog2").dialog("close"); - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_mr_text = - "
        "; - dialog_error_mr_text = - dialog_error_mr_text + - "

        ERROR

        "; - dialog_error_mr_text = - dialog_error_mr_text + - "

        " + - mr_error + - "

        "; - dialog_error_mr_text = - dialog_error_mr_text + - "
        "; - dialog_error_mr_text = - dialog_error_mr_text + "
        "; - - $("#error_mr").html(dialog_error_mr_text); - $("#error_mr").dialog("open"); - - $("#box_online .content").html(mr_error); - } - } - }, - { - text: cancel_button, - click: function() { - $(this).dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 220, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_cancel_mr_text = - "
        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + - "

        INFO

        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + - "

        " + - mr_cancel + - "

        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + - "
        "; - dialog_cancel_mr_text = - dialog_cancel_mr_text + "
        "; - - $("#cancel_mr").html(dialog_cancel_mr_text); - $("#cancel_mr").dialog("open"); - - $("#box_online .loading").hide(); - $("#box_online .downloading_package").hide(); - $("#box_online .content").html("MR not accepted"); - } - } - ] - }); - - $("button:contains(Apply MR)") - .attr("id", "apply_rr_button") - .addClass("success_button"); - $("button:contains(Cancel)").attr("id", "cancel_rr_button"); - - var dialog_have_mr_text = "
        "; - dialog_have_mr_text = - dialog_have_mr_text + - "

        " + - mr_available_header + - "

        "; - dialog_have_mr_text = - dialog_have_mr_text + "

        " + text1_mr_file + "

        "; - dialog_have_mr_text = - dialog_have_mr_text + - "

        " + - text2_mr_file + - '' + - text3_mr_file + - "" + - text4_mr_file + - "

        "; - dialog_have_mr_text = - dialog_have_mr_text + - "
        "; - dialog_have_mr_text = dialog_have_mr_text + "
        "; - - $("#mr_dialog2").html(dialog_have_mr_text); - $("#mr_dialog2").dialog("open"); - } else { - var parameters2 = {}; - parameters2["page"] = "include/ajax/update_manager.ajax"; - parameters2["update_last_free_package"] = 1; - parameters2["package"] = package; - parameters2["version"] = version; - - jQuery.post( - home_url + "ajax.php", - parameters2, - function(data) { - if (data["in_progress"]) { - $("#box_online .download_package").hide(); - - $("#box_online .content").html(data["message"]); - - install_free_package(package, version, homeurl); - setTimeout(function() { - check_progress_update(homeurl); - }, 1000); - } else { - $("#box_online .content").html(data["message"]); - } - }, - "json" - ); - - remove_rr_file_to_extras(home_url); - } - }, - "json" - ); - } - }, - { - text: cancel_button, - click: function() { - $(this).dialog("close"); - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 220, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_cancel_pkg_text = "
        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + "

        INFO

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + "

        " + package_cancel + "

        "; - dialog_cancel_pkg_text = - dialog_cancel_pkg_text + - "
        "; - dialog_cancel_pkg_text = dialog_cancel_pkg_text + "
        "; - - $("#cancel_pkg").html(dialog_cancel_pkg_text); - $("#cancel_pkg").dialog("open"); - - $("#box_online .loading").hide(); - $("#box_online .progressbar").hide(); - $("#box_online .content").html(package_cancel); - } - } - ] - }); - - var dialog_text = "
        "; - dialog_text = - dialog_text + - "

        " + - text1_package_file + - "

        "; - dialog_text = dialog_text + "

        " + text2_package_file + "

        "; - dialog_text = - dialog_text + - "
        "; - dialog_text = dialog_text + "
        "; - - $("#pkg_apply_dialog").html(dialog_text); - $("#pkg_apply_dialog").dialog("open"); -} - -function install_free_package(package, version, homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - var parameters = {}; - parameters["page"] = "include/ajax/update_manager.ajax"; - parameters["install_free_package"] = 1; - parameters["package"] = package; - parameters["version"] = version; - - jQuery.ajax({ - data: parameters, - type: "POST", - url: home_url + "ajax.php", - timeout: 600000, - dataType: "json", - error: function(data) { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_pkg_text = "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "

        ERROR

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "

        " + data["message"] + "

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "
        "; - dialog_error_pkg_text = dialog_error_pkg_text + "
        "; - - $("#error_pkg").html(dialog_error_pkg_text); - $("#error_pkg").dialog("open"); - - correct_install_progress = false; - stop_check_progress = 1; - - $("#box_online .loading").hide(); - $("#box_online .progressbar").hide(); - $("#box_online .content").html(unknown_error_update_manager); - }, - success: function(data) { - if (correct_install_progress) { - if (data["status"] == "success") { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_success_pkg_text = "
        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "

        SUCCESS

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + "

        " + data["message"] + "

        "; - dialog_success_pkg_text = - dialog_success_pkg_text + - "
        "; - dialog_success_pkg_text = dialog_success_pkg_text + "
        "; - - $("#success_pkg").html(dialog_success_pkg_text); - $("#success_pkg").dialog("open"); - - $("#pkg_version").text(version); - - $("#box_online .loading").hide(); - $("#box_online .progressbar").hide(); - $("#box_online .content").html(data["message"]); - stop_check_progress = 1; - } else { - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_pkg_text = "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "

        ERROR

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "

        " + data["message"] + "

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "
        "; - dialog_error_pkg_text = dialog_error_pkg_text + "
        "; - - $("#error_pkg").html(dialog_error_pkg_text); - $("#error_pkg").dialog("open"); - - $("#box_online .loading").hide(); - $("#box_online .progressbar").hide(); - $("#box_online .content").html(data["message"]); - stop_check_progress = 1; - } - } else { - stop_check_progress = 1; - - $( - "
        " - ).dialog({ - resizable: true, - draggable: true, - modal: true, - overlay: { - opacity: 0.5, - background: "black" - }, - width: 600, - height: 250, - buttons: [ - { - text: ok_button, - click: function() { - $(this).dialog("close"); - } - } - ] - }); - - var dialog_error_pkg_text = "
        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "

        ERROR

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + "

        " + data["message"] + "

        "; - dialog_error_pkg_text = - dialog_error_pkg_text + - "
        "; - dialog_error_pkg_text = dialog_error_pkg_text + "
        "; - - $("#error_pkg").html(dialog_error_pkg_text); - $("#error_pkg").dialog("open"); - } - } - }); -} - -function apply_minor_release(n_mr, pkg, ent, off, homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - var error = []; - error["error"] = false; - $("#mr_dialog2").empty(); - $.each(n_mr, function(i, mr) { - var params = {}; - params["updare_rr"] = 1; - params["number"] = mr; - params["ent"] = ent; - params["package"] = pkg; - params["offline"] = off; - params["page"] = "include/ajax/rolling_release.ajax"; - - jQuery.ajax({ - data: params, - async: false, - dataType: "html", - type: "POST", - url: home_url + "ajax.php", - success: function(data) { - $("#mr_dialog2").append(""); - if (data == "bad_mr_filename") { - error["error"] = false; - error["message"] = "bad_mr_filename"; - } else if (data != "") { - $("#mr_dialog2").empty(); - $("#mr_dialog2").html(data); - error["error"] = true; - } else { - $("#mr_dialog2").append("

        - " + applying_mr + " #" + mr + "

        "); - } - } - }); - - if (error["error"]) { - return false; - } else if (error["message"] == "bad_mr_filename") { - return false; - } - }); - $("#mr_dialog2").append(""); - $(".ui-dialog-buttonset").empty(); - - return error; -} - -function remove_rr_file(number, homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - var params = {}; - params["remove_rr"] = 1; - params["number"] = number; - params["page"] = "include/ajax/rolling_release.ajax"; - - jQuery.ajax({ - data: params, - dataType: "html", - type: "POST", - url: home_url + "ajax.php", - success: function(data) {} - }); -} - -function remove_rr_file_to_extras(homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - var params = {}; - params["remove_rr_extras"] = 1; - params["page"] = "include/ajax/rolling_release.ajax"; - - jQuery.ajax({ - data: params, - dataType: "html", - type: "POST", - url: home_url + "ajax.php", - success: function(data) {} - }); -} - -/** - * Function delete files desired and add extras/delete_files.txt. - * - * @param string homeurl Url. - */ -function delete_desired_files(homeurl) { - var home_url = typeof homeurl !== "undefined" ? homeurl + "/" : ""; - - var parameters = { - page: "include/ajax/update_manager.ajax", - delete_desired_files: 1 - }; - - jQuery.ajax({ - data: parameters, - type: "POST", - url: home_url + "ajax.php", - dataType: "json", - success: function(data) { - var translation = data.translation; - // Print the deleted files. - // Print title. - $("#log_zone").append( - "

        " + - translation.title + - ":

        " - ); - $.each(data.status_list, function(key, value) { - var log_zone_line_class = "log_zone_line "; - var msg = ""; - switch (value.status) { - case -1: - //Not exits file. - msg = translation.not_file; - break; - case 0: - //File or directory deleted successfully. - if (value.type === "f") { - log_zone_line_class += ""; - } else { - log_zone_line_class += "bolder"; - } - - msg = value.path; - break; - case 1: - //Problem delete file or directory. - if (value.type === "f") { - log_zone_line_class += "log_zone_line_error"; - } else { - log_zone_line_class += "log_zone_line_error bolder"; - } - - msg = value.path + " ( " + translation.not_deleted + " ) "; - break; - case 2: - //Not found file or directory. - if (value.type === "f") { - log_zone_line_class += "log_zone_line_error"; - } else { - log_zone_line_class += "log_zone_line_error bolder"; - } - - msg = value.path + " ( " + translation.not_found + " ) "; - break; - case 3: - //Don`t read file deleet_files.txt. - log_zone_line_class += "log_zone_line_error bolder"; - msg = translation.not_read; - break; - case 4: - //"deleted" folder could not be created. - log_zone_line_class += "log_zone_line_error bolder"; - msg = value.path + " ( " + translation.folder_deleted_f + " ) "; - break; - case 5: - //"deleted" folder was created. - log_zone_line_class += "bolder"; - msg = translation.folder_deleted_t; - break; - case 6: - //The "delete files" could not be the "delete" folder. - log_zone_line_class += "log_zone_line_error bolder"; - msg = value.path + " ( " + translation.move_file_f + " ) "; - break; - case 7: - //The "delete files" is moved to the "delete" folder. - log_zone_line_class += "bolder"; - msg = translation.move_file_d; - break; - default: - // It can not come without state. - break; - } - - //Print line. - $("#log_zone").append( - "" + msg + "
        " - ); - }); - } - }); -} diff --git a/pandora_console/include/lib/Core/DBMaintainer.php b/pandora_console/include/lib/Core/DBMaintainer.php index dc9754f01d..ea81469f37 100644 --- a/pandora_console/include/lib/Core/DBMaintainer.php +++ b/pandora_console/include/lib/Core/DBMaintainer.php @@ -151,6 +151,7 @@ final class DBMaintainer */ private function connect() { + // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps if ($this->connected === true) { return true; } @@ -186,6 +187,17 @@ final class DBMaintainer } + /** + * Return dbh object. + * + * @return mysqli + */ + public function getDBH() + { + return $this->dbh; + } + + /** * Return connection statuis. * @@ -319,7 +331,7 @@ final class DBMaintainer /** * Verifies tables against running db. * - * @return boolean Applied or not. + * @return array Of differences. */ public function verifyTables() { @@ -691,42 +703,60 @@ final class DBMaintainer */ private function applyDump(string $path, bool $transactional=false) { + global $config; + if (file_exists($path) === true) { if ($transactional === true) { - global $config; + if (class_exists('UpdateManager\Client') === true) { + $return = true; + try { + $umc = new \UpdateManager\Client( + [ + 'homedir' => $config['homedir'], + 'dbconnection' => $this->dbh, + ] + ); - // Adapt to PandoraFMS classic way to do things... - $backup_dbhost = $config['dbhost']; - $backup_dbuser = $config['dbuser']; - $backup_dbpass = $config['dbpass']; - $backup_dbname = $config['dbname']; - $backup_dbport = $config['dbport']; - $backup_mysqli = $config['mysqli']; + // Throws exceptions on error. + $umc->updateMR($path); + } catch (\Exception $e) { + // TODO: Send an event to notify errors. + $return = false; + } + } else { + // Adapt to PandoraFMS classic way to do things... + $backup_dbhost = $config['dbhost']; + $backup_dbuser = $config['dbuser']; + $backup_dbpass = $config['dbpass']; + $backup_dbname = $config['dbname']; + $backup_dbport = $config['dbport']; + $backup_mysqli = $config['mysqli']; - $config['dbhost'] = $this->host; - $config['dbuser'] = $this->user; - $config['dbpass'] = $this->pass; - $config['dbname'] = $this->name; - $config['dbport'] = $this->port; + $config['dbhost'] = $this->host; + $config['dbuser'] = $this->user; + $config['dbpass'] = $this->pass; + $config['dbname'] = $this->name; + $config['dbport'] = $this->port; - // Not using mysqli in > php 7 is a completely non-sense. - $config['mysqli'] = true; + // Not using mysqli in > php 7 is a completely non-sense. + $config['mysqli'] = true; - // MR are loaded in transactions. - include_once $config['homedir'].'/include/db/mysql.php'; - $return = db_run_sql_file($path); - if ($return === false) { - $this->lastError = $config['db_run_sql_file_error']; + // MR are loaded in transactions. + include_once $config['homedir'].'/include/db/mysql.php'; + $return = db_run_sql_file($path); + if ($return === false) { + $this->lastError = $config['db_run_sql_file_error']; + } + + // Revert global variable. + $config['dbhost'] = $backup_dbhost; + $config['dbuser'] = $backup_dbuser; + $config['dbpass'] = $backup_dbpass; + $config['dbname'] = $backup_dbname; + $config['dbport'] = $backup_dbport; + $config['mysqli'] = $backup_mysqli; } - // Revert global variable. - $config['dbhost'] = $backup_dbhost; - $config['dbuser'] = $backup_dbuser; - $config['dbpass'] = $backup_dbpass; - $config['dbname'] = $backup_dbname; - $config['dbport'] = $backup_dbport; - $config['mysqli'] = $backup_mysqli; - return (bool) $return; } else { $file_content = file($path); diff --git a/pandora_console/include/styles/maintenance.css b/pandora_console/include/styles/maintenance.css new file mode 100644 index 0000000000..c0c6623a20 --- /dev/null +++ b/pandora_console/include/styles/maintenance.css @@ -0,0 +1,56 @@ +/* Reset */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.responsive { + max-width: 100%; + height: auto; +} + +html { + font-size: 18px; + font-family: "lato-bolder", "Open Sans", sans-serif; +} + +h1 { + font-size: 80px; + font-weight: bold; + margin-bottom: 1.5rem; + color: #83b92f; +} + +p { + font-size: 2rem; + margin-bottom: 0.5rem; + letter-spacing: 1.5px; + font-weight: lighter; + color: #333; +} + +body { + text-align: center; + padding: 30px; + font: 20px Helvetica, sans-serif; + color: #333; + line-height: 1; +} + +#article { + display: block; + text-align: left; + width: 650px; + margin: 0 auto; +} + +a { + color: #dc8100; + text-decoration: none; +} + +a:hover { + color: #333; + text-decoration: none; +} diff --git a/pandora_console/include/styles/register.css b/pandora_console/include/styles/register.css index 7fef0db90f..1afa073294 100644 --- a/pandora_console/include/styles/register.css +++ b/pandora_console/include/styles/register.css @@ -45,11 +45,10 @@ input[type="button"].submit-next:hover { } div.submit_buttons_container { - position: absolute; + position: relative; margin: 10px auto 0px; bottom: 0px; width: 90%; - position: relative; clear: both; height: 4em; } diff --git a/pandora_console/index.php b/pandora_console/index.php index 0f50391be1..ac14a19818 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1012,15 +1012,9 @@ if ($process_login) { unset($_SESSION['new_update']); include_once 'include/functions_update_manager.php'; - enterprise_include_once('include/functions_update_manager.php'); if ($config['autoupdate'] == 1) { - if (enterprise_installed()) { - $result = update_manager_check_online_enterprise_packages_available(); - } else { - $result = update_manager_check_online_free_packages_available(); - } - + $result = update_manager_check_updates_available(); if ($result) { $_SESSION['new_update'] = 'new'; } @@ -1046,6 +1040,21 @@ if (get_parameter('login', 0) !== 0) { } } + +if ((bool) $config['maintenance_mode'] === true + && (bool) users_is_admin() === false +) { + // Show maintenance web-page. For non-admin users only. + include 'general/maintenance.php'; + + while (ob_get_length() > 0) { + ob_end_flush(); + } + + exit(''); +} + + // Header. if ($config['pure'] == 0) { echo '
        '; } -if (!$config['disabled_newsletter']) { - $newsletter = '

        '.__('Newsletter Subscribed').':

        '; - if ($user_info['middlename'] > 0) { - $newsletter .= ''.__('Already subscribed to %s newsletter', get_product_name()).''; - } else { - $newsletter .= ''.__('Subscribe to our newsletter').'
        '; - $newsletter_reminder = '

        '.__('Newsletter Reminder').':

        '; - $newsletter_reminder .= html_print_switch( - [ - 'name' => 'newsletter_reminder', - 'value' => $newsletter_reminder_value, - 'disabled' => false, - ] - ); - } - - $newsletter_reminder .= '
        '; -} - - $autorefresh_list_out = []; if (is_metaconsole()) { @@ -665,7 +623,7 @@ if (is_metaconsole()) {
        '.$autorefresh_show.$time_autorefresh.'
        -
        '.$language.$size_pagination.$skin.$home_screen.$event_filter.$newsletter.$newsletter_reminder.$double_authentication.'
        +
        '.$language.$size_pagination.$skin.$home_screen.$event_filter.$double_authentication.'
        '.$timezone; diff --git a/pandora_console/pandora_console.redhat.spec b/pandora_console/pandora_console.redhat.spec index c8f317e741..dd82d43924 100644 --- a/pandora_console/pandora_console.redhat.spec +++ b/pandora_console/pandora_console.redhat.spec @@ -57,6 +57,12 @@ install -m 0644 pandora_console_logrotate_centos $RPM_BUILD_ROOT%{_sysconfdir}/l rm -rf $RPM_BUILD_ROOT %post +# Upgrading. +if [ "$1" -eq "1" ]; then + echo "Updating the database schema." + /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null +fi + # Install pandora_websocket_engine service. cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/ chmod +x /etc/init.d/pandora_websocket_engine @@ -77,7 +83,7 @@ fi %preun # Upgrading -if [ "$1" = "1" ]; then +if [ "$1" -eq "1" ]; then exit 0 fi diff --git a/pandora_console/pandora_console.rhel7.spec b/pandora_console/pandora_console.rhel7.spec index 97b0a01b30..aa6374bfb6 100644 --- a/pandora_console/pandora_console.rhel7.spec +++ b/pandora_console/pandora_console.rhel7.spec @@ -57,6 +57,12 @@ install -m 0644 pandora_console_logrotate_centos $RPM_BUILD_ROOT%{_sysconfdir}/l rm -rf $RPM_BUILD_ROOT %post +# Upgrading. +if [ "$1" -eq "1" ]; then + echo "Updating the database schema." + /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null +fi + # Install pandora_websocket_engine service. cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/ chmod +x /etc/init.d/pandora_websocket_engine @@ -77,7 +83,7 @@ fi %preun # Upgrading -if [ "$1" = "1" ]; then +if [ "$1" -eq "1" ]; then exit 0 fi diff --git a/pandora_console/pandora_console.spec b/pandora_console/pandora_console.spec index f6b4623223..3a313e52d7 100644 --- a/pandora_console/pandora_console.spec +++ b/pandora_console/pandora_console.spec @@ -58,6 +58,12 @@ fi rm -rf $RPM_BUILD_ROOT %post +# Upgrading. +if [ "$1" -eq "1" ]; then + echo "Updating the database schema." + /usr/bin/php %{prefix}/pandora_console/godmode/um_client/updateMR.php 2>/dev/null +fi + # Install pandora_websocket_engine service. cp -pf %{prefix}/pandora_console/pandora_websocket_engine /etc/init.d/ chmod +x /etc/init.d/pandora_websocket_engine @@ -79,7 +85,7 @@ cp -aRf %{prefix}/pandora_console/pandora_console_logrotate_suse /etc/logrotate. %preun # Upgrading -if [ "$1" = "1" ]; then +if [ "$1" -eq "1" ]; then exit 0 fi diff --git a/pandora_server/DEBIAN/make_deb_package.sh b/pandora_server/DEBIAN/make_deb_package.sh index f6172ab58b..04d84e1777 100644 --- a/pandora_server/DEBIAN/make_deb_package.sh +++ b/pandora_server/DEBIAN/make_deb_package.sh @@ -114,6 +114,7 @@ then cp -aRf conf/pandora_* temp_package/usr/share/pandora_server/conf/ cp -aRf conf/tentacle_* temp_package/usr/share/tentacle_server/conf/ cp -aRf util temp_package/usr/share/pandora_server/ + cp -aRf util/pandora_ha.pl temp_package/usr/bin/pandora_ha cp -aRf lib/* temp_package/usr/lib/perl5/ cp -aRf AUTHORS COPYING README temp_package/usr/share/pandora_server/ diff --git a/pandora_server/DEBIAN/postinst b/pandora_server/DEBIAN/postinst index f25483eb62..49f2e69a5b 100755 --- a/pandora_server/DEBIAN/postinst +++ b/pandora_server/DEBIAN/postinst @@ -64,6 +64,7 @@ useradd pandora 2> /dev/null mkdir -p /home/pandora/.ssh 2> /dev/null chown -R pandora:root /home/pandora chmod 755 /usr/bin/tentacle_server +chmod 755 /usr/bin/pandora_ha echo "Giving proper permission to /var/spool/pandora" chown -R pandora:www-data /var/spool/pandora/ diff --git a/pandora_server/DEBIAN/prerm b/pandora_server/DEBIAN/prerm index ce862a902a..2d4f8ff450 100755 --- a/pandora_server/DEBIAN/prerm +++ b/pandora_server/DEBIAN/prerm @@ -80,3 +80,5 @@ then ln -s /usr/bin/pandora_exec.agent /usr/bin/pandora_exec 2> /dev/null fi +rm /usr/bin/pandora_ha + diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 9f3f3bac4d..a059821aa0 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -71,6 +71,7 @@ install -m 0755 bin/tentacle_server $RPM_BUILD_ROOT%{_bindir}/ cp -aRf conf/* $RPM_BUILD_ROOT%{prefix}/pandora_server/conf/ cp -aRf util $RPM_BUILD_ROOT%{prefix}/pandora_server/ +cp -aRf util/pandora_ha.pl $RPM_BUILD_ROOT/usr/bin/pandora_ha cp -aRf lib/* $RPM_BUILD_ROOT/usr/lib/perl5/ install -m 0755 util/pandora_server $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d/ @@ -202,6 +203,7 @@ exit 0 %{_bindir}/pandora_exec %{_bindir}/pandora_server %{_bindir}/tentacle_server +%{_bindir}/pandora_ha %dir %{_sysconfdir}/pandora %dir %{_localstatedir}/spool/pandora diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 25c43aaafc..70ca03f010 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -79,6 +79,7 @@ cp -aRf conf/pandora_server.conf.new $RPM_BUILD_ROOT/etc/pandora/ cp -aRf conf/tentacle_* $RPM_BUILD_ROOT%{prefix}/tentacle/conf/ cp -aRf conf/tentacle_server.conf.new $RPM_BUILD_ROOT/etc/tentacle/ cp -aRf util $RPM_BUILD_ROOT%{prefix}/pandora_server/ +cp -aRf util/pandora_ha.pl $RPM_BUILD_ROOT/usr/bin/pandora_ha cp -aRf lib/* $RPM_BUILD_ROOT/usr/lib/perl5/ cp -aRf AUTHORS COPYING README $RPM_BUILD_ROOT%{prefix}/pandora_server/ @@ -193,6 +194,7 @@ rm -Rf /etc/tentacle/tentacle_server.conf* rm -Rf /var/spool/pandora rm -Rf /etc/init.d/pandora_server /etc/init.d/tentacle_serverd rm -Rf /usr/bin/pandora_exec /usr/bin/pandora_server /usr/bin/tentacle_server +rm -Rf /usr/bin/pandora_ha rm -Rf /etc/cron.hourly/pandora_db rm -Rf /etc/logrotate.d/pandora_server rm -Rf /usr/share/man/man1/pandora_server.1.gz @@ -208,6 +210,7 @@ rm -Rf /usr/share/man/man1/tentacle_server.1.gz /usr/bin/pandora_exec /usr/bin/pandora_server /usr/bin/tentacle_server +/usr/bin/pandora_ha %defattr(755,pandora,root,755) /usr/lib/perl5/PandoraFMS/ diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 4ede7890ab..2ca954c7cc 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -408,6 +408,34 @@ install () { chmod a+x $sh_script done ;; + *) + SYSTEMD_DIR=$DESTDIR/etc/systemd/system + PID_DIR=$DESTDIR/var/run + INSTALL_DIR="$DESTDIR$PREFIX/bin/" + + echo ">Installing the pandora_ha binary to $INSTALL_DIR..." + cp -f util/pandora_ha.pl "$INSTALL_DIR/pandora_ha" + chmod +x "$INSTALL_DIR/pandora_ha" + + echo ">Installing pandora_ha service to $INSTALL_DIR..." + [ -d "$PID_DIR" ] || mkdir -p "$PID_DIR" + [ -d "$SYSTEMD_DIR" ] || mkdir -p "$SYSTEMD_DIR" + cat > $SYSTEMD_DIR/pandora_ha.service <<-EOF +[Unit] +Description=Pandora FMS Database HA Tool + +[Service] +Type=forking + +User=$USER +PIDFile=$PID_DIR/pandora_ha.pid +Restart=always +ExecStart=${INSTALL_DIR}pandora_ha -d -p $PID_DIR/pandora_ha.pid $PANDORA_CONF + +[Install] +WantedBy=multi-user.target +EOF + ;; esac # install cron job diff --git a/pandora_server/util/pandora_ha.pl b/pandora_server/util/pandora_ha.pl new file mode 100755 index 0000000000..aa093ce8cc --- /dev/null +++ b/pandora_server/util/pandora_ha.pl @@ -0,0 +1,386 @@ +#!/usr/bin/perl +############################################################################### +# Pandora FMS Database HA +############################################################################### +# Copyright (c) 2018-2021 Artica Soluciones Tecnologicas S.L +############################################################################### + +use strict; +use warnings; +use DBI; +use Getopt::Std; +use POSIX qw(setsid strftime :sys_wait_h); +use threads; +use threads::shared; +use Storable; +use File::Path qw(rmtree); + +# Default lib dir for Pandora FMS RPM and DEB packages. +use lib '/usr/lib/perl5'; + +use PandoraFMS::Tools; +use PandoraFMS::DB; +use PandoraFMS::Core; +use PandoraFMS::Config; + +use Data::Dumper; +$Data::Dumper::Sortkeys = 1; + +# Pandora server configuration. +my %Conf; + +# Command line options. +my %Opts; + +# Run as a daemon. +my $DAEMON = 0; + +# Avoid retry old processing orders. +my $First_Cleanup = 1; + +# PID file. +my $PID_FILE = '/var/run/pandora_ha.pid'; + +# Server service handler. +my $Pandora_Service; + +# Controlled exit +my $Running = 0; + +######################################################################## +# Print the given message with a preceding timestamp. +######################################################################## +sub log_message($$$) { + my ($conf, $source, $message) = @_; + + if (ref($conf) eq "HASH") { + logger($conf, 'HA (' . $source . ') ' . "$message", 5); + } + + if ($source eq '') { + print $message; + } + else { + print strftime("%H:%M:%S", localtime()) . ' [' . $source . '] ' . "$message\n"; + } +} + +######################################################################## +# Run as a daemon in the background. +######################################################################## +sub ha_daemonize($) { + my ($pa_config) = @_; + + $PID_FILE = $pa_config->{'ha_pid_file'} if defined($pa_config->{'ha_pid_file'}); + + open STDIN, "$DEVNULL" or die "Can't read $DEVNULL: $!"; + open STDOUT, ">>$DEVNULL" or die "Can't write to $DEVNULL: $!"; + open STDERR, ">>$DEVNULL" or die "Can't write to $DEVNULL: $!"; + chdir '/tmp' or die "Can't chdir to /tmp: $!"; + + # Fork! + defined(my $pid = fork) or die "Can't fork: $!"; + if ($pid) { + # Store PID of this process in file presented by config token + if ($PID_FILE ne "") { + if ( -e $PID_FILE && open (FILE, $PID_FILE)) { + $pid = + 0; + close FILE; + + # Check if pandora_ha is running. + die "[ERROR] pandora_ha is already running with pid: $pid." if (kill (0, $pid)); + } + umask 0022; + open (FILE, '>', $PID_FILE) or die "[FATAL] $!"; + print FILE $pid; + close (FILE); + } + exit; + } + setsid or die "Can't start a new session: $!"; +} + +######################################################################## +# Check command line parameters. +######################################################################## +sub ha_init_pandora($) { + my $conf = shift; + + log_message($conf, '', "\nPandora FMS Database HA Tool " . $PandoraFMS::Tools::VERSION . " Copyright (c) Artica ST\n"); + + getopts('dp:', \%Opts); + + # Run as a daemon. + $DAEMON = 1 if (defined($Opts{'d'})); + + # PID file. + $PID_FILE = $Opts{'p'} if (defined($Opts{'p'})); + + # Load config file from command line. + help_screen () if ($#ARGV != 0); + + $conf->{'_pandora_path'} = $ARGV[0]; + +} + +######################################################################## +# Read external configuration file. +######################################################################## +sub ha_load_pandora_conf($) { + my $conf = shift; + + # Set some defaults. + $conf->{"servername"} = `hostname`; + chomp($conf->{"servername"}); + $conf->{"ha_file"} = '/etc/pandora/pandora_ha.bin' unless defined $conf->{"ha_file"}; + + pandora_init($conf, 'Pandora HA'); + pandora_load_config ($conf); + + # Check conf tokens. + foreach my $param ('dbuser', 'dbpass', 'dbname', 'dbhost', 'log_file') { + die ("[ERROR] Bad config values. Make sure " . $conf->{'_pandora_path'} . " is a valid config file.\n\n") unless defined ($conf->{$param}); + } + $conf->{'dbengine'} = 'mysql' unless defined ($conf->{'dbengine'}); + $conf->{'dbport'} = '3306' unless defined ($conf->{'dbport'}); + $conf->{'ha_interval'} = 10 unless defined ($conf->{'ha_interval'}); + $conf->{'ha_monitoring_interval'} = 60 unless defined ($conf->{'ha_monitoring_interval'}); +} + +############################################################################## +# Print a help screen and exit. +############################################################################## +sub help_screen { + log_message(undef, '', "Usage: $0 [options] \n\nOptions:\n\t-p Write the PID of the process to the specified file.\n\t-d Run in the background.\n\n"); + exit 1; +} + +############################################################################## +# Keep server running +############################################################################## +sub ha_keep_pandora_running($$) { + my ($conf, $dbh) = @_; + + $conf->{'pandora_service_cmd'} = 'service pandora_server' unless defined($conf->{'pandora_service_cmd'}); + + # Check if all servers are running + # Restart if crashed or keep interval is over. + my $component_last_contact = get_db_value( + $dbh, + 'SELECT count(*) AS "delayed" + FROM tserver + WHERE ((status = -1) OR ( (unix_timestamp() - unix_timestamp(keepalive)) > (server_keepalive+1) AND status != 0 )) + AND server_type != ? AND name = ?', + PandoraFMS::Tools::SATELLITESERVER, + $conf->{'servername'} + ); + + my $nservers = get_db_value ($dbh, 'SELECT count(*) FROM tserver where name = ?', $conf->{'servername'}); + + $Pandora_Service = $conf->{'pandora_service_cmd'}; + + # Check if service is running + my $pid = `$Pandora_Service status-server | awk '{print \$NF*1}' | tr -d '\.'`; + + if ( ($pid > 0) && ($component_last_contact > 0)) { + # service running but not all components + log_message($conf, 'LOG', 'Pandora service running but not all components.'); + print ">> service running but delayed...\n"; + `$Pandora_Service restart-server 2>/dev/null`; + } elsif ($pid == 0) { + # service not running + log_message($conf, 'LOG', 'Pandora service not running.'); + print ">> service not running...\n"; + `$Pandora_Service start-server 2>/dev/null`; + } elsif ($pid > 0 + && $nservers == 0 + ) { + my @server_list = get_enabled_servers($conf); + my $nservers = $#server_list; + # Process running but no servers active, restart. + # Try to restart pandora_server if no servers are found. + # Do not restart if is a configuration issue. + log_message($conf, 'LOG', 'Pandora service running without servers ['.$nservers.'].'); + if ($nservers >= 0) { + log_message($conf, 'LOG', 'Restarting Pandora service...'); + `$Pandora_Service restart-serer 2>/dev/null`; + } + } +} + +############################################################################### +# Update pandora services. +############################################################################### +sub ha_update_server($$) { + my ($config, $dbh) = @_; + + my $repoServer = pandora_get_tconfig_token( + $dbh, 'remote_config', '/var/spool/pandora/data_in' + ); + $repoServer .= '/updates/server/'; + + my $lockFile = $repoServer.'/'.$config->{'servername'}.'.installed'; + my $workDir = $config->{"temporal"}.'/server_update/'; + my $versionFile = $repoServer.'version.txt'; + return if (-e $lockFile) || (!-e $versionFile); + + log_message($config, 'LOG', 'Detected server update: '.`cat "$versionFile"`); + + if(!-e "$workDir" && !mkdir ($workDir)) { + log_message($config, 'ERROR', 'Server update failed: '.$!); + return; + } + + my $r = `cd "$workDir/" && tar xzf "$repoServer/pandorafms_server.tar.gz" 2>&1`; + if ($? ne 0) { + log_message($config, 'ERROR', 'Failed to uncompress file: '.$r); + return; + } + + $r = `cd "$workDir/pandora_server/" && ./pandora_server_installer --install 2>&1 >/dev/null`; + if ($? ne 0) { + log_message($config, 'ERROR', 'Failed to install server update: '.$r); + return; + } else { + log_message($config, 'LOG', 'Server update '.`cat "$versionFile"`.' installed'); + } + + # Cleanup + rmtree($workDir); + + # Restart service + $config->{'pandora_service_cmd'} = 'service pandora_server' + unless defined($config->{'pandora_service_cmd'}); + + `$config->{'pandora_service_cmd'} restart-server 2>/dev/null`; + `touch "$lockFile"`; + + # After apply update, permission over files are changed, allow group to + # modify/delete files. + `chmod 770 "$repoServer"`; + `chmod 770 "$repoServer/../"`; + `chmod 660 "$repoServer"/*`; + +} + +############################################################################### +# Connect to ha database, falling back to direct connection to db. +############################################################################### +sub ha_database_connect($) { + my $conf = shift; + + my $dbh = enterprise_hook('ha_connect', [$conf]); + + if (!defined($dbh)) { + $dbh = db_connect ('mysql', $conf->{'dbname'}, $conf->{'dbhost'}, $conf->{'dbport'}, $conf->{'dbuser'}, $conf->{'dbpass'}); + } + + return $dbh; +} + +############################################################################### +# Main +############################################################################### +sub ha_main($) { + my ($conf) = @_; + + # Set the PID file. + $conf->{'PID'} = $PID_FILE; + + # Log to a separate file if needed. + $conf->{'log_file'} = $conf->{'ha_log_file'} if defined ($conf->{'ha_log_file'}); + + ha_daemonize($conf) if ($DAEMON == 1); + + $Running = 1; + + while ($Running) { + eval { + # Start the Pandora FMS server if needed. + log_message($conf, 'LOG', 'Checking the pandora_server service.'); + + # Connect to a DB. + my $dbh = ha_database_connect($conf); + + if ($First_Cleanup == 1) { + log_message($conf, 'LOG', 'Cleaning previous unfinished actions'); + enterprise_hook('pandoraha_cleanup_states', [$conf, $dbh]); + $First_Cleanup = 0; + } + + # Check if there are updates pending. + ha_update_server($conf, $dbh); + + # Keep pandora running + ha_keep_pandora_running($conf, $dbh); + + # Are we the master? + pandora_set_master($conf, $dbh); + if (!pandora_is_master($conf)) { + log_message($conf, 'LOG', $conf->{'servername'} . ' is not the current master. Skipping DB-HA actions and monitoring.'); + # Exit current eval. + return; + } + + # Monitoring. + enterprise_hook('pandoraha_monitoring', [$conf, $dbh]); + + # Pending actions. + enterprise_hook('pandoraha_process_queue', [$conf, $dbh, $First_Cleanup]); + + # Cleanup and exit + db_disconnect ($dbh); + }; + log_message($conf, 'WARNING', $@) if ($@); + + log_message($conf, 'LOG', "Sleep."); + sleep($conf->{'ha_interval'}); + } +} + +################################################################################ +# Stop pandora server +################################################################################ +sub stop { + if ($Running == 1) { + $Running = 0; + # cleanup and stop pandora_server + print ">> stopping server...\n"; + `$Pandora_Service stop-server 2>/dev/null`; + } +} + +################################################################################ +# END block. +################################################################################ +END { + stop(); +} + +############################################################################### +# Aux. get module id +############################################################################### +my %module_id; +sub __get_module_id { + my ($dbh, $module_type) = @_; + + if (!defined($module_id{$module_type})) { + $module_id{$module_type} = get_module_id($dbh, $module_type); + } + + return $module_id{$module_type} +} + +$SIG{INT} = \&stop; +$SIG{TERM} = \&stop; + +# Init +ha_init_pandora(\%Conf); + +# Read config file +ha_load_pandora_conf (\%Conf); + +# Main +ha_main(\%Conf); + +exit 0; diff --git a/pandora_server/util/pandora_server b/pandora_server/util/pandora_server index 89beee8e55..80dde1a119 100755 --- a/pandora_server/util/pandora_server +++ b/pandora_server/util/pandora_server @@ -33,6 +33,8 @@ fi export PANDORA_HOME="/etc/pandora/pandora_server.conf" export PANDORA_DAEMON=/usr/bin/pandora_server +export PANDORA_HA=/usr/bin/pandora_ha +export PID_DIR=/var/run # Environment variables if [ -f /etc/pandora/pandora_server.env ]; then @@ -83,6 +85,16 @@ function pidof_pandora () { echo $PANDORA_PID } +function pidof_pandora_ha () { + # This sets COLUMNS to XXX chars, because if command is run + # in a "strech" term, ps aux don't report more than COLUMNS + # characters and this will not work. + COLUMNS=300 + PANDORA_PID=`ps aux | grep "$PANDORA_HA -d -p $PID_DIR/pandora_ha.pid $PANDORA_HOME" | grep -v grep | tail -1 | awk '{ print $2 }'` + echo $PANDORA_PID +} + + # Main script if [ ! -f $PANDORA_DAEMON ] @@ -94,6 +106,73 @@ fi case "$1" in start) + PANDORA_PID=`pidof_pandora_ha` + if [ ! -z "$PANDORA_PID" ] + then + echo "$PANDORA_RB_PRODUCT_NAME Server is currently running on this machine with PID ($PANDORA_PID)." + rc_exit # running start on a service already running + fi + + export PERL_LWP_SSL_VERIFY_HOSTNAME=0 + $PANDORA_HA -d -p $PID_DIR/pandora_ha.pid $PANDORA_HOME + sleep 1 + + PANDORA_PID=`pidof_pandora_ha` + + if [ ! -z "$PANDORA_PID" ] + then + echo "$PANDORA_RB_PRODUCT_NAME Server is now running with PID $PANDORA_PID" + rc_status -v + else + echo "Cannot start $PANDORA_RB_PRODUCT_NAME HA. Aborted." + echo "Check $PANDORA_RB_PRODUCT_NAME log files at '/var/log/pandora/pandora_server.error & pandora_server.log'" + rc_failed 7 # program is not running + fi + ;; + + stop) + PANDORA_PID=`pidof_pandora_ha` + if [ -z "$PANDORA_PID" ] + then + echo "$PANDORA_RB_PRODUCT_NAME HA is not running, cannot stop it." + rc_exit # running stop on a service already stopped or not running + else + echo "Stopping $PANDORA_RB_PRODUCT_NAME HA" + kill $PANDORA_PID > /dev/null 2>&1 + COUNTER=0 + + while [ $COUNTER -lt $MAXWAIT ] + do + _PID=`pidof_pandora_ha` + if [ "$_PID" != "$PANDORA_PID" ] + then + COUNTER=$MAXWAIT + fi + COUNTER=`expr $COUNTER + 1` + sleep 1 + done + + # Send a KILL -9 signal to process, if it's alive after 60secs, we need + # to be sure is really dead, and not pretending... + if [ "$_PID" = "$PANDORA_PID" ] + then + kill -9 $PANDORA_PID > /dev/null 2>&1 + fi + rc_status -v + fi + ;; + status) + PANDORA_PID=`pidof_pandora_ha` + if [ -z "$PANDORA_PID" ] + then + echo "$PANDORA_RB_PRODUCT_NAME HA is not running." + rc_failed 7 # program is not running + else + echo "$PANDORA_RB_PRODUCT_NAME HA is running with PID $PANDORA_PID." + rc_status + fi + ;; + start-server) PANDORA_PID=`pidof_pandora` if [ ! -z "$PANDORA_PID" ] then @@ -118,7 +197,7 @@ case "$1" in fi ;; - stop) + stop-server) PANDORA_PID=`pidof_pandora` if [ -z "$PANDORA_PID" ] then @@ -149,7 +228,7 @@ case "$1" in rc_status -v fi ;; - status) + status-server) PANDORA_PID=`pidof_pandora` if [ -z "$PANDORA_PID" ] then @@ -160,12 +239,16 @@ case "$1" in rc_status fi ;; + force-reload-server|restart-server) + $0 stop-server + $0 start-server + ;; force-reload|restart) $0 stop $0 start ;; *) - echo "Usage: pandora_server { start | stop | restart | status }" + echo "Usage: pandora_server { start | stop | restart | status | start-server | stop-server | restart-server }" exit 1 esac rc_exit From 42274e7252b5482e9be393fc9ea337a517d38811 Mon Sep 17 00:00:00 2001 From: Marcos Alconada Date: Mon, 14 Jun 2021 13:31:37 +0000 Subject: [PATCH 15/16] changed UM image background --- .../um_client/resources/styles/pandora.css | 2 +- .../images/update_manager_background.jpg | Bin 272332 -> 419423 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/um_client/resources/styles/pandora.css b/pandora_console/godmode/um_client/resources/styles/pandora.css index ec727b758a..3622019687 100644 --- a/pandora_console/godmode/um_client/resources/styles/pandora.css +++ b/pandora_console/godmode/um_client/resources/styles/pandora.css @@ -156,7 +156,6 @@ #box_online { background-image: url("../images/update_manager_background.jpg"); - background-size: cover; background-position: center center; background-repeat: no-repeat; background-color: #fff; @@ -164,6 +163,7 @@ border: 1px solid #f3f3f3; border-radius: 5px; min-height: 600px; + background-size: contain; } div#box_online * { diff --git a/pandora_console/images/update_manager_background.jpg b/pandora_console/images/update_manager_background.jpg index 121e47686048d3346405fc8ab2c30b42dcc08fed..7cb282bd9f7f7ad2ac6c38181c9149d1cf794207 100644 GIT binary patch literal 419423 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∋^SS%*AX5$^HZ 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Òj_fjNQZu95F*0+OPFliF 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

        9>ZJyG-r|X4iP~m{5imril+dBfl7Tn|0Zf4ja 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 z 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ΜToWuyf#zn#5-(qaK~M-6YBOFqXwa+zG=JC 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

        b?ras{Yz8>@&6LNbuYHY6vVGD}|LRcR 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 hrDm2<5ClTP@1WTe`y9}H4zYcXnSG8OSK Date: Mon, 14 Jun 2021 16:12:48 +0200 Subject: [PATCH 16/16] new background image UM --- .../images/update_manager_background.jpg | Bin 272332 -> 417863 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pandora_console/godmode/um_client/resources/images/update_manager_background.jpg b/pandora_console/godmode/um_client/resources/images/update_manager_background.jpg index 121e47686048d3346405fc8ab2c30b42dcc08fed..29ee91d27dc6f6a8da3e5504f83e6c402006423e 100644 GIT binary patch literal 417863 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�<$Brxv9U7R5^M`ttZv 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

      • )0Sfe7Q-&8v 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 nhQSQx5+WAfUwiZR+y9?K{WniP$ttRXTqw_ literal 272332 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ΜToWuyf#zn#5-(qaK~M-6YBOFqXwa+zG=JC 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

        b?ras{Yz8>@&6LNbuYHY6vVGD}|LRcR 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 hrDm2<5ClTP@1WTe`y9}H4zYcXnSG8OSK

        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