<?xml version="1.0" encoding="UTF-8"?>
<plugin name="(k4) Global Statistics" version_long="21000" version_human="2.1.0" author="k4r1" website="https://enxf.net/members/by_ix.16167" update_check="https://raw.githubusercontent.com/byIx/glstats/main/checker.php"><hooks/><settings><setting><key>glstats_posts</key><default>1</default></setting><setting><key>glstats_topics</key><default>1</default></setting><setting><key>glstats_members</key><default>1</default></setting><setting><key>glstats_bmembers</key><default>0</default></setting><setting><key>glstats_online</key><default>1</default></setting><setting><key>glstats_files</key><default>0</default></setting><setting><key>glstats_blogs</key><default>0</default></setting><setting><key>glstats_images</key><default>0</default></setting><setting><key>glstats_short</key><default>1</default></setting><setting><key>glstats_member</key><default>1</default></setting></settings><widgets><widget key="glstats" class="\IPS\Widget\StaticCache" restrict="sidebar,cms" default_area="" allow_reuse="0" menu_style="menu" embeddable="0"><![CDATA[<?php
/**
 * @brief		Global Statistics Widget
 * @author		<a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright	(c) Invision Power Services, Inc.
 * @license		https://www.invisioncommunity.com/legal/standards/
 * @package		Invision Community
 * @subpackage	globalstatistics
 * @since		22 Nov 2020
 */

namespace IPS\plugins\<{LOCATION}>\widgets;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * glstats Widget
 */
class _glstats extends \IPS\Widget\StaticCache
{
	/**
	 * @brief	Widget Key
	 */
	public $key = 'glstats';
	
	/**
	 * @brief	App
	 */
	
		
	/**
	 * @brief	Plugin
	 */
	public $plugin = '<{ID}>';
	
	/**
	 * Initialise this widget
	 *
	 * @return void
	 */ 
	public function init()
	{	
		$this->template( array( \IPS\Theme::i()->getTemplate( 'plugins', 'core', 'global' ), $this->key ) );
		
		parent::init();
	}
	
	/**
	 * Specify widget configuration
	 *
	 * @param	null|\IPS\Helpers\Form	$form	Form object
	 * @return	null|\IPS\Helpers\Form
	 */
	public function configuration( &$form=null )
 	{
		$form = parent::configuration( $form );

		$mostOnline = json_decode( \IPS\Settings::i()->most_online, TRUE );
		$form->add( new \IPS\Helpers\Form\Number( 'stats_most_online', $mostOnline['count'], TRUE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_posts', \IPS\Settings::i()->glstats_posts, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_topics', \IPS\Settings::i()->glstats_topics, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_blogs', \IPS\Settings::i()->glstats_blogs, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_files', \IPS\Settings::i()->glstats_files, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_images', \IPS\Settings::i()->glstats_images, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_members', \IPS\Settings::i()->glstats_members, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_bmembers', \IPS\Settings::i()->glstats_bmembers, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_online', \IPS\Settings::i()->glstats_online, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_short', \IPS\Settings::i()->glstats_short, FALSE ) );
		$form->add( new \IPS\Helpers\Form\YesNo( 'glstats_member', \IPS\Settings::i()->glstats_member, FALSE ) );
		
        if( $form->values() )
        {
            $form->saveAsSettings();
        }
		
		return $form;
 	}
 	
 	 /**
 	 * Ran before saving widget configuration
 	 *
 	 * @param	array	$values	Values from form
 	 * @return	array
 	 */
 	public function preConfig( $values )
 	{
 		if ( \IPS\Member::loggedIn()->isAdmin() and \IPS\Member::loggedIn()->hasAcpRestriction( 'core', 'members', 'member_recount_content' ) )
 		{
 			$mostOnline = array( 'count' => $values['stats_most_online'], 'time' => time() );
			\IPS\Settings::i()->changeValues( array( 'most_online' => json_encode( $mostOnline ) ) );

			unset( $values['stats_most_online'] );

 			\IPS\Widget::deleteCaches( 'stats', 'core' );
 		}

 		return $values;
 	}

	/**
	 * Render a widget
	 *
	 * @return	string
	 */
	public function render()
	{
		if ( ! \IPS\Application::appIsEnabled( 'forums' ) )
		{
			return '';
		}

		$stats = array();

		/* TOTAL POSTS */
		if ( \IPS\Settings::i()->glstats_posts )
		{
			$approxRows = \IPS\Db::i()->query( "SHOW TABLE STATUS LIKE '" . \IPS\Db::i()->prefix . "forums_posts';" )->fetch_assoc();

			if ( (int) $approxRows['Rows'] >= 1000000 )
			{
				$stats['total_posts'] = \IPS\Db::i()->select( 'SUM(posts)', 'forums_forums' )->first();
			}
			else
			{
				$stats['total_posts'] = \IPS\Db::i()->select( "COUNT(*)", 'forums_posts', array( 'queued = ?', 0 ) )->first();
			}

			/* Only query if we're not using the cached forums count, the cached count includes these */
			if ( (int) $approxRows['Rows'] <= 1000000 AND \IPS\Settings::i()->archive_on )
			{
				$stats['total_posts'] += \IPS\forums\Topic\ArchivedPost::db()->select( 'COUNT(*)', 'forums_archive_posts', array( 'archive_queued = ?', 0 ) )->first();
			}
		}

		/* TOTAL TOPICS */
		if ( \IPS\Settings::i()->glstats_topics )
		{
			$stats['total_topics'] = \IPS\Db::i()->select( "COUNT(*)", 'forums_topics', array( 'approved = ?', 1 ) )->first();
		}
		
		/* TOTAL BLOGS */
		if ( \IPS\Settings::i()->glstats_blogs )
		{
			$stats['total_blogs']	= \IPS\Db::i()->select( "COUNT(*)", 'blog_blogs' )->first();
			$stats['total_entries']	= \IPS\Db::i()->select( "COUNT(*)", 'blog_entries', array( 'entry_status=? AND entry_hidden=?', 'published', 1 ) )->first();
		}
		
		/* TOTAL FILES */
		if ( \IPS\Settings::i()->glstats_files )
		{
			$stats['total_files'] = \IPS\Db::i()->select( 'COUNT(*) AS total_files', 'downloads_files', array( 'file_open=?', 1 ) )->first();
		}
		
		/* TOTAL IMAGES */
		if ( \IPS\Settings::i()->glstats_images )
		{
			$approxRows = \IPS\gallery\Image::databaseTableCount( TRUE );

			if ( $approxRows > 1000000 )
			{
				$stats['total_images'] = $approxRows;
			}
			else
			{
				$stats['total_images'] = \IPS\Db::i()->select( 'COUNT(*) AS total_images', 'gallery_images', array( 'image_approved=?', 1 ) )->first();
			}
		}

		/* TOTAL MEMBERS */
		if ( \IPS\Settings::i()->glstats_members )
		{
			/* fetch only successful registered members ; if this needs to be changed, please review the other areas where we have the name<>? AND email<>? condition */
			$stats['member_count'] = \IPS\Db::i()->select( 'COUNT(*)', 'core_members', array( 'completed=?', true ) )->first();
			$stats['member_all']   = \IPS\Db::i()->select( 'max(member_id)', 'core_members' )->first();
		}

		/* TOTAL BANNED MEMBERS */
		if ( \IPS\Settings::i()->glstats_bmembers )
		{
			/* fetch only successful registered members ; if this needs to be changed, please review the other areas where we have the name<>? AND email<>? condition */			
			$stats['bmember_count'] = \IPS\Db::i()->select( 'COUNT(*)', 'core_members', array( 'temp_ban=?', -1 ) )->first();
		}

		/* MOST ONLINE */
		if ( \IPS\Settings::i()->glstats_online )
		{
			$mostOnline = json_decode( \IPS\Settings::i()->most_online, TRUE );
			$count = \IPS\Session\Store::i()->getOnlineUsers( \IPS\Session\Store::ONLINE_GUESTS | \IPS\Session\Store::ONLINE_MEMBERS | \IPS\Session\Store::ONLINE_COUNT_ONLY );
			if( $count > $mostOnline['count'] )
			{
				$mostOnline = array( 'count' => $count, 'time' => time() );
				\IPS\Settings::i()->changeValues( array( 'most_online' => json_encode( $mostOnline ) ) );
			}
			$stats['most_online'] = $mostOnline;
		}

		/* LAST REGISTERED MEMBER */
		$where   = array( array( 'completed=? AND temp_ban!=?', 1, -1 ) );
		$where[] = array( '( ! ' . \IPS\Db::i()->bitwiseWhere( \IPS\Member::$bitOptions['members_bitoptions'], 'bw_is_spammer' ) . ' )' );
		$where[] = array( 'member_id NOT IN(?)', \IPS\Db::i()->select( 'member_id', 'core_validating', array( 'new_reg=?', 1 ) ) );
		$where[] = array( 'NOT(members_bitoptions2 & ?)', \IPS\Member::$bitOptions['members_bitoptions']['members_bitoptions2']['is_support_account'] );

		try
		{
			$stats['last_registered'] = \IPS\Member::constructFromData( \IPS\Db::i()->select( 'core_members.*', 'core_members', $where, 'core_members.member_id DESC', array( 0, 1 ) )->first() );
		}
		catch( \UnderflowException $ex )
		{
			$stats['last_registered'] = NULL;
		}
		
		/* Display */
		return $this->output( $stats );
	}
}
]]></widget></widgets><htmlFiles><html filename="glstats.phtml">PGlwczp0ZW1wbGF0ZSBwYXJhbWV0ZXJzPSIkc3RhdHMsICRvcmllbnRhdGlvbj0ndmVydGljYWwnIiAvPgo8aDMgY2xhc3M9J2lwc1R5cGVfcmVzZXQgaXBzV2lkZ2V0X3RpdGxlJz57bGFuZz0iYmxvY2tfZ2xzdGF0cyJ9PC9oMz4KPGRpdiBjbGFzcz0naXBzV2lkZ2V0X2lubmVyJz4KCXt7aWYgJG9yaWVudGF0aW9uID09ICd2ZXJ0aWNhbCd9fQoJCTxkaXYgY2xhc3M9J2lwc1BhZF9oYWxmJz4KCQkJPHVsIGNsYXNzPSJpcHNEYXRhTGlzdCI+CgkJCQl7e2lmIHNldHRpbmdzLmdsc3RhdHNfcG9zdHN9fQoJCQkJCTxsaSBjbGFzcz0naXBzRGF0YUl0ZW0nPgoJCQkJCQk8ZGl2IGNsYXNzPSdpcHNEYXRhSXRlbV9tYWluIGlwc1Bvc19taWRkbGUnPgoJCQkJCQkJPHN0cm9uZz57bGFuZz0iZ2xzdGF0c19wb3N0cyJ9PC9zdHJvbmc+CgkJCQkJCTwvZGl2PgoJCQkJCQk8ZGl2IGNsYXNzPSdpcHNEYXRhSXRlbV9zdGF0cyBpcHNEYXRhSXRlbV9zdGF0c0xhcmdlJz4KCQkJCQkJCTxzcGFuIGNsYXNzPSdpcHNEYXRhSXRlbV9zdGF0c19udW1iZXInPnt7aWYgc2V0dGluZ3MuZ2xzdGF0c19zaG9ydH19e251bWJlcj0iJHN0YXRzWyd0b3RhbF9wb3N0cyddIiBmb3JtYXQ9InNob3J0In17e2Vsc2V9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfcG9zdHMnXSJ9e3tlbmRpZn19PC9zcGFuPgoJCQkJCQk8L2Rpdj4KCQkJCQk8L2xpPgoJCQkJe3tlbmRpZn19CgkJCQl7e2lmIHNldHRpbmdzLmdsc3RhdHNfdG9waWNzfX0KCQkJCQk8bGkgY2xhc3M9J2lwc0RhdGFJdGVtJz4KCQkJCQkJPGRpdiBjbGFzcz0naXBzRGF0YUl0ZW1fbWFpbiBpcHNQb3NfbWlkZGxlJz4KCQkJCQkJCTxzdHJvbmc+e2xhbmc9Imdsc3RhdHNfdG9waWNzIn08L3N0cm9uZz4KCQkJCQkJPC9kaXY+CgkJCQkJCTxkaXYgY2xhc3M9J2lwc0RhdGFJdGVtX3N0YXRzIGlwc0RhdGFJdGVtX3N0YXRzTGFyZ2UnPgoJCQkJCQkJPHNwYW4gY2xhc3M9J2lwc0RhdGFJdGVtX3N0YXRzX251bWJlcic+e3tpZiBzZXR0aW5ncy5nbHN0YXRzX3Nob3J0fX17bnVtYmVyPSIkc3RhdHNbJ3RvdGFsX3RvcGljcyddIiBmb3JtYXQ9InNob3J0In17e2Vsc2V9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfdG9waWNzJ10ifXt7ZW5kaWZ9fTwvc3Bhbj4KCQkJCQkJPC9kaXY+CgkJCQkJPC9saT4KCQkJCXt7ZW5kaWZ9fQoJCQkJe3tpZiBzZXR0aW5ncy5nbHN0YXRzX2Jsb2dzfX0KCQkJCQk8bGkgY2xhc3M9J2lwc0RhdGFJdGVtJz4KCQkJCQkJPGRpdiBjbGFzcz0naXBzRGF0YUl0ZW1fbWFpbiBpcHNQb3NfbWlkZGxlJz4KCQkJCQkJCTxzdHJvbmc+e2xhbmc9Imdsc3RhdHNfYmxvZ3MifTwvc3Ryb25nPgoJCQkJCQk8L2Rpdj4KCQkJCQkJPGRpdiBjbGFzcz0naXBzRGF0YUl0ZW1fc3RhdHMgaXBzRGF0YUl0ZW1fc3RhdHNMYXJnZSc+CgkJCQkJCQk8c3BhbiBjbGFzcz0naXBzRGF0YUl0ZW1fc3RhdHNfbnVtYmVyJz57e2lmIHNldHRpbmdzLmdsc3RhdHNfc2hvcnR9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfYmxvZ3MnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbHNlfX17bnVtYmVyPSIkc3RhdHNbJ3RvdGFsX2Jsb2dzJ10ifXt7ZW5kaWZ9fTwvc3Bhbj4KCQkJCQkJPC9kaXY+CgkJCQkJPC9saT4KCQkJCXt7ZW5kaWZ9fQoJCQkJe3tpZiBzZXR0aW5ncy5nbHN0YXRzX2ZpbGVzfX0KCQkJCQk8bGkgY2xhc3M9J2lwc0RhdGFJdGVtJz4KCQkJCQkJPGRpdiBjbGFzcz0naXBzRGF0YUl0ZW1fbWFpbiBpcHNQb3NfbWlkZGxlJz4KCQkJCQkJCTxzdHJvbmc+e2xhbmc9Imdsc3RhdHNfZmlsZXMifTwvc3Ryb25nPgoJCQkJCQk8L2Rpdj4KCQkJCQkJPGRpdiBjbGFzcz0naXBzRGF0YUl0ZW1fc3RhdHMgaXBzRGF0YUl0ZW1fc3RhdHNMYXJnZSc+CgkJCQkJCQk8c3BhbiBjbGFzcz0naXBzRGF0YUl0ZW1fc3RhdHNfbnVtYmVyJz57e2lmIHNldHRpbmdzLmdsc3RhdHNfc2hvcnR9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfZmlsZXMnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbHNlfX17bnVtYmVyPSIkc3RhdHNbJ3RvdGFsX2ZpbGVzJ10ifXt7ZW5kaWZ9fTwvc3Bhbj4KCQkJCQkJPC9kaXY+CgkJCQkJPC9saT4KCQkJCXt7ZW5kaWZ9fQoJCQkJe3tpZiBzZXR0aW5ncy5nbHN0YXRzX2ltYWdlc319CgkJCQkJPGxpIGNsYXNzPSdpcHNEYXRhSXRlbSc+CgkJCQkJCTxkaXYgY2xhc3M9J2lwc0RhdGFJdGVtX21haW4gaXBzUG9zX21pZGRsZSc+CgkJCQkJCQk8c3Ryb25nPntsYW5nPSJnbHN0YXRzX2ltYWdlcyJ9PC9zdHJvbmc+CgkJCQkJCTwvZGl2PgoJCQkJCQk8ZGl2IGNsYXNzPSdpcHNEYXRhSXRlbV9zdGF0cyBpcHNEYXRhSXRlbV9zdGF0c0xhcmdlJz4KCQkJCQkJCTxzcGFuIGNsYXNzPSdpcHNEYXRhSXRlbV9zdGF0c19udW1iZXInPnt7aWYgc2V0dGluZ3MuZ2xzdGF0c19zaG9ydH19e251bWJlcj0iJHN0YXRzWyd0b3RhbF9pbWFnZXMnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbHNlfX17bnVtYmVyPSIkc3RhdHNbJ3RvdGFsX2ltYWdlcyddIn17e2VuZGlmfX08L3NwYW4+CgkJCQkJCTwvZGl2PgoJCQkJCTwvbGk+CgkJCQl7e2VuZGlmfX0KCQkJCXt7aWYgc2V0dGluZ3MuZ2xzdGF0c19tZW1iZXJzfX0KCQkJCQk8bGkgY2xhc3M9Imlwc0RhdGFJdGVtIj4KCQkJCQkJPGRpdiBjbGFzcz0iaXBzRGF0YUl0ZW1fbWFpbiBpcHNQb3NfbWlkZGxlIj4KCQkJCQkJCTxzdHJvbmc+e2xhbmc9Imdsc3RhdHNfbWVtYmVycyJ9PC9zdHJvbmc+CgkJCQkJCTwvZGl2PgoJCQkJCQk8ZGl2IGNsYXNzPSJpcHNEYXRhSXRlbV9zdGF0cyBpcHNEYXRhSXRlbV9zdGF0c0xhcmdlIj4KCQkJCQkJCTxzcGFuIGNsYXNzPSJpcHNEYXRhSXRlbV9zdGF0c19udW1iZXIiPnt7aWYgc2V0dGluZ3MuZ2xzdGF0c19zaG9ydH19e3tpZiBzZXR0aW5ncy5nbHN0YXRzX21lbWJlcn19e251bWJlcj0iJHN0YXRzWydtZW1iZXJfY291bnQnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbHNlfX17bnVtYmVyPSIkc3RhdHNbJ21lbWJlcl9hbGwnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbmRpZn19e3tlbHNlfX17e2lmIHNldHRpbmdzLmdsc3RhdHNfbWVtYmVyfX17bnVtYmVyPSIkc3RhdHNbJ21lbWJlcl9jb3VudCddIn17e2Vsc2V9fXtudW1iZXI9IiRzdGF0c1snbWVtYmVyX2FsbCddIn17e2VuZGlmfX17e2VuZGlmfX08L3NwYW4+CgkJCQkJCTwvZGl2PgoJCQkJCTwvbGk+CgkJCQl7e2VuZGlmfX0KCQkJCXt7aWYgc2V0dGluZ3MuZ2xzdGF0c19ibWVtYmVyc319CgkJCQkJPGxpIGNsYXNzPSJpcHNEYXRhSXRlbSI+CgkJCQkJCTxkaXYgY2xhc3M9Imlwc0RhdGFJdGVtX21haW4gaXBzUG9zX21pZGRsZSI+CgkJCQkJCQk8c3Ryb25nPntsYW5nPSJnbHN0YXRzX2JtZW1iZXJzIn08L3N0cm9uZz4KCQkJCQkJPC9kaXY+CgkJCQkJCTxkaXYgY2xhc3M9Imlwc0RhdGFJdGVtX3N0YXRzIGlwc0RhdGFJdGVtX3N0YXRzTGFyZ2UiPgoJCQkJCQkJPHNwYW4gY2xhc3M9Imlwc0RhdGFJdGVtX3N0YXRzX251bWJlciI+e3tpZiBzZXR0aW5ncy5nbHN0YXRzX3Nob3J0fX17bnVtYmVyPSIkc3RhdHNbJ2JtZW1iZXJfY291bnQnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbHNlfX17bnVtYmVyPSIkc3RhdHNbJ2JtZW1iZXJfY291bnQnXSJ9e3tlbmRpZn19PC9zcGFuPgoJCQkJCQk8L2Rpdj4KCQkJCQk8L2xpPgoJCQkJe3tlbmRpZn19CgkJCQl7e2lmIHNldHRpbmdzLmdsc3RhdHNfb25saW5lfX0KCQkJCQk8bGkgY2xhc3M9Imlwc0RhdGFJdGVtIj4KCQkJCQkJPGRpdiBjbGFzcz0iaXBzRGF0YUl0ZW1fbWFpbiBpcHNQb3NfbWlkZGxlIj4KCQkJCQkJCTxzdHJvbmc+e2xhbmc9Imdsc3RhdHNfb25saW5lIn08L3N0cm9uZz4KCQkJCQkJPC9kaXY+CgkJCQkJCTxkaXYgY2xhc3M9Imlwc0RhdGFJdGVtX3N0YXRzIGlwc0RhdGFJdGVtX3N0YXRzTGFyZ2UiPgoJCQkJCQkJPHNwYW4gY2xhc3M9Imlwc0RhdGFJdGVtX3N0YXRzX251bWJlciI+e3tpZiBzZXR0aW5ncy5nbHN0YXRzX3Nob3J0fX17bnVtYmVyPSIkc3RhdHNbJ21vc3Rfb25saW5lJ11bJ2NvdW50J10iIGZvcm1hdD0ic2hvcnQifXt7ZWxzZX19e251bWJlcj0iJHN0YXRzWydtb3N0X29ubGluZSddWydjb3VudCddIn17e2VuZGlmfX08L3NwYW4+PGJyPgoJCQkJCQkJPHNwYW4gY2xhc3M9Imlwc1R5cGVfbGlnaHQgaXBzVHlwZV9zbWFsbCI+PHRpbWU+eyRzdGF0c1snbW9zdF9vbmxpbmUnXVsndGltZSddfTwvdGltZT48L3NwYW4+CgkJCQkJCTwvZGl2PgoJCQkJCTwvbGk+CgkJCQl7e2VuZGlmfX0KCQkJPC91bD4KCQkJPGhyIGNsYXNzPSdpcHNIcic+CgkJCXt7aWYgJHN0YXRzWydsYXN0X3JlZ2lzdGVyZWQnXX19CgkJCQk8ZGl2IGNsYXNzPSdpcHNDbGVhcmZpeCBpcHNQYWRkaW5nX2JvdHRvbSc+CgkJCQkJPGRpdiBjbGFzcz0naXBzUG9zX2xlZnQgaXBzVHlwZV9jZW50ZXIgY05ld2VzdE1lbWJlcic+CgkJCQkJCXt0ZW1wbGF0ZT0idXNlclBob3RvIiBhcHA9ImNvcmUiIGdyb3VwPSJnbG9iYWwiIHBhcmFtcz0iJHN0YXRzWydsYXN0X3JlZ2lzdGVyZWQnXSwgJ3NtYWxsJyJ9CgkJCQkJPC9kaXY+CgkJCQkJPGRpdiBjbGFzcz0naXBzV2lkZ2V0X2xhdGVzdEl0ZW0nPgoJCQkJCQk8c3Ryb25nIGNsYXNzPSdpcHNUeXBlX21pbm9ySGVhZGluZyc+e2xhbmc9InN0YXRzX25ld2VzdF9tZW1iZXIifTwvc3Ryb25nPjxicj4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbm9ybWFsJz57JHN0YXRzWydsYXN0X3JlZ2lzdGVyZWQnXS0+bGluaygpfHJhd308L3NwYW4+PGJyPgoJCQkJCQk8c3BhbiBjbGFzcz0naXBzVHlwZV9tZWRpdW0gaXBzVHlwZV9saWdodCc+e2xhbmc9Im1lbWJlcnNfam9pbmVkIn0gPHRpbWU+eyRzdGF0c1snbGFzdF9yZWdpc3RlcmVkJ10tPmpvaW5lZC0+Z2V0VGltZXN0YW1wKCl9PC90aW1lPjwvc3Bhbj4KCQkJCQk8L2Rpdj4KCQkJCTwvZGl2PgoJCQl7e2VuZGlmfX0KCQk8L2Rpdj4KCXt7ZWxzZX19CgkJPGRpdiBjbGFzcz0naXBzRmxleCBpcHNGbGV4LWFpOmNlbnRlciBpcHNGbGV4LWpjOmJldHdlZW4gc206aXBzRmxleC1mZDpjb2x1bW4gc206aXBzRmxleC1haTpzdHJldGNoIGlwc1BhZGRpbmcgaXBzV2lkZ2V0X3N0YXRzJz4KCQkJPGRpdiBjbGFzcz0naXBzRmxleC1mbGV4OjExIGlwc0ZsZXggaXBzRmxleC1haTpjZW50ZXIgaXBzRmxleC1qYzphcm91bmQnPgoJCQkJe3tpZiBzZXR0aW5ncy5nbHN0YXRzX3Bvc3RzfX0KCQkJCQk8ZGl2IGNsYXNzPSdpcHNUeXBlX2NlbnRlcic+CgkJCQkJCTxzcGFuIGNsYXNzPSdpcHNUeXBlX2xhcmdlIGlwc1dpZGdldF9zdGF0c0NvdW50Jz57e2lmIHNldHRpbmdzLmdsc3RhdHNfc2hvcnR9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfcG9zdHMnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbHNlfX17bnVtYmVyPSIkc3RhdHNbJ3RvdGFsX3Bvc3RzJ10ifXt7ZW5kaWZ9fTwvc3Bhbj48YnI+CgkJCQkJCTxzcGFuIGNsYXNzPSdpcHNUeXBlX2xpZ2h0IGlwc1R5cGVfbWVkaXVtJz57bGFuZz0iZ2xzdGF0c19wb3N0cyJ9PC9zcGFuPgoJCQkJCTwvZGl2PgoJCQkJe3tlbmRpZn19CgkJCQl7e2lmIHNldHRpbmdzLmdsc3RhdHNfdG9waWNzfX0KCQkJCQk8ZGl2IGNsYXNzPSdpcHNUeXBlX2NlbnRlcic+CgkJCQkJCTxzcGFuIGNsYXNzPSdpcHNUeXBlX2xhcmdlIGlwc1dpZGdldF9zdGF0c0NvdW50Jz57e2lmIHNldHRpbmdzLmdsc3RhdHNfc2hvcnR9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfdG9waWNzJ10iIGZvcm1hdD0ic2hvcnQifXt7ZWxzZX19e251bWJlcj0iJHN0YXRzWyd0b3RhbF90b3BpY3MnXSJ9e3tlbmRpZn19PC9zcGFuPjxicj4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbGlnaHQgaXBzVHlwZV9tZWRpdW0nPntsYW5nPSJnbHN0YXRzX3RvcGljcyJ9PC9zcGFuPgoJCQkJCTwvZGl2PgoJCQkJe3tlbmRpZn19CgkJCQl7e2lmIHNldHRpbmdzLmdsc3RhdHNfYmxvZ3N9fQoJCQkJCTxkaXYgY2xhc3M9J2lwc1R5cGVfY2VudGVyJz4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbGFyZ2UgaXBzV2lkZ2V0X3N0YXRzQ291bnQnPnt7aWYgc2V0dGluZ3MuZ2xzdGF0c19zaG9ydH19e251bWJlcj0iJHN0YXRzWyd0b3RhbF9ibG9ncyddIiBmb3JtYXQ9InNob3J0In17e2Vsc2V9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfYmxvZ3MnXSJ9e3tlbmRpZn19PC9zcGFuPjxicj4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbGlnaHQgaXBzVHlwZV9tZWRpdW0nPntsYW5nPSJnbHN0YXRzX2Jsb2dzIn08L3NwYW4+CgkJCQkJPC9kaXY+CgkJCQl7e2VuZGlmfX0KCQkJCXt7aWYgc2V0dGluZ3MuZ2xzdGF0c19maWxlc319CgkJCQkJPGRpdiBjbGFzcz0naXBzVHlwZV9jZW50ZXInPgoJCQkJCQk8c3BhbiBjbGFzcz0naXBzVHlwZV9sYXJnZSBpcHNXaWRnZXRfc3RhdHNDb3VudCc+e3tpZiBzZXR0aW5ncy5nbHN0YXRzX3Nob3J0fX17bnVtYmVyPSIkc3RhdHNbJ3RvdGFsX2ZpbGVzJ10iIGZvcm1hdD0ic2hvcnQifXt7ZWxzZX19e251bWJlcj0iJHN0YXRzWyd0b3RhbF9maWxlcyddIn17e2VuZGlmfX08L3NwYW4+PGJyPgoJCQkJCQk8c3BhbiBjbGFzcz0naXBzVHlwZV9saWdodCBpcHNUeXBlX21lZGl1bSc+e2xhbmc9Imdsc3RhdHNfZmlsZXMifTwvc3Bhbj4KCQkJCQk8L2Rpdj4KCQkJCXt7ZW5kaWZ9fQoJCQkJe3tpZiBzZXR0aW5ncy5nbHN0YXRzX2ltYWdlc319CgkJCQkJPGRpdiBjbGFzcz0naXBzVHlwZV9jZW50ZXInPgoJCQkJCQk8c3BhbiBjbGFzcz0naXBzVHlwZV9sYXJnZSBpcHNXaWRnZXRfc3RhdHNDb3VudCc+e3tpZiBzZXR0aW5ncy5nbHN0YXRzX3Nob3J0fX17bnVtYmVyPSIkc3RhdHNbJ3RvdGFsX2ltYWdlcyddIiBmb3JtYXQ9InNob3J0In17e2Vsc2V9fXtudW1iZXI9IiRzdGF0c1sndG90YWxfaW1hZ2VzJ10ifXt7ZW5kaWZ9fTwvc3Bhbj48YnI+CgkJCQkJCTxzcGFuIGNsYXNzPSdpcHNUeXBlX2xpZ2h0IGlwc1R5cGVfbWVkaXVtJz57bGFuZz0iZ2xzdGF0c19pbWFnZXMifTwvc3Bhbj4KCQkJCQk8L2Rpdj4KCQkJCXt7ZW5kaWZ9fQoJCQkJe3tpZiBzZXR0aW5ncy5nbHN0YXRzX21lbWJlcnN9fQoJCQkJCTxkaXYgY2xhc3M9J2lwc1R5cGVfY2VudGVyJz4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbGFyZ2UgaXBzV2lkZ2V0X3N0YXRzQ291bnQnPnt7aWYgc2V0dGluZ3MuZ2xzdGF0c19zaG9ydH19e3tpZiBzZXR0aW5ncy5nbHN0YXRzX21lbWJlcn19e251bWJlcj0iJHN0YXRzWydtZW1iZXJfY291bnQnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbHNlfX17bnVtYmVyPSIkc3RhdHNbJ21lbWJlcl9hbGwnXSIgZm9ybWF0PSJzaG9ydCJ9e3tlbmRpZn19e3tlbHNlfX17e2lmIHNldHRpbmdzLmdsc3RhdHNfbWVtYmVyfX17bnVtYmVyPSIkc3RhdHNbJ21lbWJlcl9jb3VudCddIn17e2Vsc2V9fXtudW1iZXI9IiRzdGF0c1snbWVtYmVyX2FsbCddIn17e2VuZGlmfX17e2VuZGlmfX08L3NwYW4+PGJyPgoJCQkJCQk8c3BhbiBjbGFzcz0naXBzVHlwZV9saWdodCBpcHNUeXBlX21lZGl1bSc+e2xhbmc9Imdsc3RhdHNfbWVtYmVycyJ9PC9zcGFuPgoJCQkJCTwvZGl2PgoJCQkJe3tlbmRpZn19CgkJCQl7e2lmIHNldHRpbmdzLmdsc3RhdHNfYm1lbWJlcnN9fQoJCQkJCTxkaXYgY2xhc3M9J2lwc1R5cGVfY2VudGVyJz4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbGFyZ2UgaXBzV2lkZ2V0X3N0YXRzQ291bnQnPnt7aWYgc2V0dGluZ3MuZ2xzdGF0c19zaG9ydH19e251bWJlcj0iJHN0YXRzWydibWVtYmVyX2NvdW50J10iIGZvcm1hdD0ic2hvcnQifXt7ZWxzZX19e251bWJlcj0iJHN0YXRzWydibWVtYmVyX2NvdW50J10ifXt7ZW5kaWZ9fTwvc3Bhbj48YnI+CgkJCQkJCTxzcGFuIGNsYXNzPSdpcHNUeXBlX2xpZ2h0IGlwc1R5cGVfbWVkaXVtJz57bGFuZz0iZ2xzdGF0c19ibWVtYmVycyJ9PC9zcGFuPgoJCQkJCTwvZGl2PgoJCQkJe3tlbmRpZn19CgkJCQl7e2lmIHNldHRpbmdzLmdsc3RhdHNfb25saW5lfX0KCQkJCQk8ZGl2IGNsYXNzPSdpcHNUeXBlX2NlbnRlcic+CgkJCQkJCTxzcGFuIGNsYXNzPSdpcHNUeXBlX2xhcmdlIGlwc1dpZGdldF9zdGF0c0NvdW50JyBkYXRhLWlwc1Rvb2x0aXAgdGl0bGU9Jzx0aW1lIGRhdGEtbm9yZWxhdGl2ZT0idHJ1ZSI+eyRzdGF0c1snbW9zdF9vbmxpbmUnXVsndGltZSddfTwvdGltZT4nPnt7aWYgc2V0dGluZ3MuZ2xzdGF0c19zaG9ydH19e251bWJlcj0iJHN0YXRzWydtb3N0X29ubGluZSddWydjb3VudCddIiBmb3JtYXQ9InNob3J0In17e2Vsc2V9fXtudW1iZXI9IiRzdGF0c1snbW9zdF9vbmxpbmUnXVsnY291bnQnXSJ9e3tlbmRpZn19PC9zcGFuPjxicj4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbGlnaHQgaXBzVHlwZV9tZWRpdW0nPntsYW5nPSJnbHN0YXRzX29ubGluZSJ9PC9zcGFuPgoJCQkJCTwvZGl2PgoJCQkJe3tlbmRpZn19CgkJCTwvZGl2PgoJCQl7e2lmICRzdGF0c1snbGFzdF9yZWdpc3RlcmVkJ10gaW5zdGFuY2VvZiBcSVBTXE1lbWJlcn19CgkJCTxkaXYgY2xhc3M9J2lwc0ZsZXgtZmxleDowMSBpcHNCb3JkZXJfbGVmdCBpcHNQYWRkaW5nX2xlZnQgaXBzTWFyZ2luX3JpZ2h0OmRvdWJsZSBzbTppcHNNYXJnaW5fcmlnaHQ6bm9uZSBzbTppcHNNYXJnaW5fdG9wIHNtOmlwc0JvcmRlcjpub25lIHNtOmlwc0JvcmRlcl90b3Agc206aXBzUGFkZGluZ190b3Agc206aXBzUGFkZGluZ19sZWZ0Om5vbmUgc206aXBzRmxleCBzbTppcHNGbGV4LWpjOmNlbnRlcic+CgkJCQk8ZGl2IGNsYXNzPSdpcHNQaG90b1BhbmVsIGlwc1Bob3RvUGFuZWxfbWluaSBjTmV3ZXN0TWVtYmVyJz4KCQkJCQl7dGVtcGxhdGU9InVzZXJQaG90byIgYXBwPSJjb3JlIiBncm91cD0iZ2xvYmFsIiBwYXJhbXM9IiRzdGF0c1snbGFzdF9yZWdpc3RlcmVkJ10sICdtaW5pJyJ9CgkJCQkJPGRpdj4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbWlub3JIZWFkaW5nJz57bGFuZz0ic3RhdHNfbmV3ZXN0X21lbWJlciJ9PC9zcGFuPjxicj4KCQkJCQkJPHNwYW4gY2xhc3M9J2lwc1R5cGVfbm9ybWFsJz57JHN0YXRzWydsYXN0X3JlZ2lzdGVyZWQnXS0+bGluaygpfHJhd308L3NwYW4+PGJyPgoJCQkJCQk8c3BhbiBjbGFzcz0naXBzVHlwZV9zbWFsbCBpcHNUeXBlX2xpZ2h0Jz57bGFuZz0ibWVtYmVyc19qb2luZWQifSA8dGltZT57JHN0YXRzWydsYXN0X3JlZ2lzdGVyZWQnXS0+am9pbmVkLT5nZXRUaW1lc3RhbXAoKX08L3RpbWU+PC9zcGFuPgoJCQkJCTwvZGl2PgoJCQkJPC9kaXY+CgkJCTwvZGl2PgoJCQl7e2VuZGlmfX0KCQk8L2Rpdj4KCXt7ZW5kaWZ9fQo8L2Rpdj4</html></htmlFiles><cssFiles><css filename="glstats.css">QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY3cHgpIHsKLmlwc1dpZGdldF9zdGF0cyAuaXBzRmxleC1mbGV4XDoxMSB7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwp9Cn0=</css></cssFiles><jsFiles/><resourcesFiles/><lang><word key="block_glstats" js="0">Global Statistics</word><word key="block_glstats_desc" js="0">Display Forums, Members, Downloads, Blogs and Images statistics</word><word key="glstats_posts" js="0">Total Posts</word><word key="glstats_topics" js="0">Total Topics</word><word key="glstats_members" js="0">Total Members</word><word key="glstats_bmembers" js="0">Total Banned</word><word key="glstats_online" js="0">Most Online</word><word key="glstats_files" js="0">Total Files</word><word key="glstats_blogs" js="0">Total Blogs</word><word key="glstats_images" js="0">Total Images</word><word key="glstats_short" js="0">Short numbers</word><word key="glstats_member" js="0">Real members</word><word key="glstats_member_desc" js="0">Display the number of members only really registered</word></lang><versions><version long="21000" human="2.1.0"><![CDATA[//<?php


/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
	header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
	exit;
}

/**
 * 2.1.0 Upgrade Code
 */
class ips_plugins_setup_upg_21000
{
	/**
	 * ...
	 *
	 * @return	array	If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
	 */
	public function step1()
	{
		

		return TRUE;
	}
	
	// You can create as many additional methods (step2, step3, etc.) as is necessary.
	// Each step will be executed in a new HTTP request
}]]></version></versions></plugin>
