Spade

Mini Shell

Directory:~$ /home/lmsyaran/public_html/joomla4/
Upload File

[Home] [System Details] [Kill Me]
Current File:~$ /home/lmsyaran/public_html/joomla4/osl.zip

PK�c�[���W��Config/Config.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Config
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Config;

/**
 * Provide basic methods which help accessing to configuration data
 *
 * @package        OSL
 * @subpackage     Config
 * @since          1.0
 */
class Config implements \ArrayAccess
{
	/**
	 * The config data container
	 *
	 * @var array
	 */
	protected $data;

	/**
	 * OSFConfig constructor.
	 *
	 * @param array $data
	 */
	public function __construct(array $data = array())
	{
		$this->data = $data;
	}

	/**
	 * Retrieve data for a config option
	 *
	 * @param string $key     The key of the config option
	 *
	 * @param mixed  $default Default value if no data has been set for that
config option
	 *
	 * @return mixed The config option value
	 */
	public function get($key, $default = null)
	{
		if (isset($this->data[$key]))
		{
			return $this->data[$key];
		}

		return $default;
	}

	/**
	 * Set data for a config option
	 *
	 * @param string $name The name of config option
	 * @param mixed  $value
	 *
	 * @return $this
	 */
	public function set($name, $value)
	{
		$this->data[$name] = $value;

		return $this;
	}

	/**
	 * Define value for a config option. The value will only be set if
there's no value for the name or if it is null.
	 *
	 * @param   string $name  Name of the value to define.
	 * @param   mixed  $value Value to assign to the input.
	 *
	 * @return  void
	 *
	 */
	public function def($name, $value)
	{
		if (isset($this->data[$name]))
		{
			return;
		}

		$this->data[$name] = $value;
	}

	/**
	 * @param mixed $offset
	 *
	 * @return mixed
	 */
	public function offsetExists($offset)
	{
		return isset($this->data[$offset]);
	}

	/**
	 * @param mixed $offset
	 *
	 * @return mixed
	 */
	public function offsetGet($offset)
	{
		return $this->get($offset);
	}

	/**
	 * @param mixed $offset
	 * @param mixed $value
	 *
	 * @return mixed
	 */
	public function offsetSet($offset, $value)
	{
		$this->set($offset, $value);
	}

	/**
	 * @param mixed $offset
	 *
	 * @return mixed
	 */
	public function offsetUnset($offset)
	{
		unset($this->data[$offset]);
	}


	/**
	 * Magic method to get a config option value
	 *
	 * @param string
	 *
	 * @return mixed
	 */
	public function __get($name)
	{
		return $this->get($name);
	}

	/**
	 * Set config option value
	 *
	 * @param string $name  user-specified config option
	 *
	 * @param mixed  $value user-specified config option value.
	 *
	 * @return void
	 */
	public function __set($name, $value)
	{
		$this->set($name, $value);
	}

	/**
	 * Test existence of a config variable
	 *
	 * @param string
	 *
	 * @return boolean
	 */
	public function __isset($name)
	{
		return isset($this->data[$name]);
	}
}PK�c�[��i^Container/Container.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Container
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */
namespace OSL\Container;

use Exception;
use Joomla\DI\Container as DIContainer;
use OSL\Input\Input;
use JFactory, JText, JComponentHelper;


/**
 * DI Container for component
 *
 * @property  string                         $option                       
                   The name of the component (com_eventbooking)
 * @property  string                         $componentName                
                   The name of the component without com_ (eventbooking)
 * @property  string                         $componentNamespace           
                   The namespace of the component's classes
(Ossolution\EventBooking)
 * @property  string                         $feNamespace                  
                   The frontend namespace of the component's classes
(Ossolution\EventBooking\Site)
 * @property  string                         $beNamespace                  
                   The backend namespace of the component's classes
(Ossolution\EventBooking\Admin)
 * @property  string                         $namespace                    
                   The namespace of the component's classes
(Ossolution\EventBooking\Admin or Ossolution\EventBooking\Site),
 *                                                                         
               depends on the current application being executued
 *
 * @property-read  \OSL\Factory\Factory      $factory                      
                   The application object
 * @property-read  \JApplicationCms          $app                          
                   The application object
 * @property-read  \Joomla\Registry\Registry $appConfig                    
                   The application configuration object
 * @property-read  \JDocumentHtml            $document                     
                   The event dispatcher
 * @property-read  \JEventDispatcher         $eventDispatcher              
                   The event dispatcher
 * @property-read  \JSession                 $session                      
                   The session object
 * @property-read  \JMail                    $mailer                       
                   The mailer object
 * @property-read  \JLanguage                $language                     
                   The language object
 * @property-read  Input                     $input                        
                   The input object
 * @property-read  \JDatabaseDriver          $db                           
                   The database connection object
 * @property-read  \OSL\Inflector\Inflector  $inflector                    
                   The string inflector
 * @property-read  \JUser                    $user                         
                   The user
 *
 * @property  string                         $defaultView                  
                   Default view
 * @property  string                         $tablePrefix                  
                   Database table prefix
 * @property  string                         $languagePrefix               
                   Language Prefix
 * @property-read  string                    $template                     
                   The active template
 */
class Container extends DIContainer
{
	/**
	 * Store configuration values for container, use for child container
	 *
	 * @var array
	 */
	protected $values = array();
	/**
	 * Cache of created container instances
	 *
	 * @var   array
	 */
	protected static $containerStore = array();

	/**
	 * Returns the container instance for a specific component. If the
instance exists it returns the one already
	 * constructed.
	 *
	 * @param   string    $option The name of the component, e.g. com_example
	 * @param   array     $values Configuration override values
	 * @param   Container $parent Optional. Parent container (default:
application container)
	 *
	 * @return  Container
	 *
	 * @throws Exception
	 */
	public static function &getInstance($option, array $values = array(),
Container $parent = null)
	{
		if (!isset(static::$containerStore[$option]))
		{
			$defaultValues = array(
				'option'             => $option,
				'componentName'      => substr($option, 4),
				'componentNamespace' => 'Joomla\\Component\\' .
ucfirst(substr($option, 4)),
				'frontEndPath'       => JPATH_ROOT .
'/components/' . $option,
				'backEndPath'        => JPATH_ADMINISTRATOR .
'/components/' . $option,
				'defaultView'        => substr($option, 4),
				'tablePrefix'        => '#__' . substr($option,
4) . '_',
				'languagePrefix'     => substr($option, 4),
			);

			$values = array_merge($defaultValues, $values);

			if (empty($values['feNamespace']))
			{
				$values['feNamespace'] =
$values['componentNamespace'] . '\\Site';
			}

			if (empty($values['beNamespace']))
			{
				$values['beNamespace'] =
$values['componentNamespace'] . '\\Admin';
			}

			$namespace           =
JFactory::getApplication()->isClient('administrator') ?
$values['beNamespace'] : $values['feNamespace'];
			$values['namespace'] = $namespace;

			$className = $namespace . '\\Container';

			if (!class_exists($className, true))
			{
				$className = __CLASS__;
			}

			self::$containerStore[$option] = new $className($values, $parent);
		}

		return self::$containerStore[$option];
	}

	/**
	 * Creates a new DI container.
	 *
	 * @param   DIContainer $parent The parent DI container, optional
	 * @param   array       $values
	 */
	public function __construct(array $values = array(), DIContainer $parent =
null)
	{
		parent::__construct($parent);

		// Register the component to the PSR-4 auto-loader

		/** @var \Composer\Autoload\ClassLoader $autoLoader */
		$autoLoader = include JPATH_LIBRARIES .
'/vendor/autoload.php';
		$autoLoader->setPsr4($values['feNamespace'] .
'\\', $values['frontEndPath']);
		$autoLoader->setPsr4($values['beNamespace'] .
'\\', $values['backEndPath']);

		foreach ($values as $key => $value)
		{
			$this->set($key, $value);
		}

		// Store the values, use for creating child container if needed
		$this->values = $values;

		// Register common used Joomla objects
		$this->registerServiceProvider(new \OSL\Provider\SystemProvider());
	}

	/**
	 * Create a child Container with a new property scope that
	 * that has the ability to access the parent scope when resolving.
	 *
	 * @param array $values
	 *
	 * @return  Container  This object for chaining.
	 *
	 */
	public function createChild($values = array())
	{
		$values = array_merge($this->values, $values);

		return new static($values, $this);
	}

	/**
	 * Magic getter for alternative syntax, e.g. $container->foo instead of
$container->get('foo'). Allows for type
	 * hinting using the property and property-read PHPdoc macros at the top
of the container.
	 *
	 * @param   string $name The key of the data storage
	 *
	 * @return  mixed
	 */
	public function __get($name)
	{
		return $this->get($name);
	}

	/**
	 * Magic setter for alternative syntax, e.g. $container->foo = $value
instead of $container->set('foo', $value).
	 * Allows for type hinting using the property and property-read PHPdoc
macros at the top of the container.
	 *
	 * @param   string $name  The key of the data storage
	 * @param   mixed  $value The value to set in the data storage
	 */
	public function __set($name, $value)
	{
		$this->set($name, $value);
	}
}PK�c�[�s��66!Container/ContainerAwareTrait.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Container
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Container;

/**
 * Defines the trait for a Container Aware Class.
 *
 * @since  1.0
 *
 */
trait ContainerAwareTrait
{
	/**
	 * DI Container
	 *
	 * @var    Container
	 * @since  1.0
	 */
	protected $container;

	/**
	 * Get the DI container.
	 *
	 * @return  Container
	 *
	 * @since   1.0
	 *
	 * @throws  \UnexpectedValueException May be thrown if the container has
not been set.
	 */
	public function getContainer()
	{
		if ($this->container)
		{
			return $this->container;
		}

		throw new \UnexpectedValueException('Container not set in ' .
__CLASS__);
	}

	/**
	 * Set the DI container.
	 *
	 * @param   Container $container The DI container.
	 *
	 * @return  mixed  Returns itself to support chaining.
	 *
	 * @since   1.0
	 */
	public function setContainer(Container $container)
	{
		$this->container = $container;

		return $this;
	}
}
PK�c�[�5b6G)G)Controller/AdminController.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Controller;

use OSL\Container\Container;

use Joomla\Utilities\ArrayHelper, JText, JRoute;

defined('_JEXEC') or die;

/**
 * Class AdminController
 *
 * Base class for a Joomla admin Controller. It handles add, edit, delete,
publish, unpublish records....
 */
class AdminController extends Controller
{

	/**
	 * The URL view item variable.
	 *
	 * @var string
	 */
	protected $viewItem;

	/**
	 * The URL view list variable.
	 *
	 * @var string
	 */
	protected $viewList;

	/**
	 * Constructor.
	 *
	 * @param array $config An optional associative array of configuration
settings.
	 *
	 * @see OSFControlleAdmin
	 */
	public function __construct(Container $container, array $config =
array())
	{
		parent::__construct($container, $config);

		if (isset($config['view_item']))
		{
			$this->viewItem = $config['view_item'];
		}
		else
		{
			$this->viewItem = $this->name;
		}

		if (isset($config['view_list']))
		{
			$this->viewList = $config['view_list'];
		}
		else
		{
			$this->viewList =
$this->container->inflector->pluralize($this->viewItem);
		}

		// Register tasks mapping
		$this->registerTask('apply', 'save');
		$this->registerTask('save2new', 'save');
		$this->registerTask('save2copy', 'save');
		$this->registerTask('unpublish', 'publish');
		$this->registerTask('orderup', 'reorder');
		$this->registerTask('orderdown', 'reorder');
	}

	/**
	 * Display Form allows adding a new record
	 */
	public function add()
	{
		if ($this->allowAdd())
		{
			$this->input->set('view', $this->viewItem);
			$this->input->set('edit', false);

			$this->display();
		}
		else
		{
			$this->setMessage(JText::_('JLIB_APPLICATION_ERROR_CREATE_RECORD_NOT_PERMITTED'),
'error');
			$this->setRedirect(JRoute::_($this->getViewListUrl(), false));

			return false;
		}
	}

	/**
	 * Display Form allows editing record
	 */
	public function edit()
	{
		$cid = $this->input->get('cid', array(),
'array');

		if (count($cid))
		{
			$this->input->set('id', 0);
		}

		if ($this->allowEdit(array('id' =>
$this->input->getInt('id'))))
		{
			$this->input->set('view', $this->viewItem);
			$this->input->set('edit', false);

			$this->display();
		}
		else
		{
			$this->setMessage(JText::_('JLIB_APPLICATION_ERROR_EDIT_NOT_PERMITTED'),
'error');
			$this->setRedirect(JRoute::_($this->getViewListUrl(), false));
		}
	}

	/**
	 * Method to save a record.
	 *
	 * @return boolean True if successful, false otherwise.
	 *
	 */
	public function save()
	{
		$this->csrfProtection();

		$input = $this->input;
		$task  = $this->getTask();

		if ($task == 'save2copy')
		{
			$input->set('source_id', $input->getInt('id',
0));
			$input->set('id', 0);
			$task = 'apply';
		}

		$id = $input->getInt('id', 0);

		if ($this->allowSave(array('id' => $id)))
		{
			try
			{
				/* @var \OSL\Model\AdminModel $model */

				$model = $this->getModel();

				$model->store($this->input);

				if ($this->container->app->isClient('site')
&& $id == 0)
				{
					$langSuffix = '_SUBMIT_SAVE_SUCCESS';
				}
				else
				{
					$langSuffix = '_SAVE_SUCCESS';
				}

				$languagePrefix = $this->container->languagePrefix;
				$msg            =
JText::_(($this->container->language->hasKey($languagePrefix .
$langSuffix) ? $languagePrefix : 'JLIB_APPLICATION') .
$langSuffix);

				switch ($task)
				{
					case 'apply':
						$url =
JRoute::_($this->getViewItemUrl($input->getInt('id', 0)),
false);
						break;
					case 'save2new':
						$url = JRoute::_($this->getViewItemUrl(), false);
						break;
					default:
						$url = JRoute::_($this->getViewListUrl(), false);
						break;
				}

				$this->setRedirect($url, $msg);
			}
			catch (\Exception $e)
			{
				$this->setMessage($e->getMessage(), 'error');
				$this->setRedirect(JRoute::_($this->getViewItemUrl($id),
false));
			}
		}
		else
		{
			$this->setMessage(JText::_('JLIB_APPLICATION_ERROR_SAVE_NOT_PERMITTED'),
'error');
			$this->setRedirect(JRoute::_($this->getViewListUrl(), false));
		}
	}

	/**
	 * Method to cancel an add/edit. We simply redirect users to view which
display list of records
	 *
	 */
	public function cancel()
	{
		$this->setRedirect(JRoute::_($this->getViewListUrl(), false));
	}

	/**
	 * Delete selected items
	 *
	 * @return void
	 *
	 */
	public function delete()
	{
		// Check for request forgeries
		$this->csrfProtection();

		// Get items to remove from the request.
		$cid = $this->input->get('cid', array(),
'array');
		$cid = ArrayHelper::toInteger($cid);

		for ($i = 0, $n = count($cid); $i < $n; $i++)
		{
			if (!$this->allowDelete($cid[$i]))
			{
				unset($cid[$i]);
			}
		}

		$languagePrefix = $this->container->languagePrefix;

		if (count($cid))
		{
			try
			{
				/* @var \OSL\Model\AdminModel $model */
				$model = $this->getModel($this->name,
array('ignore_request' => true));
				$model->delete($cid);
				$this->setMessage(JText::plural($languagePrefix .
'_N_ITEMS_DELETED', count($cid)));
			}
			catch (\Exception $e)
			{
				$this->setMessage($e->getMessage(), 'error');
			}
		}
		else
		{
			$this->setMessage($languagePrefix . '_NO_ITEM_SELECTED',
'warning');
		}

		$this->setRedirect(JRoute::_($this->getViewListUrl(), false));
	}

	/**
	 * Method to publish a list of items
	 *
	 * @return void
	 */
	public function publish()
	{
		// Check for request forgeries
		$this->csrfProtection();

		// Get items to publish from the request.
		$cid       = $this->input->get('cid', array(),
'array');
		$data      = array('publish' => 1, 'unpublish'
=> 0, 'archive' => 2);
		$task      = $this->getTask();
		$published = ArrayHelper::getValue($data, $task, 0, 'int');

		$cid = ArrayHelper::toInteger($cid);

		for ($i = 0, $n = count($cid); $i < $n; $i++)
		{
			if (!$this->allowEditState($cid[$i]))
			{
				unset($cid[$i]);
			}
		}

		$languagePrefix = $this->container->languagePrefix;

		if (count($cid))
		{
			try
			{
				/* @var \OSL\Model\AdminModel $model */
				$model = $this->getModel($this->name,
array('ignore_request' => true));
				$model->publish($cid, $published);

				switch ($published)
				{
					case 0:
						$ntext = $languagePrefix . '_N_ITEMS_UNPUBLISHED';
						break;
					case 1:
						$ntext = $languagePrefix . '_N_ITEMS_PUBLISHED';
						break;
					case 2:
						$ntext = $languagePrefix . '_N_ITEMS_ARCHIVED';
						break;
				}

				$this->setMessage(JText::plural($ntext, count($cid)));
			}
			catch (\Exception $e)
			{
				$msg = null;
				$this->setMessage($e->getMessage(), 'error');
			}
		}
		else
		{
			$this->setMessage($languagePrefix . '_NO_ITEM_SELECTED',
'warning');
		}

		$this->setRedirect(JRoute::_($this->getViewListUrl(), false));
	}

	/**
	 * Method to save the submitted ordering values for records via AJAX.
	 *
	 * @return  void
	 *
	 * @since   2.0
	 */
	public function save_order_ajax()
	{
		// Get the input
		$pks   = $this->input->post->get('cid', array(),
'array');
		$order = $this->input->post->get('order', array(),
'array');

		// Sanitize the input
		$pks   = ArrayHelper::toInteger($pks);
		$order = ArrayHelper::toInteger($order);

		// Get the model
		/* @var \OSL\Model\AdminModel $model */
		$model = $this->getModel();

		// Save the ordering
		$return = $model->saveorder($pks, $order);

		if ($return)
		{
			echo "1";
		}

		// Close the application
		$this->container->app->close();
	}

	/**
	 * Method to check if you can add a new record.
	 *
	 * Extended classes can override this if necessary.
	 *
	 * @param   array $data An array of input data.
	 *
	 * @return  boolean
	 *
	 */
	protected function allowAdd($data = array())
	{
		return
$this->container->user->authorise('core.create',
$this->container->option);
	}

	/**
	 * Method to check if you can edit a new record.
	 *
	 * Extended classes can override this if necessary.
	 *
	 * @param   array  $data An array of input data.
	 * @param   string $key  The name of the key for the primary key; default
is id.
	 *
	 * @return  boolean
	 */
	protected function allowEdit($data = array(), $key = 'id')
	{
		return $this->container->user->authorise('core.edit',
$this->container->option);
	}

	/**
	 * Method to check if you can save a new or existing record.
	 *
	 * Extended classes can override this if necessary.
	 *
	 * @param   array  $data An array of input data.
	 * @param   string $key  The name of the key for the primary key.
	 *
	 * @return  boolean
	 */
	protected function allowSave($data, $key = 'id')
	{
		$recordId = isset($data[$key]) ? $data[$key] : '0';

		if ($recordId)
		{
			return $this->allowEdit($data, $key);
		}
		else
		{
			return $this->allowAdd($data);
		}
	}

	/**
	 * Method to check whether the current user is allowed to delete a record
	 *
	 * @param   int $id Record ID
	 *
	 * @return  boolean  True if allowed to delete the record. Defaults to the
permission for the component.
	 *
	 */
	protected function allowDelete($id)
	{
		return
$this->container->user->authorise('core.delete',
$this->container->option);
	}

	/**
	 * Method to check whether the current user can change status (publish,
unpublish of a record)
	 *
	 * @param   int $id Id of the record
	 *
	 * @return  boolean  True if allowed to change the state of the record.
Defaults to the permission for the component.
	 *
	 */
	protected function allowEditState($id)
	{
		return
$this->container->user->authorise('core.edit.state',
$this->container->option);
	}

	/**
	 * Get url of the page which display list of records
	 *
	 * @return string
	 */
	protected function getViewListUrl()
	{
		return 'index.php?option=' . $this->container->option .
'&view=' . $this->viewList;
	}

	/**
	 * Get url of the page which allow adding/editing a record
	 *
	 * @param int $recordId
	 *
	 * @return string
	 */
	protected function getViewItemUrl($recordId = null)
	{
		$url = 'index.php?option=' . $this->container->option .
'&view=' . $this->viewItem;

		if ($recordId)
		{
			$url .= '&id=' . $recordId;
		}

		return $url;
	}
}PK�c�[A9�k0k0Controller/Controller.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Controller;

use ReflectionClass, ReflectionMethod, Exception;
use OSL\Container\Container,
	OSL\Input\Input;

defined('_JEXEC') or die;

/**
 * Class Controller
 *
 * Base class for a Joomla Controller. Controller (Controllers are where
you put all the actual code.) Provides basic
 * functionality, such as rendering views (aka displaying templates).
 */
class Controller
{
	/**
	 * Array which hold all the controller objects has been created
	 *
	 * @var array
	 */
	protected static $instances = [];

	/**
	 * Name of the controller
	 *
	 * @var string
	 */
	protected $name;

	/**
	 * Controller input
	 *
	 * @var Input
	 */
	protected $input;

	/**
	 * Array of class methods
	 *
	 * @var array
	 */
	protected $methods = [];

	/**
	 * Array which map a task with the method will be called
	 *
	 * @var array
	 */
	protected $taskMap = [];

	/**
	 * Current or most recently performed task.
	 *
	 * @var string
	 */
	protected $task;

	/**
	 * URL for redirection.
	 *
	 * @var string
	 */
	protected $redirect;

	/**
	 * Redirect message.
	 *
	 * @var string
	 */
	protected $message = null;

	/**
	 * Redirect message type.
	 *
	 * @var string
	 */
	protected $messageType = 'message';

	/**
	 * Method to get instance of a controller
	 *
	 * @param   Container  $container
	 * @param   array      $config
	 *
	 * @return Controller
	 *
	 * @throws Exception
	 */
	public static function getInstance(Container $container, array $config =
[])
	{
		$input = $container->input;

		// Handle task format controller.task
		$task = $input->get('task', '');

        $lou= $input->get('layout', null);

        if ($task== $lou)
        {
            $task= '';
        }
		$pos  = strpos($task, '.');


		if ($pos !== false)
		{
			$name = substr($task, 0, $pos);
			$task = substr($task, $pos + 1);
			$input->set('task', $task);
		}
		else
		{
			$name =
$container->inflector->singularize($input->getCmd('view'));

			if (empty($name))
			{
				$name = 'controller';
			}
		}

		$option = $container->option;
		if (!isset(self::$instances[$option . $name]))
		{
			$config['name'] = $name;

			if ($task == '')
			{
				// Always use default controller for display task
				if (class_exists($container->namespace .
'\\Override\\Controller\\Controller'))
				{
					$className = $container->namespace .
'\\Override\\Controller\\Controller';
				}
				else
				{
					$className = $container->namespace .
'\\Controller\\Controller';

				}

				self::$instances[$option . $name] = new $className($container,
$config);
			}
			else
			{
				self::$instances[$option . $name] =
$container->factory->createController($name, $config);
			}
		}

		return self::$instances[$option . $name];
	}

	/**
	 * Constructor.
	 *
	 * @param   Container  $container
	 *
	 * @param   array      $config  An optional associative array of
configuration settings.
	 *
	 * @throws Exception
	 */
	public function __construct(Container $container, array $config = [])
	{
		$this->container = $container;

		$input = $container->input;

		// Build the default taskMap based on the class methods
		$xMethods = get_class_methods('\\OSL\\Controller\Controller');
		$r        = new ReflectionClass($this);

		$rMethods = $r->getMethods(ReflectionMethod::IS_PUBLIC);

		foreach ($rMethods as $rMethod)
		{
			$mName = $rMethod->getName();

			if (!in_array($mName, $xMethods) || $mName == 'display')
			{
				$this->taskMap[strtolower($mName)] = $mName;
				$this->methods[]                   = strtolower($mName);
			}
		}

		// Register controller default task
		if (isset($config['default_task']))
		{
			$this->registerTask('__default',
$config['default_task']);
		}
		else
		{
			$this->registerTask('__default', 'display');
		}

		$this->name  = $config['name'];
		$this->input = $input;
		$this->task  = $input->getCmd('task',
'display');
        $lou= $input->get('layout', null);

        if ($this->task== $lou)
        {

            $this->task= '';
        }
        
	}
	

	/**
	 * Execute the given task
	 *
	 * @return $this return itself to support changing
	 *
	 * @throws Exception
	 */
	public function execute()
	{

		$task = strtolower($this->task);

		if (empty($task))
		{
			$task = 'display';
		}

		if (isset($this->taskMap[$task]))
		{
			$this->task = $task;

			$doTask = $this->taskMap[$task];
			$this->$doTask();

			return $this;
		}

		throw new
Exception(\JText::sprintf('JLIB_APPLICATION_ERROR_TASK_NOT_FOUND',
$task), 404);
	}

	/**
	 * Method to display a view
	 *
	 * This function is provide as a default implementation, in most cases
	 * you will need to override it in your own controllers.
	 *
	 * @param   boolean  $cachable   If true, the view output will be cached
	 *
	 * @param   array    $urlparams  An array of safe url parameters and their
variable types, for valid values see {@link JFilterInput::clean()}.
	 *
	 * @return Controller A RADController object to support chaining.
	 */
	public function display($cachable = false, array $urlparams = [])
	{
	  
		$document = $this->container->document;

		if ($document instanceof \JDocument)
		{
			$viewType = $document->getType();
		}
		else
		{
			$viewType = $this->input->getCmd('format',
'html');
		}

		$viewName   = $this->input->get('view',
$this->container->defaultView);
		$viewLayout = $this->input->get('layout',
'default');

		// Create view object
		$view = $this->getView($viewName, $viewType, $viewLayout);

		// If view has model, create the model, and assign it to the view
		if ($view->hasModel)
		{
			$model = $this->getModel($viewName);

			$view->setModel($model);
		}

		// Render the view
		$view->display();

		return $this;
	}

	/**
	 * Method to get a model object, loading it if required.
	 *
	 * @param   string  $name    The model name. Optional. Default will be the
controller name
	 *
	 * @param   array   $config  Configuration array for model. Optional.
	 *
	 * @return \OSL\Model\Model The model.
	 */
	public function getModel($name = '', array $config = [])
	{
		// If name is not given, the model will has same name with controller
		if (empty($name))
		{
			$name = $this->name;
		}

		$model = $this->container->factory->createModel($name,
$config);

		// Populate model state from request data
		$model->populateState();

		return $model;
	}

	/**
	 * Method to get instance of a view
	 *
	 * @param   string  $name    The view name
	 * @param   string  $type    The view type
	 * @param   string  $layout  The view layout
	 *
	 * @param   array   $config  Configuration array for view. Optional.
	 *
	 * @return \OSL\View\HtmlView Reference to the view
	 */
	public function getView($name, $type = 'html', $layout =
'default', array $config = [])
	{
		// Merge config array with default config parameters
		$config['layout'] = $layout;
		$config['input']  = $this->input;

		if (!\JFolder::exists(JPATH_BASE . '/components/' .
$this->container->option . '/View/' . ucfirst($name)))
		{
			throw new \Exception(\JText::sprintf('View %s not found',
$name), 404);
		}

		if ($this->container->app->isClient('administrator'))
		{
			$config['is_admin_view'] = true;
		}

		// Set the default paths for finding the layout if it is not specified in
the $config array
		if (empty($config['paths']))
		{
			$paths           = [];
			$paths[]         = JPATH_THEMES . '/' .
$this->container->template . '/html/' .
$this->container->option . '/' . ucfirst($name);
			$paths[]         = JPATH_BASE . '/components/' .
$this->container->option . '/View/' . ucfirst($name) .
'/tmpl';
			$config['paths'] = $paths;
		}

		return $this->container->factory->createView($name, $type,
$config);
	}

	/**
	 * Sets the internal message that is passed with a redirect
	 *
	 * @param   string  $text  Message to display on redirect.
	 *
	 * @param   string  $type  Message type. Optional, defaults to
'message'.
	 *
	 * @return string Previous message
	 */
	public function setMessage($text, $type = 'message')
	{
		$previous          = $this->message;
		$this->message     = $text;
		$this->messageType = $type;

		return $previous;
	}

	/**
	 * Set a URL for browser redirection.
	 *
	 * @param   string  $url   URL to redirect to.
	 *
	 * @param   string  $msg   Message to display on redirect. Optional,
defaults to value set internally by controller, if any.
	 *
	 * @param   string  $type  Message type. Optional, defaults to
'message' or the type set by a previous call to setMessage.
	 *
	 * @return Controller This object to support chaining.
	 */
	public function setRedirect($url, $msg = null, $type = null)
	{
		$this->redirect = $url;

		if ($msg !== null)
		{
			// Controller may have set this directly
			$this->message = $msg;
		}

		// Ensure the type is not overwritten by a previous call to setMessage.
		if (empty($type))
		{
			if (empty($this->messageType))
			{
				$this->messageType = 'message';
			}
		}
		// If the type is explicitly set, set it.
		else
		{
			$this->messageType = $type;
		}

		return $this;
	}

	/**
	 * Redirects the browser or returns false if no redirect is set.
	 *
	 * @return boolean False if no redirect exists.
	 */
	public function redirect()
	{
		if ($this->redirect)
		{
			/* @var \JApplicationCms $app */
			$app = $this->container->get('app');
			$app->enqueueMessage($this->message, $this->messageType);
			$app->redirect($this->redirect);
		}

		return false;
	}

	/**
	 * Register (map) a task to a method in the class.
	 *
	 * @param   string  $task    The task name
	 *
	 * @param   string  $method  The name of the method in the derived class
to perform for this task.
	 *
	 * @return Controller A Controller object to support chaining.
	 */
	public function registerTask($task, $method)
	{
		if (in_array(strtolower($method), $this->methods))
		{
			$this->taskMap[strtolower($task)] = $method;
		}

		return $this;
	}

	/**
	 * Get the application object.
	 *
	 * @return \JApplicationCms The application object.
	 */
	public function getApplication()
	{
		return $this->container->get('app');
	}

	/**
	 * Get the input object.
	 *
	 * @return Input The input object.
	 */
	public function getInput()
	{
		return $this->container->get('input');
	}

	/**
	 * Set controller input
	 *
	 * @param   Input  $input
	 *
	 * @return Input
	 */
	public function setInput(Input $input)
	{
		$currentInput = $this->input;

		$this->input = $input;
		$this->container->set('input', $input);
		$this->task = $input->getCmd('task',
'display');

		return $currentInput;
	}

	/**
	 * Get the last task that is being performed or was most recently
performed.
	 *
	 * @return string The task that is being performed or was most recently
performed.
	 */
	public function getTask()
	{
		return $this->task;
	}

	/**
	 * Set the task for controller
	 *
	 * @param $task
	 */
	public function setTask($task)
	{
		$this->task = $task;
	}

	/**
	 * Magic get method. Handles magic properties:
	 * $this->app  mapped to $this->container->app
	 * $this->input  mapped to $this->container->input
	 *
	 * @param   string  $name  The property to fetch
	 *
	 * @return  mixed|null
	 */
	public function __get($name)
	{
		$magicProperties = [
			'app',
			'option',
		];

		if (in_array($name, $magicProperties))
		{
			return $this->container->get($name);
		}

		// Property not found; raise error
		$trace = debug_backtrace();
		trigger_error(
			'Undefined property via __get(): ' . $name .
			' in ' . $trace[0]['file'] .
			' on line ' . $trace[0]['line'],
			E_USER_NOTICE);

		return null;
	}

	/**
	 * Check token to prevent CSRF attack
	 */
	protected function csrfProtection($method = 'post')
	{
		\JSession::checkToken($method) or
die(\JText::_('JINVALID_TOKEN'));
	}
}PK�c�[U�B�n
n
Controller/Download.phpnu�[���<?php
/**
 * @package     RAD
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2015 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Controller;

defined('_JEXEC') or die;


trait Download
{
	/**
	 * Standard method to download file
	 *
	 * @param   string  $filePath
	 * @param   string  $filename
	 * @param   bool    $inline
	 */
	protected function processDownloadFile($filePath, $filename = null,
$inline = false)
	{
		/* @var JApplicationCms $app */
		$app = $this->getApplication();

		if (!$filename)
		{
			$filename = basename($filePath);
		}

		$mimeType = $this->getMineType($filename);

		if (is_array($mimeType))
		{
			$mimeType = $mimeType[0];
		}

		$fileSize = @filesize($filePath);

		if ($inline)
		{
			$contentDisposition = 'inline';
		}
		else
		{
			$contentDisposition = 'attachment';
		}

		while (@ob_end_clean()) ;
		@clearstatcache();

		$app->setHeader('Content-Type', $mimeType, true)
			->setHeader('Content-Disposition', $contentDisposition .
'; filename="' . $filename . '"', true)
			->setHeader('Content-Transfer-Encoding',
'binary', true);

		if ($fileSize > 0)
		{
			$app->setHeader('Content-Length', $fileSize, true);
		}

		// Disable Cache
		$app->setHeader('Cache-Control', 'must-revalidate,
post-check=0, pre-check=0', true)
			->setHeader('Expires', '0', true)
			->setHeader('Pragma', 'no-cache', true);

		$app->sendHeaders();

		flush();

		if (!$fileSize)
		{
			// If the filesize is not reported, hope that readfile works
			@readfile($filePath);
		}
		else
		{
			// If the filesize is reported, use 1M chunks for echoing the data to
the browser
			$blocksize = 1048576; //1M chunks
			$handle    = @fopen($filePath, "r");

			// Now we need to loop through the file and echo out chunks of file
data
			if ($handle !== false)
			{
				while (!@feof($handle))
				{
					echo @fread($handle, $blocksize);
					@ob_flush();
					flush();
				}
			}

			if ($handle !== false)
			{
				@fclose($handle);
			}
		}

		$app->close();
	}

	/**
	 * Get mimetype for a given filename
	 *
	 * @param $fileExt
	 */
	protected function getMineType($filename)
	{
		$mimeTypes = [
			'3dm'          => ['x-world/x-3dmf'],
			'3dmf'         => ['x-world/x-3dmf'],
			'3dml'         => ['text/vnd.in3d.3dml'],
			'3ds'          => ['image/x-3ds'],
			'3g2'          => ['video/3gpp2'],
			'3gp'          => ['video/3gpp'],
			'7z'           =>
['application/x-7z-compressed'],
			'a'            => ['application/octet-stream'],
			'aab'          =>
['application/x-authorware-bin'],
			'aac'          => ['audio/x-aac'],
			'aam'          =>
['application/x-authorware-map'],
			'aas'          =>
['application/x-authorware-seg'],
			'abc'          => ['text/vnd.abc'],
			'abw'          => ['application/x-abiword'],
			'ac'           =>
['application/pkix-attr-cert'],
			'acc'          =>
['application/vnd.americandynamics.acc'],
			'ace'          =>
['application/x-ace-compressed'],
			'acgi'         => ['text/html'],
			'acu'          => ['application/vnd.acucobol'],
			'acutc'        => ['application/vnd.acucorp'],
			'adp'          => ['audio/adpcm'],
			'aep'          =>
['application/vnd.audiograph'],
			'afl'          => ['video/animaflex'],
			'afm'          => ['application/x-font-type1'],
			'afp'          =>
['application/vnd.ibm.modcap'],
			'ahead'        =>
['application/vnd.ahead.space'],
			'ai'           => ['application/postscript'],
			'aif'          => ['audio/aiff',
'audio/x-aiff'],
			'aifc'         => ['audio/aiff',
'audio/x-aiff'],
			'aiff'         => ['audio/aiff',
'audio/x-aiff'],
			'aim'          => ['application/x-aim'],
			'aip'          => ['text/x-audiosoft-intra'],
			'air'          =>
['application/vnd.adobe.air-application-installer-package+zip'],
			'ait'          => ['application/vnd.dvb.ait'],
			'ami'          => ['application/vnd.amiga.ami'],
			'ani'          =>
['application/x-navi-animation'],
			'aos'          =>
['application/x-nokia-9000-communicator-add-on-software'],
			'apk'          =>
['application/vnd.android.package-archive'],
			'appcache'     => ['text/cache-manifest'],
			'application'  =>
['application/x-ms-application'],
			'apr'          =>
['application/vnd.lotus-approach'],
			'aps'          => ['application/mime'],
			'arc'          => ['application/x-freearc'],
			'arj'          => ['application/arj',
'application/octet-stream'],
			'art'          => ['image/x-jg'],
			'asc'          => ['application/pgp-signature'],
			'asf'          => ['video/x-ms-asf'],
			'asm'          => ['text/x-asm'],
			'aso'          =>
['application/vnd.accpac.simply.aso'],
			'asp'          => ['text/asp'],
			'asx'          => ['application/x-mplayer2',
'video/x-ms-asf', 'video/x-ms-asf-plugin'],
			'atc'          => ['application/vnd.acucorp'],
			'atom'         => ['application/atom+xml'],
			'atomcat'      => ['application/atomcat+xml'],
			'atomsvc'      => ['application/atomsvc+xml'],
			'atx'          =>
['application/vnd.antix.game-component'],
			'au'           => ['audio/basic'],
			'avi'          => ['application/x-troff-msvideo',
'video/avi', 'video/msvideo',
'video/x-msvideo'],
			'avs'          => ['video/avs-video'],
			'aw'           => ['application/applixware'],
			'azf'          =>
['application/vnd.airzip.filesecure.azf'],
			'azs'          =>
['application/vnd.airzip.filesecure.azs'],
			'azw'          =>
['application/vnd.amazon.ebook'],
			'bat'          => ['application/x-msdownload'],
			'bcpio'        => ['application/x-bcpio'],
			'bdf'          => ['application/x-font-bdf'],
			'bdm'          =>
['application/vnd.syncml.dm+wbxml'],
			'bed'          =>
['application/vnd.realvnc.bed'],
			'bh2'          =>
['application/vnd.fujitsu.oasysprs'],
			'bin'          => ['application/mac-binary',
'application/macbinary', 'application/octet-stream',
'application/x-binary', 'application/x-macbinary'],
			'blb'          => ['application/x-blorb'],
			'blorb'        => ['application/x-blorb'],
			'bm'           => ['image/bmp'],
			'bmi'          => ['application/vnd.bmi'],
			'bmp'          => ['image/bmp',
'image/x-windows-bmp'],
			'boo'          => ['application/book'],
			'book'         =>
['application/vnd.framemaker'],
			'box'          =>
['application/vnd.previewsystems.box'],
			'boz'          => ['application/x-bzip2'],
			'bpk'          => ['application/octet-stream'],
			'bsh'          => ['application/x-bsh'],
			'btif'         => ['image/prs.btif'],
			'buffer'       => ['application/octet-stream'],
			'bz'           => ['application/x-bzip'],
			'bz2'          => ['application/x-bzip2'],
			'c'            => ['text/x-c'],
			'c++'          => ['text/plain'],
			'c11amc'       =>
['application/vnd.cluetrust.cartomobile-config'],
			'c11amz'       =>
['application/vnd.cluetrust.cartomobile-config-pkg'],
			'c4d'          =>
['application/vnd.clonk.c4group'],
			'c4f'          =>
['application/vnd.clonk.c4group'],
			'c4g'          =>
['application/vnd.clonk.c4group'],
			'c4p'          =>
['application/vnd.clonk.c4group'],
			'c4u'          =>
['application/vnd.clonk.c4group'],
			'cab'          =>
['application/vnd.ms-cab-compressed'],
			'caf'          => ['audio/x-caf'],
			'cap'          =>
['application/vnd.tcpdump.pcap'],
			'car'          => ['application/vnd.curl.car'],
			'cat'          =>
['application/vnd.ms-pki.seccat'],
			'cb7'          => ['application/x-cbr'],
			'cba'          => ['application/x-cbr'],
			'cbr'          => ['application/x-cbr'],
			'cbt'          => ['application/x-cbr'],
			'cbz'          => ['application/x-cbr'],
			'cc'           => ['text/plain',
'text/x-c'],
			'ccad'         => ['application/clariscad'],
			'cco'          => ['application/x-cocoa'],
			'cct'          => ['application/x-director'],
			'ccxml'        => ['application/ccxml+xml'],
			'cdbcmsg'      =>
['application/vnd.contact.cmsg'],
			'cdf'          => ['application/cdf',
'application/x-cdf', 'application/x-netcdf'],
			'cdkey'        =>
['application/vnd.mediastation.cdkey'],
			'cdmia'        =>
['application/cdmi-capability'],
			'cdmic'        =>
['application/cdmi-container'],
			'cdmid'        => ['application/cdmi-domain'],
			'cdmio'        => ['application/cdmi-object'],
			'cdmiq'        => ['application/cdmi-queue'],
			'cdx'          => ['chemical/x-cdx'],
			'cdxml'        =>
['application/vnd.chemdraw+xml'],
			'cdy'          =>
['application/vnd.cinderella'],
			'cer'          => ['application/pkix-cert',
'application/x-x509-ca-cert'],
			'cfs'          =>
['application/x-cfs-compressed'],
			'cgm'          => ['image/cgm'],
			'cha'          => ['application/x-chat'],
			'chat'         => ['application/x-chat'],
			'chm'          =>
['application/vnd.ms-htmlhelp'],
			'chrt'         =>
['application/vnd.kde.kchart'],
			'cif'          => ['chemical/x-cif'],
			'cii'          =>
['application/vnd.anser-web-certificate-issue-initiation'],
			'cil'          =>
['application/vnd.ms-artgalry'],
			'cla'          => ['application/vnd.claymore'],
			'class'        => ['application/java',
'application/java-byte-code',
'application/x-java-class'],
			'clkk'         =>
['application/vnd.crick.clicker.keyboard'],
			'clkp'         =>
['application/vnd.crick.clicker.palette'],
			'clkt'         =>
['application/vnd.crick.clicker.template'],
			'clkw'         =>
['application/vnd.crick.clicker.wordbank'],
			'clkx'         =>
['application/vnd.crick.clicker'],
			'clp'          => ['application/x-msclip'],
			'cmc'          =>
['application/vnd.cosmocaller'],
			'cmdf'         => ['chemical/x-cmdf'],
			'cml'          => ['chemical/x-cml'],
			'cmp'          =>
['application/vnd.yellowriver-custom-menu'],
			'cmx'          => ['image/x-cmx'],
			'cod'          => ['application/vnd.rim.cod'],
			'com'          => ['application/octet-stream',
'text/plain'],
			'conf'         => ['text/plain'],
			'cpio'         => ['application/x-cpio'],
			'cpp'          => ['text/x-c'],
			'cpt'          => ['application/x-compactpro',
'application/x-cpt'],
			'crd'          => ['application/x-mscardfile'],
			'crl'          => ['application/pkcs-crl',
'application/pkix-crl'],
			'crt'          => ['application/pkix-cert',
'application/x-x509-ca-cert',
'application/x-x509-user-cert'],
			'crx'          =>
['application/x-chrome-extension'],
			'cryptonote'   =>
['application/vnd.rig.cryptonote'],
			'csh'          => ['application/x-csh',
'text/x-script.csh'],
			'csml'         => ['chemical/x-csml'],
			'csp'          =>
['application/vnd.commonspace'],
			'css'          => ['application/x-pointplus',
'text/css'],
			'cst'          => ['application/x-director'],
			'csv'          => ['text/csv'],
			'cu'           => ['application/cu-seeme'],
			'curl'         => ['text/vnd.curl'],
			'cww'          => ['application/prs.cww'],
			'cxt'          => ['application/x-director'],
			'cxx'          => ['text/x-c'],
			'dae'          => ['model/vnd.collada+xml'],
			'daf'          =>
['application/vnd.mobius.daf'],
			'dart'         => ['application/vnd.dart'],
			'dataless'     => ['application/vnd.fdsn.seed'],
			'davmount'     => ['application/davmount+xml'],
			'dbk'          => ['application/docbook+xml'],
			'dcr'          => ['application/x-director'],
			'dcurl'        => ['text/vnd.curl.dcurl'],
			'dd2'          =>
['application/vnd.oma.dd2+xml'],
			'ddd'          =>
['application/vnd.fujixerox.ddd'],
			'deb'          =>
['application/x-debian-package'],
			'deepv'        => ['application/x-deepv'],
			'def'          => ['text/plain'],
			'deploy'       => ['application/octet-stream'],
			'der'          =>
['application/x-x509-ca-cert'],
			'dfac'         =>
['application/vnd.dreamfactory'],
			'dgc'          =>
['application/x-dgc-compressed'],
			'dic'          => ['text/x-c'],
			'dif'          => ['video/x-dv'],
			'diff'         => ['text/plain'],
			'dir'          => ['application/x-director'],
			'dis'          =>
['application/vnd.mobius.dis'],
			'dist'         => ['application/octet-stream'],
			'distz'        => ['application/octet-stream'],
			'djv'          => ['image/vnd.djvu'],
			'djvu'         => ['image/vnd.djvu'],
			'dl'           => ['video/dl',
'video/x-dl'],
			'dll'          => ['application/x-msdownload'],
			'dmg'          =>
['application/x-apple-diskimage'],
			'dmp'          =>
['application/vnd.tcpdump.pcap'],
			'dms'          => ['application/octet-stream'],
			'dna'          => ['application/vnd.dna'],
			'doc'          => ['application/msword'],
			'docm'         =>
['application/vnd.ms-word.document.macroenabled.12'],
			'docx'         =>
['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],
			'dot'          => ['application/msword'],
			'dotm'         =>
['application/vnd.ms-word.template.macroenabled.12'],
			'dotx'         =>
['application/vnd.openxmlformats-officedocument.wordprocessingml.template'],
			'dp'           => ['application/vnd.osgi.dp'],
			'dpg'          => ['application/vnd.dpgraph'],
			'dra'          => ['audio/vnd.dra'],
			'drw'          => ['application/drafting'],
			'dsc'          => ['text/prs.lines.tag'],
			'dssc'         => ['application/dssc+der'],
			'dtb'          => ['application/x-dtbook+xml'],
			'dtd'          => ['application/xml-dtd'],
			'dts'          => ['audio/vnd.dts'],
			'dtshd'        => ['audio/vnd.dts.hd'],
			'dump'         => ['application/octet-stream'],
			'dv'           => ['video/x-dv'],
			'dvb'          => ['video/vnd.dvb.file'],
			'dvi'          => ['application/x-dvi'],
			'dwf'          => ['drawing/x-dwf (old)',
'model/vnd.dwf'],
			'dwg'          => ['application/acad',
'image/vnd.dwg', 'image/x-dwg'],
			'dxf'          => ['image/vnd.dxf'],
			'dxp'          =>
['application/vnd.spotfire.dxp'],
			'dxr'          => ['application/x-director'],
			'ecelp4800'    => ['audio/vnd.nuera.ecelp4800'],
			'ecelp7470'    => ['audio/vnd.nuera.ecelp7470'],
			'ecelp9600'    => ['audio/vnd.nuera.ecelp9600'],
			'ecma'         => ['application/ecmascript'],
			'edm'          =>
['application/vnd.novadigm.edm'],
			'edx'          =>
['application/vnd.novadigm.edx'],
			'efif'         => ['application/vnd.picsel'],
			'ei6'          => ['application/vnd.pg.osasli'],
			'el'           => ['text/x-script.elisp'],
			'elc'          => ['application/x-bytecode.elisp
(compiled elisp)', 'application/x-elc'],
			'emf'          => ['application/x-msmetafile'],
			'eml'          => ['message/rfc822'],
			'emma'         => ['application/emma+xml'],
			'emz'          => ['application/x-msmetafile'],
			'env'          => ['application/x-envoy'],
			'eol'          => ['audio/vnd.digital-winds'],
			'eot'          =>
['application/vnd.ms-fontobject'],
			'eps'          => ['application/postscript'],
			'epub'         => ['application/epub+zip'],
			'es'           => ['application/x-esrehber'],
			'es3'          =>
['application/vnd.eszigno3+xml'],
			'esa'          =>
['application/vnd.osgi.subsystem'],
			'esf'          => ['application/vnd.epson.esf'],
			'et3'          =>
['application/vnd.eszigno3+xml'],
			'etx'          => ['text/x-setext'],
			'eva'          => ['application/x-eva'],
			'event-stream' => ['text/event-stream'],
			'evy'          => ['application/envoy',
'application/x-envoy'],
			'exe'          => ['application/x-msdownload'],
			'exi'          => ['application/exi'],
			'ext'          =>
['application/vnd.novadigm.ext'],
			'ez'           => ['application/andrew-inset'],
			'ez2'          =>
['application/vnd.ezpix-album'],
			'ez3'          =>
['application/vnd.ezpix-package'],
			'f'            => ['text/plain',
'text/x-fortran'],
			'f4v'          => ['video/x-f4v'],
			'f77'          => ['text/x-fortran'],
			'f90'          => ['text/plain',
'text/x-fortran'],
			'fbs'          => ['image/vnd.fastbidsheet'],
			'fcdt'         =>
['application/vnd.adobe.formscentral.fcdt'],
			'fcs'          => ['application/vnd.isac.fcs'],
			'fdf'          => ['application/vnd.fdf'],
			'fe_launch'    =>
['application/vnd.denovo.fcselayout-link'],
			'fg5'          =>
['application/vnd.fujitsu.oasysgp'],
			'fgd'          => ['application/x-director'],
			'fh'           => ['image/x-freehand'],
			'fh4'          => ['image/x-freehand'],
			'fh5'          => ['image/x-freehand'],
			'fh7'          => ['image/x-freehand'],
			'fhc'          => ['image/x-freehand'],
			'fif'          => ['application/fractals',
'image/fif'],
			'fig'          => ['application/x-xfig'],
			'flac'         => ['audio/flac'],
			'fli'          => ['video/fli',
'video/x-fli'],
			'flo'          =>
['application/vnd.micrografx.flo'],
			'flv'          => ['video/x-flv'],
			'flw'          => ['application/vnd.kde.kivio'],
			'flx'          => ['text/vnd.fmi.flexstor'],
			'fly'          => ['text/vnd.fly'],
			'fm'           =>
['application/vnd.framemaker'],
			'fmf'          => ['video/x-atomic3d-feature'],
			'fnc'          =>
['application/vnd.frogans.fnc'],
			'for'          => ['text/plain',
'text/x-fortran'],
			'fpx'          => ['image/vnd.fpx',
'image/vnd.net-fpx'],
			'frame'        =>
['application/vnd.framemaker'],
			'frl'          => ['application/freeloader'],
			'fsc'          =>
['application/vnd.fsc.weblaunch'],
			'fst'          => ['image/vnd.fst'],
			'ftc'          =>
['application/vnd.fluxtime.clip'],
			'fti'          =>
['application/vnd.anser-web-funds-transfer-initiation'],
			'funk'         => ['audio/make'],
			'fvt'          => ['video/vnd.fvt'],
			'fxp'          => ['application/vnd.adobe.fxp'],
			'fxpl'         => ['application/vnd.adobe.fxp'],
			'fzs'          =>
['application/vnd.fuzzysheet'],
			'g'            => ['text/plain'],
			'g2w'          => ['application/vnd.geoplan'],
			'g3'           => ['image/g3fax'],
			'g3w'          => ['application/vnd.geospace'],
			'gac'          =>
['application/vnd.groove-account'],
			'gam'          => ['application/x-tads'],
			'gbr'          =>
['application/rpki-ghostbusters'],
			'gca'          =>
['application/x-gca-compressed'],
			'gdl'          => ['model/vnd.gdl'],
			'geo'          => ['application/vnd.dynageo'],
			'gex'          =>
['application/vnd.geometry-explorer'],
			'ggb'          =>
['application/vnd.geogebra.file'],
			'ggt'          =>
['application/vnd.geogebra.tool'],
			'ghf'          =>
['application/vnd.groove-help'],
			'gif'          => ['image/gif'],
			'gim'          =>
['application/vnd.groove-identity-message'],
			'gl'           => ['video/gl',
'video/x-gl'],
			'gml'          => ['application/gml+xml'],
			'gmx'          => ['application/vnd.gmx'],
			'gnumeric'     => ['application/x-gnumeric'],
			'gph'          =>
['application/vnd.flographit'],
			'gpx'          => ['application/gpx+xml'],
			'gqf'          => ['application/vnd.grafeq'],
			'gqs'          => ['application/vnd.grafeq'],
			'gram'         => ['application/srgs'],
			'gramps'       => ['application/x-gramps-xml'],
			'gre'          =>
['application/vnd.geometry-explorer'],
			'grv'          =>
['application/vnd.groove-injector'],
			'grxml'        => ['application/srgs+xml'],
			'gsd'          => ['audio/x-gsm'],
			'gsf'          =>
['application/x-font-ghostscript'],
			'gsm'          => ['audio/x-gsm'],
			'gsp'          => ['application/x-gsp'],
			'gss'          => ['application/x-gss'],
			'gtar'         => ['application/x-gtar'],
			'gtm'          =>
['application/vnd.groove-tool-message'],
			'gtw'          => ['model/vnd.gtw'],
			'gv'           => ['text/vnd.graphviz'],
			'gxf'          => ['application/gxf'],
			'gxt'          => ['application/vnd.geonext'],
			'gz'           => ['application/x-compressed',
'application/x-gzip'],
			'gzip'         => ['application/x-gzip',
'multipart/x-gzip'],
			'h'            => ['text/plain',
'text/x-h'],
			'h261'         => ['video/h261'],
			'h263'         => ['video/h263'],
			'h264'         => ['video/h264'],
			'hal'          => ['application/vnd.hal+xml'],
			'hbci'         => ['application/vnd.hbci'],
			'hdf'          => ['application/x-hdf'],
			'help'         => ['application/x-helpfile'],
			'hgl'          => ['application/vnd.hp-hpgl'],
			'hh'           => ['text/plain',
'text/x-h'],
			'hlb'          => ['text/x-script'],
			'hlp'          => ['application/hlp',
'application/x-helpfile', 'application/x-winhelp'],
			'hpg'          => ['application/vnd.hp-hpgl'],
			'hpgl'         => ['application/vnd.hp-hpgl'],
			'hpid'         => ['application/vnd.hp-hpid'],
			'hps'          => ['application/vnd.hp-hps'],
			'hqx'          => ['application/binhex',
'application/binhex4', 'application/mac-binhex',
'application/mac-binhex40', 'application/x-binhex40',
'application/x-mac-binhex40'],
			'hta'          => ['application/hta'],
			'htc'          => ['text/x-component'],
			'htke'         =>
['application/vnd.kenameaapp'],
			'htm'          => ['text/html'],
			'html'         => ['text/html'],
			'htmls'        => ['text/html'],
			'htt'          => ['text/webviewhtml'],
			'htx'          => ['text/html'],
			'hvd'          =>
['application/vnd.yamaha.hv-dic'],
			'hvp'          =>
['application/vnd.yamaha.hv-voice'],
			'hvs'          =>
['application/vnd.yamaha.hv-script'],
			'i2g'          => ['application/vnd.intergeo'],
			'icc'          =>
['application/vnd.iccprofile'],
			'ice'          => ['x-conference/x-cooltalk'],
			'icm'          =>
['application/vnd.iccprofile'],
			'ico'          => ['image/x-icon'],
			'ics'          => ['text/calendar'],
			'idc'          => ['text/plain'],
			'ief'          => ['image/ief'],
			'iefs'         => ['image/ief'],
			'ifb'          => ['text/calendar'],
			'ifm'          =>
['application/vnd.shana.informed.formdata'],
			'iges'         => ['application/iges',
'model/iges'],
			'igl'          => ['application/vnd.igloader'],
			'igm'          =>
['application/vnd.insors.igm'],
			'igs'          => ['application/iges',
'model/iges'],
			'igx'          =>
['application/vnd.micrografx.igx'],
			'iif'          =>
['application/vnd.shana.informed.interchange'],
			'ima'          => ['application/x-ima'],
			'imap'         => ['application/x-httpd-imap'],
			'imp'          =>
['application/vnd.accpac.simply.imp'],
			'ims'          => ['application/vnd.ms-ims'],
			'in'           => ['text/plain'],
			'inf'          => ['application/inf'],
			'ink'          => ['application/inkml+xml'],
			'inkml'        => ['application/inkml+xml'],
			'ins'          =>
['application/x-internett-signup'],
			'install'      =>
['application/x-install-instructions'],
			'iota'         =>
['application/vnd.astraea-software.iota'],
			'ip'           => ['application/x-ip2'],
			'ipfix'        => ['application/ipfix'],
			'ipk'          =>
['application/vnd.shana.informed.package'],
			'irm'          =>
['application/vnd.ibm.rights-management'],
			'irp'          =>
['application/vnd.irepository.package+xml'],
			'iso'          =>
['application/x-iso9660-image'],
			'isu'          => ['video/x-isvideo'],
			'it'           => ['audio/it'],
			'itp'          =>
['application/vnd.shana.informed.formtemplate'],
			'iv'           => ['application/x-inventor'],
			'ivp'          =>
['application/vnd.immervision-ivp'],
			'ivr'          => ['i-world/i-vrml'],
			'ivu'          =>
['application/vnd.immervision-ivu'],
			'ivy'          => ['application/x-livescreen'],
			'jad'          =>
['text/vnd.sun.j2me.app-descriptor'],
			'jam'          => ['application/vnd.jam'],
			'jar'          => ['application/java-archive'],
			'jav'          => ['text/plain',
'text/x-java-source'],
			'java'         => ['text/plain',
'text/x-java-source'],
			'jcm'          =>
['application/x-java-commerce'],
			'jfif'         => ['image/jpeg',
'image/pjpeg'],
			'jfif-tbnl'    => ['image/jpeg'],
			'jisp'         => ['application/vnd.jisp'],
			'jlt'          => ['application/vnd.hp-jlyt'],
			'jnlp'         =>
['application/x-java-jnlp-file'],
			'joda'         =>
['application/vnd.joost.joda-archive'],
			'jpe'          => ['image/jpeg',
'image/pjpeg'],
			'jpeg'         => ['image/jpeg',
'image/pjpeg'],
			'jpg'          => ['image/jpeg',
'image/pjpeg'],
			'jpgm'         => ['video/jpm'],
			'jpgv'         => ['video/jpeg'],
			'jpm'          => ['video/jpm'],
			'jps'          => ['image/x-jps'],
			'js'           => ['application/javascript'],
			'json'         => ['application/json',
'text/plain'],
			'jsonml'       => ['application/jsonml+json'],
			'jut'          => ['image/jutvision'],
			'kar'          => ['audio/midi',
'music/x-karaoke'],
			'karbon'       =>
['application/vnd.kde.karbon'],
			'kfo'          =>
['application/vnd.kde.kformula'],
			'kia'          =>
['application/vnd.kidspiration'],
			'kil'          =>
['application/x-killustrator'],
			'kml'          =>
['application/vnd.google-earth.kml+xml'],
			'kmz'          =>
['application/vnd.google-earth.kmz'],
			'kne'          => ['application/vnd.kinar'],
			'knp'          => ['application/vnd.kinar'],
			'kon'          =>
['application/vnd.kde.kontour'],
			'kpr'          =>
['application/vnd.kde.kpresenter'],
			'kpt'          =>
['application/vnd.kde.kpresenter'],
			'kpxx'         =>
['application/vnd.ds-keypoint'],
			'ksh'          => ['application/x-ksh',
'text/x-script.ksh'],
			'ksp'          =>
['application/vnd.kde.kspread'],
			'ktr'          => ['application/vnd.kahootz'],
			'ktx'          => ['image/ktx'],
			'ktz'          => ['application/vnd.kahootz'],
			'kwd'          => ['application/vnd.kde.kword'],
			'kwt'          => ['application/vnd.kde.kword'],
			'la'           => ['audio/nspaudio',
'audio/x-nspaudio'],
			'lam'          => ['audio/x-liveaudio'],
			'lasxml'       =>
['application/vnd.las.las+xml'],
			'latex'        => ['application/x-latex'],
			'lbd'          =>
['application/vnd.llamagraphics.life-balance.desktop'],
			'lbe'          =>
['application/vnd.llamagraphics.life-balance.exchange+xml'],
			'les'          =>
['application/vnd.hhe.lesson-player'],
			'lha'          => ['application/lha',
'application/octet-stream', 'application/x-lha'],
			'lhx'          => ['application/octet-stream'],
			'link66'       =>
['application/vnd.route66.link66+xml'],
			'list'         => ['text/plain'],
			'list3820'     =>
['application/vnd.ibm.modcap'],
			'listafp'      =>
['application/vnd.ibm.modcap'],
			'lma'          => ['audio/nspaudio',
'audio/x-nspaudio'],
			'lnk'          => ['application/x-ms-shortcut'],
			'log'          => ['text/plain'],
			'lostxml'      => ['application/lost+xml'],
			'lrf'          => ['application/octet-stream'],
			'lrm'          => ['application/vnd.ms-lrm'],
			'lsp'          => ['application/x-lisp',
'text/x-script.lisp'],
			'lst'          => ['text/plain'],
			'lsx'          => ['text/x-la-asf'],
			'ltf'          =>
['application/vnd.frogans.ltf'],
			'ltx'          => ['application/x-latex'],
			'lua'          => ['text/x-lua'],
			'luac'         =>
['application/x-lua-bytecode'],
			'lvp'          => ['audio/vnd.lucent.voice'],
			'lwp'          =>
['application/vnd.lotus-wordpro'],
			'lzh'          => ['application/octet-stream',
'application/x-lzh'],
			'lzx'          => ['application/lzx',
'application/octet-stream', 'application/x-lzx'],
			'm'            => ['text/plain',
'text/x-m'],
			'm13'          => ['application/x-msmediaview'],
			'm14'          => ['application/x-msmediaview'],
			'm1v'          => ['video/mpeg'],
			'm21'          => ['application/mp21'],
			'm2a'          => ['audio/mpeg'],
			'm2v'          => ['video/mpeg'],
			'm3a'          => ['audio/mpeg'],
			'm3u'          => ['audio/x-mpegurl'],
			'm3u8'         => ['application/x-mpegURL'],
			'm4a'          => ['audio/mp4'],
			'm4p'          => ['application/mp4'],
			'm4u'          => ['video/vnd.mpegurl'],
			'm4v'          => ['video/x-m4v'],
			'ma'           => ['application/mathematica'],
			'mads'         => ['application/mads+xml'],
			'mag'          =>
['application/vnd.ecowin.chart'],
			'maker'        =>
['application/vnd.framemaker'],
			'man'          => ['text/troff'],
			'manifest'     => ['text/cache-manifest'],
			'map'          => ['application/x-navimap'],
			'mar'          => ['application/octet-stream'],
			'markdown'     => ['text/x-markdown'],
			'mathml'       => ['application/mathml+xml'],
			'mb'           => ['application/mathematica'],
			'mbd'          => ['application/mbedlet'],
			'mbk'          =>
['application/vnd.mobius.mbk'],
			'mbox'         => ['application/mbox'],
			'mc'           =>
['application/x-magic-cap-package-1.0'],
			'mc1'          =>
['application/vnd.medcalcdata'],
			'mcd'          => ['application/mcad',
'application/x-mathcad'],
			'mcf'          => ['image/vasa',
'text/mcf'],
			'mcp'          => ['application/netmc'],
			'mcurl'        => ['text/vnd.curl.mcurl'],
			'md'           => ['text/x-markdown'],
			'mdb'          => ['application/x-msaccess'],
			'mdi'          => ['image/vnd.ms-modi'],
			'me'           => ['text/troff'],
			'mesh'         => ['model/mesh'],
			'meta4'        => ['application/metalink4+xml'],
			'metalink'     => ['application/metalink+xml'],
			'mets'         => ['application/mets+xml'],
			'mfm'          => ['application/vnd.mfmp'],
			'mft'          => ['application/rpki-manifest'],
			'mgp'          =>
['application/vnd.osgeo.mapguide.package'],
			'mgz'          =>
['application/vnd.proteus.magazine'],
			'mht'          => ['message/rfc822'],
			'mhtml'        => ['message/rfc822'],
			'mid'          => ['application/x-midi',
'audio/midi', 'audio/x-mid', 'audio/x-midi',
'music/crescendo', 'x-music/x-midi'],
			'midi'         => ['application/x-midi',
'audio/midi', 'audio/x-mid', 'audio/x-midi',
'music/crescendo', 'x-music/x-midi'],
			'mie'          => ['application/x-mie'],
			'mif'          => ['application/x-frame',
'application/x-mif'],
			'mime'         => ['message/rfc822',
'www/mime'],
			'mj2'          => ['video/mj2'],
			'mjf'          =>
['audio/x-vnd.audioexplosion.mjuicemediafile'],
			'mjp2'         => ['video/mj2'],
			'mjpg'         => ['video/x-motion-jpeg'],
			'mk3d'         => ['video/x-matroska'],
			'mka'          => ['audio/x-matroska'],
			'mkd'          => ['text/x-markdown'],
			'mks'          => ['video/x-matroska'],
			'mkv'          => ['video/x-matroska'],
			'mlp'          => ['application/vnd.dolby.mlp'],
			'mm'           => ['application/base64',
'application/x-meme'],
			'mmd'          =>
['application/vnd.chipnuts.karaoke-mmd'],
			'mme'          => ['application/base64'],
			'mmf'          => ['application/vnd.smaf'],
			'mmr'          =>
['image/vnd.fujixerox.edmics-mmr'],
			'mng'          => ['video/x-mng'],
			'mny'          => ['application/x-msmoney'],
			'mobi'         =>
['application/x-mobipocket-ebook'],
			'mod'          => ['audio/mod',
'audio/x-mod'],
			'mods'         => ['application/mods+xml'],
			'moov'         => ['video/quicktime'],
			'mov'          => ['video/quicktime'],
			'movie'        => ['video/x-sgi-movie'],
			'mp2'          => ['audio/mpeg',
'audio/x-mpeg', 'video/mpeg', 'video/x-mpeg',
'video/x-mpeq2a'],
			'mp21'         => ['application/mp21'],
			'mp2a'         => ['audio/mpeg'],
			'mp3'          => ['audio/mpeg3',
'audio/x-mpeg-3', 'video/mpeg',
'video/x-mpeg'],
			'mp4'          => ['video/mp4'],
			'mp4a'         => ['audio/mp4'],
			'mp4s'         => ['application/mp4'],
			'mp4v'         => ['video/mp4'],
			'mpa'          => ['audio/mpeg',
'video/mpeg'],
			'mpc'          =>
['application/vnd.mophun.certificate'],
			'mpe'          => ['video/mpeg'],
			'mpeg'         => ['video/mpeg'],
			'mpg'          => ['audio/mpeg',
'video/mpeg'],
			'mpg4'         => ['video/mp4'],
			'mpga'         => ['audio/mpeg'],
			'mpkg'         =>
['application/vnd.apple.installer+xml'],
			'mpm'          =>
['application/vnd.blueice.multipass'],
			'mpn'          =>
['application/vnd.mophun.application'],
			'mpp'          =>
['application/vnd.ms-project'],
			'mpt'          =>
['application/vnd.ms-project'],
			'mpv'          => ['application/x-project'],
			'mpx'          => ['application/x-project'],
			'mpy'          =>
['application/vnd.ibm.minipay'],
			'mqy'          =>
['application/vnd.mobius.mqy'],
			'mrc'          => ['application/marc'],
			'mrcx'         => ['application/marcxml+xml'],
			'ms'           => ['text/troff'],
			'mscml'        =>
['application/mediaservercontrol+xml'],
			'mseed'        =>
['application/vnd.fdsn.mseed'],
			'mseq'         => ['application/vnd.mseq'],
			'msf'          => ['application/vnd.epson.msf'],
			'msh'          => ['model/mesh'],
			'msi'          => ['application/x-msdownload'],
			'msl'          =>
['application/vnd.mobius.msl'],
			'msty'         =>
['application/vnd.muvee.style'],
			'mts'          => ['model/vnd.mts'],
			'mus'          => ['application/vnd.musician'],
			'musicxml'     =>
['application/vnd.recordare.musicxml+xml'],
			'mv'           => ['video/x-sgi-movie'],
			'mvb'          => ['application/x-msmediaview'],
			'mwf'          => ['application/vnd.mfer'],
			'mxf'          => ['application/mxf'],
			'mxl'          =>
['application/vnd.recordare.musicxml'],
			'mxml'         => ['application/xv+xml'],
			'mxs'          =>
['application/vnd.triscape.mxs'],
			'mxu'          => ['video/vnd.mpegurl'],
			'my'           => ['audio/make'],
			'mzz'          =>
['application/x-vnd.audioexplosion.mzz'],
			'n-gage'       =>
['application/vnd.nokia.n-gage.symbian.install'],
			'n3'           => ['text/n3'],
			'nap'          => ['image/naplps'],
			'naplps'       => ['image/naplps'],
			'nb'           => ['application/mathematica'],
			'nbp'          =>
['application/vnd.wolfram.player'],
			'nc'           => ['application/x-netcdf'],
			'ncm'          =>
['application/vnd.nokia.configuration-message'],
			'ncx'          => ['application/x-dtbncx+xml'],
			'nfo'          => ['text/x-nfo'],
			'ngdat'        =>
['application/vnd.nokia.n-gage.data'],
			'nif'          => ['image/x-niff'],
			'niff'         => ['image/x-niff'],
			'nitf'         => ['application/vnd.nitf'],
			'nix'          =>
['application/x-mix-transfer'],
			'nlu'          =>
['application/vnd.neurolanguage.nlu'],
			'nml'          => ['application/vnd.enliven'],
			'nnd'          =>
['application/vnd.noblenet-directory'],
			'nns'          =>
['application/vnd.noblenet-sealer'],
			'nnw'          =>
['application/vnd.noblenet-web'],
			'npx'          => ['image/vnd.net-fpx'],
			'nsc'          => ['application/x-conference'],
			'nsf'          =>
['application/vnd.lotus-notes'],
			'ntf'          => ['application/vnd.nitf'],
			'nvd'          => ['application/x-navidoc'],
			'nws'          => ['message/rfc822'],
			'nzb'          => ['application/x-nzb'],
			'o'            => ['application/octet-stream'],
			'oa2'          =>
['application/vnd.fujitsu.oasys2'],
			'oa3'          =>
['application/vnd.fujitsu.oasys3'],
			'oas'          =>
['application/vnd.fujitsu.oasys'],
			'obd'          => ['application/x-msbinder'],
			'obj'          => ['application/x-tgif'],
			'oda'          => ['application/oda'],
			'odb'          =>
['application/vnd.oasis.opendocument.database'],
			'odc'          =>
['application/vnd.oasis.opendocument.chart'],
			'odf'          =>
['application/vnd.oasis.opendocument.formula'],
			'odft'         =>
['application/vnd.oasis.opendocument.formula-template'],
			'odg'          =>
['application/vnd.oasis.opendocument.graphics'],
			'odi'          =>
['application/vnd.oasis.opendocument.image'],
			'odm'          =>
['application/vnd.oasis.opendocument.text-master'],
			'odp'          =>
['application/vnd.oasis.opendocument.presentation'],
			'ods'          =>
['application/vnd.oasis.opendocument.spreadsheet'],
			'odt'          =>
['application/vnd.oasis.opendocument.text'],
			'oga'          => ['audio/ogg'],
			'ogg'          => ['audio/ogg'],
			'ogv'          => ['video/ogg'],
			'ogx'          => ['application/ogg'],
			'omc'          => ['application/x-omc'],
			'omcd'         =>
['application/x-omcdatamaker'],
			'omcr'         =>
['application/x-omcregerator'],
			'omdoc'        => ['application/omdoc+xml'],
			'onepkg'       => ['application/onenote'],
			'onetmp'       => ['application/onenote'],
			'onetoc'       => ['application/onenote'],
			'onetoc2'      => ['application/onenote'],
			'opf'          =>
['application/oebps-package+xml'],
			'opml'         => ['text/x-opml'],
			'oprc'         => ['application/vnd.palm'],
			'org'          =>
['application/vnd.lotus-organizer'],
			'osf'          =>
['application/vnd.yamaha.openscoreformat'],
			'osfpvg'       =>
['application/vnd.yamaha.openscoreformat.osfpvg+xml'],
			'otc'          =>
['application/vnd.oasis.opendocument.chart-template'],
			'otf'          => ['font/opentype'],
			'otg'          =>
['application/vnd.oasis.opendocument.graphics-template'],
			'oth'          =>
['application/vnd.oasis.opendocument.text-web'],
			'oti'          =>
['application/vnd.oasis.opendocument.image-template'],
			'otm'          =>
['application/vnd.oasis.opendocument.text-master'],
			'otp'          =>
['application/vnd.oasis.opendocument.presentation-template'],
			'ots'          =>
['application/vnd.oasis.opendocument.spreadsheet-template'],
			'ott'          =>
['application/vnd.oasis.opendocument.text-template'],
			'oxps'         => ['application/oxps'],
			'oxt'          =>
['application/vnd.openofficeorg.extension'],
			'p'            => ['text/x-pascal'],
			'p10'          => ['application/pkcs10',
'application/x-pkcs10'],
			'p12'          => ['application/pkcs-12',
'application/x-pkcs12'],
			'p7a'          =>
['application/x-pkcs7-signature'],
			'p7b'          =>
['application/x-pkcs7-certificates'],
			'p7c'          => ['application/pkcs7-mime',
'application/x-pkcs7-mime'],
			'p7m'          => ['application/pkcs7-mime',
'application/x-pkcs7-mime'],
			'p7r'          =>
['application/x-pkcs7-certreqresp'],
			'p7s'          =>
['application/pkcs7-signature'],
			'p8'           => ['application/pkcs8'],
			'part'         => ['application/pro_eng'],
			'pas'          => ['text/x-pascal'],
			'paw'          => ['application/vnd.pawaafile'],
			'pbd'          =>
['application/vnd.powerbuilder6'],
			'pbm'          => ['image/x-portable-bitmap'],
			'pcap'         =>
['application/vnd.tcpdump.pcap'],
			'pcf'          => ['application/x-font-pcf'],
			'pcl'          => ['application/vnd.hp-pcl',
'application/x-pcl'],
			'pclxl'        => ['application/vnd.hp-pclxl'],
			'pct'          => ['image/x-pict'],
			'pcurl'        =>
['application/vnd.curl.pcurl'],
			'pcx'          => ['image/x-pcx'],
			'pdb'          => ['application/vnd.palm'],
			'pdf'          => ['application/pdf'],
			'pfa'          => ['application/x-font-type1'],
			'pfb'          => ['application/x-font-type1'],
			'pfm'          => ['application/x-font-type1'],
			'pfr'          => ['application/font-tdpfr'],
			'pfunk'        => ['audio/make'],
			'pfx'          => ['application/x-pkcs12'],
			'pgm'          => ['image/x-portable-graymap'],
			'pgn'          => ['application/x-chess-pgn'],
			'pgp'          => ['application/pgp-encrypted'],
			'php'          => ['text/x-php'],
			'pic'          => ['image/x-pict'],
			'pict'         => ['image/pict'],
			'pkg'          => ['application/octet-stream'],
			'pki'          => ['application/pkixcmp'],
			'pkipath'      => ['application/pkix-pkipath'],
			'pko'          =>
['application/vnd.ms-pki.pko'],
			'pl'           => ['text/plain',
'text/x-script.perl'],
			'plb'          =>
['application/vnd.3gpp.pic-bw-large'],
			'plc'          =>
['application/vnd.mobius.plc'],
			'plf'          =>
['application/vnd.pocketlearn'],
			'pls'          => ['application/pls+xml'],
			'plx'          => ['application/x-pixclscript'],
			'pm'           => ['image/x-xpixmap',
'text/x-script.perl-module'],
			'pm4'          => ['application/x-pagemaker'],
			'pm5'          => ['application/x-pagemaker'],
			'pml'          => ['application/vnd.ctc-posml'],
			'png'          => ['image/png'],
			'pnm'          =>
['application/x-portable-anymap',
'image/x-portable-anymap'],
			'portpkg'      =>
['application/vnd.macports.portpkg'],
			'pot'          => ['application/mspowerpoint',
'application/vnd.ms-powerpoint'],
			'potm'         =>
['application/vnd.ms-powerpoint.template.macroenabled.12'],
			'potx'         =>
['application/vnd.openxmlformats-officedocument.presentationml.template'],
			'pov'          => ['model/x-pov'],
			'ppa'          =>
['application/vnd.ms-powerpoint'],
			'ppam'         =>
['application/vnd.ms-powerpoint.addin.macroenabled.12'],
			'ppd'          => ['application/vnd.cups-ppd'],
			'ppm'          => ['image/x-portable-pixmap'],
			'pps'          => ['application/mspowerpoint',
'application/vnd.ms-powerpoint'],
			'ppsm'         =>
['application/vnd.ms-powerpoint.slideshow.macroenabled.12'],
			'ppsx'         =>
['application/vnd.openxmlformats-officedocument.presentationml.slideshow'],
			'ppt'          => ['application/mspowerpoint',
'application/powerpoint',
'application/vnd.ms-powerpoint',
'application/x-mspowerpoint'],
			'pptm'         =>
['application/vnd.ms-powerpoint.presentation.macroenabled.12'],
			'pptx'         =>
['application/vnd.openxmlformats-officedocument.presentationml.presentation'],
			'ppz'          => ['application/mspowerpoint'],
			'pqa'          => ['application/vnd.palm'],
			'prc'          =>
['application/x-mobipocket-ebook'],
			'pre'          =>
['application/vnd.lotus-freelance'],
			'prf'          => ['application/pics-rules'],
			'prt'          => ['application/pro_eng'],
			'ps'           => ['application/postscript'],
			'psb'          =>
['application/vnd.3gpp.pic-bw-small'],
			'psd'          => ['image/vnd.adobe.photoshop'],
			'psf'          =>
['application/x-font-linux-psf'],
			'pskcxml'      => ['application/pskc+xml'],
			'ptid'         => ['application/vnd.pvi.ptid1'],
			'pub'          => ['application/x-mspublisher'],
			'pvb'          =>
['application/vnd.3gpp.pic-bw-var'],
			'pvu'          => ['paleovu/x-pv'],
			'pwn'          =>
['application/vnd.3m.post-it-notes'],
			'pwz'          =>
['application/vnd.ms-powerpoint'],
			'py'           => ['text/x-script.phyton'],
			'pya'          =>
['audio/vnd.ms-playready.media.pya'],
			'pyc'          =>
['applicaiton/x-bytecode.python'],
			'pyo'          => ['application/x-python-code'],
			'pyv'          =>
['video/vnd.ms-playready.media.pyv'],
			'qam'          =>
['application/vnd.epson.quickanime'],
			'qbo'          => ['application/vnd.intu.qbo'],
			'qcp'          => ['audio/vnd.qcelp'],
			'qd3'          => ['x-world/x-3dmf'],
			'qd3d'         => ['x-world/x-3dmf'],
			'qfx'          => ['application/vnd.intu.qfx'],
			'qif'          => ['image/x-quicktime'],
			'qps'          =>
['application/vnd.publishare-delta-tree'],
			'qt'           => ['video/quicktime'],
			'qtc'          => ['video/x-qtc'],
			'qti'          => ['image/x-quicktime'],
			'qtif'         => ['image/x-quicktime'],
			'qwd'          =>
['application/vnd.quark.quarkxpress'],
			'qwt'          =>
['application/vnd.quark.quarkxpress'],
			'qxb'          =>
['application/vnd.quark.quarkxpress'],
			'qxd'          =>
['application/vnd.quark.quarkxpress'],
			'qxl'          =>
['application/vnd.quark.quarkxpress'],
			'qxt'          =>
['application/vnd.quark.quarkxpress'],
			'ra'           => ['audio/x-pn-realaudio',
'audio/x-pn-realaudio-plugin', 'audio/x-realaudio'],
			'ram'          => ['audio/x-pn-realaudio'],
			'rar'          =>
['application/x-rar-compressed'],
			'ras'          => ['application/x-cmu-raster',
'image/cmu-raster', 'image/x-cmu-raster'],
			'rast'         => ['image/cmu-raster'],
			'rcprofile'    =>
['application/vnd.ipunplugged.rcprofile'],
			'rdf'          => ['application/rdf+xml'],
			'rdz'          =>
['application/vnd.data-vision.rdz'],
			'rep'          =>
['application/vnd.businessobjects'],
			'res'          =>
['application/x-dtbresource+xml'],
			'rexx'         => ['text/x-script.rexx'],
			'rf'           => ['image/vnd.rn-realflash'],
			'rgb'          => ['image/x-rgb'],
			'rif'          => ['application/reginfo+xml'],
			'rip'          => ['audio/vnd.rip'],
			'ris'          =>
['application/x-research-info-systems'],
			'rl'           =>
['application/resource-lists+xml'],
			'rlc'          =>
['image/vnd.fujixerox.edmics-rlc'],
			'rld'          =>
['application/resource-lists-diff+xml'],
			'rm'           =>
['application/vnd.rn-realmedia',
'audio/x-pn-realaudio'],
			'rmi'          => ['audio/midi'],
			'rmm'          => ['audio/x-pn-realaudio'],
			'rmp'          => ['audio/x-pn-realaudio',
'audio/x-pn-realaudio-plugin'],
			'rms'          =>
['application/vnd.jcp.javame.midlet-rms'],
			'rmvb'         =>
['application/vnd.rn-realmedia-vbr'],
			'rnc'          =>
['application/relax-ng-compact-syntax'],
			'rng'          => ['application/ringing-tones',
'application/vnd.nokia.ringing-tone'],
			'rnx'          =>
['application/vnd.rn-realplayer'],
			'roa'          => ['application/rpki-roa'],
			'roff'         => ['text/troff'],
			'rp'           => ['image/vnd.rn-realpix'],
			'rp9'          =>
['application/vnd.cloanto.rp9'],
			'rpm'          =>
['audio/x-pn-realaudio-plugin'],
			'rpss'         =>
['application/vnd.nokia.radio-presets'],
			'rpst'         =>
['application/vnd.nokia.radio-preset'],
			'rq'           => ['application/sparql-query'],
			'rs'           =>
['application/rls-services+xml'],
			'rsd'          => ['application/rsd+xml'],
			'rss'          => ['application/rss+xml'],
			'rt'           => ['text/richtext',
'text/vnd.rn-realtext'],
			'rtf'          => ['application/rtf',
'application/x-rtf', 'text/richtext'],
			'rtx'          => ['application/rtf',
'text/richtext'],
			'rv'           => ['video/vnd.rn-realvideo'],
			's'            => ['text/x-asm'],
			's3m'          => ['audio/s3m'],
			'saf'          =>
['application/vnd.yamaha.smaf-audio'],
			'saveme'       => ['aapplication/octet-stream'],
			'sbk'          => ['application/x-tbook'],
			'sbml'         => ['application/sbml+xml'],
			'sc'           =>
['application/vnd.ibm.secure-container'],
			'scd'          => ['application/x-msschedule'],
			'scm'          =>
['application/x-lotusscreencam', 'text/x-script.guile',
'text/x-script.scheme', 'video/x-scm'],
			'scq'          =>
['application/scvp-cv-request'],
			'scs'          =>
['application/scvp-cv-response'],
			'scurl'        => ['text/vnd.curl.scurl'],
			'sda'          =>
['application/vnd.stardivision.draw'],
			'sdc'          =>
['application/vnd.stardivision.calc'],
			'sdd'          =>
['application/vnd.stardivision.impress'],
			'sdkd'         =>
['application/vnd.solent.sdkm+xml'],
			'sdkm'         =>
['application/vnd.solent.sdkm+xml'],
			'sdml'         => ['text/plain'],
			'sdp'          => ['application/sdp',
'application/x-sdp'],
			'sdr'          => ['application/sounder'],
			'sdw'          =>
['application/vnd.stardivision.writer'],
			'sea'          => ['application/sea',
'application/x-sea'],
			'see'          => ['application/vnd.seemail'],
			'seed'         => ['application/vnd.fdsn.seed'],
			'sema'         => ['application/vnd.sema'],
			'semd'         => ['application/vnd.semd'],
			'semf'         => ['application/vnd.semf'],
			'ser'          =>
['application/java-serialized-object'],
			'set'          => ['application/set'],
			'setpay'       =>
['application/set-payment-initiation'],
			'setreg'       =>
['application/set-registration-initiation'],
			'sfd-hdstx'    =>
['application/vnd.hydrostatix.sof-data'],
			'sfs'          =>
['application/vnd.spotfire.sfs'],
			'sfv'          => ['text/x-sfv'],
			'sgi'          => ['image/sgi'],
			'sgl'          =>
['application/vnd.stardivision.writer-global'],
			'sgm'          => ['text/sgml',
'text/x-sgml'],
			'sgml'         => ['text/sgml',
'text/x-sgml'],
			'sh'           => ['application/x-bsh',
'application/x-sh', 'application/x-shar',
'text/x-script.sh'],
			'shar'         => ['application/x-bsh',
'application/x-shar'],
			'shf'          => ['application/shf+xml'],
			'shtml'        => ['text/html',
'text/x-server-parsed-html'],
			'si'           => ['text/vnd.wap.si'],
			'sic'          => ['application/vnd.wap.sic'],
			'sid'          => ['image/x-mrsid-image'],
			'sig'          => ['application/pgp-signature'],
			'sil'          => ['audio/silk'],
			'silo'         => ['model/mesh'],
			'sis'          =>
['application/vnd.symbian.install'],
			'sisx'         =>
['application/vnd.symbian.install'],
			'sit'          => ['application/x-sit',
'application/x-stuffit'],
			'sitx'         => ['application/x-stuffitx'],
			'skd'          => ['application/vnd.koan'],
			'skm'          => ['application/vnd.koan'],
			'skp'          => ['application/vnd.koan'],
			'skt'          => ['application/vnd.koan'],
			'sl'           => ['application/x-seelogo'],
			'slc'          => ['application/vnd.wap.slc'],
			'sldm'         =>
['application/vnd.ms-powerpoint.slide.macroenabled.12'],
			'sldx'         =>
['application/vnd.openxmlformats-officedocument.presentationml.slide'],
			'slt'          =>
['application/vnd.epson.salt'],
			'sm'           =>
['application/vnd.stepmania.stepchart'],
			'smf'          =>
['application/vnd.stardivision.math'],
			'smi'          => ['application/smil+xml'],
			'smil'         => ['application/smil+xml'],
			'smv'          => ['video/x-smv'],
			'smzip'        =>
['application/vnd.stepmania.package'],
			'snd'          => ['audio/basic',
'audio/x-adpcm'],
			'snf'          => ['application/x-font-snf'],
			'so'           => ['application/octet-stream'],
			'sol'          => ['application/solids'],
			'spc'          =>
['application/x-pkcs7-certificates', 'text/x-speech'],
			'spf'          =>
['application/vnd.yamaha.smaf-phrase'],
			'spl'          =>
['application/x-futuresplash'],
			'spot'         => ['text/vnd.in3d.spot'],
			'spp'          =>
['application/scvp-vp-response'],
			'spq'          =>
['application/scvp-vp-request'],
			'spr'          => ['application/x-sprite'],
			'sprite'       => ['application/x-sprite'],
			'spx'          => ['audio/ogg'],
			'sql'          => ['application/x-sql'],
			'src'          => ['application/x-wais-source'],
			'srt'          => ['application/x-subrip'],
			'sru'          => ['application/sru+xml'],
			'srx'          =>
['application/sparql-results+xml'],
			'ssdl'         => ['application/ssdl+xml'],
			'sse'          =>
['application/vnd.kodak-descriptor'],
			'ssf'          => ['application/vnd.epson.ssf'],
			'ssi'          => ['text/x-server-parsed-html'],
			'ssm'          =>
['application/streamingmedia'],
			'ssml'         => ['application/ssml+xml'],
			'sst'          =>
['application/vnd.ms-pki.certstore'],
			'st'           =>
['application/vnd.sailingtracker.track'],
			'stc'          =>
['application/vnd.sun.xml.calc.template'],
			'std'          =>
['application/vnd.sun.xml.draw.template'],
			'step'         => ['application/step'],
			'stf'          => ['application/vnd.wt.stf'],
			'sti'          =>
['application/vnd.sun.xml.impress.template'],
			'stk'          => ['application/hyperstudio'],
			'stl'          => ['application/sla',
'application/vnd.ms-pki.stl',
'application/x-navistyle'],
			'stp'          => ['application/step'],
			'str'          => ['application/vnd.pg.format'],
			'stw'          =>
['application/vnd.sun.xml.writer.template'],
			'sub'          => ['text/vnd.dvb.subtitle'],
			'sus'          =>
['application/vnd.sus-calendar'],
			'susp'         =>
['application/vnd.sus-calendar'],
			'sv4cpio'      => ['application/x-sv4cpio'],
			'sv4crc'       => ['application/x-sv4crc'],
			'svc'          =>
['application/vnd.dvb.service'],
			'svd'          => ['application/vnd.svd'],
			'svf'          => ['image/vnd.dwg',
'image/x-dwg'],
			'svg'          => ['image/svg+xml'],
			'svgz'         => ['image/svg+xml'],
			'svr'          => ['application/x-world',
'x-world/x-svr'],
			'swa'          => ['application/x-director'],
			'swf'          =>
['application/x-shockwave-flash'],
			'swi'          =>
['application/vnd.aristanetworks.swi'],
			'sxc'          =>
['application/vnd.sun.xml.calc'],
			'sxd'          =>
['application/vnd.sun.xml.draw'],
			'sxg'          =>
['application/vnd.sun.xml.writer.global'],
			'sxi'          =>
['application/vnd.sun.xml.impress'],
			'sxm'          =>
['application/vnd.sun.xml.math'],
			'sxw'          =>
['application/vnd.sun.xml.writer'],
			't'            => ['text/troff'],
			't3'           => ['application/x-t3vm-image'],
			'taglet'       => ['application/vnd.mynfc'],
			'talk'         => ['text/x-speech'],
			'tao'          =>
['application/vnd.tao.intent-module-archive'],
			'tar'          => ['application/x-tar'],
			'tbk'          => ['application/toolbook',
'application/x-tbook'],
			'tcap'         =>
['application/vnd.3gpp2.tcap'],
			'tcl'          => ['application/x-tcl',
'text/x-script.tcl'],
			'tcsh'         => ['text/x-script.tcsh'],
			'teacher'      =>
['application/vnd.smart.teacher'],
			'tei'          => ['application/tei+xml'],
			'teicorpus'    => ['application/tei+xml'],
			'tex'          => ['application/x-tex'],
			'texi'         => ['application/x-texinfo'],
			'texinfo'      => ['application/x-texinfo'],
			'text'         => ['application/plain',
'text/plain'],
			'tfi'          => ['application/thraud+xml'],
			'tfm'          => ['application/x-tex-tfm'],
			'tga'          => ['image/x-tga'],
			'tgz'          => ['application/gnutar',
'application/x-compressed'],
			'thmx'         =>
['application/vnd.ms-officetheme'],
			'tif'          => ['image/tiff',
'image/x-tiff'],
			'tiff'         => ['image/tiff',
'image/x-tiff'],
			'tmo'          =>
['application/vnd.tmobile-livetv'],
			'torrent'      => ['application/x-bittorrent'],
			'tpl'          =>
['application/vnd.groove-tool-template'],
			'tpt'          => ['application/vnd.trid.tpt'],
			'tr'           => ['text/troff'],
			'tra'          => ['application/vnd.trueapp'],
			'trm'          => ['application/x-msterminal'],
			'ts'           => ['video/MP2T'],
			'tsd'          =>
['application/timestamped-data'],
			'tsi'          => ['audio/tsp-audio'],
			'tsp'          => ['application/dsptype',
'audio/tsplayer'],
			'tsv'          => ['text/tab-separated-values'],
			'ttc'          => ['application/x-font-ttf'],
			'ttf'          => ['application/x-font-ttf'],
			'ttl'          => ['text/turtle'],
			'turbot'       => ['image/florian'],
			'twd'          =>
['application/vnd.simtech-mindmapper'],
			'twds'         =>
['application/vnd.simtech-mindmapper'],
			'txd'          =>
['application/vnd.genomatix.tuxedo'],
			'txf'          =>
['application/vnd.mobius.txf'],
			'txt'          => ['text/plain'],
			'u32'          =>
['application/x-authorware-bin'],
			'udeb'         =>
['application/x-debian-package'],
			'ufd'          => ['application/vnd.ufdl'],
			'ufdl'         => ['application/vnd.ufdl'],
			'uil'          => ['text/x-uil'],
			'ulx'          => ['application/x-glulx'],
			'umj'          => ['application/vnd.umajin'],
			'uni'          => ['text/uri-list'],
			'unis'         => ['text/uri-list'],
			'unityweb'     => ['application/vnd.unity'],
			'unv'          => ['application/i-deas'],
			'uoml'         => ['application/vnd.uoml+xml'],
			'uri'          => ['text/uri-list'],
			'uris'         => ['text/uri-list'],
			'urls'         => ['text/uri-list'],
			'ustar'        => ['application/x-ustar',
'multipart/x-ustar'],
			'utz'          => ['application/vnd.uiq.theme'],
			'uu'           => ['application/octet-stream',
'text/x-uuencode'],
			'uue'          => ['text/x-uuencode'],
			'uva'          => ['audio/vnd.dece.audio'],
			'uvd'          => ['application/vnd.dece.data'],
			'uvf'          => ['application/vnd.dece.data'],
			'uvg'          => ['image/vnd.dece.graphic'],
			'uvh'          => ['video/vnd.dece.hd'],
			'uvi'          => ['image/vnd.dece.graphic'],
			'uvm'          => ['video/vnd.dece.mobile'],
			'uvp'          => ['video/vnd.dece.pd'],
			'uvs'          => ['video/vnd.dece.sd'],
			'uvt'          =>
['application/vnd.dece.ttml+xml'],
			'uvu'          => ['video/vnd.uvvu.mp4'],
			'uvv'          => ['video/vnd.dece.video'],
			'uvva'         => ['audio/vnd.dece.audio'],
			'uvvd'         => ['application/vnd.dece.data'],
			'uvvf'         => ['application/vnd.dece.data'],
			'uvvg'         => ['image/vnd.dece.graphic'],
			'uvvh'         => ['video/vnd.dece.hd'],
			'uvvi'         => ['image/vnd.dece.graphic'],
			'uvvm'         => ['video/vnd.dece.mobile'],
			'uvvp'         => ['video/vnd.dece.pd'],
			'uvvs'         => ['video/vnd.dece.sd'],
			'uvvt'         =>
['application/vnd.dece.ttml+xml'],
			'uvvu'         => ['video/vnd.uvvu.mp4'],
			'uvvv'         => ['video/vnd.dece.video'],
			'uvvx'         =>
['application/vnd.dece.unspecified'],
			'uvvz'         => ['application/vnd.dece.zip'],
			'uvx'          =>
['application/vnd.dece.unspecified'],
			'uvz'          => ['application/vnd.dece.zip'],
			'vcard'        => ['text/vcard'],
			'vcd'          => ['application/x-cdlink'],
			'vcf'          => ['text/x-vcard'],
			'vcg'          =>
['application/vnd.groove-vcard'],
			'vcs'          => ['text/x-vcalendar'],
			'vcx'          => ['application/vnd.vcx'],
			'vda'          => ['application/vda'],
			'vdo'          => ['video/vdo'],
			'vew'          => ['application/groupwise'],
			'vis'          => ['application/vnd.visionary'],
			'viv'          => ['video/vivo',
'video/vnd.vivo'],
			'vivo'         => ['video/vivo',
'video/vnd.vivo'],
			'vmd'          =>
['application/vocaltec-media-desc'],
			'vmf'          =>
['application/vocaltec-media-file'],
			'vob'          => ['video/x-ms-vob'],
			'voc'          => ['audio/voc',
'audio/x-voc'],
			'vor'          =>
['application/vnd.stardivision.writer'],
			'vos'          => ['video/vosaic'],
			'vox'          =>
['application/x-authorware-bin'],
			'vqe'          => ['audio/x-twinvq-plugin'],
			'vqf'          => ['audio/x-twinvq'],
			'vql'          => ['audio/x-twinvq-plugin'],
			'vrml'         => ['application/x-vrml',
'model/vrml', 'x-world/x-vrml'],
			'vrt'          => ['x-world/x-vrt'],
			'vsd'          => ['application/vnd.visio'],
			'vsf'          => ['application/vnd.vsf'],
			'vss'          => ['application/vnd.visio'],
			'vst'          => ['application/vnd.visio'],
			'vsw'          => ['application/vnd.visio'],
			'vtt'          => ['text/vtt'],
			'vtu'          => ['model/vnd.vtu'],
			'vxml'         => ['application/voicexml+xml'],
			'w3d'          => ['application/x-director'],
			'w60'          =>
['application/wordperfect6.0'],
			'w61'          =>
['application/wordperfect6.1'],
			'w6w'          => ['application/msword'],
			'wad'          => ['application/x-doom'],
			'wav'          => ['audio/wav',
'audio/x-wav'],
			'wax'          => ['audio/x-ms-wax'],
			'wb1'          => ['application/x-qpro'],
			'wbmp'         => ['image/vnd.wap.wbmp'],
			'wbs'          =>
['application/vnd.criticaltools.wbs+xml'],
			'wbxml'        => ['application/vnd.wap.wbxml'],
			'wcm'          => ['application/vnd.ms-works'],
			'wdb'          => ['application/vnd.ms-works'],
			'wdp'          => ['image/vnd.ms-photo'],
			'web'          => ['application/vnd.xara'],
			'weba'         => ['audio/webm'],
			'webapp'       =>
['application/x-web-app-manifest+json'],
			'webm'         => ['video/webm'],
			'webp'         => ['image/webp'],
			'wg'           =>
['application/vnd.pmi.widget'],
			'wgt'          => ['application/widget'],
			'wiz'          => ['application/msword'],
			'wk1'          => ['application/x-123'],
			'wks'          => ['application/vnd.ms-works'],
			'wm'           => ['video/x-ms-wm'],
			'wma'          => ['audio/x-ms-wma'],
			'wmd'          => ['application/x-ms-wmd'],
			'wmf'          => ['application/x-msmetafile'],
			'wml'          => ['text/vnd.wap.wml'],
			'wmlc'         => ['application/vnd.wap.wmlc'],
			'wmls'         => ['text/vnd.wap.wmlscript'],
			'wmlsc'        =>
['application/vnd.wap.wmlscriptc'],
			'wmv'          => ['video/x-ms-wmv'],
			'wmx'          => ['video/x-ms-wmx'],
			'wmz'          => ['application/x-msmetafile'],
			'woff'         => ['application/x-font-woff'],
			'word'         => ['application/msword'],
			'wp'           => ['application/wordperfect'],
			'wp5'          => ['application/wordperfect',
'application/wordperfect6.0'],
			'wp6'          => ['application/wordperfect'],
			'wpd'          => ['application/wordperfect',
'application/x-wpwin'],
			'wpl'          => ['application/vnd.ms-wpl'],
			'wps'          => ['application/vnd.ms-works'],
			'wq1'          => ['application/x-lotus'],
			'wqd'          => ['application/vnd.wqd'],
			'wri'          => ['application/mswrite',
'application/x-wri'],
			'wrl'          => ['application/x-world',
'model/vrml', 'x-world/x-vrml'],
			'wrz'          => ['model/vrml',
'x-world/x-vrml'],
			'wsc'          => ['text/scriplet'],
			'wsdl'         => ['application/wsdl+xml'],
			'wspolicy'     => ['application/wspolicy+xml'],
			'wsrc'         => ['application/x-wais-source'],
			'wtb'          => ['application/vnd.webturbo'],
			'wtk'          => ['application/x-wintalk'],
			'wvx'          => ['video/x-ms-wvx'],
			'x-png'        => ['image/png'],
			'x32'          =>
['application/x-authorware-bin'],
			'x3d'          => ['model/x3d+xml'],
			'x3db'         => ['model/x3d+binary'],
			'x3dbz'        => ['model/x3d+binary'],
			'x3dv'         => ['model/x3d+vrml'],
			'x3dvz'        => ['model/x3d+vrml'],
			'x3dz'         => ['model/x3d+xml'],
			'xaml'         => ['application/xaml+xml'],
			'xap'          =>
['application/x-silverlight-app'],
			'xar'          => ['application/vnd.xara'],
			'xbap'         => ['application/x-ms-xbap'],
			'xbd'          =>
['application/vnd.fujixerox.docuworks.binder'],
			'xbm'          => ['image/x-xbitmap',
'image/x-xbm', 'image/xbm'],
			'xdf'          => ['application/xcap-diff+xml'],
			'xdm'          =>
['application/vnd.syncml.dm+xml'],
			'xdp'          =>
['application/vnd.adobe.xdp+xml'],
			'xdr'          => ['video/x-amt-demorun'],
			'xdssc'        => ['application/dssc+xml'],
			'xdw'          =>
['application/vnd.fujixerox.docuworks'],
			'xenc'         => ['application/xenc+xml'],
			'xer'          =>
['application/patch-ops-error+xml'],
			'xfdf'         =>
['application/vnd.adobe.xfdf'],
			'xfdl'         => ['application/vnd.xfdl'],
			'xgz'          => ['xgl/drawing'],
			'xht'          => ['application/xhtml+xml'],
			'xhtml'        => ['application/xhtml+xml'],
			'xhvml'        => ['application/xv+xml'],
			'xif'          => ['image/vnd.xiff'],
			'xl'           => ['application/excel'],
			'xla'          => ['application/excel',
'application/x-excel', 'application/x-msexcel'],
			'xlam'         =>
['application/vnd.ms-excel.addin.macroenabled.12'],
			'xlb'          => ['application/excel',
'application/vnd.ms-excel', 'application/x-excel'],
			'xlc'          => ['application/excel',
'application/vnd.ms-excel', 'application/x-excel'],
			'xld'          => ['application/excel',
'application/x-excel'],
			'xlf'          => ['application/x-xliff+xml'],
			'xlk'          => ['application/excel',
'application/x-excel'],
			'xll'          => ['application/excel',
'application/vnd.ms-excel', 'application/x-excel'],
			'xlm'          => ['application/excel',
'application/vnd.ms-excel', 'application/x-excel'],
			'xls'          => ['application/excel',
'application/vnd.ms-excel', 'application/x-excel',
'application/x-msexcel'],
			'xlsb'         =>
['application/vnd.ms-excel.sheet.binary.macroenabled.12'],
			'xlsm'         =>
['application/vnd.ms-excel.sheet.macroenabled.12'],
			'xlsx'         =>
['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
			'xlt'          => ['application/excel',
'application/x-excel'],
			'xltm'         =>
['application/vnd.ms-excel.template.macroenabled.12'],
			'xltx'         =>
['application/vnd.openxmlformats-officedocument.spreadsheetml.template'],
			'xlv'          => ['application/excel',
'application/x-excel'],
			'xlw'          => ['application/excel',
'application/vnd.ms-excel', 'application/x-excel',
'application/x-msexcel'],
			'xm'           => ['audio/xm'],
			'xml'          => ['application/xml',
'text/xml'],
			'xmz'          => ['xgl/movie'],
			'xo'           =>
['application/vnd.olpc-sugar'],
			'xop'          => ['application/xop+xml'],
			'xpdl'         => ['application/xml'],
			'xpi'          => ['application/x-xpinstall'],
			'xpix'         => ['application/x-vnd.ls-xpix'],
			'xpl'          => ['application/xproc+xml'],
			'xpm'          => ['image/x-xpixmap',
'image/xpm'],
			'xpr'          => ['application/vnd.is-xpr'],
			'xps'          =>
['application/vnd.ms-xpsdocument'],
			'xpw'          =>
['application/vnd.intercon.formnet'],
			'xpx'          =>
['application/vnd.intercon.formnet'],
			'xsl'          => ['application/xml'],
			'xslt'         => ['application/xslt+xml'],
			'xsm'          =>
['application/vnd.syncml+xml'],
			'xspf'         => ['application/xspf+xml'],
			'xsr'          => ['video/x-amt-showrun'],
			'xul'          =>
['application/vnd.mozilla.xul+xml'],
			'xvm'          => ['application/xv+xml'],
			'xvml'         => ['application/xv+xml'],
			'xwd'          => ['image/x-xwd',
'image/x-xwindowdump'],
			'xyz'          => ['chemical/x-xyz'],
			'xz'           => ['application/x-xz'],
			'yang'         => ['application/yang'],
			'yin'          => ['application/yin+xml'],
			'z'            => ['application/x-compress',
'application/x-compressed'],
			'z1'           => ['application/x-zmachine'],
			'z2'           => ['application/x-zmachine'],
			'z3'           => ['application/x-zmachine'],
			'z4'           => ['application/x-zmachine'],
			'z5'           => ['application/x-zmachine'],
			'z6'           => ['application/x-zmachine'],
			'z7'           => ['application/x-zmachine'],
			'z8'           => ['application/x-zmachine'],
			'zaz'          =>
['application/vnd.zzazz.deck+xml'],
			'zip'          => ['application/x-compressed',
'application/x-zip-compressed', 'application/zip',
'multipart/x-zip'],
			'zir'          => ['application/vnd.zul'],
			'zirz'         => ['application/vnd.zul'],
			'zmm'          =>
['application/vnd.handheld-entertainment+xml'],
			'zoo'          => ['application/octet-stream'],
			'zsh'          => ['text/x-script.zsh'],
			'123'          =>
['application/vnd.lotus-1-2-3'],
		];

		$fileExt = strtolower(\JFile::getExt($filename));

		return isset($mimeTypes[$fileExt]) ? $mimeTypes[$fileExt] :
'application/octet-stream';
	}
}PK�c�[Tb!���Factory/Factory.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Config
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Factory;

use JDatabaseDriver, JTable;

use OSL\Container\Container;

class Factory
{
	/**
	 * Component container
	 *
	 * @var Container
	 */
	protected $container;

	/**
	 * Constructor.
	 *
	 * @param   Container  $container
	 */
	public function __construct(Container $container)
	{
		$this->container = $container;
	}

	/**
	 * Method to create a controller instance
	 *
	 * @param   string  $name
	 * @param   array   $config
	 * @param   string  $section
	 *
	 * @return \OSL\Controller\Controller
	 *
	 * @throws \InvalidArgumentException
	 *
	 */
	public function createController($name, $config = array(), $section =
'auto')
	{
		$section = strtolower($section);

		if ($section == 'auto')
		{
			$namespace = $this->container->namespace;
		}
		elseif ($section == 'site')
		{
			$namespace = $this->container->feNamespace;
		}
		elseif ($section == 'admin')
		{
			$namespace = $this->container->beNamespace;
		}
		else
		{
			throw new \InvalidArgumentException(printf('The provided section %s
is invalid', $section));
		}

		$classes   = [];
		$classes[] = $namespace . '\\Override\\Controller\\' .
ucfirst($name);
		$classes[] = $namespace . '\\Controller\\' . ucfirst($name);
		$classes[] = $namespace . '\\Controller\\Controller';

		foreach ($classes as $class)
		{
			if (class_exists($class))
			{
				$config['name'] = $name;

				return new $class($this->container, $config);
			}
		}

		throw new \InvalidArgumentException(printf('Could not find the
controller %s ', $name));
	}

	/**
	 * Method to create a model instance
	 *
	 * @param   string  $name
	 * @param   array   $config
	 * @param   string  $section
	 *
	 * @return \OSL\Model\Model
	 *
	 * @throws \InvalidArgumentException
	 */
	public function createModel($name, $config = array(), $section =
'auto')
	{
		$section = strtolower($section);

		if ($section == 'auto')
		{
			$namespace = $this->container->namespace;
		}
		elseif ($section == 'site')
		{
			$namespace = $this->container->feNamespace;
		}
		elseif ($section == 'admin')
		{
			$namespace = $this->container->beNamespace;
		}
		else
		{
			throw new \InvalidArgumentException(printf('The provided section %s
is invalid', $section));
		}

		$classes   = [];
		$classes[] = $namespace . '\\Override\\Model\\' .
ucfirst($name);
		$classes[] = $namespace . '\\Model\\' . ucfirst($name);

		if ($this->container->inflector->isPlural($name))
		{
			$classes[] = 'OSL\\Model\\ListModel';
		}
		else
		{
			if
($this->container->app->isClient('administrator'))
			{
				$classes[] = 'OSL\\Model\\AdminModel';
			}
			else
			{
				$classes[] = 'OSL\\Model\\Model';
			}
		}


		$config['name'] = $name;

		foreach ($classes as $class)
		{
			if (class_exists($class))
			{
				return new $class($this->container, $config);
			}
		}

		throw new \InvalidArgumentException(printf('Could not find the model
%s', ucfirst($name)));
	}

	/**
	 * Method to create a view instance
	 *
	 * @param   string  $name
	 * @param   string  $type
	 * @param   array   $config
	 * @param   string  $section
	 *
	 * @return \OSL\View\AbstractView
	 */
	public function createView($name, $type = 'html', $config =
array(), $section = 'auto')
	{
		$section = strtolower($section);

		if ($section == 'auto')
		{
			$namespace = $this->container->namespace;
		}
		elseif ($section == 'site')
		{
			$namespace = $this->container->feNamespace;
		}
		elseif ($section == 'admin')
		{
			$namespace = $this->container->beNamespace;
		}
		else
		{
			throw new \InvalidArgumentException(printf('The provided section %s
is invalid', $section));
		}

		$classes   = [];
		$classes[] = $namespace . '\\Override\\View\\' . ucfirst($name)
. '\\' . ucfirst($type);;
		$classes[] = $namespace . '\\View\\' . ucfirst($name) .
'\\' . ucfirst($type);;

		if ($this->container->inflector->isPlural($name))
		{
			$classes[] = 'OSL\\View\\ListView';
		}
		else
		{
			$classes[] = 'OSL\\View\\ItemView';
		}

		$config['name'] = $name;

		foreach ($classes as $class)
		{
			if (class_exists($class))
			{
				return new $class($this->container, $config);
			}
		}

		throw new \InvalidArgumentException(printf('Could not find the view
%s, type %s', ucfirst($name), ucfirst($type)));
	}

	/**
	 * @param   string           $name
	 * @param   JDatabaseDriver  $db
	 *
	 * @return JTable
	 */
	public function createTable($name, JDatabaseDriver $db = null)
	{
		$className = $this->container->beNamespace . '\\Table\\'
. ucfirst($name);

		if (!class_exists($className))
		{
			throw new \RuntimeException(sprintf('Table class %s does not
exist', $name));
		}

		if (is_null($db))
		{
			$db = $this->container->db;
		}

		return new $className($db);
	}
}PK�c�[*>���4�4Inflector/Inflector.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Inflector;

defined('_JEXEC') or die;

/**
 * An Inflector to pluralize and singularize English nouns.
 */
class Inflector
{
	/**
	 * Rules for pluralizing and singularizing of nouns.
	 *
	 * @var array
	 */
	protected $rules = array
	(
		// Pluralization rules. The regex on the left transforms to the regex on
the right.
		'pluralization'   => array(
			'/move$/i'                      => 'moves',
			'/sex$/i'                       => 'sexes',
			'/child$/i'                     => 'children',
			'/children$/i'                  => 'children',
			'/man$/i'                       => 'men',
			'/men$/i'                       => 'men',
			'/foot$/i'                      => 'feet',
			'/feet$/i'                      => 'feet',
			'/person$/i'                    => 'people',
			'/people$/i'                    => 'people',
			'/taxon$/i'                     => 'taxa',
			'/taxa$/i'                      => 'taxa',
			'/(quiz)$/i'                    => '$1zes',
			'/^(ox)$/i'                     => '$1en',
			'/oxen$/i'                      => 'oxen',
			'/(m|l)ouse$/i'                 => '$1ice',
			'/(m|l)ice$/i'                  => '$1ice',
			'/(matr|vert|ind|suff)ix|ex$/i' => '$1ices',
			'/(x|ch|ss|sh)$/i'              => '$1es',
			'/([^aeiouy]|qu)y$/i'           => '$1ies',
			'/(?:([^f])fe|([lr])f)$/i'      => '$1$2ves',
			'/sis$/i'                       => 'ses',
			'/([ti]|addend)um$/i'           => '$1a',
			'/([ti]|addend)a$/i'            => '$1a',
			'/(alumn|formul)a$/i'           => '$1ae',
			'/(alumn|formul)ae$/i'          => '$1ae',
			'/(buffal|tomat|her)o$/i'       => '$1oes',
			'/(bu)s$/i'                     => '$1ses',
			'/(campu)s$/i'                  => '$1ses',
			'/(alias|status)$/i'            => '$1es',
			'/(octop|vir)us$/i'             => '$1i',
			'/(octop|vir)i$/i'              => '$1i',
			'/(gen)us$/i'                   => '$1era',
			'/(gen)era$/i'                  => '$1era',
			'/(ax|test)is$/i'               => '$1es',
			'/s$/i'                         => 's',
			'/$/'                           => 's',
		),
		// Singularization rules. The regex on the left transforms to the regex
on the right.
		'singularization' => array(
			'/cookies$/i'                                                 
    => 'cookie',
			'/moves$/i'                                                   
    => 'move',
			'/sexes$/i'                                                   
    => 'sex',
			'/children$/i'                                                
    => 'child',
			'/men$/i'                                                     
    => 'man',
			'/feet$/i'                                                    
    => 'foot',
			'/people$/i'                                                  
    => 'person',
			'/taxa$/i'                                                    
    => 'taxon',
			'/databases$/i'                                               
    => 'database',
			'/menus$/i'                                                   
    => 'menu',
			'/(quiz)zes$/i'                                               
    => '\1',
			'/(matr|suff)ices$/i'                                         
    => '\1ix',
			'/(vert|ind|cod)ices$/i'                                      
    => '\1ex',
			'/^(ox)en/i'                                                  
    => '\1',
			'/(alias|status)es$/i'                                        
    => '\1',
			'/(tomato|hero|buffalo)es$/i'                                 
    => '\1',
			'/([octop|vir])i$/i'                                          
    => '\1us',
			'/(gen)era$/i'                                                
    => '\1us',
			'/(cris|^ax|test)es$/i'                                       
    => '\1is',
			'/is$/i'                                                      
    => 'is',
			'/us$/i'                                                      
    => 'us',
			'/ias$/i'                                                     
    => 'ias',
			'/(shoe)s$/i'                                                 
    => '\1',
			'/(o)es$/i'                                                   
    => '\1e',
			'/(bus)es$/i'                                                 
    => '\1',
			'/(campus)es$/i'                                              
    => '\1',
			'/([m|l])ice$/i'                                              
    => '\1ouse',
			'/(x|ch|ss|sh)es$/i'                                          
    => '\1',
			'/(m)ovies$/i'                                                
    => '\1ovie',
			'/(s)eries$/i'                                                
    => '\1eries',
			'/(v)ies$/i'                                                  
    => '\1ie',
			'/([^aeiouy]|qu)ies$/i'                                       
    => '\1y',
			'/([lr])ves$/i'                                               
    => '\1f',
			'/(tive)s$/i'                                                 
    => '\1',
			'/(hive)s$/i'                                                 
    => '\1',
			'/([^f])ves$/i'                                               
    => '\1fe',
			'/(^analy)ses$/i'                                             
    => '\1sis',
			'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i'
=> '\1\2sis',
			'/([ti]|addend)a$/i'                                          
    => '\1um',
			'/(alumn|formul)ae$/i'                                        
    => '$1a',
			'/(n)ews$/i'                                                  
    => '\1ews',
			'/(.*)ss$/i'                                                  
    => '\1ss',
			'/(.*)s$/i'                                                   
    => '\1',
		),
		// Uncountable objects are always singular
		'uncountable'     => array(
			'aircraft',
			'cannon',
			'deer',
			'equipment',
			'fish',
			'information',
			'money',
			'moose',
			'news',
			'rice',
			'series',
			'sheep',
			'species',
			'swine',
		)
	);

	/**
	 * Cache of pluralized and singularized nouns.
	 *
	 * @var array
	 */
	protected $cache = array(
		'singularized' => array(),
		'pluralized'   => array()
	);

	public function deleteCache()
	{
		$this->cache['pluralized']   = array();
		$this->cache['singularized'] = array();
	}

	/**
	 * Add a word to the cache, useful to make exceptions or to add words in
other languages.
	 *
	 * @param   string $singular word.
	 * @param   string $plural   word.
	 *
	 * @return  void
	 */
	public function addWord($singular, $plural)
	{
		$this->cache['pluralized'][$singular] = $plural;
		$this->cache['singularized'][$plural] = $singular;
	}

	/**
	 * Singular English word to plural.
	 *
	 * @param   string $word word to pluralize.
	 *
	 * @return  string Plural noun.
	 */
	public function pluralize($word)
	{
		// Get the cached noun of it exists
		if (isset($this->cache['pluralized'][$word]))
		{
			return $this->cache['pluralized'][$word];
		}

		// Check if the noun is already in plural form, i.e. in the singularized
cache
		if (isset($this->cache['singularized'][$word]))
		{
			return $word;
		}

		// Create the plural noun
		if (in_array($word, $this->rules['uncountable']))
		{
			$_cache['pluralized'][$word] = $word;

			return $word;
		}

		foreach ($this->rules['pluralization'] as $regexp =>
$replacement)
		{
			$matches = null;
			$plural  = preg_replace($regexp, $replacement, $word, -1, $matches);

			if ($matches > 0)
			{
				$_cache['pluralized'][$word] = $plural;

				return $plural;
			}
		}

		return $word;
	}

	/**
	 * Plural English word to singular.
	 *
	 * @param   string $word Word to singularize.
	 *
	 * @return  string Singular noun.
	 */
	public function singularize($word)
	{
		// Get the cached noun of it exists
		if (isset($this->cache['singularized'][$word]))
		{
			return $this->cache['singularized'][$word];
		}

		// Check if the noun is already in singular form, i.e. in the pluralized
cache
		if (isset($this->cache['pluralized'][$word]))
		{
			return $word;
		}

		// Create the singular noun
		if (in_array($word, $this->rules['uncountable']))
		{
			$_cache['singularized'][$word] = $word;

			return $word;
		}

		foreach ($this->rules['singularization'] as $regexp =>
$replacement)
		{
			$matches  = null;
			$singular = preg_replace($regexp, $replacement, $word, -1, $matches);

			if ($matches > 0)
			{
				$_cache['singularized'][$word] = $singular;

				return $singular;
			}
		}

		return $word;
	}

	/**
	 * Returns given word as CamelCased.
	 *
	 * Converts a word like "foo_bar" or "foo bar" to
"FooBar". It
	 * will remove non alphanumeric characters from the word, so
	 * "who's online" will be converted to
"WhoSOnline"
	 *
	 * @param   string $word Word to convert to camel case.
	 *
	 * @return  string  UpperCamelCasedWord
	 */
	public function camelize($word)
	{
		$word = preg_replace('/[^a-zA-Z0-9\s]/', ' ',
$word);
		$word = str_replace(' ', '',
ucwords(strtolower(str_replace('_', ' ', $word))));

		return $word;
	}

	/**
	 * Converts a word "into_it_s_underscored_version"
	 *
	 * Convert any "CamelCased" or "ordinary Word" into an
"underscored_word".
	 *
	 * @param   string $word Word to underscore
	 *
	 * @return string Underscored word
	 */
	public function underscore($word)
	{
		$word = preg_replace('/(\s)+/', '_', $word);
		$word = strtolower(preg_replace('/(?<=\\w)([A-Z])/',
'_\\1', $word));

		return $word;
	}

	/**
	 * Convert any "CamelCased" word into an array of strings
	 *
	 * Returns an array of strings each of which is a substring of string
formed
	 * by splitting it at the camelcased letters.
	 *
	 * @param   string $word Word to explode
	 *
	 * @return  array   Array of strings
	 */
	public function explode($word)
	{
		$result = explode('_', self::underscore($word));

		return $result;
	}

	/**
	 * Convert  an array of strings into a "CamelCased" word.
	 *
	 * @param   array $words Array to implode
	 *
	 * @return  string UpperCamelCasedWord
	 */
	public function implode($words)
	{
		$result = self::camelize(implode('_', $words));

		return $result;
	}

	/**
	 * Returns a human-readable string from $word.
	 *
	 * Returns a human-readable string from $word, by replacing
	 * underscores with a space, and by upper-casing the initial
	 * character by default.
	 *
	 * @param   string $word String to "humanize"
	 *
	 * @return string Human-readable word
	 */
	public function humanize($word)
	{
		$result = ucwords(strtolower(str_replace("_", " ",
$word)));

		return $result;
	}

	/**
	 * Returns camelBacked version of a string. Same as camelize but first
char is lowercased.
	 *
	 * @param   string $string String to be camelBacked.
	 *
	 * @return string
	 *
	 * @see camelize
	 */
	public function variablize($string)
	{
		$string   = self::camelize(self::underscore($string));
		$result   = strtolower(substr($string, 0, 1));
		$variable = preg_replace('/\\w/', $result, $string, 1);

		return $variable;
	}

	/**
	 * Check to see if an English word is singular
	 *
	 * @param   string $string The word to check
	 *
	 * @return boolean
	 */
	public function isSingular($string)
	{
		// Check cache assuming the string is plural.
		$singular = isset($this->cache['singularized'][$string]) ?
$this->cache['singularized'][$string] : null;
		$plural   = $singular &&
isset($this->cache['pluralized'][$singular]) ?
$this->cache['pluralized'][$singular] : null;

		if ($singular && $plural)
		{
			return $plural != $string;
		}

		// If string is not in the cache, try to pluralize and singularize it.
		return self::singularize(self::pluralize($string)) == $string;
	}

	/**
	 * Check to see if an Enlish word is plural.
	 *
	 * @param   string $string String to be checked.
	 *
	 * @return boolean
	 */
	public function isPlural($string)
	{
		// Uncountable objects are always singular (e.g. information)
		if (in_array($string, $this->rules['uncountable']))
		{
			return false;
		}

		// Check cache assuming the string is singular.
		$plural   = isset($this->cache['pluralized'][$string]) ?
$this->cache['pluralized'][$string] : null;
		$singular = $plural &&
isset($this->cache['singularized'][$plural]) ?
$this->cache['singularized'][$plural] : null;

		if ($plural && $singular)
		{
			return $singular != $string;
		}

		// If string is not in the cache, try to singularize and pluralize it.
		return self::pluralize(self::singularize($string)) == $string;
	}

	/**
	 * Gets a part of a CamelCased word by index.
	 *
	 * Use a negative index to start at the last part of the word (-1 is the
	 * last part)
	 *
	 * @param   string  $string  Word
	 * @param   integer $index   Index of the part
	 * @param   string  $default Default value
	 *
	 * @return string
	 */
	public function getPart($string, $index, $default = null)
	{
		$parts = self::explode($string);

		if ($index < 0)
		{
			$index = count($parts) + $index;
		}

		return isset($parts[$index]) ? $parts[$index] : $default;
	}
}PK�c�[�'3���init.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Container
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

/** @var \Composer\Autoload\ClassLoader $autoLoader */
$autoLoader = include JPATH_LIBRARIES . '/vendor/autoload.php';

if ($autoLoader)
{
	$autoLoader->setPsr4('OSL\\', __DIR__);
}
PK�c�[guInput/Input.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Input
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Input;

use JInput, JFilterInput;

/**
 * Extends JInput class to allow getting raw data from Input object
 *
 * @property    Input $get
 * @property    Input $post
 */
class Input extends JInput
{
	const INPUT_ALLOWRAW = 2;

	const INPUT_ALLOWHTML = 4;

	/**
	 * Constructor.
	 *
	 * @param   array  $source   Source data (Optional, default is $_REQUEST)
	 * @param   array  $options  Array of configuration parameters (Optional)
	 *
	 */
	public function __construct($source = null, array $options = [])
	{
		if ($source instanceof JInput)
		{
			$reflection = new \ReflectionClass($source);
			$property   = $reflection->getProperty('data');
			$property->setAccessible(true);
			$source = $property->getValue($source);
		}

		if (!isset($options['filter']))
		{
			//Set default filter so that getHtml can be returned properly
			if (version_compare(JVERSION, '4.0.0-dev', 'ge'))
			{
				//Set default filter so that getHtml can be returned properly
				$options['filter'] = JFilterInput::getInstance([], [], 1,
1);
			}
			else
			{
				$options['filter'] = JFilterInput::getInstance(null, null, 1,
1);
			}
		}

		parent::__construct($source, $options);
	}

	/**
	 *
	 * Get data from the input
	 *
	 * @param   int  $mask
	 *
	 * @return array
	 */
	public function getData($mask = Input::INPUT_ALLOWHTML)
	{
		if ($mask & 2)
		{
			return $this->data;
		}

		return $this->filter->clean($this->data, null);
	}

	/**
	 * Set data for the input object. This is usually called when you get
data, modify it, and then set it back
	 *
	 * @param $data
	 */
	public function setData(array $data)
	{
		$this->data = $data;
	}

	/**
	 * Check to see if a variable is available in the input or not
	 *
	 * @param   string  $name  the variable name
	 *
	 * @return boolean
	 */
	public function has($name)
	{
		if (isset($this->data[$name]))
		{
			return true;
		}

		return false;
	}

	/**
	 * Remove a variable from input
	 *
	 * @param $name
	 */
	public function remove($name)
	{
		if (isset($this->data[$name]))
		{
			unset($this->data[$name]);
		}
	}

	/**
	 * Magic method to get an input object
	 *
	 * @param   mixed  $name  Name of the input object to retrieve.
	 *
	 * @return  Input  The request input object
	 */
	public function __get($name)
	{
		if (isset($this->inputs[$name]))
		{
			return $this->inputs[$name];
		}

		$className = 'JInput' . ucfirst($name);

		if (class_exists($className))
		{
			$this->inputs[$name] = new $className(null, $this->options);

			return $this->inputs[$name];
		}

		$superGlobal = '_' . strtoupper($name);

		if (isset($GLOBALS[$superGlobal]))
		{
			$this->inputs[$name] = new Input($GLOBALS[$superGlobal],
$this->options);

			return $this->inputs[$name];
		}
	}
}PK�c�[e�6�;;Model/AdminModel.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Model;

use Exception;

use Joomla\Registry\Registry, Joomla\String\StringHelper, JFactory,
	JPluginHelper, JLanguageMultilang, JTable, JApplicationHelper;

use OSL\Container\Container,
	OSL\Input\Input;

/**
 * Admin model class. It will handle tasks such as add, update, delete,
publish, unpublish...items
 *
 * @package        OSF
 * @subpackage     Model
 * @since          1.0
 */
class AdminModel extends Model
{
	/**
	 * Context, used to get user session data and also trigger plugin
	 *
	 * @var string
	 */
	protected $context;

	/**
	 * The prefix to use with controller messages.
	 *
	 * @var string
	 */
	protected $languagePrefix = null;

	/**
	 * This model trigger events or not. By default, set it to No to improve
performance
	 *
	 * @var boolean
	 */
	protected $triggerEvents = false;

	/**
	 * The event to trigger after deleting the data.
	 *
	 * @var string
	 */
	protected $eventAfterDelete = null;

	/**
	 * The event to trigger after saving the data.
	 *
	 * @var string
	 */
	protected $eventAfterSave = null;

	/**
	 * The event to trigger before deleting the data.
	 *
	 * @var string
	 */
	protected $eventBeforeDelete = null;

	/**
	 * The event to trigger before saving the data.
	 *
	 * @var string
	 */
	protected $eventBeforeSave = null;

	/**
	 * The event to trigger after changing the published state of the data.
	 *
	 * @var string
	 */
	protected $eventChangeState = null;

	/**
	 * Name of plugin group which will be loaded to process the triggered
event.
	 * Default is component name
	 *
	 * @var string
	 */
	protected $pluginGroup = null;

	/**
	 * Data for the item
	 *
	 * @var object
	 */
	protected $data = null;

	/**
	 * Constructor.
	 *
	 * @param mixed $config An object store model configuration
	 *
	 * @see OSFModel
	 */
	public function __construct(Container $container, $config = [])
	{
		parent::__construct($container, $config);

		/**@var Registry $config * */

		$this->context = $this->container->option . '.' .
$this->name;

		//Insert the default model states for admin
		$this->state->insert('id', 'int',
0)->insert('cid', 'array', []);

		if ($this->triggerEvents)
		{
			$name = ucfirst($this->name);

			if (isset($config['plugin_group']))
			{
				$this->pluginGroup = $config['plugin_group'];
			}
			elseif (empty($this->pluginGroup))
			{
				//Plugin group should default to component name
				$this->pluginGroup = substr($this->container->option, 4);
			}

			//Initialize the events
			if (isset($config['event_after_delete']))
			{
				$this->eventAfterDelete = $config['event_after_delete'];
			}
			elseif (empty($this->eventAfterDelete))
			{
				$this->eventAfterDelete = 'on' . $name .
'AfterDelete';
			}

			if (isset($config['event_after_save']))
			{
				$this->eventAfterSave = $config['event_after_save'];
			}
			elseif (empty($this->eventAfterSave))
			{
				$this->eventAfterSave = 'on' . $name .
'AfterSave';
			}

			if (isset($config['event_before_delete']))
			{
				$this->eventBeforeDelete =
$config['event_before_delete'];
			}
			elseif (empty($this->eventBeforeDelete))
			{
				$this->eventBeforeDelete = 'on' . $name .
'BeforeDelete';
			}

			if (isset($config['event_before_save']))
			{
				$this->eventBeforeSave = $config['event_before_save'];
			}
			elseif (empty($this->eventBeforeSave))
			{
				$this->eventBeforeSave = 'on' . $name .
'BeforeSave';
			}

			if (isset($config['event_change_state']))
			{
				$this->eventChangeState = $config['event_change_state'];
			}
			elseif (empty($this->eventChangeState))
			{
				$this->eventChangeState = 'on' . $name .
'ChangeState';
			}
		}

		if (empty($this->languagePrefix))
		{
			$this->languagePrefix = $this->container->languagePrefix;
		}
	}

	/**
	 * Method to get the record data
	 *
	 * @return object
	 */
	public function getData()
	{
		if (empty($this->data))
		{
			if (count($this->state->cid))
			{
				$this->state->id = (int) $this->state->cid[0];
			}

			if ($this->state->id)
			{
				$this->loadData();
			}
			else
			{
				$this->initData();
			}
		}

		return $this->data;
	}

	/**
	 * Method to store a record
	 *
	 * @param Input $input
	 * @param array $ignore
	 *
	 * @return bool
	 * @throws Exception
	 */
	public function store($input, $ignore = [])
	{
		if ($this->triggerEvents)
		{
			JPluginHelper::importPlugin($this->pluginGroup);
		}

		$row   = $this->getTable();
		$isNew = true;
		$id    = $input->getInt('id', 0);

		if ($id)
		{
			$isNew = false;
			$row->load($id);
		}

		// Pre-process the input data
		$this->beforeStore($row, $input, $isNew);

		if ($this->container->user->authorise('core.admin',
'com_pmform'))
		{
			$data = $input->getData(\OSL\Input\Input::INPUT_ALLOWRAW);
		}
		else
		{
			$data = $input->getData();
		}

		$row->bind($data, $ignore);
		$this->prepareTable($row, $input->get('task'));
		$row->check();

		if ($this->triggerEvents)
		{
			$this->container->app->triggerEvent($this->eventBeforeSave,
[$row, $data, $isNew]);
		}

		$row->store();

		if ($this->triggerEvents)
		{
			$this->container->app->triggerEvent($this->eventAfterSave,
[$row, $data, $isNew]);
		}

		$input->set('id', $row->id);

		// Post process after the record stored into database
		$this->afterStore($row, $input, $isNew);
	}

	/**
	 * Method to delete one or more records.
	 *
	 * @param array $cid
	 *
	 * @throws Exception
	 */
	public function delete($cid = [])
	{
		if (count($cid))
		{
			if ($this->triggerEvents)
			{
				JPluginHelper::importPlugin($this->pluginGroup);
			}

			// Before delete
			$this->beforeDelete($cid);

			$row = $this->getTable();

			foreach ($cid as $id)
			{
				if ($row->load($id))
				{
					if ($this->triggerEvents)
					{
						$result =
$this->container->app->triggerEvent($this->eventBeforeDelete,
[$this->context, $row]);

						if (in_array(false, $result, true))
						{
							throw new Exception($row->getError());
						}
					}

					if (!$row->delete())
					{
						throw new Exception($row->getError());
					}

					if ($this->triggerEvents)
					{
						$this->container->app->triggerEvent($this->eventAfterDelete,
[$this->context, $row]);
					}
				}
				else
				{
					throw new Exception($row->getError());
				}
			}

			// Post process after records has been deleted from main table
			$this->afterDelete($cid);
			$this->cleanCache();
		}
	}

	/**
	 * Method to change the published state of one or more records.
	 *
	 * @param array $pks   A list of the primary keys to change.
	 * @param int   $value The value of the published state.
	 *
	 * @throws Exception
	 */
	public function publish($pks, $value = 1)
	{
		$row = $this->getTable();
		$pks = (array) $pks;

		$this->beforePublish($pks, $value);

		// Attempt to change the state of the records.
		if (!$row->publish($pks, $value,
$this->container->user->get('id')))
		{
			throw new Exception($row->getError());
		}

		$this->afterPublish($pks, $value);

		if ($this->triggerEvents)
		{
			// Trigger the eventChangeState event.
			JPluginHelper::importPlugin($this->pluginGroup);
			$this->container->app->triggerEvent($this->eventChangeState,
[$this->context, $pks, $value]);
		}

		// Clear the component's cache
		$this->cleanCache();
	}

	/**
	 * Saves the manually set order of records.
	 *
	 * @param array $pks   An array of primary key ids.
	 *
	 * @param array $order An array contain ordering value of item
corresponding with $pks array
	 *
	 * @return mixed
	 *
	 * @throws Exception
	 */
	public function saveorder($pks = null, $order = null)
	{
		$row        = $this->getTable();
		$conditions = [];

		// Update ordering values
		foreach ($pks as $i => $pk)
		{
			$row->load((int) $pk);

			if ($row->ordering != $order[$i])
			{
				$row->ordering = $order[$i];
				$row->store();

				// Remember to reorder within position and client_id
				$condition = $this->getReorderConditions($row);
				$found     = false;

				foreach ($conditions as $cond)
				{
					if ($cond[1] == $condition)
					{
						$found = true;
						break;
					}
				}

				if (!$found)
				{
					$conditions[] = [$row->id, $condition];
				}
			}
		}

		// Execute reorder for each category.
		foreach ($conditions as $cond)
		{
			$row->load($cond[0]);
			$row->reorder($cond[1]);
		}

		// Clear the component's cache
		$this->cleanCache();

		return true;
	}

	/**
	 * Load the record from database
	 *
	 */
	protected function loadData()
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true);
		$query->select('*')
			->from($this->table)
			->where('id = ' . (int) $this->state->id);
		$db->setQuery($query);
		$this->data = $db->loadObject();
	}

	/**
	 * Init the record dara object
	 */
	protected function initData()
	{
		$this->data = $this->getTable();

		if (property_exists($this->data, 'published'))
		{
			$this->data->published = 1;
		}
	}

	/**
	 * Method to change the title & alias, usually used on save2copy
method
	 *
	 * @param        $row   the object being saved
	 *
	 * @param string $alias The alias.
	 *
	 * @param string $title The title.
	 *
	 * @return array Contains the modified title and alias.
	 */
	protected function generateNewTitle($row, $alias, $title)
	{
		$db    = $this->getDbo();
		$query = $db->getQuery(true);
		$query->select('COUNT(*)')->from($this->table);
		$conditions = $this->getReorderConditions($row);

		while (true)
		{
			$query->where('alias=' . $db->quote($alias));

			if (count($conditions))
			{
				$query->where($conditions);
			}

			$db->setQuery($query);
			$found = (int) $db->loadResult();

			if ($found)
			{
				$title = StringHelper::increment($title);
				$alias = StringHelper::increment($alias, 'dash');
				$query->clear('where');
			}
			else
			{
				break;
			}
		}

		return [$title, $alias];
	}

	/**
	 * A protected method to get a set of ordering conditions.
	 *
	 * @param JTable $row A JTable object.
	 *
	 * @return array An array of conditions to add to ordering queries.
	 *
	 */
	protected function getReorderConditions($row)
	{
		$conditions = [];

		if (property_exists($row, 'catid'))
		{
			$conditions[] = 'catid = ' . (int) $row->catid;
		}

		return $conditions;
	}

	/**
	 * Prepare and sanitise the table data prior to saving.
	 *
	 * @param JTable $row A reference to a JTable object.
	 *
	 * @return void
	 *
	 */
	protected function prepareTable($row, $task)
	{
		$user = $this->container->user;

		if (property_exists($row, 'title'))
		{
			$titleField = 'title';
		}
		elseif (property_exists($row, 'name'))
		{
			$titleField = 'name';
		}

		if (($task == 'save2copy') && $titleField)
		{
			if (property_exists($row, 'alias'))
			{
				//Need to generate new title and alias
				list ($title, $alias) = $this->generateNewTitle($row,
$row->alias, $row->{$titleField});
				$row->{$titleField} = $title;
				$row->alias         = $alias;
			}
			else
			{
				$row->{$titleField} =
StringHelper::increment($row->{$titleField});
			}
		}

		if (property_exists($row, 'title'))
		{
			$row->title = htmlspecialchars_decode($row->title, ENT_QUOTES);
		}

		if (property_exists($row, 'name'))
		{
			$row->name = htmlspecialchars_decode($row->name, ENT_QUOTES);
		}

		if (property_exists($row, 'alias'))
		{
			if (empty($row->alias))
			{
				$row->alias = $row->{$titleField};
			}

			$row->alias = JApplicationHelper::stringURLSafe($row->alias);

			// Handle alias for extra languages
			if (JLanguageMultilang::isEnabled())
			{
				// Build alias alias for other languages
				$languages = \OSL\Utils\Helper::getLanguages();

				if (count($languages))
				{
					foreach ($languages as $language)
					{
						$sef = $language->sef;

						if (!$row->{'alias_' . $sef})
						{
							$row->{'alias_' . $sef} =
JApplicationHelper::stringURLSafe($row->{$titleField . '_' .
$sef});
						}
						else
						{
							$row->{'alias_' . $sef} =
JApplicationHelper::stringURLSafe($row->{'alias_' . $sef});
						}
					}
				}
			}
		}

		if (empty($row->id))
		{
			// Set ordering to the last item if not set
			if (property_exists($row, 'ordering') &&
empty($row->ordering))
			{
				$db         = $this->getDbo();
				$query      = $db->getQuery(true)
					->select('MAX(ordering)')
					->from($db->quoteName($this->table));
				$conditions = $this->getReorderConditions($row);

				if (count($conditions))
				{
					$query->where($conditions);
				}

				$db->setQuery($query);
				$max           = $db->loadResult();
				$row->ordering = $max + 1;
			}

			if (property_exists($row, 'created_date') &&
!$row->created_date)
			{
				$row->created_date = JFactory::getDate()->toSql();
			}

			if (property_exists($row, 'created_by') &&
!$row->created_by)
			{
				$row->created_by = $user->get('id');
			}
		}

		if (property_exists($row, 'modified_date') &&
!$row->modified_date)
		{
			$row->modified_date = JFactory::getDate()->toSql();
		}

		if (property_exists($row, 'modified_by') &&
!$row->modified_by)
		{
			$row->modified_by = $user->get('id');
		}

		if (property_exists($row, 'params') &&
is_array($row->params))
		{
			$row->params = json_encode($row->params);
		}
	}

	/**
	 * Give a chance for child class to pre-process the data
	 *
	 * @param $row
	 * @param $input
	 * @param $isNew bool
	 */
	protected function beforeStore($row, $input, $isNew)
	{

	}

	/**
	 * Give a chance for child class to post-process the data
	 *
	 * @param $row
	 * @param $input
	 * @param $isNew bool
	 */
	protected function afterStore($row, $input, $isNew)
	{

	}

	/**
	 * Give a chance for child class tp pre-process the delete. For example,
delete the relation records
	 *
	 * @param array $cid Ids of deleted record
	 */
	protected function beforeDelete($cid)
	{

	}

	/**
	 * Give a chance for child class tp post-process the delete. For example,
delete the relation records
	 *
	 * @param array $cid Ids of deleted record
	 */
	protected function afterDelete($cid)
	{

	}

	/**
	 * Give a chance for child class to pre-process the publish.
	 *
	 * @param array $cid
	 * @param int   $state
	 */
	protected function beforePublish($cid, $state)
	{

	}

	/**
	 * Give a chance for child class to post-process the publish.
	 *
	 * @param array $cid
	 * @param int   $state
	 */
	protected function afterPublish($cid, $state)
	{

	}
}PK�c�[���%�%Model/ListModel.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Model;

use JDatabaseQuery, JPagination;

use OSL\Container\Container;

/**
 * Model class for handling lists of items.
 *
 * @package     OSF
 * @subpackage  Model
 * @since       1.0
 */
class ListModel extends Model
{
	/**
	 * The query object of the model
	 *
	 * @var JDatabaseQuery
	 */
	protected $query;
	/**
	 * List total
	 *
	 * @var integer
	 */
	protected $total;

	/**
	 * Model list data
	 *
	 * @var array
	 */
	protected $data;

	/**
	 * Pagination object
	 *
	 * @var JPagination
	 */
	protected $pagination;

	/**
	 * Name of state field name, usually be tbl.state or tbl.published
	 *
	 * @var string
	 */
	protected $stateField;

	/**
	 * List of fields which will be used for searching data from database
table
	 *
	 * @var array
	 */
	protected $searchFields = array();

	/**
	 * Clear join clause for getTotal method
	 *
	 * @var bool
	 */
	protected $clearJoin = true;

	/**
	 * Instantiate the model.
	 *
	 * @param mixed $config Model configuration data, could be an array or an
OSFConfig object
	 *
	 */
	public function __construct(Container $container, $config = array())
	{
		parent::__construct($container, $config);

		$this->query = $this->db->getQuery(true);

		$fields = array_keys($this->db->getTableColumns($this->table));

		if (in_array('ordering', $fields))
		{
			$defaultOrdering = 'tbl.ordering';
		}
		else
		{
			$defaultOrdering = 'tbl.id';
		}

		if (in_array('published', $fields))
		{
			$this->stateField = 'tbl.published';
		}
		else
		{
			$this->stateField = 'tbl.state';
		}

		if (isset($config['clear_join']))
		{
			$this->clearJoin = $config['clear_join'];
		}

		$this->state->insert('limit', 'int',
$this->container->appConfig->get('list_limit'))
			->insert('limitstart', 'int', 0)
			->insert('filter_order', 'cmd',
$defaultOrdering)
			->insert('filter_order_Dir', 'word',
'asc')
			->insert('filter_search', 'string')
			->insert('filter_state', 'string')
			->insert('filter_access', 'int', 0)
			->insert('filter_language', 'string');

		if (isset($config['search_fields']))
		{
			$this->searchFields = (array) $config['search_fields'];
		}
		else
		{
			// Build the search field array automatically, basically, we should
search based on name, title, description if these fields are available
			if (in_array('name', $fields))
			{
				$this->searchFields[] = 'tbl.name';
			}

			if (in_array('title', $fields))
			{
				$this->searchFields[] = 'tbl.title';
			}

			if (in_array('alias', $fields))
			{
				$this->searchFields[] = 'tbl.alias';
			}
		}

		if (isset($config['remember_states']))
		{
			$this->rememberStates = $config['remember_states'];
		}
		elseif
($this->container->app->isClient('administrator'))
		{
			$this->rememberStates = true;
		}
	}

	/**
	 * Get a list of items
	 *
	 * @return array
	 */
	public function getData()
	{
		if (empty($this->data))
		{
			$db    = $this->getDbo();
			$query = $this->buildListQuery();

			$this->beforeQueryData($query);

			// Adjust the limitStart state property
			$limit = $this->state->limit;

			if ($limit)
			{
				$offset = $this->state->limitstart;
				$total  = $this->getTotal();

				//If the offset is higher than the total recalculate the offset
				if ($offset !== 0 && $total !== 0)
				{
					if ($offset >= $total)
					{
						$offset                  = floor(($total - 1) / $limit) * $limit;
						$this->state->limitstart = $offset;
					}
				}
			}

			$db->setQuery($query, $this->state->limitstart,
$this->state->limit);
			$this->data = $db->loadObjectList();

			$this->beforeReturnData($this->data);

			// Store the query so that it can be used in getTotal method if needed
			$this->query = $query;
		}

		return $this->data;
	}

	/**
	 * Get total record. Child class should override this method if needed
	 *
	 * @return integer Number of records
	 *
	 */
	public function getTotal()
	{
		if (empty($this->total))
		{
			$db    = $this->getDbo();
			$query = $this->buildTotalQuery();
			$this->beforeQueryTotal($query);
			$db->setQuery($query);
			$this->total = (int) $db->loadResult();
		}

		return $this->total;
	}

	/**
	 * Get pagination object
	 *
	 * @return JPagination
	 */
	public function getPagination()
	{
		// Lets load the content if it doesn't already exist
		if (empty($this->pagination))
		{
			jimport('joomla.html.pagination');

			$this->pagination = new JPagination($this->getTotal(),
$this->state->limitstart, $this->state->limit);
		}

		return $this->pagination;
	}


	/**
	 * Build the query object which is used to get list of records from
database
	 *
	 * @return JDatabaseQuery
	 */
	protected function buildListQuery()
	{
		$query = $this->query;

		$this->buildQueryColumns($query)
			->buildQueryFrom($query)
			->buildQueryJoins($query)
			->buildQueryWhere($query)
			->buildQueryGroup($query)
			->buildQueryHaving($query)
			->buildQueryOrder($query);

		return $query;
	}

	/**
	 * Build query object use to get total records from database
	 *
	 * @return JDatabaseQuery
	 */
	protected function buildTotalQuery()
	{
		$query = clone $this->query;
		$query->clear('select')
			->clear('group')
			->clear('having')
			->clear('order')
			->clear('limit')
			->select('COUNT(*)');

		// Clear join clause if needed
		if ($this->clearJoin)
		{
			$query->clear('join');
		}

		return $query;
	}

	/**
	 * Builds SELECT columns list for the query
	 *
	 * @param JDatabaseQuery $query
	 *
	 * @return $this
	 */
	protected function buildQueryColumns(JDatabaseQuery $query)
	{
		$query->select(array('tbl.*'));

		return $this;
	}

	/**
	 * Builds FROM tables list for the query
	 *
	 * @param JDatabaseQuery $query
	 *
	 * @return $this
	 */
	protected function buildQueryFrom(JDatabaseQuery $query)
	{
		$query->from($this->table . ' AS tbl');

		return $this;
	}

	/**
	 * Builds JOINS clauses for the query
	 *
	 * @param JDatabaseQuery $query
	 *
	 * @return $this
	 */
	protected function buildQueryJoins(JDatabaseQuery $query)
	{
		return $this;
	}

	/**
	 * Builds a WHERE clause for the query
	 *
	 * @param JDatabaseQuery $query
	 *
	 * @return $this
	 */
	protected function buildQueryWhere(JDatabaseQuery $query)
	{
		$user  = $this->container->user;
		$db    = $this->getDbo();
		$state = $this->state;

		if ($state->filter_state == 'P')
		{
			$query->where($this->stateField . ' = 1');
		}
		elseif ($state->filter_state == 'U')
		{
			$query->where($this->stateField . ' = 0');
		}

		if ($state->filter_access)
		{
			$query->where('tbl.access = ' . (int)
$state->filter_access);

			if (!$user->authorise('core.admin'))
			{
				$query->where('tbl.access IN (' . implode(',',
$user->getAuthorisedViewLevels()) . ')');
			}
		}

		if ($state->filter_search)
		{
			//Remove blank space from searching
			$state->filter_search = trim($state->filter_search);

			if (stripos($state->filter_search, 'id:') === 0)
			{
				$query->where('tbl.id = ' . (int)
substr($state->filter_search, 3));
			}
			else
			{
				$search = $db->quote('%' .
$db->escape($state->filter_search, true) . '%', false);

				if (is_array($this->searchFields))
				{
					$whereOr = array();

					foreach ($this->searchFields as $searchField)
					{
						$whereOr[] = " LOWER($searchField) LIKE " . $search;
					}

					$query->where('(' . implode(' OR ', $whereOr) .
') ');
				}
			}
		}

		if ($state->filter_language && $state->filter_language !=
'*')
		{
			$query->where('tbl.language IN (' .
$db->quote($state->filter_language) . ',' .
$db->quote('*') . ', "")');
		}

		return $this;
	}

	/**
	 * Builds a GROUP BY clause for the query
	 *
	 * @param JDatabaseQuery $query
	 *
	 * @return $this
	 */
	protected function buildQueryGroup(JDatabaseQuery $query)
	{
		return $this;
	}

	/**
	 * Builds a HAVING clause for the query
	 *
	 * @param JDatabaseQuery $query
	 *
	 * @return $this
	 */
	protected function buildQueryHaving(JDatabaseQuery $query)
	{
		return $this;
	}

	/**
	 * Builds a generic ORDER BY clasue based on the model's state
	 *
	 * @param JDatabaseQuery $query
	 *
	 * @return $this
	 */
	protected function buildQueryOrder(JDatabaseQuery $query)
	{
		$sort      = $this->state->filter_order;
		$direction = strtoupper($this->state->filter_order_Dir);

		if ($sort)
		{
			$query->order($sort . ' ' . $direction);
		}

		return $this;
	}

	/**
	 * This method give child class a chance to adjust the query before it is
run to return list of records
	 *
	 * @param JDatabaseQuery $query
	 */
	protected function beforeQueryData(JDatabaseQuery $query)
	{

	}

	/**
	 * This method give child class a chance to adjust the query object before
it is run to return total records
	 *
	 * @param JDatabaseQuery $query
	 */
	protected function beforeQueryTotal(JDatabaseQuery $query)
	{

	}

	/**
	 * This method give child class to adjust the return data in getData
method without having to override the
	 * whole method
	 *
	 * @param array $rows
	 */
	protected function beforeReturnData($rows)
	{

	}
}
PK�c�[�z[ԯ�Model/Model.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Model;

use Exception;
use JDatabaseDriver, JText, JTable, JCache;
use OSL\Container\Container;
use OSL\Input\Input;

class Model
{

	/**
	 * The model name
	 *
	 * @var string
	 */
	protected $name;

	/**
	 * Model state
	 *
	 * @var State
	 */
	protected $state;

	/**
	 * The database driver.
	 *
	 * @var JDatabaseDriver
	 */
	protected $db;

	/**
	 * The name of the database table
	 *
	 * @var string
	 */
	protected $table;

	/**
	 * Ignore request or not. If set to Yes, model states won't be set
when it is created
	 *
	 * @var boolean
	 */
	protected $ignoreRequest = false;

	/**
	 * Remember model states value in session
	 *
	 * @var boolean
	 */
	protected $rememberStates = false;

	/**
	 * Constructor
	 *
	 * @param mixed $config Model configuration data, could be an array or an
OSFConfig object
	 *
	 * @throws Exception
	 */
	public function __construct(Container $container, $config = [])
	{
		$this->container = $container;

		if (isset($config['name']))
		{
			$this->name = $config['name'];
		}
		else
		{
			$r = null;

			if (!preg_match('/(.*)\\\\Model\\\\(.*)/i', get_class($this),
$r))
			{
				throw new
Exception(JText::_('JLIB_APPLICATION_ERROR_MODEL_GET_NAME'),
500);
			}

			$this->name = $r[2];
		}

		if (isset($config['db']))
		{
			$this->db = $config['db'];
		}
		else
		{
			$this->db = $container->get('db');
		}

		if (isset($config['state']))
		{
			$this->state = $config['state'];
		}
		else
		{
			$this->state = new State();
		}

		if (isset($config['table']))
		{
			$this->table = $config['table'];
		}
		else
		{
			$this->table = $container->tablePrefix .
strtolower($container->inflector->pluralize($this->name));
		}

		if (isset($config['ignore_request']))
		{
			$this->ignoreRequest = $config['ignore_request'];
		}

		if (isset($config['remember_states']))
		{
			$this->rememberStates = $config['remember_states'];
		}

		$this->initialize();
	}

	/**
	 * Populate model state from input
	 */
	public function populateState()
	{
		if ($this->ignoreRequest)
		{
			return;
		}

		$input = $this->container->input;

		$data = $input->getData();

		// Try to get the state properties data from user session
		if ($this->rememberStates)
		{
			$properties = $this->state->getProperties();

			if (count($properties))
			{
				$context = $this->container->option . '.' .
$input->get('view', $this->container->defaultView) .
'.';

				foreach ($properties as $property)
				{
					$newState = $this->getUserStateFromRequest($input, $context .
$property, $property);

					if ($newState != null)
					{
						$data[$property] = $newState;
					}
				}
			}
		}

		$this->setState($data);
	}

	/**
	 * Get JTable object for the model
	 *
	 * @param string $name
	 *
	 * @return JTable
	 */
	public function getTable($name = '')
	{
		if (!$name)
		{
			$name =
$this->container->inflector->singularize($this->name);
		}


		return $this->container->factory->createTable($name,
$this->getDbo());
	}

	/**
	 * Set the model state properties
	 *
	 * @param string|array The    name of the property, an array
	 *
	 * @param mixed $value The value of the property
	 *
	 * @return Model
	 */
	public function setState($property, $value = null)
	{
		$changed = false;

		if (is_array($property))
		{
			foreach ($property as $key => $value)
			{
				if (isset($this->state->$key) && $this->state->$key
!= $value)
				{
					$changed = true;
					break;
				}
			}

			$this->state->setData($property);
		}
		else
		{
			if (isset($this->state->$property) &&
$this->state->$property != $value)
			{
				$changed = true;
			}

			$this->state->$property = $value;
		}

		if ($changed)
		{
			// Reset the data
			$this->data  = null;
			$this->total = null;
		}

		return $this;
	}

	/**
	 * Get the model state properties
	 *
	 * If no property name is given then the function will return an
associative array of all properties.
	 *
	 * @param string $property The name of the property
	 *
	 * @param string $default  The default value
	 *
	 * @return mixed <string, State>
	 */
	public function getState($property = null, $default = null)
	{
		$result = $default;

		if (is_null($property))
		{
			$result = $this->state;
		}
		else
		{
			if (isset($this->state->$property))
			{
				$result = $this->state->$property;
			}
		}

		return $result;
	}

	/**
	 * Reset all cached data and reset the model state to it's default
	 *
	 * @param boolean $default If TRUE use defaults when resetting. Default is
TRUE
	 *
	 * @return $this
	 */
	public function reset($default = true)
	{
		$this->data  = null;
		$this->total = null;
		$this->state->reset($default);
		$this->query = $this->db->getQuery(true);

		return $this;
	}

	/**
	 * Get the dbo
	 *
	 * @return JDatabaseDriver
	 */
	public function getDbo()
	{
		return $this->db;
	}

	/**
	 * Get name of the model
	 *
	 * @return string
	 */
	public function getName()
	{
		return $this->name;
	}

	/**
	 * This blank method give child class a chance to init the class further
after being constructed
	 */
	protected function initialize()
	{

	}

	/**
	 * Supports a simple form Fluent Interfaces.
	 * Allows you to set states by
	 * using the state name as the method name.
	 *
	 * For example :
$model->filter_order('name')->filter_order_Dir('DESC')->limit(10)->getData();
	 *
	 * @param string $method Method name
	 *
	 * @param array  $args   Array containing all the arguments for the
original call
	 *
	 * @return $this
	 */
	public function __call($method, $args)
	{
		if (isset($this->state->$method))
		{
			$this->state->set($method, $args[0]);

			return $this;
		}

		return null;
	}

	/**
	 * Gets the value of a user state variable.
	 *
	 * @param Input  $input   The input object
	 * @param string $key     The key of the user state variable.
	 * @param string $request The name of the variable passed in a request.
	 * @param string $default The default value for the variable if not found.
Optional.
	 * @param string $type    Filter for the variable, for valid values see
{@link JFilterInput::clean()}. Optional.
	 *
	 * @return  object  The request user state.
	 */
	protected function getUserStateFromRequest($input, $key, $request,
$default = null, $type = 'none')
	{
		$app = $this->container->app;

		$currentState = $app->getUserState($key, $default);
		$newState     = $input->get($request, null, $type);

		// Save the new value only if it was set in this request.
		if ($newState !== null)
		{
			$app->setUserState($key, $newState);
		}
		else
		{
			$newState = $currentState;
		}

		return $newState;
	}

	/**
	 * Clean the cache
	 *
	 * @param string  $group     The cache group
	 * @param integer $client_id The ID of the client
	 *
	 * @return  void
	 *
	 */
	protected function cleanCache($group = null, $client_id = 0)
	{
		$conf = $this->container->appConfig;

		$options = [
			'defaultgroup' => ($group) ? $group :
$this->container->option,
			'cachebase'    => ($client_id) ? JPATH_ADMINISTRATOR .
'/cache' : $conf->get('cache_path', JPATH_SITE .
'/cache')];

		$cache = JCache::getInstance('callback', $options);
		$cache->clean();

		// Trigger the onContentCleanCache event.
		if (!empty($this->eventCleanCache))
		{
			$this->container->app->triggerEvent($this->eventCleanCache,
$options);
		}
	}
}PK�c�[}�'�&&Model/State.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Model
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Model;

use JFilterInput;

class State
{

	/**
	 * The state data container
	 *
	 * @var array
	 */
	protected $data = array();

	/**
	 * Set data for a state
	 *
	 * @param string $name The name of state
	 * @param mixed  $value
	 *
	 * @return $this
	 */
	public function set($name, $value)
	{
		if (isset($this->data[$name]))
		{
			$this->data[$name]->value = $value;
		}

		return $this;
	}

	/**
	 * Retrieve data for a state
	 *
	 * @param string $name    Name of the state
	 *
	 * @param mixed  $default Default value if no data has been set for that
state
	 *
	 * @return mixed The state value
	 */
	public function get($name, $default = null)
	{
		$result = $default;

		if (isset($this->data[$name]))
		{
			$result = $this->data[$name]->value;
		}

		return $result;
	}

	/**
	 * Insert a new state
	 *
	 * @param string $name    The name of the state
	 *
	 * @param mixed  $filter  The name of filter which will be used to
sanitize the state value using JFilterInput
	 *
	 * @param mixed  $default The default value of the state
	 *
	 * @return State
	 */
	public function insert($name, $filter, $default = null)
	{
		$state             = new \stdClass();
		$state->name       = $name;
		$state->filter     = $filter;
		$state->value      = $default;
		$state->default    = $default;
		$this->data[$name] = $state;

		return $this;
	}

	/**
	 * Remove an existing state
	 *
	 * @param string $name The name of the state which will be removed
	 *
	 * @return $this
	 */
	public function remove($name)
	{
		if (isset($this->data[$name]))
		{
			unset($this->data[$name]);
		}

		return $this;
	}

	/**
	 * Reset all state data and revert to the default state
	 *
	 * @param boolean $default If TRUE use defaults when resetting. If FALSE
then null value will be used.Default is TRUE
	 *
	 * @return $this
	 */
	public function reset($default = true)
	{
		foreach ($this->data as $state)
		{
			$state->value = $default ? $state->default : null;
		}

		return $this;
	}

	/**
	 * Set the state data
	 *
	 * This function will only filter values if we have a value. If the value
	 * is an empty string it will be filtered to NULL.
	 *
	 * @param array $data An associative array of state values by name
	 *
	 * @return $this
	 */
	public function setData(array $data)
	{
		$filterInput = JFilterInput::getInstance();

		// Special code for handle ajax ordering in Joomla 3
		if (!empty($data['filter_full_ordering']))
		{
			$parts                    = explode(' ',
$data['filter_full_ordering']);
			$sort                     = $parts[0];
			$direction                = isset($parts[1]) ? $parts[1] :
'';
			$data['filter_order']     = $sort;
			$data['filter_order_Dir'] = $direction;
		}

		// Filter data
		foreach ($data as $key => $value)
		{
			if (isset($this->data[$key]))
			{
				$filter = $this->data[$key]->filter;

				// Only filter if we have a value
				if ($value !== null)
				{
					if ($value !== '')
					{
						// Check for a callback filter.
						if (strpos($filter, '::') !== false &&
is_callable(explode('::', $filter)))
						{
							$value = call_user_func(explode('::', $filter), $value);
						}

						// Filter using a callback function if specified.
						elseif (function_exists($filter))
						{
							$value = call_user_func($filter, $value);
						}

						// Filter using JFilterInput. All HTML code is filtered by default.
						else
						{
							$value = $filterInput->clean($value, $filter);
						}
					}
					else
					{
						$value = null;
					}

					$this->data[$key]->value = $value;
				}
			}
		}

		return $this;
	}

	/**
	 * Get the state data
	 *
	 * This function only returns states that have been been set.
	 *
	 * @return array An associative array of state values by name
	 */
	public function getData()
	{
		$data = array();

		foreach ($this->data as $name => $state)
		{
			$data[$name] = $state->value;
		}

		return $data;
	}

	/**
	 * Get list of state variables is being stored
	 */
	public function getProperties()
	{
		return array_keys($this->data);
	}

	/**
	 * Get default value of a state
	 *
	 * @param string $name
	 *
	 * @return mixed the default state value
	 */
	public function getDefault($name)
	{
		return $this->data[$name]->default;
	}

	/**
	 * Change default value (and therefore value) of an existing state
	 *
	 * @param $name
	 * @param $default
	 *
	 * @return $this
	 */
	public function setDefault($name, $default)
	{
		if (isset($this->data[$name]))
		{
			$this->data[$name]->default = $default;
			$this->data[$name]->value   = $default;
		}

		return $this;
	}

	/**
	 * Magic method to get state value
	 *
	 * @param string
	 *
	 * @return mixed
	 */
	public function __get($name)
	{
		return $this->get($name);
	}

	/**
	 * Set state value
	 *
	 * @param string $name  The user-specified state name.
	 *
	 * @param mixed  $value The user-specified state value.
	 *
	 * @return void
	 */
	public function __set($name, $value)
	{
		$this->set($name, $value);
	}

	/**
	 * Test existence of a state variable
	 *
	 * @param string $name The state name
	 *
	 * @return boolean
	 */
	public function __isset($name)
	{
		return isset($this->data[$name]);
	}

	/**
	 * Unset a state value
	 *
	 * @param string $name The state name.
	 *
	 * @return void
	 */
	public function __unset($name)
	{
		if (isset($this->data[$name]))
		{
			$this->data[$name]->value = $this->data[$name]->default;
		}
	}
}PK�c�[�$Provider/SystemProvider.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Provider
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */
namespace OSL\Provider;

use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use JFactory, JEventDispatcher, JComponentHelper;
use OSL\Input\Input;

class SystemProvider implements ServiceProviderInterface
{
	public function register(Container $container)
	{
		// Joomla Application
		$container->share(
			'app',
			function ()
			{
				return JFactory::getApplication();
			},
			true
		);

		// Joomla Application Configuration
		$container->share(
			'appConfig',
			function ()
			{
				return JFactory::getConfig();
			},
			true
		);

		// Database
		$container->share(
			'db',
			function ()
			{
				return JFactory::getDbo();
			},
			true
		);

		// Session
		$container->share(
			'session',
			function ()
			{
				return JFactory::getSession();
			},
			true
		);

		// Language
		$container->share(
			'language',
			function ()
			{
				return JFactory::getLanguage();
			},
			true
		);

		if (version_compare(JVERSION, '4.0.0-dev', '<'))
		{
			// Joomla Event Dispatcher
			$container->share(
				'eventDispatcher',
				function ()
				{
					return JEventDispatcher::getInstance();
				},
				true
			);
		}

		// Joomla Mailer
		$container->share(
			'mailer',
			function ()
			{
				return JFactory::getMailer();
			},
			true
		);

		// String Inflector
		$container->share(
			'inflector',
			function ()
			{
				return new \OSL\Inflector\Inflector();
			},
			true
		);

		// Component params
		$container->share(
			'params',
			function (Container $container)
			{
				return
JComponentHelper::getParams($container->get('option'));
			},
			true
		);

		// Joomla Document
		$container->share(
			'document',
			function ()
			{
				return JFactory::getDocument();
			},
			true
		);

		// Current Joomla User
		$container->share(
			'user',
			function ()
			{
				return JFactory::getUser();
			},
			true
		);

		// Joomla Input
		$container->share(
			'input',
			function ()
			{
				if (version_compare(JVERSION, '4.0.0-dev', 'ge'))
				{
					$source = JFactory::getApplication()->input;
				}
				else
				{
					$source = null;
				}

				return new Input($source);
			}
		);

		// OSL Factory
		$container->share('factory',
			function (Container $container)
			{
				return new \OSL\Factory\Factory($container);
			}
		);

		// Current template
		$container->share('template',
			function (Container $container)
			{
				return $container->get('app')->getTemplate();
			}
		);
	}
}PK�c�[�V�jjUtils/Database.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Utils;

use JDatabaseQuery;

class Database
{
	/**
	 * Helper method to get fields from database table in case the site is
multilingual
	 *
	 * @param \JDatabaseQuery $query
	 * @param array           $fields
	 * @param string          $fieldSuffix
	 */
	public static function getMultilingualFields(JDatabaseQuery $query,
$fields = array(), $fieldSuffix)
	{
		foreach ($fields as $field)
		{
			$alias  = $field;
			$dotPos = strpos($field, '.');

			if ($dotPos !== false)
			{
				$alias = substr($field, $dotPos + 1);
			}

			$query->select($query->quoteName($field . $fieldSuffix, $alias));
		}
	}
}PK�c�[�~����Utils/Helper.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Utils;

use JComponentHelper, JFactory, JObject;

class Helper
{
	/**
	 * Get list of language uses on the site
	 *
	 * @return array
	 */
	public static function getLanguages()
	{
		$db    = JFactory::getDbo();
		$query = $db->getQuery(true);

		$params  = JComponentHelper::getParams('com_languages');
		$default = $params->get('site', 'en-GB');

		$query->select('lang_id, lang_code, title, `sef`')
			->from('#__languages')
			->where('published = 1')
			->where('lang_code != ' . $db->quote($default))
			->order('ordering');
		$db->setQuery($query);
		$languages = $db->loadObjectList();

		return $languages;
	}

	/**
	 * Get actions can be performed by the current user on the view of a
component
	 *
	 * @param string $option Name of the component is being dispatched
	 *
	 * @return JObject    Actions which can be performed by the current user
	 */
	public static function getActions($option)
	{
		$result = new JObject();

		$user    = JFactory::getUser();
		$actions = array('core.admin', 'core.manage',
'core.create', 'core.edit', 'core.edit.own',
'core.edit.state', 'core.delete');

		foreach ($actions as $action)
		{
			$result->set($action, $user->authorise($action, $option));
		}

		return $result;
	}

	/**
	 * Apply some fixes for request data, this method should be called before
the dispatcher is called
	 *
	 * @return void
	 */
	public static function prepareRequestData()
	{
		//Remove cookie vars from request data
		$cookieVars = array_keys($_COOKIE);

		if (count($cookieVars))
		{
			foreach ($cookieVars as $key)
			{
				if (!isset($_POST[$key]) && !isset($_GET[$key]))
				{
					unset($_REQUEST[$key]);
				}
			}
		}

		if (isset($_REQUEST['start']) &&
!isset($_REQUEST['limitstart']))
		{
			$_REQUEST['limitstart'] = $_REQUEST['start'];
		}

		if (!isset($_REQUEST['limitstart']))
		{
			$_REQUEST['limitstart'] = 0;
		}
	}

	/**
	 * Convert payment amount to from one currency to other currency
	 *
	 * @param float  $amount
	 *
	 * @param string $fromCurrency
	 *
	 * @param string $toCurrency
	 *
	 * @return float
	 */
	public static function convertPaymentAmount($amount, $fromCurrency,
$toCurrency)
	{
		$http     = \JHttpFactory::getHttp();
		$url      =
'http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s='
. $toCurrency . $fromCurrency . '=X';
		$response = $http->get($url);
		if ($response->code == 200)
		{
			$currencyData = explode(',', $response->body);
			$rate         = floatval($currencyData[1]);
			if ($rate > 0)
			{
				$amount = $amount / $rate;
			}
		}

		return round($amount, 2);
	}

	/**
	 * Credit Card Type
	 *
	 * Iterates through known/supported card brands to determine the brand of
this card
	 *
	 * @param string $cardNumber
	 *
	 * @return string
	 */
	public static function getCardType($cardNumber)
	{
		$supportedCardTypes = array(
			'visa'               => '/^4\d{12}(\d{3})?$/',
			'mastercard'         =>
'/^(5[1-5]\d{4}|677189)\d{10}$/',
			'discover'           =>
'/^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/',
			'amex'               => '/^3[47]\d{13}$/',
			'diners_club'        =>
'/^3(0[0-5]|[68]\d)\d{11}$/',
			'jcb'                =>
'/^35(28|29|[3-8]\d)\d{12}$/',
			'switch'             =>
'/^6759\d{12}(\d{2,3})?$/',
			'solo'               =>
'/^6767\d{12}(\d{2,3})?$/',
			'dankort'            => '/^5019\d{12}$/',
			'maestro'            =>
'/^(5[06-8]|6\d)\d{10,17}$/',
			'forbrugsforeningen' => '/^600722\d{10}$/',
			'laser'              =>
'/^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/',
		);

		foreach ($supportedCardTypes as $brand => $val)
		{
			if (preg_match($val, $cardNumber))
			{
				return $brand;
			}
		}

		return '';
	}
}PK�c�[�Y���Utils/Html.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  Controller
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\Utils;

use JFactory, JFormHelper;
use JHtmlSidebar, JHtml, JText;

class Html
{
	/**
	 * Add sub-menus which allow users to access to the other views in the
component
	 *
	 * @param string $option   Name of the component being dispatched
	 * @param string $viewName Name of the view currently displayed
	 */

	public static function addSubMenus($option, $viewName)
	{
		$db              = JFactory::getDbo();
		$query           = $db->getQuery(true);
		$baseLink        = 'index.php?option=' . $option;
		$currentViewLink = 'index.php?option=' . $option .
'&view=' . $viewName;
		$query->select('title, link')
			->from('#__menu')
			->where('link LIKE ' . $db->quote($baseLink .
'%'))
			->where('parent_id != 1')
			->where('client_id = 1')
			->order('id');
		$db->setQuery($query);
		$rows = $db->loadObjectList();

		foreach ($rows as $row)
		{
			JHtmlSidebar::addEntry(JText::_($row->title), $row->link,
$row->link == $currentViewLink);
		}
	}

	/**
	 * Get label of the field (including tooltip)
	 *
	 * @param        $name
	 * @param        $title
	 * @param string $tooltip
	 *
	 * @return string
	 */
	public static function getFieldLabel($name, $title, $tooltip =
'')
	{
		$label = '';
		$text  = $title;

		// Build the class for the label.
		$class = !empty($tooltip) ? 'hasTooltip hasTip' :
'';

		// Add the opening label tag and main attributes attributes.
		$label .= '<label id="' . $name . '-lbl"
for="' . $name . '" class="' . $class .
'"';

		// If a description is specified, use it to build a tooltip.
		if (!empty($tooltip))
		{
			$label .= ' title="' . JHtml::tooltipText(trim($text,
':'), $tooltip, 0) . '"';
		}

		$label .= '>' . $text . '</label>';

		return $label;
	}

	/**
	 * Get bootstrapped style boolean input
	 *
	 * @param $name
	 * @param $value
	 *
	 * @return string
	 */
	/**
	 * Get bootstrapped style boolean input
	 *
	 * @param $name
	 * @param $value
	 *
	 * @return string
	 */
	public static function getBooleanInput($name, $value)
	{
		JHtml::_('jquery.framework');
		$value = (int) $value;
		$field = JFormHelper::loadFieldType('Radio');

		$element = new \SimpleXMLElement('<field />');
		$element->addAttribute('name', $name);

		if (version_compare(JVERSION, '4.0.0-dev', '>='))
		{
			$element->addAttribute('class', 'switcher');
			$element->addAttribute('layout',
'joomla.form.field.radio.switcher');
		}
		else
		{
			$element->addAttribute('class', 'radio btn-group
btn-group-yesno');
		}

		$element->addAttribute('default', '0');

		$node = $element->addChild('option', 'JNO');
		$node->addAttribute('value', '0');

		$node = $element->addChild('option', 'JYES');
		$node->addAttribute('value', '1');

		$field->setup($element, $value);

		return $field->input;
	}

	/**
	 * Generate User Input Select
	 *
	 * @param  int   $userId
	 * @param string $name
	 * @param array  $attributes
	 *
	 * @return string
	 */
	public static function getUserInput($userId, $name = 'user_id',
array $attributes = array())
	{
		/* @var \JFormField $field */
		$field = JFormHelper::loadFieldType('User');

		$element = new \SimpleXMLElement('<field />');
		$element->addAttribute('name', $name);
		$element->addAttribute('class', 'readonly');

		foreach ($attributes as $key => $value)
		{
			$element->addAttribute($key, $value);
		}

		$field->setup($element, $userId);

		return $field->input;
	}
}PK�c�[�.�
	
	View/AbstractView.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  View
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\View;

use Exception, JText;
use OSL\Container\Container;
use OSL\Model\Model;

/**
 * Class AbstractView
 *
 * Joomla CMS Base View Class
 */
abstract class AbstractView
{
	/**
	 * Name of the view
	 *
	 * @var string
	 */
	protected $name;

	/**
	 * The model object.
	 *
	 * @var Model
	 */
	protected $model;

	/**
	 * Determine the view has a model associated with it or not.
	 * If set to No, no model will be created and assigned to the view method
when the view is being created
	 *
	 * @var boolean
	 */
	public $hasModel = true;

	/**
	 * Constructor
	 *
	 * @param Container $container
	 * @param array     $config
	 *
	 * @throws Exception
	 */
	public function __construct(Container $container, $config = array())
	{
		$this->container = $container;

		// Set the view name
		if (isset($config['name']))
		{
			$this->name = $config['name'];
		}
		else
		{
			$className = get_class($this);

			$r = null;

			if (!preg_match('/(.*)\\\\View\\\\(.*)\\\\(.*)/i', $className,
$r))
			{
				throw new Exception(JText::_('Could not detect the name from
class' . $className), 500);
			}

			$this->name = $r[2];
		}

		if (isset($config['has_model']))
		{
			$this->hasModel = $config['has_model'];
		}

		$this->initialize();
	}

	/**
	 * Get name of the current view
	 *
	 * @return string
	 */
	public function getName()
	{
		return $this->name;
	}

	/**
	 * Set the model object
	 *
	 * @param Model $model
	 */
	public function setModel(Model $model)
	{
		$this->model = $model;
	}

	/**
	 * Get the model object
	 *
	 * @return Model
	 */
	public function getModel()
	{
		return $this->model;
	}

	/**
	 * Method to escape output.
	 *
	 * @param string $output The output to escape.
	 *
	 * @return string The escaped output.
	 *
	 */
	public function escape($output)
	{
		return $output;
	}

	/**
	 * This blank method give child class a chance to init the class further
after being constructed
	 */
	protected function initialize()
	{

	}
}PK�c�[ N��View/CsvView.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  View
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\View;

class CsvView extends AbstractView
{

}PK�c�[��׍ccView/HtmlView.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  View
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\View;

use JUri, JPath;

use OSL\Container\Container;

jimport('joomla.filesystem.path');


/**
 * Class HtmlView
 *
 * @property-read \JDocumentHtml   $document
 * @property-read \OSL\Input\Input $input
 *
 */
class HtmlView extends AbstractView
{
	/**
	 * The view layout.
	 *
	 * @var string
	 */
	protected $layout = 'default';

	/**
	 * The paths queue.
	 *
	 * @var array
	 */
	protected $paths = array();

	/**
	 * ID of the active menu item, use as default Itemid for links in the
view
	 *
	 * @var int
	 */
	public $Itemid;

	/**
	 * This is a front-end or back-end view.
	 * We need this field to determine whether we need to addToolbar or build
the filter
	 *
	 * @var boolean
	 */
	protected $isAdminView = false;

	/**
	 * Options to allow hide default toolbar buttons from backend view
	 *
	 * @var array
	 */
	protected $hideButtons = array();

	/**
	 * JDocumentHtml document object, used to process meta data for menu item
in frontend
	 *
	 * @var \JDocumentHtml
	 */
	protected $document = null;

	/**
	 * Relative base URI
	 *
	 * @var string
	 */
	protected $relativeRootUri = null;

	/**
	 * Absolute base URI
	 *
	 * @var string
	 */
	protected $rootUri = null;

	/**
	 * Method to instantiate the view.
	 *
	 * @param array $config A named configuration array for object
construction
	 *
	 */
	public function __construct(Container $container, $config = array())
	{
		parent::__construct($container, $config);

		if (isset($config['layout']))
		{
			$this->layout = $config['layout'];
		}

		if (isset($config['paths']))
		{
			$this->paths = $config['paths'];
		}

		if (isset($config['is_admin_view']))
		{
			$this->isAdminView = $config['is_admin_view'];
		}
		else
		{
			$this->isAdminView =
$this->container->app->isClient('administrator');
		}

		if (isset($config['hide_buttons']))
		{
			$this->paths = $config['hide_buttons'];
		}

		$this->Itemid = $this->input->getInt('Itemid', 0);

		// Uris used for link to resources like css, js, images
		$this->relativeRootUri = JUri::root(true) . '/';
		$this->rootUri         = JUri::root();
	}

	/**
	 * Method to display the view
	 */
	public function display()
	{
		echo $this->render();
	}

	/**
	 * Magic toString method that is a proxy for the render method.
	 *
	 * @return string
	 */
	public function __toString()
	{
		return $this->render();
	}

	/**
	 * Method to escape output.
	 *
	 * @param string $output The output to escape.
	 *
	 * @return string The escaped output.
	 */
	public function escape($output)
	{
		return htmlspecialchars($output, ENT_COMPAT, 'UTF-8');
	}

	/**
	 * Method to get the view layout.
	 *
	 * @return string The layout name.
	 */
	public function getLayout()
	{
		return $this->layout;
	}

	/**
	 * Method to get the layout path.
	 *
	 * @param string $layout The layout name.
	 *
	 * @return mixed The layout file name if found, false otherwise.
	 */
	public function getPath($layout)
	{
		$path = '';

		// Try to find the layout file with the following priority order: Device
type, Joomla version, Default Layout
		$filesToFind = array($layout);

		foreach ($filesToFind as $fileLayout)
		{
			$file = JPath::clean($fileLayout . '.php');
			$path = JPath::find($this->paths, $file);

			if ($path)
			{
				break;
			}
		}

		return $path;
	}

	/**
	 * Method to get the view paths.
	 *
	 * @return array The paths queue.
	 *
	 */
	public function getPaths()
	{
		return $this->paths;
	}

	/**
	 * Method to render the view.
	 *
	 * @return string The rendered view.
	 *
	 * @throws \RuntimeException
	 */
	public function render()
	{
		$this->beforeRender();

		// Get the layout path.
		$path = $this->getPath($this->getLayout());

		// Check if the layout path was found.
		if (!$path)
		{
			throw new \RuntimeException('Layout Path Not Found');
		}

		// Start an output buffer.
		ob_start();

		// Load the layout.
		include $path;

		// Get the layout contents.
		return ob_get_clean();
	}

	/**
	 * Load sub-template for the current layout
	 *
	 * @param string $template
	 *
	 * @throws \RuntimeException
	 *
	 * @return string The output of sub-layout
	 */
	public function loadTemplate($template, $data = array())
	{
		// Get the layout path.
		$path = $this->getPath($this->getLayout() . '_' .
$template);

		// Check if the layout path was found.
		if (!$path)
		{
			throw new \RuntimeException('Layout Path Not Found');
		}

		extract($data);

		// Start an output buffer.
		ob_start();

		// Load the layout.
		include $path;

		// Get the layout contents.
		return ob_get_clean();
	}

	/**
	 * Load sub-template for the current layout
	 *
	 * @param string $layout
	 *
	 * @throws \RuntimeException
	 *
	 * @return string The output of sub-layout
	 */
	public function loadCommonLayout($layout, $data = array())
	{
		// Get the layout path.
		$path = $this->getPath($layout);

		// Check if the layout path was found.
		if (!$path)
		{
			throw new \RuntimeException('Layout Path Not Found');
		}

		extract($data);

		// Start an output buffer.
		ob_start();

		// Load the layout.
		include $path;

		// Get the layout contents.
		return ob_get_clean();
	}

	/**
	 * Method to set the view layout.
	 *
	 * @param string $layout The layout name.
	 *
	 * @return HtmlView Method supports chaining.
	 */
	public function setLayout($layout)
	{
		$this->layout = $layout;

		return $this;
	}

	/**
	 * Method to set the view paths.
	 *
	 * @param array $paths The paths queue.
	 *
	 * @return HtmlView Method supports chaining.
	 *
	 */
	public function setPaths($paths)
	{
		$this->paths = $paths;

		return $this;
	}

	/**
	 * Magic get method. Handles magic properties:
	 * $this->document  mapped to $this->container->document
	 *
	 * @param   string $name The property to fetch
	 *
	 * @return  mixed|null
	 */
	public function __get($name)
	{
		$magicProperties = array(
			'document',
			'input',
		);

		if (in_array($name, $magicProperties))
		{
			return $this->container->get($name);
		}
	}

	/**
	 * Child class can use this method to get additional data needed for the
view before it is rendered
	 */
	protected function beforeRender()
	{

	}

	/**
	 * Set document meta data
	 *
	 * @param \Joomla\Registry\Registry $params
	 *
	 * @return void
	 */
	protected function setDocumentMetadata($params)
	{
		/* @var \JDocumentHtml $document */
		$document         = $this->container->document;
		$siteNamePosition =
$this->container->appConfig->get('sitename_pagetitles');
		$siteName         =
$this->container->appConfig->get('sitename');

		if ($pageTitle = $params->get('page_title'))
		{
			if ($siteNamePosition == 0)
			{
				$document->setTitle($pageTitle);
			}
			elseif ($siteNamePosition == 1)
			{
				$document->setTitle($siteName . ' - ' . $pageTitle);
			}
			else
			{
				$document->setTitle($pageTitle . ' - ' . $siteName);
			}
		}

		if ($params->get('menu-meta_keywords'))
		{
			$document->setMetaData('keywords',
$params->get('menu-meta_keywords'));
		}

		if ($params->get('menu-meta_description'))
		{
			$document->setDescription($params->get('menu-meta_description'));
		}

		if ($params->get('robots'))
		{
			$document->setMetaData('robots',
$params->get('robots'));
		}
	}
}PK�c�[
��~
~
View/ItemView.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  View
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\View;

use OSL\Utils\Html as HtmlUtils;
use JHtml, JLanguageHelper, JToolbarHelper, JText;

/**
 * Class ItemView
 *
 * Joomla CMS Item View Class. This class is used to display details
information of an item
 * or display form allow add/editing items
 *
 * @property \OSL\Model\AdminModel $model
 *
 */
class ItemView extends HtmlView
{

	/**
	 * The model state.
	 *
	 * @var \OSL\Model\State
	 */
	protected $state;

	/**
	 * The record which is being added/edited
	 *
	 * @var Object
	 */
	protected $item;

	/**
	 * The array which keeps list of "list" options which will be
displayed on the form
	 *
	 * @var array $lists
	 */
	protected $lists = array();

	/**
	 * Active languages use on the site
	 *
	 * @var array
	 */
	protected $languages = array();

	/**
	 * Method to prepare all the data for the view before it is displayed
	 */
	protected function beforeRender()
	{
		$this->state = $this->model->getState();
		$this->item  = $this->model->getData();

		if (property_exists($this->item, 'published'))
		{
			$this->lists['published'] =
HtmlUtils::getBooleanInput('published',
$this->item->published);
		}

		if (property_exists($this->item, 'access'))
		{
			$this->lists['access'] = JHtml::_('access.level',
'access', $this->item->access,
'class="form-select"', false);
		}

		if (property_exists($this->item, 'language'))
		{
			$this->lists['language'] =
JHtml::_('select.genericlist',
JHtml::_('contentlanguage.existing', true, true),
'language', 'class="form-select"',
'value', 'text', $this->item->language);
		}

		$this->languages = JLanguageHelper::getLanguages();

		if ($this->isAdminView)
		{
			$this->addToolbar();
		}
	}

	/**
	 * Add toolbar buttons for add/edit item form
	 */
	protected function addToolbar()
	{
		$helperClass = $this->container->componentNamespace .
'\\Site\\Helper\\Helper';

		if (is_callable($helperClass . '::getActions'))
		{
			$canDo = call_user_func(array($helperClass, 'getActions'),
$this->name, $this->state);
		}
		else
		{
			$canDo = call_user_func(array('\\OSL\Utils\\Helper',
'getActions'), $this->container->option);
		}

		if ($this->item->id)
		{
			$toolbarTitle = $this->container->languagePrefix . '_' .
$this->name . '_EDIT';
		}
		else
		{
			$toolbarTitle = $this->container->languagePrefix . '_' .
$this->name . '_NEW';
		}

		JToolbarHelper::title(JText::_(strtoupper($toolbarTitle)));

		if (($canDo->get('core.edit') ||
($canDo->get('core.create'))) &&
!in_array('save', $this->hideButtons))
		{
			JToolbarHelper::apply('apply', 'JTOOLBAR_APPLY');
			JToolbarHelper::save('save', 'JTOOLBAR_SAVE');
		}

		if ($canDo->get('core.create') &&
!in_array('save2new', $this->hideButtons))
		{
			JToolbarHelper::custom('save2new', 'save-new.png',
'save-new_f2.png', 'JTOOLBAR_SAVE_AND_NEW', false);
		}

		if ($this->item->id &&
$canDo->get('core.create') &&
!in_array('save2copy', $this->hideButtons))
		{
			JToolbarHelper::save2copy('save2copy');
		}

		if ($this->item->id)
		{
			JToolbarHelper::cancel('cancel', 'JTOOLBAR_CLOSE');
		}
		else
		{
			JToolbarHelper::cancel('cancel',
'JTOOLBAR_CANCEL');
		}
	}
}PK�c�[��ѢView/JsonView.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  View
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\View;

class JsonView extends AbstractView
{

}PK�c�[6����View/ListView.phpnu�[���<?php
/**
 * @package     OSL
 * @subpackage  View
 *
 * @copyright   Copyright (C) 2016 Ossolution Team, Inc. All rights
reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

namespace OSL\View;

use JHtml, JHtmlSidebar,
	JText, JToolbarHelper;

/**
 * Joomla CMS View List class, used to render list of records from
front-end or back-end of your component
 *
 * @package      OSF
 * @subpackage   View
 * @since        1.0
 *
 * @property \OSL\Model\ListModel $model
 */
class ListView extends HtmlView
{
	/**
	 * The model state
	 *
	 * @var \OSL\Model\State
	 */
	protected $state;

	/**
	 * List of records which will be displayed
	 *
	 * @var array
	 */
	protected $items;

	/**
	 * The pagination object
	 *
	 * @var \JPagination
	 */
	protected $pagination;

	/**
	 * The array which keeps list of "list" options which will used
to display as the filter on the list
	 *
	 * @var array $lists
	 */
	protected $lists = array();

	/**
	 * The sidebar
	 *
	 * @var string
	 */
	protected $sidebar = '';

	/**
	 * Prepare the view before it is displayed
	 *
	 */
	protected function beforeRender()
	{
		$this->state      = $this->model->getState();
		$this->items      = $this->model->getData();
		$this->pagination = $this->model->getPagination();

		if ($this->isAdminView)
		{
			$this->lists['filter_state']    =
str_replace('class="inputbox"',
'class="input-medium"',
JHtml::_('grid.state', $this->state->filter_state));
			$this->lists['filter_access']   =
JHtml::_('access.level', 'filter_access',
$this->state->filter_access, 'class="input-medium"
onchange="submit();"', true);
			$this->lists['filter_language'] =
JHtml::_('select.genericlist',
JHtml::_('contentlanguage.existing', true, true),
'filter_language',
				' onchange="submit();" ', 'value',
'text', $this->state->filter_language);

			$helperClass = $this->container->componentNamespace .
'\\Site\\Helper\\Html';

			if (is_callable($helperClass . '::addSubMenus'))
			{
				call_user_func(array($helperClass, 'addSubMenus'),
$this->name);
			}
			else
			{
				\OSL\Utils\Html::addSubMenus($this->container->option,
$this->name);
			}

			if (version_compare(JVERSION, '4.0.0-dev', '<'))
			{
				$this->sidebar = JHtmlSidebar::render();
			}

			$this->addToolbar();
		}
	}

	/**
	 * Method to add toolbar buttons
	 *
	 */
	protected function addToolbar()
	{
		$helperClass = $this->container->componentNamespace .
'\\Site\\Helper\\Helper';

		if (is_callable($helperClass . '::getActions'))
		{
			$canDo = call_user_func(array($helperClass, 'getActions'),
$this->name, $this->state);
		}
		else
		{
			$canDo = call_user_func(array('\\OSL\Utils\\Helper',
'getActions'), $this->container->option);
		}

		$languagePrefix = $this->container->languagePrefix;

		JToolbarHelper::title(JText::_(strtoupper($languagePrefix . '_'
. $this->container->inflector->singularize($this->name) .
'_MANAGEMENT')), 'link ' . $this->name);

		if ($canDo->get('core.create') &&
!in_array('add', $this->hideButtons))
		{
			JToolbarHelper::addNew('add', 'JTOOLBAR_NEW');
		}

		if ($canDo->get('core.edit') &&
isset($this->items[0]) && !in_array('edit',
$this->hideButtons))
		{
			JToolbarHelper::editList('edit', 'JTOOLBAR_EDIT');
		}

		if ($canDo->get('core.delete') &&
isset($this->items[0]) && !in_array('delete',
$this->hideButtons))
		{
			JToolbarHelper::deleteList(JText::_($languagePrefix .
'_DELETE_CONFIRM'), 'delete');
		}

		if ($canDo->get('core.edit.state') &&
!in_array('publish', $this->hideButtons))
		{
			if (isset($this->items[0]->published) ||
isset($this->items[0]->state))
			{
				JToolbarHelper::publish('publish',
'JTOOLBAR_PUBLISH', true);
				JToolbarHelper::unpublish('unpublish',
'JTOOLBAR_UNPUBLISH', true);
			}
		}

		if ($canDo->get('core.admin'))
		{
			JToolbarHelper::preferences($this->container->option);
		}
	}
}PK�c�[���W��Config/Config.phpnu�[���PK�c�[��i^�Container/Container.phpnu�[���PK�c�[�s��66!N*Container/ContainerAwareTrait.phpnu�[���PK�c�[�5b6G)G)�.Controller/AdminController.phpnu�[���PK�c�[A9�k0k0jXController/Controller.phpnu�[���PK�c�[U�B�n
n
�Controller/Download.phpnu�[���PK�c�[Tb!���ӓFactory/Factory.phpnu�[���PK�c�[*>���4�4�Inflector/Inflector.phpnu�[���PK�c�[�'3���%�init.phpnu�[���PK�c�[gu��Input/Input.phpnu�[���PK�c�[e�6�;;Q�Model/AdminModel.phpnu�[���PK�c�[���%�%�&Model/ListModel.phpnu�[���PK�c�[�z[ԯ�tLModel/Model.phpnu�[���PK�c�[}�'�&&bkModel/State.phpnu�[���PK�c�[�$ǂProvider/SystemProvider.phpnu�[���PK�c�[�V�jj�Utils/Database.phpnu�[���PK�c�[�~������Utils/Helper.phpnu�[���PK�c�[�Y���̡Utils/Html.phpnu�[���PK�c�[�.�
	
	��View/AbstractView.phpnu�[���PK�c�[
N���View/CsvView.phpnu�[���PK�c�[��׍ccK�View/HtmlView.phpnu�[���PK�c�[
��~
~
��View/ItemView.phpnu�[���PK�c�[��Ѣ��View/JsonView.phpnu�[���PK�c�[6�����View/ListView.phpnu�[���PK��