pax_global_header00006660000000000000000000000064124744317060014522gustar00rootroot0000000000000052 comment=11eaaf8495cebf32608aef1fb8f8689e706ae7f8 phpsysinfo-3.2.1/000077500000000000000000000000001247443170600137275ustar00rootroot00000000000000phpsysinfo-3.2.1/.gitignore000066400000000000000000000000171247443170600157150ustar00rootroot00000000000000phpsysinfo.ini phpsysinfo-3.2.1/.htaccess000066400000000000000000000001031247443170600155170ustar00rootroot00000000000000 order deny,allow deny from all phpsysinfo-3.2.1/.travis.yml000066400000000000000000000003021247443170600160330ustar00rootroot00000000000000language: php php: - 5.2 - 5.3 - 5.4 - 5.5 script: for i in `find . -name "*.php"`; do php -l $i; done; branches: only: - "master" - "stable" notifications: email: false phpsysinfo-3.2.1/CHANGELOG.md000066400000000000000000000165401247443170600155460ustar00rootroot00000000000000Changelog of phpSysInfo ======================= http://phpsysinfo.sourceforge.net/ phpSysInfo 3.2.1 ---------------- - [UPD] bootstrap 3.3.2 - [NEW] REFRESH parameter also for frontend "bootstrap" - [ADD] pfSense to detected distros - [FIX] Percentage memory usage phpSysInfo 3.2.0 ---------------- - [NEW] Frontend "bootstrap" with Bootstrap3 and Transparency (JSON) - [ADD] Catalan Translation ca.xml - [ADD] Mer (core of Sailfish OS) and Tizen to detected distros - [ADD] ThermalZone sensor support for Linux and Android - [ADD] Temperature, voltage and current sensor for Banana Pi - [UPD] German Translation de.xml phpSysInfo 3.1.17 ---------------- - [UPD] BAT plugin - capacity unit, cycle count, FreeBSD support - [UPD] Brazilian Portuguese Translation pt-br.xml - [ADD] Show the number of processes on Haiku - [ADD] ThermalZone sensor support for WinNT - [ADD] Tanglu to detected distros - [ADD] Android and OS X version name - [FIX] Fixed display of treetables phpSysInfo 3.1.16 ---------------- - [ADD] Show the number of processes - [ADD] Lunar and 4MLinux to detected distros phpSysInfo 3.1.15 ---------------- - [ADD] CoreOS and Pisi Linux to detected distros - [ADD] pmset - UPS support on Darwin (thanks to pelletierr) - [ADD] lspci support on Darwin - [ADD] SHOW_CPULIST_EXPANDED option - [ADD] lxc/docker detection on Linux - [ADD] ability to hide all disks and all network interfaces - [FIX] Small CSS fix - [UPD] Memory informations on Darwin systems - [UPD] BAT plugin - Darwin support phpSysInfo 3.1.14 ---------------- - [ADD] FreeIPMI sensor program support - [ADD] IPMIutil sensor program support - [ADD] PowerSoftPlus (EVER) UPS program support - [ADD] Line frequency for the UPS info - [ADD] SENSOR_EVENTS option - show events of sensors - [ADD] HIDE_RAID_DEVICES option for plugins MDStatus and DMRaid - list of RAID devices to hide - [ADD] idash template phpSysInfo 3.1.13 ---------------- - [UPD] jQuery 2.1.1 and jQuery 1.11.1 - [UPD] Romanian Translation ro.xml - [ADD] SHOW_CPUINFO_EXPANDED option - [ADD] Machine detection on WINNT, Linux, Android and Darwin systems phpSysInfo 3.1.12 ---------------- - [ADD] GoboLinux, UltimateEdition, BOSS, Canaima, VortexBox, KaOS and NixOS to detected distros - [ADD] OpenHardwareMonitor sensor program support - [ADD] Possibility to define multiple UPS_PROGRAM - [ADD] UPS_NUT_LIST option - [FIX] Fixed incorrect network usage on FreeBSD - [UPD] SMART plugin - Smartctl --device option value setting method phpSysInfo 3.1.11 ---------------- - [ADD] Add Access-Control-Allow-Origin on XML (JSON) interface for Ajax Load PR#47 - [ADD] Generations Linux and SliTaz to detected distros - [ADD] IPMI and LMSensors currents information - [ADD] Plugin IPMIInfo - added powers and currents values - [ADD] Partial support of QNX - [FIX] Reduce execution time on Linux systems when showing load average PR#47 phpSysInfo 3.1.10 ---------------- - [ADD] Zenwalk and Raspbian to detected distros - [FIX] /etc/os-release Linux distro detection phpSysInfo 3.1.9 ---------------- - [NEW] New plugin DMRaid - software raid status - [ADD] Calculate, Tails, SMEServer, Semplice, SolydXK, Parsix, RedFlag, Amazon, Korora, OpenMandriva, SteamOS, ROSA Enterprise Server and ROSA Desktop Fresh to detected distros - [UPD] Rebuilding of the Linux distribution detection - [UPD] jQuery 2.1.0 and jQuery 1.11.0 phpSysInfo 3.1.8 ---------------- - [ADD] Add printers messages in the XML output - [ADD] PSStatus plugin - added optional regular expression search in the process name - [ADD] RedHatEnterpriseClient distro icon #40 - [ADD] Hebrew Translation he.xml - [FIX] BAT plugin - fix for old and new kernel /proc/acpi and /sys/class/power_supply - [UPD] LMSensors name for Mac hardware sensors phpSysInfo 3.1.7 ---------------- - [ADD] Ksplice support for Linux - [ADD] Show CPU frequency max and min for Darwin (Mac OS X) - [ADD] Show System Language and Code Page on Darwin (Mac OS X) - [ADD] Show network interfaces infos for Minix and SunOS - [ADD] SMS, gNewSense and Vector to detected distros - [ADD] LMSensors power information - [ADD] Battery installation date for the UPS info - [UPD] Network interfaces infos and filesystems infos for FreeBSD - [UPD] Updated support of SunOS - [UPD] Memory informations on Darwin systems - [UPD] BAT plugin - updated Linux support - [UPD] Updated HWSensors - OpenBSD sensor program phpSysInfo 3.1.6 ---------------- - [ADD] Porteus, Peppermint, Manjaro, Netrunner and Salix to detected distros - [ADD] Show CPU frequency max for WINNT - [ADD] Show network interfaces infos for Darwin (Mac OS X) - [UPD] SNMPPInfo plugin, ink level for some of the data - [UPD] jQuery 2.0.3 and jQuery 1.10.2 - [UPD] Russian Translation ru.xml - [UPD] BAT plugin - WINNT support - [SEC] Fix JSONP phpSysInfo 3.1.5 ---------------- - [ADD] Possibility to define multiple SENSOR_PROGRAM - [ADD] Added display of temperature and fan speed for IPMI sensor program - [ADD] openSUSE and Eisfair to detected distros - [ADD] Portuguese Translation pt-pt.xml - [FIX] Fixed incorrect display of the minimum fan speed - [FIX] Fix recovery detection of RAID arrays on debian systems #18 phpSysInfo 3.1.4 ---------------- - [ADD] Option for reading the results of functions executeProgram() and rfts() from log - [ADD] Show CPU frequency max and min for variable speed processors for Linux and Android - [ADD] Filesystem usage warning on defined threshold FS_USAGE_THRESHOLD - [UPD] BAT plugin - added temperature, condition and type of battery, Android support - [UPD] jQuery 2.0.2 and jQuery 1.10.1 phpSysInfo 3.1.3 ---------------- - [ADD] IPFire, Sabayon, PearOS, ClearOS, Frugalware, Fuduntu, Foresight, Tinycore, ALT Linux, ROSA Desktop Marathon and RedHatEnterpriseServer to detected distros - [UPD] Added "username" to filtered mount credentials - [UPD] jQuery 2.0 coexistent with jQuery 1.9.1 for old Internet Explorer browser versions (IE 6/7/8) - [FIX] proc_open() malfunction on some PHP for Android by replacing by popen() - [FIX] Run php-cs-fixer on php files (PSR-2 fixer) phpSysInfo 3.1.2 ---------------- - [ADD] Tempsensor and CPU frequency for Raspberry Pi (thanks to hawkeyexp) - [ADD] Linaro to detected distros - [ADD] Option for logging of functions executeProgram() and rfts() - [ADD] Add support of JSONP - [FIX] Incorrect display of chunk size for the plugin mdstatus for some results phpSysInfo 3.1.1 ---------------- - [ADD] SolusOS, Deepin and antiX to detected distros - [ADD] Simplified Chinese translation - [UPD] jQuery 1.9.1 phpSysInfo 3.1.0 ---------------- - [NEW] Configuration moved from config.php and subdirs of "plugins" to one file phpsysinfo.ini - [ADD] Turbolinux, Oracle Linux, CloudLinux, PCLinuxOS, StartOS, Trisquel, CRUX, Slax, Pear, Android, Zorin and elementary OS to detected distros - [ADD] Show System Language and Code Page on Linux, Haiku and WINNT - [ADD] Minor support of ReactOS - [ADD] apcupsd-cgi support (thanks to duhast) - [UPD] Plugin ipmi renamed to IPMIInfo and Update-Notifier to UpdateNotifier (to avoid name conflicts) - [UPD] Case-insensitive for most of parameters - [UPD] Detection of Mac OS X and Linux distribution - [UPD] CPU detection on Mac OS X - [FIX] Fixed UTF8 encoding for Linux - [FIX] SMART plugin doesn't display for some results - [FIX] Incorrect display of mountpoint on Mac OS X phpsysinfo-3.2.1/COPYING000066400000000000000000000431031247443170600147630ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. , 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 Lesser General Public License instead of this License. phpsysinfo-3.2.1/Dockerfile000066400000000000000000000014451247443170600157250ustar00rootroot00000000000000# phpSysInfo # VERSION 2 FROM ubuntu:14.04 MAINTAINER phpSysInfo # Update sources RUN echo "deb http://archive.ubuntu.com/ubuntu trusty main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get install -y apache2 php5 git pciutils RUN git clone https://github.com/phpsysinfo/phpsysinfo.git /var/www/html/phpsysinfo #RUN cp /var/www/html/phpsysinfo/phpsysinfo.ini.new /var/www/html/phpsysinfo/phpsysinfo.ini RUN cat /var/www/html/phpsysinfo/phpsysinfo.ini.new | sed 's/^LOAD_BAR=false/LOAD_BAR=true/' >/var/www/html/phpsysinfo/phpsysinfo.ini ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 ENV APACHE_PID_FILE /var/run/apache2/apache2.pid CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"] EXPOSE 80 phpsysinfo-3.2.1/README.md000066400000000000000000000071621247443170600152140ustar00rootroot00000000000000phpSysInfo ============== * Copyright (c), 1999-2008, Uriah Welcome (precision@users.sf.net) * Copyright (c), 1999-2009, Michael Cramer (bigmichi1@users.sf.net) * Copyright (c), 2007-2008, Audun Larsen (xqus@users.sf.net) * Copyright (c), 2007-2015, Erkan Valentin * Copyright (c), 2009-2015, Mieczyslaw Nalewaj (namiltd@users.sf.net) * Copyright (c), 2010-2012, Damien Roth (iysaak@users.sf.net) CURRENT TESTED PLATFORMS ------------------------ - Linux 2.6.x - FreeBSD 7.x - OpenBSD 2.8+ - NetBSD - DragonFly - IBM AIX - HP-UX - Darwin/OSX - Windows 2000 / Windows 2003 / Windows XP / Windows Vista / Windows 7 / Windows 8 / Windows 8.1 - Android - > PHP 5.2 or later - With PCRE, XML, XSL, MBString and SimpleXML extension. ####Platforms currently in progress: - Haiku - Minix - SunOS - ReactOS - QNX If your platform is not here try checking out the mailing list archives or the message boards on SourceForge. INSTALLATION AND CONFIGURATION ------------------------------ Just decompress and untar the source (which you should have done by now, if you're reading this...), into your webserver's document root. There is a configuration file called phpsysinfo.ini.new. If this a brand new installation, you should copy this file to phpsysinfo.ini and edit it. - make sure your `php.ini` file's `include_path` entry contains "." - make sure your `php.ini` has `safe_mode` set to 'off'. phpSysInfo require php-xml extension. Please keep in the mind that because phpSysInfo requires access to many files in `/proc` and other system binary you **MUST DISABLE** `php's safe_mode`. Please see the PHP documentation for information on how you can do this. That's it. Restart your webserver (if you changed php.ini), and voila. KNOWN PROBLEMS -------------- - phpSysInfo is not compatible with SELinux Systems - small bug under FreeBSD with memory reporting PLATFORM SPECIFIC ISSUES ------------------------ ####Windows with IIS On Windows systems we get our informations through the WMI interface. If you run phpSysInfo on the IIS webserver, phpSysInfo will not connect to the WMI interface for security reasons. At this point you MUST set an authentication mechanism for the directory in the IIS admin interface for the directory where phpSysInfo is installed. Then you will be asked for an user and a password when opening the page. At this point it is necassary to log in with an user that will be able to connect to the WMI interface. If you use the wrong user and/or password you might get an "ACCESS DENIED ERROR". SENSOR RELATED INFORMATION --------------------------- ####MBM5 Make sure you set MBM5 Interval Logging to csv and to the data directory of phpSysInfo. The file must be called MBM5. Also make sure MBM5 doesn't add symbols to the values. This is a Quick MBM5 log parser, need more csv logs to make it better. WHAT TO DO IF IT DOESN'T WORK ----------------------------- First make sure you've read this file completely, especially the "INSTALLATION AND CONFIGURATION" section. If it still doesn't work then you can: Submit a bug on SourceForge (preferred) (http://sourceforge.net/projects/phpsysinfo/) Ask for help in the forum (http://sourceforge.net/projects/phpsysinfo/) ***!! If you have any problems, please set `DEBUG` to true in `phpsysinfo.ini` and include any error messages in your bug report / help request !!*** OTHER NOTES ----------- If you have a great idea or want to help out, just drop by the project page at SourceForge (http://sourceforge.net/projects/phpsysinfo/). LICENSING --------- This program and all associated files are released under the GNU Public License, see [COPYING](COPYING) for details. phpsysinfo-3.2.1/README_PLUGIN.md000066400000000000000000000154671247443170600163010ustar00rootroot00000000000000phpSysInfo 3.1 - http://phpsysinfo.sourceforge.net/ =================================================== Document written by Michael Cramer (bigmichi1 at sourceforge.net) !!Please read if you want to develop a plugin to understand our plugin system!! Plugins ------- Beginning with phpSysInfo 3.0, phpSysInfo can be extended by Plugins. So here is a description that a developer of a plugin must take care of. Plugins can be enabled through the `phpsysinfo.ini` in the PLUGINS variable. The name of the plugin is essential for the function of the plugin system. Lets say you write a plugin with the name 'hdd_stats', then this name is added to the PLUGINS variable in `phpsysinfo.ini`. And this is also then the name which is everywhere in the plugin system used, like creating the object, locate the needed files and so on. So if the name is now specified, phpSysInfo needs a special directory structure to find the needed files. The directory structure for the example `hdd_stats` plugin can be seen here: ``` -+ phpSysInfo root | +---+ plugins (directory in that plugins are installed) | | | +---+ hdd_stats (the real plugin directory, must have the same name like | | | the plugin named in PLUGINS, else it won't be found) | | | | | +---+ js (directory in which the needed JavaScript file is located, | | | | to generate the html output out of the xml) | | | # hdd_stats.js (the js file must have the same name, like the | | | plugin in PSI_PLUGINS with the extension js) | | +---+ css (directory in which the needed style sheet information are | | | | located, can exists, but it's up to the author) | | | # hdd_stats.css (the css file must have the same name, like the | | | plugin in PSI_PLUGINS with the extension css) | | +---+ lang (directory where translations for the plugin are located) | | | | | | | # en.xml (at least an english translation file must exist) | | | | | # class.hdd_stats.inc.php (this is the core file of the plugin, | | name must consists of 'class' + | | name from PSI_PLUGINS + '.inc.php') ``` other files or directorys can be included in the plugin directory, but then its up to the developer to include them in the plugin. So it might be possible to have a 'gfx' directory in which some pics are located that are used in the output. If the directory structure is build up, then it's time to start programming. Files ----- An example implementation is the mdstat plugin, which is shipped with phpSysInfo * en.xml - at least this file must exist to get the translation working, and the the first entry in this file is normally the headline of the plugin. So one translation migth exists everytime. Other translation files are also in the same directory like the `en.xml` file. The id's specified in the translation file SHOULD have the following look `plugin_hdd_status_001`. First we say that this is a plugin translation, then the name of plugin and at last a increasing number for each translation. Please create your id's in that way, so that other plugins don't redefine your translations. At the time of writing this, there is no check to verify the id's, so be carfull. * hdd_stats.css - here can all custom style sheet informations written down. The names of the id's and classes SHOULD also begin, like the translation id's, with `'plugin_' + pluginname`. If thats not the case it might be possible that another plugin is overwriting your css definitions. * class.hdd_stats.inc.php - this file MUST include a class with the plugin name and also this class MUST extend the 'psi_plugin' class. A check that such a class exist and also extends 'psi_plugin' will be included in the near future. And if the check fails the plugin won't be loaded. The psi_plugin class checks the existens of the js and the en.xml files. Also an extra configuration of the plugin is loaded automatically from `phpsysinfo.ini`, if present. Through the extension of the psi_plugin class there is a need to include at least two public function. These are the execute() function and the xml() function. Other functions can be exist, that depends on the plugin needs or the author of the class. The execute() function is called to get the required information that should be later included in the xml file. The xml() function is called when the xml output should be generated. This function must return a simplexml object. This object is then included in another xml at the right position or as a standalone xml. So there is no need to do some special things, only create a xml object for the plugin. * hdd_stats.js - this file is called when the page is loaded. A block for the plugin is automatically created. This one is a div container with the id `'plugin_'+ pluginname ("plugin_hdd_stats")`. The entire output must be placed in that container. There is a helper function for creating the headline: buildBlock() that can be called. This function returns a string with the html code of the headline, this code can then be appended to the plugin block. The generated headline can provide a reload icon for an ajax request. Only the click action of that icon must be created. The id of this icon is `'reload_' + pluginname + 'Table' ("reload_hdd_statsTable")`. Everything that then is done to get the html output out of the xml is up to the author. To get the xml document the ajax request url is `'xml.php?plugin=' + pluginname (xml.php?plugin=hdd_stats)`. This xml includes only the xml from the plugin nothing more. The last two executed commands should/must be the translation call and the unhide of the filled div container. The translation function that needs to be called is named plugin_traslate() with one argument, that is the pluginname like in `PSI_PLUGINS (plugin_translate("hdd_stats");)`. To unhide the filled container call the .show() function of it. `$("plugin_" + pluginname).show() ($("plugin_hdd_stat").show())`. FAQ --- Q: Is the plugin system ready to use? A: It can be used, but it might change slightly in the future, if there are some special needs. SUGGESTION ---------- If anybody out there has some suggestions in improving the plugin system let us know. We are looking forward to get some feedback, suggestions and patches and more. Feel free to contact us on our website: http://phpsysinfo.sourceforge.net. $Id: README_PLUGIN 463 2011-04-19 17:34:41Z namiltd $ phpsysinfo-3.2.1/composer.json000066400000000000000000000013361247443170600164540ustar00rootroot00000000000000{ "name": "phpsysinfo/phpsysinfo", "description": "phpSysInfo is a customizable PHP Script that parses /proc, and formats information nicely. It will display information about system facts like Uptime, CPU, Memory, PCI devices, SCSI devices, IDE devices, Network adapters, Disk usage, and more.", "license": "GPL", "homepage": "http://phpsysinfo.github.io/phpsysinfo/", "require": { "php": ">=5.2.0", "ext-simplexml": "*", "ext-pcre": "*", "ext-xml": "*", "ext-dom": "*" }, "suggest": { "ext-mbstring": "Required for *nix non UTF-8 systems", "ext-com_dotnet": "Required for Windows environments", "ext-xsl": "Required for static mode" } }phpsysinfo-3.2.1/data/000077500000000000000000000000001247443170600146405ustar00rootroot00000000000000phpsysinfo-3.2.1/data/ModelTranslation.txt000066400000000000000000000177171247443170600206750ustar00rootroot00000000000000ADP2,1:Developer Transition Kit:Intel Pentium 4 iMac,1:iMac G3:PowerPC 750 (G3) iMac1,1:iMac G3*:PowerPC 750 (G3) iMac4,1:iMac Core Duo:Intel Core Duo T2400/T2500 iMac4,2:iMac Core Duo:Intel Core Duo T2400 iMac5,1:iMac Core 2 Duo:Intel Core 2 Duo T7200/T7400/T7600 iMac5,2:iMac Core 2 Duo:Intel Core 2 Duo T5600 iMac6,1:iMac Core 2 Duo:Intel Core 2 Duo T7400/T7600 iMac7,1:iMac Core 2 Duo/Extreme:Intel Core 2 Duo T7300/T7700/X7900 iMac8,1:iMac Core 2 Duo:Intel Core 2 Duo E8135/E8335/E8235/E8435 iMac9,1:iMac Core 2 Duo:Intel Core 2 Duo P7350/P7550/E8135/E8335/E8435 iMac10,1:iMac Core 2 Duo:Intel Core 2 Duo E7600/E8600 iMac10,2:iMac Core 2 Duo*:Intel Core 2 Duo E7500/E7600/E8600 iMac11,1:iMac Core i5/i7:Intel Core I5-750/I7-860 iMac11,2:iMac Core i3/i5:Intel Core I3-540/I3-550/I5-680 iMac11,3:iMac Core i3/i5/i7:Intel Core I3-550/I5-760/I5-680/I7-870 iMac12,1:iMac Core i3/i5/i7:Intel Core I3-2100/I5-2400S/I5-2500S/I5-2600S iMac12,2:iMac Core i5/i7:Intel Core I5-2400/I5-2500S/I7-2600 iMac13,1:iMac Core i3/i5/i7:Intel Core I3-3225/I5-3335S/I5-3470S/I7-3770S iMac13,2:iMac Core i5/i7:Intel Core I5-3470/I5-3470S/I7-3770 iMac14,1:iMac Core i5:Intel Core I5-4570R iMac14,2:iMac Core i5/i7:Intel Core I5-4570/I5-4670/I7-4771 iMac14,3:iMac Core i5/i7:Intel Core I5-4570S/I7-4770S M43ADP1,1:Development Mac Pro:Intel Xeon X5340 MacBook1,1:MacBook Core Duo:Intel Core Duo T2400/T2500 MacBook2,1:MacBook Core 2 Duo:Intel Core 2 Duo T5600/T7200/T7400 MacBook3,1:MacBook Core 2 Duo:Intel Core 2 Duo T7300/T7500 MacBook4,1:MacBook Core 2 Duo:Intel Core 2 Duo T8100/T8300 MacBook5,1:MacBook Core 2 Duo:Intel Core 2 Duo P7350/P8600 MacBook5,2:MacBook Core 2 Duo:Intel Core 2 Duo P7350/P7450 MacBook6,1:MacBook Core 2 Duo:Intel Core 2 Duo P7550 MacBook7,1:MacBook Core 2 Duo:Intel Core 2 Duo P8600 MacBookAir1,1:MacBook Air Core 2 Duo:Intel Core 2 Duo P7500/P7700 MacBookAir2,1:MacBook Air Core 2 Duo:Intel Core 2 Duo SL9300/SL9400/SL9600 MacBookAir3,1:MacBook Air Core 2 Duo:Intel Core 2 Duo SU9400/SU9600 MacBookAir3,2:MacBook Air Core 2 Duo:Intel Core 2 Duo SL9400/SL9600 MacBookAir4,1:MacBook Air Core i5/i7:Intel Core I5-2467M/I7-2677M MacBookAir4,2:MacBook Air Core i5/i7:Intel Core I5-2467M/I5-2557M/I7-2677M MacBookAir5,1:MacBook Air Core i5/i7:Intel Core I5-3317U/I7-3667U MacBookAir5,2:MacBook Air Core i5/i7:Intel Core I5-3427U/I7-3667U MacBookAir6,1:MacBook Air Core i5/i7:Intel Core I5-4250U/I5-4260U/I7-4650U MacBookAir6,2:MacBook Air Core i5/i7:Intel Core I5-4250U/I5-4260U/I7-4650U MacBookPro1,1:MacBook Pro Core Duo:Intel Core Duo L2400/T2400/T2500/T2600 MacBookPro1,2:MacBook Pro Core Duo:Intel Core Duo T2600 MacBookPro2,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo T7600 MacBookPro2,2:MacBook Pro Core 2 Duo:Intel Core 2 Duo T7400/T7600 MacBookPro3,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo T7500/T7700/T7800 MacBookPro4,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo T8300/T9300/T9500 MacBookPro5,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8600/T9400/T9550/T9600/T9800 MacBookPro5,2:MacBook Pro Core 2 Duo:Intel Core 2 Duo T9550/T9600/T9800/T9900 MacBookPro5,3:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8800/T9600/T9900 MacBookPro5,4:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8700 MacBookPro5,5:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8400/P8700 MacBookPro6,1:MacBook Pro Core i5/i7:Intel Core I5-540M/I7-620M/I7-640M MacBookPro6,2:MacBook Pro Core i5/i7:Intel Core I5-520M/I5-540M/I7-620M/I7-640M MacBookPro7,1:MacBook Pro Core 2 Duo:Intel Core 2 Duo P8600/P8800 MacBookPro8,1:MacBook Pro Core i5/i7:Intel Core I5-2415M/I5-2435M/I7-2620M/I7-2640M MacBookPro8,2:MacBook Pro Core i7:Intel Core I7-2635QM/I7-2720QM/I7-2675QM/I7-2820QM/I7-2760QM/I7-2860QM MacBookPro8,3:MacBook Pro Core i7:Intel Core I7-2720QM/I7-2820QM/I7-2760QM/I7-2860QM MacBookPro9,1:MacBook Pro Core i7:Intel Core I7-3615QM/I7-3720QM/I7-3820QM MacBookPro9,2:MacBook Pro Core i5/i7:Intel Core I5-3210M/I7-3520M MacBookPro10,1:MacBook Pro Core i7:Intel Core I7-3615QM/I7-3635QM/I7-3720QM/I7-3740QM/I7-3820QM/I7-3840QM MacBookPro10,2:MacBook Pro Core i5/i7:Intel Core I5-3210M/I5-3230M/I7-3520M/I7-3540M MacBookPro11,1:MacBook Pro Core i5/i7:Intel Core I5-4258U/I5-4288U/I7-4558U MacBookPro11,2:MacBook Pro Core i7:Intel Core I7-4750HQ/I7-4850HQ/I7-4960HQ MacBookPro11,3:MacBook Pro Core i7:Intel Core I7-4850HQ/I7-4960HQ Macmini1,1:Mac mini Core Solo/Duo:Intel Core Duo T2300/T2400 Solo T1200 Macmini2,1:Mac mini Core 2 Duo:Intel Core 2 Duo T5600/T7200 Macmini3,1:Mac mini Core 2 Duo:Intel Core 2 Duo P7350/P8400/P7550/P8700/P8800 Macmini4,1:Mac mini Core 2 Duo:Intel Core 2 Duo P8600/P8800 Macmini5,1:Mac mini Core i5:Intel Core I5-2415M Macmini5,2:Mac mini Core i5/i7:Intel Core I5-2520M/I7-2620M Macmini5,3:Mac mini Core i7:Intel Core I7-2635QM Macmini6,1:Mac mini Core i5:Intel Core I5-3210M Macmini6,2:Mac mini Core i7:Intel Core i7 I7-3615QM/I7-3720QM MacPro1,1:Mac Pro Quad Core:Intel Xeon 5130/5150/5160 MacPro2,1:Mac Pro Eight Core:Intel Xeon X5365 MacPro3,1:Mac Pro Quad/Eight Core:Intel Xeon E5462/E5472/X5482 MacPro4,1:Mac Pro Quad/Eight Core:Intel Xeon E5520/E5550/X5570/W3520/W3540/W3580 MacPro5,1:Mac Pro Quad/Six/Eight/Twelve Core:Intel Xeon E5620/E5645/W3530/W3565/W3680/X5650/X5670/X5675 MacPro6,1:Mac Pro Quad/Six/Eight/Twelve Core:Intel Xeon E5-1620v2/E5-1650v2/E5-1680v2/E5-2697v2 PowerBook1,1:PowerBook G3:PowerPC 750 (G3) PowerBook2,1:iBook G3:PowerPC 750 (G3) PowerBook2,2:iBook G3:PowerPC 750cx (G3) PowerBook2,3:iBook G3*:PowerPC 750cx (G3) PowerBook2,4:iBook G3*:PowerPC 750cx (G3) PowerBook3,1:PowerBook G3:PowerPC 750 (G3) PowerBook3,2:PowerBook G4:PowerPC 7410 (G4) PowerBook3,3:PowerBook G4:PowerPC 7440 (G4) PowerBook3,4:PowerBook G4:PowerPC 7451 (G4) PowerBook3,5:PowerBook G4:PowerPC 7455 (G4) PowerBook4,1:iBook G3:PowerPC 750cx (G3) PowerBook4,2:iBook G3 600:PowerPC 750cx (G3) PowerBook4,3:iBook G3:PowerPC 750fx (G3) PowerBook5,1:PowerBook G4:PowerPC 7455 (G4) PowerBook5,2:PowerBook G4:PowerPC 7447 (G4) PowerBook5,3:PowerBook G4:PowerPC 7447 (G4) PowerBook5,4:PowerBook G4:PowerPC 7447a (G4) PowerBook5,5:PowerBook G4:PowerPC 7447a (G4) PowerBook5,6:PowerBook G4:PowerPC 7447a (G4) PowerBook5,7:PowerBook G4:PowerPC 7447a (G4) PowerBook5,8:PowerBook G4:PowerPC 7447a (G4) PowerBook5,9:PowerBook G4:PowerPC 7447a (G4) PowerBook6,1:PowerBook G4:PowerPC 7455 (G4) PowerBook6,2:PowerBook G4:PowerPC 7447 (G4) PowerBook6,3:iBook G4:PowerPC 7457 (G4) PowerBook6,4:PowerBook G4:PowerPC 7447a (G4) PowerBook6,5:iBook G4:PowerPC 7447a (G4) PowerBook6,7:iBook G4:PowerPC 7447a (G4) PowerBook6,8:PowerBook G4:PowerPC 7447a (G4) PowerMac1,1:Power Macintosh/Mac Server G3:PowerPC 750 (G3) PowerMac1,2:Power Macintosh G4:PowerPC 7400 (G4) PowerMac2,1:iMac G3:PowerPC 750 (G3) PowerMac2,2:iMac G3:PowerPC 750 (G3) PowerMac3,1:Power Macintosh/Mac Server G4:PowerPC 7400 (G4) PowerMac3,2:Power Macintosh/Mac Server G4*:PowerPC 7400 (G4) PowerMac3,3:Power Macintosh/Mac Server G4:PowerPC 7400 (G4) PowerMac3,4:Power Macintosh/Mac Server G4:PowerPC 7410 (G4) PowerMac3,5:Power Macintosh/Mac Server G4:PowerPC 7450/7455 (G4) PowerMac3,6:Power Macintosh/Mac Server G4:PowerPC 7455 (G4) PowerMac4,1:iMac G3:PowerPC 750/750cx (G3) PowerMac4,2:iMac G4:PowerPC 7441/7445 (G4) PowerMac4,4:eMac G4:PowerPC 7441/7445 (G4) PowerMac4,5:iMac G4:PowerPC 7445 (G4) PowerMac5,1:Power Macintosh G4 Cube:PowerPC 7400 (G4) PowerMac6,1:iMac G4:PowerPC 7445 (G4) PowerMac6,3:iMac G4:PowerPC 7445 (G4) PowerMac6,4:eMac G4:PowerPC 7447a (G4) PowerMac7,2:Power Macintosh G5:PowerPC 970 (G5) PowerMac7,3:Power Macintosh G5:PowerPC 970fx (G5) PowerMac8,1:iMac G5:PowerPC 970 (G5) PowerMac8,2:iMac G5:PowerPC 970 (G5) PowerMac9,1:Power Macintosh G5:PowerPC 970fx (G5) PowerMac10,1:Mac mini G4:PowerPC 7447a (G4) PowerMac10,2:Mac mini G4:PowerPC 7447a (G4) PowerMac11,2:Power Macintosh G5 Dual/Quad Core:PowerPC 970MP (G5) PowerMac12,1:iMac G5:PowerPC 970fx (G5) RackMac1,1:Xserve G4:PowerPC 7455 (G4) RackMac1,2:Xserve G4:PowerPC 7455 (G4) RackMac3,1:Xserve G5:PowerPC 970fx (G5) Xserve1,1:Xserve Xeon Quad Core:Intel Xeon 5130/5150/5160 Xserve2,1:Xserve Xeon Quad/Eight Core:Intel Xeon E5462/E5472 Xserve3,1:Xserve Xeon Nehalem Quad/Eight Core:Intel Xeon E5520/E5550/E5570 phpsysinfo-3.2.1/data/distros.ini000066400000000000000000000424251247443170600170370ustar00rootroot00000000000000; linux-distros.ini - Defines known linux distros for phpSysInfo. ; http://phpsysinfo.sourceforge.net/ ; $Id: distros.ini 709 2012-12-05 11:20:40Z namiltd $ ; [GoboLinux] Image = "Gobo.png" Name = "GoboLinux" Files = "/etc/GoboLinuxVersion" [SliTaz] Image = "SliTaz.png" Name = "SliTaz" Files = "/etc/slitaz-release" [eisfair] Image = "Eisfair.png" Files = "/etc/eisfair-system" Files2 = "/etc/version" [TinyCore] Image = "TinyCore.png" Name = "Tiny Core Linux" Files = "/usr/share/doc/tc/release.txt" [Frugalware] Image = "Frugalware.png" Files = "/etc/frugalware-release" ;detected in "/etc/os-release" [antiX] Image = "antiX.png" Files = "/etc/antix-version" ;wrong in "/etc/os-release" Debian GNU/Linux ;wrong in "/etc/debian_version" Debian [IPFire] Image = "IPFire.png" ;detected in "/etc/system-release" [4MLinux] Image = "4MLinux.png" Name = "4MLinux" Files = "/etc/4MLinux-version" [Lunar Linux] Image = "Lunar.png" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" [CRUX] Image = "Crux.png" Mode = "Execute" Files = "/usr/bin/crux" [Foresight] Image = "Foresight.png" ;detected in "/etc/distro-release" [Trustix] Image = "Trustix.png" Files = "/etc/trustix-release;/etc/trustix-version" [NixOS] Image = "NixOS.png" ;detected in "/etc/os-release" [FreeEOS] Image = "free-eos.png" Files = "/etc/eos-version" [generations] Image = "Generations.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [Generations Linux] Image = "Generations.png" ;detected in "/etc/os-release" [Manjaro Linux] Image = "Manjaro.png" Files = "/etc/manjaro-release" ;detected in "/etc/os-release" [ManjaroLinux] Image = "Manjaro.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [Arch Linux] Image = "Arch.png" Files = "/etc/arch-release" ;detected in "/etc/os-release" [Arch] Image = "Arch.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [Cobalt] Image = "Cobalt.png" Files = "/etc/cobalt-release" [LinuxFromScratch] Image = "LFS.png" Files = "/etc/lfs-release" [Rubix] Image = "Rubix.png" Files = "/etc/rubix-version" [Tails] Image = "Tails.png" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [Tanglu] Image = "Tanglu.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/debian_version" Debian [Tanglu GNU/Linux] Image = "Tanglu.png" ;detected in "/etc/os-release" [Mer] Image = "Mer.png" Files = "/etc/mer-release;/etc/meego-release;/etc/moblin-release" Mode = "Analyse" ;detected in "lsb_release -a" ;detected in "/etc/system-release" [KaOS] Image = "KaOS.png" Files = "/etc/KaOS-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" [CoreOS] Image = "CoreOS.png" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" [BOSS] Image = "BOSS.png" Name = "BOSS GNU/Linux" Files = "/etc/boss_version" ;detected in "lsb_release -a" ;wrong in "/etc/debian_version" Debian [BOSS GNU/Linux] Image = "BOSS.png" ;detected in "/etc/os-release" [BOSS Server Beta] Image = "BOSS.png" ;detected in "lsb_release -a" [Canaima] Image = "Canaima.png" Name = "Canaima GNU/Linux" Files = "/etc/canaima_version" ;detected in "lsb_release -a" ;wrong in "/etc/debian_version" Debian [Canaima GNU/Linux] Image = "Canaima.png" ;detected in "/etc/os-release" [Semplice] Image = "Semplice.png" Name = "Semplice" Files = "/etc/semplice_version" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [SolydXK] Image = "SolydXK.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/solydxk/info" ;wrong in "/etc/os-release" Debian GNU/Linux ;wrong in "/etc/debian_version" Debian [Parsix] Image = "Parsix.png" Files = "/etc/parsix-version" ;detected in "lsb_release -a" ;detected or wrong version in "/etc/os-release" | Parsix 4.0 ;wrong in "/etc/debian_version" Debian [Linaro] Image = "Linaro.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [LinuxDeepin] Image = "Deepin.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/os-release" Debian GNU/Linux ;wrong in "/etc/debian_version" Debian [Ultimate_Edition] Image = "UltimateEdition.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [elementary OS] Image = "elementaryOS.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [PearLinux] Image = "Pear.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/os-release" Ubuntu ;wrong in "/etc/debian_version" Debian [Pear Linux] Image = "Pear.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/os-release" Ubuntu ;wrong in "/etc/debian_version" Debian [PearOS] Image = "Pear.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/os-release" Ubuntu ;wrong in "/etc/debian_version" Debian [SolusOS] Image = "SolusOS.png" Files = "/etc/solusos_version" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/os-release" Debian GNU/Linux ;wrong in "/etc/debian_version" Debian [LinuxMint] Image = "Mint.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/os-release" Ubuntu ;wrong in "/etc/debian_version" Debian [Trisquel] Image = "Trisquel.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/os-release" Ubuntu ;wrong in "/etc/debian_version" Debian [Zorin] Image = "Zorin.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong or almost in "/etc/os-release" Ubuntu | Zorin OS ;wrong in "/etc/debian_version" Debian [Zorin OS] Image = "Zorin.png" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [Netrunner] Image = "Netrunner.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [NetrunnerSE] Image = "Netrunner.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/debian_version" Debian [Netrunner Rolling] Image = "Netrunner.png" ;detected in "/etc/os-release" ;wrong in "/etc/manjaro-release" Manjaro [Peppermint] Image = "Peppermint.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [Ubuntu] Image = "Ubuntu.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [Chakra] Image = "Chakra.png" Files = "/etc/chakra-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [The Chakra-Project] Image = "Chakra.png" ;detected in "/etc/os-release" [IYCC] Image = "iycc.png" ;detected in "/etc/lsb-release" [Mageia] Image = "Mageia.png" Files = "/etc/mageia-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/mandriva-release" ;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" ;detected in "/etc/redhat-release" ;detected in "/etc/os-release" [PLD Linux] Image = "PLD.png" Files = "/etc/pld-release" ;detected in "/etc/os-release" [LFS] Image = "lfs.png" Files = "/etc/lfs-release;/etc/lfs_version" [HLFS] Image = "lfs.png" Files = "/etc/hlfs-release;/etc/hlfs_version" [Synology] Image = "Synology.png" Mode = "Detection" Files = "/etc/synoinfo.conf" Files2 = "/etc/VERSION" [Alpine] Name = "Alpine" Image = "Alpine.png" Files = "/etc/alpine-release" [Puppy] Image = "Puppy.png" ;detected in "/etc/DISTRO_SPECS" [Lucid] Name = "Lucid Puppy" Image = "Puppy.png" ;detected in "/etc/DISTRO_SPECS" [Slacko Puppy] Image = "Puppy.png" ;detected in "/etc/DISTRO_SPECS" [Wary Puppy] Image = "Puppy.png" ;detected in "/etc/DISTRO_SPECS" [Turbolinux] Image = "Turbo.png" Files = "/etc/turbolinux-release" [Amazon] Image = "Amazon.png" ;detected in "/etc/system-release" [AmazonAMI] Image = "Amazon.png" ;detected in "lsb_release -a" [RedFlag] Image = "RedFlag.png" Files = "/etc/redflag-release" ;detected in "/etc/system-release" [Red Flag inWise] Image = "RedFlag.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" [StartOS] Image = "StartOS.png" Files = "/etc/startos-release" ;detected in "lsb_release -a" [PisiLinux] Image = "Pisi.png" Files = "/etc/pisilinux-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [Pisi_Linux] Image = "Pisi.png" ;detected in "/etc/system-release" [SME] Image = "SMEServer.png" Files = "/etc/e-smith-release" ;wrong in "/etc/centos-release" CentOS ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" [SMEServer] Image = "SMEServer.png" ;detected in "lsb_release -a" [Scientific] Image = "Scientific.png" ;detected in "lsb_release -a" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" [ScientificSL] Image = "Scientific.png" ;detected in "lsb_release -a" [ScientificCERNSLC] Image = "Scientific.png" ;detected in "lsb_release -a" [ScientificFermi] Image = "Scientific.png" ;detected in "lsb_release -a" [ScientificFermiLTS] Image = "Scientific.png" ;detected in "lsb_release -a" [ScientificSLF] Image = "Scientific.png" ;detected in "lsb_release -a" [ClearOS] Image = "ClearOS.png" Files = "/etc/clearos-release" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" [CloudLinuxServer] Image = "Cloud.png" ;detected in "lsb_release -a" [CloudLinux] Image = "Cloud.png" Files = "/etc/CloudLinux-release" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" ; at the end because some distros may also have the same files (like SMEServer) [CentOS] Image = "CentOS.png" Files = "/etc/centos-release" ;detected in "lsb_release -a" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" [Oracle] Image = "Oracle.png" Files = "/etc/oracle-release;/etc/enterprise-release" ;detected in "/etc/system-release" ;wrong in "/etc/redhat-release" RedHat [OracleServer] Image = "Oracle.png" ;detected in "lsb_release -a" [EnterpriseEnterpriseServer] Image = "Oracle.png" ;detected in "lsb_release -a" [PCLinuxOS] Image = "PCLinuxOS.png" Files = "/etc/pclinuxos-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/mandriva-release" ;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" ;detected in "/etc/redhat-release" [Salix] Image = "Salix.png" Mode = "Detection" Files = "/etc/salix-update-notifier.conf" Files2 = "/etc/slackware-version" ;wrong in "/etc/os-release" Slackware ;wrong in "/etc/slackware-version" Slackware [Slax] Image = "Slax.png" Files = "/etc/slax-version" ;wrong in "/etc/os-release" Slackware ;wrong in "/etc/slackware-version" Slackware [SMS] Image = "SMS.png" Files = "/etc/sms-version" ;detected in "/etc/os-release" ;wrong in "/etc/slackware-version" Slackware [Porteus] Image = "Porteus.png" Files = "/etc/porteus-version" ;wrong in "/etc/os-release" Slackware ;wrong in "/etc/slackware-version" Slackware [Vector] Image = "Vector.png" Files = "/etc/vector-version" ;wrong in "/etc/slackware-version" Slackware [Zenwalk] Name = "Zenwalk" Image = "Zenwalk.png" Files = "/etc/zenwalk-version" ;detected in "/etc/os-release" ;wrong in "/etc/slackware-version" Slackware [Calculate] Image = "Calculate.png" ;detected in "/etc/gentoo-release" ;wrong in "/etc/os-release" Gentoo [Tizen] Image = "Tizen.png" Files = "/etc/tizen-release" ;detected in "/etc/system-release" ;detected in "/etc/os-release" [Sabayon] Image = "Sabayon.png" Files = "/etc/sabayon-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/system-release" ;detected in "/etc/os-release" ;wrong in "/etc/gentoo-release" Gentoo [VortexBox] Image = "VortexBox.png" Name = "VortexBox" Files = "/etc/vortexbox/vortexbox-version" ;wrong in "/etc/fedora-release" Fedora ;wrong in "/etc/redhat-release" Fedora ;wrong in "/etc/system-release" Fedora ;wrong in "/etc/os-release" Fedora [ALT] Image = "ALT.png" Files = "/etc/altlinux-release" ;detected in "/etc/fedora-release" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" [Simply] Image = "ALT.png" ;detected in "/etc/fedora-release" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" [Simply Linux] Image = "ALT.png" ;detected in "/etc/os-release" [ALT Linux] Image = "ALT.png" ;detected in "/etc/os-release" [Fuduntu] Image = "Fuduntu.png" Files = "/etc/fuduntu-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/fedora-release" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" [gNewSense] Image = "gNewSense.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/debian_version" Debian [SteamOS] Image = "SteamOS.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;wrong in "/etc/debian_version" Debian [SteamOS GNU/Linux] Image = "SteamOS.png" ;detected in "/etc/os-release" [Raspbian GNU/Linux] Image = "Raspbian.png" ;detected in "/etc/os-release" ;wrong in "/etc/debian_version" Debian [Debian] Name = "Debian" Image = "Debian.png" Files = "/etc/debian_release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/debian_version" [Debian GNU/Linux] Image = "Debian.png" ;detected in "/etc/os-release" [openSUSE] Image = "openSUSE.png" ;detected in "/etc/os-release" ;detected in "/etc/SuSE-release" [openSUSE project] Image = "openSUSE.png" ;detected in "lsb_release -a" ; at the end because some distros may also have the same files (like openSUSE) [SUSE LINUX] Image = "SUSE.png" Mode = "Analyse" Files = "/etc/SuSE-release;/etc/UnitedLinux-release" ; at the end because some distros may also have the same files (like Sabayon, Calculate) [Gentoo] Image = "Gentoo.png" Mode = "Analyse" Files = "/etc/gentoo-release" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ;detected in "/etc/os-release" ; at the end because some distros may also have the same files (like Salix, Slax, SMS, Porteus, Vector, Zenwalk) [Slackware] Image = "Slackware.png" Files = "/etc/slackware-release;/etc/slackware-version" ;detected in "/etc/os-release" [Korora] Image = "Korora.png" ;detected in "lsb_release -a" ;detected in "/etc/fedora-release" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" ;detected in "/etc/os-release" ; at the end because some distros may also have the same files (like Fuduntu, ALT, Korora, VortexBox) [Fedora] Image = "Fedora.png" Mode = "Analyse" Files = "/etc/fedora-release" ;detected in "lsb_release -a" ;detected in "/etc/redhat-release" ;detected in "/etc/system-release" ;detected in "/etc/os-release" [FedoraCore] Image = "Fedora.png" ;detected in "/etc/lsb-release" [OpenMandriva] Image = "OpenMandriva.png" ;detected in "/etc/rosa-release" ;detected in "/etc/mandriva-release" ;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" ;detected in "/etc/redhat-release" ;detected in "/etc/distro-release" ;detected in "/etc/system-release" [OpenMandriva Lx] Image = "OpenMandriva.png" ;detected in "/etc/os-release" [OpenMandrivaLinux] Image = "OpenMandriva.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [ROSA MarathonLinux] Image = "ROSA.png" ;detected in "/etc/lsb-release" [RosaDesktop.Marathon] Image = "ROSA.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [RosaDesktop.Fresh] Image = "ROSA.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" [ROSA Desktop Fresh] Image = "ROSA.png" ;detected in "/etc/os-release" [ROSA Marathon] Image = "ROSA.png" ;detected in "/etc/os-release" [ROSAEnterpriseServer] Image = "ROSA.png" ;detected in "lsb_release -a" ; at the end because some distros may also have the same files (like OpenMandriva) [ROSA] Image = "ROSA.png" Mode = "Analyse" Files = "/etc/rosa-release" ;detected in "lsb_release -a" ;detected in "/etc/system-release" ;detected in "/etc/mandriva-release" ;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" ;detected in "/etc/redhat-release" [MandrivaLinux] Image = "Mandrake.png" ;detected in "lsb_release -a" ;detected in "/etc/lsb-release" ; at the end because some distros may also have the same files (like Mageia, PCLinuxOS, ROSA, OpenMandriva) [Mandriva] Image = "Mandrake.png" Mode = "Analyse" Files = "/etc/mandriva-release" ;detected in "/etc/mandrake-release;/etc/mandrakelinux-release" ;detected in "/etc/redhat-release" ; at the end because some distros may also have the same files (like Mandriva, Mageia, PCLinuxOS, ROSA, OpenMandriva) [Mandrake] Image = "Mandrake.png" Mode = "Analyse" Files = "/etc/mandrake-release;/etc/mandrakelinux-release" ; at the end because some distros may also have the same files (like SMEServer, Fuduntu, ALT, VortexBox, Korora, Fedora, CentOS, Oracle, Scientific, CloudLinux, Mandrake, MandrivaLinux, Mageia, PCLinuxOS, ROSA, OpenMandriva) [RedHat] Image = "RedHat.png" Mode = "Analyse" Files = "/etc/redhat-release;/etc/redhat_version" ;detected in "/etc/system-release" [Red Hat Enterprise Linux Everything] Image = "RedHat.png" ;detected in "/etc/os-release" [RedHatEnterpriseES] Image = "RedHat.png" ;detected in "lsb_release -a" [RedHatEnterpriseAS] Image = "RedHat.png" ;detected in "lsb_release -a" [RedHatEnterpriseServer] Image = "RedHat.png" ;detected in "lsb_release -a" [RedHatEnterpriseClient] Image = "RedHat.png" ;detected in "lsb_release -a" phpsysinfo-3.2.1/data/languages.ini000066400000000000000000000606301247443170600173140ustar00rootroot00000000000000[WINNT] 1="Arabic" 4="Simplified Chinese - China" 9="English" 1025="Arabic - Saudi Arabia" 1026="Bulgarian" 1027="Catalan" 1028="Traditional Chinese - Taiwan" 1029="Czech" 1030="Danish" 1031="German - Germany" 1032="Greek" 1033="English - United States" 1034="Spanish - Traditional Sort" 1035="Finnish" 1036="French - France" 1037="Hebrew" 1038="Hungarian" 1039="Icelandic" 1040="Italian - Italy" 1041="Japanese" 1042="Korean" 1043="Dutch - Netherlands" 1044="Norwegian - Bokmal" 1045="Polish" 1046="Portuguese - Brazil" 1047="Rhaeto-Romanic" 1048="Romanian" 1049="Russian" 1050="Croatian" 1051="Slovak" 1052="Albanian" 1053="Swedish" 1054="Thai" 1055="Turkish" 1056="Urdu" 1057="Indonesian" 1058="Ukrainian" 1059="Belarusian" 1060="Slovenian" 1061="Estonian" 1062="Latvian" 1063="Lithuanian" 1065="Persion" 1066="Vietnamese" 1069="Basque" 1070="Serbian" 1071="Macedonian (FYROM)" 1072="Sutu" 1073="Tsonga" 1074="Tswana" 1076="Xhosa" 1077="Zulu" 1078="Afrikaans" 1080="Faeroese" 1081="Hindi" 1082="Maltese" 1084="Scottish Gaelic" 1085="Yiddish" 1086="Malay - Malaysia" 2049="Arabic - Iraq" 2052="Simplified Chinese - PRC" 2055="German - Switzerland" 2057="English - United Kingdom" 2058="Spanish - Mexico" 2060="French - Belgium" 2064="Italian - Switzerland" 2067="Dutch - Belgium" 2068="Norwegian - Nynorsk" 2070="Portuguese - Portugal" 2072="Romanian - Moldova" 2073="Russian - Moldova" 2074="Serbian - Latin" 2077="Swedish - Finland" 3073="Arabic - Egypt" 3076="Traditional Chinese - Hong Kong SAR" 3079="German - Austria" 3081="English - Australia" 3082="Spanish - International Sort" 3084="French - Canada" 3098="Serbian - Cyrillic" 4097="Arabic - Libya" 4100="Simplified Chinese - Singapore" 4103="German - Luxembourg" 4105="English - Canada" 4106="Spanish - Guatemala" 4108="French - Switzerland" 5121="Arabic - Algeria" 5127="German - Liechtenstein" 5129="English - New Zealand" 5130="Spanish - Costa Rica" 5132="French - Luxembourg" 6145="Arabic - Morocco" 6153="English - Ireland" 6154="Spanish - Panama" 7169="Arabic - Tunisia" 7177="English - South Africa" 7178="Spanish - Dominican Republic" 8193="Arabic - Oman" 8201="English - Jamaica" 8202="Spanish - Venezuela" 9217="Arabic - Yemen" 9226="Spanish - Colombia" 10241="Arabic - Syria" 10249="English - Belize" 10250="Spanish - Peru" 11265="Arabic - Jordan" 11273="English - Trinidad" 11274="Spanish - Argentina" 12289="Arabic - Lebanon" 12298="Spanish - Ecuador" 13313="Arabic - Kuwait" 13322="Spanish - Chile" 14337="Arabic - U.A.E." 14346="Spanish - Uruguay" 15361="Arabic - Bahrain" 15370="Spanish - Paraguay" 16385="Arabic - Qatar" 16394="Spanish - Bolivia" 17418="Spanish - El Salvador" 18442="Spanish - Honduras" 19466="Spanish - Nicaragua" 20490="Spanish - Puerto Rico" [Linux] _aa="Afar" _aa_DJ="Afar Djibouti" _aa_ER="Afar Eritrea" _aa_ER_SAAHO="Afar Eritrea Saho" _aa_ET="Afar Ethiopia" _aar="Afar" _aar_DJ="Afar Djibouti" _aar_ER="Afar Eritrea" _aar_ER_SAAHO="Afar Eritrea Saho" _aar_ET="Afar Ethiopia" _af="Afrikaans" _af_NA="Afrikaans Namibia" _afr="Afrikaans" _afr_NA="Afrikaans Namibia" _afr_ZA="Afrikaans South Africa" _af_ZA="Afrikaans South Africa" _aka="Akan" _aka_GH="Akan Ghana" _ak="Akan" _ak_GH="Akan Ghana" _alb_AL="Albanian Albania" _alb="Albanian" _am="Amharic" _am_ET="Amharic Ethiopia" _amh="Amharic" _amh_ET="Amharic Ethiopia" _ara_AE="Arabic United Arab Emirates" _ara="Arabic" _ara_BH="Arabic Bahrain" _ara_DZ="Arabic Algeria" _ar_AE="Arabic United Arab Emirates" _ara_EG="Arabic Egypt" _ara_IQ="Arabic Iraq" _ara_JO="Arabic Jordan" _ara_KW="Arabic Kuwait" _ara_LB="Arabic Lebanon" _ara_LY="Arabic Libya" _ara_MA="Arabic Morocco" _ara_OM="Arabic Oman" _ara_QA="Arabic Qatar" _ar="Arabic" _ara_SA="Arabic Saudi Arabia" _ara_SD="Arabic Sudan" _ara_SY="Arabic Syria" _ara_TN="Arabic Tunisia" _ara_YE="Arabic Yemen" _ar_BH="Arabic Bahrain" _ar_DZ="Arabic Algeria" _ar_EG="Arabic Egypt" _ar_IQ="Arabic Iraq" _ar_JO="Arabic Jordan" _ar_KW="Arabic Kuwait" _ar_LB="Arabic Lebanon" _ar_LY="Arabic Libya" _ar_MA="Arabic Morocco" _arm_AM="Armenian Armenia" _arm_AM_REVISED="Armenian Armenia Revised Orthography" _arm="Armenian" _ar_OM="Arabic Oman" _ar_QA="Arabic Qatar" _ar_SA="Arabic Saudi Arabia" _ar_SD="Arabic Sudan" _ar_SY="Arabic Syria" _ar_TN="Arabic Tunisia" _ar_YE="Arabic Yemen" _as="Assamese" _as_IN="Assamese India" _asm="Assamese" _asm_IN="Assamese India" _az_AZ="Azerbaijani Azerbaijan" _az="Azerbaijani" _az_Cyrl_AZ="Azerbaijani Azerbaijan (Cyrillic)" _az_Cyrl="Azerbaijani (Cyrillic)" _aze_AZ="Azerbaijani Azerbaijan" _aze_AZ_Cyrl="Azerbaijani Azerbaijan (Cyrillic)" _aze="Azerbaijani" _aze_AZ_Latn="Azerbaijani Azerbaijan (Latin)" _aze_Cyrl="Azerbaijani (Cyrillic)" _aze_Latn="Azerbaijani (Latin)" _az_Latn_AZ="Azerbaijani Azerbaijan (Latin)" _az_Latn="Azerbaijani (Latin)" _baq="Basque" _baq_ES="Basque Spain" _be="Belarusian" _be_BY="Belarusian Belarus" _bel="Belarusian" _bel_BY="Belarusian Belarus" _ben_BD="Bengali Bangladesh" _ben="Bengali" _ben_IN="Bengali India" _bg_BG="Bulgarian Bulgaria" _bg="Bulgarian" _bn_BD="Bengali Bangladesh" _bn="Bengali" _bn_IN="Bengali India" _bokmal="Norwegian BokmÃ¥l" _bokmÃ¥l="Norwegian BokmÃ¥l" _bos_BA="Bosnian Bosnia and Herzegovina" _bos="Bosnian" _bs_BA="Bosnian Bosnia and Herzegovina" _bs="Bosnian" _bul_BG="Bulgarian Bulgaria" _bul="Bulgarian" _bur="Burmese" _bur_MM="Burmese Myanmar" _byn="Blin" _byn_ER="Blin Eritrea" _ca="Catalan" _ca_ES="Catalan Spain" _catalan="Catalan Spain" _cat="Catalan" _cat_ES="Catalan Spain" _cch="Atsam" _cch_NG="Atsam Nigeria" _C="English United States Computer" _chi="Chinese" _chi_CN="Chinese China" _chi_CN_Hans="Chinese China (Simplified Han)" _chi_Hans="Chinese (Simplified Han)" _chi_Hant="Chinese (Traditional Han)" _chi_HK="Chinese Hong Kong SAR China" _chi_HK_Hans="Chinese Hong Kong SAR China (Simplified Han)" _chi_HK_Hant="Chinese Hong Kong SAR China (Traditional Han)" _chi_MO="Chinese Macau SAR China" _chi_MO_Hans="Chinese Macau SAR China (Simplified Han)" _chi_MO_Hant="Chinese Macau SAR China (Traditional Han)" _chi_SG="Chinese Singapore" _chi_SG_Hans="Chinese Singapore (Simplified Han)" _chi_TW="Chinese Taiwan" _chi_TW_Hant="Chinese Taiwan (Traditional Han)" _cop="Coptic" _cor="Cornish" _cor_GB="Cornish United Kingdom" _croatian="Croatian" _cs_CZ="Czech Czech Republic" _cs="Czech" _cy_GB="Welsh United Kingdom" _cy="Welsh" _czech="Czech" _cze_CZ="Czech Czech Republic" _cze="Czech" _da="Danish" _da_DK="Danish Denmark" _dan="Danish" _dan_DK="Danish Denmark" _danish="Danish" _dansk="Danish" _de_AT="German Austria" _de_BE="German Belgium" _de_CH="German Switzerland" _de_DE="German Germany" _de="German" _de_LI="German Liechtenstein" _de_LU="German Luxembourg" _deutsch="German" _div="Divehi" _div_MV="Divehi Maldives" _dut_BE="Dutch Belgium" _dutch="Dutch" _dut="Dutch" _dut_NL="Dutch Netherlands" _dv="Divehi" _dv_MV="Divehi Maldives" _dz_BT="Dzongkha Bhutan" _dz="Dzongkha" _dzo_BT="Dzongkha Bhutan" _dzo="Dzongkha" _ee="Ewe" _ee_GH="Ewe Ghana" _eesti="Estonian" _ee_TG="Ewe Togo" _el_CY="Greek Cyprus" _el="Greek" _el_GR="Greek Greece" _el_POLYTON="Greek" _en_AS="English American Samoa" _en_AU="English Australia" _en_BE="English Belgium" _en_BW="English Botswana" _en_BZ="English Belize" _en_CA="English Canada" _en_Dsrt="English (Deseret)" _en_Dsrt_US="English United States (Deseret)" _en="English" _eng_AS="English American Samoa" _eng_AU="English Australia" _eng_BE="English Belgium" _en_GB="English United Kingdom" _eng_BW="English Botswana" _eng_BZ="English Belize" _eng_CA="English Canada" _eng_Dsrt="English (Deseret)" _eng="English" _eng_GB="English United Kingdom" _eng_GU="English Guam" _eng_HK="English Hong Kong SAR China" _eng_IE="English Ireland" _eng_IN="English India" _eng_JM="English Jamaica" _eng_MH="English Marshall Islands" _eng_MP="English Northern Mariana Islands" _eng_MT="English Malta" _eng_NA="English Namibia" _eng_NZ="English New Zealand" _eng_PH="English Philippines" _eng_PK="English Pakistan" _eng_SG="English Singapore" _eng_Shaw="English (Shavian)" _eng_TT="English Trinidad and Tobago" _en_GU="English Guam" _eng_UM="English United States Minor Outlying Islands" _eng_US_Dsrt="English United States (Deseret)" _eng_US="English United States" _eng_US_POSIX="English United States Computer" _eng_VI="English U.S. Virgin Islands" _eng_ZA="English South Africa" _eng_ZW="English Zimbabwe" _en_HK="English Hong Kong SAR China" _en_IE="English Ireland" _en_IN="English India" _en_JM="English Jamaica" _en_MH="English Marshall Islands" _en_MP="English Northern Mariana Islands" _en_MT="English Malta" _en_NA="English Namibia" _en_NZ="English New Zealand" _en_PH="English Philippines" _en_PK="English Pakistan" _en_SG="English Singapore" _en_Shaw="English (Shavian)" _en_TT="English Trinidad and Tobago" _en_UM="English United States Minor Outlying Islands" _en_US="English United States" _en_US_POSIX="English United States Computer" _en_VI="English U.S. Virgin Islands" _en_ZA="English South Africa" _en_ZW="English Zimbabwe" _eo="Esperanto" _epo="Esperanto" _es_AR="Spanish Argentina" _es_BO="Spanish Bolivia" _es_CL="Spanish Chile" _es_CO="Spanish Colombia" _es_CR="Spanish Costa Rica" _es_DO="Spanish Dominican Republic" _es_EC="Spanish Ecuador" _es_ES="Spanish Spain" _es_GT="Spanish Guatemala" _es_HN="Spanish Honduras" _es_MX="Spanish Mexico" _es_NI="Spanish Nicaragua" _es_PA="Spanish Panama" _es_PE="Spanish Peru" _es_PR="Spanish Puerto Rico" _es_PY="Spanish Paraguay" _es="Spanish" _es_SV="Spanish El Salvador" _est_EE="Estonian Estonia" _est="Estonian" _estonian="Estonian" _es_US="Spanish United States" _es_UY="Spanish Uruguay" _es_VE="Spanish Venezuela" _et_EE="Estonian Estonia" _et="Estonian" _eu="Basque" _eu_ES="Basque Spain" _ewe="Ewe" _ewe_GH="Ewe Ghana" _ewe_TG="Ewe Togo" _fa_AF="Persian Afghanistan" _fa_IR="Persian Iran" _fao="Faroese" _fao_FO="Faroese Faroe Islands" _fa="Persian" _fi_FI="Finnish Finland" _fi="Finnish" _fil="Filipino" _fil_PH="Filipino Philippines" _fin_FI="Finnish Finland" _fin="Finnish" _finnish="finnish" _fo="Faroese" _fo_FO="Faroese Faroe Islands" _français="French" _fr_BE="French Belgium" _fr_CA="French Canada" _fr_CH="French Switzerland" _fre_BE="French Belgium" _fre_CA="French Canada" _fre_CH="French Switzerland" _fre="French" _fre_FR="French France" _fre_LU="French Luxembourg" _fre_MC="French Monaco" _french="French" _fre_SN="French Senegal" _fr="French" _fr_FR="French France" _fr_LU="French Luxembourg" _fr_MC="French Monaco" _fr_SN="French Senegal" _fur="Friulian" _fur_IT="Friulian Italy" _gaa="Ga" _gaa_GH="Ga Ghana" _ga_IE="Irish Ireland" _ga="Irish" _galego="Galician" _galician="Galician" _geo_GE="Georgian Georgia" _geo="Georgian" _ger_AT="German Austria" _ger_BE="German Belgium" _ger_CH="German Switzerland" _ger_DE="German Germany" _ger="German" _ger_LI="German Liechtenstein" _ger_LU="German Luxembourg" _german="German" _gez_ER="Geez Eritrea" _gez_ET="Geez Ethiopia" _gez="Geez" _gle_IE="Irish Ireland" _gle="Irish" _gl_ES="Galician Spain" _gl="Galician" _glg_ES="Galician Spain" _glg="Galician" _glv_GB="Manx United Kingdom" _glv="Manx" _gre_CY="Greek Cyprus" _greek="Greek" _gre="Greek" _gre_GR="Greek Greece" _gre_POLYTON="Greek" _gu="Gujarati" _gu_IN="Gujarati India" _guj="Gujarati" _guj_IN="Gujarati India" _gv_GB="Manx United Kingdom" _gv="Manx" _ha_Arab="Hausa (Arabic)" _ha_Arab_NG="Hausa Nigeria (Arabic)" _ha_Arab_SD="Hausa Sudan (Arabic)" _ha_GH="Hausa Ghana" _ha="Hausa" _ha_Latn_GH="Hausa Ghana (Latin)" _ha_Latn="Hausa (Latin)" _ha_Latn_NE="Hausa Niger (Latin)" _ha_Latn_NG="Hausa Nigeria (Latin)" _ha_NE="Hausa Niger" _ha_NG="Hausa Nigeria" _ha_SD="Hausa Sudan" _hau_Arab="Hausa (Arabic)" _hau_GH="Hausa Ghana" _hau_GH_Latn="Hausa Ghana (Latin)" _hau="Hausa" _hau_Latn="Hausa (Latin)" _hau_NE="Hausa Niger" _hau_NE_Latn="Hausa Niger (Latin)" _hau_NG_Arab="Hausa Nigeria (Arabic)" _hau_NG="Hausa Nigeria" _hau_NG_Latn="Hausa Nigeria (Latin)" _hau_SD_Arab="Hausa Sudan (Arabic)" _hau_SD="Hausa Sudan" _haw="Hawaiian" _haw_US="Hawaiian United States" _heb="Hebrew" _heb_IL="Hebrew Israel" _hebrew="Hebrew" _he="Hebrew" _he_IL="Hebrew Israel" _hi="Hindi" _hi_IN="Hindi India" _hin="Hindi" _hin_IN="Hindi India" _hr="Croatian" _hr_HR="Croatian Croatia" _hrvatski="Croatian" _hrv="Croatian" _hrv_HR="Croatian Croatia" _hu_HU="Hungarian Hungary" _hu="Hungarian" _hungarian="Hungarian" _hun_HU="Hungarian Hungary" _hun="Hungarian" _hy_AM="Armenian Armenia" _hy_AM_REVISED="Armenian Armenia Revised Orthography" _hy="Armenian" _ia="Interlingua" _ibo="Igbo" _ibo_NG="Igbo Nigeria" _ice="Icelandic" _ice_IS="Icelandic Iceland" _icelandic="Icelandic" _id_ID="Indonesian Indonesia" _id="Indonesian" _ig="Igbo" _ig_NG="Igbo Nigeria" _ii_CN="Sichuan Yi China" _iii_CN="Sichuan Yi China" _iii="Sichuan Yi" _ii="Sichuan Yi" _iku="Inuktitut" _ina="Interlingua" _ind_ID="Indonesian Indonesia" _ind="Indonesian" _is="Icelandic" _is_IS="Icelandic Iceland" _ita_CH="Italian Switzerland" _ita="Italian" _ita_IT="Italian Italy" _italian="Italian" _it_CH="Italian Switzerland" _it="Italian" _it_IT="Italian Italy" _iu="Inuktitut" _iw="Hebrew" _iw_IL="Hebrew Israel" _ja="Japanese" _ja_JP="Japanese Japan" _japanese="Japanese" _jpn="Japanese" _jpn_JP="Japanese Japan" _ka_GE="Georgian Georgia" _ka="Georgian" _kaj="Jju" _kaj_NG="Jju Nigeria" _kal_GL="Kalaallisut Greenland" _kal="Kalaallisut" _kam="Kamba" _kam_KE="Kamba Kenya" _kan_IN="Kannada India" _kan="Kannada" _kaz_Cyrl="Kazakh (Cyrillic)" _kaz="Kazakh" _kaz_KZ_Cyrl="Kazakh Kazakhstan (Cyrillic)" _kaz_KZ="Kazakh Kazakhstan" _kcg_NG="Tyap Nigeria" _kcg="Tyap" _kfo_CI="Koro Ivory Coast" _kfo="Koro" _khm_KH="Khmer Cambodia" _khm="Khmer" _kin="Kinyarwanda" _kin_RW="Kinyarwanda Rwanda" _kir_KG="Kirghiz Kyrgyzstan" _kir="Kirghiz" _kk_Cyrl="Kazakh (Cyrillic)" _kk_Cyrl_KZ="Kazakh Kazakhstan (Cyrillic)" _kk="Kazakh" _kk_KZ="Kazakh Kazakhstan" _kl_GL="Kalaallisut Greenland" _kl="Kalaallisut" _km_KH="Khmer Cambodia" _km="Khmer" _kn_IN="Kannada India" _kn="Kannada" _kok_IN="Konkani India" _kok="Konkani" _ko="Korean" _ko_KR="Korean South Korea" _korean="Korean" _kor="Korean" _kor_KR="Korean South Korea" _kpe_GN="Kpelle Guinea" _kpe="Kpelle" _kpe_LR="Kpelle Liberia" _ku_Arab="Kurdish (Arabic)" _ku="Kurdish" _ku_Latn="Kurdish (Latin)" _ku_Latn_TR="Kurdish Turkey (Latin)" _kur_Arab="Kurdish (Arabic)" _kur="Kurdish" _kur_Latn="Kurdish (Latin)" _kur_TR="Kurdish Turkey" _kur_TR_Latn="Kurdish Turkey (Latin)" _ku_TR="Kurdish Turkey" _kw="Cornish" _kw_GB="Cornish United Kingdom" _ky_KG="Kirghiz Kyrgyzstan" _ky="Kirghiz" _lao_LA="Lao Laos" _lao="Lao" _lav="Latvian" _lav_LV="Latvian Latvia" _lin_CD="Lingala Congo - Kinshasa" _lin_CG="Lingala Congo - Brazzaville" _lin="Lingala" _lithuanian="Lithuanian" _lit="Lithuanian" _lit_LT="Lithuanian Lithuania" _ln_CD="Lingala Congo - Kinshasa" _ln_CG="Lingala Congo - Brazzaville" _ln="Lingala" _lo_LA="Lao Laos" _lo="Lao" _lt="Lithuanian" _lt_LT="Lithuanian Lithuania" _lv="Latvian" _lv_LV="Latvian Latvia" _mac="Macedonian" _mac_MK="Macedonian Macedonia" _mal_IN="Malayalam India" _mal="Malayalam" _mar_IN="Marathi India" _mar="Marathi" _may_BN="Malay Brunei" _may="Malay" _may_MY="Malay Malaysia" _mk="Macedonian" _mk_MK="Macedonian Macedonia" _ml_IN="Malayalam India" _ml="Malayalam" _mlt="Maltese" _mlt_MT="Maltese Malta" _mn_CN="Mongolian China" _mn_Cyrl_MN="Mongolian Mongolia (Cyrillic)" _mn_Cyrl="Mongolian (Cyrillic)" _mn_MN="Mongolian Mongolia" _mn_Mong_CN="Mongolian China (Mongolian)" _mn_Mong="Mongolian (Mongolian)" _mn="Mongolian" _mol="Moldavian" _mo="Moldavian" _mon_CN_Mong="Mongolian China (Mongolian)" _mon_CN="Mongolian China" _mon_Cyrl="Mongolian (Cyrillic)" _mon_MN_Cyrl="Mongolian Mongolia (Cyrillic)" _mon_MN="Mongolian Mongolia" _mon_Mong="Mongolian (Mongolian)" _mon="Mongolian" _mr_IN="Marathi India" _mr="Marathi" _ms_BN="Malay Brunei" _ms="Malay" _ms_MY="Malay Malaysia" _mt="Maltese" _mt_MT="Maltese Malta" _my="Burmese" _my_MM="Burmese Myanmar" _nbl="South Ndebele" _nbl_ZA="South Ndebele South Africa" _nb_NO="Norwegian BokmÃ¥l Norway" _nb="Norwegian BokmÃ¥l" _ne_IN="Nepali India" _ne="Nepali" _ne_NP="Nepali Nepal" _nep_IN="Nepali India" _nep="Nepali" _nep_NP="Nepali Nepal" _nl_BE="Dutch Belgium" _nl="Dutch" _nl_NL="Dutch Netherlands" _nn_NO="Norwegian Nynorsk Norway" _nn="Norwegian Nynorsk" _nno_NO="Norwegian Nynorsk Norway" _nno="Norwegian Nynorsk" _nob_NO="Norwegian BokmÃ¥l Norway" _nob="Norwegian BokmÃ¥l" _no_NO="Norwegian Nynorsk Norway" _no_NO_NY="Norwegian Nynorsk Norway" _no="Norwegian" _no="Norwegian Nynorsk" _nor="Norwegian" _norwegian="Norwegian" _nr="South Ndebele" _nr_ZA="South Ndebele South Africa" _nso="Northern Sotho" _nso_ZA="Northern Sotho South Africa" _nya_MW="Nyanja Malawi" _nya="Nyanja" _ny_MW="Nyanja Malawi" _nynorsk="Norwegian Nynorsk" _ny="Nyanja" _om_ET="Oromo Ethiopia" _om_KE="Oromo Kenya" _om="Oromo" _ori_IN="Oriya India" _or_IN="Oriya India" _ori="Oriya" _orm_ET="Oromo Ethiopia" _orm_KE="Oromo Kenya" _orm="Oromo" _or="Oriya" _pa_Arab_PK="Punjabi Pakistan (Arabic)" _pa_Arab="Punjabi (Arabic)" _pa_Guru_IN="Punjabi India (Gurmukhi)" _pa_Guru="Punjabi (Gurmukhi)" _pa_IN="Punjabi India" _pan_Arab="Punjabi (Arabic)" _pan_Guru="Punjabi (Gurmukhi)" _pan_IN_Guru="Punjabi India (Gurmukhi)" _pan_IN="Punjabi India" _pan_PK_Arab="Punjabi Pakistan (Arabic)" _pan_PK="Punjabi Pakistan" _pan="Punjabi" _pa_PK="Punjabi Pakistan" _pa="Punjabi" _per_AF="Persian Afghanistan" _per_IR="Persian Iran" _per="Persian" _pl_PL="Polish Poland" _pl="Polish" _polish="Polish" _pol_PL="Polish Poland" _pol="Polish" _por_BR="Portuguese Brazil" _por="Portuguese" _por_PT="Portuguese Portugal" _portuguese="Portuguese" _POSIX="English United States Computer" _ps_AF="Pashto Afghanistan" _ps="Pashto" _pt_BR="Portuguese Brazil" _pt="Portuguese" _pt_PT="Portuguese Portugal" _pus_AF="Pashto Afghanistan" _pus="Pashto" _romanian="Romanian" _ro_MD="Romanian Moldova" _root="Root" _ro="Romanian" _ro_RO="Romanian Romania" _rum_MD="Romanian Moldova" _rum="Romanian" _rum_RO="Romanian Romania" _ru_RU="Russian Russia" _ru="Russian" _rus_RU="Russian Russia" _rus="Russian" _russian="Russian" _rus_UA="Russian Ukraine" _ru_UA="Russian Ukraine" _rw="Kinyarwanda" _rw_RW="Kinyarwanda Rwanda" _sa_IN="Sanskrit India" _san_IN="Sanskrit India" _san="Sanskrit" _sa="Sanskrit" _se_FI="Northern Sami Finland" _se_NO="Northern Sami Norway" _se="Northern Sami" _sh_BA="Serbo-Croatian Bosnia and Herzegovina" _sh_CS="Serbo-Croatian Serbia and Montenegro" _sh="Serbo-Croatian" _sh_YU="Serbo-Croatian" _sid_ET="Sidamo Ethiopia" _sid="Sidamo" _si_LK="Sinhala Sri Lanka" _sin_LK="Sinhala Sri Lanka" _sin="Sinhala" _si="Sinhala" _sk_SK="Slovak Slovakia" _sk="Slovak" _slo_SK="Slovak Slovakia" _slo="Slovak" _slovak="Slovak" _slovene="Slovenian" _slovenian="Slovenian" _sl_SI="Slovenian Slovenia" _sl="Slovenian" _slv_SI="Slovenian Slovenia" _slv="Slovenian" _sme_FI="Northern Sami Finland" _sme_NO="Northern Sami Norway" _sme="Northern Sami" _so_DJ="Somali Djibouti" _so_ET="Somali Ethiopia" _so_KE="Somali Kenya" _som_DJ="Somali Djibouti" _som_ET="Somali Ethiopia" _som_KE="Somali Kenya" _som="Somali" _som_SO="Somali Somalia" _so="Somali" _so_SO="Somali Somalia" _sot_LS="Southern Sotho Lesotho" _sot="Southern Sotho" _sot_ZA="Southern Sotho South Africa" _spa_AR="Spanish Argentina" _spa_BO="Spanish Bolivia" _spa_CL="Spanish Chile" _spa_CO="Spanish Colombia" _spa_CR="Spanish Costa Rica" _spa_DO="Spanish Dominican Republic" _spa_EC="Spanish Ecuador" _spa_ES="Spanish Spain" _spa_GT="Spanish Guatemala" _spa_HN="Spanish Honduras" _spa_MX="Spanish Mexico" _spanish="Spanish" _spa_NI="Spanish Nicaragua" _spa_PA="Spanish Panama" _spa_PE="Spanish Peru" _spa_PR="Spanish Puerto Rico" _spa_PY="Spanish Paraguay" _spa="Spanish" _spa_SV="Spanish El Salvador" _spa_US="Spanish United States" _spa_UY="Spanish Uruguay" _spa_VE="Spanish Venezuela" _sq_AL="Albanian Albania" _sq="Albanian" _sr_BA="Serbian Bosnia and Herzegovina" _sr_CS="Serbian Serbia and Montenegro" _sr_Cyrl_BA="Serbian Bosnia and Herzegovina (Cyrillic)" _sr_Cyrl_CS="Serbian Serbia and Montenegro (Cyrillic)" _sr_Cyrl_ME="Serbian Montenegro (Cyrillic)" _sr_Cyrl_RS="Serbian Serbia (Cyrillic)" _sr_Cyrl="Serbian (Cyrillic)" _sr_Cyrl_YU="Serbian (Cyrillic)" _sr_Latn_BA="Serbian Bosnia and Herzegovina (Latin)" _sr_Latn_CS="Serbian Serbia and Montenegro (Latin)" _sr_Latn_ME="Serbian Montenegro (Latin)" _sr_Latn_RS="Serbian Serbia (Latin)" _sr_Latn="Serbian (Latin)" _sr_Latn_YU="Serbian (Latin)" _sr_ME="Serbian Montenegro" _srp_BA_Cyrl="Serbian Bosnia and Herzegovina (Cyrillic)" _srp_BA_Latn="Serbian Bosnia and Herzegovina (Latin)" _srp_BA="Serbian Bosnia and Herzegovina" _srp_CS_Cyrl="Serbian Serbia and Montenegro (Cyrillic)" _srp_CS_Latn="Serbian Serbia and Montenegro (Latin)" _srp_CS="Serbian Serbia and Montenegro" _srp_Cyrl="Serbian (Cyrillic)" _srp_Latn="Serbian (Latin)" _srp_ME_Cyrl="Serbian Montenegro (Cyrillic)" _srp_ME_Latn="Serbian Montenegro (Latin)" _srp_ME="Serbian Montenegro" _srp_RS_Cyrl="Serbian Serbia (Cyrillic)" _srp_RS_Latn="Serbian Serbia (Latin)" _srp_RS="Serbian Serbia" _srp="Serbian" _srp_YU_Cyrl="Serbian (Cyrillic)" _srp_YU_Latn="Serbian (Latin)" _srp_YU="Serbian" _sr_RS="Serbian Serbia" _sr="Serbian" _sr_YU="Serbian" _ss="Swati" _ss_SZ="Swati Swaziland" _ssw="Swati" _ssw_SZ="Swati Swaziland" _ssw_ZA="Swati South Africa" _ss_ZA="Swati South Africa" _st_LS="Southern Sotho Lesotho" _st="Southern Sotho" _st_ZA="Southern Sotho South Africa" _sv_FI="Swedish Finland" _sv_SE="Swedish Sweden" _sv="Swedish" _swa_KE="Swahili Kenya" _swa="Swahili" _swa_TZ="Swahili Tanzania" _swedish="Swedish" _swe_FI="Swedish Finland" _swe_SE="Swedish Sweden" _swe="Swedish" _sw_KE="Swahili Kenya" _sw="Swahili" _sw_TZ="Swahili Tanzania" _syr="Syriac" _syr_SY="Syriac Syria" _ta_IN="Tamil India" _tam_IN="Tamil India" _tam="Tamil" _ta="Tamil" _tat_RU="Tatar Russia" _tat="Tatar" _te_IN="Telugu India" _tel_IN="Telugu India" _tel="Telugu" _te="Telugu" _tg_Cyrl="Tajik (Cyrillic)" _tg_Cyrl_TJ="Tajik Tajikistan (Cyrillic)" _tgk_Cyrl="Tajik (Cyrillic)" _tgk="Tajik" _tgk_TJ_Cyrl="Tajik Tajikistan (Cyrillic)" _tgk_TJ="Tajik Tajikistan" _tgl="Tagalog" _tg="Tajik" _tg_TJ="Tajik Tajikistan" _thai="Thai" _tha="Thai" _tha_TH="Thai Thailand" _th="Thai" _th_TH="Thai Thailand" _ti_ER="Tigrinya Eritrea" _ti_ET="Tigrinya Ethiopia" _tig_ER="Tigre Eritrea" _tig="Tigre" _tir_ER="Tigrinya Eritrea" _tir_ET="Tigrinya Ethiopia" _tir="Tigrinya" _ti="Tigrinya" _tl="Tagalog" _tn="Tswana" _tn_ZA="Tswana South Africa" _ton="Tonga" _ton_TO="Tonga Tonga" _to="Tonga" _to_TO="Tonga Tonga" _tr_TR="Turkish Turkey" _tr="Turkish" _tsn="Tswana" _tsn_ZA="Tswana South Africa" _tso="Tsonga" _tso_ZA="Tsonga South Africa" _ts="Tsonga" _ts_ZA="Tsonga South Africa" _tt_RU="Tatar Russia" _tt="Tatar" _turkish="Turkish" _tur_TR="Turkish Turkey" _tur="Turkish" _ug_Arab_CN="Uighur China (Arabic)" _ug_Arab="Uighur (Arabic)" _ug_CN="Uighur China" _ug="Uighur" _uig_Arab="Uighur (Arabic)" _uig_CN_Arab="Uighur China (Arabic)" _uig_CN="Uighur China" _uig="Uighur" _ukr_UA="Ukrainian Ukraine" _ukr="Ukrainian" _uk_UA="Ukrainian Ukraine" _uk="Ukrainian" _urd_IN="Urdu India" _urd_PK="Urdu Pakistan" _urd="Urdu" _ur_IN="Urdu India" _ur_PK="Urdu Pakistan" _ur="Urdu" _uz_AF="Uzbek Afghanistan" _uz_Arab_AF="Uzbek Afghanistan (Arabic)" _uz_Arab="Uzbek (Arabic)" _uzb_AF_Arab="Uzbek Afghanistan (Arabic)" _uzb_AF="Uzbek Afghanistan" _uzb_Arab="Uzbek (Arabic)" _uzb_Cyrl="Uzbek (Cyrillic)" _uzb_Latn="Uzbek (Latin)" _uzb="Uzbek" _uzb_UZ_Cyrl="Uzbek Uzbekistan (Cyrillic)" _uzb_UZ_Latn="Uzbek Uzbekistan (Latin)" _uzb_UZ="Uzbek Uzbekistan" _uz_Cyrl="Uzbek (Cyrillic)" _uz_Cyrl_UZ="Uzbek Uzbekistan (Cyrillic)" _uz_Latn="Uzbek (Latin)" _uz_Latn_UZ="Uzbek Uzbekistan (Latin)" _uz="Uzbek" _uz_UZ="Uzbek Uzbekistan" _ven="Venda" _ven_ZA="Venda South Africa" _ve="Venda" _ve_ZA="Venda South Africa" _vie="Vietnamese" _vie_VN="Vietnamese Vietnam" _vi="Vietnamese" _vi_VN="Vietnamese Vietnam" _wal_ET="Walamo Ethiopia" _wal="Walamo" _wel_GB="Welsh United Kingdom" _wel="Welsh" _wo_Latn_SN="Wolof Senegal (Latin)" _wo_Latn="Wolof (Latin)" _wol_Latn="Wolof (Latin)" _wol_SN_Latn="Wolof Senegal (Latin)" _wol_SN="Wolof Senegal" _wol="Wolof" _wo_SN="Wolof Senegal" _wo="Wolof" _xho="Xhosa" _xho_ZA="Xhosa South Africa" _xh="Xhosa" _xh_ZA="Xhosa South Africa" _yo_NG="Yoruba Nigeria" _yor_NG="Yoruba Nigeria" _yor="Yoruba" _yo="Yoruba" _zh="Chinese" _zh_CN="Chinese China" _zh_Hans="Chinese (Simplified Han)" _zh_Hans_CN="Chinese China (Simplified Han)" _zh_Hans_HK="Chinese Hong Kong SAR China (Simplified Han)" _zh_Hans_MO="Chinese Macau SAR China (Simplified Han)" _zh_Hans_SG="Chinese Singapore (Simplified Han)" _zh_Hant="Chinese (Traditional Han)" _zh_Hant_HK="Chinese Hong Kong SAR China (Traditional Han)" _zh_Hant_MO="Chinese Macau SAR China (Traditional Han)" _zh_Hant_TW="Chinese Taiwan (Traditional Han)" _zh_HK="Chinese Hong Kong SAR China" _zh_MO="Chinese Macau SAR China" _zh_SG="Chinese Singapore" _zh_TW="Chinese Taiwan" _zul_ZA="Zulu South Africa" _zul="Zulu" _zu_ZA="Zulu South Africa" _zu="Zulu" phpsysinfo-3.2.1/data/osnames.ini000066400000000000000000000007121247443170600170060ustar00rootroot00000000000000[Android] 1.0="Apple Pie" 1.1="Banana Bread" 1.5="Cupcake" 1.6="Donut" 2.0="Eclair" 2.1="Eclair" 2.2="Froyo" 2.3="Gingerbread" 3.0="Honeycomb" 3.1="Honeycomb" 3.2="Honeycomb" 4.0="Ice Cream Sandwich" 4.1="Jelly Bean" 4.2="Jelly Bean" 4.3="Jelly Bean" 4.4="KitKat" 5.0="Lollipop" [OS X] 10.0="Cheetah" 10.1="Puma" 10.2="Jaguar" 10.3="Panther" 10.4="Tiger" 10.5="Leopard" 10.6="Snow Leopard" 10.7="Lion" 10.8="Mountain Lion" 10.9="Mavericks" 10.10="Yosemite" phpsysinfo-3.2.1/gfx/000077500000000000000000000000001247443170600145135ustar00rootroot00000000000000phpsysinfo-3.2.1/gfx/ajax-loader.gif000066400000000000000000000006241247443170600173730ustar00rootroot00000000000000GIF89a+ ñÿÿÿEâ£ÎðEâ!ÿ NETSCAPE2.0!þCreated with ajaxload.info!ù ,+ 2„ŽË–ÙØƒóÅ ÞVóË…à6†XY¡f'}Þš¾§ g-IׇÊ.úijù>¸  2L!ù ,+ =ÄŽË ac±š„Ǭ|ó˜aÞ÷Œd˜˜ŸÊ¡JCJp,¸kͱ­é$²eoXò}ŽÊNÓâš,bRǯ!ù ,+ =„ŽË0ac©šj[Üoâ ·yáyŒ¤Ô ¨º¦ ÂëLc6‰çÉÎéùRš˜¬5Ì0ŒGÊéò™,bR¨®!ù ,+ @„ŽË–ÙØ˜”º~±ú¹eL¨4ŸGQ*t'Å®©û±6›µý²ã‘dC]íæ+JvÈE¼`"Îú;phpsysinfo-3.2.1/gfx/ajaxLoader.gif000066400000000000000000000110631247443170600172550ustar00rootroot00000000000000GIF89a++³ÿÿÿóó󦦦™™™ŒŒŒÚÚÚååå¾¾¾ëëëÌÌ̲²²ÓÓÓùùùÄÄÄÿÿÿ!ÿ NETSCAPE2.0!ù ,++ÿÈIk%ŽË»çŒÎgvH3Yž°dRn3C­T9¬P#p$aŒ¦0&A¥ÉPL@“RÊ­r¨ ’hv±ÚJ= V"ƒx£’Ð à¼!+IÄÿ <G|o { ‡&ŠrO'~Š‚–0qk›1Œ¡¥¦§& «¬¬fR±²³­µN³¹¶­–º´¼«•|¿²¨Çȧ`J¯;Ë1) V°ÒÒà ×â†: ÛçÐâìäBçÛÌ2ì× ÌóðZñÝëØ5ØÂ Atg ( y4×à‹žhd¦p¡»„ÿf(ŒÒ±ÁÅB}¨”ÀÀãÁo0-,89'åJ.½¹1y±¢Ê›ê'@ —q…7ax—¡YŒš‘m ¡¡ ¥ŽOª¡,}§7ª ¶|Z– p¾ÃNÃÆ"ÉÊËÇ ÏÐÐËÔœÃÑØ ÕÌÍÙÑÛÊÍÞÐâæçèÆ Šé, í" ïïòd õõ¬ø ûê±!¢§Cª_ãµ!  ˜…x’p@ ‘2*Ø1¢€ ñn„‰@@ £ƒ{¨$ AĈIô À$$+YJhðòã±&ÄÌ9€—¬µ`r¢K^˜É"AЉP =x©VI²J0 •ª² ˆL¹rÀ®Z  Ðïi[ ìŽMœ Ö_؈Ã"!ù ,)+ÿðÉIë4ÙÍ9ØÖ0VhX ‚’ÌÁG©i±Â=W8J @,ð(&0T)êŽBß9A8¡íõJœì$ù“x W`½ñ½¼ÎK>YÛ+ä—í]ÜÝFvƒ6'$hU ~„w‚<a_— Ylb—˜•u —~ƒ Šj…X®«X¢µ¸¹<½¾¾ º¿ÄÂÅ¿Çɽ ËÐÑÒ¬™P ´G ¨ « ÜÜ ·ãïÏbèè \ïúñôèè'€Î‘üœ£gìA>}\ è2"4ü“€@œÁs(4 @`b‡‹À¢˜0ƒ÷È!I Þ€›& m¥Ì hæÄ™ÓâÅ1¡Ð$@((Cb €&Æ N'عji…¬ ^leM²ÀNàŠ¥jI jñ 8 FƒR±âܰÀ p÷N ¬sU!ù ,++ÿðÉIk 8ØÍ{Ïš'r@i[8n¥yeb ê:µî„VFoØ\î±›øfÀ ŽR$“¡fôÕ ©¤(óa£K"•ñü*[AIYA Œ$šÃô⺂¾€0{0{{~+‚ƒzW…ˆz}‹"‡z?+“•@Š˜fŸ  ”f ¥¦¦ ž¡¡›@§¯ ««‹°§ª²­6µ¦œ¾¿À _~  I_Ò º ÍÙ XÈÓÒ  ÙãÛXÑÞÒ£ãÍ Xå èñâãêÏ} ï*$˜fà($`¬žG *èW¡= ©80dXN€G[Y$<äÀF>¢|°@"Å/6 –ò#…šÙ8òÊ "­uX óQMpT…€mR@‹†+'ü¨€) ²j•Zf!Q‘Ûð±'!ù ,++ÿðÉIkØÍ{Ïš'ŽWfLH®h0î.ÅÀ°:&…ûQMrÃé‚›!à'#!XÃ_`•pžÂÞƒ¹iN‡øà]I_ìä n»âÑ@7L¿á¶x`˜1¼ utj zb e$‚ƒtŒk‰ qtwŠHƒGH „’Hf«­#±²²®·¸¹³¼µ¹¿¼½®ÀºÂ´ÄÅ·µÌÍΫ};Ò; …" ­ÙÙ¦"ßç q ââä çñéAìâñß™ÜÙ²·À ¼x *(¨ä¡À…¬ËfM‚·,,À‘!ChÀ©€ À  „m›tgç+Ã"ž°Áë})žLú gùÔS¸úúð<ó îd’Êùó$:;Ó»á§`Z$\»v·gnŽ`NL òy´Pßä$åb‘@.G²§gÿ˜Hྠøý㱘‘¿xsÇ܃ƒP*¡nÞÄóì³}}”.^$ÞÑÝävOßW€_ˆ|3900ꞥîvcŽ£Û6‘H„ßfYXSSTmßõëttw?ÿ‚Hü¾ô…B‡VG£Z~fïδ 3óþûLNNrèÕW±ð=ý4æúõgfˆE£ÖZÓ¼råà®Zíå/¥‹è/e2Ïû³Yn‹xJ%rSSP*ÝòªñÒØn",.ÿÏ–%¯»^Ç_(Ð ýd‡ÈkVªt€š@›Ë²ðww£r9êo¾y+V޳ôóhI+zËûËÆ–b«ù|xƒAÄ0P…‚áºSY~F©ÊïE&©ÕŽxÃሠ”jo—¦ÒFë8K†¤e°9ÖµÇiõE)ÊùüÂõ7¦ÿØôþŽçÀˆˆ? «jÀ¿À³VÌ ˜6xj ×AWàRÍ4 8Ô]`»ÁÖ¡bBÙåÛ¡â®Â”ʭxÝélè oÒ:Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+q;Ç^+ Š Ò¦àIEND®B`‚phpsysinfo-3.2.1/gfx/bullet_toggle_minus.png000066400000000000000000000003171247443170600212650ustar00rootroot00000000000000‰PNG  IHDRµú7êgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<aIDAT(ÏcøÏ€2ÐQÁ‘½ûÿïú¿åÿúÿ+ÿ/Þ‹EÁÞÿ‡àpÖ, ¶%Ö‚á¡ÿ°)X”€€CÿÛ±)XŒdB=6³ÜP†MÁ„u]ÿ[€z+ÿ—üÏ_70!I¶È“zS5¯…IEND®B`‚phpsysinfo-3.2.1/gfx/bullet_toggle_plus.png000066400000000000000000000003211247443170600211100ustar00rootroot00000000000000‰PNG  IHDRµú7êgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<cIDAT(ÏcøÏ€2ÐQÁ‘½ûÿïú¿åÿúÿ+ÿ/Þ‹EÁÞÿ‡àpÖ, ¶%ÖþÿćþOÀ¦` PýoǦ`1’ õØÌBrC6Öuýoê­ü_ò?ÝÀ„$Ù }J ƦgIEND®B`‚phpsysinfo-3.2.1/gfx/close.gif000066400000000000000000000001061247443170600163040ustar00rootroot00000000000000GIF89a €ÿÿÿ!ù, „ËmÚŠº§Æ.sV}ÖeÞøœZ(aÉ[;phpsysinfo-3.2.1/gfx/favicon.ico000066400000000000000000000353561247443170600166500ustar00rootroot00000000000000 h6 ¨ž00 ¨%F(  @»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹ûÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûÿÿÿÿÿÿÿÿÿÿÿÿÿÿûû)))ÿÿÿÿÿÿÿ--ÿ22ÿ""ÿÿÿ44ÿ**ÿûûÑÑÑÿFFFÿÿÿÿÿttÿnnÿhhÿ€€ ÿIIÿÿZZÿTTÿûûÑÑÑÿFFFÿÿÿÿÿÿÿÿ33ÿ€€ ÿÿTTÿWWÿûûÑÑÑÿ‰‰‰ÿcccÿEEEÿÿÿÿÿÿTTÿssÿÿTTÿWWÿûûÑÑÑÿ¡¡¡ÿ“““ÿÊÊÊÿ½½½ÿÿÿMMÿ}} ÿssÿ++ÿÿPPÿPPÿûûÑÑÑÿFFFÿÿÿÞÞÞÿPPPÿ[[ÿuuÿ33ÿÿÿÿTTÿWWÿûûÑÑÑÿFFFÿÿ!!!ÿâââÿLLLÿrrÿ==ÿÿÿÿ,,ÿBBÿOOÿûûÑÑÑÿ³³³ÿ¤¤¤ÿ×××ÿ©©©ÿÿJJÿ|| ÿVVÿaaÿIIÿAAÿ,,ÿBBÿ++ûû;;;ÿWWWÿ[[[ÿ;;;ÿÿ ÿ ÿ55ÿJJÿ@@ÿ$$ÿ!!ÿQQÿFFÿûû!!!ÿ$$$ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ"""û)))û***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ)))û///û///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///ÿ///û444½333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ333ÿ444»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ( @ €Q×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×OÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½õÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõõÿ111ÿ>>>ÿ(((ÿÿÿÿÿÿÿÿÿÿÿ!!ÿ99ÿGGÿNNÿFFÿ44ÿÿÿÿÿÿ99ÿccÿQQÿ##ÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿÿÿÿÿÿccÿ‰‰ ÿŽŽ ÿŽŽ ÿŒŒ ÿ ÿŽŽ ÿ ÿEEÿÿÿÿyy ÿLLÿffÿJJÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿÿÿÿÿÿddÿ ÿWWÿDDÿ??ÿFFÿjjÿ‰‰ ÿƒƒ ÿ??ÿÿÿvvÿ,,ÿEEÿ\\ÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿVVÿŽŽ ÿjjÿÿÿuuÿ::ÿ__ÿ]]ÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@@ÿŽŽ ÿyy ÿÿÿuuÿ++ÿCCÿ]]ÿÿõõÿ©©©ÿùùùÿxxxÿ###ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ]]ÿŽŽ ÿjjÿÿÿuuÿ++ÿCCÿ]]ÿÿõõÿ©©©ÿùùùÿÒÒÒÿ¸¸¸ÿ±±±ÿ¢¢¢ÿ†††ÿ[[[ÿÿÿÿÿÿÿÿÿÿÿRRÿ„„ ÿŠŠ ÿJJÿÿÿuuÿ;;ÿ__ÿ]]ÿÿõõÿ©©©ÿùùùÿäääÿÖÖÖÿÚÚÚÿáááÿõõõÿùùùÿÌÌÌÿVVVÿÿÿÿÿÿ33ÿXXÿ€€ ÿŽŽ ÿˆˆ ÿVVÿÿÿÿuuÿ++ÿCCÿ]]ÿÿõõÿ©©©ÿùùùÿŠŠŠÿAAAÿEEEÿMMMÿqqqÿËËËÿøøøÿØØØÿ'''ÿÿÿ""ÿaaÿ€€ ÿŽŽ ÿŽŽ ÿrrÿDDÿÿÿÿÿuuÿ++ÿCCÿ]]ÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿ(((ÿÞÞÞÿùùùÿtttÿÿ((ÿssÿŽŽ ÿ„„ ÿ__ÿ55ÿÿÿÿÿÿÿuuÿ;;ÿ^^ÿ]]ÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿÿ«««ÿùùùÿ˜˜˜ÿÿEEÿ‹‹ ÿ€€ ÿCCÿÿÿÿÿÿÿÿÿuuÿ++ÿDDÿ]]ÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿÿ±±±ÿùùùÿ”””ÿÿZZÿŽŽ ÿ__ÿÿÿÿÿÿÿÿÿ''ÿrrÿ''ÿ??ÿhhÿÿõõÿ©©©ÿùùùÿrrrÿÿÿÿÿ777ÿæææÿùùùÿjjjÿÿRRÿŽŽ ÿ``ÿÿÿÿÿÿÿÿÿXXÿQQÿÿ&&ÿppÿ//ÿõõÿ©©©ÿùùùÿ™™™ÿWWWÿVVVÿ]]]ÿŽŽŽÿßßßÿ÷÷÷ÿÄÄÄÿÿÿ77ÿƒƒ ÿ…… ÿRRÿ11ÿ//ÿ66ÿBBÿSSÿ ÿÿmmÿ//ÿÿÿ[[ÿEEÿõõÿ©©©ÿùùùÿòòòÿìììÿëëëÿòòòÿùùùÿøøøÿªªªÿAAAÿÿÿÿQQÿ ÿŒŒ ÿ~~ ÿ|| ÿƒƒ ÿ‹‹ ÿ ÿ22ÿÿ^^ÿLLÿÿ$$ÿnnÿ22ÿõõÿFFFÿsssÿÿ™™™ÿÿ“““ÿoooÿ;;;ÿÿÿÿÿÿÿ55ÿ\\ÿmmÿppÿggÿXXÿ22ÿÿÿ%%ÿooÿllÿooÿUUÿÿõõÿÿÿÿÿÿÿ ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ$$ ÿ'' ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ!!!ÿ,,ÿ<<ÿ55ÿ ÿÿõõÿÿÿ!!!ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ"""ÿõõÿ$$$ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ&&&ÿ%%%õ&&&õ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((õ+++õ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ+++ÿ***õ...õ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ---õ000õ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ///õ333Å222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ555Ã666U666Û444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ555Û888U(0` €% uëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿës$$$iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿc½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹ïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$$ÿÿÿÿÿÿññÿÿ333ÿQQQÿQQQÿ;;;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ**ÿCCÿWWÿaaÿjjÿddÿXXÿKKÿ11ÿÿÿÿÿÿÿÿ22ÿvvÿ ÿ‚‚ ÿCCÿÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿHHÿzzÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿqqÿ99ÿÿÿÿÿÿttÿ‡‡ ÿFFÿkkÿˆˆ ÿÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmmÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿ‰‰ ÿ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿ ÿ>>ÿÿÿÿÿ‡‡ ÿXXÿÿ((ÿŽŽ ÿ@@ÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAÿ ÿnnÿEEÿ))ÿÿÿÿ''ÿGGÿ{{ ÿŽŽ ÿŽŽ ÿ‰‰ ÿ--ÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ,,ÿÿÿÿÿÿÿÿÿ##ÿ~~ ÿŽŽ ÿŽŽ ÿRRÿÿÿÿŠŠ ÿMMÿ<<ÿ]]ÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿXXÿŽŽ ÿŽŽ ÿhhÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRRÿŽŽ ÿŽŽ ÿssÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿnnÿŽŽ ÿŽŽ ÿ__ÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿ«««ÿ666ÿ666ÿ,,,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBBÿ ÿŽŽ ÿŽŽ ÿJJÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿôôôÿßßßÿÉÉÉÿ¥¥¥ÿgggÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿVVÿŒŒ ÿŽŽ ÿŽŽ ÿ ÿ ÿÿÿÿŠŠ ÿMMÿ??ÿ]]ÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿáááÿbbbÿÿÿÿÿÿÿÿÿÿÿ//ÿ]]ÿ‡‡ ÿŽŽ ÿŽŽ ÿŽŽ ÿ‹‹ ÿ44ÿÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿÐÐÐÿ‘‘‘ÿ‘‘‘ÿ™™™ÿ§§§ÿ¹¹¹ÿëëëÿùùùÿùùùÿùùùÿøøøÿuuuÿÿÿÿÿÿÿÿEEÿuuÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿttÿ,,ÿÿÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿZZZÿáááÿùùùÿùùùÿòòòÿ888ÿÿÿÿÿ..ÿuuÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿuuÿCCÿÿÿÿÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿ:::ÿçççÿùùùÿùùùÿÿÿÿÿ++ÿ‰‰ ÿŽŽ ÿŽŽ ÿŽŽ ÿŒŒ ÿddÿ33ÿÿÿÿÿÿÿÿÿÿŠŠ ÿMMÿ??ÿZZÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿ¤¤¤ÿùùùÿùùùÿÉÉÉÿÿÿÿxxÿŽŽ ÿŽŽ ÿŽŽ ÿccÿ&&ÿÿÿÿÿÿÿÿÿÿÿÿŠŠ ÿMMÿÿ!!ÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿtttÿùùùÿùùùÿÞÞÞÿÿÿ**ÿŽŽ ÿŽŽ ÿŽŽ ÿQQÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠŠ ÿMMÿÿÿŽŽ ÿEEÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿ|||ÿùùùÿùùùÿÚÚÚÿÿÿ??ÿŽŽ ÿŽŽ ÿ‡‡ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠŠ ÿLLÿÿÿŽŽ ÿHHÿÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿÿ±±±ÿùùùÿùùùÿÀÀÀÿÿÿCCÿŽŽ ÿŽŽ ÿvvÿÿÿÿÿÿÿÿÿÿÿÿÿÿSSÿŒŒ ÿ22ÿÿÿttÿ ÿ ÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿÿÿ\\\ÿôôôÿùùùÿùùùÿ|||ÿÿÿ..ÿŽŽ ÿŽŽ ÿ‰‰ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿˆˆ ÿWWÿÿÿÿ''ÿ ÿGGÿÿññÿÿÿùùùÿùùùÿŸŸŸÿÿÿÿÿÿ???ÿÿôôôÿùùùÿùùùÿàààÿ&&&ÿÿÿÿ‡‡ ÿŽŽ ÿŽŽ ÿhhÿÿÿÿÿÿÿ%%ÿRRÿ ÿÿÿ//ÿŽŽ ÿ77ÿÿÿÿÿzzÿ^^ÿÿññÿÿÿùùùÿùùùÿíííÿ×××ÿÐÐÐÿËËËÿÙÙÙÿêêêÿùùùÿùùùÿùùùÿùùùÿçççÿHHHÿÿÿÿÿ@@ÿŽŽ ÿŽŽ ÿŽŽ ÿˆˆ ÿeeÿWWÿZZÿiiÿyyÿŒŒ ÿŽŽ ÿHHÿÿÿ%%ÿŽŽ ÿ@@ÿÿÿÿÿ ÿUUÿÿññÿÿÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿùùùÿøøøÿ¯¯¯ÿ666ÿÿÿÿÿÿÿSSÿŒŒ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿŽŽ ÿqqÿÿÿÿxxÿwwÿÿÿÿKKÿ ÿ33ÿÿññÿÿDDDÿŒŒŒÿ«««ÿÇÇÇÿÒÒÒÿÜÜÜÿâââÿÚÚÚÿËËËÿ§§§ÿxxxÿ222ÿÿÿÿÿÿÿÿÿÿ--ÿffÿ……ÿÿÿÿÿ‚‚ÿooÿGGÿ##ÿÿÿÿ00ÿŠŠ ÿ€€ ÿ^^ÿmmÿŽŽ ÿ\\ÿÿÿññÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ$$ÿ33ÿ00ÿ""ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ..ÿddÿyyÿmmÿEEÿÿÿÿññÿÿÿÿÿÿÿÿÿ!!!ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ"""ÿ!!!ÿÿÿÿÿññÿÿÿÿÿÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ###ÿ"""ÿÿññÿÿÿ"""ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ%%%ÿ"""ññÿ$$$ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ'''ÿ&&&ñ$$$ñ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ÿ(((ñ***ñ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ***ÿ)))ñ,,,ñ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ,,,ÿ+++ñ...ñ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ...ÿ---ñ000ñ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ...ñ000ñ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ÿ000ñ444Ã222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ222ÿ666¿333q444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ444ÿ:::m999 <<<777í555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555ÿ555í<<<}??? ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿphpsysinfo-3.2.1/gfx/favicon.png000066400000000000000000000007371247443170600166550ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYsDD~¢˜tEXtSoftwarewww.inkscape.org›î<\IDAT8Í“;OQ…¿ DŒÆB@o‰ÕÒPPÑlK´ÄÊÚßÀŸ±¢'P’ˆ¡° ¢YŠmZ# $¬,Ù•»k˜õQXè©&ó8sf&#”R¿@â7Åÿˆ@JI>Ÿ'›ÍÆ3„@¾ûÒiHl{K€n·Ëf³Áu]Â0¤ÕjÑétØ(źV#¹Xíí!‡áÇËK277Èûû-‚F£mÛär9Úí6½^‡J…ÝÁé8oj~ÜÁl6Cka 5a½ŽÅ/._ Ó4)•JT«U<Ïc4±+¾iâ^]‘ÉÜÝ!ÖëÏ‹E …ý~Ÿz½Nß's{ËÁõ5wvöµ‚f³‰mÛñ+ø>)Ëb}~þ5ÁgX]\\.Á÷y:=eDzb9B)•Ëe&“ «ÕêC0ÜßGŸœœNI¼Äõñ1Éù‚`KðŠŸð÷¿ð Fo|¹k”ª{IEND®B`‚phpsysinfo-3.2.1/gfx/html.gif000066400000000000000000000001361247443170600161460ustar00rootroot00000000000000GIF89a¢ÿÿÿºÕiÁÜpÿÿÿ!ù,#(2£ìmµ'¡¥8b[»þÜ“…èid˜ž,;¶æÏ0(Ç+–;phpsysinfo-3.2.1/gfx/htmlwarn.gif000066400000000000000000000001701247443170600170340ustar00rootroot00000000000000GIF89a³ÿÿÿÕ„iÜ‹pÿÿÿ!ù,%Pˆ1$µuÖ«±ç`z])žä¦jŠl¿4½Öîï8ªç3P;phpsysinfo-3.2.1/gfx/images/000077500000000000000000000000001247443170600157605ustar00rootroot00000000000000phpsysinfo-3.2.1/gfx/images/4MLinux.png000066400000000000000000000062131247443170600177700ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSÿÿÿ7X} pHYsÄÄ•+ +IDATxÚ ßóÿÿÿÏÏÏÏÏÏÊÊÊÛÛÛÉÉÉáááÊÊÊ×××ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’’’FFF^^^ÿÿÿÿÿÿÿÿÿ×××LLL___ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJJÿÿÿÿÿÿãããLLLwwwÿÿÿÿÿÿÿÿÿÿÿÿµµµÃÃÃÆÆÆ öööíííoooååå ááá ÁÁÁýýýæææ›››åååîîî’’’­­­óóóÒÒÒËËË©©©åååëë룣£öööPPP¶¶¶±±±JJJÞÞÞ¯¯¯xxxììì===ÿÿÿïïï···MMMÿÿÿèèèvvvxxx ðððVVVttt777ÇÇÇ­­­ººº¦¦¦ýýýýýýùùùïïïTTT¬¬¬ðððÿÿÿÿÿÿ³³³HHH™™™™™™%%%!!!\\\¦¦¦ÿÿÿýýýþþþÿÿÿóóóPPP™™™úúúmmmÿÿÿãããøøøùùùàààùùù···õõõëëëþþþ÷÷÷÷÷÷íííÿÿÿ±—3Ü„†)óIEND®B`‚phpsysinfo-3.2.1/gfx/images/AIX.png000066400000000000000000000034741247443170600171170ustar00rootroot00000000000000‰PNG  IHDR !øYcsRGB®ÎéPLTEšËTÎä«êòöäòÌk¼MáõÒ¨ÌrÆÞ£ÝòÙ–­Ì¡Îaôüé³Ù„Å=­ÁÙÄÓâÝóÌ”ÃRÒ멃ÂDâëò¿à³Ôƒƒ¿;ÎÚês¼Cáëî²Ó|¼Û“‹È;¹Û¨ÑkžÉ]–°ÍõûäÉÛæëûä«Ór”ÉKÊàëÝîÍš²Ñ[ºNåñë‘ÃD¥¼Ô³ÁÕÁàœÁÏÝŒÅAŒÆ:‰Æ=£Ìi±ÅÛ¢¶Ô¬ÂÕ¶Î✸҇¿W£ÑmžÊh„¾A¯½ÙÚò½‹¿;¼Ò犽A‰Å9c»MåùÚT¹QáòâáôÜøúýÅÝœ‹È6;µS¬¿Ö¸ÍäÝðÄB´SžÍe}¼TªÒ†„½5ºÙ‡Õë»èöÙ|¼KÑÜêÄã¢j¾GŠÆ4ŠÀLL¶T¹Õ–†É:tÁ>ŒÇ6 Ì]õýóÕë³ÿþÿ~ÁCÁF|ÀIÄEŠÅB•ÅN޽K¬Özäúâ‹ÅE†Â>ÁÚéÿÿúÁÝ“”¯Ñê÷ã†É6’¿SßêóÚîçqÀBÙìµw¾7´ÑˆÊæ¦õùü¬Ïðôùy¾FûüþÜ뻉À9’ÈE…Â9‰Á>Â鲆Â2_ºQƒ¾O¿ÍÜŠÂ6“¼Oþÿ÷…Å?q½JÔæ²ÄÚçÁM†ÂI¶ÉÞK¸F~Á;ŠÃF†Ä8T²NªÎnèõÔÎ屎Ã:–ÉfŒÀB…Á5ŒÂQƒÁ6M¸QÁÝþÿýýþÿüýÿÄÏá ÇdÝñçÌ⨉Ã3½ËÛÎæ§Å^è÷àÔàëÃ3’ÂJùþðÿÿôÏµÍ¹ÊéúýïâñÅ©ºÜ£Æo´Ø~c»U§Îd`¶Jd¼F‡À-·ØŒÕ佯;ÆS”Ç_Øæµð÷ãðúì…¾*s¸E¯Í€É䞈¾2kÀJ¦Àß®ÈÚÐáéÙâî£Ðb§ÐgÄc›Én›¹Ú‰ÈAu¿GµÓÏ赦ÐvS¸L^·M±ÈâËâ¢Êá¦Îæ üüýýÿüÄà“Â5±×x…Ä1uÃiç÷ç²Ï‚Å5áùÓßíê†Æ5•ÅIŽÈwúûõíúÛüû÷¼ÉÞ¹ÌÚ›Ð~¹ÍÞÿÿÿ^° ô pHYs  šœtIMEØ (&~´—FÂIDAT8Ëcøž•ü}7öñ‹´ 2ÀY•¦f¾EÊÊS÷ì7›!…¡@ÄwÿTÆ’ÐÐ’þë”u}+Q¬^c©Î±"¹"£mC÷’mÆ ¯Y¯[®iA(ðôåû¥p*ùf2ƒZVAA–ó2A¯2_½˜‚—zŽ[¤çñ|«z+™¡÷$o–¡±màç?¾/¡ Ì7ί[¥/sPU>™Á0æ^ÂÉ“I†§YgðA([n©cŸ²^_î êa5CÞl#C٣εe–Ê MœÚŽoÊóHËs©Éz”%-ÉÓ6k*0u²}æúd¬lRV¶¯lB‚lRy[«ßŒÿ šî‡åeJŽ_d»ÉÀ f8-£ "w¡ì=ÞűÓLÜu=$ž¦~S•;ÈÆÈ,¦¦Ö™lª&”º¶óž“˜½hVgÍ5 ¾ë<9ªoo]äþ6-»C¾xÊ2ѕǒÏq³õ/áQçcht_«vsž{ñ/%›Âùÿ –eœùÏ>ÁÿmRL`U)C£‡`;ƒBø|öWìms¬W2.qÎaVÚ÷j½S‚‘³ 'C©Àö“j†bÿ½*Î… {T¼©#¡ƒû¿FFR¹‘ñ4EMŒ¤¬Å­ÿã73 T î=ýãÿÌ‚ý寯Óü5JY3b:¤§¨ìø_ãô¨˜±mÃÚsgÏL<‘+<)a+'Ð 9åÏW^Š—‘)Û{Û¤xAˆà¾b½ÿã# ? º| |ÇpîôË!úÿÙåW.pzø½mâ"%î¿¶o«4Ì#yÎç¹Ê,öövV`M'j2?Ì*1ñB°kWf­œú †HSû6…FÆ÷Œx·ë.>Ý*hrô–  L[ÿ« žfÚ‡ûyOÊgÅÄLš•ÙœX}Å¥GKëh´$Û:KO†ÿ¿ýjlgÍμ?ùŠ‹‹––››Vt³ÿ?~`t{î–âéöæÍÊJŠžž~¿:úP›Ûò¸åZx*w{‚R”„â.‡“F††Æ@ýÕÑ.=nËâŽ,*³Ü I“¦z?ïˆñ§G°°_îãã0÷»«)4Ѧé]S‘ùj\˜Þ<™Åå‰[\€ÏÜ¿ù|zð|±ŠO—©^­ÍA8=dÅã™3ßw}ÐÕ[…”õ"‹¶Ô[/µU[+)Ù{§¾Œ_15o2ý¶t¬b «××ÚÅñ…·9FîfZcffêWTä÷ô®%?–ìt S$¿Aÿ&äò¨–q‡tKIEND®B`‚phpsysinfo-3.2.1/gfx/images/ALT.png000066400000000000000000000101711247443170600171060ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ß}€U $Ã?jj€ €«ëôòú@*“Ôùaóää߀€ „Çý÷ÿ-/çÂÏí÷)ø·—†;î¯G-‚)tt€RhþýÍ OüÿჃ€}w«ù˜Ó„IEND®B`‚phpsysinfo-3.2.1/gfx/images/Alpine.png000066400000000000000000000017141247443170600177010ustar00rootroot00000000000000‰PNG  IHDR szzôgAMA± üa pHYs¿¿8S$tEXtSoftwarePaint.NET v3.36©çâ%JIDATXGí–ÝK“QÇwiiHFW]•ÝDÙìBÁc‘•&H¾–QFfhem)9<©{q9›ncºM,ÅÍ,7éëñ-A‹À‹Š‚º‰‚úNûmÇÇvææã¼ó ß›óœßç{vÎï<ÏdŠ&íè$Q?”f¨¥i:ª2 ›K1I”h¨Å­NC³SxKÙ].x5°(6vå¶öpR ,ŠMUfÞTÚÌ…I1°€Iñ+ëÇŸOhϵ.h-&°iLdwô­©ñ"˜À¦1|¹„Wh[¥š uʹîx42h\¸Ê:¸…KN(ö7T‹UP¹£´«ú°çÉÑo dÐ8V¯'•ó‹À ÅÍ䄯.náe« í YÄ¡[F26?‰ 46¦îCdQ̲äÊnn‹ôްó+1ô£´jIWÜ'ÏçÅ­=¥qp9K†,:5¨ÓzæMê0 0á_-ws‘ÞŽ¼ïÞ„-._·òN@f`¢ïí4Ú~¡; \nt2ð¦á1!CÙE ŽÉô¾qäž›e¶®ÜŽ*mÄ™‰%í67~ùE‹‹ ¯w Iôyº¢‹¸çfÄEô¾˜@Gš­ä¸Ú!Ž}ÿý¥V©¹|°e|†ÈP“9ìœyuï^kòÚz™yr¥‘¹V×£(Ca$ÙMÝâØÏ¿ŸQ¡žßÏk"k|àa^»~£ÏÍ„×ØÜ‚ÒåNêúÃzEî ]DmŸe7t“ô³8*ì`™‹‚ÇZ­·© m¸+öAáLgpŒ·ðAÿô.L‰Þ…i¼ó’†ä¨LÌ"²Mb dÒá`m=|»ÁVš„¼V+Îmé , >©™ &!óŽ9âyÊov’cm6¼·öÞWgŒ¥œo%Fœƒ-8Om ¼Ža² “Æ•¯u¡G±^† È¢±Ëúøí=Ú]£ãÅÓY4–Uû#ŸMÈ+Œ‡ 4ޝÿ]æÇÃÀ¦1‘e~ú'¬C/Ø4fee©,»]ªIñÑÕÿòJ®”ö§ƒg`“âcS½s$n»,Š]ðÉÝ_·ö?§Àý|¯J·Gpb“ýµÀ ¸ q$“ýô. &ß–&IEND®B`‚phpsysinfo-3.2.1/gfx/images/Amazon.png000066400000000000000000000042211247443170600177120ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTEþêÉþæ¾û³=üÌ|ÿùñþÞªþà°ü·EüÇný×™ýÍ~ýÊwÿûõþòßþðÙþîÒþìÐýà±ýÕ•ýÅiüÁ_ü¾Zý¾Wü¶Bÿü÷ü³:ÿ÷ëþïÖýà¯þß­ýІüÉtû¸IûµBûµ@ÿöèÿõæÿúòü¯3ýÄeü¹KýÂaüÁaû¶Eû·Eû¹KüÄeÿõåÿýùÿùïþõåÿýûÿ÷éü»OÿóàýËyþå»û°4û¸Kÿþýü°4þèÃü¸GÿöçýÒ‹þèÅÿúñýÎü¿[þôäüÂaþä¹üµ@üÁ`ÿôäû³;ÿýúü±5ýÌzüÃfþݧýÔü´=ýÙœÿüùþâ³ýÒü»Pü¼Sü½TýЈûºLþâ´þçÂþá±ýÉtû·Fý΃ü±6ýÔ‘þëÌû·Hü¸Iÿøíû·DþñÜþð×ü³<þñÛû¯4ýÁaý¿Zû¶Bû´>üÂbû¹JýܤýܦüÊxüËyýËxÿüøÿôãü¶Fû¯3û°3ü°3ÿÿÿ¤ätRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÎ pHYsÄÄ•++IDATxÚ ßû?8 SO   D~|~~}KB#C~}}}~~~}}m}Y 8/Bx5~~~~~}~|~~~}|}}~~[vLAc}~~}}~}~~|}~~H@]00j#3i"~~}~~~|HoGLgr5U/0 W5 P48@I%O~~~t1d10leM~}I%'~~~~}DV=p~}}~~*%'}~~~}~||~}}q_% !~|~~~~~}|~~)%'||~~~~&}~~}|R/J|~~~~}~~~~~~)%O|~~}~}}~~~~~{#$-|~}~<~~~~~~~)%.~}~|}|~~|~||#$(~|~~|}}}~|||*%.~~~~}~}}~~&},#$(|||~~9}}~~~~*%'~}}~~~~~~|~|,#$:~~|~~9&}~~~~)%.~|~||}}}~~~|+#$(|&~~|~}~}||&*%'}|}}}|}~}~~|+#$(&|~~||}}}|||*%'}|}}~~|~~~||+#$(~~~|&|}}}}~~*%'}~~~||~~|&~|#$(~~~}~~}~}~~~F%.9~~|~~}}|}}~,#$(~}||&|~~~&&})%'}}||}~~~~~~~,#$(~|}&|}~~~}}}*%.||||~~}}}}}~+#$:&~|}||~~~}~}n%'~||~||~}}}~~+#$-~~~~|}~|~~&~*%'|~~~||~~|~~|#$(~}}~~~|~~|}}F}~~~|||||~~~#$-}~~|}~~}|~}~o;/\7s~~~~~|~~#$:&|~~}||}f7^J;6s~~~|||,#$(~~~~}} _627>~}|,#$-~~~> E$N`}k$E!~,N2644C ^›™™¹X“IEND®B`‚phpsysinfo-3.2.1/gfx/images/Android.png000066400000000000000000000101711247443170600200460ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ßïÃÃÃ';Å Ìóx ÒÃÙ';Å Ìóx ÒÃÙÙÅ;óö2M@ݶñ=æÛ:üýÿ ûû÷ÿåÔ<&ŠÒ½Ýx<$ÈÃÃÃí&>6êãÿ^ûø#ì Ï,Ã’Àüì$>2çÝÿxûø#ûþýñíEÚË=t@Aë?%çàþþ *´a9ç+Ôf9ø@úøö?ÛÎüj@@ëëþmÿýÿáÙF©Ö²òíÿ+§Ø ™ÿýÿ÷óIî+>*§ß?%üú%ÿýÿôïÿ(ÿñíÿ,ìàÿNõðÿ+üý-@@-<ÃÃÃò+;çÞvÿÿ—ûþ úõ.$û¥çЇþü è¬æÝSúù/íèjÈù÷NøÒéýú"îëÿ`B;Ù¹ÙÅ'óùúÿ ÿ ÿüú ÿþèÍÿþÿäüþþÌå·û46ýýû/õöï÷ÿZü*®Ýð ŸA/Q¾ »ÞÙÅóÃÃÃÛ =a÷ôV.ÿÃIÿüû&.´×ÍúùÿÿÔÿþÿþÿÿ(åë¸äÃÃÃÔ>\þþÿ[=;iZñÄZïÒ<¡ •%óôçòÿZü.96óø êB.¦Æ ¥ÇÙÅóÇŽ÷€É ž(ÂÎ7®^\%IEND®B`‚phpsysinfo-3.2.1/gfx/images/Apple.png000066400000000000000000000005741247443170600175350ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆsBITÛáOà pHYs””Þ lltEXtSoftwarewww.inkscape.org›î<BPLTEÿÿÿ±±±±±±³³³³³³²²²±±±´´´²²²´´´³³³²²²³³³´´´³³³³³³³³³³³³³³³³³³³³³³³³GÚƒatRNS'16(QÃÌÖÞ 5 ‚÷§Ó¶÷çÞHÄ' ÀÖ¾ Aê´çÞœ®NØO¢†FI¥f‚@0kíÂO/™5ØÖÚS¢™ 54f"’–žòÚš͵† šÄ9ëGµkðð'}Ûƒ /*¢PD˜õ%wï—×ö­:@0(oi&m˜`4&= [»êZ«sši&8Z à{öœîbÕŠO÷=“j—î aøú¶ h&Lx–Ö¹~UJN^Í2 3¾™ëVZý£0„9³Ðˆš ÖÎaoÙ™k¯8€f¿Î0o(ÚbúÙ0¿©ŸULV«ùR&<Ë Ò°¢R\üEöÆ_ ä Áü“ùú;D@FH;ãÛ'¿)ßÕ¾"H Q½Q2 ¸½ûU´þ4¿úhSNx–Õ:S¿"xêlßöû¸"‚`tÅSžÃ¸g1éYDœÀºb‚Q„õ†^¯]š2»Û^Ú~1©Ïqš˜cFQÐ:ÁÀ”Áɦ#.æ»3 ÷›3Àß·<ÎN Ôx6á ¼ðÕ•]Á ùmhÒ׎ÏÁ³²<Í`BÖ†PiÇÁ?%”1êƦõ¤sÅN€_ˆ`!(ÕO¾ŒLÍ6(]v6·tæŠPãñ4 í»q8ÿ<d5ö”»olŒIÊxnäÐ#ß-kˆÐñ8ÁAÀ;Ñà0\“wA‡ãùRÇ BKØÜØù4€çc“a4ã¦þìÎéá`¤ ÀHl<néÚ¿4âiÛ ½Gs½»æ+‹"|½H¿7àèúžáæîrÄÕr!ôÇ !ÔyghÑ祄7eT, Óô{„ÿ—¡¸„cì²r8¹åXí gQ€ š©ðà¢ÚÍ´%nv i1‹Fx›œ^¬ þqG: ïÝC[þ‚£ëñK€q®ÇÙ91s{¸©«,¦„›:ƒèݶ=N@ѹ¡ªü?–¢€YM=»2*äÝտׇ« Ný°µ±÷Ë~?€ÐÂK@N±ãÖÁšüËÉž»C½ zvñ‘c•Eã >ûõ ÁgiQNç UT$kò/UT(§sD¤À,€Ì`Ä|”ÙÚQÀŽÛAtÒF¼÷G bǦæ_·*Ò yE (ÜÜ}D}?\•×5™­ʪÝÿiƒð»è‡IEND®B`‚phpsysinfo-3.2.1/gfx/images/BOSS.png000066400000000000000000000062131247443170600172360ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSÃÃÃQ—.‰ pHYsÄÄ•+ +IDATxÚ ßóÃÃÃêúÐÚè  &úûþ>2ÓÜéïóøûûýÛãíØàë =%¾×üüüþ[Jôöú†žÁìðöíðö‰oG>2ž±Îš®ÌSC+.% «»ÔQ6 ÃÃÃöúüý:/Nq¥×Þ먇V"v‘ºñôøíñöçìóÏÙç­‹Y(!‰ŸÃZI.ûðàÏåhS"&Qîò÷  #hS5"ëïõ <0 %f„°ÎØç¼—`-$±Áî òÓè`M0ƒœÀõ÷ú   øúüö÷ú:.òõùûüýóõùñôøïò÷¯ŒZnX8Wxª­¾ÖæëóêúÈßt]6=„ õøûþÿúüý ”©Éùûüýþÿîó÷ô÷úúûýèíô#ya>&‰ ÃƒiCQA)áçðãÝÔ'+178 ¨¹Ó üþþþÿþúûÿÿû ËÕåûüþ€fK•ªÊæëó üüÿ@3!òôùf…±³ÂÙD+ #¨¹ÓÄÐâ·ÆÛóÿù÷ýûÿ‘tJèíó ‰¡Ãëðöÿÿÿþþþ þÿ P@)9`šúÉ€ƒœÁA(¹ÇÜXG.¸ÇÜ þúþýþûÿýþüþýû 5+áçðúüýüýþÓÛéÓÜéöøúýýþìðöêîõìïöýýÿ*!3)ÛãíO?(UE+ÇÒâ óÝÿýÿüÿ„g;ûûúv¸ùúüû ý÷ùüüüþÿøúüüýþÿQA*8_šÂœcæ÷#(/ w’»ùíýøÿÿþÿùû&ñòôãëêÎÖâ ÿþýþÿÿþýÿÿðó÷üõ÷ú£µÑ©ºÔ ºÉßõãÿþþþþýúøõúø÷oˆ³ïððþýþ ûÿÿþÿÿýÿÿþþÿÿûüþ,#š­Ë¥…U *ñÖÑÚâíÿÿþüÿÿûûý)"óóõ Úàéûúùûÿÿþÿüÿûþýÿÿ ÷úë×ßëÀÍá õþûÿþÿýý aJ*ðððõõŠk>ÿüþ•­Ïïò÷ÿþýÿþ ÿÿÿÿÿÿÿþ îñ÷úûýô÷üþøÿüÿþþ%ùùùýýý-# ˜­ÌúùøûÿþÿÿÿüýýÿýýþîñöÏÚè6*üýþûòüøÿÿþÿþþÿ4'Úßå óõ÷ ö÷øííîÿ÷õÿûÿþýÿþýÿÿÿÿÿîñ÷àæñ4)Üãïûÿþùÿüÿÿý¤³Éÿÿ |eBÿø÷ôÿþûüùþýúÿþüûÿþýÿþåëò! þþüÿýÿýþüþûþüÿüýýý ÿýûúúùýýûÿüþûÿýüûùüùúúûùûûùûúúûúúûûûýýüøùüÿÿ +$ÿÿJ:#öüöýøýùþ÷ýùýùýùýùýùýú ÿöõóñðñüùýùýúýùÿýøüúõ÷ôó÷ôó÷öóöõôø÷õíîïüþþýþþÙÔÏ ;/ ýúþüþüþýÿýÿüþüþüþüþüÿûúúøøøÿüÿýÿüÿüþüþüýüúûúúûúùûûùùúùëíðþÿ ÝäîYG- [H0´˜ÿüöÿÿýÿ ýññðøøøÿúýÿÿÿÿþýþûöõüððòóü‡mE×ßëÕÒÍËÕå`L.þ ýøÿûþüþüþüþûÿüþûþüýøøø÷÷øýÿüþûþýþýþûÿüÿüþüúúùøþû YG-5*ÎØç=1ûIÿñ×ÿýÿýÿûîîïþùýýýÿüÿþÿþÿþû ø ئiÁÍàêN?(®¿ÖhS2ð 3üöþüÿüÿûþüþüþüþûÿýûøøøõö÷ÿüþüþýþûÿýÿýþûþüþüþúÿúùûÉÔäÞÙÑya>âçðWD)@Sà ç·þÿþÿþøöôðþúúýþúÿûÿýÿÿþÿý)!·’^¤¶ÑF,ÈÇÆœ°Í"5ùDþúþüÿûÿýÿüÿýúúùøøø÷÷÷ÿüÿýþüþüþüþýÿüþù%ôý ¦„Uðôø+ùJ0 ÆÒâÙ«h£™ˆñZ ýøýøýøüùòòñðððïïðýøýùþøýøýøüõ ý9###Ì£e‹£Åö÷û÷僛À!=<;ðV ýøþüÿûùøøùøùúúùþüþüþüÿüýö ô 0úþ©‰Vðóø^L0êã×bbb(òô÷tKí 1ç8ïú üöìùùøûúùÿþ&û,ù;'1¿šaL=&·ÅÛA4!çàÖÃÃÃìüÃÏá\J0þþÿ‡¢ÇÙàíçæäÿûöÿýú þ  pX54*»ÈÝàçïu^=ÛÖÏÃÃÃ!ÔÜéÑÚé " ô÷ú ÿÿàæïëïö  óÃÃÃûáèñØÞë÷ùúÊÕå3*  +"낱*ýñjIEND®B`‚phpsysinfo-3.2.1/gfx/images/Calculate.png000066400000000000000000000062131247443170600203650ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSÿÿÿ7X} pHYsÄÄ•+ +IDATxÚ ßóÿÿÿåÜÁÀÎëùùù% =AOÿÿÿ£¥¡íïö ëììûûûøøø‡‰…ÿÿÿ³²©¸·ÄËÉÄîîîƒ\0ï  L±ÿÿÿÈ®dfyøøø[8ù-KQiœÜÖÁ\^q09Dc•œ×мHJ^$$$¯¹¼138#' ÿÿÿ£¥¡{~ÒØÖÿÿÿÿÿÿ†ˆéìñGH<7:Iÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿcae%! KILúüùõ÷ôðöøõ÷ô÷ùöøú÷÷ùöúüù1/2##A=<žœ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxvz%! %! øú÷ñóðîôöïñíïñíîôöîôöîôöøú÷ÍÒÕîôöõ÷ôÔ×ÓÔ×Ó>2T?3U@4WA5XC6YC7ZD8[E9]G;]HA`I7_I=`J=cK:bL?cM@eNB`PAfOCcRDfQJhQEeTEgVGmUChWIjWDiXJjYKkZLl[Mn[Hm\Nn]No^Op_Ps`LraRvaHtbSudUxdQweWxgXyhY}hO{iZjQ|j\kWm^‚nZ„nU„p\…q]„rc†r^‡s_‡w\‹wb‡ybxXŽye{ZŠ|eŒ~g‘}hdŽ€i•e”jj–l•ƒb’„m–„c”†o•‡p—‰r˜ŠsŠišŒuœŽwžy ’{¥“p¢”|œ”ާ•r¤•~¢”¥–¦˜€«™v¨™‚§˜“«š}©šƒª›„¯œy«œ…±u¬†­ž‡®Ÿˆ¯ ‰±¢‹¸£{³¥z³¤µ¦Ž¶§¹§Š·©~½¨€º¨‹¸©‘Á«‚¼­‚¾­}½¬ŽÂ¬„¶®”½®ƒ¾¯„¼¯Šº¯Â®‹À®‘¿°…»±‘¹±—¾±ŒÀ±‡Á°’¼²’¿²Ä±ŽÂ³ˆÀ´Ž¾´”»³¬ÁµÀµ•È´‘Á¶–ö‘·—Ä·’ø˜Å¸“ƹ”ĹšÇº•ź›È»–Æ»œÉ¼—Á¼ºÈ½É¾ŸÏ½ŸÌ¿™Ê¿ ÌÁ¡Í¢ÎãÏĤÐÅ¥ÊÄÃÑÆ¦ÒǧÓȨÑÈ®ÔÉ©ÒɯÓʰÖʪÔ̱ÕͲÙέ×γÚϯÙеÜѱÚÑ·ØÑ½ÝÒ²ÛÒ¸ÙÒ¾ÞÓ³ßÔ´ÝÔºÛÕÀáÕµÜÖÁâÖ¶Ý×Âã׷ߨÄäÙ¸àÚÅåÚ¹âÛÆãÝÈáÝÎäàÑåáÒãâÙæâÓçãÔëãÛéåÖëèÙñèÍðçàêéàíéÚëêáòéâóìÃìëâïëÜíìãîíäñíÞïïåñðæïñîòñèóòéôóêõôë`ÉtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßû’‘‘Œ›ž‘‘‘‘‘­Œ‘‘‘‘‘‘À‘‘‘‘‘‘›‹‘‘‘‘‘‘ó‘‘‘‘‘‘Œè‘‘‘‘‘ŒÆáŒ‘‘‘‘‘úŒ‘‘‘‘‹ÆöŒ‘‘‘‘‘Œ£¿‘‘‘‘‘‘‘?î‘‘‘‘‘‘‘CC‘‘Ëö×’‹‘‘‘³ÆŒ‘‘‘‘‘‘‘‘‘‘Œ‘‘Œ‘Œ‘‘ŒŒ‘‘‘‘¦Œ‘‘‘‘‘‘‘‡‘Œ‘‘‘‘‘‘‘Œ‘›Æ‘‘‘‘‘‘‘‹ç¨ŒÃ𳑑‘Œ‹¨‘‘‘‘‘‘‘‘⌑‘‘âïø‘‘‘‘‘‘ŒÒ‘‘‘‘‘¼þ‘‘‘‘‘‘ÏŒŒ›‘‘‘×Ö‘‘‘‘‘ªŒ‘³‘‘‘Œº‘‘‘‘‘‘‘ ‘‘‘¶Á‘‘kUf‘ŒüŒ‘‘‘u#<5‘‘‘­‘‘‘ê* ‘‘‘Ï‘‘‘¨ú‘‘‘‘‘Œû‘‘‘‹‘‘‘‘‘ב‘Ï›‘‘‘‘›Œ‘‘ö‘‘‘‹èŒ‘ ¡‘‘¤‘‘‘‘›å½Œ¡‘‘‘‘‘Œ‘‘“Œ‘‘‘‘ŒèÛ›Œ‘‘‘‘ϸá›×I 6ÌIEND®B`‚phpsysinfo-3.2.1/gfx/images/CentOS.png000066400000000000000000000022741247443170600176260ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<€PLTEî¢õÛ¢Ö¨¿ñ÷Þ¨¨É÷úêûêǰW™Ù¶ÐÝî¶ÆÆÛŽsíÙèÆäƒ£Ò9íá¨øå»±ØVÄñwÃÐ±Íæ“7†Ù׿×ê®ï¦"þþüÒ霕'}¸¸Õ(&xõ½Y´á[yw­æòÉíøÔöË™Ì#ð¨'•ÊœÍ)86…—”½Ë›¸¤ÓAnò²=ôÁeÄ…¸‰Šµð¤úõøVU•ÑÀåÅÊ÷Ћ³d¡„„³ëêò»t«þþúûÆaLKذÏòäêüÊlúýôúÚž÷Ô”kn¥ö̶j¥Õ©ÊFC‘õÄj||®¶Úa¬ÕL>>‰¹ãg¹m¦üñؼoªòòöûüý¯¯ÍüÈe¯ùó÷ö×›óçðªÚWôÛÂÁáy¾ÂÊ¡ŸÃð«.ÿåŸéßžÁ}°áâì¾}´æÂ·ëà¢îîÆúà³ëèÜģǟÏ0Ýð¹^^šÝÆÌaeŸ—Ë úúüëçµýøü±¸¼ýüý÷öùON‘áÁÙ©Ú= sжˆ‡µ¸ÿÿÿÿÿÿÈTw€tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8Kg6IDAT8Ë}Óý[ÒPðk( ãE„9¦‚ã-8A–Bb‚Š`EXZf¡ÅSºàð¯{/ yâûÛv>Ï=»w÷ Þx`üzT§KSÐkg ð±5„ 4ìÜOÔ…PGh…Bᜣ†Ÿ3Ëï>oî´´8od`.ßhøçu ý[C<Á0–Dˆa˜¢øÝ«®ÉqþËøŠ¢˜Ä6E‰r o—ÌÜ`(‹ºhy«ã5ƒ,jQÔnË@/å¨ç±hö®göU‘Û–lºfÓx…ÿc;>@=?@>AC@GIFQ¤R¥IKH!O£JLJS¦Y«T§LNKZ¬U¨V©NPM [­VªW«PRO\¯QSP Z§STR"Z¨TUS$[©UVT%\ª`­']«VXU)^¬b¯*_­,`®d°Z\Y!e²[]Z#f³]_\_`^1f®4g¯5h°6i±bda7j³dec9k´egd0o·;lµ2p¸gif3q¹hjgjli?rµkmjlnkBt·oqnEv¹Fx»rsqHy¼surJz¾tvsS{ºvxuK~»U}¼xzwM€½y{xN¾z|yPƒÀ|~{R„Á~}S…€~U‡Ä[†¾ƒ€^ˆÁƒ…‚`ŠÂ„†ƒb‹Ä†ˆ…cŒÆˆ‰†dŽÇ‰‹ˆfÉmÄ‹Šn‘ÅŒŽ‹Œo“Ç‘Žr•É‘“l™Ë’”‘t—ÌnšÍ”–“v™ÎvœÊ—™–xžÌ˜š—yŸÍ›™œž›}£Ñž „¤Í¥Ó€¦Ô†¦Ï¢¤¡‡¨Ñˆ©Ò¤¦£Š«Ô¦¨¥Œ­Öޮש«¨¯Ùª¬©”°Ô•±Õ­¯¬—²Ö˜´Ø°²®š¶Ú²´±œ¸Üµ·³žºÞ¢ºØ¤¼Ú·º¶¥½Û¹»¸§¾Ý»½º¨Àß«Âá¾À½­ÄãÀ¿®ÅäÂÄÁÃųÇàµÈáÅÇĶÉãÆÈÅÇÉÆ¸ËäÉËÈ¹ÍæÊÌÉ»ÎçËÎÊÁÐäÍÏ̽ÑêÂÒæÄÔçÐÓÏÒÔÑÆÖéÓÖÒÈ×ëÉØìÖØÕÊÚîÎÚèØÚÖÌÜðÙÛØÐÜêÛÝÚÒÞìÜÞÛÓßíÞàÜÕáïàâߨäòáäàÙåôãåâÛçõåçäàèñçéæáêòèêçãìôåîöçïø ŽtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûòÁþîÅi<111<<0Î1111111üH9995Evã51<@<<û Ö ß÷ ûúHô¬ D $ãòÿ ïò×Üöìò ü¼ò üôá Ö Äòçý ýÿäîûºìÿÛÿþ@¨ù& ûùêøþöû"òvÞ<ù$) àôúî×  þù ÷øþµðì÷ üðúxÖÊ0ÿþæü$è øÿûöì¾Þö"Ôàÿ>¬ÿýëáôFÝõÊÙêôýÐÒéÔô"ðÄ þïõû¶õ'öþ ÿüýìÿmmù`WÿÈœªÿÿþòêûó(.ýÊüõ!øª×ûoñþöþÜ$ üïxýö,Aô÷ ô/óŠ ûõ¶üCÿÿú ÿù±À7üúþ2Ôõþ Ç:ø ðï  !&"   ú à  ûµûAý ÿÿÿþ ¨þ—Cþ íù.¾øü ü õõúõ÷þ÷ùý÷üöìôïýýýõÿþýøøü ýø ÿúÿ ÿ¿Ìsÿì@Uÿô®Hñéü>éôüðûà ü1ýôúôýìòñ&#ìñÿúýüö  ûÿ  Öõ€uPNÿ¤9Ý=Ü÷p øüõüôÿù÷÷ûôòéÙö þþúúûõ ûýûýú{ÿþ6C{Fï1äQäý!$ñøýþø ø- 3%øýüüó þïÿý §¸qÿ¸ÿÿÿ?pÂùŠðüìû0ñ þÿàíöÐ!÷ êÿý ïúô þÿ ðü ¥œeÿ‘ÿÿÿ=Fÿu& Õ  þñ'ñõîÞðÝÿþ öþýúûúÿõý þvœeÿ‘+Qý«ìýÿ$  îûóí ùþìüûÿô:ün6ÑÀÿÿÿ„"#þ ÿ ìï çú÷þòûã& êÿÆî% ùþïþÛÿÖüóùþùÝò?÷ð9cÿî·6 èñù ÷ý ûüóûé¿åì Êýßäö×û ÿöý ù÷øîüÌÿ 9îIÊöå-úëïñ ýéôúü þöñôû üõùÿõúôøóöÿùmåæX™ë}IEND®B`‚phpsysinfo-3.2.1/gfx/images/Cloud.png000066400000000000000000000101441247443170600175340ustar00rootroot00000000000000‰PNG  IHDR szzô+IDATxÚ ßïÚãë&n©FÚ’WºÚãë&n©FìØD , ÁÏÚ’WºÚãë&c–¶ Á2`çÿΠ>ðÞ÷ëÔ'íÚ”X‰Úãë&n©F0_ÿÅŽX;r¨ÿÕ°WðÞ ÁÚ”X‰Úãë&n©FìØDÚ¦v&c–¶"ÿ+P©ÿëÕ'Ú¹1"ÿ%ÐêÛ0ðÞ÷ëÔÚ¦vÚãë&c–¶ þÿ1÷î?;r¨ÿÅŽX"ÿ%Ð+ÙÿëÕ'+ÙÙbø¢&l¨w÷î?ÚjJÚãë&ZŠ ,ÚjJ&s¸µ+P©ÿÅŽX"ÿ+P©ÿÅŽX"ÿûñ‘Ú’Wº&n©FÚ’WºÚãë&n©Fõíp Á5êÛ0+P©ÿΠ÷î?"ÿÚHK&ZŠ ,÷ëÔ7+ðÞ"ÿçÉÕÚ¦vìØD ÏãË1Ùbø¢&Åî¶+P©&cŽ¶Ô Ú’Wº'ž^ÔÿëÕ'êÛ0 ,&c–¶ÚjJÚãë&c–¶;r¨ÿÕ°WùðÂ2`çÿÅŽX þÿ1ÏÚ’Wº&n©Fþÿ1îÙ ,"ÿ+P©ÿÕ°WðÞ÷ëÔÚ¦vðÞ&GÿëÕÚ’WººÚ’Wºº&l¨wðÞ?ÿÅŽX"ÿ+P©ÿëÕ'ðÞ1 ,'ž^Ùbø¢"ÿùðÂãËò ÁÏ;r¨"ÿÿÕ°W+Ù&GÏÿ¼y,&n©F'ž^ÿΠ2`çãËòÏÿ¼y,ÚHKÿÕ°WÚw#{"ÿ ,þÿ1ÿСè"ÿðÞ>Ùbø¢÷î?ÏÚ’WºÚ’Wº ,&l¨w+P©&l¨w+P©þÿ1%ÐðÞ'ž^&GÏ ÷î?ùðÂ>&n©F÷î?Úw#{"ÿÿÕ°WÚw#{þÿ1&n©FÚ’Wºÿ¼y,2`çÿëÕ' ÁÏ&‰Ý…&GÏðÞ&ZŠÚjJ÷î?'ž^ ,ѤÏÚ’WºÚ’WºÚ¹1+Ù ÁðÞ ,&l¨wÚjJ&l¨wìØD"ÿ%ÐðÞ ,Ú’Wº÷ëÔÿÕ°W2`ç&GÏ÷î?&ZŠÏ ,"ÿÿëÕ'Ú¦v&c–¶ðÞÿÕ°W+P©+Ùÿ¼y, ,õí,&ZD'íÏÚ’Wº&n©Fþÿ15Ùbø¢&cÞX%÷ëÔ õípðÞÿÅŽX÷ëÔD‡ÔÙbøv'ž^ÿëÕ'ãË&n©FìØD ,ÚjJ&c–¶"ÿ"ÿ'íÚãë&n©Fõíp"ÿ%ÐѤ ,÷ëÔÚ¦v&s¸µðÞ&GÏ+ÙÿÕ°WðÞ;r¨ÿÕ°WðÞÚjJþÿ1;r¨÷ëÔÚ¹1Ú¹1 ,;r¨D‡Ô&s¸µðÞÚw#{ÿÕ°W"ÿÙbø¢ðÞ÷ëÔÚãë&n©Fõíp;r¨ÿëÕ'ãËò>çÉÕ'í2`çÙbø¢&‰Ý…êÛ0ðÞ;r¨ÿëÕ'êÛ0%ÐÚ¹1ÚjJÚãë&n©Fõíp Á2`çÿΠ÷î?"ÿ+P©ÿÅŽX"ÿÚHK&c–¶ Ú’WºÚãë&n©Fõíp"ÿ+P©ÿÕ°WðÞÚjJ&n©FÚ’WºÚãë&n©FìØD ,"ÿ+P©Ùbø¢&l¨w÷î?ÚjJÚãë'ž^ÿСèþÿ1÷î? ÁÚ”X‰ÿСèþÿ1Ï ÏÚ’WºÚãë⯉³2¾IEND®B`‚phpsysinfo-3.2.1/gfx/images/Cobalt.png000066400000000000000000000036271247443170600177020ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE ^Sp#\!o,{ 0z"j&x8{,.m&6f%5t%3x#;{.7{58j07}.@t+@};Fn5Fz5K~?CwB€:E‰:K‚8O‹1O‘8V˜+L ,P¤0N 9Y¥;`ªDL‡AW‡DSŒKUŠFW–RZ‹F\§Na–WbŒWaRoœ[a“[o˜Fg©Ih³Vl¦Qf°Vr©Yx´be„efŒfl…ckŽnkhm—dp†msƒlw˜tuƒvx„xyŠrv•tz‘u{š}{”~›bg£bt§brªc{¯k}¬cz·uw¥e~Â{‚šl€ªi‚¹u…£vˆ¬z†¦ާuˆµ}“¶{”Ń~™ƒƒ•ƒƒœ…‹˜ŽŽ•˜—„‡“šŠ–”“””“š—›˜—ššš–›››„„¢Œ¤‹’¡‹”ª‰˜¹‘“¢’”¬—š¤œœ¤—³žš¼Ÿ¡—¡šŠ »–¡»š µœ¡º Ÿ¡¡œ¿¡£ž¨©¢¡¥¤¥«¦¨¬¨ª¥«¬«¦¥±§¨°««±¡²·¯°°­´º±¯±°²¬²²³°²º¶º´·¼¼¹¸¹‡›Ç„ Á˜¦Æ˜¦Ðž«Ð¥ªÃ ªÈ©­Ë«³Ë©¶Ô´µÂ°¶Ë·ºÏ»¼Â¸»È±·Ø¡¯à¼À·²ÃÕ»ÁÒ½ÊÔºÈÞ­Äâ¹ÈàÁ»¿À¼ÈÀ¹ÂÂÂÄÄÊÄÈÇÄÊÊÉÆÊËÊÆÉËÉÃÆÑÃÄÚÆËÑÂËÝÊÊÔËÉßÍÐÉÏÑÓÍÑÛÒÍËÐÎÔÑÒÒÔÔÚÖØÕÑÙÝØÕÞØÚÖÛÛÛÄËéËÕçÔÔâÐØæÖÝìÛÜãÓÙðÝÛòÞææÛâòàÛÚáâãääëçèçæèìêåäëìäëëìäëòéçóéëñïïøêòêîñ÷ñîòöôæðóíñòòóõú÷øóõùûøöôùõúûüõýýý¿{G/tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS÷%bKGDÿ¥òÅ pHYsHHFÉk>$IDAT8Ëm“KoU†ßsÎ7cÇöØiíø’¤mE­D¤‚H›´*”"5¤ŠU‘ØKô'ü.;`6EB ªÂ¢E\š‚¤­ã$ãËŒgæœ]Èôì^=»W®]-FndkiÔÿ„úõýOñގֆǛäŠÕ 4cH&ç¤ö}m0 J´ãˆŽˆ± ÚÒôÂ‘ŽÆ'É£úùøv@¢ÙÄ–¤ÇvR>å"; ÷›þh³ Qš³ÕéÉ@JûR¶7ïHÅ…gOWlr4ÚYûÜÛ”Rá8bKÞÞ­­™gÎW¦G£a¶{ý:ÊS™á(`oSŸÊ%[ÃÞ,å:M¼l—Ñ>}9†ôÛ7¿Þ?ô©¯œq YÑ'ÝÔì_UÌ\*Sö‡²X9u僟ÙjáK>+)n.IX+âÒü·¿k ’_=¸q`Qíß=ñ/™õ.R‘xò¥Yúçí?›<½&¾JÉ!™2ncd]m¤ÕäÄ´8xwíØ|¬3t&àV5æÈÖ›osy'Ì¿þ»¯%i“²LZêœý°^N£RwòÕñ@J¯²ä$I*ej­¢ºð·¸æ|' ‰‹¯Ö¨³»8sEÿþÇ¿yOóêso‘f‘RShÞ«™R@ìwî4<@ŒV—rL*¼øôíÞlŠÕ7þn[£íG=åöŽ,.UP&%ãâS­“ÐS_$´[…4`*$íÅWÎz ¨e+O‹yÏò³&˼cÙL—^|mÅÄ·d›¸ö6¶6‡Lšm䋪ðü gÊRBK€@ða}ùrÒ n`Æ5×+Xš…b€ø(Nˆ” 9WWéÁIˆ(´rêÐ% Ñ‘“]'õ€§úiìki1êëJ‚`äˆE¶ë´ÊÚŽ6Gy7 Ÿ„è1DS€‘0¦¬áú&ôb…¥€ ge@HÓ¦¼ÑF"#Zt¿à §Ò1(¡ÄDJ§ã¨sC¨úù—¥ùéœ`ˆÇ—¢6‘ÀŽ××ÿ²‘UuûIEND®B`‚phpsysinfo-3.2.1/gfx/images/CoreOS.png000066400000000000000000000042211247443170600176170ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE ! ""#$ %! &"!)%$,('.*).,00,+1-,621:65<87?:9A<;D?>FBAHCBIEDOKJSNMUPOWSQYUTZVU^ZX`\[d_^fb`jedlgfpkipljsomuqowrqzutðUeñWfòXg~yxóYhóYnýYg|{ö[j÷\kñ^ið^où]fò_jñ_oêbsò`pìbnädxÞg|àgw†Ùi{ôbrØjÒl†ˆƒÍo…Ìo‹ògsÇrŠŠ…„Âtºv”¼v¶y”´yšŒ‡†¯{šôj{®| ©~ ¤€ ¡¥Š‰„¦›„¬•†¬òp}‘‰­„Œ¹ŽŠ³‰Œ´“Ž= Ù€»ös€v“ÂJžØz“¼p–ÄLŸÙdšËôwB£ÜM Ú—’VŸÔ’”‘N¡Ü]žÎ_ÓD¤ÞeœÍM£Öõy‰E¥ßP¢ÝfÎX¡ÖO¤ØQ£ÞY¢×P¥ÙG§àZ£ØR§Û\¥Úô€ŒT©ÝŸš™VªßW«à¢œô†`«Ú¤Ÿžb­ÜöŠ˜d¯Þ¨£¢f±àõ›h³âi´ã¬§¦ù“žqµÞ¯©¨s·àö—Ÿu¸â±¬«wºäøš¨‚ºæ¼áz½ç÷Ÿª·²°‚¾ãù¡­ƒÀå„Áæ÷¦¯Àæ½·¶¾¸·‡Äèú©±‘Äê÷¬³¾¼À¼»‘ÈçšÇèú°¶›ÉêÆÁÀøµ¸žËìÆÃÈù·Á Íîü¸¼ÆÈÅú¹Â§Ðìù¾ÆÐÊÉÊÌɪÓîüÁȬÕðÓÎÍ­ÖòùÅ˲×íÓÐÕÑÓеÚðýÉÎÔÖÓ¸ÜòÛÖÔûÎѺÞôÁÝôÅÝï¿ßïÙÛ×ÈàòáÛÚÛÝÚÊâôàÞâý××üØßÌäöåàÞÍå÷ãáåýÚàâäáÓçôûÞãëåäÕêöýáææèåîèçÙíúéëèÛïûÞïöýèëçðøáòùÿëîéñúûíîêóûìõýÿóôþø÷ÿþáÿýûþÿü5*iætRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûøÆ”|iil†©ÚØ„yyyyjX^myyyî„yyyyy>====7=Uyy§µyyyyyyJ========7Ry|šyyyyyy}<===========~tñªyyyyyyy>============7mtÈyyyyyyy~==============7~||yyyyyyyc================y —yyyyyyyyG===4‡F3=========Qy|yyyyyyyw5===úþþþÐ3=======<„ެyyyyyyyy{7==?þþþþþþF=======Ry…yyyyyyyy~===·þþþþþþþ3======7yØtyyyyyyyyh===úþþþþþþþÔ======7y |yyyyyyyy^==3þþþþþþþþþ3======hyêyyyyyyyyyX==1þþþþþþþþþ_======WiÖyyyyyyyyyW==1þþþþþþþþþ======MlÚyyyyyyyyyW==1þþþþþþþþý=======flðyyyyyyyyyZ==3þþþþþþåg=======Yyi|yyyyyyyyc===111119=====78UyyyŠtyyyyyyyym===========>G`w€yyyy¶yyyyyyyyy{rxxmxv~y{wyyyyyyyyîÏyyyyyyyyyyyyyyyyyyyyyyyyyyyyylyyyyyyyyyyyyyyyyyyyyyyyyyyy¸Ïyyyyyyyyyyyyyyyyyyyyyyyyyyt…yyyyyyyyyyyyyyyyyyyyyyyyyÒpyyyyyyyyyyyyyyyyyyyyyyyšîyyyyyyyyyyyyyyyyyyyyyyŠêpyyyyyyyyyyyyyyyyyyyކyyyyyyyyyyyyyyyy|§Âpyyyyyyyyyyyyyyø»Štyyyyyy|yšñöÒ¶±Âãã•xÍgÍIEND®B`‚phpsysinfo-3.2.1/gfx/images/Crux.png000066400000000000000000000101711247443170600174070ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs × ×B(›x+IDATxÚ ßï«ïÿ@à < ÿ;ó÷ø« õU«ÿþÿOjþ®ë5ƒ3@Fô ºÀòd êöõ.¬ðÂÿï“ÀüÿO-KQ ÃåûÎÈø ^Hœ`<.‡ÁÚ '}üùÒ_˜#^-ÿ(¶9#ÃÙîðØñÐòéùÃù0?Ý{´ÜöÝÿU þ62Æ”ÿÐJåðôåýÀaÕýÀýÿúË?$Ó’øü=þOlW¿~  ú*\0Šÿòú?š-ëÅúàîiˆNÍ–â\_d…ñæÖ ë1þæ ÿÛî!ïñù—ÌX - Ÿº©×c܈ÝõP5Åhêóÿ-ÙŸŒkLs*­ïCÕþ#¼D ca ìÇ=ŠôZº'ºF þ4ýê Óû+?iù?BÆ>Þh*9¯Ûöç/ÿÓñB‹gJ ?%/   ûáÖ¥7¥1€ŠúúËΦ" þûçéøüÌÄôÔùk÷1*ù|ÿùÌ£½ú(F.àüùûýÜÚóÓÛúþÍ•,ºàÏ,JéÃÛ"Oä?¦ˆžäîé>@,î0:õðüëíþ òóä<Âäƒ9x/ÿû.ÊÉÆv®øáÀ !4@ÐË0H©ëøyë2þ /þKnP˜$åh ÍøàÊ£Ÿ¶é<>á«ïv2Ýóp¬ìß-!:/#GÏ*$T=èFi= PÝûÐáý¡§@"ô½5¸ðÀ«ïªU%ó=oÛŸ õøóÿà[ Lð ðôüßöÖô™çðâö `MHAQÄðÀRÿFºêŸæ÷ þ) ¼3xü,üý ' þFsþýÞ%úôý«‹ÉÔ;ß ÕôÈ÷ŸçP ÿ3¡õ«ì' ðÚöàvÿÿÿþýë—_Ri" ûüàÜù å¿êTUï(b…Ä´åómÚ$ø¤* ÷ÿÿÿÿÿþýýO¨+ G© *ãøÚö ‹ÜJþ¼Ø]Ô: ýýð‹3 S®õ3þÿÿÿ¸ÉE9{¦- ÿ°hðÿP#Õi½úèQéúà ðSý#ÿþÿýÿþüøó­LáM©¼µ=Æ( ­"þãÖÿúŸ/uÆ64¼üFwýÐÒyá&öþñÿýÿÿýÿþ·óñxÖ¾•-8÷¶ƒ*}nïÿ­úšþQä"‡yÈqÿøÞºVÑ1K "Ê_iÚàøóþýýÿþüüýÕÃJûn‰±¥'Otú{5Ïüçòý÷äS+g þ  û@S „7ç¢ ¡BH^nPU% þþþøî®T×`F(.å/z$#(WèÂí•ÌÿÛÿþÕŽaòÚíìæäôñ`<ÿçÄt“t «^  ì½ýÿýý ,$ ½PçTØ,üþëíÓ#ÕÛ‡{«7ôaûüòýý øóèå,03>0ÿqvø .ùÿþ*#Ò âÝþÿýÖÕìµ{¸Nü¿¤°ÑZ? ~ÿNšóìÿöîÊaÂùíñö/÷ûúýúÿõõòüùùûù½ËÝžüHãO’÷ àø ÀoþÚ¥cêïþóæþ6a,>r*¥u‘²xæã7½õÿ¼ÚÙ݇(#!@þýòüÃÇÓëc¹Ž Ö »+«à@ø+ëm yßÿ¿€^ïýó&I=ç2q¶FáÍC‹¸/ÍÔŸí'€=%(%ýüûþþÅÚóªâçóõ4$>¨+«ú«ïÿ&«6ÿȇ«òóßK±›·éK¬Å“SK-$ïÑ^@×Gîñõÿê!§T¦Âþ«À ø«ïÿVܬD¾àBú«€Uÿ žà @úþ“s ©â´ÕÛIEND®B`‚phpsysinfo-3.2.1/gfx/images/Darwin.png000066400000000000000000000015231247443170600177130ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆÀPLTE,zŠÙ/IZHZëÕžÕLa¦v_³2?¬²´ÌÌÌžR-⊗ü%LÙbtŠiV†K/⳹φ­iÜâÞwJ4­c@вƒçÉÌÿAdÙ>V“uhëĺž’ÃZc¤Y6ÿÿÿcD7m]uæ¼Áȶ®ÿã§ŸcF㟩I6E»œ}ö8YÝXm‚ZF?0@™™™×—¢ˆXd×sÃox²OD”~„–Yc0u pHYsHHFÉk>àIDAT8Ë}’‰vª0†Ô ‹€b¬ ´@Uô† ‚÷«ŽËõ"ôvÎ! ð?ÿ,-¸Çþ­Ç~°~&À8<>å¼$<Ï$=“ðŒ")K‚`ýD˜8ë, Cγ²”¬ °Ø%È) –¼KˆÄ¹m ÖP;ˆðA °ó™yhÛÒ˜àQÅŸªà¦IqvëõØpÖÂÍ è›Üÿ"GÛæèf÷7‹,Ixâd–®cª/—ã®m;v9zÖAqxÈ“~{60 y©§ÌAaQ­¤~5ÝþLWi¼ìµLÌÂÎNUœkizâ*Mg3FÑc¹€W ¸®½5Dñh‡ÂäµYÝØïÅ?âÛ1åµn‚sWÜ'ûx¶I†A½Ý'ƒh¸¹ñª eT€tÅÆg—ËܤÅn8TëÀ¡ë›”N=oÊÎt¼k\Ÿ™¦|ñ¼9¶‹~5FT~b ¼ÎÙ`¦ß®Ýêwð4JZ°2\nÀÔdEsª!Ϭ0§ ÿÈÖÐÿ¸ @PaÌ:W“˜ÍO€™çÎŧX©Ü•}ÿ£(=ƒaPZB”÷ˆºŸï“]T`…&kn^»BQ¶Û>Àöý-Žá'ضÛbï7Çs[}ûáEÅåã¾yIEND®B`‚phpsysinfo-3.2.1/gfx/images/Debian.png000066400000000000000000000023741247443170600176560ustar00rootroot00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“ pHYslÑ tIMEÝ 5匣‰IDATXý—[l”UÇsv÷Ûm)’Š1`@SÙ¶Š b$$&&ŠÚ˶Ù#‚˜h4%&ð ‰Õ'ŒOÞƈ ¨½¢á›†PÀÝ. ©1X@RŠ”m÷Û˺ô²v·Kµœ§“9sfþgfÎÿÌnrÄ¡•VÙ(PpK· }¢ÌÆèá`¢ã€kOŠUŒ–4.«K&1Ùƒèn,C*æë*·õìsš«Ø×€— èkžµk"l &Ú¿˜€H a•QéÊÆl‰; ¶Ã¹Šê…‹‰«ççøg/±ËQYŽh¥|Ô‰~rݽó¥lK âÔWñ‘Y`;Æ~U9Ôy¤ ðá»L:³ ´vŒxo¥ÛþlQNòL¹Ïï‚YÑ€¨¬&Û¾)¶f”f œØ…‘©†ª’cõL®cŸãÛ8â\åË2×;çfœŸ¬ÙÚ„÷y”£#21[#„¼JÊJ½_C F^ÏŠ>¨L¶½8Ÿ–!¦0ªiIŠš Ù"EàWqROçPq½å²1ò!J¹ {‚nûæÉœœeµ?­Œ8õU:AJƒ©ÖŸé°Ê/jÈ  ;аxÈhÂûj!BQšMÔú4í÷wZ¥Îˆç±˜?´)æ=5ÁÝ?œ]ï(¿]óŽÓ´ò‚(쫦åJA~ðŸøL„¾ÊDÇ8‡ÂegYí¯à;w$÷*‡TÀp}½ùkŒÈÖ‚¬h\ƒÕó•nû{äýz®,åI÷{­(Ÿɼ)îþ&Úä½ã„Q}ß&½ÙúÀ¹'cfe§¥Q¿»°€$p©aŸ“¾¸6YЏ\2X3³µp®Úíú-?Á•Id°^-âµ[ÌÞþQ_–ÞÍÕ39åê*ô$¯ö O•ÔÏϧs&Ðtï¸=jë€Ä`"ÕZ€B|²Ó»zQŽúÔ<‘S·ŸqB•‰ÖžÑþ¡v!È› Ÿ/åÛÁ‚â+Í&€Ó3kïPËf«¼uÃa¶ú¯Ødæ|ÖŽDKçªõîöWºm&²—ãH/ó¢DJóHZñvÿPÑW2žˆÓT=ºFI-´V2ú3B_Ò×å³7žTŽ <é d!Á„WñÁx×%¥ÙœÖ“5V´Ó`wûCÇÙ-ª·!,xT•»ÝLtì(ĨãˆáGUP«ëæÛ(4[\º"NÓ9‘LeÀˆV[‘”}ªº¥ÌõýPÌ#&ã‹0ì‰ùÓÝ@ÅpÞÚWóê#<+íO-ÇJooª?²‚ƒé)7¥ÝNãsˆîñÞ¿h¨åO¦qü«ÚƒÉÅ»€(Pª6UÇ43Q~Eåáš”—¦€äé±%h8†ÊRÕA·ýû[Db=¾Z ¦°#ZÒ¸ì–F`|{>xânºf"*–ŒÐk¼å¢õzW™~ß_Q§¡á–F 'ÛDMý¢dë©›ù€þ/ŸS€¨¯q‰}e®•ÌšÜæbÚä|X×€=¬jzRÉxÏCì‹OÅÖ?ðÝT¤Ÿ?IEND®B`‚phpsysinfo-3.2.1/gfx/images/Deepin.png000066400000000000000000000062131247443170600176740ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSn¦‘ pHYsÄÄ•+ +IDATxÚ ßó©ïú¥÷üÏôþüøþûÿ5 úQ aKÛõÑ ýýøþû $7ýþüúëû”ðû°÷ü÷ú "þð¿)jÝö°øýúüÿþ+±$ÿÿÿÿÿÿû5Ü÷îúþþ 6 øª" &Ìîõ ÿùüýüþþÆ)ÿÿÿþþþ/Ðñó÷ûýüøþÍ-!Éî÷ÿ ùùýüûõüýûþÿöïÿþÿþþ#Ìððùú ôúýüüü5ÎóèýùÈñýÿÿýøýþÿÿ÷ÿÿ’-þþûþ%Èõþÿùöüýþûÿþýÿüý4Éþ,¿çôÿýþ ýûß8þÿÿùþ(¿çÿýÿ& BýI ) þgÔó¸ðüâ=œßõð¬2þûýÿûýÿûýÿûýÿûýÿûýýþý$¿ñù }#ß=º2 v" / þþÿÿüÿ™, ô€ßé{×ñÄ>$ÿøÿÿþþþ+øþýúý/½ò7ø3ÌóúÿÿÿúÃC )¿ÿ‚Ðæý ÿòþþüÿûÿüþÿüþûýEÿÿ’Ýùaž,’á÷ÿþ©àòcÈóøüýÿý1õlÊé—äŽ* üú|(øÿùüÿûþÿûþþüÿ6ÿû‹ÒôFØíúö%ÿþ¹ÎßYÿrÅçÿýúø8¯â÷ïúûþôðCþR öþüýüþüþÿüþ ÿ¤Ýì ùø& ’Ýùúý ùÿßúE ¥ä×÷ýýþý - òûþëüÿÂîþùøýÿÿÿ&ñùÿûþÿûþûþôôüþü§àÿ:ý þ¸Ýùðæøûîúþ4ú<®Þÿþü2•Ñè¶ÐèF&ýúþÿÿÿ¸P'úüõÿüýÿüýüýÕâçÿ!ø¡H!J´àþ]óÿÿ´èû öýS- ûÑçõO ¶ÛçÑêð6  *þûüùûþûþ™Þùî÷ùiÂåÉíýýöõŽCü¥Çëùïÿ*õÿÑòý+ ÿêõ óú ûýýÀN#ÿúÿþüüøþÿÚìþú÷t'³×òùªPÿßñþV.ÿÿþúÿ»áñüÿþ ûùþÿþù÷ûÿúþ©MúÿýøÿþÿùSµá2ÀU Üa> ÿü7©Þûûýw7ý¶àøúýôõøüþþþüÿüÿ Õçð < œBùûÿúþÊáúl½æ& åüþ ’ÏõÿA þ–Ä×ÿüúþüÿþçõûÿô†Æâ·ÙòÂ`+ÿÿÿÿäøý1•Ùùÿýýÿý÷þýÓo3úÛ÷ø:œÚþÿüüêy0úmµßåîøV)Ðàôÿÿÿÿúìu'’I!øôôÿíøûþšQ!Ño-ÿþü?—Üÿùüû* ÿþÿ¯Ïçt@!$€ÍëøûÿÿÿV)U(2ÿÿüþýú+Ã÷ÿüþøi2ýÿÿÿüøøA  ÿ|¯ÛûÿþûýÿýÿÿüþÀÝõÒñû úõúÿôþ W1þýÿq«×! æöú$Ò C*R-E'ãîò‘Âë ÈéüÿÿþýþõmA }DüúþýyÌ®h)?"/†Íäìôýüúùôöÿ øÿÿüþø ÿôýþýþùÿè†7ÿÿþt¨Ö«Îêã‹C mÆþþ÷ýýýÿýûüÿÿþøüÿð‘9 þÿüÔêø8…ÓÚ‡6 §e%üûÿÿýõúþÿûþýÿýûüýüþýþýýüÿüþüüûýúûýýýýýýý÷þÐx+þû1}ЊM M.`5üüûýûþþüüûÿÿûÿýþüÿüúüúûúýûûþ øñå–:( ÿÿÿÿð÷ÿb¶V3kF'†°×±ïÿûÿûýýý%Ȉ<ýûÿÿÁØîLˆÕfD^*¼ÓéN†Êÿþÿÿõ¢w9=$þýúöøI‡ÊÊÜöŸi+Y?Ax¸Îßýúÿ Ê< üÿýüÿÿáìõ>zÆòõû" Ò—D¥Ö¦Ù þ! ÿ üþóú÷ëìüîõþýøvQ!tV& ÂÖåÅÔøßéôþB*>.ë.2_›¯µIEND®B`‚phpsysinfo-3.2.1/gfx/images/DragonFly.png000066400000000000000000000034151247443170600203560ustar00rootroot00000000000000‰PNG  IHDR' ‘¦asRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<tEXtSoftwarePaint.NET v3.317ƒw†gIDATÍÁ}LÔ‡ÇáÏïŽ7¹zÐÃw?f‡hk [µQiUn“8Åé2’µÓU"vŠíÔ Ãé&¾+ RäêµTQ¬/íÐú_Pg•².ÁY+ÑTÛé1‡Šn¾»„­l8íÊóÀÃsÓ-VãpDtÐEGç`x¤õSàÀH ˆoLvÆßH™ìд2S öÄhÆ{nå–ÇhÒÛÑ0Ò®P›¥èÍÿ‘ƒ’~ÞQóvÅèÍæ6|hêý?›7ٮ͙ZwÜÔÒƒ1Ê\ã’û©@2’ÛíŸ ¼À×ÍKeW~EŒÖW™ª¨s«ú3·N]pkü¯m:yÞ­cgÝÚUcjõQS36›ŠŽ ¾ÄsWǰ°°±qqq³n<¨‚‚‚+ ¨ªªÒ¸qãÊ Ãè<ûÝ^a·sËc´áCSG>qëì%—öì‹R^^GÅv¶jÞüŽªù‹S§.¸µ¯Î­ÕGMM|+ZA¡ÆQà±.]ºLÍÏÏ¿â÷ûuóæMEDDdò f744èŽC‡µ$%%]|qªCoÿÑÔSn}ö…Kׯ»ä+´ëà( FÎ;õ†Ï®«.Õ]pk×Ǧ +L=“©™3g6øý~ÝQTTÔ¸ù„¦§§W777뎖–íØ¹MÞé}UQåÔß]ºÙäÒ¢…5)%L‹A™éá*Y¡›M.}ÙàÒ‚4mÖx?^÷ª®®–ËåÃCp{½ÞS·nÝÒ½nß¾­õVÉçë®K—œZûf„r@³As t`ŸC{Êš3çgª­­ÕýŽ?®=zÌàˆ>|xéþýû[t¯¦¦&­\¹PéßsèH A£’¨#Gë~~¿_yyy—ÇËpiÇÁ'´w¯C;w:”jè#Ð9ÐЯú…hÛÖÇU¾7J[+zçSÞâh%< x©S§NÞ>}úÌ6l˜/ÑÓÿê„YÉš–;TyCµtY²V,OV–'Q…={jaLŒV ¬—jÅŠdù–$k~þPM™?T¿ÿCy<ž#'766ö·V«5 èØh+‡Ãñ£œœœÏ+++uùòeµ´´è¿illTΈ*ŒÕÉ“'Õ7nÜЉ'T\\|+111‡¶HJJZrýúuµESS“J֬Ш~ÕhUp°¦Ïœ¨sçΩ­²³³/ÑF¶„„„¹>Ÿï˳gÏê~ÍÍÍ:v옲çdiô”8­ÜëÒôÅ] ôºÓª²*·&æ9•9k¤ÊÊÊtíÚ5ÝïêÕ«Ú¸qã?RSSßžá†1xÈ!‹½^oEVVVeZZÚ»]»vý=0((ĨúAª]3¶˜z½ÜTÍ¢+ ´ñvì‹Ñ„¢hÅ=Ö äDDD¤§¤¤{½Þ}YYY•©©©k###ÇQ|C‚€×Bm–ÓO÷ë ä†€b{†ÊìòOÃ`;ÀC쀅‡ûüm%È À“@$Í}NA‹ »À&ˆ8_ÉŠ€"`$`VÀX¹+pÑÊÊ]`!` 4´€:Àz`7 쬴2ø[;%‚‚w[Ç5‚ÁdZ½T9À`0(k€| X Ì|Àf Ó«àß ²B)° ”‹;0x\ðWÁdÁfÁnÁrA7ÁÁó‚§§ È<´Ú ìlÀ»À,`?P 69´Ôϯ}gÂçõ Š%@/ è,f øB0LP'p Ò»Ï º>! X ¼ŒÖQ@0X &SRà—À:` ð}àU ï+ðéðI«RÀ ¬ž @à” N 6 6 êÛ‡5‚¡Ø£U4­\@,ÐÈ~ ,¬@w  @HT×€€€VN ˜ËWn)„ z ÂK`á<$Aü?†òù ‘¯³ñm €€§iozÁ² E{ÓfA L{Ó&¥Á5Ú©WÒàíTÊ(øí”§?”ÓN=iƒ‘-n T2ŸŒšIEND®B`‚phpsysinfo-3.2.1/gfx/images/Eisfair.png000066400000000000000000000073631247443170600200610ustar00rootroot00000000000000‰PNG  IHDR00Ø`nÐtRNSüþüè3Z ¨IDATX…µ˜yxTE¶ÀOÕíÛ·ûöš¤»CB'$C(qÔQA‘€O·§OpñIÜuuø=uÆeuw‘E!‘B°³vw:Þ·{oU½?:D àè;_ÿÑ_U[¿{ι§Î)¤P~›ÈÑ/j­cŒ2ÊanÀ8þ­4²üÔËs¹»~­"¡äLšßÈð}þSÃï¾Å•âYi~ –gg(ºµºþíÕë ¡®ˆ:ë¸êB”ýÀ–M[¢áÈ™S5Çšq8¤×X7|²A%‡µçØæ\¢ÓéJ番ø_0Ðyƒ:.}véÖ¯·Þ{ÿ½:ˆ¢Œ!„¡TÅ©â„{gW(úo™dÓÀaÌ(¥ÆŒ1€¢ŒAÿ? IÚ²yK[KkMmÁhèÛî<òû|/¾ð’VÐŒ.*ºÿþû,VË€²ÌŽ~ÓúùÜ+ÿìðzgMµÏÏk%EQÖ®Y«4™™öSƒÅP0záÅ—Ìi©ÏD­ÕœéuÆ £ƒõ% –®½bdö_v~{ GQØ ¥„|ºnãæMŸ•W,KM33 ÀóùÏ++*SSS.X µŒ%ÍßOº»ÁçÄ °ÚŽÎ4ƒp˸¼ú±w6·yüÒY«(ÊúuÖ®Û°|yEAÁE@àp$––'þúæ`@Áp¨²²Òh6.Xø˜xޤÒ®.F)Us\ÑPã±–vµx]]˜iÕ˜Þ^ßr¸)Di¿w „|ºáÓµkÖU¼P‘Q¾€ÐÝ¡˜0s6·r7åúsE£ÑʲJƒÞðøãOˆZ19ˆ:Ýe² í3 0’j4V75éõ½ÛÌ0þ±0{ãw]_ïóƒ4a‘ ‡É›¿\½zý³Ï•çåz|r Nvê sš2eŠêò‰IÝA‰ÄÊË*D½îÉ'ŸÔf›Ó]ƸÜ,ŽÃ”2IB:QlqvH !$$W™Dõô’\o(qâ…ÜVµg磋VÊ4uýVoÈïᮋ‚M³áM¤æû^¶Ÿ…b±DYy¯R=ýÔ3:xúTŸ…ƒ@€z»ƘRÆGò‡¥‡Â.gOX-ü¢‚²5À€íÙ÷Õþýßͽo1ðº]íÐ}bøî]ÈÐnµ “`OïÓêg¡o¼±nÍÚ™·Þº¼¢¼¿Ù"µGj+Ë+µZ-eàóQED)Eùbq‹Iæ}/-_’–*K¿L0…9•úÎ{–óÈqN‰%›6ùï|hˆ½¨ë»Í\Ô¨®¾nÑãOäæ °Èï÷×ÔÔ'Š>£C2{íK)CuÃã Å/jô!ë=×]æt! ã_nÍ'+o¼}ñOá 9زæÃðñŸµÏ,KÏÌmpx¼ž6Öÿ¼C“ÿxmñØ¢ÓGe.g”çGä”`ÌXO4¹ýsn4/ýxkzÈ´ÓN6C"Ž0F„2ºñó¼.:+'¬^ºÄ­³ÚÞz#JSmÞ£j`vPŒ¶PÔI E‚S/F)„ÂÌëe¡RdmAá$Œ 7¬°ä÷Œ£ˆæE—§Å鉥˜4®8¢”!€GOƒ»[à•¢_¥-ßv|òLësÏÆbzJ&)$=U ýÓ­ªòøŠæÄÉäFí¾£ É,àÅ㌶œP†‚$ê¥ÃË @Å9ÖíÕ'÷ý鲡Ý^ä Æ¿=ÒvI~Ñ(qÑG.ãÞGî¶ø™=™2ŸîÙ^ · Ê*Nþí‡Ð>+JK¨Ó>kßÏûœžVƒA±ÙŒ¢$3³NmÕ6£FP©šÄ }Y€2„Àj6=ÔØuÛ5ö¦.o][Ï3†ªò³ uUO¿|Ï‚ûº=YîÕ’b1ªá Q´æe#_íøÄ¦Jß`ü'ïÊsHÀ¾¯‰:-¼ÅÎÛ ê,G«ú½MUÇ_—jÐ%Ô h8ŒÍ¢Ú¨D5‡fƒ k””‹§L2MÃËÿ³Ê¸rE›ÚìÊȽëÚñ=^!;•¸Dã$-å,G» ôjñÁw°OÑÇc3³Ò-Å„»*ÞšpC]¬z_l—‚[ø@ªlGã3ìꡈ¨Bq©½+ Aà ÏfF':¾ ¬v¶s‹—˜¿ÿö°µÐ÷âË–/þîìDfsŸŸã’Ý|–s¢—Q…{ÿXmH«…pXc„ÌɆ¡×[®Œ©‡:ëW7}X_ûCl§ZؘÁe2æ¤gåë²l‚N’™Ù’Å£Æ÷6–¼ÿªÐÒ\ÿå×'^^ô-ŒA2×#„NP58"˜<°M¥BÐÜÌ‚âq€¸šç­ãuãu3'Oï î]ÞºãôðTw8qˆCHíÖ›°i¨&]/ {힢Ζ±ýìîÜ}Ù4ó«å—äµ¶ Hô´Tƒ @VƒæÐqâ4ÒY¼¨Ó¡”ðz{Í+Ë`œ9ã!p%)ö«². *3›¼{=Õµr“´¹„¶ž¸{87ol!4z×Âm™‰öK'Ý<*•Xl ŠXÅFÐgƯÂ%#‡í´_9 Ì: Bž‘Äb§ òªxŒuÆ‘Z Z­qLŠáŠì‹BñY?‡œÛ;$\µÙöIÈj~ÍÔ`+ygkæ\áÓ%Q¶ !™™à÷£X,é;€!)ºk®žáòƒÁ8(²Zi{;¢§ŒÝWœÉ(2ƒ°+™™ÿ±KYµÁwO¡ëê[²tÔÛéaFEHïýNÍŽ¤ímácï·¯¹*Í;Z7r¨ÍŽ$!Ɖ8ã8h¿k0 I¥ÓŒJ‡Zœ³ ””'Wïùþ§‚Ëý¯¼~Ãä¢ÚƄѨ”äxmL–=1Â’QG(PÊQ² ©÷T.[£ËbÏ›8º©Ë—{©ò¿ŠYÙñþ¯òEÎÿÈZ¯­û×MŒ~ééVsc#(1~G³ûþi™ãò²w=ÚÐâ6iÆH¡ÉÚWBõü#Æ •ö7µ}µõŸ«_[”5T__Þ;;P,Îúr„/œ8ðsgiF·eþ}-Û¿}Ãß—‰‚ÙáI£P)„NSˆ E¢NÕ §¾OŽë+rèî†Îöh÷Œ+õæPUªqhíÉß:õyS ‘00!·?ú¯ï÷.ÊM˜î}ªÊhôÞµ(r´2F“E* „²,âÁúHIñHn=—„ŒõqB%Â;½¢Þ==ݬSõôôœ¾cRwÂ9}Ñí‡æí\eZUóý%Ss_Z–¦³8ÉuªȱªN´^1Ú¦×hµ¸ºzB”é“ VÛêâøØ5ãL©F &‘HBÁ’,Ž.(‘`„ ‡;\ßáºÝ{Pli}ëâ)=9Ù¥aÁ„¸dS„1bŒQÊ8†./,ø¯4ºú#‹ì\0…NgBQÊ­ÝSÏBŸîºqŸYkK;Ïó<ß/lÎ $IpÂlluÝܰ%ðýnß²¿Ü>fQxNÅ÷6h(¥cŒC.²›'”½ûåÛ¶Uw¼²üùßH „T*Õ%£SŸøs%Æ}Û¹wWù³åee傦_¿uΠ®m×h½µnÃÁ}GÜ•¥_|9 QÅ,òcÉn‡1–—n:Ö!O•ß’' Œq4¡´ùB×_–a2é ƒÁ`Ðë µõu}eÅâ%‹ÿtó ˜;ßáÊb1¤Õ&žI‡7}ÜáÏûÏE¹Åcp\V(“d’ Ф(jNeÖ fQÝ”‡‰f·sX!„pÉ2Ý{ÜIÄyŽ;õPUUUö\ùÃ=2}Æ4ŒÏW~0G®XNfßÛÝøfϸÒ{ãF[SO7Ï! Ôj2 Pd` €AŽÅàÄm½;7"½;Ǽtqž‘¢9Xu¨ì¹e>øÀÌÛfô¨ƒ%6}Á}óµ´cgƒ%û¶eOÞ4}” V©ùsݤ@š…9],èÇ”²l‹~o³lAŽÃ*’Víp—^o«ßÚë•Ú#G–/«œwç¼[gf ЭÁøñGAYÙŸfšºtañìéøŒ 9S´”“ >#ëî‚h™ËÏ´FÊÑv_ápm^¦>¹¬¾¶þù瞟3§ôŽÒÛ9îìW°æP¤¨5ˆâMeK¦Ì» «.èJ0Fi©`2²é3þÙˆÉ >|ïµC“¦=ÞptӦͷΚuÇÜÁhíLÄ>”bSçÞ9vü¸æææ ¤ ™&z’‹¸¼ÒŒ‰¼³ÃA) ‚+V¼ùØ¢ùóæ•Nna_{õõÝ»ö „Ð å… cPuܩ˥%¡<¢T¦”–Þ1göœÛ9Õyhý.Bü÷ëï¾õõŽÙ“JÞyþQµæ,íé ò[oòÏŽƒ‡çΰšR®™0ú×Òü¿@V–õ©é×Ïþoèþþ.KŠ,+Çy¹q^ù?¾ A4…X¨;IEND®B`‚phpsysinfo-3.2.1/gfx/images/Fedora.png000066400000000000000000000013461247443170600176720ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆgAMAÖØÔOX2tEXtSoftwareAdobe ImageReadyqÉe<ØPLTEÿÿÿE~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~E~H‚K†NŠQŽS’V–Yš\žb¦eªh®j²m¶pºs¾Q†\–vº| \Ž b– …Æ0h–0kš@tž@y¦@“ÊPŸÒ`‹®p–¶p™ºp°Ú€¢¿€¹ß®ÇŸ¹ÏŸ¼Ó¯ÅׯÈÛ¿Ñß¿Óã¿ÜïÏÜçÏßëÏåóßèïïó÷ïöûÿÿÿXxÀtRNS 0@P`p€›Ÿ«¯¿ÃÏÛßíïBóåžrIDAT8Ë…“{[‚0‡qˆ]ÌŒƒ"¥©³2‹.v£"íâ¾ÿ7êœÛ žÇß?LÞ—³ÍYµ-±j–J½ ”–gëwZ`MT:î?¡a`JÛ.lÏ`Iš¾AໆÀÚ¯e}àjÁøþWd™óÈ·7BCó‚«tùÂù¤ÛÉfôGø rÎûàe‚§ù; 3cÎÇà3)| ñ‘Nq ê…:*<›Â û•™|Žª„ùŸ …㌅Wq£âã|€œ‡øÖAA6=˜Ì×B囸´Ð›p~/Œlx.ȹ9Ã’úYá)PÅqf=$q|ÓS]Ó* ”–™¥%……*…†ºÕSB(OKBSž&tó]xDáAs— úh"üýõöâ÷عÿ CFH¶H/¢ÂÁÚS)0(ï çíâøÅÿµÿÆý~ÉÎ,À€ûÝÂÿiëò÷øáú÷عÿ 3BJ¹9*ˆ«ë¿Ä·  þñûëþrøú ûïã ñøàþîÙ¿ÿ 7=+'½þ£Æ¢îÒÿ_Jöü0(37v ÿþô!Žùðÿþù>¹íþå h/=&%²º£öÓÿ_éäñ=ø úûù23þ‰ûÿ þúùèüêô°™>zçå úîýTöíÿ­ü ¿§£öÓÿ^<Ðïóû÷ýúàíêïca) çრúóYùíÿ­F†Òº[ÿëù¦ÿÌ»ñ,.ÿD@îôÿúÌÒîѧÿåÿîÜßï úü èîÅÿ¨ÿÿÿ– #-k¥)/ñÚâ ÚáÌÿÚÿÿú)Jð+5ûýý÷¸ ìÝPÿï¯ðAðïìïúóåïÒÿÿÿÿ=j:786ØÛÞáÆÆ±ÝÑ2yÿæÍ×/Mý9ÒÿÿÆÿ´ 2,©ÎíA êìý Ïÿ¿õ2ÿÿÿOešRDÚÞêü2.&%úü¶¼ßàùãã¶áëýéÿüÿ ô ýòùMèêÿýúøcè¾ÿžÿÿÿ>}GG‚ýüª¨(TUáØÈ¯&,;ƒ&"þÿìíéìôôöùõóßâ÷õüýø~Û¹ÿ‡ÿÿÿ&M :Ñ­`1ÿÿŸø06ç!ê3ønø ûùùíìëóW0ÉßÄÿbóÿÿÿœ Á¾zIEND®B`‚phpsysinfo-3.2.1/gfx/images/FreeBSD.png000066400000000000000000000050021247443170600176750ustar00rootroot00000000000000‰PNG  IHDR szzôgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe< ”IDATX×i\U€¿{ßëez™îžÉÌd–$“àLȆ˜PƄҠXZe©HÔrÁ_ZÄ¥´¬bqAEE©¢d“€X²H0Žf’`’YÈ6™…™Ìôtzúõ[ïõG¿N$‚žªóãÕ{ïžïž{îYçD„  8H)I&“†•Ï…(¥p‡r¹Ì‘ÿ°Q}ˆ @; q 8@ „ —ˉT*e&‰X"‘HJ)SRʤB¶ÖzÆ÷ý’ã8–çyîØØ˜>sæLÕFHÍ@˜F€R e­”·n™×¾±½»Ë?06vð¹7ÞèÙSöw Œ¡ys;D6›mÍår‹»»»—.Z´hѬY³Zr¹lÆ0L£T.[ÓÓӓçN<|èÐþ‰‰‰ýÅbñDßÀ “Ÿ<ͪ-è¸jÝ‚ ÖÈááæû?¨o;°Û¤€Ö«•úDÓT¾ueÓ,>ùãŸ\°­ïõ?öÔö×î}e×SåÆ¶Â [¶\uåú+/îêîj1 ãíŽUª¢¦I¾X´_}ýõ#>ôȳÎÔØèMWt­ÿâæ-¬¹"ã½ñ/vÞv+k5g|°öVϤëVxt6\4/a²êúM´mù´7`6£õóÊó-©{‡UÐ:c£øÓÓÖà›Duèö„¶ŠE·µûÒfþ«ûèûÁíô>»Û×ú.øÊ1­_]­å†xüá߆þ­@ïI }æƒÝZõ<¯ÏŠòµÖ¾ÖÊÓ:°µò­xüøc¿¹ñÆË¿uKTxeÔLQ—®\"ËËEûàƒ. ¤(ÃWõèH;ÖÌÈ/來« žø §Ÿx’‘’Ç)à‚«®æŸ…Âîc–ÕØæÙcÞ°Ö#Ñ­ºl:ŒE¦‰hmŸ†¼NaæA¹hÛÆs l/GÀ4Ú4‰CåñûÀxý'f<ŽùÀÂ…,»öZxüñq3s}ÇÑoPJ%®ùð‡/_±ly68~økº8Š;ãÈ™Ôðþ‘ÃXGG™,å°\27C54Àâ%ô˜ $¦mÆ]Èg2\¾y33¦fã¾°öéÞÞù3®{Lk˜gS¤Ö?z͇b2À:v˜Hç]<:zuhy°µ{~ÿ^AS¢””IIX€%%eÃÀééÁiï |Ñ2J##dÒõíëgjrˆu7³}éò—õö¼Ò ”ªfK[[ת%-,íÿ'*‚øÅ«‰,j`7îß¶£w¼„88ÐØ ÊxøÚ#@ã¾x€S.S.)§ÓØÍÍä3iŸ)Ò.mü‘.¾då%½=¯dj"Ë—/ïnM&¢ùg¥au &áí¸ë#O*¤ •baUüƒW I Кðƒ/ð<·T¢49‰Ñ1‡™’ÏÔk=\²bÍb  ­ÄÛ;:fÓÓxƒ»f/ÅýÇèþ=ø/<‰;¢6ú\,…•Ê…³~ Œ¸A@Ô¶IùSÅ" °–´Ð±úÚ,BäÐZžõ@º>“°'ÇñŽœ <ýnrrò4ÒW()´¦ZtP UAªjQ H*Å~OQçJ‘‰¦ú¨”fJÞY{¦ˆ5¡HZiaD$‘¸DÔkÜÂ9]à„ÏèR€J²ZZ² X)Â×g¯¡oY–­¢q¦Ê32"Ð „™x| 2tsÕ~ @«¦V  u¡6 ˜Ý2zóOþ  «µÀ>ujB661 ®&ðÀ÷Àu4" FN`׸»j5Z–ðxœ0¦B%ÃŽ¤ëÚED7¬døÄXô ªîk{÷v››§±“L‡ž ž£I´t¼bÔ  ´†.·k‚Ò&ÃG€ù 2¬ºg˜sÙ³ï@?pºÀ9ppè䉦uWóV,WWŒ»à:•eæJt¬bÈfB—'BoÔ÷Ã…ë€ÎD„õ7¯$Ú±²e²óå¿ïÛ2dM\|ðìíºéËLHãh—¤H†©@úé˜ís™uýVöÓ¨?}Û~zêĉûªÑ>B׌¿°ãù¾ÆuW.ݰvUsùȼ‚MLALh¢B`ˆ m0˜ Ì GaÆ$©usH|äK윈Û7n»ûgƒýý÷£5伄Á|ª§§gïÁh¬nå¦MvF¤)'§ð-éj4ޝIúšˆ§1DsÒkg‘üìbÆç]ÆŸ<=ðõ;îýÁøèÈïßÍxíhv>‰­f2õ‘­_÷™ë2©UK­™xãø[h«ˆau&™E%bKAg=^’¿îǽ}ì¯G> ï¼:ß°ø^b„Ù´Hdeçœ9—vg3ΖÌËF£I3•^Üõ¦Åäø›“ÖÀ«ý¥ƒgò… /,î{M«ïWªCf]8`fC0£¦öäÃ[—÷·èÿ+²f ]£ÿ“ü™~ÒÛ¬¬DIEND®B`‚phpsysinfo-3.2.1/gfx/images/Frugalware.png000066400000000000000000000061661247443170600205760ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSn¦‘ +IDATxÚ ßó±ÀÈÿÿÿüýûÿêçåPA9ª»Æ ù÷÷Õèîõû  þÿÿþÿÿÿýõîXF< óøúÿÿúûçðùâìøâì  ÿ ýÿÿÿÿÿÿÿÿ ýþÿþþÿþþüï÷õøüßøüß    þÿýÿÿÿÿÿÿÿÿÿþþÿþÿþÿÿÿúøøóú ýÿÿíóùíó  ÿ ýýýÿÿÿÿýþÿýþÿþÿÿÿéìðñôìî÷  þ üýþÿÿþÿÿÿÿóöüçí÷Öéÿ*õúÿÿýÿÿ2øýþÿÿÿÿÿüûûïõÿýýýþÿýýþþþÿþþþíòùøöýþþþþþÿùøøðøÿþþÿÿÿüøòE+æìòÙñÿþÿÿÿÿÿÿþÿÿÿ ùûöýþÿþÿÿþþÿëòøýþþÿþÿýøô—tX±¿Ïv¨äýýþþÿÿþþÿ ÷ þÿÿþÿÿþþþðöÿúüþþýþÿÿÿþÿÿýÿþþþÿþþÿÿÿþ û ýýþÿþÿûúøï÷þþþþþýÿþþÿþ™®ÅÑÝîæëñÿþ ÿþÿþþÿþ÷ÿþÿÿþÿÿúúüïõÿÿÿþþýþýþÿÿþÏÛí½ÙùþÿÿÿýþÿþÿþÿþýþÿýýÿýþÿúüïôùÿþþþþþþÿÿÿÿþcK,I5ñœ¶Ó×íþþþýÿÿ ø ýþþýþþüýüîôýýþþþÿþþýÿýþþþ5,"¶ÊàÖêöþþÿÿÿÿÿ ýþþÿýÿÿù÷÷ðøþþüÿþþýþÿþýÿÿþÿÿýÿÿþþþþþ ýÿýþþýýþúûþîôþþÿþþÿþþýÿÿýÿÿÿþe„¨¸Íæ þýþÿÿ üþþÿÿÿüþþõùÿó÷üþÿþþþÿþýÿþÿþýþþþþþ ù þÿÿÿþûúûíóýÿÿþÿþÿþýþýÿþýÿþÿÿþýÿýþ þþþÿÿÿÿö÷÷ñøþþüþÿþýýÿþýÿþþþÿÿÿþþýþþ ûÿþÿþþûúþïôûþþÿþþþþþÿÿþL†þýýù ýÿÿÿÿÿþÿÿ÷öó ó÷üþþþýüÿýü þýÿÿÿþý üþþÿÿÿÿþþÿ ðá øþû ÷ùùÿÿ  ÿþþÿÿÿÿÿÿÿ $'üûùùõôôñé ö÷÷þú õøüýþÿÿÿþþÿÿÿÿÿÿÿÿþÿÿ þþûùøöóñõòñû öûú øþ÷úüÿÿÿÿ þ þþÿÿÿÿÿÿÿþþÿÿÿÿ  þüüúøöôñî÷ö÷ú÷ýûöûúüþÿÿÿ ýýþþÿÿÿòïí ÿ  ÿÿþüüúùöõóïéùþýù÷ÿüöúþ ÷ÿÿÿÿÿÿôðìp”¬ ÿÿþýýúúø÷ôóóðîúýþ þÿÿÿóðìlT©=ƒ@t¡ŸGIEND®B`‚phpsysinfo-3.2.1/gfx/images/Fuduntu.png000066400000000000000000000101441247443170600201200ustar00rootroot00000000000000‰PNG  IHDR szzô+IDATxÚ ßïÿÿÿ ÷÷6þýý±ÿÿÿüÒ©FýêíÿÆÓj’Òÿöìåÿÿÿÿÿÿÿÿÿÿÿÿ  ÷ÿÿÿÿð~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhQ»“¯÷ÈË÷ÅóûÈðøÅñë»óƜ݇h›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ-úúÒûÿ"ÿöÿ䥓A)Éþüÿùìê·ÃÀ]‚ÿM!!úúÒÿÿ÷{¾@)Øý÷úþýúþí[L>Šg´Vââ‰hl«qC\þûþÿÿÿÿÿûðJ@KLâ"VR4`÷þþþÿÿü,+èC6­õõ0þþûÿAZ]Í(:0ûÿÿÿÿÿÿÿûA5ñûýÿÿÿÿÿÿ ÿýÿþÿÿþÿÿÿÿÿøùýýðüÿÿÿÿÿÿïòúúÿÎÑÿÿÿÿÿÿÿÿÿÿÿü‹£ÿü–üÿÿÿþÿÿÿÿÿ ‹œ±Ñ³MüÿÿžnûÿþÿÿÿÿÔÍ ´pÿòLìýÿý“þüwÿÿÿþÿý³¼ ‹¡„Õåÿ“ýûÿxx üú\þþ÷÷ùÿèéýÿÿÿÿìðÜ-"¯¤µ]ƒÿtNuÿÿÿ“ódöýmíÿþÿãöÑ,þ]ýþýþþÿþÿ âêøÙ÷à²ÿÿÿöt ƒ pøò  ûÿÿÿïôÿîëðÿþþÿþþþïúþèý0Riÿÿÿíx ¯ÿô|þ  ûþÿúýþÿýÿÿûþÿûÿÿûþÿüÿÿþÿþþþþþþþþïþÌ” }%üôP ýÿüÿÿÿÿÿÿÿþþþüÿþüÿþþþþÏúúš ý£ÿþÿÿÿÿþÿÿúþüÿþ×_x >þÿ7ýÿÿÿÿÿÿÿþþþÿüüÿúúÿþþÿóýý üúÿÿúþþúÿüþÿþþÿþüÿþüþþþüôùÿýþÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþüûñüÿÿÿÿÿÿþÿèâþúþÿþÿþÿþúÿþÿþúþþƒðÿ¼ Öÿÿÿÿÿþÿÿÿÿÿ ¼pvá ÿüúûþûûþþúûûûþüúüúùÿîÍ ÿþ ÿ þ þÿ ÿ þ ÿò÷×ü‚ÿ‰‰óüùÄþú÷øüùöùþþ÷øþ÷øþü÷öüûÑÔmÛþÿüÿÜ èÞûÿÃúÿÿÈýçýýüûüüüüúÿÜúúÿ»ÝÿñÝñ0ýúÿüÿÿÿÿÿô÷Ùÿç±öÿöùÿ¨üÿïÿÿþýÿþýý ÷ù; ²ÿÿÿ[&ÿmÿôÿþÿûòÑw¾öÿŠ 9üü8ûýý³øûÿ¹ÿÿÿn öÞþÑü/þ—óÿê ÿééÿÿÿíÿÿÿ¹+DQ÷yIEND®B`‚phpsysinfo-3.2.1/gfx/images/Generations.png000066400000000000000000000061711247443170600207510ustar00rootroot00000000000000‰PNG  IHDR üí£ pHYsÄÄ•+ +IDATxÚ ßóÿääÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýõÿ þ÷þýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýøÿøãþþþÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþþÿÿÿÿÿÿÿÿÿþÿüþÿÿÿÿÿÿþþÿÿÿÿþþÿÿÿÿþþÿÿÿÿÿÿÿÿÿÿÿþõ üÿÿÿÿÿÿþþÿÿþþÿÿþþÿÿþþÿÿþþÿÿþþÿÿþþÿÿ ÿüþÿÿÿÿÿÿÿÿÿÿÿþþþþÿÿÿþþþþþþÿýýþþþÿýþþýÿÿÿÿÿÿÿÿÿþþÿÿþþþþþþþþþþþþýýýýüüýÿùüþÿûüýÿþþÿÿÿÿÿÿÿÿÿÿþþþþüüýýûûþúõüþúþþÿúüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþþþþýýýýýýþþýûüüýýýýÿÿÿÿüüýýüÿÿþûûÿÿÿÿÿþþþþÿÿþþþþýýüüýýüüûûûûüüüþúÿÿþ þù ûüýÿÿÿÿÿÿÿÿÿÿÿÿþþþþûûúûÿþüüùùûûùùúú êñÿýþ ø ööÿýýÿÿÿÿÿÿÿÿÿÿÿÿýýýþùûûûûûøù÷ö÷÷õáä þýóóÿïþþþþÿÿÿÿÿÿþþþþÿúúüüûûùù÷öøøèîîí ÿö÷óòîÿ  ýýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþýýüüúú÷÷ýîóððâáóööö  ýüöþþÿþþÿÿÿÿÿÿÿÿþþþþþýýüüúúöðôø÷ÛÜ ¯´ÿ àäëé þüûøýýþþÿÿÿÿÿÿÿÿÿþûÿþþþÿÿþþýÿ ëëùøìëke;?¶²ðòøùùý üúþüÿÿÿÿÿÿÿÿÿøìîýõöðñçìÉÚ?>#GKùøãäóÿÿ üÿÿÿÿÿ iPÎÎ}ëç¹¼àãúúúýýÿÿÿýÿ ú ôõ¸¾üüÔØ·º5- ÷ÿüþòùþ45ÆÎ3)õøüùþÿÿý÷÷ú $÷ýý&!ÿ÷ þýÿ  ÿÿÿþþÿÿ óßå ÷óò  þññý  ÿüÿÿÿÿúÿò òé)5 òþúþýýÿÚÚþþþþýýþþüüýýüüÿöûþúûüøøûùüüýýÿÿþÿÿýý ÿþÿÿøöþþÿÿûûÿùÿûÿÿÿýþþÿýÿÿüýõ ÿþýÿÿýûúÿÿÿýöþþþÿýÿýò þÿÿûûÿýÿþÿÿÿùÿÿÿÿÿÿÿÿÿÿÿþþÿÿþÿÿþüÿþÿÿÿÿÿÿÿÿÿÿüýúÿÿ ÿÿÿÿÿÿÿÿþþþýÿúÿÿþüÿÿÿÿÿÿYµOìK÷KIEND®B`‚phpsysinfo-3.2.1/gfx/images/Gentoo.png000066400000000000000000000035421247443170600177250ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE83,lknn¢sn£to§pm®ro²tv wy¥}{¤z|©qq°vs·wt·rr¹wwËyxÇ{zÇ|yÄ~ÆzzË|}ËÍØ€ ƒz‰„{ކ}‘†~‘†~“†~–†™„}ž‚|£ƒ°}´„²~È€~͈€‚ƒšˆ€‰€’‰‚—Š‚—‰›Š™‰€ƒ§‡€¢‡‚¥ƒƒ­Œ„¥‰ƒ¬Š…©Š…®Œ†ªŽ†«Ž§ŽŽ©…€°‡‚´‡‚»Šƒ±ˆ‡²Š†´‹‡·‰†º‹‡½Œ‡ºŽ‰¶Œˆ¹’¯‘‹¶‘¼”• ‘’©–¯œœ¦œœ¨œœ®¶“‘½š“µ¤¤¢££©©©­¥¦µºº¯¹º½€€Å‚Ì……ÌŠ‡À‹‡ÈŠŠÃŒŒÂ‰‰Ê‰ÉŒÉ‰‡Ð‹‹ÑŽÖŒ‹ÞŽÙŽŽÞ’ÄÑ——ƓΔ‘ÎÇ——Ð’’Ú“’Þ—•Ú˜–ٟכ™ÛÙ‹‹ãŠŠåŒŒâŽŽäê’’á‘‘ä——æ——é••í™™å噙ꜛêœé’’ò™™õœœðžž÷Ÿ Ô¢ Æ­­É  Ô¤¤Ô  Ù¦¦Ù°±Á¶¶É²²×³³Þ³´Ü´³ÝººÞ¡¡æ¥¥ç¢¢è¡ ì ¢ì¦¦è¯®à©©éªªî­­ê¡¡õ§¦ò§§÷«¬ñ­­ó¬­ô²²á¶¶âµµå±±ê²²ì´´ëµµì·¸í¿¿ã¹¹é¹¹ì½½í±±ò¶¶ñººò¹¹ô½½õ¿¿øÏÏØÐÑË××ÎØØËÙÙÖÞÞÒÞßÚÁÁîÅÆèÅÅîÈÈïÂÂðÆÆðÁÃøÄÄþÊÊñÈÈõÍÍñÊÊùÌÌùÑÑáÑÑåÐÐï××íÞßîÑÑòÓÓöÕÕòÕÕôÑÑúÕÕùÖÖÿØØóÙÙôÞÞõÙÚüßßøááÚáâÞââÜèèÞââãèéâááöææöââøââÿååøèè÷ééøííùììÿóóæôôçññëööìøøîññúññþôôúööüúúöøøûùùýÿÿùüüþÿÿüþþþ6ÊKÿtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿfüŠYbKGDÿ¥òÅ pHYsHHFÉk>ðIDAT8Ëm“wx qÇCíuöÞÔ(U£Z«¨½1jS{ïÕq¨Y; •ž¢Hs!—´±4¡¢”hJj¥qMJˆ'îñ»kÒ§ëûÏýñ~~ß{Ÿ÷ý¾Ú­¼Ãë-Þx".-ŽëË…à[™9Ï”W î·òÀw(ö«Ù­ËÐàXÚ%ˆû¯ pzk7= 04E~šS xÚ-ùf–Pc1’ܘ[€ V«ÕRLôºt\*FD‰‘пb€ûÄépØí±deé´`!JÆAÝD“@ õ¦J—ÁX$øq øœD“õ‡tP76mß±í‚V#KAD>¼Ÿ%8¶1´Óé¤(’zÙhÜäϨ0 ‚$ða8t&ëðÜó àAœËáp]S3Mð£Âc Olu;=¤“"ô©&•jîŒW£  À h>¬ÃŠ@€>Iâú±øtœ„€wÛØ9Tðî¸,õm·Zò‰÷z îr‹lÒñ¢!w‚›:A‡„™59 ù&Íž­õﺀ ÕNP&L ®eD&oC—Y®uŽ ³¹¨ŽËPD 5&®Z3oªk›Av³Éd4€¸hÓÕ2T,R½Ž ™ÐpŠ{ÝÍ#½®è½ÉRî=¾^°;0G2³u¬ÀsÆÓ&-õSûNqä–¿É`¥Qá˜T"Ѥmñ÷Zãgq&m›Ÿâ¸Z­Æ1LŠJ0eìHߪ³KÄÞ¶D‰É€¤R•¥ž_àÝcHå/¥çl´‚)¢¨B5ª—Çñ2§÷»ÁÚs—åòdáúþmº·ªÒûG¹Ûì¶p@àØ}Û¶îÚңߺ‚ãT§O¯ž^-Ú{L{HÓt…×ýhzàðÓ¯èŠôeµL´´IEND®B`‚phpsysinfo-3.2.1/gfx/images/Gobo.png000066400000000000000000000042211247443170600173530ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTEò—±ñ§î¡$îÂÿ”/ë´%ñ¨-íœ2é¯-ÿ”9èµ1ïAè¤>ë‡Jç‘Hþ®GìWäRç¥Ní Sçuaþ’\æ½NÿwfáqjàˆeãÆRñmoÝesÞ\uÿjw܉nàœjç˜lä¥fúg|ܵdí`€Û¬këÉbôGˆÿ†zâi‚ÿYŒ×šÿ”zædŠÛxæO‘Úz…Þˆƒà«xëŠÝU•ÿ\—Ø«|ÿÛoýj•Ù»{í«ü•ˆáÑuòœ‡âP Õ]Õv•ÛÊ{ðÆ|öd™ÿC£þ™Œå~’ÿ¨‰éD©Ó=¬Ñ—Žÿ¶ìežÿS©ÔÆð»‰í‘™ãC³Î|¡ßÂÜß„þ„Ÿÿw¤ÿ©™çŽ¢ã7¿Îp­Þµ˜ì¼—îÒÿDºù[·Õ2ÆÍÑ”ò}­ÿÞ‘ùÏÉc·ÿ©¥êÜ•ôÍšõlº×Äœÿ”¯ãá°Ÿ­äaÂÔÁ£ïNÇî»Ü`ÇØµªþ¡°þ)ÙÊǧ핵ÿÖ¢ÿÀ¬ïUÏÒ+ß±éÆaÌ×gÇýá¤ú±´ë~ÆÜ!äÈ’Àà»´ì íÁ¡½ä†ÄÿaÓã4ãÊæªù¶ºêŽÇàðžwÏØÞ®ùòÆÑ´ñtÐñÄÿZÜ×Cæ¾ú¿-ñ˜Ñ¸ðÏ߈Ñà2ñ¬„Ñú öÃã·÷»Åê«Êé«ÈÿÖ½ÿƒØó]èÇÍÂù{ÜëÓåBñ΢ÑÿuâßÕÄñ0ùÍáÁûàÃôRô³ÈËúèÂ÷°ÔêF÷̲Òý¡ÚãšÜäÙþ˜Üò\ô·ÐÌñÆÏóˆäÝ­Ùçiï×ZôÓmðоÔÿ]÷Îkõ¹™âò€íÚnõÁµÚýÅØíÔÕð®àú™èéÝÓó}õÉÀÞìuøØñÐýéÓú­æð€øÅ•ïáºãë¯åøŠøÚÅãÿªïç“÷áºëéŸôá™øÓòÚøµîêßàúÄèÿéÞùÛãùÂëúÁíô¢úØ×èóÉíî¬úÚÕëÿ¶÷æÔíò°úáÑîùòåúÃôòçê÷îéøÅøêÆûæÐûïÜ÷öØúðéôþÖýêêö÷âüóëýö£þIðtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûñ(>ñ ³ccàä ñ‘ô ôñjj°% ô'ÓÎ!^]q!šñI¼äq"ô]ôôâ†*G?¼h3¼ó=RóËRRô5â$$½Ë&&óZZm/:úTTˆÊʈʈA鈅é¢Ê\@Oü…Oéé…@OŽŽKJJKJ¿OS¿×üƒî[pî׸bøêüü|ffww‹‹„ÀøÇÀòÁ‡~À÷Þ‡„ÞõÁŸŸŸ®µÁÁÑÁ®ŸŸÀ®µþýµ®ÂùÙÑÄÞõµùý®µþÑÙþ¢@sõâŽaIEND®B`‚phpsysinfo-3.2.1/gfx/images/HPUX.png000066400000000000000000000045531247443170600172610ustar00rootroot00000000000000‰PNG  IHDR :ÈÜR pHYs  šœ IDATxÚ íöÁ¿@¿:þ:%‡‡ïžýž  êÕ¿ÕôÁA ôþôdö_ö ™|**ÜÛÛ(ëºþ˜äÂäÉÁ ? )úú¸ùÛùà×ßNFþþûŠëöëËûA,öö¼úúWWµ!$±N±Ïþþþþììz ƒÁ+A+ ÛþÛÅúú.ÿ~ÿšpQ##ïããûûý óÿÿ÷÷ DçÁçÂÁYÿÿæÿéÿåÿôÿñÿàÿÜÿÑÿÎ቉•ÿêÿæÿÜÿØÿåÿáÿ€ÿš ¹UUÁ"ÿ"&ë%Á+ü+ãf xÛ >ß4ÁöÿöU‘‘£| |«…²""úv¨võõ*$*úøø5ûû?ÅçÅíí>þÿìææ7 ÿ Ƕþþ þþþ{ùù°“ñ¿ñÌÁÕÿþÿ²ÿ¶ÿÛÿ×éÿÛÿ×ÿ§ÿ¯%%ÖÿõÿòÿSÿ‡YY®ÿýÿý°°…þIÁ ¥ ¸ÁÁ ˆÙÂ@@ ÏûoÁÁÁÁ×ÿ&&Õÿ÷ÿõÿ@ÿ€dd¨ÿýÿü’’‘ÿ ÿpÿúÿø>>Áÿ~ÿ™ÿìÿèãþ`00çxÁ$ $Ó —Á33Þî""ÁÁÁü––¬ZÀZ.›V›à÷õJ©FâàÓÓ)^?ÁËëëâèèýýÍûõûþþ$Ëãã†ýýöúö0Á¦ûÿ·ÿºÿ×ÿÓêÿáÿÝÿ¥ÿ®((Óÿöÿôÿsÿ”’’‘ÿüÿû¡¡‹ÿ÷ÿ"þG Æâ   oí--?ê ”ÁÁÁÁN""ÙÿÐÿÍÿÿnMM¶ÿÙÿÕxxÿÿuÿüÿûÿÙÿÕÿÙÿÕÿ­ÿ³ ðÿ ­Á   ÷ø À(EÊ?Á‹®3ö3ÁÁÁ353Ü ÜÉøø(üüûýýûÒûÕìð B 4þþüüýýû4äÁäÒ?èÁèëÍËÍûV÷þ÷Êýý ýýGG»(?ÔÔ÷÷@ÿ…äÁäÒèÁèëë¿ëÜ>Êÿ¸c¸ÓöôGÿGgïiìÂì‚Á@A@ÕþÕ[ÿÿQëâë.¹ÊePÚ ¿áÁáßÁÿÿ@Aü%É%Ü ÜüªýÁ—éþ·Ø”ûIEND®B`‚phpsysinfo-3.2.1/gfx/images/Haiku.png000066400000000000000000000101711247443170600175270ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs  šœ+IDATxÚ ßï2^‹ÌšóPü*üØë¾þóEùʳµðÖ€@ü2^‹U««yUßÿ÷¾ô'þÙþýÍù ~‰½2efû2^‹È¥ãm÷]ûÿòûýýú8þÿý m¦ð|Ç9÷+Xÿª+uìåªjðá233ûÏ–5þé¥ö%þÿÿý ˜4}òrU÷Þ´üõ&Ž‹šøÍÎIþãÀö% ÿõgÍ…]Ö«þöõ÷]áþÌ €ÿùCü þÿüÿÿÿ‹÷“)Œ³ÅÂãÅn‘ùüôêAÿþ¿À Ž ïs ô2 ÿàñß þñ¶Î¹ÿîõ÷üîÛèÒ—¸ý u£ôÂìòé9;C«ÍDˆfªs +%Ž0cýÙÀ¿gÞ2ØÝk>þEK1O&,þ èëÔÝêá;+F÷ùþóêóëÞéå¼ÔÐ¥ÊÒêôß% ùûÿðóøéøîçÿñþ+ð ®oD%!M÷3„ú¸+XþqÓ($O2S¯Î"ZüççóÍ üöÿþ E"Ïåÿä7ðÀæî÷öÿôýíÿð ðôöïôü" û3û233ûÎÍÍÖ¿ýõ_.ôŸlzϾün2^‹ËD¢1.Ì¢ˆ„¢j«÷ÎÍÍÍÞï ø÷ûøìüþþ þ ÿ ûçû2þUUý««ÎÞ #ìéôó+Xþƒí m ýþŒUÊ2Lföm’o¾Ãÿ£xLÿÞ´øðÿ2 Í¥3Ì -  üþÛÍ1*Ù233û@@)`ý/ýMýû#»yªŸVé233ûD3÷ þøüï!Sx¨Œº3ûq£ø"ù¡qýüú/ùýéÝÖ®u*øõýùþúþú€‡€j¦Ñ.u l¡÷Gøýü›øùú/ô÷ýïîùÁ™Ôýù233û°ßþüý÷ÝþûýüýüþüNüBt²tu m¡~1òðý6óöóöûõøüûþ,óñáñâ#ýôï¯úôÝýÿýþýÿýBYsv”Çs k¢ù[öù÷ˆäÛôöûó÷üôøüõøþÔ·ìü ÿûQŽê¥øó¿ÿÿÿþþþÿÿU² \:ΛšižôBõøûbòö7ò÷üôøüôøþòðõÚ²è÷ü23fû¯ê%éÿøþÅÿÿõèÈÿ RÇ+`˜õ#öûróôòöüóùüó÷ýôøÿöúÿßÈßþ ïø"Lÿ3û*€ä½ÿïæ“û÷æùôÞ C jÿ/zδ$oþÿÿnòõòöúñöüóöÿóùþõúþðéõÌ’Æöì233û233û×ú&í`Ù•‚ºhòã§ ]g,õ««ÎÍÍ[qMòõ*ñõüð÷þóøýñúüõøþæÍõËŒÃô×Îþ,õ2Lfö ß» Ã!dΦéÔ}ÿþòÿ—†S)ÎðïZ‡yͨDñó9ò÷üð÷ýñöýò÷þö÷÷ü , 0æøê23fû*Uú_úΚúPŨL*ÂÌ´9#ÿ!Dv&òÊ]ûYŒuŠîðòõúôûýóùþóùþøýþýþ÷ãðØ’ãü*?ÿ2LföÎÍšáµÝÞëPÒÜ þõg>·»Ž_êû+ wðð!õùúöûóùþóùþõûþúþýùÜñÝ”¿ýû ãû2^‹ÎÍÍÞ´ø÷ ö  ö‡èô<øý}òöüðõûïöþòùþôúþøýøäþà“ËòÎÎ Øÿõæ2efû233û33ú_góô&ðòVóôøôùôùþõúþöûþøüôâùíºÐòϵÿ àò(H÷2e3û€ªùø1ûÿñÿóûü!ýö ÚÇì¤o¬ïâ8ÿûöîúòÕì÷×áþÿÚüþâ$]÷3þ€2îvÂBìÝåÛÝħÄŧ óöøòü þÞ·ýÿþ ùñýöÿ õðö.efûÖÏÿY ¡ÿüø  ûÿùðõüô÷üô%ú.þLUýÎÍÍ133ûe2^‹ÿ€+«Î"ï2ÞþUUý¿@ &33šÍüÿÿ€Íæ33Íý€þÿ€Íæ3óÚÍÿAÀü¿@ÿÇÕ9 /ª+ë2«Õú3¿@ &3 øI$$·ÜúÿÿÇÕ øñÕý9€äùÀÀÕ9 ò÷ 3þÿ€Íþ€þ¿@.Ú¸> àœIEND®B`‚phpsysinfo-3.2.1/gfx/images/IPFire.png000066400000000000000000000053131247443170600176060ustar00rootroot00000000000000‰PNG  IHDR szzôgAMA± üasRGB®Îé cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDùC» pHYs  šœ vpAg ‡úœ IDATXÃ¥–kŒEÇ3ó^Îå=×ݳgï»Ý]¶ínËÒn¡1"T ŠÔ ¢ !$ÄÄ&|1šøhbbôƒFcLŒŠ·Ä4*{ãRi)½Ñv»K·Ý={?g÷Üß÷ñ_lZ È|™dæÉÌ/ÿyæù?‚ë7Âcˆmë!i„ܾÁJ+%Ma9,þ¬7»orí ­¾Q¡*umó]eÿzÎ×äæá³ã¨­}Ćd$š-^ʬó8}2”sµl.ão͵„;»{èøåOZÅõX×d€õqTÖ¦Í͈Œ“f“´L¦#‰õX‡¿”öø˜ëè[…% uª°`®÷~®›ôâωe¢|̶ĸȊ”ìë±LR#. ‹V)Á—üf¦l½00êV„Xýè üô!X›…}¯ À²LR•Íg䚉™œ@ºf£lŠªÌjÃÀ‘ïL½®ÃÓ¿­I@$€¿Ü'¸·Ý¯IžrC o4-kšUdˆ!Ò¢ajÂædâz×·Ä\S›æ0¢k­C-‚_úH ààRÓnþkƽkÕE ºÙ @œD KT‰)WŒx>ínÔ\TZì›zº§Ôÿ­éPïµñÍ%û|º;CqS«h÷´ØiOšûE-rŠŽ#E™ˆ¬™f‹tDDëÐá©õ…@Œrjúüÿ§@ÎÇN”ØnUÍ£Ô2m:ÅY,`ÒBwz•†BJ1±¼Šˆ‡¨>½Åµõî[s—8ôüüõÿÒZ2ƒÖ¢¹MÌš(i„) +Ìei¶o¥ÙµÐíƒ,¨å)ìÉWqE-/·Xýþ—’þÚ…ÙoíÝ×ñ4ýz Ñ¥dj†1µlî«Ät UmiãâÝw3Ñ{;ó•!*å6VYJ¦‹Õø ;ŠýúŒ°.¯e•4®råÁÇ7 ¯LW¼­×®_Ë6Ì Û~ç‰Æ ÂÄŠåpº»Ÿcõ(œ™¡QŸ!èéíF Ö'ì¥?µ‘¡WVDÜè, ;õJv›€¿¾geº&€­ñçjJGĪPT+À!¥x¹Ù ;™åÎ{ ^¯ó»g~Í›ÇÓ×ÓE.ßAµZáT1`gQ±uF'ì>Ó|iúYXüPÊA*:eÅlB“ª¯>Kqûn¹™\¾ „d|Û8û_ZaëŽÛ¹i¥R‘ç.Îr¤0v9ì·µbY}Ü÷¸¦qhi°Ù)óUêtT€©Pã¶´Ñšk#ô}N¼y”ƒ`„$–H‘ÍfdplŒ'B­h„˜7øÌþj÷  à…ïJ‹ªÔÄ@Ô€ÅP³´VÁoúøÍVè#ÖJ«EªÅejå5–æf˜+0…˜nXêÅ釽J*ü¿`ú˜`ë9¢v7žœ§ªj Ï6Éü˜h6¢UBþÈ~v$·}|=Ý,WøÇ¿ò̾?,,r» ™·üfæ\I6< ßø.ÍG>?Û÷9Ð=¡r¶–wÓ<$v «”/U`.©l´P4W–°Ž¦µ>‹mà'#T²ƒ$[ڶˤó!í›*—iåO=Åù Éö;ÀLœ£yámêC[ÈíÜÃØ-;hoËqà£Ì—‹bt8æ´ ©69¶;Ã,$Z™þѯ¹¢[º"|_;Ѹܥ|ž ¨zæ”—ú]èÆ^Dñ©OßÍÞ½“JÆÈ8!ÙÑuð蓘ݻ‰}r'‘t×°ëÞ{Ù³÷s°\~l{Ü<*g×õnV9µ'×CÏû~ÃHÌÎH_Ýã—åÀ…Š+^,^œ¨£2-@DYX;ö@KË]D,ŸÄØžÛƒ»ïå/ú3/¿ÀIq—Ý—Ý3RÛØžŸûä¦q}mËvß²[ÎÔlñ‡)µ4ëµ;°ëäº~5_B¼ö}X|.Õñ<öüX¾ ç ë‚rÀê¥?±‰£Ã0yÞDWgVþþ/?è4ýÛ“Îv/é‚kã®–*òÈTC,OG½ß?1^î]< ¾ïëH¤Ô¦~²½Ðž•Àx>«óhÕ(Ep”( Œõvôl>±£qú^ý·§O9›"±ˆO‡6„×X˜_\+ÂZ ÉÍ?ÉÌ =;õYgªȖdB÷l§O ‚:¦šD{Âë€N‰ŽnFÖN#ýÓøÖýñc´·JÑ5Ò´ž¼kþè÷žùÍ›GC+•¯^áŽW$a¾ÝÖm9Yp,Q˜y~ÍD6³Ô3®Kƒ‰|šøî2FÿfŽÚYIy9OyáÊËÔk.«öVŠñ‡)3Dt‘‡XÛpuÎô=öÔI#¶$Õ•½â ñ·Þ =ðů¯`u`¥-܉ÓT /Ø—°åvåfÿ[ø™1L¨1-áH“²1¶MÐÔtv¿Ej}`Äzr‘4÷ç «{Ÿ¸ðÏöî+ûƒ« Ñ¡CïÎÛk kO®Í¢/¼†4A¢Ž/ášÄþs $Áæ$ÂhŒÐÔSyìX”Dæ…öçÙàÿ*wƧ c¤”Pˆƒÿÿÿÿüüøþÿÿÿìÿÿÿ $4FàÇàüüüzΈÿÿ³|—ϳµøþ(F?VŒÿÿ ]¤âÒØú ]œbàË⹉šìÿÿÿæÿÿÿþ-JKQ‡dµ„¼Í«·ìòôøÿÿÿôþúðîìîðEuL8]6òîîìêìòúýþþ ÿÿÿÿÿÿÿÿÿÿÿÿ üúúþÿÿÿÿÿÿÿ²~½Ð°·ö+I:Sˆ\ÿÿþÿÿÿþÿÿþýþа½êæÕ·°ÿÿþÿÿþþ‚.QàÌÙÿþÿÿ„1xèèìêƒ0Pÿþÿÿ¿“Ç‚.vöüþÿÿÿþÿÿÿÿÿÿþ ôîîú öìòúÿÿÿþ úÿÿÿúüøúÿÿÿþúúüÿÿÿþÇexòšIEND®B`‚phpsysinfo-3.2.1/gfx/images/Korora.png000066400000000000000000000042211247443170600177220ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTEBA?CB@D=BD>BE?CEDBEECFAEGBFHGEHGEICGIHFJCHJDIKGIFHIGEJLIJHFKMGKNJKILJNHLNJLJKMJNLOLNKRMLMOLSNMNPMTONOQNUPOPROQSPRTQSTRTUSUVTVWUVXUWYVXZWY[XZ\Y[]Z]]U\^[]_\^`]``XbaZ`b_cb[dc\ed\fe]gf^hg_ih`jiakjblkcmldnmeonfpogqphrqisrjtskutlvumwvnxwoyxpzyq}zl{zr~{m|{s|n}|t€}o~p‚qƒ€r„s…‚t†ƒu‡„vˆ…w‰†xЇy‹ˆzŒ‰{Š|Ž‹}Œ~‘Ž€’“‚”‘ƒ•’„˜“–“…™”€—”†š•˜•‡›–‚™–ˆ—ƒž˜„Ÿ™… š†¡›‡¢œˆ£‰¤žŠ¥Ÿ‹¦ Œ§¡Ž¨¢©£ª¤‘«¥’¬¦“­§”®¨•¯©–²¬˜µ¬“³­™¶®”´®š·¯•¸°–¹±—º²˜»³™¼´š½µ›¿¶œÀ·Á¸žÂ¹ŸÃº Ä»¢Å¼£Æ¾¤Ç¿¥ÈÀ¦ÉÁ§Ê¨ÌéÍĪÎÅ«ÏÆ¬ÉȬÐÇ­ÊÉ­ÑÈ®ÎʨÒɯÕʪÓʰ×Ë«ÑÍ«Ô̱ØÌ¬ÕͲÙέÔЮÚϯØÏµÖѯÛаÙжÜѱÚÑ·×Ó±ÝÒ²ÛÒ¸ØÔ²ÞÓ³ÙÕ³ßÔ´ÚÖ´áÕµÛ×µâÖ¶ÜØ¶ã×·ÝÙ·ÞÚ¸äÙ¸åÚ¹áܺæÛºŠ2“{ÿ/Sööøööø^úóÊìì싊ããã%%%KLKçéæÁÁÁÐÐÐööö×êûùòí,$ÿ!ýüÿúûöööFDGFDGÿÿÿÿÿÿÿÿÿÿÿÿÆÈÅ%'$ &  ѯgŸSNMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿƒ…‚NPMìì쨨¨T{‰Lrþùö??>ýüÿóöazúýüÿ==<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿs†‘gŸkœlhfÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîàïúDý=.BßÁ(óÚVTWˆ†‰]H7úú##"ýûõBBA;;;–”—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿbda,.,ikhÉËÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`b_HJGegd¹»¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€‚óóóµµµÙÙÚJJJûûû”””ÿÿÿ|~{ççç óóóþþþýýýüüüfff;9<ÿÿÿVxL¨Z–IEND®B`‚phpsysinfo-3.2.1/gfx/images/Mageia.png000066400000000000000000000057711247443170600176630ustar00rootroot00000000000000‰PNG  IHDR ùUãµ pHYsÄÄ•+ «IDATxÚ  _ôÿÿÿñññ6þyî@ àüÀþ€ÿ€ÿÿÿ*Õó@`ˆ˜\À€€€« #þÀ&3륀í¨-ɤÿÿÿc²:ÿ÷Å ýõ ˆþý®ó ­««þÿÿÿÿÿÿ@ÞOêu²ï¨ðô  ˆ™ Ûhü±”ü Á¨€€Ü3 6ÿ[WD¸4§åÕóUU€€€*UÀÖ«ùÞ ûÿʧ™ø "íæ€ÖVꀀûÿþÿÿÿ3-­3ù åû êÞô}ü÷øú‰TÝ€€ÿÿÿÿ@€Àâ²^B þþõÛü²‡÷8*ú þ %€Ý€ÿÿ«V€@Àæf5 (HÒbðÏÿ ôìÑU€ÿÿÿ¿ÀAùŒ$ $6WþÿÈf@ƒïïþ«ôm,õÔõæørÚ€·û€ÿÿÿÿÿÿÿÿU+è^fÿð÷™ Á óÒÍáuøU«+@° 0e tóö’ßцà úÿÿÿÿÿ€ÿ€€@úY ‘  ÿüý÷ùäøú¶ýýÈúòå ú0 N $ÿüüìï„)všýÿ@€À·s& ½ ÿþþÿþúüþÿÿþýþÿþÿýÿøúû÷÷OËÄ««þ€€À³™x þýôùèíïŒñõíü÷ýþýÿÿÿþüöóôìò“öôÝÿþ9€ÿÖí-&‡ûþíðhF½šâ"ãóÐü÷ôøýðÿöõöÚîòÅõú—éñoÎÕ¶Ï\ÕùÅÀè½àU7'l†õöÜ÷Ï8G«ù€ÿf™šï>«û@@™YÀgç€ý€€>„¯Cýüýêð–ÉÖx@ë3ÿúýûõ÷°ÇUú€ÿ€gÿšÍü€+ùªÿÀÀþggü€€ÿ€€ffÿøø²ùöÿÿû2 ýúûúú×€–ÿÿÿÿÿÿÿÿÿ€€ýVþÿÿÿÿÿ€ª*€šÿßüþÿþýþ Àéÿþüÿüÿüüý÷ÕjÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿVVþæLûñðþúýþüû + ÿÿøþýÿ@ëV€€š´@ÿûþþùýñöóøÕ@«þóöÚÿÿÿÿ:Àÿ€€€3LÀøü-þýüûä%ÉùjÿöôÁûùþÿýJåhUªÕÍobXÿþÿûúþúöÉ 1üªéÁööìÿý íünU«€ÕªÕÖ+ÞûX&ýý÷úôõö²U«««3m²îîí–ûüýúým«YVôm–j¤èC…þþíð¬5 Û+«ÿÖVçÉUÒîÕC Càïúà¨éÏJõý++U+«V,V @ÀðúX\ “ ÿðôäðâb1ôÀÖÖÿÿÿÿVV«Â]) ­ !üýüðöØøú©òËÚìßø"5ÿU 1òøìæë[@)«Âÿ««þÿÿÿÕ«A( ¤+ÿÿûÿÿýýýýûÿýñòáêïg@i°ÁA€ÿýÿÿÿUU«ÀJu] þþÿþÿþÿ÷ú÷ìñ®òòƒUñºâ+€ÿÿÿÿÿÿþ¶êvU”ìðMBþûüýãò÷Äù󰙆ºÝþÖVÿÿÿÿÿÿÿ€€ªÕ€VªU««« öüUöU«UV«þ€ÿÿþÆ #Öqe2‹IEND®B`‚phpsysinfo-3.2.1/gfx/images/Mandrake.png000066400000000000000000000007031247443170600202100ustar00rootroot00000000000000‰PNG  IHDR TgÇ0PLTE":y¸‰'^v³·¼Ìó¢à¯HåÜÌëïøÿµÿµÿµÿÓlÿïçÿùæÿÿ÷ÿÿÿ M#tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿà#]bKGDºÙ pHYsHHFÉk>IDAT(Ïcø(ø.R*ð'$&ð¢c \ÀÌÈšølÿö=PÇΙ0¢÷GVoË}½j¥?T@ùÿg™«VÍZéøÆÿÿȪN ÐÔóÿÿ®_ÏðIÿÿÿ®U@•«¶]_½žáƒ=ÐbÏY«€`&ˆ ü7YS—®g( ü«X"h¼|=ƒX¬ÃÑü~>DàhתY«–€Ì`´åÿ.–‰ÿá#WΜ¹ª"À2ÂQPrÖˆÀ¦ÿÿO9 —zB>1äÿ ûÌöMbÊ}ˆ_˜ÿ§fÊÿ_Øø¯À ¤Ä`÷ÿÿ7‘|h100Ù˜‰PÿÿÞS-*¡e\ œ¤'IEND®B`‚phpsysinfo-3.2.1/gfx/images/Manjaro.png000066400000000000000000000101441247443170600200550ustar00rootroot00000000000000‰PNG  IHDR szzô+IDATxÚ ßïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Õÿÿÿÿÿÿÿÿÿÿÿÿ­0+Îëÿÿ?NÏÙ²ü0Ùÿþÿýýí.ÿUãåþüùçÿêøýüùüèþçÿþÿÿ ýÿÿ ÿþ þíáŠýÿÿ úùãÖùýòÿQë¨%·ÿ¬)’9ÿùýè`UÖÜèüÿûþì  ÿþ #ûìþ÷æÿðfý÷ýþüõÿþýÿþüýþöÿÿ[Üó«Öµ<þæÖë¤.& ÃÿêÿýÝ].I þ÷÷üùþûÿÿÿÿþÿþÿþÿÿÿÿÿþÿ×ÿ)ñÿø ÿ ÿø ñóÿÿþÿ ü ðúœôþÿíüìž ¸ÿüüÎódñøºï~ÿÿÿþÿü ßïÿÿÿ-Þ'ó„…“IEND®B`‚phpsysinfo-3.2.1/gfx/images/Mer.png000066400000000000000000000026621247443170600172170ustar00rootroot00000000000000‰PNG  IHDR #õîZgAMA± üa pHYsZ;ÊOtEXtSoftwarePaint.NET v3.36©çâ%0IDATXG½—{LSgÆ{‹XTUp0 ™º ‚Ù:\3ædtCâÆÅ(“Q–È]A¡qrñnàe›Å ’ˆ ã2¤A 0z„ZåRÊE·q2 Pzöœî]öÉÖó$¿¼ï÷<ßûžóGÓ¦œÿCršŽJ`M,võH«óy4¥»R£ÕÍ'{*ÐÌz8 1¡hšK,v%íŸðÁ¥½ã»K{'RJz&,HÄŽJ{ÆŠ:ÇÞ*z:6t ˜Dì(W1ÂÍWšæ©žÝ¸×ü¬6O5º’D†U¶|HpK1¼7§nXŠš ,sFLHlxeÉ|¯QÚëÔ ª»&H ;ºTÞÐ/‘M"vt¡´×ùüýÞ1@ƒ)œý2‹»E`¹bxev;¤tG¡®Ëø©›—–ÿ[#1;J¹ÞÁM½Ñašz³ÃìTn§åé»]³IdX¾¬æ¹Òêœtµ=+)«½.9«½µäÈÕ6É·—ÛÌȵWSü9?á|‹(á\ËÂø³-F gU<ôð¬p6&×f„Ì(ñ{u̡գ€Ó@ t P—|s¡ÅŠ\ÿ‡ζ˜`ïR`ƒÝ|Îþ´æyÒ›/Æe¨Á0úÛàúðúüØ´æ%d^/xŸ#Ó:.Su /äÞÇÂx}Œ C•“®šEFôÚÿ]³=ü äã`{28Ñ'3£O5ÒàwÐCz†!Ð¥ïO6J#7ð™%Q'ÍàÕÝÞÓ‡#Ž5ð‘¹GžhŒ8Þ`s¦ÉÙÐbÎ]ÿd(òX=^ `v3ÏiÝw¦éNh²²< KU:…U.G?´á©Êõ8/Aßš\?¾'©Þ†YšTÿ6Π?<µ^„º&4EY–¢,CŸŒœ™K€Þ“\Jÿtóvȧ૱wqä1åß?ÝÁ‰OhIâ“> B `+9ø«•“À¹ºÌ(€qP¼B§°|Îî8…òDdÌú‡@Á‰ubøÓðª°÷ÅçjWìcôQ`ìc!P£Ÿ@µE LâìÈÜŒU8íŠUhàuîŒy<çôm (A 4fÒô0#†7 ªà¿x¿ðZô‘x­U &ÐÛ¢ &qÖ¿@@D­9ÎM`Ú7¬&hG´Ü$ J¾# R¾oG”|%ê'È4LîQ»EÿóbÆUþá5/^`›„ê `á#‘™¢V‚V°È;„š…ZÚ‘Ù“ŽO%§ï¯dñ[ƒd+¶î–-þ,Höñ¶`ª>í#¡¤Û¿¦f¾”à9‚§ ›ÃÁÌ\ï j.ªéó3Ég!2ž~ÂÛ«Oxíªž:¯ÕãàOôS€ö ¬®Ýò¥ìMr]/ìà1{˜}ÄúoÚð‹ñFÿªÍž¾•%¾•O=¾¨ìA•{úUÚP%"× 'W¯‡?{!±ØÖÍDÐl‰ñŠâpþËý1TOò‡IEND®B`‚phpsysinfo-3.2.1/gfx/images/Minix.png000066400000000000000000000071651247443170600175630ustar00rootroot00000000000000‰PNG  IHDR ½" pHYs  šœ'IDATxÚãñÿÿÿ ýõð ú;ùªÿÿý ÷ô öôÿôèÿÿÿ-úê ÿôô ùìòÿÿÿÿ ôýûÞõûûúúÙÿÿÿù#;øôþÐýê æ öó ó ÷ü ïó÷ý*þùúü Âÿöþþ÷ýº öáóôüìýþÿõùýøþöþÿúþ+ý5äÚúùüàúÿÿÿ%)(ýþïÿ0þó–ø&ÿýýýýùþìüüÑùBLÿÅø¿úñ÷ÿÿáâóÿèÿCýü ìéöýýûöýøýþôýýöüû Eÿýõ¸úüøêÿÿÿù Þ÷øþÖÜý7þ«þ÷ýùýüýþþý†þûþÄúîÿÿÿ÷ÿÿÿ4þû×ú üÿü÷þýÿ ûþýñÿýýùïõùûüýõúÿúÍÿÿÿû+ùýýýþåüùôþ üýñøü÷öÿ ûüÿøÕõÿèÿÿ&þ9 ûýûùðþýíüüûöêÞüýÿýöèòîüýý1 äüàý  û7þ6ÿÿ ôòÄ ‡ðúýúú‡5ÿýúýÿõÿɧÐ ýø#Ðÿÿÿÿÿÿÿÿÿÿ2 Sµëù·/½ °ô,*oø º/¼­÷õÍt!$$. ÿÿÿÿÿÿÿÿÿ' kÏøýýË8D Ë6à¿Û#¹Ã> W Ñ8¶Áýýü↠)ÿÿÿøýöšþ.ÿÿÿ×6éôñúùÿ üðö>ëöùÎÿþÿvöø~þi " üô6ýÿ õüä9÷©öû/üûÿùý1 ;òôø”þ$þÏþ±6üû}Í êæóãñ·éõO ÿú¯ýùÿQæò äò¤íú?MÿöÿãÿÞ¼ùÜûJÿÿ½äá•úÿúÉýÿÿÿ%PPÿÿðÿéõÿúÕ'#þŠÿýþæÿÚõÿñ»÷û@ çÿÿÿKý³5ýúéýý^8ÿÿ¯’éø ÷`þhþÿâÄéþþïÐÎ÷ P¥ÿÿÿæÿÿÿ—/ &0+# UUto$ Ga@•,  -9 +>eÿÿÿôþëû-úùüÿ÷ù ±«) â «ÜüP+ýŒ‚3Þþº î úçüúôøü©ÿÿÿýÿÿÿõ”[üþ- ¾ò ôýó÷ þú üöýýýÙûûgã²Í  öóíø ôòþÿùàBëüóÿÿÿÿÿÿÿÿÿVv2 $Q(U%6$@ ^ÿÿÿÿÿÿ2L1ÿÿÿÿÿÿÿÿÿÿÿÿ pøþÙÝúâõ ÷‚þÇÿ eþÿÿ˜äüý9þ”ÿÿÿØ :ý™ÿÿÿþÿÿÿ CGÅ ¹õå.þµFàóÿýþéýºí+ýÿa®gÉÝÓÿÿÿÿÿÿÿLýý(¿üËïìH nfØÿŸé0Ûö¦þ®KðÉÝÿÿÿÿÿÿÿBÿý´ÿú9ýþÎåøO©ÿÿÿéÿÿÿ CýÿÓò÷ò%þ%ýý®ÿÿÿöÿÿÿ+âßÿÿÿüy¶Ù9Ñ®IEND®B`‚phpsysinfo-3.2.1/gfx/images/Mint.png000066400000000000000000000023641247443170600174020ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSððð.ëÖ pHYsÄÄ•+”IDATx^ÕV[hUžsffggw6ÛÍeÛÜÛ†Ú&ÔF¥u >ˆÚA_DÔ ’G}ðÁ­ŠE©E¤´(‚BQé‹‚%h¢IJK7mp!Mp7·u³÷ÛÌœñËÌt'Ý$›%Ð?–3ÿöŸóóýÿ9g¸ä}Æ}' ‰D¢T*†ÁÕ BHÅ(¥<Ï£Ý4X`ŒáÑØØ¸‘cÛ¸º®«ªZ,áº\.Aªg³²²Ž`0ÈíS¡PÈd2°%Iª,p“åØÕØ„#`E X†- ZÛu PI›;½}{<=,ËL0ðN5AQËF’Ã;˜>X[äîã»_ìñT*·ÛmqЯíõ>t°!Ô ìÙFÎX.Üùéï®Æ>7 æ÷ûEQÔ43A× Yʱrž©E¦• ¦qƒm¯?Ûýþ^ï1®0C¿¶òýØò·°ÁÌ#1÷=û߸2tô›¾8Ô"f³¡«°™®®¹”]Joàév¹—p¼éë œj÷ôQNÀRF–¾J•QK¨(Äãñ¥¥%c2åøÙ‘§ÞͧoýùðÌè‰÷þ8yþÆós™IT'Óï$'¢™0&—1}zuìÜÍgÎÞ,~ž\.‡a‘sŠT`9 &æççA©ˆMnAaT4fX©ðd×Êi«¥z»ýw*½ €‹v <Þ6„àXn /! ¶DØ„¨0$õ»>Ãø×f0 EhÚçï‡weæã ·_ùmñ’EýsôÓK‘W‡¾„Û D.è)°bÞN’é]Tz+£[p½b#ªÞtb¬¤æg’ãf›M_+³Âlf.OEŸØRµÛé–¥gTL‹ÏŽ4sÀ1Y.L+¼²ôªs…nyÚàé0ÜáÐ;1[AØ¢ŸXClTÌ`0íiÔ&©-qF4ª³U«BõAïÖƒb´åìÌ…ëCpJzÝñ|ôbxˆP.¯'8¹©•ß‘s•9λ91Å£•xc¬ eÑß$w€©¤å£©Ió„E$Ü6 *PÁE$êË«kÕ©²R-‰0´uH5y:ÁKE`m{¢ÙÝUÊiÙš9»8ß>ïqsÙ[­%6®O# ÿóëøÜýí§Ü-¯=òY4y«¬0ð|zJç4ÃVÐxi—Ôæâe0ÎæþDqÔ"À!…£Üçóõ4Ÿè Š&¦¾ Ÿy¡ïEj<zsá—ÅôtQÏ1Cµ˜ÈÆv-…b«¼?ÔzºÆ ìT£‡¢(Ðêpp¿²ž/ëEKœjûÉ^ü˜~ ‡ƒ‚Kùp›x·(Êu~¬߶—Nhf—ŸóNÝ@0®“ nìà óÿÿuýç>ëÄÏ\UIEND®B`‚phpsysinfo-3.2.1/gfx/images/NetBSD.png000066400000000000000000000052431247443170600175510ustar00rootroot00000000000000‰PNG  IHDR ýg… pHYs  ÒÝ~ü vpAg ‰~' IDATXÃÍ× PGàEQ£òÖ¨1 ˆ`®0¡¢‰¥I8ME½˜Dƒ\P”‡ œŒAQ0«" ¼‚ QQÍ òT^Êagö1»;Ó}óÏŒfMÅ:sUW•þ j¶§·§ÿîé™Eøe…Ñ9Þ†kq3– õÅ8×¢qô0.g6h‡Øÿkµ]ø6óm…ÛQS¯Ó)œ‹÷ŸMSŸÊèqÕ' ]©ÍiÿþN^²äýåıuÓ ‰sžzã®Ê¿Úf;ë²rs4áø…³Jv@¯¬}\‚·©“•#„~Ô8àE2ô…® 8[1}’ºK·R0î´©ŠÂ+p9{‚fiÙ¿6ü›ð--®ÃW…ãlÚAóÓÐ•Úø…æViMÊ\Õ¤cWÄ%ò‰bë„û¦‘ÂiÍ£EÝŸ6h2K~NúxZûdªÐƒWâLáØ:"wÃqZ=ÊN¨¡q {þ¥Xr¸ÒcÐo?h—wôŒQ¢Jk¿ýž­i¤÷®µjîqg·ÓÔŠ³Ö_P±ÛªU-)•¾ýʵÑÞË/ÈwîXjgJTy•MØ ÓŠ_M$Þt«±ŠH\çj˜*§vݘ›JufF‡8iÞ¹’×O%g¤n¯PÍKX²ÚFuüd¬W»ú\Áƒ¿ÑMË/áíêÄóÀJqŠî`ÿ,5@èJâ+ ìK&V,lÞ Y¢Où¹ý*ÉìW‡Žz›)ŽÍ&ôÅEÆ„‘›…¨øhõ}"fÈÐŽmð4OÎô©4“’3|rÌN“ßøåMê$‹7ÞAغÏ kt ¥ËKwÛPÁéú[]´z7CÏxÒ&Õ¸PE‡Õãâ;h^ß@+ó|î;q F˜À}/@ˇÇ`}¾¢CÚiÔ¹4kKVRVÝq×ÁhXë±ÌЂüÚoÑ$cÒÆç¡Y7iísÙ¬€œê³È”" ¼}MÒHCïí&WI;_sóO‰Úõ&Èe±…HD¾ç;ÛÜŸÝÐΨ{æ?,®«ÂÉØ‡\?~å"zé%@1èîÅs{.„]2o~'{WÌuõ¯5†æÄdß 9Åg¹™ù†ØÌ’´õi2ë!ßô 2ûšÈôüð5SöšÂÚu£ùd/êÚù Ae×½óùUbð7ìl¡ýøó½V‹ï3OéRÜ„\?Ü‚¶0Ñx…zŸ öÞ+ ¨•£2¾¢)ñaàƒÚ4çÌΜA4ãÈâ嫆ÒV̉5’ÑÄ{îÉ#‰ÑâTÑ·Ä»î?Œœ,7 t·^E e-صÅ Ù>Iz&°/¶ÚŠB™4öiõë>»˜¿²ƒxÊÅøM”ÂÞûqäóÍÀ;ðl€"P5zIç«SŒÏä¥IZfWL»ü!ªO›·¹K±>&`Åiå½8 g5?}ÔV/­¡tBž:¤TsžÏt^‹ï2}t1V 9r±ø ÎAÙè<Ê@Z¤AöÚ`Çžóg=§…×xŽ'½°(½x Ô}H±«:íE³¼¦£Æî~…döéüÔñ| J@®h{ßXñ‡5T³}ñÅÏG±!¯c‡³»àïX|âÜãrT¾b˜¸5bøDȰwdFRÙ`¯'k£Ô†B3•zÃ.h~¿C[(²øgûL4¬i¥\ø“±±G\bâöÕ9ÖBû"4†¦”nr;⾬f¨ãiÎàÁOº{G÷Žï5¦wÓ!t°nt*Oд tÇu:UƒáЭ† žÈù}{bò= Ò„ï;1–ˆ_gj¸Dmœ}+´Z¸‚™bÆS¤Ì‹ã$¦¦Ÿ¾ë/AíìsIx?D_2Îl¢a…ÒØ_aúô,enÒ{p3ZÏìbëŠÁÚ~Í)¾yÞyßæ}8)Ñ2q–0’JÎ5ÀÀ¦àÀû²8 1€)¨‰ãÍYpçÙô±Dÿ5[b¸tæéÙ|=[%$ÌÊmT†J„eûŒµØÿ*hZ„6û¨ë$‹ºÉŸ$\÷J§_½  øŠ“ö ÆmFqÚ8Ì_Ë7ÿÿð‰w&à+ÚmÁ&9xÐ „ åS1Ýuø[À/ô#€ $|¿‚Ã;€ÐÒ‡s‡ó7 @ç‡(Ú„„/øºƒº Äëþ~ðwv9§Ã•CŸƒ¼å@hØ^eƒ¾JùØÊÔìQ¡&zTXtSoftwarexÚsðQpÏÈ/.)N.Ê,(Q°Ð34GkŠÔñ6YIEND®B`‚phpsysinfo-3.2.1/gfx/images/Netrunner.png000066400000000000000000000101711247443170600204460ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs × ×B(›x+IDATxÚ ßï€@f™ÿå ßüiéöüÔíüÚöû & D! Õýý»«V÷€@@¿ÿüä@öþpðö3gÖãÿý5 þÿÿÿÿý7 Ÿ˜s+õ€Aø€@IªÿBÜñqñø6üÿùüÿuÌâý÷ë( 3×ýÿýÿÿ <Ê xÍ]çjªÿ èz¦àNÿöÿüõìøÚ÷ùþüÿÿÜõ÷áÞ,&ª&‘ÿw÷oÆU¿ÿ âÿ•ç÷gä÷ýäúùýÿõýþþúüôþíØ"çúýþÿÿÿúøûÿÃãîö­«.“Ùgò†ÿ7jªÿ øì”íûLþþ ëúþÜõúñýýúïÝñèüþÿÿí÷ôÐ××þ×¾*øöùÃêm÷†ÿ9ÝþCíøNþþþþöþþÍòô òîãßùÿüÿûÆæôòÛÈ·#èÖ"â åõÓñr8£ÿ@Lªÿúÿ’ýÿÿÿùÿþìùúúö èúüèèÚöýå÷õÈÖÚúÔ».û÷þ/ÞÿÈìõžÙJM³ÿ öüiõü ÿÿíúûøýþôùøâöã$õìÍÓóôðéû÷þÿþ#ÞèÖâìÛïåôíª äU!lá•@¦ÿøþaÿÿóúèøýþÿû þòéõèéãý÷ä6JÑ=E4žÖë‡vGþÿþÿþ ô…Ìt’ÿÜnù pöø øþþøöøô(Ø=Q"8>þÿùÿ÷¾ÔõþÚâÐÓÔ%=,8ÜÁUªÿëü;ÿ -ÿ‹ :0ý)ýBÿÿÿþþþùøüõèôÙ#ý9ÎëæÊ£Pÿü Ü#ÚîÞ¡Ø,ÿøú.  BþÿÿýÿÿÿùöüõûþøûüøúþúøûúT¬’€A8"6€ÎÉÿý#þ Þ'ÖÿÿþÿýCUª¬ kûþ  ýþÿýþÿúúüüøþôûý÷ûýýýþüÿþöúô,q¸¢ÿµjhFêÞñûø¼¥Œ>þä'ÖÿþøÿÿúÈèî«þÉìî,ûÿ þÿÿûÿðóùðöûøýÿÿÿÿÿçóç9RhÔË›“ýdþž®ßÑïç1 è(ÐÿþÿÿüÿþÿüãñðÖîÿ¸/€«Þìùò ÿÿ  þûýþþÿÛïÔ??>Ö¯_ý¿} þ%9¯°üÞÃ&ß ðÿøþýýúÿüúòï ¾Ùó÷†ÐÙ™ÖÞMKC# ý õûô÷ûðøýøÿÄáÃ[@$0îÞ6>°)Càôêø²|\òûúì"äöþÿÿþýþ þïH ÚòþþëÙÇž´Á:žý:iªB$X$-ý  ÷ýô¨Ó¡e;Q÷ñÿþ|Ÿ»ÖýU¤Ø»ÿFü÷öý÷æ&äôÿúúý+!K#Íé Õ´6îäÿþ¾‘\pÂøp5ÐjSGøv/+ ý ýûÿüöñÿ ìb1Jý€ÏùÞýú üõøüùê  ææýù4jÒï¢Ùº0ìá"þþÿÿÿþüûÝÆ6–ŒB c‘÷€ÉµH$=ôÿI—‰ *ÚòéǘPþú÷ öýýúûóúìüî&-ý&òLQ]½¼æÏþôùûÿûöûùþúõðüÓ´>ƒºÓû7-ý $%M¬Ö­b²‹\/ý ›ÚÆúñDöÿÿþýüöòúþûýýþüïúñ?¼š4ûÍgûWšÿâÓîÿýÿúúåçÉ óß4Þó-ð" þ>z«ÊÂ\b%Æ:>÷ýúêôü=X~«ðúùûÿûýûñïüúôüüûûþ& éö§ž;þþþÿþÿýýýüýøýúýùõêÆéêÿ>AúFŽØ¦þÜñêñøû  799W"ÛðqðÕdî?¼þþÿÿÿÿþñûøþÿ¬âä-4&ʃCJÿàñåý ûýÿüÿÿýúþúýýäùðûúÿý :Ý™7áüÿÿÿÿüöíþò´ÍÛòü÷ Q”Ö«,9÷þðÐêêý# ÿÿüÿüúþþâø =Û¦P¼ægöc*±/ÿÿþþÿÿÿúõòòéØÜðïýPuþØîèè÷ùûýýüýýþý ýýý üñþ*ë ŸÄYÀI(ýùþûýýÿþöñÿûóþùÔîãýÿüÍéáýþüþÿÿýÿþúýýüþýÿþûÿýýKÞ “ÀVôêkÆW$–=þÿÿ÷ï üù î*RºÁæåýüë÷ëØíòþÿþûþýÿûûþýýþùüÿù ý=â!–ægöægÄx.—X#ëôëÿ.Z®üÆêìê÷ïÖìäðúúúýýûþýøüÿúýýÿÿý$X'×J&“ægö³V¾r³ÿÈ' 9S?ëóÿûÿúýÞó÷ÙñêËéåùýûþÿÿÿÿÿþ( ÍDÛ¦P¼È€@Žÿ 1=µâ%úþGÚïíE!F™ÓÉ ç#ÞæüžÓ[ï€@ÿf³ ºìþï88ºÿ 5* Üþ“J%ùGìþY†¸ßIEND®B`‚phpsysinfo-3.2.1/gfx/images/NixOS.png000066400000000000000000000062131247443170600174700ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSÿÿÿ7X} pHYsœœ”SÝ +IDATxÚ ßóÿÿÿššƒƒAAÀççþþŒŒAAÀõõ||ÿÿÿAAÁ¿¿?ttó }}AAÀ¿¿?AAÂÿ¿¿?AAÁ¿¿?AAÁ<<;þþ**CCÃþþþÿÿÀÀ?ÿÿÿAAÁ¿¿?ééé×רÿÿÿÿªª*ÿÿÿAAÁ¿¿?ééé×רþ¾¾AÿÿÿAAÁ**)••AAÀ¿¿?AAÁ@@?AAÁ¿¿?¿¿?‚‚¿¿?ÿÿ¿¿?‡‡úúÿÿ998úúÿÿÿÀÀÁÿ¿¿@}}ÿÿÿÀÀÁ¿¿?ƒƒþþÿÿÿBBÁÿÿ<<;**UUÿÿÿAAÂÿ ŸŸ‚‚ÿÿÿÿÿAAÁÿÿAA?ÿÿÀÀÁAAÀÀÀ?¿¿?ÿAAÁ ¿¿@¿¿?ÿÿÿAAÁ¿¿?ÿÿÿ¡ϱG› TIEND®B`‚phpsysinfo-3.2.1/gfx/images/OpenBSD.png000066400000000000000000000035241247443170600177240ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE!!!!!!!!))))11199)9191BBB!B9J9JJR9cZ1RBRJcc9k9{1‡9JRcRkRkZkZkcsRsZ{Z{cgœZ”sœ{¥„©Œ!!!)#!11!=I)ZZb`kc!kk!sk!sw){sƒq"Œ{„1Œ„ŒŒ)ŒŒ1”„”Œ)””1¥„!§‘&­œ!œœ1œœ9¥˜1­¥)­©1¥¥9­©9BB!Z#L!k!1^ {&4‰J)J9=N9BRDGLkZRRWjJZ”kpŽœœB­­Bs{Œ¥„wRs¥s„œˆˆŒ–™™s{½{ˆÆŒ½™Ÿ¯¥­µ¡¯Ü˜­ó¤Åÿµœµ¥)µ¥1µ­9½k½s½¥)Ɯƭ½­)Àª3Þ­ç­÷¥ÿœÿ¥µµBµ½BƵ1Ƶ9ƽ9ƽBεε1çÆ÷½ÿ½ÞÆν1Öµ)Ö½9æ¹)ÿÎÿÞÿïÿ÷ÿÿïÖÿÎÿçÿÿç÷ïÖ÷Ö÷ÿÿïÆÖÿÞÞÎ!çÆ1ÎÆBÚÊ=ïÆ)÷Æ)ÿÎ)÷Û+ÿç9ÿï9ÿ÷9ÿÿÿÿ!ÿÿ)ÿÿ1ÿÿ9ÖÎBÞÎB÷ÞBÿÞBÿçBÿÿBµµJ½½JÆÆJÖÎJÖÖJÞÖJÞÞJçÞJïÞJÿÞJÿïJÿÿJÎÎRÎÖRÖÖRÖÞRÖçRÞÖRÞÞRççRïïRÿ÷RÿÿRÞÞZççZïïZ÷÷ZÿÿZïïcÿÿcïÿkÿÿkÿÿsÿÿ{ÿÿ„ÿÿŒÿÿœ½½µµ½ÆÆÎÎÖÖÞÞÖÞÞÞÞÖÞçÞçççççµÆïÞçïÞç÷µÎÿ½ÎÿÆÞÿÎÖÿÖçÿç÷ÿïïÿ÷ÿÿÿÿÿDtõ'tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS÷%bKGDˆH pHYsHHFÉk>áIDAT8Ëu“yPQÀOÓ<‘&d™²oQdß³URS‘²…’zÙ%L “¥É¡„4¶²iiÆA½Ûuî}%uHéú^åy½Æ™¹œs~g»sˆ¶¨«€®,¿­z6]¥Q£h€†à]M¤>vÎ0^v~ûëÑŸ„ø0»Or¢õ˜œì s0€ÚÆÖÀú°zC³Ôý4:zÑô„é)ñ°B¨-ÚY\™ëìɘ¥•NöÍŽ‚:Q³M›ÁtV©ÄËMú*ˉëy;+ShÉð5Tl‡Kæ£Ä¨‚!ÐÛ>4írRm‰™öÆjæH;tDŒ#ñTZ˜Ú ƒ!ýFíBB8cE”öÜOùÑÔŠ€Ìƒb? Œy£ T0²wüKãø¿=„B÷IÌÓƒû1†Œ"Ctá ‹ÕGùï6o–‰_ q$\YVáÅ|)*eÎF½:\Ä Û#Ö òRT€åàW*ZÉÊJˆtàÈn9Ã.ñQk®ÆXÃbM~,\æˆDÊÔT™bULJâ%ÀäÎìz./â^ªB¤„˜_ͺÖKS)>ŸP$–Œpîëýü…š{”„ ¥ÀöFGÍ{Fd–:=V¸ûöã=ÇÑÉCÕªt'$ÔܤÊv`Ó˜|òÎrõsÞµºº÷{5e•唺&L ¼X}Ô5ü”ú¤ÃÈr#Z¶„©º!!¹ÒpÛháç/8C¹Ã[dò E–ÏÒîLÜ×?¸ø.‚v\ÄãUeèÎU=x\?¤sb¶Oÿ6jØÝ:fÉ‹Ybú¹Ø<éî´¨û®@¬ë”ú ’-uÂ8¿\Ú7úÞ$ÕÙÉÏv Îuÿ H’AD©Û¨Óu¤»öab-ÀÒ|ëÅcïO=”µRv}Ñ¿ ‡0F''ø‹š@ýÃé üåfë Âíušk-[7ˆ-¿ÍesØ€múç­´‘?¶¬Ôé~o ÕIEND®B`‚phpsysinfo-3.2.1/gfx/images/OpenMandriva.png000066400000000000000000000042211247443170600210500ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTEa¥VšV T™ZŸ\¡_¢ _žb¦c¨_¥eªa g¥g¬b¡h§c¢i­j¢i¨d£j©e¤l°n¬g  kªn²o­l«m¦m¬s±s¸n­t²p¨p¯v´r«r±u§ x· s²w¼*r¥y¸¼{³z¹!xª{º%x±.w¤‚¿|»ƒÀ)z³}¼„Á·(|¯ … ¾+~± †Ä!‚»‡Å8~¬-‚®A~§8¨1‚µˆÇ(†¾1…±;„«5…¸ŒÄ‹É,ˆÁ+н.‰Â6ˆµ?‡¯0‹Ä8Š·"Ç$ŽÍ3ŒÆCв1ŽÁ%‘ÉJ‰¬•Ó'’Ê6ŽÈ7É)“Ë+’Ñ5‘Ä?¼+”ÌG޶˜Ö,•Í8“ÆPޱJ¸0—Ï2˜Ð%›ÙE”ÁL“»T’µD–½Z’¯(Û5šÓI—ÅA™Ì( ×8œÕ^•³@œÈ:ÖS˜ÁY—ºI›Â8ŸÑQš»,¢Ù;ž×EœÐe–¯Xš¶DžË.£Û=ŸØ`›²?¡ÚUž¿=£ÕG¡Î\žºi›³Q¡ÈcžµY¡Ãe ¸C§Úrž±a¢¿U¥ÍN§Ô\¥Çc¤ÁQ©×j¥¼v£¶ZªÑg¨Åm¨¿~¥³r¨¹{¨»_®Ök¬Éq«Ãv«½f®Ð‚©·‡ª³n¯Ìy®Àj±Ôu°Ç…­»‰­µq²Ïd¶×±¾}²Äl·Ó†²¹{¶Î³»†·Ã•µ¸w¼Ò“·À˜¸»Œ¼É‡½Ï¼Ãžº·¼¿ ¼ºŒÂÔ£¿½•ÂÉ ÀÃ’ÃÏ¥Á¿¨Á¹™Å̧ÃÁÆÇ¥ÅȬŽœÈÏ«ÇĵÆÀ£ËͰÉÁ­ÊǨÍÈ©Îɼʾ¦ÏдÍűÎ˼ÎÇÀδÑήÓθÑɼÒÄÆÑ¿ºÔËÄÒÆÉÔ½×ÎÇÕÈÂØÊËÖÄÏØÀÍØÆÎÚÇÆÜÎÌÛÎÒÛÂÙÚÃÕÝÅÛÜÅÓÞÌàÞÁÞßÈØáÈâàÃÚãËãâÅÜäÌß䯸‘œ:tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûýŠŠŠŠŠŠŠŠŠ—ï„„„„„„„‹¸zzzzzz~Üw{{{{{{w´‹~……~Âowwwwww†°w{{{{{{{{wÂ_nnnnnn_joo_Âôîº_oo††jjjjjjjýgjjɨjjnãgggggggY``Ø``º`]]]]]]]ìXXô¢XXôXXXXXXXPDZZDZœZZZZZZZZ©DQ±Q?SSSSSSSSìê?<?@QQQQQQQQýÊ@C;@ôBBBBBBBBúÅ;=4;Ý<<<<<<<<ôÝ/+/+Ô77777777¼''¿'"ç;;;;;;;;-&A'&Wø;;;;;;;;8È&&Ï&&222222222ª F+++++++++' ×  ‘'''''''''=í  >èÍ !!!!!!!!!!m .÷1&&&&&&&&&&TÈ*óò‘##########úåì–»#¥è[3[>¤Es˜½ìú½  ͇.*˜’M †‚ÁÁëIEND®B`‚phpsysinfo-3.2.1/gfx/images/Oracle.png000066400000000000000000000101711247443170600176730ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs  šœ+IDATxÚ ßïW=™»îÞîû82$úïH›ÿ¡•LûñúҜ€þ™Ìÿ¶ØúH2K[ÿ~¸e×$oÉ+ 3iDÐÕê)ZF0>GèÜÿú«<Áe¿ïqªã ÿ¨Î ïÏrJñÚJ3_*ikþñ²K¤8€¿ÀK)DÛÑÅ ½¼Çû-b|ݵ}W×·–@*¨ü÷ìõ ÿöúæ.'ýÊøÍx‡ÄåôØ?Œ¨*ëëÿ½*ì.ó‘2åOW›%ZÀ¸Ù·e[ ÿÖÖÖÿíõþÚá¼ýþöû àòCÆ¡0öçã몪ÿ**’Ùg!0’ÀÉ€û÷8ö3b +¨õàË«ÏõÝEév²ÓjF²W=˜¸èOÿnúþûüöêõë !ñúñúÿóùöÌݾêöõ8#ÿ6'üûñóõèêûê ÿîˆX‹ÿÿd£éAí÷cÿ0øóñôúèÙêÿÝö÷þôúÿú ÿ"ÿ'5!ÿüïöêå÷ÿçšÅÿưy+QØ×éQP°ÿªªÿw©ê.Eh› ùüôÿêöÕ  ÿ  ($#/( úùðøøÿò×çà°r cî×^(Ch]˜éLŸ¿êÞ ê,²Óÿ(Ât÷øòÿÿþ  ýûÿþÿ ÿ ï÷ãä÷èt“ÕÚõãIÙ¥uN—ÿé°Ñþ€¿¿ªªÕàêþ1€sg ûöûþÿõÿ  ÿ/üÿÿþÿùüóÿ  ý÷øèöùóÛêêÿ»D{ÿ ÿÿûó)þ¡zÐæô-é©Ðíݤxõüøüíþþõùýòûþðõùÿïþ ýüýüýÿþ z­ÿÓåþéþëøé8ŠWun­þ Uªÿ£É˜]’ è’³ì4ÞîÁùùñýûúóüóÿ'öûêýúêøýõ ÿêùêþ­)b2Ì*f·ÿ͇oà÷ï#úï/·‚<\\=ÅŒóH,ÿ s9ˆs‹{x>'9òöÿðïüõûÿüýÿþñðÿî¬Ó×1 Ý"ÿ ÿþðüþùÿ Øæàg–×é¡ÊÖæÄkb¨Òs“ŒYjûî2쨴ÁàCý²W=Ÿ¿ßáð HýÿJîöñ  ÷úÿîÚêÿÈk¥ÿ¼&zIÿA úöïÿ& ïöà÷ûÿó ûþÿüèóâØîþâ& 2ÿ²hDÖaA!øà˜¸±ÿ#üÿ‚ÿÿ þ þÿþú íûÖüüýÿôþÿ  $ÿÛ!¶ þýeDéqHç発©úþÿpøÿù ÿÿ  ÿþü ÿøÿýÿü ÿß ³ ÿýÚgMìðìŸî ÿg òüýÿ úýÿùûþ÷öùî  [ôèøVLúVV+úøýÿý <ýüÿþþ÷úñûõ  ùþñüûÇîÊ“ôVV+úëð~îøÿO "Z>ÿG  ÿþ÷ûô·×¯O-þÏt€€þ}W¼ÔéÿÍåòÚ'O ùÿýìõÔg­pêõÞöïÓéöô9AM鈺ÿ£åð¹íøÔÌäĉ»›*2:à°mnÝïï |£Êçö×PŸo#,Ÿt,êbÏ ôäÅ3 åðÞ:Õëöç§«•:þå)íß)üïàžÀÒ¬ÿýøô¢¸¿Êá´aøë,Ïeµ)Ã:£Áå:ÄëW=£Ãé/ýþÿ`ûýþýú üïÏsXúàþþË%Üޤõùþ/ñwAøÙ¸þùçþ‚ -ï „Ïøüíë þƒZD陿æþŒùûùüðúýôôú 0³â¶äž> ,ÞØ  ÷2ìÿôòWÿå#0ÏüñùúïûüòþÿÿƒfW=¡Âã.ÿýnüÿ5ûýöýþöýþüûüôðüþÿÿÿýÿü ë Þ®òRìòùÿ ÿ  d[=ÞW=ªªÕüóûýþÿüÿÿø ø óô !þdüþ7ûýÿýÿÿ ´a@sVV+úZìì™™™Ðò 8úÿþÿëÞîùí»)Òð¾IEND®B`‚phpsysinfo-3.2.1/gfx/images/PCLinuxOS.png000066400000000000000000000075671247443170600202710ustar00rootroot00000000000000‰PNG  IHDR M ) pHYs × ×B(›x)IDATxÚáðÿÿÿéºæLÂï=è÷-öý"ÿÿÿñÞÓ4Ãþ´ÿ.FêÿÿÿãÂ>­çtÒñIÓóþÿüÿûþüÿ'ü' ·DŒÿ:>ÂÿÿÿïŪ蔲çMíù  þÿýÿúþúý÷þöü@³Imÿ1:áÿÿÿÓ½P—áŸÌï    ÿüþûþùþ÷ýöüôüóü(ðPbÿRE¯ÿÿÿ¹kÝ’ëù   ÿþÿúýúþ÷üõüõüòûñû þV#oÿaI”ÿÿÿÈ»`…Úžñú ÿÿåëáæÿòôïöùôÿÿ   #%ôüóûôûòûñúïúÿX cÿdLŸÿÿÿèÆ5uÓÃàöÚãÌÕïõöÑÜùþþûüúü%/B.3(é÷òúðúïúîúù\"=ÿWHËÿÿÿ«†üͲæ,øû¿Ëäèá Ð þýþüüøü÷ùõø0dGíüïùïúíùìù0ØX1ÿ@@øÉd´Ô, øûµÃóôó è  ÿýþúüøû÷èîòŒ£v]ýÿýÿûþùþÎì()m@‹ÿª}øÝ¾ëºÊçé î ô  üýùý÷ùéåýͯû ,lMÝóìøìùêø#èb#æAÆÍ   Ýçâå   ÿøñû  üýøúõëöõ'=  ðôêñÏØ!öü ü Üñ×òG4Pm¿ë8¾Íþ   ùîùµ˜Ö˺áʽìîæü ÝÌò! þþûþØæN1ðúùþùþñû ðÛô7ôøëî ÿ ùü¹žÔ÷óÿýÔÌýÔÌæ+3 óôÿþÿ ÷ÿíøäè èö5òú'çí ùÍ¢æ÷ó çãûçãðUsòùäêøü*úÿöøýñÙËõ  òöûþ ÿÔ¨ÿþåÞùîèùÿþñýþýÿþ þþýþýþéãú+.PV"',3 ÚÏôýýýþýþýþ úþþÿþþÿö Úýþ7ýþüþüþ!ÿ#ðñ÷$ üë…jw<@ ÏÊô $øiyúµ©ìÔËó1úüûüüýøþüþüþýÿÖ ÉúþúþûþûþêÉôó üï ( ÍÏõ”ŠçWiøÿñö-CÝÐòùûùû ûýúþúþùþ ˈk»é\ÿ ýËÍù÷æÿÿù5H *ú% 7C ÿò÷ûó÷ûóöûþüùûó÷ûQ/ïúóûòûøþ"‚êü¼2äÉëö÷üõû)Îòæëù ÿóû÷ ,Cîôìýþùû÷úôøöúñöõ 8, Õôöüöýöþéâ¸ÿ  þùèþÂëHýþ<%ÍÝãóøôÿÿöýýõüþöùüöùûööúöõùöõøöò÷öó÷öóööó÷÷ñøöû{MÜûñúñûñûòû „ÿ”tÃ.™>iÂé'érO$›¸Ëæîøùü÷ûýþüüøü÷úöø tI4ÞþòùòûòûòûÜ ‘ÿÿÿÂÂ:Ö¿ì÷ ù×ÜÍ©ÈÜÿÿýþûýúûþý_8&.&1Øöòùñúïúíúûÿý# Bÿ¥gÂÿÿÿ¨¹hÚ—úü  ñèëÖØâáÍáëêõøþ 5-!)äû îùóûòûñúïú÷þ lÿ®i•ÿÿÿŸµt§ßŠöû   ÿýúþîúðûùý÷üöüôüòûñûùþ wÿ±jŠÿÿÿ§º_¯à–àó   ÿÿüÿûýùþøýöüôüòüö kÿ­h ÿÿÿµÂ)Àä˜Éê>úþ þÿýÿûþùþ÷ýöýüþÁhÿŸfØÿÿÿ¢¶LÇêtàõ?ê÷þýþûÿùþ  ÀŒÿ£fµÿÿÿŸµ"åöMÜò=óü-úü ûÿÿÿúàÓà ³ÿ–aÞohë™y20.IEND®B`‚phpsysinfo-3.2.1/gfx/images/PLD.png000066400000000000000000000026401247443170600171070ustar00rootroot00000000000000‰PNG  IHDR U£^|gIDATxÚ\£úÿÿÿ@[Ü2$kÿÿªè1¥ãªø *ÝÆìçŸÖ¶Œ ÿÿÿÇhJ0ßÿÿðÿÿÿÿÿÿÿÿÿtZ!„ÿÿÿF!ŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿH9œÿÿÿ7s1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€1­1ÿÿÿ$9#sÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJRÿÿÿ€'œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿç¶ÀSÇSuZÿ€ÿÿÿƒ!+Ƭ191ÿIsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿU{3¥*1ÿÿÿS1D÷IsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM½$9ÿÿÿÿÿÿtZU÷ÿÿÿ ÿÿÿø‹®Þ×'„ ç:ÿÿø4„üS«ÿÿÿÿÿÿÿÿÿaB1ÖÿÿÿÿÿÿÿÿÿÿIçaBÿÿŸÆÏ7¶0| ßÖ1ÿøÿÿÌ[Æ%9éÎô÷!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿUœÿÿÿUÞEµ«ø ÿÿÿø×éÿøßçÿÿøÕ®ëßøUÎß÷ûç€ø2ðóøÿÿÿøßûUøÿÿÿø ÿÿÿøôéïG ÿÿÿÿÿÿðhœAéãÓIEND®B`‚phpsysinfo-3.2.1/gfx/images/Parsix.png000066400000000000000000000042211247443170600177330ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE©qq   $&$+,*×020Ô675Ö Ê=?<ÙÜDECÈ$%Þ'LMKÙ',¿0-»11Û)'Ý+)ß.0SURß98ÁAC]_\¥LMâ<@àDA¦VUáFHfheöJðMËQNëPæQ ãQóPßUÙWnomõR ÖZÒ](Ía1õYÇc6Àf;vxuÇce¿iBø\²lnöaä`^¶pPŸtr¾oNái4~€}ög ÷i*›}|´z`õn+Étuèll£p­€lÇ~5‡‰†÷p5ñr:À?Í-µƒPš††â~°†Yöu6槇{Ý€$ª‰eí~ —‹‹øw?ºƒƒôŃdý~£Œƒ‘ŽŸŽ„¤Žwý â€T«‹‹÷}AŸ’€ë|}øIü„ÈŠož”ˆ¼v¬ï‰#öƒJï…UûŠÓŠ‹ø…Rž™–Ç“\Í’W™›˜ê……§˜“Ühú‡T¨›ï‹_÷‹U Ÿ–ž ¤ ’ü‘$ö’4¥ ŸúŽ^³ }Í–—·¢z÷’_Èœ‡ý—2ꔓù”g¥§¤ª§˜­¦¢çšw½¤œç T³©–ü=©«¨ø›p¾ª‡¶­‘Ŭxÿ Gúžu»¬¥É®tµ¯¨ü¤H¯±­þ¦QͲw½´›ûªRº´³´¶³Ì±£à««Ä´¯Ó¶uú©†Çµªÿ­\ζ¹»¸ÿ¯dñ­­ü²eÙ»t»½ºù±‘à·£þ¶nÜ¿~ÀÁ¾ÊÀ­ÈÁ³ÔÀß½ÙÁ”ó»…Û½¼ÈĶçÁ•ÅÇÄ×ÂÁãÀ´áʼnü»žÌÆÃûÁÜÇ£âÇ’ÉËÈöÀ¿ù¨ïűÜÌ´åÌœãÉÀýÇôÅÂÙÌÍÎÐÌÖмÕÏÎùÊšèРéÒ¨øËÎéÒ»Õ×ÔÙØÏöÓ²ÿÓ©üÕ¨äÙÌýÓÀèÛ´æÛºáÛÙÛÝÚ÷×ÖþÙ²øÜÍàâßÿÛÏçáÝîåÉþäÈèêçòëæþéÞÿêÙúëçùîÚöðâöõì3>JtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßû   JJÍ^Í"œH»'=OE'"""'^mE'1HOOOO'w"""##w-mmmtj;5OOOOWWŠ"###Emmttxx'=OOWW^^5##%% ûHttxxx€5'WW^^^^^E%%%%I1txxx€€€(¤5^^^^^j5ô øOxx€€€€5Ε1^^jmO(íÀÄÄÇ­'x€€€ƒ(ºÜ6=m^(å¹¾ÑѾ¹É(€ƒ=:î gvb‡æ¬3'ܹׄ„Ä×¹ä'?ÉÙbvš‡vnš ¥¥¥šnv´¾Ñ™©ÑÌ´b‡³¶¸¸¸¸bý‡¥¥¥¥¥¥¥‡é¹àá¹øv¶¸¸¸¸¸¸¥öߥ¥¥¥¥§§§b¹áá¹bš§Ï㚥¥§§§ªªn¹áѹn‡Ðg§§§ªªªªvÙ°àýõ̰æb‡b•n¥ªšvUf²1¿¹áááѹÜ'yMbv‡‡b¤Òyk“Üû-HE1†¹¾Ì̾¹„^1E'»òµ……ätEŠŠŠ1'²ŸŸÎ11HHHE-=ŠŠŽŠHH=o ô5HHHHHH'¡ŠŽŽŠHHH'}J+HHHHHHH'1Ž’ŽHHHEq  Þ;HHHHHH=1’’HHHH+3HHHHHH=4’HHHH1äâl÷-HHHHH'÷(HHH1¢>¿1HHH1¤î?+6µ Ò6(4¬I  îÒ«ÜÜ˹À˜ÂIEND®B`‚phpsysinfo-3.2.1/gfx/images/Pear.png000066400000000000000000000042211247443170600173540ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE   #"%"#!#$"&'%)'+(*',.+-13/1.02/2313425748:7;=:=><>@=?@>AB@CB;@DFEE=EGDKKCJLILMKMOLPQOTSLRTQTWIVWU[ZRW[]Y[X[\ZZ^`\^[]`R]_\`_W_a^baY_cTbdagf^dhYegdjgZijhil]mldkmjimppogoqnpsdrsqsvgwvnuwtwzkv{~y{x|{sz~o{}z|~{~p}€q€€w~€}~‚s€‚ƒ‚zƒ†w†…}„†ƒˆ‡†ˆ…†ŠzŒ‰{ˆŠ‡ŠŒ‰Œ„Œ€Œ‘|’‘‰’’”‘’–†••Œ“•’™•ˆ‘–˜–—‚•—”–šŠ”™›—™–š™‘˜š—šŒšžŽ›™Ÿž–Ÿ ŠŸœž¡‘ž Ÿ£“£¤Ž¡£ §£•¥¤œ£¥¢¢§ª§¨’¥¨˜¥§¤¨§Ÿ§©¦ª© ª«•©¬œ©«¨ª¬©­¬£­®˜«­ª¬®«¯°›­¯¬®°­®²¢¬±³°²®±³°´µŸ³µ²´¶³µ·´³¸»¸¹£¶¸µ·¹¶º¹±¸¼¬»¼¦¹»·»½¹¾¿©¼¾»¼À¯½¿¼»À¾Á½Á¬À¾Ã¹ÁÄ´ÁÿÂÄÁÀÅÈÅÆ°ÄÆÃÇȲÅÇÄÈǾÊ˵ÈÊÆÉËÈÌËÂÌÍ·ÈÍÐËÍÊËϾÏкÍÏÌÌÑÔÑÑÈÏÑÎÏÓÃÐÓÏÎÓÕÔÕ¾ÒÔÑÓÕÒ×ÖÍרÂÕ×ÔÛ×ÈÜØÉ×ÙÖÚÙÐÚÛÄÜÝÆÚÜÙÙÞáÞßÉÜÞÛßÞÕâàÃÝáÐßáÞâãÌãâÙçãÔáåÔæåÈäåÎâäáéçËçæÝçèÒåçãæéØëéÌìèÙçéæìëÎêëÔåêíçíÎëêáèìÛéëèñöùöøõôúüùûøÿúùýúÿ÷üÿûýúÿüÿùÿÿüÿûÿÿõþÿüW[˜tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûÎÐ|“ ÁG†“œºAd‘“¤¹šßa]dÚÓq§¶¥©Æ-|”š˜˜¹Í1Œ“““‘¤ÆžJ‘““““˜Á#g“““““”¾ç(†“““““‘¹ÍžM‘“““““‘§Æ)|“““““““›ÁݸU““““““‘¤¶=‚‘““““““”´ÑBr‘“““““““”ºÌJ““““““““”¾)t“““““““““‘±Æ+Œ‘““““““““‘𹯼=‘““““““““““‘š­¶Áص?““““““““““““‘‘”±Íµ?““““““““““““““‘¤Æµ7“““““““““““““““œÁÒŒ‘““““““““““““‘ ½ k‘“““““““““““““«ÁR$ˆ“““““““““““‘˜°ç :†‘“““““““““—œ¥ &d‚ŒŒŒŒŒ†‚‘V $=?17GLL[¿ìÖåÌÈÓóÉhÛx^IEND®B`‚phpsysinfo-3.2.1/gfx/images/Peppermint.png000066400000000000000000000101711247443170600206110ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs × ×B(›x+IDATxÚ ßïîòûäåüÿ ü?þÀÿýÿÿÿ ü9ûüCúô0þ  ϲ¬ÛÙÖñÆ»âéÆñö(ýû çïòêÙÔþúîòû: óÚHûÿdþþÿþ‡ îü úøÓ½¶µõ]VÐôøÓéûØþþþù$òÚùý„ýÿ!ÿõ¡¦(ELZ  ôõùþ•ùl¶«-îòû.-àäîxúÿ1ÿå!çåÿ-ûüâí íòÿaÿÿÿÁý€ôÜþê$,<6- Èæÿÿñï Šîòÿeúþ@äð‡ $ø CG. ¯‡ŸŸ÷þÿÿð/[ìòÿfÿúþ8çówxg‰x/žª‡ÿNXZÐþÿòðÓÞÚðdÿøùFæžžGïë0»ÈXÿuÌ÷ÿýþ÷öâÿÿñ<$yüü$÷ümï  ÿ-4Zÿv„‡ «þûüÿ)å³øöâèÛð=ÿýóùX -ÇØuÿëói ±þþ ýþÿ -ÿñöü,ÿüÿýþáʇe ÿÿ ôùi•öÿõÿÿþáúûÓüÿÿþêŸ%£•Ÿ&öõ ûú9øùPÈÊÿžŸîýÞ¬ìpÿèâÃþÿüÿþÿüÿþÿüÿþÿüÿþÿüÿþÿüÿþÿüÿÿƼ–ÿ€liÞ±ÙØðhþÿüÿÿÙÐ¥ß ¥ÙÖÙÖÙ×ìsÿðëÒþÿüÿþÿüÿþÿüÿþÿüÿþÿüÿÿû÷ðîHîòûêúþ)ìöÿeÞñýNòðÓÿñøöâÿñÿ9@i‡ÿþÿ÷îëÄß01þùúÿ0ûíÛžžÿ ÿB/-ÙÀѰùþÕ »wwDI-æ>?ô Ù¹¿306Kþþå ŸèÿúðôÿK ÈPIåz‡K%+KÿýOóý·ø2áîÿ§ýþøúÿÿ þîÒ  mqò—ôôµÅE/4KÿýýñþüñþþÿMïýºó0æôÿ«ûýô¾ÒöýõòÿM㸡´KâGLüñ ÿØ%ϼÑxÿ<ýMóýºÿj\-Ù˜¤±øü ¯ à ž«&26-àè ¬úæîváüý#ÿþøá§ ãõ‰ÿ mðÝý¶Ýòýƒ}è çûžIOiø-Ÿúü5ø æö„ »üý"ÿþûþ%æí|æ ­óþþûÚþû€p}‡Ç¿¦åîpýÿÿÌÍêÿôøJðóþþÍÿüÿÈþÿþÎ&¶¯ÅíûÿïîÓßBGýÿÿþÿÿóôóÓÿ*/Z ªÓÿüû Êîòû %1äîÿ‰ÿÿùå Õ©¯*DHZÿþýñòlçówÿû ¦ñûyôôâý(iÝçˆØ!ý\Ìþöîòû%ÿQ æù˜ÿÎÇ—Ú7=9ÿô$ØÓêÿ$)Kÿñôoæñwÿÿƒîû¨ÛþùúûÒ§ž—ÿÿÿþñíB>Øþ ò;-ªÿñÿ äò‚ËþØýµ7ûÙöqi¿ëçÄÿñÊȵïóÿ]ôö)þþÿ dM¹ûôŠëþóªþý _bØö+‰óòÓåäÄß<> þ üûüûñ¥‡ÐüµÇØï™âþýÌù%|ôóÓëêÄá%"ìû&ÿÿÿÿ  ªýþþ¢ ü ï33ñõßþèñýÊý%yÞÙµØÖµáßùûÿ7òþýñW_ Œý“ÛþùõêþèV@Äó8+ùìñgûþ4ÿ âëçÄù)Ý+ü׿þü請ñïïËõ9ãëýYüþCýþþÿÿÿ‡†øøñÑ͵ƒuµïÄËîöýÆöíþòþîòûV ;ë¸È(öü9ÿÿ*þüÿý ýýë ¦õúë æôöûàåÿ÷ÿÿîòûà #ÿÝüþþýcì¸èt4…IEND®B`‚phpsysinfo-3.2.1/gfx/images/Pisi.png000066400000000000000000000042211247443170600173710ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE    !!%%*%*'))"*,.-&1.32+ÒvÑ|66/Ò}97+ÚÓ~Ûˆ:92>;0ÕA<,Ó „C@4Ö €CC;GD8ׇ͂GG?LI=LKDØOL@Û‹MOLÔ"ˆÛ ‘Õ$‰Ë'ŠQRPSRKVSGQVXTVSÈ.ŠØ*‘TX[[XLWYV\XVY[XÜ/•Ö2Þ0‘Ç8Œ_]P\][Ù6]bdÆ@Û9—ac`hcQÄG‘ih`gifniWÜC•fkmÜD›ÛF¢kmjäH•tpnwr_ÖPàN•rtq|vduwtßS©àU˜¿`›ãU¦ÝW¤€zhà[•à]œá]®ä]ªÝ`®‡nÜdªƒ…‚‹…råhÀs Ùl¡æg°†ˆ…ˆpämŸàq Œ—vÜz¶Æ„§•|”–“ê~¥½Ž«¥„߈¹æˆ©žŸœ¶š¬¤£ˆª¢‰£¥¢¥§¤ë’«°§Ž¥ª­¾¢´à—Ãé—­©«¨´¬’­®²é±·¯•¯±®¹±—Û¤ÄÅ­·À¯·²´±½µ›ì¥±¼³¹ºµ´Á¶—µ·³ê©³¹»¸¼»²Á½›»½ºÝ²È¹¾ÁɾŸÀ¿¶î²´Ã¾¼¾À½ã³ÑÁ¿ÃÀ¿ÇâɿÆÍ¢Äú¿ÄÆÃÅÂﹸÐÅ¥ÅÇÃÈǾËǸÍɧÝÀÒí¾»ÊÇËÁËÆð¿·ÇÊÆäÀÔÕʪÝÄÎÇÌÏËÍÉÑ;ÑÌÊãÆØÔιðÆ»ÚÏ®ÔÐÁÏÑÎÉÓÍ×Ó±é;ÙÒ¾ïÌ¿ØÒÑÐÕ×ÓÕÒóλÖÔØÔÖÓã×·ÝÙ¶ÖØÕñÓ¾âÙ¿ÕÚÜØÚÖÙÛ×õÖÁÚÜÙðØÂßÞÁÛÝÚßÜáÜÞÛÝßÜÞàÝßáÞåàÞàâßáäàæãèãåáäæãÞèâåçäæèåàêåçéæèêçéëèêìéäîéìîëóíìîðíïñîðòïñóðòôñóõòõ÷ô÷ùöøû÷ýÿü´àoštRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûµÕ¸%)¸p=ZÏŸ„§ÙÙ½Åo=)[Z{šÙ§ÙÙÙÙØÅ%F%0ŸˆšÙ§ÙââáàÙ…Ú\àሚÆâ§âæææââàÇÏIàâãæš¾ì§ììèèèæâáÇÏ@àâæèè¹¾îðîîììèæãá­Ùâæèìîî¹ñÙóððïîìèæãáx¦âæèìîïðïóðõóóñðîìèæâá$%\áãæìîïñóõè÷÷÷öõóðîìèæâØ[CÙâæèìïñóö÷øøøøø÷õóðîìèãà}Ú‘àâæìîðóöøùúúúùùø÷õñïîèæâÙÙáãèìîñõ÷ùùûûûúúúøöóðîìæâÙ§£Ùáæèìïóõøúûûûûûûúù÷óñîìèãÙØØÙâæèîïóöøùûüýüûûúùøõñïìèãÙØ±ØÙâæè<::5÷ùûüýüûûúùq:::ØèãÙØÎ½ØÙáæì,þS:úûûûüûûùm( þ¹¹èãÙØÎ¿ÎÑÙáãè1þ5 |ùûûûúúý5" Ø€ÎæâÙØÎ¹ÆÑØàâæWïø'°QøúùùùùýY23þGææâÙØÎ«±ÎØÙâæó5ãýþm÷øøøøøû:ýøQqèãàØÑÍÎØÙáãæïvKQ¾õö÷÷öööQKYØèæâÙØÎ¡¿ÎØÙâæèìîïðóóõõóóñðîìèæâàÙÑÆ­ØÙàâæèììîÎG,,,gðîìèæãáÙØÑÖ½ØÙàâæzçºìG::5ÙºòdèãáÙØÑ²½ØÙã)èfÁèì1:èî.ä^´ÙØØ²¶Ù)êêãææì|æææâsžfØÂ®kÌFÙÙàáâã¤ââáàÙ¼P·+VÕ‡‹±ÑØÙÙÙÙÙÙÙÙØ×¬Ý+?Ö­¶ÍÙÙׯ¤ÅR‹”M%®w?¸àCíéN{IEND®B`‚phpsysinfo-3.2.1/gfx/images/Porteus.png000066400000000000000000000101711247443170600201270ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ßïÿÿÿ‹#ù 0#þþþ þæüýà Êÿß`øÿÿÿ 0õ JþGûì!þïõýü þû óþ áööŽÿÿo¢ÿÿÿš ûZúe×0ýÙàþëµûÕýýëÿýý1ûLþ$Àý bÿ÷cáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœ˜ví?¾Eÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ+ZUxÔè–=ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™–žkï,nÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$$|ˆŽ÷ “;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúþÙJúÆTÿ÷Ó½%·äàüÿö$ýÿÿø øúáýûÖÿÿÛ×x|Þýó¬{2ÿÿ…çÿÿÿ–Wú蘿Uÿÿü!à6Tûö<þê!ñüûêþêÿÿ û¸úûdÿÿxï||ÿý‚kÿÿÿ!àÒÿÉ™ÿû¤  öúZúðVÿÑ)ÿÚÇ÷“ûÁåÿÙìgCüOþŠÿÿjм ûÕYóÿžëÿÿÿ˜XúÙy*5ÿÔÿú —.õiÚZÿÂäçhÿÿæÃs/þ*ýùÜûðÿÿ’¬úù_ï‚ÿÔÿú–$uÿÎVÿþÁ¥ñnÿÿêô“*DþBüø*þòýøíÿÕËþ¸ûíXíÓó!ܺ•výýÓS¾˜ÿÿÞo“#ùeóUûþÕò®ï©üôÚûíòüþùþ4þùÎüÿ¯§ÿÿÿÿÿÿÿÿÿÿÿÿ' v±ÿÿÿÿÿÿ”i}ï/­ÿÿÿÿÿÿÿÿÿÿÿÿ—G“Äað8zÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙÉø Æ  þþkûÎðÿæ_•Vö}úÂÿÓ9ÿÿà×ÿÿ™ûþÿ¤õöHä#Þxÿÿêô–Mþøzþ¸ ÿÀ<ÿÿà×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ›°[Ðÿÿÿÿÿÿÿÿÿ &“»Rì!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöð%ù¬gó eþß;Ôqÿÿèßÿùüå¾03þúGÏÖþüÙ£ûüçÎRç&ÿó‘ÿìþÿßø« 5ýçýÌ»ÿþåéÿ"ýðÕÿÿÿèýýÚ!úÿþþüÕþú«F9üþðÿÿŒ»úüøùý þüúÊ æþÿ ÿÿ™û÷öîü ÿÿtõú÷Ãý744÷ŒüÍ01ÿø|ºüû¿\ö_ýûPlÿÿ’äóN‰ÿÿÿf+/ÿÿ™¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI ŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿhEŽtIEND®B`‚phpsysinfo-3.2.1/gfx/images/Puppy.png000066400000000000000000000101441247443170600176030ustar00rootroot00000000000000‰PNG  IHDR szzô+IDATxÚ ßúþÿÿù™øÿf:ÎÎà°ºòðëýUT:6÷÷úª¯æ—™ïÔÍÞþ "ÿZR YW:6®ÂêSêúú€€ÿï mþú’ þQû¹†æÂÂ;KN÷ôøœ0ý:èHL* '%ÚÚí¶²íìLJ(* õúû×ÖìÃÆëðé¥ÿüêqÏäÝùòÀúÿ¿ÔÿO-‰oÅ íþ÷6ÿÑ3?HÆÍÙ×:ld%üþÿÿýüþÿÿüÿÿñõòÿøøñúøùò÷[ýùùö¶¹‹ £Ûÿï0ÊÐüÿì .ÿ;-õÕ·ÄwS)&.; ýþÿöûüÝÛ®ÊHBŠß:øôûùþýýþþüÿþþÿþýýþúûûþþ HIy_],ýùÃL?´£¯×óÊÇ#ÖÛûwHSîÿò@Àîê •tÕÝjmÓÕÆ$þþýññêÚÝØèåéÞáðC?8üþýùúüûýÿúûüûúúýÿÿÿÿý H<=ìûÄLÿ:¶´¿Å þþJDeäúqð\Üðòë$#*ðñê;8¡¦ÿó`ƒ, r’C?ïõúûúúþþýüÿýÿÿÿþÿýþþÿþøöóþÉBþþýÌ>ïíµ  mÏ–”;jgµPKääÞÿÿþýþ:2CÝÿó`ƒöŽnJB*õóòÿÿþüÿüÿÿþýúýûýþüþýÿ=ºþÿ2È ø÷ølj.¾»ÿì ¼Âù¾LÿþWgÿ}’ ÿŸ ‚ŠûïML©¹ýüüþúûúÿÿÿÿÿÿþúôõøŸª½ø=¶ü6¾•›Çãùùùøùú,,¬±Úÿê tÌÕpbýüö613éøÎ>þýy‡ÿRQLõ÷ó  73<ÝùÆH·ÅþÅùúúüýûþþþþûùôôòõúúøøøú^Zzêâ‡{þÿýø÷õûÛ&BA5ðòíöôôúý÷Ĩÿÿòóòÿþ ÉÌÙNH‹ÆKBEîú÷ùÿÿõõôøøúþýþùùûþÿûøþêüûüûîýóþš¸rp\øõüýýûî$n êé䥩̺®I5ù¸TGÐßûûüýþþýýþýþüÿÿûûüçTÝõôî  £”ÿú=‘«›ƒ¬©ècY\¦›8<ûÝD=¸A8KÚù¶VUýu€àºùú ýþþýýþööýþþþíïõý4ßÿVQ ÜÞßúùø«¬ñòìõôôŒŽ²Ã»_,þû ¦Ä‘‹Hú÷òøûÿÿþþíîðe_I ýÀFŸ©÷µüüýÿ_V"' £””N*÷õütn?)ËÆÁPµ6ñÿÿU•B–¢S!!úùùþþþþÿÿÿþþÿüùóöùü ôööýüýÿÿÿQPbèûÆ0þÞ,óÿõ_I®’›´ôûøýœ ÔØÊ·öÿñ´ ºìþ«òº·éiazì ûþüüþüôöôõöó÷öñòôòùúù RR€ÝRR™Ì Ÿ£Âú¤^ž§ØÙy„ú”ñÿüéVcý”›´õø÷úîðö×Ì1c·µIÙ ºìþ€€ÿÿUª;M[5KL;ûøòüüüýýøûüþþÿýüýÿ]T5ç w˜÷£Dýä*|‹ÿŽýýþúûüýüýüûþôöû‚÷üYÍÿùqƨèþ€€ÿöÌ {¤®– ûûöûûþüþýýþÿýþþ¿ÃÒéÜHF]]7ññóö÷ûýýÿûûûþüÿööû†ŒýÓÿîLQÿ“k%æþ€€ÐÐÿ>/3SiŸ¬­ úùøýþÿÿþÿýþþþýþþÿÿþýþüüüõ÷ùøøüþþþîñ÷ŒðØÿñ;qÉÅÕo88Àþ€€§¬ÿ7XVRrŠ“®î"!÷øùýþýþýþýþþýýþüüüúûüýüÿùúûÿ÷öüÜàšÿö”M žÒjààÉþYTËçæÿ¢;Z Å·…ƒ8 ýýþÿÿþýýþþþýýýõôûäåò²¶âìßGRüæâáÓËü·ÿ9Å4ibc9yÄhi$ÿþþ÷øûùûýîí÷Ýàï½·Ò÷ÿùwGþï@$ È„ÏÜAÏîþ€€þ€}ü\('äÙß±4ÿš;ö5ä#ñýñÿüÇþÑ&üøÿ]º"q¾áÚý¦€€þ€€ÿÿóY îû¦I¶¹ò]Z¯ír:þùzÈ™¢lRL Z¸§öþúþ€€üÿÿú€üüþçó{yÁgIEND®B`‚phpsysinfo-3.2.1/gfx/images/QNX.png000066400000000000000000000101711247443170600171340ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ßïÿÿÿ«««nJ«««««««g4ÿÿÿÿÿÿÿÿÿUÿþþþÞ“ÿÿÿÿÿÿeÿþþþïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñÿñüÿýþÿÿÿùçÿþøÿÿþÿÿÿîòþþôÞÿõÿÿþÿþÿþþé:ÿøÿÿÿþÿéÿÿÿÿþÿýþýþýþõýþ ýþÿÿÿ ÿÿÿøùùøùùùÿþÿùþÿøþÿ$¿ÿßø«V( ÿÿÿÿÿÿûýÿÿÿ_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþp ÿÿÿÿÿÿÿâææáïâÿÿÿÿÿûþÿÿÿÿþÿÿÿÿÿÿÿÿJ%ºÞŽÿÿHù ÿÿÿÿÿÿýÿÿÿøÿÿÿý ÿÿÿôÿÿÿúþàÿúÿÿÿýýÿÿúùäÿÿÿÿòÿÿÿóþÿÿÿÿÚúû## ìÿöÿü ã 6ß@ êÿÿ÷ÿÿþÿþýÿ$^^õñöùóóµÿÿÿÿj5ûûéÌSÓÎÒÒ¶Uÿÿÿõÿÿ‘ÿLÿÿüÿý³ýüÿkÿÿ‰þÿVÿüýùðÉÿÿÿhÿÿùëÿûÿüû ú§¨!VUÿþÿÿúèÿÿýÿù&ÿÿÿõ Î ùþÿÄbÿÿÿÿÿÿäï ôä oñÿøÜwÿü®éùÓ«VV«þÿÿÿùþÿÿÿÿÿüÿÿÿø ÿÿÿ÷Þÿþýÿ ûþÿÿùÿÿÿÿÿÿÿÿþýÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿùùÿÿÿ÷éJ ÿÿÿÿÿÿÿÿÿÿÿÿýþÿÿÿõ!ÿÿÿÿßøÿüöÿÿÿJŒýÀÿÿÿeÞþþÿðúþ0ÿÿÿïîÿýþ ÿÿðö •ÿÿÿzA÷ÿÿÿÿüüÿÿÿÿ*ÿøÿ õþþ ÿÿÿþþüÿÿÿüüe³üÿÿüæ˜fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿ€¿€ÿÿ7$@+ @+ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏmެÞrz IEND®B`‚phpsysinfo-3.2.1/gfx/images/ROSA.png000066400000000000000000000101711247443170600172320ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ß€ÍÍ 33z€ô" vzn,ÂÅèùø½Òêúôÿ3IÿæzŠçá¾°°üššþø««UU ‚‚ÿH„‡ #TWnÏ79 WUÿ=" ô÷îíòÿêõëå ¬7+–$ú&¥¦Sô™™åî··¶IIòÉÉÕÏï*éçÿ\41vW®«¡ô#"k±"(úèîúÜïñßäâãçÒáêäáéìÛîî þ3=jÆüÌbUu3²7š—ÿDÆÆ•˜ÿNŸm˜™g?µÞúç ÎéÞùôéëôß÷ñÅèøÐïïßìïàðí õíùÇù×02m{ÕÛÿD€€¥@@@ÆÆ–™þ‹' óMþä Þ ûÿõ•ÿû ôøþÿõöúíøüøìùþèîõåûïý{ùöþþîûïÏÊ8Anì¾À¦ç@@ øÀÀ –™ÿ@(!s(üõäú ÿ  ùüé êñæðüôüîþþþÿ÷ ü$òýû ýóõìÿ´mÀæ ÁØààð««Àºï$+'Eüóèÿø   ÿ ã&äúïâ äüüâúÿ åïþýÛôê÷ýóÚ+ò2 üøìûòj##þuàÐUU Et@e î  þàÿè7ó â&ÿ) # ÿ   ûú=@üØóýùòõì@=}*öÿGðô@@üÍÍ ‰†ÿJ+-nWôä ü   ä ÷D!²l4:36þýüúþóýúüùðèÿ  þýýüý ò÷ìýìö ²s ÍÍüEE… ÿ÷î  ú ùò6SffÆo6püýöùúþøþÿÿþýýþþôêùîý ì þû üüüíîúú‚ƒHMñx+β·î3WÐüwÿüó ý   ôó„ŽhøN'Kþþîÿý ö ûÿÿþùú Þöøü´¾ï³ùûöúüþÿûöÿ÷ûò ‘Tà""ÚÙêÿûðü  öþú5aiº/~þùò øýÿ úüüûýïøôûþÿüðìóü üûñð ü÷òü„€òëïþ‘“9Nÿõ ú  ûùuG~öøöþÿþÿ öüü þ þÙóúý ,)ñôü ü úðïskopçÖýüýÿüûýòÿôûBhjÈþýÿþÿþþÿüþþýú Ïóöýýüÿþî ÿöüø ûöÿdý¿$üþü  óøöC'@üýúÿüþþþúþÛõøçúþþûü%ýø þ  üøüüÇרüüüÿùþöÿü (þÿüþþúþÿüúþáùþÐôüþüÿýþþþ!ôüðúÿìüúÿøþúþýþ øøö ÿÿúùüüûøýþþþúûûþýîøþ¾ìúúþÿþþþþ# ÿüý þþýÿúþü÷SÔýúöüóøðüüððñêûþûúúöþüúöûýøèøÈñøúþýöûÿþùýûöøûúôûþòñøîþýþúþ9)(¦:üÿÿ üêòÜûûóþøöù öúþüåòÏôòúûýöýÿþóüÿ éàÆ ôýöý öÿö ý ê œZcà¤ý üðôìÿü÷úþòÆÉ«öûüüìûôûüÒöþÝ÷úüõùûüþôü þ# þ3x‹¨ úûýùñùòþýõ÷AB‰©ààþÿø "ý ðøòõöø ô»–€e! öùçûþÜöøôúúýÿþýüüüõúøÿ" $éòÚýçPùûöõûððùðþùñõö É¿°Úõ *þ€pÎlw¯ýúûùôõþ ìh…Y: ÷üüíúñÿüûúÿòþøÿþ% " "I—ÌÈòùúùöþû õùúûÿøìÿCV+ÖÍÝúa\ìôøþúùööþúîÔ¾‡ÒÎE & &  þþ& + ) 3 " _M  úõôþñýô÷õûù ù †…¼šÌUUú33öää²ÿ X‰üôùú÷øñîüÖRc€P_ŠW; =6. . 4 35 ( ÿA¶yüâ™oôóóìøòùðòúúðòøûìññïx‘üttøÿò!øÿ.ØóòðñúüøðòþÒ¯«‘[+‰ªãÙ”þþ% %   þù椿}4¶ Ôéûàéôîÿóó÷üðîüÿ ÔÖî>9ÖUUú€€€àà22ÿqnv­ýîô þ ô ê"åÿúòôèùÏ "êüýä õ":=öüÜÏÙìÜÿîåðäûøéïòÿlk˜Æ ì øÎ¾×݉æ'#}ôåøýüöÿ òö÷ë ê.>Ø>0#ÿ# ðøøèïñÝØèÜüäõãîþþÿøýîêòÿ˜o~”Ø–€ô 0ð†so•„]ø<Ð÷èòðñüòêüðúü-ü( & % "øöÞæðôöîðøþ‹•™ÐÔØ–€ô 0ðàËüûMÁe•ÿý.òòàòô)ÿö& $ $+ó÷úÿöúýKÛ×Þ‘•ãÛ®««ô ø+/ÀŒ2ÌæíŽ»{x{üÓI°£Èþ    ÿÿ ×Àè¾­Œ@ýIü]cz£èÿo¢hb®ðUUúððúZ>œ$Gúf,K[ ìueÑò6A/¿ÙÖ øõùùhcŸ®qìîtþ…ƒÐ99ô“[ú@@Uô+0È*UÔ0ÞÅ¡ž)þÓÓÍâÿÿåú><¸UUôÕÕðOl_u¯çIEND®B`‚phpsysinfo-3.2.1/gfx/images/Raspbian.png000066400000000000000000000035671247443170600202400ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ.IDATX…­—mp”WÇ÷yÛ·ìfóF$E(A±¥”è´Ž¶V:NgÛií´vFÇ·je,ŽÐ‡cëTQeTü Z; ÅŠu(-åMJ @Ð’l6»›ìKvŸ·ë‡%kvó$t:žo{î9÷žÿùßsï f¶6 ø”4#¨‘.ç“ÀŸîŠøEÀcÀ]Báv$i)oǽ@„‡¯Á>PY»âÞj5Úh0§Ù‡”0³ˆ]ÍsñôÄø¨½xp€m†_ùú²ŽpÕ¼%jš 4Ÿ Þo2Ü—çÊ™¬L ™§¤äQàâ­ h­ªÑÎ=ùòmè>)%B”‡eS6'$8þjâY ÿ¶öОO?ÕDU­>m3)%ÜÜOÿ¹ÜÀÁ©ëŠ+š!¤mó—ërä³N) ÕèXWO(ª}W(løäãeà¶å2Г#°nÂëSÍÃw)“°c©a³1«Ì[ ÷D†ñ¸EÛ'ª1*š¡°pE°aäZ¾!Úhà:’³‡Ç@@kGMWJŒ%n˜9àt%˜–mɽçÞ/Ñ'„`Éê0Ë:"¼ñ»}ïfp]IrÐ$“´)äF®åùû/™»$@Û½Ñ8@ßé ™¤ý 6nob˜£ûĵGž_äolñ—-¸®äÐo†è™ Þ_ Ú¤S;ÏàÁoÏÇð—SvÌfφ«îxÜn:ß1« yek¿ì(1 (‚h“QH YªTt_ù÷$‡Lömãqûi/pu†z¬¼<}ñxæ¡Ü¸£ÕÎÕI ™œ8äè¾8Èòà‘k’ƒ°Šª NHpø1'Þo~ øùL 3µ`Ò"Àž¨Ð\®U££ðާV1x"°˜;´Z„œ¶ìžè#!M«a2Ò¢ÏÉàÂQà!`èƒÞü²¿¥ýaÿ"t¡Ði%Ù’=Ë®Èj¢ŠQœ“63l µQt†_+Œ?ý ´\érR¨l ¯Â¨è{DÑé¶Çð •GÍÓ6iQCtÙ)æ«A¾XÌ1kô> £x—¬RMš€›«VªFËÕjÖêõ„·Tª„†:‰BîÖëiÓªYk4ðÐíØÔÎVÀÇVhÕ –i‘’£¦â¸Mš”’^'Í'KÚµ>&­üAsðž´k©£n}…~®»øQiÕ"Ô C(ø„JN:¤¥MVÚ(ŽZq¶çÎË«nöe`=W1ÜúI°ØÜЮÕð\U!QNž”’Ÿä.ð7óƤë$ðÿ¦Úl/¢I»<<ô%]{Jÿ'-%-ºíÀ ð4p÷­ÀaöTÚ»ÀŽ”´ìCæÐ=ŠR%4ƥſÌa^Èž•C2¿óf±oÓ«ü?Új`ÐC‘¡W€û>ÈFÿÁ6ÿ¨lɽWIEND®B`‚phpsysinfo-3.2.1/gfx/images/ReactOS.png000066400000000000000000000057131247443170600177740ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs  ÒÝ~ütEXtSoftwareMacromedia Fireworks 8µhÒxtEXtCreation Time12/28/08ôGj IDATXÃÅWiPTW61–Î$53ɤRN'™q5Ñh5ãT4 CbÜFÅAhÙA¡è¶A¶dGš½Ùš¥Ù¾ÊÒì;Ò¬ùæ\J,ó;¯êÖ{ï¾{¾ï»çœ{ïyóÌû=»Þ˜Õf:ß\³fÍ }ººº‡ÕÕÕ×óx¼·Ì2œÿüzc¦ßÄÄd«¦¦¶žÙ2 †Å0gÙ½Äùâz>`¡µµµvff¦ouuµw]]¿¨¨ÈS"‘xˆD"#›­|>ÿÝ@Ö¾Ùµ{>ë#»-†llaa¡'³e ‹a2ì™YÏ!~þá4Û.ºêëëÓ]¢££¯fggiii9<00À)*, }û Dä»{ÆÎßëÁ®q´P.—‡õöö·¶¶ÎÊÊ:ÂlÃêììì"lÆ1Ûý³g¾@[[Û¤¢¢bŒÞLLLhá52¾G3xéèv÷ÖægÓó[»N¤J³"Llyût,Ö'&§Y’µwœîØîw!Ñ ÷Ãb˜ååå㌃q½0£æüùóÛ¥RiÕÐÐPÂk’å;‘Éï\½CÜþ¹ë„Ùשz¬>¤[¼ö;ݶuêç77ŠÙö3×ÌÒÍפ²ºÆ•Æï¤öö«8ƒƒƒâ¨f\/¼0ó ‹­I¡˜T»¾j¨ç¸ÒPc­cÐú_-–ï9¾:ˆ%[Õ§ŸW©žÁÆ.ãà%º'eþ¢Jvo½ŠCÞt%Sd¢­ç eJ6£²²²zÿËL¿&ÇMÃ7YÞœ^Õ„à¬Jh›ßÇê}'°xƒ >ør/–}{ëÔtAÞÀ Ul:f£ûAH­jb8‹g ø3Ã...6d\s$$$ðÛÛÛ¥¤¤ÑûÖ÷oµ‹Çµ¬¼¦¢ ë!oîÄ£Ì2èZñ±AM}}ŸþGëiã µ³Ø|ô Np¡~Å›O+ GncG2#~Îña¶µµ#.9hùXÐýœ§§'—îú ÖY³õ'Žò¨‰ ¬|ãá™ëÎA8|Á ëTµñÉV5ük» 8 .Ù p×/ ö¾QøÞð.¶Ÿ6ƒ{TJÛBþÄØø Â6£çó´œÍç055U¡ÕçeÁ5ý¢±¡>REߦ|ËOÆØvêöžµÀý[4ËËX¹_ Ÿl;‚%[Ôññ5,Ûõ#vkÁÔÕ¢„L£Ó¦ÅüÄu³by5ê†'®TWV„r¹Ü ´2®9–/_þ-Dz^â/ Ýò ÇJ5}|qäÖªŸÇ:ŠñZÕÓX³ÿÔt¬Øó#–îøK¿=†Ï÷kcÏc8úG!"«ö~Ñð}’ ·ˆd8†¥ ²³44ÈßF9:º”öÉŠ+Þ™#€5oonGWï-5=NZD|*]¹G¯b—–TuŒñ?}S½` Íó:c€Ç/a£Æ9¬9¬-3"¥(yª@bQ ËáŸ^ЇIE•”ƒcs÷øÔĸ———Å«gÁ‹—cšG§gdÊn BÆoß÷Bp|:Ž]·ƒ¾å=pî¸Ãêž¶Ôoí,„‰ý}\4wÀÑËØsÚnóœ^ˆÔЧHªlžn’ò§(nì@pl"žÈ«2 òr#455?ž!ž#€5g7¾M¬4ׄˆŒ• \’ ÀÇð‹x‚GÑ„Å&#X,Oh \|‚aá쉫¶n¸ÎóÆ-¿'$–@ZÛ‚†¶. (•È•"^^YYͯB¾û™Ù3Ÿ‚’ñ¼ íí¼C¢Ãb)ð#€bd—T!-¯¹äÊ‚²JäÑ=]&Gt’þQñ†ÅÁSœŸä"$þÒˆæÎnŒŽ*AÉŒüÂ"´ "äq쨃ÓéûŽŽó~31aA;œ|Š/Ûó‘WTŠ´âD[hêìAKG7ÞÒÞ‰Ú§­(®¬CvqÒ‹*]шZEºûú0ü캺:‘“ñÉIÈK~ߟž-‹ñóöÖxíad``ð~^vF ×#8úœ'"cÑÜ։ƎH3³008 娆G”|6‚Þ!ÓƒzEªš;PCä-ݽÆðÐ èCÿÀº{zá(ôÇÕ;‚¶¾a¥JZjªøúõëïÏYþþþfCý=Æ{t̵õm ! )ÒLŒ*GÑÙÝY® JŠéÔÔFÇÇ12:†ÑDÞ(«kBNyr)öÍÝýHJ“¢¸î)zIŒwH )Ÿ,Ý}KÞ]øV›BaE\Ü—èèè¼GŠ“èù#CóÛ\CGoƒ‚Êdçä`|l ´M#??###ø•*©oè™í=}¨hhF-olE¨ø œc_Û ?"¿dã‚˶÷!‘?ù±$\’‘‘‘¤§§÷Þ TÍhÑewËÊruRbRâMW…gT jÚûQߨˆ"ž¤X* ä“‹‡¦E ’€®¾AÔ·vPN´ <:&¼¦•# ÇYS;èp`äàÙéòÒ’ ssóµö@ëEMçI/Ûït)ZŒMí]ýï‡& ¯¦ãÄÔPO‡‘\Ž)&¢­ yyyè§dŸš)Gêˆ<&^‚ÛD´wÐÊ} ;œ5çá‚¥#¸.žÝŒgŠ :sœ㜮 ÷ïß¿ŒŽa?Ú†×Ëd21&Ç>´±½­}Ï?j"FV†–ž~°‹‰(,(ÀäÄexd²\´QX”cæÁ7*éò2FÆà¸ñœµvÃ5[ܸã¯û<æ%ž¸œœœõT3ú8p`é<##£š››HÙ)ªûÜÙ@ cƒµîÞɧ §² }C˜$OÔ54LŒ<£„4+ UU{Ä$68F3Wœ»- ·óÁaç!™½î›ššÜÝnܸñý<‡£K±uŒˆˆ°£ÚM Ú´~ÝŸÜ\O DaMA’ld“ˆêÖ.ô+'PÛ¤@ZF&Zí”ñ}ˆ–$#5# …´'&dঠ­¦]otÇ-ßäÿo³ŒëQÍhÇ8©HÕ·wïÞ555"rM8 xQéžøAãcžƒ£“§¨˜rL^߆‘1”UU#.5â„$”–W¢¬¾ ÎÞpè‹äŒlˆÓ²`åîÍ‹¦¿R;µø5õå A8ãTQQÙÁ’pQXX˜ÓØØX}TŸ=XàÂû; sÈ‘—*¥9ŠÓÖyUbI„«>H¼‡ÐãXÂ…/¬KNÏPôôö±¢ã“×PífœŒ{º“”¬ 2©Œ>T²jˆšUÇ\ú©¦¥¦?à{ðl­m¸O’ⳋʜ6yÏKÔÕÆYyìÂc+»ª°èØÎðøä:IJšŠ³½Íš¿ë©©©4SO*Ío2L†Í8%ÿç/í„Û·o_ïããSL•q-Í:˜ªdÊ‹ŸKKKvuvj‘_*&S„Bá]ݳgwh˜­Ô·tZ±óøÅO¿ÞwäC‡»w? ~d’+“…µµ)x´¯œ())9LñÖeXäö`®a;vìøòµÉÖ­[×’k¨rQ– é×JPPPàËsww?uåÒ¥ØùÍ¢ßúѼ¤wfáµk×–¹¹¹i3f[[[+`X “°ÇK§á« ôç²hÕªU›µ´´4Ož<¹Æ Ÿ‘ê…7nœÿê1úê©6ó¾iÓ¦ùd³ˆÙƆÅ0õõõÎù;þ½ÏÿúS¼¯ƒ¿gIEND®B`‚phpsysinfo-3.2.1/gfx/images/RedFlag.png000066400000000000000000000042211247443170600177710ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE     '2 " ''"$(!,$8Q!"4%$"-#$''*:&-+*31/://xF239894=/˜I;5F9PB@>XAGC9UDÀ¾ ÀHHG±ZF)»¸%Ì»µÅƶ!%ÎØQPOtBEÚ±(/¦//ÒäÔÜcQ>æïÞ]TZZXNà Ñ(Ù%Ã/)Ú&cZ_Ü'']`[Ó0%Þ)1SfeÎ24va*Ï4.Õ0:˜MHÄ:=hc`nb`Î:6Ü62é0AjgwÐ>>|h‚rqnÁRHÔJIÔMC’vÖTT}}ƒ~~{£qk€vŸ{GÜZSª|1Ø]^ÎdZ±|,¨Š††„®y_ÙebÈo`âcaš…‚ÌqzØnl’Œ‹–ŽvÀ{jŒŽâmiÞrißqqµ“4ž• ŒÝwr–—”²‹“àyzÆ™$á€~Ý“%×—%á‡p ¡šìƒx§œ¯¦¡ è††·§]ä‹‹¥¦©Ú—ƒÒ™å¤2å“ä¡Xášâ²Ù«V²¯°Í­{§¹¦ñ¬"Ó¹6í›’è×´Sά ¶¶­ü·¸¹·æ¨—ùžžÅ´¼ê¦¤ê¾6û»謥ò¼4ùº,À¼¿ö¾)ﭞǽÃཀù»JþÄòÀMܼ¢ò»lõÄ7ÁÅÁùÆ$ýÄ$ô±©î²´üÉùÌôÌ&æÁ™ËÇÉìÆvîËVõÎ<ßÁ¿Öɶñ¼µô¿«æÅ¸ýËmóÒmÐÒÍúÏvóÆÄû͉öÔ…öËÀéÒ¿æÓÈÛÖØ×Û×â×ÚòÓÅîÙ´öÐÐóÓÐøÝ¦ûÞŸýݳûä˜øÚØøæ¡åçâþÞÐ÷äÅâçòøàÝ÷èµòãáûáØ÷âåóç×ïçâùåØûé¿êêîÿçÐúìÒüðóóõòøúæú÷üôúýùúðüýúIÒâtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûïØ¨””®ÎØÅ{WB¡ÅcDD@GG@D?(...)3Þ[DDDDDDDDDD3..1(0xPHDDDDDDDDDD=((.((IÕÚ>DDDDDDDDDDD4*(.1(Kì¡B?DGD4(3=DD:4((.44TuD@I?4..(4DG:3(1(.77Ù[HBD4..((=@DD=4(11)6†ñ6@H>....4:>D?D?4..(0.¤ÀG@@=...*4?@G?D?4*2.WìDD:(...!!!1BDDD:ZÅZ@P=(.<‚  =TƒáKCKa™ÿN«tóÝN8õ´¥i|Ç&õ§$§ÿyg]ÉÓX|gœ$jŸÂ¸ |Œ`yùµŠŠ˜„Üÿÿÿqèèó÷ùXÿù„èõû“§Ó|þû ÿÿ`gÓþþgèqÜþþþÜ„œœqþþþþú¯¬‡Èþþûþ׿ÿ¸ä„Lëüû¬¸ÂðÉå€ &­¿Â­­»åËÂÃÂͦ­¶ö˾¾ÃÃÂê¹²°Ñ×Fñ²;yVKIEND®B`‚phpsysinfo-3.2.1/gfx/images/RedHat.png000066400000000000000000000007251247443170600176410ustar00rootroot00000000000000‰PNG  IHDR TgÇ0PLTE9JJYLNNRccooox††£!&í‘‘‘´´´ÐÐÐþþþRY» tRNSÿÿÿÿÿÿÿÿÿÿÿÿ=è"†bKGDºÙ pHYsHHFÉk>%IDAT]Á!O[Q†á··´·ÀÄ‘' м bÁþC&0sÓ#s>‰™»¬¢ó]H–ôöûQ»½4wIŸïÁ­Ÿß¯¸…u`kî¶7wKÛØ~¦¸g’"CÛØo )ÇŒmìŠB˜"}×PÞå$i _ŒP>PHz„#㣜ÔÈÐ35ÅI©Væ¼!…¤1«‘4íM’Žy-¥ $Ig÷q‹¤§ÀG)'Å!g’r,µõ0 ¢—Ôyì Tç©Ï%ðI[YÒô€+ÂÅßBï2náÂ_‹¤F޲àôо¢˜ÌN"³þåçלW—ŸØ®—ný¾ázã°Ä;¿^Ñÿƶqg=tws7pçÆ[xÞó@øç³RHjIEND®B`‚phpsysinfo-3.2.1/gfx/images/Rubix.png000066400000000000000000000025731247443170600175660ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs  šœtIMEÕ  .ÏFétEXtCommentCreated with The GIMPïd%nbKGDÿÿÿ ½§“ßIDATXÃí—[LSwÇÍ${XÏé…ž“ˆR ÚrÓÛ"ÉôÉ-c.:L”‹¥¨à@E—ÀZѱÉXØ&u#ÒR *2Bˆ\ÆÙ’ê¶dÑ-”K†›Ë²aè(mÏ~ÿÃ9xzè±-îa;É÷¡éi?Ÿÿ÷÷kÓ®[÷ÿÀU#Íy¢öu)Å5ÚEÀ$ßÿ±Aš× Ú à ©%Æ+é'ÎÕ=ÜB2õo¨v[ɲEè‰¸à‰©:C_F­Íµã“kŽW –úµÂ?3,ÞÚt†Ýxв’åOøÕŒSíÎLó•Õv‹zÕ4ô$‚…7ftØ7½O!” ÑF–/0ZaxÇbf Àm·éì‰×LÃóK “óá(vFÆš¸ šUµóà\ ¦‰z¿3GµóáÜ q´’eNf1cðÞŒÚö%_ð• ‰¦A´¾³ZšSÒ$×MÃé=Bp”±§)Yî2Êr¿¨Kßþòë•E/”G2Þ½è~Ãò°€nÁ³µêì$Hçûú¼‡€D¥‰X–°û€ßx;yØyRžÛß—¶×|^Ù é,¬ÎÚû¢Þx}[Ý¥¥Ló×¾Oovo=Þ4p=d½P ! rô¡› ·ï ßúà/loSõŒ k¨¡5e³*/€DÁKzÃè¶÷:^ <ý¸iÀá<‰cŒ„‡ ¯%hxq‡MÕ=6ª¥~{Lý:—LÝøJKPÇŠ4AÃ~Ð/œ;ÔŒcfpÃ;lí,üsGàù?Sé<øÅ[‚‡{ÇÙàá<‰ŠÆÐ‚fæ…ìɹp¾3؉“#i•háJƒ†{I„f—ÖïLϳYU=Bp6ì8ZÍÊÎü»²\´f8{…g+Û?JƒÓÏþx'IÎæÎ‰”Õ¢œn6E%š"ì©àXnx<–§°*÷)öÁ›¼¦ž¹?¹E>9¾™êïSOYZ”:KVØŠ‹Z,¸H³Vx"¶+¢WZ¡v‰‹UßÇDèÚZUeHâÞÄj‰‰Ÿiø}¨¿Ø¬Àõ½bì§Q™ØiÅE—AB,< à}ÒJÍñÁó”¼6É%Ù¯ú.¶0¢”•à6Á¡¥"s$~àwÇåRÏ,!£ÆdbHtD\0ð«Ò#šE'?J¡ÈÆ$±äK‚©…—õJh¸û!Jý™Y–XH‚©}^ÏÀÙp$Ð8ÐNôtÇÌvwÅLѵ£“/Ã],åác ¶ ­<®ýˆÆ¹ î-AïZÌ–æ¨=監²™™{œ$qS&^‰NPóà -䊤,ÖEœÙâΑ­Ipã{"¯“o*Ò-¶ý’³ß}œÍH Iq\´`ÏEó%êðüH‡ìíxŠø0Y¸ÓInIIô$ܯ儯·`¢xÊ >sO.óIÌ¡Ôm™„êc p•Àõ ñȧ ßì–è£Çá¾R_ù!³,q$¦@bUsprþÜWíg 1ï%á ?È…ó$Ž1.ü[€_cÀó†?Š´ÄJþà>š˜Flí Üä—=‡´*Î3Ÿ€Çž_‘Ài‰J˜µ?®Ý°Æ¯cE¶;-œ>8O¢¢ MøyùÁÀ9ÏBvÿ§ÿøþt»Iá(j,uIEND®B`‚phpsysinfo-3.2.1/gfx/images/SMEServer.png000066400000000000000000000062131247443170600203030ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSn¦‘ pHYsÄÄ•+ +IDATxÚ ßóðóâðóâêðÒàòÍðùëþ÷öüô  60ñÕÆþèÖùñîÿùû%5!'Ôæªöüõøýõøüöþ÷öüôöüõUóáÕùÙÄüôñüöòÿøûÿøôø,ð5 øÿþÿýöîûóøúíøýõúùòúù, e÷âÐùßÈ   þ  ÿïê     ùüïÉë¤íííïêè÷ëÞøÒ¾  ý úõ óüëöù  ÿ õÿïÿü÷  øÿþûÛàâÕ2õØÇý  'þ  åýùÿþ÷îþÛìíìèêç÷îçüòé ý ûøüöýüöøýöûýïïûÝúüîøýõöüõ÷þýì Õóóóûóõúçßùüú÷úûûûöìãúõùüüüûõüûõþøýõùüóÿýöøýõøüööüôüüüÿüööýüùúù÷ôïùøòö øþõòú÷üùüýý÷öüô ùøýõøüöþ÷úùÿøøþõüöòüòéú÷ù ýøúüüôñüöòÿøû òðüöúëþ øö#üþÿøþÿöþö÷çÿîËøþõ÷+ òøûüòùùîòÿ â÷÷ôèëÿóöõ,  þý÷ üìLýöÀ÷ô!ÿøô ûøíØ ,Ö4ïúëÿúÿúýúÿÒå?"º)ü." þ÷ÿûïýúî ýýö@ Åýâ" "ÿøôþý÷ºNÑAû   ÿüö¹ÑYæì9 ÿÿ   8$Ïúùú8V ´]ï  šÍ#Äã   #¬óóóïêèá1^ø *  ÿÅþ ßóóóíííÊç#   ûüû±È÷ÿýãÿýãûïÿüïþý÷ÿþøþüöüþüþïöôöýüïêèéñúóùþó÷üó÷üø­Ùùèùèúèÿý÷ÿý÷þýöþýöýøÿþõÿü÷ýö÷ûúûèðûôúÿûûôøíýöë÷ýïôúúûüóúÿîþýýÛòÿüïÿý÷þý÷ÿý÷ýûîþüöü÷þýýõüþÿùüûúûùþþöøúûúúöòýûüüûüüñ÷üúöýúú ý÷ûüüòþüýúîþûïþýöþüöü÷þýöýýõÿþõþÿþôûúÿñøøüþúôýýóûÿ÷ûûüûõþûü÷üøåþüöü÷þýöúôÿãñ )%åùüåöùðöûåñüîðüðöûöôù÷õûûüûñûûüüùüü2 âøíøíü÷ùíþýöýýõùóúôÿþõÿÿôÐíF ßëúýåýüþôû÷üúñûûüüûüûòþüV!ÂþýöýýõÿþöÿþõÿÿôËäI   [1ñû÷ùøö÷ùúï÷ü÷ùøö÷ñûûüüûüûòþùüüð6ÛýýõýýõùóúôúôøéÿþõÿÿôËäIéý/#$ÄÍÕ†Ãýûüüûüûòþùüü ÿù[Ø 9ÂÝÿþõãñÐïN èêçÃÝ÷¯ÏõëöúòþùüüðNá  öýüÿóôöüÿú   êäãèðî²ÔùÑìÛò ÿù ÷6ó0øï÷õýö÷  ãåáõõõòêíîöôùùøüþý  #$êäãùþïêèôóôùúùúùúùúù  -ØÛô1DbIEND®B`‚phpsysinfo-3.2.1/gfx/images/SMS.png000066400000000000000000000042211247443170600171270ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE¨³±32+897A=>@B?EE=5JNOJILMK=SWQQIUQQ[VXXZW[ZRFbeIcad]]``XWbcIgjebUhcbPjlfe]dfcQorjlimldqkjWtwupoqrpsqurufttlvxuuv{wuyw{|{s~{{}z|{‡{|m„ˆ~|½ƒƒu…ƒ‡…~ºƒ…‚†…}†¼‰„ƒ‡€½‰‚¿Š‰Ž‰‡Œ‰‰‹ˆŒ…ˆ‰Ä’‡¿ž‰‰—‹Œ’Ž’“ŽŽ‰‘“‹Á’ŽÄ–“—˜“’–•Œ¢‘“”—‡Š™›•—”š—‰–’É›“Äš˜œ˜—š–Ìž–Èœ“žœ ¡œš¨ššœž› ¡™Ë››Ë£›ÍŸŸÏ¤ŸÊ§£›¢¥–¢¤¡¥£§¥¦‘©¤¢ž¨ª§¢Í±¤¥¶£¥¤¤Ôº¤¡¬©š¨ª§©¬œ¬ª®«§Ñ¯ª©°¨Í¯ªÕ½ª¬­¬Ð³«Ñ¯²¢¯±®Â¬©²±©»®¯³°´µ°¯¾¯ª¹±ª±°Ôµ¶ ´³×˰µÁ´µ®º»¼³Ù¶ºªÍ²·Ç´¶½·¶·¹¶º¸¼º¶Ô˵²Ï´¸Ñ¶ºÌ¸º¼¾®Ï¸µÁ¼º¾ºÙ¶ÀÁ½¿¼À¾Âɼ¼Ô¹½ÂÀ·ÅÀ¾Âíѽ¿½ÀÝÆ¾××¼ÀÁÁØÄÀßÓ¿ÂÅÆ¶ÆÄÈÊÄÃÄÆÃÇÆ½ÄÄÛÖÂÅÑÄÄÈÈßÔÇÇÌË»ËÇæËÌ¶ÚÆÈÝÆÃÏÊÉÍÉÛÌËÏÍÌÃÓËÄËÍÊÝÈËØËËÓÍÌÍÍäÑÐÇÑÒ¼ÕÎÚàÌÎÛÎÎÒÏàÖÏÛ×ÒÑÕÔËÓÕÑÔÔÞßÒÓÖ×ÁØÔæÛÕÔÒÖæØ×ÎØÚרÙãÛÚÑä××ÞÙ×ÛÜÅÚÜÌ×ÜßÞÛàÜÞÛÜÝçßÞÕâÝÛßàÊæàßàâÞãâÙãáåÞãæäåÎâäááçéèåêåçãèçÞèéÒìæåæêÙçéæéëèìëâîíÐíî×ïîåíïìïñîõðîõòâðóïóöäðõøóõòöøô÷ùöýøöúüùýÿüB]ǪtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûúóªÕéÀï¿ÔàÏÏ#o©Ø½f×èßèàÐÖÝ™š,©ÒÈèÏÇÛÈr}rÏÕµBÆÃ,rççíóÏßôè×XIX°·~ßl:ßÈøþ˜Ôù©üê¼d,Cï½r­º…çóÜþþþþþþÔöi”:%5féf™ÍÊ%Zçùþþþç•þþêèý³Š:!0Eð•Ó€?+öèüþþþýþþþôàúË|…:CC²ã½Ó”%5[çíòúýýþüýúöàúau|ff+½KEEèÛèàýýýüúóêíü9OšrSÝ3&™èßúå-—ùöíàÔJliCJîáìÛû$†îòߌa&08½çÏòMöìß9ð À²N²;ìEàÒçö øôîÒ½üLXýúùúߌÒÒàîöZ×ýòîà¿Üöö$þôööüºýcª¿çööòçèߪÍÜ©Ðí½&²'ôùüôööò٩ٿßíèßìŒ+!Ù˜Ûçóßû!§óôüèàà©üÜ!ºóôûpìÞÊÆìZîÛîû¿ù²ýèìüòö' ºîÜçÜ!þÔÜ»¥Ÿ¼ênÛßòôçÐZàßüîößÓ»¬»ÔôSö¼‰‰‘¼Üßàèòöú½&öÓ¥‰‰¥Í©ô¬‰‰‰‰’ÊNúòúüý8ôÊ’‰‰‰„‰’¼Íꬉ‰‰‰‰³êþôýøÕüÍŸ‰ŠŠŠ‰Š¥¯X곉‰„‰Š’Ã92r2œà¥‰Š’’’ŠÊÛrÈÆ„‰‰‰‰¥ç$ÈÓ’‰’¢’¯¯NûZÍ¥ŠŠŠŠ¼0ÖîÊ’’’’»Òòö ª»‰„„‰‰Š­µÖô‰’мÔXüèrÈÆ¬Š‰‰‰Š¯×ÐÔ¥ŠŠ’’µ{²Õ BèÊ¥ŠŠŠ¥µNžûßͽÍÜê'ôʳ¼³¹ôoL5rS+[eöçÒÛüã e&ãÔ¨–<ÁIEND®B`‚phpsysinfo-3.2.1/gfx/images/SUSE.png000066400000000000000000000062131247443170600172470ustar00rootroot00000000000000‰PNG  IHDR üí£tRNS^^^t r pHYs  šœ +IDATxÚ ßó^^^ÿÿÿùùùûûûþþþûûûýýýöööùùù777... ýýýôôôßßßßààØ××ÏÏÏ ^^^ÿÿÿöööKJJMMM þþþýþþÿþþýþþþýýýþþýüüóôôººº¼¼¼ ///üüüóóó-..~~~100'&&=>>âââããã^^^üüüñññddd>??ÓßÂ×äÅçðÜëôà "'9+:ýýýûüüûûûÅÄÄ¥¥¥///üüüñññbbb<==ÜçП¾rÍà¶ôùîùî  ôûééñÞÖåÂÐà» # ÍÌÌ///ÿÿÿñññ```;;;´Ë–¸Ó•üÿø ù  $ÿ ñ þÎáµôöò&6 ÏÏÎ///ööö*++RRR¯ÈŒÑå¸ú  %ôå óúëûúýçðÙîñè*;ÿÿÿàààêêêýýý^^^®Ç‹Óæ½ö þêõÛýýüýýüþ$ýí Üê˷Θ]]^ÿÿÿöööCCC ÞçÑÔç½ ôÕËåâÙïèáóÅÙ áØï  îÍâ²'8+ =>>àÿÿÿùùù?@@´ÐŽÿòæßôÙÇóE:T^aG1*9ÜáÖÛàÕçêãqMHçêãÏÖÇÂʸ ö³ÐŽnH¡ýýBCC»ºº ùùù---ÕãÆðøèþïÏÁë*F§‚ $*$*$*=5Gn_€€•föûÜÖâÅ&7 )**äããûûû##$ÚçÆ ûîÓÄé\@€{j ÏÖÇÏÖÇ\LpøþðØçÆ'''ûûûþþþéòÝúïùìþ^C‚I?UÒÙÈ1*9áìÐüüüûûûèóÜ 6I?UŠ–|ÄÈÂ"ÿïõçÿÿÿÿÿÿþþÿZIpøúõ–cõñüf_j. B‡ußæ×öøóXGnp¢/  ÿÿÿÿÿÿÿÿþþÿ$*§È|eQ~$*‰štN)AÚìÀ 3Êå¦1úüö ö§Íq ëôçöööÿÿÿÿþ àßáY8*y‹c>C5k\žÏX)AÔÜÉÇîšçó×/NO*ÜáÖ¿Ó¨ù ‹!ñöéÿþùùøçççÿÿÿÿþÿ %îôéöøó1ØâʇuÓ×Ð íóåçòÙäîÖýûÿÎâ±µÔ‹$*óêýûÿýûÿýûÿ'åìÛüûÿÿæææçæåýþýþþþ!üúÿÁ×£bUrÆÉÄlT0 Dîõæýü¶Õ‹÷æýüýüýüèóÙÏä³B?ýþþ(;ÐṯƔbUrbrðöç¢Éo )ÜéËÜéË*ÜéËÜéË*âëÕùöþù÷þýüÿ.BÿÿØ××ÖÖÕõõõ)9 ýþû¹y¥ {*âïÖ*âëÖ*áéÖúùþøôþüúÿ&."=ûüüö÷÷ÓÓÓ ÅÄÄýýüüýþS7xòõíú÷þ÷òýøõý 'áëÕýüÿýüÿýüÿ)áëÕýüÿýüÿýüÿ)àéÕøõý÷òýú÷þ S:sÿÿþþ½½½ ÅÅÄôôõüüü,1!Hþýú÷ÿÿÞåÖýúþüþü*âêÖþüþüþü*áèÖùöþøôþú÷ÿ +='3ÿÿÿ÷÷÷¼»»///ýüüæåå/00.!>ïóéñõìðóêþýÿþÿÿþ(ãë×ÿþÿþÿþ(àçÖûùþú÷ÿûùþ - =bH‚þþþþþþ–––îîî///ççæ /#?éïàåìÜýýÿýüçíßýýýüýü $áçÙúøÿúøÿüûÿ -!=dJ„þþþþÿÿÄÃúºº///ÐÐÏ /"?$4ÛåÎîóêýüýûÿüúÿ çìáüûÿüûÿþý'bIƒG5]þÿÿÿþþÃÃà ///ÐÏÏ C0Yõ÷óô÷ó ïôìþý 0#AR=m]Fyÿÿÿÿÿÿ››› ^^^ÿÿÿõõõ%%%^__ ôôô’’’ÒÒÒ ///ïïï¿¿¿øøùÿÿÿÿÿÿööö±±±ëëë^^^ùùùøøø******  ùùùäååáààÔÔÔÏÏÏ äääßßßüüüüüüÿÿÿ“Mà!RßIEND®B`‚phpsysinfo-3.2.1/gfx/images/Sabayon.png000066400000000000000000000062131247443170600200640ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSÿÿÿ7X} pHYsÄÄ•+ +IDATxÚ ßóÿÿÿ¬âççúüTÿÿÿ¬âçiÑìøÿ‘-ýZ ÿÿÿœàê„Èûíã×ÿª‹éÔ ÿÿÿöööôóôñ-õ[&¥7Z ÿÿÿ+³ãìòÿʳ ±Ž #ýþýÿÿÿÿþÿýýýÿÿÿþÿþýüýýþýëëëûQz6MÕMÿÿÿ¦Ür>31,þþþýüýÿÿÿþÿþÿÿÿýüýþþþþÿþÿþÿüýüÿÿÿüüüçéîŒÁáðZ$ÿÿÿ)¤Õûòíÿ`$$$þþþýüýýþýÿÿÿÿþÿýýýýþýýüýþÿþýýýþþþþþþñññx§×\+8©ÔÿõïûŠ\&&&ýüýÿÿÿþþþjkj///ÿþÿþÿþÿÿÿþþþþýþ øˆYÿõï8©ÔˆÑàþøøë|N*+*þþþþþþþÿþÿÿÿÿþÿÿÿÿ565>>>þþþþþþþþþþÿþîQþøøˆÑàºÐæè–t444þþþýüýýþýþþþÿÿÿðïðéééþÿþÿÿÿþþþþýþüüü â—yºÐæ{ÁÐþçÛþþþýüýÿÿÿÿÿÿÿþÿþþþþÿþnnn§¦§ÿÿÿüüüþþþþýþþÿþþýþþþþäÕrÂÖÒáòÜ–z---þþþþþþþÿþÿÿÿÿþÿýýýþÿþÇÇÇÇÈÆþþþþþþþÿþüüüþþþÜ–zÛàìÄéåòÛÏýüýÿÿÿþþþÿÿÿþýþüüüþýþýþýÿþÿõÞÒ¾ìæÏäóÿøòþþþþþþþÿþÿÿÿÿþÿÿÿÿþÿþ___þþþþÿþþþþýýýÿøòÕáòäéïìÖÏúúúôóôýüýÿÿÿþþþÿÿÿÿþÿ555787þýþüüüþýþýþýýüýõöõìÖÏäéïòøýùÜÓÕÖÕúúúþÿþÿÿÿÿþÿÿÿÿþÿþÿþÿþþþ þÿþþþþüüüôôô÷ø÷ùÜÓòøýþøüöðÑÑÑ...ÿþÿýýýÿÿÿþþþþÿþóóóðïðüüüøùøýýýù÷öùùù  ÒÒÒäääýýýÿÿÿþÿþûûûëëëÞÞÞõöõñòññòñõöõýýý°°°îîî    ߯ëëê$#%ííííííØØØ676>>>DCD  36JJKßàßôôôîîîßà߯ůÎÏÎ36"!ËËËëëëîîîîîî‹‹‹òòòƒƒƒÑÑÑõöõÿÿÿÿÿÿ‰¾Ã$-.ŒŽ‹ýÿüýÿüýÿüúüøýÿüýÿüýÿüýÿüèêçýÿüýÿüýÿüýÿü,.+)*ƒ¼Çÿÿÿÿÿÿÿÿÿÿÿÿ¥ÖÖ­´PROýÿüýÿüýÿüýÿüóõòýÿüýÿüýÿüýÿüýÿüýÿüýÿüúüø !­´¥ÖÖÿÿÿÿÿÿ$¿¿¿ããâ •••ïðï $ÿÿÿÿÿÿÿÿÿ¼áÜ–ÇÇŒŽ‹ýÿüýÿüýÿüýÿüýÿüýÿüàâÞ–ÂɼáÜÿÿÿÿÿÿÿÿÿ  z˜œƒƒƒ! !ðððhhh//0ýýýp‘– ÿÿÿÐñçâæìÊÄË”wqfƒ‰5>=6ÿÿÿÐñçíñöÙÜàzTR†¬®!00 +)%­ÐÎ3<@,46©ÐÔ+)%0ÿÿÿÓõëýüü÷ûýýý Ž‘¯žœýýýL\_bvq / ÿÿÿÓõëýüüúÿýüýëëëü/ ÿÿÿÙóêøÿ- ÿÿÿ_¥Åž©(IEND®B`‚phpsysinfo-3.2.1/gfx/images/Salix.png000066400000000000000000000042211247443170600175450ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTETÖG>>>>555''''''''''''!5''''''''''E> ''''''''PG?'''''''/5''''''C .'''''>J''''F3.>G>>>>GJ?J?J????///-O''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''02#222"9'''<'''*''1''"A''#''5'''('''################H''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''8*$!!!!!!!<'''''''''''?5'''''''G ''''''''> P'''''''''> D'''''''''''/J/ 0I''''''''''''''BE9Q&H''''''''''''''''''''''''''''''''''''''''''''''''''h«båÄ'S-IEND®B`‚phpsysinfo-3.2.1/gfx/images/Scientific.png000066400000000000000000000075251247443170600205570ustar00rootroot00000000000000‰PNG  IHDR #ꦷbKGDÿÿÿÿÿÿ X÷Ü pHYs  šœÌIDAThÞåÙgx•eÒðß9)œB ÐA:šbD¤Šˆ(]Š‚ ØÖÕÕEÜUw­XP,°¨ ( J‘Q‚J_é$¡†œ÷Éû‚òÂîûmçË\×¹ÿ÷ügæÌ3Ï=÷ùD (n¨êPíJ×CbqµáÄr¹ÚiàöÀí¬¯¾)ºLt™ û“§ææ¹/Ží,2ôÍù9¨ÑI5¬†ZýâjÂ%×§|-v¥.ƒf’‡AÍ¡<(¶¯àv8´¬ NŒ·îw9ÎæÀ…YÞУ]p%üÒ¿°',y0 ~ij1Deû2vjìÔ»¾/191¹ËŸKíÚÝywçµ®™ +£†Å©97ÀºÌ¼ÞptÈé|±í#ºþŠâÏBÛ^5Ç@ÆúZÛ eB©<89©`9–ÿ6œøùD2į ì‡b3CÎOÛvÀó ÖÆÂšIÇ?§Ì§_( OW~Zw üQ/HøÝM 4¨<5}¼é¦wÜÖ´;ÜÙµn1x{΀÷`i¥‘á‰>íZÀ%ÇM÷ÅÝ}±e¯ºi ÌIø*ܻ䢶Ðá³”ç Æ]1‡!56P’&E*´ÒóÁè\·Ô;ðú¬Ë>ƒ÷¾º¼\¸)æê³s à˜¬HÀ—<huNû=ÙQ)Ý3àª&ióàÝ{…僞L…ì—žùæ¥ è }^¯8ʽ¼ «þ=ú*cƒ÷ÂôÁMÞ “j|qÓÿ‚o>Ýv1Ü3¼I¸¥~ƒHlî/ÿ‰_-Îo ‡‡å_µv†ºþº}*0­CÔ((Ÿ»bËþ Γ0¥näÙµåâNI€Ç–g·Ÿ‚'Ÿ?‡>ÿ r÷åGC™R§#DNĶ+vf&%o€R'œW(wOð6x"¥M¤éýåæÑлK…¥[-‚«Õ·ØB_o,Œiþ>\t{‰Î]„ë¸%9 ó3o|^nwuU¨²$ú¼ü*™!¦ý©ô:¸®u\Ì«ˆ;V™U „Ï… íoÁð\…ŽU`þ57‚N·$—÷GpÍ¢ÚÀìü럅Ò†v‚YyºÃ†.Ÿ—isªýK×%9[‡¼¯|Ñ­T^uì\üKcÌÜ^| tìõÈõVEaÁÞzYЦYhÊÙ —ù,°&¼Õ9>jsãŸáò&~r*®Ô‹â`rÏî«aâ“Ý> ±Q±4\*<\¥ùËðîÃ=¿ƒŠ­‚ Oµsqlü^xÃ«á… o€´û«Ïægé’ºÂóoDÍ‚°ü×µÓšàO= a_ŸÈ ñòÉ !ðÇÓ Æ½Þn;”iš‹«W…GþøÖ]áàe§â›Ç¤öÑE—ZÁ:Ń“ƒ“¿èûÃ|4ª°%´jlOŒ‚/–¯I»YÐáÃò“Oµ³òx~2<ºfæµPsoå0æíÕ ÄÝgN@(Ceø¹vaGØ9Æ gK˜[ê¥u€9'3†ò““ 02²~Ó€ÚaYö­áêþåf‚ §Û‰™Ñã[\²#Ø:ØúëG7Ä•]Yv寗Ãá`B0aq‹n³aáþÁKaQÖ°aåÞ‡ï‚9#Æv‚Ë«U‡Šµ£Á»WÌKƒeen¹nj]{מîG§rd:$ðÌoc=ã,p8÷ØýÐmZíJp +w ¤¼ó9ŒL¸&Þê± o¬Þ’i÷h¥¿Õ/ð-ôïÐrsxKxËŠÞ‹_ Ž;1ý›b› hðñk®mÛ5p×üùi³K¾]zׯ]_LÚÖààòƒ_}™i—‡&U®éÛª¿­CµúÁþ?þt9,š¹{9Äýr( ú¼›Yþ9ò‡ã°yô‘Õв{ 2,ëN…}­ø5Ö3ÎÑE…wïºïB³ÄJprUÊIØ»'ò¾ž;¿:T½5‚{ëÇô…ç§ëÛæÄ</å ΋ÛœþÜÕKƒWÞ{å¦#q²{ôkÞ«e­ÚmJÚܘ-‹’o*¹ˆëzLÿô§mi_åäÿ¸cÈÅvÁÄ=»7Â%Ó3@“ôÚKàU§^ë׿^ã·´Û •–ï ]ýfäV,Ø ?dÙ…×;§æ)½VLeX<aÑÚkBz(ö䩸;ïHl ÿ–ò où½^÷PwX¼bðº^/jgöšwç̤ÿ³þ pøÇ‘5öÔØÌ=(:^pë+•&U‡ï»õ¾¥/?úiã¨:QóÓBí UzT(U4ÝOÞ¾OËØ[‚YWêXõcÕ)è´*~U<;s7öû~)~ÿÞ'Ùá7 ?)\ñÅ}GÁî9'{ÕkäýžÁë4·Eüȹñøzx熅_AÆëÍ*@³™‰Ïø9cb‹ºiŸW/‡Æ¯?{RÖÌ„›DÎ!ɽ ZïRÊ”{î^×p0TËj …Ý+?¼#ؼäº[x#T¹|ÅkY¸ª÷ákÞcs—÷Å5'¾×¬Ûß~€E >øûŒÝWu '‡¯¾X”à>±uáž)mfBÊð¤xøàÂoÚJ•5/§>¥Ÿ‰~æ?µõlzz{úLÌøâö:7iüVñ)°¤ÄÍŸB¯ •>†‹·‚E݇ ƒ{Ë7ÊÐèȾŽW&> ³u.€eo8_Ö}¦#~=Ç¿.˜Ñ[£ûž1ûóògC‰qOB‰éÁâpHááó!Ù—0,øTš["—Ωú3\6¸Aq(Ó¨ôVX5üÛý0­ËçA8þÖÉ\èýfÓ¦Ñ)äw8Z¾Lú®V]¾å>ø>´9ìíq¼ .GC”¨LH¿3¹ôÞr1¤ìLj¾hÚXXqWî¿î»Ï˜€@Q‹¹l|b}Ѩݨ¨ü8Ø?wä;¼¢Ó¢>‡;㣠¾è 88"w0|Þõ»TXPvÃDX{kî 8úòé¼1ODtíí¡õÐöÛÛáÒiuC¹ô”'¡°fä;C^èÈUPqr.ÄB- îëb©sdÓ›ðâ€ìÇáËIy?‚S.ÚÎúmðW)ý@`\øjÒPç±Ô7 D«âŸBa‡“Ø=.÷ØAC@DECFHEJLIZŸ] NPM^©_¢a¥c¨RTQf¤a f«TVSg¦a¦h§VXUc¢i¨h­j®d£j© kªZ\Yn²l«k°pµq¶m¬r·s°s¸n­u³t½o®t¹n´`b_v¿p¯wºuºx»wµq°y¼ceb v»r±z½zÄ{¾ x·w¼|¿}À~Âz¸y¾Ãhjg€Ä¿{ºÅ|»ƒÀ‚Æ„Álnk…È~½†É‡Ã …‡ʈŠ„ȈˉƉ̆Ċ΋NjÏqspŒÐÊшƎÒÍ‘ÇÒuwtӊȒɒՌċɒϔÊxzw•Ø ŽÆ “Ñ •Ì—Ú˜Ô”Òš×›Ð}|—ٜ͜ߜåžÓžÛ—Õ Öžá¡× Ü‚„¡ä£Þ£æ ä¥è‡ˆ…§é©Þ¨ë¥Ûªæ«à¤á¬è¬î‹Š­ê®ãŒ°å §å±ó²í!ªá²è°í´öµð¶ê“•’·ó´é¹íºïºõ³ð¼ñ—™–¼ø½ò¾ì¿óÀîÀõºè¸îÁôÂ𜞛ÁöÄò"¼ë&»ñÆùŸ¡žÈõÃø+½ó ÆôËø¢¤¡ÇõÍúÏüÐýËòÒø§©¦ÊøÓùÕûª¬©ÎõÙ÷Ùý%Ð÷Ûú®°­ Ýü±³°,Óûáþ´¶³¶¸µçþãû™Âݺ¼¹½¿¼˜ÉãÁÿÆÈÅËÍÊÍÏÌÐÒÏÔÖÓ×ÙÖÛÝÚÞàÜãåâæèäçéæèêçêìéÓýùã pHYsÄÄ•++IDATxÚ ßû333333333335577y‘Ë?|C`U%I±.p.@U·6 $µ8ç¼÷Y±tÎݼÌCm]8°´0Ë…¯>ãÁ–vŒ1,Îå(—68úì+ÛG#BT.e]µR©kto *AÒÝ{„ލ‚ Slþ$Ijt<̾ô#ˆKíø·Zôöôôˆ¼ýþ·#+ùßß( [òÿóºì˜^DHÅåÏÇN½žqÅbqpwKwgk*èG¶3 ;ÛoÌ6ÏÏÎLܸvuÀLþt&î8ð̯æ1ò8ˆxÞ+Þ+ªJT.ëÌ·NOýöë«¿|ÿÉ?aº/œëilªÏÎ#iUÅ'q®\*eçg¦G&Î}ð¯8ÿ ßXîU‰‡«IEND®B`‚phpsysinfo-3.2.1/gfx/images/Slax.png000066400000000000000000000101711247443170600173750ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ßïÿÿÿV. ÷î׿ÿüÿÿÿC|6w Dÿûïã»Û¸}ÔœÿîVV/^>‘ Eûýûù?%Hj:r ">²@Tü þüÿ(þúýýýûüþü ;+jèVVè…«ÿÿóê¨ßÔÔÿú=["YŒEùþöúÿýýýúþøÿþÿö$è4g  \ Tÿþ,¼=jÖÿïRp U÷úþùÿúÿþÿþûþùÿþÿþô :r ErQüþþ VHÿAuÿÿ¿ü @ýÿþþûÿúþÿþÿüúùôý÷þù+VHüüýÿüþýúÿ WC†À&ëëýÿüöÿúþùúþúþÿÿþÿþÿûøýûÿÿýöü%Uÿýýýþÿÿ+ÿÿã÷ñè¸üþýÿÿþÿþþýÿøóð=ÿþ û þÿÿûúË¥œóé·ýþýÿþÿÿýóåù 1üÿÿÿþü"m@Œ9ÿÿÿ4V!X† Dýÿÿùÿ÷ÿÿýþýúýúÿûÿúÿùÿþÿ÷óÝäÉNÈyÿÖø÷Ó¡xëÔx÷îÚùÿùþþÿÿÿûÿÿ üÿþÿÿ #*uAÿÿÿAA3ÿùüäøíöùõ0; þÿýþÿýüÿþüý ÿöóáôÑ2¸qÿî6v @— Bÿýûöÿúüýòþúùúþûÿÿüý 9p N ÿÿþýÿÿÿüü þÿý÷ñ¹æÍñ@U @ÿÿûÿýþü  ùþøøøþþÿ ûÿý þÿÿýÿÿóê¼ùÑÌ™ÿûàëüôýÿÿÿÿþûÿúÿÿþüýüüúùçÓµòÏ þÿùæïáÀë¤ÂÔÔÿúÿÿÿL¤i&”ÿýýÿÿþûÿÿúúíõéœîɒĉÿæøÖª÷ë´ÿþùùùøöööùýÿþwE´KŸ7ÿÿÿ:…#pj ýÿþùõÿ÷òüÿüöÞæÈN¾wÿÕÆ{ÿåô¨üÿúôèÝúûöþÿü !-wÿÿýûòùçÙ  73fѨßý÷ßþþýõå¨åÿÿþùþþáµÿðñå‘ÿýùÿÿÿþþý÷çªýó°ùåÿþÿÿûï¶Ôœêÿÿ·^ÿ¡ð×iöôßýþõöòÚóÕrå¦c÷ÏþýõÿþþÿÿÿüüôêÝ’ÊŸ}ÿÿÿÿÿÿÿ:: Òò5ð¿¿ÿøO¡súé¨ 3¥>ýÿîÛšûüáþöÙÔ¸ÙŒÿØÆÆÿ÷÷9«ñòÜ›/5 ýÿþþ÷ïÈë̂Ǝÿåëÿþûÿý¸h©òÜ|ú÷ÞýùìùõÝôå“å¾YÆŽÿåÿöþ÷ÿÿÿÿû7‰ªùìñ«çÿÿü ûÿ÷ùóÿÿÿþääj¶IÿùÁÿýÿÿÿ3ïðiÜ4ÕIEND®B`‚phpsysinfo-3.2.1/gfx/images/SliTaz.png000066400000000000000000000042211247443170600176730ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE     "$!'(&+,*-/,02/4637869;8=?Û·×¹±³¯æµÚµ,²µ¸Ç¹Yж`´¶³·¶­ÞºÝ¿¸º·Ü¼;Û¼G·»¾èÂá¿3»½ºß½Uß¼_àÂ!ʽ˜è½@äÅãÄÞÆ½¿¼ÎÂoÿ°½ÀÃÚÇ4ÓÃ{À¾éÅ3ëÊëÆ*ãÊáÄaÂÄÁÂÄÇÈÃÂæÉ8ÕÆÄÆÃéË-ÏÆ¬êÐßÉkÚÊpæÎ/ÇÉÆÌɺäÏ>ÊÌÉêÖ ÑÌÊÏÌÑÊÏÑéÓOÕÍÆÍÏÌëÑ€ÐÒÏÎÒÕçØRïÙ;ÓÕÒâÖžî×xéÚqâÙ‘Ñ×ÙÕ×Ô×ÙÖéÚšÝØÖñÝoßÛ¹ìßoÛÝÚðß—ìâ“ðß°ÞàÜÜàãéâ±õægñâ¢óåáãßïè‘åæÏãåáòêŒ÷ìêèÕæèåõëœéëîêìèøí¸÷î²òï¸ìîëòðôõðîðòîúóÊøóÐ÷ô×ïôöôõÞòôñûõáöøôü÷õ;Ï¢tRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûœ+vR#ÔëòòòòòòvyÓÔÔÔÔÔÔÔÔÀ Éœœ–œœœœœœœœI$E&+(mmmmmmm’($òë 9!+4#4 «ëõî efë’ÍÞëÞy!¶Ôùù>v±ÔÚÚm’Þßò½&½ÍÔÓÚÔÔÍœÀÍÍ*$²ÉʶE 9½¶‰Ïðøüª« Im¡š¹éðº–9Re ëÍ–A®¹Áųõý¥*–ŒÚýûõÖZ´šjîþýý/[R ûûûûó¶o|ÍÔùûûõ9eÇ*yëõõõvÔ™ÊÍÍv½põõmŒv*eîîîÇyÍÍÉÍÉîîÞ ½±I–4ëëë[Í ɆÚëß  –IÓ–ÞÞßÖÞÚœ¶ÔÚÀE eÔÚÍ4*#²ÍÍ&v $ †ÇÍÀ4 Ôç–ÀÀ!#RœK½ ÀÀ¶&y¥¶Iyy–½[†R¶¶œ4eE–“½É*É (É/ÀÄ–“–ȗεW?5v††’[j8?}ÎÕ—Ýzðññññ»M2IyvA7WÜñññï≞´×ÙÙÙÙÐuM2K=2W‹ÙÙÙÙÙЛÝßi•¼¼¼¼¼¼‹c2)(;u•¼¼¼¼¿´ŠnÔÞœ_wƒƒˆ”ˆƒƒi.:wƒƒˆˆˆƒƒlPŒÔîÔ¨pffVVSRRSSVVfpp™¶Íçîîîîëëëëëëëëîîòe0eþœÃÇIEND®B`‚phpsysinfo-3.2.1/gfx/images/SolusOS.png000066400000000000000000000101711247443170600200350ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ßïÿÿªúC(Ùç;{•P=?9-5ýþËÓǶÈÂ|f)í¾ÚVýÿÿÿÒæHÉÒrÞæ ÿþþ÷úçîýèñéÞA1“,ºúÿÿ¿ºÒ@ØáqÇÖT5# þÿÿõöþÉÝã=1¬1•=1ÀïAü€€ÿ×ã:šª0Z%ùùó÷ýøþÿÿÿ%»ÈZÆä@Ù€€ÿÅ€€þ€€ÿæ&ÔÑêtL.9 ðôþõúÿÿöúþüþÓÛ¸ ò+Ï€€þªªÿÖø)Ͻùü>.'üüÿÒäüÿýÿýüÿÿÿÿ öô÷ÿÿ 'ÕíBêòå%JùÿÿÿÖþ8E;¢ƒçöü Gåêêðùÿý  àîÿýþ êïþö÷þýÿ  åñâùúÖÖÐçLÃ÷ÿ÷r†ÿÑÜûGÿÁߣáðîçñõæð÷ñ÷ùûþúúéñøÿêôüùþíùÿÿ - ÷çë¢óüØÿýÑÝún‡ÿÿöÿÿÿ¼Ð-ÃÞùû Båï˜ éA*DG6"ýöùûìòÿêêÿ¿×ü7! ÿ ôöõ±Ê¬øøÒ ùùÃÞþ¿Ó -ÿÿÿåþùù ¤¼ ÿÿLýùÌøz]GN<Lþÿþÿ,ÿM=ÿúøüýþ0%þÔÞûƒ¥åòôèÿ þý¤¼:-ñ ÞÖÞ ´Æü &î÷İxi+"7ïóùÒß©úû ßé !ýÿ  ûû5(ÚÆþíýýÿúúü±ÃøoR ÞÿÿÿµÆ&ÿú 7å¢l\ —¯¬½ÉÕÖÝïþÿÿ-,`GQ7(üÿý  D(&ÏÛïýéÿüÿï æèÿÿÿÀ++€•Æ(öí 8C5 öúî“§ÅÊâòïüÿÿÿú÷þÛáô¢Æèìô6&þüüÿ´ÆéÑÞÙÿûîþ þõ ÿÿÿâðò[AÑOUú*jžú  äéÑ”¬Ôþþ ÿýøõ¤´ÌÞåÿ‘k   ÙìüÉýþôöÿûÉÉéõ-)ÿïí°Ãä           üõêÆÑÄ©ÌÿE6áïç%    þ ú*ñöô÷ûü ñõýòÿÿñÿõ›¼ÐL9:-!"0"ÄÚîÿõùÜ þý äùú               ü{¤Óúýÿ *     þýúÝïú ÿûõýóþøÿóþøÿô ÿÿåâüÒÝî2& ÿýë-úûÒöøïøÜŒÔCð÷ ÷ÿ ùêçîÿþæïø2 þ ûý# Üæ ÒÍtQ ýýùþöþ þ þ þ þ þ þ þ þ þ þ þ þ þ þ þ Þäñôþ þ þ -øùüxSÿ4ûý¾öÿ ÿùÿÿÔàùÿ%Øåøõý¼þR>芭ßðò$ö ýÿ! îñþÐãê &ûþéòøÞ[Kèkß`?Ðñ ÿÿ ÿÿ ÿ ÿÿÿ ÿÿ ÿÿ ÿ ÿÿÿÿÿ ÿ ÿ  ÓßùÔåÿÿ  :!ÅßùþïfBÐàýÙìÿƘ²&÷*+!k“ï *Óäýçíøþ¿aHÇþ'åz_¿Ôþ             kH ÀÎøÈÜþ  ôôÿâéûÓƒb¿æóÐÈ‹ù÷†'ÿ3#{¡ô  ÿñùþúþÚŠêÎËÿX8ÿ‡& Q>­Åùô÷þþÿúöþêòÙÿÿxà©ÉÿÿÿM}AÝäp4þ üÿùùþüûÿßðüüË"´ƒÁÿÿÿÿÔãCv“?ÛêH ýýýÿýÿÿñúíôþìðã"·mÃ,½ý¿ßÿÌÇ1ÏßUÉÕ" 0  ìôòöþïô÷õõÐ6+Ü4#¬27ÐA!øÛÛÿ$÷P‚¡ çïð% Jÿ ýôññµÜvZ÷ß °+úÿÿÿÿýþ=ˆ•€Sz“zIEND®B`‚phpsysinfo-3.2.1/gfx/images/SolydXK.png000066400000000000000000000042211247443170600200220ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE   # " & * )', 4!)#5#(3?#6&((%1E3.7V443O5?g=?<`8#Da\@0HSYC$EGDUG8S‡V‘,Tp&ZƒRTQb¢vP4sR-jU9mV( c#e™‚W&c]M9eƒ.g‘‰X]_\>k}dfc›_"f2Tq4v¬Bu“Zm¢¥f=w¤yn[ i)oqn‡pPau˜—p2‘q=¯k"H|·7ƒ¸@…²L‚°`®g¦|~{‚€l¸x&¾w+~ƒˆ¤DOÂA‘Å¡‚NG’ÀÀ.h¼_»f´_’±v޲´†W¿‡F‹¯Œf¶HSŸÌÊ‹6׈6ÏŠ=ÅŽ6O¡Øw›¯´òižÎ;«ã ³ê+²âH«ÝÆ”W™›˜w¡Á›ÀÔ”?º÷Ï–?Þ•,öaª×¾›Z‚©œh¬ËÆšiñ”3ЛP\°Û+½óô—#Úœ?®¢ÚŸIôš/¤¦¤Õ¢Gò›9Ì¡|ĤyCÁòò¡1פdMÀè=ÃúÓ§Xh¹âó¡<ª¬©Ï¨hp·ís·å±¬¬ò¦>ñ¥LHÇðó¦FÒ«v–¸ªŸ²ËbÀôæ©Tm¿àZÂûá«R|»Ýì©Mä¬LOÇøÝ¯V’¸Ûñ«F¨³Ô²´±ZÈ󸳱rÂìjÅíð°Rð±Jì´I_Íøë´\Þ·eíµTó³_mÌùü±bÝ·‚¦Â¹ê¸U‚Çô¼¼¹¦Ä­¾»Ãé¸iæº_‰ÈçiÐöiÑí|ÌìvÍôݼvvÏí—ÈÜô·sÛ¼ù·mý¶xö»}ÚÀŸ}Óû¼ÄÙô½ŠÆÅÃz×ô«ËÛðÀ}‘Ôô‰ÙûêÉ€­ÑêÐÌ̦ÖêÌÎËÙÑÃÆÕçØÐé÷С±ÞìÕÖÓðפòر¹æïÝßÜ«ëüÛßîÌäòíßÍåçäù鯿ì÷Òôùâöýèõöûóà=lPtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûïÏÓÕÝååå´ü¬ÕÐÝÒÐÐÑá¯÷ÑÐÐ¥wtt‹‹––x™óïÐÄ¥ttt‹‹–––r‹‹výòÇ¿wwwtt‹‹‹––²v‹––ýúÙÙ¨ttt‹š²²¥»m–¥¸»ãÙ¦‚x‹‹‹––²¸¸¸»y¸¸¸»î×Å‚‚~w‹‹‹š––¸¸¿¿Äƒª¸¿ÄÑúÅÙŒŒŒ…𖏲¸¸¿ÐÓÓ»ºrÓáÝÕŒŒ—¨š¸¸¸ÐÐÓÓ»»º¡¡ÝÝÕýÙÙ‚Œ——µË²Ä¸ÐÐÓÓ»»œœ TɺÖÿÙÛŒŒ—¦££¨Ä¿ÓÓÓ»»ºœœƒmdR|ÙÙ——£¦¦µÂËÄÕÕÒÒ¬¬œŠmma_ScNòÚÅŒ£¦µµ½½ÀËÝÓººœƒƒƒmaaTTucöîã㦦£µ¼°«ÃÃÎÓ¬¬¬††mmaTSEEggöñk:¦£µÀŸPÎÁºD |a_TscöÍß)£¼¾ÀÀÎÀ«®£…F_TTS E9cVÿò` ͽ¼¼5Áî«’~F^TE"=98eVæżÍlÙ³®«~€p ITE1=83EdVÿÁ¾À4³¾®®~€p DSE183/dc©Á7 4:¾«®«’~np KD"38/9eVÿ³ l®®€nn[K)8/.ce}î„®€npb[./VeV'>’€nnbb[ B$ Iceì?ë :~pnbZ[Q BH)\ž\ inbb[[Q>K‡#ù· qbZZQQ k”‡Y X¢ •ÆÆ§”§ kkØ? ·#ܧŸŸ• J ê2 ·2 Žÿ6 Ê Lì_ {Œ¬-IEND®B`‚phpsysinfo-3.2.1/gfx/images/StartOS.png000066400000000000000000000027461247443170600200360ustar00rootroot00000000000000‰PNG  IHDREÓ/¦ýPLTE¢œ¬á!ªá¬Ü/±Î/¶Ì7³Ö6¶Ò¡œšŸ¡?´ß9·ÔL±Ý;µó3¼ËEµæ8»Ñ0¿Ç=º×?¼ÅIµí6¾ÍBºÞN·Ü=¿ÂM·ðG½ÍD¿È«¥¤BÂÅ=ÄÀ¬¦¥M»í¦¨¥VºæU¼áFÁÝM¾éPÁÅS¾ÜMÄÀ\»ïW¾ãQÁØOÅÂxº·\¾ë†·¶LȾZÀægÀÆh½ë¼´NÊ¿\ÂçVɺZÄãKͼµ¯®„¾¯cÁõ­²´~Á±`ÆØkÁï]ÈÓdÅÞƒÁ¬fÄäTηhÆÒjÃꤹ«hÅånÄÞ\βˆÃ§\ÌÐÁ§cÉÛSÒ´fÈá\Ï¿dÊÜYÒ®dÌÊnÈÛpÅómË×XÖ«jÍÒlÎÆ^Ö¥qËÞeÒ¼kÑù»¸`ئrÏÎrÔ¥pÑÊsÐÏk×§‡ËÔuÏâoÕ¹uÑÐl×µsÔÍq×¼yÔÇuÖÁp×È‹Ìê´ÄÊ}ÔÎ|ر‚ÑæyÙ¸uÛ²ŠÒÔ¶ÆÌƒÕÖ~Ù¿ºÇÇŠÓâ«Î¶ÄÆÃ­ÎÄŒÕä„ÛÇÌÆÅ‘ÕìŽ×çØÚ«Ïå¼ÌÓ”ÕóÎÉÇ”ØáŽÛÖ°ÐàÛã²ÔɯÓܲÒâ¶ÒÜ•ÝÒ¤Öð™ÜÙ“àÎµÕØ™Üæ˜áÉÏÑÎÀÔáÕÐΣÝèµÚÕ¾×Ü×ÑÐáÝ¥ßÝÆÖÝÒÔÑ äÆºÜÒÙÓÒ©ßò¥äÛ¯àí¨ãî©äâªåÖ±ââ­ãèÜ×Ö©èÒÀáײãð¼âÝÏÞѵâ÷­èÙßÚØ½âøØÝàáÛÚ´æó³éáÐàçâÜÛ¼åôÅèÐÄåõäÞÝÏäã¿èößáÞÓäêËéÙÅêåæáßÄíîÇîÜÇìõÎêõáæéêäãÏìéÉîêÌîãÆðäåçäÝêëËðìÞëìÒîùîèçèêçÐñô×ïôÝîôêìéðëéçðëãññóíìíïëáòùîñíõïîäôûáöõå÷ðëôýñôðéö÷æ÷ýøóñêøøôöóëùùïùôüöõôùüîûüõúýòü÷öûþøýÿûýúÿýûüÿûþÿü`Ô¬tRNS@æØf—IDAT(Ïc`‚ǧvìFû¯2@À³s,X¾`9 X0ç0Hîùþý»æOŸ0aÒ¤‰{A zgïß} (yáÖ‘Šˆà°°@/33===M0(<ëóÛ¢"‚ýýÜ,Ì´ Uõ$Á`Ê›' Oþ\ÌJŠŠ ö/½ûíÛŸ^¿~·ÓFR2üõo†gÿN'¥&ôÖþC€¯á’/þ0<þs),kçß¿Ÿ7Ï={îPv¯Ã‹ß ÷¿œLË:¾ý÷kU 'ÐUîçþý;Äëpï#ÃÕ[òrR ’_,€.Öêüõï(¯ññ[ ‡÷Ï+È+^Ô“äû(iïTÚâ¢ÕòóßQãÅûvÌéÏ¿ôïmU(P²ÛèªÊ IIãŽ9 Ë›ªó¿ýûÔ‘œûïßQ°$¿ReX2ó;T²Ï (¹G¨ôû¿LûoïÞZ“V^^ž™r•ŽŽ¬´pú® ³ºê’ÓbÀ 2$$ÀÕ,«fTÓ L~¬<ü| ÀÙÙÎÚÚÄÄDWWßÖª”po[q€''2¨‡¦ù%VŠ2ò@ @f(I™—¶ú›úIEND®B`‚phpsysinfo-3.2.1/gfx/images/SteamOS.png000066400000000000000000000042611247443170600200040ustar00rootroot00000000000000‰PNG  IHDR! «fáøPLTEV?A=C=šE>¯L?¥O?¬HB¬LC›HE—GD¨JCµLF£GFÅNE¿QDÇYEÏQJ¼RK°SLªRK·QN¡XL¤eGÁQLÍZJÍ_JÁ`K»RNÇYLÈ[Q—XOÃ[SŸ[Q¾XS¹_OÕZT³[SÕcSÐ\WÑ{OÍcWÍsRÙnTÕhZ¼fZÈc]ÅxWÓ~VÌe`³n_¹u\Ìi`Ým`׆Zß§Sê¬Pù”Zãd¾wj´wl¬¶Qþ§[è¬Yø±Yë¼Tÿ¤]ñ™bàfܰZòwnÖ¯\æ®^à…lÔfÞ¼[ÿsÃŒpÑ·_ÿ´aø¿aõÆ_ÿ¼eèÀbþ³hïÅcí»gó­lîÐeÿ˜yàÊhÿ¨wçÈmî²të ´Ôlÿ€ÝÂtíËrê»uý•еÕrüÝqÿäoÿ™ŠÒ¡‡Ü¤¯«†íÖyôÔyú­Œ»É~÷Íêßxþævÿ¹…òÕ~勒Ðówþîzþ«˜±Ïˆçê~ÿ¸îÆŒîõ}ü©™Ç±™¼Ø‡ý¶—Ÿ•âÜŠôóƒÿÕö®›çä‰üØŽîï‡ÿŘ綞áöŠþߕԷ§µ¹¦¾óÿÄ£Ïí’ÿ®®°ÿþù’ýä™ûåšôßöî˜ÿ¾©çÖ¡ùö—ÿá¡ñϨîÚ¥îÁ²¿ýšýé¢ô¶¸µÇ³ÊúŸÿô¡þÁ·½»¹¾Â³å»·Öï¤ÿ·¼¾ÆµÝÿ¡ü½¿»¿¿¶ý¦ÿÒµôò«þù©ÿì­þÞ´íã³ðÕ¹ïÂÄÁÿ¬üÄÃÇí²üß·úéµûÍÃÈü°þÓÀìÉÈ¿ÃÊ¿ø´ÿÏÄåÉË»ÒÉÂì¼úËËÉþ·ýÚÄèàÁõåÁïé¿ùÓÈâô¼ýû»ÿÖËßÒÐÐýÁýÓÓÉÞÎêÛÏðÛÓÌäÌ÷ùÅÿóÇþÕ×ÇçÏíçÏóÜÔîàÔèãÓïûËýîÏüõÍýþÌøùÔüéÚöò×ýåÜöáâËáâÒèÝñòÚøäàòçáíñÞôüÜüðàüêåãîâöçèÒùáÿþãûóèüñê÷ïëýûèþÿéùøìÿýîü÷ðýÂlËtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•+KIDATxÚ@¿ûnpdYYRRRMMMMRMŸqyde^^YYRPRMMMMMbdˆyvveee^^WWRRMMMD>>l‹‹ƒƒvvqqfe^YYRPRMD>A6‹•ˆƒƒƒ|vuqff^^P==DNDD?6›†’‹‹‹ƒƒƒ|vvq^ 8ND66ù’’™’œ•••‹‹ƒyyd 55. '?FF¸„–™™¥¥¡¡œ••ˆˆ 5qUSdb =UF=«««¦±¦¦¥¥¥¡%y SV TQFžŸ¢³´³³º´´´±¥™œk/   p[QQGµµ³ÄÄÊÀÀº´º¦¦‚ † l [[[Q¼¼¼ÑÑÑÑÊÑÊÄÄÀ«„B( †kkaaçù¾ÈÐÐÐÔÔÔÐÑÑÑÊZ/«  I sssaŸÅ·ÎÎÛÛÛÛÛÚÚÚÚµ$%rÀ\V{™%\‚‚ooo}1žääääääääâ$%.{{Z –‡‚‚oo,‰èèèèèæX3% I³¢—Œ‡„xÏ 2_ããhC, %%3"jzÔÐÐĵ˜—‡Ÿ ! LÙž,& 3HññææâÛо¼˜Þ # tû24$žü÷ööñèæÛȾŸŸ­; !- ,-hò44÷ûûü÷öööèãÛηŸÏÁÖ} #,2,û4þýýûûû÷ööíèÙ̶¶Ë××áË+ -,EûýþþþþþûûòíèÞÙÍÏÖÖáá}1t-ð×EÿÿÿþþýýûòòèÞÞÌÅÖÖßé1gòùù×øÿÿþþþýýýûòíÞÙÏÖáßçK!+,-ôÿÿÿÿÿÿýýýøòçáøîßáßéììôôüúÿÿÿÿÿÿýøøôòðçîßááééôôøøøýúÿúúøøôôììÖßééôôôôúøøùùôôîôìùÏáìéôôôôôôôôôôôìÒéééôôôôéïòàîààéîïÚU¯ÔlAIEND®B`‚phpsysinfo-3.2.1/gfx/images/SunOS.png000066400000000000000000000053021247443170600174750ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs  šœtIMEÕ 6/®ÊybKGDÿÿÿ ½§“ OIDATXÃWùWS×ÎßÖµº\ëuµ¶>iÕ¢"UŠL"‚¢”QÂŒ¨Å€y&„!€ÌC ! ™C 1ý÷{ûœ›T»ªï­×÷’{ï9ßþöÞßÞ[ @¢å§å£ååWIbÿ‹t¥gôŽ$Ò{l±{zßý޳ŋÕнýø|’B ç~ATˆô½È÷‚_þF>[‰¿,ƒ,*6ü Q¤ÿE[‡î÷èÒõ¡ ð4šA44h±¼l…Ç+„0p‚äåˆ"[ß‹íùb@`I2R‰bü~/]Ù†_nÏ{èz ÈȺ?J[‘›]‹¶–TUµkð‹^…È0Düà X 8@³( ÜŠàÁò~Eÿ`n§¤CUÞ°°4|ý¯8$'U ®¶÷KJñÞë Ï3dWJ²ëþtø7WПC™v靨‹~ÁÃ?bV¢¯¯QÑ x¬jEø…üúkŠ ´¸r9±ÑJÔÔ´ˆ¬­Y!0&DŸÂçñXý,ïz¤ð{(àüäs:;uHHHEEy7.„g#""cãVØ·Ýy‰¸ë÷›‰§ÕZ”=n€yeŒEf\0 ?é$‚è&ky¤óh)ÚhëhCJŠ’6îĹР¢ýJJ´°n8ñÚdÁòê¦fq+ñ>⢠PY®Å“²FXV×!g–/àR)2 ìž$’ý‚›$‹%zYå $pšv$&ÝAyÑ~6§ÊDVf;róëa³;0aœC§®–µ-,¼ØEôoyˆRBýDƒ\å#8û3BÞ“.qvåß82íòS΢Øåv¢[×CtÇ LEwî.ÂΦ£µe«VÚ;Ç "Pkö] ÍBÛ=³uKËÛH¸QŒø¸•ŒÁUÌÎÚ ëÛå-4·P[¯Å’i†¡ihuC0¯îC¯ŸÃÉ1y(/oŃj,-šá÷Q@ RœKJå£%ð`ÑÞÐÔ€ ·¡zÜŒðó¸z™üúduuƒX#¿Ï?_¾wË+›hk",›×14üÍÍè®îºÊ€3gïÐ>y”5¸_¬âÉÍïÿ ‰ìeå"ê[ZZpíZ*ʺpîô²>c£v˜L‡ÈRªP]ÓÌ_C§!zw8uõ½d½¹y•èÒO¸w(.iAȉ8ܸ‘‡jªäÛé8p¸ÀØf Ñ/†Óu€–ÖF„ž¹H§Å…óéäóT,,8ˆî=h´£˜³ µuK›`³:1=½HëlkNd+ËqëV>FÇ_ażVbfÆhÁà ÿ>‰„øT©;pçÎ=,.šxL0WÕ~ò¹êê\¹ÏEæÒåT¾FFMX±l‘îÓfÓK°˜xDVE_ËFÍÓX,{°Ù¶ñê•ÅEÐjF)õöÐÑ1L¬½‚ÝîBm­ô¡gBï")©„»C™sÏ_¾†\¯pî“듌ÒÒN\¼˜Šó’Ñ?ðK+;íLM/Àl~‹™.Í8f&tvŒ’.´CÓ1E9߉¡9bÅA é019«u }j /žo``À„ÈH%¦Jë D –M«PÌ¿˜B|B¥Z#Iê=|÷m žÖÀºîBaã“KXYݦÀj&)ž ÿ;±´dÁºíʬj|÷u4ò•ÍÄŽ££Ïép#6ì›hoïA~’@ÖÖ=xð°_}u¿§þââJ44¶A1eœÀ/§Ï‘_ý>ŽÒ†O«)Ú €mƒü¿bG}ƒƒ†9¬PÔ×7´áù rÉÔ»e¸ž’¢V˜MN¼%ÊM¦MÒ tä¶õMôôŒ`rò56I²‹ŠjqîìMÔ“[¢£’IGÔPììì!1ñ.Žý 6‘ˆ”à"mZ¥6 ·ÏˆŠªfè{&ñò¥|;£q ¦7ÛxZÕ…¦F^Ìo »kœ6íA¯Þˆju7´$R+ä¾þþ1be«–mêúp5"™¬îá5%22¦ ¸­’fÇÄ$áË/òbr=&?„Ä"ôt"z{g±ðÊN±ðŒÜ±ˆUJ5e–Ê{eTÿ·¸­ÖMèºÇ ømTWê)wÑß7‡‘áEbaÍMzÜ ßW©Ûvþ2Å[ eÔ¼„¬^3f³ ÑÑqøâ‹#ÈÍ-ELT.Ž}‡>½ ÝÝ3ŸZ€}ÓCâÔ‰”äGÈË}BoS€ÎàÙ³qŠx'ôº zÞŠ¡ÁZóØÞ~޶1D\IåYú+ ÓMÒˆ%êž¼!< 9Qâ5Áãq#+‹ªÝ7ßQ!)GTDN…Uê¢qŸkm]/ì.´4÷S `»GeyCCX_ß%0óP•6sÒtãÌ/ $焇GãÖíT¸ÝHRPŽE&ÅR wóp%<8ØEAA!N|Ù™*ÄFã©aZªša >›ÃÌÌÊuÔ' ð›Áðð45#;èê¤V­ŠWÆrU;éÀ-dddcTžÉ`¦¾Lú™áëýTz*Çt¿³Í@áøñ“ÈÍ©D̵BЉDtjÇ©ìîSpM0½ÁšÍIÚ¯‡V;@¢´‰‰ñ—ä{#¨—HKª+u¸|)iié”Uf°òË”7Øyñb$[Ïx ‰ÄYq8ö¨½*Ä‘#߈*\½’ƒŸ‰Çä´ VR@]÷Œ3ËÜ÷MÝ” #Øßu£–RøRx:/-·_AvNé‚h÷zL¹ÅgK®’—û_ ´Ý¬‡cRîчpìx ŠÊy-?ý˜ÄÓm}í€Zò>ªØ,.äçºe6òÙÏc¢o#-# .÷.ˆÙ‰·ölÞðPóshÓ$…lµ$~Ô½²+cBPø|>Å;—“Úï‡$V¡Ô\¨¡¤&%…"ÞH)¹GóÀLËïðû üøýM=±['FÓþþÕ‰R;‚ÂÂJ‘\œKA}ýå³êÊ^üv5u5\ûÒ¸[[o!S.ÉCÍŸô—3?yx°aü„Ãá á£Š@œB^~5µä8ñC<~<•@íÚMÔÖhé7ª ù%ØÚÜø·ŒM?gôŒfŸ^ìà ìÊ\RþD'ψ§ˆ¸š…S'c¡Vwòª°¸>Až1 ³–Þ+‚CÊÿ àcAFœï©ÝªGXxò *PúG=uÉÅP* °¹µE£™Ï“rƒËÞ&¯Â@@°‰dÙ²»Ï˜:\‰ˆDjZg!•h3¼^‘*ŠÔâKéÁñLÂ?ìߥ?ÖÀ@Á'dfæ&ÀÊùÛÍM°†–)Ÿ¬ñŽÆs]Ý&­ÏœñžvžÕìpIEND®B`‚phpsysinfo-3.2.1/gfx/images/Synology.png000066400000000000000000000101441247443170600203110ustar00rootroot00000000000000‰PNG  IHDR szzô+IDATxÚ ßïÿÿÿÿÿÿ !"ÿ þüñüØÿÿòì øúKýøûüö¼ÿÿóëùþ(þùųýÿ¶þÿæ0üûùòàÿøòù Ìøÿõ )úôÝÿÿÿø !üÿöøðæ & üíóÜÿÿÿþ üûìùñÞÿÿÿÿýôÿH àèõêÿÿÿ¸I" üÙ #<Ýýýÿý ùÿÿýÍ 9(üÿÿþÿ ½ü Õþý2E N ,ýúØÿùýÿôÜþ÷þ ýÿòý¯ýüÉûþ )(üðýúº¸éÿ"ÿÿÝñýÿ¸Ûð62øãòÿ ÿÿïùêû ÍÿÿïðôÛÿøý&þ ÑÿÿöâÿöìåÌÿùÿ ÿÿòìÿûòÄ(µ¾ÿÞúþÿ&å ÷þ åìöýýúëû ýÿ þüøùûìõëïýþöB;ÿÔÔúÿõëæÿûóÂþ÷ àþüûýãÿÿþýþýÿÿ ÿý ÿüðû÷íèð ÿýýíôìýÿùñÿ"  ñàý6?ìüüÿ ýÚÿÿÿõæ%ýýÞÿÿÿÿÿÿÙûþÿ* ý"ÿÿÿÿúæÌúéÔýýÜýÿÿÚóÊàþýþýãüüýüø$ãýûÃó%ý)ýþùûþÄÿÿÿ ôÿÿêô øúHýðýó´ÿÿÿý æÿøÿÿÿÿ ææ÷ÿÿÿÿ ÿõïÿÿÿùÿÿÿóóÿ&ýäÿüÿýÿÿÿÿöÿÿÿÿöÿÿÿüêý=÷þþíûöØßôÿÿýùý âÿÿòöÿÿÿ0é´ÃԇƃIEND®B`‚phpsysinfo-3.2.1/gfx/images/Tails.png000066400000000000000000000042211247443170600175410ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE@,k7"g;%k='m<)h>*j?+jA-lB.mC/nD0oE0pF1qG2rH3sH4tI5uJ6vI7qE8vK7wJ8rF9wP7sK9sQ8tL:tM;uNxQ?yR?zS@{TA|UB}VC~WDXE€WG|YFZG‚[H„ZJ[K€\L]M‚^Nƒ_O„`P…aQ†bR‡cRˆdS‰eTŠfU‹gVŒhWmX‰jYkZoZ‹p[Œj]Œk]r\Žl^Žm_t^n`oa‘pb’qc“rd”se•tf–ug˜vh™wiš{i”xj›|j•}k–~l—{mžm˜€n™oš‚o›|q›}rœ„qž~stŸ†s €u v¡‚w¢ƒx£„y¤†z¥‡{¦ˆ|§‹|¡Œ}¢Š~©~£‹ªŽ¥€¦§‘‚¨’ƒ©“„ª”…«‡«•†¬–‡­—ˆ®’Š®“‹¯”Œ°–޲—³˜´›¯™‘µœ‘°š’¶›“¸ž“²Ÿ”³ •´£˜·¤™¸¦š¹§›º¨œ¼©½ªž¾«Ÿ¿¬ À¦¢À­¡Á§£Á¯£Ã­¥½°¤Ä³¤¾«§Å´¥¿¯§¿µ¦Á­¨Æ°¨À±©Â²ªÃ³«Ä´¬Åµ­Æ¶®Ç·¯È¸°É¹²Êº³Ë»´Ì½µÎ¾¶Ï¿·ÐøËÁ¹ÒĹ̺ÓÅºÍÆ»ÎÀ½ÎǼÏÁ¾Ï¿ÐÊ¿ÓÅÁÒËÀÔÆÂÔÇÃÕÈÄÖÉÅ×ÊÆØËÇÙÌÉÚÍÊÛÎËÜÏÌÞÒÌØÑÍßÒÎàÕÎÚÓÏáÖÏÛÔÐâ×ÐÜØÑÝÙÒÞÛÔàÜÕáØØãÝ×ãߨäàÙåÚÛåáÚæÛÜæâÛçãÜèÝÞèäÝéÞßéåÞêßàêæßìàáëââíããîäåïåæðéæëæçñçèòêèìëéíìêîíëïïìñðíòñîóòïôóñõôòöõó÷öôøøõúùöûú÷üûøýöûþüúþúüùýûÿ÷ýÿûýúþüÿøþÿÿýÿùÿÿüÿûþÿüe[ÃctRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûê°êþt¸!ÞðE³n¹þ73¹e¹EþÔþ&Ö-½bº6ùþþÑþø÷Â[¼&/þþþþÏþ§ÉT¼þeÅþþþÐþ&í"ÎO½÷‘ÄþþþÏþÝþÓH½g‡ÂþþþÏþ‡ÚC½šúÁþþþÏþ%Éß;½þŒþ ¾þþþÎþþõå6½¦‘þ$¾þþþÎþÇé2½þ ½þþþÎþþþ#þ=ŸìuÏ‹¼þþþËþþþaþùçþˆŸå»þþþËÂþþþFþ}þƒRþºþþþËþùþþWþˆ þ¹þþþËþþþWþV÷W¹þþþ˰þþWí©Þ¹´þþþË£þW¸èŒþþþþÊSYgþ ;ùþþþþþ4*þ*/ôþþþþþþþþrïþþþþþþþþþþþþþÙþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ#þþþþþþþþþþþþþþþþþþ7ìþþþþþþþþþþþþþþþ{“þþþþþþþþþþþþˆ6þþþþþþþþþž þþþþþþ¢ØþþHÚÜlêúߪ IEND®B`‚phpsysinfo-3.2.1/gfx/images/Tanglu.png000066400000000000000000000042211247443170600177170ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTE    "$!%%%'$-,%+-*5[6X00) 8Z<]32+ 9[>_54-?`770AbCbDdEeFf;:3GgHh GbHd??7MgIeJfPkCC; RmIHAUpWsINENNF\q#YoRRJs'\r`uuWVNxz{$dzZYQ|ZX\&f{~\[S^[__]P€‚ƒZ_a__W2iz `^b„… ‚]ad‡ ƒ^ce6m}‰bda`egdecfdhafh9p€‹efdfgejgZfi[ghfhig =s„il^ikhAw‡lo`lnk’npmnrcK{‡ptevsertq+“OŠtxi*•(P€Œvxux{lxzwSƒ/™,|nU…‘}€q~}Xˆ”40]ˆ€„uƒ€BŸ3b”‡†~B¢=†‰z‰ˆ€f’˜F¥@ŠŽ~Ž…J¨CQ¨Kl˜ŸT©EŽ’‚“’ŠU­O•”Œuœž•™‰š™‘c±Ta²[œ”}¤¦›ždµ^€§©…¨¤o·a£¤Žrºd¦¥œ«§™¥©™£©Ÿr½mŒ°¬“¯¬{½nª«–´°—³±«¯ŸÁr®¯š²® ˆÂt¯²¢ž¶®›·µ²³ž‰Æ~¢º²´¸¨·¸¢¦¾¶–˃½¾¨ªÃ»—ϽÁ°Á¬®Ç¿ ÐÁÅ´ÅÆ°µË¼¥Õ”Èɳ­Ö–ÇË»¹ÏÁ­ØŸ½ÓÅÏк±Ü¢·Û£ÆÔÇÀÖÇÒÓ¼ÁØÉ»ß¦ÌØÅÕÖÀÅáªØÙÂËÞÉÄã²ÚÛÄÓÞÌÛÝÆÇæµßàÊ×âÐÐç·ÙåÒâãÌÓê»ÙëÃÝèÖÓíÃæçÐéçÊÔîÄ×î¾áêÑÛîÆàëØéêÓãìÓìëÎÞðÈàòÊèñØéôÍÿÿöþÿümXJîtRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßûÓD+:ãÚr9Óç!*úÛÕ* ȰoS>EGJE£!¤RRPJJJJJJJPREû"+Ì?JJJJJJRR8R;TJVÈ("PJJJJJJR°µJJRw"/?JJJJ>¨ýýoRÖÜ %×EJJJJTuf]n©hã "oJJJPo[kbbbbfgH>Á!"+ü?JJJ?\cbbcfbbbbkìô""%„ÖJJJGášbbbn¬n[bbfÙè~"""1”JJJRXbbpMbbH®"""";JJR¦}bbHÆbbcÄ!""RJJR˜cb’bbk¡"""ÍTJJ?Æcb bbkD"""1¨RJJ?Ùcbu]bg""%¯yRJJJRê\bcubbkÜ(""%vRJJJJSXbbb fbb["""Û>PJJJEéÊgbb\CnCfbbX%""%DTJJ;õpcbbbbbbbb˜6"""GJ;šHbcbbcX{„(""yJ?®9êªnn«i'""!ó?JRyléÌ'"" ÈÅWSTJµ6**¯óã¥Y(""%íùèëRJü¯'""""""""%Oå>?D,`›ØÕGEÛ?E?R¨åÛy;8yÅÖÏŲ‘µR¬®ŠIEND®B`‚phpsysinfo-3.2.1/gfx/images/TinyCore.png000066400000000000000000000075471247443170600202370ustar00rootroot00000000000000‰PNG  IHDR®9.IDATxÚ#Üðÿÿÿ/ $ÿÿÿõŒþü$ûüÿøÿ—ÿü÷¤ %ˆýSìÿï«ùŸüÿ òûÿòÛûäÿúÿÿøL  Ôõÿûxõýÿ}ÿþž6 úö'óäìð–Fÿ ÒýøxÿûáÄÿÿÿ&òùù ûûûøûÚ¸ýýÿîÂýíý Ýþûoÿ ñùþO ÿýþùûùý~øû ýÿøøø ÿõhýÿá™#e~öÑþÌþóûå? íóÀõÓþöûýýýú3)üüÿüÿýÃýÿô?þÿÿþùÿ­øùÑX4ýýI"üÌþÿ úþÁûªçÿØë*þøûâ ÷Üáùòòþüõþññÿî ýþßöø¦ Ò þ,çý( ûþÒòõ8üûëüûüÜçÿßë ÿúúêýýÿúþþ àúö÷ÿ/òêýÖýþýíâÊÿÿÿû %àíþü  ÿþüòÿý% öðdþþ¸æýý&ÿýüùÿýçûúüûHÿùóþæùôÇü üûûçüý3ÿüÀýâù÷üæ÷üÓöóúdúý ¦ &Wþ ÿ8åÏûú þóúúûÿÿø ;ûíï}ýþ ÿªýÛ÷ã¨ü µýüQÿÿÿ¢ùÿåØ&iööúT çûúâ øÌúöBûòüû )(ý÷÷ëîüæýúòLþÖÿÿöÙ©%.w÷÷-ø-ÍþÿÿÿV«9<ÿÿûè ÷ÿ¿õ á_ùù@çùÿüüðûýàû ® Ñ÷úBÿ÷üàU߯ªÿÿý%Ü?8ûþûèüþèýÂÿÿÿÿÿÿÿÿÿ$I$33 ÿÿÿÿÿÿ4} ƒ"[2.ÿÿÿÿÿÿUU€@UUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ  1= ÿÿÿÿÿÿÿÿÿÿÿÿÿN¼ëqñ`IEND®B`‚phpsysinfo-3.2.1/gfx/images/Tizen.png000066400000000000000000000036151247443170600175640ustar00rootroot00000000000000‰PNG  IHDR szzôgAMA± üa pHYsÁÁ¸‘kítEXtSoftwarePaint.NET v3.36©çâ% IDATXG½V{P”U?ì., ¾PäÍ~À²°ì²TyD>h†j¬©lj²þÈö°÷”6 6Y‘M¥å+’|eQ¾Â4S„HTÖ(4 Ë"í¡•°´Âž~÷î—M%#ô¿™3ßîýîwιçñ;—þ7Z9€Žq¶úoˆÑäC‡{ߥVßoêÊâ£ß ¨¡»N0¹{‡Î %Wh¨úË'i‡§N0Õw3í÷Ú—šª¨æ7¦­L;:™vÉ}ÝCãÀð{W^IoüÀ´ñ Sͯ;ñṡq xþ¦5´¼iÍOLàÄ;pbËY¦ÚΡq@wùíôÂ1¦ßûXÚïÄæ³ÿp@£Ñ„h4±Z­Ö¢ÑjóC3'—‡?¸þ¦^/E ªÛ(2Ž0Ú™žhbª„¯~ËTõ£tBS}¢i\|â'qÊɈXC„ÇÆ$pD\"‡ÍညC,#÷æÏPÕöfÙþiªÚ#P<'6ÙÌ£oxŽiÁA¦g0½üu­>Ua-›mtÍàìÂì,˜ÆŽ)¥œ5¹˜#®z˜éÉf±Ïï¬HÛ»(àí>ÔÍó(^½ªþÒ1jMŠm<;JÊ9èŽDâÀIz¦µP¼ËœX¨X'qV^ ; JÙY8Me·1=TïwtN_ý3Ó¦_ü5³Ãô§‹©ñfj>o’.…Ñ‘1í6É.šÉ¦âkºÂn^§¾¢TG®brNdsödNŸÏ–Ü‚³º¹ï¦…ý‹_1½ŽÎõ":g»ì?‰µôyüZŽò­ô™¯’š{óðBã_ôC« 4ÆÍ0>ƒí8aFÎN±ç,Q_“b¶)Jz'Yœluqª=çzô=-jYB¯|í“ûN¿Yœìw4öø`«‘>÷Í÷k9Ü·á`I­÷œ¤½]Ki—§-¦ qK:NçBŽ3'²8m¢Åá‹K͘)>N4)1IikLçx“e…Ô÷V´Ï¤u§OËnÙÖÑG;=uT×u'Ÿ îPÑä-ƒW‚ÕXRìNäé}x»µãLзkœ—ÌÊ/ñ¥ÏÃ)³9!-“£SO3$Ç@G’bm˜ªQž_:Ò8kî=óW-ƒ‘êòEÐЂÐxhòS+ 3½‡Š}žo8ã¡5?†dæ$ ß÷!Üõ1Éi}Â(äˆ2’!TŦ˜Ã±çfDj³mrQsêtÑ–_¤­~QÛ¹Ž¶Á¸È•™ Üµ¨^QDËN\¥î’ˆTŒâä·C.„¿£ ;¢“L^%ÝÆ&G.[‘2Q¸†4+ë‚ôEêÖ‹#àŽårЈ‚Y‡ªųò$ÓKÇ™·V«Û.@5xÙðÛñ" l0Û8Õ‘ÃhQY¼¢†† ß n½8@“:Íò£G¤áÕ§ül'¨·âS¦ÇöŸ¥{÷蓬®Däÿ>i„1døÏpHˆx¢(gÌÖÍ)ö =™§ÊâE*8<*Î F’ÆúƒvÞR‹î™Æï¤áE-L7qÐ]ïqÄõOsZÞô6Ô€èFp”’"ê  ñBÖªj$ÒœÃ"®~|½R~[ Ë8.%ƒƒ‚CQ_÷Cšmx`Vqå0KAo´s*¼/æìâ2¶ƒbˆÐ*v¡p‘Øi0*p†‘{±v“Tòž8Ђè1=XÇa×Vð°È„ã(ÆðL¿9‘·ƒq !«ÌåLÎÊ¿L²ÂÛ¨¤ÛeþãRÒ•øT‹Ì{’ÅéI¥JK¾L¦ç¿à ²¸•µlã0Wétù~ Ð iA!¡óÆÆ:3Æç³:¶¼’8‘¬n!0 ¢2 ¤cKNÁ!Ì=êè!Z…"^…zÏ•ã¯}Ǻ§voT?8túø‘c#kŒ !Õuê²Dšk’bAYr‘.9¦‰©øÚ¸IN@1DW­…`$½òùQõÓÁ# rO%ÚÔ npcи1nÝskZíH SP´œh½(Åx£·AŽ_!b n±iªÚö©ê‰ÚÎI´¥ã¼«Õhե߸;åî­<E*îÉ™.96ª^4޶w¤€Î=’Ò·ƒY·AÀ°šµÇ+Tƒ@]×hÐô ©DœD0¤¸å,>šy[$ÑÄ  poxeó÷Ec÷¹åÍy7(^ŒaAõxrÔ·ƒ@CÏF©HÌsR‘WAVà‹à[Wñ˜èxŠõâ=ÞÐS a)ûº¿Å°»ÄLø7¿ ãÓ?ÇÅ CJ—˜¸pè‹æüž/WwÿMÞáÐÑF1îx+ÕÕâ›qW8GûáÀ^\£>À˜ÃJÌ Üó+êÛõF›CÝÝ?>óeãòáÅ3O] ¾àû©ÅçÆ)ÜŸ÷·vÓ©fªj«Õ/®[8jÖÜuç¥qŒ]Ð70Zý Ð.¤âþ gIEND®B`‚phpsysinfo-3.2.1/gfx/images/Trisquel.png000066400000000000000000000101711247443170600202760ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs × ×B(›x+IDATxÚ ßïUÿý€þ]ÿ þÿÿýèûõâ+ð€þÿM L ' ÿÿûìûÒõÝÀÿàÿ€ÿÉ ÿ«ûÿ^ÿO ?ÿùû÷äÿýõ" øõÛñë¥ú#Ù€þ€ÿâ ùßþúÿdéúíÿåïñÀüUÿ*4ûúïóðÀú÷Ïýú -C,ýCèÞêíÿá5) ýþõü ÖøÑ÷ÿ×"ï€þ  ( îíºúÀþ >ÿöîÏó .ñòË÷@ÿñÀüÿM M 4ÿ ûú,òðËðÜ·ÿèû  üïúñƯðfÿýü-üõß÷ôØÿ>  #÷ØñY RAþ÷÷Ö÷øçúûù  $  # éQ¢üþþþõ  ú€ÿìüùdÞ0 þÿ   Uÿ $1ññÈñë»ú÷ö ý íðù!E 6ýõÚìïÄøö×.;óéþ nü5ÿõû' ÿþ÷ý  öùáïð¾÷ó;  ùøêëëÕìë¿ D  ü?÷üäïóÜ ðÊ0úþ çèÌ- øøïøõéïö  ñîåûõï5 (îîéû(ÿ çé´  ,ûýAÞá­ïܵôõ þú÷Ðòóâ)!>+ ïøèó÷å·úüþ ýÿ ëêÊö·óýA!Iåèó÷Íý0  Gîî¸Áîïÿ 00%c ) ôùîÖáÀõóÝÿ öüýêýæéñëÏúé§ûÿý÷cèìú 0#<ñ&ÿÿäþ úüòòêâéÁãë¿«ôõû÷ íÿò)ó8ãáÁæñfÿ÷ ÿþûøúèþ ÿ  øüöúýôúýð÷þôïôòõìñðÊîó´£ì«ýùXÿÝãèÍ-#H.#L äÖüýù )çëåúë 9  øýþôøýñøüñøûóøüúûÿûþýüý÷óôáôôÎøöÃ"äþÿU'"T' 1 þýüõøîßêÓÞç¼ýñ i6öúñ÷ùøøïùúëüýëýûøþþýþþûþúåö÷Íúê«úÿU   ûøýï÷êêûÛïï AZ ýöõÚòíÄ÷üÛùç÷üÿôø·ùÿ«îêÿïêªÔÖÌ@þ€þUÿ*üúîðì½ùòÊ ÿ üúøùýè·úÿVýÀë ÿùîñÕùùÎ*>ûúöîìÑòU½«ë þûîúøÂ @ÿÿûâäµÞÞ¹÷ùé?^bÿ  þ ô"óîÃüÂýø¹ðí³úûÞ* ,@ÿüùýþþôþ«ýùöæøóÝ  +øðýüòûÿýñÿüþ 0ÝYÿëÿûüù ýôóëù 7ðíáêïÌ U @ ÿ«þøhÍöö'$.îîÙëïËúôÓ ûõ !0ññèûÿøÿÐëí  ($F ç ðóØùùô <+õ÷éôñØ£÷ð òøàÀ$A$ ùúíýþø  òõèÛáÃöé×ÿÿU 9( <úùéêïÚÝãÇïèѲóUÿ  ÿöûàýüçñ×óÀü€ÿÕÿšûÕÙ§è:pIEND®B`‚phpsysinfo-3.2.1/gfx/images/Trustix.png000066400000000000000000000041531247443170600201530ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs  ÒÝ~ütEXtSoftwareMacromedia Fireworks 8µhÒxtEXtCreation Time12/28/08ôGjÀIDATXõ— T“çÇC ܪШ›gÕ‰x`n‚ó(Rµ•ÊE(£Úˆl«WØÄ§(” ‚0ˆ€ \är!!„p‡Ä ˆ—M…Þ›xþ˦‘§½¿šQ€#Gö6›š‘‘Œñ°°0‡Ï'°·ÿÎÄ„Ý ÷YÍ@cS…׆õ+'ˆSahÈ‚…¹ýÙÅÙuu²„ÈÉ>Ë^ºt-Ä2Ð033Ü9³Ád2É’°s¬yFNGd{xl„H(ÂêÕ«iqoo/tt\÷bÊ8PPûŒ„…ù³£"Ãqê4"Ï$Ñb‘Û¶û"??ë×­£¿Û»wÇ“Ç}«¦àç0;2:‹Þ_ŒäcŽHc!?ÑfÆLœø2[½|h__÷[ä~»iHI‹gï ðF]ê2 ŠkŸ‡ç?Ç#í;¸]ó,^ð²?ßíKnÇŠi(¨Øœ@g|{…¡Fs w-!ñîWàAkìõÈŒ,ÒËÑÞ.[7íª:!;àóOuÒY ÜÈÓ‡"Šª³vЈcàèè„ÎÎX³ÆÛEÓýÕ¡Ø­^[Q­P#'Ê…'AäU­ w»P&(Ç… Àå¦"$ä dgŸõ˜6€{÷Ô.®®NCY™™x:2±L™\º–DX„ää$ÄÇŸÃÅ‹©(**‚L&EssÕXuµdËíwÛíï=´eËf¼~ >Á­[ß ´´‰‰ 8|ûöþþ»’’   …nûXþœêîK—.ýÀ ÎÁ·?ôGhhär ù´vìø<ii‰8þeËùÿÀ,a¯ÉÆÆ,ˆÅ"Z|tô*+%X÷jãyy8Óåðà>Ž Ãðõ`꺿Œ|Î6(ëÛ¡k¿N‹kµ×ˆCêàîîN‹0õPtÜ£r³ñ±Oed>)ʹè­õÀ5edSa‰êÓ íÊØ·_ü­xºù¦è+6À“ =ŒÈŒ0ª0ÅóS V˜ Ê—_¯\I6ž+ÄvíèìlÇÁCû^u»~dÂ@)yZ¦Êþ¯ª FxT®{•«Ñ¡þªUU¯Ù6itõ¼˜_[§ÞUSS[¬©N÷ìQr× …»73Ìð—,ë#jÏOáëãqgÏž]š”äscœØÓðôÜ„#>x?::¼1ðÐïzÒ­Ñ’ÀÂíl#t¦ÏFkÏ?å¾Ç”NCeëƒ_— ‚ù_î,Špd‡Ú )dò³N‰G9Ô=……e¿åpâ¿),,Àã'ê»›÷úÖÒ ð¸-*#çAv™ ‰\îÿßtþ ÏŒ-£…4ƒIEND®B`‚phpsysinfo-3.2.1/gfx/images/Turbo.png000066400000000000000000000101711247443170600175610ustar00rootroot00000000000000‰PNG  IHDR szzô pHYs  šœ+IDATxÚ ßïÿÿÿAÀ&ô$šÍÚÿÿþÿÿÿg®gûÿžÿžOãý·,’f°`g´ ÿÿÿg°kQÿÿþâþú ñÿÆÿªUýÿÿþûµÿð {|i° ÿÿÿg²nNÿÿÿòþþ²ø «ÿ¢FõÿÿÿüµÿðZô-ÏÞÿÈ)ÿÿÿûûþP þÿÝÿÿ½þõë¹ÿ™fûýýøþ;üÿ¨qÂa¤ÈF##ÿÍç¶ÿððï#®ïíñù³9 ÿþÂÿþÿîÝñV«ÙÊCÿ«þËþÿü üÚÿÿÿi¯,þ… ÿþªÿ™O™ØþÌ'a«^¯ÿ@ü±õã« %ýþaå3åf±Î×ôã üÌ?ÿþîöÌõW::ÿö ýåþÿ ÖÿŽU÷þ¯ÿü %ÿ'ÿÿ&ûÊþß#ÿNóýµýÿýýâøá* ÿÃáü§ûƒÿÍøþ ÿPðµýÿýÿ–RÈÿè{ÿþ‚ÿÿÔýÁáÿÿ&ÿ™fûÿ™OÉé}ÿüÍÿÿÿh¯RiþçûøsÿžUëÁâÿÿ”Qíüÿ·ÿþ"Àä*ÿ™Lìþ¸þn·þ¿þûö÷ÿ—QêÿÿÇÀýþÿ›Néüøâe†9=¹þ°IEND®B`‚phpsysinfo-3.2.1/gfx/images/Ubuntu.png000066400000000000000000000022141247443170600177470ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆ1PLTEÿÿÿÿÿUÿ€@ÿf3ÿ€+ÿ€ ÿ€ÿtêj+ðxòyòs&óy$ôu öv$ör#ót#ôq"õrõuör ötóu ôt"ôu!õu"õr!õs óu"óu!ôs!ôu õu"õs!õt!õt óu!ôs"ôt ôu"õt!õs óu!ót!ôt ôt!ôt"óu"ót!ôt!ôt!ôu!ôt"ôt!õt ót"óu!ôs!ôt ôt!ôu!ôu!ôt ôs"ôt!ôt!óu!ôt!ôt!ôt!ôt"õt!ôt!ôs!ôu!ôt!ôt!ôt!ôt!ôt!ôt!ôt!ôt!ôt!ôt!ôt!ôu"ôu#ôv$ôz+õ{+õ{,õ|-õ}/õ~1õ6õ‚7õ‚8õ…<öˆ@öˆAö‰Bö‰CöŠDö‹FöIöŽKöNö‘Oö‘Pö’Qö“S÷”S÷”T÷•U÷•V÷–X÷—Z÷™\÷œa÷ždø¡hø¡iø£mø¥oø¨tø©uø«xø¬zù²ƒù²„ù³…ù³†ù´ˆù¶Šù¸ù¸Žù¹ù¹ú»’ú¿™úÀšúÁœúÁúßúÄ¡úÅ¢úƤûÇ¥ûǦûȧûÉ©ûÊ«ûˬûͯûѶüÔºüÖ¾ü׿üØÀüÚÅýàÍýáÏýâÐýäÓýäÔýåÕýæØýèÚýìáþíâþñèþòëþôíþõïþöðþ÷òþøôþøõÿùõÿú÷ÿûøÿüúÿýüÿþþÿÿÿÃÛÿ‹VtRNS ,-1289?DFJNPSU]`bdegmqwx}~ƒ„†—šœ¢¤§©­®±³µ¹º¼½¾ÀÁÇÎÏÑÕÛÞßèïñòõö÷øùüþíš>ª´IDAT­Á÷CŒqð¢("3»$›ÌÌ3³eåÍ—q•rF22ˈ¢È¡ì=rJžÞû|Ÿç®§Ó½^"Ýi@Æ\Ϻœ%Y£ã¥+Öï‚cëœ+1nÛ§÷”NR6 Ʋ~â2(¼u¡ €µ Õ#"öíE!ÉS²{HÄBØJë>Yüqæ'ÿBX†8†Â8pãD;Ã^Ÿ®<µ©¯Ø–BùÞ3ðìmmý;þzÓc²IyP¯È Ô…odÔ1Ò Ž“Ÿ}0Ž4³%*YÔl¨¤Ž«d9ÔQ‹€êïõåüŠŸÅÇPE­†ŸäÙßAD•] @͵û[hYMˆ ¾¬„š*jPRsþ!C^8üä¨tQ3¡î‘WàxD–B¥ŠJ…Êoe[ÆeòƒaÛâEÅm†ª"ŸbÏÑçd[1Ôb±Í‚q?tø ›[ÙÞp­ Æ(±%mQtêæíww#l•DdÂæ=y«±ñA Éb;KÔ<¸´ø·ÀxéÐÇ—sO.˜&n½²ÐÙÎ4‰1v=\@A?ACACEBDFCEGDFHEGIFHIGIJHJKILNKNPMOQNPROOTVRTQSTRUVTVWUVXUY[XZ\Y[]Z\^[^`]_a^`b_ac`bdacebdecefdfgeghfhighjgikhgknjlikmjlnkomqmolnpmoqnrptproqsprtqsurquxtvsrvyzutuwtvxutx{|wvwyvuz}xzw~yxy{xw|~z|y€{z{}z|~{‚}|}|{€ƒ~€}„~|„~…€€‚†€~ƒ†ƒ€‡‚„‡‚„ƒ…‚„†ƒ‡…‰‚‡Š…‡„‹†…ƒˆ‹†ˆ…‰‡‹Œ‡†„‰Œ‡‰†ŠˆŒ…ŠˆŠ‡‹‰‰‹ˆ‡ŒŠ‰ŠŒ‰ˆ‹ŠŒŽ‹ŒŽ’ŽŒ“‘Ž‘”’”’“‘•‘“”’–’”‘”—“•’”–“•—”›–”–˜•™—›œ—•”™›—™–˜š—ž™˜š›˜Ÿš™›™œž›Ÿœ¡ž¢› ¢ž ¢Ÿ£œ¡£Ÿ¡ž¢¤ ¢Ÿ¦¡ ¡£ ¢¤¡£¥¢¤¦£¥§¤¦¨¥§©¦¨ª§«©­©«¨ª¬©«­ª¬®«­¯¬®°­°²®±³¯²´±³µ²´¶³µ·´¶¸µ·¹¶¸º·¹»¸º¼¹»½º¼¾»½¿¼¾Á½À¾ÁÿÂÄÁÃÅÂÄÆÃÅÇÄÆÈÅÇÉÆÈÊÇÉËÈÊÌÉËÎÊÍÏËÎÐÌÏÑÎÐÒÏ×ÑÐÑÓÐÒÔÑÓÕÒÔÖÓÕ×ÔÖØÕØÚÖÙÛ×ÚÜÙÛÝÚÜÞÛÝßÜÞàÝßáÞàâßáäàãåáäæãåçäæèåçéæèêçéëèêìéô AttRNSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ —ô< pHYsÄÄ•++IDATxÚ ßû”@/NVIYcB‡ÇGFQ`,cl\VNUus¬}-)QIB5j\UQV@lek})*,I936ENUBT\fV\U„w޳>50).QQ@B\^„tV`I\eV‹–›Ÿ2Vhpye½ÌŸÔU$1>e.YTY&(ÅeDg>N`2.Y™„–– ©ÐÎYNVQhÐň„–Ž}“„®I\289ÑÍv„ˆuke„Èphpl›¡„˜—n’Ø]3>c›w‰y}ld`QhE›`º­™–˜2žžY›yuks‹(Ö@1™ÅuÔ™.› U™º™YQ-½yT5e s– 5ÔÐÑhz“ll\ºGppªÕ•D£—hYuÍÔezhyeEÃephG™j£šcÈYsc„DQhLp}°‘Ř«"ÃÕ£wlpj@,‡hn `§½UjÕ˜jœ›z`eTlG8 h““{„‡VzG>kN)œ„‹}›Ž ¯¦lQY`T,Г——p¤••¥1UII5••{•›Žž–„I>9IUޠާžˆ˜Y›ÀlETG1Q¸ª’Ž™pe„zz´È`<ÈTN83NLJ›•œlky{T`L„lU55@(Q¡uy‡„sjQl}QYcNǪ.D92„Žk‡ˆ3zkYlQll55<$9¤}klwE³\jneBUP E-"5—(l>O‡›Ü¸æJþoµPIEND®B`‚phpsysinfo-3.2.1/gfx/images/Vector.png000066400000000000000000000070171247443170600177350ustar00rootroot00000000000000‰PNG  IHDR $g‰¯µtRNSÿÿÿ7X} pHYsÄÄ•+ ¯IDATxÚ¤ [òÿÿÿýýýøøøùùùÿÿÿþþþýýýÿÿÿüüüôôôÓÝèÍâùÿ)' ûûûòóóêîòûüý   ýýýôôôÁÑâÑèH8,þþþÒÝêçôò*÷  ûûûðõûÅßúÓãòþüý#  ! ÿÿÿùùù×àéµÔõ6)$ íñø ìöñëïè ûöÿû 0$àèñ«Éã&ë0#þþþòóô²Îê ðøúèòý ôøûöø ãëù éì2 ø õúýùÿüûýþåìó   ¯Ñã¿×ØdB" ûûûçíòáðþ þÿ ûö÷úý ñ÷ úôõøþ' êóæôøøõùúÜåïîóö*lH!ÝèôÜêôüüüåî÷    ÿëæåÔÖßÜãòæìúüüþ (! Ôá þýóöøãìì57 ÿÿÿýýýöüÿ  ÿ»¿Õ¡°Ð%*&)2#üû íòúàèõ½¶× ã˜&Ûéûøûû.$>(èòøü* ÿÿÿ   ÿ ü÷üþ‚rAîôøëñ÷úùÿìÚ)&ã9)8üÞçô( ùý!  öõôþÿúÿö ù÷þéåíöëòùéðýïÑôÚñÿôùþ2*\çóÿçîô ýÿþýùÞëô$òúñäñå÷ð äìüÆÖÕìì -“íþøÿ4JÄÜùðôöòùýüûôö ëéíÑôòïò ÿÓÜ Úð½ÚîÿóøÿûL+Wôüàèîõøùùúâêñêâê1*#þþþ¥ØãâåäëôÃä¯á&í(ÿ Ô ëé¾2 í#;Aâíýçíóùúûõøùðòõéêë}”ÈúûýÌÒáÉÞéáèã0 êð÷îú ûüþü°6C'&ô,>ÐG%9 ÞèöïòõûüýøùûÿüÉÒÊÎâݼÅÞÿÿÿ©¹ßþ ó×éèéó äíýX7 üó#,|RYg9/Þ- õ0$óT0Oëõãéòõøúþþþÿýú¿Ø¼禺äýýýûûüÁÔîôÿøÚð"™Àø0"ôøR5 öØ%ñ öø" #3àëúëïôþýþÜçÑãõ×÷ÏßéïïóñòôæõÕðþÊæªÈÛáúýf> ÓÀoËË&ûøòî#Zûþ áçõö÷û²ÁÙììðóøð÷ìçëóö÷øýõÑ(ÿÿÓ·«à´=)µØá V7¤Ç$²¦š½¯Ã üºzWåðþêîõûíòò×ëÞñüdýöêòôûÿÿþë ãºæ¦þõ×äôyK þýðõc.Wàéùûûý ËÚïúT½ ó8ÿ þÿþ¨Ó§ ÷Ïàì4"A$úùíZ8 òùéíø øûýÒèçújÿy   ü÷þ ûþûùÝË! ¿ø$ ¿ÓêP(ôB- àëüþý# ýýýÝêòøÿ¡ò¹ýå 9,!òíúõßâ¹_òób®Ò  òüø£l#ßèô úüúñ÷ø×ê ÿ û% æùº/÷ XH%òë!÷íòÛWóþ~ü @ù”¹õ5)Éáëîø÷Ã×êéïñ ðôûØäêâíûíðïÌú'ïâ òï.ZD93"7#3ÆÓÙ 3 ÷û Üî÷ÓàüÄÛêíðùéñõáëíÝì ç <OÜíâ(ëMC%‚j0úDôìÂñ »Óú ÿÿþúûûÔáäÐÞãíôûüE õþ ï ƒ` 50"‡c2þM*& ÎÛö ðöõò÷öÿ$!ùåís<ãKC*bW4ƒOÿâéþ !* üþ  þÿþüþþ þäén0Ú|j4ÿÿÿýýý°¸Ô‹®ü+&éø üø1)ž¹Úïõú$ÞèãÑàiEù`T,ÿÿÿæçì«ÙªÀÌäñØ ó ÿ?8=ƒdb£»ÛÙÜâÚØ7%gV # ÿÿÿÿÿÿðñôÑÖåÎÖêßåîúúôTWB÷ùÿóðè1&%!ÿÿÿÿÿÿôôôÕáëÕìø;  ! þøóÞëøó÷úúúú9! ìïõèóüùùùþþþ8 À×íõ÷øþþþ @- ÿêñøýýýÿÿÿøøøèìïñõû( O,JÉ´Y]IEND®B`‚phpsysinfo-3.2.1/gfx/images/VortexBox.png000066400000000000000000000061711247443170600204330ustar00rootroot00000000000000‰PNG  IHDR üí£ pHYsÄÄ•+ +IDATxÚ ßóÚ2(ÿõþâ ›þÕðòþþþ! a.íôÚ2(ÿõþýýfÿçôõ œúüýýWÿúþ÷þõúùA ¿ðôûúûï÷ùQ°tþÿþ€& ¦üüeìðeìð§þýRí÷õýþµ ÷áëòøýüHAèïþÿ_âñ©ïö¾øýü`òõô KùùNüõí ûÿD üýýøÿþÿÒÿüü„ÿÿÿTôõÿþÔøöüûýýòÿìûûýý½ÚèéþÿþEûÿùþýûý]¿çêNüõŽãðüaêíHôùöüú Ø9ïôdÿÿÿ"¯ÿþÿÚ2(ÿõþKùùÿÿÿ®òùù˜øýüRéùù÷ìñÿþÿÚ2(ÿõþÌ ~éë öüú G-óë ÿ¿ÿÑæêöüú‹úýùùÚ2(ÿõþýýû» äë ÷ýûÿÿÿõúù  öüúnHîõ» žîöñöô*ƒûüüEìóÐÇêîí÷õ öüúøýüMVøü öýñÿÆ ¦åê’æíAîòÚ2(ÿõþo Ûîí¦ ùùRûüí÷õ  œúüÿþÿþÿYüôúø¶¯Ûîí“sþþþlýúÿþÿ  —ô Çô úü¡ › œâêõúù%–öþ#ñðCêñuô÷ûøÿþëöó üü}`óöƒææVïð’üý. öüúÁñö÷ÿÿÿ zþýüí µôûÿÿ øþü0éõ¸ Õëîþÿþ ´åê÷B îõøÿþÿòúË•ÝêŸçíHÒûøýü. ûÿœäñøýü©ôü0ÿÿÿúôøýüúúõúùàHîõ%Ndèòì øóôZ ø F ûÿlûùŸüý­íñüý €ïùøôú¬`êòÿþÿdóúøýü 1âóüöüú¥ìóÿþÿòøøøþÿªçôõøýüh ûÿûk óù÷W ö ûøñSýþ  ûÿÿþÿûÿ|ñøû_ÌÒm  ßê  >ëïÚ2(ÿõþÿþÿy Òíï éñôúúú þÿþ]QéñÿþÿúsÜñõþÿþøýü öüú¨ üüÚ2(ÿõþÿþÿº’æçÿÿÿÿÿÿøýü‹ #òöýýÊ’ñ÷ñöõõúùVQçëÚ2(ÿõþÿþÿÇ ¹ûûøÿL*äñûÿøúúüûÿÚ2(ÿõþÿþÿÿþÿÿþÿÿþýþþýþÿõþþýþÿõþ üñûýòü þýþÿõþþýþÿõþ þýþÿõþJY¿)k¶ôIEND®B`‚phpsysinfo-3.2.1/gfx/images/Win2000.png000066400000000000000000000101441247443170600175250ustar00rootroot00000000000000‰PNG  IHDR szzô+IDATxÚ ßïÿÿÿBŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€„ZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuZ­Z1ÿÿÿI9¸ {ÇïÏÿÿÿ¾I9·ÿÇÂ-cÿÿÿßcŒ®B¾èßÿÿÿßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€R€ÿÿÿ!ÿB½ÿtZ!JœÿïÖÿÎÿÿÿÿÖŒ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€€Á,cÿmsÿÿÿÈ;JÁ,cÿAÞñ9”J[s„ïïÖ)!ÿÿÿÿÿÿÿ­1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€Œ€ÿÿÿ1ÞU{ÿH9Á,cÁ,cÿ9ÿÿ+Æ„& ÞÆÒ7çÿ9ÿ÷1ÿ÷1ÿ)!ÿÿïÿÿïZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJs€ñ9”Á,cñ9”ñ9”!ñ9”[sçÿkÆÿ9ÿÿ9ÿÿ9ÿÖJÿÿ)!ÿHÌÎ&{ÞÿÿÿsÿÿÿTƒ1€øø€Ç„?Ô¾ò2ñ9sçÏÎýZß"Qð:°×t?kB€Î¥½„!Õ|Ç÷ê!÷ê!Ë÷k1& ”#9øø¶ 5øøðÎ ÿmžs€ø:×­ŒRݾݾÚ÷è×E èøøøø¶ð×ßOðøÞ¯¥€ïÿÿÿÿÿÿÿÿÿ’ís€ÿÿÿ€‘ð„’ís€BsÿÿÎÿÞÖÿÿBÿ)!ÿÿ:°ÖHÌÎHÌÎHÌÎçÿÖ1ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€‘ð„ÿÿÿ’ís$k9 ÿÆžó­$k90a„sÖïÆ!Bÿ!Bÿïÿÿÿï&{ÞHÌÎ:°Öÿÿ”€ÿÿÿÿÿÿÿÿÿs1€S‚1’ísS‚1€žó­-‹Zžó­§õÖ7[sÎÎY›½œÿÿœ÷ÿœÿÿ7dçÿ)!ÿÿÿOïOïÿïJÿÿÿÿÿÿÿÿÿ1)€¶’mcÿýïn¥žó•èÛhêÊ9Ïœ÷1dðÿ½¾ß¶Ç¶cÿÿÿèÿÿÿÏ:€!n¥oŒ :ôá:’í[óý×§­êÊïÏ:€çÇcRB!µ„cR¥€øÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿµÞ1! ÿÆŸÿï-d½ÿïœÿÿœÿÿœÿÿœÿÿ1cÿÿ½œÿÿ½ÿÿ½ÿÿ½ÿcRÿÿÞ1ÿÿÿÿÿÿÿÿÿ|­„—\­É¥çB×6ðø9Ïð)!B!ÆÏ¶€ßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿZsçÿÎïïÆïï1cÿ!BÿÿŒsÿÿ½ÿÿ½ÿÿ½ÿ¥„ÿÿïBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€„„½ÿççÿÿÿÿÿ)!ÿŒsÿÿ½ÿÿ½ÿB9ÿÿµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!B1JZ„ ½ïÿÿÿ)!ÿ¥„ÿÿÿs€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsÎÿÿÿÿÞ!ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿsçÿÿ”€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:×ßÿÿÿtÎèÿÿÿ¾ÿÿÿ°ÐÔ(ͤDIEND®B`‚phpsysinfo-3.2.1/gfx/images/Win8.png000066400000000000000000000016071247443170600173170ustar00rootroot00000000000000‰PNG  IHDR ½"sRGB®ÎégAMA± üa pHYs  ÒÝ~ütEXtSoftwarePaint.NET v3.36©çâ%øIDATHKí—KOQ€‹QCºp!ÑhÜø\šèÖ¸1¾6–FMØ¢+ÐøÀ… >"%¨H b ((Ñ‚H¡¥HKK™i äóL;ÕJD„]Oò¥íí¹÷|3Þ‡a¥Hì…?`ÛOH†ó=?yjöÓtßÍPÎ7üùNÆ$/Iï²üð0µsŽÍ‘Ñ5Ii•J]©›±;”n‡ÚPw¼AI¬ctM-Š¡UãH¾¿ ÔÃZÄÏÀþYHuΑÕ죤Zá݇1ÚÆ¹uÚ‚º¯u{#£ u(Z‘¸|áB‹!êž)[fÈëçu¥B{‹ÀÙ^ü'¿àßý%©e™Q@IµÐüR!?N¿ª¥$ª@º•@R=Êz)¢ ,„þ}ëÂÌøW¢ œ´à–˜@L &°:]ødÀP’yÞk$Ò¦ Týð"'"­Oèsp¼ùh9ÉŸ¢”xð^ìÇ{æ™Y62…l;öÜlWØ®b—«7Y§É½ëÂvljýžP膱Ýâc¦c†òKÊs©¸,\ûNeÞwL•*FØ —EÏ7#Ýôæ{°yè+žÏ„2¡\¡Ï¤Ðß9N½cšìZ›Y¸ïáÝ 'Æ›‚ô5J_c±—ç*JuÊUL& ?¦æE ^/ŠSÝúO ßöà4¼pŽW¤M=×Cw•É.>‘·8ˆÖÙ.ïµ…JG=úßa7M"°ü‡ðc”å8ö7Œ ÄÒ¾â“혶 nÇ´Äðë|VEÀ9Ë½Ö ª‹GèÈàó+cÇ:ñï’]ïæ¼º\P*µk"C¾Œ6Éáb¯d¦;´Ýò/ÊF¨Ï¤å¹óû ò÷´¢l¹øW¡l´bÑø«ÀRÂ>Á–žœž!Ç2EuS€Þ"_³úpÿÂèv9”4%¡óÂJ ,2pÂÈ$‡ Ù>ËíÎIŠez[è¤åªƒñ´.  †_#v7–Çö`ŠIEND®B`‚phpsysinfo-3.2.1/gfx/images/WinVista.png000066400000000000000000000052031247443170600202320ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs ð ðB¬4˜tEXtSoftwareMacromedia Fireworks 8µhÒxtEXtCreation Time12/28/08ôGj ØIDATXí—kŒÅyÇsyç}ßóžsv×{‰w}Ûµ çB‰è"•4D1rÝ6 JƒZµ*LPEoqD/jú¥HI‰’´jœˆUUCTìbãµ½¾¬mv}ÎîÙsy¯3Ó 4AqÕΧ‘æö›gž™ùÿ…÷ž‹-BIãò›¨%;ˆkׂ˜^m`ŽÁà²Á~:óÞ»‹žóbÄænyëÈš±¦&&.[³¦Ù¬×eh yQ°Òë¹ íöʹŅ£íVë ¤û†Ÿ}úµÿÀäµ»&Ï/´ÿ|bÍØ§/ß²UnÞ¸‘f½ŽçoŽB ¥Ä{ÏJ¯ÇñS§xõج[Xjí]·vôþÓOÿÓ¹ÿ5@㪛wyõл§7^¶u+ÖEs?]ñ¶qR Œ1”eÅ«Çf9ròx+ õç:/|gßE4á“»«Ò}á½—\ÊØðYž¿±[÷xB¼±Zy ÇRBc¸°´ÄK³G0¼où…oïù¹£×ì¼·?È÷\±i3QR–%àpÎS:Gé<þÅ)0J"„| ä§câ£5ižshî8z¸{ñ?ö}ñf®¿}Ç™óžXKl •­Þ‘Y‹wŽõ‘gÊxêÊ“yÁ‰Tpr¡V„ZoDBü­i‘3·xžkÇn9öoìÀ-¿÷'ßûÁs¯Õƒph¨c­Å{On-3‘ç®)Á¦š n–H¥H=<·äøÚÉœSË9µ8DHù3óCIÉJšÒ«ŠÎ ×¾oÛþ¿ÿ‹ýf‡g~|èAoÝP úé¼Ã;Ër^pÛDÂÕI@_è0@›¥¡Ü>®8ÔY¤ejôÏ-S•Úh„XÍïVQT`„ÂUvèÙŸyø4€øØ]»g:½Ám¡È+KiEeÉŠœÀæ¼§a°¦F­Ö IêÔ’ˆ¨®‰’EoùI»Ï­¿ÿA~íŽ_bݶõèÀà½e‘Ã’æöq†7 Óf¥›Þö‘Ûï™y+‡fOÝQUN†‘!ó¼G Èdk-d‹Ì m˜R§ˆ$CF%I\ñƒ—bõ ¦&žDÇ)ã›CæÏÄ´ZctÒ„N!k!³Ρ¥¤,KùŸ'æïþXÁJop#BR9¿šÉ2ï)¥`»zdáÜ$È&ã ‡AÆÐlÂïF\reÂX"É=¬9N:Þ'!ƒ¥±²:3t[)Â,à…¤ÛOoþTlÉ?ó+T(¥B(Rã…Àz¸39˶ќx& ¹QO Ô˜@5*øËo ñáߘar¼‰³ ïΗ•%Í .)Yšo ¢'ð®J~ôã—^ÑsgÎשּׁ«« Ä«¯”XgÙh2®KV ôœ\´,·<ÍaÏï¬ûÅŠ—_ŽYÒC\uÅZª*#1…ÍT=êñq(Hª„ÎâÊD ÍjBJÍ{õ¹³‹;õ ˯sHè©4Z¼y›×óÍî0O·'Y ×¢ã.ícöÏr×5'©’˜K?°ŽõãcÌ/´ˆtF¨c"›aX!Û1y§‰c|`°Þ³¸2—Yi¯ÓÖ‹ B(mPJ£…Fã «”Óµ­ìÞŶ­›ù𦠶M ³a"¡»|ïýËwyò;ßçSwWè@0Ò¨QئИ@E‚d¨‚£ |Õ ¬G8©(ñ[b•Á£6h©¤2(mÐRc„DØŒ½ûÜä&êµi lÖG’÷l^ÇU÷Ý͉ãyöÉyv¼ø»>¹Ž™M†ÔzZÏ‘ã5޼:ÊàÄA=Aƒá,¥”Ê ¤FÇQ|ZëþŒ–Fj”[å˜Ú"ˆ±iŸ,ª“U–¬´ôòЬtþþæ'®ÿ•«ûo“d¿uÿ7w¼plùQ5k .ÐøÐàŒÁ´%¾d;ò~ŸIN±N#p9í2át>Á’c(ÔÔ´F:‰ª{âØ½gö>÷£ÆXsí/£À;è¼u»” ™.‚´†par°9Ø‚ž +<‰Éó3†¿óì]›¾³í‹Kþ¯ê¿8vw-´“oùfM›æ%ªZ"…Ès‚É‘&Ç™ëÆ 2Pé⣃›/;õÔ׿v ‹vÜýÏOÞ{ó‡þìȆKïšýßßÞ{úáedzÇWL–›&ÄC ¨Ó»¯•„A‘¦„8EyŽ0l†u%Æ ŒƒÂ ª‹W>ûüá'.;}ŠJUÜ´l`èúo>°m÷á—W  S«V(Ò7qjæüL˜6lýÃÇÏ´:£—¿º @Ù¿¥$ uâ(ÁöÀäkÈKÈ] ³4,¹bÛ‹?þÑgƒTk‚<Ìèºi|¢´É'pãÔ¤&­eø²K³1S@÷l/\÷éy9Ð!Zg׋X#t q΀ÉÁfë(,Š,àU5ïý¿?Ú>=}c  Ò@\—„(£ñ(!®cJƒ5`Z:Çýó¯ÿd@üÄæUxÿ^W q*cÁ[àÌ9ù½ 0 ¨í{þ7ž^ܩϦidT,‰ãˆ$N¨è „WœlZâš‹wóQü|€ƒ[¯e!‰+ cw¶cÎ%ÈQÔôyÛ^xnû¥y·•ª@iŠJC¤™[kA(Ö””²é*ýæŠ,Ã(›½EK}5Ä@?"iÛÈ¢ Ec!wPð*eõu7½Ò;Tÿ¸µ^DUi@iÞöÈ(à]‰/Ez´·¢rí.€·'á¾íáW{Ñîy²±Y¬×…+PR¢J›Ø²É :=(ËxBÜ»¦™?ô£T怈´@i…ŽBíy¼lVäKÿå7>53`ú™o­îÍFË»!ÙËÔÑG³zó•‹£‹×m0} ž´Ë®¥ú’œžX'Ë_Þcþ}Y§ÙN“Ê9¹cPJ "‰Šæ¼ 8ÈfbhlKñŸXÒÝyøÕ‘;®yrð÷šê×>vÉÒEÕ?ÞÙ¦o¦¦„™Œgôù÷ïÿVå{öò‹ï« \µÿ»»öýnÞ1 /ƒ<çýœÿsv”¾Ä™g%½Fä§j/ðG‰½#÷ÑŸ,uþ}«©ö¤Ê"uhu ˜Ê~çìƒÝ¿ý”žü·[nzù«Ÿ®¿ÑlÝù!*™ó_Æ ´œó?ˆH`‹k¡ÈJlcpöz÷È¡y½à¥WŠh¬a¿æ¬½º¢åpE‹š/ƒraK!¼ Â.í´ìБצïzøÁ žM>÷V—ÿÁ²¥ïÙ+ã¾6Zú(‘èâT¤Yzò̇Ùñ¨˜üï³K¿{׫òy <ù‚¸L«h¤¿ª¨$‚HÍ•šµàZQo7ö/Ÿ{}víS#ìÙÿ§®µ“[ÿÆÿÊ~U!ùŽÿ'Á‡_õýIEND®B`‚phpsysinfo-3.2.1/gfx/images/Zenwalk.png000066400000000000000000000062131247443170600201030ustar00rootroot00000000000000‰PNG  IHDR üí£tRNSÿÿÿ7X} pHYsÄÄ•+ +IDATxÚ ßóÿÿÿôàâÇ–›p²0IAœŠžñ õçëÿÿÿf§ô ýùöóö/ ûYG-78ÿÿÿ໼œÍñè ýýþýýüüýýþýýýýýùúúÿø|M(>>ÿÿÿäÉÍšÍóüüüðÿýüüýþýýýþ÷øôýûüýüýýþF õl}iÿÿÿÉ¡©ºûýýýþýþïþúùùýþýýýþûüóüúûüóüûúòœlÿÿÿµ™«Ô!üþÿöÿýùúóûúûý÷þóùýýýþùúùþýýýýýùúÿóŒŒkÿÿÿÉ¡©À#üüüþþýöÿýùúýýýôüûóøýýþýýýþùúùþýýûüüûû+ó~‰kôàâºû ÿ  ÿûó(ûì$ùéþ÷ úúÌÿ òÛ×ÿÿÿŒ†£ôûþþþþþý$óàPiRöèé±£³ŸáaÿYudÿÿÿj‘¾þü ùÿþøíI&HB·™¤ÓùaÿYudÿÿÿïÐÏu»è  $ùåH4 :9໼f±á<þã&=PD0-æâêúúúúûûú÷ýñæCýãóçùõ:9 EDûÄžìaœÊ…wäïòúú üc-2T]GϤ§úÁõ œãéóÿö†T&78³ÓîHþr~eïÐÏ–§ÁÐâï sO !$-ÄõeS901{01ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïââKk—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAг‚ò[ñIEND®B`‚phpsysinfo-3.2.1/gfx/images/Zorin.png000066400000000000000000000101711247443170600175670ustar00rootroot00000000000000‰PNG  IHDR szzô pHYsÄÄ•++IDATxÚ ßïÿÿÿ²>ÿÿ¨\ÿN¥ÿÿÿ«Ê.ðÿ.ÿOãm/‡ÿÿÿ¯×þAÿNÂ4ü’ÿ"Âÿÿÿ°ÚÿÿôŒú…ÿUý·úcŸÿ9÷wÿÿø¥€ÿLåÍäet ê’ÿÿÿ´(ýÍ ÿü¯|ÿLÛ«Wz+ÿÿí,ÿJèþ‰ þ·þ6ÿNWÿLÛ³LƤ*ü…ÿÿÿ¹ùàÿÿÀ€ÿN²>ÿ€@ú ÿGçÿÿÿ²aÿÿ˃ÿM´°0…ÿH²ÿNOÿÿÿ¶ûÔÿÕÿ†ú©ÿUý´%þ„Qÿö3ÿLØÿÿÿ±nàÿŒ›ÿ3û´ý€[ÿÿ‰ÿOy›êüÿIù«{t ÿìÿ‰ÿÿÿ°`ËÿL¶1nþýaÿÿÿ·úÒÿÀNDÿþÿIò~øÿlÿþÿO¢½üÿœÿOÖVýnêœÿÿÿ!Ò ½p>ÁIEND®B`‚phpsysinfo-3.2.1/gfx/images/antiX.png000066400000000000000000000113711247443170600175540ustar00rootroot00000000000000‰PNG  IHDR% •S±° pHYsÄÄ•+«IDATxÚ _íÿÿÿÿÿÿÿ4 úÿ üþüýÿýðèìÏêÿÿÿüÿÿÿÿÿÿÿÿÿÿÿ.ý/ÿýýþÿüþýþÿýÿúþÛöõÖÿÿÛùÿÿÿÿÿÿÿÿÿÿÿ.0ýý&úùúýûýþýýýúÿýÌöÿÌâÿÿÿÿÿÿÿÿÿÿÿ!AêíAùû ýþ÷ÿýýýÿÿÿý ßðÿÒÍÿÿÿÿÿÿÿ Hóÿûýùþüýÿþùÿ íòÿÓÆÿÿÿÿVV Góüûöýüÿýÿööøþ )3ÿÿÿÍÿÿÿÿ¸Ò8öü ôÿûöÿüÿý ñþ)(ÿÿÿÿÿÿÿÿ  /ýßÿýüüüýüÿïýî)ä öø ôøë8¯ÿÿÿþüÿ8úþöýü þþìýýýÿùüýèò ûú\þÚÿÿÿËÿÿÿÿÿÿÿÿ!üþþþÿÿÿÿÿÿÿÿÿÿÿÿ ûõúéõéÜÿø Ò û :öüúê÷ûè,%ÿÿýýüýÿýþþýÿþþ ÷üÿýþþþÿÿñ ûûDýõ&ûñäÎý A÷îùÌ1þèôÿýþ'ÿùûüûûù ýø õúûýýøÿûüýþõäÿüýöùüüýöýøïì ÷ýýÿ ïâÂCûÉþøîÌéü"B þû÷ùõ úúô æý !Úúá,ýñÿÿí÷ÿïÿþøèÿýë øç úûööþþüúoþü™ÿEÿÿÿæÿÿÿþ%èýüý ô·þóûò5ÿúûûðÚõÛ2öýþ÷ ÿþýû ùÂÿùûÿüûûûè!ùBþüÛ1Ûüüøìøñ"ÿù ü!þôßþü ìþÿúþûÓ ý ùì æûûþú$üóýöè)ýøþáÿ6ç;OýýüÓþûþÿÿÿ úÆóÿúþøþøÃõè ØÛÙæÿ ýû÷ò þòþÿÿ÷ Õ KÍG:©åýêýý ýûé éçòüüÿü þùÿï!ðÓ ßíí÷ûÿÿôõØý'þýþõ åÿýßÿøÿÚþÔþýüþþüüýüûøþí îÿÿ÷øÿþþöîûûý(óõþÈýýûýÊ< 5T!úÄÿüüÿúþÿ÷ ùùÿþÏþý ù üôé ö ùûýþüþ÷ý÷¸3ñøû àý¾ ï5ðÅ)üùÿ%þþüþùýûôÿýÿ åùÿUüúÊýúó'òÜ8ûú­ù÷ûôþûÚ öø>þÿóòýýùêëÿëóÇóü!ÿCÿþÙÿÿýþ õþÿ#ÿîãýôïKÿõûúøû ÈýöýüÿEþûðöù‡ÿþÞþÿøÿýöÕ±7üæýìüœÿ cþýþùíþüýÞýþù êñþÿöú÷%ÿöÿö Üõöýéÿöÿþ üéþìúÿãõÿéÝÿÿÿÿòÐÿÿÿÿÿÿý B , îÿïò øÿûõÿøýýúüùùöÿþüúüþûúüÿüþþúþûó­ÿÿðïÿÿÿÿÿÿÿþÿÿÿ¾ùüú%ýÿþÿüüþûÿÿ üô ôùþùýù÷úÿýøø»úÿðïÿÿÿþÿÿÿÿÿÿÿþûÿåÅ ûÖøúþûûúûÿüÿÿÿÿÿÿÿûÿüÿûù ý¾÷ÿÞáÿÿÿþÿÿÿÿÿÿÿ)&ù÷+ ò ó÷ ýÿúÿþÿÿþúùÿþÿþýú÷øþ ý ÆóÿÎëÿÿÿÿÿÿÿÿÿÿÿ.õý,üûô÷üÿÿúùþýÿüùüÿüû ùúåû!Ôÿÿ¶ùÿÿÿÿÿÿÿÿÿÿÿ'!üü ýüüûýüþýþýéûÛÿÿÏðÿÿÿÿÿÿÿ4 îôóöþ$úë÷ÿÿªýÿÿÿÿÿÿ‚ªLbyÖªIEND®B`‚phpsysinfo-3.2.1/gfx/images/elementaryOS.png000066400000000000000000000017331247443170600211010ustar00rootroot00000000000000‰PNG  IHDR ±ˆ?¾_PLTE€€€ƒƒƒ‡‡‡‚‚‚ˆˆˆ‰‰‰†††………tttrrrŠŠŠ„„„sss‹‹‹iiikkk333mmmDDDuuuPPP444\\\EEE}}}gggqqqŒŒŒ;;;"""wwwppp 111ŽŽŽCCCQQQ!!!eee:::lllMMM$$$|||AAA~~~ FFFXXXnnn000...___<<¿yfŒó/ëYë]mÞ¾¾óþ5Ã$™éIEND®B`‚phpsysinfo-3.2.1/gfx/images/free-eos.png000066400000000000000000000032141247443170600201730ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆ÷PLTE@hJM‹JMMO‹LMKLNQŽPQŽTSUVŽYZŽPPRU‘UUUV”UY“Y[”]^™Gl€Jl‚]a—^ašRt…Uv‹WzŒZz‹Wxbdšbl›kkeqœisžrt“qqgm jk jo£mn¢ks£m{¡d}²qq¢ss¤rt¤vu¢ww¥r|¥t{©{{¦~~ª}}¬y°~´]~´`~Àrc”h†škˆ™k„¹oˆ¾t€¥v…©}ƒ­|‹¬s†µr†¹r‰½}„±}гy–¥z‘¬š¨uŒÁyŽÃ“Á‰­U…±]‰°\’©Z‚µa‰²a©—M¦›T¹O·ŒR¿‡Z»ŒT´“N¶“Y¹‘T¹‘Z½‡oµ‡xº‡sºˆr¸œjÁr‚Å{À†[ÃŒZ‰bÉcÊ‘e‰‰—‰š””ž››ƒ„®€Ž¯‹¦ˆ‰ªŠ¯Ž®„„°ƒ‹´„¹‹‹³ˆ´ƒ›«…‘µ†‘¸Œ—¶Š“»˜¾“‹£‘¬™Œ¡˜™©’’²““¶‘–·–—º”œ¼™™´›œ½ŸŸ»½£µ¤¸¤´” ¼¨¶•ª¼™¯¾–´µœ´»›»µ›º¸¡Ÿ²‰‚­¡ «§¨¬©«¥¦¾¯®°¡µ¿°¯²²±µ½½¾ƒ•Àˆ“À˜À‘™Á–¡Áœ¦ÃŸ©Ã ¢Á¦¥Ã¢ªÄ««Ä¡µÀ¦±É¦ºÄ§½É©³Ç«³Ì©¼Æª¾É¶´À°°É±²Ì¶µËµºÍº»Á¹¹Ï¾¾Ï¶¿Õ¼½Ñ…ʼnLj‰ÈƒŒË‹”Ëš™Ë¤Ê­Á² Ì­´Û¼®Â˲ÄεÈθÈδÁÓ¶ÈÒ¸Â×¼ÅÚ¼ÌÔ½ÌÙ¿ÐÚÀ¶‘ÁÀÃÄÆÉÈÊÏÄÄÔÃÃØÀÏ×ÇÈÖÂËÙÊÍÑÊÊÛÂÑÛÏÐÔÈÖßÑÑÝÈÒâÌÚãÎßèÑÑáÖÖáÖÖåÑÞåÕÝìÙÙåÔáêÙåíÜåñÞêñâáéââìääêååìêêïäíóéêñííòîîôðïöðñõõõ÷õõøøøúûûýþþþÌRÙ† pHYsHHFÉk>;IDAT8ËcøC0 ð¾^ýóyåŸ?°+øÜúk çÓlÞÏþ|ÁPpã×m&]Y&f&i&Ž+1ÈJ2I;W9‹²±¶}ÛúIÁÛݵXÔªôeìšZìdô+Tx~!)øÌÁ$P¥–S¿}ÖÝ)sæ=l«VÁ£úîö¨‚Ÿ¾È TËŸý4/sú¬Y—¦Åû%N’©âgãøU𙓃¡Úó¹3.Ͻ¹mýŠmùSƒMÉUñþ†YÑÁT%ó|V挳•KV»­_âb•êsH¦ˆOÚðHÁÕf-½3·2ç.[ýêD/Cÿé7+œ CM'êɰÜ›ð‚—©ÊæJÖåg^nx)æ*ñjÛ]Ž5áûÔ‹w[±\Ày]úÜÛK>MütÚýÅÃWk>-vŒöŸàÌâøáÏ}nc™#7U¾ÞøòÓÆŸúï|ºsá¹CFÐA}Ù/@~6²©ï ›_õfͧO'fï¾÷éÓšOå Böʉlþ ´â³h©mBªÇ’ë–Ížø¼¯»ûÕ¹—=žÉ{lŠX9¯2üÙÉËRd›æ±äÜÉ;ŸN®ºóiù³ë‹Á ¤AŽü±R T~_˜WÕyñ²G÷:{g?{ié~¯bAÈ~¹"–¶_ +”eÖ8ô KI–=útÝURHè˜C]ÐA9}V' ¾È2 ØMö‰µ^|ýôËO ðèØùÅN±\x7ƒêÃþ*õ=Á¹gß\8¶qíÆã×ßœqª‹Ø«WÅ$ðP×XT´'™$å8¬6áÓjÇÒ$ÿÉúJÚÍWA ~ˆòTÉôNʳrYqöÁÙ.Nµ)Gdª—Ãbó·O•üAÿ©EVVžùS£üÉ-âgçúUð™M¤Bæp‚_dJ\L\J0ÁÈUó«~|ÿªàÃíwÒ|Ujö‡÷›™˜˜$ì?l¯VÅÏÈû)UÿâäP«Ð“±ïêê̑ѫRc2ú°ã’‚ï[¿50±K“}q¡4S¡¨FÎj7|ÊÍ"ÊÈÌê¬Éôôç ÿÑYöŽ­ä1óŽŸß±gÞ·þÌüúgçwܹ &+=„{EIEND®B`‚phpsysinfo-3.2.1/gfx/images/gNewSense.png000066400000000000000000000137711247443170600203750ustar00rootroot00000000000000‰PNG  IHDR/ ‚q!y pHYs × ×B(›x«IDATxÚ _è€ÿêU ð7øÖÿüí /ÿ Úœä€ÿðA3÷ÙVô½dýíþÿ÷ÿýÿþô¼ Í OÓ¯¨€ÿÛI Ãÿ›ñ´+÷òú áéöòÿÿüðöÿÿø)ßJÓèqòñM ³íÿ€ÿÿ@êâ‰øÒh½î áå ôôþùúýýäö)ÿû ÿñüý ÷ìòÙþ÷ÿû=: ÿªqKýI°­€ÿé }¶YÑíüíöøýúþ ÿ þÿüþûùòëýù& ÿ#þ ”¤ÿè. ýÛ~ £8áëÑíüÿ ýÿïùþ ïþøøþîÈû ÈñÿW,ÿÿBIèÛK÷áhóà Ýêõðñòÿý ü  üÿÞðúúþ" èkûUζÿÿRþ¼výpüçÂüüöùþýÿúýüúø ùùí!ñðõóú÷ÿÿÿ÷üööã$ô$!5Œ¶ª€ÿÿù#ýò–ÕÖ• õø øþø öýýñè ø øü ÷ûý#~ð$öÿZÿ«êðôîÿþò÷õ÷çèûý ú þüòþ úþöýõþèôóþÿÿþ ñ¬öÿý\mùÿöþ×úòþýø]ÞìÀ€ÿÿj ô÷ ôÕþ¬ùìcùïgÿþýÿññûøüûùãïùÿèôÜéïõþþ üüúÿø*5Ûþþïðþ  ôùp rÒž€ÿÿ³ýé6ºùü­ö„Zþ@øÿÿ©ôuîÌÿ ÿ ÿþùùâá×éÖøßíþ úÿýþýþ ö!'ä ø$^ì .yÐðÿÿDþ×'ññåÈÉ$îîþ úÿ üü ööÿÿ ø úþýüýòõòõèí ûüÿýûôö#%à*W¯À¾þK QÚ ¨àø?éì¼ý¶¸;úüõõþþþüÿü ö øüûøú ö&îÕáüÖéþúýûí0  ùê'#)éÄù¨]‚0MaXi± .Lþ½ñ¯°ù2ÛÞ"ýÿþþÿþøüþü ôÿôö/+æþ  úÿëãæç×ëïñüþÿ+ûþüýúûíÿ€ÿÿ@÷7ù§ôþÉ L{ü³ä¾Âø¿@ûûøøþþýü ü ôþ þ öW6ò ¨Ëìøæîøÿÿ þ òøò><Ä ëþ)  û€ÿÿäé,ôÕ¼îæÂúºÈ´Ä ùú  øôüþþT9ö#ÿÿßèìè—¬øö÷úøüùûü öüüü þý òüüþþýþýú ò83Ð,(‚åÿÿä2í J:üìçþÚÙøüø<: (&üûí +ÚÛ8%þööÜåÉßþúþ øðúýøûùúêýÿæé ÿÿú öünhª”þù!@úùÙñ÷ þY@î¶ýðòôé9þþÿüI3ùíèß( ìýøþ> úý;OÛ/{ü÷þèÅûàõüäôÿÖóÿzu˜ê€ÿÐãqé¹üäÿÈÒÈÑþC;ü%!ÿûþþÿûÿÐÖÉÚþ ßêõù(>"úA©"í^<¸úöÎòô-úûÏÔîçòòòòôô*5üø÷Òâóø/üìE  á×gÄ÷ÿÿó ù@#þ üþêîÒÙþùíÿðÿñÿôÿòÿöÿ,!þþþ4ü  õ&dý c1p M÷üû ;!ü øöÛæøÙäþÿùûýÿþÿßîþäôüø"ü(ý AõF¸¦ï@zòàŽèË ðùüÚðèàôóßýöýò óüÞôöò  2 "ïH¬ýÿ|$ë’ÿÓSïþýëÎýþ üöóöòüùæñéØà öôä ùöüøþý ýñ,d™!í}µÿ-ø£ÿÓQÿŠÛÅÏüÜâöýúôöù êôþû öö öÐËÜáþÇøE2ü=G'ó!R¬ðöÿì×·ûëA»ÑEýý ðôê>CÜ ü&#äüü üãã½Ç*ßáùûÿøÆÔø=WÊBµÃûÿÿq+ÀX`}ŠäKêïãè:6à24íþýþÿÉÌ«µ4ôó øøüôö€¸+swìÿÿLýÿÿn%ùæ…Á»·õéóèòÜåÌÕþàýÿÕØ"öù ü÷ú÷úéó÷Ý3þa8ýÿ “’Ûûÿ  ?t«?lî¶ÿÿþÿÿÿÜ0ÿÿúøû€ÿÿnAþý;þûüýþXÿþýÿÿÿÿÿÿñþú¨Å’¿€ÿÿq6ÿ ýÿüþÿöÊÝò~@ hZ·IEND®B`‚phpsysinfo-3.2.1/gfx/images/iycc.png000066400000000000000000000031441247443170600174170ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEØ  ©GÏ“äIDAT8Ë]•KWÅϽuë]Ý]]3™—'öx˜‡güˆC€ÄãD8‰"… ÎÂÙ`ùðI,…-À HX$‚Ȭ0‰…ȉƒm"ð¸==ïég½oÕ½(FpVgõÓYÃÿåÆˆÂHpÎC.ŒÛµß¦±Á ~)êëZ?ªdõûZÖ#¥ŸÆIœäE®¯]»öœÃ¾)ׯ_ÇÚê3MÓóþ:³ø¥B”¯ŒÑÒã(Õ™[è’sðÊ…“N ÚŸ ð~íþQÕÝ,Ë»¥,ËËï_þ/øÃŠõµ5ÃñœIfó …-¯ Äè¶±m³=»ÏG"eKt†BDé– êåøD~Z­<›ö¦n;Ìþ *Ü—y™¾÷Ã÷ˆÀ­Oo1¿éO‘ÃÞäjÇÜ9Ó1·ÝÜ* ƒ1¦‰PR…Xňu‚A=ÂA|ù0Ӌż¼°úÚø¼ú/“Uô3V೪ª2ã£_|„ |#ß»ÉOžØ[gœžgÙ–Í&k xÜ…Ã,pÆÁ‰AJdÝ•Y³íö±lYÜàS³Æ´Àß,óòHLDÂmxkc;¹Ò±·Ïöݑ۰¼ip¸ÕHd‚2) ô÷ú‹­W|X3ëYó·t' Xðæ%ëµnøû"/²°dòím:x}·qè6­Ÿm´EŸ{`а×ÛÃxw€q¯²H`Ö­é$ vÏ„5±»gÞ¡?¿°À½sÖ:õ¹`_íì<ÛxŒN9a“ âš>&EGYØÜ|‚n÷”QcnbÓÕ4z/ Îïâ¨êa4îÊZ"`£kß§‡ ‹baC4¢Æ[¬!¾U3XÅAŠ­n‚é—&`Îï H//‡nrìgغÿ$Þñ¶ÎQÛ#¨ž+R?çèqóu|÷œ¶Ø-5aù.Z²VÛ‡úì÷‘ï¤xñÄ‹pç}ôøÂ6`®¹0T i€l†Ü¬Pê5j¶Ïö]u8/ˆa1a©[s«i¡…`Ä¥Æ}4«ž]<ô¿BÑ.áZøX – Š7GÎ (Fˆ)ã¶ÐÐ^IRº@ªsÄ:-,󦧡25îíÜÃ'éMØM¯6.«ÛЙ‚$‰œH½UŠ*TB0°^¦s/©X0aÀ€ŽiC« ó±8:]*TR¡Õq°;Am " €`Á„ §PôÐ#',ê²=¬‡€IPPÈ(‡ÉL)CÈ"|ïÄNŒ±J°;<ĸâPõP¥%œ#ÊeQ…5Qx$j©nGVx’ç˜íÉžP~Ü(áj‚Œmí+ gSÄs†:Æ0¢·ÔGŸ ‡ÜmŠ´+(:lçÔª¨ÿ:éEǫɵ/ä—é,¯+˜0a¹ ²]¢tФ@ÚO0ʇ9#d^ŽºUCž­“!,=³ÕïÆÛSìiTµî,ÓÂË_ׯ¼oØ<`qAÈ¿NÀƒ1kB¥ É Æ¨Ž1j¦ˆýŠ+4LýmöRúÆÒÅÏí-ãŽÈÒ4 ½öÝãâØÙs8sì³Ã{ÍÑhl™ÁÒG1˜ÍÀ¤ )$†NŠdRBz54ÓÏOÝ"¡×h©|׺Ô97½þ©Ø‘—…v³²Û ¿~Å?¿\ðòâÒ»Í#} °LLYÕ$T¶‚ô´ Ðv ØdêÓzµüçhU/Þ2¥¸ç騸ø“ñÁ•”%̾gx»sάRkªìänŠŽgÈÂ’Õ®‚æ€Àˆ‘ “fõdý&]L/ó<]×+¿ò¥ûóº¨6K)ëçjºùË›, CÏr­µ¡_îîußí8;'Í<ñ·Íž ‚†E&ÚhÓ[ële´Œ“_Fux‹•ø]Y–ãÃêê¯þ¯óN­œgÜ´k† þ¸l#µòscÏg:kÖЦÅÌ"à~?bá¿\å܇¤?•YñUQ”c¥•úÆyÿJg!©MãGLIEND®B`‚phpsysinfo-3.2.1/gfx/images/openSUSE.png000066400000000000000000000016141247443170600201310ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYsLåLåuÎð•tEXtCreation Time12/30/08 “5tEXtSoftwareMacromedia Fireworks 8µhÒxáIDATX…íÖ]ˆUðßüwK°"èk‰ XÔÙ”ìK„PŠŽ% ve„ZD£ÞQtq *¢.Ê®Š.‚¤pObX–‰Y*©Ä ƒH*+a§‹™]ÿ-»îJÛÅ>0pfæ=ïóœwÎûÌ)êº6èL+ûŒ€3þzÏ$¸JåBÜŽ%˜ƒÙ8£Ø‹mØC>ÖÆ_‹cÈ»ÆËYLä„U*/Ä=¸ ×à"œ5Fè~Çø ƒ˜{ñ-¾À§ØCÞ?¡€*•`Äù§U9yœē1ä#cî*•àÖO!yÂó8Ö^‘Q¨>({Ô^Ê)"­Q´ã X‰ýø7aÕHªTöª N!ù0ÞÁNÜ5ý 7`ywlÆÍSL^ àZÌEÆCx©¨ëZ•Ê»ñv×ÄÃø—á’)³â8fáz¼Õ©RÙÁSmÐ÷XCîÇ"çèííó‹;ð,^Å:M»nïÕôöþÄRÌ®R¹WùÍçX[° nú¸¿+áaloW³}]ïþÀÚ¶ëÓT±hIRïáд“Þ‹!S¥ò8~ÀK¸;k®Ãr|Ù&Ú…%1äP¥ò\<ƒÕm®Ý1äW&S–zÚñÑ*•—ã<<C^‹¿àåò>|ÜÆ¾>L1ä_cÈkðBûhÒû¦ƒ}íxY ùvãÍ*•Cš mÁ¢ui^™5V²VÄfÌ­Ryç¤ôöà³vÒÓµz±Æ~Wh¼ýF|W×Ä·jªòîx cÈ+5{âÊ*•gO$`¸ àMù?Â[ƒ«±j²ßôL1bÅU*çã9„Q1cÈO ßT©œ£±RP+j56…¬]õÉvNÅòäntÖ§bÈbÈË4ÿù[p.í&tk©›6…ƒ£sþ5š\+n, ÎkþóE»‚a›êºÆEWNöÄ'>üטö3ጀið7{úó˃ÂÈ!IEND®B`‚phpsysinfo-3.2.1/gfx/images/pfSense.png000066400000000000000000000022211247443170600200660ustar00rootroot00000000000000‰PNG  IHDR szzôsRGB®ÎégAMA± üa pHYsÃÃÇo¨dtEXtSoftwarePaint.NET v3.36©çâ%IDATXGÝ—[ÈUǧ²›V’]LìFE=Xd¦YZA‘X DJŠdjE’YTP–•R¾He•A¨Ÿê‹èƒDQ!âK‹++µ2µÌË×ï7î5ìÆï;ŽÒCøqföì½fÍÚk¯½OñTw¸&Àcp´¤à\¸.„“¡‘΂—`+„öÄ è ½ Ý†:ž‡ °4v~‚¹0êFúÀzˆ—æ8^;^‚·á4èTÃÀŽuCÁ>˜§ƒº¾ƒ¼Ï/ð)|› ˆ¼ Fô>ˆ:òwºÎ±ýiPS ÚÿH÷çãa·7ŠbÈ‹Eq ÷~Ô×ý´ï”T2¤&Ïã° ^ƒQpôCì §CÎõÅð&hôO¸ JÑ8öÍ.Šé©É„½°ÆÙ0ÂÐhÇ%:° Á ôØdÍp_ •èÛ‘NÁ—°ªZ2ÂÑ>,ŽMÀ`¦ÇïAî€Ì„JôíÈÛAgÇ—wIÀo Ë{ ŒN~€`F_Ê#ËòïPwÀì®J-}§ÃJ¸Ö{t|ö½ß†æ@š]8 Úß*Š÷ ËH2û.²ÌuûQÖ·Žsû\†[Û]Áâ¶¢ß"8*]šÝˉõPŠöݼ¸÷rþ-­a¤VD_øXØòR¼¬;GèNp)FÇUò òeXýœ¾]`…¬?¯£3ÿ ]îãÁÎ{`,Œ„ÏS[`®<nÕîžVÈ›áˆ/ø ÖÂ4°UV¹GÁL·0­†Ü aõÅé$0Ãórû,XìZÖsèEV7’ûB8à£c-ËÍ$Œ¹ZªÒ@&ٯৠ\Ú­*_¢&c³Z1ÎühY&VºÃ†&E )ÇX܆[ÖëÜcC“jeÖ˜f¦­S¹Ÿ‡ÛФÜv9|ylò ¬ ®„úÖÚ™<Î/8¦%zŒ€{ù5Påj2Ô&ê°¿õ Y§ÊedÒ¨‘ðÚÄÖ.à9¿/¸bò"4 Ê#Þñg¾ØNŽÁMÇÿÖøüÅb´Ü «ÜfÍn¡ùËr ÿ3p´¿r-Ëz2z,³n^þ[ O€ÿþ3éŒóïᢅµ^ÿP|kí7bIEND®B`‚phpsysinfo-3.2.1/gfx/images/unknown.png000066400000000000000000000761221247443170600201750ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs ð ðB¬4˜tEXtSoftwareMacromedia Fireworks 8µhÒx‘tEXtCommentDesktop-sized icon ============ (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orgø{À`ŠprVWxœí˜IkGÇGcËíL)­Iº4žÌx_ðŠ·1ÞðÞÀËÁ¡È äH ÖÅH"`¤‘F¾ä 8Äq°À“dò!F‰$´9Âä–“!—||ƒ¼ü_õL˜,^ŨªûuU×´ê÷ê½zµèç?ø#6 N\T©TL©b¤RÂd¥°Vð(…ah^°š, s¸Â\.gJ9#ÅË—iüÊ*œ8A…\ΔóûöÑØ… ôøÆ Ú¿Ÿò‡Óèµk4tö,õïÚEŸ;G£îtšzΜ¡Î£G©mûvj;tˆÚŽ¡ v´Ñ‰rêzÑöC|7ÚÚJSSS477Gu)¶ŽÄ¤ÅÅEšœ˜ __½¢ßŠEúýùsz](ÐkÔýÒÛK?uuÑÝÝ4;ÿ¼„|uþ<}yò$}¿| [>¹}›Š{öÐ'7oÒ(ü3¼{7_¼HEü>ŽïÙw¯^¥ø)¿w/Áwchoäøqãã"¾åòàΦžëLŽ¿á: ¦ ×=+oëV3úÁêÁøèܱƒîoÛF÷¤v|Ó ^+¾ç÷ÈG<N¢BG•Ëeš]“ÿ¥“mþrO}{ï½€MŸÁŽÒüaÄ/ûŸç†qäÒ|Ûö·ÍÿþÁzÙÞN/®_§'üoÖÄùæsž/¤ù¶ío›?…õ²ÜÖF“˜žÞº%®¯¼þNŸ6k‚4ß¶ýmó¿¾{—>ç5kýgü?‚}ï8þy,HómÛß6òÎz†10qéMXð{¸1ì;óØó°“æÛ¶¿mþ78 ”‡‡©48H“â <íë##ýý&—æÛ¶¿mþÒÒÍÏÏ›óòÌÌŒ¸ÓÓÓT/Ò|Ûö·Í_^^&üÿ‚……q˜Y/Ò|Ûöÿðÿ‘Ö!ß¶ýmómÛß6ß¶ýßZ¾Ò+¤L‹ödøÊWþ}§´’àolNAàGpTn†dµ?n:]~Ò¯ù‘•à7ú¦Óà©„÷<Ô\Ñ üØß.¯Ž7¯ú¤·¼y#kç{ªŠ ÞA:ÄU¥-"þ5ûÐDoF@ÔB@ÄÿìðæhÔ§‚´NÄb‰( ´ŒÿLÿ«±§žé¿ ÇLË›·²vþ¦¦ªõYßãîëÈ":#Á7ñçWg XßÞäú¯6ùaFѧ#}tFÂÿuý‡õãÉ”®½ÉôßLxbdoU|’ûŸ–àcþSŒT¦ÿ*ÍzøRó_)€{³§Rɪ2ˆÂô>âÏ7öNF¯ö_Éù_'k $<Ç‚o ¢R"þoôÃ~^µ ‘ñ?⟇#y¿•Ð5¼ÿ7pÇ#ƒ¶º†Wbñ)À9ÏEÆþ¸1 ñUdêð¾ÌúKê]…ÛçÌWT~BaÞ(Àߨ”É®|eEöÿ1¯)çTº%ŹN}`N?Y½šÐ9mjðVL«iãm>:¾ã;¾ã;¾ã;¾ã;¾ã;¾ã;¾ã;¾ã;¾ã;¾ã¯†ïĉ'Nœ8Yòس(Cï&HmkBFúÞÊþ)¤3¡mkTSxœí]YsÛH’F÷´Û–,_펞ØElìΓ{p“|EQR›’8$eË~q€ asZ–<ºº= þßݱ™Y(NQ–hC²U T}™•We{/›WÓvos2Õf½ìO¦–>¶mۨώ:›ÞT½aÅëÝ–75ôÙÎî€ÊÞVß›êõ_ kÖëbëæ6ÜÄ£ŸY·Ó¹š6»ðgscp>UV”¡â*ï”®2VNàh¢Ïv÷÷ æ¯Ps5šòj'ÊŸpű²®lÀÙ øüŽŽ¡t”s¨Íz­ƒ!t§¹]Å¢?™ãú¬ÙÚ¥>ìíA €ÓάÙߢ‹úmªëïPÑìÐÉæK*6÷ù ¶Úô¹7 ‹ÚMVôèä>;ÙïN¦ {Ö4éì€Ý}ÐgÙc÷cÅîÆZìc¯ÔYë@›LëPèx›ÖAENêPè¬0°˜åÂlU†Ù—DF½&2êM!ó#³­œÇ|R>@Ý…2NÅÆdØŒS°Q¥Ø¸n5…kÜ:ÃÆÐ óf2xÃà©3xê žú¬ß} OÎú}^v5Ëü €Ï8€›Ê)L»S€&LÇð•a0áÆ„¦n¥¡éä@Sà´44NsËi¡mK ìw›¬¦ÏÊ0¤8¤M’TÅå€>á€öLxq]éÁÑ%œeÊ3)–šg.V¢nI‰æ·YíÀù3b·kb´`ÉV!õfZ‹!ÔÚ“›’lK‰Í|†•ÆFœ[Eйå¹å‹ô¡óæ Ãg…ãÓ|.P~1©“*Ã]³$4*ƒFeШ •A£2hÔœÐ<   j" –“~G…³¶pz*E©E"zVBúD»«8é Çé±'.²‹ctë‚:“,†Å²®5ßv t”+åóRCZÔL·LƒÉa09 &¹žw €&àÓ,ë„3JN¸5ŽÓŒþ ´{þ^".­­|bû‚Ç6>TŸ‰OÝLÑoäÛ…]Ó2ÒB:CÈd™ !“9|HՈLJà wNÁÐ÷›Àk‚pÉ¿t$¥Œ–¤ÖàPêÃ4çY„²û\L½‘ÌÇÌM`¸c N½ Ÿs1emݬ» Êñ‚俚&ÿõ’ö–^ÏaQ€~ä½>»‚SócWrÉŸf©cÓ>z¶AZÚTχÅ(@Ó,ÅP+!†úǧÊizÄ£¦¹=cM5‹Ûñ–Ê`#ƒÀyiá˜rȽEÑË3†6*]j‡„ÝIêtÔ‹·ÁoeÖ?@öOðªB¦ÅÒ†{ùe•aä¦ äŒl”HɆp²¹ŸH|u#Sd¯@ø‡1|`ø z¸È ¦÷£1ˆ\3“sA–i¡iºËÁC˜“Åì1Ÿ›Ø±£Ài>½™¼`¦ÇpÐ,Š™?+»¤"/²×0¢¸1¼²Dšg–€Íç8>5ÉúX(j]ŸÓú¾Ý,Ç ÿ Ûô-ÿ ÇÅlqˆ7ÉœCÅ‘îc‰#ßH”­€qÍ-.ýLÂw8ÆÆÈ¼£óºéô #YÆ@–.´R’ ¦«30-¡É&|>4µqnó%`GÝ“z²›¤U>“~-ã›E]3rJFóóLo½Î5 9%9Ñ2tZ6CËfhÙŒ÷§áÁÐ&8Ú½8hEÓU~/Âx¹€Ì§œåHÿá$.\¿Ð$&¶óì…E&¢e½Ø„Žò{FD¥Îàl08É@ Á©^—/M†&›´RÆÄUVTOÔâqq0^Yd¥Áy“cjsPm3‰=ƒµNLÏ‘JÈ6¥hàBËR ŒEO»h—3n .&UCΛvlɽÉÁë7ãKìé`…CÅgÀëÊ?+gyx±ÈÔÖ¬qžø•\Aß$x,|÷‡óa·C~ÌîÏ| òLšœ@J•£™ÉLÇf²Ôµ#K2¯OìÜ(vù¡òãí¢dFÃ.®4º§§8Ás¥„!xc|ls+П¶Z}ÁóGŽç$'ƒ¦hâò{Ÿñ_PMŸ²ŽÔßËaÕ c•â(»CRçúÃÕwoÄ­@æ*e(d– Ï:´Îuyª‘Ë1uë¢þÀƒžOšé¾ ÙíqÞëù®M?î=ÊHñ\n†óˆö„üȬõ‘ZÉŒ‘\ª‡ërÏ¢bœ¯ÍaD‘›2ƶM9!,¾ÆmñEn(£qkfõÈê÷{\óϨÏ5!­y™@¯†x>¬NIXÉhÌ‚ÕL$ßâô]s’K1IËáèàÙ6G»ÍÐ&f&ì6ˆ’ÄÓ˜ö…švn A¡/ +ŒQ.Y!xŒ¨HÚ&š&74M†¤á2$©4¨$$Ù”—Š2c ÝC;¯,X འë³ÅÎóØN~HÜ_ûÓœñu×þ8›Z›F•Ú£®–®?ùó‚ë§yÿC ~Ð#ŽßkbÃ1oP‚g óÝã8zQ=gA³ýºf”|¦ë2ß’a帔âJC6†Å¼t½. ‘EŸ…"z :é†BoàZNº!’Òb“gËÁ˜//DX†lú|€ôÝÉ@f’ȽV”MšÅ†çq#ò“üƒÞAhÚ«lÚ ÉÈ~Ø£ÇÅâ©òQ˜æoÈ HŸæQþÌo÷aÍ“ÏM¥¡4P0”¤Ó!`„üMø±ƒ0S¼%fjâ™ñ¶ÊlMÒÜ=ŸE™¡”S? Ö¼ QLÈ6òÕNã(• CY N®¾9¦† S·.·ÝÜ/mðqÃfÖ%1 qkÎ-v?—›1}[÷mœ(&Uàö)œšÅñ´£x:´¸-›ªLl² f™<(_ûDw¾è\ýPiPÉÏæ²PÔÛÉ Í-Èï9äK¦Ïi«lb@=Ã|Æ“S`ÕĦtNãù6?ßfçþ# S㠦ƦµÏ‡4«w˜k)Ë';üNH‘_’ îÛæ÷8²†Ò*±DVË“‹—'ÆdDM (ÂX%¾x>_G¯K¼Æ¦²‹àô Çé9Ù.¥TŸÓîGŒjâ–«uZÇý éYÒp[ÀÍ‹¤‘¤Õ6dSÆÝïBPÜ.7xò'”¤køšwÇ™Âá’2b  ‡‚õhÌ#!2‰ «sÆè·É.ý#…¥z>_>©¼–­è]©ž×Æ2¤}Q^ TÏJ1À@ô8–c%Âf— iùãðÅnØÅWz}‹=kßåŽïëìÄ},螦Ï1¥],Ëcô×g=ÊÆ…–©'î3_žx†hI™ÏŸç½ >·#óBHÍ›‡4¶t.¤F£ ×{R­$d I®|FˬLq_ð†C°éE¢ÉIÀ±ÀHŸûP³v§u5m‡›=žM3¡°Ý%IÕ³ ÙÐ 2jFôÆŽãÙab ǵÍÖfP´Ù€Ú[4[Û½]Òë±:ì GTl½z=qƒw>Œ¸Ý|z…Áy@g—/ja¿]åwNþ"ÚÛ¯`¬û›ôüí]8Þîâ{OÚì­&*ýÌBUš_Å_y‚uo°N½þ}´’·ð«ð'D·Õ€n@±^(pàצԕ£œÉ(gV”+B¹œr}BdÚÓÍ(³O(}”̵pM9Š©Œbj¤C+¼C|‹½dú‡kkÊuIg]Ò+&*ÂD9Íz€Œ £Å0Ø{Ax?D´ìšÃ×”£¨Ã(êT-CQ&˜/(ltæã%PT~ÍaŽk®¥¢5­"i’>â$Ýâ;´>ÑÛÏšú'–ìŠÃÌ+ʳÁˆÙ¨hYÆÞêÎcAÞ¹oSEëSêÊQÎc”ó"[ãÃM·C¥E¤ø@!?”ç›r£õ‡õå:©qË–B´ÝÒ#ŸŒÈ'3òi0l”¹ÑäИo¢ðørþ0á|¹ÑXl0V5Yʘ¸]²ÝÐküÉàŸ?L8_ŽZ5F­ZE­2Ôj"£Ÿ*óó‡ çËQ«Î¨U¯¨U„Z÷9µš´¸í£qŸÓÄ?{(=[ŽN.£“[Ñ©V 6öŠ1¨6¯ƒjóšr41š*š•‘„¯)Gq“„óó‡ çËQk̨5®¨•I­Ù6°Ëà´ÂqêÓË0®ÈÆãcË:Õ0j#Ò)õW½îך:þFkM˯ZCc¨Ekm¿Ò¦Ÿhe-h:㯋ºŠ¿q²,_÷À ×b¬A!eSŠcÍ´5':\#`ðá¨îZÑÊzPk»úX³¥{£¡;Š“òvºp[äx’^—pU6½¡”–©3'Ž!í[CU‡¬Èú—$˜\U2“nê!·ð3à´þ¹$ˆwb¨êŽ“4þ‘ÕÑʆØ2æ?è¶ ~-Cz1ÓmcA– kU5ê¨(åÂZUõ†SKÖÀœ¶ØÖNkZKiª‰=Ê¥kît÷o[¸mQå'PBØ6å%C«,¦ÐUÃU5¸6lÔ´aªÚØôL+UÛ»ª–„jüƚأ\Lq§»[Lñ„3Ót+d ãdm’ªŠÿ»-›Í7õÛ†ó¯O)oõB9à»Ißg»DzCu¬F‚2¯IYÿ÷¹-¾%Ÿ±@« Ð›ì .CZ3Ç(IÜ¡ç#j¹¹¸³m6f©¸Ã†5/Iܱ'±üË)­ït÷o›˜´ŽËhiR<ß“È5GòÝç¶ yT>ñô|õÇìY×-z¸2ÆeóëNŠ(j%p‚Ã<–(l8 ù¦È]íûmk’@ÌuJö,eF¼WùfIžû,"ú¸Õn]M·Ú¡ 1Á´KYÈhá7áï½÷Ô_˜ÛAåb¶Õí_M[›[øç%Y+[ŠG›;qþì‚®aûÆ&ük8Z›¯àªøÜÏf‘¶}"ξ=JÚºàß&0¡¨kû¢ ­Xy¤·sÂòV÷•ÿ²{ŠÊ~#wxL{¥ÿà&+Žok¿íÕЯ¡xB/¶ø;¯Ïá·M 3μ‹Ø“gþv.zc.r]P Ã9Oes¿Z>Œà¾G/ÚUZüêÿV¦JjmEƒ_UÑ•pŒ}Ä#<7¢ïê«Ã¹Ô°ÞYte þjPƒŸf‘§®†M›ƒ.”ü™ßãs"W?èsÂߊ£ ÚÔKh³w;—ÞXA»_¡¤…Ú$Ñ÷2¾'Júß·tBí΃F¤Å½pìŒÆ¤ëÅ'Ì_V&§Î_cUÀjÞ*èaèz#6ò@é<é…~Ež|Hw8æbL6#B­…–}Ú)7"^”µLâàUj‰­`6ü“ñ#owžƒƒsaÞ?„1^R6òãü‹DN_ qÑ@ùŒÒ"ñʹ<ɺҟw"‹Wþ fùï0²6!;&EqÆ>€ÞÃsØ»¿>ÂóN‰¿Ïà\xvÂõûl"ÊSÓ„¾=Ô$Öù®°ÿ£;é$¬KÈéÝë}%§+9]ÉéJN/œ¶¾r9½ÈéKz2òZ%«+Y]ÉêJV/›¬¶¿Y݇§ð]Ø•¬®du%«+Y½t²ZûFdõ[â¹·pß*RÉêJVW²zùdµñ•ËêŸâv5¿ž65PG•ô®¤w%½+é½tÒ[ÿÊ¥÷jÜÒ†1WÒº’Ö•´®¤õ²Ikó«ÖÉWåïUrº’Ó•œ¾ÓrZŒJ/kþûæÏEÈé*¯’Ó•œ®äô²Ê黿w}9]åïU²º’Õ•¬þdõÝÎß[œ¬®ò÷*Y]ÉêJV/³¬¾Ûù{‹“ÕUþ^%«+Y]Éêe–Õw;ïú²ºÊß«¤w%½+éýuJw}é]åïUÒº’Ö•´þ:¤õÝÎßË+­[pŽ/D-!/„sôBåt¶¬q`7~Gp¿úBdM:OŠ’ÕV)V#­Ó³„¢×²WŸÎµO=¥WñymÀh,AÛ„[ÈåÊNý ðÝ´E­…ru·C¾æ·'œßæ/V~¹ê[ã?G ßâøÏüü÷R»CÜ÷˜s_ØÂ­Óœÿ0š€r´ÊX¾žeª |M–©è«-¯]*Ž£²Kï¦]*Fv—%_ùÔ3.úH½]§vŸ$«{p/²z+Y]E*Y]Éê;!«Å8îòÊj¤ø:ñ;“}ž «ŸD(´NüǾ¥ë8äÙ­…öt¯ß¢Ogqyâ‘$AySƒ_®÷%GøõsØ?Ÿ³ê$«<òQþ\ϧ³$|ZùtÑHVا‹íCÙ ùxp5ƒ~Ýb­†¼úÿ6´®N|]~×àØ «Ã¯z ÞÏ£Imϲµ\þ¸ªù¸ñ9Ù˜Ÿit'Ô–}‹Ï™Hí“’<ù„08¦qEä¢ò+þƸó2ÊëËæ‡¡ÒŠºð­©1Ya&Y¦>?`Ì ¹Á#.aÒ ¯F¾A :‚ë£üðŸð¤&`ì6ïë3✿Àç‹€>8¯þŒâ=yÿFîzOqùõ=<Ù®q3¬q®Ý ·<ŒÈ®K¸ŒzýîX‰<«ä’h¹’~Fâ&I:úbô^Ȧ°(@±!Íã1¡Ûàs>ã±~µ*qjÅY#¢tÜÎ>J ‰ª§|œÏ¶ñ{à·»ƒ«éQg¿è +fósºe±³x¿'~AØ"ï¹½ô¿r‘÷}Hzà’øeqw½™ys3¾JÜŠÜ9 qg1þþ1œ±U‚³GÀ¥p·Æ¹õÙs#`¢Y$r6Zz#ø¯Ò¼X^<áwN‰¢ò¥èí$ù²3Ÿùþ¾c³>!î!^9ùÄZA­„V†‰~QYèàgI(«ç¤ìc#ãX—(À¬ qLª`ËEÛ|à>s´Õ_ˆE;:éiãÄXAÚÓæ­dO{šð´@ú%<ñYâÅ–ò1Žhî_xâ“P›bOÑñŸÈ%qÂóDdæÏŒ¶Ë_‘vk\Ò¸ì‘ô9Y&J2w%=%³FfuœºZâ3òÑg5rñZmieó*|žlÅ<Œ?KéÇgÊÙŸcP—ôlz!‹±G=¨_ÃD9ïá;Bä”ìß‹ÄùyÄ!¹˜«Ý*´`öWöµkpí1Ý7ðÎG—‰ß~¦¾/šÆ1Åxð@à,F¡¿‹~þ‚¸Ñ ¸Q»7%}ÎÃ)OˆCÂãÊÓj™øä¯`ó]Âgä”Sê FÕâô—â–‡PI‘óõ°my'­J-°*Íʪ¬¬Êʪ¬¬Ê;/½¬Êu*QÞ~äzþ_d”Û«ó3PËú|ü…WåF¤ÍMŠ}»´áÐZCX™@ëÀ‰äÐZ3ågŽé|°þD¹ˆüç€#ãëá+¡•mÔ÷£DÞº©Õ®]‰ë ëÄïëd‹\Ò3(o;çNZ?Ö“"ô¿=Ã=’ãÅÛdàŠƒŸÓ×ÓÙTó(?Cª Pz´:0_KUI§"mòêÔåš‘=ª#lƒržpåî4ŠÍÈ8EžrÌßÁºÎí¨ ¸×'\*Aè¢ÓÌrÈÃs¡4iM'lñX´¾—/Çf™¨ó“€é„hòæ¸F)óC°¦Îè2ÿ\fvhPç‘•`§¿ SÎâ\&ü ·>ƒËÀxÅÿ =Û£»Ç3ùŠ¢­sh?žviô'äûÏ%Ѻâå¢ÃSe›,Šs‡CóħŒÜÃÿ™,­p ßÞ:#;СµêË`]ÿ'@ûWÒÉ¿vaË!ìש_g|#têÏ2xb˜ㄘHõ5å­rJ6dµ³iÑà;epÎb7:ÍAÜE3¤ÌŒÙØdë ¡“õ6"=eî™ ÞÖ¿yÿ¼Ë|­EOTÖmdG9ŽØ„ß#g,-< q³ýqç¡ÿc¢¤%ÌžñCW‡qMÎJ)š¥d%ëdØÄ!/èz¶²k’L÷È?Ð(wÅ¢–1qÒêð 'æ Ë…ü¸× í4`5ëAî¤|.þB³m~ý;ŠÓNÚ‹œûž§ÜcV]ÚýeÃ*<ã£Þ€ùÍyÿÁ¹„EQü"asþK_”óâZôìµü5rJ=гü­Ù޵…ü\䯋BÏ¥þÚ®¹"›-©÷±œâ{p—S…ívói²Aöóú¼&A2<'$1Çò$¸òù Xй³É;d²(;&á ´ø]Š;©¤]_PÍÇr  ¼F¶ËAGÛLjaÑ õ=¬X6žø'è"à‡KŠ#bL}’`»ÝWØ^Éh^¹ÿ探âiµ724î/»7R|ÓÇ]ÛYî Kv¬MöîHqe/kw$ÚúEwŽˆ;«ý‘ws¤¸Ãgû#¿Ä^ {”C#{›’\ûo–Þ§' »ØµÕJMûÔËÊââ;Õo^Çw¤UÒø[’ÆÖ­Jã}óÂõwÏQø\™5F"ÌÌuùªF#”CÈöKª0ûow¿äÍ Å/Ê(>KüHäùyt˜Òø× î—ܲA±X#}Ÿ‘Ta#8£¹ïRôãzTÑ V$|ƒ¨nSl¸¡úV!ªã®×#–‰êyP½]^ø‰ò˜>ó^±}ÖŸáØäÔÀ|ä­ÀÛ£Q“eUz¥i®Åë<_Ý£}òÃH4ۦ܃֤ð/ûŒåˆÎ-/OÈP,O“°ƒkM̼-Ú4–|¾¦¡YžFO„ub–±8 V‘ncYK­M³Òê9嬱¼|OÄïÊ„¡¯‡v_˜Zæy7LŸP¥Fëª5Z_Å¿6éJ‹¬£å¥OCüÙëIfÝÁÕ´¹Ù™L=þ3kûŸTø™µ»åÐ:Ô»ù{>MäÅ"‡‰5½ÖÁp ÷4'Xlµ©èïM¦:|L¦Ú¬ÝkÑ%½«ÛaųÁQójÊ|ŒvÆj'0œ—WÓ×]¸¦®Îvx9è¿…ûÁ(»0ŠÁnk2­y#Ó£ÌâÁQ{17šmu¯¦í½a³Óâۡ‘t7äÎ>v½‹Ux“î€$´ÙF·ÃŠ>zcc“>m´¨èÃmÆpe lãMÕÙoÝL¦–}öñ€]l¿ÝÞÅâ·>^ã@¹Å>ðv¿õ›l§Kˆîcç¶û<×ébÑbE§OØìïa³­Í>fÿM?uúôig°‡7Ù h¶ˆõ‘íþ ’’UgGmêâÑõУÛAK,ŽZtóöÜ@™íï™WSø3™Ú3*…ÀmkBSxœ]NA‚0Ü£Ïð €Að±¡U%‚706!ñbŒ½löï¶‚œËLfv6#ËÔà¾b#úÔ ¦Ñ£n¢ Ï4á–\iô£€ª¼Öè¸nF{¶¥gè„A‘tÓ²lÜT‘8Ê ôð€'¼ákðIÖߘ [c¹ë²Ò¹¹,£=í¿«&úÛxnípÏ£ƒýT}1öHqûQñlÄHï‚Ø§Y‡ÑÐÿtl¶‹ã(S‰Ašñ1_¸ˆ W µmkBTúÎÊþWºxœí‘Û8 FSHI!)$¤’FRHn›wóî HÉY¯Ûx3žÕꇤ¢úùs†a†a†a†axI¾ÿþÛïÇÿ»'UŽ{—áÙùðáÃo¿¯_¿þª÷Ú¾gýW9ª Ãû¼Ïâöð–þ¹»¶ŽÕo'®GW {>~üØÖÕJþîÿlúôé×ßoß¾ýüòåËú¢öµ¯ò)*/Îåç‘Ný\®ÚϱÚoù“v[iZ_Õ±aÏJÎþ/:ùþüù×6õOÿ-¹” 92b?çTþÈ™×þlôkÎ%?·Úåöìä_2òø¯èäÏ1äBµ ‘sµ÷YäÇ5à>¾:†>Êc=1ìÙÉÿ¬þOùwï èyä^«- ×Ú¶,ýÌXÉßzèû•žuÃÐsMù#×’U]ë>H_÷˜ÀyøY’Çvº!Û‰õŒå_mÄi ÿRuâþs´]ÍXœm§_gû)YYÞ)úmæ]×y,—²¬mÚ z†1Éêša†a†axEÇß“G°×§ÿóo/ïYòÝú\êkº6õ®x„ËèíjÏægHð–ö¾»–÷óüÏØñ|†yž÷u¾Ä.½•üÿ†þó\þô³aÏæŽM&ýwéÛÃäké#Ïú$?Î]ùMço¤Œ\ýȾ,Û/íßÚ¥—ò·âQÛ@Êß~6s?)}‰Î,¹ l¾ìçœô ØgX #ìvçQç´“ög·Ú ÷Bž™òîìÙ™^Êßuô¨ã®ÿuh½à¾m?Ž}{]ŒÐ.~È}Ðv_÷ÿJ;ëxçoÌgJöëôY]’Þ³ë@¶é.ì«)™áoqC–ü¿“?}ß>@ÇûXŸÀÎߘò'-üäÓÉÿ(½W‘?Ïöú›²±¼‹ôÅÛçúÞéô‰Û ºÅºvþÆ”¿ÏëäOœÊ™ôRþœ×ùÃþvì[K?[A}¥?-ýwöíåµÔmÑÕ‘ý}¿g\=ö€c¿¶}ñ³M¾‹ ½ÃüÃgggÓêüàÖ èÇ„çÜÀô-B^ëók_g?Ìò ¯F?œ£³« ÿ•Ý×v0||ØŽÐØ=ǧH¿PÆîÛgçsì·ã/ÇhØ‘ñI ÇtýÜ~×{‘òçún^§}¶ïZæøºyDžë—óÏì·ó5èˆéÿçXÉ¥ÿWvðô¥§O)í"û±c0ÎËvYà“ØÅ ÿçZòï|~à¹_%/Ï,Îôp\€ËɹyΰçZò/ÐÉé;/x†ÖáÎsõü_é·9?ÿ«PÌܯ5Ý»\í[½ãy|ÞÙÃçõÄ8ÔÏÝøŸgäû¿ËʱL{ä? Ã0 Ã0 ç_àk3¾Àç†>´’ãøŸÛÜÆøzä«Éø_ƒüÇøü\Sþã |<®)ÿb|ÅÊç7¾Àa†a†axn.µ•të†a?lÄ÷^Cã•ßvk­¬Ø½#®àýÜ~eûî)ÿ´3<3^×Û¶¹Âkð¬dlùcÁ&·jK+›œåo"eòú<.ãÊž`›Áê^(3zÌòÏöèu ŸÁ¦lÛ+6»úßv´î›<™†×ï‡ ¾k7]ÿ/lÓc[`ýOÚöùÐn}½×çòš„«ï ‘GÊß뎱š×Äzt¸^vßä2)?;WmÆrõ5üoäcö³ŸþIzì?ú¾˜‘Oî÷zx÷Œ{¹&ØÇ!û…e¹z.þ©ü»ýüÓÔÅ"ѯÑí¤ô ¹Ý1üÖóäÁñGg×ÿí{+Ò·’×lûw<ý=}GݽìÚFƨ^ú)õ¶ìzIpäG¿•ü ¯ãKì¬ÖœÎ{Í{ÙÉßeÈï ûšG•‘12éÇÛ­¯Ïq¯§™iumf—“>¿.¿ÕþÝ}¬®Íëòœ®~žaì? Ã0 Ã0 °š[u´¿›+ð7øSvq¬ÃïìæÖ­öyÎ…ç ½?Þ‚‘}¶¡åœXùçwíŶ‘ÚvÌ?ßå°ß©ð÷DðÿùZÛ“ð-q/–?ß³ñ=¿ê<ËÌ~¶Œ›‡#ýßÙæ­ÿÙæ»>¶ÓÙFkÿŒÛ"qþøz°r­¿Qèo 9ÆÄr¦,øˆî­§nÍY[;í§oæ:)@¸-`×§-Ø7‹ü({α߯›SÒí§Ýú»@¯ÂµåßõŸKäï9èîüÖ ¿É¸“>:ŸnÁ3éç _[ÿ_*ëmt°cmìÃC>äq¤ÿSþ´L“øÇ<²?ç=÷çÝ<ò¼6Ç;ùãÇ«ôsü÷èþÜa†a†a†{àxËŒ™\ÅÞŠÝûêpxç¶?0׋¼#ÿ5žßàøzæÇÑ™ƒc¿]¦³²¡x^úêl‡ò¼ •ÐÇ(×fù±ÿ:~Ÿ¦ËÓÙ£^l iÅnç59¯³©žWÇÏ~·\;Û?vþnŽ—í»öç’6eÌr¥ßÑý¿óUbS~vù§þ£^¹÷U O7O(é|;+ùSÏéGôü4|?Øfí´ÿÐ÷¶*?ÇrŽ—÷W~Ï2ÏoÅNþ–ÙŸÊ¥ÿSþ9ÿ×~dŽa«ç˜çòîÖ‡ÜÉßmH‹6öìmÀXÿ[ÿÝJþ…ý~Îs.ãÚyœÑÿmƒ4Ù¶OÜíï|Bÿ­düžò÷ø/çøÙ˜þÁb5þÛÉ¿ÈyþÝøïUä? Ã0 Ã0 Ã0 Ã0 Ã0 Ã0 Ã0¼.ÄP—~þ*ÖÎ1@G\⟿äÜKÊðÞßrKXÿ˜µs2â±(ߥò纎Jëì·º8”ŽŒ'>â’X@â–¼ÎQ¬ûQýb£àÚqôŽòwx‰ ìb÷)“¿ëî¸_ÊK|•‘vÎ ÞÜ1çŽÕM¼6keŸe-2Ç›ïú5ùŸ9—ó?K^ŽEº¤~‰9òϱQï±®Y®×F¹8–ëN?å~;:=J<—ïÛßþ¡-ìtñºÄ’yNAÞÇég»þCþŽ \áûNýâXÊKê—s)'é^Kÿg\~âç2}›6í}Ô³¿·áï)¹Ün]O»ûrÞ^Ì÷³j‡~†"·î{pæ¹âù29w€6”Õ/Ð.Ÿz-ví:û+ýÇÿ£ó²M{ÞW—ýûJY¹¯Z÷­Êêµ¢`%·Œ íÒ¤l9…¼ç•íž¶™Õ¯Ï#OÏUz+èÁUÿ?;îýùsŽçÜdš~vñàN·›‡Dç7*.Yç«+v:Óye;ôø8Ë}¦~éÿÝ|…·²+ÑޅNþ9£àÝÀ}•{BÆž#t¯é˜×xîãÕ­sXÉ¿k¯ŒS¬Ví›ü/Õç»uJ=oê Gý¿ð<‹Õ»L'ÿ£²óL¬ò:äD]²6Üj¬f™ògL˜ëz/¯+ؽ[{Ž™ßºrðÝCôM®Y×q¦~áè[»{y‹¼£®òÍy cÈzA¿§Þô»ô‘Þ;Óîwï„«±€Ç9—¬zÉszW¿”ûH®œóìóV‡ax3ÿ ‚ú à¿%£×mkBTúÎÊþ’xœí‘) …ˆq ĉ8âDÈ^éê>×»gI@ÏÏþX¯jjg»iЃž——Á`0 ƒÁ`0 ƒÁà?üúõëåçÏŸ|â:÷ªçâs¥¬eø÷ÁÿQéùŠþ3|ÿþýåÓ§O|â:÷2|ùòåßÏ.¾}ûö;ï°7eôûGFÔû´ž•žOõ¿6Ñþ®ö_õQúv•¦“×íßù]Tò¬ä]½^¥Ë®gí¼{>pjç«zëìåkßu¹´o{šyªþ¯yeõŽûŸ?þ÷{è-Òýøñã÷½x†º¨/ D:½é3Dþž&òˆ¼¹e«^H×õyê i#/OGôzüϪÿÇ߯_¿þ~î :ûsMeÑò#M”Ï3YŸ#=÷2û» QžÛ›ÇßЙ¦‰ïŒ[\s=Eó8´}E>¤GÈ©éTîø  Ú²Ê×Tªg-Ÿñ}×þú̬üVfÖÿé¼Ìþêo¨SVwìzV}Ñ.âƒ/Ð>¨~Ê!?÷UýùÏËßÿï1¸Åþè<ú#õîä¥þ•ý}âÀ¶Ø=þF[ þ÷~†¬ôQÚ‹Bó¡N™.ð·.+푹^edÔç½üLo+[\Å-ö§k»ïä döW‡ïÍú(}Ýýê6îqÝý$¾#³?zÐ6–éBÓ©ÍiÈïöÇ?òLüåÍ7®!ã3ìO_Q}Пuõïêoßš™é[ú=ž¥tk¥È‹ûøMÀÿ‘Æï!'}/õƇdºÐr2ùÉ_ÇCú‡ÿﲨü:—©ôéº ƒÁ`0 :8÷—ÝÍòoÁ=¸„+8-ó4}ÅÛžÂcåÄ¥XÏdq{bUþêÙŸÖq˜Â©Î®è¸âmï!«Æ¶«g*ΪòU\z·ü[ù´GAåÖ=^§+ruñü{µëLVåÕüþ çU¥?)ÿV>­Ò“ó†Î)úçx…|œYé¬ÒÆ»giôãœ\ÅyiÜ^cæUúÓòoáÓ*=£ À³Âó!óÊþÄíT•³ÓY¥µ?rfògþÿÊšûWœ—sÖʽVÙnùÔõ*ŸVÙîXù#å=ÿÌFÈÜýªÏ«’—+[¡«àFô~ÅyH«\L—~·ü[ù´ÎOÒ‡£Œhô5žÝµ¿ŽžöT§ö¿êoà”w¯|Sf®ûÜÁÓŸ”+ŸÖé)³·Î;´ìÌFå³´;:x ûëØÉÇ÷â)/ˆOSÎ y²ëUú“òoáÓ2ÞÎeÊ)Ve3'w®”ç‘gGg™Ž=ïJþ®^ƒÁ`0 ƒÁ ľˆùœ‚u k˜U,ªKsÛþçØ‘5€nYæ®,÷çbXw{ ⬿wÖ&Ýúõ™û3®Q×”øN¬ðQev× ]¨¯Æ·ºö¯gcH¯úËžçîi½÷Š{î—ôÌA¦3žéôIó8†Çh³òwòÊdÌÒu×wËÈô¸ƒUI÷äWçq”ƒð8­îÕ×çI£>+—£ñ@åì”p™ôQÅŸáóÈGcþZ—ªüò\ƪÌêú޼ÄUƬìß·]ÌÒù/ø:íÿèÊÏ3dç;É«:gB9ÈRÈôï|GW~•—î×w«2«ë;òfz†áŸt|éø+—i5þ«Ünÿ€žá«ÎŸgºZÍY|<õ1NyŬ|E7þkúªÌêú޼÷°?õ®Öÿz/k›Ü×>ä<šÏÿ=Α}NŸÍå»Î…ùžü>åuåWy­d¬Ê¬®¯Òdz ƒÁ`0 *èÜ\?W8ÀG£’Ë×ÏâY»ûÌÕ:‚ýÒÏDg«öc¾g<‹ Ìö2+²¸€îÙÕýÿ'ëWµ±6½žqnØŸ{žrèuç"w¸<ÒTkôÎ.™ô\ r¤•¾nåOàûïÕ>Uì˜~c‡#T?£ñ+®ëžyöï{¼QùÂ,,^qF/XÅûv8º.Ö©gá×3}íȸâOPùì ~n%ãhUÞG4§çø(_û…sn|W}Tg&x^cëô“,Fíý…¶Çù°ÃÑ­¸ò«ôµ+㊠<ÁÊÿ#+}/ãUw8BÎRh_ÏÊïäÑ|»33!m–r\7U9Œmêß({ÅÑp™¾veÜåwÐé[û¬úx¯ëG¨ïµÌú¿Žß]ÿß±?g;õ,çnßÒ½Úow8º]®³Òוþ¯Ïßb÷ÿÈîã?úÇOVé¼=ù¸ZÙ_óÎÆÿû£#¿veü?áèv¹ÎN_WÆÿ³Žªõ¿rÞYL€ëÚo;Žù°ŸÎ1³g²9pV^•Gµ~>™[_áèv¸NO·S÷Ÿ3 ƒÁ`0¼ÀçèÚïQ¸’·¾[ãï¾×ØÀ veO\k^8Ö”¨v<ëZbzº¯²Û\ŽáOìp¥Ž¯b¾n$~ð}¬¾Çoèz•3ñј mKã è«ãvUÆÎþ]^»i´NºÞå¸WAö»#´÷xŽë”«é‘æjßÊtÄõì q ³:£¿ÏE=Ð z%Ö…ßqù)CcñÕYµEÅÑí¤q™´®ÊyRGý-¡+u (K\ûh¬PÓ'¥Ü*^Ø¡²¿^¯ì¯ñqÚ=m=y|KóòøvÅ«eü‰Û\ý˜rÈŠ4µŸÇ=Ž›ñ{Wê¸úÝ1Òûû;=Ý·åòxÚëpû;o@>ú›”ȘéT\ÔŽý+C±“=*ï™É«|˜¿GðJO¸CÊåW]ù–xŽ1.³™ïµ 9_EŸÐ±©â ½ýVýqÇþõÊã)vÒ(ç¨ã Ê‘}Ïì¿[Gåñùw¨œŸîǺÛôã{-âƒoô½ÜSdו_ËžïÎ׃Êþø2åÔ;iT&Ÿw*ßÎwú‡·™“:Ôº§ÇÇg×­¶“SþO¡ãsÌìÞjÝêºï%Z[~_˯déÖ®·¤ñ²+œÖñô¹Ìw]Ùÿ7 ƒÁ`0ø» ë]ÏÜkÙíIŒu¾+e§L]«ïÎÖ‚ïoA^ç°î;=GR¡³?œév쯱Ö;<÷ôy‚· o$Nî1ç´ˆ=:ߥPîVãžuŸ£<´Ç <&«ü¿ê3K«yC©¸/ù4–£rÇ)i=µþ*/|ÎŽ^]ËQ¹NÐ1qŽG¹¥w>ù{å•á ?ÓKvÏå:A¶þó}E:·ÈÎ_«n+{ÑþuÿÃ=ì¯ó¿êÜr ³›÷qÍ“¾Ì³]>>ÿËdÑ}+½øüÏå|L¼…õâàõ0öÿ»1üþ`0 î…lý·Še€·ô®ùŽg:…®×ºñ¶Šž`W×÷,3ËOã?«½‘]—¾\9ûPø×î~Í[°£kOÿûWùiìGc~Æ)ãÄ-<žw¦¼.ý3qÌ}•ãž'vªuðw$V±’¬n“Ñváò(²r²ºÂÿ¸®5Žï2©½ˆS;W¸‹ÊÿkŒ_ÏKÑÏ”ó­8B/ÝÁhùèEÏÕ —'‹9êw?K;Òx:òxðº<–ì|@¶Ûc³ÄϽ®‡§ùVúàyâÆ»c÷ÿ@Û–ŽSwÍ8B•òq®Ãîÿ]û£=é2ôlBÓe6V}eö÷¹ˆž­«òRý(·ØéÃËáÞ VþßeÊöZT¡ë„4Ýûïad¢­e2Þ’ý+nñYöÏæøBõ—ºŸTq„®Sü×ÿ»þß”é<›Ãïø­[&Ï=üfÿŽ[|†ÿ÷õ÷s°zîPç)GèåèÙÁª}{Z×…Î3«³™n7ÅjþpûWó¿Îwfåtöï¸E¿wÏùß[ǽ×;ƒ÷…±ÿ`l? ƒÁ`0 ƒÁ`0 ƒÁ`ð÷á{ÑÙûô‘Á~ÿ¬ö½³ÇÒßi`oLöy„>uo©Ãßi\q‰ìKó|}ÿïÒû7žÉSvu9ÍG÷íñ©ì¯¿c¾#öÙé>·,Ïjoð­òw{õÕ†ú‡Öݲ‡Lûù=«mWèêòÈ2u_¤ö¬ÿ8د–åéŸjož?»Ú²kÞËDúøßß±¡öm¼†ýýwÔ>ôÃì#® }©ÛË×õ·E:¬ìOÛ¡O;<ÿ¬ÿsüy—›î¡Ô}›Ú›¾k‰}~úŒî±Õ|µM’†ï'8CTþ®¡¬o+¨[Wžú‚ÌöŒ½ø†U™ä©ïïQ™õýr'ö÷½î\ç­'ç’tœTY¸ÏwôŠÌz.Dó¥=¨ÜW|ÓÉ~q=_¡¾yª¾M»ÜñçÙÙÍÇ÷–¯äÇkþt§ïbS=2æû|¥Ò±Ïy´NÚ_}O¯îe×ù”摽ÛöàýðtLàœS6Ÿq`CÿíÌjfý´3–#Ëéܰ³?zÕ1 ÿéíHí¯þ]÷š“ç‰ýõ\"íWËÌÞ]åó¬ÊþüO;¾2'@¾ìã@~tGÎü:º«üªç{åÝuÊþê7m1‹è™Q]ßPWVç2ûS®Žåz]Ï¥zŸÒsý‘ÉÛ×3ÐÅ]vç‘îªÜÝxwÒžôÝ:Ú—>ÚyŠÁ`ð¡ñˆ$j¢ëw½ymkBTúÎÊþ¢6xœíš‰më0]HI!)$¤’FRˆ?6øc>>~Úsm£®+ŒvÁu…Õ‘øνYšuÌ8³´ú³uNÒ?¤WP>Ê1Js¤ŠWiVÿçü‘ý_uKðEÿ‰Ï¸ˆ/rœÌù£Âˆ_âšgK•W]×±ž™ÍEYòclÊó,[¦ŸTœYH»T¾Ïàÿ¶›ùÿíííðŽˆ}x¦÷ÇL#}A› ¼ÒâœöGüžVË7¼—‘^÷}>“iÒžº²-çøèþŸiæÿì;}žLJø°ìXí&ÇTÊP÷3ýTÞ#¯ôߨgÿ®ðJÖùl eäý'ï=ŠÖø?…͘oéçùn€í±aöëì›ô½|7ù>šý?ÇôU–%Ë;«ï¢­ü/ñmöµžN/èãI޵Ù÷fóQÖƒüz{Èñ<ÓdÌé6éd™nù;è¯ÚÊÿ¥²Q¾–mû{{÷5í$ýÀûiѦxæÿg<Æ$ò"Í^¾%=êü¯”RJ)¥žS—ÚçÍtïe/ùÖ”ë —°a};kú÷Ô_µöyµ?¬9ÔšÉlÍzÒÿ}m#¿óGßüKk!¬›ôók(Ë9êGüã1»¿”Þèz–×,­Q¿&îlÍiV濊ý²Üû#_Ö<òœöÂ3¹Îžm$÷^9g —{9&°w³&¼Û:Ë™ë‰uõfÖšúºR…÷:Ö½L+mWÇôW^£§Äz%÷I—½î¥2Ÿ£î—lo£þÏZ¶f?¾k4öW¼ÜÇ-è#¬ó­ ?V/ì—c^ÿ·!÷!{u̵ʴU¦ÙóÙ·ÿAœÑý‘ÿGe>G}þ?Åÿöþv✽Žø3ÿÉX~j½úœ—{øzT§ôA·O^ÏòʰÑ>÷³?syÊ|®¶ðßG)ŸP¦HÙV2•¼µøAä;¦Ï£#·öÙí¶WÇÇÇçúžiVÄáÇoeÚráq7¢¬`œ–d™…åiù.#¥æøHÝZ “°&ÖÀnª×¿wZu­ÓÜ [‡¥v³ú]’7û¾bóUá+~|ùòå¹¾gš³ÿþ±´'Lñ%°$TÃW!W"-ÈœP…”­åHØP Ó¶ ä9[P^€¯(€ìôzÄoô">ÖkÔI_U«ëÕq‚#ÛaKòcÕò-£ ÃÞžë{¦YÑ}}}c)‰YH‰+‚-Ù/ªÅɬV9V™f¦ù±Ã׃ÃNaäì(>ûô Œ]û§OGWG?ò°&UÂ’XeÔjÆuÒSjäZ5Xµbóèâ7† Îõ=Ó·ò7%;e¾– #µ¶”jÉL¨ü¤MÚâƒ'· ×ðøó¯o¾Á£GÓúxzzÇ?<-Ï…z¤Æù¤®Æ¨ÊHõKëÇê•[tþCCCs}ÏôLþYHK,A¦¼ËU^©53ÌñUpZëp¨ïîÝ»áá ØÛý>>9ˆ©‡Sz ܼõšëöÊ*3žrÌ`½=­V¯V¯ÜÊüCÎ_½ÿÍI^ɪAÆ@­ðÏPãAµ…Ù-¨®Ø… ³qs•^‰ßtFž ~z÷¬ùõAenÖ;Ìu2ê¡ó_ÀüC‹Îßœê„5¥L²j‚#­n–Ù ò´ÈZ.~ƒ›¢]ˆta[l!öí9¦óWŸ}Ge Ë; \Öüjí_«eYe/ ã*ò·Ì?ù›²%Ÿ<ç›$»:Ÿ¡Nörƹ1üš)®õÛ{qõÊ ý½‰IÔû;‘°%OÖÛå: F½µÙú¸‘áqÌ?ôóÏAzj9\é-pÚ´ì ÙóF}®ÆÇÕŽ çþª³ŸšúÇ>8KJ¶mÈ32Wý%w5rlMrÜ$ùocþ¡Gço‘ü3L’F«ì鵜 Çç*užçhÅGGððáטþ÷4þ|é 2-EØc‡9Ñ'}štæ96£Æ•Ñ —­QáñÌ?ôèü­i.ÙãWÀÙ&y5=—šËn{3zÇðå—w >#g/"ÇáCüF—¬û¼Ò§¹™ÍOÕ¹í-È•qž0ºh1ó1:[ZެÕ*‘go×ù=Ê?ßÙŠOÎ_ÑÙßüâ¶Wȼ^eBZ|©Þ#ª¬uÞOÔ©ç…WÑ«%ÿŸ1ÿÐ2“–u; ²v꼞Gå_˜ÓŽ;·'tþ<5ˆu‘f$l*DNFƒôi1²¶8Û‘ïèÀÚH悌üÍ.aöNägµŠ6 ­z¾ç;Ûô¹z¯{r:0võ†^óõîëGøòdµF¿¬¶'k¥-Ìn—k1ÿÌ?WÖø;P”Ó)óµMÏY£}|Ü.s¹MÏÿžÝâO§GPW¹ï–=ƒ<žè÷tm›3…Έ‰Lbþ¡GçŸnq#;£%¹#¯ O¶´AÆq»|߆’üfdgV!ÝT)ÏöV©i×u9În×ýÕy±«SÆUÖE%3ÿÐcäou#'³^wE®²¿WTnÒ õš×*ÏC½'ñÉ…+8~ì *¼»ôžPõW}Šr•©ëеê;onJ\¬J [ÄüCŒÎ?Ö—ÝÒ¼nçvuÍ«UÛRûnݼ õ¹ÿ!޼Ît¿ä/yËx)vw>Qo(Í È¸ÚÅüC“Î?3=OÖíµðôÀ+y•¸eÎæ)M娞 íïëµßãÏÑþ?À’ì•÷B›Q#¼šºF@·¥ù»åšÝXÍüCÐSù—öH^*³]Á60s^"cÀçÙ…OŒà³OÿŽáÁó(-jÐÿ7 Þ FÍ·ëðîFYA7bצ2ÿÐcä/ÏõÿžßIV»Äî`û4o~Ü™Èuø‘–äAr\¡ìñšPZЬy¶®ÜÓ-c`bcTþó™hYÛÛÛ;æ´{äÞ„Êâ}2Ç»%³=ò,P¹Í2rTÏò.Ù¨¿ó4Ê¿E õ½Q³Çèï1ú+E=¨*îŦõæÑ ç1ÿв¦¿¿ÿÚÊßÄè¿ÿ·Ô|åAÔVˆòƒð?A}ç/? U—½‹jß»ÆyÅ™ßÏÔTÏEãŽ#z?°jeì_–, cþ¡åµ;N‡ï,_‡…ó~·—Fâ­¥«ÿ‹ímeY¤nßšñüu½Ÿüh1~õË•wJJŠ~zñâŹ¾gšõ’ð:tðŸG""Ö &zÖ¾@Qk¢±:rÂårU?~üûׯ_Ÿë{¦gLNÞ;?ö·k‡. ¾P##ç*9ïCÞË“““ߘ˜xe||ü•»wï~ïÐ×’k¾,æúþˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ(tüD“~Á±5*mkBTúÎÊþÔðxœí}+¸ì(Öö’H,‰Ä"‘H$‰Ä"#‘X$‰ŒŒŒ,™QûœîžžéùÔÿÔˆZsé>U{× °.ï».Tæç}6žÚ³‘-Æ×F`‡£Ãp]Åkß…~Ãóbà ¶ О$Áwݓٱ„ÁñÍ|süñCo•›ÝA+Õq3¶¾lOàx@á(é0ða¹¯+?÷  ÜT,¤_¯7¸s\ÛÞϘ^Bl1)üCó•Ò+ÔkÛ(îFyN"8õ–dPCÌ_9ÈÒ>O0&l«4¸Im+þîënwîÛGrŰø™à»ø)/tih“f˜õÕ Ñ¸X†>ÊʨËEËÅòã)–Ô<,é6ös4ÅáÀÖ5›zàbð?¤¢Jðàö\<OM%O#(7ä6à:§= ªêýÓ‹YA£÷ƒH ¶«L s6›ÎMƒXêÈùBcX&ǘJ½te».Êöü¨Ï 3.je(”Ï?Ô?õèÉLÚjï³=€ÝÚ%wƒZˆizFTxô„$¯kPö8›E·mòø jAO™ñÔ×úÞ€«ž>~þ’†åÜàØ†‘ºéB9úµâ † Ö¤8U­«KCÃv´jbëL èåçC¼ï€y¯¡ ç;¤mj P.Ô —øãïDkñÂêwþ¡UÿE€3ôܨÁ”‘•’8xëUÀ…JÊü¹s£‰ž\„³èÉŸŽ+;}s­FãQ(KI­î÷¦XÝ›„ƨ ¹1 Ëúþ+Kú¨èdXŒ];JÄ£Žïcˆx$§DÑ×·Þž¢X`i× ì¨ëÑ@lÌûrn°m$¨Æ^×9΄ïzBGÏž Q=Ænfäk„Dêö¬e; <¨ýøaÓü>,µâ¢ž›jÆïk‡0BŸ[p(õâ$¿º‡Ç ‘ÛöÌpý4 nËËq`”XÆ“ù úvϵöèÙ.xõHnŒûorŸJ¾€Ï5¬ñÁàÿHàu©‰ñê뇗 fà§ í××a앆‰[Z:><ÇM@J£9óý¬â$Óq]¡}=H… kÐþ3ÆÊºã¯ù鲺t¿Q“=‚, 7ÆÇµß»ýìêçs Ä>ã¢3ø¶ïÞÜ6[¦Ñg•¨— RLت¨ù­?·( &wÝ.7C#~B{‚]¯Ó ×â—UÔW² 7™Ò1jk~‚e”cG»¿rËÇùÐãDØ.=ôËK´ÜîëÅ@ÝWÝDZMû0å€ãûíèä¼0Î\Úòxó®vÏqßNZ¢ >#Æ ƒ„ŒàBE— ™¥)•‚º&yØA}tå?Bûê Yìm(ÂWIpáɱò€ñ ¸|½2—+èýà\2·ö íÞ)lÜ8·ÖtlÁ@Z.B½€£ï•eñ…‹ƒRSßôƃm>d˜Iéþlþôò'N a†dÄ¢G3¹%†¼#«)?è¼Ï$sß _5=²íYÇBR#-k"qGP-Ðeþ"çf­ÁÂá%Ö©-Ï“37êÐäÌÈ8ÔM9™ÏŠŠ,¬èä_*n;H‚ÁúÆEBƱ†Öcl¿~øÎî±ç Ë[ƒŽ/saŸg¸IE2å,zÒ1Út:’kLÆÓçÎÁ¡ÍíÈ™壋G)æÔ{7ÊoðËÅnd¨ø¤è·ðá•{@rõP˜>ÆkÂwŒk×½¾¡ #¸kXfy‘ÖEÇ÷šÈA©ÍBÂ9ÂuM°ÛÞ4P=¹_Ól’ÆgW®Ø‡ÝN•Õ#–_n™‡Gï¤pp ,Z…ÿUu›6È“÷ÃV¦›Ó°¸å0EK‘7*|·ý]¯{ü75F\éÔ¶»úzQØ z!á‚Ç uH€>îÿó¦upš²ÚöõTÙ£»o3P)ˆø´[à^Õ6ãÖÚóã` -šd&á*=¶%ÄÀÊfY’<¿^’ƒØ·`_6¨ßÈ|h¸Ìë3Ø¡>€„2 Pºúqÿ×7ÏŽ³ ýÕü,Ns¾j»F™=BµŠü` ¨í³•C§òöiŽU’)Ré@LÅßÒ®„‹ÿ‰·Ç§mb<2FH“Rq°²ùF½åãø÷Xºi䎲õOm¬GAýÝ·ôÒ}:¶*¾Ëu ÄfØ:@Ê«RH™.òÙ6Âñ¼±Ã6Žjå§cæGOpO- ú­6HÒýúÜÊKÉJæÛUÀÎì:ºJǃ¾ŠýÉvÆ,¡•¸¯3ÿ‹DìZ‹¹EñÊÆ®ÒqqðìØ7p?¸ƒÈŒÞK¬÷Å%ȧ$;â¼?ýQ¬r6³pP7`¼a™†¸é^=„„ýÉRç¶_†õ™³)m£„Ç>ÀD3#£ ¼_' çIþÂÉ­uÍ‹CÁÊ-Rne㯄³²Ïóss•ÀîLÏÌ<È­/µàR)|Lt_1»éòÁ¨L¿kÇ=‹rr 4ùìê§ü/gýšEÀrþÀ~P†¦nBß[ ®\g[{¡«‡’g£ãYÛvRŸW'†‡ {Fe°m1ïÞŒ{ Ýw¾LÿÕ;7¨&$‘çþxúcÚøÃÐ0Ÿ ŽžnÝö‰óí&úÚuÅ@5sCèCÕ±mœñ8Hƒãefñï¹Æt ’Îx{q(a¿²ÛÑ‚a¡?€ŽÐþQ“%ò§ÌlÁ¬ö4ô‚¤Ï‚xmWI׆€Gí¯¦CèÒôì1ê’Ûk×QÖýŒ3iJhÜ,Çÿ€úãú‰KºšRˆ÷ÅÄð¢ÄÂÈöÈO`úÈç…ʲ»†½þ4á)ú%ˆùÔb6îB8ý\ ³pµõšÉì«e<êºíS鹂ØìÚ+ÓjsðÄpŒ„¸ß%<&t{3?Œ£¬|N)p7b™Ôîãé?Ôa¤iäDµWl’¡½ðˆX—ŸÀZÚ>;uø)¤ko)#WáÈÍSšn®cR½xô”{[ÀsXv1¤¬95‰_¬¬0KéõÁжՙ7Ú>žTp¡5‡‹¸Ù´¤l3¥Sü"ØêLXê…ç«[á5mö¡ø º¿Q="u}ö‘ÆpϘ*xböÕ‰ºîã—ã#iM+³ù@»Z! þ·Ï®~jàÒY”ݬ‘¡´Ò$?5Š• mtêuˆ] ‡%Ž@Ž÷Ý…:4h8Ûƒ¸˜¡»tuì3À;ú ΑO¤1A/r‹¿¾™ ÆÏR*5ÀÇûÿËìiÜ&j#Y2:º$Z(a­dæ@ß>'z ž„×L¬¯³¬Û뇶©½6ZÑÀ8|`Æ6Ý"åŒX1ß_€z' îF-©÷»Ñû?°úX^ò A:?1¢;ØÌh/KžVB'õ üvOnÏFSò‚¼É õƤê°ïÌÞQ{=kh7™ÀMå¯ÀwXQùpü\vïÍ“ÎO/ÿ¶.ÅöÚñ¹ ôN3·ÍHKRðÉlŠK–"›qò”‰^Wܳh¼1wtùã  h@§¬Ñ3ðe6þN|–’¶Á©‹I;yîó?8t[ƒ[é!‘ ú¥µ$,ήL­·e–"z¦å%IÞ†AêkÜÌRäl!3uú8àÚyßë?_žWÅé½)ƒAbCÒõéõOù!rz¿„a¢¤5S±ÍnÖ—£³ˆ#Â<ý43yÜ6"ª ÒRýêÑô߃C‚Qå¿&>¸[¼# BHÍǽß{v¡eà×kOÃ×TÉlq(UHð͵h »Ý”8º,@t°µöÈÃÕ‚LÛ{p´•ü‰/Ø*ËL"d_y ïŸk,4î GÌ–ýÑbD>,ÁÏ.ok"ýD;†|7–[.µDÖCíAœŸä#‰iÇæélÿü¯‰ÏŸ¡IÖ¬ÐòâóÞD¿q½]+ÞeE •ò–_«-- ™ƒ¦ Ú°c©›³èç€^ø¿¥Lô˜q±1~ëCßC“ÿ”øžC“9¡ŽgNäóýÿû“õHÈ8Bkhêç«JÁŽ#Z¤-`úVo§™MËa 9r$îÕºZ-¼hókhò ?C“$· û^–ñtÄ÷¿9d(‘8PÝ…]Ú¶š£×w[¢wléÏ;µŒd•Ôn—׆ôoÎK«èdù H¦Þ„(Dú¯…¯Ÿ¡InüIÌ Mïãü_(ù¼ðœ’îð5)6H/öõÌYÍ1‡¸ ±QRæŒk,nËÖûXH½­ʉð‘ƒÊË?>ÿšdf“ç&6³üü½^EJ–m‹ªétÞÈ{¥C—µ›½ÌC¬c`½îÙ0Ê…v5ÃÂx<äƒó\9Y·Ýÿcáû×Ðä}1Ú06"×´!ÖóŸë9êdl:'– û1H"Áz'7ùQ‡q›„¹Ž¾¹ÉŒí#KâR.ò/C“»VÖÜgÇQ×Ȭ¨åéãó\ âì`¸·?dÜÛ1y³”åuMÛ6Ƶ8ZX]8Ãø^p…ªwQëE¾ç &­1frRšÁKiûñçÐ$G¤ÎÓðÔÝœÛÇЕŒ¯ðh3'À®Âø”·“Ç{¼±š;;Ö~F öKî37Ðkš–Ìu<pöµdÊŽåèˆ+C¨š¤™ Rá‘÷Mz¹Æç¿7)nÒ€©æöÔ lEGyÍl½‡:Ì‘ÿIÞí’o±BìÞÿ—S%|ë‚ÎЕïsTuÆleÁõ’bšA}A¸ëæížÍ´þ1ãý0ÀA{ÉKù“ʘÓº¼tjÑòÇÐdLI=rž ¢PRgóûÇó_Lb¸R³£é Åžël?«â”ž)!°Ö[«‰FÂæoÖç wi&k^”CV(t@püW2Ó÷²ó{hÒxH—GRn²͉ŒeCbúxÔ‰°ªé6GÁ³©÷‘¬Q…Öd27\ÌØ«dœS‘É=\»F§f*¼0é‘Û£ÜOPúÇ5(r„Zß™xQ‘Z>¥~G AeN-õãùÿjYôÜ7—Ò¾n;ún?Ó¹"P·¯xÒ}‡·•/àNäöÞW:ÝŠ&´—×¾†Ù:x" ꭥу;†ÄRç펔¹ ®cä›…Ñ™õ±ñÜýüýElmG§a= hò¨BG_æu…³×YnZì«­FYs ôUéµ"zM&Ë:ËÝGn¸Ïuí.õDX‰ƒÉ5XnšÁ¡ö›;Þ}¶Ô«%XO?½~2&ùÝØî¸Frjj¢¢…8ˆ› yAÊÆä*±W ¡³‰€©ÒIÒ˜÷“9/¹§u‚b)õZ³l:ë sá¼¹ 8²5ÀÀJõš>~ÿi´œÐó˜I¿þ3YÏÔ•;ç:#hEL¬×[ROd‹Ê^GéšAË©fß~Y!ýËÐäEåêñn·ôü0¯~Åà/«AÝò –Kåm÷‚±>^ÿÝWY¢q†"µ¥â<цFвÎë*c¹½:xÛw„|¤Ížw­—%ýehRg°åØúæÜæd¿9ç´üÌ•ªËÃvž3Àv Dg™hç>>?ÿò3é‰hŸYDkgCã(ʹƒªÔ•ô×SÉ·†¬Ôœ|è 2QÁü94©(ñ½?OG•Q34… fëcc³¶PopT€Yaƒ–W(£>Çÿ@­tãX4ˆ`ðLG¦Ùžp•‹É„ãaïãšÅ°l\¤[9‚cû26óâU M6f,ºŠò¼Ë'›¤…žCÐÖñ4øi¥?W~p¯sÏ ?žÿk³ÞA÷×KÃrŵÄÅÎk@–Ið|>^xðs¸?ý\Õð`,DèäõÌ’©Œ°Žû5¯éWÛüÉ^£èøçw €DÓµMˆáøXf_8<%|8_왉pPó1†…ãî„WþÀlm߃˜“Šf?4žý¼»:½òÌ“_£Ô”v ûûMà;kž:pÍÖ²â_ÖùásjØŽqw]$F‡£}ÿ¢»y« ××û,b'Õè°N‡Îþ=Ôo¹öÖôÔ0, õ¨Çÿº»â~–ÆM‹ƒÄû Y•R´‰¥4â6+!”}@~u‡j°ctCÔúàõP.ÅY(ýxÿ׎ ½×zµ?70ÆWXFÜ£¾oŒ½·¯‹3z‹Š€0°®Ác8¨R£êG±¢g›0àö ¦T—Uëøò„½»‹w­"/4³ÞÖ÷¿¾îC¾Q`[{O³“ºcÈn¯]•¶+•{Û{­ç¼ÞÕÎ N!3•<®ÞÇVí‚ìyxé,!C æ™b². êlfÖ×åÁø'„ÒÁ\ ןÎÏíãëgu,μ·¸šw-/ôß3Û¥ùºñíN°íâX(›c ƒŽÓâoõMDð‘sÊ¢a·#ü#0{c ÁÈÀð%µuDWCB¥Z€AéÍZ6»,Øçûxý (Z%‡±µØçw€ÑÀáŠHbhTb2ùþ<$÷Æ*cÀ¼ænk÷³”_÷וð«Ð÷¿#{D+B<™!âÇüS/¼gÿÃ`ø9”­.^]ŸÃŸ™ÆCíÌ+>™ì3ïƒ+•ý5Æë]¤q‡„Äp¦j' r¯9µ¼FDȬ)~: ã躟—9GmÜì“x2’¥ù-?s–raG"yvU³pa;R«çãø÷ăœ ÌAŸ\&ú¹“ ÿ?#Äìn Ûí0Úee½´“d~o’qå¶­¯!!DzP^H)>¾oµëÈ‘.®Ä¼‘Ô¶=Hy»7´S´-M½ á?Þÿô8y£c¶Î™ß§q„|Ü#Þ5"ù2Б ‡lµm#—ýU‰ÑÊ»ìýeüΤÎV†ÎÈbMƒ¤Í˜÷jAÌc7¾Z ä]> 4½gbö Äýñõs 2WRsKgí6Þæç 's8qzñTT[”R›[wÄÍ)I‹—9ø5x¥ŽÜWjýÚ #”!nN+zP’ÄÚ”â ÁKgâ²ÁÞTEŒ,ÂÁùÇë?³¥{é^R¨DÝ¥=´R¥u^zîc¯’§³Ì¥&D¼‰'i74øSËJ½ß”í&H¥æU©Gà»[û‚ácrÃͦŠ<ú’‹¡׿~þ‰4}Ú…žíh¢°Î;¯üòlpAZð´%’XÔZ;t®Q?„±÷÷žóy™ïk1+Ƴu6Â[«©ÌÖè† áDõ™c4¿ÆœÚóÐÝ*d„•B#!}Þÿe>Çsamh¡¹ÿêG3c^çæ—8u9󼵕⸈߂ÏUéy‡‡B;f "Yi=ÖD§ =Êâ‚Á4‘íŠ&¡Ž’Þ×|¾Cý“Ò3»Ä÷šg]Ø~üþ›WgjhSIXU“‘"1A5Fr4×{üáÜëAä—éljŸw¸TðÎá–Ýt6<ï/NÁ  \û¤õó«R¥tÇû˜a| Æi¨ÌÍ>‰T.šWo>>ÿxŒ•ϯ¼Y¼æÈ{ç··m,J²{gg}Év~)ê]Ñæs!?wøè÷X›‰æè˜G—F°¥l!7ކUœÖ|Cnáfï³…:.@mq%®Á臔±ÜÿÓRu?.–:¯èaBë¼ÖºÌÌE#Gƒg'yX«Dåÿu‡SWºä™ÇŠD)Œ˜21×ѵ‰VµˆagW¬àP޳²q½ç«ÏÈ’Ï Ís”?¶•@åg")ªíªç©s\ÖTòâô{Þê«f3g÷‰oÑþÏ^w:^ë¼"•Ý{¹ªd#³!φtà}©,nÆyWFKv„X”4–ƒ|<ûB+ è®Â8ˆi=-;´³X 5l=/xlêóŽw•–å÷n³]ì à+SÛÓ¼,{Õž¯/ДâV¡û»+<< ØÌ¤®Ào ŸâÞçèÔ‡eNpù^Oÿþ¼ÙùŽOv qR¶ £wHF3ûÝß=oý;ü`~k’RÏwCßÏí²”u¦ãk¡jE˜|û‰qÏ©ŽÔ‚KV,Ï àÏ*?ÞÿþxkáÜ}QxÁU¹éœ/MÛüÞÄÂá= ¤Õ°pý¾Êæ=çŠÎ^xúBË÷ÞÚKx«§Ó@ð[òÎI™¾ÔYB]Tª¦âž™çÿúÑKqÉ.á½€PÖÛwÿ¼ÃÓAG\ôšWÂÏ‹Øâ9ùãÏ2S³—åA\è“Y\œßy=ǨðGj÷¾ÌéÇõÕ¢ÂMî@âŒtÔ‚¶„vD¾üƒzÎ+²ÙÌBĺ\·Ÿ¬ü¼ÃÕ¬…÷Ùë6ËÛk™6Lþ¸Ê¦ÚRß_rýnl|UAϯ< ¢¹Ë|¦²!‚¸;ºÁ8™_1ÜgésÞùÆCŸ‡ÿ¿ä >êVB‰~æ,¶¹® Ë˜_ÿ&f™äÕjpñ/WÙÔÊwaùO ¼š°H 3ÉÛûþ¾I`˜ÈòuØù»õ¸1êͤÉû·ÈÏ÷ÿå+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò•¯|å+_ùÊW¾ò€ÿÝš™w)¦÷$IDATXÃÅ—KoÇ…¿{«{^¤8|“²õ %+²©—!E$8p„ìòbÀ«ì½óÂ@–YD‹üYˆc#±Qœ@°b´DRdÒ"‡äð=C9]U^t÷p†äÐ@Ä 1aÝ:÷ÜsnÝï=?äR~à¤_jµšT66GßyçÝ_óÍô5Sµ‘ ^"¶Ä9§6rÁæÖVap°oëêµ+øÝÝßÞ*’–`lllô“>ýM>ßwÝGa¡\^q;Û‘ˆÈKe蜥9ñÎëb¹äLfsùÄéâý÷ßÿàWÅb±ÒȰ\.Ÿ^_ß¼ŠëéϘêódC`ÏùÞƒ,õz„µ‚0$ Ô‚ÄÉûx¯Ã“É€ŠR*?*L=™º5===|áÂ…' [[[™íí¨²PY2²µuT…T¢"BY¢º%“ èí/ÒÙ™Ã{X]Ù \^Ùlˆ‘^Á£¢äry¼æææ*Õjµ«Eªê¬õàaFQ&™^ÀYK¡#Ç«Ç8ûÚqŽŸ¦ k-/f晜œáéãiÖ׫xjL ðˆ(Þy1ιVÆ 1Šªà< qŒzDÿ`‘·Þ¾Ì[ˆêuL`9sŒÛ?½ÂǾϽϾdi±B6“ið‡ˆ€‚&šJµì®€ˆ¢øÝg lVj¼˜Y`c£ÊøøO?ãØ‰W¸qóMrùW®½ÎÓ©iV–7ˆlD&ŒYôIrβOT-D¤ñÙûa&$ŠLðìÙ4333¬®Vèïïe»fùùÛ õÑ7pU¢B*¢8nÕ·ªŠˆ"¸]’:À³¼´Î·ß–ØÙÙÆZai¡Jyq=%‹÷UÅy‡¢Šz¥=ˆ€´!bi”F/J6—#“ÍÄÎÙÜáü§øÉ‹ˆëf_ÌSÛÞ¡- "( qùq* ‡”Á¨b½6%/©­ã€(Ö:‡{xëgW8{î8µÚ6÷þþ“Ÿã"ȳ åÉ^Qš#\‚„D¬ˆËe¹yûçGOã¬ãéäs>ùèk+Uººú1j’f×[Tú½"LXØ{túd# çGOrõÆëäóYüë+þôÇY[©ÑÙÑC!ß71ïIÍ7µ8nó¬­‡ø'ôP£\¼|†ÁÁJsóüí¯c<™œ!—í¤³³‹0 ¿'†o§Øª ¾ÝMmQUNž> ÀÄã§<øç8ÝÅŽt L¤·ßæ¸ÙçÝçb«ˆÄ%QIž5F¯ªÂòÒµÚ6³³ lmÕéíéM2×dŸÆ1±áwA¼YðM:hü‚çóû_ñ£‘aJ³K ôÇ¢SÒ}ì Sß$îö"TIèÒ¤R‚øÝª&×ä×3<›zN¥Z¡óH‘ c–šz^ÀU¯qüCQSËld’:9¦ÐZ‡ªpùÍ×9÷*ss <|0ÅJ¹‚ sññéVG€Ø²Çmk¡^’V†Á¡n¿}™¡á^ÎVO°³]çÞg,×/- ‹ï9\’ m”Àû$Mç+T(Åî::òˆFlmUÈg ˜À4éy·ƒÆò—}íÀ¡sWµÚâYŒÁYKyq•/îÿ‡S#G)Í•ø÷—p6:Tµi&Ý=/½_öΘÁ¾6«ÚöJ0ÁZÇ_>ü^묭¯Õ=ƒýC„ݧòæòî2p@#òÞKÆÄ H‚yßÌAÌŒò…õh‡î®UC6›EÅĬùd ib\D1bÔ4Ʊù|ÞŽ?òçFò ž¢V¯Å÷ˆg€t”wñÜ߉ð¤i(nÊ‹%ÖÖ—É„¿ÀÀÀÀÄ£gú¾ÈØçŸÒÙÑǵiÇM Jö²äÛìPæg9v²;w~q´P(ÔZܺuk¢Tš½ëØy7ÌÕû2AÈÿò­Ñ9K÷À+üøü¹õë×oþ¾»»{¾åÍ(]•ÊÆ{ó 󿜟Ÿ—v‚úoW†„aæãK—.½×`æ ·ãJ¥8çŒ÷>ýý¥‘ˆˆO,uuuE‡ø®ï¦_êΗ IEND®B`‚phpsysinfo-3.2.1/gfx/logo_48.png000066400000000000000000000034331247443170600164770ustar00rootroot00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYsÈÈs ž³tEXtSoftwarewww.inkscape.org›î<˜IDAThí˜_LTWÇ?çž;3ÌŒ20ˆ8#Ô–&PkÓN M·«Ð&¦›øP“6>X}hú¸š˜lb|p^öч}éCKÙd_h hI­1tɦÕ,‘v¨D$V‡ ÃÌýwö¸Ãð§0 Mü¾Üß9çwÎý~ϽçüÎ¦&¿”ò/¦i~é8N˜“>ŸïïRÊ6YUUõ…mÛSJù‹Íªø-Ëú“â‰.„øØqœbÚ,Ëú³nYÖÁbÙ* Èi€(6‘­Âq¡¿¨¿€RŠ—Š ¥ºaèº^l.[†žN§•®ëx½^¤”ÅæS”Rè–eaYRJ<Ï #Ķm¥¯¨À¶m4MCJùÜþZJ)wÒ×dè8Žã`š&RJ4MCÓ4„(^ÈPJaÛ¶Ëm NñÒWò„lEŒÒuT(¶˜™AüÁ¨” …ÈÄã••JáÄ30ç—' ¾¾žcÇŽQ]]ÍÞ½{ ƒ¼^/™L†ééi†††¸sç7nÜ ™Ln(F…Bd›š°ª«qXôUJ¡Í΢ML âBe³(¥f{÷næ>ù‘N£ß¿ ‘>~oUþÞ^w|Fÿ„Ξ=Ë… 67›JÑÕÕÅ•+W]Õ.„ ÓØˆÑÔ„Ò4ÔãéìèpË©O?¥~û-Â40b1æßŸà7ß ÿþ;Àôº¿P*•"™L’Íf1M“ÒÒRÊËË …B.Á––9}ú4wïÞÍëoÖÖ’y÷Ýœ Ã@ÿí7äÌ JJœP§¬ »¢4 Ͻ{®¯ bïÞM ³Ó%àýé'²ñ8öþýKÖ_\¼xqU}mm-'NœàÌ™3x<Âá0W¯^åèÑ£¤R©'M#ýÁ¹ÙýõW]]yd–“5ß|ïà`®2X=?¿Ê_d³8þ\ꢭ'`=$ ÚÚÚ8wîæ"¡H$ÂÉ“'s¤Âa”Ï·ðBÓ$píÚšä´¹9|}}`¹º‰ „a`ÕÔäù:;wbWT Ÿ<Ùº€%ôööÒÓÓã–›››]Û®¬tm91XÜÅ6 ÇÁÛßOöw°÷ìq«Ó}„63ƒç—_ܺ- èïïwíh4šk°,×´ËËݧ”ôõ!ki\)±£Q|?þˆXþµ §C&“qíåQ[޹¶òùÈÆã…®÷­%ñKÏ_s[\{limz™LºåÌ{ï1ü8ÎŽ[{‘¦¡Ö9ŸmY@MM GŽqË·oßÎ5*Eà»ïò®ñƤ>ÿœtK V$RлÌW_%ÛÔ´f[Át]çðáô··/\#e³Y:–!mjŠà×_#÷k¥i˜õõÌ:ÅÜ©S˜uu›ZžD‚’[·Öæ³^§X,Æùóç())¡´´”p8Ì¡C‡(--Í‘RŠË—/322²j 9>ÎŽöv̺:Œ††¼™·"¬ÖVôX w7Úää†B PWWG]]Ýv~üø1—.]¢»»{}'ÇÁ30€g`»²ãàAÌúz7NXÑ(©Ï>#ÐÑþèÑÓ°¦i266F2™dhhˆ›7orýúuŒe[ÚFccø{z(ùá²ñ8F<¾pN’’ùÖVv~õU^@sß][‹µo_a:;;ikk N355…RÉ6a”ܺ…'ÝÚ Bà„Bõõxþy•¿'‘À3<Œ‹m^@*•Zó”ù4áD?pÀ=2,à›Å¶âÀÓ€¾l’ì]» î_tÊëum17Wpÿg’µ+)Q¡Ð†[£òû1_=GfYô^sÿ~¬W^Y³í™°^{ô‡¢?x€÷Þ=äè(bvv!Ö4œ`«¦†ìÛo㔕 ÇnO"±æxžû÷ñŒŒ¶ˆ·óÀ«¦&ïL/L¥ë«£¯Rø¯]C›˜È¯¶mT0°OÚŠ¼â™Ð‰…äcÅ¢TÏj߇ñõõ¡?x°ªMNL`¼õÚä$Vm-Â0ÃÃy>yI}$aßbÀH&“ ¯p.NYv$‚½k*@ùý`h©Úì,òÑ£¼ìj%ì={˜onÆ®ªBÌÍáÿþû¼Ü˜Îð¼BˆLVß#­+ñ®¸êP¡ÝØñõëÖ¸#i)8:S.¹Î¬žåjÜ[/Uv– åloL´Äë3 kÔò&µü§Ö~jã´å·ýÒ~M™©LµGJfŒ2BÊ”‹ŒÌ˜„Zf—=çEf™QdÖŸî’wLÛ…ÈŒ#³f›d¶&ÊÆ©°uºÉlÕ“¶;îåû‰ïxLHÖŒ ɇ È È Èè~£…+É:Ò#h›hÎ#5=&¤N.eÄÜïhiL˜(B:’* ÕÎÞÆ‘îC½{ ¦í¡í ¸ ºypf œùÝ Dh¨æ÷dçƒIEND®B`‚phpsysinfo-3.2.1/gfx/treeTable/000077500000000000000000000000001247443170600164225ustar00rootroot00000000000000phpsysinfo-3.2.1/gfx/treeTable/blank.gif000066400000000000000000000000671247443170600202030ustar00rootroot00000000000000GIF89a€€€€ÿÿÿ!ù,Œ©Ëí£œ´Ú‹³>;phpsysinfo-3.2.1/gfx/treeTable/tv-collapsable-last.gif000066400000000000000000000002011247443170600227530ustar00rootroot00000000000000GIF89a³€€€ÿÿÿÿÿÿ!ù,.pÈ9½Øâ]ùÖ Žã'œ¨R@Š®Sëªf`Û*ÏtÆÃ™ X!é<ȤÒ;phpsysinfo-3.2.1/gfx/treeTable/tv-collapsable.gif000066400000000000000000000001321247443170600220150ustar00rootroot00000000000000GIF89a¡ÿÿÿ€€€ÿÿÿ!ù,+œ?‚ËÊŸàsRØ{'ØP$tÜw„¢§ªêaå‰60i˜"`®ñ ÿ{;phpsysinfo-3.2.1/gfx/treeTable/tv-expandable-last.gif000066400000000000000000000002031247443170600225770ustar00rootroot00000000000000GIF89a³ÿÿÿ€€€ÿÿÿ!ù,00ȽØâ]ùÖž Žã7œèR  ëÔžïK- ë*)»0-˜I/¤¤gÉl.#;phpsysinfo-3.2.1/gfx/treeTable/tv-expandable.gif000066400000000000000000000002051247443170600216400ustar00rootroot00000000000000GIF89a³ÿÿÿ€€€ÿÿÿ!ù,20ȽØâ]ùÖž Žã7œèR  ëÔžïK- ë*)»0-˜I/¤¤·D6Yœ;phpsysinfo-3.2.1/gfx/treeTable/tv-item-last.gif000066400000000000000000000001021247443170600214300ustar00rootroot00000000000000GIF89a€€€€ÿÿÿ!ù,Œ€ËÊŸàsÑj.Ö•K†!F–扦f;phpsysinfo-3.2.1/gfx/treeTable/tv-item.gif000066400000000000000000000001061247443170600204730ustar00rootroot00000000000000GIF89a€€€€ÿÿÿ!ù,Œ€ËÊŸàsÑj.Ö•K†á„YåáA)yFmZ;phpsysinfo-3.2.1/gfx/treeTable/vertline.gif000066400000000000000000000001041247443170600207340ustar00rootroot00000000000000GIF89a€€€€ÿÿÿ!ù,Œ€ËÊŸàsÑj.Ö•Kf‘‡Ø˜™=;phpsysinfo-3.2.1/includes/000077500000000000000000000000001247443170600155355ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/autoloader.inc.php000066400000000000000000000045151247443170600211620ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: autoloader.inc.php 660 2012-08-27 11:08:40Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ error_reporting(E_ALL | E_STRICT); /** * automatic loading classes when using them * * @param string $class_name name of the class which must be loaded * * @return void */ function __autoload($class_name) { //$class_name = str_replace('-', '', $class_name); /* case-insensitive folders */ $dirs = array('/plugins/'.strtolower($class_name).'/', '/includes/mb/', '/includes/ups/'); foreach ($dirs as $dir) { if (file_exists(APP_ROOT.$dir.'class.'.strtolower($class_name).'.inc.php')) { include_once APP_ROOT.$dir.'class.'.strtolower($class_name).'.inc.php'; return; } } /* case-sensitive folders */ $dirs = array('/includes/', '/includes/interface/', '/includes/to/', '/includes/to/device/', '/includes/os/', '/includes/plugin/', '/includes/xml/', '/includes/web/', '/includes/error/', '/includes/js/', '/includes/output/'); foreach ($dirs as $dir) { if (file_exists(APP_ROOT.$dir.'class.'.$class_name.'.inc.php')) { include_once APP_ROOT.$dir.'class.'.$class_name.'.inc.php'; return; } } $error = Error::singleton(); $error->addError("_autoload(\"".$class_name."\")", "autoloading of class file (class.".$class_name.".inc.php) failed!"); $error->errorsAsXML(); } /** * sets a user-defined error handler function * * @param integer $level contains the level of the error raised, as an integer. * @param string $message contains the error message, as a string. * @param string $file which contains the filename that the error was raised in, as a string. * @param integer $line which contains the line number the error was raised at, as an integer. * * @return void */ function errorHandlerPsi($level, $message, $file, $line) { $error = Error::singleton(); $error->addPhpError("errorHandlerPsi : ", "Level : ".$level." Message : ".$message." File : ".$file." Line : ".$line); } set_error_handler('errorHandlerPsi'); phpsysinfo-3.2.1/includes/class.CommonFunctions.inc.php000066400000000000000000000515001247443170600232440ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.CommonFunctions.inc.php 699 2012-09-15 11:57:13Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * class with common functions used in all places * * @category PHP * @package PSI * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class CommonFunctions { private static function _parse_log_file($string) { if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { $log_file = substr(PSI_LOG, 1); if (file_exists($log_file)) { $contents = @file_get_contents($log_file); if ($contents && preg_match("/^\-\-\-[^-\r\n]+\-\-\- ".preg_quote($string, '/')."\r?\n/m", $contents, $matches, PREG_OFFSET_CAPTURE)) { $findIndex = $matches[0][1]; if (preg_match("/\r?\n/m", $contents, $matches, PREG_OFFSET_CAPTURE, $findIndex)) { $startIndex = $matches[0][1]+1; if (preg_match("/^\-\-\-[^-\r\n]+\-\-\- /m", $contents, $matches, PREG_OFFSET_CAPTURE, $startIndex)) { $stopIndex = $matches[0][1]; return substr($contents, $startIndex, $stopIndex-$startIndex ); } else { return substr($contents, $startIndex ); } } } } } return false; } /** * Find a system program, do also path checking when not running on WINNT * on WINNT we simply return the name with the exe extension to the program name * * @param string $strProgram name of the program * * @return string complete path and name of the program */ private static function _findProgram($strProgram) { $path_parts = pathinfo($strProgram); if (empty($path_parts['basename'])) { return; } $arrPath = array(); if ((PSI_OS == 'WINNT') && empty($path_parts['extension'])) { $strProgram .= '.exe'; $path_parts = pathinfo($strProgram); } if (empty($path_parts['dirname']) || ($path_parts['dirname'] == '.')) { if (PSI_OS == 'WINNT') { $arrPath = preg_split('/;/', getenv("Path"), -1, PREG_SPLIT_NO_EMPTY); } else { $arrPath = preg_split('/:/', getenv("PATH"), -1, PREG_SPLIT_NO_EMPTY); } } else { array_push($arrPath, $path_parts['dirname']); $strProgram = $path_parts['basename']; } if ( defined('PSI_ADD_PATHS') && is_string(PSI_ADD_PATHS) ) { if (preg_match(ARRAY_EXP, PSI_ADD_PATHS)) { $arrPath = array_merge(eval(PSI_ADD_PATHS), $arrPath); // In this order so $addpaths is before $arrPath when looking for a program } else { $arrPath = array_merge(array(PSI_ADD_PATHS), $arrPath); // In this order so $addpaths is before $arrPath when looking for a program } } //add some default paths if we still have no paths here if (empty($arrPath) && PSI_OS != 'WINNT') { if (PSI_OS == 'Android') { array_push($arrPath, '/system/bin'); } else { array_push($arrPath, '/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin'); } } // If open_basedir defined, fill the $open_basedir array with authorized paths,. (Not tested when no open_basedir restriction) if ((bool) ini_get('open_basedir')) { if (PSI_OS == 'WINNT') { $open_basedir = preg_split('/;/', ini_get('open_basedir'), -1, PREG_SPLIT_NO_EMPTY); } else { $open_basedir = preg_split('/:/', ini_get('open_basedir'), -1, PREG_SPLIT_NO_EMPTY); } } foreach ($arrPath as $strPath) { // Path with trailing slash if (PSI_OS == 'WINNT') { $strPathS = rtrim($strPath,"\\")."\\"; } else { $strPathS = rtrim($strPath,"/")."/"; } if (!((PSI_OS == 'Android') && ($strPath=='/system/bin')) //is_dir('/system/bin') Android patch && !is_dir($strPath)) { continue; } // To avoid "open_basedir restriction in effect" error when testing paths if restriction is enabled if (isset($open_basedir)) { $inBaseDir = false; if (PSI_OS == 'WINNT') { foreach ($open_basedir as $openbasedir) { if (substr($openbasedir,-1)=="\\") { $str_Path = $strPathS; } else { $str_Path = $strPath; } if (stripos($str_Path, $openbasedir) === 0) { $inBaseDir = true; break; } } } else { foreach ($open_basedir as $openbasedir) { if (substr($openbasedir,-1)=="/") { $str_Path = $strPathS; } else { $str_Path = $strPath; } if (strpos($str_Path, $openbasedir) === 0) { $inBaseDir = true; break; } } } if ($inBaseDir == false) { continue; } } if (PSI_OS == 'WINNT') { $strProgrammpath = rtrim($strPath,"\\")."\\".$strProgram; } else { $strProgrammpath = rtrim($strPath,"/")."/".$strProgram; } if (is_executable($strProgrammpath)) { return $strProgrammpath; } } } /** * Execute a system program. return a trim()'d result. * does very crude pipe checking. you need ' | ' for it to work * ie $program = CommonFunctions::executeProgram('netstat', '-anp | grep LIST'); * NOT $program = CommonFunctions::executeProgram('netstat', '-anp|grep LIST'); * * @param string $strProgramname name of the program * @param string $strArgs arguments to the program * @param string &$strBuffer output of the command * @param boolean $booErrorRep en- or disables the reporting of errors which should be logged * * @return boolean command successfull or not */ public static function executeProgram($strProgramname, $strArgs, &$strBuffer, $booErrorRep = true) { if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { $out = self::_parse_log_file("Executing: ".trim($strProgramname.' '.$strArgs)); if ($out == false) { if (substr(PSI_LOG, 0, 1)=="-") { $strBuffer = ''; return false; } } else { $strBuffer = $out; return true; } } $strBuffer = ''; $strError = ''; $pipes = array(); $strProgram = self::_findProgram($strProgramname); $error = Error::singleton(); if (!$strProgram) { if ($booErrorRep) { $error->addError('find_program('.$strProgramname.')', 'program not found on the machine'); } return false; } // see if we've gotten a |, if we have we need to do path checking on the cmd if ($strArgs) { $arrArgs = preg_split('/ /', $strArgs, -1, PREG_SPLIT_NO_EMPTY); for ($i = 0, $cnt_args = count($arrArgs); $i < $cnt_args; $i++) { if ($arrArgs[$i] == '|') { $strCmd = $arrArgs[$i + 1]; $strNewcmd = self::_findProgram($strCmd); $strArgs = preg_replace("/\| ".$strCmd.'/', '| "'.$strNewcmd.'"', $strArgs); } } } $descriptorspec = array(0=>array("pipe", "r"), 1=>array("pipe", "w"), 2=>array("pipe", "w")); if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { if (PSI_OS == 'WINNT') { $process = $pipes[1] = popen('"'.$strProgram.'" '.$strArgs." 2>nul", "r"); } else { $process = $pipes[1] = popen('"'.$strProgram.'" '.$strArgs." 2>/dev/null", "r"); } } else { $process = proc_open('"'.$strProgram.'" '.$strArgs, $descriptorspec, $pipes); } if (is_resource($process)) { self::_timeoutfgets($pipes, $strBuffer, $strError); if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { $return_value = pclose($pipes[1]); } else { fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); // It is important that you close any pipes before calling // proc_close in order to avoid a deadlock $return_value = proc_close($process); } } else { if ($booErrorRep) { $error->addError($strProgram, "\nOpen process error"); } return false; } $strError = trim($strError); $strBuffer = trim($strBuffer); if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && (substr(PSI_LOG, 0, 1)!="-") && (substr(PSI_LOG, 0, 1)!="+")) { error_log("---".gmdate('r T')."--- Executing: ".trim($strProgramname.' '.$strArgs)."\n".$strBuffer."\n", 3, PSI_LOG); } if (! empty($strError)) { if ($booErrorRep) { $error->addError($strProgram, $strError."\nReturn value: ".$return_value); } return $return_value == 0; } return true; } /** * read a file and return the content as a string * * @param string $strFileName name of the file which should be read * @param string &$strRet content of the file (reference) * @param integer $intLines control how many lines should be read * @param integer $intBytes control how many bytes of each line should be read * @param boolean $booErrorRep en- or disables the reporting of errors which should be logged * * @return boolean command successfull or not */ public static function rfts($strFileName, &$strRet, $intLines = 0, $intBytes = 4096, $booErrorRep = true) { if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { $out = self::_parse_log_file("Reading: ".$strFileName); if ($out == false) { if (substr(PSI_LOG, 0, 1)=="-") { $strRet = ''; return false; } } else { $strRet = $out; return true; } } $strFile = ""; $intCurLine = 1; $error = Error::singleton(); if (file_exists($strFileName)) { if (is_readable($strFileName)) { if ($fd = fopen($strFileName, 'r')) { while (!feof($fd)) { $strFile .= fgets($fd, $intBytes); if ($intLines <= $intCurLine && $intLines != 0) { break; } else { $intCurLine++; } } fclose($fd); $strRet = $strFile; if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && (substr(PSI_LOG, 0, 1)!="-") && (substr(PSI_LOG, 0, 1)!="+")) { error_log("---".gmdate('r T')."--- Reading: ".$strFileName."\n".$strRet, 3, PSI_LOG); } } else { if ($booErrorRep) { $error->addError('fopen('.$strFileName.')', 'file can not read by phpsysinfo'); } return false; } } else { if ($booErrorRep) { $error->addError('fopen('.$strFileName.')', 'file permission error'); } return false; } } else { if ($booErrorRep) { $error->addError('file_exists('.$strFileName.')', 'the file does not exist on your machine'); } return false; } return true; } /** * file exists * * @param string $strFileName name of the file which should be check * * @return boolean command successfull or not */ public static function fileexists($strFileName) { if (defined('PSI_LOG') && is_string(PSI_LOG) && (strlen(PSI_LOG)>0) && ((substr(PSI_LOG, 0, 1)=="-") || (substr(PSI_LOG, 0, 1)=="+"))) { $log_file = substr(PSI_LOG, 1); if (file_exists($log_file) && ($contents = @file_get_contents($log_file)) && preg_match("/^\-\-\-[^-\n]+\-\-\- ".preg_quote("Reading: ".$strFileName, '/')."\n/m", $contents)) { return true; } else { if (substr(PSI_LOG, 0, 1)=="-") { return false; } } } return file_exists($strFileName); } /** * reads a directory and return the name of the files and directorys in it * * @param string $strPath path of the directory which should be read * @param boolean $booErrorRep en- or disables the reporting of errors which should be logged * * @return array content of the directory excluding . and .. */ public static function gdc($strPath, $booErrorRep = true) { $arrDirectoryContent = array(); $error = Error::singleton(); if (is_dir($strPath)) { if ($handle = opendir($strPath)) { while (($strFile = readdir($handle)) !== false) { if ($strFile != "." && $strFile != "..") { $arrDirectoryContent[] = $strFile; } } closedir($handle); } else { if ($booErrorRep) { $error->addError('opendir('.$strPath.')', 'directory can not be read by phpsysinfo'); } } } else { if ($booErrorRep) { $error->addError('is_dir('.$strPath.')', 'directory does not exist on your machine'); } } return $arrDirectoryContent; } /** * Check for needed php extensions * * We need that extensions for almost everything * This function will return a hard coded * XML string (with headers) if the SimpleXML extension isn't loaded. * Then it will terminate the script. * See bug #1787137 * * @param array $arrExt additional extensions for which a check should run * * @return void */ public static function checkForExtensions($arrExt = array()) { if ((strcasecmp(PSI_SYSTEM_CODEPAGE,"UTF-8") == 0) || (strcasecmp(PSI_SYSTEM_CODEPAGE,"CP437") == 0)) $arrReq = array('simplexml', 'pcre', 'xml', 'dom'); elseif (PSI_OS == "WINNT") $arrReq = array('simplexml', 'pcre', 'xml', 'mbstring', 'dom', 'com_dotnet'); else $arrReq = array('simplexml', 'pcre', 'xml', 'mbstring', 'dom'); $extensions = array_merge($arrExt, $arrReq); $text = ""; $error = false; $text .= "\n"; $text .= "\n"; $text .= " \n"; foreach ($extensions as $extension) { if (!extension_loaded($extension)) { $text .= " checkForExtensions\n"; $text .= " phpSysInfo requires the ".$extension." extension to php in order to work properly.\n"; $error = true; } } $text .= " \n"; $text .= ""; if ($error) { header("Content-Type: text/xml\n\n"); echo $text; die(); } } /** * get the content of stdout/stderr with the option to set a timeout for reading * * @param array $pipes array of file pointers for stdin, stdout, stderr (proc_open()) * @param string &$out target string for the output message (reference) * @param string &$err target string for the error message (reference) * @param integer $timeout timeout value in seconds (default value is 30) * * @return void */ private static function _timeoutfgets($pipes, &$out, &$err, $timeout = 30) { $w = NULL; $e = NULL; if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { $pipe2 = false; } else { $pipe2 = true; } while (!(feof($pipes[1]) && (!$pipe2 || feof($pipes[2])))) { if ($pipe2) { $read = array($pipes[1], $pipes[2]); } else { $read = array($pipes[1]); } $n = stream_select($read, $w, $e, $timeout); if ($n === FALSE) { error_log('stream_select: failed !'); break; } elseif ($n === 0) { error_log('stream_select: timeout expired !'); break; } foreach ($read as $r) { if ($r == $pipes[1]) { $out .= fread($r, 4096); } if ($pipe2 && ($r == $pipes[2])) { $err .= fread($r, 4096); } } } } /** * function for getting a list of values in the specified context * optionally filter this list, based on the list from third parameter * * @param $wmi holds the COM object that we pull the WMI data from * @param string $strClass name of the class where the values are stored * @param array $strValue filter out only needed values, if not set all values of the class are returned * * @return array content of the class stored in an array */ public static function getWMI($wmi, $strClass, $strValue = array()) { $arrData = array(); if ($wmi) { $value = ""; try { $objWEBM = $wmi->Get($strClass); $arrProp = $objWEBM->Properties_; $arrWEBMCol = $objWEBM->Instances_(); foreach ($arrWEBMCol as $objItem) { if (is_array($arrProp)) { reset($arrProp); } $arrInstance = array(); foreach ($arrProp as $propItem) { eval("\$value = \$objItem->".$propItem->Name.";"); if ( empty($strValue)) { if (is_string($value)) $arrInstance[$propItem->Name] = trim($value); else $arrInstance[$propItem->Name] = $value; } else { if (in_array($propItem->Name, $strValue)) { if (is_string($value)) $arrInstance[$propItem->Name] = trim($value); else $arrInstance[$propItem->Name] = $value; } } } $arrData[] = $arrInstance; } } catch (Exception $e) { if (PSI_DEBUG) { $this->error->addError($e->getCode(), $e->getMessage()); } } } return $arrData; } /** * get all configured plugins from phpsysinfo.ini (file must be included and processed before calling this function) * * @return array */ public static function getPlugins() { if ( defined('PSI_PLUGINS') && is_string(PSI_PLUGINS) ) { if (preg_match(ARRAY_EXP, PSI_PLUGINS)) { return eval(strtolower(PSI_PLUGINS)); } else { return array(strtolower(PSI_PLUGINS)); } } else { return array(); } } } phpsysinfo-3.2.1/includes/class.Parser.inc.php000066400000000000000000000241661247443170600213670ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Parser.inc.php 604 2012-07-10 07:31:34Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * parser class with common used parsing metods * * @category PHP * @package PSI * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Parser { /** * parsing the output of lspci command * * @return Array */ public static function lspci($debug = PSI_DEBUG) { $arrResults = array(); if (CommonFunctions::executeProgram("lspci", "", $strBuf, $debug)) { $arrLines = preg_split("/\n/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrLines as $strLine) { $arrParams = preg_split('/ /', trim($strLine), 2); if (count($arrParams) == 2) $strName = $arrParams[1]; else $strName = "unknown"; $strName = preg_replace('/\(.*\)/', '', $strName); $dev = new HWDevice(); $dev->setName($strName); $arrResults[] = $dev; } } return $arrResults; } /** * parsing the output of df command * * @param string $df_param additional parameter for df command * * @return array */ public static function df($df_param = "") { $arrResult = array(); if (CommonFunctions::executeProgram('mount', '', $mount, PSI_DEBUG)) { $mount = preg_split("/\n/", $mount, -1, PREG_SPLIT_NO_EMPTY); foreach ($mount as $mount_line) { if (preg_match("/(\S+) on ([\S ]+) type (.*) \((.*)\)/", $mount_line, $mount_buf)) { $mount_parm[$mount_buf[2]]['fstype'] = $mount_buf[3]; $mount_parm[$mount_buf[2]]['name'] = $mount_buf[1]; if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[2]]['options'] = $mount_buf[4]; } elseif (preg_match("/(\S+) is (.*) mounted on (\S+) \(type (.*)\)/", $mount_line, $mount_buf)) { $mount_parm[$mount_buf[3]]['fstype'] = $mount_buf[4]; $mount_parm[$mount_buf[3]]['name'] = $mount_buf[1]; if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[3]]['options'] = $mount_buf[2]; } elseif (preg_match("/(\S+) (.*) on (\S+) \((.*)\)/", $mount_line, $mount_buf)) { $mount_parm[$mount_buf[3]]['fstype'] = $mount_buf[2]; $mount_parm[$mount_buf[3]]['name'] = $mount_buf[1]; if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[3]]['options'] = $mount_buf[4]; } elseif (preg_match("/(\S+) on ([\S ]+) \((\S+)(,\s(.*))?\)/", $mount_line, $mount_buf)) { $mount_parm[$mount_buf[2]]['fstype'] = $mount_buf[3]; $mount_parm[$mount_buf[2]]['name'] = $mount_buf[1]; if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[2]]['options'] = isset($mount_buf[5]) ? $mount_buf[5] : ''; } } } elseif (CommonFunctions::rfts("/etc/mtab", $mount)) { $mount = preg_split("/\n/", $mount, -1, PREG_SPLIT_NO_EMPTY); foreach ($mount as $mount_line) { if (preg_match("/(\S+) (\S+) (\S+) (\S+) ([0-9]+) ([0-9]+)/", $mount_line, $mount_buf)) { $mount_point = preg_replace("/\\\\040/i", ' ', $mount_buf[2]); //space as \040 $mount_parm[$mount_point]['fstype'] = $mount_buf[3]; $mount_parm[$mount_point]['name'] = $mount_buf[1]; if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_point]['options'] = $mount_buf[4]; } } } if (CommonFunctions::executeProgram('df', '-k '.$df_param, $df, PSI_DEBUG)) { $df = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); if (PSI_SHOW_INODES) { if (CommonFunctions::executeProgram('df', '-i '.$df_param, $df2, PSI_DEBUG)) { $df2 = preg_split("/\n/", $df2, -1, PREG_SPLIT_NO_EMPTY); // Store inode use% in an associative array (df_inodes) for later use foreach ($df2 as $df2_line) { if (preg_match("/^(\S+).*\s([0-9]+)%/", $df2_line, $inode_buf)) { $df_inodes[$inode_buf[1]] = $inode_buf[2]; } } } } foreach ($df as $df_line) { $df_buf1 = preg_split("/(\%\s)/", $df_line, 3); if (count($df_buf1) < 2) { continue; } if (preg_match("/(.*)(\s+)(([0-9]+)(\s+)([0-9]+)(\s+)([\-0-9]+)(\s+)([0-9]+)$)/", $df_buf1[0], $df_buf2)) { if (count($df_buf1) == 3) { $df_buf = array($df_buf2[1], $df_buf2[4], $df_buf2[6], $df_buf2[8], $df_buf2[10], $df_buf1[2]); } else { $df_buf = array($df_buf2[1], $df_buf2[4], $df_buf2[6], $df_buf2[8], $df_buf2[10], $df_buf1[1]); } if (count($df_buf) == 6) { $df_buf[5] = trim($df_buf[5]); $dev = new DiskDevice(); $dev->setName(trim($df_buf[0])); if ($df_buf[2] < 0) { $dev->setTotal($df_buf[3] * 1024); $dev->setUsed($df_buf[3] * 1024); } else { $dev->setTotal($df_buf[1] * 1024); $dev->setUsed($df_buf[2] * 1024); if ($df_buf[3]>0) { $dev->setFree($df_buf[3] * 1024); } } if (PSI_SHOW_MOUNT_POINT) $dev->setMountPoint($df_buf[5]); if (isset($mount_parm[$df_buf[5]])) { $dev->setFsType($mount_parm[$df_buf[5]]['fstype']); if (PSI_SHOW_MOUNT_OPTION) { if (PSI_SHOW_MOUNT_CREDENTIALS) { $dev->setOptions($mount_parm[$df_buf[5]]['options']); } else { $mpo=$mount_parm[$df_buf[5]]['options']; $mpo=preg_replace('/(^guest,)|(^guest$)|(,guest$)/i', '', $mpo); $mpo=preg_replace('/,guest,/i', ',', $mpo); $mpo=preg_replace('/(^user=[^,]*,)|(^user=[^,]*$)|(,user=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,user=[^,]*,/i', ',', $mpo); $mpo=preg_replace('/(^username=[^,]*,)|(^username=[^,]*$)|(,username=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,username=[^,]*,/i', ',', $mpo); $mpo=preg_replace('/(^password=[^,]*,)|(^password=[^,]*$)|(,password=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,password=[^,]*,/i', ',', $mpo); $dev->setOptions($mpo); } } } if (PSI_SHOW_INODES && isset($df_inodes[trim($df_buf[0])])) { $dev->setPercentInodesUsed($df_inodes[trim($df_buf[0])]); } $arrResult[] = $dev; } } } } else { if (isset($mount_parm)) { foreach ($mount_parm as $mount_point=>$mount_param) { $total = disk_total_space($mount_point); if (($mount_param['fstype'] != 'none') && ($total > 0)) { $dev = new DiskDevice(); $dev->setName($mount_param['name']); $dev->setFsType($mount_param['fstype']); if (PSI_SHOW_MOUNT_POINT) $dev->setMountPoint($mount_point); $dev->setTotal($total); $free = disk_free_space($mount_point); if ($free > 0) { $dev->setFree($free); } else { $free = 0; } if ($total > $free) $dev->setUsed($total - $free); if (PSI_SHOW_MOUNT_OPTION) { if (PSI_SHOW_MOUNT_CREDENTIALS) { $dev->setOptions($mount_param['options']); } else { $mpo=$mount_param['options']; $mpo=preg_replace('/(^guest,)|(^guest$)|(,guest$)/i', '', $mpo); $mpo=preg_replace('/,guest,/i', ',', $mpo); $mpo=preg_replace('/(^user=[^,]*,)|(^user=[^,]*$)|(,user=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,user=[^,]*,/i', ',', $mpo); $mpo=preg_replace('/(^username=[^,]*,)|(^username=[^,]*$)|(,username=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,username=[^,]*,/i', ',', $mpo); $mpo=preg_replace('/(^password=[^,]*,)|(^password=[^,]*$)|(,password=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,password=[^,]*,/i', ',', $mpo); $dev->setOptions($mpo); } } $arrResult[] = $dev; } } } } return $arrResult; } } phpsysinfo-3.2.1/includes/error/000077500000000000000000000000001247443170600166665ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/error/class.Error.inc.php000066400000000000000000000207351247443170600223530ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Error.inc.php 569 2012-04-16 06:08:18Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * class for the error handling in phpsysinfo * * @category PHP * @package PSI_Error * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Error { /** * holds the instance of this class * * @static * @var object */ private static $_instance; /** * holds the error messages * * @var array */ private $_arrErrorList = array(); /** * current number ob errors * * @var integer */ private $_errors = 0; /** * initalize some used vars */ private function __construct() { $this->_errors = 0; $this->_arrErrorList = array(); } /** * Singleton function * * @return Error instance of the class */ public static function singleton() { if (!isset(self::$_instance)) { $c = __CLASS__; self::$_instance = new $c; } return self::$_instance; } /** * triggers an error when somebody tries to clone the object * * @return void */ public function __clone() { trigger_error("Can't be cloned", E_USER_ERROR); } /** * adds an phpsysinfo error to the internal list * * @param string $strCommand Command, which cause the Error * @param string $strMessage additional Message, to describe the Error * * @return void */ public function addError($strCommand, $strMessage) { $this->_addError($strCommand, $this->_trace($strMessage)); } /** * adds an error to the internal list * * @param string $strCommand Command, which cause the Error * @param string $strMessage message, that describe the Error * * @return void */ private function _addError($strCommand, $strMessage) { $index = count($this->_arrErrorList) + 1; $this->_arrErrorList[$index]['command'] = $strCommand; $this->_arrErrorList[$index]['message'] = $strMessage; $this->_errors++; } /** * add a config error to the internal list * * @param object $strCommand Command, which cause the Error * @param object $strMessage additional Message, to describe the Error * * @return void */ public function addConfigError($strCommand, $strMessage) { $this->_addError($strCommand, "Wrong Value in phpsysinfo.ini for ".$strMessage); } /** * add a php error to the internal list * * @param object $strCommand Command, which cause the Error * @param object $strMessage additional Message, to describe the Error * * @return void */ public function addPhpError($strCommand, $strMessage) { $this->_addError($strCommand, "PHP throws a error\n".$strMessage); } /** * adds a waraning to the internal list * * @param string $strMessage Warning message to display * * @return void */ public function addWarning($strMessage) { $index = count($this->_arrErrorList) + 1; $this->_arrErrorList[$index]['command'] = "WARN"; $this->_arrErrorList[$index]['message'] = $strMessage; } /** * converts the internal error and warning list to a XML file * * @return void */ public function errorsAsXML() { $dom = new DOMDocument('1.0', 'UTF-8'); $root = $dom->createElement("phpsysinfo"); $dom->appendChild($root); $xml = new SimpleXMLExtended(simplexml_import_dom($dom), 'UTF-8'); $generation = $xml->addChild('Generation'); $generation->addAttribute('version', PSI_VERSION_STRING); $generation->addAttribute('timestamp', time()); $xmlerr = $xml->addChild("Errors"); foreach ($this->_arrErrorList as $arrLine) { // $error = $xmlerr->addCData('Error', $arrLine['message']); $error = $xmlerr->addChild('Error'); $error->addAttribute('Message', $arrLine['message']); $error->addAttribute('Function', $arrLine['command']); } header("Cache-Control: no-cache, must-revalidate\n"); header("Content-Type: text/xml\n\n"); echo $xml->getSimpleXmlElement()->asXML(); exit(); } /** * add the errors to an existing xml document * * @param String $encoding encoding * * @return SimpleXmlElement */ public function errorsAddToXML($encoding) { $dom = new DOMDocument('1.0', 'UTF-8'); $root = $dom->createElement("Errors"); $dom->appendChild($root); $xml = simplexml_import_dom($dom); $xmlerr = new SimpleXMLExtended($xml, $encoding); foreach ($this->_arrErrorList as $arrLine) { // $error = $xmlerr->addCData('Error', $arrLine['message']); $error = $xmlerr->addChild('Error'); $error->addAttribute('Message', $arrLine['message']); $error->addAttribute('Function', $arrLine['command']); } return $xmlerr->getSimpleXmlElement(); } /** * check if errors exists * * @return boolean true if are errors logged, false if not */ public function errorsExist() { if ($this->_errors > 0) { return true; } else { return false; } } /** * generate a function backtrace for error diagnostic, function is genearally based on code submitted in the php reference page * * @param string $strMessage additional message to display * * @return string formatted string of the backtrace */ private function _trace($strMessage) { $arrTrace = array_reverse(debug_backtrace()); $strFunc = ''; $strBacktrace = htmlspecialchars($strMessage)."\n\n"; foreach ($arrTrace as $val) { // avoid the last line, which says the error is from the error class if ($val == $arrTrace[count($arrTrace) - 1]) { break; } $strBacktrace .= str_replace(APP_ROOT, ".", $val['file']).' on line '.$val['line']; if ($strFunc) { $strBacktrace .= ' in function '.$strFunc; } if ($val['function'] == 'include' || $val['function'] == 'require' || $val['function'] == 'include_once' || $val['function'] == 'require_once') { $strFunc = ''; } else { $strFunc = $val['function'].'('; if (isset($val['args'][0])) { $strFunc .= ' '; $strComma = ''; foreach ($val['args'] as $val) { $strFunc .= $strComma.$this->_printVar($val); $strComma = ', '; } $strFunc .= ' '; } $strFunc .= ')'; } $strBacktrace .= "\n"; } return $strBacktrace; } /** * convert some special vars into better readable output * * @param mixed $var value, which should be formatted * * @return string formatted string */ private function _printVar($var) { if (is_string($var)) { $search = array("\x00", "\x0a", "\x0d", "\x1a", "\x09"); $replace = array('\0', '\n', '\r', '\Z', '\t'); return ('"'.str_replace($search, $replace, $var).'"'); } elseif (is_bool($var)) { if ($var) { return ('true'); } else { return ('false'); } } elseif (is_array($var)) { $strResult = 'array( '; $strComma = ''; foreach ($var as $key=>$val) { $strResult .= $strComma.$this->_printVar($key).' => '.$this->_printVar($val); $strComma = ', '; } $strResult .= ' )'; return ($strResult); } // anything else, just let php try to print it return (var_export($var, true)); } } phpsysinfo-3.2.1/includes/interface/000077500000000000000000000000001247443170600174755ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/interface/class.PSI_Interface_OS.inc.php000066400000000000000000000025501247443170600251000ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.PSI_Interface_OS.inc.php 263 2009-06-22 13:01:52Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * define which methods a os class for phpsysinfo must implement * to be recognized and fully work without errors, these are the methods which * are called from outside to include the information in the main application * * @category PHP * @package PSI_Interfaces * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ interface PSI_Interface_OS { /** * get a special encoding from os where phpsysinfo is running * * @return string */ public function getEncoding(); /** * build the os information * * @return void */ public function build(); /** * get the filled or unfilled (with default values) system object * * @return System */ public function getSys(); } phpsysinfo-3.2.1/includes/interface/class.PSI_Interface_Output.inc.php000066400000000000000000000017411247443170600260600ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.PSI_Interface_Output.inc.php 214 2009-05-25 08:32:40Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * define which methods a output class for phpsysinfo must implement * to be recognized and fully work without errors * * @category PHP * @package PSI_Interfaces * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ interface PSI_Interface_Output { /** * generate the output * * @return void */ public function run(); } phpsysinfo-3.2.1/includes/interface/class.PSI_Interface_Plugin.inc.php000066400000000000000000000024341247443170600260160ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.PSI_Interface_Plugin.inc.php 273 2009-06-24 11:40:09Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * define which methods a plugin class for phpsysinfo must implement * to be recognized and fully work without errors, these are the methods which * are called from outside to include the information in the main application * * @category PHP * @package PSI_Interfaces * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ interface PSI_Interface_Plugin { /** * doing all tasks before the xml can be build * * @return void */ public function execute(); /** * build the xml * * @return SimpleXMLObject entire XML content for the plugin which than can be appended to the main XML */ public function xml(); } phpsysinfo-3.2.1/includes/interface/class.PSI_Interface_Sensor.inc.php000066400000000000000000000023601247443170600260270ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.PSI_Interface_Sensor.inc.php 263 2009-06-22 13:01:52Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * define which methods every sensor class for phpsysinfo must implement * to be recognized and fully work without errors, these are the methods which * are called from outside to include the information in the main application * * @category PHP * @package PSI_Interfaces * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ interface PSI_Interface_Sensor { /** * build the mbinfo information * * @return void */ public function build(); /** * get the filled or unfilled (with default values) MBInfo object * * @return MBInfo */ public function getMBInfo(); } phpsysinfo-3.2.1/includes/interface/class.PSI_Interface_UPS.inc.php000066400000000000000000000021651247443170600252300ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.PSI_Interface_UPS.inc.php 263 2009-06-22 13:01:52Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * define which methods a ups class for phpsysinfo must implement * to be recognized and fully work without errors * * @category PHP * @package PSI_Interfaces * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ interface PSI_Interface_UPS { /** * build the ups information * * @return void */ public function build(); /** * get the filled or unfilled (with default values) UPSInfo object * * @return UPSInfo */ public function getUPSInfo(); } phpsysinfo-3.2.1/includes/js/000077500000000000000000000000001247443170600161515ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/js/README000066400000000000000000000007621247443170600170360ustar00rootroot00000000000000versions, links and simple description of used files =========================================================== class.JavaScriptPacker.inc.php --------- VERSION : 1.1+FF4 URL : http://dean.edwards.name DESC : Downloaded from http://dean.edwards.name/download/ http://joliclic.free.fr/php/javascript-packer/en/ + Firefox 4 fix LICENSE : LGPL 2.1 (http://creativecommons.org/licenses/LGPL/2.1/) USED : define('PSI_JS_COMPRESSION', 'None'); or define('PSI_JS_COMPRESSION', 'Normal'); phpsysinfo-3.2.1/includes/js/class.JavaScriptPacker.inc.php000066400000000000000000000655431247443170600237470ustar00rootroot00000000000000pack(); * * or * * $myPacker = new JavaScriptPacker($script, 'Normal', true, false); * $packed = $myPacker->pack(); * * or (default values) * * $myPacker = new JavaScriptPacker($script); * $packed = $myPacker->pack(); * * * params of the constructor : * $script: the JavaScript to pack, string. * $encoding: level of encoding, int or string : * 0,10,62,95 or 'None', 'Numeric', 'Normal', 'High ASCII'. * default: 62. * $fastDecode: include the fast decoder in the packed result, boolean. * default : true. * $specialChars: if you are flagged your private and local variables * in the script, boolean. * default: false. * * The pack() method return the compressed JavasScript, as a string. * * see http://dean.edwards.name/packer/usage/ for more information. * * Notes : * # need PHP 5 . Tested with PHP 5.1.2, 5.1.3, 5.1.4, 5.2.3 * * # The packed result may be different than with the Dean Edwards * version, but with the same length. The reason is that the PHP * function usort to sort array don't necessarily preserve the * original order of two equal member. The Javascript sort function * in fact preserve this order (but that's not require by the * ECMAScript standard). So the encoded keywords order can be * different in the two results. * * # Be careful with the 'High ASCII' Level encoding if you use * UTF-8 in your files... */ class JavaScriptPacker { // constants const IGNORE = '$1'; // validate parameters private $_script = ''; private $_encoding = 62; private $_fastDecode = true; private $_specialChars = false; private $LITERAL_ENCODING = array( 'None' => 0, 'Numeric' => 10, 'Normal' => 62, 'High ASCII' => 95 ); public function __construct($_script, $_encoding = 62, $_fastDecode = true, $_specialChars = false) { $this->_script = $_script . "\n"; if (array_key_exists($_encoding, $this->LITERAL_ENCODING)) $_encoding = $this->LITERAL_ENCODING[$_encoding]; $this->_encoding = min((int) $_encoding, 95); $this->_fastDecode = $_fastDecode; $this->_specialChars = $_specialChars; } public function pack() { $this->_addParser('_basicCompression'); if ($this->_specialChars) $this->_addParser('_encodeSpecialChars'); if ($this->_encoding) $this->_addParser('_encodeKeywords'); // go! return $this->_pack($this->_script); } // apply all parsing routines private function _pack($script) { for ($i = 0; isset($this->_parsers[$i]); $i++) { $script = call_user_func(array(&$this,$this->_parsers[$i]), $script); } return $script; } // keep a list of parsing functions, they'll be executed all at once private $_parsers = array(); private function _addParser($parser) { $this->_parsers[] = $parser; } // zero encoding - just removal of white space and comments private function _basicCompression($script) { $parser = new ParseMaster(); // make safe $parser->escapeChar = '\\'; // protect strings $parser->add('/\'[^\'\\n\\r]*\'/', self::IGNORE); $parser->add('/"[^"\\n\\r]*"/', self::IGNORE); // remove comments $parser->add('/\\/\\/[^\\n\\r]*[\\n\\r]/', ' '); $parser->add('/\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\//', ' '); // protect regular expressions $parser->add('/\\s+(\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?)/', '$2'); // IGNORE $parser->add('/[^\\w\\x24\\/\'"*)\\?:]\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?/', self::IGNORE); // remove: ;;; doSomething(); if ($this->_specialChars) $parser->add('/;;;[^\\n\\r]+[\\n\\r]/'); // remove redundant semi-colons $parser->add('/\\(;;\\)/', self::IGNORE); // protect for (;;) loops $parser->add('/;+\\s*([};])/', '$2'); // apply the above $script = $parser->exec($script); // remove white-space $parser->add('/(\\b|\\x24)\\s+(\\b|\\x24)/', '$2 $3'); $parser->add('/([+\\-])\\s+([+\\-])/', '$2 $3'); $parser->add('/\\s+/', ''); // done return $parser->exec($script); } private function _encodeSpecialChars($script) { $parser = new ParseMaster(); // replace: $name -> n, $$name -> na $parser->add('/((\\x24+)([a-zA-Z$_]+))(\\d*)/', array('fn' => '_replace_name') ); // replace: _name -> _0, double-underscore (__name) is ignored $regexp = '/\\b_[A-Za-z\\d]\\w*/'; // build the word list $keywords = $this->_analyze($script, $regexp, '_encodePrivate'); // quick ref $encoded = $keywords['encoded']; $parser->add($regexp, array( 'fn' => '_replace_encoded', 'data' => $encoded ) ); return $parser->exec($script); } private function _encodeKeywords($script) { // escape high-ascii values already in the script (i.e. in strings) if ($this->_encoding > 62) $script = $this->_escape95($script); // create the parser $parser = new ParseMaster(); $encode = $this->_getEncoder($this->_encoding); // for high-ascii, don't encode single character low-ascii $regexp = ($this->_encoding > 62) ? '/\\w\\w+/' : '/\\w+/'; // build the word list $keywords = $this->_analyze($script, $regexp, $encode); $encoded = $keywords['encoded']; // encode $parser->add($regexp, array( 'fn' => '_replace_encoded', 'data' => $encoded ) ); if (empty($script)) return $script; else { //$res = $parser->exec($script); //$res = $this->_bootStrap($res, $keywords); //return $res; return $this->_bootStrap($parser->exec($script), $keywords); } } private function _analyze($script, $regexp, $encode) { // analyse // retreive all words in the script $all = array(); preg_match_all($regexp, $script, $all); $_sorted = array(); // list of words sorted by frequency $_encoded = array(); // dictionary of word->encoding $_protected = array(); // instances of "protected" words $all = $all[0]; // simulate the javascript comportement of global match if (!empty($all)) { $unsorted = array(); // same list, not sorted $protected = array(); // "protected" words (dictionary of word->"word") $value = array(); // dictionary of charCode->encoding (eg. 256->ff) $this->_count = array(); // word->count $i = count($all); $j = 0; //$word = null; // count the occurrences - used for sorting later do { --$i; $word = '$' . $all[$i]; if (!isset($this->_count[$word])) { $this->_count[$word] = 0; $unsorted[$j] = $word; // make a dictionary of all of the protected words in this script // these are words that might be mistaken for encoding //if (is_string($encode) && method_exists($this, $encode)) $values[$j] = call_user_func(array(&$this, $encode), $j); $protected['$' . $values[$j]] = $j++; } // increment the word counter $this->_count[$word]++; } while ($i > 0); // prepare to sort the word list, first we must protect // words that are also used as codes. we assign them a code // equivalent to the word itself. // e.g. if "do" falls within our encoding range // then we store keywords["do"] = "do"; // this avoids problems when decoding $i = count($unsorted); do { $word = $unsorted[--$i]; if (isset($protected[$word]) /*!= null*/) { $_sorted[$protected[$word]] = substr($word, 1); $_protected[$protected[$word]] = true; $this->_count[$word] = 0; } } while ($i); // sort the words by frequency // Note: the javascript and php version of sort can be different : // in php manual, usort : // " If two members compare as equal, // their order in the sorted array is undefined." // so the final packed script is different of the Dean's javascript version // but equivalent. // the ECMAscript standard does not guarantee this behaviour, // and thus not all browsers (e.g. Mozilla versions dating back to at // least 2003) respect this. usort($unsorted, array(&$this, '_sortWords')); $j = 0; // because there are "protected" words in the list // we must add the sorted words around them do { if (!isset($_sorted[$i])) $_sorted[$i] = substr($unsorted[$j++], 1); $_encoded[$_sorted[$i]] = $values[$i]; } while (++$i < count($unsorted)); } return array( 'sorted' => $_sorted, 'encoded' => $_encoded, 'protected' => $_protected); } private $_count = array(); private function _sortWords($match1, $match2) { return $this->_count[$match2] - $this->_count[$match1]; } // build the boot function used for loading and decoding private function _bootStrap($packed, $keywords) { $ENCODE = $this->_safeRegExp('$encode\\($count\\)'); // $packed: the packed script $packed = "'" . $this->_escape($packed) . "'"; // $ascii: base for encoding $ascii = min(count($keywords['sorted']), $this->_encoding); if ($ascii == 0) $ascii = 1; // $count: number of words contained in the script $count = count($keywords['sorted']); // $keywords: list of words contained in the script foreach ($keywords['protected'] as $i=>$value) { $keywords['sorted'][$i] = ''; } // convert from a string to an array ksort($keywords['sorted']); $keywords = "'" . implode('|',$keywords['sorted']) . "'.split('|')"; $encode = ($this->_encoding > 62) ? '_encode95' : $this->_getEncoder($ascii); $encode = $this->_getJSFunction($encode); $encode = preg_replace('/_encoding/','$ascii', $encode); $encode = preg_replace('/arguments\\.callee/','$encode', $encode); $inline = '\\$count' . ($ascii > 10 ? '.toString(\\$ascii)' : ''); // $decode: code snippet to speed up decoding if ($this->_fastDecode) { // create the decoder $decode = $this->_getJSFunction('_decodeBody'); if ($this->_encoding > 62) $decode = preg_replace('/\\\\w/', '[\\xa1-\\xff]', $decode); // perform the encoding inline for lower ascii values elseif ($ascii < 36) $decode = preg_replace($ENCODE, $inline, $decode); // special case: when $count==0 there are no keywords. I want to keep // the basic shape of the unpacking funcion so i'll frig the code... if ($count == 0) $decode = preg_replace($this->_safeRegExp('($count)\\s*=\\s*1'), '$1=0', $decode, 1); } // boot function $unpack = $this->_getJSFunction('_unpack'); if ($this->_fastDecode) { // insert the decoder $this->buffer = $decode; $unpack = preg_replace_callback('/\\{/', array(&$this, '_insertFastDecode'), $unpack, 1); } $unpack = preg_replace('/"/', "'", $unpack); if ($this->_encoding > 62) { // high-ascii // get rid of the word-boundaries for regexp matches $unpack = preg_replace('/\'\\\\\\\\b\'\s*\\+|\\+\s*\'\\\\\\\\b\'/', '', $unpack); } if ($ascii > 36 || $this->_encoding > 62 || $this->_fastDecode) { // insert the encode function $this->buffer = $encode; $unpack = preg_replace_callback('/\\{/', array(&$this, '_insertFastEncode'), $unpack, 1); } else { // perform the encoding inline $unpack = preg_replace($ENCODE, $inline, $unpack); } // pack the boot function too $unpackPacker = new JavaScriptPacker($unpack, 0, false, true); $unpack = $unpackPacker->pack(); // arguments $params = array($packed, $ascii, $count, $keywords); if ($this->_fastDecode) { $params[] = 0; $params[] = '{}'; } $params = implode(',', $params); // the whole thing //Firefox 4 fix, old: return 'eval(' . $unpack . '(' . $params . "))\n"; return "(typeof setTimeout=='function'?setTimeout:eval)(" . $unpack . "(" . $params . "));\n"; } private $buffer; private function _insertFastDecode($match) { return '{' . $this->buffer . ';'; } private function _insertFastEncode($match) { return '{$encode=' . $this->buffer . ';'; } // mmm.. ..which one do i need ?? private function _getEncoder($ascii) { return $ascii > 10 ? $ascii > 36 ? $ascii > 62 ? '_encode95' : '_encode62' : '_encode36' : '_encode10'; } // zero encoding // characters: 0123456789 private function _encode10($charCode) { return $charCode; } // inherent base36 support // characters: 0123456789abcdefghijklmnopqrstuvwxyz private function _encode36($charCode) { return base_convert($charCode, 10, 36); } // hitch a ride on base36 and add the upper case alpha characters // characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ private function _encode62($charCode) { $res = ''; if ($charCode >= $this->_encoding) { $res = $this->_encode62((int) ($charCode / $this->_encoding)); } $charCode = $charCode % $this->_encoding; if ($charCode > 35) return $res . chr($charCode + 29); else return $res . base_convert($charCode, 10, 36); } // use high-ascii values // characters: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ private function _encode95($charCode) { $res = ''; if ($charCode >= $this->_encoding) $res = $this->_encode95($charCode / $this->_encoding); return $res . chr(($charCode % $this->_encoding) + 161); } private function _safeRegExp($string) { return '/'.preg_replace('/\$/', '\\\$', $string).'/'; } private function _encodePrivate($charCode) { return "_" . $charCode; } // protect characters used by the parser private function _escape($script) { return preg_replace('/([\\\\\'])/', '\\\$1', $script); } // protect high-ascii characters already in the script private function _escape95($script) { return preg_replace_callback( '/[\\xa1-\\xff]/', array(&$this, '_escape95Bis'), $script ); } private function _escape95Bis($match) { return '\x'.((string) dechex(ord($match))); } private function _getJSFunction($aName) { if (defined('self::JSFUNCTION'.$aName)) return constant('self::JSFUNCTION'.$aName); else return ''; } // JavaScript Functions used. // Note : In Dean's version, these functions are converted // with 'String(aFunctionName);'. // This internal conversion complete the original code, ex : // 'while (aBool) anAction();' is converted to // 'while (aBool) { anAction(); }'. // The JavaScript functions below are corrected. // unpacking function - this is the boot strap function // data extracted from this packing routine is passed to // this function when decoded in the target // NOTE ! : without the ';' final. const JSFUNCTION_unpack = 'function ($packed, $ascii, $count, $keywords, $encode, $decode) { while ($count--) { if ($keywords[$count]) { $packed = $packed.replace(new RegExp(\'\\\\b\' + $encode($count) + \'\\\\b\', \'g\'), $keywords[$count]); } } return $packed; }'; /* 'function ($packed, $ascii, $count, $keywords, $encode, $decode) { while ($count--) if ($keywords[$count]) $packed = $packed.replace(new RegExp(\'\\\\b\' + $encode($count) + \'\\\\b\', \'g\'), $keywords[$count]); return $packed; }'; */ // code-snippet inserted into the unpacker to speed up decoding const JSFUNCTION_decodeBody = //_decode = function () { // does the browser support String.replace where the // replacement value is a function? ' if (!\'\'.replace(/^/, String)) { // decode all the values we need while ($count--) { $decode[$encode($count)] = $keywords[$count] || $encode($count); } // global replacement function $keywords = [function ($encoded) {return $decode[$encoded]}]; // generic match $encode = function () {return \'\\\\w+\'}; // reset the loop counter - we are now doing a global replace $count = 1; } '; //}; /* ' if (!\'\'.replace(/^/, String)) { // decode all the values we need while ($count--) $decode[$encode($count)] = $keywords[$count] || $encode($count); // global replacement function $keywords = [function ($encoded) {return $decode[$encoded]}]; // generic match $encode = function () {return\'\\\\w+\'}; // reset the loop counter - we are now doing a global replace $count = 1; }'; */ // zero encoding // characters: 0123456789 const JSFUNCTION_encode10 = 'function ($charCode) { return $charCode; }';//;'; // inherent base36 support // characters: 0123456789abcdefghijklmnopqrstuvwxyz const JSFUNCTION_encode36 = 'function ($charCode) { return $charCode.toString(36); }';//;'; // hitch a ride on base36 and add the upper case alpha characters // characters: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ const JSFUNCTION_encode62 = 'function ($charCode) { return ($charCode < _encoding ? \'\' : arguments.callee(parseInt($charCode / _encoding))) + (($charCode = $charCode % _encoding) > 35 ? String.fromCharCode($charCode + 29) : $charCode.toString(36)); }'; // use high-ascii values // characters: ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖרÙÚÛÜÃÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ const JSFUNCTION_encode95 = 'function ($charCode) { return ($charCode < _encoding ? \'\' : arguments.callee($charCode / _encoding)) + String.fromCharCode($charCode % _encoding + 161); }'; } class ParseMaster { public $ignoreCase = false; public $escapeChar = ''; // constants const EXPRESSION = 0; const REPLACEMENT = 1; const LENGTH = 2; // used to determine nesting levels private $GROUPS = '/\\(/';//g private $SUB_REPLACE = '/\\$\\d/'; private $INDEXED = '/^\\$\\d+$/'; private $TRIM = '/([\'"])\\1\\.(.*)\\.\\1\\1$/'; private $ESCAPE = '/\\\./';//g private $QUOTE = '/\'/'; private $DELETED = '/\\x01[^\\x01]*\\x01/';//g public function add($expression, $replacement = '') { // count the number of sub-expressions // - add one because each pattern is itself a sub-expression $length = 1 + preg_match_all($this->GROUPS, $this->_internalEscape((string) $expression), $out); // treat only strings $replacement if (is_string($replacement)) { // does the pattern deal with sub-expressions? if (preg_match($this->SUB_REPLACE, $replacement)) { // a simple lookup? (e.g. "$2") if (preg_match($this->INDEXED, $replacement)) { // store the index (used for fast retrieval of matched strings) $replacement = (int) (substr($replacement, 1)) - 1; } else { // a complicated lookup (e.g. "Hello $2 $1") // build a function to do the lookup $quote = preg_match($this->QUOTE, $this->_internalEscape($replacement)) ? '"' : "'"; $replacement = array( 'fn' => '_backReferences', 'data' => array( 'replacement' => $replacement, 'length' => $length, 'quote' => $quote ) ); } } } // pass the modified arguments if (!empty($expression)) $this->_add($expression, $replacement, $length); else $this->_add('/^$/', $replacement, $length); } public function exec($string) { // execute the global replacement $this->_escaped = array(); // simulate the _patterns.toSTring of Dean $regexp = '/'; foreach ($this->_patterns as $reg) { $regexp .= '(' . substr($reg[self::EXPRESSION], 1, -1) . ')|'; } $regexp = substr($regexp, 0, -1) . '/'; $regexp .= ($this->ignoreCase) ? 'i' : ''; $string = $this->_escape($string, $this->escapeChar); $string = preg_replace_callback( $regexp, array( &$this, '_replacement' ), $string ); $string = $this->_unescape($string, $this->escapeChar); return preg_replace($this->DELETED, '', $string); } public function reset() { // clear the patterns collection so that this object may be re-used $this->_patterns = array(); } // private private $_escaped = array(); // escaped characters private $_patterns = array(); // patterns stored by index // create and add a new pattern to the patterns collection private function _add() { $arguments = func_get_args(); $this->_patterns[] = $arguments; } // this is the global replace function (it's quite complicated) private function _replacement($arguments) { if (empty($arguments)) return ''; $i = 1; $j = 0; // loop through the patterns while (isset($this->_patterns[$j])) { $pattern = $this->_patterns[$j++]; // do we have a result? if (isset($arguments[$i]) && ($arguments[$i] != '')) { $replacement = $pattern[self::REPLACEMENT]; if (is_array($replacement) && isset($replacement['fn'])) { if (isset($replacement['data'])) $this->buffer = $replacement['data']; return call_user_func(array(&$this, $replacement['fn']), $arguments, $i); } elseif (is_int($replacement)) { return $arguments[$replacement + $i]; } $delete = ($this->escapeChar == '' || strpos($arguments[$i], $this->escapeChar) === false) ? '' : "\x01" . $arguments[$i] . "\x01"; return $delete . $replacement; // skip over references to sub-expressions } else { $i += $pattern[self::LENGTH]; } } } private function _backReferences($match, $offset) { $replacement = $this->buffer['replacement']; $quote = $this->buffer['quote']; $i = $this->buffer['length']; while ($i) { $replacement = str_replace('$'.$i--, $match[$offset + $i], $replacement); } return $replacement; } private function _replace_name($match, $offset) { $length = strlen($match[$offset + 2]); $start = $length - max($length - strlen($match[$offset + 3]), 0); return substr($match[$offset + 1], $start, $length) . $match[$offset + 4]; } private function _replace_encoded($match, $offset) { return $this->buffer[$match[$offset]]; } // php : we cannot pass additional data to preg_replace_callback, // and we cannot use &$this in create_function, so let's go to lower level private $buffer; // encode escaped characters private function _escape($string, $escapeChar) { if ($escapeChar) { $this->buffer = $escapeChar; return preg_replace_callback( '/\\' . $escapeChar . '(.)' .'/', array(&$this, '_escapeBis'), $string ); } else { return $string; } } private function _escapeBis($match) { $this->_escaped[] = $match[1]; return $this->buffer; } // decode escaped characters private function _unescape($string, $escapeChar) { if ($escapeChar) { $regexp = '/'.'\\'.$escapeChar.'/'; $this->buffer = array('escapeChar'=> $escapeChar, 'i' => 0); return preg_replace_callback ( $regexp, array(&$this, '_unescapeBis'), $string ); } else { return $string; } } private function _unescapeBis() { if (isset($this->_escaped[$this->buffer['i']]) && $this->_escaped[$this->buffer['i']] != '') { $temp = $this->_escaped[$this->buffer['i']]; } else { $temp = ''; } $this->buffer['i']++; return $this->buffer['escapeChar'] . $temp; } private function _internalEscape($string) { return preg_replace($this->ESCAPE, '', $string); } } phpsysinfo-3.2.1/includes/mb/000077500000000000000000000000001247443170600161335ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/mb/class.coretemp.inc.php000066400000000000000000000032161247443170600223400ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.coretemp.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting hardware temperature information through sysctl * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @author William Johansson * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Coretemp extends Sensors { /** * get temperature information * * @return void */ private function _temperature() { $smp = 1; CommonFunctions::executeProgram('sysctl', '-n kern.smp.cpus', $smp); for ($i = 0; $i < $smp; $i++) { $temp = 0; if (CommonFunctions::executeProgram('sysctl', '-n dev.cpu.'.$i.'.temperature', $temp)) { $dev = new SensorDevice(); $dev->setName("CPU ".($i + 1)); $dev->setValue($temp); $dev->setMax(70); $this->mbinfo->setMbTemp($dev); } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); } } phpsysinfo-3.2.1/includes/mb/class.freeipmi.inc.php000066400000000000000000000125701247443170600223250ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.freeipmi.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from ipmi-sensors * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class FreeIPMI extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private content var through tcp or file access */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'command': CommonFunctions::executeProgram('ipmi-sensors', '--output-sensor-thresholds', $lines); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); break; case 'file': if (CommonFunctions::rfts(APP_ROOT.'/data/freeipmi.txt', $lines)) { $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Temperature" && $buffer[11] != "N/A" && $buffer[4] == "C") { $dev = new SensorDevice(); $dev->setName($buffer[1]); $dev->setValue($buffer[3]); if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11],"'")); $this->mbinfo->setMbTemp($dev); } } } /** * get voltage information * * @return void */ private function _voltage() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Voltage" && $buffer[11] != "N/A" && $buffer[4] == "V") { $dev = new SensorDevice(); $dev->setName($buffer[1]); $dev->setValue($buffer[3]); if ($buffer[6] != "N/A") $dev->setMin($buffer[6]); if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11],"'")); $this->mbinfo->setMbVolt($dev); } } } /** * get fan information * * @return void */ private function _fans() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Fan" && $buffer[11] != "N/A" && $buffer[4] == "RPM") { $dev = new SensorDevice(); $dev->setName($buffer[1]); $dev->setValue($buffer[3]); if ($buffer[6] != "N/A") { $dev->setMin($buffer[6]); } elseif (($buffer[9] != "N/A") && ($buffer[9]<$buffer[3])) { //max instead min issue $dev->setMin($buffer[9]); } if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11],"'")); $this->mbinfo->setMbFan($dev); } } } /** * get power information * * @return void */ private function _power() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Current" && $buffer[11] != "N/A" && $buffer[4] == "W") { $dev = new SensorDevice(); $dev->setName($buffer[1]); $dev->setValue($buffer[3]); if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11],"'")); $this->mbinfo->setMbPower($dev); } } } /** * get current information * * @return void */ private function _current() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Current" && $buffer[11] != "N/A" && $buffer[4] == "A") { $dev = new SensorDevice(); $dev->setName($buffer[1]); $dev->setValue($buffer[3]); if ($buffer[9] != "N/A") $dev->setMax($buffer[9]); if ($buffer[11] != "'OK'") $dev->setEvent(trim($buffer[11],"'")); $this->mbinfo->setMbCurrent($dev); } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); $this->_voltage(); $this->_fans(); $this->_power(); $this->_current(); } } phpsysinfo-3.2.1/includes/mb/class.hddtemp.inc.php000066400000000000000000000121451247443170600221500ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.hddtemp.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from hddtemp * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @author T.A. van Roermund * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class HDDTemp extends Sensors { /** * get the temperature information from hddtemp * access is available through tcp or command * * @return array temperatures in array */ private function _temperature() { $ar_buf = array(); switch (strtolower(PSI_HDD_TEMP)) { case "tcp": $lines = ''; // Timo van Roermund: connect to the hddtemp daemon, use a 5 second timeout. $fp = @fsockopen('localhost', 7634, $errno, $errstr, 5); // if connected, read the output of the hddtemp daemon if ($fp) { while (!feof($fp)) { $lines .= fread($fp, 1024); } fclose($fp); } else { $this->error->addError("HDDTemp error", $errno.", ".$errstr); } $lines = str_replace("||", "|\n|", $lines); $ar_buf = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); break; case "command": $strDrives = ""; $strContent = ""; $hddtemp_value = ""; if (CommonFunctions::rfts("/proc/diskstats", $strContent, 0, 4096, false)) { $arrContent = preg_split("/\n/", $strContent, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrContent as $strLine) { preg_match("/^\s(.*)\s([a-z]*)\s(.*)/", $strLine, $arrSplit); if (! empty($arrSplit[2])) { $strDrive = '/dev/'.$arrSplit[2]; if (file_exists($strDrive)) { $strDrives = $strDrives.$strDrive.' '; } } } } else { if (CommonFunctions::rfts("/proc/partitions", $strContent, 0, 4096, false)) { $arrContent = preg_split("/\n/", $strContent, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrContent as $strLine) { if (!preg_match("/^\s(.*)\s([\/a-z0-9]*(\/disc))\s(.*)/", $strLine, $arrSplit)) { preg_match("/^\s(.*)\s([a-z]*)\s(.*)/", $strLine, $arrSplit); } if (! empty($arrSplit[2])) { $strDrive = '/dev/'.$arrSplit[2]; if (file_exists($strDrive)) { $strDrives = $strDrives.$strDrive.' '; } } } } } if (trim($strDrives) == "") { break; } if (CommonFunctions::executeProgram("hddtemp", $strDrives, $hddtemp_value, PSI_DEBUG)) { $hddtemp_value = preg_split("/\n/", $hddtemp_value, -1, PREG_SPLIT_NO_EMPTY); foreach ($hddtemp_value as $line) { $temp = preg_split("/:\s/", $line, 3); if (count($temp) == 3 && preg_match("/^[0-9]/", $temp[2])) { preg_match("/^([0-9]*)(.*)/", $temp[2], $ar_temp); $temp[2] = trim($ar_temp[1]); $temp[3] = trim($ar_temp[2]); array_push($ar_buf, "|".implode("|", $temp)."|"); } } } break; default: $this->error->addConfigError("temperature()", "PSI_HDD_TEMP"); break; } // Timo van Roermund: parse the info from the hddtemp daemon. foreach ($ar_buf as $line) { $data = array(); if (preg_match("/\|(.*)\|(.*)\|(.*)\|(.*)\|/", $line, $data)) { if (trim($data[3]) != "ERR") { // get the info we need $dev = new SensorDevice(); $dev->setName($data[1] . ' (' . (strpos($data[2]," ")?substr($data[2],0,strpos($data[2]," ")):$data[2]) . ')'); if (is_numeric($data[3])) { $dev->setValue($data[3]); } $dev->setMax(60); $this->mbinfo->setMbTemp($dev); } } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); } } phpsysinfo-3.2.1/includes/mb/class.healthd.inc.php000066400000000000000000000106611247443170600221350ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.healthd.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from healthd * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Healthd extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private content var through tcp or file access */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'command': $lines = ""; CommonFunctions::executeProgram('healthdc', '-t', $lines); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); break; case 'file': if (CommonFunctions::rfts(APP_ROOT.'/data/healthd.txt', $lines)) { $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { $ar_buf = preg_split("/\t+/", $this->_lines); $dev1 = new SensorDevice(); $dev1->setName('temp1'); $dev1->setValue($ar_buf[1]); $dev1->setMax(70); $this->mbinfo->setMbTemp($dev1); $dev2 = new SensorDevice(); $dev2->setName('temp1'); $dev2->setValue($ar_buf[2]); $dev2->setMax(70); $this->mbinfo->setMbTemp($dev2); $dev3 = new SensorDevice(); $dev3->setName('temp1'); $dev3->setValue($ar_buf[3]); $dev3->setMax(70); $this->mbinfo->setMbTemp($dev3); } /** * get fan information * * @return void */ private function _fans() { $ar_buf = preg_split("/\t+/", $this->_lines); $dev1 = new SensorDevice(); $dev1->setName('fan1'); $dev1->setValue($ar_buf[4]); $dev1->setMin(3000); $this->mbinfo->setMbFan($dev1); $dev2 = new SensorDevice(); $dev2->setName('fan2'); $dev2->setValue($ar_buf[5]); $dev2->setMin(3000); $this->mbinfo->setMbFan($dev2); $dev3 = new SensorDevice(); $dev3->setName('fan3'); $dev3->setValue($ar_buf[6]); $dev3->setMin(3000); $this->mbinfo->setMbFan($dev3); } /** * get voltage information * * @return array voltage in array with lable */ private function _voltage() { $ar_buf = preg_split("/\t+/", $this->_lines); $dev1 = new SensorDevice(); $dev1->setName('Vcore1'); $dev1->setValue($ar_buf[7]); $this->mbinfo->setMbVolt($dev1); $dev2 = new SensorDevice(); $dev2->setName('Vcore2'); $dev2->setValue($ar_buf[8]); $this->mbinfo->setMbVolt($dev2); $dev3 = new SensorDevice(); $dev3->setName('3volt'); $dev3->setValue($ar_buf[9]); $this->mbinfo->setMbVolt($dev3); $dev4 = new SensorDevice(); $dev4->setName('+5Volt'); $dev4->setValue($ar_buf[10]); $this->mbinfo->setMbVolt($dev4); $dev5 = new SensorDevice(); $dev5->setName('+12Volt'); $dev5->setValue($ar_buf[11]); $this->mbinfo->setMbVolt($dev5); $dev6 = new SensorDevice(); $dev6->setName('-12Volt'); $dev6->setValue($ar_buf[12]); $this->mbinfo->setMbVolt($dev6); $dev7 = new SensorDevice(); $dev7->setName('-5Volt'); $dev7->setValue($ar_buf[13]); $this->mbinfo->setMbVolt($dev7); } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); $this->_fans(); $this->_voltage(); } } phpsysinfo-3.2.1/includes/mb/class.hwsensors.inc.php000066400000000000000000000127451247443170600225640ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.hwsensors.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from hwsensors * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class HWSensors extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private content var through tcp or file access */ public function __construct() { parent::__construct(); $lines = ""; // CommonFunctions::executeProgram('sysctl', '-w hw.sensors', $lines); CommonFunctions::executeProgram('sysctl', 'hw.sensors', $lines); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } /** * get temperature information * * @return void */ private function _temperature() { foreach ($this->_lines as $line) { if (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+temp,\s+([0-9\.]+)\s+degC.*$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbTemp($dev); } elseif (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+([0-9\.]+)\s+degC$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbTemp($dev); } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+degC\s+\((.*)\)$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[3]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbTemp($dev); } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+degC$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbTemp($dev); } } } /** * get fan information * * @return void */ private function _fans() { foreach ($this->_lines as $line) { if (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+fanrpm,\s+([0-9\.]+)\s+RPM.*$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbFan($dev); } elseif (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+([0-9\.]+)\s+RPM$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbFan($dev); } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+RPM\s+\((.*)\)$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[3]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbFan($dev); } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+RPM$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbFan($dev); } } } /** * get voltage information * * @return void */ private function _voltage() { foreach ($this->_lines as $line) { if (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+volts_dc,\s+([0-9\.]+)\s+V.*$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbVolt($dev); } elseif (preg_match('/^hw\.sensors\.[0-9]+=[^\s,]+,\s+([^,]+),\s+([0-9\.]+)\s+V\sDC$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbVolt($dev); } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+VDC\s+\((.*)\)$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[3]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbVolt($dev); } elseif (preg_match('/^hw\.sensors\.[^\.]+\.(.*)=([0-9\.]+)\s+VDC$/', $line, $ar_buf)) { $dev = new SensorDevice(); $dev->setName($ar_buf[1]); $dev->setValue($ar_buf[2]); $this->mbinfo->setMbVolt($dev); } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); $this->_voltage(); $this->_fans(); } } phpsysinfo-3.2.1/includes/mb/class.ipmi.inc.php000066400000000000000000000141321247443170600214570ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.ipmi.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from ipmitool * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class IPMI extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private content var through tcp or file access */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'command': CommonFunctions::executeProgram('ipmitool', 'sensor', $lines); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); break; case 'file': if (CommonFunctions::rfts(APP_ROOT.'/data/ipmi.txt', $lines)) { $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "degrees C" && $buffer[3] != "na") { $dev = new SensorDevice(); $dev->setName($buffer[0]); $dev->setValue($buffer[1]); if ($buffer[8] != "na") $dev->setMax($buffer[8]); switch ($buffer[3]) { case "nr": $dev->setEvent("Non-Recoverable"); break; case "cr": $dev->setEvent("Critical"); break; case "nc": $dev->setEvent("Non-Critical"); break; } $this->mbinfo->setMbTemp($dev); } } } /** * get voltage information * * @return void */ private function _voltage() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Volts" && $buffer[3] != "na") { $dev = new SensorDevice(); $dev->setName($buffer[0]); $dev->setValue($buffer[1]); if ($buffer[5] != "na") $dev->setMin($buffer[5]); if ($buffer[8] != "na") $dev->setMax($buffer[8]); switch ($buffer[3]) { case "nr": $dev->setEvent("Non-Recoverable"); break; case "cr": $dev->setEvent("Critical"); break; case "nc": $dev->setEvent("Non-Critical"); break; } $this->mbinfo->setMbVolt($dev); } } } /** * get fan information * * @return void */ private function _fans() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "RPM" && $buffer[3] != "na") { $dev = new SensorDevice(); $dev->setName($buffer[0]); $dev->setValue($buffer[1]); if ($buffer[8] != "na") { $dev->setMin($buffer[8]); } elseif (($buffer[5] != "na") && ($buffer[5]<$buffer[1])) { //max instead min issue $dev->setMin($buffer[5]); } switch ($buffer[3]) { case "nr": $dev->setEvent("Non-Recoverable"); break; case "cr": $dev->setEvent("Critical"); break; case "nc": $dev->setEvent("Non-Critical"); break; } $this->mbinfo->setMbFan($dev); } } } /** * get power information * * @return void */ private function _power() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Watts" && $buffer[3] != "na") { $dev = new SensorDevice(); $dev->setName($buffer[0]); $dev->setValue($buffer[1]); if ($buffer[8] != "na") $dev->setMax($buffer[8]); switch ($buffer[3]) { case "nr": $dev->setEvent("Non-Recoverable"); break; case "cr": $dev->setEvent("Critical"); break; case "nc": $dev->setEvent("Non-Critical"); break; } $this->mbinfo->setMbPower($dev); } } } /** * get current information * * @return void */ private function _current() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if ($buffer[2] == "Amps" && $buffer[3] != "na") { $dev = new SensorDevice(); $dev->setName($buffer[0]); $dev->setValue($buffer[1]); if ($buffer[8] != "na") $dev->setMax($buffer[8]); switch ($buffer[3]) { case "nr": $dev->setEvent("Non-Recoverable"); break; case "cr": $dev->setEvent("Critical"); break; case "nc": $dev->setEvent("Non-Critical"); break; } $this->mbinfo->setMbCurrent($dev); } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); $this->_voltage(); $this->_fans(); $this->_power(); $this->_current(); } } phpsysinfo-3.2.1/includes/mb/class.ipmiutil.inc.php000066400000000000000000000217351247443170600223640ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.ipmiutil.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from ipmi-sensors * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class IPMIutil extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private content var through tcp or file access */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'command': CommonFunctions::executeProgram('ipmiutil', 'sensor -stw', $lines); $this->_lines = preg_split("/\r?\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); break; case 'file': if (CommonFunctions::rfts(APP_ROOT.'/data/ipmiutil.txt', $lines)) { $this->_lines = preg_split("/\r?\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if (isset($buffer[2]) && $buffer[2] == "Temperature" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sC$/",$buffer[6], $value)) { $dev = new SensorDevice(); $dev->setName($buffer[4]); $dev->setValue($value[1]); if (isset($buffer[7]) && $buffer[7] == "Thresholds") { if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[8], $limits)) ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[9], $limits)) ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[10], $limits)) ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[11], $limits))) { $dev->setMax($limits[1]); } } if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); $this->mbinfo->setMbTemp($dev); } } } /** * get voltage information * * @return void */ private function _voltage() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if (isset($buffer[2]) && $buffer[2] == "Voltage" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sV$/",$buffer[6], $value)) { $dev = new SensorDevice(); $dev->setName($buffer[4]); $dev->setValue($value[1]); if (isset($buffer[7]) && $buffer[7] == "Thresholds") { if ((isset($buffer[8]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[8], $limits)) ||(isset($buffer[9]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[9], $limits)) ||(isset($buffer[10]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[10], $limits)) ||(isset($buffer[11]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[11], $limits))) { $dev->setMin($limits[1]); } if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[8], $limits)) ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[9], $limits)) ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[10], $limits)) ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[11], $limits))) { $dev->setMax($limits[1]); } } if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); $this->mbinfo->setMbVolt($dev); } } } /** * get fan information * * @return void */ private function _fans() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if (isset($buffer[2]) && $buffer[2] == "Fan" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sRPM$/",$buffer[6], $value)) { $dev = new SensorDevice(); $dev->setName($buffer[4]); $dev->setValue($value[1]); if (isset($buffer[7]) && $buffer[7] == "Thresholds") { if ((isset($buffer[8]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[8], $limits)) ||(isset($buffer[9]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[9], $limits)) ||(isset($buffer[10]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[10], $limits)) ||(isset($buffer[11]) && preg_match("/^lo-crit\s(\S+)\s*$/",$buffer[11], $limits))) { $dev->setMin($limits[1]); } elseif ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[8], $limits)) ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[9], $limits)) ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[10], $limits)) ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[11], $limits))) { if ($limits[1]<$value[1]) {//max instead min issue $dev->setMin($limits[1]); } } } if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); $this->mbinfo->setMbFan($dev); } } } /** * get power information * * @return void */ private function _power() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if (isset($buffer[2]) && $buffer[2] == "Current" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sW$/",$buffer[6], $value)) { $dev = new SensorDevice(); $dev->setName($buffer[4]); $dev->setValue($value[1]); if (isset($buffer[7]) && $buffer[7] == "Thresholds") { if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[8], $limits)) ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[9], $limits)) ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[10], $limits)) ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[11], $limits))) { $dev->setMax($limits[1]); } } if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); $this->mbinfo->setMbPower($dev); } } } /** * get current information * * @return void */ private function _current() { foreach ($this->_lines as $line) { $buffer = preg_split("/\s*\|\s*/", $line); if (isset($buffer[2]) && $buffer[2] == "Current" && $buffer[1] == "Full" && isset($buffer[6]) && preg_match("/^(\S+)\sA$/",$buffer[6], $value)) { $dev = new SensorDevice(); $dev->setName($buffer[4]); $dev->setValue($value[1]); if (isset($buffer[7]) && $buffer[7] == "Thresholds") { if ((isset($buffer[8]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[8], $limits)) ||(isset($buffer[9]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[9], $limits)) ||(isset($buffer[10]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[10], $limits)) ||(isset($buffer[11]) && preg_match("/^hi-crit\s(\S+)\s*$/",$buffer[11], $limits))) { $dev->setMax($limits[1]); } } if ($buffer[5] != "OK") $dev->setEvent($buffer[5]); $this->mbinfo->setMbCurrent($dev); } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); $this->_voltage(); $this->_fans(); $this->_power(); $this->_current(); } } phpsysinfo-3.2.1/includes/mb/class.k8temp.inc.php000066400000000000000000000045551247443170600217410ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.k8temp.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from k8temp * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class K8Temp extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private array */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'command': $lines = ""; CommonFunctions::executeProgram('k8temp', '', $lines); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); break; case 'file': if (CommonFunctions::rfts(APP_ROOT.'/data/k8temp.txt', $lines)) { $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { foreach ($this->_lines as $line) { if (preg_match('/(.*):\s*(\d*)/', $line, $data)) { if ($data[2] > 0) { $dev = new SensorDevice(); $dev->setName($data[1]); $dev->setMax('70.0'); if ($data[2] < 250) { $dev->setValue($data[2]); } $this->mbinfo->setMbTemp($dev); } } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); } } phpsysinfo-3.2.1/includes/mb/class.lmsensors.inc.php000066400000000000000000000332111247443170600225450ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.lmsensors.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from lmsensor * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class LMSensors extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private content var through tcp or file access */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'command': if (CommonFunctions::executeProgram("sensors", "", $lines)) { // Martijn Stolk: Dirty fix for misinterpreted output of sensors, // where info could come on next line when the label is too long. $lines = str_replace(":\n", ":", $lines); $lines = str_replace("\n\n", "\n", $lines); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; case 'file': if (CommonFunctions::rfts(APP_ROOT.'/data/lmsensors.txt', $lines)) { $lines = str_replace(":\n", ":", $lines); $lines = str_replace("\n\n", "\n", $lines); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { $ar_buf = array(); foreach ($this->_lines as $line) { $data = array(); if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { ; } else { preg_match("/(.*):(.*)/", $line, $data); } if (count($data) > 1) { $temp = substr(trim($data[2]), -1); switch ($temp) { case "C": // case "F": array_push($ar_buf, $line); } } } foreach ($ar_buf as $line) { $data = array(); if (preg_match("/(.*):(.*).C[ ]*\((.*)=(.*).C,(.*)=(.*).C\)(.*)\)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*).C[ ]*\((.*)=(.*).C,(.*)=(.*).C\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*).C[ ]*\((.*)=(.*).C\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*).C[ \t]+/", $line, $data)) { ; } else { preg_match("/(.*):(.*).C$/", $line, $data); } foreach ($data as $key=>$value) { if (preg_match("/^\+?(-?[0-9\.]+).?$/", trim($value), $newvalue)) { $data[$key] = 0+trim($newvalue[1]); } else { $data[$key] = trim($value); } } $dev = new SensorDevice(); if (strlen($data[1]) == 4) { if ($data[1][0] == "T") { if ($data[1][1] == "A") { $data[1] = $data[1] . " Ambient"; } elseif ($data[1][1] == "C") { $data[1] = $data[1] . " CPU"; } elseif ($data[1][1] == "G") { $data[1] = $data[1] . " GPU"; } elseif ($data[1][1] == "H") { $data[1] = $data[1] . " Harddisk"; } elseif ($data[1][1] == "L") { $data[1] = $data[1] . " LCD"; } elseif ($data[1][1] == "O") { $data[1] = $data[1] . " ODD"; } elseif ($data[1][1] == "B") { $data[1] = $data[1] . " Battery"; } if ($data[1][3] == "H") { $data[1] = $data[1] . " Heatsink"; } elseif ($data[1][3] == "P") { $data[1] = $data[1] . " Proximity"; } elseif ($data[1][3] == "D") { $data[1] = $data[1] . " Die"; } } } $dev->setName($data[1]); $dev->setValue($data[2]); if (isset($data[6]) && $data[2] <= $data[6]) { $dev->setMax(max($data[4],$data[6])); } elseif (isset($data[4]) && $data[2] <= $data[4]) { $dev->setMax($data[4]); } if (preg_match("/\sALARM(\s*)$/", $line)) { $dev->setEvent("Alarm"); } $this->mbinfo->setMbTemp($dev); } } /** * get fan information * * @return void */ private function _fans() { $ar_buf = array(); foreach ($this->_lines as $line) { $data = array(); if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { ; } else { preg_match("/(.*):(.*)/", $line, $data); } if (count($data) > 1) { $temp = substr(trim($data[2]), -4); switch ($temp) { case " RPM": array_push($ar_buf, $line); } } } foreach ($ar_buf as $line) { $data = array(); if (preg_match("/(.*):(.*) RPM[ ]*\((.*)=(.*) RPM,(.*)=(.*)\)(.*)\)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) RPM[ ]*\((.*)=(.*) RPM,(.*)=(.*)\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) RPM[ ]*\((.*)=(.*) RPM\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) RPM[ \t]+/", $line, $data)) { ; } else { preg_match("/(.*):(.*) RPM$/", $line, $data); } $dev = new SensorDevice(); $dev->setName(trim($data[1])); $dev->setValue(trim($data[2])); if (isset($data[4])) { $dev->setMin(trim($data[4])); } if (preg_match("/\sALARM(\s*)$/", $line)) { $dev->setEvent("Alarm"); } $this->mbinfo->setMbFan($dev); } } /** * get voltage information * * @return void */ private function _voltage() { $ar_buf = array(); foreach ($this->_lines as $line) { $data = array(); if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*)\(/", $line, $data)) { ; } else { preg_match("/(.*):(.*)/", $line, $data); } if (count($data) > 1) { $temp = substr(trim($data[2]), -2); switch ($temp) { case " V": array_push($ar_buf, $line); } } } foreach ($ar_buf as $line) { $data = array(); if (preg_match("/(.*):(.*) V[ ]*\((.*)=(.*) V,(.*)=(.*) V\)(.*)\)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) V[ ]*\((.*)=(.*) V,(.*)=(.*) V\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) V[ \t]+/", $line, $data)) { ; } else { preg_match("/(.*):(.*) V$/", $line, $data); } foreach ($data as $key=>$value) { if (preg_match("/^\+?(-?[0-9\.]+)$/", trim($value), $newvalue)) { $data[$key] = 0+trim($newvalue[1]); } else { $data[$key] = trim($value); } } if (isset($data[1])) { $dev = new SensorDevice(); $dev->setName($data[1]); $dev->setValue($data[2]); if (isset($data[4])) { $dev->setMin($data[4]); } if (isset($data[6])) { $dev->setMax($data[6]); } if (preg_match("/\sALARM(\s*)$/", $line)) { $dev->setEvent("Alarm"); } $this->mbinfo->setMbVolt($dev); } } } /** * get power information * * @return void */ private function _power() { $ar_buf = array(); foreach ($this->_lines as $line) { $data = array(); if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { ; } else { preg_match("/(.*):(.*)/", $line, $data); } if (count($data) > 1) { $temp = substr(trim($data[2]), -2); switch ($temp) { case " W": array_push($ar_buf, $line); } } } foreach ($ar_buf as $line) { $data = array(); /* not tested yet if (preg_match("/(.*):(.*) W[ ]*\((.*)=(.*) W,(.*)=(.*) W\)(.*)\)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) W[ ]*\((.*)=(.*) W,(.*)=(.*) W\)(.*)/", $line, $data)) { ; } else */ if (preg_match("/(.*):(.*) W[ ]*\((.*)=(.*) W\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) W[ \t]+/", $line, $data)) { ; } else { preg_match("/(.*):(.*) W$/", $line, $data); } foreach ($data as $key=>$value) { if (preg_match("/^\+?([0-9\.]+).?$/", trim($value), $newvalue)) { $data[$key] = trim($newvalue[1]); } else { $data[$key] = trim($value); } } $dev = new SensorDevice(); $dev->setName($data[1]); $dev->setValue($data[2]); if (isset($data[6]) && $data[2] <= $data[6]) { $dev->setMax(max($data[4],$data[6])); } elseif (isset($data[4]) && $data[2] <= $data[4]) { $dev->setMax($data[4]); } if (preg_match("/\sALARM(\s*)$/", $line)) { $dev->setEvent("Alarm"); } $this->mbinfo->setMbPower($dev); } } /** * get current information * * @return void */ private function _current() { $ar_buf = array(); foreach ($this->_lines as $line) { $data = array(); if (preg_match("/(.*):(.*)\((.*)=(.*),(.*)=(.*)\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*)\((.*)=(.*)\)(.*)/", $line, $data)) { ; } else { preg_match("/(.*):(.*)/", $line, $data); } if (count($data) > 1) { $temp = substr(trim($data[2]), -2); switch ($temp) { case " A": array_push($ar_buf, $line); } } } foreach ($ar_buf as $line) { $data = array(); /* not tested yet if (preg_match("/(.*):(.*) A[ ]*\((.*)=(.*) A,(.*)=(.*) A\)(.*)\)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) A[ ]*\((.*)=(.*) A,(.*)=(.*) A\)(.*)/", $line, $data)) { ; } else */ if (preg_match("/(.*):(.*) A[ ]*\((.*)=(.*) A\)(.*)/", $line, $data)) { ; } elseif (preg_match("/(.*):(.*) A[ \t]+/", $line, $data)) { ; } else { preg_match("/(.*):(.*) A$/", $line, $data); } foreach ($data as $key=>$value) { if (preg_match("/^\+?([0-9\.]+).?$/", trim($value), $newvalue)) { $data[$key] = trim($newvalue[1]); } else { $data[$key] = trim($value); } } $dev = new SensorDevice(); $dev->setName($data[1]); $dev->setValue($data[2]); if (isset($data[6]) && $data[2] <= $data[6]) { $dev->setMax(max($data[4],$data[6])); } elseif (isset($data[4]) && $data[2] <= $data[4]) { $dev->setMax($data[4]); } if (preg_match("/\sALARM(\s*)$/", $line)) { $dev->setEvent("Alarm"); } $this->mbinfo->setMbCurrent($dev); } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); $this->_voltage(); $this->_fans(); $this->_power(); $this->_current(); } } phpsysinfo-3.2.1/includes/mb/class.mbm5.inc.php000066400000000000000000000074361247443170600213720ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.mbm5.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from Motherboard Monitor 5 * information retrival through csv file * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class MBM5 extends Sensors { /** * array with the names of the labels * * @var array */ private $_buf_label = array(); /** * array withe the values * * @var array */ private $_buf_value = array(); /** * read the MBM5.csv file and fill the private arrays */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'file': $delim = "/;/"; CommonFunctions::rfts(APP_ROOT."/data/MBM5.csv", $buffer); if (strpos($buffer, ";") === false) { $delim = "/,/"; } $buffer = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); $this->_buf_label = preg_split($delim, substr($buffer[0], 0, -2), -1, PREG_SPLIT_NO_EMPTY); $this->_buf_value = preg_split($delim, substr($buffer[1], 0, -2), -1, PREG_SPLIT_NO_EMPTY); break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { for ($intPosi = 3; $intPosi < 6; $intPosi++) { if ($this->_buf_value[$intPosi] == 0) { continue; } preg_match("/([0-9\.])*/", str_replace(",", ".", $this->_buf_value[$intPosi]), $hits); $dev = new SensorDevice(); $dev->setName($this->_buf_label[$intPosi]); $dev->setValue($hits[0]); $dev->setMax(70); $this->mbinfo->setMbTemp($dev); } } /** * get fan information * * @return void */ private function _fans() { for ($intPosi = 13; $intPosi < 16; $intPosi++) { if (!isset($this->_buf_value[$intPosi])) { continue; } preg_match("/([0-9\.])*/", str_replace(",", ".", $this->_buf_value[$intPosi]), $hits); $dev = new SensorDevice(); $dev->setName($this->_buf_label[$intPosi]); $dev->setValue($hits[0]); $dev->setMin(3000); $this->mbinfo->setMbFan($dev); } } /** * get voltage information * * @return void */ private function _voltage() { for ($intPosi = 6; $intPosi < 13; $intPosi++) { if ($this->_buf_value[$intPosi] == 0) { continue; } preg_match("/([0-9\.])*/", str_replace(",", ".", $this->_buf_value[$intPosi]), $hits); $dev = new SensorDevice(); $dev->setName($this->_buf_label[$intPosi]); $dev->setValue($hits[0]); $this->mbinfo->setMbVolt($dev); } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_fans(); $this->_temperature(); $this->_voltage(); } } phpsysinfo-3.2.1/includes/mb/class.mbmon.inc.php000066400000000000000000000076301247443170600216360ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.mbmon.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from mbmon * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class MBMon extends Sensors { /** * content to parse * * @var array */ private $_lines = array(); /** * fill the private content var through tcp or file access */ public function __construct() { parent::__construct(); switch (strtolower(PSI_SENSOR_ACCESS)) { case 'tcp': $fp = fsockopen("localhost", 411, $errno, $errstr, 5); if ($fp) { $lines = ""; while (!feof($fp)) { $lines .= fread($fp, 1024); } $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } else { $this->error->addError("fsockopen()", $errno." ".$errstr); } break; case 'command': CommonFunctions::executeProgram('mbmon', '-c 1 -r', $lines, PSI_DEBUG); $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); break; case 'file': if (CommonFunctions::rfts(APP_ROOT.'/data/mbmon.txt', $lines)) { $this->_lines = preg_split("/\n/", $lines, -1, PREG_SPLIT_NO_EMPTY); } break; default: $this->error->addConfigError('__construct()', 'PSI_SENSOR_ACCESS'); break; } } /** * get temperature information * * @return void */ private function _temperature() { foreach ($this->_lines as $line) { if (preg_match('/^(TEMP\d*)\s*:\s*(.*)$/D', $line, $data)) { if ($data[2] <> '0') { $dev = new SensorDevice(); $dev->setName($data[1]); $dev->setMax(70); if ($data[2] < 250) { $dev->setValue($data[2]); } $this->mbinfo->setMbTemp($dev); } } } } /** * get fan information * * @return void */ private function _fans() { foreach ($this->_lines as $line) { if (preg_match('/^(FAN\d*)\s*:\s*(.*)$/D', $line, $data)) { if ($data[2] <> '0') { $dev = new SensorDevice(); $dev->setName($data[1]); $dev->setValue($data[2]); $dev->setMax(3000); $this->mbinfo->setMbFan($dev); } } } } /** * get voltage information * * @return void */ private function _voltage() { foreach ($this->_lines as $line) { if (preg_match('/^(V.*)\s*:\s*(.*)$/D', $line, $data)) { if ($data[2] <> '+0.00') { $dev = new SensorDevice(); $dev->setName($data[1]); $dev->setValue($data[2]); $this->mbinfo->setMbVolt($dev); } } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return void */ public function build() { $this->_temperature(); $this->_voltage(); $this->_fans(); } } phpsysinfo-3.2.1/includes/mb/class.ohm.inc.php000066400000000000000000000100251247443170600213010ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.ohm.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from Open Hardware Monitor * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class OHM extends Sensors { /** * holds the COM object that we pull all the WMI data from * * @var Object */ private $_buf = array(); /** * fill the private content var */ public function __construct() { parent::__construct(); $_wmi = null; // don't set this params for local connection, it will not work $strHostname = ''; $strUser = ''; $strPassword = ''; try { // initialize the wmi object $objLocator = new COM('WbemScripting.SWbemLocator'); if ($strHostname == "") { $_wmi = $objLocator->ConnectServer($strHostname, 'root\OpenHardwareMonitor'); } else { $_wmi = $objLocator->ConnectServer($strHostname, 'root\OpenHardwareMonitor', $strHostname.'\\'.$strUser, $strPassword); } } catch (Exception $e) { $this->error->addError("WMI connect error", "PhpSysInfo can not connect to the WMI interface for OpenHardwareMonitor data."); } if ($_wmi) { $this->_buf = CommonFunctions::getWMI($_wmi, 'Sensor', array('Parent', 'Name', 'SensorType', 'Value')); } } /** * get temperature information * * @return void */ private function _temperature() { if ($this->_buf) foreach ($this->_buf as $buffer) { if ($buffer['SensorType'] == "Temperature") { $dev = new SensorDevice(); $dev->setName($buffer['Parent'].' '.$buffer['Name']); $dev->setValue($buffer['Value']); $this->mbinfo->setMbTemp($dev); } } } /** * get voltage information * * @return void */ private function _voltage() { if ($this->_buf) foreach ($this->_buf as $buffer) { if ($buffer['SensorType'] == "Voltage") { $dev = new SensorDevice(); $dev->setName($buffer['Parent'].' '.$buffer['Name']); $dev->setValue($buffer['Value']); $this->mbinfo->setMbVolt($dev); } } } /** * get fan information * * @return void */ private function _fans() { if ($this->_buf) foreach ($this->_buf as $buffer) { if ($buffer['SensorType'] == "Fan") { $dev = new SensorDevice(); $dev->setName($buffer['Parent'].' '.$buffer['Name']); $dev->setValue($buffer['Value']); $this->mbinfo->setMbFan($dev); } } } /** * get power information * * @return void */ private function _power() { if ($this->_buf) foreach ($this->_buf as $buffer) { if ($buffer['SensorType'] == "Power") { $dev = new SensorDevice(); $dev->setName($buffer['Parent'].' '.$buffer['Name']); $dev->setValue($buffer['Value']); $this->mbinfo->setMbPower($dev); } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); $this->_voltage(); $this->_fans(); $this->_power(); } } phpsysinfo-3.2.1/includes/mb/class.pitemp.inc.php000066400000000000000000000041231247443170600220160ustar00rootroot00000000000000 * @copyright 2012 Marc Hillesheim * @link http://pi.no-ip.biz */ class PiTemp extends Sensors { private function _temperature() { $temp = null; $temp_max = null; if (!CommonFunctions::rfts('/sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/temp1_input',$temp, 0, 4096, false)) { // Not Banana Pi CommonFunctions::rfts('/sys/class/thermal/thermal_zone0/temp', $temp); CommonFunctions::rfts('/sys/class/thermal/thermal_zone0/trip_point_0_temp', $temp_max, 0, 4096, PSI_DEBUG); } if (!is_null($temp) && (trim($temp) != "")) { $dev = new SensorDevice(); $dev->setName("CPU 1"); $dev->setValue($temp / 1000); if (!is_null($temp_max) && (trim($temp_max) != "") && ($temp_max > 0)) { $dev->setMax($temp_max / 1000); } $this->mbinfo->setMbTemp($dev); } } private function _voltage() { $volt = null; if (CommonFunctions::rfts('/sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/ac/voltage_now',$volt, 0, 4096, false) && !is_null($volt) && (trim($volt) != "")) { // Banana Pi $dev = new SensorDevice(); $dev->setName("Voltage 1"); $dev->setValue($volt / 1000000); $this->mbinfo->setMbVolt($dev); } } private function _current() { $current = null; if (CommonFunctions::rfts('/sys/devices/platform/sunxi-i2c.0/i2c-0/0-0034/axp20-supplyer.28/power_supply/ac/current_now',$current, 0, 4096, false) && !is_null($current) && (trim($current) != "")) { // Banana Pi $dev = new SensorDevice(); $dev->setName("Current 1"); $dev->setValue($current / 1000000); $this->mbinfo->setMbCurrent($dev); } } public function build() { $this->_temperature(); $this->_voltage(); $this->_current(); } } phpsysinfo-3.2.1/includes/mb/class.sensors.inc.php000066400000000000000000000027041247443170600222170ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.sensors.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Basic OS functions for all OS classes * * @category PHP * @package PSI sensors class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ abstract class Sensors implements PSI_Interface_Sensor { /** * object for error handling * * @var Error */ protected $error; /** * object for the information * * @var MBInfo */ protected $mbinfo; /** * build the global Error object */ public function __construct() { $this->error = Error::singleton(); $this->mbinfo = new MBInfo(); } /** * get the filled or unfilled (with default values) MBInfo object * * @see PSI_Interface_Sensor::getMBInfo() * * @return MBInfo */ final public function getMBInfo() { $this->build(); return $this->mbinfo; } } phpsysinfo-3.2.1/includes/mb/class.thermalzone.inc.php000066400000000000000000000110151247443170600230460ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.ohm.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting information from Thermal Zone WMI class * * @category PHP * @package PSI_Sensor * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class ThermalZone extends Sensors { /** * holds the COM object that we pull all the WMI data from * * @var Object */ private $_buf = array(); /** * fill the private content var */ public function __construct() { parent::__construct(); if (PSI_OS == 'WINNT') { $_wmi = null; // don't set this params for local connection, it will not work $strHostname = ''; $strUser = ''; $strPassword = ''; try { // initialize the wmi object $objLocator = new COM('WbemScripting.SWbemLocator'); if ($strHostname == "") { $_wmi = $objLocator->ConnectServer($strHostname, 'root\WMI'); } else { $_wmi = $objLocator->ConnectServer($strHostname, 'root\WMI', $strHostname.'\\'.$strUser, $strPassword); } } catch (Exception $e) { $this->error->addError("WMI connect error", "PhpSysInfo can not connect to the WMI interface for ThermalZone data."); } if ($_wmi) { $this->_buf = CommonFunctions::getWMI($_wmi, 'MSAcpi_ThermalZoneTemperature', array('InstanceName', 'CriticalTripPoint', 'CurrentTemperature')); } } } /** * get temperature information * * @return void */ private function _temperature() { if (PSI_OS == 'WINNT') { if ($this->_buf) foreach ($this->_buf as $buffer) { if (isset($buffer['CurrentTemperature']) && (( $value = ($buffer['CurrentTemperature'] - 2732)/10 ) > -100)) { $dev = new SensorDevice(); if (isset($buffer['InstanceName']) && preg_match("/([^\\\\ ]+)$/", $buffer['InstanceName'], $outbuf)) { $dev->setName('ThermalZone '.$outbuf[1]); } else { $dev->setName('ThermalZone THM0_0'); } $dev->setValue($value); if (isset($buffer['CriticalTripPoint']) && (( $maxvalue = ($buffer['CriticalTripPoint'] - 2732)/10 ) > 0)) { $dev->setMax($maxvalue); } $this->mbinfo->setMbTemp($dev); } } } else { foreach (glob('/sys/class/thermal/thermal_zone*/') as $thermalzone) { $thermalzonetemp = $thermalzone.'temp'; $temp = null; if (CommonFunctions::rfts($thermalzonetemp, $temp, 0, 4096, false) && !is_null($temp) && (trim($temp) != "")) { if ($temp >= 1000) { $temp = $temp / 1000; } $dev = new SensorDevice(); $dev->setValue($temp); $temp_type = null; if (CommonFunctions::rfts($thermalzone.'type', $temp_type, 0, 4096, false) && !is_null($temp_type) && (trim($temp_type) != "")) { $dev->setName($temp_type); } $temp_max = null; if (CommonFunctions::rfts($thermalzone.'trip_point_0_temp', $temp_max, 0, 4096, false) && !is_null($temp_max) && (trim($temp_max) != "") && ($temp_max > 0)) { if ($temp_max >= 1000) { $temp_max = $temp_max / 1000; } $dev->setMax($temp_max); } $this->mbinfo->setMbTemp($dev); } } } } /** * get the information * * @see PSI_Interface_Sensor::build() * * @return Void */ public function build() { $this->_temperature(); } } phpsysinfo-3.2.1/includes/os/000077500000000000000000000000001247443170600161565ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/os/class.AIX.inc.php000066400000000000000000000254221247443170600211710ustar00rootroot00000000000000 * @copyright 2011 Krzysztof Paz * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.AIX.inc.php 287 2009-06-26 12:11:59Z Krzysztof Paz, IBM POLSKA * @link http://phpsysinfo.sourceforge.net */ /** * IBM AIX sysinfo class * get all the required information from IBM AIX system * * @category PHP * @package PSI AIX OS class * @author Krzysztof Paz (kpaz@gazeta.pl) based on Michael Cramer * @copyright 2011 Krzysztof Paz * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class AIX extends OS { private $myprtconf = array(); /** * Virtual Host Name * @return void */ private function _hostname() { /* if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::executeProgram('hostname', '', $ret)) { $this->sys->setHostname($ret); } } */ $this->sys->setHostname(getenv('SERVER_NAME')); } /** * IP of the Virtual Host Name * @return void */ private function _ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!($result = getenv('SERVER_ADDR'))) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * IBM AIX Version * @return void */ private function _kernel() { if (CommonFunctions::executeProgram('oslevel', '', $ret1) && CommonFunctions::executeProgram('oslevel', '-s', $ret2)) { $this->sys->setKernel($ret1 . ' (' . $ret2 . ')'); } } /** * UpTime * time the system is running * @return void */ private function _uptime() { if (CommonFunctions::executeProgram('uptime', '', $buf)) { if (preg_match("/up (\d+) days,\s*(\d+):(\d+),/", $buf, $ar_buf) || preg_match("/up (\d+) day,\s*(\d+):(\d+),/", $buf, $ar_buf)) { $min = $ar_buf[3]; $hours = $ar_buf[2]; $days = $ar_buf[1]; $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); } } } /** * Number of Users * @return void */ private function _users() { if (CommonFunctions::executeProgram('who', '| wc -l', $buf, PSI_DEBUG)) { $this->sys->setUsers($buf); } } /** * Processor Load * optionally create a loadbar * @return void */ private function _loadavg() { if (CommonFunctions::executeProgram('uptime', '', $buf)) { if (preg_match("/average: (.*), (.*), (.*)$/", $buf, $ar_buf)) { $this->sys->setLoad($ar_buf[1].' '.$ar_buf[2].' '.$ar_buf[3]); } } } /** * CPU information * All of the tags here are highly architecture dependant * @return void */ private function _cpuinfo() { $dev = new CpuDevice(); CommonFunctions::executeProgram('cat', '/tmp/webprtconf.txt |grep Type', $cpudev); $dev->setModel($cpudev); CommonFunctions::executeProgram('cat', '/tmp/webprtconf.txt | grep Speed | awk \'{print $4}\'', $cpuspeed); $dev->setCpuSpeed($cpuspeed); //$dev->setCache('512000'); //-don't know howto guess cache size $this->sys->setCpus($dev); } /** * PCI devices * @return void */ private function _pci() { // FIXME CommonFunctions::executeProgram('cat', '/tmp/webprtconf.txt |grep PCI', $bufr); $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); $dev->setName($line); $this->sys->setPciDevices($dev); } } /** * IDE devices * @return void */ private function _ide() { // FIXME CommonFunctions::executeProgram('cat', '/tmp/webprtconf.txt |grep IDE', $bufr); $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); $dev->setName($line); $this->sys->setIdeDevices($dev); //$dev->setCapacity(trim($line???) * 512 / 1024); } } /** * SCSI devices * @return void */ private function _scsi() { // FIXME CommonFunctions::executeProgram('cat', '/tmp/webprtconf.txt |grep SCSI', $bufr); $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); $dev->setName($line); $this->sys->setScsiDevices($dev); } } /** * USB devices * @return void */ private function _usb() { // FIXME CommonFunctions::executeProgram('cat', '/tmp/webprtconf.txt |grep USB', $bufr); $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); $dev->setName($line); $this->sys->setUsbDevices($dev); } } /** * Network devices * includes also rx/tx bytes * @return void */ private function _network() { if (CommonFunctions::executeProgram('netstat', '-ni | tail -n +2', $netstat)) { $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $ar_buf = preg_split("/\s+/", $line); if (! empty($ar_buf[0]) && ! empty($ar_buf[3])) { $dev = new NetDevice(); $dev->setName($ar_buf[0]); $dev->setRxBytes($ar_buf[4]); $dev->setTxBytes($ar_buf[6]); $dev->setErrors($ar_buf[5] + $ar_buf[7]); //$dev->setDrops($ar_buf[8]); $this->sys->setNetDevices($dev); } } } } /** * Physical memory information and Swap Space information * @return void */ private function _memory() { CommonFunctions::executeProgram('cat', '/tmp/webprtconf.txt |grep Good|awk \'{print $4}\'', $mems); $this->sys->setMemTotal($mems*1024*1024); //FIXME $mems = 0; $this->sys->setMemUsed($mems); $this->sys->setMemFree($mems); $this->sys->setMemApplication($mems); $this->sys->setMemBuffer($mems); $this->sys->setMemCache($mems); /* if (CommonFunctions::rfts('/proc/meminfo', $bufr)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/Mem:\s+(.*)$/', $buf, $ar_buf)) { $ar_buf = preg_split('/\s+/', $ar_buf[1], 6); $this->sys->setMemTotal($ar_buf[0]); $this->sys->setMemUsed($ar_buf[1]); $this->sys->setMemFree($ar_buf[2]); $this->sys->setMemApplication($ar_buf[3]); $this->sys->setMemBuffer($ar_buf[4]); $this->sys->setMemCache($ar_buf[5]); } // Get info on individual swap files if (CommonFunctions::rfts('/proc/swaps', $swaps)) { $swapdevs = preg_split("/\n/", $swaps, -1, PREG_SPLIT_NO_EMPTY); for ($i = 1, $max = (sizeof($swapdevs) - 1); $i < $max; $i++) { $ar_buf = preg_split('/\s+/', $swapdevs[$i], 6); $dev = new DiskDevice(); $dev->setMountPoint($ar_buf[0]); $dev->setName("SWAP"); $dev->setFsType('swap'); $dev->setTotal($ar_buf[2] * 1024); $dev->setUsed($ar_buf[3] * 1024); $dev->setFree($dev->getTotal() - $dev->getUsed()); $this->sys->setSwapDevices($dev); } } } } */ } /** * filesystem information * * @return void */ private function _filesystems() { if (CommonFunctions::executeProgram('df', '-kP', $df, PSI_DEBUG)) { $mounts = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); if (CommonFunctions::executeProgram('mount', '-v', $s, PSI_DEBUG)) { $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); while (list(, $line) = each($lines)) { $a = preg_split('/ /', $line, -1, PREG_SPLIT_NO_EMPTY); $fsdev[$a[0]] = $a[4]; } } foreach ($mounts as $mount) { $ar_buf = preg_split("/\s+/", $mount, 6); $dev = new DiskDevice(); $dev->setName($ar_buf[0]); $dev->setTotal($ar_buf[1] * 1024); $dev->setUsed($ar_buf[2] * 1024); $dev->setFree($ar_buf[3] * 1024); $dev->setMountPoint($ar_buf[5]); if (isset($fsdev[$ar_buf[0]])) { $dev->setFsType($fsdev[$ar_buf[0]]); } $this->sys->setDiskDevices($dev); } } } /** * Distribution * * @return void */ private function _distro() { $this->sys->setDistribution('IBM AIX'); $this->sys->setDistributionIcon('AIX.png'); } /** * IBM AIX INFORMATIONs by K.PAZ * @return void */ private function _myaixdata() { CommonFunctions::executeProgram('prtconf', '> /tmp/webprtconf.txt', $confret); CommonFunctions::rfts('/tmp/webprtconf.txt', $bufr); $this->myprtconf = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { $this->_myaixdata(); $this->_distro(); $this->_hostname(); $this->_ip(); $this->_kernel(); $this->_uptime(); $this->_users(); $this->_loadavg(); $this->_cpuinfo(); $this->_pci(); $this->_ide(); $this->_scsi(); $this->_usb(); $this->_network(); $this->_memory(); $this->_filesystems(); } } phpsysinfo-3.2.1/includes/os/class.Android.inc.php000066400000000000000000000220561247443170600221300ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Linux.inc.php 712 2012-12-05 14:09:18Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Android sysinfo class * get all the required information from Android system * * @category PHP * @package PSI Android OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Android extends Linux { /** * call parent constructor */ public function __construct() { parent::__construct(); } /** * Kernel Version * * @return void */ private function _kernel() { if (CommonFunctions::rfts('/proc/version', $strBuf, 1)) { if (preg_match('/version (.*?) /', $strBuf, $ar_buf)) { $result = $ar_buf[1]; if (preg_match('/SMP/', $strBuf)) { $result .= ' (SMP)'; } $this->sys->setKernel($result); } } } /** * Number of Users * * @return void */ private function _users() { $this->sys->setUsers(1); } /** * filesystem information * * @return void */ private function _filesystems() { if (CommonFunctions::executeProgram('df', '2>/dev/null ', $df, PSI_DEBUG)) { $df = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); if (CommonFunctions::executeProgram('mount', '', $mount, PSI_DEBUG)) { $mount = preg_split("/\n/", $mount, -1, PREG_SPLIT_NO_EMPTY); foreach ($mount as $mount_line) { $mount_buf = preg_split('/\s+/', $mount_line); if (count($mount_buf) == 6) { $mount_parm[$mount_buf[1]]['fstype'] = $mount_buf[2]; if (PSI_SHOW_MOUNT_OPTION) $mount_parm[$mount_buf[1]]['options'] = $mount_buf[3]; $mount_parm[$mount_buf[1]]['mountdev'] = $mount_buf[0]; } } foreach ($df as $df_line) { if ((preg_match("/^(\/\S+)(\s+)(([0-9\.]+)([KMGT])(\s+)([0-9\.]+)([KMGT])(\s+)([0-9\.]+)([KMGT])(\s+))/", $df_line, $df_buf) || preg_match("/^(\/[^\s\:]+)\:(\s+)(([0-9\.]+)([KMGT])(\s+total\,\s+)([0-9\.]+)([KMGT])(\s+used\,\s+)([0-9\.]+)([KMGT])(\s+available))/", $df_line, $df_buf)) && !preg_match('/^\/mnt\/asec\/com\./', $df_buf[1])) { $dev = new DiskDevice(); if (PSI_SHOW_MOUNT_POINT) $dev->setMountPoint($df_buf[1]); if ($df_buf[5] == 'K') $dev->setTotal($df_buf[4] * 1024); elseif ($df_buf[5] == 'M') $dev->setTotal($df_buf[4] * 1024*1024); elseif ($df_buf[5] == 'G') $dev->setTotal($df_buf[4] * 1024*1024*1024); elseif ($df_buf[5] == 'T') $dev->setTotal($df_buf[4] * 1024*1024*1024*1024); if ($df_buf[8] == 'K') $dev->setUsed($df_buf[7] * 1024); elseif ($df_buf[8] == 'M') $dev->setUsed($df_buf[7] * 1024*1024); elseif ($df_buf[8] == 'G') $dev->setUsed($df_buf[7] * 1024*1024*1024); elseif ($df_buf[8] == 'T') $dev->setUsed($df_buf[7] * 1024*1024*1024*1024); if ($df_buf[11] == 'K') $dev->setFree($df_buf[10] * 1024); elseif ($df_buf[11] == 'M') $dev->setFree($df_buf[10] * 1024*1024); elseif ($df_buf[11] == 'G') $dev->setFree($df_buf[10] * 1024*1024*1024); elseif ($df_buf[11] == 'T') $dev->setFree($df_buf[10] * 1024*1024*1024*1024); if (isset($mount_parm[$df_buf[1]])) { $dev->setFsType($mount_parm[$df_buf[1]]['fstype']); $dev->setName($mount_parm[$df_buf[1]]['mountdev']); if (PSI_SHOW_MOUNT_OPTION) { if (PSI_SHOW_MOUNT_CREDENTIALS) { $dev->setOptions($mount_parm[$df_buf[1]]['options']); } else { $mpo=$mount_parm[$df_buf[1]]['options']; $mpo=preg_replace('/(^guest,)|(^guest$)|(,guest$)/i', '', $mpo); $mpo=preg_replace('/,guest,/i', ',', $mpo); $mpo=preg_replace('/(^user=[^,]*,)|(^user=[^,]*$)|(,user=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,user=[^,]*,/i', ',', $mpo); $mpo=preg_replace('/(^username=[^,]*,)|(^username=[^,]*$)|(,username=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,username=[^,]*,/i', ',', $mpo); $mpo=preg_replace('/(^password=[^,]*,)|(^password=[^,]*$)|(,password=[^,]*$)/i', '', $mpo); $mpo=preg_replace('/,password=[^,]*,/i', ',', $mpo); $dev->setOptions($mpo); } } } $this->sys->setDiskDevices($dev); } } } } } /** * Distribution * * @return void */ private function _distro() { $buf = ""; if (CommonFunctions::rfts('/system/build.prop', $lines, 0, 4096, false) && preg_match('/^ro\.build\.version\.release=([^\n]+)/m', $lines, $ar_buf)) { $buf = trim($ar_buf[1]); } if ( is_null($buf) || ($buf == "")) { $this->sys->setDistribution('Android'); } else { if (preg_match('/^(\d+\.\d+)/', $buf, $ver) && ($list = @parse_ini_file(APP_ROOT."/data/osnames.ini", true)) && isset($list['Android'][$ver[1]])) { $buf.=' '.$list['Android'][$ver[1]]; } $this->sys->setDistribution('Android '.$buf); } $this->sys->setDistributionIcon('Android.png'); } /** * Machine * * @return void */ private function _machine() { if (CommonFunctions::rfts('/system/build.prop', $lines, 0, 4096, false)) { $buf = ""; if (preg_match('/^ro\.product\.manufacturer=([^\n]+)/m', $lines, $ar_buf)) { $buf .= ' '.trim($ar_buf[1]); } if (preg_match('/^ro\.product\.model=([^\n]+)/m', $lines, $ar_buf) && (trim($buf) !== trim($ar_buf[1]))) { $buf .= ' '.trim($ar_buf[1]); } if (preg_match('/^ro\.semc\.product\.name=([^\n]+)/m', $lines, $ar_buf)) { $buf .= ' '.trim($ar_buf[1]); } if (trim($buf) != "") { $this->sys->setMachine(trim($buf)); } } } /** * PCI devices * * @return array */ private function _pci() { if (CommonFunctions::executeProgram('lspci', '', $bufr, false)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { $device = preg_split("/ /", $buf, 4); if (isset($device[3]) && trim($device[3]) != "") { $dev = new HWDevice(); $dev->setName('Class '.trim($device[2]).' Device '.trim($device[3])); $this->sys->setPciDevices($dev); } } } } /** * USB devices * * @return array */ private function _usb() { if (CommonFunctions::executeProgram('lsusb', '', $bufr, false)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { $device = preg_split("/ /", $buf, 6); if (isset($device[5]) && trim($device[5]) != "") { $dev = new HWDevice(); $dev->setName(trim($device[5])); $this->sys->setUsbDevices($dev); } } } } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { $this->_distro(); $this->_hostname(); $this->_ip(); $this->_kernel(); $this->_machine(); $this->_uptime(); $this->_users(); $this->_cpuinfo(); $this->_pci(); $this->_usb(); $this->_network(); $this->_memory(); $this->_filesystems(); $this->_loadavg(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.BSDCommon.inc.php000066400000000000000000000435101247443170600223270ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.BSDCommon.inc.php 621 2012-07-29 18:49:04Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * BSDCommon class * get all the required information for BSD Like systems * no need to implement in every class the same methods * * @category PHP * @package PSI BSDCommon OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ abstract class BSDCommon extends OS { /** * content of the syslog * * @var array */ private $_dmesg = array(); /** * regexp1 for cpu information out of the syslog * * @var string */ private $_CPURegExp1 = ""; /** * regexp2 for cpu information out of the syslog * * @var string */ private $_CPURegExp2 = ""; /** * regexp1 for scsi information out of the syslog * * @var string */ private $_SCSIRegExp1 = ""; /** * regexp2 for scsi information out of the syslog * * @var string */ private $_SCSIRegExp2 = ""; /** * regexp1 for pci information out of the syslog * * @var string */ private $_PCIRegExp1 = ""; /** * regexp1 for pci information out of the syslog * * @var string */ private $_PCIRegExp2 = ""; /** * call parent constructor */ public function __construct() { parent::__construct(); } /** * setter for cpuregexp1 * * @param string $value value to set * * @return void */ protected function setCPURegExp1($value) { $this->_CPURegExp1 = $value; } /** * setter for cpuregexp2 * * @param string $value value to set * * @return void */ protected function setCPURegExp2($value) { $this->_CPURegExp2 = $value; } /** * setter for scsiregexp1 * * @param string $value value to set * * @return void */ protected function setSCSIRegExp1($value) { $this->_SCSIRegExp1 = $value; } /** * setter for scsiregexp2 * * @param string $value value to set * * @return void */ protected function setSCSIRegExp2($value) { $this->_SCSIRegExp2 = $value; } /** * setter for pciregexp1 * * @param string $value value to set * * @return void */ protected function setPCIRegExp1($value) { $this->_PCIRegExp1 = $value; } /** * setter for pciregexp2 * * @param string $value value to set * * @return void */ protected function setPCIRegExp2($value) { $this->_PCIRegExp2 = $value; } /** * read /var/run/dmesg.boot, but only if we haven't already * * @return array */ protected function readdmesg() { if (count($this->_dmesg) === 0) { if (PSI_OS != "Darwin") { if (CommonFunctions::rfts('/var/run/dmesg.boot', $buf, 0, 4096, false) || CommonFunctions::rfts('/var/log/dmesg.boot', $buf, 0, 4096, false) || CommonFunctions::rfts('/var/run/dmesg.boot', $buf)) { // Once again but with debug $parts = preg_split("/rebooting|Uptime/", $buf, -1, PREG_SPLIT_NO_EMPTY); $this->_dmesg = preg_split("/\n/", $parts[count($parts) - 1], -1, PREG_SPLIT_NO_EMPTY); } } } return $this->_dmesg; } /** * get a value from sysctl command * * @param string $key key for the value to get * * @return string */ protected function grabkey($key) { $buf = ""; if (CommonFunctions::executeProgram('sysctl', "-n $key", $buf, PSI_DEBUG)) { return $buf; } else { return ''; } } /** * Virtual Host Name * * @return void */ protected function hostname() { if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::executeProgram('hostname', '', $buf, PSI_DEBUG)) { $this->sys->setHostname($buf); } } } /** * IP of the Canonical Host Name * * @return void */ protected function ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!($result = getenv('SERVER_ADDR'))) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * Kernel Version * * @return void */ protected function kernel() { $s = $this->grabkey('kern.version'); $a = preg_split('/:/', $s); $this->sys->setKernel($a[0].$a[1].':'.$a[2]); } /** * Number of Users * * @return void */ protected function users() { if (CommonFunctions::executeProgram('who', '| wc -l', $buf, PSI_DEBUG)) { $this->sys->setUsers($buf); } } /** * Processor Load * optionally create a loadbar * * @return void */ protected function loadavg() { $s = $this->grabkey('vm.loadavg'); $s = preg_replace('/{ /', '', $s); $s = preg_replace('/ }/', '', $s); $this->sys->setLoad($s); if (PSI_LOAD_BAR) { if ($fd = $this->grabkey('kern.cp_time')) { // Find out the CPU load // user + sys = load // total = total preg_match($this->_CPURegExp2, $fd, $res); $load = $res[2] + $res[3] + $res[4]; // cpu.user + cpu.sys $total = $res[2] + $res[3] + $res[4] + $res[5]; // cpu.total // we need a second value, wait 1 second befor getting (< 1 second no good value will occour) sleep(1); $fd = $this->grabkey('kern.cp_time'); preg_match($this->_CPURegExp2, $fd, $res); $load2 = $res[2] + $res[3] + $res[4]; $total2 = $res[2] + $res[3] + $res[4] + $res[5]; $this->sys->setLoadPercent((100 * ($load2 - $load)) / ($total2 - $total)); } } } /** * CPU information * * @return void */ protected function cpuinfo() { $dev = new CpuDevice(); $dev->setModel($this->grabkey('hw.model')); $notwas = true; foreach ($this->readdmesg() as $line) { if ($notwas) { if (preg_match("/".$this->_CPURegExp1."/", $line, $ar_buf)) { $dev->setCpuSpeed(round($ar_buf[2])); $notwas = false; } } else { if (preg_match("/ Origin| Features/", $line, $ar_buf)) { if (preg_match("/ Features2[ ]*=.*<(.*)>/", $line, $ar_buf)) { $feats = preg_split("/,/", strtolower(trim($ar_buf[1])), -1, PREG_SPLIT_NO_EMPTY); foreach ($feats as $feat) { if (($feat=="vmx") || ($feat=="svm")) { $dev->setVirt($feat); break 2; } } break; } } else break; } } $ncpu = $this->grabkey('hw.ncpu'); if ( is_null($ncpu) || (trim($ncpu) == "") || (!($ncpu >= 1)) ) $ncpu = 1; for ($ncpu ; $ncpu > 0 ; $ncpu--) { $this->sys->setCpus($dev); } } /** * SCSI devices * get the scsi device information out of dmesg * * @return void */ protected function scsi() { foreach ($this->readdmesg() as $line) { if (preg_match("/".$this->_SCSIRegExp1."/", $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1].": ".$ar_buf[2]); $this->sys->setScsiDevices($dev); } elseif (preg_match("/".$this->_SCSIRegExp2."/", $line, $ar_buf)) { /* duplication security */ $notwas = true; foreach ($this->sys->getScsiDevices() as $finddev) { if ($notwas && (substr($finddev->getName(), 0, strpos($finddev->getName(), ': ')) == $ar_buf[1])) { $finddev->setCapacity($ar_buf[2] * 2048 * 1.049); $notwas = false; break; } } if ($notwas) { $dev = new HWDevice(); $dev->setName($ar_buf[1]); $dev->setCapacity($ar_buf[2] * 2048 * 1.049); $this->sys->setScsiDevices($dev); } } } /* cleaning */ foreach ($this->sys->getScsiDevices() as $finddev) { if (strpos($finddev->getName(), ': ') !== false) $finddev->setName(substr(strstr($finddev->getName(), ': '), 2)); } } /** * parsing the output of pciconf command * * @return Array */ protected function pciconf() { $arrResults = array(); $intS = 0; if (CommonFunctions::executeProgram("pciconf", "-lv", $strBuf, PSI_DEBUG)) { $arrTemp = array(); $arrBlocks = preg_split("/\n\S/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrBlocks as $strBlock) { $arrLines = preg_split("/\n/", $strBlock, -1, PREG_SPLIT_NO_EMPTY); $vend = null; foreach ($arrLines as $strLine) { if (preg_match("/\sclass=0x([a-fA-F0-9]{4})[a-fA-F0-9]{2}\s.*\schip=0x([a-fA-F0-9]{4})([a-fA-F0-9]{4})\s/", $strLine, $arrParts)) { $arrTemp[$intS] = 'Class '.$arrParts[1].': Device '.$arrParts[3].':'.$arrParts[2]; $vend = ''; } elseif (preg_match("/(.*) = '(.*)'/", $strLine, $arrParts)) { if (trim($arrParts[1]) == "vendor") { $vend = trim($arrParts[2]); } elseif (trim($arrParts[1]) == "device") { if (($vend !== null) && ($vend !== '')) { $arrTemp[$intS] = $vend." - ".trim($arrParts[2]); } else { $arrTemp[$intS] = trim($arrParts[2]); $vend = ''; } } } } if ($vend !== null) { $intS++; } } foreach ($arrTemp as $name) { $dev = new HWDevice(); $dev->setName($name); $arrResults[] = $dev; } } return $arrResults; } /** * PCI devices * get the pci device information out of dmesg * * @return void */ protected function pci() { if (!is_array($results = Parser::lspci(false)) || !is_array($results = $this->pciconf())) { foreach ($this->readdmesg() as $line) { if (preg_match("/".$this->_PCIRegExp1."/", $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1].": ".$ar_buf[2]); $results[] = $dev; } elseif (preg_match("/".$this->_PCIRegExp2."/", $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1].": ".$ar_buf[2]); $results[] = $dev; } } } foreach ($results as $dev) { $this->sys->setPciDevices($dev); } } /** * IDE devices * get the ide device information out of dmesg * * @return void */ protected function ide() { foreach ($this->readdmesg() as $line) { if (preg_match('/^(ad[0-9]+): (.*)MB <(.*)> (.*) (.*)/', $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1].": ".$ar_buf[3]); $dev->setCapacity($ar_buf[2] * 1024); $this->sys->setIdeDevices($dev); } elseif (preg_match('/^(acd[0-9]+): (.*) <(.*)> (.*)/', $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1].": ".$ar_buf[3]); $this->sys->setIdeDevices($dev); } elseif (preg_match('/^(ada[0-9]+): <(.*)> (.*)/', $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1].": ".$ar_buf[2]); $this->sys->setIdeDevices($dev); } elseif (preg_match('/^(ada[0-9]+): (.*)MB \((.*)\)/', $line, $ar_buf)) { /* duplication security */ $notwas = true; foreach ($this->sys->getIdeDevices() as $finddev) { if ($notwas && (substr($finddev->getName(), 0, strpos($finddev->getName(), ': ')) == $ar_buf[1])) { $finddev->setCapacity($ar_buf[2] * 1024); $notwas = false; break; } } if ($notwas) { $dev = new HWDevice(); $dev->setName($ar_buf[1]); $dev->setCapacity($ar_buf[2] * 1024); $this->sys->setIdeDevices($dev); } } } /* cleaning */ foreach ($this->sys->getIdeDevices() as $finddev) { if (strpos($finddev->getName(), ': ') !== false) $finddev->setName(substr(strstr($finddev->getName(), ': '), 2)); } } /** * Physical memory information and Swap Space information * * @return void */ protected function memory() { if (PSI_OS == 'FreeBSD' || PSI_OS == 'OpenBSD') { // vmstat on fbsd 4.4 or greater outputs kbytes not hw.pagesize // I should probably add some version checking here, but for now // we only support fbsd 4.4 $pagesize = 1024; } else { $pagesize = $this->grabkey('hw.pagesize'); } if (CommonFunctions::executeProgram('vmstat', '', $vmstat, PSI_DEBUG)) { $lines = preg_split("/\n/", $vmstat, -1, PREG_SPLIT_NO_EMPTY); $ar_buf = preg_split("/\s+/", trim($lines[2]), 19); if (PSI_OS == 'NetBSD' || PSI_OS == 'DragonFly') { $this->sys->setMemFree($ar_buf[4] * 1024); } else { $this->sys->setMemFree($ar_buf[4] * $pagesize); } $this->sys->setMemTotal($this->grabkey('hw.physmem')); $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); if (((PSI_OS == 'OpenBSD' || PSI_OS == 'NetBSD') && CommonFunctions::executeProgram('swapctl', '-l -k', $swapstat, PSI_DEBUG)) || CommonFunctions::executeProgram('swapinfo', '-k', $swapstat, PSI_DEBUG)) { $lines = preg_split("/\n/", $swapstat, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $ar_buf = preg_split("/\s+/", $line, 6); if (($ar_buf[0] != 'Total') && ($ar_buf[0] != 'Device')) { $dev = new DiskDevice(); $dev->setMountPoint($ar_buf[0]); $dev->setName("SWAP"); $dev->setFsType('swap'); $dev->setTotal($ar_buf[1] * 1024); $dev->setUsed($ar_buf[2] * 1024); $dev->setFree($dev->getTotal() - $dev->getUsed()); $this->sys->setSwapDevices($dev); } } } } } /** * USB devices * get the ide device information out of dmesg * * @return void */ protected function usb() { foreach ($this->readdmesg() as $line) { // if (preg_match('/^(ugen[0-9\.]+): <(.*)> (.*) (.*)/', $line, $ar_buf)) { // $dev->setName($ar_buf[1].": ".$ar_buf[2]); if (preg_match('/^(u[a-z]+[0-9]+): <([^,]*)(.*)> on (usbus[0-9]+)/', $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[2]); $this->sys->setUSBDevices($dev); } } } /** * filesystem information * * @return void */ protected function filesystems() { $arrResult = Parser::df(); foreach ($arrResult as $dev) { $this->sys->setDiskDevices($dev); } } /** * Distribution * * @return void */ protected function distro() { if (CommonFunctions::executeProgram('uname', '-s', $result, PSI_DEBUG)) { $this->sys->setDistribution($result); } } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { $this->distro(); $this->memory(); $this->ide(); $this->pci(); $this->cpuinfo(); $this->filesystems(); $this->kernel(); $this->users(); $this->loadavg(); $this->hostname(); $this->ip(); $this->scsi(); $this->usb(); } } phpsysinfo-3.2.1/includes/os/class.Darwin.inc.php000066400000000000000000000407711247443170600220000ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Darwin.inc.php 638 2012-08-24 09:40:48Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Darwin sysinfo class * get all the required information from Darwin system * information may be incomplete * * @category PHP * @package PSI Darwin OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Darwin extends BSDCommon { /** * define the regexp for log parser */ /* public function __construct() { parent::__construct(); $this->error->addWarning("The Darwin version of phpSysInfo is a work in progress, some things currently don't work!"); $this->setCPURegExp1("CPU: (.*) \((.*)-MHz (.*)\)"); $this->setCPURegExp2("/(.*) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/"); $this->setSCSIRegExp1("^(.*): <(.*)> .*SCSI.*device"); } */ /** * get a value from sysctl command * * @param string $key key of the value to get * * @return string */ protected function grabkey($key) { if (CommonFunctions::executeProgram('sysctl', $key, $s, PSI_DEBUG)) { $s = preg_replace('/'.$key.': /', '', $s); $s = preg_replace('/'.$key.' = /', '', $s); return $s; } else { return ''; } } /** * get a value from ioreg command * * @param string $key key of the value to get * * @return string */ private function _grabioreg($key) { if (CommonFunctions::executeProgram('ioreg', '-c "'.$key.'"', $s, PSI_DEBUG)) { /* delete newlines */ $s = preg_replace("/\s+/", " ", $s); /* new newlines */ $s = preg_replace("/[\|\t ]*\+\-\o/", "\n", $s); /* combine duplicate whitespaces and some chars */ $s = preg_replace("/[\|\t ]+/", " ", $s); $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); $out = ""; foreach ($lines as $line) { if (preg_match('/^([^<]*) sys->setUptime(time() - $data); } else { /* kern.boottime= 1096732600 */ $this->sys->setUptime(time() - $a); } } } /** * get CPU information * * @return void */ protected function cpuinfo() { $dev = new CpuDevice(); if (CommonFunctions::executeProgram('hostinfo', '| grep "Processor type"', $buf, PSI_DEBUG)) { $dev->setModel(preg_replace('/Processor type: /', '', $buf)); $buf=$this->grabkey('hw.model'); if ( !is_null($buf) && (trim($buf) != "")) { $this->sys->setMachine(trim($buf)); if (CommonFunctions::rfts(APP_ROOT.'/data/ModelTranslation.txt', $buffer)) { $buffer = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); foreach ($buffer as $line) { $ar_buf = preg_split("/:/", $line, 3); if (trim($buf) === trim($ar_buf[0])) { $dev->setModel(trim($ar_buf[2])); $this->sys->setMachine($this->sys->getMachine().' - '.trim($ar_buf[1])); break; } } } } $buf=$this->grabkey('machdep.cpu.brand_string'); if ( !is_null($buf) && (trim($buf) != "") && ( (trim($buf) != "i486 (Intel 80486)") || ($dev->getModel() == "") ) ) { $dev->setModel(trim($buf)); } $buf=$this->grabkey('machdep.cpu.features'); if ( !is_null($buf) && (trim($buf) != "") ) { if (preg_match("/ VMX/",$buf)) { $dev->setVirt("vmx"); } elseif (preg_match("/ SVM/",$buf)) { $dev->setVirt("svm"); } } } $dev->setCpuSpeed(round($this->grabkey('hw.cpufrequency') / 1000000)); $dev->setBusSpeed(round($this->grabkey('hw.busfrequency') / 1000000)); $bufn=$this->grabkey('hw.cpufrequency_min'); $bufx=$this->grabkey('hw.cpufrequency_max'); if ( !is_null($bufn) && (trim($bufn) != "") && !is_null($bufx) && (trim($bufx) != "") && ($bufn != $bufx)) { $dev->setCpuSpeedMin(round($bufn / 1000000)); $dev->setCpuSpeedMax(round($bufx / 1000000)); } $buf=$this->grabkey('hw.l2cachesize'); if ( !is_null($buf) && (trim($buf) != "") ) { $dev->setCache(round($buf)); } $ncpu = $this->grabkey('hw.ncpu'); if ( is_null($ncpu) || (trim($ncpu) == "") || (!($ncpu >= 1)) ) $ncpu = 1; for ($ncpu ; $ncpu > 0 ; $ncpu--) { $this->sys->setCpus($dev); } } /** * get the pci device information out of ioreg * * @return void */ protected function pci() { if (!$arrResults = Parser::lspci(false)) { //no lspci port $s = $this->_grabioreg('IOPCIDevice'); $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); if (!preg_match('/"IOName" = "([^"]*)"/', $line, $ar_buf )) $ar_buf = preg_split("/[\s@]+/", $line, 19); $dev->setName(trim($ar_buf[1])); $this->sys->setPciDevices($dev); } } else { foreach ($arrResults as $dev) { $this->sys->setPciDevices($dev); } } } /** * get the ide device information out of ioreg * * @return void */ protected function ide() { $s = $this->_grabioreg('IOATABlockStorageDevice'); $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); if (!preg_match('/"Product Name"="([^"]*)"/', $line, $ar_buf )) $ar_buf = preg_split("/[\s]+/", $line, 19); $dev->setName(trim($ar_buf[1])); $this->sys->setIdeDevices($dev); } $s = $this->_grabioreg('IOAHCIBlockStorageDevice'); $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); if (!preg_match('/"Product Name"="([^"]*)"/', $line, $ar_buf )) $ar_buf = preg_split("/[\s]+/", $line, 19); $dev->setName(trim($ar_buf[1])); $this->sys->setIdeDevices($dev); } } /** * get the usb device information out of ioreg * * @return void */ protected function usb() { $s = $this->_grabioreg('IOUSBDevice'); $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); if (!preg_match('/"USB Product Name" = "([^"]*)"/', $line, $ar_buf )) $ar_buf = preg_split("/[\s]+/", $line, 19); $dev->setName(trim($ar_buf[1])); $this->sys->setUsbDevices($dev); } } /** * get the scsi device information out of ioreg * * @return void */ protected function scsi() { $s = $this->_grabioreg('IOBlockStorageServices'); $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $dev = new HWDevice(); if (!preg_match('/"Product Name"="([^"]*)"/', $line, $ar_buf )) $ar_buf = preg_split("/[\s]+/", $line, 19); $dev->setName(trim($ar_buf[1])); $this->sys->setScsiDevices($dev); } } /** * get memory and swap information * * @return void */ protected function memory() { $s = $this->grabkey('hw.memsize'); if (CommonFunctions::executeProgram('vm_stat', '', $pstat, PSI_DEBUG)) { // calculate free memory from page sizes (each page = 4096) if (preg_match('/^Pages free:\s+(\S+)/m', $pstat, $free_buf )) { if (preg_match('/^Anonymous pages:\s+(\S+)/m', $pstat, $anon_buf) && preg_match('/^Pages wired down:\s+(\S+)/m', $pstat, $wire_buf) && preg_match('/^File-backed pages:\s+(\S+)/m', $pstat, $fileb_buf)) { // OS X 10.9 or never $this->sys->setMemFree($free_buf[1] * 4 * 1024); $this->sys->setMemApplication(($anon_buf[1]+$wire_buf[1]) * 4 * 1024); $this->sys->setMemCache($fileb_buf[1] * 4 * 1024); if (preg_match('/^Pages occupied by compressor:\s+(\S+)/m', $pstat, $compr_buf)) { $this->sys->setMemBuffer($compr_buf[1] * 4 * 1024); } } else { if (preg_match('/^Pages speculative:\s+(\S+)/m', $pstat, $spec_buf)) { $this->sys->setMemFree(($free_buf[1]+$spec_buf[1]) * 4 * 1024); } else { $this->sys->setMemFree($free_buf[1] * 4 * 1024); } $appMemory = 0; if (preg_match('/^Pages wired down:\s+(\S+)/m', $pstat, $wire_buf)) { $appMemory += $wire_buf[1] * 4 * 1024; } if (preg_match('/^Pages active:\s+(\S+)/m', $pstat, $active_buf)) { $appMemory += $active_buf[1] * 4 * 1024; } $this->sys->setMemApplication($appMemory); if (preg_match('/^Pages inactive:\s+(\S+)/m', $pstat, $inactive_buf)) { $this->sys->setMemCache($inactive_buf[1] * 4 * 1024); } } } else { $lines = preg_split("/\n/", $pstat, -1, PREG_SPLIT_NO_EMPTY); $ar_buf = preg_split("/\s+/", $lines[1], 19); $this->sys->setMemFree($ar_buf[2] * 4 * 1024); } $this->sys->setMemTotal($s); $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); if (CommonFunctions::executeProgram('sysctl', 'vm.swapusage | colrm 1 22', $swapBuff, PSI_DEBUG)) { $swap1 = preg_split('/M/', $swapBuff); $swap2 = preg_split('/=/', $swap1[1]); $swap3 = preg_split('/=/', $swap1[2]); $dev = new DiskDevice(); $dev->setName('SWAP'); $dev->setMountPoint('SWAP'); $dev->setFsType('swap'); $dev->setTotal($swap1[0] * 1024 * 1024); $dev->setUsed($swap2[1] * 1024 * 1024); $dev->setFree($swap3[1] * 1024 * 1024); $this->sys->setSwapDevices($dev); } } } /** * get network information * * @return void */ private function _network() { if (CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-24,42- | grep Link', $netstat, PSI_DEBUG)) { $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $ar_buf = preg_split("/\s+/", $line, 10); if (! empty($ar_buf[0])) { $dev = new NetDevice(); $dev->setName($ar_buf[0]); $dev->setTxBytes($ar_buf[8]); $dev->setRxBytes($ar_buf[5]); $dev->setErrors($ar_buf[4] + $ar_buf[7]); if (isset($ar_buf[10])) { $dev->setDrops($ar_buf[10]); } if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS) && (CommonFunctions::executeProgram('ifconfig', $ar_buf[0].' 2>/dev/null', $bufr2, PSI_DEBUG))) { $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe2 as $buf2) { if (preg_match('/^\s+ether\s+(\S+)/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $ar_buf2[1])); elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); elseif ((preg_match('/^\s+inet6\s+([^\s%]+)\s+prefixlen/i', $buf2, $ar_buf2) || preg_match('/^\s+inet6\s+([^\s%]+)%\S+\s+prefixlen/i', $buf2, $ar_buf2)) && !preg_match('/^fe80::/i',$ar_buf2[1])) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } $this->sys->setNetDevices($dev); } } } } /** * get icon name * * @return void */ protected function distro() { $this->sys->setDistributionIcon('Darwin.png'); if (!CommonFunctions::executeProgram('system_profiler', 'SPSoftwareDataType', $buffer, PSI_DEBUG)) { parent::distro(); } else { $arrBuff = preg_split("/\n/", $buffer, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrBuff as $line) { $arrLine = preg_split("/:/", $line, -1, PREG_SPLIT_NO_EMPTY); if (trim($arrLine[0]) === "System Version") { $distro = trim($arrLine[1]); if (preg_match('/(^Mac OS)|(^OS X)/', $distro)) { $this->sys->setDistributionIcon('Apple.png'); if (preg_match('/((^Mac OS X)|(^OS X)) (\d+\.\d+)/', $distro, $ver) && ($list = @parse_ini_file(APP_ROOT."/data/osnames.ini", true)) && isset($list['OS X'][$ver[4]])) { $distro.=' '.$list['OS X'][$ver[4]]; } } $this->sys->setDistribution($distro); return; } } } } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { $processes['*']++; $state = $ar_buf[1]; if ($state == 'U') $state = 'D'; //linux format elseif ($state == 'I') $state = 'S'; elseif ($state == 'D') $state = 'd'; //invalid if (isset($processes[$state])) { $processes[$state]++; } else { $processes[$state] = 1; } } } if ($processes['*'] > 0) { $this->sys->setProcesses($processes); } } } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { parent::build(); $this->_uptime(); $this->_network(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.DragonFly.inc.php000066400000000000000000000110671247443170600224350ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.DragonFly.inc.php 287 2009-06-26 12:11:59Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * DragonFly sysinfo class * get all the required information from DragonFly system * * @category PHP * @package PSI DragonFly OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class DragonFly extends BSDCommon { /** * define the regexp for log parser */ public function __construct() { parent::__construct(); $this->setCPURegExp1("^cpu(.*)\, (.*) MHz"); $this->setCPURegExp2("^(.*) at scsibus.*: <(.*)> .*"); $this->setSCSIRegExp2("^(da[0-9]): (.*)MB "); $this->setPCIRegExp1("/(.*): <(.*)>(.*) (pci|legacypci)[0-9]$/"); $this->setPCIRegExp2("/(.*): <(.*)>.* at [0-9\.]+$/"); } /** * UpTime * time the system is running * * @return void */ private function _uptime() { $a = $this->grab_key('kern.boottime'); preg_match("/sec = ([0-9]+)/", $a, $buf); $this->sys->setUptime(time() - $buf[1]); } /** * get network information * * @return array */ private function _network() { CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_b); CommonFunctions::executeProgram('netstat', '-ndi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_n); $lines_b = preg_split("/\n/", $netstat_b, -1, PREG_SPLIT_NO_EMPTY); $lines_n = preg_split("/\n/", $netstat_n, -1, PREG_SPLIT_NO_EMPTY); for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); if (! empty($ar_buf_b[0]) && ! empty($ar_buf_n[3])) { $dev = new NetDevice(); $dev->setName($ar_buf_b[0]); $dev->setTxBytes($ar_buf_b[8]); $dev->setRxBytes($ar_buf_b[5]); $dev->setErrors($ar_buf_n[4] + $ar_buf_n[6]); $dev->setDrops($ar_buf_n[8]); $this->sys->setNetDevices($dev); } } } /** * get the ide information * * @return array */ protected function ide() { foreach ($this->readdmesg() as $line) { if (preg_match('/^(.*): (.*) <(.*)> at (ata[0-9]\-(.*)) (.*)/', $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1]); if (!preg_match("/^acd[0-9](.*)/", $ar_buf[1])) { $dev->setCapacity($ar_buf[2] * 1024); } $this->sys->setIdeDevices($dev); } } } /** * get icon name * * @return void */ private function _distroicon() { $this->sys->setDistributionIcon('DragonFly.png'); } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { $processes['*']++; $state = $ar_buf[1]; if ($state == 'I') $state = 'S'; //linux format if (isset($processes[$state])) { $processes[$state]++; } else { $processes[$state] = 1; } } } if ($processes['*'] > 0) { $this->sys->setProcesses($processes); } } } /** * get the information * * @see BSDCommon::build() * * @return Void */ public function build() { parent::build(); $this->_distroicon(); $this->_network(); $this->_uptime(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.FreeBSD.inc.php000066400000000000000000000165141247443170600217640ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.FreeBSD.inc.php 696 2012-09-09 11:24:04Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * FreeBSD sysinfo class * get all the required information from FreeBSD system * * @category PHP * @package PSI FreeBSD OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class FreeBSD extends BSDCommon { /** * define the regexp for log parser */ public function __construct() { parent::__construct(); $this->setCPURegExp1("CPU: (.*) \((.*)-MHz (.*)\)"); $this->setCPURegExp2("/(.*) ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)/"); $this->setSCSIRegExp1("^(.*): <(.*)> .*SCSI.*device"); $this->setSCSIRegExp2("^(da[0-9]): (.*)MB "); $this->setPCIRegExp1("/(.*): <(.*)>(.*) pci[0-9]$/"); $this->setPCIRegExp2("/(.*): <(.*)>.* at [.0-9]+ irq/"); } /** * UpTime * time the system is running * * @return void */ private function _uptime() { $s = preg_split('/ /', $this->grabkey('kern.boottime')); $a = preg_replace('/,/', '', $s[3]); $this->sys->setUptime(time() - $a); } /** * get network information * * @return void */ private function _network() { $dev = NULL; if (CommonFunctions::executeProgram('netstat', '-nibd', $netstat, PSI_DEBUG)) { $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $ar_buf = preg_split("/\s+/", $line); if (! empty($ar_buf[0])) { if (preg_match('/^setName($ar_buf[0]); if (strlen($ar_buf[3]) < 17) { /* no Address */ if (isset($ar_buf[11]) && (trim($ar_buf[11]) != '')) { /* Idrop column exist*/ $dev->setTxBytes($ar_buf[9]); $dev->setRxBytes($ar_buf[6]); $dev->setErrors($ar_buf[4] + $ar_buf[8]); $dev->setDrops($ar_buf[11] + $ar_buf[5]); } else { $dev->setTxBytes($ar_buf[8]); $dev->setRxBytes($ar_buf[5]); $dev->setErrors($ar_buf[4] + $ar_buf[7]); $dev->setDrops($ar_buf[10]); } } else { if (isset($ar_buf[12]) && (trim($ar_buf[12]) != '')) { /* Idrop column exist*/ $dev->setTxBytes($ar_buf[10]); $dev->setRxBytes($ar_buf[7]); $dev->setErrors($ar_buf[5] + $ar_buf[9]); $dev->setDrops($ar_buf[12] + $ar_buf[6]); } else { $dev->setTxBytes($ar_buf[9]); $dev->setRxBytes($ar_buf[6]); $dev->setErrors($ar_buf[5] + $ar_buf[8]); $dev->setDrops($ar_buf[11]); } } if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS) && (CommonFunctions::executeProgram('ifconfig', $ar_buf[0].' 2>/dev/null', $bufr2, PSI_DEBUG))) { $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe2 as $buf2) { if (preg_match('/^\s+ether\s+(\S+)/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $ar_buf2[1])); elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); elseif ((preg_match('/^\s+inet6\s+([^\s%]+)\s+prefixlen/i', $buf2, $ar_buf2) || preg_match('/^\s+inet6\s+([^\s%]+)%\S+\s+prefixlen/i', $buf2, $ar_buf2)) && !preg_match('/^fe80::/i',$ar_buf2[1])) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } $this->sys->setNetDevices($dev); } } } } } /** * get icon name and distro extended check * * @return void */ private function _distroicon() { if (extension_loaded('pfSense') && CommonFunctions::rfts('/etc/version', $version, 1, 4096, false) && (trim($version) != '')) { // pfSense detection $this->sys->setDistribution('pfSense '. trim($version)); $this->sys->setDistributionIcon('pfSense.png'); } else { $this->sys->setDistributionIcon('FreeBSD.png'); } } /** * extend the memory information with additional values * * @return void */ private function _memoryadditional() { $pagesize = $this->grabkey("hw.pagesize"); $this->sys->setMemCache($this->grabkey("vm.stats.vm.v_cache_count") * $pagesize); $this->sys->setMemApplication(($this->grabkey("vm.stats.vm.v_active_count") + $this->grabkey("vm.stats.vm.v_wire_count")) * $pagesize); $this->sys->setMemBuffer($this->sys->getMemUsed() - $this->sys->getMemApplication() - $this->sys->getMemCache()); } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { $processes['*']++; $state = $ar_buf[1]; if ($state == 'L') $state = 'D'; //linux format elseif ($state == 'I') $state = 'S'; if (isset($processes[$state])) { $processes[$state]++; } else { $processes[$state] = 1; } } } if ($processes['*'] > 0) { $this->sys->setProcesses($processes); } } } /** * get the information * * @see BSDCommon::build() * * @return Void */ public function build() { parent::build(); $this->_memoryadditional(); $this->_distroicon(); $this->_network(); $this->_uptime(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.HPUX.inc.php000066400000000000000000000312441247443170600213330ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.HPUX.inc.php 596 2012-07-05 19:37:48Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * HP-UX sysinfo class * get all the required information from HP-UX system * * @category PHP * @package PSI HPUX OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class HPUX extends OS { /** * Virtual Host Name * * @return void */ private function _hostname() { if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::executeProgram('hostname', '', $ret)) { $this->sys->setHostname($ret); } } } /** * IP of the Virtual Host Name * * @return void */ private function _ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!($result = getenv('SERVER_ADDR'))) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * HP-UX Version * * @return void */ private function _kernel() { if (CommonFunctions::executeProgram('uname', '-srvm', $ret)) { $this->sys->setKernel($ret); } } /** * UpTime * time the system is running * * @return void */ private function _uptime() { if (CommonFunctions::executeProgram('uptime', '', $buf)) { if (preg_match("/up (\d+) days,\s*(\d+):(\d+),/", $buf, $ar_buf)) { $min = $ar_buf[3]; $hours = $ar_buf[2]; $days = $ar_buf[1]; $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); } } } /** * Number of Users * * @return void */ private function _users() { if (CommonFunctions::executeProgram('who', '-q', $ret)) { $who = preg_split('/=/', $ret, -1, PREG_SPLIT_NO_EMPTY); $this->sys->setUsers($who[1]); } } /** * Processor Load * optionally create a loadbar * * @return void */ private function _loadavg() { if (CommonFunctions::executeProgram('uptime', '', $buf)) { if (preg_match("/average: (.*), (.*), (.*)$/", $buf, $ar_buf)) { $this->sys->setLoad($ar_buf[1].' '.$ar_buf[2].' '.$ar_buf[3]); } } } /** * CPU information * All of the tags here are highly architecture dependant * * @return void */ private function _cpuinfo() { if (CommonFunctions::rfts('/proc/cpuinfo', $bufr)) { $processors = preg_split('/\s?\n\s?\n/', trim($bufr)); foreach ($processors as $processor) { $dev = new CpuDevice(); $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); foreach ($details as $detail) { $arrBuff = preg_split('/\s+:\s+/', trim($detail)); if (count($arrBuff) == 2) { switch (strtolower($arrBuff[0])) { case 'model name': case 'cpu': $dev->setModel($arrBuff[1]); break; case 'cpu mhz': case 'clock': $dev->setCpuSpeed($arrBuff[1]); break; case 'cycle frequency [hz]': $dev->setCpuSpeed($arrBuff[1] / 1000000); break; case 'cpu0clktck': $dev->setCpuSpeed(hexdec($arrBuff[1]) / 1000000); // Linux sparc64 break; case 'l2 cache': case 'cache size': $dev->setCache(preg_replace("/[a-zA-Z]/", "", $arrBuff[1]) * 1024); break; case 'bogomips': case 'cpu0bogo': $dev->setBogomips($arrBuff[1]); break; } } } } } } /** * PCI devices * * @return void */ private function _pci() { if (CommonFunctions::rfts('/proc/pci', $bufr)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/Bus/', $buf)) { $device = true; continue; } if ($device) { list($key, $value) = preg_split('/: /', $buf, 2); if (!preg_match('/bridge/i', $key) && !preg_match('/USB/i', $key)) { $dev = new HWDevice(); $dev->setName(preg_replace('/\([^\)]+\)\.$/', '', trim($value))); $this->sys->setPciDevices($dev); } $device = false; } } } } /** * IDE devices * * @return void */ private function _ide() { $bufd = CommonFunctions::gdc('/proc/ide', false); foreach ($bufd as $file) { if (preg_match('/^hd/', $file)) { $dev = new HWDevice(); $dev->setName(trim($file)); if (CommonFunctions::rfts("/proc/ide/".$file."/media", $buf, 1)) { if (trim($buf) == 'disk') { if (CommonFunctions::rfts("/proc/ide/".$file."/capacity", $buf, 1, 4096, false)) { $dev->setCapacity(trim($buf) * 512 / 1024); } } } $this->sys->setIdeDevices($dev); } } } /** * SCSI devices * * @return void */ private function _scsi() { $get_type = false; if (CommonFunctions::rfts('/proc/scsi/scsi', $bufr, 0, 4096, PSI_DEBUG)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/Vendor: (.*) Model: (.*) Rev: (.*)/i', $buf, $dev)) { $get_type = true; continue; } if ($get_type) { preg_match('/Type:\s+(\S+)/i', $buf, $dev_type); $dev = new HWDevice(); $dev->setName($dev[1].' '.$dev[2].' ('.$dev_type[1].')'); $this->sys->setScsiDevices($dev); $get_type = false; } } } } /** * USB devices * * @return void */ private function _usb() { if (CommonFunctions::rfts('/proc/bus/usb/devices', $bufr, 0, 4096, false)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/^T/', $buf)) { $devnum += 1; $results[$devnum] = ""; } elseif (preg_match('/^S:/', $buf)) { list($key, $value) = preg_split('/: /', $buf, 2); list($key, $value2) = preg_split('/=/', $value, 2); if (trim($key) != "SerialNumber") { $results[$devnum] .= " ".trim($value2); } } } foreach ($results as $var) { $dev = new HWDevice(); $dev->setName($var); $this->sys->setUsbDevices($dev); } } } /** * Network devices * includes also rx/tx bytes * * @return void */ private function _network() { if (CommonFunctions::executeProgram('netstat', '-ni | tail -n +2', $netstat)) { $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $ar_buf = preg_split("/\s+/", $line); if (! empty($ar_buf[0]) && ! empty($ar_buf[3])) { $dev = new NetDevice(); $dev->setName($ar_buf[0]); $dev->setRxBytes($ar_buf[4]); $dev->setTxBytes($ar_buf[6]); $dev->setErrors($ar_buf[5] + $ar_buf[7]); $dev->setDrops($ar_buf[8]); $this->sys->setNetDevices($dev); } } } } /** * Physical memory information and Swap Space information * * @return void */ private function _memory() { if (CommonFunctions::rfts('/proc/meminfo', $bufr)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/Mem:\s+(.*)$/', $buf, $ar_buf)) { $ar_buf = preg_split('/\s+/', $ar_buf[1], 6); $this->sys->setMemTotal($ar_buf[0]); $this->sys->setMemUsed($ar_buf[1]); $this->sys->setMemFree($ar_buf[2]); $this->sys->setMemApplication($ar_buf[3]); $this->sys->setMemBuffer($ar_buf[4]); $this->sys->setMemCache($ar_buf[5]); } // Get info on individual swap files if (CommonFunctions::rfts('/proc/swaps', $swaps)) { $swapdevs = preg_split("/\n/", $swaps, -1, PREG_SPLIT_NO_EMPTY); for ($i = 1, $max = (sizeof($swapdevs) - 1); $i < $max; $i++) { $ar_buf = preg_split('/\s+/', $swapdevs[$i], 6); $dev = new DiskDevice(); $dev->setMountPoint($ar_buf[0]); $dev->setName("SWAP"); $dev->setFsType('swap'); $dev->setTotal($ar_buf[2] * 1024); $dev->setUsed($ar_buf[3] * 1024); $dev->setFree($dev->getTotal() - $dev->getUsed()); $this->sys->setSwapDevices($dev); } } } } } /** * filesystem information * * @return void */ private function _filesystems() { if (CommonFunctions::executeProgram('df', '-kP', $df, PSI_DEBUG)) { $mounts = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); if (CommonFunctions::executeProgram('mount', '-v', $s, PSI_DEBUG)) { $lines = preg_split("/\n/", $s, -1, PREG_SPLIT_NO_EMPTY); while (list(, $line) = each($lines)) { $a = preg_split('/ /', $line, -1, PREG_SPLIT_NO_EMPTY); $fsdev[$a[0]] = $a[4]; } } foreach ($mounts as $mount) { $ar_buf = preg_split("/\s+/", $mount, 6); $dev = new DiskDevice(); $dev->setName($ar_buf[0]); $dev->setTotal($ar_buf[1] * 1024); $dev->setUsed($ar_buf[2] * 1024); $dev->setFree($ar_buf[3] * 1024); $dev->setMountPoint($ar_buf[5]); if (isset($fsdev[$ar_buf[0]])) { $dev->setFsType($fsdev[$ar_buf[0]]); } $this->sys->setDiskDevices($dev); } } } /** * Distribution * * @return void */ private function _distro() { $this->sys->setDistribution('HP-UX'); $this->sys->setDistributionIcon('HPUX.png'); } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { $this->_distro(); $this->_hostname(); $this->_ip(); $this->_kernel(); $this->_uptime(); $this->_users(); $this->_loadavg(); $this->_cpuinfo(); $this->_pci(); $this->_ide(); $this->_scsi(); $this->_usb(); $this->_network(); $this->_memory(); $this->_filesystems(); } } phpsysinfo-3.2.1/includes/os/class.Haiku.inc.php000066400000000000000000000330441247443170600216100ustar00rootroot00000000000000 * @copyright 2012 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Haiku.inc.php 687 2012-09-06 20:54:49Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Haiku sysinfo class * get all the required information from Haiku system * * @category PHP * @package PSI Haiku OS class * @author Mieczyslaw Nalewaj * @copyright 2012 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Haiku extends OS { /** * call parent constructor */ public function __construct() { parent::__construct(); } /** * get the cpu information * * @return array */ protected function _cpuinfo() { if (CommonFunctions::executeProgram('sysinfo', '-cpu', $bufr, PSI_DEBUG)) { $cpus = preg_split("/\nCPU #\d+/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $cpuspeed = ""; foreach ($cpus as $cpu) { if (preg_match("/^.*running at (\d+)MHz/", $cpu, $ar_buf)) { $cpuspeed = $ar_buf[1]; } elseif (preg_match("/^: \"(.*)\"/", $cpu, $ar_buf)) { $dev = new CpuDevice(); $dev->setModel($ar_buf[1]); $arrLines = preg_split("/\n/", $cpu, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrLines as $Line) { if (preg_match("/^\s+Data TLB:\s+(.*)K-byte/", $Line, $Line_buf)) { $dev->setCache(max($Line_buf[1]*1024,$dev->getCache())); } elseif (preg_match("/^\s+Data TLB:\s+(.*)M-byte/", $Line, $Line_buf)) { $dev->setCache(max($Line_buf[1]*1024*1024,$dev->getCache())); } elseif (preg_match("/^\s+Data TLB:\s+(.*)G-byte/", $Line, $Line_buf)) { $dev->setCache(max($Line_buf[1]*1024*1024*1024,$dev->getCache())); } elseif (preg_match("/\s+VMX/", $Line, $Line_buf)) { $dev->setVirt("vmx"); } elseif (preg_match("/\s+SVM/", $Line, $Line_buf)) { $dev->setVirt("svm"); } } if ($cpuspeed != "" )$dev->setCpuSpeed($cpuspeed); $this->sys->setCpus($dev); //echo ">>>>>".$cpu; } } } } /** * PCI devices * get the pci device information * * @return void */ protected function _pci() { if (CommonFunctions::executeProgram('listdev', '', $bufr, PSI_DEBUG)) { // $devices = preg_split("/^device |\ndevice /", $bufr, -1, PREG_SPLIT_NO_EMPTY); $devices = preg_split("/^device /m", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($devices as $device) { $ar_buf = preg_split("/\n/", $device); if (count($ar_buf) >= 3) { if (preg_match("/^([^\(\[\n]*)/", $device, $ar_buf2)) { if (preg_match("/^[^\(]*\((.*)\)/", $device, $ar_buf3)) { $ar_buf2[1] = $ar_buf3[1]; } $name = trim($ar_buf2[1]).": "; if (preg_match("/^\s+vendor\s+[0-9a-fA-F]{4}:\s+(.*)/", $ar_buf[1], $ar_buf3)) { $name .=$ar_buf3[1]." "; } if (preg_match("/^\s+device\s+[0-9a-fA-F]{4}:\s+(.*)/", $ar_buf[2], $ar_buf3)) { $name .=$ar_buf3[1]." "; } $dev = new HWDevice(); $dev->setName(trim($name)); $this->sys->setPciDevices($dev); } } } } } /** * USB devices * get the usb device information * * @return void */ protected function _usb() { if (CommonFunctions::executeProgram('listusb', '', $bufr, PSI_DEBUG)) { $devices = preg_split("/\n/", $bufr); foreach ($devices as $device) { if (preg_match("/^\S+\s+\S+\s+\"(.*)\"\s+\"(.*)\"/", $device, $ar_buf)) { $dev = new HWDevice(); $dev->setName(trim($ar_buf[1]." ".$ar_buf[2])); $this->sys->setUSBDevices($dev); } } } } /** * Haiku Version * * @return void */ private function _kernel() { if (CommonFunctions::executeProgram('uname', '-rvm', $ret)) { $this->sys->setKernel($ret); } } /** * Distribution * * @return void */ protected function _distro() { if (CommonFunctions::executeProgram('uname', '-sr', $ret)) $this->sys->setDistribution($ret); else $this->sys->setDistribution('Haiku'); $this->sys->setDistributionIcon('Haiku.png'); } /** * UpTime * time the system is running * * @return void */ private function _uptime() { if (CommonFunctions::executeProgram('uptime', '-u', $buf)) { if (preg_match("/^up (\d+) minute[s]?/", $buf, $ar_buf)) { $min = $ar_buf[1]; $this->sys->setUptime($min * 60); } elseif (preg_match("/^up (\d+) hour[s]?, (\d+) minute[s]?/", $buf, $ar_buf)) { $min = $ar_buf[2]; $hours = $ar_buf[1]; $this->sys->setUptime($hours * 3600 + $min * 60); } elseif (preg_match("/^up (\d+) day[s]?, (\d+) hour[s]?, (\d+) minute[s]?/", $buf, $ar_buf)) { $min = $ar_buf[3]; $hours = $ar_buf[2]; $days = $ar_buf[1]; $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); } } } /** * Processor Load * optionally create a loadbar * * @return void */ private function _loadavg() { if (CommonFunctions::executeProgram('top', '-n 1 -i 1', $buf)) { if (preg_match("/\s+(\S+)%\s+TOTAL\s+\(\S+%\s+idle time/", $buf, $ar_buf)) { $this->sys->setLoad($ar_buf[1]); if (PSI_LOAD_BAR) { $this->sys->setLoadPercent(round($ar_buf[1])); } } } } /** * Number of Users * * @return void */ private function _users() { $this->sys->setUsers(1); } /** * Virtual Host Name * * @return void */ private function _hostname() { if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { $ip = gethostbyname($result); if ($ip != $result) { $this->sys->setHostname(gethostbyaddr($ip)); } } } } /** * IP of the Virtual Host Name * * @return void */ private function _ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!($result = getenv('SERVER_ADDR'))) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * Physical memory information and Swap Space information * * @return void */ private function _memory() { if (CommonFunctions::executeProgram('sysinfo', '-mem', $bufr, PSI_DEBUG)) { if (preg_match("/(.*)bytes free\s+\(used\/max\s+(.*)\s+\/\s+(.*)\)\s*\n\s+\(cached\s+(.*)\)/", $bufr, $ar_buf)) { $this->sys->setMemTotal($ar_buf[3]); $this->sys->setMemFree($ar_buf[1]); $this->sys->setMemCache($ar_buf[4]); $this->sys->setMemUsed($ar_buf[2]); } } if (CommonFunctions::executeProgram('vmstat', '', $bufr, PSI_DEBUG)) { if (preg_match("/max swap space:\s+(.*)\nfree swap space:\s+(.*)\n/", $bufr, $ar_buf)) { if ($ar_buf[1]>0) { $dev = new DiskDevice(); $dev->setMountPoint("/boot/common/var/swap"); $dev->setName("SWAP"); $dev->setTotal($ar_buf[1]); $dev->setFree($ar_buf[2]); $dev->setUSed($ar_buf[1]-$ar_buf[2]); $this->sys->setSwapDevices($dev); } } } } /** * filesystem information * * @return void */ private function _filesystems() { if (CommonFunctions::executeProgram('df', '-b', $df, PSI_DEBUG)) { $df = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); foreach ($df as $df_line) { $ar_buf = preg_split("/\s+/", $df_line); if ((substr($df_line,0 ,1 ) == "/") && (count($ar_buf) == 6 )) { $dev = new DiskDevice(); $dev->setMountPoint($ar_buf[0]); $dev->setName($ar_buf[5]); $dev->setFsType($ar_buf[1]); $dev->setOptions($ar_buf[4]); $dev->setTotal($ar_buf[2] * 1024); $dev->setFree($ar_buf[3] * 1024); $dev->setUsed($dev->getTotal() - $dev->getFree()); $this->sys->setDiskDevices($dev); } } } } /** * network information * * @return void */ private function _network() { if (CommonFunctions::executeProgram('ifconfig', '', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $notwas = true; foreach ($lines as $line) { if (preg_match("/^(\S+)/", $line, $ar_buf)) { if (!$notwas) { $dev->setErrors($errors); $dev->setDrops($drops); $this->sys->setNetDevices($dev); } $errors = 0; $drops = 0; $dev = new NetDevice(); $dev->setName($ar_buf[1]); $notwas = false; } else { if (!$notwas) { if (preg_match('/\sReceive:\s\d+\spackets,\s(\d+)\serrors,\s(\d+)\sbytes,\s\d+\smcasts,\s(\d+)\sdropped/i', $line, $ar_buf2)) { $errors +=$ar_buf2[1]; $drops +=$ar_buf2[3]; $dev->setRxBytes($ar_buf2[2]); } elseif (preg_match('/\sTransmit:\s\d+\spackets,\s(\d+)\serrors,\s(\d+)\sbytes,\s\d+\smcasts,\s(\d+)\sdropped/i', $line, $ar_buf2)) { $errors +=$ar_buf2[1]; $drops +=$ar_buf2[3]; $dev->setTxBytes($ar_buf2[2]); } if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { if (preg_match('/\sEthernet,\s+Address:\s(\S*)/i', $line, $ar_buf2)) $dev->setInfo(preg_replace('/:/', '-', $ar_buf2[1])); elseif (preg_match('/^\s+inet\saddr:\s(\S*),/i', $line, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); elseif (preg_match('/^\s+inet6\saddr:\s(\S*),/i', $line, $ar_buf2)) if (!preg_match('/^fe80::/i',$ar_buf2[1])) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } } } if (!$notwas) { $dev->setErrors($errors); $dev->setDrops($drops); $this->sys->setNetDevices($dev); } } } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', '', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^(kernel_team|\/)/", $line, $ar_buf)) { $processes['*']++; } } if ($processes['*'] > 0) { $processes[' '] = $processes['*']; $this->sys->setProcesses($processes); } } } /** * get the information * * @return Void */ public function build() { $this->error->addError("WARN", "The Haiku version of phpSysInfo is a work in progress, some things currently don't work"); $this->_hostname(); $this->_ip(); $this->_distro(); $this->_kernel(); $this->_uptime(); $this->_users(); $this->_loadavg(); $this->_pci(); $this->_usb(); $this->_cpuinfo(); $this->_memory(); $this->_filesystems(); $this->_network(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.Linux.inc.php000066400000000000000000001406761247443170600216600ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Linux.inc.php 712 2012-12-05 14:09:18Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Linux sysinfo class * get all the required information from Linux system * * @category PHP * @package PSI Linux OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Linux extends OS { /** * Assoc array of all CPUs loads. */ protected $_cpu_loads; /** * call parent constructor */ public function __construct() { parent::__construct(); } /** * Machine * * @return void */ private function _machine() { if ( (CommonFunctions::rfts('/var/log/dmesg', $result, 0, 4096, false) && preg_match('/^[\s\[\]\.\d]*DMI:\s*(.*)/m', $result, $ar_buf)) ||(CommonFunctions::executeProgram('dmesg', '', $result, false) && preg_match('/^[\s\[\]\.\d]*DMI:\s*(.*)/m', $result, $ar_buf)) ) { $this->sys->setMachine(trim($ar_buf[1])); } else { //data from /sys/devices/virtual/dmi/id/ $machine = ""; $product = ""; $board = ""; $bios = ""; if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/board_vendor', $buf, 1, 4096, false) && (trim($buf)!="")) { $machine = trim($buf); } if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/product_name', $buf, 1, 4096, false) && (trim($buf)!="")) { $product = trim($buf); } if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/board_name', $buf, 1, 4096, false) && (trim($buf)!="")) { $board = trim($buf); } if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/bios_version', $buf, 1, 4096, false) && (trim($buf)!="")) { $bios = trim($buf); } if (CommonFunctions::rfts('/sys/devices/virtual/dmi/id/bios_date', $buf, 1, 4096, false) && (trim($buf)!="")) { $bios = trim($bios." ".trim($buf)); } if ($product != "") { $machine .= " ".$product; } if ($board != "") { $machine .= "/".$board; } if ($bios != "") { $machine .= ", BIOS ".$bios; } if ($machine != "") { $this->sys->setMachine(trim($machine)); } } } /** * Hostname * * @return void */ protected function _hostname() { if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::rfts('/proc/sys/kernel/hostname', $result, 1)) { $result = trim($result); $ip = gethostbyname($result); if ($ip != $result) { $this->sys->setHostname(gethostbyaddr($ip)); } } } } /** * IP * * @return void */ protected function _ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!isset($_SERVER['SERVER_ADDR']) || !($result = $_SERVER['SERVER_ADDR'])) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * Kernel Version * * @return void */ private function _kernel() { if (CommonFunctions::executeProgram($uname="uptrack-uname", '-r', $strBuf, false) || // show effective kernel if ksplice uptrack is installed CommonFunctions::executeProgram($uname="uname", '-r', $strBuf, PSI_DEBUG)) { $result = trim($strBuf); if (CommonFunctions::executeProgram($uname, '-v', $strBuf, PSI_DEBUG)) { if (preg_match('/SMP/', $strBuf)) { $result .= ' (SMP)'; } } if (CommonFunctions::executeProgram($uname, '-m', $strBuf, PSI_DEBUG)) { $result .= ' '.trim($strBuf); } if (CommonFunctions::rfts('/proc/self/cgroup', $strBuf2, 0, 4096, false)) { if (preg_match('/:\/lxc\//m', $strBuf2)) { $result .= ' [lxc]'; } elseif (preg_match('/:\/docker\//m', $strBuf2)) { $result .= ' [docker]'; } } $this->sys->setKernel($result); } elseif (CommonFunctions::rfts('/proc/version', $strBuf, 1) && preg_match('/version (.*?) /', $strBuf, $ar_buf)) { $result = $ar_buf[1]; if (preg_match('/SMP/', $strBuf)) { $result .= ' (SMP)'; } if (CommonFunctions::rfts('/proc/self/cgroup', $strBuf2, 0, 4096, false)) { if (preg_match('/:\/lxc\//m', $strBuf2)) { $result .= ' [lxc]'; } elseif (preg_match('/:\/docker\//m', $strBuf2)) { $result .= ' [docker]'; } } $this->sys->setKernel($result); } } /** * UpTime * time the system is running * * @return void */ protected function _uptime() { CommonFunctions::rfts('/proc/uptime', $buf, 1); $ar_buf = preg_split('/ /', $buf); $this->sys->setUptime(trim($ar_buf[0])); } /** * Number of Users * * @return void */ private function _users() { if (CommonFunctions::executeProgram('who', '', $strBuf, PSI_DEBUG)) { if (strlen(trim($strBuf)) > 0) { $lines = preg_split('/\n/', $strBuf); $this->sys->setUsers(count($lines)); } } } /** * Processor Load * optionally create a loadbar * * @return void */ protected function _loadavg() { if (CommonFunctions::rfts('/proc/loadavg', $buf)) { $result = preg_split("/\s/", $buf, 4); // don't need the extra values, only first three unset($result[3]); $this->sys->setLoad(implode(' ', $result)); } if (PSI_LOAD_BAR) { $this->sys->setLoadPercent($this->_parseProcStat('cpu')); } } /** * fill the load for a individual cpu, through parsing /proc/stat for the specified cpu * * @param String $cpuline cpu for which load should be meassured * * @return Integer */ protected function _parseProcStat($cpuline) { if (is_null($this->_cpu_loads)) { $this->_cpu_loads = array(); if (CommonFunctions::rfts('/proc/stat', $buf)) { if (preg_match_all('/^(cpu[0-9]*) (.*)/m', $buf, $matches, PREG_SET_ORDER)) { foreach ($matches as $line) { $cpu = $line[1]; $buf2 = $line[2]; $this->_cpu_loads[$cpu] = array(); $ab = 0; $ac = 0; $ad = 0; $ae = 0; sscanf($buf2, "%Ld %Ld %Ld %Ld", $ab, $ac, $ad, $ae); $this->_cpu_loads[$cpu]['load'] = $ab + $ac + $ad; // cpu.user + cpu.sys $this->_cpu_loads[$cpu]['total'] = $ab + $ac + $ad + $ae; // cpu.total } } } // we need a second value, wait 1 second befor getting (< 1 second no good value will occour) if (PSI_LOAD_BAR) { sleep(1); } if (CommonFunctions::rfts('/proc/stat', $buf)) { if (preg_match_all('/^(cpu[0-9]*) (.*)/m', $buf, $matches, PREG_SET_ORDER)) { foreach ($matches as $line) { $cpu = $line[1]; $buf2 = $line[2]; $ab = 0; $ac = 0; $ad = 0; $ae = 0; sscanf($buf2, "%Ld %Ld %Ld %Ld", $ab, $ac, $ad, $ae); $load2 = $ab + $ac + $ad; // cpu.user + cpu.sys $total2 = $ab + $ac + $ad + $ae; // cpu.total $total = $this->_cpu_loads[$cpu]['total']; $load = $this->_cpu_loads[$cpu]['load']; $this->_cpu_loads[$cpu] = 0; if ($total > 0 && $total2 > 0 && $load > 0 && $load2 > 0 && $total2 != $total && $load2 != $load) { $this->_cpu_loads[$cpu] = (100 * ($load2 - $load)) / ($total2 - $total); } } } } } if (isset($this->_cpu_loads[$cpuline])) { return $this->_cpu_loads[$cpuline]; } return 0; } /** * CPU information * All of the tags here are highly architecture dependant. * * @return void */ protected function _cpuinfo() { if (CommonFunctions::rfts('/proc/cpuinfo', $bufr)) { $processors = preg_split('/\s?\n\s?\n/', trim($bufr)); $procname = null; foreach ($processors as $processor) { $proc = null; $arch = null; $dev = new CpuDevice(); $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); foreach ($details as $detail) { $arrBuff = preg_split('/\s*:\s*/', trim($detail)); if (count($arrBuff) == 2) { switch (strtolower($arrBuff[0])) { case 'processor': $proc = trim($arrBuff[1]); if (is_numeric($proc)) { if (strlen($procname)>0) { $dev->setModel($procname); } } else { $procname = $proc; $dev->setModel($procname); } break; case 'model name': case 'cpu model': case 'cpu type': case 'cpu': $dev->setModel($arrBuff[1]); break; case 'cpu mhz': case 'clock': if ($arrBuff[1] > 0) { //openSUSE fix $dev->setCpuSpeed($arrBuff[1]); } break; case 'cycle frequency [hz]': $dev->setCpuSpeed($arrBuff[1] / 1000000); break; case 'cpu0clktck': $dev->setCpuSpeed(hexdec($arrBuff[1]) / 1000000); // Linux sparc64 break; case 'l2 cache': case 'cache size': $dev->setCache(preg_replace("/[a-zA-Z]/", "", $arrBuff[1]) * 1024); break; case 'initial bogomips': case 'bogomips': case 'cpu0bogo': $dev->setBogomips($arrBuff[1]); break; case 'flags': if (preg_match("/ vmx/",$arrBuff[1])) { $dev->setVirt("vmx"); } elseif (preg_match("/ svm/",$arrBuff[1])) { $dev->setVirt("svm"); } elseif (preg_match("/ hypervisor/",$arrBuff[1])) { $dev->setVirt("hypervisor"); } break; case 'i size': case 'd size': if ($dev->getCache() === null) { $dev->setCache($arrBuff[1] * 1024); } else { $dev->setCache($dev->getCache() + ($arrBuff[1] * 1024)); } break; case 'cpu architecture': $arch = trim($arrBuff[1]); break; } } } // sparc64 specific code follows // This adds the ability to display the cache that a CPU has // Originally made by Sven Blumenstein in 2004 // Modified by Tom Weustink in 2004 $sparclist = array('SUNW,UltraSPARC@0,0', 'SUNW,UltraSPARC-II@0,0', 'SUNW,UltraSPARC@1c,0', 'SUNW,UltraSPARC-IIi@1c,0', 'SUNW,UltraSPARC-II@1c,0', 'SUNW,UltraSPARC-IIe@0,0'); foreach ($sparclist as $name) { if (CommonFunctions::rfts('/proc/openprom/'.$name.'/ecache-size', $buf, 1, 32, false)) { $dev->setCache(base_convert($buf, 16, 10)); } } // sparc64 specific code ends // XScale detection code if (($arch === "5TE") && ($dev->getBogomips() != null)) { $dev->setCpuSpeed($dev->getBogomips()); //BogoMIPS are not BogoMIPS on this CPU, it's the speed $dev->setBogomips(null); // no BogoMIPS available, unset previously set BogoMIPS } if ($proc != null) { if (!is_numeric($proc)) { $proc = 0; } // variable speed processors specific code follows if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/cpuinfo_cur_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeed($buf / 1000); } elseif (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/scaling_cur_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeed($buf / 1000); } if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/cpuinfo_max_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeedMax($buf / 1000); } if (CommonFunctions::rfts('/sys/devices/system/cpu/cpu'.$proc.'/cpufreq/cpuinfo_min_freq', $buf, 1, 4096, false)) { $dev->setCpuSpeedMin($buf / 1000); } // variable speed processors specific code ends if (PSI_LOAD_BAR) { $dev->setLoad($this->_parseProcStat('cpu'.$proc)); } if (CommonFunctions::rfts('/proc/acpi/thermal_zone/THRM/temperature', $buf, 1, 4096, false)) { $dev->setTemp(substr($buf, 25, 2)); } if ($dev->getModel() === "") { $dev->setModel("unknown"); } $this->sys->setCpus($dev); } } } } /** * PCI devices * * @return void */ private function _pci() { if (!$arrResults = Parser::lspci()) { if (CommonFunctions::rfts('/proc/pci', $strBuf, 0, 4096, false)) { $booDevice = false; $arrBuf = preg_split("/\n/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrBuf as $strLine) { if (preg_match('/Bus/', $strLine)) { $booDevice = true; continue; } if ($booDevice) { list($strKey, $strValue) = preg_split('/: /', $strLine, 2); if (!preg_match('/bridge/i', $strKey) && !preg_match('/USB/i ', $strKey)) { $dev = new HWDevice(); $dev->setName(preg_replace('/\([^\)]+\)\.$/', '', trim($strValue))); $this->sys->setPciDevices($dev); } $booDevice = false; } } } } else { foreach ($arrResults as $dev) { $this->sys->setPciDevices($dev); } } } /** * IDE devices * * @return void */ private function _ide() { $bufd = CommonFunctions::gdc('/proc/ide', false); foreach ($bufd as $file) { if (preg_match('/^hd/', $file)) { $dev = new HWDevice(); $dev->setName(trim($file)); if (CommonFunctions::rfts("/proc/ide/".$file."/media", $buf, 1)) { if (trim($buf) == 'disk') { if (CommonFunctions::rfts("/proc/ide/".$file."/capacity", $buf, 1, 4096, false) || CommonFunctions::rfts("/sys/block/".$file."/size", $buf, 1, 4096, false)) { $dev->setCapacity(trim($buf) * 512 / 1024); } } } if (CommonFunctions::rfts("/proc/ide/".$file."/model", $buf, 1)) { $dev->setName($dev->getName().": ".trim($buf)); } $this->sys->setIdeDevices($dev); } } } /** * SCSI devices * * @return void */ private function _scsi() { $get_type = false; $device = null; if (CommonFunctions::executeProgram('lsscsi', '-c', $bufr, PSI_DEBUG) || CommonFunctions::rfts('/proc/scsi/scsi', $bufr, 0, 4096, PSI_DEBUG)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/Vendor: (.*) Model: (.*) Rev: (.*)/i', $buf, $devices)) { $get_type = true; $device = $devices; continue; } if ($get_type) { preg_match('/Type:\s+(\S+)/i', $buf, $dev_type); $dev = new HWDevice(); $dev->setName($device[1].' '.$device[2].' ('.$dev_type[1].')'); $this->sys->setScsiDevices($dev); $get_type = false; } } } } /** * USB devices * * @return array */ private function _usb() { $devnum = -1; if (!CommonFunctions::executeProgram('lsusb', '', $bufr, PSI_DEBUG)) { if (CommonFunctions::rfts('/proc/bus/usb/devices', $bufr, 0, 4096, false)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/^T/', $buf)) { $devnum += 1; $results[$devnum] = ""; } elseif (preg_match('/^S:/', $buf)) { list($key, $value) = preg_split('/: /', $buf, 2); list($key, $value2) = preg_split('/=/', $value, 2); if (trim($key) != "SerialNumber") { $results[$devnum] .= " ".trim($value2); } } } foreach ($results as $var) { $dev = new HWDevice(); $dev->setName($var); $this->sys->setUsbDevices($dev); } } } else { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { $device = preg_split("/ /", $buf, 7); if (isset($device[6]) && trim($device[6]) != "") { $dev = new HWDevice(); $dev->setName(trim($device[6])); $this->sys->setUsbDevices($dev); } elseif (isset($device[5]) && trim($device[5]) != "") { $dev = new HWDevice(); $dev->setName("unknown"); $this->sys->setUsbDevices($dev); } } } } /** * Network devices * includes also rx/tx bytes * * @return void */ protected function _network() { if (CommonFunctions::rfts('/proc/net/dev', $bufr, 0, 4096, PSI_DEBUG)) { $bufe = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/:/', $buf)) { list($dev_name, $stats_list) = preg_split('/:/', $buf, 2); $stats = preg_split('/\s+/', trim($stats_list)); $dev = new NetDevice(); $dev->setName(trim($dev_name)); $dev->setRxBytes($stats[0]); $dev->setTxBytes($stats[8]); $dev->setErrors($stats[2] + $stats[10]); $dev->setDrops($stats[3] + $stats[11]); if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS) && (CommonFunctions::executeProgram('ifconfig', trim($dev_name).' 2>/dev/null', $bufr2, PSI_DEBUG))) { $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe2 as $buf2) { // if (preg_match('/^'.trim($dev_name).'\s+Link\sencap:Ethernet\s+HWaddr\s(\S+)/i', $buf2, $ar_buf2) if (preg_match('/\s+encap:Ethernet\s+HWaddr\s(\S+)/i', $buf2, $ar_buf2) || preg_match('/^\s+ether\s+(\S+)\s+txqueuelen/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $ar_buf2[1])); elseif (preg_match('/^\s+inet\saddr:(\S+)\s+P-t-P:(\S+)/i', $buf2, $ar_buf2) || preg_match('/^\s+inet\s+(\S+)\s+netmask.+destination\s+(\S+)/i', $buf2, $ar_buf2)) { if ($ar_buf2[1] != $ar_buf2[2]) { $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].";:".$ar_buf2[2]); } else { $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } elseif (preg_match('/^\s+inet\saddr:(\S+)/i', $buf2, $ar_buf2) || preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2) || preg_match('/^'.trim($dev_name).':\s+ip\s+(\S+)\s+mask/i', $buf2, $ar_buf2) || preg_match('/^\s+inet6\saddr:\s([^\/]+)(.+)\s+Scope:[GH]/i', $buf2, $ar_buf2) || preg_match('/^\s+inet6\s+(\S+)\s+prefixlen(.+)(()|())/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } $this->sys->setNetDevices($dev); } } } elseif (CommonFunctions::executeProgram('ifconfig', '', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $notwas = true; foreach ($lines as $line) { if (preg_match("/^([^\s:]+)/", $line, $ar_buf)) { if (!$notwas) { $dev->setErrors($errors); $dev->setDrops($drops); $this->sys->setNetDevices($dev); } $errors = 0; $drops = 0; $dev = new NetDevice(); $dev->setName($ar_buf[1]); $notwas = false; if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { if (preg_match('/^'.$ar_buf[1].'\s+Link\sencap:Ethernet\s+HWaddr\s(\S+)/i', $line, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $ar_buf2[1])); elseif (preg_match('/^'.$ar_buf[1].':\s+ip\s+(\S+)\s+mask/i', $line, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } else { if (!$notwas) { if (preg_match('/\sRX bytes:(\d+)\s/i', $line, $ar_buf2)) { $dev->setRxBytes($ar_buf2[1]); } if (preg_match('/\sTX bytes:(\d+)\s/i', $line, $ar_buf2)) { $dev->setTxBytes($ar_buf2[1]); } if (preg_match('/\sRX packets:\d+\serrors:(\d+)\sdropped:(\d+)/i', $line, $ar_buf2)) { $errors +=$ar_buf2[1]; $drops +=$ar_buf2[2]; } elseif (preg_match('/\sTX packets:\d+\serrors:(\d+)\sdropped:(\d+)/i', $line, $ar_buf2)) { $errors +=$ar_buf2[1]; $drops +=$ar_buf2[2]; } if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { if (preg_match('/\s+encap:Ethernet\s+HWaddr\s(\S+)/i', $line, $ar_buf2) || preg_match('/^\s+ether\s+(\S+)\s+txqueuelen/i', $line, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $ar_buf2[1])); elseif (preg_match('/^\s+inet\saddr:(\S+)\s+P-t-P:(\S+)/i', $line, $ar_buf2) || preg_match('/^\s+inet\s+(\S+)\s+netmask.+destination\s+(\S+)/i', $line, $ar_buf2)) { if ($ar_buf2[1] != $ar_buf2[2]) { $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1].";:".$ar_buf2[2]); } else { $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } elseif (preg_match('/^\s+inet\saddr:(\S+)/i', $line, $ar_buf2) || preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $line, $ar_buf2) || preg_match('/^\s+inet6\saddr:\s([^\/]+)(.+)\s+Scope:[GH]/i', $line, $ar_buf2) || preg_match('/^\s+inet6\s+(\S+)\s+prefixlen(.+)(()|())/i', $line, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } } } if (!$notwas) { $dev->setErrors($errors); $dev->setDrops($drops); $this->sys->setNetDevices($dev); } } } /** * Physical memory information and Swap Space information * * @return void */ protected function _memory() { if (CommonFunctions::rfts('/proc/meminfo', $mbuf)) { $bufe = preg_split("/\n/", $mbuf, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe as $buf) { if (preg_match('/^MemTotal:\s+(.*)\s*kB/i', $buf, $ar_buf)) { $this->sys->setMemTotal($ar_buf[1] * 1024); } elseif (preg_match('/^MemFree:\s+(.*)\s*kB/i', $buf, $ar_buf)) { $this->sys->setMemFree($ar_buf[1] * 1024); } elseif (preg_match('/^Cached:\s+(.*)\s*kB/i', $buf, $ar_buf)) { $this->sys->setMemCache($ar_buf[1] * 1024); } elseif (preg_match('/^Buffers:\s+(.*)\s*kB/i', $buf, $ar_buf)) { $this->sys->setMemBuffer($ar_buf[1] * 1024); } } $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); // values for splitting memory usage if ($this->sys->getMemCache() !== null && $this->sys->getMemBuffer() !== null) { $this->sys->setMemApplication($this->sys->getMemUsed() - $this->sys->getMemCache() - $this->sys->getMemBuffer()); } if (CommonFunctions::rfts('/proc/swaps', $sbuf, 0, 4096, false)) { $swaps = preg_split("/\n/", $sbuf, -1, PREG_SPLIT_NO_EMPTY); unset($swaps[0]); foreach ($swaps as $swap) { $ar_buf = preg_split('/\s+/', $swap, 5); $dev = new DiskDevice(); $dev->setMountPoint($ar_buf[0]); $dev->setName("SWAP"); $dev->setTotal($ar_buf[2] * 1024); $dev->setUsed($ar_buf[3] * 1024); $dev->setFree($dev->getTotal() - $dev->getUsed()); $this->sys->setSwapDevices($dev); } } } } /** * filesystem information * * @return void */ private function _filesystems() { $arrResult = Parser::df("-P 2>/dev/null"); foreach ($arrResult as $dev) { $this->sys->setDiskDevices($dev); } } /** * Distribution * * @return void */ private function _distro() { $this->sys->setDistribution("Linux"); $list = @parse_ini_file(APP_ROOT."/data/distros.ini", true); if (!$list) { return; } // We have the '2>/dev/null' because Ubuntu gives an error on this command which causes the distro to be unknown if (CommonFunctions::executeProgram('lsb_release', '-a 2>/dev/null', $distro_info, PSI_DEBUG) && (strlen(trim($distro_info)) > 0)) { $distro_tmp = preg_split("/\n/", $distro_info, -1, PREG_SPLIT_NO_EMPTY); foreach ($distro_tmp as $info) { $info_tmp = preg_split('/:/', $info, 2); if ( isset($distro_tmp[0]) && !is_null($distro_tmp[0]) && (trim($distro_tmp[0]) != "") && isset($distro_tmp[1]) && !is_null($distro_tmp[1]) && (trim($distro_tmp[1]) != "") ) { $distro[trim($info_tmp[0])] = trim($info_tmp[1]); } } if (!isset($distro['Distributor ID']) && !isset($distro['Description'])) { // Systems like StartOS if ( isset($distro_tmp[0]) && !is_null($distro_tmp[0]) && (trim($distro_tmp[0]) != "") ) { $this->sys->setDistribution(trim($distro_tmp[0])); if ( preg_match('/^(\S+)\s*/', $distro_tmp[0], $id_buf) && isset($list[trim($id_buf[1])]['Image'])) { $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); } } } else { if (isset($distro['Description']) && preg_match('/^NAME=\s*(.+)\s*$/', $distro['Description'], $name_tmp)) { $distro['Description'] = $name_tmp[1]; } if (isset($distro['Description']) && ($distro['Description'] != "n/a") && !isset($distro['Distributor ID']) ) { $this->sys->setDistribution($distro['Description']); } elseif (isset($distro['Description']) && ($distro['Description'] != "n/a") && isset($distro['Distributor ID']) && ($distro['Distributor ID'] != "n/a") && ($distro['Description'] != $distro['Distributor ID'])) { $this->sys->setDistribution($distro['Description']); } elseif (isset($distro['Distributor ID']) && ($distro['Distributor ID'] != "n/a")) { $this->sys->setDistribution($distro['Distributor ID']); if (isset($distro['Release']) && ($distro['Release'] != "n/a")) { $this->sys->setDistribution($this->sys->getDistribution()." ".$distro['Release']); } if (isset($distro['Codename']) && ($distro['Codename'] != "n/a")) { $this->sys->setDistribution($this->sys->getDistribution()." (".$distro['Codename'].")"); } } if (isset($distro['Distributor ID']) && ($distro['Distributor ID'] != "n/a") && isset($list[$distro['Distributor ID']]['Image'])) { $this->sys->setDistributionIcon($list[$distro['Distributor ID']]['Image']); } } } else { /* default error handler */ if (function_exists('errorHandlerPsi')) { restore_error_handler(); } /* fatal errors only */ $old_err_rep = error_reporting(); error_reporting(E_ERROR); // Fall back in case 'lsb_release' does not exist but exist /etc/lsb-release if (CommonFunctions::fileexists($filename="/etc/lsb-release") && CommonFunctions::rfts($filename, $buf, 0, 4096, false) && preg_match('/^DISTRIB_ID="?([^"\n]+)"?/m', $buf, $id_buf) ) { if ( preg_match('/^DISTRIB_DESCRIPTION="?([^"\n]+)"?/m', $buf, $desc_buf) && (trim($desc_buf[1])!=trim($id_buf[1])) ) { $this->sys->setDistribution(trim($desc_buf[1])); } else { if (isset($list[trim($id_buf[1])]['Name'])) { $this->sys->setDistribution(trim($list[trim($id_buf[1])]['Name'])); } else { $this->sys->setDistribution(trim($id_buf[1])); } if (preg_match('/^DISTRIB_RELEASE="?([^"\n]+)"?/m', $buf, $vers_buf)) { $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); } if (preg_match('/^DISTRIB_CODENAME="?([^"\n]+)"?/m', $buf, $vers_buf)) { $this->sys->setDistribution($this->sys->getDistribution()." (".trim($vers_buf[1]).")"); } } if (isset($list[trim($id_buf[1])]['Image'])) { $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); } } else { // otherwise find files specific for distribution foreach ($list as $section=>$distribution) { if (!isset($distribution['Files'])) { continue; } else { foreach (preg_split("/;/", $distribution['Files'], -1, PREG_SPLIT_NO_EMPTY) as $filename) { if (CommonFunctions::fileexists($filename)) { $distro = $distribution; if (isset($distribution['Mode'])&&(strtolower($distribution['Mode'])=="detection")) { $buf = ""; } elseif (isset($distribution['Mode'])&&(strtolower($distribution['Mode'])=="execute")) { if (!CommonFunctions::executeProgram($filename, '2>/dev/null', $buf, PSI_DEBUG)) { $buf = ""; } } else { if (!CommonFunctions::rfts($filename, $buf, 1, 4096, false)) { $buf = ""; } elseif (isset($distribution['Mode'])&&(strtolower($distribution['Mode'])=="analyse")) { if ( preg_match('/^(\S+)\s*/', preg_replace('/^Red\s+/', 'Red', $buf), $id_buf) && isset($list[trim($id_buf[1])]['Image'])) { $distro = $list[trim($id_buf[1])]; } } } if (isset($distro['Image'])) { $this->sys->setDistributionIcon($distro['Image']); } if (isset($distribution['Name'])) { if ( is_null($buf) || (trim($buf) == "") ) { $this->sys->setDistribution($distribution['Name']); } else { $this->sys->setDistribution($distribution['Name']." ".trim($buf)); } } else { if ( is_null($buf) || (trim($buf) == "") ) { $this->sys->setDistribution($section); } else { $this->sys->setDistribution(trim($buf)); } } if (isset($distribution['Files2'])) { foreach (preg_split("/;/", $distribution['Files2'], -1, PREG_SPLIT_NO_EMPTY) as $filename2) { if (CommonFunctions::fileexists($filename2) && CommonFunctions::rfts($filename2, $buf, 0, 4096, false)) { if (preg_match('/^majorversion="?([^"\n]+)"?/m', $buf, $maj_buf) && preg_match('/^minorversion="?([^"\n]+)"?/m', $buf, $min_buf)) { $distr2=$maj_buf[1].'.'.$min_buf[1]; if (preg_match('/^buildphase="?([^"\n]+)"?/m', $buf, $pha_buf) && ($pha_buf[1]!=="0")) { $distr2.='.'.$pha_buf[1]; } if (preg_match('/^buildnumber="?([^"\n]+)"?/m', $buf, $num_buf)) { $distr2.='-'.$num_buf[1]; } if (preg_match('/^builddate="?([^"\n]+)"?/m', $buf, $dat_buf)) { $distr2.=' ('.$dat_buf[1].')'; } $this->sys->setDistribution($this->sys->getDistribution()." ".$distr2); } else { $distr2=trim(substr($buf, 0, strpos($buf, "\n"))); if ( !is_null($distr2) && ($distr2 != "") ) { $this->sys->setDistribution($this->sys->getDistribution()." ".$distr2); } } break; } } } break 2; } } } } } // if the distribution is still unknown if ($this->sys->getDistribution() == "Linux") { if ( CommonFunctions::fileexists($filename="/etc/DISTRO_SPECS") && CommonFunctions::rfts($filename, $buf, 0, 4096, false) && preg_match('/^DISTRO_NAME=\'(.+)\'/m', $buf, $id_buf) ) { if (isset($list[trim($id_buf[1])]['Name'])) { $dist = trim($list[trim($id_buf[1])]['Name']); } else { $dist = trim($id_buf[1]); } if (preg_match('/^DISTRO_VERSION=(.+)/m', $buf, $vers_buf)) { $this->sys->setDistribution(trim($dist." ".trim($vers_buf[1]))); } else { $this->sys->setDistribution($dist); } if (isset($list[trim($id_buf[1])]['Image'])) { $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); } else { if (isset($list['Puppy']['Image'])) { $this->sys->setDistributionIcon($list['Puppy']['Image']); } } } elseif ( ( CommonFunctions::fileexists($filename="/etc/distro-release") && CommonFunctions::rfts($filename, $buf, 1, 4096, false) && !is_null($buf) && (trim($buf) != "") ) || ( CommonFunctions::fileexists($filename="/etc/system-release") && CommonFunctions::rfts($filename, $buf, 1, 4096, false) && !is_null($buf) && (trim($buf) != "") ) ) { $this->sys->setDistribution(trim($buf)); if ( preg_match('/^(\S+)\s*/', preg_replace('/^Red\s+/', 'Red', $buf), $id_buf) && isset($list[trim($id_buf[1])]['Image'])) { $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); } } elseif ( CommonFunctions::fileexists($filename="/etc/solydxk/info") && CommonFunctions::rfts($filename, $buf, 0, 4096, false) && preg_match('/^DISTRIB_ID="?([^"\n]+)"?/m', $buf, $id_buf) ) { if ( preg_match('/^DESCRIPTION="?([^"\n]+)"?/m', $buf, $desc_buf) && (trim($desc_buf[1])!=trim($id_buf[1])) ) { $this->sys->setDistribution(trim($desc_buf[1])); } else { if (isset($list[trim($id_buf[1])]['Name'])) { $this->sys->setDistribution(trim($list[trim($id_buf[1])]['Name'])); } else { $this->sys->setDistribution(trim($id_buf[1])); } if (preg_match('/^RELEASE="?([^"\n]+)"?/m', $buf, $vers_buf)) { $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); } if (preg_match('/^CODENAME="?([^"\n]+)"?/m', $buf, $vers_buf)) { $this->sys->setDistribution($this->sys->getDistribution()." (".trim($vers_buf[1]).")"); } } if (isset($list[trim($id_buf[1])]['Image'])) { $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); } else { $this->sys->setDistributionIcon($list['SolydXK']['Image']); } } elseif ( CommonFunctions::fileexists($filename="/etc/os-release") && CommonFunctions::rfts($filename, $buf, 0, 4096, false) && ( preg_match('/^TAILS_VERSION_ID="?([^"\n]+)"?/m', $buf, $tid_buf) || preg_match('/^NAME="?([^"\n]+)"?/m', $buf, $id_buf) ) ) { if ( preg_match('/^TAILS_VERSION_ID="?([^"\n]+)"?/m', $buf, $tid_buf) ) { if (preg_match('/^TAILS_PRODUCT_NAME="?([^"\n]+)"?/m', $buf, $desc_buf)) { $this->sys->setDistribution(trim($desc_buf[1])." ".trim($tid_buf[1])); } else { if (isset($list['Tails']['Name'])) { $this->sys->setDistribution(trim($list['Tails']['Name'])." ".trim($tid_buf[1])); } else { $this->sys->setDistribution('Tails'." ".trim($tid_buf[1])); } } $this->sys->setDistributionIcon($list['Tails']['Image']); } else { if (preg_match('/^PRETTY_NAME="?([^"\n]+)"?/m', $buf, $desc_buf) && !preg_match('/\$/', $desc_buf[1])) { //if is not defined by variable $this->sys->setDistribution(trim($desc_buf[1])); } else { if (isset($list[trim($id_buf[1])]['Name'])) { $this->sys->setDistribution(trim($list[trim($id_buf[1])]['Name'])); } else { $this->sys->setDistribution(trim($id_buf[1])); } if (preg_match('/^VERSION="?([^"\n]+)"?/m', $buf, $vers_buf)) { $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); } elseif (preg_match('/^VERSION_ID="?([^"\n]+)"?/m', $buf, $vers_buf)) { $this->sys->setDistribution($this->sys->getDistribution()." ".trim($vers_buf[1])); } } if (isset($list[trim($id_buf[1])]['Image'])) { $this->sys->setDistributionIcon($list[trim($id_buf[1])]['Image']); } } } elseif (CommonFunctions::fileexists($filename="/etc/debian_version")) { if (!CommonFunctions::rfts($filename, $buf, 1, 4096, false)) { $buf = ""; } if (isset($list['Debian']['Image'])) { $this->sys->setDistributionIcon($list['Debian']['Image']); } if (isset($list['Debian']['Name'])) { if ( is_null($buf) || (trim($buf) == "")) { $this->sys->setDistribution($list['Debian']['Name']); } else { $this->sys->setDistribution($list['Debian']['Name']." ".trim($buf)); } } else { if ( is_null($buf) || (trim($buf) == "") ) { $this->sys->setDistribution('Debian'); } else { $this->sys->setDistribution(trim($buf)); } } } } /* restore error level */ error_reporting($old_err_rep); /* restore error handler */ if (function_exists('errorHandlerPsi')) { set_error_handler('errorHandlerPsi'); } } } /** * Processes * * @return void */ protected function _processes() { $process = glob('/proc/*/status', GLOB_NOSORT); if (($total = count($process)) > 0) { $processes['*'] = 0; $buf = ""; for ($i = 0; $i < $total; $i++) { if (CommonFunctions::rfts($process[$i], $buf, 0, 4096, false)) { $processes['*']++; //current total if (preg_match('/^State:\s+(\w)/m', $buf, $state)) { if (isset($processes[$state[1]])) { $processes[$state[1]]++; } else { $processes[$state[1]] = 1; } } } } if (!($processes['*'] > 0)) { $processes['*'] = $processes[' '] = $total; //all unknown } $this->sys->setProcesses($processes); } } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { $this->_distro(); $this->_hostname(); $this->_ip(); $this->_kernel(); $this->_machine(); $this->_uptime(); $this->_users(); $this->_cpuinfo(); $this->_pci(); $this->_ide(); $this->_scsi(); $this->_usb(); $this->_network(); $this->_memory(); $this->_filesystems(); $this->_loadavg(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.Minix.inc.php000066400000000000000000000266741247443170600216460ustar00rootroot00000000000000 * @copyright 2012 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Minix.inc.php 687 2012-09-06 20:54:49Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Minix sysinfo class * get all the required information from Minix system * * @category PHP * @package PSI Minix OS class * @author Mieczyslaw Nalewaj * @copyright 2012 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Minix extends OS { /** * content of the syslog * * @var array */ private $_dmesg = array(); /** * call parent constructor */ public function __construct() { parent::__construct(); } /** * read /var/log/messages, but only if we haven't already * * @return array */ protected function readdmesg() { if (count($this->_dmesg) === 0) { if (CommonFunctions::rfts('/var/log/messages', $buf)) { $parts = preg_split("/kernel: APIC/", $buf, -1, PREG_SPLIT_NO_EMPTY); // $parts = preg_split("/ syslogd: restart\n/", $buf, -1, PREG_SPLIT_NO_EMPTY); $this->_dmesg = preg_split("/\n/", $parts[count($parts) - 1], -1, PREG_SPLIT_NO_EMPTY); } } return $this->_dmesg; } /** * get the cpu information * * @return array */ protected function _cpuinfo() { if (CommonFunctions::rfts('/proc/cpuinfo', $bufr, 0, 4096, false)) { $processors = preg_split('/\s?\n\s?\n/', trim($bufr)); foreach ($processors as $processor) { $_n = ""; $_f = ""; $_m = ""; $_s = ""; $dev = new CpuDevice(); $details = preg_split("/\n/", $processor, -1, PREG_SPLIT_NO_EMPTY); foreach ($details as $detail) { $arrBuff = preg_split('/\s+:\s+/', trim($detail)); if (count($arrBuff) == 2) { switch (strtolower($arrBuff[0])) { case 'model name': $_n = $arrBuff[1]; break; case 'cpu mhz': $dev->setCpuSpeed($arrBuff[1]); break; case 'cpu family': $_f = $arrBuff[1]; break; case 'model': $_m = $arrBuff[1]; break; case 'stepping': $_s = $arrBuff[1]; break; case 'flags': if (preg_match("/ vmx/",$arrBuff[1])) { $dev->setVirt("vmx"); } elseif (preg_match("/ svm/",$arrBuff[1])) { $dev->setVirt("svm"); } break; } } } if ($_n == "") $_n="CPU"; if ($_f != "") $_n.=" Family ".$_f; if ($_m != "") $_n.=" Model ".$_m; if ($_s != "") $_n.=" Stepping ".$_s; $dev->SetModel($_n); $this->sys->setCpus($dev); } } else foreach ($this->readdmesg() as $line) { if (preg_match('/kernel: (CPU .*) freq (.*) MHz/', $line, $ar_buf)) { $dev = new CpuDevice(); $dev->setModel($ar_buf[1]); $dev->setCpuSpeed($ar_buf[2]); $this->sys->setCpus($dev); } } } /** * PCI devices * get the pci device information out of dmesg * * @return void */ protected function _pci() { if (CommonFunctions::rfts('/proc/pci', $strBuf, 0, 4096, false)) { $arrLines = preg_split("/\n/", $strBuf, -1, PREG_SPLIT_NO_EMPTY); foreach ($arrLines as $strLine) { $arrParams = preg_split('/\s+/', trim($strLine), 4); if (count($arrParams) == 4) $strName = $arrParams[3]; else $strName = "unknown"; $strName = preg_replace('/\(.*\)/', '', $strName); $dev = new HWDevice(); $dev->setName($strName); $arrResults[] = $dev; } foreach ($arrResults as $dev) { $this->sys->setPciDevices($dev); } } if ( !(isset($arrResults) && is_array($arrResults)) && is_array($results = Parser::lspci())) { /* if access error: chmod 4755 /usr/bin/lspci */ foreach ($results as $dev) { $this->sys->setPciDevices($dev); } } } /** * Minix Version * * @return void */ private function _kernel() { foreach ($this->readdmesg() as $line) { if (preg_match('/kernel: MINIX (.*) \((.*)\)/', $line, $ar_buf)) { $branch = $ar_buf[2]; } } if (CommonFunctions::executeProgram('uname', '-rvm', $ret)) { if (isset($branch)) $this->sys->setKernel($ret.' ('.$branch.')'); else $this->sys->setKernel($ret); } } /** * Distribution * * @return void */ protected function _distro() { if (CommonFunctions::executeProgram('uname', '-sr', $ret)) $this->sys->setDistribution($ret); else $this->sys->setDistribution('Minix'); $this->sys->setDistributionIcon('Minix.png'); } /** * UpTime * time the system is running * * @return void */ private function _uptime() { if (CommonFunctions::executeProgram('uptime', '', $buf)) { if (preg_match("/up (\d+) days,\s*(\d+):(\d+),/", $buf, $ar_buf)) { $min = $ar_buf[3]; $hours = $ar_buf[2]; $days = $ar_buf[1]; $this->sys->setUptime($days * 86400 + $hours * 3600 + $min * 60); } elseif (preg_match("/up (\d+):(\d+),/", $buf, $ar_buf)) { $min = $ar_buf[2]; $hours = $ar_buf[1]; $this->sys->setUptime($hours * 3600 + $min * 60); } } } /** * Processor Load * optionally create a loadbar * * @return void */ private function _loadavg() { if (CommonFunctions::executeProgram('uptime', '', $buf)) { if (preg_match("/load averages: (.*), (.*), (.*)$/", $buf, $ar_buf)) { $this->sys->setLoad($ar_buf[1].' '.$ar_buf[2].' '.$ar_buf[3]); } } } /** * Number of Users * * @return void */ private function _users() { if (CommonFunctions::executeProgram('uptime', '', $buf)) { if (preg_match("/, (.*) users, load averages: (.*), (.*), (.*)$/", $buf, $ar_buf)) { $this->sys->setUsers($ar_buf[1]); } } } /** * Virtual Host Name * * @return void */ private function _hostname() { if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { $ip = gethostbyname($result); if ($ip != $result) { $this->sys->setHostname(gethostbyaddr($ip)); } } } } /** * IP of the Virtual Host Name * * @return void */ private function _ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!($result = getenv('SERVER_ADDR'))) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * Physical memory information and Swap Space information * * @return void */ private function _memory() { if (CommonFunctions::rfts('/proc/meminfo', $bufr, 1, 4096, false)) { $ar_buf = preg_split('/\s+/', trim($bufr)); if (count($ar_buf) >= 5 ) { $this->sys->setMemTotal($ar_buf[0]*$ar_buf[1]); $this->sys->setMemFree($ar_buf[0]*$ar_buf[2]); $this->sys->setMemCache($ar_buf[0]*$ar_buf[4]); $this->sys->setMemUsed($ar_buf[0]*($ar_buf[1]-$ar_buf[2])); } } } /** * filesystem information * * @return void */ private function _filesystems() { $arrResult = Parser::df("-P 2>/dev/null"); foreach ($arrResult as $dev) { $this->sys->setDiskDevices($dev); } } /** * network information * * @return void */ private function _network() { if (CommonFunctions::executeProgram('ifconfig', '-a', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { if (preg_match("/^([^\s:]+):\saddress\s(\S+)\snetmask/", $line, $ar_buf)) { $dev = new NetDevice(); $dev->setName($ar_buf[1]); if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { $dev->setInfo($ar_buf[2]); } $this->sys->setNetDevices($dev); } } } } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', 'alx', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^\s(\w)\s/", $line, $ar_buf)) { $processes['*']++; $state = $ar_buf[1]; if ($state == 'W') $state = 'D'; //linux format elseif ($state == 'D') $state = 'd'; //invalid if (isset($processes[$state])) { $processes[$state]++; } else { $processes[$state] = 1; } } } if ($processes['*'] > 0) { $this->sys->setProcesses($processes); } } } /** * get the information * * @return Void */ public function build() { $this->error->addError("WARN", "The Minix version of phpSysInfo is a work in progress, some things currently don't work"); $this->_hostname(); $this->_ip(); $this->_distro(); $this->_kernel(); $this->_uptime(); $this->_users(); $this->_loadavg(); $this->_pci(); $this->_cpuinfo(); $this->_memory(); $this->_filesystems(); $this->_network(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.NetBSD.inc.php000066400000000000000000000120011247443170600216140ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.NetBSD.inc.php 287 2009-06-26 12:11:59Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * NetBSD sysinfo class * get all the required information from NetBSD systems * * @category PHP * @package PSI NetBSD OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class NetBSD extends BSDCommon { /** * define the regexp for log parser */ public function __construct() { parent::__construct(); $this->setCPURegExp1("^cpu(.*)\, (.*) MHz"); $this->setCPURegExp2("/user = (.*), nice = (.*), sys = (.*), intr = (.*), idle = (.*)/"); $this->setSCSIRegExp1("^(.*) at scsibus.*: <(.*)> .*"); $this->setSCSIRegExp2("^(da[0-9]): (.*)MB "); $this->setPCIRegExp1("/(.*) at pci[0-9] dev [0-9]* function [0-9]*: (.*)$/"); $this->setPCIRegExp2("/\"(.*)\" (.*).* at [.0-9]+ irq/"); } /** * UpTime * time the system is running * * @return void */ private function _uptime() { $a = $this->grabkey('kern.boottime'); $this->sys->setUptime(time() - $a); } /** * get network information * * @return void */ private function _network() { CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_b); CommonFunctions::executeProgram('netstat', '-ndi | cut -c1-25,44- | grep "^[a-z]*[0-9][ \t].*Link"', $netstat_n); $lines_b = preg_split("/\n/", $netstat_b, -1, PREG_SPLIT_NO_EMPTY); $lines_n = preg_split("/\n/", $netstat_n, -1, PREG_SPLIT_NO_EMPTY); for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); if (! empty($ar_buf_b[0]) && ! empty($ar_buf_n[3])) { $dev = new NetDevice(); $dev->setName($ar_buf_b[0]); $dev->setTxBytes($ar_buf_b[4]); $dev->setRxBytes($ar_buf_b[3]); $dev->setDrops($ar_buf_n[8]); $dev->setErrors($ar_buf_n[4] + $ar_buf_n[6]); $this->sys->setNetDevices($dev); } } } /** * IDE information * * @return void */ protected function ide() { foreach ($this->readdmesg() as $line) { if (preg_match('/^(.*) at (pciide|wdc|atabus|atapibus)[0-9] (.*): <(.*)>/', $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[1]); // now loop again and find the capacity foreach ($this->readdmesg() as $line2) { if (preg_match("/^(".$ar_buf[1]."): (.*), (.*), (.*)MB, .*$/", $line2, $ar_buf_n)) { $dev->setCapacity($ar_buf_n[4] * 2048 * 1.049); } elseif (preg_match("/^(".$ar_buf[1]."): (.*) MB, (.*), (.*), .*$/", $line2, $ar_buf_n)) { $dev->setCapacity($ar_buf_n[2] * 2048); } } $this->sys->setIdeDevices($dev); } } } /** * get icon name * * @return void */ private function _distroicon() { $this->sys->setDistributionIcon('NetBSD.png'); } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { $processes['*']++; $state = $ar_buf[1]; if ($state == 'O') $state = 'R'; //linux format elseif ($state == 'I') $state = 'S'; if (isset($processes[$state])) { $processes[$state]++; } else { $processes[$state] = 1; } } } if ($processes['*'] > 0) { $this->sys->setProcesses($processes); } } } /** * get the information * * @see BSDCommon::build() * * @return Void */ public function build() { parent::build(); $this->_distroicon(); $this->_network(); $this->_uptime(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.OS.inc.php000066400000000000000000000034211247443170600210640ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.OS.inc.php 699 2012-09-15 11:57:13Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Basic OS functions for all OS classes * * @category PHP * @package PSI OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ abstract class OS implements PSI_Interface_OS { /** * object for error handling * * @var Error */ protected $error; /** * @var System */ protected $sys; /** * build the global Error object */ public function __construct() { $this->error = Error::singleton(); $this->sys = new System(); } /** * get os specific encoding * * @see PSI_Interface_OS::getEncoding() * * @return string */ public function getEncoding() { return PSI_SYSTEM_CODEPAGE; } /** * get os specific language * * @see PSI_Interface_OS::getLanguage() * * @return string */ public function getLanguage() { return PSI_SYSTEM_LANG; } /** * get the filled or unfilled (with default values) System object * * @see PSI_Interface_OS::getSys() * * @return System */ final public function getSys() { $this->build(); return $this->sys; } } phpsysinfo-3.2.1/includes/os/class.OpenBSD.inc.php000066400000000000000000000123011247443170600217720ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.OpenBSD.inc.php 621 2012-07-29 18:49:04Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * OpenBSD sysinfo class * get all the required information from OpenBSD systems * * @category PHP * @package PSI OpenBSD OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class OpenBSD extends BSDCommon { /** * define the regexp for log parser */ public function __construct() { parent::__construct(); $this->setCPURegExp1("^cpu(.*) (.*) MHz"); $this->setCPURegExp2("/(.*),(.*),(.*),(.*),(.*)/"); $this->setSCSIRegExp1("^(.*) at scsibus.*: <(.*)> .*"); $this->setSCSIRegExp2("^(da[0-9]): (.*)MB "); $this->setPCIRegExp1("/(.*) at pci[0-9] .* \"(.*)\"/"); $this->setPCIRegExp2("/\"(.*)\" (.*).* at [.0-9]+ irq/"); } /** * UpTime * time the system is running * * @return void */ private function _uptime() { $a = $this->grabkey('kern.boottime'); $this->sys->setUptime(time() - $a); } /** * get network information * * @return void */ private function _network() { CommonFunctions::executeProgram('netstat', '-nbdi | cut -c1-25,44- | grep Link | grep -v \'* \'', $netstat_b, PSI_DEBUG); CommonFunctions::executeProgram('netstat', '-ndi | cut -c1-25,44- | grep Link | grep -v \'* \'', $netstat_n, PSI_DEBUG); $lines_b = preg_split("/\n/", $netstat_b, -1, PREG_SPLIT_NO_EMPTY); $lines_n = preg_split("/\n/", $netstat_n, -1, PREG_SPLIT_NO_EMPTY); for ($i = 0, $max = sizeof($lines_b); $i < $max; $i++) { $ar_buf_b = preg_split("/\s+/", $lines_b[$i]); $ar_buf_n = preg_split("/\s+/", $lines_n[$i]); if (! empty($ar_buf_b[0]) && ! empty($ar_buf_n[3])) { $dev = new NetDevice(); $dev->setName($ar_buf_b[0]); $dev->setTxBytes($ar_buf_b[4]); $dev->setRxBytes($ar_buf_b[3]); $dev->setErrors($ar_buf_n[4] + $ar_buf_n[6]); $dev->setDrops($ar_buf_n[8]); $this->sys->setNetDevices($dev); } } } /** * IDE information * * @return void */ protected function ide() { foreach ($this->readdmesg() as $line) { if (preg_match('/^(.*) at pciide[0-9] (.*): <(.*)>/', $line, $ar_buf)) { $dev = new HWDevice(); $dev->setName($ar_buf[0]); // now loop again and find the capacity foreach ($this->readdmesg() as $line2) { if (preg_match("/^(".$ar_buf[0]."): (.*), (.*), (.*)MB, .*$/", $line2, $ar_buf_n)) { $dev->setCapacity($ar_buf_n[4] * 2048 * 1.049); } } $this->sys->setIdeDevices($dev); } } } /** * get CPU information * * @return void */ protected function cpuinfo() { $dev = new CpuDevice(); $dev->setModel($this->grabkey('hw.model')); $dev->setCpuSpeed($this->grabkey('hw.cpuspeed')); $ncpu = $this->grabkey('hw.ncpu'); if ( is_null($ncpu) || (trim($ncpu) == "") || (!($ncpu >= 1)) ) $ncpu = 1; for ($ncpu ; $ncpu > 0 ; $ncpu--) { $this->sys->setCpus($dev); } } /** * get icon name * * @return void */ private function _distroicon() { $this->sys->setDistributionIcon('OpenBSD.png'); } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { $processes['*']++; $state = $ar_buf[1]; if ($state == 'I') $state = 'S'; //linux format if (isset($processes[$state])) { $processes[$state]++; } else { $processes[$state] = 1; } } } if ($processes['*'] > 0) { $this->sys->setProcesses($processes); } } } /** * get the information * * @see BSDCommon::build() * * @return Void */ public function build() { parent::build(); $this->_distroicon(); $this->_network(); $this->_uptime(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.QNX.inc.php000066400000000000000000000157011247443170600212150ustar00rootroot00000000000000 * @copyright 2012 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.QNX.inc.php 687 2012-09-06 20:54:49Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * QNX sysinfo class * get all the required information from QNX system * * @category PHP * @package PSI QNX OS class * @author Mieczyslaw Nalewaj * @copyright 2012 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class QNX extends OS { /** * content of the syslog * * @var array */ private $_dmesg = array(); /** * call parent constructor */ public function __construct() { parent::__construct(); } /** * get the cpu information * * @return array */ protected function _cpuinfo() { if (CommonFunctions::executeProgram('pidin', 'info', $buf) && preg_match('/^Processor\d+: (.*)/m' ,$buf)) { $lines = preg_split("/\n/", $buf, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { if (preg_match('/^Processor\d+: (.+)/' ,$line, $proc)) { $dev = new CpuDevice(); $dev->SetModel(trim($proc[1])); if (preg_match('/(\d+)MHz/' ,$proc[1], $mhz)) { $dev->setCpuSpeed($mhz[1]); } $this->sys->setCpus($dev); } } } } /** * QNX Version * * @return void */ private function _kernel() { if (CommonFunctions::executeProgram('uname', '-rvm', $ret)) { $this->sys->setKernel($ret); } } /** * Distribution * * @return void */ protected function _distro() { if (CommonFunctions::executeProgram('uname', '-sr', $ret)) $this->sys->setDistribution($ret); else $this->sys->setDistribution('QNX'); $this->sys->setDistributionIcon('QNX.png'); } /** * UpTime * time the system is running * * @return void */ private function _uptime() { if (CommonFunctions::executeProgram('pidin', 'info', $buf) && preg_match('/^.* BootTime:(.*)/' ,$buf, $bstart) && CommonFunctions::executeProgram('date', '', $bstop)) { /* default error handler */ if (function_exists('errorHandlerPsi')) { restore_error_handler(); } /* fatal errors only */ $old_err_rep = error_reporting(); error_reporting(E_ERROR); $uptime = strtotime($bstop)-strtotime($bstart[1]); if ($uptime > 0) $this->sys->setUptime($uptime); /* restore error level */ error_reporting($old_err_rep); /* restore error handler */ if (function_exists('errorHandlerPsi')) { set_error_handler('errorHandlerPsi'); } } } /** * Number of Users * * @return void */ private function _users() { $this->sys->setUsers(1); } /** * Virtual Host Name * * @return void */ private function _hostname() { if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { $ip = gethostbyname($result); if ($ip != $result) { $this->sys->setHostname(gethostbyaddr($ip)); } } } } /** * IP of the Virtual Host Name * * @return void */ private function _ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!($result = getenv('SERVER_ADDR'))) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * Physical memory information and Swap Space information * * @return void */ private function _memory() { if (CommonFunctions::executeProgram('pidin', 'info', $buf) && preg_match('/^.* FreeMem:(\S+)Mb\/(\S+)Mb/' ,$buf, $memm)) { $this->sys->setMemTotal(1024*1024*$memm[2]); $this->sys->setMemFree(1024*1024*$memm[1]); $this->sys->setMemUsed(1024*1024*($memm[2]-$memm[1])); } } /** * filesystem information * * @return void */ private function _filesystems() { $arrResult = Parser::df("-P 2>/dev/null"); foreach ($arrResult as $dev) { $this->sys->setDiskDevices($dev); } } /** * network information * * @return void */ private function _network() { if (CommonFunctions::executeProgram('ifconfig', '', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $notwas = true; foreach ($lines as $line) { if (preg_match("/^([^\s:]+)/", $line, $ar_buf)) { if (!$notwas) { $this->sys->setNetDevices($dev); } $dev = new NetDevice(); $dev->setName($ar_buf[1]); $notwas = false; } else { if (!$notwas) { if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { if (preg_match('/^\s+address:\s*(\S+)/i', $line, $ar_buf2)) { $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $line, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } } } if (!$notwas) { $this->sys->setNetDevices($dev); } } } /** * get the information * * @return Void */ public function build() { $this->error->addError("WARN", "The QNX version of phpSysInfo is a work in progress, some things currently don't work"); $this->_hostname(); $this->_ip(); $this->_distro(); $this->_kernel(); $this->_uptime(); $this->_users(); $this->_cpuinfo(); $this->_memory(); $this->_filesystems(); $this->_network(); } } phpsysinfo-3.2.1/includes/os/class.SunOS.inc.php000066400000000000000000000277601247443170600215660ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.SunOS.inc.php 687 2012-09-06 20:54:49Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * SunOS sysinfo class * get all the required information from SunOS systems * * @category PHP * @package PSI SunOS OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class SunOS extends OS { /** * Extract kernel values via kstat() interface * * @param string $key key for kstat programm * * @return string */ private function _kstat($key) { if (CommonFunctions::executeProgram('kstat', '-p d '.$key, $m, PSI_DEBUG) && !is_null($m) && (trim($m)!=="")) { list($key, $value) = preg_split("/\t/", trim($m), 2); return $value; } else { return ''; } } /** * Virtual Host Name * * @return void */ private function _hostname() { if (PSI_USE_VHOST === true) { $this->sys->setHostname(getenv('SERVER_NAME')); } else { if (CommonFunctions::executeProgram('uname', '-n', $result, PSI_DEBUG)) { $ip = gethostbyname($result); if ($ip != $result) { $this->sys->setHostname(gethostbyaddr($ip)); } } } } /** * IP of the Virtual Host Name * * @return void */ private function _ip() { if (PSI_USE_VHOST === true) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { if (!($result = getenv('SERVER_ADDR'))) { $this->sys->setIp(gethostbyname($this->sys->getHostname())); } else { $this->sys->setIp($result); } } } /** * Kernel Version * * @return void */ private function _kernel() { if (CommonFunctions::executeProgram('uname', '-s', $os, PSI_DEBUG)) { if (CommonFunctions::executeProgram('uname', '-r', $version, PSI_DEBUG)) { $this->sys->setKernel($os.' '.$version); } else { $this->sys->setKernel($os); } } } /** * UpTime * time the system is running * * @return void */ private function _uptime() { $this->sys->setUptime(time() - $this->_kstat('unix:0:system_misc:boot_time')); } /** * Number of Users * * @return void */ private function _users() { if (CommonFunctions::executeProgram('who', '-q', $buf, PSI_DEBUG)) { $who = preg_split('/=/', $buf); $this->sys->setUsers($who[1]); } } /** * Processor Load * optionally create a loadbar * * @return void */ private function _loadavg() { $load1 = $this->_kstat('unix:0:system_misc:avenrun_1min'); $load5 = $this->_kstat('unix:0:system_misc:avenrun_5min'); $load15 = $this->_kstat('unix:0:system_misc:avenrun_15min'); $this->sys->setLoad(round($load1 / 256, 2).' '.round($load5 / 256, 2).' '.round($load15 / 256, 2)); } /** * CPU information * * @return void */ private function _cpuinfo() { $dev = new CpuDevice(); if (CommonFunctions::executeProgram('uname', '-i', $buf, PSI_DEBUG)) { $dev->setModel(trim($buf)); } $dev->setCpuSpeed($this->_kstat('cpu_info:0:cpu_info0:clock_MHz')); $dev->setCache($this->_kstat('cpu_info:0:cpu_info0:cpu_type') * 1024); $this->sys->setCpus($dev); } /** * Network devices * * @return void */ private function _network() { if (CommonFunctions::executeProgram('netstat', '-ni | awk \'(NF ==10){print;}\'', $netstat, PSI_DEBUG)) { $lines = preg_split("/\n/", $netstat, -1, PREG_SPLIT_NO_EMPTY); foreach ($lines as $line) { $ar_buf = preg_split("/\s+/", $line); if (!empty($ar_buf[0]) && $ar_buf[0] !== 'Name') { $dev = new NetDevice(); $dev->setName($ar_buf[0]); $results[$ar_buf[0]]['errs'] = $ar_buf[5] + $ar_buf[7]; if (preg_match('/^(\D+)(\d+)$/', $ar_buf[0], $intf)) { $prefix = $intf[1].':'.$intf[2].':'.$intf[1].$intf[2].':'; } elseif (preg_match('/^(\D.*)(\d+)$/', $ar_buf[0], $intf)) { $prefix = $intf[1].':'.$intf[2].':mac:'; } else { $prefix = ""; } if ($prefix !== "") { $cnt = $this->_kstat($prefix.'drop'); if ($cnt > 0) { $dev->setDrops($cnt); } $cnt = $this->_kstat($prefix.'obytes64'); if ($cnt > 0) { $dev->setTxBytes($cnt); } $cnt = $this->_kstat($prefix.'rbytes64'); if ($cnt > 0) { $dev->setRxBytes($cnt); } } if (defined('PSI_SHOW_NETWORK_INFOS') && (PSI_SHOW_NETWORK_INFOS)) { if (CommonFunctions::executeProgram('ifconfig', $ar_buf[0], $bufr2, PSI_DEBUG) && !is_null($bufr2) && (trim($bufr2) !== "")) { $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe2 as $buf2) { if (preg_match('/^\s+ether\s+(\S+)/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').preg_replace('/:/', '-', $ar_buf2[1])); elseif (preg_match('/^\s+inet\s+(\S+)\s+netmask/i', $buf2, $ar_buf2)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } if (CommonFunctions::executeProgram('ifconfig', $ar_buf[0].' inet6', $bufr2, PSI_DEBUG) && !is_null($bufr2) && (trim($bufr2) !== "")) { $bufe2 = preg_split("/\n/", $bufr2, -1, PREG_SPLIT_NO_EMPTY); foreach ($bufe2 as $buf2) { if (preg_match('/^\s+inet6\s+([^\s\/]+)/i', $buf2, $ar_buf2) && !preg_match('/^fe80::/i',$ar_buf2[1])) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ar_buf2[1]); } } } $this->sys->setNetDevices($dev); } } } } /** * Physical memory information and Swap Space information * * @return void */ private function _memory() { $pagesize = $this->_kstat('unix:0:seg_cache:slab_size'); $this->sys->setMemTotal($this->_kstat('unix:0:system_pages:pagestotal') * $pagesize); $this->sys->setMemUsed($this->_kstat('unix:0:system_pages:pageslocked') * $pagesize); $this->sys->setMemFree($this->_kstat('unix:0:system_pages:pagesfree') * $pagesize); $dev = new DiskDevice(); $dev->setName('SWAP'); $dev->setFsType('swap'); $dev->setMountPoint('SWAP'); $dev->setTotal($this->_kstat('unix:0:vminfo:swap_avail') / 1024); $dev->setUsed($this->_kstat('unix:0:vminfo:swap_alloc') / 1024); $dev->setFree($this->_kstat('unix:0:vminfo:swap_free') / 1024); $this->sys->setSwapDevices($dev); } /** * filesystem information * * @return void */ private function _filesystems() { if (CommonFunctions::executeProgram('df', '-k', $df, PSI_DEBUG)) { $df = preg_replace('/\n\s/m',' ', $df); $mounts = preg_split("/\n/", $df, -1, PREG_SPLIT_NO_EMPTY); foreach ($mounts as $mount) { $ar_buf = preg_split('/\s+/', $mount, 6); if (!empty($ar_buf[0]) && $ar_buf[0] !== 'Filesystem') { $dev = new DiskDevice(); $dev->setName($ar_buf[0]); $dev->setTotal($ar_buf[1] * 1024); $dev->setUsed($ar_buf[2] * 1024); $dev->setFree($ar_buf[3] * 1024); $dev->setMountPoint($ar_buf[5]); if (CommonFunctions::executeProgram('df', '-n', $dftypes, PSI_DEBUG)) { $mounttypes = preg_split("/\n/", $dftypes, -1, PREG_SPLIT_NO_EMPTY); foreach ($mounttypes as $type) { $ty_buf = preg_split('/:/', $type, 2); if (trim($ty_buf[0]) == $dev->getMountPoint()) { $dev->setFsType($ty_buf[1]); break; } } } elseif (CommonFunctions::executeProgram('df', '-T', $dftypes, PSI_DEBUG)) { $dftypes = preg_replace('/\n\s/m',' ', $dftypes); $mounttypes = preg_split("/\n/", $dftypes, -1, PREG_SPLIT_NO_EMPTY); foreach ($mounttypes as $type) { $ty_buf = preg_split("/\s+/", $type, 3); if ($ty_buf[0] == $dev->getName()) { $dev->setFsType($ty_buf[1]); break; } } } $this->sys->setDiskDevices($dev); } } } } /** * Distribution Icon * * @return void */ private function _distro() { $this->sys->setDistribution('SunOS'); $this->sys->setDistributionIcon('SunOS.png'); } /** * Processes * * @return void */ protected function _processes() { if (CommonFunctions::executeProgram('ps', 'aux', $bufr, PSI_DEBUG)) { $lines = preg_split("/\n/", $bufr, -1, PREG_SPLIT_NO_EMPTY); $processes['*'] = 0; foreach ($lines as $line) { if (preg_match("/^\S+\s+\d+\s+\S+\s+\S+\s+\d+\s+\d+\s+\S+\s+(\w)/", $line, $ar_buf)) { $processes['*']++; $state = $ar_buf[1]; if ($state == 'O') $state = 'R'; //linux format elseif ($state == 'W') $state = 'D'; elseif ($state == 'D') $state = 'd'; //invalid if (isset($processes[$state])) { $processes[$state]++; } else { $processes[$state] = 1; } } } if ($processes['*'] > 0) { $this->sys->setProcesses($processes); } } } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { $this->error->addError("WARN", "The SunOS version of phpSysInfo is a work in progress, some things currently don't work"); $this->_hostname(); $this->_ip(); $this->_distro(); $this->_kernel(); $this->_uptime(); $this->_users(); $this->_loadavg(); $this->_cpuinfo(); $this->_network(); $this->_memory(); $this->_filesystems(); $this->_processes(); } } phpsysinfo-3.2.1/includes/os/class.WINNT.inc.php000066400000000000000000000545141247443170600214530ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.WINNT.inc.php 699 2012-09-15 11:57:13Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * WINNT sysinfo class * get all the required information from WINNT systems * information are retrieved through the WMI interface * * @category PHP * @package PSI WINNT OS class * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class WINNT extends OS { /** * holds the COM object that we pull all the WMI data from * * @var Object */ private $_wmi = null; /** * holds all devices, which are in the system * * @var array */ private $_wmidevices; /** * store language encoding of the system to convert some output to utf-8 * * @var string */ private $_codepage = null; /** * store language of the system * * @var string */ private $_syslang = null; /** * build the global Error object and create the WMI connection */ public function __construct() { parent::__construct(); // don't set this params for local connection, it will not work $strHostname = ''; $strUser = ''; $strPassword = ''; try { // initialize the wmi object $objLocator = new COM('WbemScripting.SWbemLocator'); if ($strHostname == "") { $this->_wmi = $objLocator->ConnectServer(); } else { $this->_wmi = $objLocator->ConnectServer($strHostname, 'root\CIMv2', $strHostname.'\\'.$strUser, $strPassword); } } catch (Exception $e) { $this->error->addError("WMI connect error", "PhpSysInfo can not connect to the WMI interface for security reasons.\nCheck an authentication mechanism for the directory where phpSysInfo is installed."); } $this->_getCodeSet(); } /** * store the codepage of the os for converting some strings to utf-8 * * @return void */ private function _getCodeSet() { $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_OperatingSystem', array('CodeSet','OSLanguage')); if ($buffer) { $this->_codepage = 'windows-'.$buffer[0]['CodeSet']; $lang = ""; if (is_readable(APP_ROOT.'/data/languages.ini') && ($langdata = @parse_ini_file(APP_ROOT.'/data/languages.ini', true))) { if (isset($langdata['WINNT'][$buffer[0]['OSLanguage']])) { $lang = $langdata['WINNT'][$buffer[0]['OSLanguage']]; } } if ($lang == "") { $lang = 'Unknown'; } $this->_syslang = $lang.' ('.$buffer[0]['OSLanguage'].')'; } } /** * retrieve different device types from the system based on selector * * @param string $strType type of the devices that should be returned * * @return array list of devices of the specified type */ private function _devicelist($strType) { if ( empty($this->_wmidevices)) { $this->_wmidevices = CommonFunctions::getWMI($this->_wmi, 'Win32_PnPEntity', array('Name', 'PNPDeviceID')); } $list = array(); foreach ($this->_wmidevices as $device) { if (substr($device['PNPDeviceID'], 0, strpos($device['PNPDeviceID'], "\\") + 1) == ($strType."\\")) { $list[] = $device['Name']; } } return $list; } /** * Host Name * * @return void */ private function _hostname() { if (PSI_USE_VHOST === true) { if ($hnm = getenv('SERVER_NAME')) $this->sys->setHostname($hnm); } else { $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_ComputerSystem', array('Name')); if ($buffer) { $result = $buffer[0]['Name']; $ip = gethostbyname($result); if ($ip != $result) { $this->sys->setHostname(gethostbyaddr($ip)); } } else { if ($hnm = getenv('COMPUTERNAME')) $this->sys->setHostname($hnm); } } } /** * IP of the Canonical Host Name * * @return void */ private function _ip() { if (PSI_USE_VHOST === true) { if ( (($hnm=$this->sys->getHostname()) != 'localhost') && (($hip=gethostbyname($hnm)) != $hnm) ) $this->sys->setIp($hip); } else { $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_ComputerSystem', array('Name')); if ($buffer) { $result = $buffer[0]['Name']; $this->sys->setIp(gethostbyname($result)); } else { if ( (($hnm=$this->sys->getHostname()) != 'localhost') && (($hip=gethostbyname($hnm)) != $hnm) ) $this->sys->setIp($hip); } } } /** * UpTime * time the system is running * * @return void */ private function _uptime() { $result = 0; date_default_timezone_set('UTC'); $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_OperatingSystem', array('LastBootUpTime', 'LocalDateTime')); if ($buffer) { $byear = intval(substr($buffer[0]['LastBootUpTime'], 0, 4)); $bmonth = intval(substr($buffer[0]['LastBootUpTime'], 4, 2)); $bday = intval(substr($buffer[0]['LastBootUpTime'], 6, 2)); $bhour = intval(substr($buffer[0]['LastBootUpTime'], 8, 2)); $bminute = intval(substr($buffer[0]['LastBootUpTime'], 10, 2)); $bseconds = intval(substr($buffer[0]['LastBootUpTime'], 12, 2)); $lyear = intval(substr($buffer[0]['LocalDateTime'], 0, 4)); $lmonth = intval(substr($buffer[0]['LocalDateTime'], 4, 2)); $lday = intval(substr($buffer[0]['LocalDateTime'], 6, 2)); $lhour = intval(substr($buffer[0]['LocalDateTime'], 8, 2)); $lminute = intval(substr($buffer[0]['LocalDateTime'], 10, 2)); $lseconds = intval(substr($buffer[0]['LocalDateTime'], 12, 2)); $boottime = mktime($bhour, $bminute, $bseconds, $bmonth, $bday, $byear); $localtime = mktime($lhour, $lminute, $lseconds, $lmonth, $lday, $lyear); $result = $localtime - $boottime; $this->sys->setUptime($result); } } /** * Number of Users * * @return void */ private function _users() { $users = 0; $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_Process', array('Caption')); foreach ($buffer as $process) { if (strtoupper($process['Caption']) == strtoupper('explorer.exe')) { $users++; } } $this->sys->setUsers($users); } /** * Distribution * * @return void */ private function _distro() { $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_OperatingSystem', array('Version', 'ServicePackMajorVersion', 'Caption', 'OSArchitecture')); if ($buffer) { $kernel = $buffer[0]['Version']; if ($buffer[0]['ServicePackMajorVersion'] > 0) { $kernel .= ' SP'.$buffer[0]['ServicePackMajorVersion']; } if (isset($buffer[0]['OSArchitecture']) && preg_match("/^(\d+)/", $buffer[0]['OSArchitecture'], $bits)) { $this->sys->setKernel($kernel.' ('.$bits[1].'-bit)'); } elseif (($allCpus = CommonFunctions::getWMI($this->_wmi, 'Win32_Processor', array('AddressWidth'))) && isset($allCpus[0]['AddressWidth'])) { $this->sys->setKernel($kernel.' ('.$allCpus[0]['AddressWidth'].'-bit)'); } else { $this->sys->setKernel($kernel); } $this->sys->setDistribution($buffer[0]['Caption']); if ((($kernel[1] == ".") && ($kernel[0] <5)) || (substr($kernel,0,4) == "5.0.")) $icon = 'Win2000.png'; elseif ((substr($kernel,0,4) == "6.0.") || (substr($kernel,0,4) == "6.1.")) $icon = 'WinVista.png'; elseif ((substr($kernel,0,4) == "6.2.") || (substr($kernel,0,4) == "6.3.") || (substr($kernel,0,4) == "6.4.") || (substr($kernel,0,5) == "10.0.")) $icon = 'Win8.png'; else $icon = 'WinXP.png'; $this->sys->setDistributionIcon($icon); } elseif (CommonFunctions::executeProgram("cmd", "/c ver 2>nul", $ver_value, false)) { if (preg_match("/ReactOS\r?\nVersion\s+(.+)/", $ver_value, $ar_temp)) { $this->sys->setDistribution("ReactOS"); $this->sys->setKernel($ar_temp[1]); $this->sys->setDistributionIcon('ReactOS.png'); } elseif (preg_match("/^(Microsoft [^\[]*)\s*\[\D*\s*(.+)\]/", $ver_value, $ar_temp)) { $this->sys->setDistribution($ar_temp[1]); $this->sys->setKernel($ar_temp[2]); $this->sys->setDistributionIcon('Win2000.png'); } else { $this->sys->setDistribution("WinNT"); $this->sys->setDistributionIcon('Win2000.png'); } } else { $this->sys->setDistribution("WinNT"); $this->sys->setDistributionIcon('Win2000.png'); } } /** * Processor Load * optionally create a loadbar * * @return void */ private function _loadavg() { $loadavg = ""; $sum = 0; $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_Processor', array('LoadPercentage')); if ($buffer) { foreach ($buffer as $load) { $value = $load['LoadPercentage']; $loadavg .= $value.' '; $sum += $value; } $this->sys->setLoad(trim($loadavg)); if (PSI_LOAD_BAR) { $this->sys->setLoadPercent($sum / count($buffer)); } } } /** * CPU information * * @return void */ private function _cpuinfo() { $allCpus = CommonFunctions::getWMI($this->_wmi, 'Win32_Processor', array('Name', 'L2CacheSize', 'CurrentClockSpeed', 'ExtClock', 'NumberOfCores', 'MaxClockSpeed')); foreach ($allCpus as $oneCpu) { $coreCount = 1; if (isset($oneCpu['NumberOfCores'])) { $coreCount = $oneCpu['NumberOfCores']; } for ($i = 0; $i < $coreCount; $i++) { $cpu = new CpuDevice(); $cpu->setModel($oneCpu['Name']); $cpu->setCache($oneCpu['L2CacheSize'] * 1024); $cpu->setCpuSpeed($oneCpu['CurrentClockSpeed']); $cpu->setBusSpeed($oneCpu['ExtClock']); if ($oneCpu['CurrentClockSpeed'] < $oneCpu['MaxClockSpeed']) $cpu->setCpuSpeedMax($oneCpu['MaxClockSpeed']); $this->sys->setCpus($cpu); } } } /** * Machine information * * @return void */ private function _machine() { $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_ComputerSystem', array('Manufacturer','Model')); if ($buffer) { $buf = ""; if (isset($buffer[0]['Manufacturer'])) { $buf .= ' '.$buffer[0]['Manufacturer']; } if (isset($buffer[0]['Model'])) { $buf .= ' '.$buffer[0]['Model']; } if (trim($buf) != "") { $this->sys->setMachine(trim($buf)); } } } /** * Hardwaredevices * * @return void */ private function _hardware() { foreach ($this->_devicelist('PCI') as $pciDev) { $dev = new HWDevice(); $dev->setName($pciDev); $this->sys->setPciDevices($dev); } foreach ($this->_devicelist('IDE') as $ideDev) { $dev = new HWDevice(); $dev->setName($ideDev); $this->sys->setIdeDevices($dev); } foreach ($this->_devicelist('SCSI') as $scsiDev) { $dev = new HWDevice(); $dev->setName($scsiDev); $this->sys->setScsiDevices($dev); } foreach ($this->_devicelist('USB') as $usbDev) { $dev = new HWDevice(); $dev->setName($usbDev); $this->sys->setUsbDevices($dev); } } /** * Network devices * * @return void */ private function _network() { $allDevices = CommonFunctions::getWMI($this->_wmi, 'Win32_PerfRawData_Tcpip_NetworkInterface');//, array('Name', 'BytesSentPersec', 'BytesTotalPersec', 'BytesReceivedPersec', 'PacketsReceivedErrors', 'PacketsReceivedDiscarded')); $allNetworkAdapterConfigurations = CommonFunctions::getWMI($this->_wmi, 'Win32_NetworkAdapterConfiguration');//, array('Description', 'MACAddress', 'IPAddress', 'SettingID')); foreach ($allDevices as $device) { $dev = new NetDevice(); $name=$device['Name']; if (preg_match('/^isatap\.({[A-Fa-f0-9\-]*})/', $name, $ar_name)) { //isatap device foreach ($allNetworkAdapterConfigurations as $NetworkAdapterConfiguration) { if ($ar_name[1]==$NetworkAdapterConfiguration['SettingID']) { $dev->setName($NetworkAdapterConfiguration['Description']); if (defined('PSI_SHOW_NETWORK_INFOS') && PSI_SHOW_NETWORK_INFOS) { $dev->setInfo(preg_replace('/:/', '-', $NetworkAdapterConfiguration['MACAddress'])); if (isset($NetworkAdapterConfiguration['IPAddress'])) foreach( $NetworkAdapterConfiguration['IPAddress'] as $ipaddres) if (($ipaddres!="0.0.0.0") && !preg_match('/^fe80::/i',$ipaddres)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ipaddres); } break; } } } else { $cname=preg_replace('/[^A-Za-z0-9]/', '_', $name); //convert to canonical if (preg_match('/\s-\s([^-]*)$/', $name, $ar_name)) $name=substr($name,0,strlen($name)-strlen($ar_name[0])); $dev->setName($name); if (defined('PSI_SHOW_NETWORK_INFOS') && PSI_SHOW_NETWORK_INFOS) foreach ($allNetworkAdapterConfigurations as $NetworkAdapterConfiguration) { if ( preg_replace('/[^A-Za-z0-9]/', '_', $NetworkAdapterConfiguration['Description']) == $cname ) { if (!is_null($dev->getInfo())) { $dev->setInfo(''); //multiple with the same name } else { $dev->setInfo(preg_replace('/:/', '-', $NetworkAdapterConfiguration['MACAddress'])); if (isset($NetworkAdapterConfiguration['IPAddress'])) foreach( $NetworkAdapterConfiguration['IPAddress'] as $ipaddres) if (($ipaddres!="0.0.0.0") && !preg_match('/^fe80::/i',$ipaddres)) $dev->setInfo(($dev->getInfo()?$dev->getInfo().';':'').$ipaddres); } } } } // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_perfrawdata_tcpip_networkinterface.asp // there is a possible bug in the wmi interfaceabout uint32 and uint64: http://www.ureader.com/message/1244948.aspx, so that // magative numbers would occour, try to calculate the nagative value from total - positive number $txbytes = $device['BytesSentPersec']; $rxbytes = $device['BytesReceivedPersec']; if (($txbytes < 0) && ($rxbytes < 0)) { $txbytes += 4294967296; $rxbytes += 4294967296; } elseif ($txbytes < 0) { if ($device['BytesTotalPersec'] > $rxbytes) $txbytes = $device['BytesTotalPersec'] - $rxbytes; else $txbytes += 4294967296; } elseif ($rxbytes < 0) { if ($device['BytesTotalPersec'] > $txbytes) $rxbytes = $device['BytesTotalPersec'] - $txbytes; else $rxbytes += 4294967296; } $dev->setTxBytes($txbytes); $dev->setRxBytes($rxbytes); $dev->setErrors($device['PacketsReceivedErrors']); $dev->setDrops($device['PacketsReceivedDiscarded']); $this->sys->setNetDevices($dev); } } /** * Physical memory information and Swap Space information * * @link http://msdn2.microsoft.com/En-US/library/aa394239.aspx * @link http://msdn2.microsoft.com/en-us/library/aa394246.aspx * @return void */ private function _memory() { $buffer = CommonFunctions::getWMI($this->_wmi, "Win32_OperatingSystem", array('TotalVisibleMemorySize', 'FreePhysicalMemory')); if ($buffer) { $this->sys->setMemTotal($buffer[0]['TotalVisibleMemorySize'] * 1024); $this->sys->setMemFree($buffer[0]['FreePhysicalMemory'] * 1024); $this->sys->setMemUsed($this->sys->getMemTotal() - $this->sys->getMemFree()); } $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_PageFileUsage'); foreach ($buffer as $swapdevice) { $dev = new DiskDevice(); $dev->setName("SWAP"); $dev->setMountPoint($swapdevice['Name']); $dev->setTotal($swapdevice['AllocatedBaseSize'] * 1024 * 1024); $dev->setUsed($swapdevice['CurrentUsage'] * 1024 * 1024); $dev->setFree($dev->getTotal() - $dev->getUsed()); $dev->setFsType('swap'); $this->sys->setSwapDevices($dev); } } /** * filesystem information * * @return void */ private function _filesystems() { $typearray = array('Unknown', 'No Root Directory', 'Removable Disk', 'Local Disk', 'Network Drive', 'Compact Disc', 'RAM Disk'); $floppyarray = array('Unknown', '5 1/4 in.', '3 1/2 in.', '3 1/2 in.', '3 1/2 in.', '3 1/2 in.', '5 1/4 in.', '5 1/4 in.', '5 1/4 in.', '5 1/4 in.', '5 1/4 in.', 'Other', 'HD', '3 1/2 in.', '3 1/2 in.', '5 1/4 in.', '5 1/4 in.', '3 1/2 in.', '3 1/2 in.', '5 1/4 in.', '3 1/2 in.', '3 1/2 in.', '8 in.'); $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_LogicalDisk', array('Name', 'Size', 'FreeSpace', 'FileSystem', 'DriveType', 'MediaType')); foreach ($buffer as $filesystem) { $dev = new DiskDevice(); $dev->setMountPoint($filesystem['Name']); $dev->setFsType($filesystem['FileSystem']); if ($filesystem['Size'] > 0) { $dev->setTotal($filesystem['Size']); $dev->setFree($filesystem['FreeSpace']); $dev->setUsed($filesystem['Size'] - $filesystem['FreeSpace']); } if ($filesystem['MediaType'] != "" && $filesystem['DriveType'] == 2) { $dev->setName($typearray[$filesystem['DriveType']]." (".$floppyarray[$filesystem['MediaType']].")"); } else { $dev->setName($typearray[$filesystem['DriveType']]); } $this->sys->setDiskDevices($dev); } if (!$buffer && ($this->sys->getDistribution()=="ReactOS")) { // test for command 'free' on current disk if (CommonFunctions::executeProgram("cmd", "/c free 2>nul", $out_value, true)) { for ($letter='A'; $letter!='AA'; $letter++) if (CommonFunctions::executeProgram("cmd", "/c free ".$letter.": 2>nul", $out_value, false)) { if (preg_match('/\n\s*([\d\.\,]+).*\n\s*([\d\.\,]+).*\n\s*([\d\.\,]+).*$/',$out_value, $out_dig )) { $size = preg_replace('/(\.)|(\,)/', '', $out_dig[1]); $used = preg_replace('/(\.)|(\,)/', '', $out_dig[2]); $free = preg_replace('/(\.)|(\,)/', '', $out_dig[3]); if ($used + $free == $size) { $dev = new DiskDevice(); $dev->setMountPoint($letter.":"); $dev->setFsType('Unknown'); $dev->setTotal($size); $dev->setFree($free); $dev->setUsed($used); $this->sys->setDiskDevices($dev); } } } } } } /** * get os specific encoding * * @see OS::getEncoding() * * @return string */ public function getEncoding() { return $this->_codepage; } /** * get os specific language * * @see OS::getLanguage() * * @return string */ public function getLanguage() { return $this->_syslang; } public function _processes() { $processes['*'] = 0; $buffer = CommonFunctions::getWMI($this->_wmi, 'Win32_Process', array('Caption')); foreach ($buffer as $process) { $processes['*']++; } $processes[' '] = $processes['*']; $this->sys->setProcesses($processes); } /** * get the information * * @see PSI_Interface_OS::build() * * @return Void */ public function build() { $this->_hostname(); $this->_ip(); $this->_distro(); if ($this->sys->getDistribution()=="ReactOS") { $this->error->addError("WARN", "The ReactOS version of phpSysInfo is a work in progress, some things currently don't work"); } $this->_users(); $this->_machine(); $this->_uptime(); $this->_cpuinfo(); $this->_network(); $this->_hardware(); $this->_filesystems(); $this->_memory(); $this->_loadavg(); $this->_processes(); } } phpsysinfo-3.2.1/includes/output/000077500000000000000000000000001247443170600170755ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/output/class.Output.inc.php000066400000000000000000000027511247443170600227670ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Output.inc.php 569 2012-04-16 06:08:18Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * basic output functions for all output formats * * @category PHP * @package PSI_Output * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ abstract class Output { /** * error object for logging errors * * @var Error */ protected $error; /** * call the parent constructor and check for needed extensions */ public function __construct() { $this->error = Error::singleton(); $this->_checkConfig(); CommonFunctions::checkForExtensions(); // $this->error = Error::singleton(); // $this->_checkConfig(); } /** * read the config file and check for existence * * @return void */ private function _checkConfig() { include_once APP_ROOT.'/read_config.php'; if ($this->error->errorsExist()) { $this->error->errorsAsXML(); } } } phpsysinfo-3.2.1/includes/output/class.Template.inc.php000066400000000000000000000037131247443170600232410ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Output.inc.php 315 2009-09-02 15:48:31Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * basic output functions for all output formats * * @category PHP * @package PSI_Output * @author Damien Roth * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Template { /** * Vars used in the template * * @Array */ private $_vars; /** * Template file * * @String */ private $_file; /** * Constructor * * @param String $file the template file name */ public function __construct($file=null) { $this->_file = $file; $this->_vars = array(); } /** * Set a template variable. * * @param string variable name * @param string variable value */ public function set($name, $value) { $this->_vars[$name] = is_object($value) ? $value->fetch() : $value; } /** * Open, parse, and return the template file. * * @param string $file * * @return string */ public function fetch($file=null) { if (!$file) { $file = $this->_file; } // Extract the vars to local namespace extract($this->_vars); // Start output buffering ob_start(); include(APP_ROOT.$file); // Get the contents of the buffer $contents = ob_get_contents(); // End buffering and discard ob_end_clean(); return $contents; } } phpsysinfo-3.2.1/includes/output/class.Webpage.inc.php000066400000000000000000000071121247443170600230350ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.Webpage.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * generate the dynamic webpage * * @category PHP * @package PSI_Web * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Webpage extends Output implements PSI_Interface_Output { /** * configured language * * @var String */ private $_language; /** * configured template * * @var String */ private $_template; /** * all available templates * * @var Array */ private $_templates = array(); /** * all available languages * * @var Array */ private $_languages = array(); /** * check for all extensions that are needed, initialize needed vars and read phpsysinfo.ini */ public function __construct() { parent::__construct(); $this->_getTemplateList(); $this->_getLanguageList(); } /** * checking phpsysinfo.ini setting for template, if not supportet set phpsysinfo.css as default * checking phpsysinfo.ini setting for language, if not supported set en as default * * @return void */ private function _checkTemplateLanguage() { $this->_template = trim(strtolower(PSI_DEFAULT_TEMPLATE)); if (!file_exists(APP_ROOT.'/templates/'.$this->_template.".css")) { $this->_template = 'phpsysinfo'; } $this->_language = trim(strtolower(PSI_DEFAULT_LANG)); if (!file_exists(APP_ROOT.'/language/'.$this->_language.".xml")) { $this->_language = 'en'; } } /** * get all available tamplates and store them in internal array * * @return void */ private function _getTemplateList() { $dirlist = CommonFunctions::gdc(APP_ROOT.'/templates/'); sort($dirlist); foreach ($dirlist as $file) { $tpl_ext = substr($file, strlen($file) - 4); $tpl_name = substr($file, 0, strlen($file) - 4); if ($tpl_ext === ".css") { array_push($this->_templates, $tpl_name); } } } /** * get all available translations and store them in internal array * * @return void */ private function _getLanguageList() { $dirlist = CommonFunctions::gdc(APP_ROOT.'/language/'); sort($dirlist); foreach ($dirlist as $file) { $lang_ext = substr($file, strlen($file) - 4); $lang_name = substr($file, 0, strlen($file) - 4); if ($lang_ext == ".xml") { array_push($this->_languages, $lang_name); } } } /** * render the page * * @return void */ public function run() { $this->_checkTemplateLanguage(); $tpl = new Template("/templates/html/index_dynamic.html"); $tpl->set("template", $this->_template); $tpl->set("templates", $this->_templates); $tpl->set("language", $this->_language); $tpl->set("languages", $this->_languages); echo $tpl->fetch(); } } phpsysinfo-3.2.1/includes/output/class.WebpageXML.inc.php000066400000000000000000000131101247443170600234110ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.WebpageXML.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * class for xml output * * @category PHP * @package PSI_XML * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class WebpageXML extends Output implements PSI_Interface_Output { /** * xml object that holds the generated xml * * @var XML */ private $_xml; /** * only plugin xml * * @var boolean */ private $_pluginRequest = false; /** * complete xml * * @var boolean */ private $_completeXML = false; /** * name of the plugin * * @var string */ private $_pluginName = null; /** * generate the output * * @return void */ private function _prepare() { if (!$this->_pluginRequest) { // Figure out which OS we are running on, and detect support if (!file_exists(APP_ROOT.'/includes/os/class.'.PSI_OS.'.inc.php')) { $this->error->addError("file_exists(class.".PSI_OS.".inc.php)", PSI_OS." is not currently supported"); } // check if there is a valid sensor configuration in phpsysinfo.ini $foundsp = array(); if ( defined('PSI_SENSOR_PROGRAM') && is_string(PSI_SENSOR_PROGRAM) ) { if (preg_match(ARRAY_EXP, PSI_SENSOR_PROGRAM)) { $sensorprograms = eval(strtolower(PSI_SENSOR_PROGRAM)); } else { $sensorprograms = array(strtolower(PSI_SENSOR_PROGRAM)); } foreach ($sensorprograms as $sensorprogram) { if (!file_exists(APP_ROOT.'/includes/mb/class.'.$sensorprogram.'.inc.php')) { $this->error->addError("file_exists(class.".htmlspecialchars($sensorprogram).".inc.php)", "specified sensor program is not supported"); } else { $foundsp[] = $sensorprogram; } } } /** * motherboard information * * @var serialized array */ define('PSI_MBINFO', serialize($foundsp)); // check if there is a valid hddtemp configuration in phpsysinfo.ini $found = false; if (PSI_HDD_TEMP !== false) { $found = true; } /** * hddtemp information available or not * * @var boolean */ define('PSI_HDDTEMP', $found); // check if there is a valid ups configuration in phpsysinfo.ini $foundup = array(); if ( defined('PSI_UPS_PROGRAM') && is_string(PSI_UPS_PROGRAM) ) { if (preg_match(ARRAY_EXP, PSI_UPS_PROGRAM)) { $upsprograms = eval(strtolower(PSI_UPS_PROGRAM)); } else { $upsprograms = array(strtolower(PSI_UPS_PROGRAM)); } foreach ($upsprograms as $upsprogram) { if (!file_exists(APP_ROOT.'/includes/ups/class.'.$upsprogram.'.inc.php')) { $this->error->addError("file_exists(class.".htmlspecialchars($upsprogram).".inc.php)", "specified UPS program is not supported"); } else { $foundup[] = $upsprogram; } } } /** * ups information * * @var serialized array */ define('PSI_UPSINFO', serialize($foundup)); // if there are errors stop executing the script until they are fixed if ($this->error->errorsExist()) { $this->error->errorsAsXML(); } } // Create the XML if ($this->_pluginRequest) { $this->_xml = new XML(false, $this->_pluginName); } else { $this->_xml = new XML($this->_completeXML); } } /** * render the output * * @return void */ public function run() { header("Cache-Control: no-cache, must-revalidate\n"); header("Content-Type: text/xml\n\n"); $xml = $this->_xml->getXml(); echo $xml->asXML(); } /** * get XML as pure string * * @return string */ public function getXMLString() { $xml = $this->_xml->getXml(); return $xml->asXML(); } /** * set parameters for the XML generation process * * @param boolean $completeXML switch for complete xml with all plugins * @param string $plugin name of the plugin * * @return void */ public function __construct($completeXML, $plugin = null) { parent::__construct(); if ($completeXML) { $this->_completeXML = true; } if ($plugin) { if (in_array(strtolower($plugin), CommonFunctions::getPlugins())) { $this->_pluginName = $plugin; $this->_pluginRequest = true; } } $this->_prepare(); } } phpsysinfo-3.2.1/includes/output/class.WebpageXSLT.inc.php000066400000000000000000000027651247443170600235610ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.WebpageXSLT.inc.php 569 2012-04-16 06:08:18Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * generate a static webpage with xslt trasformation of the xml * * @category PHP * @package PSI_Web * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class WebpageXSLT extends WebpageXML implements PSI_Interface_Output { /** * call the parent constructor */ public function __construct() { parent::__construct(false, null); } /** * generate the static page * * @return void */ public function run() { CommonFunctions::checkForExtensions(array('xsl')); $xmlfile = $this->getXMLString(); $xslfile = "phpsysinfo.xslt"; $domxml = new DOMDocument(); $domxml->loadXML($xmlfile); $domxsl = new DOMDocument(); $domxsl->load($xslfile); $xsltproc = new XSLTProcessor; $xsltproc->importStyleSheet($domxsl); echo $xsltproc->transformToXML($domxml); } } phpsysinfo-3.2.1/includes/plugin/000077500000000000000000000000001247443170600170335ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/plugin/class.PSI_Plugin.inc.php000066400000000000000000000111121247443170600233650ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.PSI_Plugin.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * basic functions to get a plugin working in phpSysinfo * every plugin must implement this abstract class to be a valid plugin, main tasks * of this class are reading the configuration file and check for the required files * (*.js, lang/en.xml) to get everything working, if we have errors here we log them * to our global error object * * @category PHP * @package PSI_Plugin * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ abstract class PSI_Plugin implements PSI_Interface_Plugin { /** * name of the plugin (classname) * * @var string */ private $_plugin_name = ""; /** * full directory path of the plugin * * @var string */ private $_plugin_base = ""; /** * global object for error handling * * @var Error */ protected $global_error = ""; /** * xml tamplate with header * * @var SimpleXMLExtended */ protected $xml; /** * build the global Error object, read the configuration and check if all files are available * for a minimalistic function of the plugin * * @param String $plugin_name name of the plugin * @param String $enc target encoding * * @return void */ public function __construct($plugin_name, $enc) { $this->global_error = Error::Singleton(); if (trim($plugin_name) != "") { $this->_plugin_name = $plugin_name; $this->_plugin_base = APP_ROOT."/plugins/".strtolower($this->_plugin_name)."/"; $this->_checkfiles(); $this->_getconfig(); } else { $this->global_error->addError("__construct()", "Parent constructor called without Plugin-Name!"); } $this->_createXml($enc); } /** * read the plugin configuration file, if we have one in the plugin directory * * @return void */ private function _getconfig() { if ( (!defined('PSI_PLUGIN_'.strtoupper($this->_plugin_name).'_ACCESS')) && (!defined('PSI_PLUGIN_'.strtoupper($this->_plugin_name).'_FILE')) ) { $this->global_error->addError("config.ini", "Config for plugin ".$this->_plugin_name." not exist!"); } } /** * check if there is a default translation file availabe and also the required js file for * appending the content of the plugin to the main webpage * * @return void */ private function _checkfiles() { if (!file_exists($this->_plugin_base."js/".strtolower($this->_plugin_name).".js")) { $this->global_error->addError("file_exists(".$this->_plugin_base."js/".strtolower($this->_plugin_name).".js)", "JS-File for Plugin '".$this->_plugin_name."' is missing!"); } else { if (!is_readable($this->_plugin_base."js/".strtolower($this->_plugin_name).".js")) { $this->global_error->addError("is_readable(".$this->_plugin_base."js/".strtolower($this->_plugin_name).".js)", "JS-File for Plugin '".$this->_plugin_name."' is not readable but present!"); } } if (!file_exists($this->_plugin_base."lang/en.xml")) { $this->global_error->addError("file_exists(".$this->_plugin_base."lang/en.xml)", "At least an english translation must exist for the plugin!"); } else { if (!is_readable($this->_plugin_base."lang/en.xml")) { $this->global_error->addError("is_readable(".$this->_plugin_base."js/".$this->_plugin_name.".js)", "The english translation can't be read but is present!"); } } } /** * create the xml template where plugin information are added to * * @param String $enc target encoding * * @return Void */ private function _createXml($enc) { $dom = new DOMDocument('1.0', 'UTF-8'); $root = $dom->createElement("Plugin_".$this->_plugin_name); $dom->appendChild($root); $this->xml = new SimpleXMLExtended(simplexml_import_dom($dom), $enc); } } phpsysinfo-3.2.1/includes/to/000077500000000000000000000000001247443170600161575ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/to/class.MBInfo.inc.php000066400000000000000000000071301247443170600216570ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.MBInfo.inc.php 253 2009-06-17 13:07:50Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * MBInfo TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class MBInfo { /** * array with SensorDevices for temperatures * * @see SensorDevice * * @var Array */ private $_mbTemp = array(); /** * array with SensorDevices for fans * * @see SensorDevice * * @var Array */ private $_mbFan = array(); /** * array with SensorDevices for voltages * * @see SensorDevice * * @var Array */ private $_mbVolt = array(); /** * array with SensorDevices for power * * @see SensorDevice * * @var Array */ private $_mbPower = array(); /** * array with SensorDevices for apmers * * @see SensorDevice * * @var Array */ private $_mbCurrent = array(); /** * Returns $_mbFan. * * @see System::$_mbFan * * @return Array */ public function getMbFan() { return $this->_mbFan; } /** * Sets $_mbFan. * * @param SensorDevice $mbFan fan device * * @see System::$_mbFan * * @return Void */ public function setMbFan($mbFan) { array_push($this->_mbFan, $mbFan); } /** * Returns $_mbTemp. * * @see System::$_mbTemp * * @return Array */ public function getMbTemp() { return $this->_mbTemp; } /** * Sets $_mbTemp. * * @param Sensor $mbTemp temp device * * @see System::$_mbTemp * * @return Void */ public function setMbTemp($mbTemp) { array_push($this->_mbTemp, $mbTemp); } /** * Returns $_mbVolt. * * @see System::$_mbVolt * * @return Array */ public function getMbVolt() { return $this->_mbVolt; } /** * Sets $_mbVolt. * * @param Sensor $mbVolt voltage device * * @see System::$_mbVolt * * @return Void */ public function setMbVolt($mbVolt) { array_push($this->_mbVolt, $mbVolt); } /** * Returns $_mbPower. * * @see System::$_mbPower * * @return Array */ public function getMbPower() { return $this->_mbPower; } /** * Sets $_mbPower. * * @param Sensor $mbPower power device * * @see System::$_mbPower * * @return Void */ public function setMbPower($mbPower) { array_push($this->_mbPower, $mbPower); } /** * Returns $_mbCurrent. * * @see System::$_mbCurrent * * @return Array */ public function getMbCurrent() { return $this->_mbCurrent; } /** * Sets $_mbCurrent. * * @param Sensor $mbCurrent current device * * @see System::$_mbCurrent * * @return Void */ public function setMbCurrent($mbCurrent) { array_push($this->_mbCurrent, $mbCurrent); } } phpsysinfo-3.2.1/includes/to/class.System.inc.php000066400000000000000000000512671247443170600220430ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.System.inc.php 255 2009-06-17 13:39:41Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * System TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class System { /** * name of the host where phpSysInfo runs * * @var String */ private $_hostname = "localhost"; /** * ip of the host where phpSysInfo runs * * @var String */ private $_ip = "127.0.0.1"; /** * detailed Information about the kernel * * @var String */ private $_kernel = "Unknown"; /** * name of the distribution * * @var String */ private $_distribution = "Unknown"; /** * icon of the distribution (must be available in phpSysInfo) * * @var String */ private $_distributionIcon = "unknown.png"; /** * detailed Information about the machine name * * @var String */ private $_machine = ""; /** * time in sec how long the system is running * * @var Integer */ private $_uptime = 0; /** * count of users that are currently logged in * * @var Integer */ private $_users = 0; /** * load of the system * * @var String */ private $_load = ""; /** * load of the system in percent (all cpus, if more than one) * * @var Integer */ private $_loadPercent = null; /** * array with cpu devices * * @see CpuDevice * * @var Array */ private $_cpus = array(); /** * array with network devices * * @see NetDevice * * @var Array */ private $_netDevices = array(); /** * array with scsi devices * * @see HWDevice * * @var Array */ private $_scsiDevices = array(); /** * array with pci devices * * @see HWDevice * * @var Array */ private $_pciDevices = array(); /** * array with usb devices * * @see HWDevice * * @var Array */ private $_usbDevices = array(); /** * array with ide devices * * @see HWDevice * * @var Array */ private $_ideDevices = array(); /** * array with disk devices * * @see DiskDevice * * @var Array */ private $_diskDevices = array(); /** * free memory in bytes * * @var Integer */ private $_memFree = 0; /** * total memory in bytes * * @var Integer */ private $_memTotal = 0; /** * used memory in bytes * * @var Integer */ private $_memUsed = 0; /** * used memory by applications in bytes * * @var Integer */ private $_memApplication = null; /** * used memory for buffers in bytes * * @var Integer */ private $_memBuffer = null; /** * used memory for cache in bytes * * @var Integer */ private $_memCache = null; /** * array with swap devices * * @see DiskDevice * * @var Array */ private $_swapDevices = array(); /** * array of types of processes * * @var Array */ private $_processes = array(); /** * remove duplicate Entries and Count * * @param Array $arrDev list of HWDevices * * @see HWDevice * * @return Array */ public static function removeDupsAndCount($arrDev) { $result = array(); foreach ($arrDev as $dev) { if (count($result) === 0) { array_push($result, $dev); } else { $found = false; foreach ($result as $tmp) { if ($dev->equals($tmp)) { $tmp->setCount($tmp->getCount() + 1); $found = true; break; } } if (!$found) { array_push($result, $dev); } } } return $result; } /** * return percent of used memory * * @see System::_memUsed * @see System::_memTotal * * @return Integer */ public function getMemPercentUsed() { if ($this->_memTotal > 0) { return round($this->_memUsed / $this->_memTotal * 100); } else { return 0; } } /** * return percent of used memory for applications * * @see System::_memApplication * @see System::_memTotal * * @return Integer */ public function getMemPercentApplication() { if ($this->_memApplication !== null) { if (($this->_memApplication > 0) && ($this->_memTotal > 0)) { return round($this->_memApplication / $this->_memTotal * 100); } else { return 0; } } else { return null; } } /** * return percent of used memory for cache * * @see System::_memCache * @see System::_memTotal * * @return Integer */ public function getMemPercentCache() { if ($this->_memCache !== null) { if (($this->_memCache > 0) && ($this->_memTotal > 0)) { if (($this->_memApplication !== null) && ($this->_memApplication > 0)) { return round(($this->_memCache + $this->_memApplication) / $this->_memTotal * 100) - $this->getMemPercentApplication(); } else { return round($this->_memCache / $this->_memTotal * 100); } } else { return 0; } } else { return null; } } /** * return percent of used memory for buffer * * @see System::_memBuffer * @see System::_memTotal * * @return Integer */ public function getMemPercentBuffer() { if ($this->_memBuffer !== null) { if (($this->_memBuffer > 0) && ($this->_memTotal > 0)) { if (($this->_memCache !== null) && ($this->_memCache > 0)) { if (($this->_memApplication !== null) && ($this->_memApplication > 0)) { return round(($this->_memBuffer + $this->_memApplication + $this->_memCache) / $this->_memTotal * 100) - $this->getMemPercentApplication() - $this->getMemPercentCache(); } else { return round(($this->_memBuffer + $this->_memCache) / $this->_memTotal * 100) - $this->getMemPercentCache(); } } elseif (($this->_memApplication !== null) && ($this->_memApplication > 0)) { return round(($this->_memBuffer + $this->_memApplication) / $this->_memTotal * 100) - $this->getMemPercentApplication(); } else { return round($this->_memBuffer / $this->_memTotal * 100); } } else { return 0; } } else { return null; } } /** * Returns total free swap space * * @see System::_swapDevices * @see DiskDevice::getFree() * * @return Integer */ public function getSwapFree() { if (count($this->_swapDevices) > 0) { $free = 0; foreach ($this->_swapDevices as $dev) { $free += $dev->getFree(); } return $free; } return null; } /** * Returns total swap space * * @see System::_swapDevices * @see DiskDevice::getTotal() * * @return Integer */ public function getSwapTotal() { if (count($this->_swapDevices) > 0) { $total = 0; foreach ($this->_swapDevices as $dev) { $total += $dev->getTotal(); } return $total; } else { return null; } } /** * Returns total used swap space * * @see System::_swapDevices * @see DiskDevice::getUsed() * * @return Integer */ public function getSwapUsed() { if (count($this->_swapDevices) > 0) { $used = 0; foreach ($this->_swapDevices as $dev) { $used += $dev->getUsed(); } return $used; } else { return null; } } /** * return percent of total swap space used * * @see System::getSwapUsed() * @see System::getSwapTotal() * * @return Integer */ public function getSwapPercentUsed() { if ($this->getSwapTotal() !== null) { if ($this->getSwapTotal() > 0) { return round($this->getSwapUsed() / $this->getSwapTotal() * 100); } else { return 0; } } else { return null; } } /** * Returns $_distribution. * * @see System::$_distribution * * @return String */ public function getDistribution() { return $this->_distribution; } /** * Sets $_distribution. * * @param String $distribution distributionname * * @see System::$_distribution * * @return Void */ public function setDistribution($distribution) { $this->_distribution = $distribution; } /** * Returns $_distributionIcon. * * @see System::$_distributionIcon * * @return String */ public function getDistributionIcon() { return $this->_distributionIcon; } /** * Sets $_distributionIcon. * * @param String $distributionIcon distribution icon * * @see System::$_distributionIcon * * @return Void */ public function setDistributionIcon($distributionIcon) { $this->_distributionIcon = $distributionIcon; } /** * Returns $_hostname. * * @see System::$_hostname * * @return String */ public function getHostname() { return $this->_hostname; } /** * Sets $_hostname. * * @param String $hostname hostname * * @see System::$_hostname * * @return Void */ public function setHostname($hostname) { $this->_hostname = $hostname; } /** * Returns $_ip. * * @see System::$_ip * * @return String */ public function getIp() { return $this->_ip; } /** * Sets $_ip. * * @param String $ip IP * * @see System::$_ip * * @return Void */ public function setIp($ip) { $this->_ip = $ip; } /** * Returns $_kernel. * * @see System::$_kernel * * @return String */ public function getKernel() { return $this->_kernel; } /** * Sets $_kernel. * * @param String $kernel kernelname * * @see System::$_kernel * * @return Void */ public function setKernel($kernel) { $this->_kernel = $kernel; } /** * Returns $_load. * * @see System::$_load * * @return String */ public function getLoad() { return $this->_load; } /** * Sets $_load. * * @param String $load current system load * * @see System::$_load * * @return Void */ public function setLoad($load) { $this->_load = $load; } /** * Returns $_loadPercent. * * @see System::$_loadPercent * * @return Integer */ public function getLoadPercent() { return $this->_loadPercent; } /** * Sets $_loadPercent. * * @param Integer $loadPercent load percent * * @see System::$_loadPercent * * @return Void */ public function setLoadPercent($loadPercent) { $this->_loadPercent = $loadPercent; } /** * Returns $_machine. * * @see System::$_machine * * @return String */ public function getMachine() { return $this->_machine; } /** * Sets $_machine. * * @param Interger $machine machine * * @see System::$_machine * * @return Void */ public function setMachine($machine) { $this->_machine = $machine; } /** * Returns $_uptime. * * @see System::$_uptime * * @return Integer */ public function getUptime() { return $this->_uptime; } /** * Sets $_uptime. * * @param Interger $uptime uptime * * @see System::$_uptime * * @return Void */ public function setUptime($uptime) { $this->_uptime = $uptime; } /** * Returns $_users. * * @see System::$_users * * @return Integer */ public function getUsers() { return $this->_users; } /** * Sets $_users. * * @param Integer $users user count * * @see System::$_users * * @return Void */ public function setUsers($users) { $this->_users = $users; } /** * Returns $_cpus. * * @see System::$_cpus * * @return Array */ public function getCpus() { return $this->_cpus; } /** * Sets $_cpus. * * @param Cpu $cpus cpu device * * @see System::$_cpus * @see CpuDevice * * @return Void */ public function setCpus($cpus) { array_push($this->_cpus, $cpus); } /** * Returns $_pciDevices. * * @see System::$_pciDevices * * @return Array */ public function getPciDevices() { return $this->_pciDevices; } /** * Sets $_pciDevices. * * @param HWDevice $pciDevices pci device * * @see System::$_pciDevices * @see HWDevice * * @return Void */ public function setPciDevices($pciDevices) { array_push($this->_pciDevices, $pciDevices); } /** * Returns $_netDevices. * * @see System::$_netDevices * * @return Array */ public function getNetDevices() { return $this->_netDevices; } /** * Sets $_netDevices. * * @param NetDevice $netDevices network device * * @see System::$_netDevices * @see NetDevice * * @return Void */ public function setNetDevices($netDevices) { array_push($this->_netDevices, $netDevices); } /** * Returns $_ideDevices. * * @see System::$_ideDevices * * @return Array */ public function getIdeDevices() { return $this->_ideDevices; } /** * Sets $_ideDevices. * * @param HWDevice $ideDevices ide device * * @see System::$_ideDevices * @see HWDevice * * @return Void */ public function setIdeDevices($ideDevices) { array_push($this->_ideDevices, $ideDevices); } /** * Returns $_scsiDevices. * * @see System::$_scsiDevices * * @return Array */ public function getScsiDevices() { return $this->_scsiDevices; } /** * Sets $_scsiDevices. * * @param HWDevice $scsiDevices scsi devices * * @see System::$_scsiDevices * @see HWDevice * * @return Void */ public function setScsiDevices($scsiDevices) { array_push($this->_scsiDevices, $scsiDevices); } /** * Returns $_usbDevices. * * @see System::$_usbDevices * * @return Array */ public function getUsbDevices() { return $this->_usbDevices; } /** * Sets $_usbDevices. * * @param HWDevice $usbDevices usb device * * @see System::$_usbDevices * @see HWDevice * * @return Void */ public function setUsbDevices($usbDevices) { array_push($this->_usbDevices, $usbDevices); } /** * Returns $_diskDevices. * * @see System::$_diskDevices * * @return Array */ public function getDiskDevices() { return $this->_diskDevices; } /** * Sets $_diskDevices. * * @param DiskDevice $diskDevices disk device * * @see System::$_diskDevices * @see DiskDevice * * @return void */ public function setDiskDevices($diskDevices) { array_push($this->_diskDevices, $diskDevices); } /** * Returns $_memApplication. * * @see System::$_memApplication * * @return Integer */ public function getMemApplication() { return $this->_memApplication; } /** * Sets $_memApplication. * * @param Integer $memApplication application memory * * @see System::$_memApplication * * @return Void */ public function setMemApplication($memApplication) { $this->_memApplication = $memApplication; } /** * Returns $_memBuffer. * * @see System::$_memBuffer * * @return Integer */ public function getMemBuffer() { return $this->_memBuffer; } /** * Sets $_memBuffer. * * @param Integer $memBuffer buffer memory * * @see System::$_memBuffer * * @return Void */ public function setMemBuffer($memBuffer) { $this->_memBuffer = $memBuffer; } /** * Returns $_memCache. * * @see System::$_memCache * * @return Integer */ public function getMemCache() { return $this->_memCache; } /** * Sets $_memCache. * * @param Integer $memCache cache memory * * @see System::$_memCache * * @return Void */ public function setMemCache($memCache) { $this->_memCache = $memCache; } /** * Returns $_memFree. * * @see System::$_memFree * * @return Integer */ public function getMemFree() { return $this->_memFree; } /** * Sets $_memFree. * * @param Integer $memFree free memory * * @see System::$_memFree * * @return Void */ public function setMemFree($memFree) { $this->_memFree = $memFree; } /** * Returns $_memTotal. * * @see System::$_memTotal * * @return Integer */ public function getMemTotal() { return $this->_memTotal; } /** * Sets $_memTotal. * * @param Integer $memTotal total memory * * @see System::$_memTotal * * @return Void */ public function setMemTotal($memTotal) { $this->_memTotal = $memTotal; } /** * Returns $_memUsed. * * @see System::$_memUsed * * @return Integer */ public function getMemUsed() { return $this->_memUsed; } /** * Sets $_memUsed. * * @param Integer $memUsed used memory * * @see System::$_memUsed * * @return Void */ public function setMemUsed($memUsed) { $this->_memUsed = $memUsed; } /** * Returns $_swapDevices. * * @see System::$_swapDevices * * @return Array */ public function getSwapDevices() { return $this->_swapDevices; } /** * Sets $_swapDevices. * * @param DiskDevice $swapDevices swap devices * * @see System::$_swapDevices * @see DiskDevice * * @return Void */ public function setSwapDevices($swapDevices) { array_push($this->_swapDevices, $swapDevices); } /** * Returns $_processes. * * @see System::$_processes * * @return Array */ public function getProcesses() { return $this->_processes; } /** * Sets $_proceses. * * @param $processes array of types of processes * * @see System::$_processes * * @return Void */ public function setProcesses($processes) { $this->_processes = $processes; /* foreach ($processes as $proc_type=>$proc_count) { $this->_processes[$proc_type] = $proc_count; } */ } } phpsysinfo-3.2.1/includes/to/class.UPSInfo.inc.php000066400000000000000000000025101247443170600220250ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.UPSInfo.inc.php 329 2009-09-07 11:21:44Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * MBInfo TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class UPSInfo { /** * array with upsdivices * * @see UPSDevice * * @var Array */ private $_upsDevices = array(); /** * Returns $_upsDevices. * * @see UPSInfo::$_upsDevices * * @return Array */ public function getUpsDevices() { return $this->_upsDevices; } /** * Sets $_upsDevices. * * @param UPSDevice $upsDevices upsdevice * * @see UPSInfo::$_upsDevices * * @return Void */ public function setUpsDevices($upsDevices) { array_push($this->_upsDevices, $upsDevices); } } phpsysinfo-3.2.1/includes/to/device/000077500000000000000000000000001247443170600174165ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/to/device/class.CpuDevice.inc.php000066400000000000000000000136631247443170600236630ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.CpuDevice.inc.php 411 2010-12-28 22:32:52Z Jacky672 $ * @link http://phpsysinfo.sourceforge.net */ /** * CpuDevice TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class CpuDevice { /** * model of the cpu * * @var String */ private $_model = ""; /** * speed of the cpu in hertz * * @var Integer */ private $_cpuSpeed = 0; /** * max speed of the cpu in hertz * * @var Integer */ private $_cpuSpeedMax = 0; /** * min speed of the cpu in hertz * * @var Integer */ private $_cpuSpeedMin = 0; /** * cache size in bytes, if available * * @var Integer */ private $_cache = null; /** * virtualization, if available * * @var String */ private $_virt = null; /** * busspeed in hertz, if available * * @var Integer */ private $_busSpeed = null; /** * temperature of the cpu, if available * * @var Integer */ private $_temp = null; /** * bogomips of the cpu, if available * * @var Integer */ private $_bogomips = null; /** * current load in percent of the cpu, if available * * @var Integer */ private $_load = null; /** * Returns $_bogomips. * * @see Cpu::$_bogomips * * @return Integer */ public function getBogomips() { return $this->_bogomips; } /** * Sets $_bogomips. * * @param Integer $bogomips bogompis * * @see Cpu::$_bogomips * * @return Void */ public function setBogomips($bogomips) { $this->_bogomips = $bogomips; } /** * Returns $_busSpeed. * * @see Cpu::$_busSpeed * * @return Integer */ public function getBusSpeed() { return $this->_busSpeed; } /** * Sets $_busSpeed. * * @param Integer $busSpeed busspeed * * @see Cpu::$_busSpeed * * @return Void */ public function setBusSpeed($busSpeed) { $this->_busSpeed = $busSpeed; } /** * Returns $_cache. * * @see Cpu::$_cache * * @return Integer */ public function getCache() { return $this->_cache; } /** * Sets $_cache. * * @param Integer $cache cache size * * @see Cpu::$_cache * * @return Void */ public function setCache($cache) { $this->_cache = $cache; } /** * Returns $_virt. * * @see Cpu::$_virt * * @return String */ public function getVirt() { return $this->_virt; } /** * Sets $_virt. * * @param String $_virt * * @see Cpu::$_virt * * @return Void */ public function setVirt($virt) { $this->_virt = $virt; } /** * Returns $_cpuSpeed. * * @see Cpu::$_cpuSpeed * * @return Integer */ public function getCpuSpeed() { return $this->_cpuSpeed; } /** * Returns $_cpuSpeedMax. * * @see Cpu::$_cpuSpeedMAx * * @return Integer */ public function getCpuSpeedMax() { return $this->_cpuSpeedMax; } /** * Returns $_cpuSpeedMin. * * @see Cpu::$_cpuSpeedMin * * @return Integer */ public function getCpuSpeedMin() { return $this->_cpuSpeedMin; } /** * Sets $_cpuSpeed. * * @param Integer $cpuSpeed cpuspeed * * @see Cpu::$_cpuSpeed * * @return Void */ public function setCpuSpeed($cpuSpeed) { $this->_cpuSpeed = $cpuSpeed; } /** * Sets $_cpuSpeedMax. * * @param Integer $cpuSpeedMax cpuspeedmax * * @see Cpu::$_cpuSpeedMax * * @return Void */ public function setCpuSpeedMax($cpuSpeedMax) { $this->_cpuSpeedMax = $cpuSpeedMax; } /** * Sets $_cpuSpeedMin. * * @param Integer $cpuSpeedMin cpuspeedmin * * @see Cpu::$_cpuSpeedMin * * @return Void */ public function setCpuSpeedMin($cpuSpeedMin) { $this->_cpuSpeedMin = $cpuSpeedMin; } /** * Returns $_model. * * @see Cpu::$_model * * @return String */ public function getModel() { return $this->_model; } /** * Sets $_model. * * @param String $model cpumodel * * @see Cpu::$_model * * @return Void */ public function setModel($model) { $this->_model = $model; } /** * Returns $_temp. * * @see Cpu::$_temp * * @return Integer */ public function getTemp() { return $this->_temp; } /** * Sets $_temp. * * @param Integer $temp temperature * * @see Cpu::$_temp * * @return Void */ public function setTemp($temp) { $this->_temp = $temp; } /** * Returns $_load. * * @see CpuDevice::$_load * * @return Integer */ public function getLoad() { return $this->_load; } /** * Sets $_load. * * @param Integer $load load percent * * @see CpuDevice::$_load * * @return Void */ public function setLoad($load) { $this->_load = $load; } } phpsysinfo-3.2.1/includes/to/device/class.DiskDevice.inc.php000066400000000000000000000127021247443170600240170ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.DiskDevice.inc.php 252 2009-06-17 13:06:44Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * DiskDevice TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class DiskDevice { /** * name of the disk device * * @var String */ private $_name = ""; /** * type of the filesystem on the disk device * * @var String */ private $_fsType = ""; /** * diskspace that is free in bytes * * @var Integer */ private $_free = 0; /** * diskspace that is used in bytes * * @var Integer */ private $_used = 0; /** * total diskspace * * @var Integer */ private $_total = 0; /** * mount point of the disk device if available * * @var String */ private $_mountPoint = null; /** * additional options of the device, like mount options * * @var String */ private $_options = null; /** * inodes usage in percent if available * * @var */ private $_percentInodesUsed = null; /** * Returns PercentUsed calculated when function is called from internal values * * @see DiskDevice::$_total * @see DiskDevice::$_used * * @return Integer */ public function getPercentUsed() { if ($this->_total > 0) { return round($this->_used / $this->_total * 100); } else { return 0; } } /** * Returns $_PercentInodesUsed. * * @see DiskDevice::$_PercentInodesUsed * * @return Integer */ public function getPercentInodesUsed() { return $this->_percentInodesUsed; } /** * Sets $_PercentInodesUsed. * * @param Integer $percentInodesUsed inodes percent * * @see DiskDevice::$_PercentInodesUsed * * @return Void */ public function setPercentInodesUsed($percentInodesUsed) { $this->_percentInodesUsed = $percentInodesUsed; } /** * Returns $_free. * * @see DiskDevice::$_free * * @return Integer */ public function getFree() { return $this->_free; } /** * Sets $_free. * * @param Integer $free free bytes * * @see DiskDevice::$_free * * @return Void */ public function setFree($free) { $this->_free = $free; } /** * Returns $_fsType. * * @see DiskDevice::$_fsType * * @return String */ public function getFsType() { return $this->_fsType; } /** * Sets $_fsType. * * @param String $fsType filesystemtype * * @see DiskDevice::$_fsType * * @return Void */ public function setFsType($fsType) { $this->_fsType = $fsType; } /** * Returns $_mountPoint. * * @see DiskDevice::$_mountPoint * * @return String */ public function getMountPoint() { return $this->_mountPoint; } /** * Sets $_mountPoint. * * @param String $mountPoint mountpoint * * @see DiskDevice::$_mountPoint * * @return Void */ public function setMountPoint($mountPoint) { $this->_mountPoint = $mountPoint; } /** * Returns $_name. * * @see DiskDevice::$_name * * @return String */ public function getName() { return $this->_name; } /** * Sets $_name. * * @param String $name device name * * @see DiskDevice::$_name * * @return Void */ public function setName($name) { $this->_name = $name; } /** * Returns $_options. * * @see DiskDevice::$_options * * @return String */ public function getOptions() { return $this->_options; } /** * Sets $_options. * * @param String $options additional options * * @see DiskDevice::$_options * * @return Void */ public function setOptions($options) { $this->_options = $options; } /** * Returns $_total. * * @see DiskDevice::$_total * * @return Integer */ public function getTotal() { return $this->_total; } /** * Sets $_total. * * @param Integer $total total bytes * * @see DiskDevice::$_total * * @return Void */ public function setTotal($total) { $this->_total = $total; } /** * Returns $_used. * * @see DiskDevice::$_used * * @return Integer */ public function getUsed() { return $this->_used; } /** * Sets $_used. * * @param Integer $used used bytes * * @see DiskDevice::$_used * * @return Void */ public function setUsed($used) { $this->_used = $used; } } phpsysinfo-3.2.1/includes/to/device/class.HWDevice.inc.php000066400000000000000000000052471247443170600234510ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.HWDevice.inc.php 255 2009-06-17 13:39:41Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * HWDevice TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class HWDevice { /** * name of the device * * @var String */ private $_name = ""; /** * capacity of the device, if not available it will be null * * @var Integer */ private $_capacity = null; /** * count of the device * * @var Integer */ private $_count = 1; /** * compare a given device with the internal one * * @param HWDevice $dev device that should be compared * * @return boolean */ public function equals(HWDevice $dev) { if ($dev->getName() === $this->_name && $dev->getCapacity() === $this->_capacity) { return true; } else { return false; } } /** * Returns $_capacity. * * @see HWDevice::$_capacity * * @return Integer */ public function getCapacity() { return $this->_capacity; } /** * Sets $_capacity. * * @param Integer $capacity device capacity * * @see HWDevice::$_capacity * * @return Void */ public function setCapacity($capacity) { $this->_capacity = $capacity; } /** * Returns $_name. * * @see HWDevice::$_name * * @return String */ public function getName() { return $this->_name; } /** * Sets $_name. * * @param String $name device name * * @see HWDevice::$_name * * @return Void */ public function setName($name) { $this->_name = $name; } /** * Returns $_count. * * @see HWDevice::$_count * * @return Integer */ public function getCount() { return $this->_count; } /** * Sets $_count. * * @param Integer $count device count * * @see HWDevice::$_count * * @return Void */ public function setCount($count) { $this->_count = $count; } } phpsysinfo-3.2.1/includes/to/device/class.NetDevice.inc.php000066400000000000000000000074211247443170600236550ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.NetDevice.inc.php 547 2012-03-22 09:44:38Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * NetDevice TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class NetDevice { /** * name of the device * * @var String */ private $_name = ""; /** * transmitted bytes * * @var Integer */ private $_txBytes = 0; /** * received bytes * * @var Integer */ private $_rxBytes = 0; /** * counted error packages * * @var Integer */ private $_errors = 0; /** * counted droped packages * * @var Integer */ private $_drops = 0; /** * string with info * * @var String */ private $_info = null; /** * Returns $_drops. * * @see NetDevice::$_drops * * @return Integer */ public function getDrops() { return $this->_drops; } /** * Sets $_drops. * * @param Integer $drops dropped packages * * @see NetDevice::$_drops * * @return Void */ public function setDrops($drops) { $this->_drops = $drops; } /** * Returns $_errors. * * @see NetDevice::$_errors * * @return Integer */ public function getErrors() { return $this->_errors; } /** * Sets $_errors. * * @param Integer $errors error packages * * @see NetDevice::$_errors * * @return Void */ public function setErrors($errors) { $this->_errors = $errors; } /** * Returns $_name. * * @see NetDevice::$_name * * @return String */ public function getName() { return $this->_name; } /** * Sets $_name. * * @param String $name device name * * @see NetDevice::$_name * * @return Void */ public function setName($name) { $this->_name = $name; } /** * Returns $_rxBytes. * * @see NetDevice::$_rxBytes * * @return Integer */ public function getRxBytes() { return $this->_rxBytes; } /** * Sets $_rxBytes. * * @param Integer $rxBytes received bytes * * @see NetDevice::$_rxBytes * * @return Void */ public function setRxBytes($rxBytes) { $this->_rxBytes = $rxBytes; } /** * Returns $_txBytes. * * @see NetDevice::$_txBytes * * @return Integer */ public function getTxBytes() { return $this->_txBytes; } /** * Sets $_txBytes. * * @param Integer $txBytes transmitted bytes * * @see NetDevice::$_txBytes * * @return Void */ public function setTxBytes($txBytes) { $this->_txBytes = $txBytes; } /** * Returns $_info. * * @see NetDevice::$_info * * @return String */ public function getInfo() { return $this->_info; } /** * Sets $_info. * * @param String $info info string * * @see NetDevice::$_info * * @return Void */ public function setInfo($info) { $this->_info = $info; } } phpsysinfo-3.2.1/includes/to/device/class.SensorDevice.inc.php000066400000000000000000000062661247443170600244060ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.SensorDevice.inc.php 592 2012-07-03 10:55:51Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * SensorDevice TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class SensorDevice { /** * name of the sensor * * @var String */ private $_name = ""; /** * current value of the sensor * * @var Integer */ private $_value = 0; /** * maximum value of the sensor * * @var Integer */ private $_max = null; /** * minimum value of the sensor * * @var Integer */ private $_min = null; /** * event of the sensor * * @var String */ private $_event = ""; /** * Returns $_max. * * @see Sensor::$_max * * @return Integer */ public function getMax() { return $this->_max; } /** * Sets $_max. * * @param Integer $max maximum value * * @see Sensor::$_max * * @return Void */ public function setMax($max) { $this->_max = $max; } /** * Returns $_min. * * @see Sensor::$_min * * @return Integer */ public function getMin() { return $this->_min; } /** * Sets $_min. * * @param Integer $min minimum value * * @see Sensor::$_min * * @return Void */ public function setMin($min) { $this->_min = $min; } /** * Returns $_name. * * @see Sensor::$_name * * @return String */ public function getName() { return $this->_name; } /** * Sets $_name. * * @param String $name sensor name * * @see Sensor::$_name * * @return Void */ public function setName($name) { $this->_name = $name; } /** * Returns $_value. * * @see Sensor::$_value * * @return Integer */ public function getValue() { return $this->_value; } /** * Sets $_value. * * @param Integer $value current value * * @see Sensor::$_value * * @return Void */ public function setValue($value) { $this->_value = $value; } /** * Returns $_event. * * @see Sensor::$_event * * @return String */ public function getEvent() { return $this->_event; } /** * Sets $_event. * * @param String $event sensor event * * @see Sensor::$_event * * @return Void */ public function setEvent($event) { $this->_event = $event; } } phpsysinfo-3.2.1/includes/to/device/class.UPSDevice.inc.php000066400000000000000000000227201247443170600235750ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.UPSDevice.inc.php 262 2009-06-22 10:48:33Z bigmichi1 $ * @link http://phpsysinfo.sourceforge.net */ /** * UPSDevice TO class * * @category PHP * @package PSI_TO * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class UPSDevice { /** * name of the ups * * @var String */ private $_name = ""; /** * model of the ups * * @var String */ private $_model = ""; /** * mode of the ups * * @var String */ private $_mode = ""; /** * last start time * * @var String */ private $_startTime = ""; /** * status of the ups * * @var String */ private $_status = ""; /** * temperature of the ups * * @var Integer */ private $_temperatur = null; /** * outages count * * @var Integer */ private $_outages = null; /** * date of last outtage * * @var String */ private $_lastOutage = null; /** * date of last outage finish * * @var String */ private $_lastOutageFinish = null; /** * line volt * * @var Integer */ private $_lineVoltage = null; /** * line freq * * @var Integer */ private $_lineFrequency = null; /** * current load of the ups in percent * * @var Integer */ private $_load = null; /** * battery installation date * * @var String */ private $_batteryDate = null; /** * current battery volt * * @var Integer */ private $_batteryVoltage = null; /** * current charge in percent of the battery * * @var Integer */ private $_batterCharge = null; /** * time left * * @var String */ private $_timeLeft = null; /** * Returns $_batterCharge. * * @see UPSDevice::$_batterCharge * * @return integer */ public function getBatterCharge() { return $this->_batterCharge; } /** * Sets $_batterCharge. * * @param Integer $batterCharge battery charge * * @see UPSDevice::$_batterCharge * * @return void */ public function setBatterCharge($batterCharge) { $this->_batterCharge = $batterCharge; } /** * Returns $_batteryDate. * * @see UPSDevice::$_batteryDate * * @return String */ public function getBatteryDate() { return $this->_batteryDate; } /** * Sets $_batteryDate. * * @param object $batteryDate battery date * * @see UPSDevice::$_batteryDate * * @return Void */ public function setBatteryDate($batteryDate) { $this->_batteryDate = $batteryDate; } /** * Returns $_batteryVoltage. * * @see UPSDevice::$_batteryVoltage * * @return Integer */ public function getBatteryVoltage() { return $this->_batteryVoltage; } /** * Sets $_batteryVoltage. * * @param object $batteryVoltage battery volt * * @see UPSDevice::$_batteryVoltage * * @return Void */ public function setBatteryVoltage($batteryVoltage) { $this->_batteryVoltage = $batteryVoltage; } /** * Returns $_lastOutage. * * @see UPSDevice::$_lastOutage * * @return String */ public function getLastOutage() { return $this->_lastOutage; } /** * Sets $_lastOutage. * * @param String $lastOutage last Outage * * @see UPSDevice::$lastOutage * * @return Void */ public function setLastOutage($lastOutage) { $this->_lastOutage = $lastOutage; } /** * Returns $_lastOutageFinish. * * @see UPSDevice::$_lastOutageFinish * * @return String */ public function getLastOutageFinish() { return $this->_lastOutageFinish; } /** * Sets $_lastOutageFinish. * * @param String $lastOutageFinish last outage finish * * @see UPSDevice::$_lastOutageFinish * * @return Void */ public function setLastOutageFinish($lastOutageFinish) { $this->_lastOutageFinish = $lastOutageFinish; } /** * Returns $_lineVoltage. * * @see UPSDevice::$_lineVoltage * * @return Integer */ public function getLineVoltage() { return $this->_lineVoltage; } /** * Sets $_lineVoltage. * * @param Integer $lineVoltage line voltage * * @see UPSDevice::$_lineVoltage * * @return Void */ public function setLineVoltage($lineVoltage) { $this->_lineVoltage = $lineVoltage; } /** * Returns $_lineFrequency. * * @see UPSDevice::$_lineFrequency * * @return Integer */ public function getLineFrequency() { return $this->_lineFrequency; } /** * Sets $_lineFrequency. * * @param Integer $lineFrequency line frequency * * @see UPSDevice::$_lineFrequency * * @return Void */ public function setLineFrequency($lineFrequency) { $this->_lineFrequency = $lineFrequency; } /** * Returns $_load. * * @see UPSDevice::$_load * * @return Integer */ public function getLoad() { return $this->_load; } /** * Sets $_load. * * @param Integer $load current load * * @see UPSDevice::$_load * * @return Void */ public function setLoad($load) { $this->_load = $load; } /** * Returns $_mode. * * @see UPSDevice::$_mode * * @return String */ public function getMode() { return $this->_mode; } /** * Sets $_mode. * * @param String $mode mode * * @see UPSDevice::$_mode * * @return Void */ public function setMode($mode) { $this->_mode = $mode; } /** * Returns $_model. * * @see UPSDevice::$_model * * @return String */ public function getModel() { return $this->_model; } /** * Sets $_model. * * @param String $model model * * @see UPSDevice::$_model * * @return Void */ public function setModel($model) { $this->_model = $model; } /** * Returns $_name. * * @see UPSDevice::$_name * * @return String */ public function getName() { return $this->_name; } /** * Sets $_name. * * @param String $name name * * @see UPSDevice::$_name * * @return Void */ public function setName($name) { $this->_name = $name; } /** * Returns $_outages. * * @see UPSDevice::$_outages * * @return Integer */ public function getOutages() { return $this->_outages; } /** * Sets $_outages. * * @param Integer $outages outages count * * @see UPSDevice::$_outages * * @return Void */ public function setOutages($outages) { $this->_outages = $outages; } /** * Returns $_startTime. * * @see UPSDevice::$_startTime * * @return String */ public function getStartTime() { return $this->_startTime; } /** * Sets $_startTime. * * @param String $startTime startTime * * @see UPSDevice::$_startTime * * @return Void */ public function setStartTime($startTime) { $this->_startTime = $startTime; } /** * Returns $_status. * * @see UPSDevice::$_status * * @return String */ public function getStatus() { return $this->_status; } /** * Sets $_status. * * @param String $status status * * @see UPSDevice::$_status * * @return Void */ public function setStatus($status) { $this->_status = $status; } /** * Returns $_temperatur. * * @see UPSDevice::$_temperatur * * @return Integer */ public function getTemperatur() { return $this->_temperatur; } /** * Sets $_temperatur. * * @param Integer $temperatur temperature * * @see UPSDevice::$_temperatur * * @return Void */ public function setTemperatur($temperatur) { $this->_temperatur = $temperatur; } /** * Returns $_timeLeft. * * @see UPSDevice::$_timeLeft * * @return String */ public function getTimeLeft() { return $this->_timeLeft; } /** * Sets $_timeLeft. * * @param String $timeLeft time left * * @see UPSDevice::$_timeLeft * * @return Void */ public function setTimeLeft($timeLeft) { $this->_timeLeft = $timeLeft; } } phpsysinfo-3.2.1/includes/ups/000077500000000000000000000000001247443170600163445ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/ups/class.apcupsd.inc.php000066400000000000000000000115151247443170600223730ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.apcupsd.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting ups information from apcupsd program * * @category PHP * @package PSI_UPS * @author Michael Cramer * @author Artem Volk * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Apcupsd extends UPS { /** * internal storage for all gathered data * * @var Array */ private $_output = array(); /** * get all information from all configured ups in phpsysinfo.ini and store output in internal array */ public function __construct() { parent::__construct(); if ( defined('PSI_UPS_APCUPSD_LIST') && is_string(PSI_UPS_APCUPSD_LIST) ) { if (preg_match(ARRAY_EXP, PSI_UPS_APCUPSD_LIST)) { $upses = eval(PSI_UPS_APCUPSD_LIST); } else { $upses = array(PSI_UPS_APCUPSD_LIST); } foreach ($upses as $ups) { CommonFunctions::executeProgram('apcaccess', 'status '.trim($ups), $temp); if (! empty($temp)) { $this->_output[] = $temp; } } } else { //use default if address and port not defined CommonFunctions::executeProgram('apcaccess', 'status', $temp); if (! empty($temp)) { $this->_output[] = $temp; } } } /** * parse the input and store data in resultset for xml generation * * @return Void */ private function _info() { foreach ($this->_output as $ups) { $dev = new UPSDevice(); // General info if (preg_match('/^UPSNAME\s*:\s*(.*)$/m', $ups, $data)) { $dev->setName(trim($data[1])); } if (preg_match('/^MODEL\s*:\s*(.*)$/m', $ups, $data)) { $model=trim($data[1]); if (preg_match('/^APCMODEL\s*:\s*(.*)$/m', $ups, $data)) { $dev->setModel($model.' ('.trim($data[1]).')'); } else { $dev->setModel($model); } } if (preg_match('/^UPSMODE\s*:\s*(.*)$/m', $ups, $data)) { $dev->setMode(trim($data[1])); } if (preg_match('/^STARTTIME\s*:\s*(.*)$/m', $ups, $data)) { $dev->setStartTime(trim($data[1])); } if (preg_match('/^STATUS\s*:\s*(.*)$/m', $ups, $data)) { $dev->setStatus(trim($data[1])); } if (preg_match('/^ITEMP\s*:\s*(.*)$/m', $ups, $data)) { $dev->setTemperatur(trim($data[1])); } // Outages if (preg_match('/^NUMXFERS\s*:\s*(.*)$/m', $ups, $data)) { $dev->setOutages(trim($data[1])); } if (preg_match('/^LASTXFER\s*:\s*(.*)$/m', $ups, $data)) { $dev->setLastOutage(trim($data[1])); } if (preg_match('/^XOFFBATT\s*:\s*(.*)$/m', $ups, $data)) { $dev->setLastOutageFinish(trim($data[1])); } // Line if (preg_match('/^LINEV\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { $dev->setLineVoltage(trim($data[1])); } if (preg_match('/^LINEFREQ\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { $dev->setLineFrequency(trim($data[1])); } if (preg_match('/^LOADPCT\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { $dev->setLoad(trim($data[1])); } // Battery if (preg_match('/^BATTDATE\s*:\s*(.*)$/m', $ups, $data)) { $dev->setBatteryDate(trim($data[1])); } if (preg_match('/^BATTV\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { $dev->setBatteryVoltage(trim($data[1])); } if (preg_match('/^BCHARGE\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { $dev->setBatterCharge(trim($data[1])); } if (preg_match('/^TIMELEFT\s*:\s*(\d*\.\d*)(.*)$/m', $ups, $data)) { $dev->setTimeLeft(trim($data[1])); } $this->upsinfo->setUpsDevices($dev); } } /** * get the information * * @see PSI_Interface_UPS::build() * * @return Void */ public function build() { $this->_info(); } } phpsysinfo-3.2.1/includes/ups/class.nut.inc.php000066400000000000000000000114151247443170600215410ustar00rootroot00000000000000 * @author Anders Häggström * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.nut.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting ups information from upsc program * * @category PHP * @package PSI_UPS * @author Artem Volk * @author Anders Häggström * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Nut extends UPS { /** * internal storage for all gathered data * * @var array */ private $_output = array(); /** * get all information from all configured ups and store output in internal array */ public function __construct() { parent::__construct(); if ( defined('PSI_UPS_NUT_LIST') && is_string(PSI_UPS_NUT_LIST) ) { if (preg_match(ARRAY_EXP, PSI_UPS_NUT_LIST)) { $upses = eval(PSI_UPS_NUT_LIST); } else { $upses = array(PSI_UPS_NUT_LIST); } foreach ($upses as $ups) { CommonFunctions::executeProgram('upsc', '-l '.trim($ups), $output); $ups_names = preg_split("/\n/", $output, -1, PREG_SPLIT_NO_EMPTY); foreach ($ups_names as $ups_name) { CommonFunctions::executeProgram('upsc', trim($ups_name).'@'.trim($ups), $temp); if (! empty($temp)) { $this->_output[trim($ups_name).'@'.trim($ups)] = $temp; } } } } else { //use default if address and port not defined CommonFunctions::executeProgram('upsc', '-l', $output); $ups_names = preg_split("/\n/", $output, -1, PREG_SPLIT_NO_EMPTY); foreach ($ups_names as $ups_name) { CommonFunctions::executeProgram('upsc', trim($ups_name), $temp); if (! empty($temp)) { $this->_output[trim($ups_name)] = $temp; } } } } /** * parse the input and store data in resultset for xml generation * * @return array */ private function _info() { if (! empty($this->_output)) { foreach ($this->_output as $name=>$value) { $temp = preg_split("/\n/", $value, -1, PREG_SPLIT_NO_EMPTY); $ups_data = array(); foreach ($temp as $value) { $line = preg_split('/: /', $value, 2); $ups_data[$line[0]] = isset($line[1]) ? trim($line[1]) : ''; } $dev = new UPSDevice(); //General $dev->setName($name); if (isset($ups_data['ups.model'])) { $dev->setModel($ups_data['ups.model']); } if (isset($ups_data['driver.name'])) { $dev->setMode($ups_data['driver.name']); } if (isset($ups_data['ups.status'])) { $dev->setStatus($ups_data['ups.status']); } //Line if (isset($ups_data['input.voltage'])) { $dev->setLineVoltage($ups_data['input.voltage']); } if (isset($ups_data['input.frequency'])) { $dev->setLineFrequency($ups_data['input.frequency']); } if (isset($ups_data['ups.load'])) { $dev->setLoad($ups_data['ups.load']); } //Battery if (isset($ups_data['battery.voltage'])) { $dev->setBatteryVoltage($ups_data['battery.voltage']); } if (isset($ups_data['battery.charge'])) { $dev->setBatterCharge($ups_data['battery.charge']); } if (isset($ups_data['battery.runtime'])) { $dev->setTimeLeft(round($ups_data['battery.runtime']/60, 2)); } //Temperature if (isset($ups_data['ups.temperature'])) { $dev->setTemperatur($ups_data['ups.temperature']); } $this->upsinfo->setUpsDevices($dev); } } } /** * get the information * * @see PSI_Interface_UPS::build() * * @return Void */ public function build() { $this->_info(); } } phpsysinfo-3.2.1/includes/ups/class.pmset.inc.php000066400000000000000000000047101247443170600220630ustar00rootroot00000000000000 * @copyright 2014 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.nut.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting ups information from pmset program * * @category PHP * @package PSI_UPS * @author Robert Pelletier * @copyright 2014 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class Pmset extends UPS { /** * internal storage for all gathered data * * @var array */ private $_output = array(); /** * get all information from all configured ups and store output in internal array */ public function __construct() { parent::__construct(); CommonFunctions::executeProgram('pmset', '-g batt', $temp); if (! empty($temp)) { $this->_output[] = $temp; } } /** * parse the input and store data in resultset for xml generation * * @return array */ private function _info() { $model = array(); $percCharge = array(); $lines = explode(PHP_EOL, implode($this->_output)); $dev = new UPSDevice(); $model = explode('FW:', $lines[1]); if (strpos($model[0], 'InternalBattery') === FALSE) { $percCharge = explode(';', $lines[1]); $dev->setName('UPS'); if ($model !== FALSE) { $dev->setModel(substr(trim($model[0]), 1)); } if ($percCharge !== FALSE) { $dev->setBatterCharge(trim(substr($percCharge[0], -4, 3))); $dev->setStatus(trim($percCharge[1])); if (isset($percCharge[2])) { $time = explode(':', $percCharge[2]); $hours = $time[0]; $minutes = $hours*60+substr($time[1], 0, 2); $dev->setTimeLeft($minutes); } } $this->upsinfo->setUpsDevices($dev); } } /** * get the information * * @see PSI_Interface_UPS::build() * * @return Void */ public function build() { $this->_info(); } } phpsysinfo-3.2.1/includes/ups/class.powersoftplus.inc.php000066400000000000000000000071141247443170600236700ustar00rootroot00000000000000 * @copyright 2014 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.powersoftplus.inc.php 661 2014-06-13 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * getting ups information from powersoftplus program * * @category PHP * @package PSI_UPS * @author Mieczyslaw Nalewaj * @copyright 2014 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class PowerSoftPlus extends UPS { /** * internal storage for all gathered data * * @var Array */ private $_output = array(); /** * get all information from all configured ups in phpsysinfo.ini and store output in internal array */ public function __construct() { parent::__construct(); CommonFunctions::executeProgram('powersoftplus', '-p', $temp); if (! empty($temp)) { $this->_output[] = $temp; } } /** * parse the input and store data in resultset for xml generation * * @return Void */ private function _info() { foreach ($this->_output as $ups) { $dev = new UPSDevice(); // General info $dev->setName("EVER"); $dev->setMode("PowerSoftPlus"); $maxpwr = 0; $load = null; if (preg_match('/^Identifier: UPS Model\s*:\s*(.*)$/m', $ups, $data)) { $dev->setModel(trim($data[1])); if (preg_match('/\s(\d*)[^\d]*$/', trim($data[1]), $number)) { $maxpwr=$number[1]*0.65; } } if (preg_match('/^Current UPS state\s*:\s*(.*)$/m', $ups, $data)) { $dev->setStatus(trim($data[1])); } if (preg_match('/^Output load\s*:\s*(.*)\s\[\%\]$/m', $ups, $data)) { $load = trim($data[1]); } //wrong Output load issue if (($load == 0) && ( $maxpwr != 0 ) && preg_match('/^Effective power\s*:\s*(.*)\s\[W\]$/m', $ups, $data)) { $load = 100.0*trim($data[1])/$maxpwr; } if ($load != null) { $dev->setLoad($load); } // Battery if (preg_match('/^Battery voltage\s*:\s*(.*)\s\[Volt\]$/m', $ups, $data)) { $dev->setBatteryVoltage(trim($data[1])); } if (preg_match('/^Battery state\s*:\s*(.*)$/m', $ups, $data)) { if (preg_match('/^At full capacity$/', trim($data[1]))) { $dev->setBatterCharge(100); } elseif (preg_match('/^(Discharged)|(Depleted)$/', trim($data[1]))) { $dev->setBatterCharge(0); } } // Line if (preg_match('/^Input voltage\s*:\s*(.*)\s\[Volt\]$/m', $ups, $data)) { $dev->setLineVoltage(trim($data[1])); } if (preg_match('/^Input frequency\s*:\s*(.*)\s\[Hz\]$/m', $ups, $data)) { $dev->setLineFrequency(trim($data[1])); } $this->upsinfo->setUpsDevices($dev); } } /** * get the information * * @see PSI_Interface_UPS::build() * * @return Void */ public function build() { $this->_info(); } } phpsysinfo-3.2.1/includes/ups/class.ups.inc.php000066400000000000000000000026301247443170600215410ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.ups.inc.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * Basic UPS functions for all UPS classes * * @category PHP * @package PSI_UPS * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ abstract class UPS implements PSI_Interface_UPS { /** * object for error handling * * @var Error */ protected $error; /** * main object for ups information * * @var UPSInfo */ protected $upsinfo; /** * build the global Error object */ public function __construct() { $this->error = Error::singleton(); $this->upsinfo = new UPSInfo(); } /** * build and return the ups information * * @see PSI_Interface_UPS::getUPSInfo() * * @return UPSInfo */ final public function getUPSInfo() { $this->build(); return $this->upsinfo; } } phpsysinfo-3.2.1/includes/xml/000077500000000000000000000000001247443170600163355ustar00rootroot00000000000000phpsysinfo-3.2.1/includes/xml/class.SimpleXMLExtended.inc.php000066400000000000000000000170031247443170600242160ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.SimpleXMLExtended.inc.php 610 2012-07-11 19:12:12Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * class extends the SimpleXML element for including some special functions, like encoding stuff and cdata support * * @category PHP * @package PSI_XML * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class SimpleXMLExtended { /** * store the encoding that is used for conversation to utf8 * * @var String base encoding */ private $_encoding = null; /** * SimpleXMLElement to which every call is delegated * * @var SimpleXMLElement delegated SimpleXMLElement */ private $_SimpleXmlElement = null; /** * _CP437toUTF8Table for code page conversion for CP437 * * @var _CP437toUTF8Table array */ private static $_CP437toUTF8Table = array( "\xC3\x87","\xC3\xBC","\xC3\xA9","\xC3\xA2", "\xC3\xA4","\xC3\xA0","\xC3\xA5","\xC3\xA7", "\xC3\xAA","\xC3\xAB","\xC3\xA8","\xC3\xAF", "\xC3\xAE","\xC3\xAC","\xC3\x84","\xC3\x85", "\xC3\x89","\xC3\xA6","\xC3\x86","\xC3\xB4", "\xC3\xB6","\xC3\xB2","\xC3\xBB","\xC3\xB9", "\xC3\xBF","\xC3\x96","\xC3\x9C","\xC3\xA2", "\xC2\xA3","\xC3\xA5","\xE2\x82\xA7","\xC6\x92", "\xC3\xA1","\xC3\xAD","\xC3\xB3","\xC3\xBA", "\xC3\xB1","\xC3\x91","\xC2\xAA","\xC2\xBA", "\xC2\xBF","\xE2\x8C\x90","\xC2\xAC","\xC2\xBD", "\xC2\xBC","\xC2\xA1","\xC2\xAB","\xC2\xBB", "\xE2\x96\x91","\xE2\x96\x92","\xE2\x96\x93","\xE2\x94\x82", "\xE2\x94\xA4","\xE2\x95\xA1","\xE2\x95\xA2","\xE2\x95\x96", "\xE2\x95\x95","\xE2\x95\xA3","\xE2\x95\x91","\xE2\x95\x97", "\xE2\x95\x9D","\xE2\x95\x9C","\xE2\x95\x9B","\xE2\x94\x90", "\xE2\x94\x94","\xE2\x94\xB4","\xE2\x94\xAC","\xE2\x94\x9C", "\xE2\x94\x80","\xE2\x94\xBC","\xE2\x95\x9E","\xE2\x95\x9F", "\xE2\x95\x9A","\xE2\x95\x94","\xE2\x95\xA9","\xE2\x95\xA6", "\xE2\x95\xA0","\xE2\x95\x90","\xE2\x95\xAC","\xE2\x95\xA7", "\xE2\x95\xA8","\xE2\x95\xA4","\xE2\x95\xA5","\xE2\x95\x99", "\xE2\x95\x98","\xE2\x95\x92","\xE2\x95\x93","\xE2\x95\xAB", "\xE2\x95\xAA","\xE2\x94\x98","\xE2\x94\x8C","\xE2\x96\x88", "\xE2\x96\x84","\xE2\x96\x8C","\xE2\x96\x90","\xE2\x96\x80", "\xCE\xB1","\xC3\x9F","\xCE\x93","\xCF\x80", "\xCE\xA3","\xCF\x83","\xC2\xB5","\xCF\x84", "\xCE\xA6","\xCE\x98","\xCE\xA9","\xCE\xB4", "\xE2\x88\x9E","\xCF\x86","\xCE\xB5","\xE2\x88\xA9", "\xE2\x89\xA1","\xC2\xB1","\xE2\x89\xA5","\xE2\x89\xA4", "\xE2\x8C\xA0","\xE2\x8C\xA1","\xC3\xB7","\xE2\x89\x88", "\xC2\xB0","\xE2\x88\x99","\xC2\xB7","\xE2\x88\x9A", "\xE2\x81\xBF","\xC2\xB2","\xE2\x96\xA0","\xC2\xA0"); /** * create a new extended SimpleXMLElement and set encoding if specified * * @param SimpleXMLElement $xml base xml element * @param String $encoding base encoding that should be used for conversation to utf8 * * @return void */ public function __construct($xml, $encoding = null) { if ($encoding != null) { $this->_encoding = $encoding; } $this->_SimpleXmlElement = $xml; } /** * insert a child element with or without a value, also doing conversation of name and if value is set to utf8 * * @param String $name name of the child element * @param String $value a value that should be insert to the child * * @return SimpleXMLExtended extended child SimpleXMLElement */ public function addChild($name, $value = null) { $nameUtf8 = $this->_toUTF8($name); if ($value == null) { return new SimpleXMLExtended($this->_SimpleXmlElement->addChild($nameUtf8), $this->_encoding); } else { $valueUtf8 = htmlspecialchars($this->_toUTF8($value)); return new SimpleXMLExtended($this->_SimpleXmlElement->addChild($nameUtf8, $valueUtf8), $this->_encoding); } } /** * insert a child with cdata section * * @param String $name name of the child element * @param String $cdata data for CDATA section * * @return SimpleXMLExtended extended child SimpleXMLElement */ public function addCData($name, $cdata) { $nameUtf8 = $this->_toUTF8($name); $node = $this->_SimpleXmlElement->addChild($nameUtf8); $domnode = dom_import_simplexml($node); $no = $domnode->ownerDocument; $domnode->appendChild($no->createCDATASection($cdata)); return new SimpleXMLExtended($node, $this->_encoding); } /** * add a attribute to a child and convert name and value to utf8 * * @param String $name name of the attribute * @param String $value value of the attribute * * @return Void */ public function addAttribute($name, $value) { $nameUtf8 = $this->_toUTF8($name); $valueUtf8 = htmlspecialchars($this->_toUTF8($value)); $this->_SimpleXmlElement->addAttribute($nameUtf8, $valueUtf8); } /** * append a xml-tree to another xml-tree * * @param SimpleXMLElement $new_child child that should be appended * * @return Void */ public function combinexml(SimpleXMLElement $new_child) { $node1 = dom_import_simplexml($this->_SimpleXmlElement); $dom_sxe = dom_import_simplexml($new_child); $node2 = $node1->ownerDocument->importNode($dom_sxe, true); $node1->appendChild($node2); } /** * convert a string into an UTF-8 string * * @param String $str string to convert * * @return String UTF-8 string */ private function _toUTF8($str) { if ($this->_encoding != null) { if (strcasecmp($this->_encoding,"UTF-8") == 0) { return trim($str); } elseif (strcasecmp($this->_encoding,"CP437") == 0) { $str = trim($str); $strr = ""; if (($strl = strlen($str)) > 0) for ($i = 0; $i < $strl; $i++) { $strc = substr($str, $i, 1); if ($strc < 128) $strr.=$strc; else $strr.=$_CP437toUTF8Table[$strc-128]; } return $strr; } else { $enclist = mb_list_encodings(); if (in_array($this->_encoding, $enclist)) { return mb_convert_encoding(trim($str), 'UTF-8', $this->_encoding); } elseif (function_exists("iconv")) { return iconv($this->_encoding, 'UTF-8', trim($str)); } else { return mb_convert_encoding(trim($str), 'UTF-8'); } } } else { return mb_convert_encoding(trim($str), 'UTF-8'); } } /** * Returns the SimpleXmlElement * * @return SimpleXmlElement entire xml as SimpleXmlElement */ public function getSimpleXmlElement() { return $this->_SimpleXmlElement; } } phpsysinfo-3.2.1/includes/xml/class.XML.inc.php000066400000000000000000000714461247443170600213760ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: class.XML.inc.php 699 2012-09-15 11:57:13Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * class for generation of the xml * * @category PHP * @package PSI_XML * @author Michael Cramer * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version Release: 3.0 * @link http://phpsysinfo.sourceforge.net */ class XML { /** * Sysinfo object where the information retrieval methods are included * * @var PSI_Interface_OS */ private $_sysinfo; /** * @var System */ private $_sys = null; /** * xml object with the xml content * * @var SimpleXMLExtended */ private $_xml; /** * object for error handling * * @var Error */ private $_errors; /** * array with all enabled plugins (name) * * @var array */ private $_plugins; /** * plugin name if pluginrequest * * @var string */ private $_plugin = ''; /** * generate a xml for a plugin or for the main app * * @var boolean */ private $_plugin_request = false; /** * generate the entire xml with all plugins or only a part of the xml (main or plugin) * * @var boolean */ private $_complete_request = false; /** * doing some initial tasks * - generate the xml structure with the right header elements * - get the error object for error output * - get a instance of the sysinfo object * * @param boolean $complete generate xml with all plugins or not * @param string $pluginname name of the plugin * * @return void */ public function __construct($complete = false, $pluginname = "") { $this->_errors = Error::singleton(); if ($pluginname == "") { $this->_plugin_request = false; $this->_plugin = ''; } else { $this->_plugin_request = true; $this->_plugin = $pluginname; } if ($complete) { $this->_complete_request = true; } else { $this->_complete_request = false; } $os = PSI_OS; $this->_sysinfo = new $os(); $this->_plugins = CommonFunctions::getPlugins(); $this->_xmlbody(); } /** * generate common information * * @return void */ private function _buildVitals() { $vitals = $this->_xml->addChild('Vitals'); $vitals->addAttribute('Hostname', $this->_sys->getHostname()); $vitals->addAttribute('IPAddr', $this->_sys->getIp()); $vitals->addAttribute('Kernel', $this->_sys->getKernel()); $vitals->addAttribute('Distro', $this->_sys->getDistribution()); $vitals->addAttribute('Distroicon', $this->_sys->getDistributionIcon()); $vitals->addAttribute('Uptime', $this->_sys->getUptime()); $vitals->addAttribute('Users', $this->_sys->getUsers()); $vitals->addAttribute('LoadAvg', $this->_sys->getLoad()); if ($this->_sys->getLoadPercent() !== null) { $vitals->addAttribute('CPULoad', $this->_sys->getLoadPercent()); } if ($this->_sysinfo->getLanguage() !== null) { $vitals->addAttribute('SysLang', $this->_sysinfo->getLanguage()); } if ($this->_sysinfo->getEncoding() !== null) { $vitals->addAttribute('CodePage', $this->_sysinfo->getEncoding()); } //processes if (($procss = $this->_sys->getProcesses()) !== null) { if (isset($procss['*']) && (($procall = $procss['*']) > 0)) { $vitals->addAttribute('Processes', $procall); if (!isset($procss[' ']) || !($procss[' '] > 0)) { // not unknown $procsum = 0; if (isset($procss['R']) && (($proctmp = $procss['R']) > 0)) { $vitals->addAttribute('ProcessesRunning', $proctmp); $procsum += $proctmp; } if (isset($procss['S']) && (($proctmp = $procss['S']) > 0)) { $vitals->addAttribute('ProcessesSleeping', $proctmp); $procsum += $proctmp; } if (isset($procss['T']) && (($proctmp = $procss['T']) > 0)) { $vitals->addAttribute('ProcessesStopped', $proctmp); $procsum += $proctmp; } if (isset($procss['Z']) && (($proctmp = $procss['Z']) > 0)) { $vitals->addAttribute('ProcessesZombie', $proctmp); $procsum += $proctmp; } if (isset($procss['D']) && (($proctmp = $procss['D']) > 0)) { $vitals->addAttribute('ProcessesWaiting', $proctmp); $procsum += $proctmp; } if (($proctmp = $procall - $procsum) > 0) { $vitals->addAttribute('ProcessesOther', $proctmp); } } } } $vitals->addAttribute('OS', PSI_OS); } /** * generate the network information * * @return void */ private function _buildNetwork() { $hideDevices = array(); $network = $this->_xml->addChild('Network'); if (defined('PSI_HIDE_NETWORK_INTERFACE')) { if (is_string(PSI_HIDE_NETWORK_INTERFACE)) { if (preg_match(ARRAY_EXP, PSI_HIDE_NETWORK_INTERFACE)) { $hideDevices = eval(PSI_HIDE_NETWORK_INTERFACE); } else { $hideDevices = array(PSI_HIDE_NETWORK_INTERFACE); } } elseif (PSI_HIDE_NETWORK_INTERFACE === true) { return; } } foreach ($this->_sys->getNetDevices() as $dev) { if (!in_array(trim($dev->getName()), $hideDevices)) { $device = $network->addChild('NetDevice'); $device->addAttribute('Name', $dev->getName()); $device->addAttribute('RxBytes', $dev->getRxBytes()); $device->addAttribute('TxBytes', $dev->getTxBytes()); $device->addAttribute('Err', $dev->getErrors()); $device->addAttribute('Drops', $dev->getDrops()); if ( defined('PSI_SHOW_NETWORK_INFOS') && PSI_SHOW_NETWORK_INFOS && $dev->getInfo() ) $device->addAttribute('Info', $dev->getInfo()); } } } /** * generate the hardware information * * @return void */ private function _buildHardware() { $dev = new HWDevice(); $hardware = $this->_xml->addChild('Hardware'); if ($this->_sys->getMachine() != "") { $hardware->addAttribute('Name', $this->_sys->getMachine()); } $pci = $hardware->addChild('PCI'); foreach (System::removeDupsAndCount($this->_sys->getPciDevices()) as $dev) { $tmp = $pci->addChild('Device'); $tmp->addAttribute('Name', $dev->getName()); $tmp->addAttribute('Count', $dev->getCount()); } $usb = $hardware->addChild('USB'); foreach (System::removeDupsAndCount($this->_sys->getUsbDevices()) as $dev) { $tmp = $usb->addChild('Device'); $tmp->addAttribute('Name', $dev->getName()); $tmp->addAttribute('Count', $dev->getCount()); } $ide = $hardware->addChild('IDE'); foreach (System::removeDupsAndCount($this->_sys->getIdeDevices()) as $dev) { $tmp = $ide->addChild('Device'); $tmp->addAttribute('Name', $dev->getName()); $tmp->addAttribute('Count', $dev->getCount()); if ($dev->getCapacity() !== null) { $tmp->addAttribute('Capacity', $dev->getCapacity()); } } $scsi = $hardware->addChild('SCSI'); foreach (System::removeDupsAndCount($this->_sys->getScsiDevices()) as $dev) { $tmp = $scsi->addChild('Device'); $tmp->addAttribute('Name', $dev->getName()); $tmp->addAttribute('Count', $dev->getCount()); if ($dev->getCapacity() !== null) { $tmp->addAttribute('Capacity', $dev->getCapacity()); } } $cpu = $hardware->addChild('CPU'); foreach ($this->_sys->getCpus() as $oneCpu) { $tmp = $cpu->addChild('CpuCore'); $tmp->addAttribute('Model', $oneCpu->getModel()); if ($oneCpu->getCpuSpeed() !== 0) { $tmp->addAttribute('CpuSpeed', $oneCpu->getCpuSpeed()); } if ($oneCpu->getCpuSpeedMax() !== 0) { $tmp->addAttribute('CpuSpeedMax', $oneCpu->getCpuSpeedMax()); } if ($oneCpu->getCpuSpeedMin() !== 0) { $tmp->addAttribute('CpuSpeedMin', $oneCpu->getCpuSpeedMin()); } if ($oneCpu->getTemp() !== null) { $tmp->addAttribute('CpuTemp', $oneCpu->getTemp()); } if ($oneCpu->getBusSpeed() !== null) { $tmp->addAttribute('BusSpeed', $oneCpu->getBusSpeed()); } if ($oneCpu->getCache() !== null) { $tmp->addAttribute('Cache', $oneCpu->getCache()); } if ($oneCpu->getVirt() !== null) { $tmp->addAttribute('Virt', $oneCpu->getVirt()); } if ($oneCpu->getBogomips() !== null) { $tmp->addAttribute('Bogomips', $oneCpu->getBogomips()); } if ($oneCpu->getLoad() !== null) { $tmp->addAttribute('Load', $oneCpu->getLoad()); } } } /** * generate the memory information * * @return void */ private function _buildMemory() { $memory = $this->_xml->addChild('Memory'); $memory->addAttribute('Free', $this->_sys->getMemFree()); $memory->addAttribute('Used', $this->_sys->getMemUsed()); $memory->addAttribute('Total', $this->_sys->getMemTotal()); $memory->addAttribute('Percent', $this->_sys->getMemPercentUsed()); if (($this->_sys->getMemApplication() !== null) || ($this->_sys->getMemBuffer() !== null) || ($this->_sys->getMemCache() !== null)) { $details = $memory->addChild('Details'); if ($this->_sys->getMemApplication() !== null) { $details->addAttribute('App', $this->_sys->getMemApplication()); $details->addAttribute('AppPercent', $this->_sys->getMemPercentApplication()); } if ($this->_sys->getMemBuffer() !== null) { $details->addAttribute('Buffers', $this->_sys->getMemBuffer()); $details->addAttribute('BuffersPercent', $this->_sys->getMemPercentBuffer()); } if ($this->_sys->getMemCache() !== null) { $details->addAttribute('Cached', $this->_sys->getMemCache()); $details->addAttribute('CachedPercent', $this->_sys->getMemPercentCache()); } } if (count($this->_sys->getSwapDevices()) > 0) { $swap = $memory->addChild('Swap'); $swap->addAttribute('Free', $this->_sys->getSwapFree()); $swap->addAttribute('Used', $this->_sys->getSwapUsed()); $swap->addAttribute('Total', $this->_sys->getSwapTotal()); $swap->addAttribute('Percent', $this->_sys->getSwapPercentUsed()); $i = 1; foreach ($this->_sys->getSwapDevices() as $dev) { $swapMount = $swap->addChild('Mount'); $this->_fillDevice($swapMount, $dev, $i++); } } } /** * fill a xml element with atrributes from a disk device * * @param SimpleXmlExtended $mount Xml-Element * @param DiskDevice $dev DiskDevice * @param Integer $i counter * * @return Void */ private function _fillDevice(SimpleXMLExtended $mount, DiskDevice $dev, $i) { $mount->addAttribute('MountPointID', $i); $mount->addAttribute('FSType', $dev->getFsType()); $mount->addAttribute('Name', $dev->getName()); $mount->addAttribute('Free', sprintf("%.0f", $dev->getFree())); $mount->addAttribute('Used', sprintf("%.0f", $dev->getUsed())); $mount->addAttribute('Total', sprintf("%.0f", $dev->getTotal())); $mount->addAttribute('Percent', $dev->getPercentUsed()); if (PSI_SHOW_MOUNT_OPTION === true) { if ($dev->getOptions() !== null) { $mount->addAttribute('MountOptions', preg_replace("/,/",", ",$dev->getOptions())); } } if ($dev->getPercentInodesUsed() !== null) { $mount->addAttribute('Inodes', $dev->getPercentInodesUsed()); } if (PSI_SHOW_MOUNT_POINT === true) { $mount->addAttribute('MountPoint', $dev->getMountPoint()); } } /** * generate the filesysteminformation * * @return void */ private function _buildFilesystems() { $hideMounts = $hideFstypes = $hideDisks = array(); $i = 1; if ( defined('PSI_HIDE_MOUNTS') && is_string(PSI_HIDE_MOUNTS) ) { if (preg_match(ARRAY_EXP, PSI_HIDE_MOUNTS)) { $hideMounts = eval(PSI_HIDE_MOUNTS); } else { $hideMounts = array(PSI_HIDE_MOUNTS); } } if ( defined('PSI_HIDE_FS_TYPES') && is_string(PSI_HIDE_FS_TYPES) ) { if (preg_match(ARRAY_EXP, PSI_HIDE_FS_TYPES)) { $hideFstypes = eval(PSI_HIDE_FS_TYPES); } else { $hideFstypes = array(PSI_HIDE_FS_TYPES); } } if (defined('PSI_HIDE_DISKS')) { if (is_string(PSI_HIDE_DISKS)) { if (preg_match(ARRAY_EXP, PSI_HIDE_DISKS)) { $hideDisks = eval(PSI_HIDE_DISKS); } else { $hideDisks = array(PSI_HIDE_DISKS); } } elseif (PSI_HIDE_DISKS === true) { return; } } $fs = $this->_xml->addChild('FileSystem'); foreach ($this->_sys->getDiskDevices() as $disk) { if (!in_array($disk->getMountPoint(), $hideMounts, true) && !in_array($disk->getFsType(), $hideFstypes, true) && !in_array($disk->getName(), $hideDisks, true)) { $mount = $fs->addChild('Mount'); $this->_fillDevice($mount, $disk, $i++); } } } /** * generate the motherboard information * * @return void */ private function _buildMbinfo() { $mbinfo = $this->_xml->addChild('MBInfo'); $temp = $fan = $volt = $power = $current = null; if (sizeof(unserialize(PSI_MBINFO))>0) { foreach (unserialize(PSI_MBINFO) as $mbinfoclass) { $mbinfo_data = new $mbinfoclass(); $mbinfo_detail = $mbinfo_data->getMBInfo(); foreach ($mbinfo_detail->getMbTemp() as $dev) { if ($temp == null) { $temp = $mbinfo->addChild('Temperature'); } $item = $temp->addChild('Item'); $item->addAttribute('Label', $dev->getName()); $item->addAttribute('Value', $dev->getValue()); if ($dev->getMax() !== null) { $item->addAttribute('Max', $dev->getMax()); } if ( defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "" ) { $item->addAttribute('Event', $dev->getEvent()); } } foreach ($mbinfo_detail->getMbFan() as $dev) { if ($fan == null) { $fan = $mbinfo->addChild('Fans'); } $item = $fan->addChild('Item'); $item->addAttribute('Label', $dev->getName()); $item->addAttribute('Value', $dev->getValue()); if ($dev->getMin() !== null) { $item->addAttribute('Min', $dev->getMin()); } if ( defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "" ) { $item->addAttribute('Event', $dev->getEvent()); } } foreach ($mbinfo_detail->getMbVolt() as $dev) { if ($volt == null) { $volt = $mbinfo->addChild('Voltage'); } $item = $volt->addChild('Item'); $item->addAttribute('Label', $dev->getName()); $item->addAttribute('Value', $dev->getValue()); if ($dev->getMin() !== null) { $item->addAttribute('Min', $dev->getMin()); } if ($dev->getMax() !== null) { $item->addAttribute('Max', $dev->getMax()); } if ( defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { $item->addAttribute('Event', $dev->getEvent()); } } foreach ($mbinfo_detail->getMbPower() as $dev) { if ($power == null) { $power = $mbinfo->addChild('Power'); } $item = $power->addChild('Item'); $item->addAttribute('Label', $dev->getName()); $item->addAttribute('Value', $dev->getValue()); if ($dev->getMax() !== null) { $item->addAttribute('Max', $dev->getMax()); } if ( defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { $item->addAttribute('Event', $dev->getEvent()); } } foreach ($mbinfo_detail->getMbCurrent() as $dev) { if ($current == null) { $current = $mbinfo->addChild('Current'); } $item = $current->addChild('Item'); $item->addAttribute('Label', $dev->getName()); $item->addAttribute('Value', $dev->getValue()); if ($dev->getMax() !== null) { $item->addAttribute('Max', $dev->getMax()); } if ( defined('PSI_SENSOR_EVENTS') && PSI_SENSOR_EVENTS && $dev->getEvent() !== "") { $item->addAttribute('Event', $dev->getEvent()); } } } } if (PSI_HDDTEMP) { $hddtemp = new HDDTemp(); $hddtemp_data = $hddtemp->getMBInfo(); foreach ($hddtemp_data->getMbTemp() as $dev) { if ($temp == null) { $temp = $mbinfo->addChild('Temperature'); } $item = $temp->addChild('Item'); $item->addAttribute('Label', $dev->getName()); $item->addAttribute('Value', $dev->getValue()); if ($dev->getMax() !== null) { $item->addAttribute('Max', $dev->getMax()); } } } } /** * generate the ups information * * @return void */ private function _buildUpsinfo() { $upsinfo = $this->_xml->addChild('UPSInfo'); if ( defined('PSI_UPS_APCUPSD_CGI_ENABLE') && PSI_UPS_APCUPSD_CGI_ENABLE) { $upsinfo->addAttribute('ApcupsdCgiLinks', true); } if (sizeof(unserialize(PSI_UPSINFO))>0) { foreach (unserialize(PSI_UPSINFO) as $upsinfoclass) { $upsinfo_data = new $upsinfoclass(); $upsinfo_detail = $upsinfo_data->getUPSInfo(); foreach ($upsinfo_detail->getUpsDevices() as $ups) { $item = $upsinfo->addChild('UPS'); $item->addAttribute('Name', $ups->getName()); if ($ups->getModel() !== "") { $item->addAttribute('Model', $ups->getModel()); } $item->addAttribute('Mode', $ups->getMode()); if ($ups->getStartTime() !== "") { $item->addAttribute('StartTime', $ups->getStartTime()); } $item->addAttribute('Status', $ups->getStatus()); if ($ups->getTemperatur() !== null) { $item->addAttribute('Temperature', $ups->getTemperatur()); } if ($ups->getOutages() !== null) { $item->addAttribute('OutagesCount', $ups->getOutages()); } if ($ups->getLastOutage() !== null) { $item->addAttribute('LastOutage', $ups->getLastOutage()); } if ($ups->getLastOutageFinish() !== null) { $item->addAttribute('LastOutageFinish', $ups->getLastOutageFinish()); } if ($ups->getLineVoltage() !== null) { $item->addAttribute('LineVoltage', $ups->getLineVoltage()); } if ($ups->getLineFrequency() !== null) { $item->addAttribute('LineFrequency', $ups->getLineFrequency()); } if ($ups->getLoad() !== null) { $item->addAttribute('LoadPercent', $ups->getLoad()); } if ($ups->getBatteryDate() !== null) { $item->addAttribute('BatteryDate', $ups->getBatteryDate()); } if ($ups->getBatteryVoltage() !== null) { $item->addAttribute('BatteryVoltage', $ups->getBatteryVoltage()); } if ($ups->getBatterCharge() !== null) { $item->addAttribute('BatteryChargePercent', $ups->getBatterCharge()); } if ($ups->getTimeLeft() !== null) { $item->addAttribute('TimeLeftMinutes', $ups->getTimeLeft()); } } } } } /** * generate the xml document * * @return void */ private function _buildXml() { if (!$this->_plugin_request || $this->_complete_request) { if ($this->_sys === null) { if (PSI_DEBUG === true) { // Safe mode check $safe_mode = @ini_get("safe_mode") ? TRUE : FALSE; if ($safe_mode) { $this->_errors->addError("WARN", "PhpSysInfo requires to set off 'safe_mode' in 'php.ini'"); } // Include path check $include_path = @ini_get("include_path"); if ($include_path && ($include_path!="")) { $include_path = preg_replace("/(:)|(;)/", "\n", $include_path); if (preg_match("/^\.$/m", $include_path)) { $include_path = "."; } } if ($include_path != ".") { $this->_errors->addError("WARN", "PhpSysInfo requires '.' inside the 'include_path' in php.ini"); } // popen mode check if (defined("PSI_MODE_POPEN") && PSI_MODE_POPEN === true) { $this->_errors->addError("WARN", "Installed version of PHP does not support proc_open() function, popen() is used"); } } $this->_sys = $this->_sysinfo->getSys(); } $this->_buildVitals(); $this->_buildNetwork(); $this->_buildHardware(); $this->_buildMemory(); $this->_buildFilesystems(); $this->_buildMbinfo(); $this->_buildUpsinfo(); } $this->_buildPlugins(); $this->_xml->combinexml($this->_errors->errorsAddToXML($this->_sysinfo->getEncoding())); } /** * get the xml object * * @return string */ public function getXml() { $this->_buildXml(); return $this->_xml->getSimpleXmlElement(); } /** * include xml-trees of the plugins to the main xml * * @return void */ private function _buildPlugins() { $pluginroot = $this->_xml->addChild("Plugins"); if (($this->_plugin_request || $this->_complete_request) && count($this->_plugins) > 0) { $plugins = array(); if ($this->_complete_request) { $plugins = $this->_plugins; } if ($this->_plugin_request) { $plugins = array($this->_plugin); } foreach ($plugins as $plugin) { $object = new $plugin($this->_sysinfo->getEncoding()); $object->execute(); $oxml = $object->xml(); if (sizeof($oxml) > 0) { $pluginroot->combinexml($oxml); } } } } /** * build the xml structure where the content can be inserted * * @return void */ private function _xmlbody() { $dom = new DOMDocument('1.0', 'UTF-8'); $root = $dom->createElement("tns:phpsysinfo"); $root->setAttribute('xmlns:tns', 'http://phpsysinfo.sourceforge.net/'); $root->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'); $root->setAttribute('xsi:schemaLocation', 'http://phpsysinfo.sourceforge.net/ phpsysinfo3.xsd'); $dom->appendChild($root); $this->_xml = new SimpleXMLExtended(simplexml_import_dom($dom), $this->_sysinfo->getEncoding()); $generation = $this->_xml->addChild('Generation'); $generation->addAttribute('version', PSI_VERSION_STRING); $generation->addAttribute('timestamp', time()); $options = $this->_xml->addChild('Options'); $options->addAttribute('tempFormat', defined('PSI_TEMP_FORMAT') ? strtolower(PSI_TEMP_FORMAT) : 'c'); $options->addAttribute('byteFormat', defined('PSI_BYTE_FORMAT') ? strtolower(PSI_BYTE_FORMAT) : 'auto_binary'); if ( defined('PSI_REFRESH') ) { if (PSI_REFRESH === false) { $options->addAttribute('refresh', 0); } elseif (PSI_REFRESH === true) { $options->addAttribute('refresh', 1); } else { $options->addAttribute('refresh', PSI_REFRESH); } } else { $options->addAttribute('refresh', 60000); } if ( defined('PSI_FS_USAGE_THRESHOLD') ) { if (PSI_FS_USAGE_THRESHOLD === true) { $options->addAttribute('threshold', 1); } elseif ((PSI_FS_USAGE_THRESHOLD !== false) && (PSI_FS_USAGE_THRESHOLD >= 1) && (PSI_FS_USAGE_THRESHOLD <= 99) ) { $options->addAttribute('threshold', PSI_FS_USAGE_THRESHOLD); } } else { $options->addAttribute('threshold', 90); } $options->addAttribute('showPickListTemplate', defined('PSI_SHOW_PICKLIST_TEMPLATE') ? (PSI_SHOW_PICKLIST_TEMPLATE ? 'true' : 'false') : 'false'); $options->addAttribute('showPickListLang', defined('PSI_SHOW_PICKLIST_LANG') ? (PSI_SHOW_PICKLIST_LANG ? 'true' : 'false') : 'false'); $options->addAttribute('showCPUListExpanded', defined('PSI_SHOW_CPULIST_EXPANDED') ? (PSI_SHOW_CPULIST_EXPANDED ? 'true' : 'false') : 'true'); $options->addAttribute('showCPUInfoExpanded', defined('PSI_SHOW_CPUINFO_EXPANDED') ? (PSI_SHOW_CPUINFO_EXPANDED ? 'true' : 'false') : 'false'); if (count($this->_plugins) > 0) { if ($this->_plugin_request) { $plug = $this->_xml->addChild('UsedPlugins'); $plug->addChild('Plugin')->addAttribute('name', $this->_plugin); } elseif ($this->_complete_request) { $plug = $this->_xml->addChild('UsedPlugins'); foreach ($this->_plugins as $plugin) { $plug->addChild('Plugin')->addAttribute('name', $plugin); } } else { $plug = $this->_xml->addChild('UnusedPlugins'); foreach ($this->_plugins as $plugin) { $plug->addChild('Plugin')->addAttribute('name', $plugin); } } } } } phpsysinfo-3.2.1/index.php000066400000000000000000000035141247443170600155520ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: index.php 687 2012-09-06 20:54:49Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * define the application root path on the webserver * @var string */ define('APP_ROOT', dirname(__FILE__)); /** * internal xml or external * external is needed when running in static mode * * @var boolean */ define('PSI_INTERNAL_XML', false); if (version_compare("5.2", PHP_VERSION, ">")) { die("PHP 5.2 or greater is required!!!"); } if (!extension_loaded("pcre")) { die("phpSysInfo requires the pcre extension to php in order to work properly."); } require_once APP_ROOT.'/includes/autoloader.inc.php'; // Load configuration require_once APP_ROOT.'/read_config.php'; if (!defined('PSI_CONFIG_FILE') || !defined('PSI_DEBUG')) { $tpl = new Template("/templates/html/error_config.html"); echo $tpl->fetch(); die(); } // redirect to page with and without javascript $display = isset($_GET['disp']) ? $_GET['disp'] : strtolower(PSI_DEFAULT_DISPLAY_MODE); switch ($display) { case "static": $webpage = new WebpageXSLT(); $webpage->run(); break; case "dynamic": $webpage = new Webpage(); $webpage->run(); break; case "xml": $webpage = new WebpageXML(true, null); $webpage->run(); break; case "bootstrap": $tpl = new Template("/templates/html/index_bootstrap.html"); echo $tpl->fetch(); break; default: $tpl = new Template("/templates/html/index_all.html"); echo $tpl->fetch(); break; } phpsysinfo-3.2.1/js.php000066400000000000000000000057231247443170600150630ustar00rootroot00000000000000 * @copyright 2009 phpSysInfo * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License * @version SVN: $Id: js.php 661 2012-08-27 11:26:39Z namiltd $ * @link http://phpsysinfo.sourceforge.net */ /** * application root path * * @var string */ define('APP_ROOT', dirname(__FILE__)); require_once APP_ROOT.'/includes/autoloader.inc.php'; require_once APP_ROOT.'/read_config.php'; $file = isset($_GET['name']) ? basename(htmlspecialchars($_GET['name'])) : null; $plugin = isset($_GET['plugin']) ? basename(htmlspecialchars($_GET['plugin'])) : null; $script = null; if ($file != null && $plugin == null) { if (strtolower(substr($file, 0, 6)) == 'jquery') { $script = APP_ROOT.'/js/jQuery/'.$file; } elseif (strtolower(substr($file, 0, 10)) == 'phpsysinfo') { $script = APP_ROOT.'/js/phpSysInfo/'.$file; } else { $script = APP_ROOT.'/js/vendor/'.$file; } } elseif ($file == null && $plugin != null) { $script = APP_ROOT.'/plugins/'.strtolower($plugin).'/js/'.strtolower($plugin); } elseif ($file != null && $plugin != null) { $script = APP_ROOT.'/plugins/'.strtolower($plugin).'/js/'.strtolower($file); } if ($script != null) { $scriptjs = $script.'.js'; $scriptmin = $script.'.min.js'; $compression = false; header("content-type: application/x-javascript"); if ((!defined("PSI_DEBUG") || (PSI_DEBUG !== true)) && defined("PSI_JS_COMPRESSION")) { $compression = strtolower(PSI_JS_COMPRESSION); } switch ($compression) { case "normal": if (file_exists($scriptmin) && is_readable($scriptmin)) { $filecontent = file_get_contents($scriptmin); echo $filecontent; } elseif (file_exists($scriptjs) && is_readable($scriptjs)) { $filecontent = file_get_contents($scriptjs); $packer = new JavaScriptPacker($filecontent); echo $packer->pack(); } break; case "none": if (file_exists($scriptmin) && is_readable($scriptmin)) { $filecontent = file_get_contents($scriptmin); echo $filecontent; } elseif (file_exists($scriptjs) && is_readable($scriptjs)) { $filecontent = file_get_contents($scriptjs); $packer = new JavaScriptPacker($filecontent,0); echo $packer->pack(); } break; default: if (file_exists($scriptjs) && is_readable($scriptjs)) { $filecontent = file_get_contents($scriptjs); } elseif (file_exists($scriptmin) && is_readable($scriptmin)) { $filecontent = file_get_contents($scriptmin); } else break; echo $filecontent; break; } } phpsysinfo-3.2.1/js/000077500000000000000000000000001247443170600143435ustar00rootroot00000000000000phpsysinfo-3.2.1/js/jQuery/000077500000000000000000000000001247443170600156225ustar00rootroot00000000000000phpsysinfo-3.2.1/js/jQuery/README000066400000000000000000000045701247443170600165100ustar00rootroot00000000000000versions, links and simple description of used jquery files =========================================================== jquery.js --------- VERSION : 2.1.3 URL : http://jquery.com/ DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. USED : used for the entire userinterface jquery-1.js --------- VERSION : 1.11.2 URL : http://jquery.com/ DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. USED : used for the entire userinterface jquery.dataTables.js -------------------- VERSION : 1.8.2 URL : http://plugins.jquery.com/project/DataTables DESC : dataTables is a jQuery plugin for turning a standard HTML table with THEAD and TBODY tags into a sortable table without page refreshes. USED : provide tablesorting for the filesystem table jquery.nyroModal.js ------------------- VERSION : 1.6.2+jquery1.8fix URL : http://plugins.jquery.com/project/nyroModal DESC : nyroModal is a high customizable modal window plugin. USED : provide a modal dialog, that is shown when errors are found during execution of the php parsers, or lets say in this way: if there are error elements in the xml file jquery.timers.js ---------------- VERSION : 0.1 URL : http://plugins.jquery.com/project/Timer DESC : provides a cleaner way to handle intervals USED : automatic reloading of the entire page jquery.jgrowl.js ---------------- VERSION : 1.2.6 URL : http://plugins.jquery.com/project/jGrowl DESC : jGrowl is a jQuery plugin that raises unobtrusive messages within the browser, similar to the way that OS X's Growl Framework works USED : show alert and error message jquery.treeTable.js ------------------- VERSION : 2009-06-22+statefix URL : http://plugins.jquery.com/project/jQTreeTable; http://www.hanpau.com/index.php?page=jqtreetable DESC : Take a plain html table, wrap the rows you want collapsing/expanding in a tbody tag with an id of treetable, map each row to it's parent row, set some options, and let jQTreeTable take it from there. USED : Hardware, Memory, UPS blocks $Id: README 702 2012-09-21 16:52:32Z namiltd $ phpsysinfo-3.2.1/js/jQuery/README_bootstrap000066400000000000000000000020761247443170600206040ustar00rootroot00000000000000versions, links and simple description of used jquery files =========================================================== jquery.js --------- VERSION : 2.1.3 URL : http://jquery.com/ DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. USED : used for the entire userinterface jquery-1.js --------- VERSION : 1.11.2 URL : http://jquery.com/ DESC : jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. USED : used for the entire userinterface jquery.treegrid.js ------------------- VERSION : 0.3.0 URL : http://plugins.jquery.com/treegrid/; http://maxazan.github.io/jquery-treegrid/ DESC : TreeGrid is a lightweight and flexible jQuery plugin to create a tree grid component that renders hierarchical, nested and flat data in a table. USED : Hardware, Memory, UPS blocks phpsysinfo-3.2.1/js/jQuery/jquery-1.js000066400000000000000000010530301247443170600176370ustar00rootroot00000000000000/*! * jQuery JavaScript Library v1.11.2 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2014-12-17T15:27Z */ (function( global, factory ) { if ( typeof module === "object" && typeof module.exports === "object" ) { // For CommonJS and CommonJS-like environments where a proper window is present, // execute the factory and get jQuery // For environments that do not inherently posses a window with a document // (such as Node.js), expose a jQuery-making factory as module.exports // This accentuates the need for the creation of a real window // e.g. var jQuery = require("jquery")(window); // See ticket #14549 for more info module.exports = global.document ? factory( global, true ) : function( w ) { if ( !w.document ) { throw new Error( "jQuery requires a window with a document" ); } return factory( w ); }; } else { factory( global ); } // Pass this if window is not defined yet }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { // Can't do this because several apps including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if // you try to trace through "use strict" call chains. (#13335) // Support: Firefox 18+ // var deletedIds = []; var slice = deletedIds.slice; var concat = deletedIds.concat; var push = deletedIds.push; var indexOf = deletedIds.indexOf; var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var support = {}; var version = "1.11.2", // Define a local copy of jQuery jQuery = function( selector, context ) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); }, // Support: Android<4.1, IE<9 // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, // Matches dashed string for camelizing rmsPrefix = /^-ms-/, rdashAlpha = /-([\da-z])/gi, // Used by jQuery.camelCase as callback to replace() fcamelCase = function( all, letter ) { return letter.toUpperCase(); }; jQuery.fn = jQuery.prototype = { // The current version of jQuery being used jquery: version, constructor: jQuery, // Start with an empty selector selector: "", // The default length of a jQuery object is 0 length: 0, toArray: function() { return slice.call( this ); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array get: function( num ) { return num != null ? // Return just the one element from the set ( num < 0 ? this[ num + this.length ] : this[ num ] ) : // Return all the elements in a clean array slice.call( this ); }, // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function( elems ) { // Build a new jQuery matched element set var ret = jQuery.merge( this.constructor(), elems ); // Add the old object onto the stack (as a reference) ret.prevObject = this; ret.context = this.context; // Return the newly-formed element set return ret; }, // Execute a callback for every element in the matched set. // (You can seed the arguments with an array of args, but this is // only used internally.) each: function( callback, args ) { return jQuery.each( this, callback, args ); }, map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, slice: function() { return this.pushStack( slice.apply( this, arguments ) ); }, first: function() { return this.eq( 0 ); }, last: function() { return this.eq( -1 ); }, eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: deletedIds.sort, splice: deletedIds.splice }; jQuery.extend = jQuery.fn.extend = function() { var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { /* jshint eqeqeq: false */ return obj != null && obj == obj.window; }, isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN // adding 1 corrects loss of precision from parseFloat (#15100) return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, isPlainObject: function( obj ) { var key; // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Support: IE<9 // Handle iteration over inherited properties before own properties. if ( support.ownLast ) { for ( key in obj ) { return hasOwn.call( obj, key ); } } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, type: function( obj ) { if ( obj == null ) { return obj + ""; } return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ] || "object" : typeof obj; }, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && jQuery.trim( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, // args is for internal usage only each: function( obj, callback, args ) { var value, i = 0, length = obj.length, isArray = isArraylike( obj ); if ( args ) { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } } return obj; }, // Support: Android<4.1, IE<9 trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArraylike( Object(arr) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { var len; if ( arr ) { if ( indexOf ) { return indexOf.call( arr, elem, i ); } len = arr.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in arr && arr[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; while ( j < len ) { first[ i++ ] = second[ j++ ]; } // Support: IE<9 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) if ( len !== len ) { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, i = 0, length = elems.length, isArray = isArraylike( elems ), ret = []; // Go through the array, translating each of the items to their new values if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var args, proxy, tmp; if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind args = slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++; return proxy; }, now: function() { return +( new Date() ); }, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); function isArraylike( obj ) { var length = obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } if ( obj.nodeType === 1 && length ) { return true; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.2.0-pre * http://sizzlejs.com/ * * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2014-12-16 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // General-purpose constants MAX_NEGATIVE = 1 << 31, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // http://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/css3-syntax/#characters characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", // Loosely modeled on CSS identifier characters // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = characterEncoding.replace( "w", "w#" ), // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + characterEncoding + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + characterEncoding + ")" ), "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, rescape = /'|\\/g, // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }; // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var match, elem, m, nodeType, // QSA vars i, groups, old, nid, newContext, newSelector; if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; results = results || []; nodeType = context.nodeType; if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } if ( !seed && documentIsHTML ) { // Try to shortcut find operations when possible (e.g., not under DocumentFragment) if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // Speed-up: Sizzle("#ID") if ( (m = match[1]) ) { if ( nodeType === 9 ) { elem = context.getElementById( m ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document (jQuery #6963) if ( elem && elem.parentNode ) { // Handle the case where IE, Opera, and Webkit return items // by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } } else { // Context is not a document if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Speed-up: Sizzle("TAG") } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Speed-up: Sizzle(".CLASS") } else if ( (m = match[3]) && support.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // QSA path if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { nid = old = expando; newContext = context; newSelector = nodeType !== 1 && selector; // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { groups = tokenize( selector ); if ( (old = context.getAttribute("id")) ) { nid = old.replace( rescape, "\\$&" ); } else { context.setAttribute( "id", nid ); } nid = "[id='" + nid + "'] "; i = groups.length; while ( i-- ) { groups[i] = nid + toSelector( groups[i] ); } newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; newSelector = groups.join(","); } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch(qsaError) { } finally { if ( !old ) { context.removeAttribute("id"); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {Function(string, Object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created div and expects a boolean result */ function assert( fn ) { var div = document.createElement("div"); try { return !!fn( div ); } catch (e) { return false; } finally { // Remove from its parent by default if ( div.parentNode ) { div.parentNode.removeChild( div ); } // release memory in IE div = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = attrs.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, parent, doc = node ? node.ownerDocument || node : preferredDoc; // If no document and documentElement is available, return if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Set our document document = doc; docElem = doc.documentElement; parent = doc.defaultView; // Support: IE>8 // If iframe document is assigned to "document" variable and if iframe has been reloaded, // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 // IE6-8 do not support the defaultView property so parent will be undefined if ( parent && parent !== parent.top ) { // IE11 does not have attachEvent, so all must suffer if ( parent.addEventListener ) { parent.addEventListener( "unload", unloadHandler, false ); } else if ( parent.attachEvent ) { parent.attachEvent( "onunload", unloadHandler ); } } /* Support tests ---------------------------------------------------------------------- */ documentIsHTML = !isXML( doc ); /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( div ) { div.appendChild( doc.createComment("") ); return !div.getElementsByTagName("*").length; }); // Support: IE<9 support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( div ) { docElem.appendChild( div ).id = expando; return !doc.getElementsByName || !doc.getElementsByName( expando ).length; }); // ID find and filter if ( support.getById ) { Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var m = context.getElementById( id ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [ m ] : []; } }; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; } else { // Support: IE6/7 // getElementById is not reliable as a find shortcut delete Expr.find["ID"]; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( div ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 docElem.appendChild( div ).innerHTML = "" + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( div.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !div.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibing-combinator selector` fails if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); assert(function( div ) { // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = doc.createElement("input"); input.setAttribute( "type", "hidden" ); div.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( div.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":enabled").length ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos div.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( div ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( div, "div" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( div, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully does not implement inclusive descendent // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return doc; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch (e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index outerCache = parent[ expando ] || (parent[ expando ] = {}); cache = outerCache[ type ] || []; nodeIndex = cache[0] === dirruns && cache[1]; diff = cache[0] === dirruns && cache[2]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } // Use previously-cached element index if available } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { diff = cache[1]; // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) } else { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": function( elem ) { return elem.disabled === false; }, "disabled": function( elem ) { return elem.disabled === true; }, "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); if ( (oldCache = outerCache[ dir ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements outerCache[ dir ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; if ( outermost ) { outermostContext = context !== document && context; } // Add elements passing elementMatchers directly to results // Keep `i` a string if there are no elements so `matchedCount` will be "00" below // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // Apply set filters to unmatched elements matchedCount += i; if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is no seed and only one group if ( match.length === 1 ) { // Take a shortcut and set the context if the root selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( div1 ) { // Should return 1, but returns 4 (following) return div1.compareDocumentPosition( document.createElement("div") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( div ) { div.innerHTML = ""; return div.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( div ) { div.innerHTML = ""; div.firstChild.setAttribute( "value", "" ); return div.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( div ) { return div.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); } return Sizzle; })( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.pseudos; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; var rneedsContext = jQuery.expr.match.needsContext; var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); var risSimple = /^.[^:#\[\.,]*$/; // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; }); } if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; }); } if ( typeof qualifier === "string" ) { if ( risSimple.test( qualifier ) ) { return jQuery.filter( qualifier, elements, not ); } qualifier = jQuery.filter( qualifier, elements ); } return jQuery.grep( elements, function( elem ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; }); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; })); }; jQuery.fn.extend({ find: function( selector ) { var i, ret = [], self = this, len = self.length; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter(function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }) ); } for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } // Needed because $( selector, context ) becomes $( context ).find( selector ) ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); ret.selector = this.selector ? this.selector + " " + selector : selector; return ret; }, filter: function( selector ) { return this.pushStack( winnow(this, selector || [], false) ); }, not: function( selector ) { return this.pushStack( winnow(this, selector || [], true) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } }); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // Use the correct document accordingly with window argument (sandbox) document = window.document, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, init = jQuery.fn.init = function( selector, context ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Handle HTML strings if ( typeof selector === "string" ) { if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; // scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[1], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return typeof rootjQuery.ready !== "undefined" ? rootjQuery.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.extend({ dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); jQuery.fn.extend({ has: function( target ) { var i, targets = jQuery( target, this ), len = targets.length; return this.filter(function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( ; i < l; i++ ) { for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && (pos ? pos.index(cur) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors)) ) { matched.push( cur ); break; } } } return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { return this.pushStack( jQuery.unique( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter(selector) ); } }); function sibling( cur, dir ) { do { cur = cur[ dir ]; } while ( cur && cur.nodeType !== 1 ); return cur; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { ret = jQuery.unique( ret ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { ret = ret.reverse(); } } return this.pushStack( ret ); }; }); var rnotwhite = (/\S+/g); // String to Object options format cache var optionsCache = {}; // Convert String-formatted options into Object-formatted ones and store in cache function createOptions( options ) { var object = optionsCache[ options ] = {}; jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { object[ flag ] = true; }); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? ( optionsCache[ options ] || createOptions( options ) ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // First callback to fire (used internally by add and fireWith) firingStart, // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = !options.once && [], // Fire callbacks fire = function( data ) { memory = options.memory && data; fired = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; firing = true; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { memory = false; // To prevent further calls using add break; } } firing = false; if ( list ) { if ( stack ) { if ( stack.length ) { fire( stack.shift() ); } } else if ( memory ) { list = []; } else { self.disable(); } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // First, we save the current length var start = list.length; (function add( args ) { jQuery.each( args, function( _, arg ) { var type = jQuery.type( arg ); if ( type === "function" ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && type !== "string" ) { // Inspect recursively add( arg ); } }); })( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away } else if ( memory ) { firingStart = start; fire( memory ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( firing ) { if ( index <= firingLength ) { firingLength--; } if ( index <= firingIndex ) { firingIndex--; } } } }); } return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); }, // Remove all callbacks from the list empty: function() { list = []; firingLength = 0; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( list && ( !fired || stack ) ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; if ( firing ) { stack.push( args ); } else { fire( args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; jQuery.extend({ Deferred: function( func ) { var tuples = [ // action, add listener, listener list, final state [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], [ "notify", "progress", jQuery.Callbacks("memory") ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, then: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred(function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; // deferred[ done | fail | progress ] for forwarding actions to newDefer deferred[ tuple[1] ](function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() .done( newDefer.resolve ) .fail( newDefer.reject ) .progress( newDefer.notify ); } else { newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } }); }); fns = null; }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Keep pipe for back-compat promise.pipe = promise.then; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 3 ]; // promise[ done | fail | progress ] = list.add promise[ tuple[1] ] = list.add; // Handle state if ( stateString ) { list.add(function() { // state = [ resolved | rejected ] state = stateString; // [ reject_list | resolve_list ].disable; progress_list.lock }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); } // deferred[ resolve | reject | notify ] deferred[ tuple[0] ] = function() { deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; deferred[ tuple[0] + "With" ] = list.fireWith; }); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, resolveValues = slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, // the master Deferred. If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), // Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { return function( value ) { contexts[ i ] = this; values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( values === progressValues ) { deferred.notifyWith( contexts, values ); } else if ( !(--remaining) ) { deferred.resolveWith( contexts, values ); } }; }, progressValues, progressContexts, resolveContexts; // add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ) .progress( updateFunc( i, progressContexts, progressValues ) ); } else { --remaining; } } } // if we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); } return deferred.promise(); } }); // The deferred used on DOM ready var readyList; jQuery.fn.ready = function( fn ) { // Add the callback jQuery.ready.promise().done( fn ); return this; }; jQuery.extend({ // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.triggerHandler ) { jQuery( document ).triggerHandler( "ready" ); jQuery( document ).off( "ready" ); } } }); /** * Clean-up method for dom ready events */ function detach() { if ( document.addEventListener ) { document.removeEventListener( "DOMContentLoaded", completed, false ); window.removeEventListener( "load", completed, false ); } else { document.detachEvent( "onreadystatechange", completed ); window.detachEvent( "onload", completed ); } } /** * The ready event handler and self cleanup method */ function completed() { // readyState === "complete" is good enough for us to call the dom ready in oldIE if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { detach(); jQuery.ready(); } } jQuery.ready.promise = function( obj ) { if ( !readyList ) { readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called after the browser event has already occurred. // we once tried to use readyState "interactive" here, but it caused issues like the one // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready setTimeout( jQuery.ready ); // Standards-based browsers support DOMContentLoaded } else if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed, false ); // If IE event model is used } else { // Ensure firing before onload, maybe late but safe also for iframes document.attachEvent( "onreadystatechange", completed ); // A fallback to window.onload, that will always work window.attachEvent( "onload", completed ); // If IE and not a frame // continually check to see if the document is ready var top = false; try { top = window.frameElement == null && document.documentElement; } catch(e) {} if ( top && top.doScroll ) { (function doScrollCheck() { if ( !jQuery.isReady ) { try { // Use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ top.doScroll("left"); } catch(e) { return setTimeout( doScrollCheck, 50 ); } // detach all dom ready events detach(); // and execute any waiting functions jQuery.ready(); } })(); } } } return readyList.promise( obj ); }; var strundefined = typeof undefined; // Support: IE<9 // Iteration over object's inherited properties before its own var i; for ( i in jQuery( support ) ) { break; } support.ownLast = i !== "0"; // Note: most support tests are defined in their respective modules. // false until the test is run support.inlineBlockNeedsLayout = false; // Execute ASAP in case we need to set body.style.zoom jQuery(function() { // Minified: var a,b,c,d var val, div, body, container; body = document.getElementsByTagName( "body" )[ 0 ]; if ( !body || !body.style ) { // Return for frameset docs that don't have a body return; } // Setup div = document.createElement( "div" ); container = document.createElement( "div" ); container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; body.appendChild( container ).appendChild( div ); if ( typeof div.style.zoom !== strundefined ) { // Support: IE<8 // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; if ( val ) { // Prevent IE 6 from affecting layout for positioned elements #11048 // Prevent IE from shrinking the body in IE 7 mode #12869 // Support: IE<8 body.style.zoom = 1; } } body.removeChild( container ); }); (function() { var div = document.createElement( "div" ); // Execute the test only if not already executed in another module. if (support.deleteExpando == null) { // Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch( e ) { support.deleteExpando = false; } } // Null elements to avoid leaks in IE. div = null; })(); /** * Determines whether an object can have data */ jQuery.acceptData = function( elem ) { var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], nodeType = +elem.nodeType || 1; // Do not set data on non-element DOM nodes because it will not be cleared (#8335). return nodeType !== 1 && nodeType !== 9 ? false : // Nodes accept data unless otherwise specified; rejection can be conditional !noData || noData !== true && elem.getAttribute("classid") === noData; }; var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /([A-Z])/g; function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : // Only convert to a number if it doesn't change the string +data + "" === data ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { var name; for ( name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function internalData( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var ret, thisCache, internalKey = jQuery.expando, // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; } else { id = internalKey; } } if ( !cache[ id ] ) { // Avoid exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( typeof name === "string" ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; } function internalRemoveData( elem, name, pvt ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, id = isNode ? elem[ jQuery.expando ] : jQuery.expando; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split(" "); } } } else { // If "name" is an array of keys... // When data is initially created, via ("key", "val") signature, // keys will be converted to camelCase. // Since there is no way to tell _how_ a key was added, remove // both plain key and camelCase key. #12786 // This will only penalize the array argument path. name = name.concat( jQuery.map( name, jQuery.camelCase ) ); } i = name.length; while ( i-- ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject( cache[ id ] ) ) { return; } } // Destroy the cache if ( isNode ) { jQuery.cleanData( [ elem ], true ); // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) /* jshint eqeqeq: false */ } else if ( support.deleteExpando || cache != cache.window ) { /* jshint eqeqeq: true */ delete cache[ id ]; // When all else fails, null } else { cache[ id ] = null; } } jQuery.extend({ cache: {}, // The following elements (space-suffixed to avoid Object.prototype collisions) // throw uncatchable exceptions if you attempt to set expando properties noData: { "applet ": true, "embed ": true, // ...but Flash objects (which have this classid) *can* handle expandos "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data ) { return internalData( elem, name, data ); }, removeData: function( elem, name ) { return internalRemoveData( elem, name ); }, // For internal use only. _data: function( elem, name, data ) { return internalData( elem, name, data, true ); }, _removeData: function( elem, name ) { return internalRemoveData( elem, name, true ); } }); jQuery.fn.extend({ data: function( key, value ) { var i, name, data, elem = this[0], attrs = elem && elem.attributes; // Special expections of .data basically thwart jQuery.access, // so implement the relevant behavior ourselves // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE11+ // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.slice(5) ); dataAttr( elem, name, data[ name ] ); } } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } return arguments.length > 1 ? // Sets one value this.each(function() { jQuery.data( this, key, value ); }) : // Gets one value // Try to fetch any internally stored data first elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); jQuery.extend({ queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || jQuery.isArray(data) ) { queue = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // not intended for public consumption - generates a queueHooks object, or returns the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return jQuery._data( elem, key ) || jQuery._data( elem, key, { empty: jQuery.Callbacks("once memory").add(function() { jQuery._removeData( elem, type + "queue" ); jQuery._removeData( elem, key ); }) }); } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); // ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = jQuery._data( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } }); var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHidden = function( elem, el ) { // isHidden might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); }; // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, length = elems.length, bulk = key == null; // Sets many values if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !jQuery.isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < length; i++ ) { fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); } } } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }; var rcheckableType = (/^(?:checkbox|radio)$/i); (function() { // Minified: var a,b,c var input = document.createElement( "input" ), div = document.createElement( "div" ), fragment = document.createDocumentFragment(); // Setup div.innerHTML = "
a"; // IE strips leading whitespace when .innerHTML is used support.leadingWhitespace = div.firstChild.nodeType === 3; // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables support.tbody = !div.getElementsByTagName( "tbody" ).length; // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works support.html5Clone = document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) input.type = "checkbox"; input.checked = true; fragment.appendChild( input ); support.appendChecked = input.checked; // Make sure textarea (and checkbox) defaultValue is properly cloned // Support: IE6-IE11+ div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // #11217 - WebKit loses check when the name is after the checked attribute fragment.appendChild( div ); div.innerHTML = ""; // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 // old WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE<9 // Opera does not clone events (and typeof div.attachEvent === undefined). // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() support.noCloneEvent = true; if ( div.attachEvent ) { div.attachEvent( "onclick", function() { support.noCloneEvent = false; }); div.cloneNode( true ).click(); } // Execute the test only if not already executed in another module. if (support.deleteExpando == null) { // Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch( e ) { support.deleteExpando = false; } } })(); (function() { var i, eventName, div = document.createElement( "div" ); // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) for ( i in { submit: true, change: true, focusin: true }) { eventName = "on" + i; if ( !(support[ i + "Bubbles" ] = eventName in window) ) { // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) div.setAttribute( eventName, "t" ); support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; } } // Null elements to avoid leaks in IE. div = null; })(); var rformElems = /^(?:input|select|textarea)$/i, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; function returnTrue() { return true; } function returnFalse() { return false; } function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var tmp, events, t, handleObjIn, special, eventHandle, handleObj, handlers, type, namespaces, origType, elemData = jQuery._data( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !(events = elemData.events) ) { events = elemData.events = {}; } if ( !(eventHandle = elemData.handle) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first if ( !(handlers = events[ type ]) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, handleObj, tmp, origCount, t, events, special, handlers, type, namespaces, origType, elemData = jQuery.hasData( elem ) && jQuery._data( elem ); if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery._removeData( elem, "events" ); } }, trigger: function( event, data, elem, onlyHandlers ) { var handle, ontype, cur, bubbleType, special, tmp, i, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; cur = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf(".") >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf(":") < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join("."); event.namespace_re = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === (elem.ownerDocument || document) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && jQuery.acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; try { elem[ type ](); } catch ( e ) { // IE<9 dies on focus/blur to hidden element (#1486,#12518) // only reproducible on winXP IE8 native, not IE9 in IE8 mode } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); var i, ret, handleObj, matched, j, handlerQueue = [], args = slice.call( arguments ), handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { if ( (event.result = ret) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var sel, handleObj, matches, i, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers // Black-hole SVG instance trees (#13180) // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { /* jshint eqeqeq: false */ for ( ; cur != this; cur = cur.parentNode || this ) { /* jshint eqeqeq: true */ // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matches[ sel ] === undefined ) { matches[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) >= 0 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matches[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, handlers: matches }); } } } } // Add the remaining (directly-bound) handlers if ( delegateCount < handlers.length ) { handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); } return handlerQueue; }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, copy, type = event.type, originalEvent = event, fixHook = this.fixHooks[ type ]; if ( !fixHook ) { this.fixHooks[ type ] = fixHook = rmouseEvent.test( type ) ? this.mouseHooks : rkeyEvent.test( type ) ? this.keyHooks : {}; } copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = new jQuery.Event( originalEvent ); i = copy.length; while ( i-- ) { prop = copy[ i ]; event[ prop ] = originalEvent[ prop ]; } // Support: IE<9 // Fix target property (#1925) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Support: Chrome 23+, Safari? // Target should not be a text node (#504, #13143) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // Support: IE<9 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) event.metaKey = !!event.metaKey; return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; }, // Includes some event props shared by KeyEvent and MouseEvent props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var body, eventDoc, doc, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { try { this.focus(); return false; } catch ( e ) { // Support: IE<9 // If we error on focus to hidden element (#1486, #12518), // let .trigger() run the handlers } } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return jQuery.nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { var name = "on" + type; if ( elem.detachEvent ) { // #8545, #7054, preventing memory leaks for custom events in IE6-8 // detachEvent needed property on element, by name of that event, to properly expose it to GC if ( typeof elem[ name ] === strundefined ) { elem[ name ] = null; } elem.detachEvent( name, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: IE < 9, Android < 4.0 src.returnValue === false ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( !e ) { return; } // If preventDefault exists, run it on the original event if ( e.preventDefault ) { e.preventDefault(); // Support: IE // Otherwise set the returnValue property of the original event to false } else { e.returnValue = false; } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( !e ) { return; } // If stopPropagation exists, run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // Support: IE // Set the cancelBubble property of the original event to true e.cancelBubble = true; }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && e.stopImmediatePropagation ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !jQuery._data( form, "submitBubbles" ) ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); jQuery._data( form, "submitBubbles", true ); } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; } // Allow triggered, simulated change events (#11500) jQuery.event.simulate( "change", this, event, true ); }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); jQuery._data( elem, "changeBubbles", true ); } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return !rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); jQuery._removeData( doc, fix ); } else { jQuery._data( doc, fix, attaches ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var type, origFn; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { var elem = this[0]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } }); function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, rtagName = /<([\w:]+)/, rtbody = /\s*$/g, // We have to close these tags to support XHTML (#13200) wrapMap = { option: [ 1, "" ], legend: [ 1, "
", "
" ], area: [ 1, "", "" ], param: [ 1, "", "" ], thead: [ 1, "", "
" ], tr: [ 2, "", "
" ], col: [ 2, "", "
" ], td: [ 3, "", "
" ], // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, // unless wrapped in a div with non-breaking characters in front of it. _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] }, safeFragment = createSafeFragment( document ), fragmentDiv = safeFragment.appendChild( document.createElement("div") ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function getAll( context, tag ) { var elems, elem, i = 0, found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : undefined; if ( !found ) { for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { if ( !tag || jQuery.nodeName( elem, tag ) ) { found.push( elem ); } else { jQuery.merge( found, getAll( elem, tag ) ); } } } return tag === undefined || tag && jQuery.nodeName( context, tag ) ? jQuery.merge( [ context ], found ) : found; } // Used in buildFragment, fixes the defaultChecked property function fixDefaultChecked( elem ) { if ( rcheckableType.test( elem.type ) ) { elem.defaultChecked = elem.checked; } } // Support: IE<8 // Manipulating tables requires a tbody function manipulationTarget( elem, content ) { return jQuery.nodeName( elem, "table" ) && jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? elem.getElementsByTagName("tbody")[0] || elem.appendChild( elem.ownerDocument.createElement("tbody") ) : elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); if ( match ) { elem.type = match[1]; } else { elem.removeAttribute("type"); } return elem; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var elem, i = 0; for ( ; (elem = elems[i]) != null; i++ ) { jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); } } function cloneCopyEvent( src, dest ) { if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { return; } var type, i, l, oldData = jQuery._data( src ), curData = jQuery._data( dest, oldData ), events = oldData.events; if ( events ) { delete curData.handle; curData.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } // make the cloned public data object a copy from the original if ( curData.data ) { curData.data = jQuery.extend( {}, curData.data ); } } function fixCloneNodeIssues( src, dest ) { var nodeName, e, data; // We do not need to do anything for non-Elements if ( dest.nodeType !== 1 ) { return; } nodeName = dest.nodeName.toLowerCase(); // IE6-8 copies events bound via attachEvent when using cloneNode. if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { data = jQuery._data( dest ); for ( e in data.events ) { jQuery.removeEvent( dest, e, data.handle ); } // Event data gets referenced instead of copied if the expando gets copied too dest.removeAttribute( jQuery.expando ); } // IE blanks contents when cloning scripts, and tries to evaluate newly-set text if ( nodeName === "script" && dest.text !== src.text ) { disableScript( dest ).text = src.text; restoreScript( dest ); // IE6-10 improperly clones children of object elements using classid. // IE10 throws NoModificationAllowedError if parent is null, #12132. } else if ( nodeName === "object" ) { if ( dest.parentNode ) { dest.outerHTML = src.outerHTML; } // This path appears unavoidable for IE9. When cloning an object // element in IE9, the outerHTML strategy above is not sufficient. // If the src has innerHTML and the destination does not, // copy the src.innerHTML into the dest.innerHTML. #10324 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { dest.innerHTML = src.innerHTML; } } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { // IE6-8 fails to persist the checked state of a cloned checkbox // or radio button. Worse, IE6-7 fail to give the cloned element // a checked appearance if the defaultChecked value isn't also set dest.defaultChecked = dest.checked = src.checked; // IE6-7 get confused and end up setting the value of a cloned // checkbox/radio button to an empty string instead of "on" if ( dest.value !== src.value ) { dest.value = src.value; } // IE6-8 fails to return the selected option to the default selected // state when cloning options } else if ( nodeName === "option" ) { dest.defaultSelected = dest.selected = src.defaultSelected; // IE6-8 fails to set the defaultValue to the correct value when // cloning other types of input fields } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } jQuery.extend({ clone: function( elem, dataAndEvents, deepDataAndEvents ) { var destElements, node, clone, i, srcElements, inPage = jQuery.contains( elem.ownerDocument, elem ); if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { clone = elem.cloneNode( true ); // IE<=8 does not properly clone detached, unknown element nodes } else { fragmentDiv.innerHTML = elem.outerHTML; fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); } if ( (!support.noCloneEvent || !support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); // Fix all IE cloning issues for ( i = 0; (node = srcElements[i]) != null; ++i ) { // Ensure that the destination node is not null; Fixes #9587 if ( destElements[i] ) { fixCloneNodeIssues( node, destElements[i] ); } } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0; (node = srcElements[i]) != null; i++ ) { cloneCopyEvent( node, destElements[i] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } destElements = srcElements = node = null; // Return the cloned set return clone; }, buildFragment: function( elems, context, scripts, selection ) { var j, elem, contains, tmp, tag, tbody, wrap, l = elems.length, // Ensure a safe fragment safe = createSafeFragment( context ), nodes = [], i = 0; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( jQuery.type( elem ) === "object" ) { jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || safe.appendChild( context.createElement("div") ); // Deserialize a standard representation tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; // Descend through wrappers to the right content j = wrap[0]; while ( j-- ) { tmp = tmp.lastChild; } // Manually add leading whitespace removed by IE if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); } // Remove IE's autoinserted from table fragments if ( !support.tbody ) { // String was a , *may* have spurious elem = tag === "table" && !rtbody.test( elem ) ? tmp.firstChild : // String was a bare or wrap[1] === "
" && !rtbody.test( elem ) ? tmp : 0; j = elem && elem.childNodes.length; while ( j-- ) { if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { elem.removeChild( tbody ); } } } jQuery.merge( nodes, tmp.childNodes ); // Fix #12392 for WebKit and IE > 9 tmp.textContent = ""; // Fix #12392 for oldIE while ( tmp.firstChild ) { tmp.removeChild( tmp.firstChild ); } // Remember the top-level container for proper cleanup tmp = safe.lastChild; } } } // Fix #11356: Clear elements from fragment if ( tmp ) { safe.removeChild( tmp ); } // Reset defaultChecked for any radios and checkboxes // about to be appended to the DOM in IE 6/7 (#8060) if ( !support.appendChecked ) { jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); } i = 0; while ( (elem = nodes[ i++ ]) ) { // #4087 - If origin and destination elements are the same, and this is // that element, do not do anything if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( safe.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( (elem = tmp[ j++ ]) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } tmp = null; return safe; }, cleanData: function( elems, /* internal */ acceptData ) { var elem, type, id, data, i = 0, internalKey = jQuery.expando, cache = jQuery.cache, deleteExpando = support.deleteExpando, special = jQuery.event.special; for ( ; (elem = elems[i]) != null; i++ ) { if ( acceptData || jQuery.acceptData( elem ) ) { id = elem[ internalKey ]; data = id && cache[ id ]; if ( data ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Remove cache only if it was not already removed by jQuery.event.remove if ( cache[ id ] ) { delete cache[ id ]; // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( deleteExpando ) { delete elem[ internalKey ]; } else if ( typeof elem.removeAttribute !== strundefined ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } deletedIds.push( id ); } } } } } }); jQuery.fn.extend({ text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); }, null, value, arguments.length ); }, append: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } }); }, prepend: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } }); }, before: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } }); }, after: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } }); }, remove: function( selector, keepData /* Internal Use Only */ ) { var elem, elems = selector ? jQuery.filter( selector, this ) : this, i = 0; for ( ; (elem = elems[i]) != null; i++ ) { if ( !keepData && elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem ) ); } if ( elem.parentNode ) { if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { setGlobalEval( getAll( elem, "script" ) ); } elem.parentNode.removeChild( elem ); } } return this; }, empty: function() { var elem, i = 0; for ( ; (elem = this[i]) != null; i++ ) { // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); } // Remove any remaining nodes while ( elem.firstChild ) { elem.removeChild( elem.firstChild ); } // If this is a select, ensure that it displays empty (#12336) // Support: IE<9 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { elem.options.length = 0; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map(function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); }); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined ) { return elem.nodeType === 1 ? elem.innerHTML.replace( rinlinejQuery, "" ) : undefined; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && ( support.htmlSerialize || !rnoshimcache.test( value ) ) && ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { value = value.replace( rxhtmlTag, "<$1>" ); try { for (; i < l; i++ ) { // Remove element nodes and prevent memory leaks elem = this[i] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch(e) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var arg = arguments[ 0 ]; // Make the changes, replacing each context element with the new content this.domManip( arguments, function( elem ) { arg = this.parentNode; jQuery.cleanData( getAll( this ) ); if ( arg ) { arg.replaceChild( elem, this ); } }); // Force removal if there was no new content (e.g., from empty arguments) return arg && (arg.length || arg.nodeType) ? this : this.remove(); }, detach: function( selector ) { return this.remove( selector, true ); }, domManip: function( args, callback ) { // Flatten any nested arrays args = concat.apply( [], args ); var first, node, hasScripts, scripts, doc, fragment, i = 0, l = this.length, set = this, iNoClone = l - 1, value = args[0], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( isFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return this.each(function( index ) { var self = set.eq( index ); if ( isFunction ) { args[0] = value.call( this, index, self.html() ); } self.domManip( args, callback ); }); } if ( l ) { fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } if ( first ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( this[i], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); } } } } // Fix #11809: Avoid leaking memory fragment = first = null; } } return this; } }); jQuery.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, i = 0, ret = [], insert = jQuery( selector ), last = insert.length - 1; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone(true); jQuery( insert[i] )[ original ]( elems ); // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; }); var iframe, elemdisplay = {}; /** * Retrieve the actual display of a element * @param {String} name nodeName of the element * @param {Object} doc Document object */ // Called only from within defaultDisplay function actualDisplay( name, doc ) { var style, elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), // getDefaultComputedStyle might be reliably used only on attached element display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? // Use of this method is a temporary fix (more like optmization) until something better comes along, // since it was removed from specification and supported only in FF style.display : jQuery.css( elem[ 0 ], "display" ); // We don't have any data stored on the element, // so use "detach" method as fast way to get rid of the element elem.detach(); return display; } /** * Try to determine the default display value of an element * @param {String} nodeName */ function defaultDisplay( nodeName ) { var doc = document, display = elemdisplay[ nodeName ]; if ( !display ) { display = actualDisplay( nodeName, doc ); // If the simple way fails, read from inside an iframe if ( display === "none" || !display ) { // Use the already-created iframe if possible iframe = (iframe || jQuery( "'); $('iframe', modal.tmp) .css({ width: currentSettings.width, height: currentSettings.height }) .error(loadingError) .load(formDataLoaded); debug('Form Data Load: '+jFrom.attr('action')); showModal(); showContentOrLoading(); } else if (currentSettings.type == 'image') { debug('Image Load: '+url); var title = jFrom.attr('title') || currentSettings.defaultImgAlt; initModal(); modal.tmp.html('').find('img').attr('alt', title); modal.tmp.css({lineHeight: 0}); $('img', modal.tmp) .error(loadingError) .load(function() { debug('Image Loaded: '+this.src); $(this).unbind('load'); var w = modal.tmp.width(); var h = modal.tmp.height(); modal.tmp.css({lineHeight: ''}); resized.width = w; resized.height = h; setCurrentSettings({ width: w, height: h, imgWidth: w, imgHeight: h }); initSettingsSize.width = w; initSettingsSize.height = h; setCurrentSettings({overflow: 'visible'}, 'cssOpt', 'content'); modal.dataReady = true; if (modal.loadingShown || modal.transition) showContentOrLoading(); }) .attr('src', url); showModal(); } else if (currentSettings.type == 'iframeForm') { initModal(); modal.tmp.html(''); debug('Iframe Form Load: '+url); $('iframe', modal.tmp).eq(0) .css({ width: '100%', height: $.support.boxModel? '99%' : '100%' }) .load(iframeLoaded); modal.dataReady = true; showModal(); } else if (currentSettings.type == 'iframe') { initModal(); modal.tmp.html(''); debug('Iframe Load: '+url); $('iframe', modal.tmp).eq(0) .css({ width: '100%', height: $.support.boxModel? '99%' : '100%' }) .load(iframeLoaded); modal.dataReady = true; showModal(); } else if (currentSettings.type) { // Could be every other kind of type or a dom selector debug('Content: '+currentSettings.type); initModal(); modal.tmp.html(currentSettings.content); var w = modal.tmp.width(); var h = modal.tmp.height(); var div = $(currentSettings.type); if (div.length) { setCurrentSettings({type: 'div'}); w = div.width(); h = div.height(); if (contentElt) contentEltLast = contentElt; contentElt = div; modal.tmp.append(div.contents()); } initSettingsSize.width = w; initSettingsSize.height = h; setCurrentSettings({ width: w, height: h }); if (modal.tmp.html()) modal.dataReady = true; else loadingError(); if (!modal.ready) showModal(); else endHideContent(); } else { debug('Ajax Load: '+url); setCurrentSettings({type: 'ajax'}); var data = currentSettings.ajax.data || {}; if (currentSettings.selector) { if (typeof data == "string") { data+= '&'+currentSettings.selIndicator+'='+currentSettings.selector.substring(1); } else { data[currentSettings.selIndicator] = currentSettings.selector.substring(1); } } showModal(); $.ajax($.extend(true, currentSettings.ajax, { url: url, success: ajaxLoaded, error: loadingError, data: data })); } } else if (currentSettings.content) { // Raw content not from a DOM element debug('Content: '+currentSettings.type); setCurrentSettings({type: 'manual'}); initModal(); modal.tmp.html($('
').html(currentSettings.content).contents()); if (modal.tmp.html()) modal.dataReady = true; else loadingError(); showModal(); } else { // What should we show here? nothing happen } } // Update the current settings // object settings // string deep1 first key where overwrite the settings // string deep2 second key where overwrite the settings function setDefaultCurrentSettings(settings) { debug('setDefaultCurrentSettings'); currentSettings = $.extend(true, {}, $.fn.nyroModal.settings, settings); setMargin(); } function setCurrentSettings(settings, deep1, deep2) { if (modal.started) { if (deep1 && deep2) { $.extend(true, currentSettings[deep1][deep2], settings); } else if (deep1) { $.extend(true, currentSettings[deep1], settings); } else { if (modal.animContent) { if ('width' in settings) { if (!modal.resizing) { settings.setWidth = settings.width; shouldResize = true; } delete settings['width']; } if ('height' in settings) { if (!modal.resizing) { settings.setHeight = settings.height; shouldResize = true; } delete settings['height']; } } $.extend(true, currentSettings, settings); } } else { if (deep1 && deep2) { $.extend(true, $.fn.nyroModal.settings[deep1][deep2], settings); } else if (deep1) { $.extend(true, $.fn.nyroModal.settings[deep1], settings); } else { $.extend(true, $.fn.nyroModal.settings, settings); } } } // Set the margin for postionning the element. Useful for IE6 function setMarginScroll() { if (isIE6 && !modal.blocker) { if (document.documentElement) { currentSettings.marginScrollLeft = document.documentElement.scrollLeft; currentSettings.marginScrollTop = document.documentElement.scrollTop; } else { currentSettings.marginScrollLeft = document.body.scrollLeft; currentSettings.marginScrollTop = document.body.scrollTop; } } else { currentSettings.marginScrollLeft = 0; currentSettings.marginScrollTop = 0; } } // Set the margin for the content function setMargin() { setMarginScroll(); currentSettings.marginLeft = -(currentSettings.width+currentSettings.borderW)/2; currentSettings.marginTop = -(currentSettings.height+currentSettings.borderH)/2; if (!modal.blocker) { currentSettings.marginLeft+= currentSettings.marginScrollLeft; currentSettings.marginTop+= currentSettings.marginScrollTop; } } // Set the margin for the current loading function setMarginLoading() { setMarginScroll(); var outer = getOuter(modal.loading); currentSettings.marginTopLoading = -(modal.loading.height() + outer.h.border + outer.h.padding)/2; currentSettings.marginLeftLoading = -(modal.loading.width() + outer.w.border + outer.w.padding)/2; if (!modal.blocker) { currentSettings.marginLeftLoading+= currentSettings.marginScrollLeft; currentSettings.marginTopLoading+= currentSettings.marginScrollTop; } } // Set the modal Title function setTitle() { var title = $('h1#nyroModalTitle', modal.contentWrapper); if (title.length) title.text(currentSettings.title); else modal.contentWrapper.prepend('

'+currentSettings.title+'

'); } // Init the nyroModal div by settings the CSS elements and hide needed elements function initModal() { debug('initModal'); if (!modal.full) { if (currentSettings.debug) setCurrentSettings({color: 'white'}, 'cssOpt', 'bg'); var full = { zIndex: currentSettings.zIndexStart, position: 'fixed', top: 0, left: 0, width: '100%', height: '100%' }; var contain = body; var iframeHideIE = ''; if (currentSettings.blocker) { modal.blocker = contain = $(currentSettings.blocker); var pos = modal.blocker.offset(); var w = modal.blocker.outerWidth(); var h = modal.blocker.outerHeight(); if (isIE6) { setCurrentSettings({ height: '100%', width: '100%', top: 0, left: 0 }, 'cssOpt', 'bg'); } modal.blockerVars = { top: pos.top, left: pos.left, width: w, height: h }; var plusTop = (/msie/.test(userAgent) ?0:getCurCSS(body.get(0), 'borderTopWidth')); var plusLeft = (/msie/.test(userAgent) ?0:getCurCSS(body.get(0), 'borderLeftWidth')); full = { position: 'absolute', top: pos.top + plusTop, left: pos.left + plusLeft, width: w, height: h }; } else if (isIE6) { body.css({ marginLeft: 0, marginRight: 0 }); var w = body.width(); var h = $(window).height()+'px'; if ($(window).height() >= body.outerHeight()) { h = body.outerHeight()+'px'; } else w+= 20; w += 'px'; body.css({ width: w, height: h, position: 'static', overflow: 'hidden' }); $('html').css({overflow: 'hidden'}); setCurrentSettings({ cssOpt: { bg: { position: 'absolute', zIndex: currentSettings.zIndexStart+1, height: '110%', width: '110%', top: currentSettings.marginScrollTop+'px', left: currentSettings.marginScrollLeft+'px' }, wrapper: { zIndex: currentSettings.zIndexStart+2 }, loading: { zIndex: currentSettings.zIndexStart+3 } } }); iframeHideIE = $('') .css($.extend({}, currentSettings.cssOpt.bg, { opacity: 0, zIndex: 50, border: 'none' })); } contain.append($('
').hide()); modal.full = $('#nyroModalFull') .css(full) .show(); modal.bg = $('#nyroModalBg') .css($.extend({ backgroundColor: currentSettings.bgColor }, currentSettings.cssOpt.bg)) .before(iframeHideIE); modal.bg.bind('click.nyroModal', clickBg); modal.loading = $('#nyroModalLoading') .css(currentSettings.cssOpt.loading) .hide(); modal.contentWrapper = $('#nyroModalWrapper') .css(currentSettings.cssOpt.wrapper) .hide(); modal.content = $('#nyroModalContent'); modal.tmp = $('#nyrModalTmp').hide(); // To stop the mousewheel if the the plugin is available if ($.isFunction($.fn.mousewheel)) { modal.content.mousewheel(function(e, d) { var elt = modal.content.get(0); if ((d > 0 && elt.scrollTop == 0) || (d < 0 && elt.scrollHeight - elt.scrollTop == elt.clientHeight)) { e.preventDefault(); e.stopPropagation(); } }); } $(document).bind('keydown.nyroModal', keyHandler); modal.content.css({width: 'auto', height: 'auto'}); modal.contentWrapper.css({width: 'auto', height: 'auto'}); if (!currentSettings.blocker && currentSettings.windowResize) { $(window).bind('resize.nyroModal', function() { window.clearTimeout(windowResizeTimeout); windowResizeTimeout = window.setTimeout(windowResizeHandler, 200); }); } } } function windowResizeHandler() { $.nyroModalSettings(initSettingsSize); } // Show the modal (ie: the background and then the loading if needed or the content directly) function showModal() { debug('showModal'); if (!modal.ready) { initModal(); modal.anim = true; currentSettings.showBackground(modal, currentSettings, endBackground); } else { modal.anim = true; modal.transition = true; currentSettings.showTransition(modal, currentSettings, function(){endHideContent();modal.anim=false;showContentOrLoading();}); } } // Called when user click on background function clickBg(e) { if (!currentSettings.modal) removeModal(); } // Used for the escape key or the arrow in the gallery type function keyHandler(e) { if (e.keyCode == 27) { if (!currentSettings.modal) removeModal(); } else if (currentSettings.gallery && modal.ready && modal.dataReady && !modal.anim && !modal.transition) { if (e.keyCode == 39 || e.keyCode == 40) { e.preventDefault(); $.nyroModalNext(); return false; } else if (e.keyCode == 37 || e.keyCode == 38) { e.preventDefault(); $.nyroModalPrev(); return false; } } } // Determine the filetype regarding the link DOM element function fileType() { var from = currentSettings.from; var url; if (from && from.nodeName) { var jFrom = $(from); url = jFrom.attr(from.nodeName.toLowerCase() == 'form' ? 'action' : 'href'); if (!url) url = location.href.substring(window.location.host.length+7); currentSettings.url = url; if (jFrom.attr('rev') == 'modal') currentSettings.modal = true; currentSettings.title = jFrom.attr('title'); if (from && from.rel && from.rel.toLowerCase() != 'nofollow') { var indexSpace = from.rel.indexOf(' '); currentSettings.gallery = indexSpace > 0 ? from.rel.substr(0, indexSpace) : from.rel; } var imgType = imageType(url, from); if (imgType) return imgType; if (isSwf(url)) return 'swf'; var iframe = false; if (from.target && from.target.toLowerCase() == '_blank' || (from.hostname && from.hostname.replace(/:\d*$/,'') != window.location.hostname.replace(/:\d*$/,''))) { iframe = true; } if (from.nodeName.toLowerCase() == 'form') { if (iframe) return 'iframeForm'; setCurrentSettings(extractUrlSel(url)); if (jFrom.attr('enctype') == 'multipart/form-data') return 'formData'; return 'form'; } if (iframe) return 'iframe'; } else { url = currentSettings.url; if (!currentSettings.content) currentSettings.from = true; if (!url) return null; if (isSwf(url)) return 'swf'; var reg1 = new RegExp("^http://|https://", "g"); if (url.match(reg1)) return 'iframe'; } var imgType = imageType(url, from); if (imgType) return imgType; var tmp = extractUrlSel(url); setCurrentSettings(tmp); if (!tmp.url) return tmp.selector; } function imageType(url, from) { var image = new RegExp(currentSettings.regexImg, 'i'); if (image.test(url)) { return 'image'; } } function isSwf(url) { var swf = new RegExp('[^\.]\.(swf)\s*$', 'i'); return swf.test(url); } function extractUrlSel(url) { var ret = { url: null, selector: null }; if (url) { var hash = getHash(url); var hashLoc = getHash(window.location.href); var curLoc = window.location.href.substring(0, window.location.href.length - hashLoc.length); var req = url.substring(0, url.length - hash.length); if (req == curLoc || req == $('base').attr('href')) { ret.selector = hash; } else { ret.url = req; ret.selector = hash; } } return ret; } // Called when the content cannot be loaded or tiemout reached function loadingError() { debug('loadingError'); modal.error = true; if (!modal.ready) return; if ($.isFunction(currentSettings.handleError)) currentSettings.handleError(modal, currentSettings); modal.loading .addClass(currentSettings.errorClass) .html(currentSettings.contentError); $(currentSettings.closeSelector, modal.loading) .unbind('click.nyroModal') .bind('click.nyroModal', removeModal); setMarginLoading(); modal.loading .css({ marginTop: currentSettings.marginTopLoading+'px', marginLeft: currentSettings.marginLeftLoading+'px' }); } // Put the content from modal.tmp to modal.content function fillContent() { debug('fillContent'); if (!modal.tmp.html()) return; modal.content.html(modal.tmp.contents()); modal.tmp.empty(); wrapContent(); if (currentSettings.type == 'iframeForm') { $(currentSettings.from) .attr('target', 'nyroModalIframe') .data('nyroModalprocessing', 1) .submit() .attr('target', '_blank') .removeData('nyroModalprocessing'); } if (!currentSettings.modal) modal.wrapper.prepend(currentSettings.closeButton); if ($.isFunction(currentSettings.endFillContent)) currentSettings.endFillContent(modal, currentSettings); modal.content.append(modal.scripts); $(currentSettings.closeSelector, modal.contentWrapper) .unbind('click.nyroModal') .bind('click.nyroModal', removeModal); $(currentSettings.openSelector, modal.contentWrapper).nyroModal(getCurrentSettingsNew()); } // Get the current settings to be used in new links function getCurrentSettingsNew() { return callingSettings; var currentSettingsNew = $.extend(true, {}, currentSettings); if (resized.width) currentSettingsNew.width = null; else currentSettingsNew.width = initSettingsSize.width; if (resized.height) currentSettingsNew.height = null; else currentSettingsNew.height = initSettingsSize.height; currentSettingsNew.cssOpt.content.overflow = 'auto'; return currentSettingsNew; } // Wrap the content and update the modal size if needed function wrapContent() { debug('wrapContent'); var wrap = $(currentSettings.wrap[currentSettings.type]); modal.content.append(wrap.children().remove()); modal.contentWrapper.wrapInner(wrap); if (currentSettings.gallery) { // Set the action for the next and prev button (or remove them) modal.content.append(currentSettings.galleryLinks); gallery.links = $('[rel="'+currentSettings.gallery+'"], [rel^="'+currentSettings.gallery+' "]'); gallery.index = gallery.links.index(currentSettings.from); if (currentSettings.galleryCounts && $.isFunction(currentSettings.galleryCounts)) currentSettings.galleryCounts(gallery.index + 1, gallery.links.length, modal, currentSettings); var currentSettingsNew = getCurrentSettingsNew(); var linkPrev = getGalleryLink(-1); if (linkPrev) { var prev = $('.nyroModalPrev', modal.contentWrapper) .attr('href', linkPrev.attr('href')) .click(function(e) { e.preventDefault(); $.nyroModalPrev(); return false; }); if (isIE6 && currentSettings.type == 'swf') { prev.before($('').css({ position: prev.css('position'), top: prev.css('top'), left: prev.css('left'), width: prev.width(), height: prev.height(), opacity: 0, border: 'none' })); } } else { $('.nyroModalPrev', modal.contentWrapper).remove(); } var linkNext = getGalleryLink(1); if (linkNext) { var next = $('.nyroModalNext', modal.contentWrapper) .attr('href', linkNext.attr('href')) .click(function(e) { e.preventDefault(); $.nyroModalNext(); return false; }); if (isIE6 && currentSettings.type == 'swf') { next.before($('') .css($.extend({}, { position: next.css('position'), top: next.css('top'), left: next.css('left'), width: next.width(), height: next.height(), opacity: 0, border: 'none' }))); } } else { $('.nyroModalNext', modal.contentWrapper).remove(); } } calculateSize(); } function getGalleryLink(dir) { if (currentSettings.gallery) { if (!currentSettings.ltr) dir *= -1; var index = gallery.index + dir; if (index >= 0 && index < gallery.links.length) return gallery.links.eq(index); else if (currentSettings.galleryLoop) { if (index < 0) return gallery.links.eq(gallery.links.length-1); else return gallery.links.eq(0); } } return false; } // Calculate the size for the contentWrapper function calculateSize(resizing) { debug('calculateSize'); modal.wrapper = modal.contentWrapper.children('div:first'); resized.width = false; resized.height = false; if (false && !currentSettings.windowResizing) { initSettingsSize.width = currentSettings.width; initSettingsSize.height = currentSettings.height; } if (currentSettings.autoSizable && (!currentSettings.width || !currentSettings.height)) { modal.contentWrapper .css({ opacity: 0, width: 'auto', height: 'auto' }) .show(); var tmp = { width: 'auto', height: 'auto' }; if (currentSettings.width) { tmp.width = currentSettings.width; } else if (currentSettings.type == 'iframe') { tmp.width = currentSettings.minWidth; } if (currentSettings.height) { tmp.height = currentSettings.height; } else if (currentSettings.type == 'iframe') { tmp.height = currentSettings.minHeight; } modal.content.css(tmp); if (!currentSettings.width) { currentSettings.width = modal.content.outerWidth(true); resized.width = true; } if (!currentSettings.height) { currentSettings.height = modal.content.outerHeight(true); resized.height = true; } modal.contentWrapper.css({opacity: 1}); if (!resizing) modal.contentWrapper.hide(); } if (currentSettings.type != 'image' && currentSettings.type != 'swf') { currentSettings.width = Math.max(currentSettings.width, currentSettings.minWidth); currentSettings.height = Math.max(currentSettings.height, currentSettings.minHeight); } var outerWrapper = getOuter(modal.contentWrapper); var outerWrapper2 = getOuter(modal.wrapper); var outerContent = getOuter(modal.content); var tmp = { content: { width: currentSettings.width, height: currentSettings.height }, wrapper2: { width: currentSettings.width + outerContent.w.total, height: currentSettings.height + outerContent.h.total }, wrapper: { width: currentSettings.width + outerContent.w.total + outerWrapper2.w.total, height: currentSettings.height + outerContent.h.total + outerWrapper2.h.total } }; if (currentSettings.resizable) { var maxHeight = modal.blockerVars? modal.blockerVars.height : $(window).height() - outerWrapper.h.border - (tmp.wrapper.height - currentSettings.height); var maxWidth = modal.blockerVars? modal.blockerVars.width : $(window).width() - outerWrapper.w.border - (tmp.wrapper.width - currentSettings.width); maxHeight-= currentSettings.padding*2; maxWidth-= currentSettings.padding*2; if (tmp.content.height > maxHeight || tmp.content.width > maxWidth) { // We're gonna resize the modal as it will goes outside the view port if (currentSettings.type == 'image' || currentSettings.type == 'swf') { // An image is resized proportionnaly var useW = currentSettings.imgWidth?currentSettings.imgWidth : currentSettings.width; var useH = currentSettings.imgHeight?currentSettings.imgHeight : currentSettings.height; var diffW = tmp.content.width - useW; var diffH = tmp.content.height - useH; if (diffH < 0) diffH = 0; if (diffW < 0) diffW = 0; var calcH = maxHeight - diffH; var calcW = maxWidth - diffW; var ratio = Math.min(calcH/useH, calcW/useW); calcW = Math.floor(useW*ratio); calcH = Math.floor(useH*ratio); tmp.content.height = calcH + diffH; tmp.content.width = calcW + diffW; } else { // For an HTML content, we simply decrease the size tmp.content.height = Math.min(tmp.content.height, maxHeight); tmp.content.width = Math.min(tmp.content.width, maxWidth); } tmp.wrapper2 = { width: tmp.content.width + outerContent.w.total, height: tmp.content.height + outerContent.h.total }; tmp.wrapper = { width: tmp.content.width + outerContent.w.total + outerWrapper2.w.total, height: tmp.content.height + outerContent.h.total + outerWrapper2.h.total }; } } if (currentSettings.type == 'swf') { $('object, embed', modal.content) .attr('width', tmp.content.width) .attr('height', tmp.content.height); } else if (currentSettings.type == 'image') { $('img', modal.content).css({ width: tmp.content.width, height: tmp.content.height }); } modal.content.css($.extend({}, tmp.content, currentSettings.cssOpt.content)); modal.wrapper.css($.extend({}, tmp.wrapper2, currentSettings.cssOpt.wrapper2)); if (!resizing) modal.contentWrapper.css($.extend({}, tmp.wrapper, currentSettings.cssOpt.wrapper)); if (currentSettings.type == 'image' && currentSettings.addImageDivTitle) { // Adding the title for the image $('img', modal.content).removeAttr('alt'); var divTitle = $('div', modal.content); if (currentSettings.title != currentSettings.defaultImgAlt && currentSettings.title) { if (divTitle.length == 0) { divTitle = $('
'+currentSettings.title+'
'); modal.content.append(divTitle); } if (currentSettings.setWidthImgTitle) { var outerDivTitle = getOuter(divTitle); divTitle.css({width: (tmp.content.width + outerContent.w.padding - outerDivTitle.w.total)+'px'}); } } else if (divTitle.length = 0) { divTitle.remove(); } } if (currentSettings.title) setTitle(); tmp.wrapper.borderW = outerWrapper.w.border; tmp.wrapper.borderH = outerWrapper.h.border; setCurrentSettings(tmp.wrapper); setMargin(); } function removeModal(e) { debug('removeModal'); if (e) e.preventDefault(); if (modal.full && modal.ready) { $(document).unbind('keydown.nyroModal'); if (!currentSettings.blocker) $(window).unbind('resize.nyroModal'); modal.ready = false; modal.anim = true; modal.closing = true; if (modal.loadingShown || modal.transition) { currentSettings.hideLoading(modal, currentSettings, function() { modal.loading.hide(); modal.loadingShown = false; modal.transition = false; currentSettings.hideBackground(modal, currentSettings, endRemove); }); } else { if (fixFF) modal.content.css({position: ''}); // Fix Issue #10, remove the attribute modal.wrapper.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding modal.content.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding $('iframe', modal.content).hide(); // Fix issue 359 if ($.isFunction(currentSettings.beforeHideContent)) { currentSettings.beforeHideContent(modal, currentSettings, function() { currentSettings.hideContent(modal, currentSettings, function() { endHideContent(); currentSettings.hideBackground(modal, currentSettings, endRemove); }); }); } else { currentSettings.hideContent(modal, currentSettings, function() { endHideContent(); currentSettings.hideBackground(modal, currentSettings, endRemove); }); } } } if (e) return false; } function showContentOrLoading() { debug('showContentOrLoading'); if (modal.ready && !modal.anim) { if (modal.dataReady) { if (modal.tmp.html()) { modal.anim = true; if (modal.transition) { fillContent(); modal.animContent = true; currentSettings.hideTransition(modal, currentSettings, function() { modal.loading.hide(); modal.transition = false; modal.loadingShown = false; endShowContent(); }); } else { currentSettings.hideLoading(modal, currentSettings, function() { modal.loading.hide(); modal.loadingShown = false; fillContent(); setMarginLoading(); setMargin(); modal.animContent = true; currentSettings.showContent(modal, currentSettings, endShowContent); }); } } } else if (!modal.loadingShown && !modal.transition) { modal.anim = true; modal.loadingShown = true; if (modal.error) loadingError(); else modal.loading.html(currentSettings.contentLoading); $(currentSettings.closeSelector, modal.loading) .unbind('click.nyroModal') .bind('click.nyroModal', removeModal); setMarginLoading(); currentSettings.showLoading(modal, currentSettings, function(){modal.anim=false;showContentOrLoading();}); } } } // ------------------------------------------------------- // Private Data Loaded callback // ------------------------------------------------------- function ajaxLoaded(data) { debug('AjaxLoaded: '+this.url); if (currentSettings.selector) { var tmp = {}; var i = 0; // Looking for script to store them data = data .replace(/\r\n/gi,'nyroModalLN') .replace(//gi, function(x) { tmp[i] = x; return ''; }); data = $('
'+data+'
').find(currentSettings.selector).html() .replace(/
\n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += "
" + genlang(31, false) + "" + genlang(34, false) + "" + genlang(32, false) + "" + genlang(33, false) + "" + genlang(35, true) + "" + genlang(36, true) + "" + genlang(37, true) + "
  " + genlang(38, false) + "
\n"; $("#filesystem").append(html); filesystemTable = $("#filesystemTable").dataTable({ "bPaginate": false, "bLengthChange": false, "bFilter": false, "bSort": true, "bInfo": false, "bProcessing": true, "bAutoWidth": false, "bStateSave": true, "aoColumns": [{ "sType": 'span-string', "sWidth": "100px" }, { "sType": 'span-string', "sWidth": "50px" }, { "sType": 'span-string', "sWidth": "200px" }, { "sType": 'span-number' }, { "sType": 'span-number', "sWidth": "80px", "sClass": "right" }, { "sType": 'span-number', "sWidth": "80px", "sClass": "right" }, { "sType": 'span-number', "sWidth": "80px", "sClass": "right" }] }); } /** * fill all errors from the xml in the error div element in the document and show the error icon * @param {jQuery} xml phpSysInfo-XML */ function populateErrors(xml) { var values = false; $("Errors Error", xml).each(function getError(id) { // $("#errorlist").append("" + $(this).attr("Function") + "

" + $(this).text() + "

"); $("#errorlist").append("" + $(this).attr("Function") + "

" + $(this).attr("Message") + "

"); values = true; }); if (values) { $("#warn").css("display", "inline"); } } /** * show the page * @param {jQuery} xml phpSysInfo-XML */ function displayPage(xml) { var versioni = ""; if (cookie_template !== null) { $("#template").val(cookie_template); } if (cookie_language !== null) { $("#lang").val(cookie_language); } $("#loader").hide(); $("#container").fadeIn("slow"); versioni = $("Generation", xml).attr("version").toString(); $("#version").html(versioni); $("Options", xml).each(function getOptions(id) { var showPickListLang = "", showPickListTemplate = ""; showPickListLang = $(this).attr("showPickListLang"); showPickListTemplate = $(this).attr("showPickListTemplate"); if (showPickListTemplate === 'false') { $('#template').hide(); $('span[id=lang_044]').hide(); } if (showPickListLang === 'false') { $('#lang').hide(); $('span[id=lang_045]').hide(); } }); } /** * format seconds to a better readable statement with days, hours and minutes * @param {Number} sec seconds that should be formatted * @return {String} html string with no breaking spaces and translation statements */ function formatUptime(sec) { var txt = "", intMin = 0, intHours = 0, intDays = 0; intMin = sec / 60; intHours = intMin / 60; intDays = Math.floor(intHours / 24); intHours = Math.floor(intHours - (intDays * 24)); intMin = Math.floor(intMin - (intDays * 60 * 24) - (intHours * 60)); if (intDays) { txt += intDays.toString() + " " + genlang(48, false) + " "; } if (intHours) { txt += intHours.toString() + " " + genlang(49, false) + " "; } return txt + intMin.toString() + " " + genlang(50, false); } /** * format a given MHz value to a better readable statement with the right suffix * @param {Number} mhertz mhertz value that should be formatted * @return {String} html string with no breaking spaces and translation statements */ function formatHertz(mhertz) { if (mhertz && mhertz < 1000) { return mhertz.toString() + " " + genlang(92, true); } else { if (mhertz && mhertz >= 1000) { return round(mhertz / 1000, 2) + " " + genlang(93, true); } else { return ""; } } } /** * format the byte values into a user friendly value with the corespondenting unit expression
support is included * for binary and decimal output
user can specify a constant format for all byte outputs or the output is formated * automatically so that every value can be read in a user friendly way * @param {Number} bytes value that should be converted in the corespondenting format, which is specified in the phpsysinfo.ini * @param {jQuery} xml phpSysInfo-XML * @return {String} string of the converted bytes with the translated unit expression */ function formatBytes(bytes, xml) { var byteFormat = "", show = ""; $("Options", xml).each(function getByteFormat(id) { byteFormat = $(this).attr("byteFormat"); }); switch (byteFormat.toLowerCase()) { case "pib": show += round(bytes / Math.pow(1024, 5), 2); show += " " + genlang(90, true); break; case "tib": show += round(bytes / Math.pow(1024, 4), 2); show += " " + genlang(86, true); break; case "gib": show += round(bytes / Math.pow(1024, 3), 2); show += " " + genlang(87, true); break; case "mib": show += round(bytes / Math.pow(1024, 2), 2); show += " " + genlang(88, true); break; case "kib": show += round(bytes / Math.pow(1024, 1), 2); show += " " + genlang(89, true); break; case "pb": show += round(bytes / Math.pow(1000, 5), 2); show += " " + genlang(91, true); break; case "tb": show += round(bytes / Math.pow(1000, 4), 2); show += " " + genlang(85, true); break; case "gb": show += round(bytes / Math.pow(1000, 3), 2); show += " " + genlang(41, true); break; case "mb": show += round(bytes / Math.pow(1000, 2), 2); show += " " + genlang(40, true); break; case "kb": show += round(bytes / Math.pow(1000, 1), 2); show += " " + genlang(39, true); break; case "b": show += bytes; show += " " + genlang(96, true); break; case "auto_decimal": if (bytes > Math.pow(1000, 5)) { show += round(bytes / Math.pow(1000, 5), 2); show += " " + genlang(91, true); } else { if (bytes > Math.pow(1000, 4)) { show += round(bytes / Math.pow(1000, 4), 2); show += " " + genlang(85, true); } else { if (bytes > Math.pow(1000, 3)) { show += round(bytes / Math.pow(1000, 3), 2); show += " " + genlang(41, true); } else { if (bytes > Math.pow(1000, 2)) { show += round(bytes / Math.pow(1000, 2), 2); show += " " + genlang(40, true); } else { if (bytes > Math.pow(1000, 1)) { show += round(bytes / Math.pow(1000, 1), 2); show += " " + genlang(39, true); } else { show += bytes; show += " " + genlang(96, true); } } } } } break; default: if (bytes > Math.pow(1024, 5)) { show += round(bytes / Math.pow(1024, 5), 2); show += " " + genlang(90, true); } else { if (bytes > Math.pow(1024, 4)) { show += round(bytes / Math.pow(1024, 4), 2); show += " " + genlang(86, true); } else { if (bytes > Math.pow(1024, 3)) { show += round(bytes / Math.pow(1024, 3), 2); show += " " + genlang(87, true); } else { if (bytes > Math.pow(1024, 2)) { show += round(bytes / Math.pow(1024, 2), 2); show += " " + genlang(88, true); } else { if (bytes > Math.pow(1024, 1)) { show += round(bytes / Math.pow(1024, 1), 2); show += " " + genlang(89, true); } else { show += bytes; show += " " + genlang(96, true); } } } } } } return show; } /** * format a celcius temperature to fahrenheit and also append the right suffix * @param {String} degreeC temperature in celvius * @param {jQuery} xml phpSysInfo-XML * @return {String} html string with no breaking spaces and translation statements */ function formatTemp(degreeC, xml) { var tempFormat = "", degree = 0; $("Options", xml).each(function getOptions(id) { tempFormat = $(this).attr("tempFormat").toString().toLowerCase(); }); degree = parseFloat(degreeC); if (isNaN(degreeC)) { return "---"; } else { switch (tempFormat) { case "f": return round((((9 * degree) / 5) + 32), 1) + " " + genlang(61, true); case "c": return round(degree, 1) + " " + genlang(60, true); case "c-f": return round(degree, 1) + " " + genlang(60, true) + "
(" + round((((9 * degree) / 5) + 32), 1) + " " + genlang(61, true) + ")"; case "f-c": return round((((9 * degree) / 5) + 32), 1) + " " + genlang(61, true) + "
(" + round(degree, 1) + " " + genlang(60, true) + ")"; } } } /** * create a visual HTML bar from a given size, the layout of that bar can be costumized through the bar css-class * @param {Number} size barclass * @return {String} HTML string which contains the full layout of the bar */ function createBar(size, barclass) { if (barclass === undefined) { barclass = "bar"; } return "
 
 " + size + "%"; } /** * (re)fill the vitals block with the values from the given xml * @param {jQuery} xml phpSysInfo-XML */ function refreshVitals(xml) { var hostname = "", ip = "", kernel = "", distro = "", icon = "", uptime = "", users = 0, loadavg = ""; var processes = 0, prunning = 0, psleeping = 0, pstopped = 0, pzombie = 0, pwaiting = 0, pother = 0; var syslang = "", codepage = ""; var lastboot = 0; var timestamp = parseInt($("Generation", xml).attr("timestamp"), 10)*1000; //server time var not_first = false; if (isNaN(timestamp)) timestamp = Number(new Date()); //client time $("Vitals", xml).each(function getVitals(id) { hostname = $(this).attr("Hostname"); ip = $(this).attr("IPAddr"); kernel = $(this).attr("Kernel"); distro = $(this).attr("Distro"); icon = $(this).attr("Distroicon"); uptime = formatUptime(parseInt($(this).attr("Uptime"), 10)); lastboot = new Date(timestamp - (parseInt($(this).attr("Uptime"), 10)*1000)); users = parseInt($(this).attr("Users"), 10); loadavg = $(this).attr("LoadAvg"); if ($(this).attr("CPULoad") !== undefined) { loadavg = loadavg + "
" + createBar(parseInt($(this).attr("CPULoad"), 10)); } if ($(this).attr("SysLang") !== undefined) { syslang = $(this).attr("SysLang"); document.getElementById("s_syslang_tr").style.display=''; } if ($(this).attr("CodePage") !== undefined) { codepage = $(this).attr("CodePage"); if ($(this).attr("SysLang") !== undefined) { document.getElementById("s_codepage_tr1").style.display=''; } else { document.getElementById("s_codepage_tr2").style.display=''; } } //processes if ($(this).attr("Processes") !== undefined) { processes = parseInt($(this).attr("Processes"), 10); if ((($(this).attr("CodePage") !== undefined) && ($(this).attr("SysLang") == undefined)) || (($(this).attr("CodePage") == undefined) && ($(this).attr("SysLang") !== undefined))) { document.getElementById("s_processes_tr1").style.display=''; } else { document.getElementById("s_processes_tr2").style.display=''; } } if ($(this).attr("ProcessesRunning") !== undefined) { prunning = parseInt($(this).attr("ProcessesRunning"), 10); } if ($(this).attr("ProcessesSleeping") !== undefined) { psleeping = parseInt($(this).attr("ProcessesSleeping"), 10); } if ($(this).attr("ProcessesStopped") !== undefined) { pstopped = parseInt($(this).attr("ProcessesStopped"), 10); } if ($(this).attr("ProcessesZombie") !== undefined) { pzombie = parseInt($(this).attr("ProcessesZombie"), 10); } if ($(this).attr("ProcessesWaiting") !== undefined) { pwaiting = parseInt($(this).attr("ProcessesWaiting"), 10); } if ($(this).attr("ProcessesOther") !== undefined) { pother = parseInt($(this).attr("ProcessesOther"), 10); } document.title = "System information: " + hostname + " (" + ip + ")"; $("#s_hostname_title").html(hostname); $("#s_ip_title").html(ip); $("#s_hostname").html(hostname); $("#s_ip").html(ip); $("#s_kernel").html(kernel); $("#s_distro").html("Icon " + distro); $("#s_uptime").html(uptime); if (typeof(lastboot.toUTCString)==="function") { $("#s_lastboot").html(lastboot.toUTCString()); //toUTCstring() or toLocaleString() } else { //deprecated $("#s_lastboot").html(lastboot.toGMTString()); //toGMTString() or toLocaleString() } $("#s_users").html(users); $("#s_loadavg").html(loadavg); $("#s_syslang").html(syslang); $("#s_codepage_1").html(codepage); $("#s_codepage_2").html(codepage); $("#s_processes_1").html(processes); if (prunning || psleeping || pstopped || pzombie || pwaiting || pother) { $("#s_processes_1").append(" ("); var typelist = {running:111,sleeping:112,stopped:113,zombie:114,waiting:115,other:116}; for (var proc_type in typelist) { if (eval("p" + proc_type)) { if (not_first) { $("#s_processes_1").append(", "); } $("#s_processes_1").append(eval("p" + proc_type) + " " + genlang(typelist[proc_type], true)); not_first = true; } } $("#s_processes_1").append(") "); } $("#s_processes_2").html($("#s_processes_1").html()); }); } /** * build the cpu information as table rows * @param {jQuery} xml phpSysInfo-XML * @param {Array} tree array that holds the positions for treetable plugin * @param {Number} rootposition position of the parent element * @param {Array} collapsed array that holds all collapsed elements hwne opening page */ function fillCpu(xml, tree, rootposition, collapsed) { var cpucount = 0, html = ""; var showCPUInfoExpanded = ""; var showCPUListExpanded = ""; $("Options", xml).each(function getOptions(id) { showCPUInfoExpanded = $(this).attr("showCPUInfoExpanded"); showCPUListExpanded = $(this).attr("showCPUListExpanded"); }); $("Hardware CPU CpuCore", xml).each(function getCpuCore(cpuCoreId) { var model = "", speed = 0, bus = 0, cache = 0, bogo = 0, temp = 0, load = 0, speedmax = 0, speedmin = 0, cpucoreposition = 0, virt = ""; cpucount += 1; model = $(this).attr("Model"); speed = parseInt($(this).attr("CpuSpeed"), 10); speedmax = parseInt($(this).attr("CpuSpeedMax"), 10); speedmin = parseInt($(this).attr("CpuSpeedMin"), 10); cache = parseInt($(this).attr("Cache"), 10); virt = $(this).attr("Virt"); bus = parseInt($(this).attr("BusSpeed"), 10); temp = parseInt($(this).attr("Cputemp"), 10); bogo = parseInt($(this).attr("Bogomips"), 10); load = parseInt($(this).attr("Load"), 10); if (showCPUListExpanded === 'false') { collapsed.push(rootposition); } html += "" + model + "\n"; cpucoreposition = tree.push(rootposition); if (showCPUInfoExpanded !== 'true') { collapsed.push(cpucoreposition); } if (!isNaN(speed)) { html += "" + genlang(13, true) + ":" + formatHertz(speed) + "\n"; tree.push(cpucoreposition); } if (!isNaN(speedmax)) { html += "" + genlang(100, true) + ":" + formatHertz(speedmax) + "\n"; tree.push(cpucoreposition); } if (!isNaN(speedmin)) { html += "" + genlang(101, true) + ":" + formatHertz(speedmin) + "\n"; tree.push(cpucoreposition); } if (!isNaN(cache)) { html += "" + genlang(15, true) + ":" + formatBytes(cache) + "\n"; tree.push(cpucoreposition); } if (virt != undefined) { html += "" + genlang(94, true) + ":" + virt + "\n"; tree.push(cpucoreposition); } if (!isNaN(bus)) { html += "" + genlang(14, true) + ":" + formatHertz(bus) + "\n"; tree.push(cpucoreposition); } if (!isNaN(bogo)) { html += "" + genlang(16, true) + ":" + bogo.toString() + "\n"; tree.push(cpucoreposition); } if (!isNaN(temp)) { html += "" + genlang(51, true) + ":" + formatTemp(temp, xml) + "\n"; tree.push(cpucoreposition); } if (!isNaN(load)) { html += "" + genlang(9, true) + ":" + createBar(load) + "\n"; tree.push(cpucoreposition); } }); if (cpucount === 0) { html += "" + genlang(42, true) + "\n"; tree.push(rootposition); } return html; } /** * build rows for a treetable out of the hardwaredevices * @param {jQuery} xml phpSysInfo-XML * @param {String} type type of the hardware device * @param {Array} tree array that holds the positions for treetable plugin * @param {Number} rootposition position of the parent element */ function fillHWDevice(xml, type, tree, rootposition) { var devicecount = 0, html = ""; $("Hardware " + type + " Device", xml).each(function getPciDevice(deviceId) { var name = "", count = 0; devicecount += 1; name = $(this).attr("Name"); count = parseInt($(this).attr("Count"), 10); if (!isNaN(count) && count > 1) { name = "(" + count + "x) " + name; } html += "" + name + "\n"; tree.push(rootposition); }); if (devicecount === 0) { html += "" + genlang(42, true) + "\n"; tree.push(rootposition); } return html; } /** * (re)fill the hardware block with the values from the given xml * @param {jQuery} xml phpSysInfo-XML */ function refreshHardware(xml) { var html = "", tree = [], closed = [], index = 0, machine = ""; $("#hardware").empty(); html += "

" + genlang(10, false) + "

\n"; html += " \n"; html += " \n"; $("Hardware", xml).each(function getMachine(id) { machine = $(this).attr("Name"); }); if ( (machine !== undefined) && (machine != "") ) { html += " \n"; html += "\n"; tree.push(tree.push(0)); } html += " \n"; html += fillCpu(xml, tree, tree.push(0), closed); html += " \n"; index = tree.push(0); closed.push(index); html += fillHWDevice(xml, 'PCI', tree, index); html += " \n"; index = tree.push(0); closed.push(index); html += fillHWDevice(xml, 'IDE', tree, index); html += " \n"; index = tree.push(0); closed.push(index); html += fillHWDevice(xml, 'SCSI', tree, index); html += " \n"; index = tree.push(0); closed.push(index); html += fillHWDevice(xml, 'USB', tree, index); html += " \n"; html += "
" + genlang(107, false) + "
" + machine + "
" + genlang(11, false) + "
" + genlang(17, false) + "
" + genlang(18, false) + "
" + genlang(19, false) + "
" + genlang(20, false) + "
\n"; $("#hardware").append(html); $("#HardwareTree").jqTreeTable(tree, { openImg: "./gfx/treeTable/tv-collapsable.gif", shutImg: "./gfx/treeTable/tv-expandable.gif", leafImg: "./gfx/treeTable/tv-item.gif", lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", lastLeafImg: "./gfx/treeTable/tv-item-last.gif", vertLineImg: "./gfx/treeTable/vertline.gif", blankImg: "./gfx/treeTable/blank.gif", collapse: closed, column: 0, striped: true, highlight: false, state: false }); } /** *(re)fill the network block with the values from the given xml * @param {jQuery} xml phpSysInfo-XML */ function refreshNetwork(xml) { var tree = [], closed = [], html0= "", html1= "" ,html = "", isinfo = false; $("#network").empty(); html0 += "

" + genlang(21, false) + "

\n"; html1 += " \n"; html1 += " \n"; html1 += " " + genlang(22, true) + "\n"; html1 += " " + genlang(23, true) + "\n"; html1 += " " + genlang(24, true) + "\n"; html1 += " " + genlang(25, true) + "\n"; html1 += " \n"; html1 += " \n"; $("Network NetDevice", xml).each(function getDevice(id) { var name = "", rx = 0, tx = 0, er = 0, dr = 0, info = "", networkindex = 0; name = $(this).attr("Name"); rx = parseInt($(this).attr("RxBytes"), 10); tx = parseInt($(this).attr("TxBytes"), 10); er = parseInt($(this).attr("Err"), 10); dr = parseInt($(this).attr("Drops"), 10); html +="" + name + "" + formatBytes(rx, xml) + "" + formatBytes(tx, xml) + "" + er.toString() + "\/​" + dr.toString() + ""; networkindex = tree.push(0); info = $(this).attr("Info"); if ( (info !== undefined) && (info != "") ) { var i =0, infos = info.replace(/:/g, "​:").split(";"); /* split long addresses */ isinfo = true; for(i = 0; i < infos.length; i++){ html +="" + infos[i] + ""; tree.push(networkindex); } closed.push(networkindex); } }); html += "\n"; html += "\n"; if (isinfo) { html0 += "\n"; html1 += " \n"; } else { html0 += "
\n"; html1 += " \n"; } $("#network").append(html0+html1+html); if (isinfo) $("#NetworkTree").jqTreeTable(tree, { openImg: "./gfx/treeTable/tv-collapsable.gif", shutImg: "./gfx/treeTable/tv-expandable.gif", leafImg: "./gfx/treeTable/tv-item.gif", lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", lastLeafImg: "./gfx/treeTable/tv-item-last.gif", vertLineImg: "./gfx/treeTable/vertline.gif", blankImg: "./gfx/treeTable/blank.gif", collapse: closed, column: 0, striped: true, highlight: false, state: false }); } /** * (re)fill the memory block with the values from the given xml * @param {jQuery} xml phpSysInfo-XML */ function refreshMemory(xml) { var html = "", tree = [], closed = []; $("#memory").empty(); html += "

" + genlang(27, false) + "

\n"; html += "
\n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; html += " \n"; $("Memory", xml).each(function getMemory(id) { var free = 0, total = 0, used = 0, percent = 0, memoryindex = 0; free = parseInt($(this).attr("Free"), 10); used = parseInt($(this).attr("Used"), 10); total = parseInt($(this).attr("Total"), 10); percent = parseInt($(this).attr("Percent"), 10); html += ""; memoryindex = tree.push(0); $("Memory Details", xml).each(function getMemorydetails(id) { var app = 0, appp = 0, buff = 0, buffp = 0, cached = 0, cachedp = 0; app = parseInt($(this).attr("App"), 10); appp = parseInt($(this).attr("AppPercent"), 10); buff = parseInt($(this).attr("Buffers"), 10); buffp = parseInt($(this).attr("BuffersPercent"), 10); cached = parseInt($(this).attr("Cached"), 10); cachedp = parseInt($(this).attr("CachedPercent"), 10); if (!isNaN(app)) { html += ""; tree.push(memoryindex); } if (!isNaN(cached)) { html += ""; tree.push(memoryindex); } if (!isNaN(buff)) { html += ""; tree.push(memoryindex); } if (!isNaN(app) || !isNaN(buff) || !isNaN(cached)) { closed.push(memoryindex); } }); }); $("Memory Swap", xml).each(function getSwap(id) { var free = 0, total = 0, used = 0, percent = 0, swapindex = 0; free = parseInt($(this).attr("Free"), 10); used = parseInt($(this).attr("Used"), 10); total = parseInt($(this).attr("Total"), 10); percent = parseInt($(this).attr("Percent"), 10); html += ""; swapindex = tree.push(0); $("Memory Swap Mount", xml).each(function getDevices(id) { var free = 0, total = 0, used = 0, percent = 0, mpoint = "", mpid = 0; closed.push(swapindex); free = parseInt($(this).attr("Free"), 10); used = parseInt($(this).attr("Used"), 10); total = parseInt($(this).attr("Total"), 10); percent = parseInt($(this).attr("Percent"), 10); mpid = parseInt($(this).attr("MountPointID"), 10); mpoint = $(this).attr("MountPoint"); if (mpoint === undefined) { mpoint = mpid; } html += ""; tree.push(swapindex); }); }); html += " \n"; html += "
" + genlang(34, true) + "" + genlang(33, true) + "" + genlang(35, true) + "" + genlang(36, true) + "" + genlang(37, true) + "
" + genlang(28, false) + "" + createBar(percent) + "" + formatBytes(free, xml) + "" + formatBytes(used, xml) + "" + formatBytes(total, xml) + "
" + genlang(64, false) + "" + createBar(appp) + " " + formatBytes(app, xml) + " 
" + genlang(66, false) + "" + createBar(cachedp) + " " + formatBytes(cached, xml) + " 
" + genlang(65, false) + "" + createBar(buffp) + " " + formatBytes(buff, xml) + " 
" + genlang(29, false) + "" + createBar(percent) + "" + formatBytes(free, xml) + "" + formatBytes(used, xml) + "" + formatBytes(total, xml) + "
" + mpoint + "" + createBar(percent) + "" + formatBytes(free, xml) + "" + formatBytes(used, xml) + "" + formatBytes(total, xml) + "
\n"; $("#memory").append(html); $("#MemoryTree").jqTreeTable(tree, { openImg: "./gfx/treeTable/tv-collapsable.gif", shutImg: "./gfx/treeTable/tv-expandable.gif", leafImg: "./gfx/treeTable/tv-item.gif", lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", lastLeafImg: "./gfx/treeTable/tv-item-last.gif", vertLineImg: "./gfx/treeTable/vertline.gif", blankImg: "./gfx/treeTable/blank.gif", collapse: closed, column: 0, striped: true, highlight: false, state: false }); } /** * (re)fill the filesystems block with the values from the given xml

* appends the filesystems (each in a row) to the filesystem table in the tbody
before the rows are inserted the entire * tbody is cleared * @param {jQuery} xml phpSysInfo-XML */ function refreshFilesystems(xml) { var total_usage = 0, total_used = 0, total_free = 0, total_size = 0, threshold = 0; filesystemTable.fnClearTable(); $("Options", xml).each(function getThreshold(id) { threshold = parseInt($(this).attr("threshold"), 10); }); $("FileSystem Mount", xml).each(function getMount(mid) { var mpoint = "", mpid = 0, type = "", name = "", free = 0, used = 0, size = 0, percent = 0, options = "", inodes = 0, inodes_text = "", options_text = ""; mpid = parseInt($(this).attr("MountPointID"), 10); type = $(this).attr("FSType"); name = $(this).attr("Name"); free = parseInt($(this).attr("Free"), 10); used = parseInt($(this).attr("Used"), 10); size = parseInt($(this).attr("Total"), 10); percent = parseInt($(this).attr("Percent"), 10); options = $(this).attr("MountOptions"); inodes = parseInt($(this).attr("Inodes"), 10); mpoint = $(this).attr("MountPoint"); if (mpoint === undefined) { mpoint = mpid; } if (options !== undefined) { options_text = "
(" + options + ")"; } if (!isNaN(inodes)) { inodes_text = " (" + inodes.toString() + "%)"; } if (!isNaN(threshold) && (percent >= threshold)) { filesystemTable.fnAddData(["" + mpoint + "" + mpoint, "" + type + "" + type, "" + name + "" + name + options_text, "" + percent.toString() + "" + createBar(percent, "barwarn") + inodes_text, "" + free.toString() + "" + formatBytes(free, xml), "" + used.toString() + "" + formatBytes(used, xml), "" + size.toString() + "" + formatBytes(size, xml)]); } else { filesystemTable.fnAddData(["" + mpoint + "" + mpoint, "" + type + "" + type, "" + name + "" + name + options_text, "" + percent.toString() + "" + createBar(percent) + inodes_text, "" + free.toString() + "" + formatBytes(free, xml), "" + used.toString() + "" + formatBytes(used, xml), "" + size.toString() + "" + formatBytes(size, xml)]); } total_used += used; total_free += free; total_size += size; total_usage = round((total_used / total_size) * 100, 2); }); if (!isNaN(threshold) && (total_usage >= threshold)) { $("#s_fs_total").html(createBar(total_usage, "barwarn")); } else { $("#s_fs_total").html(createBar(total_usage)); } $("#s_fs_tfree").html(formatBytes(total_free, xml)); $("#s_fs_tused").html(formatBytes(total_used, xml)); $("#s_fs_tsize").html(formatBytes(total_size, xml)); } /** * (re)fill the temperature block with the values from the given xml

* build the block content for the temperature block, this includes normal temperature information in the XML * and also the HDDTemp information, if there are no information the entire table will be removed * to avoid HTML warnings * @param {jQuery} xml phpSysInfo-XML */ function refreshTemp(xml) { var values = false; $("#tempTable tbody").empty(); $("MBInfo Temperature Item", xml).each(function getTemperatures(id) { var label = "", value = "", limit = 0, _limit = "", event = ""; label = $(this).attr("Label"); value = $(this).attr("Value").replace(/\+/g, ""); limit = ($(this).attr("Max") !== undefined) ? parseFloat($(this).attr("Max").replace(/\+/g, "")) : 'NaN'; if (isFinite(limit)) _limit = formatTemp(limit, xml); event = $(this).attr("Event"); if (event !== undefined) label += " \"!\""; $("#tempTable tbody").append("" + label + "" + formatTemp(value, xml) + "" + _limit + ""); values = true; }); if (values) { $("#temp").show(); } else { $("#temp").remove(); } } /** * (re)fill the voltage block with the values from the given xml

* build the voltage information into a separate block, if there is no voltage information available the * entire table will be removed to avoid HTML warnings * @param {jQuery} xml phpSysInfo-XML */ function refreshVoltage(xml) { var values = false; $("#voltageTable tbody").empty(); $("MBInfo Voltage Item", xml).each(function getVoltages(id) { var label = "", value = 0, max = 0, min = 0, _min = "", _max = "", event = ""; label = $(this).attr("Label"); value = parseFloat($(this).attr("Value")); max = parseFloat($(this).attr("Max")); if (isFinite(max)) _max = round(max, 2) + " " + genlang(62, true); min = parseFloat($(this).attr("Min")); if (isFinite(min)) _min = round(min, 2) + " " + genlang(62, true); event = $(this).attr("Event"); if (event !== undefined) label += " \"!\""; $("#voltageTable tbody").append("" + label + "" + round(value, 2) + " " + genlang(62, true) + "" + _min + "" + _max + ""); values = true; }); if (values) { $("#voltage").show(); } else { $("#voltage").remove(); } } /** * (re)fill the fan block with the values from the given xml

* build the fan information into a separate block, if there is no fan information available the * entire table will be removed to avoid HTML warnings * @param {jQuery} xml phpSysInfo-XML */ function refreshFan(xml) { var values = false; $("#fanTable tbody").empty(); $("MBInfo Fans Item", xml).each(function getFans(id) { var label = "", value = 0, min = 0, _min = "", event = ""; label = $(this).attr("Label"); value = parseFloat($(this).attr("Value")); min = parseFloat($(this).attr("Min")); if (isFinite(min)) _min = round(min,0) + " " + genlang(63, true); event = $(this).attr("Event"); if (event !== undefined) label += " \"!\""; $("#fanTable tbody").append("" + label + "" + round(value,0) + " " + genlang(63, true) + "" + _min + ""); values = true; }); if (values) { $("#fan").show(); } else { $("#fan").remove(); } } /** * (re)fill the power block with the values from the given xml

* build the power information into a separate block, if there is no power information available the * entire table will be removed to avoid HTML warnings * @param {jQuery} xml phpSysInfo-XML */ function refreshPower(xml) { var values = false; $("#powerTable tbody").empty(); $("MBInfo Power Item", xml).each(function getPowers(id) { var label = "", value = "", limit = 0, _limit = "", event = ""; label = $(this).attr("Label"); value = $(this).attr("Value").replace(/\+/g, ""); limit = ($(this).attr("Max") !== undefined) ? parseFloat($(this).attr("Max").replace(/\+/g, "")) : 'NaN'; if (isFinite(limit)) _limit = round(limit, 2) + " " + genlang(103, true); event = $(this).attr("Event"); if (event !== undefined) label += " \"!\""; $("#powerTable tbody").append("" + label + "" + round(value, 2) + " " + genlang(103, true) + "" + _limit + ""); values = true; }); if (values) { $("#power").show(); } else { $("#power").remove(); } } /** * (re)fill the current block with the values from the given xml

* build the current information into a separate block, if there is no current information available the * entire table will be removed to avoid HTML warnings * @param {jQuery} xml phpSysInfo-XML */ function refreshCurrent(xml) { var values = false; $("#currentTable tbody").empty(); $("MBInfo Current Item", xml).each(function getCurrents(id) { var label = "", value = "", limit = 0, _limit = "", event = ""; label = $(this).attr("Label"); value = $(this).attr("Value").replace(/\+/g, ""); limit = ($(this).attr("Max") !== undefined) ? parseFloat($(this).attr("Max").replace(/\+/g, "")) : 'NaN'; if (isFinite(limit)) _limit = round(limit, 2) + " " + genlang(106, true); event = $(this).attr("Event"); if (event !== undefined) label += " \"!\""; $("#currentTable tbody").append("" + label + "" + round(value, 2) + " " + genlang(106, true) + "" + _limit + ""); values = true; }); if (values) { $("#current").show(); } else { $("#current").remove(); } } /** * (re)fill the ups block with the values from the given xml

* build the ups information into a separate block, if there is no ups information available the * entire table will be removed to avoid HTML warnings * @param {jQuery} xml phpSysInfo-XML */ function refreshUps(xml) { var add_apcupsd_cgi_links = ($("[ApcupsdCgiLinks='1']", xml).length > 0); var html = "", tree = [], closed = [], index = 0, values = false; html += "

" + genlang(68, false) + "

\n"; html += " \n"; html += " \n"; $("#ups").empty(); $("UPSInfo UPS", xml).each(function getUps(id) { var name = "", model = "", mode = "", start_time = "", upsstatus = "", temperature = "", outages_count = "", last_outage = "", last_outage_finish = "", line_voltage = "", line_frequency = "", load_percent = "", battery_date = "", battery_voltage = "", battery_charge_percent = "", time_left_minutes = ""; name = $(this).attr("Name"); model = $(this).attr("Model"); mode = $(this).attr("Mode"); start_time = $(this).attr("StartTime"); upsstatus = $(this).attr("Status"); temperature = $(this).attr("Temperature"); outages_count = $(this).attr("OutagesCount"); last_outage = $(this).attr("LastOutage"); last_outage_finish = $(this).attr("LastOutageFinish"); line_voltage = $(this).attr("LineVoltage"); line_frequency = $(this).attr("LineFrequency"); load_percent = parseInt($(this).attr("LoadPercent"), 10); battery_date = $(this).attr("BatteryDate"); battery_voltage = $(this).attr("BatteryVoltage"); battery_charge_percent = parseInt($(this).attr("BatteryChargePercent"), 10); time_left_minutes = $(this).attr("TimeLeftMinutes"); html += "\n"; index = tree.push(0); if (model !== undefined) { html += "\n"; tree.push(index); } if (start_time !== undefined) { html += "\n"; tree.push(index); } if (upsstatus !== undefined) { html += "\n"; tree.push(index); } if (temperature !== undefined) { html += "\n"; tree.push(index); } if (outages_count !== undefined) { html += "\n"; tree.push(index); } if (last_outage !== undefined) { html += "\n"; tree.push(index); } if (last_outage_finish !== undefined) { html += "\n"; tree.push(index); } if (line_voltage !== undefined) { html += "\n"; tree.push(index); } if (line_frequency !== undefined) { html += "\n"; tree.push(index); } if (!isNaN(load_percent)) { html += "\n"; tree.push(index); } if (battery_date !== undefined) { html += "\n"; tree.push(index); } if (battery_voltage !== undefined) { html += "\n"; tree.push(index); } if (!isNaN(battery_charge_percent)) { html += "\n"; tree.push(index); } if (time_left_minutes !== undefined) { html += "\n"; tree.push(index); } values=true; }); html += " \n"; html += "
" + name + " (" + mode + ")
" + genlang(70, false) + "" + model + "
" + genlang(72, false) + "" + start_time + "
" + genlang(73, false) + "" + upsstatus + "
" + genlang(84, false) + "" + temperature + "
" + genlang(74, false) + "" + outages_count + "
" + genlang(75, false) + "" + last_outage + "
" + genlang(76, false) + "" + last_outage_finish + "
" + genlang(77, false) + "" + line_voltage + " " + genlang(82, true) + "
" + genlang(108, false) + "" + line_frequency + " " + genlang(109, true) + "
" + genlang(78, false) + "" + createBar(load_percent) + "
" + genlang(104, false) + "" + battery_date + "
" + genlang(79, false) + "" + battery_voltage + " " + genlang(82, true) + "
" + genlang(80, false) + "" + createBar(battery_charge_percent) + "
" + genlang(81, false) + "" + time_left_minutes + " " + genlang(83, false) + "
\n"; if (add_apcupsd_cgi_links){ html += " (" + genlang(99, false) + ")\n"; } $("#ups").append(html); if (values) { $("#UPSTree").jqTreeTable(tree, { openImg: "./gfx/treeTable/tv-collapsable.gif", shutImg: "./gfx/treeTable/tv-expandable.gif", leafImg: "./gfx/treeTable/tv-item.gif", lastOpenImg: "./gfx/treeTable/tv-collapsable-last.gif", lastShutImg: "./gfx/treeTable/tv-expandable-last.gif", lastLeafImg: "./gfx/treeTable/tv-item-last.gif", vertLineImg: "./gfx/treeTable/vertline.gif", blankImg: "./gfx/treeTable/blank.gif", collapse: closed, column: 0, striped: true, highlight: false, state: false }); $("#ups").show(); } else { $("#ups").remove(); } } /** * reload the page, this means all values are refreshed, except the plugins */ function reload() { $.ajax({ url: 'xml.php', dataType: 'xml', error: function error() { $.jGrowl("Error loading XML document!"); }, success: function buildblocks(xml) { refreshVitals(xml); refreshNetwork(xml); refreshHardware(xml); refreshMemory(xml); refreshFilesystems(xml); refreshVoltage(xml); refreshFan(xml); refreshTemp(xml); refreshPower(xml); refreshCurrent(xml); refreshUps(xml); $('.stripeMe tr:nth-child(even)').addClass('even'); langcounter = 1; } }); } /** * set a reload timer for the page * @param {jQuery} xml phpSysInfo-XML */ function settimer(xml) { $("Options", xml).each(function getRefreshTime(id) { var options, refresh = ""; options = $("Options", xml).get(id); refresh = $(this).attr("refresh"); if (refresh !== '0') { $.timer(refresh, reload); } }); } cookie_language = readCookie("language"); cookie_template = readCookie("template"); if (cookie_template) { switchStyle(cookie_template); } $(document).ready(function buildpage() { filesystemtable(); $.ajax({ url: 'xml.php', dataType: 'xml', error: function error() { $.jGrowl("Error loading XML document!", { sticky: true }); }, success: function buildblocks(xml) { populateErrors(xml); refreshVitals(xml); refreshHardware(xml); refreshNetwork(xml); refreshMemory(xml); refreshFilesystems(xml); refreshTemp(xml); refreshVoltage(xml); refreshFan(xml); refreshPower(xml); refreshCurrent(xml); refreshUps(xml); changeLanguage(); displayPage(xml); settimer(xml); $('.stripeMe tr:nth-child(even)').addClass('even'); langcounter = 1; } }); $("#errors").nyroModal(); $("#lang").change(function changeLang() { var language = "", i = 0; language = $("#lang").val().toString(); createCookie('language', language, 365); cookie_language = readCookie('language'); changeLanguage(); for (i = 0; i < plugin_liste.length; i += 1) { changeLanguage(plugin_liste[i]); } return false; }); $("#template").change(function changeTemplate() { switchStyle($("#template").val().toString()); return false; }); }); jQuery.fn.dataTableExt.oSort['span-string-asc'] = function sortStringAsc(a, b) { var x = "", y = ""; x = a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? 1 : 0)); }; jQuery.fn.dataTableExt.oSort['span-string-desc'] = function sortStringDesc(a, b) { var x = "", y = ""; x = a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? -1 : 0)); }; jQuery.fn.dataTableExt.oSort['span-number-asc'] = function sortNumberAsc(a, b) { var x = 0, y = 0; x = parseInt(a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? 1 : 0)); }; jQuery.fn.dataTableExt.oSort['span-number-desc'] = function sortNumberDesc(a, b) { var x = 0, y = 0; x = parseInt(a.substring(a.indexOf(">") + 1, a.indexOf("") + 1, b.indexOf(" y) ? -1 : 0)); }; /** * generate the block element for a specific plugin that is available * @param {String} plugin name of the plugin * @param {Number} translationid id of the translated headline in the plugin translation file * @param {Boolean} reload controls if a reload button should be appended to the headline * @return {String} HTML string which contains the full layout of the block */ function buildBlock(plugin, translationid, reload) { var block = "", reloadpic = ""; if (reload) { reloadpic = "\"reload\" "; } block += "
\n"; block += "

" + reloadpic + genlang(translationid, false, plugin) + "

\n"; block += "
\n"; return block; } /** * translate a plugin and add this plugin to the internal plugin-list, this is only needed once and shouldn't be called more than once * @param {String} plugin name of the plugin that should be translated */ function plugin_translate(plugin) { plugin_liste.push(plugin); changeLanguage(plugin); } /** * generate a formatted datetime string of the current datetime * @return {String} formatted datetime string */ function datetime() { var date, day = 0, month = 0, year = 0, hour = 0, minute = 0, days = "", months = "", years = "", hours = "", minutes = ""; date = new Date(); day = date.getDate(); month = date.getMonth() + 1; year = date.getFullYear(); hour = date.getHours(); minute = date.getMinutes(); // format values smaller that 10 with a leading 0 days = (day < 10) ? "0" + day.toString() : day.toString(); months = (month < 10) ? "0" + month.toString() : month.toString(); years = (year < 1000) ? year.toString() : year.toString(); minutes = (minute < 10) ? "0" + minute.toString() : minute.toString(); hours = (hour < 10) ? "0" + hour.toString() : hour.toString(); return days + "." + months + "." + years + " - " + hours + ":" + minutes; } /** * insert dynamically a js script file into the website * @param {String} name name of the script that should be included */ /* function appendjs(name) { var scrptE, hdEl; scrptE = document.createElement("script"); hdEl = document.getElementsByTagName("head")[0]; scrptE.setAttribute("src", name); scrptE.setAttribute("type", "text/javascript"); hdEl.appendChild(scrptE); } */ /** * insert dynamically a css file into the website * @param {String} name name of the css file that should be included */ /* function appendcss(name) { var scrptE, hdEl; scrptE = document.createElement("link"); hdEl = document.getElementsByTagName("head")[0]; scrptE.setAttribute("type", "text/css"); scrptE.setAttribute("rel", "stylesheet"); scrptE.setAttribute("href", name); hdEl.appendChild(scrptE); } */ phpsysinfo-3.2.1/js/phpSysInfo/phpsysinfo_bootstrap.js000066400000000000000000001231221247443170600233030ustar00rootroot00000000000000//var data_dbg; function reload(initiate) { $.ajax({ dataType: "json", url: "xml.php?json", success: function (data) { // console.log(data); // data_dbg = data; if ((initiate === true) && (data["Options"] !== undefined) && (data["Options"]["@attributes"] !== undefined) && ((refrtime = data["Options"]["@attributes"]["refresh"]) !== undefined)) { setInterval(reload, refrtime); } else { $("#errors").empty(); } renderErrors(data); renderVitals(data); renderHardware(data); renderMemory(data); renderFilesystem(data); renderNetwork(data); renderVoltage(data); renderTemperature(data); renderFans(data); renderPower(data); renderCurrent(data); renderUPS(data); if (data['UnusedPlugins'] !== undefined) { var plugins = items(data["UnusedPlugins"]["Plugin"]); for (var i = 0; i < plugins.length; i++) { $.ajax({ dataType: "json", url: "xml.php?plugin=" + plugins[i]["@attributes"]["name"]+"&json", pluginname: plugins[i]["@attributes"]["name"], success: function (data) { try { // dynamic call window['renderPlugin_' + this.pluginname](data); } catch (err) { } renderErrors(data); } }); } } } }); } $(document).ready(function () { $(document).ajaxStart(function () { $("#loader").show(); }); $(document).ajaxStop(function () { $("#loader").hide(); }); reload(true); }); Array.prototype.push_attrs=function(element) { for (var i = 0; i < element.length ; i++) { this.push(element[i]["@attributes"]); } return i; }; function items(data) { if (data !== undefined) { if ((data.length > 0) && (data[0] !== undefined) && (data[0]["@attributes"] !== undefined)) { return data; } else if (data["@attributes"] !== undefined ) { return [data]; } else { return []; } } else { return []; } } function renderVitals(data) { var directives = { Uptime: { text: function () { return formatUptime(this["Uptime"]); } }, LastBoot: { text: function () { var lastboot; var timestamp = 0; if ((data["Generation"] !== undefined) && (data["Generation"]["@attributes"] !== undefined) && (data["Generation"]["@attributes"]["timestamp"] !== undefined) ) { timestamp = parseInt(data["Generation"]["@attributes"]["timestamp"])*1000; //server time if (isNaN(timestamp)) timestamp = Number(new Date()); //client time } else { timestamp = Number(new Date()); //client time } lastboot = new Date(timestamp - (parseInt(this["Uptime"])*1000)); if (typeof(lastboot.toUTCString) === "function") { return lastboot.toUTCString(); //toUTCstring() or toLocaleString() } else { //deprecated return lastboot.toGMTString(); //toGMTString() or toLocaleString() } } }, Distro: { html: function () { return '' + " " +this["Distro"]; } }, LoadAvg: { html: function () { if (this["CPULoad"] !== undefined) { return '
'+this["LoadAvg"] + '
' + '
' + '
' + round(this["CPULoad"],0) + '%
'; } else { return this["LoadAvg"]; } } }, Processes: { text: function () { var processes = "", prunning = 0, psleeping = 0, pstopped = 0, pzombie = 0, pwaiting = 0, pother = 0; var not_first = false; processes = parseInt(this["Processes"]); if (this["ProcessesRunning"] !== undefined) { prunning = parseInt(this["ProcessesRunning"]); } if (this["ProcessesSleeping"] !== undefined) { psleeping = parseInt(this["ProcessesSleeping"]); } if (this["ProcessesStopped"] !== undefined) { pstopped = parseInt(this["ProcessesStopped"]); } if (this["ProcessesZombie"] !== undefined) { pzombie = parseInt(this["ProcessesZombie"]); } if (this["ProcessesWaiting"] !== undefined) { pwaiting = parseInt(this["ProcessesWaiting"]); } if (this["ProcessesOther"] !== undefined) { pother = parseInt(this["ProcessesOther"]); } if (prunning || psleeping || pstopped || pzombie || pwaiting || pother) { processes += " ("; for (proc_type in {running:0,sleeping:1,stopped:2,zombie:3,waiting:4,other:5}) { if (eval("p" + proc_type)) { if (not_first) { processes += ", "; } processes += eval("p" + proc_type) + String.fromCharCode(160) + proc_type; not_first = true; } } processes += ")"; } return processes; } } }; if (data["Vitals"]["@attributes"]["SysLang"] === undefined) { $("#tr_SysLang").hide(); } if (data["Vitals"]["@attributes"]["CodePage"] === undefined) { $("#tr_CodePage").hide(); } if (data["Vitals"]["@attributes"]["Processes"] === undefined) { $("#tr_Processes").hide(); } $('#vitals').render(data["Vitals"]["@attributes"], directives); } function renderHardware(data) { var directives = { Model: { text: function () { return this["Model"]; } }, CpuSpeed: { text: function () { return formatHertz(this["CpuSpeed"]); } }, CpuSpeedMax: { text: function () { return formatHertz(this["CpuSpeedMax"]); } }, CpuSpeedMin: { text: function () { return formatHertz(this["CpuSpeedMin"]); } }, Cache: { text: function () { return formatBytes(this["Cache"], data["Options"]["@attributes"]["byteFormat"]); } }, BusSpeed: { text: function () { return formatHertz(this["BusSpeed"]); } }, Cputemp: { html: function () { return formatTemp(this["Cputemp"], data["Options"]["@attributes"]["tempFormat"]); } }, Bogomips: { text: function () { return parseInt(this["Bogomips"]); } }, Load: { html: function () { return '
' + '
' + '
' + round(this["Load"],0) + '%
'; } } }; var hw_directives = { hwName: { text: function() { return this["Name"]; } }, hwCount: { text: function() { if (this["Count"] == "1") { return ""; } return this["Count"]; } } }; var html=""; if ((data["Hardware"]["@attributes"] !== undefined) && (data["Hardware"]["@attributes"]["Name"] !== undefined)) { html+=""; html+="Machine"; html+=""; html+=""; html+=""; } html+=""; html+="CPU"; html+="Number of processors:"; html+=""; html+=""; var paramlist = {CpuSpeed:"CPU Speed",CpuSpeedMax:"CPU Speed Max",CpuSpeedMin:"CPU Speed Min",Cache:"Cache Size",Virt:"Virtualization",BusSpeed:"BUS Speed",Bogomips:"System Bogomips",Cputemp:"Temperature",Load:"Load Averages"}; try { var datas = items(data["Hardware"]["CPU"]["CpuCore"]); for (var i = 0; i < datas.length; i++) { html+=""; html+=""; html+=""; html+=""; html+=""; for (var proc_param in paramlist) { if (datas[i]["@attributes"][proc_param] !== undefined) { html+=""; html+=""; html+=""+ paramlist[proc_param]+""; html+=""; html+=""; } } } } catch (err) { $("#hardware-CPU").hide(); } for (hw_type in {PCI:0,IDE:1,SCSI:2,USB:3}) { html+=""; html+="" + hw_type + ""; html+="Number of devices:"; html+=""; html+=""; try { var datas = items(data["Hardware"][hw_type]["Device"]); for (var i = 0; i < datas.length; i++) { html+=""; html+=""; html+=""; html+=""; html+=""; } } catch (err) { $("#hardware-"+hw_type).hide(); } } $("#hardware").empty().append(html); if ((data["Hardware"]["@attributes"] !== undefined) && (data["Hardware"]["@attributes"]["Name"] !== undefined)) { $('#hardware-Machine').render(data["Hardware"]["@attributes"]); } try { var datas = items(data["Hardware"]["CPU"]["CpuCore"]); for (var i = 0; i < datas.length; i++) { $('#hardware-CPU-'+ i).render(datas[i]["@attributes"]); for (var proc_param in paramlist) { if (datas[i]["@attributes"][proc_param] !== undefined) { $('#hardware-CPU-'+ i +'-'+proc_param).render(datas[i]["@attributes"], directives); } } } if (i > 0) { $("#hardware-CPU span").html(i); } } catch (err) { $("#hardware-CPU").hide(); } for (hw_type in {PCI:0,IDE:1,SCSI:2,USB:3}) { try { var licz = 0; var datas = items(data["Hardware"][hw_type]["Device"]); for (var i = 0; i < datas.length; i++) { $('#hardware-'+hw_type+'-'+ i).render(datas[i]["@attributes"], hw_directives); if (datas[i]["@attributes"]["Count"] !== undefined) { licz += parseInt(datas[i]["@attributes"]["Count"]); } else { licz++; } } if (i > 0) { $("#hardware-" + hw_type + " span").html(licz); } } catch (err) { $("#hardware-"+hw_type).hide(); } } $('#hardware').treegrid({ initialState: 'collapsed', expanderExpandedClass: 'normalicon normalicon-down', expanderCollapsedClass: 'normalicon normalicon-right' }); if (data["Options"]["@attributes"]["showCPUListExpanded"] !== "false") { $('#hardware-CPU').treegrid('expand'); } if (data["Options"]["@attributes"]["showCPUInfoExpanded"] === "true") { try { var datas = items(data["Hardware"]["CPU"]["CpuCore"]); for (var i = 0; i < datas.length; i++) { $('#hardware-CPU-'+i).treegrid('expand'); } } catch (err) { } } } function renderMemory(data) { var directives = { Total: { text: function () { return formatBytes(this["@attributes"]["Total"], data["Options"]["@attributes"]["byteFormat"]); } }, Free: { text: function () { return formatBytes(this["@attributes"]["Free"], data["Options"]["@attributes"]["byteFormat"]); } }, Used: { text: function () { return formatBytes(this["@attributes"]["Used"], data["Options"]["@attributes"]["byteFormat"]); } }, Usage: { html: function () { if ((this["Details"] === undefined) || (this["Details"]["@attributes"] === undefined)) { return '
' + '
' + '
' + this["@attributes"]["Percent"] + '%
'; } else { var rest = parseInt(this["@attributes"]["Percent"]); var html = '
'; if ((this["Details"]["@attributes"]["AppPercent"] !== undefined) && (this["Details"]["@attributes"]["AppPercent"] > 0)) { html += '
'; rest -= parseInt(this["Details"]["@attributes"]["AppPercent"]); } if ((this["Details"]["@attributes"]["CachedPercent"] !== undefined) && (this["Details"]["@attributes"]["CachedPercent"] > 0)) { html += '
'; rest -= parseInt(this["Details"]["@attributes"]["CachedPercent"]); } if ((this["Details"]["@attributes"]["BuffersPercent"] !== undefined) && (this["Details"]["@attributes"]["BuffersPercent"] > 0)) { html += '
'; rest -= parseInt(this["Details"]["@attributes"]["BuffersPercent"]); } if (rest > 0) { html += '
'; } html += '
'; html += '
' + 'Total: ' + this["@attributes"]["Percent"] + '% ' + '('; var not_first = false; if (this["Details"]["@attributes"]["AppPercent"] !== undefined) { html += 'Kernel+Apps: '+ this["Details"]["@attributes"]["AppPercent"] + '%'; not_first = true; } if (this["Details"]["@attributes"]["CachedPercent"] !== undefined) { if (not_first) html += ' - '; html += 'Cache: ' + this["Details"]["@attributes"]["CachedPercent"] + '%'; not_first = true; } if (this["Details"]["@attributes"]["BuffersPercent"] !== undefined) { if (not_first) html += ' - '; html += 'Buffers: ' + this["Details"]["@attributes"]["BuffersPercent"] + '%'; } html += ')
'; return html; } } }, Type: { text: function () { return "Physical Memory"; } } }; var directive_swap = { Total: { text: function () { return formatBytes(this["Total"], data["Options"]["@attributes"]["byteFormat"]); } }, Free: { text: function () { return formatBytes(this["Free"], data["Options"]["@attributes"]["byteFormat"]); } }, Used: { text: function () { return formatBytes(this["Used"], data["Options"]["@attributes"]["byteFormat"]); } }, Usage: { html: function () { return '
' + '
' + '
' + this["Percent"] + '%
'; } }, Name: { html: function () { return this['Name'] + '
' + ((this["MountPoint"] !== undefined) ? this["MountPoint"] : this["MountPointID"]); } } }; var data_memory = []; if (data["Memory"]["Swap"] !== undefined) { var datas = items(data["Memory"]["Swap"]["Mount"]); data_memory.push_attrs(datas); $('#swap-data').render(data_memory, directive_swap); $('#swap-data').show(); } else { $('#swap-data').hide(); } $('#memory-data').render(data["Memory"], directives); } function renderFilesystem(data) { var directives = { Total: { text: function () { return formatBytes(this["Total"], data["Options"]["@attributes"]["byteFormat"]); } }, Free: { text: function () { return formatBytes(this["Free"], data["Options"]["@attributes"]["byteFormat"]); } }, Used: { text: function () { return formatBytes(this["Used"], data["Options"]["@attributes"]["byteFormat"]); } }, MountPoint: { text: function () { return ((this["MountPoint"] !== undefined) ? this["MountPoint"] : this["MountPointID"]); } }, Name: { html: function () { return this["Name"] + ((this["MountOptions"] !== undefined) ? '
(' + this["MountOptions"] + ')' : ''); } }, Percent: { html: function () { return '
' + '
= parseInt(data["Options"]["@attributes"]["threshold"]))) ? 'progress-bar progress-bar-danger' : 'progress-bar progress-bar-info') + '" style="width: ' + this["Percent"] + '% ;">
' + '
' + '
' + this["Percent"] + '% ' + ((this["Inodes"] !== undefined) ? '(' + this["Inodes"] + '%)' : '') + '
'; } } }; try { var fs_data = []; var datas = items(data["FileSystem"]["Mount"]); var total = {Total:0,Free:0,Used:0}; for (var i = 0; i < datas.length; i++) { fs_data.push(datas[i]["@attributes"]); total["Total"] += parseInt(datas[i]["@attributes"]["Total"]); total["Free"] += parseInt(datas[i]["@attributes"]["Free"]); total["Used"] += parseInt(datas[i]["@attributes"]["Used"]); total["Percent"] = (total["Total"] !== 0) ? round((total["Used"] / total["Total"]) * 100, 2) : 0; } if (i > 0) { $('#filesystem-data').render(fs_data, directives); $('#filesystem-foot').render(total, directives); $('#filesystem_MountPoint').removeClass("sorttable_sorted"); // reset sort order // sorttable.innerSortFunction.apply(document.getElementById('filesystem_MountPoint'), []); sorttable.innerSortFunction.apply($('#filesystem_MountPoint')[0], []); $("#block_filesystem").show(); } else { $("#block_filesystem").hide(); } } catch (err) { $("#block_filesystem").hide(); } } function renderNetwork(data) { var directives = { RxBytes: { text: function () { return formatBytes(this["RxBytes"], data["Options"]["@attributes"]["byteFormat"]); } }, TxBytes: { text: function () { return formatBytes(this["TxBytes"], data["Options"]["@attributes"]["byteFormat"]); } }, Drops: { text: function () { return this["Err"] + "/" + String.fromCharCode(8203) + this["Drops"]; } } }; var html = ""; html+=""; html+=""; html+="Device"; html+="Receive"; html+="Sent"; html+="Err/" + String.fromCharCode(8203) +"Drop"; html+=""; html+=""; try { var network_data = []; var datas = items(data["Network"]["NetDevice"]); for (var i = 0; i < datas.length; i++) { html+=""; html+=""; html+=""; html+=""; html+=""; html+=""; var info = datas[i]["@attributes"]["Info"]; if ( (info !== undefined) && (info !== "") ) { var infos = info.replace(/:/g, String.fromCharCode(8203)+":").split(";"); /* split long addresses */ for (var j = 0; j < infos.length; j++){ html +="" + infos[j] + ""; } } } $("#network").empty().append(html); if (i > 0) { for (var i = 0; i < datas.length; i++) { $('#network-' + i).render(datas[i]["@attributes"], directives); } $("#block_network").show(); } else { $("#block_network").hide(); } } catch (err) { $("#block_network").hide(); } $('#network').treegrid({ initialState: 'collapsed', expanderExpandedClass: 'normalicon normalicon-down', expanderCollapsedClass: 'normalicon normalicon-right' }); } function renderVoltage(data) { var directives = { Value: { text: function () { return this["Value"] + String.fromCharCode(160) + "V"; } }, Min: { text: function () { if (this["Min"] !== undefined) return this["Min"] + String.fromCharCode(160) + "V"; } }, Max: { text: function () { if (this["Max"] !== undefined) return this["Max"] + String.fromCharCode(160) + "V"; } }, Label: { text: function () { if (this["Event"] === undefined) return this["Label"]; else return this["Label"] + " ! "+this["Event"]; } } }; try { var voltage_data = []; var datas = items(data["MBInfo"]["Voltage"]["Item"]); if (voltage_data.push_attrs(datas) > 0) { $('#voltage-data').render(voltage_data, directives); $("#block_voltage").show(); } else { $("#block_voltage").hide(); } } catch (err) { $("#block_voltage").hide(); } } function renderTemperature(data) { var directives = { Value: { html: function () { return formatTemp(this["Value"], data["Options"]["@attributes"]["tempFormat"]); } }, Max: { html: function () { if (this["Max"] !== undefined) return formatTemp(this["Max"], data["Options"]["@attributes"]["tempFormat"]); } }, Label: { text: function () { if (this["Event"] === undefined) return this["Label"]; else return this["Label"] + " ! "+this["Event"]; } } }; try { var temperature_data = []; var datas = items(data["MBInfo"]["Temperature"]["Item"]); if (temperature_data.push_attrs(datas) > 0) { $('#temperature-data').render(temperature_data, directives); $("#block_temperature").show(); } else { $("#block_temperature").hide(); } } catch (err) { $("#block_temperature").hide(); } } function renderFans(data) { var directives = { Value: { text: function () { return this["Value"] + String.fromCharCode(160) + "RPM"; } }, Min: { text: function () { if (this["Min"] !== undefined) return this["Min"] + String.fromCharCode(160) + "RPM"; } }, Label: { text: function () { if (this["Event"] === undefined) return this["Label"]; else return this["Label"] + " ! "+this["Event"]; } } }; try { var fans_data = []; var datas = items(data["MBInfo"]["Fans"]["Item"]); if (fans_data.push_attrs(datas) > 0) { $('#fans-data').render(fans_data, directives); $("#block_fans").show(); } else { $("#block_fans").hide(); } } catch (err) { $("#block_fans").hide(); } } function renderPower(data) { var directives = { Value: { text: function () { return this["Value"] + String.fromCharCode(160) + "W"; } }, Max: { text: function () { if (this["Max"] !== undefined) return this["Max"] + String.fromCharCode(160) + "W"; } }, Label: { text: function () { if (this["Event"] === undefined) return this["Label"]; else return this["Label"] + " ! "+this["Event"]; } } }; try { var power_data = []; var datas = items(data["MBInfo"]["Power"]["Item"]); if (power_data.push_attrs(datas) > 0) { $('#power-data').render(power_data, directives); $("#block_power").show(); } else { $("#block_power").hide(); } } catch (err) { $("#block_power").hide(); } } function renderCurrent(data) { var directives = { Value: { text: function () { return this["Value"] + String.fromCharCode(160) + "A"; } }, Max: { text: function () { if (this["Max"] !== undefined) return this["Max"] + String.fromCharCode(160) + "A"; } }, Label: { text: function () { if (this["Event"] === undefined) return this["Label"]; else return this["Label"] + " ! "+this["Event"]; } } }; try { var current_data = []; var datas = items(data["MBInfo"]["Current"]["Item"]); if (current_data.push_attrs(datas) > 0) { $('#current-data').render(current_data, directives); $("#block_current").show(); } else { $("#block_current").hide(); } } catch (err) { $("#block_current").hide(); } } function renderUPS(data) { var directives = { Name: { text: function () { return this["Name"] + ((this["Mode"] !== undefined) ? " (" + this["Mode"] + ")" : ""); } }, LineVoltage: { text: function () { return this["LineVoltage"] + String.fromCharCode(160) + "V"; } }, LineFrequency: { text: function () { return this["LineFrequency"] + String.fromCharCode(160) + "Hz"; } }, BatteryVoltage: { text: function () { return this["BatteryVoltage"] + String.fromCharCode(160) + "V"; } }, TimeLeftMinutes: { text: function () { return this["TimeLeftMinutes"] + String.fromCharCode(160) + "minutes"; } }, LoadPercent: { html: function () { return '
' + '
' + '
' + round(this["LoadPercent"],0) + '%
'; } }, BatteryChargePercent: { html: function () { return '
' + '
' + '
' + round(this["BatteryChargePercent"],0) + '%
'; } } }; if ((data["UPSInfo"] !== undefined) && (items(data["UPSInfo"]["UPS"]).length > 0)) { var html=""; var paramlist = {Model:"Model",StartTime:"Started",Status:"Status",Temperature:"Temperature",OutagesCount:"Outages",LastOutage:"Last outage cause",LastOutageFinish:"Last outage timestamp",LineVoltage:"Line voltage",LineFrequency:"Line frequency",LoadPercent:"Load percent",BatteryDate:"Battery date",BatteryVoltage:"Battery voltage",BatteryChargePercent:"Battery charge",TimeLeftMinutes:"Time left on batteries"}; try { var datas = items(data["UPSInfo"]["UPS"]); for (var i = 0; i < datas.length; i++) { html+=""; html+=""; html+=""; html+=""; for (var proc_param in paramlist) { if (datas[i]["@attributes"][proc_param] !== undefined) { html+=""; html+=""+ paramlist[proc_param]+""; html+=""; html+=""; } } } } catch (err) { } if ((data["UPSInfo"]["@attributes"] !== undefined) && (data["UPSInfo"]["@attributes"]["ApcupsdCgiLinks"] === "1")) { html+=""; html+="(Details)"; html+=""; html+=""; } $("#ups").empty().append(html); try { var datas = items(data["UPSInfo"]["UPS"]); for (var i = 0; i < datas.length; i++) { $('#ups-'+ i).render(datas[i]["@attributes"], directives); for (var proc_param in paramlist) { if (datas[i]["@attributes"][proc_param] !== undefined) { $('#ups-'+ i +'-'+proc_param).render(datas[i]["@attributes"], directives); } } } } catch (err) { } $('#ups').treegrid({ initialState: 'expanded', expanderExpandedClass: 'normalicon normalicon-down', expanderCollapsedClass: 'normalicon normalicon-right' }); $("#block_ups").show(); } else { $("#block_ups").hide(); } } function renderErrors(data) { try { var datas = items(data["Errors"]["Error"]); for (var i = 0; i < datas.length; i++) { $("#errors").append("
  • "+datas[i]["@attributes"]["Function"]+" - "+datas[i]["@attributes"]["Message"].replace(/\n/g, "
    ")+"

  • "); } if (i > 0) { $("#errorbutton").show(); } } catch (err) { $("#errorbutton").hide(); } } /** * format seconds to a better readable statement with days, hours and minutes * @param {Number} sec seconds that should be formatted * @return {String} html string with no breaking spaces and translation statemen */ function formatUptime(sec) { var txt = "", intMin = 0, intHours = 0, intDays = 0; intMin = sec / 60; intHours = intMin / 60; intDays = Math.floor(intHours / 24); intHours = Math.floor(intHours - (intDays * 24)); intMin = Math.floor(intMin - (intDays * 60 * 24) - (intHours * 60)); if (intDays) { txt += intDays.toString() + String.fromCharCode(160) + "days" + String.fromCharCode(160); } if (intHours) { txt += intHours.toString() + String.fromCharCode(160) + "hours" + String.fromCharCode(160); } return txt + intMin.toString() + String.fromCharCode(160) + "minutes"; } /** * format a celcius temperature to fahrenheit and also append the right suffix * @param {String} degreeC temperature in celvius * @param {jQuery} xml phpSysInfo-XML * @return {String} html string with no breaking spaces and translation statements */ function formatTemp(degreeC, tempFormat) { var degree = 0; if (tempFormat === undefined) { tempFormat = "c"; } degree = parseFloat(degreeC); if (isNaN(degreeC)) { return "---"; } else { switch (tempFormat.toLowerCase()) { case "f": return round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + "F"; case "c": return round(degree, 1) + String.fromCharCode(160) + "C"; case "c-f": return round(degree, 1) + String.fromCharCode(160) + "C
    (" + round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + "F)"; case "f-c": return round((((9 * degree) / 5) + 32), 1) + String.fromCharCode(160) + "F
    (" + round(degree, 1) + String.fromCharCode(160) + "C)"; } } } /** * format a given MHz value to a better readable statement with the right suffix * @param {Number} mhertz mhertz value that should be formatted * @return {String} html string with no breaking spaces and translation statements */ function formatHertz(mhertz) { if (mhertz && mhertz < 1000) { return mhertz.toString() + String.fromCharCode(160) + "MHz"; } else { if (mhertz && mhertz >= 1000) { return round(mhertz / 1000, 2) + String.fromCharCode(160) + "GHz"; } else { return ""; } } } /** * format the byte values into a user friendly value with the corespondenting unit expression
    support is included * for binary and decimal output
    user can specify a constant format for all byte outputs or the output is formated * automatically so that every value can be read in a user friendly way * @param {Number} bytes value that should be converted in the corespondenting format, which is specified in the phpsysinfo.ini * @param {jQuery} xml phpSysInfo-XML * @return {String} string of the converted bytes with the translated unit expression */ function formatBytes(bytes, byteFormat) { var show = ""; if (byteFormat === undefined) { byteFormat = "auto_binary"; } switch (byteFormat.toLowerCase()) { case "pib": show += round(bytes / Math.pow(1024, 5), 2); show += String.fromCharCode(160) + "PiB"; break; case "tib": show += round(bytes / Math.pow(1024, 4), 2); show += String.fromCharCode(160) + "TiB"; break; case "gib": show += round(bytes / Math.pow(1024, 3), 2); show += String.fromCharCode(160) + "GiB"; break; case "mib": show += round(bytes / Math.pow(1024, 2), 2); show += String.fromCharCode(160) + "MiB"; break; case "kib": show += round(bytes / Math.pow(1024, 1), 2); show += String.fromCharCode(160) + "KiB"; break; case "pb": show += round(bytes / Math.pow(1000, 5), 2); show += String.fromCharCode(160) + "PB"; break; case "tb": show += round(bytes / Math.pow(1000, 4), 2); show += String.fromCharCode(160) + "TB"; break; case "gb": show += round(bytes / Math.pow(1000, 3), 2); show += String.fromCharCode(160) + "GB"; break; case "mb": show += round(bytes / Math.pow(1000, 2), 2); show += String.fromCharCode(160) + "MB"; break; case "kb": show += round(bytes / Math.pow(1000, 1), 2); show += String.fromCharCode(160) + "KB"; break; case "b": show += bytes; show += String.fromCharCode(160) + "B"; break; case "auto_decimal": if (bytes > Math.pow(1000, 5)) { show += round(bytes / Math.pow(1000, 5), 2); show += String.fromCharCode(160) + "PB"; } else { if (bytes > Math.pow(1000, 4)) { show += round(bytes / Math.pow(1000, 4), 2); show += String.fromCharCode(160) + "TB"; } else { if (bytes > Math.pow(1000, 3)) { show += round(bytes / Math.pow(1000, 3), 2); show += String.fromCharCode(160) + "GB"; } else { if (bytes > Math.pow(1000, 2)) { show += round(bytes / Math.pow(1000, 2), 2); show += String.fromCharCode(160) + "MB"; } else { if (bytes > Math.pow(1000, 1)) { show += round(bytes / Math.pow(1000, 1), 2); show += String.fromCharCode(160) + "KB"; } else { show += bytes; show += String.fromCharCode(160) + "B"; } } } } } break; default: if (bytes > Math.pow(1024, 5)) { show += round(bytes / Math.pow(1024, 5), 2); show += String.fromCharCode(160) + "PiB"; } else { if (bytes > Math.pow(1024, 4)) { show += round(bytes / Math.pow(1024, 4), 2); show += String.fromCharCode(160) + "TiB"; } else { if (bytes > Math.pow(1024, 3)) { show += round(bytes / Math.pow(1024, 3), 2); show += String.fromCharCode(160) + "GiB"; } else { if (bytes > Math.pow(1024, 2)) { show += round(bytes / Math.pow(1024, 2), 2); show += String.fromCharCode(160) + "MiB"; } else { if (bytes > Math.pow(1024, 1)) { show += round(bytes / Math.pow(1024, 1), 2); show += String.fromCharCode(160) + "KiB"; } else { show += bytes; show += String.fromCharCode(160) + "B"; } } } } } } return show; } /** * round a given value to the specified precision, difference to Math.round() is that there * will be appended Zeros to the end if the precision is not reached (0.1 gets rounded to 0.100 when precision is set to 3) * @param {Number} x value to round * @param {Number} n precision * @return {String} */ function round(x, n) { var e = 0, k = ""; if (n < 0 || n > 14) { return 0; } if (n === 0) { return Math.round(x); } else { e = Math.pow(10, n); k = (Math.round(x * e) / e).toString(); if (k.indexOf('.') === -1) { k += '.'; } k += e.toString().substring(1); return k.substring(0, k.indexOf('.') + n + 1); } } phpsysinfo-3.2.1/js/vendor/000077500000000000000000000000001247443170600156405ustar00rootroot00000000000000phpsysinfo-3.2.1/js/vendor/README000066400000000000000000000025721247443170600165260ustar00rootroot00000000000000versions, links and simple description of used jquery files =========================================================== bootstrap.min.js --------- VERSION : 3.3.2 URL : http://getbootstrap.com/ DESC : Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive, mobile first projects on the web USED : used for the entire bootstrap userinterface transparency.js --------- VERSION : 0.10.0 URL : http://leonidas.github.io/transparency/ DESC : Transparency is a minimal template engine for jQuery. It maps JSON objects to DOM elements with zero configuration. Just call .render() USED : used for the entire bootstrap userinterface html5shiv-printshiv.js --------- VERSION : 3.7.2 URL : https://code.google.com/p/html5shiv-printshiv/ DESC : Enabling HTML5 Shiv Script and Print Support on old IE6-9 Browser Safari 4.x and Firefox 3.x USED : used for the entire bootstrap userinterface console-shim.js --------- VERSION : URL : https://github.com/liamnewmarch/console-shim DESC : Shim to make browsers store console messages without Dev Tools open (e.g. IE9) USED : used for the entire bootstrap userinterface sorttable.js --------- VERSION : 2+2014.12.25.12_fix URL : http://www.kryogenix.org/code/browser/sorttable/ DESC : Make all your tables sortable USED : used for the entire bootstrap userinterface phpsysinfo-3.2.1/js/vendor/bootstrap.min.js000066400000000000000000001051741247443170600210050ustar00rootroot00000000000000/*! * Bootstrap v3.3.2 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.2",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.2",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.2",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a(this.options.trigger).filter('[href="#'+b.id+'"], [data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.2",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0,trigger:'[data-toggle="collapse"]'},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":a.extend({},e.data(),{trigger:this});c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.2",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('