add migration to toutpratique
@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"require": {
|
"require": {
|
||||||
"filp/whoops": "^1.1",
|
"filp/whoops": "^1.1",
|
||||||
"potsky/pimp-my-log": "^1.7"
|
"potsky/pimp-my-log": "^1.7",
|
||||||
|
"robmorgan/phinx": "^0.4.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
269
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"hash": "8230cf0ea7cd0dc12c54365f52c1b128",
|
"hash": "e3d6128e6ff6ffe5586c22906e3fe1de",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "filp/whoops",
|
"name": "filp/whoops",
|
||||||
@ -102,6 +102,273 @@
|
|||||||
"description": "Log viewer for your web server",
|
"description": "Log viewer for your web server",
|
||||||
"homepage": "http://pimpmylog.com",
|
"homepage": "http://pimpmylog.com",
|
||||||
"time": "2015-05-27 07:09:41"
|
"time": "2015-05-27 07:09:41"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "robmorgan/phinx",
|
||||||
|
"version": "v0.4.6",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/robmorgan/phinx.git",
|
||||||
|
"reference": "1351ca36dd2419d7de02afd1aaa415929112d7f1"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/robmorgan/phinx/zipball/1351ca36dd2419d7de02afd1aaa415929112d7f1",
|
||||||
|
"reference": "1351ca36dd2419d7de02afd1aaa415929112d7f1",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.2",
|
||||||
|
"symfony/config": "~2.7",
|
||||||
|
"symfony/console": "~2.7",
|
||||||
|
"symfony/yaml": "~2.7"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "3.7.*",
|
||||||
|
"squizlabs/php_codesniffer": "dev-phpcs-fixer"
|
||||||
|
},
|
||||||
|
"bin": [
|
||||||
|
"bin/phinx"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Phinx\\": "src/Phinx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Rob Morgan",
|
||||||
|
"email": "robbym@gmail.com",
|
||||||
|
"homepage": "http://robmorgan.id.au",
|
||||||
|
"role": "Lead Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Woody Gilk",
|
||||||
|
"email": "woody.gilk@gmail.com",
|
||||||
|
"homepage": "http://shadowhand.me",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.",
|
||||||
|
"homepage": "https://phinx.org",
|
||||||
|
"keywords": [
|
||||||
|
"database",
|
||||||
|
"database migrations",
|
||||||
|
"db",
|
||||||
|
"migrations",
|
||||||
|
"phinx"
|
||||||
|
],
|
||||||
|
"time": "2015-09-11 15:44:41"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/config",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/config.git",
|
||||||
|
"reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/config/zipball/9698fdf0a750d6887d5e7729d5cf099765b20e61",
|
||||||
|
"reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9",
|
||||||
|
"symfony/filesystem": "~2.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "~2.7"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Config\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Config Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2015-09-21 15:02:29"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/console",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/console.git",
|
||||||
|
"reference": "06cb17c013a82f94a3d840682b49425cd00a2161"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/console/zipball/06cb17c013a82f94a3d840682b49425cd00a2161",
|
||||||
|
"reference": "06cb17c013a82f94a3d840682b49425cd00a2161",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"psr/log": "~1.0",
|
||||||
|
"symfony/event-dispatcher": "~2.1",
|
||||||
|
"symfony/phpunit-bridge": "~2.7",
|
||||||
|
"symfony/process": "~2.1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"psr/log": "For using the console logger",
|
||||||
|
"symfony/event-dispatcher": "",
|
||||||
|
"symfony/process": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Console\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Console Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2015-09-25 08:32:23"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/filesystem",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/filesystem.git",
|
||||||
|
"reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/filesystem/zipball/a17f8a17c20e8614c15b8e116e2f4bcde102cfab",
|
||||||
|
"reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "~2.7"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Filesystem\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Filesystem Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2015-09-09 17:42:36"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/yaml",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/yaml.git",
|
||||||
|
"reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
|
||||||
|
"reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "~2.7"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Yaml\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Yaml Component",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"time": "2015-09-14 14:14:09"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [],
|
"packages-dev": [],
|
||||||
|
22
migration.php
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
# WINDOWS : vendor/bin/phinx.bat migrate -e local --configuration migration.php
|
||||||
|
# LINUX A TEST php vendor/bin/phinx migrate -e local --configuration migration.php
|
||||||
|
require 'config/settings.inc.php';
|
||||||
|
|
||||||
|
return array(
|
||||||
|
"paths" => array(
|
||||||
|
"migrations" => "migrations"
|
||||||
|
),
|
||||||
|
"environments" => array(
|
||||||
|
"default_migration_table" => "phinxlog",
|
||||||
|
"default_database" => "toutpratique",
|
||||||
|
"local" => array(
|
||||||
|
"adapter" => "mysql",
|
||||||
|
"host" => _DB_SERVER_,
|
||||||
|
"name" => _DB_NAME_,
|
||||||
|
"user" => _DB_USER_,
|
||||||
|
"pass" => _DB_PASSWD_,
|
||||||
|
"port" => 3306
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
46
migrations/20151016095326_my_new_migration.php
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
class MyNewMigration extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* Write your reversible migrations using this method.
|
||||||
|
*
|
||||||
|
* More information on writing migrations is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
|
||||||
|
*
|
||||||
|
* The following commands can be used in this method and Phinx will
|
||||||
|
* automatically reverse them when rolling back:
|
||||||
|
*
|
||||||
|
* createTable
|
||||||
|
* renameTable
|
||||||
|
* addColumn
|
||||||
|
* renameColumn
|
||||||
|
* addIndex
|
||||||
|
* addForeignKey
|
||||||
|
*
|
||||||
|
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||||
|
* with the Table class.
|
||||||
|
*/
|
||||||
|
public function change()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up() {
|
||||||
|
$users = $this->table('users');
|
||||||
|
$users->addColumn('username', 'string', array('limit' => 20))
|
||||||
|
->addColumn('password', 'string', array('limit' => 40))
|
||||||
|
->addColumn('password_salt', 'string', array('limit' => 40))
|
||||||
|
->addColumn('email', 'string', array('limit' => 100))
|
||||||
|
->addColumn('first_name', 'string', array('limit' => 30))
|
||||||
|
->addColumn('last_name', 'string', array('limit' => 30))
|
||||||
|
->addColumn('created', 'datetime')
|
||||||
|
->addColumn('updated', 'datetime', array('null' => true))
|
||||||
|
->addIndex(array('username', 'email'), array('unique' => true))
|
||||||
|
->save();
|
||||||
|
}
|
||||||
|
}
|
34
migrations/20151016095903_customer_migration.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
class CustomerMigration extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* Write your reversible migrations using this method.
|
||||||
|
*
|
||||||
|
* More information on writing migrations is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
|
||||||
|
*
|
||||||
|
* The following commands can be used in this method and Phinx will
|
||||||
|
* automatically reverse them when rolling back:
|
||||||
|
*
|
||||||
|
* createTable
|
||||||
|
* renameTable
|
||||||
|
* addColumn
|
||||||
|
* renameColumn
|
||||||
|
* addIndex
|
||||||
|
* addForeignKey
|
||||||
|
*
|
||||||
|
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||||
|
* with the Table class.
|
||||||
|
*/
|
||||||
|
public function change()
|
||||||
|
{
|
||||||
|
$table = $this->table('ps_customer');
|
||||||
|
$table->addColumn('test', 'integer')
|
||||||
|
->update();
|
||||||
|
}
|
||||||
|
}
|
34
migrations/20151016102101_customer2_migration.php
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
class Customer2Migration extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* Write your reversible migrations using this method.
|
||||||
|
*
|
||||||
|
* More information on writing migrations is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
|
||||||
|
*
|
||||||
|
* The following commands can be used in this method and Phinx will
|
||||||
|
* automatically reverse them when rolling back:
|
||||||
|
*
|
||||||
|
* createTable
|
||||||
|
* renameTable
|
||||||
|
* addColumn
|
||||||
|
* renameColumn
|
||||||
|
* addIndex
|
||||||
|
* addForeignKey
|
||||||
|
*
|
||||||
|
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||||
|
* with the Table class.
|
||||||
|
*/
|
||||||
|
public function change()
|
||||||
|
{
|
||||||
|
$table = $this->table('ps_customer');
|
||||||
|
$table->addColumn('testmigration', 'integer')
|
||||||
|
->update();
|
||||||
|
}
|
||||||
|
}
|
35
migrations/20151016102502_customertest_migration.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Phinx\Migration\AbstractMigration;
|
||||||
|
|
||||||
|
class CustomertestMigration extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Change Method.
|
||||||
|
*
|
||||||
|
* Write your reversible migrations using this method.
|
||||||
|
*
|
||||||
|
* More information on writing migrations is available here:
|
||||||
|
* http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
|
||||||
|
*
|
||||||
|
* The following commands can be used in this method and Phinx will
|
||||||
|
* automatically reverse them when rolling back:
|
||||||
|
*
|
||||||
|
* createTable
|
||||||
|
* renameTable
|
||||||
|
* addColumn
|
||||||
|
* renameColumn
|
||||||
|
* addIndex
|
||||||
|
* addForeignKey
|
||||||
|
*
|
||||||
|
* Remember to call "create()" or "update()" and NOT "save()" when working
|
||||||
|
* with the Table class.
|
||||||
|
*/
|
||||||
|
public function change()
|
||||||
|
{
|
||||||
|
$table = $this->table('ps_customer');
|
||||||
|
$table->addColumn('autochange', 'integer')
|
||||||
|
->update();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
32
phinx.yml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
paths:
|
||||||
|
migrations: %%PHINX_CONFIG_DIR%%/migrations
|
||||||
|
|
||||||
|
environments:
|
||||||
|
default_migration_table: phinxlog
|
||||||
|
default_database: development
|
||||||
|
production:
|
||||||
|
adapter: mysql
|
||||||
|
host: 192.168.0.41
|
||||||
|
name: toutpratiquefdsfds
|
||||||
|
user: root
|
||||||
|
pass: ''
|
||||||
|
port: 3306
|
||||||
|
charset: utf8
|
||||||
|
|
||||||
|
development:
|
||||||
|
adapter: mysql
|
||||||
|
host: 192.168.0.41
|
||||||
|
name: toutpratique_devfdsfds
|
||||||
|
user: root
|
||||||
|
pass: ''
|
||||||
|
port: 3306
|
||||||
|
charset: utf8
|
||||||
|
|
||||||
|
testing:
|
||||||
|
adapter: mysql
|
||||||
|
host: localhost
|
||||||
|
name: testing_db
|
||||||
|
user: root
|
||||||
|
pass: ''
|
||||||
|
port: 3306
|
||||||
|
charset: utf8
|
7
vendor/bin/phinx
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
SRC_DIR="`pwd`"
|
||||||
|
cd "`dirname "$0"`"
|
||||||
|
cd "../robmorgan/phinx/bin"
|
||||||
|
BIN_TARGET="`pwd`/phinx"
|
||||||
|
cd "$SRC_DIR"
|
||||||
|
"$BIN_TARGET" "$@"
|
3
vendor/bin/phinx.bat
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
SET BIN_TARGET=%~dp0/../robmorgan/phinx/bin/phinx
|
||||||
|
php "%BIN_TARGET%" %*
|
5
vendor/composer/autoload_psr4.php
vendored
@ -6,4 +6,9 @@ $vendorDir = dirname(dirname(__FILE__));
|
|||||||
$baseDir = dirname($vendorDir);
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
|
||||||
|
'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
|
||||||
|
'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
|
||||||
|
'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
|
||||||
|
'Phinx\\' => array($vendorDir . '/robmorgan/phinx/src/Phinx'),
|
||||||
);
|
);
|
||||||
|
318
vendor/composer/installed.json
vendored
@ -58,5 +58,323 @@
|
|||||||
"whoops",
|
"whoops",
|
||||||
"zf2"
|
"zf2"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/yaml",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"version_normalized": "2.7.5.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/yaml.git",
|
||||||
|
"reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/yaml/zipball/31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
|
||||||
|
"reference": "31cb2ad0155c95b88ee55fe12bc7ff92232c1770",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "~2.7"
|
||||||
|
},
|
||||||
|
"time": "2015-09-14 14:14:09",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Yaml\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Yaml Component",
|
||||||
|
"homepage": "https://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/filesystem",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"version_normalized": "2.7.5.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/filesystem.git",
|
||||||
|
"reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/filesystem/zipball/a17f8a17c20e8614c15b8e116e2f4bcde102cfab",
|
||||||
|
"reference": "a17f8a17c20e8614c15b8e116e2f4bcde102cfab",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "~2.7"
|
||||||
|
},
|
||||||
|
"time": "2015-09-09 17:42:36",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Filesystem\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Filesystem Component",
|
||||||
|
"homepage": "https://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/config",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"version_normalized": "2.7.5.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/config.git",
|
||||||
|
"reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/config/zipball/9698fdf0a750d6887d5e7729d5cf099765b20e61",
|
||||||
|
"reference": "9698fdf0a750d6887d5e7729d5cf099765b20e61",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9",
|
||||||
|
"symfony/filesystem": "~2.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/phpunit-bridge": "~2.7"
|
||||||
|
},
|
||||||
|
"time": "2015-09-21 15:02:29",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Config\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Config Component",
|
||||||
|
"homepage": "https://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/console",
|
||||||
|
"version": "v2.7.5",
|
||||||
|
"version_normalized": "2.7.5.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/console.git",
|
||||||
|
"reference": "06cb17c013a82f94a3d840682b49425cd00a2161"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/console/zipball/06cb17c013a82f94a3d840682b49425cd00a2161",
|
||||||
|
"reference": "06cb17c013a82f94a3d840682b49425cd00a2161",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.9"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"psr/log": "~1.0",
|
||||||
|
"symfony/event-dispatcher": "~2.1",
|
||||||
|
"symfony/phpunit-bridge": "~2.7",
|
||||||
|
"symfony/process": "~2.1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"psr/log": "For using the console logger",
|
||||||
|
"symfony/event-dispatcher": "",
|
||||||
|
"symfony/process": ""
|
||||||
|
},
|
||||||
|
"time": "2015-09-25 08:32:23",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.7-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Console\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Console Component",
|
||||||
|
"homepage": "https://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "robmorgan/phinx",
|
||||||
|
"version": "v0.4.6",
|
||||||
|
"version_normalized": "0.4.6.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/robmorgan/phinx.git",
|
||||||
|
"reference": "1351ca36dd2419d7de02afd1aaa415929112d7f1"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/robmorgan/phinx/zipball/1351ca36dd2419d7de02afd1aaa415929112d7f1",
|
||||||
|
"reference": "1351ca36dd2419d7de02afd1aaa415929112d7f1",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.2",
|
||||||
|
"symfony/config": "~2.7",
|
||||||
|
"symfony/console": "~2.7",
|
||||||
|
"symfony/yaml": "~2.7"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "3.7.*",
|
||||||
|
"squizlabs/php_codesniffer": "dev-phpcs-fixer"
|
||||||
|
},
|
||||||
|
"time": "2015-09-11 15:44:41",
|
||||||
|
"bin": [
|
||||||
|
"bin/phinx"
|
||||||
|
],
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Phinx\\": "src/Phinx"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Rob Morgan",
|
||||||
|
"email": "robbym@gmail.com",
|
||||||
|
"homepage": "http://robmorgan.id.au",
|
||||||
|
"role": "Lead Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Woody Gilk",
|
||||||
|
"email": "woody.gilk@gmail.com",
|
||||||
|
"homepage": "http://shadowhand.me",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.",
|
||||||
|
"homepage": "https://phinx.org",
|
||||||
|
"keywords": [
|
||||||
|
"database",
|
||||||
|
"database migrations",
|
||||||
|
"db",
|
||||||
|
"migrations",
|
||||||
|
"phinx"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "potsky/pimp-my-log",
|
||||||
|
"version": "1.7.9",
|
||||||
|
"version_normalized": "1.7.9.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/potsky/PimpMyLog.git",
|
||||||
|
"reference": "22f448c9aaf8115663536aaef410b5eb9152d950"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/potsky/PimpMyLog/zipball/22f448c9aaf8115663536aaef410b5eb9152d950",
|
||||||
|
"reference": "22f448c9aaf8115663536aaef410b5eb9152d950",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.2.0"
|
||||||
|
},
|
||||||
|
"time": "2015-05-27 07:09:41",
|
||||||
|
"type": "project",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"GPL-3.0+"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Potsky",
|
||||||
|
"email": "potsky@me.com",
|
||||||
|
"homepage": "http://www.potsky.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Cassio Santos",
|
||||||
|
"homepage": "http://www.cassiosantos.com",
|
||||||
|
"role": "Translator (pt_BR)"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Log viewer for your web server",
|
||||||
|
"homepage": "http://pimpmylog.com"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
36
vendor/potsky/pimp-my-log/.gitignore
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
# Folder view configuration files
|
||||||
|
.DS_Store
|
||||||
|
Desktop.ini
|
||||||
|
._*
|
||||||
|
Thumbs.db
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# Files that might appear on external disks
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
|
||||||
|
# Branch master old
|
||||||
|
/config.inc.php
|
||||||
|
/config.inc.php.tmp
|
||||||
|
|
||||||
|
# Branch master
|
||||||
|
/inc/test.REMOVE_UPPERCASE.php
|
||||||
|
*.user.php
|
||||||
|
*.user.css
|
||||||
|
*.user.json
|
||||||
|
*.user.json.tmp
|
||||||
|
/config.user.d/*
|
||||||
|
|
||||||
|
# Branch jekyll
|
||||||
|
/_site
|
||||||
|
/_build
|
||||||
|
/_tmp
|
||||||
|
/dist
|
||||||
|
|
||||||
|
# Compiled Python files
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Application specific files
|
||||||
|
/node_modules
|
||||||
|
/bower_components
|
||||||
|
/Gemfile.lock
|
12
vendor/potsky/pimp-my-log/README.md
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Pimp my Log
|
||||||
|
===========
|
||||||
|
|
||||||
|
[![Latest Stable Version](https://poser.pugx.org/potsky/pimp-my-log/v/stable.svg)](https://packagist.org/packages/potsky/pimp-my-log) [![Build Status](https://travis-ci.org/potsky/PimpMyLog.svg)](https://travis-ci.org/potsky/PimpMyLog)
|
||||||
|
|
||||||
|
All informations are available on [pimpmylog.com](http://pimpmylog.com).
|
||||||
|
|
||||||
|
Please **do not open issues on GitHub**, this is for dev only.
|
||||||
|
Support, FAQ, knowledge base, ... are on [support.pimpmylog.com](http://support.pimpmylog.com).
|
||||||
|
|
||||||
|
Please star this repository to support *Pimp My Log* !
|
||||||
|
|
187
vendor/potsky/pimp-my-log/cfg/apache.config.php
vendored
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function apache_load_software() {
|
||||||
|
return array(
|
||||||
|
'name' => __('Apache'),
|
||||||
|
'desc' => __('Apache Hypertext Transfer Protocol Server'),
|
||||||
|
'home' => __('http://httpd.apache.org'),
|
||||||
|
'notes' => __('All versions 2.x are supported.'),
|
||||||
|
'load' => ( stripos( $_SERVER["SERVER_SOFTWARE"] , 'Apache' ) !== false )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
You must escape anti-slash 4 times and escape $ in regex.
|
||||||
|
(Two for PHP and finally two for json)
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
function apache_get_config( $type , $file , $software , $counter ) {
|
||||||
|
|
||||||
|
$file_json_encoded = json_encode( $file );
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
// Apache error files are not the same on 2.2 and 2.4 //
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
if ( $type == 'error' ) {
|
||||||
|
|
||||||
|
// Write a line of log and try to guess the format
|
||||||
|
$remain = 10;
|
||||||
|
$test = 0;
|
||||||
|
error_log( 'Pimp my Log has been successfully configured with Apache' );
|
||||||
|
foreach ( LogParser::getLinesFromBottom( $file , 10 ) as $line ) {
|
||||||
|
$test = @preg_match('|^\[(.*) (.*) (.*) (.*):(.*):(.*)\.(.*) (.*)\] \[(.*):(.*)\] \[pid (.*)\] .*\[client (.*):(.*)\] (.*)(, referer: (.*))*$|U', $line );
|
||||||
|
if ( $test === 1 ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$remain--;
|
||||||
|
if ($remain<=0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/////////////////////
|
||||||
|
// Error 2.4 style //
|
||||||
|
/////////////////////
|
||||||
|
if ( $test === 1 ) {
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "Apache Error #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 5,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : true,
|
||||||
|
"format" : {
|
||||||
|
"type" : "HTTPD 2.4",
|
||||||
|
"regex" : "|^\\\\[(.*) (.*) (.*) (.*):(.*):(.*)\\\\.(.*) (.*)\\\\] \\\\[(.*):(.*)\\\\] \\\\[pid (.*)\\\\] .*\\\\[client (.*):(.*)\\\\] (.*)(, referer: (.*))*\$|U",
|
||||||
|
"export_title" : "Log",
|
||||||
|
"match" : {
|
||||||
|
"Date" : {
|
||||||
|
"M" : 2,
|
||||||
|
"d" : 3,
|
||||||
|
"H" : 4,
|
||||||
|
"i" : 5,
|
||||||
|
"s" : 6,
|
||||||
|
"Y" : 8
|
||||||
|
},
|
||||||
|
"IP" : 12,
|
||||||
|
"Log" : 14,
|
||||||
|
"Severity" : 10,
|
||||||
|
"Referer" : 16
|
||||||
|
},
|
||||||
|
"types": {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:http",
|
||||||
|
"Log" : "preformatted",
|
||||||
|
"Severity" : "badge:severity",
|
||||||
|
"Referer" : "link"
|
||||||
|
},
|
||||||
|
"exclude": {
|
||||||
|
"Log": ["\/PHP Stack trace:\/", "\/PHP *[0-9]*\\\\. \/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////
|
||||||
|
// Error 2.2 style //
|
||||||
|
/////////////////////
|
||||||
|
else {
|
||||||
|
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "Apache Error #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 5,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : true,
|
||||||
|
"format" : {
|
||||||
|
"type" : "HTTPD 2.2",
|
||||||
|
"regex" : "|^\\\\[(.*)\\\\] \\\\[(.*)\\\\] (\\\\[client (.*)\\\\] )*((?!\\\\[client ).*)(, referer: (.*))*\$|U",
|
||||||
|
"export_title" : "Log",
|
||||||
|
"match" : {
|
||||||
|
"Date" : 1,
|
||||||
|
"IP" : 4,
|
||||||
|
"Log" : 5,
|
||||||
|
"Severity" : 2,
|
||||||
|
"Referer" : 7
|
||||||
|
},
|
||||||
|
"types": {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:http",
|
||||||
|
"Log" : "preformatted",
|
||||||
|
"Severity" : "badge:severity",
|
||||||
|
"Referer" : "link"
|
||||||
|
},
|
||||||
|
"exclude": {
|
||||||
|
"Log": ["\/PHP Stack trace:\/", "\/PHP *[0-9]*\\\\. \/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// Access log //
|
||||||
|
////////////////
|
||||||
|
else if ( $type == 'access' ) {
|
||||||
|
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "Apache Access #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 0,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : false,
|
||||||
|
"format" : {
|
||||||
|
"type" : "NCSA",
|
||||||
|
"regex" : "|^((\\\\S*) )*(\\\\S*) (\\\\S*) (\\\\S*) \\\\[(.*)\\\\] \"(\\\\S*) (.*) (\\\\S*)\" ([0-9]*) (.*)( \\"(.*)\\" \\"(.*)\\"( [0-9]*/([0-9]*))*)*\$|U",
|
||||||
|
"export_title" : "URL",
|
||||||
|
"match" : {
|
||||||
|
"Date" : 6,
|
||||||
|
"IP" : 3,
|
||||||
|
"CMD" : 7,
|
||||||
|
"URL" : 8,
|
||||||
|
"Code" : 10,
|
||||||
|
"Size" : 11,
|
||||||
|
"Referer" : 13,
|
||||||
|
"UA" : 14,
|
||||||
|
"User" : 5,
|
||||||
|
"\u03bcs" : 16
|
||||||
|
},
|
||||||
|
"types": {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:geo",
|
||||||
|
"URL" : "txt",
|
||||||
|
"Code" : "badge:http",
|
||||||
|
"Size" : "numeral:0b",
|
||||||
|
"Referer" : "link",
|
||||||
|
"UA" : "ua:{os.name} {os.version} | {browser.name} {browser.version}\/100",
|
||||||
|
"\u03bcs" : "numeral:0,0"
|
||||||
|
},
|
||||||
|
"exclude": {
|
||||||
|
"URL": ["\/favicon.ico\/", "\/\\\\.pml\\\\.php.*\$\/"],
|
||||||
|
"CMD": ["\/OPTIONS\/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
55
vendor/potsky/pimp-my-log/cfg/apache.paths.php
vendored
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possible paths where log files could be found
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
$paths = array(
|
||||||
|
'/var/log/',
|
||||||
|
'/var/log/apache/',
|
||||||
|
'/var/log/apache2/',
|
||||||
|
'/var/log/httpd/',
|
||||||
|
'/usr/local/var/log/apache/',
|
||||||
|
'/usr/local/var/log/apache2/',
|
||||||
|
'/usr/local/var/log/httpd/',
|
||||||
|
'/opt/local/apache/logs/',
|
||||||
|
'/opt/local/apache2/logs/',
|
||||||
|
'/opt/local/httpd/logs/',
|
||||||
|
'C:/wamp/logs/',
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possibles files for each type of log
|
||||||
|
*
|
||||||
|
* All files will be tried in all possibles paths above
|
||||||
|
*
|
||||||
|
* The order is important because it will be the order of log files for users.
|
||||||
|
* eg: I want error log be the first because most users want to see error and not access logs
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
$files = array(
|
||||||
|
'error' => array(
|
||||||
|
'error.log',
|
||||||
|
'error_log',
|
||||||
|
'apache_error.log',
|
||||||
|
),
|
||||||
|
'access' => array(
|
||||||
|
'access.log',
|
||||||
|
'access_log',
|
||||||
|
'apache.log',
|
||||||
|
'apache_access.log',
|
||||||
|
),
|
||||||
|
);
|
139
vendor/potsky/pimp-my-log/cfg/config.example.php
vendored
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php if(realpath(__FILE__)===realpath($_SERVER["SCRIPT_FILENAME"])){header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');die();}?>
|
||||||
|
{
|
||||||
|
"globals": {
|
||||||
|
"_remove_me_to_set_AUTH_LOG_FILE_COUNT" : 100,
|
||||||
|
"_remove_me_to_set_AUTO_UPGRADE" : false,
|
||||||
|
"_remove_me_to_set_CHECK_UPGRADE" : true,
|
||||||
|
"_remove_me_to_set_EXPORT" : true,
|
||||||
|
"_remove_me_to_set_FILE_SELECTOR" : "bs",
|
||||||
|
"_remove_me_to_set_FOOTER" : "© <a href=\"http:\/\/www.potsky.com\" target=\"doc\">Potsky<\/a> 2007-' . YEAR . ' - <a href=\"http:\/\/pimpmylog.com\" target=\"doc\">Pimp my Log<\/a>",
|
||||||
|
"_remove_me_to_set_FORGOTTEN_YOUR_PASSWORD_URL" : "http:\/\/support.pimpmylog.com\/kb\/misc\/forgotten-your-password",
|
||||||
|
"_remove_me_to_set_GEOIP_URL" : "http:\/\/www.geoiptool.com\/en\/?IP=%p",
|
||||||
|
"_remove_me_to_set_GOOGLE_ANALYTICS" : "UA-XXXXX-X",
|
||||||
|
"_remove_me_to_set_HELP_URL" : "http:\/\/pimpmylog.com",
|
||||||
|
"_remove_me_to_set_LOCALE" : "gb_GB",
|
||||||
|
"_remove_me_to_set_LOGS_MAX" : 50,
|
||||||
|
"_remove_me_to_set_LOGS_REFRESH" : 0,
|
||||||
|
"_remove_me_to_set_MAX_SEARCH_LOG_TIME" : 5,
|
||||||
|
"_remove_me_to_set_NAV_TITLE" : "",
|
||||||
|
"_remove_me_to_set_NOTIFICATION" : true,
|
||||||
|
"_remove_me_to_set_NOTIFICATION_TITLE" : "New logs [%f]",
|
||||||
|
"_remove_me_to_set_PIMPMYLOG_ISSUE_LINK" : "https:\/\/github.com\/potsky\/PimpMyLog\/issues\/",
|
||||||
|
"_remove_me_to_set_PIMPMYLOG_VERSION_URL" : "http:\/\/demo.pimpmylog.com\/version.js",
|
||||||
|
"_remove_me_to_set_PULL_TO_REFRESH" : true,
|
||||||
|
"_remove_me_to_set_SORT_LOG_FILES" : "default",
|
||||||
|
"_remove_me_to_set_TAG_DISPLAY_LOG_FILES_COUNT" : true,
|
||||||
|
"_remove_me_to_set_TAG_NOT_TAGGED_FILES_ON_TOP" : true,
|
||||||
|
"_remove_me_to_set_TAG_SORT_TAG" : "default | display-asc | display-insensitive | display-desc | display-insensitive-desc",
|
||||||
|
"_remove_me_to_set_TITLE" : "Pimp my Log",
|
||||||
|
"_remove_me_to_set_TITLE_FILE" : "Pimp my Log [%f]",
|
||||||
|
"_remove_me_to_set_UPGRADE_MANUALLY_URL" : "http:\/\/pimpmylog.com\/getting-started\/#update",
|
||||||
|
"_remove_me_to_set_USER_CONFIGURATION_DIR" : "config.user.d",
|
||||||
|
"_remove_me_to_set_USER_TIME_ZONE" : "Europe\/Paris"
|
||||||
|
},
|
||||||
|
|
||||||
|
"badges": {
|
||||||
|
"severity": {
|
||||||
|
"debug" : "success",
|
||||||
|
"info" : "success",
|
||||||
|
"notice" : "default",
|
||||||
|
"Notice" : "info",
|
||||||
|
"warn" : "warning",
|
||||||
|
"error" : "danger",
|
||||||
|
"crit" : "danger",
|
||||||
|
"alert" : "danger",
|
||||||
|
"emerg" : "danger",
|
||||||
|
"Notice" : "info",
|
||||||
|
"Fatal error" : "danger",
|
||||||
|
"Parse error" : "danger",
|
||||||
|
"Warning" : "warning"
|
||||||
|
},
|
||||||
|
"http": {
|
||||||
|
"1" : "info",
|
||||||
|
"2" : "success",
|
||||||
|
"3" : "default",
|
||||||
|
"4" : "warning",
|
||||||
|
"5" : "danger"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"files": {
|
||||||
|
"apache1": {
|
||||||
|
"display" : "Apache Error #1",
|
||||||
|
"path" : "\/opt\/local\/apache2\/logs\/error_log",
|
||||||
|
"refresh" : 5,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : true,
|
||||||
|
"multiline" : "",
|
||||||
|
"format" : {
|
||||||
|
"regex" : "|^\\[(.*)\\] \\[(.*)\\] (\\[client (.*)\\] )*((?!\\[client ).*)(, referer: (.*))*$|U",
|
||||||
|
"export_title" : "Log",
|
||||||
|
"match" : {
|
||||||
|
"Date" : 1,
|
||||||
|
"IP" : 4,
|
||||||
|
"Log" : 5,
|
||||||
|
"Severity" : 2,
|
||||||
|
"Referer" : 7
|
||||||
|
},
|
||||||
|
"types": {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:http",
|
||||||
|
"Log" : "pre",
|
||||||
|
"Severity" : "badge:severity",
|
||||||
|
"Referer" : "link"
|
||||||
|
},
|
||||||
|
"exclude": {
|
||||||
|
"Log": ["\/PHP Stack trace:\/", "\/PHP *[0-9]*\\. \/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"apache2": {
|
||||||
|
"display" : "Apache Access #2",
|
||||||
|
"path" : "\/opt\/local\/apache2\/logs\/access_log",
|
||||||
|
"refresh" : 0,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : false,
|
||||||
|
"multiline" : "",
|
||||||
|
"format" : {
|
||||||
|
"regex" : " |^(.*) (.*) (.*) \\[(.*)\\] \"(.*) (.*) (.*)\" ([0-9]*) (.*) \"(.*)\" \"(.*)\"( [0-9]*\/([0-9]*))*$|U",
|
||||||
|
"export_title" : "URL",
|
||||||
|
"match" : {
|
||||||
|
"Date" : 4,
|
||||||
|
"IP" : 1,
|
||||||
|
"CMD" : 5,
|
||||||
|
"URL" : 6,
|
||||||
|
"Code" : 8,
|
||||||
|
"Size" : 9,
|
||||||
|
"Referer" : 10,
|
||||||
|
"UA" : 11,
|
||||||
|
"User" : 3,
|
||||||
|
"\u03bcs" : 13
|
||||||
|
},
|
||||||
|
"types": {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:geo",
|
||||||
|
"URL" : "txt",
|
||||||
|
"Code" : "badge:http",
|
||||||
|
"Size" : "numeral:0b",
|
||||||
|
"Referer" : "link",
|
||||||
|
"UA" : "ua:{os.name} {os.version} | {browser.name} {browser.version}\/100",
|
||||||
|
"\u03bcs" : "numeral:0,0"
|
||||||
|
},
|
||||||
|
"exclude": {
|
||||||
|
"URL": ["\/favicon.ico\/", "\/\\.pml\\.php.*$\/"],
|
||||||
|
"CMD": ["\/OPTIONS\/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
247
vendor/potsky/pimp-my-log/cfg/iis.config.php
vendored
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
function iis_load_software() {
|
||||||
|
return array(
|
||||||
|
'name' => __('IIS'),
|
||||||
|
'desc' => __('A flexible & easy-to-manage web server...'),
|
||||||
|
'home' => __('http://www.iis.net'),
|
||||||
|
'notes' => __('NCSA, IIS and W3C log formats are supported'),
|
||||||
|
'load' => ( stripos( $_SERVER["SERVER_SOFTWARE"] , 'iis' ) !== false )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function iis_get_config( $type , $file , $software , $counter ) {
|
||||||
|
|
||||||
|
$file_json_encoded = json_encode( $file );
|
||||||
|
|
||||||
|
// Type W3C
|
||||||
|
//
|
||||||
|
$ufields = array();
|
||||||
|
$handle = @fopen( $file , "r" );
|
||||||
|
if ( $handle ) {
|
||||||
|
while ( ! feof( $handle ) ) {
|
||||||
|
$buffer = fgets($handle);
|
||||||
|
if ( substr( $buffer , 0 , 9 ) == '#Fields: ' ) {
|
||||||
|
$ufields = explode( ' ' , substr( $buffer , 9 ) );
|
||||||
|
if ( count( $ufields ) > 0 ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose($handle);
|
||||||
|
}
|
||||||
|
if ( count( $ufields ) > 0 ) {
|
||||||
|
$regex = array();
|
||||||
|
$types = array();
|
||||||
|
$match = array(
|
||||||
|
'Date' => false,
|
||||||
|
'IP' => false,
|
||||||
|
'Site' => false,
|
||||||
|
'CMD' => false,
|
||||||
|
'URL' => false,
|
||||||
|
'QS' => false,
|
||||||
|
'Code' => false,
|
||||||
|
'Size' => false,
|
||||||
|
'Referer' => false,
|
||||||
|
'UA' => false,
|
||||||
|
'User' => false,
|
||||||
|
'ms' => false,
|
||||||
|
);
|
||||||
|
$types = array(
|
||||||
|
'Date' => "date:H:i:s",
|
||||||
|
'Site' => 'txt',
|
||||||
|
'CMD' => 'txt',
|
||||||
|
'URL' => 'txt',
|
||||||
|
'QS' => 'txt',
|
||||||
|
'User' => 'txt',
|
||||||
|
'IP' => "ip:geo",
|
||||||
|
'UA' => "uaw3c:{os.name} {os.version} | {browser.name} {browser.version}/100",
|
||||||
|
'Referer' => "link",
|
||||||
|
'Code' => "badge:http",
|
||||||
|
'Size' => "numeral:0b",
|
||||||
|
'ms' => "numeral:0,0"
|
||||||
|
);
|
||||||
|
$fields = array(
|
||||||
|
'date' => 'Date',
|
||||||
|
'time' => 'Date',
|
||||||
|
's-sitename' => 'Site',
|
||||||
|
// 's-computername' => 0,
|
||||||
|
// 's-ip' => 0,
|
||||||
|
'cs-method' => 'CMD',
|
||||||
|
'cs-uri-stem' => 'URL',
|
||||||
|
'cs-uri-query' => 'QS',
|
||||||
|
// 's-port' => 0,
|
||||||
|
'cs-username' => 'User',
|
||||||
|
'c-ip' => 'IP',
|
||||||
|
// 'cs-version' => 0,
|
||||||
|
'cs(User-Agent)' => 'UA',
|
||||||
|
// 'cs(Cookie)' => 0,
|
||||||
|
'cs(Referer)' => 'Referer',
|
||||||
|
// 'cs-host' => 0,
|
||||||
|
'sc-status' => 'Code',
|
||||||
|
// 'sc-substatus' => 0,
|
||||||
|
// 'sc-win32-status' => 0,
|
||||||
|
'sc-bytes' => 'Size',
|
||||||
|
// 'cs-bytes' => 0,
|
||||||
|
'time-taken' => 'ms',
|
||||||
|
);
|
||||||
|
|
||||||
|
$position = 1;
|
||||||
|
|
||||||
|
foreach ( $ufields as $field ) {
|
||||||
|
$regex[] = '(.*)';
|
||||||
|
$field = trim($field);
|
||||||
|
if ( isset( $fields[ $field ] ) ) {
|
||||||
|
$thismatch = $fields[ $field ];
|
||||||
|
|
||||||
|
if ( array_key_exists( $thismatch , $match ) ) {
|
||||||
|
if ( $match[ $thismatch ] === false ) {
|
||||||
|
$match[ $thismatch ] = $position;
|
||||||
|
} else if ( is_array( $match[ $thismatch ] ) ) {
|
||||||
|
$match[ $thismatch ][] = $position;
|
||||||
|
$match[ $thismatch ][] = ' ';
|
||||||
|
} else {
|
||||||
|
$save = $match[ $thismatch ];
|
||||||
|
$match[ $thismatch ] = array( $save , ' ' , $position , ' ' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$position++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$match = array_filter( $match );
|
||||||
|
$regex = '|^' . implode( ' ' , $regex ) . '$|U';
|
||||||
|
|
||||||
|
$regex_json_encoded = json_encode( $regex );
|
||||||
|
$match_json_encoded = json_encode( $match );
|
||||||
|
$types_json_encoded = json_encode( $types );
|
||||||
|
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "IIS Access #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 0,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : false,
|
||||||
|
"format" : {
|
||||||
|
"type" : "W3C Extended",
|
||||||
|
"regex" : $regex_json_encoded,
|
||||||
|
"export_title" : "URL",
|
||||||
|
"match" : $match_json_encoded,
|
||||||
|
"types" : $types_json_encoded,
|
||||||
|
"exclude" : {
|
||||||
|
"URL": ["\/favicon.ico\/", "\/\\\\.pml\\\\.php\\\\.*\$\/"],
|
||||||
|
"CMD": ["\/OPTIONS\/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Type IIS
|
||||||
|
//
|
||||||
|
$handle = @fopen( $file , 'r' );
|
||||||
|
$remain = 10;
|
||||||
|
$test = 0;
|
||||||
|
if ( $handle ) {
|
||||||
|
while ( ( $buffer = fgets( $handle , 4096 ) ) !== false ) {
|
||||||
|
$test = @preg_match('|^(.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*),(.*)$|U', $buffer );
|
||||||
|
if ( $test === 1 ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$remain--;
|
||||||
|
if ($remain<=0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose($handle);
|
||||||
|
}
|
||||||
|
if ( $test === 1 ) {
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "IIS Access #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 0,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : false,
|
||||||
|
"format" : {
|
||||||
|
"type" : "IIS",
|
||||||
|
"regex" : "|^(.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*), (.*),(.*)\$|U",
|
||||||
|
"export_title" : "URL",
|
||||||
|
"match" : {
|
||||||
|
"Date" : [3," ",4],
|
||||||
|
"IP" : 1,
|
||||||
|
"Site" : 5,
|
||||||
|
"CMD" : 13,
|
||||||
|
"URL" : 14,
|
||||||
|
"Code" : 11,
|
||||||
|
"Size" : 10,
|
||||||
|
"User" : 2,
|
||||||
|
"ms" : 8
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:geo",
|
||||||
|
"URL" : "txt",
|
||||||
|
"Code" : "badge:http",
|
||||||
|
"Size" : "numeral:0b",
|
||||||
|
"ms" : "numeral:0,0"
|
||||||
|
},
|
||||||
|
"exclude" : {
|
||||||
|
"URL": ["\/favicon.ico\/", "\/\\\\.pml\\\\.php\\\\.*\$\/"],
|
||||||
|
"CMD": ["\/OPTIONS\/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Type NCSA
|
||||||
|
//
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "IIS Access #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 0,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : false,
|
||||||
|
"format" : {
|
||||||
|
"type" : "NCSA Common",
|
||||||
|
"regex" : "|^((\\\\S*) )*(\\\\S*) (\\\\S*) (\\\\S*) \\\\[(.*)\\\\] \"(\\\\S*) (.*) (\\\\S*)\" ([0-9]*) (.*)( \\"(.*)\\" \\"(.*)\\"( [0-9]*/([0-9]*))*)*\$|U",
|
||||||
|
"export_title" : "URL",
|
||||||
|
"match" : {
|
||||||
|
"Date" : 6,
|
||||||
|
"IP" : 3,
|
||||||
|
"CMD" : 7,
|
||||||
|
"URL" : 8,
|
||||||
|
"Code" : 10,
|
||||||
|
"Size" : 11,
|
||||||
|
"User" : 5
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:geo",
|
||||||
|
"URL" : "txt",
|
||||||
|
"Code" : "badge:http",
|
||||||
|
"Size" : "numeral:0b"
|
||||||
|
},
|
||||||
|
"exclude" : {
|
||||||
|
"URL": ["\/favicon.ico\/", "\/\\\\.pml\\\\.php\\\\.*\$\/"],
|
||||||
|
"CMD": ["\/OPTIONS\/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
|
||||||
|
}
|
39
vendor/potsky/pimp-my-log/cfg/iis.paths.php
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possible paths where log files could be found
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
$paths = array(
|
||||||
|
'C:\\inetpub\\logs\\LogFiles\\W3SVC*\\',
|
||||||
|
'C:\\WINDOWS\\system32\\LogFiles\\W3SVC*\\',
|
||||||
|
'C:\\WINNT\\system32\\LogFiles\\W3SVC*\\',
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possibles files for each type of log
|
||||||
|
*
|
||||||
|
* All files will be tried in all possibles paths above
|
||||||
|
*
|
||||||
|
* The order is important because it will be the order of log files for users.
|
||||||
|
* eg: I want error log be the first because most users want to see error and not access logs
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
$files = array(
|
||||||
|
'access' => array(
|
||||||
|
'*.log'
|
||||||
|
),
|
||||||
|
);
|
118
vendor/potsky/pimp-my-log/cfg/nginx.config.php
vendored
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
function nginx_load_software() {
|
||||||
|
return array(
|
||||||
|
'name' => __('NGINX'),
|
||||||
|
'desc' => __('The high performance reverse proxy, load balancer, edge cache, origin server'),
|
||||||
|
'home' => __('http://nginx.com'),
|
||||||
|
'notes' => __('Default log formats are supported'),
|
||||||
|
'load' => ( stripos( $_SERVER["SERVER_SOFTWARE"] , 'nginx' ) !== false )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function nginx_get_config( $type , $file , $software , $counter ) {
|
||||||
|
|
||||||
|
$file_json_encoded = json_encode( $file );
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
// nginx error files are not the same on 2.2 and 2.4 //
|
||||||
|
/////////////////////////////////////////////////////////
|
||||||
|
if ( $type == 'error' ) {
|
||||||
|
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "NGINX Error #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 5,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : true,
|
||||||
|
"format" : {
|
||||||
|
"type" : "NGINX",
|
||||||
|
"regex" : "@^(.*)/(.*)/(.*) (.*):(.*):(.*) \\\\[(.*)\\\\] [0-9#]*: \\\\*[0-9]+ (((.*), client: (.*), server: (.*), request: \"(.*) (.*) HTTP.*\", host: \"(.*)\"(, referrer: \"(.*)\")*)|(.*))\$@U",
|
||||||
|
"export_title" : "Error",
|
||||||
|
"match" : {
|
||||||
|
"Date" : [1,"\/",2,"\/",3," ",4,":",5,":",6],
|
||||||
|
"Severity" : 7,
|
||||||
|
"Error" : [10,18],
|
||||||
|
"Client" : 11,
|
||||||
|
"Server" : 12,
|
||||||
|
"Method" : 13,
|
||||||
|
"Request" : 14,
|
||||||
|
"Host" : 15,
|
||||||
|
"Referer" : 17
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"Date" : "date:d\/m\/Y H:i:s \/100",
|
||||||
|
"Severity" : "badge:severity",
|
||||||
|
"Error" : "pre",
|
||||||
|
"Client" : "ip:http",
|
||||||
|
"Server" : "txt",
|
||||||
|
"Method" : "txt",
|
||||||
|
"Request" : "txt",
|
||||||
|
"Host" : "ip:http",
|
||||||
|
"Referer" : "link"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// Access log //
|
||||||
|
////////////////
|
||||||
|
else if ( $type == 'access' ) {
|
||||||
|
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "NGINX Access #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 0,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : false,
|
||||||
|
"format" : {
|
||||||
|
"type" : "NCSA Extended",
|
||||||
|
"regex" : "|^((\\\\S*) )*(\\\\S*) (\\\\S*) (\\\\S*) \\\\[(.*)\\\\] \"(\\\\S*) (.*) (\\\\S*)\" ([0-9]*) (.*)( \\"(.*)\\" \\"(.*)\\"( [0-9]*/([0-9]*))*)*\$|U",
|
||||||
|
"export_title" : "URL",
|
||||||
|
"match" : {
|
||||||
|
"Date" : 6,
|
||||||
|
"IP" : 3,
|
||||||
|
"CMD" : 7,
|
||||||
|
"URL" : 8,
|
||||||
|
"Code" : 10,
|
||||||
|
"Size" : 11,
|
||||||
|
"Referer" : 13,
|
||||||
|
"UA" : 14,
|
||||||
|
"User" : 5
|
||||||
|
},
|
||||||
|
"types": {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"IP" : "ip:geo",
|
||||||
|
"URL" : "txt",
|
||||||
|
"Code" : "badge:http",
|
||||||
|
"Size" : "numeral:0b",
|
||||||
|
"Referer" : "link",
|
||||||
|
"UA" : "ua:{os.name} {os.version} | {browser.name} {browser.version}\/100"
|
||||||
|
},
|
||||||
|
"exclude": {
|
||||||
|
"URL": ["\/favicon.ico\/", "\/\\\\.pml\\\\.php\\\\.*\$\/"],
|
||||||
|
"CMD": ["\/OPTIONS\/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
42
vendor/potsky/pimp-my-log/cfg/nginx.paths.php
vendored
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possible paths where log files could be found
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
$paths = array(
|
||||||
|
'/var/log/nginx/',
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All possibles files for each type of log
|
||||||
|
*
|
||||||
|
* All files will be tried in all possibles paths above
|
||||||
|
*
|
||||||
|
* The order is important because it will be the order of log files for users.
|
||||||
|
* eg: I want error log be the first because most users want to see error and not access logs
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
$files = array(
|
||||||
|
'error' => array(
|
||||||
|
'error.log',
|
||||||
|
'error_log',
|
||||||
|
),
|
||||||
|
'access' => array(
|
||||||
|
'access.log',
|
||||||
|
'access_log',
|
||||||
|
),
|
||||||
|
);
|
71
vendor/potsky/pimp-my-log/cfg/php.config.php
vendored
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
function php_load_software() {
|
||||||
|
$path = ( SAFE_MODE === true ) ? '' : ini_get('error_log');
|
||||||
|
if ( $path !== '' ) {
|
||||||
|
return array(
|
||||||
|
'name' => __('PHP'),
|
||||||
|
'desc' => __('PHP'),
|
||||||
|
'home' => __('http://www.php.net/manual/errorfunc.configuration.php#ini.error-log' ),
|
||||||
|
'notes' => __('PHP logs defined via the <code>error_log</code> ini parameter.' ) . ' ' .
|
||||||
|
sprintf( __('Pimp My Log has detected <code>%s</code> on your server.' ) , $path ),
|
||||||
|
'load' => true,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return array(
|
||||||
|
'name' => __('PHP'),
|
||||||
|
'desc' => __('PHP'),
|
||||||
|
'home' => __('http://www.php.net/manual/errorfunc.configuration.php#ini.error-log'),
|
||||||
|
'notes' => __('Pimp My Log has not detected any path in the ini parameter <code>error_log</code>.') . ' ' .
|
||||||
|
__('Activate this software only if you use <code>ini_set(\'error_log\')</code> directly in your scripts for example.'),
|
||||||
|
'load' => false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function php_get_config( $type , $file , $software , $counter ) {
|
||||||
|
|
||||||
|
$file_json_encoded = json_encode( $file );
|
||||||
|
|
||||||
|
return<<<EOF
|
||||||
|
"$software$counter": {
|
||||||
|
"display" : "PHP Error #$counter",
|
||||||
|
"path" : $file_json_encoded,
|
||||||
|
"refresh" : 5,
|
||||||
|
"max" : 10,
|
||||||
|
"notify" : true,
|
||||||
|
"format" : {
|
||||||
|
"type" : "PHP",
|
||||||
|
"regex" : "@^\\\\[(.*)-(.*)-(.*) (.*):(.*):(.*)( (.*))*\\\\] ((PHP (.*): (.*) in (.*) on line (.*))|(.*))\$@U",
|
||||||
|
"export_title" : "Error",
|
||||||
|
"match" : {
|
||||||
|
"Date" : [ 2 , " " , 1 , " " , 4 , ":" , 5 , ":" , 6 , " " , 3 ],
|
||||||
|
"Severity" : 11,
|
||||||
|
"Error" : [ 12 , 15 ],
|
||||||
|
"File" : 13,
|
||||||
|
"Line" : 14
|
||||||
|
},
|
||||||
|
"types" : {
|
||||||
|
"Date" : "date:H:i:s",
|
||||||
|
"Severity" : "badge:severity",
|
||||||
|
"File" : "pre:\/-69",
|
||||||
|
"Line" : "numeral",
|
||||||
|
"Error" : "pre"
|
||||||
|
},
|
||||||
|
"exclude": {
|
||||||
|
"Log": ["\\\\/PHP Stack trace:\\\\/", "\\\\/PHP *[0-9]*\\\\. \\\\/"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF;
|
||||||
|
}
|
24
vendor/potsky/pimp-my-log/cfg/php.paths.php
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$paths = array();
|
||||||
|
$files = array(
|
||||||
|
'error' => array(
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$path = ( SAFE_MODE === true ) ? '' : ini_get('error_log');
|
||||||
|
|
||||||
|
if ( $path !== '' ) {
|
||||||
|
$paths[] = dirname( $path ) . DIRECTORY_SEPARATOR ;
|
||||||
|
$files['error'][] = basename( $path );
|
||||||
|
}
|
73
vendor/potsky/pimp-my-log/cfg/pimpmylog.config.php
vendored
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php if(realpath(__FILE__)===realpath($_SERVER["SCRIPT_FILENAME"])){header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');die();}?>
|
||||||
|
{
|
||||||
|
"globals": {
|
||||||
|
"_remove_me_to_set_AUTH_LOG_FILE_COUNT" : 100,
|
||||||
|
"_remove_me_to_set_AUTO_UPGRADE" : false,
|
||||||
|
"_remove_me_to_set_CHECK_UPGRADE" : true,
|
||||||
|
"_remove_me_to_set_EXPORT" : true,
|
||||||
|
"_remove_me_to_set_FILE_SELECTOR" : "bs",
|
||||||
|
"_remove_me_to_set_FOOTER" : "© <a href=\"http:\/\/www.potsky.com\" target=\"doc\">Potsky<\/a> 2007-' . YEAR . ' - <a href=\"http:\/\/pimpmylog.com\" target=\"doc\">Pimp my Log<\/a>",
|
||||||
|
"_remove_me_to_set_FORGOTTEN_YOUR_PASSWORD_URL" : "http:\/\/support.pimpmylog.com\/kb\/misc\/forgotten-your-password",
|
||||||
|
"_remove_me_to_set_GEOIP_URL" : "http:\/\/www.geoiptool.com\/en\/?IP=%p",
|
||||||
|
"_remove_me_to_set_GOOGLE_ANALYTICS" : "UA-XXXXX-X",
|
||||||
|
"_remove_me_to_set_HELP_URL" : "http:\/\/pimpmylog.com",
|
||||||
|
"_remove_me_to_set_LOCALE" : "gb_GB",
|
||||||
|
"_remove_me_to_set_LOGS_MAX" : 50,
|
||||||
|
"_remove_me_to_set_LOGS_REFRESH" : 0,
|
||||||
|
"_remove_me_to_set_MAX_SEARCH_LOG_TIME" : 5,
|
||||||
|
"_remove_me_to_set_NAV_TITLE" : "",
|
||||||
|
"_remove_me_to_set_NOTIFICATION" : true,
|
||||||
|
"_remove_me_to_set_NOTIFICATION_TITLE" : "New logs [%f]",
|
||||||
|
"_remove_me_to_set_PIMPMYLOG_ISSUE_LINK" : "https:\/\/github.com\/potsky\/PimpMyLog\/issues\/",
|
||||||
|
"_remove_me_to_set_PIMPMYLOG_VERSION_URL" : "http:\/\/demo.pimpmylog.com\/version.js",
|
||||||
|
"_remove_me_to_set_PULL_TO_REFRESH" : true,
|
||||||
|
"_remove_me_to_set_SORT_LOG_FILES" : "default",
|
||||||
|
"_remove_me_to_set_TAG_DISPLAY_LOG_FILES_COUNT" : true,
|
||||||
|
"_remove_me_to_set_TAG_NOT_TAGGED_FILES_ON_TOP" : true,
|
||||||
|
"_remove_me_to_set_TAG_SORT_TAG" : "default | display-asc | display-insensitive | display-desc | display-insensitive-desc",
|
||||||
|
"_remove_me_to_set_TITLE" : "Pimp my Log",
|
||||||
|
"_remove_me_to_set_TITLE_FILE" : "Pimp my Log [%f]",
|
||||||
|
"_remove_me_to_set_UPGRADE_MANUALLY_URL" : "http:\/\/pimpmylog.com\/getting-started\/#update",
|
||||||
|
"_remove_me_to_set_USER_CONFIGURATION_DIR" : "config.user.d",
|
||||||
|
"_remove_me_to_set_USER_TIME_ZONE" : "Europe\/Paris"
|
||||||
|
},
|
||||||
|
|
||||||
|
"badges": {
|
||||||
|
"severity": {
|
||||||
|
"debug" : "success",
|
||||||
|
"info" : "success",
|
||||||
|
"notice" : "default",
|
||||||
|
"Notice" : "info",
|
||||||
|
"warn" : "warning",
|
||||||
|
"error" : "danger",
|
||||||
|
"crit" : "danger",
|
||||||
|
"alert" : "danger",
|
||||||
|
"emerg" : "danger",
|
||||||
|
"Notice" : "info",
|
||||||
|
"fatal error" : "danger",
|
||||||
|
"parse error" : "danger",
|
||||||
|
"Warning" : "warning"
|
||||||
|
},
|
||||||
|
"http": {
|
||||||
|
"1" : "info",
|
||||||
|
"2" : "success",
|
||||||
|
"3" : "default",
|
||||||
|
"4" : "warning",
|
||||||
|
"5" : "danger"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"files": {
|
||||||
|
"FILES":"FILES"
|
||||||
|
}
|
||||||
|
}
|
48
vendor/potsky/pimp-my-log/cfg/softwares.inc.php
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
$softwares_list = array( 'apache' , 'iis' , 'nginx' , 'php' );
|
||||||
|
$softwares_all = array();
|
||||||
|
|
||||||
|
foreach ( $softwares_list as $sfw ) {
|
||||||
|
$config_file = '../cfg/' . $sfw . '.config.php';
|
||||||
|
include_once( $config_file );
|
||||||
|
$loader = $sfw . '_load_software';
|
||||||
|
if ( function_exists( $loader ) ) {
|
||||||
|
$cfg = call_user_func( $loader );
|
||||||
|
if ( is_array( $cfg ) ) {
|
||||||
|
$softwares_all[ $sfw ] = $cfg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
You can add your own softwares in file software.user.inc.php, it will not be erased on update (git pull).
|
||||||
|
Just add a new software like this :
|
||||||
|
|
||||||
|
$softwares_all[ 'my_software' ] = array(
|
||||||
|
'name' => __('My Super Software'),
|
||||||
|
'desc' => __('My Super Software build with love for you users which are installing Pimp my Log !'),
|
||||||
|
'home' => __('http://www.example.com'),
|
||||||
|
'note' => __('All versions 2.x are supported but 1.x too in fact.'),
|
||||||
|
);
|
||||||
|
|
||||||
|
Just modify an existing software like this :
|
||||||
|
$softwares_all[ 'apache' ][ 'name' ] = 'Apache HTTPD';
|
||||||
|
|
||||||
|
You have to add these files too :
|
||||||
|
- my_software.config.user.php (which defines function my_software_get_config)
|
||||||
|
- my_software.paths.user.php
|
||||||
|
*/
|
||||||
|
if ( file_exists( '../cfg/softwares.inc.user.php' ) ) {
|
||||||
|
include_once '../cfg/softwares.inc.user.php';
|
||||||
|
}
|
29
vendor/potsky/pimp-my-log/composer.json
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"name" : "potsky/pimp-my-log",
|
||||||
|
"description" : "Log viewer for your web server",
|
||||||
|
"version" : "1.7.9",
|
||||||
|
"license" : "GPL-3.0+",
|
||||||
|
"type" : "project",
|
||||||
|
"homepage" : "http://pimpmylog.com",
|
||||||
|
"support": {
|
||||||
|
"email" : "support@pimpmylog.com",
|
||||||
|
"issues" : "http://support.pimpmylog.com/discussion/new",
|
||||||
|
"source" : "https://github.com/potsky/PimpMyLog"
|
||||||
|
},
|
||||||
|
"authors" : [
|
||||||
|
{
|
||||||
|
"name" : "Potsky",
|
||||||
|
"email" : "potsky@me.com",
|
||||||
|
"homepage" : "http://www.potsky.com",
|
||||||
|
"role" : "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name" : "Cassio Santos",
|
||||||
|
"homepage" : "http://www.cassiosantos.com",
|
||||||
|
"role" : "Translator (pt_BR)"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require" : {
|
||||||
|
"php" : ">=5.2.0"
|
||||||
|
}
|
||||||
|
}
|
106
vendor/potsky/pimp-my-log/css/config.inc.css
vendored
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
This stylesheet is located at /css/config.inc.css
|
||||||
|
Your stylesheet will be loaded instead of this one if you create a file located at /css/config.inc.user.css
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* For logs table header */
|
||||||
|
.logs th {
|
||||||
|
text-align : center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For all logs table cells */
|
||||||
|
.logs td {
|
||||||
|
font-size : 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Specific to cell types */
|
||||||
|
.pml-pre,
|
||||||
|
.pml-preformatted,
|
||||||
|
.pml-txt,
|
||||||
|
.pml-link {
|
||||||
|
font-size : 0.8em;
|
||||||
|
white-space : pre-wrap;
|
||||||
|
-ms-word-break : break-all;
|
||||||
|
word-break : break-all;
|
||||||
|
word-break : break-word;
|
||||||
|
-webkit-hyphens : auto;
|
||||||
|
-moz-hyphens : auto;
|
||||||
|
hyphens : auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-pre, .pml-prefake, .pml-preformatted {
|
||||||
|
font-family : 'ubuntu_monoregular', monospace, serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-numeral {
|
||||||
|
font-size : 0.8em;
|
||||||
|
text-align : right;
|
||||||
|
white-space : nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.pml-badge {
|
||||||
|
font-size : 0.9em;
|
||||||
|
text-align : center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Specific to column */
|
||||||
|
.pml-CMD {
|
||||||
|
white-space :nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-Severity {
|
||||||
|
font-size : 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-Code {
|
||||||
|
text-align : center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-Referer {
|
||||||
|
min-width : 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-UA {
|
||||||
|
font-size : 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-URL {
|
||||||
|
font-size : 0.8em;
|
||||||
|
-ms-word-break : break-all;
|
||||||
|
word-break : break-all;
|
||||||
|
word-break : break-word;
|
||||||
|
-webkit-hyphens : auto;
|
||||||
|
-moz-hyphens : auto;
|
||||||
|
hyphens : auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pml-User {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* New log color on the row */
|
||||||
|
.newlog td:first-child {
|
||||||
|
background-position : 0 0;
|
||||||
|
background-image : url(../img/1x1pink_low.gif);
|
||||||
|
background-size : 1px 100%;
|
||||||
|
background-repeat : no-repeat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Marker colors when you click on a date field */
|
||||||
|
td.pml-date {
|
||||||
|
cursor:pointer;
|
||||||
|
}
|
||||||
|
tr:nth-child(odd) td.marker { background-color : #efef00!important; }
|
||||||
|
tr:nth-child(even) td.marker { background-color : #ffff00!important; }
|
||||||
|
tr:nth-child(odd):hover td.marker { background-color : #e8e800!important; }
|
||||||
|
tr:nth-child(even):hover td.marker { background-color : #f8f800!important; }
|
||||||
|
|
BIN
vendor/potsky/pimp-my-log/css/hook-bg.png
vendored
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
vendor/potsky/pimp-my-log/css/hook-bgs.png
vendored
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
vendor/potsky/pimp-my-log/css/hook-spinner.gif
vendored
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
vendor/potsky/pimp-my-log/css/hook-spinner.png
vendored
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
vendor/potsky/pimp-my-log/css/hook-spinner@2x.png
vendored
Normal file
After Width: | Height: | Size: 2.1 KiB |
39
vendor/potsky/pimp-my-log/css/pml.min.css
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/fonts/bootstrap/glyphicons-halflings-regular.eot
vendored
Normal file
229
vendor/potsky/pimp-my-log/fonts/bootstrap/glyphicons-halflings-regular.svg
vendored
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata></metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
|
||||||
|
<font-face units-per-em="1200" ascent="960" descent="-240" />
|
||||||
|
<missing-glyph horiz-adv-x="500" />
|
||||||
|
<glyph />
|
||||||
|
<glyph />
|
||||||
|
<glyph unicode="
" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
|
||||||
|
<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode=" " horiz-adv-x="652" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1304" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="652" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1304" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="434" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="326" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="217" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="217" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="163" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="72" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="260" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="326" />
|
||||||
|
<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
|
||||||
|
<glyph unicode="−" d="M200 400h900v300h-900v-300z" />
|
||||||
|
<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
|
||||||
|
<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
|
||||||
|
<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
|
||||||
|
<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
|
||||||
|
<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
|
||||||
|
<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
|
||||||
|
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
|
||||||
|
<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
|
||||||
|
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
|
||||||
|
<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
|
||||||
|
<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
|
||||||
|
<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
|
||||||
|
<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
|
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
|
<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
|
<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
|
||||||
|
<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
|
||||||
|
<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
|
||||||
|
<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
|
||||||
|
<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
|
||||||
|
<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
|
||||||
|
<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
|
||||||
|
<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
|
||||||
|
<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
|
||||||
|
<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
|
||||||
|
<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
|
||||||
|
<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
|
||||||
|
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
|
||||||
|
<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
|
||||||
|
<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
|
||||||
|
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
|
||||||
|
<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
|
||||||
|
<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
|
||||||
|
<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
|
||||||
|
<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
|
||||||
|
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
|
||||||
|
<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
|
||||||
|
<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
|
||||||
|
<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
|
||||||
|
<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
|
||||||
|
<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
|
||||||
|
<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
|
||||||
|
<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
|
||||||
|
<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
|
||||||
|
<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
|
||||||
|
<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
|
||||||
|
<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
|
||||||
|
<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
|
||||||
|
<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
|
||||||
|
<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
|
||||||
|
<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
|
||||||
|
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
||||||
|
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
|
||||||
|
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
|
||||||
|
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
|
||||||
|
<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
|
||||||
|
<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
|
||||||
|
<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
|
||||||
|
<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
|
||||||
|
<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
|
||||||
|
<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
|
||||||
|
<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
|
||||||
|
<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
|
||||||
|
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
|
||||||
|
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
|
||||||
|
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
|
||||||
|
<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
|
||||||
|
<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
|
<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
|
||||||
|
<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
|
||||||
|
<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" />
|
||||||
|
<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
||||||
|
<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
|
||||||
|
<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
|
||||||
|
<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
|
||||||
|
<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
|
||||||
|
<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
|
||||||
|
<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
|
||||||
|
<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
|
||||||
|
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
|
||||||
|
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
|
||||||
|
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
|
||||||
|
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
|
||||||
|
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
|
||||||
|
<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
|
||||||
|
<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
|
||||||
|
<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" />
|
||||||
|
<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
|
||||||
|
<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
|
||||||
|
<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" />
|
||||||
|
<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
|
||||||
|
<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
|
||||||
|
<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
|
||||||
|
<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
|
||||||
|
<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
|
||||||
|
<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
|
||||||
|
<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
|
||||||
|
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
|
||||||
|
<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
|
||||||
|
<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
|
||||||
|
<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
|
||||||
|
<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
|
||||||
|
<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
|
||||||
|
<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
|
||||||
|
<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
|
||||||
|
<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
|
||||||
|
<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
|
||||||
|
<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
|
||||||
|
<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
|
||||||
|
<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
|
||||||
|
<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
|
||||||
|
<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
|
||||||
|
<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
|
||||||
|
<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
|
||||||
|
<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
|
||||||
|
<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
|
||||||
|
<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
|
||||||
|
<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
|
||||||
|
<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
|
||||||
|
<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
|
||||||
|
<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
|
||||||
|
<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
|
||||||
|
<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
|
||||||
|
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
|
||||||
|
<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
|
||||||
|
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
|
||||||
|
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
|
||||||
|
<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
|
||||||
|
<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
|
||||||
|
<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
|
||||||
|
<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
|
||||||
|
<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
|
||||||
|
<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
|
||||||
|
<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
|
||||||
|
<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
|
||||||
|
<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
|
||||||
|
<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
|
||||||
|
<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
|
||||||
|
<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
|
||||||
|
<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
|
||||||
|
<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
|
||||||
|
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
|
||||||
|
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
|
||||||
|
<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
|
||||||
|
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
|
||||||
|
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
|
||||||
|
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
|
||||||
|
<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
|
||||||
|
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
|
||||||
|
<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
|
||||||
|
<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
|
||||||
|
<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
|
||||||
|
<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
|
||||||
|
<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
|
||||||
|
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
|
||||||
|
<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
|
||||||
|
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
|
||||||
|
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
|
||||||
|
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
|
||||||
|
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
|
||||||
|
<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
|
||||||
|
<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
|
||||||
|
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
|
||||||
|
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
|
||||||
|
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
|
||||||
|
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
|
||||||
|
<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
|
||||||
|
<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
|
||||||
|
<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
|
||||||
|
<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
|
||||||
|
<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
|
||||||
|
<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
|
||||||
|
<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
|
||||||
|
<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
|
||||||
|
<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
|
||||||
|
<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
|
||||||
|
<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
|
||||||
|
<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
|
||||||
|
<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
|
||||||
|
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
|
||||||
|
<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
|
||||||
|
<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
|
||||||
|
<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
After Width: | Height: | Size: 62 KiB |
BIN
vendor/potsky/pimp-my-log/fonts/bootstrap/glyphicons-halflings-regular.ttf
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/fonts/bootstrap/glyphicons-halflings-regular.woff
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/fonts/ubuntu-l-webfont.eot
vendored
Normal file
1207
vendor/potsky/pimp-my-log/fonts/ubuntu-l-webfont.svg
vendored
Normal file
After Width: | Height: | Size: 121 KiB |
BIN
vendor/potsky/pimp-my-log/fonts/ubuntu-l-webfont.ttf
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/fonts/ubuntu-l-webfont.woff
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/fonts/ubuntu-l-webfont.woff2
vendored
Normal file
614
vendor/potsky/pimp-my-log/fonts/ubuntumono-r-demo.html
vendored
Normal file
@ -0,0 +1,614 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<script src="specimen_files/easytabs.js" type="text/javascript" charset="utf-8"></script>
|
||||||
|
<link rel="stylesheet" href="specimen_files/specimen_stylesheet.css" type="text/css" charset="utf-8" />
|
||||||
|
<link rel="stylesheet" href="stylesheet.css" type="text/css" charset="utf-8" />
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
body{
|
||||||
|
font-family: 'ubuntu_monoregular';
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<title>Ubuntu Mono Regular Specimen</title>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
$(document).ready(function() {
|
||||||
|
$('#container').easyTabs({defaultContent:1});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
<div id="header">
|
||||||
|
Ubuntu Mono Regular </div>
|
||||||
|
<ul class="tabs">
|
||||||
|
<li><a href="#specimen">Specimen</a></li>
|
||||||
|
<li><a href="#layout">Sample Layout</a></li>
|
||||||
|
<li><a href="#glyphs">Glyphs & Languages</a></li>
|
||||||
|
<li><a href="#installing">Installing Webfonts</a></li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<div id="main_content">
|
||||||
|
|
||||||
|
|
||||||
|
<div id="specimen">
|
||||||
|
|
||||||
|
<div class="section">
|
||||||
|
<div class="grid12 firstcol">
|
||||||
|
<div class="huge">AaBb</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section">
|
||||||
|
<div class="glyph_range">A​B​C​D​E​F​G​H​I​J​K​L​M​N​O​P​Q​R​S​T​U​V​W​X​Y​Z​a​b​c​d​e​f​g​h​i​j​k​l​m​n​o​p​q​r​s​t​u​v​w​x​y​z​1​2​3​4​5​6​7​8​9​0​&​.​,​?​!​@​(​)​#​$​%​*​+​-​=​:​;</div>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="grid12 firstcol">
|
||||||
|
<table class="sample_table">
|
||||||
|
<tr><td>10</td><td class="size10">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>11</td><td class="size11">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>12</td><td class="size12">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>13</td><td class="size13">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>14</td><td class="size14">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>16</td><td class="size16">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>18</td><td class="size18">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>20</td><td class="size20">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>24</td><td class="size24">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>30</td><td class="size30">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>36</td><td class="size36">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>48</td><td class="size48">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>60</td><td class="size60">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>72</td><td class="size72">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
<tr><td>90</td><td class="size90">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="section" id="bodycomparison">
|
||||||
|
|
||||||
|
|
||||||
|
<div id="xheight">
|
||||||
|
<div class="fontbody">◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼◼body</div><div class="arialbody">body</div><div class="verdanabody">body</div><div class="georgiabody">body</div></div>
|
||||||
|
<div class="fontbody" style="z-index:1">
|
||||||
|
body<span>Ubuntu Mono Regular</span>
|
||||||
|
</div>
|
||||||
|
<div class="arialbody" style="z-index:1">
|
||||||
|
body<span>Arial</span>
|
||||||
|
</div>
|
||||||
|
<div class="verdanabody" style="z-index:1">
|
||||||
|
body<span>Verdana</span>
|
||||||
|
</div>
|
||||||
|
<div class="georgiabody" style="z-index:1">
|
||||||
|
body<span>Georgia</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="section psample psample_row1" id="">
|
||||||
|
|
||||||
|
<div class="grid2 firstcol">
|
||||||
|
<p class="size10"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid3">
|
||||||
|
<p class="size11"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid3">
|
||||||
|
<p class="size12"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid4">
|
||||||
|
<p class="size13"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="white_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="section psample psample_row2" id="">
|
||||||
|
<div class="grid3 firstcol">
|
||||||
|
<p class="size14"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid4">
|
||||||
|
<p class="size16"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid5">
|
||||||
|
<p class="size18"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="white_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section psample psample_row3" id="">
|
||||||
|
<div class="grid5 firstcol">
|
||||||
|
<p class="size20"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid7">
|
||||||
|
<p class="size24"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="white_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section psample psample_row4" id="">
|
||||||
|
<div class="grid12 firstcol">
|
||||||
|
<p class="size30"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
</div>
|
||||||
|
<div class="white_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="section psample psample_row1 fullreverse">
|
||||||
|
<div class="grid2 firstcol">
|
||||||
|
<p class="size10"><span>10.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid3">
|
||||||
|
<p class="size11"><span>11.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid3">
|
||||||
|
<p class="size12"><span>12.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid4">
|
||||||
|
<p class="size13"><span>13.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="black_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section psample psample_row2 fullreverse">
|
||||||
|
<div class="grid3 firstcol">
|
||||||
|
<p class="size14"><span>14.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid4">
|
||||||
|
<p class="size16"><span>16.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="grid5">
|
||||||
|
<p class="size18"><span>18.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="black_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section psample fullreverse psample_row3" id="">
|
||||||
|
<div class="grid5 firstcol">
|
||||||
|
<p class="size20"><span>20.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
</div>
|
||||||
|
<div class="grid7">
|
||||||
|
<p class="size24"><span>24.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="black_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="section psample fullreverse psample_row4" id="" style="border-bottom: 20px #000 solid;">
|
||||||
|
<div class="grid12 firstcol">
|
||||||
|
<p class="size30"><span>30.</span>Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.</p>
|
||||||
|
</div>
|
||||||
|
<div class="black_blend"></div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="layout">
|
||||||
|
|
||||||
|
<div class="section">
|
||||||
|
|
||||||
|
<div class="grid12 firstcol">
|
||||||
|
<h1>Lorem Ipsum Dolor</h1>
|
||||||
|
<h2>Etiam porta sem malesuada magna mollis euismod</h2>
|
||||||
|
|
||||||
|
<p class="byline">By <a href="#link">Aenean Lacinia</a></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<div class="grid8 firstcol">
|
||||||
|
<p class="large">Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Pellentesque ornare sem</h3>
|
||||||
|
|
||||||
|
<p>Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit. </p>
|
||||||
|
|
||||||
|
<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. </p>
|
||||||
|
|
||||||
|
<p>Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur. </p>
|
||||||
|
|
||||||
|
<p>Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla. </p>
|
||||||
|
|
||||||
|
<h3>Cras mattis consectetur</h3>
|
||||||
|
|
||||||
|
<p>Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum. </p>
|
||||||
|
|
||||||
|
<p>Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid4 sidebar">
|
||||||
|
|
||||||
|
<div class="box reverse">
|
||||||
|
<p class="last">Nullam quis risus eget urna mollis ornare vel eu leo. Donec ullamcorper nulla non metus auctor fringilla. Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="caption">Maecenas sed diam eget risus varius.</p>
|
||||||
|
|
||||||
|
<p>Vestibulum id ligula porta felis euismod semper. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Vestibulum id ligula porta felis euismod semper. Sed posuere consectetur est at lobortis. Maecenas sed diam eget risus varius blandit sit amet non magna. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Aenean lacinia bibendum nulla sed consectetur. Nullam quis risus eget urna mollis ornare vel eu leo. </p>
|
||||||
|
|
||||||
|
<p>Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Donec ullamcorper nulla non metus auctor fringilla. Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. </p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div id="glyphs">
|
||||||
|
<div class="section">
|
||||||
|
<div class="grid12 firstcol">
|
||||||
|
|
||||||
|
<h1>Language Support</h1>
|
||||||
|
<p>The subset of Ubuntu Mono Regular in this kit supports the following languages:<br />
|
||||||
|
|
||||||
|
Albanian, Basque, Breton, Chamorro, Danish, Dutch, English, Faroese, Finnish, French, Frisian, Galician, German, Icelandic, Italian, Malagasy, Norwegian, Portuguese, Spanish, Swedish </p>
|
||||||
|
<h1>Glyph Chart</h1>
|
||||||
|
<p>The subset of Ubuntu Mono Regular in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.</p>
|
||||||
|
<div id="glyph_chart">
|
||||||
|
|
||||||
|
<div><p>&#29;</p></div>
|
||||||
|
<div><p>&#13;</p> </div>
|
||||||
|
<div><p>&#29;</p></div>
|
||||||
|
<div><p>&#32;</p> </div>
|
||||||
|
<div><p>&#33;</p>!</div>
|
||||||
|
<div><p>&#34;</p>"</div>
|
||||||
|
<div><p>&#35;</p>#</div>
|
||||||
|
<div><p>&#36;</p>$</div>
|
||||||
|
<div><p>&#37;</p>%</div>
|
||||||
|
<div><p>&#38;</p>&</div>
|
||||||
|
<div><p>&#39;</p>'</div>
|
||||||
|
<div><p>&#40;</p>(</div>
|
||||||
|
<div><p>&#41;</p>)</div>
|
||||||
|
<div><p>&#42;</p>*</div>
|
||||||
|
<div><p>&#43;</p>+</div>
|
||||||
|
<div><p>&#44;</p>,</div>
|
||||||
|
<div><p>&#45;</p>-</div>
|
||||||
|
<div><p>&#46;</p>.</div>
|
||||||
|
<div><p>&#47;</p>/</div>
|
||||||
|
<div><p>&#48;</p>0</div>
|
||||||
|
<div><p>&#49;</p>1</div>
|
||||||
|
<div><p>&#50;</p>2</div>
|
||||||
|
<div><p>&#51;</p>3</div>
|
||||||
|
<div><p>&#52;</p>4</div>
|
||||||
|
<div><p>&#53;</p>5</div>
|
||||||
|
<div><p>&#54;</p>6</div>
|
||||||
|
<div><p>&#55;</p>7</div>
|
||||||
|
<div><p>&#56;</p>8</div>
|
||||||
|
<div><p>&#57;</p>9</div>
|
||||||
|
<div><p>&#58;</p>:</div>
|
||||||
|
<div><p>&#59;</p>;</div>
|
||||||
|
<div><p>&#60;</p><</div>
|
||||||
|
<div><p>&#61;</p>=</div>
|
||||||
|
<div><p>&#62;</p>></div>
|
||||||
|
<div><p>&#63;</p>?</div>
|
||||||
|
<div><p>&#64;</p>@</div>
|
||||||
|
<div><p>&#65;</p>A</div>
|
||||||
|
<div><p>&#66;</p>B</div>
|
||||||
|
<div><p>&#67;</p>C</div>
|
||||||
|
<div><p>&#68;</p>D</div>
|
||||||
|
<div><p>&#69;</p>E</div>
|
||||||
|
<div><p>&#70;</p>F</div>
|
||||||
|
<div><p>&#71;</p>G</div>
|
||||||
|
<div><p>&#72;</p>H</div>
|
||||||
|
<div><p>&#73;</p>I</div>
|
||||||
|
<div><p>&#74;</p>J</div>
|
||||||
|
<div><p>&#75;</p>K</div>
|
||||||
|
<div><p>&#76;</p>L</div>
|
||||||
|
<div><p>&#77;</p>M</div>
|
||||||
|
<div><p>&#78;</p>N</div>
|
||||||
|
<div><p>&#79;</p>O</div>
|
||||||
|
<div><p>&#80;</p>P</div>
|
||||||
|
<div><p>&#81;</p>Q</div>
|
||||||
|
<div><p>&#82;</p>R</div>
|
||||||
|
<div><p>&#83;</p>S</div>
|
||||||
|
<div><p>&#84;</p>T</div>
|
||||||
|
<div><p>&#85;</p>U</div>
|
||||||
|
<div><p>&#86;</p>V</div>
|
||||||
|
<div><p>&#87;</p>W</div>
|
||||||
|
<div><p>&#88;</p>X</div>
|
||||||
|
<div><p>&#89;</p>Y</div>
|
||||||
|
<div><p>&#90;</p>Z</div>
|
||||||
|
<div><p>&#91;</p>[</div>
|
||||||
|
<div><p>&#92;</p>\</div>
|
||||||
|
<div><p>&#93;</p>]</div>
|
||||||
|
<div><p>&#94;</p>^</div>
|
||||||
|
<div><p>&#95;</p>_</div>
|
||||||
|
<div><p>&#96;</p>`</div>
|
||||||
|
<div><p>&#97;</p>a</div>
|
||||||
|
<div><p>&#98;</p>b</div>
|
||||||
|
<div><p>&#99;</p>c</div>
|
||||||
|
<div><p>&#100;</p>d</div>
|
||||||
|
<div><p>&#101;</p>e</div>
|
||||||
|
<div><p>&#102;</p>f</div>
|
||||||
|
<div><p>&#103;</p>g</div>
|
||||||
|
<div><p>&#104;</p>h</div>
|
||||||
|
<div><p>&#105;</p>i</div>
|
||||||
|
<div><p>&#106;</p>j</div>
|
||||||
|
<div><p>&#107;</p>k</div>
|
||||||
|
<div><p>&#108;</p>l</div>
|
||||||
|
<div><p>&#109;</p>m</div>
|
||||||
|
<div><p>&#110;</p>n</div>
|
||||||
|
<div><p>&#111;</p>o</div>
|
||||||
|
<div><p>&#112;</p>p</div>
|
||||||
|
<div><p>&#113;</p>q</div>
|
||||||
|
<div><p>&#114;</p>r</div>
|
||||||
|
<div><p>&#115;</p>s</div>
|
||||||
|
<div><p>&#116;</p>t</div>
|
||||||
|
<div><p>&#117;</p>u</div>
|
||||||
|
<div><p>&#118;</p>v</div>
|
||||||
|
<div><p>&#119;</p>w</div>
|
||||||
|
<div><p>&#120;</p>x</div>
|
||||||
|
<div><p>&#121;</p>y</div>
|
||||||
|
<div><p>&#122;</p>z</div>
|
||||||
|
<div><p>&#123;</p>{</div>
|
||||||
|
<div><p>&#124;</p>|</div>
|
||||||
|
<div><p>&#125;</p>}</div>
|
||||||
|
<div><p>&#126;</p>~</div>
|
||||||
|
<div><p>&#160;</p> </div>
|
||||||
|
<div><p>&#161;</p>¡</div>
|
||||||
|
<div><p>&#162;</p>¢</div>
|
||||||
|
<div><p>&#163;</p>£</div>
|
||||||
|
<div><p>&#164;</p>¤</div>
|
||||||
|
<div><p>&#165;</p>¥</div>
|
||||||
|
<div><p>&#166;</p>¦</div>
|
||||||
|
<div><p>&#167;</p>§</div>
|
||||||
|
<div><p>&#168;</p>¨</div>
|
||||||
|
<div><p>&#169;</p>©</div>
|
||||||
|
<div><p>&#170;</p>ª</div>
|
||||||
|
<div><p>&#171;</p>«</div>
|
||||||
|
<div><p>&#172;</p>¬</div>
|
||||||
|
<div><p>&#173;</p>­</div>
|
||||||
|
<div><p>&#174;</p>®</div>
|
||||||
|
<div><p>&#175;</p>¯</div>
|
||||||
|
<div><p>&#176;</p>°</div>
|
||||||
|
<div><p>&#177;</p>±</div>
|
||||||
|
<div><p>&#178;</p>²</div>
|
||||||
|
<div><p>&#179;</p>³</div>
|
||||||
|
<div><p>&#180;</p>´</div>
|
||||||
|
<div><p>&#181;</p>µ</div>
|
||||||
|
<div><p>&#182;</p>¶</div>
|
||||||
|
<div><p>&#183;</p>·</div>
|
||||||
|
<div><p>&#184;</p>¸</div>
|
||||||
|
<div><p>&#185;</p>¹</div>
|
||||||
|
<div><p>&#186;</p>º</div>
|
||||||
|
<div><p>&#187;</p>»</div>
|
||||||
|
<div><p>&#188;</p>¼</div>
|
||||||
|
<div><p>&#189;</p>½</div>
|
||||||
|
<div><p>&#190;</p>¾</div>
|
||||||
|
<div><p>&#191;</p>¿</div>
|
||||||
|
<div><p>&#192;</p>À</div>
|
||||||
|
<div><p>&#193;</p>Á</div>
|
||||||
|
<div><p>&#194;</p>Â</div>
|
||||||
|
<div><p>&#195;</p>Ã</div>
|
||||||
|
<div><p>&#196;</p>Ä</div>
|
||||||
|
<div><p>&#197;</p>Å</div>
|
||||||
|
<div><p>&#198;</p>Æ</div>
|
||||||
|
<div><p>&#199;</p>Ç</div>
|
||||||
|
<div><p>&#200;</p>È</div>
|
||||||
|
<div><p>&#201;</p>É</div>
|
||||||
|
<div><p>&#202;</p>Ê</div>
|
||||||
|
<div><p>&#203;</p>Ë</div>
|
||||||
|
<div><p>&#204;</p>Ì</div>
|
||||||
|
<div><p>&#205;</p>Í</div>
|
||||||
|
<div><p>&#206;</p>Î</div>
|
||||||
|
<div><p>&#207;</p>Ï</div>
|
||||||
|
<div><p>&#208;</p>Ð</div>
|
||||||
|
<div><p>&#209;</p>Ñ</div>
|
||||||
|
<div><p>&#210;</p>Ò</div>
|
||||||
|
<div><p>&#211;</p>Ó</div>
|
||||||
|
<div><p>&#212;</p>Ô</div>
|
||||||
|
<div><p>&#213;</p>Õ</div>
|
||||||
|
<div><p>&#214;</p>Ö</div>
|
||||||
|
<div><p>&#215;</p>×</div>
|
||||||
|
<div><p>&#216;</p>Ø</div>
|
||||||
|
<div><p>&#217;</p>Ù</div>
|
||||||
|
<div><p>&#218;</p>Ú</div>
|
||||||
|
<div><p>&#219;</p>Û</div>
|
||||||
|
<div><p>&#220;</p>Ü</div>
|
||||||
|
<div><p>&#221;</p>Ý</div>
|
||||||
|
<div><p>&#222;</p>Þ</div>
|
||||||
|
<div><p>&#223;</p>ß</div>
|
||||||
|
<div><p>&#224;</p>à</div>
|
||||||
|
<div><p>&#225;</p>á</div>
|
||||||
|
<div><p>&#226;</p>â</div>
|
||||||
|
<div><p>&#227;</p>ã</div>
|
||||||
|
<div><p>&#228;</p>ä</div>
|
||||||
|
<div><p>&#229;</p>å</div>
|
||||||
|
<div><p>&#230;</p>æ</div>
|
||||||
|
<div><p>&#231;</p>ç</div>
|
||||||
|
<div><p>&#232;</p>è</div>
|
||||||
|
<div><p>&#233;</p>é</div>
|
||||||
|
<div><p>&#234;</p>ê</div>
|
||||||
|
<div><p>&#235;</p>ë</div>
|
||||||
|
<div><p>&#236;</p>ì</div>
|
||||||
|
<div><p>&#237;</p>í</div>
|
||||||
|
<div><p>&#238;</p>î</div>
|
||||||
|
<div><p>&#239;</p>ï</div>
|
||||||
|
<div><p>&#240;</p>ð</div>
|
||||||
|
<div><p>&#241;</p>ñ</div>
|
||||||
|
<div><p>&#242;</p>ò</div>
|
||||||
|
<div><p>&#243;</p>ó</div>
|
||||||
|
<div><p>&#244;</p>ô</div>
|
||||||
|
<div><p>&#245;</p>õ</div>
|
||||||
|
<div><p>&#246;</p>ö</div>
|
||||||
|
<div><p>&#247;</p>÷</div>
|
||||||
|
<div><p>&#248;</p>ø</div>
|
||||||
|
<div><p>&#249;</p>ù</div>
|
||||||
|
<div><p>&#250;</p>ú</div>
|
||||||
|
<div><p>&#251;</p>û</div>
|
||||||
|
<div><p>&#252;</p>ü</div>
|
||||||
|
<div><p>&#253;</p>ý</div>
|
||||||
|
<div><p>&#254;</p>þ</div>
|
||||||
|
<div><p>&#255;</p>ÿ</div>
|
||||||
|
<div><p>&#338;</p>Œ</div>
|
||||||
|
<div><p>&#339;</p>œ</div>
|
||||||
|
<div><p>&#376;</p>Ÿ</div>
|
||||||
|
<div><p>&#710;</p>ˆ</div>
|
||||||
|
<div><p>&#732;</p>˜</div>
|
||||||
|
<div><p>&#8192;</p> </div>
|
||||||
|
<div><p>&#8193;</p> </div>
|
||||||
|
<div><p>&#8194;</p> </div>
|
||||||
|
<div><p>&#8195;</p> </div>
|
||||||
|
<div><p>&#8196;</p> </div>
|
||||||
|
<div><p>&#8197;</p> </div>
|
||||||
|
<div><p>&#8198;</p> </div>
|
||||||
|
<div><p>&#8199;</p> </div>
|
||||||
|
<div><p>&#8200;</p> </div>
|
||||||
|
<div><p>&#8201;</p> </div>
|
||||||
|
<div><p>&#8202;</p> </div>
|
||||||
|
<div><p>&#8208;</p>‐</div>
|
||||||
|
<div><p>&#8209;</p>‑</div>
|
||||||
|
<div><p>&#8210;</p>‒</div>
|
||||||
|
<div><p>&#8211;</p>–</div>
|
||||||
|
<div><p>&#8212;</p>—</div>
|
||||||
|
<div><p>&#8216;</p>‘</div>
|
||||||
|
<div><p>&#8217;</p>’</div>
|
||||||
|
<div><p>&#8218;</p>‚</div>
|
||||||
|
<div><p>&#8220;</p>“</div>
|
||||||
|
<div><p>&#8221;</p>”</div>
|
||||||
|
<div><p>&#8222;</p>„</div>
|
||||||
|
<div><p>&#8226;</p>•</div>
|
||||||
|
<div><p>&#8230;</p>…</div>
|
||||||
|
<div><p>&#8239;</p> </div>
|
||||||
|
<div><p>&#8249;</p>‹</div>
|
||||||
|
<div><p>&#8250;</p>›</div>
|
||||||
|
<div><p>&#8287;</p> </div>
|
||||||
|
<div><p>&#8364;</p>€</div>
|
||||||
|
<div><p>&#8482;</p>™</div>
|
||||||
|
<div><p>&#9724;</p>◼</div>
|
||||||
|
<div><p>&#64257;</p>fi</div>
|
||||||
|
<div><p>&#64258;</p>fl</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="specs">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="installing">
|
||||||
|
<div class="section">
|
||||||
|
<div class="grid7 firstcol">
|
||||||
|
<h1>Installing Webfonts</h1>
|
||||||
|
|
||||||
|
<p>Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.</p>
|
||||||
|
|
||||||
|
<h2>1. Upload your webfonts</h2>
|
||||||
|
<p>You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.</p>
|
||||||
|
|
||||||
|
<h2>2. Include the webfont stylesheet</h2>
|
||||||
|
<p>A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the <a href="http://www.fontspring.com/blog/further-hardening-of-the-bulletproof-syntax">Fontspring blog post</a> about it. The code for it is as follows:</p>
|
||||||
|
|
||||||
|
|
||||||
|
<code>
|
||||||
|
@font-face{
|
||||||
|
font-family: 'MyWebFont';
|
||||||
|
src: url('WebFont.eot');
|
||||||
|
src: url('WebFont.eot?#iefix') format('embedded-opentype'),
|
||||||
|
url('WebFont.woff') format('woff'),
|
||||||
|
url('WebFont.ttf') format('truetype'),
|
||||||
|
url('WebFont.svg#webfont') format('svg');
|
||||||
|
}
|
||||||
|
</code>
|
||||||
|
|
||||||
|
<p>We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:</p>
|
||||||
|
<code><link rel="stylesheet" href="stylesheet.css" type="text/css" charset="utf-8" /></code>
|
||||||
|
|
||||||
|
<h2>3. Modify your own stylesheet</h2>
|
||||||
|
<p>To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called "font-family." The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the "font-family" property, inside the selector you want to change. For example:</p>
|
||||||
|
<code>p { font-family: 'WebFont', Arial, sans-serif; }</code>
|
||||||
|
|
||||||
|
<h2>4. Test</h2>
|
||||||
|
<p>Getting webfonts to work cross-browser <em>can</em> be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid5 sidebar">
|
||||||
|
<div class="box">
|
||||||
|
<h2>Troubleshooting<br />Font-Face Problems</h2>
|
||||||
|
<p>Having trouble getting your webfonts to load in your new website? Here are some tips to sort out what might be the problem.</p>
|
||||||
|
|
||||||
|
<h3>Fonts not showing in any browser</h3>
|
||||||
|
|
||||||
|
<p>This sounds like you need to work on the plumbing. You either did not upload the fonts to the correct directory, or you did not link the fonts properly in the CSS. If you've confirmed that all this is correct and you still have a problem, take a look at your .htaccess file and see if requests are getting intercepted.</p>
|
||||||
|
|
||||||
|
<h3>Fonts not loading in iPhone or iPad</h3>
|
||||||
|
|
||||||
|
<p>The most common problem here is that you are serving the fonts from an IIS server. IIS refuses to serve files that have unknown MIME types. If that is the case, you must set the MIME type for SVG to "image/svg+xml" in the server settings. Follow these instructions from Microsoft if you need help.</p>
|
||||||
|
|
||||||
|
<h3>Fonts not loading in Firefox</h3>
|
||||||
|
|
||||||
|
<p>The primary reason for this failure? You are still using a version Firefox older than 3.5. So upgrade already! If that isn't it, then you are very likely serving fonts from a different domain. Firefox requires that all font assets be served from the same domain. Lastly it is possible that you need to add WOFF to your list of MIME types (if you are serving via IIS.)</p>
|
||||||
|
|
||||||
|
<h3>Fonts not loading in IE</h3>
|
||||||
|
|
||||||
|
<p>Are you looking at Internet Explorer on an actual Windows machine or are you cheating by using a service like Adobe BrowserLab? Many of these screenshot services do not render @font-face for IE. Best to test it on a real machine.</p>
|
||||||
|
|
||||||
|
<h3>Fonts not loading in IE9</h3>
|
||||||
|
|
||||||
|
<p>IE9, like Firefox, requires that fonts be served from the same domain as the website. Make sure that is the case.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div id="footer">
|
||||||
|
<p>©2010-2011 Font Squirrel. All rights reserved.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
vendor/potsky/pimp-my-log/fonts/ubuntumono-r-webfont.eot
vendored
Normal file
242
vendor/potsky/pimp-my-log/fonts/ubuntumono-r-webfont.svg
vendored
Normal file
@ -0,0 +1,242 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<metadata></metadata>
|
||||||
|
<defs>
|
||||||
|
<font id="ubuntu_monoregular" horiz-adv-x="1024" >
|
||||||
|
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||||
|
<missing-glyph horiz-adv-x="500" />
|
||||||
|
<glyph unicode="
" />
|
||||||
|
<glyph />
|
||||||
|
<glyph />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="!" d="M371 115q0 63 41 101t96 38q57 0 97 -38t40 -101t-40 -101.5t-97 -38.5q-55 0 -96 38t-41 102zM418 924v344h182v-344q0 -76 -2 -139.5t-7 -121t-11.5 -113.5t-12.5 -118h-116q-6 61 -12.5 117.5t-11.5 114t-7 121t-2 139.5z" />
|
||||||
|
<glyph unicode=""" d="M264 1300v91h158v-93q0 -90 -10.5 -205.5t-26.5 -211.5h-86q-14 96 -24.5 211.5t-10.5 207.5zM602 1300v91h158v-93q0 -90 -10.5 -205.5t-24.5 -211.5h-86q-16 96 -26.5 211.5t-10.5 207.5z" />
|
||||||
|
<glyph unicode="#" d="M55 334v137h158l61 326h-219v135h248l64 336h153l-63 -336h227l61 336h154l-61 -336h131v-135h-158l-63 -326h221v-137h-248l-64 -334h-153l63 334h-227l-64 -334h-153l63 334h-131zM367 471h225l63 326h-225z" />
|
||||||
|
<glyph unicode="$" d="M111 106l45 142q55 -27 130.5 -50.5t190.5 -23.5q74 0 124 11.5t79 33t41 51t12 64.5q0 51 -24.5 87t-66.5 63.5t-95 49t-111 41.5q-55 20 -109.5 45t-96.5 61t-68.5 86t-26.5 124q0 131 78 213t225 104v211h152v-205q82 -4 150.5 -19t109.5 -32l-35 -143 q-43 16 -108.5 33.5t-165.5 17.5q-111 0 -169.5 -41t-58.5 -119q0 -43 17.5 -71.5t50.5 -51t77 -41t99 -38.5q70 -27 135.5 -56.5t114.5 -70.5t78.5 -98.5t29.5 -137.5q0 -121 -79.5 -205t-245.5 -104v-236h-152v230q-129 4 -208.5 28.5t-118.5 46.5z" />
|
||||||
|
<glyph unicode="%" d="M37 977q0 156 59.5 236.5t163.5 80.5t163.5 -80.5t59.5 -236.5t-59 -238t-164 -82q-104 0 -163.5 82t-59.5 238zM51 0l776 1268h144l-776 -1268h-144zM162 977q0 -92 25.5 -151.5t72.5 -59.5t71.5 59.5t24.5 151.5t-24.5 151.5t-71.5 59.5t-72.5 -59.5t-25.5 -151.5z M543 291q0 156 58 236.5t163 80.5q104 0 163.5 -81t59.5 -236q0 -156 -59.5 -237t-163.5 -81t-162.5 81t-58.5 237zM668 291q0 -92 24.5 -151.5t71.5 -59.5t72.5 59.5t25.5 151.5t-25.5 151.5t-72.5 59.5t-71.5 -59.5t-24.5 -151.5z" />
|
||||||
|
<glyph unicode="&" d="M63 309q0 96 50.5 194.5t158.5 182.5q-53 72 -85.5 145.5t-32.5 151.5q0 80 25.5 139.5t68.5 97t99 57t116 19.5q53 0 104 -16t90 -50t62.5 -83t23.5 -113q0 -94 -61 -193.5t-195 -183.5l70 -77q35 -41 73 -83t77 -89q16 57 28.5 124.5t18.5 149.5l141 -18 q-12 -119 -35.5 -212.5t-58.5 -168.5q47 -66 90 -135.5t78 -147.5h-178q-35 72 -78 137q-66 -82 -147 -117.5t-169 -35.5q-78 0 -139 25.5t-104 70.5t-67 104.5t-24 124.5zM233 326q0 -80 41 -132.5t100.5 -65.5t129 16.5t127.5 111.5q-68 92 -140.5 171t-138.5 157 q-59 -53 -89 -123t-30 -135zM313 995q0 -59 18.5 -110t78.5 -129q98 61 139 131t41 129q0 74 -40 110.5t-91 36.5q-53 0 -99.5 -42t-46.5 -126z" />
|
||||||
|
<glyph unicode="'" d="M422 1300v91h178v-93q0 -45 -3 -103t-8 -120.5t-11.5 -123t-14.5 -107.5h-104q-8 47 -14.5 107.5t-11.5 123t-8 121.5t-3 104z" />
|
||||||
|
<glyph unicode="(" d="M231 549q0 254 117 485.5t350 401.5l90 -123h-2q-190 -147 -290.5 -340t-100.5 -420q0 -115 23.5 -217.5t72 -196.5t123 -182t177.5 -176l-93 -123q-236 174 -351.5 404.5t-115.5 486.5z" />
|
||||||
|
<glyph unicode=")" d="M231 1313l93 123q236 -174 351.5 -404.5t115.5 -486.5q0 -127 -30 -250t-88.5 -236.5t-145.5 -215t-203 -185.5l-91 123h3q190 147 291.5 339.5t101.5 420.5q0 115 -23.5 217t-73 196.5t-124 182.5t-177.5 176z" />
|
||||||
|
<glyph unicode="*" d="M117 915l55 168l14 -6q72 -29 144.5 -63.5t138.5 -71.5q-16 74 -29.5 154t-13.5 157v15h176v-15q0 -78 -13.5 -157.5t-29.5 -153.5q66 39 137.5 73t143.5 60l14 6l53 -168l-12 -4q-74 -23 -152.5 -35t-154.5 -20q55 -51 114.5 -107.5t100.5 -119.5l8 -11l-143 -104 l-11 12q-43 61 -77.5 134t-65.5 141q-33 -68 -67.5 -140.5t-81.5 -134.5l-11 -10l-141 102l10 13q45 63 102.5 118.5t112.5 106.5q-76 10 -155.5 21.5t-151.5 35.5z" />
|
||||||
|
<glyph unicode="+" d="M94 467v143h344v377h148v-377h346v-143h-346v-379h-148v379h-344z" />
|
||||||
|
<glyph unicode="," d="M305 -162q37 8 73 16.5t66.5 24t55 39t39.5 64.5q-66 6 -95.5 50t-29.5 87q0 82 46 124t105 42q76 0 115 -54.5t39 -132.5q0 -59 -23.5 -123.5t-72 -121t-120 -96.5t-169.5 -52z" />
|
||||||
|
<glyph unicode="-" d="M287 440v160h450v-160h-450z" />
|
||||||
|
<glyph unicode="." d="M362 131q0 63 41 110.5t111 47.5q68 0 109 -47.5t41 -110.5q0 -61 -41 -108.5t-109 -47.5q-70 0 -111 47.5t-41 108.5z" />
|
||||||
|
<glyph unicode="/" d="M141 -338l572 1770h170l-568 -1770h-174z" />
|
||||||
|
<glyph unicode="0" d="M94 635q0 319 109.5 490t308.5 171q201 0 309.5 -171t108.5 -490t-108.5 -490.5t-309.5 -171.5q-199 0 -308.5 171.5t-109.5 490.5zM266 635q0 -104 12.5 -197.5t41 -163t75.5 -110.5t117 -41t117 41t75.5 110.5t41 163t12.5 197.5t-12.5 197.5t-41 163t-75.5 110.5 t-117 41t-117 -41t-75.5 -110.5t-41 -163t-12.5 -197.5zM397 657q0 53 33 94.5t86 41.5q51 0 83 -41.5t32 -94.5t-32 -92t-83 -39q-53 0 -86 39t-33 92z" />
|
||||||
|
<glyph unicode="1" d="M154 1006q104 41 202.5 103t182.5 159h118v-1125h240v-143h-682v143h274v889q-23 -20 -54.5 -41.5t-69 -42t-78.5 -39t-80 -30.5z" />
|
||||||
|
<glyph unicode="2" d="M117 1145q16 18 49 45t79 50.5t103.5 39.5t122.5 16q199 0 294 -91t95 -261q0 -66 -25.5 -127t-67.5 -120.5t-95.5 -117t-108.5 -112.5q-31 -31 -71.5 -74t-77.5 -88t-61.5 -88t-24.5 -74h583v-143h-768q-2 10 -2 21.5v21.5q0 86 29 159.5t74 139.5t101 124t112 114 q45 45 87 88t73.5 86t51 89t19.5 95q0 55 -17.5 94t-47 64.5t-68.5 38t-84 12.5q-53 0 -97 -14.5t-78 -35t-58.5 -40t-36.5 -31.5z" />
|
||||||
|
<glyph unicode="3" d="M121 39l33 145q33 -16 104.5 -38.5t175.5 -22.5q162 0 230.5 64.5t68.5 172.5q0 70 -28.5 117t-75.5 76t-108.5 41t-129.5 12h-43v137h60q45 0 93 9.5t88 33t64.5 64.5t24.5 104q0 104 -64.5 148.5t-150.5 44.5q-88 0 -149.5 -25.5t-102.5 -52.5l-66 129q43 31 130 64.5 t194 33.5q100 0 172 -24.5t118 -69.5t68.5 -105.5t22.5 -131.5q0 -100 -52.5 -170t-133.5 -107q98 -29 169.5 -111.5t71.5 -220.5q0 -82 -27.5 -152.5t-84 -121.5t-145.5 -80t-212 -29q-47 0 -97 7.5t-93 18.5t-77 22.5t-48 17.5z" />
|
||||||
|
<glyph unicode="4" d="M74 324v114q35 82 95 188.5t136 220.5t162 223.5t174 197.5h164v-805h149v-139h-149v-324h-164v324h-567zM238 463h403v604q-55 -59 -111.5 -131t-109.5 -150.5t-99.5 -160.5t-82.5 -162z" />
|
||||||
|
<glyph unicode="5" d="M135 39l33 145q33 -16 101.5 -38.5t172.5 -22.5q82 0 137.5 18.5t89 50t49 72.5t15.5 86q0 70 -23.5 124t-82 91t-159.5 56.5t-255 19.5q12 90 19.5 169t12.5 153.5t8 148.5t7 156h610v-144h-462q-2 -29 -5.5 -74.5t-7.5 -97t-8 -98.5t-6 -76q274 -10 399 -120.5 t125 -297.5q0 -84 -26.5 -155.5t-83 -122.5t-143.5 -80t-206 -29q-49 0 -97 7.5t-91 17.5t-75.5 21.5t-47.5 19.5z" />
|
||||||
|
<glyph unicode="6" d="M111 508q0 184 50 326.5t143 238.5t226.5 147.5t300.5 53.5l15 -144q-109 -2 -198 -23.5t-158.5 -69.5t-116.5 -123.5t-72 -186.5q49 23 107.5 37t123.5 14q106 0 181 -32.5t120.5 -87t66 -126t20.5 -147.5q0 -70 -23 -142.5t-70 -133t-120.5 -98.5t-176.5 -38 q-211 0 -315 141.5t-104 393.5zM283 508q0 -80 11 -150.5t38.5 -125t75 -86t120.5 -31.5q61 0 102.5 25.5t68 64.5t38 87t11.5 91q0 125 -56.5 190.5t-177.5 65.5q-66 0 -120 -12.5t-109 -36.5q-2 -20 -2 -40v-42z" />
|
||||||
|
<glyph unicode="7" d="M129 1120v148h803v-142q-61 -72 -133 -192.5t-136.5 -271t-111.5 -321.5t-59 -341h-175q10 145 52.5 308t101.5 315.5t131 282.5t141 214h-614z" />
|
||||||
|
<glyph unicode="8" d="M104 319q0 109 59.5 193t141.5 135q-174 98 -174 301q0 70 26.5 133.5t76 110.5t120 75.5t158.5 28.5q102 0 175 -30.5t118 -78.5t65.5 -106.5t20.5 -113.5q0 -109 -55.5 -188t-126.5 -126q211 -100 211 -323q0 -160 -101.5 -258.5t-308.5 -98.5q-119 0 -196.5 32 t-124 82t-66 111.5t-19.5 120.5zM268 317q0 -33 12.5 -68.5t41 -66t75.5 -50t115 -19.5q63 0 109.5 17t76 47t44 67t14.5 73q0 117 -84 179.5t-232 95.5q-82 -45 -127 -113t-45 -162zM297 963q0 -84 60.5 -157t199.5 -106q78 45 124 107t46 160q0 27 -12.5 60.5t-38 61 t-66.5 47t-98 19.5q-59 0 -99 -18.5t-67 -46t-38 -61.5t-11 -66z" />
|
||||||
|
<glyph unicode="9" d="M104 885q0 70 23 142.5t70 132t120.5 98t176.5 38.5q209 0 315 -143t106 -393q0 -379 -184 -570.5t-555 -193.5l-6 143q229 0 369.5 91.5t185.5 314.5q-49 -23 -108.5 -36t-124.5 -13q-109 0 -182.5 31.5t-119 86t-66 124t-20.5 147.5zM276 889q0 -125 56.5 -189.5 t177.5 -64.5q66 0 122 12t109 35q2 20 2 38.5v39.5q0 80 -11 151.5t-38.5 125t-76 85t-121.5 31.5q-61 0 -102.5 -25.5t-68 -63.5t-38 -85t-11.5 -90z" />
|
||||||
|
<glyph unicode=":" d="M362 131q0 63 41 110.5t111 47.5q68 0 109 -47.5t41 -110.5q0 -61 -41 -108.5t-109 -47.5q-70 0 -111 47.5t-41 108.5zM362 793q0 63 41 110.5t111 47.5q68 0 109 -47.5t41 -110.5q0 -61 -41 -108.5t-109 -47.5q-70 0 -111 47.5t-41 108.5z" />
|
||||||
|
<glyph unicode=";" d="M256 -162q37 8 73 16.5t66.5 24t55 39t39.5 64.5q-66 6 -95.5 50t-29.5 87q0 82 46 124t105 42q76 0 115 -54.5t39 -132.5q0 -59 -23.5 -123.5t-72 -121t-120 -96.5t-169.5 -52zM362 793q0 63 41 110.5t111 47.5q68 0 109 -47.5t41 -110.5q0 -61 -41 -108.5t-109 -47.5 q-70 0 -111 47.5t-41 108.5z" />
|
||||||
|
<glyph unicode="<" d="M100 449v145l791 336l47 -142l-649 -266l649 -268l-47 -141z" />
|
||||||
|
<glyph unicode="=" d="M94 270v146h838v-146h-838zM94 659v146h838v-146h-838z" />
|
||||||
|
<glyph unicode=">" d="M100 254l650 268l-650 266l47 142l791 -336v-145l-791 -336z" />
|
||||||
|
<glyph unicode="?" d="M188 1223q61 35 139.5 54t166.5 19q104 0 170.5 -28.5t105.5 -72.5t54.5 -97.5t15.5 -102.5q0 -61 -23.5 -109t-58.5 -91t-76 -82t-76 -81t-58.5 -91t-23.5 -109h-145l-2 39q0 88 45 152.5t99 120t99.5 110.5t45.5 127q0 78 -49.5 125t-145.5 47q-59 0 -117.5 -14.5 t-117.5 -46.5zM330 115q0 63 40 101t97 38q55 0 96 -38t41 -101t-41 -101.5t-96 -38.5q-57 0 -97 38t-40 102z" />
|
||||||
|
<glyph unicode="@" d="M82 498q0 211 38 362.5t104.5 247.5t154.5 142t190 46q180 0 284.5 -121.5t104.5 -338.5v-707q-61 -25 -124.5 -34t-116.5 -9q-72 0 -133.5 23.5t-107.5 72.5t-71.5 126t-25.5 184q0 190 98 289.5t256 99.5q16 0 31.5 -1t32.5 -3q0 129 -53.5 204.5t-170.5 75.5 q-72 0 -131 -35t-102 -111.5t-67.5 -197.5t-24.5 -293q0 -129 24.5 -248.5t76.5 -210t133 -144.5t194 -54q82 0 170 26l16 -137q-109 -29 -200 -28q-150 0 -259.5 66.5t-180 175t-105.5 247.5t-35 285zM543 492q0 -41 5 -88.5t23.5 -87.5t52 -67.5t93.5 -27.5q16 0 36.5 2 t43.5 8v502q-18 6 -36 8t-34 2q-88 0 -136 -68t-48 -183z" />
|
||||||
|
<glyph unicode="A" d="M18 0q35 135 78 293t93.5 323.5t105.5 332.5t117 319h209q59 -152 113 -319t102.5 -332.5t91.5 -323.5t78 -293h-179l-75 332h-488l-74 -332h-172zM303 471h410q-47 184 -101.5 355t-101.5 294q-47 -129 -102.5 -299t-104.5 -350z" />
|
||||||
|
<glyph unicode="B" d="M111 20v1229q31 8 70.5 14.5t81.5 9.5t82 5t73 2q94 0 176 -16.5t142.5 -55.5t94 -102.5t33.5 -157.5q0 -45 -14 -87t-40 -79t-59.5 -64.5t-72.5 -41.5q104 -29 175 -105.5t71 -199.5q0 -188 -121 -284.5t-385 -96.5q-31 0 -72 2t-82 5t-82 9t-71 14zM279 139q4 -2 46 -5 t105 -3t121.5 10.5t103.5 38t73 72.5t28 117q0 63 -25.5 106t-67.5 68.5t-97.5 37t-114.5 11.5h-172v-453zM279 731h133q51 0 102 10.5t92 33t65.5 61t24.5 98.5q0 55 -22.5 94t-59 63.5t-85 35t-101.5 10.5t-93 -1t-56 -6v-399z" />
|
||||||
|
<glyph unicode="C" d="M94 635q0 162 42 284.5t114 206.5t168 127t205 43q76 0 154.5 -20.5t154.5 -67.5l-49 -139q-135 78 -254 78q-84 0 -150.5 -36t-114 -103.5t-73 -161.5t-25.5 -211q0 -131 28 -227.5t77 -160t117.5 -94t148.5 -30.5q59 0 124.5 15.5t135.5 53.5l45 -139 q-72 -41 -152.5 -60.5t-173.5 -19.5q-113 0 -208 40t-164.5 121t-109.5 206t-40 295z" />
|
||||||
|
<glyph unicode="D" d="M111 20v1229q129 31 256 31q123 0 228 -35t182 -112.5t121 -200.5t44 -297q0 -176 -44 -299t-121 -200t-182.5 -111.5t-227.5 -34.5q-127 0 -256 30zM279 141q51 -6 104 -6q92 0 163.5 27.5t121 88t76 156t26.5 228.5q0 258 -99.5 379t-293.5 121q-27 0 -52.5 -1 t-45.5 -6v-987z" />
|
||||||
|
<glyph unicode="E" d="M186 0v1268h711v-144h-543v-389h475v-143h-475v-449h588v-143h-756z" />
|
||||||
|
<glyph unicode="F" d="M186 0v1268h719v-144h-551v-395h486v-141h-486v-588h-168z" />
|
||||||
|
<glyph unicode="G" d="M94 635q0 160 41 282.5t111.5 206.5t165 128t202.5 44q70 0 123.5 -10t91 -24.5t62 -29.5t37.5 -24l-56 -141q-47 37 -111.5 60.5t-135.5 23.5q-78 0 -144.5 -37t-114 -104.5t-74 -162.5t-26.5 -212q0 -115 23.5 -209t68.5 -161.5t112 -105.5t153 -38q59 0 92 8t49 16 v480h168v-594q-39 -14 -125 -36t-203 -22q-115 0 -209 44t-160.5 128t-103.5 208t-37 282z" />
|
||||||
|
<glyph unicode="H" d="M92 0v1268h168v-535h504v535h168v-1268h-168v590h-504v-590h-168z" />
|
||||||
|
<glyph unicode="I" d="M182 0v143h246v981h-246v144h660v-144h-246v-981h246v-143h-660z" />
|
||||||
|
<glyph unicode="J" d="M111 76l67 137q39 -29 103.5 -61.5t150.5 -32.5q131 0 195.5 69.5t64.5 235.5v700h-432v144h600v-860q0 -90 -19.5 -170t-67.5 -138.5t-129 -92.5t-204 -34t-206.5 35t-122.5 68z" />
|
||||||
|
<glyph unicode="K" d="M131 0v1268h168v-566q133 137 255 287t214 279h195q-100 -150 -220 -297.5t-260 -294.5q66 -55 139.5 -129t144.5 -161t133.5 -185.5t105.5 -200.5h-191q-51 94 -110.5 184t-126 168t-137 142.5t-142.5 111.5v-606h-168z" />
|
||||||
|
<glyph unicode="L" d="M186 0v1268h168v-1125h588v-143h-756z" />
|
||||||
|
<glyph unicode="M" d="M66 0q6 156 14 319.5t19.5 325.5t26.5 319.5t34 303.5h155l199 -631l197 631h157q41 -299 58.5 -612.5t31.5 -655.5h-163q-2 111 -4.5 240t-5.5 266t-6 278.5t-7 274.5l-184 -578h-148l-188 578q-2 -133 -5 -273.5t-6 -278.5t-6.5 -267t-5.5 -240h-163z" />
|
||||||
|
<glyph unicode="N" d="M113 0v1268h172q84 -154 146.5 -268.5t114.5 -222t101 -221.5t111 -263v975h153v-1268h-172q-70 170 -131 308t-117.5 259t-111.5 228.5t-113 216.5v-1012h-153z" />
|
||||||
|
<glyph unicode="O" d="M59 635q0 170 33 295t92.5 206t142.5 120.5t185 39.5q100 0 184 -39.5t143.5 -120.5t93.5 -206t34 -295t-34 -295t-93.5 -207t-143.5 -121t-184 -39q-102 0 -185 39t-142.5 121t-92.5 207t-33 295zM231 635q0 -250 68 -383t209 -133q143 0 215 133t72 383t-72 383 t-215 133q-141 0 -209 -133t-68 -383z" />
|
||||||
|
<glyph unicode="P" d="M150 0v1249q37 8 80.5 14.5t87.5 10.5t86 5t77 1q113 0 198 -28.5t141.5 -81t84 -124t27.5 -159.5q0 -199 -117 -306.5t-350 -107.5h-148v-473h-167zM317 616h140q154 0 228.5 61.5t74.5 203.5q0 254 -266 254q-53 0 -102.5 -1t-74.5 -6v-512z" />
|
||||||
|
<glyph unicode="Q" d="M59 633q0 170 33 295t92.5 205.5t142.5 120.5t185 40q100 0 184 -40t143.5 -120.5t93.5 -205.5t34 -295q0 -152 -27 -267.5t-76 -197.5t-118.5 -129t-153.5 -62q6 -41 34.5 -70.5t72.5 -51t100.5 -36t118.5 -22.5l-39 -135q-84 14 -161 36.5t-138.5 59.5t-104.5 90.5 t-57 131.5q-166 35 -262.5 193.5t-96.5 459.5zM231 633q0 -250 68 -383t209 -133q143 0 215 133t72 383t-72 383t-215 133q-141 0 -209 -133t-68 -383z" />
|
||||||
|
<glyph unicode="R" d="M113 0v1249q31 8 70.5 14.5t81.5 9.5t83 5t74 2q229 0 345 -100t116 -299q0 -117 -61.5 -206t-166.5 -138q31 -49 69 -112t77 -133.5t76.5 -145t70.5 -146.5h-180q-61 147 -134 282.5t-140 219.5q-12 -2 -36 -2h-32h-143v-500h-170zM283 639h108q74 0 132.5 10t100.5 38 t64.5 76t22.5 126q0 74 -22.5 121t-59.5 74.5t-87.5 39t-105.5 11.5q-47 0 -91 -1t-62 -6v-489z" />
|
||||||
|
<glyph unicode="S" d="M113 61l51 140q41 -23 120.5 -52.5t194.5 -29.5q129 0 196.5 49t67.5 147q0 59 -24.5 101.5t-65.5 74t-92 55t-104 44.5q-61 25 -117.5 55.5t-100.5 71.5t-70 96t-26 131q0 166 104.5 259t291.5 93q51 0 101 -7t93 -17t77 -24.5t54 -28.5l-53 -142q-41 25 -112.5 49.5 t-159.5 24.5q-92 0 -160 -46t-68 -138q0 -53 19.5 -90t53.5 -65t79 -50.5t98 -44.5q78 -33 142.5 -66t110.5 -78t71.5 -106t25.5 -150q0 -166 -111.5 -255t-320.5 -89q-68 0 -127 9.5t-105 23.5t-81 28.5t-53 26.5z" />
|
||||||
|
<glyph unicode="T" d="M80 1124v144h864v-144h-348v-1124h-168v1124h-348z" />
|
||||||
|
<glyph unicode="U" d="M98 436v832h168v-813q0 -96 17.5 -161t49.5 -103.5t77 -55t102 -16.5t102 16.5t77 55t49.5 103t17.5 161.5v813h168v-832q0 -106 -22.5 -192t-72 -145.5t-128 -92.5t-191.5 -33t-191.5 33t-128 92.5t-72 145.5t-22.5 192z" />
|
||||||
|
<glyph unicode="V" d="M27 1268h182q25 -129 62.5 -281.5t79.5 -305.5t85 -292t80 -244q33 104 77 245.5t87 294.5t81 304.5t62 278.5h176q-16 -82 -53 -220.5t-88 -309.5t-113.5 -362.5t-130.5 -375.5h-208q-63 184 -124 374.5t-112 361.5t-88 310.5t-55 221.5z" />
|
||||||
|
<glyph unicode="W" d="M66 1268h163l23 -1059l184 577h148l188 -577l23 1059h163q-6 -172 -15 -344t-21.5 -335t-26.5 -312.5t-31 -276.5h-155l-199 631l-197 -631h-157q-18 125 -31.5 275.5t-25 314.5t-19.5 336t-14 342z" />
|
||||||
|
<glyph unicode="X" d="M51 0q68 152 158 329t192 341l-329 598h186l248 -486l266 486h182l-336 -592q98 -160 190.5 -332t164.5 -344h-187q-23 55 -53.5 125t-65 143.5t-74.5 147t-83 137.5q-72 -115 -143.5 -263.5t-133.5 -289.5h-182z" />
|
||||||
|
<glyph unicode="Y" d="M27 1268h188q59 -172 136 -329t165 -323q94 174 167 331t132 321h184q-78 -201 -178 -391.5t-223 -401.5v-475h-168v471q-125 205 -226.5 399.5t-176.5 397.5z" />
|
||||||
|
<glyph unicode="Z" d="M111 0v111q63 129 140 265t156.5 267t159.5 254t154 227h-580v144h774v-131q-66 -90 -146.5 -214t-164.5 -259.5t-163 -271.5t-138 -249h629v-143h-821z" />
|
||||||
|
<glyph unicode="[" d="M293 -338v1770h489v-134h-329v-1503h329v-133h-489z" />
|
||||||
|
<glyph unicode="\" d="M143 1432h170l568 -1770h-172z" />
|
||||||
|
<glyph unicode="]" d="M242 -205h329v1503h-329v134h489v-1770h-489v133z" />
|
||||||
|
<glyph unicode="^" d="M82 645l354 623h152l354 -623l-135 -70l-295 517l-295 -517z" />
|
||||||
|
<glyph unicode="_" d="M16 -195h992v-143h-992v143z" />
|
||||||
|
<glyph unicode="`" d="M334 1311l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="a" d="M119 283q0 82 35.5 138t92 91t129.5 50.5t146 15.5q100 0 197 -23v47q0 43 -9.5 83t-35 73t-69.5 52t-113 19q-88 0 -154 -12t-100 -24l-21 139q35 16 116 28.5t173 12.5q106 0 179 -26.5t118 -74t63.5 -115t18.5 -147.5v-594q-59 -10 -156.5 -24.5t-200.5 -14.5 q-78 0 -151.5 13.5t-131 47.5t-92 93t-34.5 152zM291 285q0 -92 62.5 -128t168.5 -36q63 0 113.5 4t83.5 10v283q-33 10 -79 16t-97 6q-47 0 -92 -7t-80 -25.5t-57.5 -48t-22.5 -74.5z" />
|
||||||
|
<glyph unicode="b" d="M145 27v1364l170 28v-504q31 18 89.5 38t130.5 20q96 0 171.5 -37t128 -102.5t80 -156.5t27.5 -202q0 -115 -32.5 -207t-92 -156.5t-143.5 -99.5t-187 -35q-113 0 -200.5 16.5t-141.5 33.5zM315 147q39 -10 78 -15t74 -5q141 0 221 87t80 261q0 74 -14.5 138.5t-45 110.5 t-78.5 72.5t-116 26.5q-59 0 -114.5 -23.5t-84.5 -49.5v-603z" />
|
||||||
|
<glyph unicode="c" d="M100 473q0 129 41 223.5t113 155.5t167 91t204 30q70 0 138 -9.5t146 -33.5l-39 -146q-68 25 -124 32t-113 7q-74 0 -139.5 -19.5t-113.5 -61.5t-77 -108.5t-29 -160.5q0 -90 27 -154.5t75 -106.5t115.5 -62.5t149.5 -20.5q66 0 126 7t132 32l25 -141 q-72 -27 -145.5 -38.5t-160.5 -11.5q-115 0 -210 32t-163.5 93.5t-106.5 154.5t-38 216z" />
|
||||||
|
<glyph unicode="d" d="M82 475q0 111 27.5 202t81 156.5t128 102.5t170.5 37q76 0 133.5 -18.5t86.5 -39.5v476l170 28v-1392q-55 -16 -141.5 -33t-200.5 -17q-102 0 -186.5 35t-144 99.5t-92 156.5t-32.5 207zM256 475q0 -166 78 -256t203 -90q63 0 107 6t65 12v603q-29 27 -84.5 50t-114.5 23 q-68 0 -116 -26.5t-78.5 -72.5t-45 -110.5t-14.5 -138.5z" />
|
||||||
|
<glyph unicode="e" d="M82 473q0 127 39 221t102.5 155.5t143 92.5t163.5 31q193 0 297.5 -120t104.5 -364v-59h-680q10 -147 97 -224t245 -77q90 0 153.5 14.5t96.5 30.5l22 -143q-31 -16 -110.5 -35t-180.5 -19q-123 0 -216 38t-154.5 103.5t-92 157t-30.5 197.5zM256 567h504 q0 121 -63.5 191.5t-168.5 70.5q-59 0 -107 -22.5t-83 -59t-55.5 -84t-26.5 -96.5z" />
|
||||||
|
<glyph unicode="f" d="M129 809v141h201v86q0 111 30.5 183.5t81 117.5t117 63.5t139.5 18.5q74 0 149 -16.5t140 -38.5l-31 -145q-45 23 -112.5 39t-136.5 16q-43 0 -81 -11.5t-67 -39t-45 -73.5t-16 -116v-84h383v-141h-383v-809h-168v809h-201z" />
|
||||||
|
<glyph unicode="g" d="M82 496q0 104 29.5 191t86 150.5t138.5 99.5t186 36q123 0 210 -17.5t147 -33.5v-848q0 -221 -112 -319.5t-337 -98.5q-92 0 -167 14.5t-132 34.5l31 150q53 -23 121.5 -37.5t150.5 -14.5q147 0 211 59.5t64 192.5v33q-29 -16 -88.5 -34.5t-137.5 -18.5 q-84 0 -156.5 27.5t-127 84t-86 143.5t-31.5 206zM256 494q0 -82 19.5 -140.5t53 -96.5t77 -55.5t92.5 -17.5q63 0 119.5 18.5t91.5 43.5v555q-25 8 -68 15t-117 7q-131 0 -199.5 -90t-68.5 -239z" />
|
||||||
|
<glyph unicode="h" d="M145 0v1391l170 28v-483q41 16 92.5 25.5t100.5 9.5q109 0 181.5 -32t115.5 -89t61.5 -137t18.5 -176v-537h-168v500q0 176 -49.5 248.5t-175.5 72.5q-53 0 -103.5 -11t-73.5 -22v-788h-170z" />
|
||||||
|
<glyph unicode="i" d="M111 809v141h442v-583q0 -141 39 -189.5t117 -48.5q59 0 109 14.5t79 30.5l25 -143q-12 -6 -35 -15.5t-52.5 -17.5t-65.5 -14.5t-75 -6.5q-90 0 -149.5 25t-95 74t-50 121.5t-14.5 169.5v442h-274zM297 1235q0 63 39 100t92 37q55 0 93 -37t38 -100t-38 -100t-93 -37 q-53 0 -92 36.5t-39 100.5z" />
|
||||||
|
<glyph unicode="j" d="M145 -281l52 144q51 -25 113.5 -42.5t119.5 -17.5q82 0 135 42t53 163v801h-385v141h553v-940q0 -98 -27.5 -166.5t-73.5 -111.5t-106.5 -61.5t-127.5 -18.5q-78 0 -157 16.5t-149 50.5zM500 1235q0 63 39 100t92 37q55 0 93 -37t38 -100t-38 -100t-93 -37 q-53 0 -92 36.5t-39 100.5z" />
|
||||||
|
<glyph unicode="k" d="M145 0v1391l170 28v-866q113 98 225.5 195.5t202.5 201.5h199q-88 -104 -212 -215t-243 -213q55 -41 125 -103.5t138.5 -134t130 -146.5t98.5 -138h-201q-39 63 -96 130t-121.5 128t-129 112.5t-116.5 86.5v-457h-170z" />
|
||||||
|
<glyph unicode="l" d="M111 1266v143h442v-1042q0 -72 9 -117t28.5 -72.5t48.5 -38t68 -10.5q59 0 110 14.5t80 30.5l25 -143q-12 -6 -35 -15.5t-53.5 -17.5t-66.5 -14.5t-75 -6.5q-90 0 -149.5 25t-94 74t-49 121.5t-14.5 169.5v899h-274z" />
|
||||||
|
<glyph unicode="m" d="M84 0v924q123 47 231 47q59 0 111.5 -17.5t89.5 -54.5q88 72 189 72q49 0 93 -18.5t77.5 -55.5t54 -92t20.5 -129v-676h-153v680q0 74 -33 112.5t-82 38.5q-25 0 -51.5 -12t-48.5 -39q12 -47 12 -104v-309h-154v311q0 72 -22.5 112.5t-87.5 40.5q-41 0 -92 -18v-813h-154 z" />
|
||||||
|
<glyph unicode="n" d="M145 0v924q92 23 183.5 35t171.5 12q190 0 287.5 -98.5t97.5 -315.5v-557h-168v526q0 92 -16.5 149.5t-46 89.5t-71.5 44t-91 12q-41 0 -87.5 -5t-89.5 -13v-803h-170z" />
|
||||||
|
<glyph unicode="o" d="M82 475q0 113 31.5 205t89 156.5t136.5 100.5t171 36q94 0 174 -36t137.5 -100.5t89 -156.5t31.5 -205t-31.5 -204t-89 -156.5t-137.5 -101.5t-174 -36q-92 0 -171 36t-136.5 101.5t-89 156.5t-31.5 204zM256 475q0 -160 68.5 -253t185.5 -93q119 0 188.5 93t69.5 253 q0 162 -69.5 255t-188.5 93q-117 0 -185.5 -93t-68.5 -255z" />
|
||||||
|
<glyph unicode="p" d="M145 -338v1260q55 16 142.5 32.5t199.5 16.5q102 0 186.5 -35t144 -99.5t92 -156.5t32.5 -207q0 -109 -27.5 -200t-80 -156.5t-128 -102.5t-171.5 -37q-76 0 -133.5 18.5t-86.5 41.5v-375h-170zM315 201q29 -27 84.5 -49.5t114.5 -22.5q68 0 116 26.5t78.5 72.5t45 108.5 t14.5 136.5q0 166 -78 257t-203 91q-70 0 -109.5 -6t-62.5 -14v-600z" />
|
||||||
|
<glyph unicode="q" d="M82 473q0 115 32.5 207t92 156.5t144.5 99.5t188 35q111 0 195.5 -17.5t144.5 -33.5v-1258h-170v375q-31 -20 -88.5 -40t-128.5 -20q-96 0 -172 37t-128.5 102.5t-81 156.5t-28.5 200zM256 473q0 -74 15.5 -136.5t46 -108.5t78.5 -72.5t116 -26.5q59 0 114.5 22.5 t84.5 49.5v600q-23 8 -63 14t-109 6q-125 0 -204 -91t-79 -257z" />
|
||||||
|
<glyph unicode="r" d="M219 0v899q209 72 422 72q66 0 125 -5t131 -22l-31 -149q-66 18 -116 23t-109 5q-125 0 -254 -35v-788h-168z" />
|
||||||
|
<glyph unicode="s" d="M135 43l33 154q72 -33 150.5 -54.5t168.5 -21.5q232 0 232 117q0 51 -42 83.5t-104.5 57t-136.5 48.5t-136 58.5t-104 86t-42 133.5q0 115 93 191.5t292 76.5q78 0 160.5 -11.5t142.5 -29.5l-31 -152q-16 8 -45 17.5t-65.5 16.5t-78.5 11t-81 4q-221 0 -222 -120 q0 -43 42 -73t105.5 -54.5t137.5 -50t137.5 -62.5t105.5 -89t42 -132q0 -129 -100.5 -200t-317.5 -71q-98 0 -180 16.5t-156 49.5z" />
|
||||||
|
<glyph unicode="t" d="M129 809v141h201v267l168 28v-295h401v-141h-401v-442q0 -72 10 -117t33.5 -72.5t60.5 -38t90 -10.5q74 0 119 12.5t86 32.5l25 -143q-29 -12 -91.5 -33t-154.5 -21q-106 0 -174 25t-106 74t-52 121.5t-14 169.5v442h-201z" />
|
||||||
|
<glyph unicode="u" d="M139 416v534h168v-497q0 -176 52.5 -250t175.5 -74q27 0 54 2t52 5t43 6t25 5v803h170v-923q-55 -14 -146.5 -30.5t-214.5 -16.5q-109 0 -180.5 31.5t-116.5 90t-63.5 138t-18.5 176.5z" />
|
||||||
|
<glyph unicode="v" d="M61 950h185q25 -90 56.5 -190.5t66 -200.5t70.5 -193.5t71 -166.5q35 74 73 167t74.5 193t70.5 200.5t58 190.5h177q-37 -133 -84.5 -261t-96.5 -250t-100 -232.5t-98 -206.5h-154q-96 193 -194.5 438.5t-174.5 511.5z" />
|
||||||
|
<glyph unicode="w" d="M39 950h160q6 -80 13 -156.5t17.5 -160.5t23.5 -182.5t30 -221.5q33 82 55 143.5t40.5 117t36 112.5t38.5 129h127q20 -72 36.5 -129t35 -112.5l39 -117t50.5 -141.5q18 113 32.5 209.5t25 181.5t18.5 164.5t14 163.5h154q-10 -102 -24.5 -219t-35 -239.5t-45 -248.5 t-51.5 -243h-127q-31 70 -53 127t-43.5 114.5t-43 120t-50.5 142.5q-29 -80 -51.5 -142.5t-44 -120t-45 -114.5t-54.5 -127h-127q-57 252 -95 498.5t-56 451.5z" />
|
||||||
|
<glyph unicode="x" d="M59 0q68 123 165.5 253t191.5 247l-342 450h190l256 -332l236 332h180l-313 -440q92 -121 185 -252t159 -258h-189q-20 41 -50 90t-64.5 101.5t-72.5 103.5t-75 96q-37 -47 -78 -98t-78.5 -103.5t-70.5 -101.5t-56 -88h-174z" />
|
||||||
|
<glyph unicode="y" d="M74 -315l30 137q18 -10 52 -16.5t63 -6.5q100 0 156.5 44t103.5 145q-115 217 -215 465.5t-166 496.5h185q20 -82 47.5 -177t62.5 -195.5t75 -202t85 -193.5q33 94 61.5 186.5t53 185.5t49 190.5t51.5 205.5h176q-66 -266 -146.5 -516t-172.5 -463q-35 -82 -75 -141 t-87 -98t-106.5 -57.5t-135.5 -18.5q-39 0 -85 10t-62 19z" />
|
||||||
|
<glyph unicode="z" d="M150 0v113q43 82 107.5 179t134 192.5t136 181.5t115.5 143h-467v141h684v-127q-37 -43 -100.5 -119.5t-136 -170t-144 -195.5t-127.5 -195h522v-143h-724z" />
|
||||||
|
<glyph unicode="{" d="M162 481v131h82q35 0 61.5 15.5t44 41t26.5 57.5t9 65v329q0 76 15.5 133.5t52 97.5t99 60.5t157.5 20.5h165v-134h-174q-86 0 -121.5 -38.5t-35.5 -141.5v-282q0 -137 -41 -202t-94 -87q53 -25 94 -92.5t41 -196.5v-283q0 -102 36.5 -141t122.5 -39h172v-133h-165 q-94 0 -157 20.5t-99.5 60.5t-52 97.5t-15.5 132.5v330q0 31 -9 62.5t-26.5 57.5t-43 42t-60.5 16h-84z" />
|
||||||
|
<glyph unicode="|" d="M434 -338v1770h158v-1770h-158z" />
|
||||||
|
<glyph unicode="}" d="M150 -205h174q86 0 121.5 39t35.5 141v283q0 137 41 201.5t94 87.5q-53 25 -94 92.5t-41 196.5v282q0 102 -36.5 141t-122.5 39h-172v134h165q94 0 157 -20.5t100.5 -60.5t53 -97.5t15.5 -133.5v-329q0 -31 8 -63t25.5 -57.5t43 -42t60.5 -16.5h84v-131h-82 q-35 0 -60.5 -15t-43 -41t-26.5 -57.5t-9 -64.5v-330q0 -76 -15.5 -133t-53 -97t-100 -60.5t-157.5 -20.5h-165v133z" />
|
||||||
|
<glyph unicode="~" d="M76 434q6 35 22.5 80t45 84t72.5 65.5t110 26.5q55 0 101 -21.5t89 -47.5q49 -29 95 -57.5t98 -28.5q29 0 49 13t33.5 33.5t23.5 46t16 48.5l117 -33q-6 -35 -21.5 -80t-45 -84t-74.5 -65.5t-109 -26.5q-55 0 -101 21.5t-89 48.5q-49 29 -94 57.5t-99 28.5 q-29 0 -49 -13.5t-33.5 -34t-23.5 -46t-16 -48.5z" />
|
||||||
|
<glyph unicode=" " />
|
||||||
|
<glyph unicode="¡" d="M373 813q0 63 41 101t96 38q57 0 97 -37.5t40 -101.5q0 -63 -40 -100t-97 -37q-55 0 -96 37t-41 100zM418 6q0 76 3 139.5t7 121t11 113.5t14 118h116q6 -61 12.5 -117.5t11.5 -114t7 -121t2 -139.5v-344h-184v344z" />
|
||||||
|
<glyph unicode="¢" d="M100 532q0 109 31 192t86 142.5t132 94t167 47.5v260h152v-254q55 -4 110.5 -13.5t118.5 -29.5l-37 -142q-68 25 -123 32t-112 7q-74 0 -138.5 -19.5t-111.5 -59t-74 -104t-27 -153.5q0 -170 101.5 -250.5t265.5 -80.5q66 0 125 8t131 33l25 -140q-61 -23 -123 -33 t-131 -14v-254h-152v258q-188 27 -302 145.5t-114 327.5z" />
|
||||||
|
<glyph unicode="£" d="M92 545v137h170v152q0 135 28.5 224t80 140t124 71.5t162.5 20.5q80 0 134.5 -13t105.5 -36l-41 -145q-92 45 -207 45q-49 0 -89 -14.5t-69.5 -49.5t-45 -93t-15.5 -146v-156h348v-137h-348v-15q0 -92 -7 -192t-22 -193h531v-145h-721q20 131 35.5 259t15.5 259v27h-170z " />
|
||||||
|
<glyph unicode="¤" d="M78 305l133 133q-51 82 -51 197q0 113 51 194l-133 136l104 104l135 -137q88 53 195 53q104 0 193 -53l137 137l106 -104l-137 -136q53 -82 53 -194q0 -59 -13 -106.5t-40 -88.5l137 -135l-106 -106l-137 135q-88 -51 -193 -51q-111 0 -195 51l-135 -135zM297 635 q0 -104 63.5 -165.5t151.5 -61.5t151.5 61.5t63.5 165.5t-63.5 165.5t-151.5 61.5t-151.5 -61.5t-63.5 -165.5z" />
|
||||||
|
<glyph unicode="¥" d="M27 1268h186q66 -143 143.5 -285.5t161.5 -273.5q80 131 155 273t140 286h186q-82 -154 -170 -310.5t-188 -316.5h252v-131h-295v-186h295v-129h-295v-195h-168v195h-297v129h297v186h-297v131h250q-100 160 -189.5 318.5t-166.5 308.5z" />
|
||||||
|
<glyph unicode="¦" d="M434 -338v700h158v-700h-158zM434 731v701h158v-701h-158z" />
|
||||||
|
<glyph unicode="§" d="M139 565q0 47 15.5 88t39 75t52 59.5t55.5 41.5q-45 37 -71.5 84.5t-26.5 108.5q0 127 89 200.5t249 73.5q94 0 174 -17t129 -34l-39 -141q-45 16 -107.5 34.5t-158.5 18.5q-72 0 -123 -29.5t-51 -91.5q0 -63 45 -98t147 -68q68 -23 126 -48t103 -62t71 -87t26 -124 q0 -45 -14.5 -85t-37 -74t-50 -60.5t-54.5 -42.5q53 -39 86 -90.5t33 -118.5q0 -137 -97.5 -207t-277.5 -70q-123 0 -202 19.5t-126 42.5l41 135q55 -23 121 -40t168 -17q207 0 207 127q0 66 -49 101.5t-166 74.5q-68 23 -126 48t-103.5 61t-71 87.5t-25.5 124.5zM295 582 q0 -47 21.5 -80t58.5 -57.5t88 -43t110 -39.5l35 -12q53 35 86 80t33 102q0 47 -21.5 79t-57.5 54.5t-84 41t-101 38.5l-49 19q-53 -35 -86 -81t-33 -101z" />
|
||||||
|
<glyph unicode="¨" d="M231 1235q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM580 1235q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="©" d="M70 473q0 125 38.5 219t101 156.5t142.5 93.5t162 31t162 -31t141.5 -93.5t99 -155.5t37.5 -216q0 -125 -38.5 -218t-101 -155.5t-142.5 -94.5t-162 -32q-84 0 -163 32t-140.5 93.5t-99 154.5t-37.5 216zM188 477q0 -98 28 -171t74 -121t103.5 -72.5t118.5 -24.5 t119.5 24.5t103.5 72.5t73 120t28 168q0 98 -28 171t-74 121t-103.5 72.5t-118.5 24.5t-118.5 -24.5t-103.5 -72.5t-74 -121t-28 -167zM291 469q0 49 14 96t43 84t73 59.5t105 22.5q33 0 69 -5t71 -21l-41 -111q-23 10 -45.5 13t-40.5 3q-66 0 -93.5 -41t-27.5 -92 q0 -66 33.5 -103.5t95.5 -37.5q18 0 41.5 4t46.5 14l35 -108q-35 -16 -73 -24.5t-73 -8.5q-59 0 -103 21.5t-73 57.5t-43 82t-14 95z" />
|
||||||
|
<glyph unicode="ª" d="M242 815q0 57 23.5 97t64.5 64.5t93 36t112 11.5q27 0 56.5 -2t67.5 -6v4q0 27 -5 54.5t-21.5 49t-46 34.5t-76.5 13q-43 0 -92 -5t-86 -17l-19 115q35 10 90.5 18t114.5 8q150 0 209 -69.5t59 -184.5v-409q-45 -10 -118.5 -17.5t-149.5 -7.5q-121 0 -198.5 49t-77.5 164 zM369 815q0 -53 42.5 -76.5t118.5 -23.5q41 0 80 2t49 6v182q-20 4 -50.5 6t-59.5 2q-31 0 -62.5 -4t-58.5 -14t-43 -29.5t-16 -50.5z" />
|
||||||
|
<glyph unicode="«" d="M129 520l244 361l106 -56l-172 -305l164 -295l-102 -63zM496 520l245 361l105 -56l-170 -305l164 -295l-103 -63z" />
|
||||||
|
<glyph unicode="¬" d="M84 567v144h838v-623h-146v479h-692z" />
|
||||||
|
<glyph unicode="­" d="M287 440v160h450v-160h-450z" />
|
||||||
|
<glyph unicode="®" d="M70 473q0 125 38.5 219t101 156.5t142.5 93.5t162 31t162 -31t141.5 -93.5t99 -155.5t37.5 -216q0 -125 -38.5 -218t-101 -155.5t-142.5 -94.5t-162 -32q-84 0 -163 32t-140.5 93.5t-99 154.5t-37.5 216zM188 477q0 -98 28 -171t74 -121t103.5 -72.5t118.5 -24.5 t119.5 24.5t103.5 72.5t73 120t28 168q0 98 -28 171t-74 121t-103.5 72.5t-118.5 24.5t-118.5 -24.5t-103.5 -72.5t-74 -121t-28 -167zM340 225v488q29 8 63.5 13t73.5 5q117 0 173.5 -45t56.5 -131q0 -98 -82 -145q25 -35 51 -83t53 -102h-117q-27 49 -47 87t-41 71h-73 v-158h-111zM451 485h36q55 0 82 14.5t27 61.5q0 41 -33 54.5t-67 13.5q-12 0 -23.5 -1t-21.5 -3v-140z" />
|
||||||
|
<glyph unicode="¯" d="M252 1169v131h520v-131h-520z" />
|
||||||
|
<glyph unicode="°" d="M256 1165q0 59 20.5 106.5t56.5 80t82 50t97 17.5t97 -17.5t82 -50t56.5 -80t20.5 -106.5t-20.5 -106t-56.5 -80t-82 -50.5t-97 -17.5t-97 17.5t-82 50.5t-56.5 80t-20.5 106zM379 1165q0 -66 39 -102.5t94 -36.5t94 36.5t39 102.5t-39 103t-94 37t-94 -37t-39 -103z" />
|
||||||
|
<glyph unicode="±" d="M94 0v145h838v-145h-838zM94 623v143h344v369h148v-369h346v-143h-346v-369h-148v369h-344z" />
|
||||||
|
<glyph unicode="²" d="M254 1200q33 33 95.5 64.5t144.5 31.5q127 0 187 -52t60 -150q0 -39 -17 -75t-47 -72t-69 -72.5t-82 -73.5q-31 -27 -61.5 -56.5t-34.5 -52.5h340v-117h-487q-6 61 8 107.5t40.5 85.5t62.5 70.5t73 64.5q61 53 100 98.5t39 88.5q0 92 -112 92q-31 0 -58.5 -8.5 t-50.5 -19.5t-39 -23.5t-27 -20.5z" />
|
||||||
|
<glyph unicode="³" d="M258 604l27 109q41 -16 86 -26.5t92 -10.5q98 0 134 29.5t36 76.5q0 31 -16.5 52.5t-44 36t-64.5 20.5t-76 6h-35v104h45q27 0 54.5 5.5t50 16.5t38 29.5t15.5 47.5q0 45 -34 64.5t-87 19.5q-49 0 -91 -17.5t-73 -31.5l-47 100q29 20 91.5 40.5t123.5 20.5 q133 0 188.5 -53t55.5 -139q0 -88 -100 -146q66 -20 102.5 -66t36.5 -112q0 -92 -69.5 -155.5t-231.5 -63.5q-57 0 -115.5 13.5t-91.5 29.5z" />
|
||||||
|
<glyph unicode="´" d="M348 1137l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="µ" d="M145 -338v1288h170v-497q0 -88 11.5 -149.5t37 -100.5t67.5 -56.5t104 -17.5q27 0 54 2t52 4t43 5t25 5v805h170v-923q-55 -14 -146.5 -32t-214.5 -18q-84 0 -130 18.5t-81 49.5q6 -47 7 -94t1 -101v-188h-170z" />
|
||||||
|
<glyph unicode="¶" d="M57 877q0 100 38 174.5t109.5 126t173 77t228.5 25.5q72 0 154 -6t155 -27v-1585h-143v1471q-94 12 -178 4v-1475h-141v817q-190 20 -293 114.5t-103 283.5z" />
|
||||||
|
<glyph unicode="·" d="M362 532q0 63 41 110.5t111 47.5q68 0 109 -47.5t41 -110.5q0 -61 -41 -108.5t-109 -47.5q-70 0 -111 47.5t-41 108.5z" />
|
||||||
|
<glyph unicode="¸" d="M319 -322l21 105q23 -8 47.5 -13.5t54.5 -5.5q66 0 66 41t-76 64l-14 4q6 18 17 43t22.5 49.5t21.5 44t15 27.5h116q-10 -23 -26.5 -52.5t-26.5 -52.5q53 -25 76.5 -55.5t23.5 -89.5q0 -20 -9 -44t-30.5 -43t-57.5 -32.5t-89 -13.5q-47 0 -88 7t-64 17z" />
|
||||||
|
<glyph unicode="¹" d="M258 1137q70 23 137.5 60.5t116.5 84.5h90v-590h182v-117h-512v117h201v422q-41 -27 -92 -47t-88 -31z" />
|
||||||
|
<glyph unicode="º" d="M182 948q0 80 24.5 143.5t68.5 108.5t104.5 69.5t132.5 24.5t132.5 -24.5t104.5 -69.5t68.5 -108.5t24.5 -143.5t-24.5 -143.5t-68.5 -109.5t-104.5 -70.5t-132.5 -24.5t-132.5 24.5t-104.5 70.5t-68.5 109.5t-24.5 143.5zM317 948q0 -102 50.5 -163.5t144.5 -61.5 t144.5 61.5t50.5 163.5q0 104 -50.5 163.5t-144.5 59.5q-92 0 -143.5 -59t-51.5 -164z" />
|
||||||
|
<glyph unicode="»" d="M174 217l172 305l-166 295l103 64l241 -359l-243 -360zM543 217l172 305l-164 295l102 64l242 -359l-246 -360z" />
|
||||||
|
<glyph unicode="¼" d="M37 1149q70 29 119 57.5t98 75.5h82v-512h-121v344q-41 -23 -73.5 -37t-69.5 -26zM51 -8l776 1268h144l-776 -1268h-144zM518 98v84q53 94 102.5 171t112.5 159h170v-311h74v-103h-74v-98h-121v98h-264zM639 201h143v223q-43 -55 -77.5 -112.5t-65.5 -110.5z" />
|
||||||
|
<glyph unicode="½" d="M35 0l776 1268h143l-776 -1268h-143zM49 1149q72 29 120 57.5t97 75.5h84v-512h-121v344q-41 -23 -74.5 -37t-70.5 -26zM582 23.5v23.5q0 66 41 101.5t94 68.5l45 31q49 29 67.5 54.5t18.5 53.5q0 35 -23.5 51.5t-56.5 16.5q-31 0 -63.5 -13.5t-57.5 -39.5l-65 82 q35 39 88 58t106 19q96 0 144.5 -51t48.5 -117q0 -53 -27 -91t-65.5 -66.5t-79.5 -53t-68 -49.5h258v-102h-403q-2 6 -2 23.5z" />
|
||||||
|
<glyph unicode="¾" d="M43 780l31 101q23 -10 56.5 -18.5t74.5 -8.5q45 0 78.5 13.5t33.5 47.5q0 43 -38.5 55.5t-116.5 12.5h-25v102h45q53 0 82 11.5t29 48.5q0 31 -25.5 40t-54.5 9t-65.5 -10t-61.5 -21l-39 88q31 18 81 31.5t103 13.5q35 0 68 -7t58.5 -22.5t41 -41t15.5 -62.5 q0 -31 -15.5 -61.5t-48.5 -52.5q88 -41 88 -134q0 -29 -12 -58.5t-39 -53t-70 -37.5t-104 -14q-94 0 -170 28zM61 0l777 1268h143l-776 -1268h-144zM518 98v84q53 94 102.5 171t112.5 159h170v-311h74v-103h-74v-98h-121v98h-264zM639 201h143v223q-43 -55 -77.5 -112.5 t-65.5 -110.5z" />
|
||||||
|
<glyph unicode="¿" d="M188 -47q0 61 24 108.5t58.5 87t75.5 76.5t76 78t58.5 87t23.5 108h145l2 -41q0 -59 -21.5 -104.5t-53 -84.5t-69.5 -72.5t-69.5 -68.5t-53.5 -74t-22 -86q0 -78 49.5 -125t143.5 -47q121 0 238 62l47 -131q-61 -33 -139 -53.5t-166 -20.5q-104 0 -171 28.5t-106 72.5 t-54.5 97.5t-15.5 102.5zM424 813q0 63 41 101t96 38q57 0 97 -37.5t40 -101.5q0 -63 -40 -100t-97 -37q-55 0 -96 37t-41 100z" />
|
||||||
|
<glyph unicode="À" d="M18 0q35 135 78 293t93.5 323.5t105.5 332.5t117 319h209q59 -152 113 -319t102.5 -332.5t91.5 -323.5t78 -293h-179l-75 332h-488l-74 -332h-172zM303 471h410q-47 184 -101.5 355t-101.5 294q-47 -129 -102.5 -299t-104.5 -350zM342 1592l108 108l234 -282l-86 -76z " />
|
||||||
|
<glyph unicode="Á" d="M18 0q35 135 78 293t93.5 323.5t105.5 332.5t117 319h209q59 -152 113 -319t102.5 -332.5t91.5 -323.5t78 -293h-179l-75 332h-488l-74 -332h-172zM303 471h410q-47 184 -101.5 355t-101.5 294q-47 -129 -102.5 -299t-104.5 -350zM342 1418l234 282l110 -108l-258 -250z " />
|
||||||
|
<glyph unicode="Â" d="M18 0q35 135 78 293t93.5 323.5t105.5 332.5t117 319h209q59 -152 113 -319t102.5 -332.5t91.5 -323.5t78 -293h-179l-75 332h-488l-74 -332h-172zM264 1430l248 262l248 -262l-70 -80l-178 160l-178 -160zM303 471h410q-47 184 -101.5 355t-101.5 294 q-47 -129 -102.5 -299t-104.5 -350z" />
|
||||||
|
<glyph unicode="Ã" d="M18 0q35 135 78 293t93.5 323.5t105.5 332.5t117 319h209q59 -152 113 -319t102.5 -332.5t91.5 -323.5t78 -293h-179l-75 332h-488l-74 -332h-172zM229 1454q6 23 21.5 51.5t38 53t53.5 42t68 17.5q27 0 62.5 -15t57.5 -26q53 -29 86 -28q27 0 52.5 26.5t38.5 55.5 l88 -46q-6 -23 -21.5 -51t-38 -53t-53.5 -42t-70 -17q-27 0 -62.5 14t-57.5 25q-53 29 -86 28q-27 0 -51.5 -26.5t-37.5 -55.5zM303 471h410q-47 184 -101.5 355t-101.5 294q-47 -129 -102.5 -299t-104.5 -350z" />
|
||||||
|
<glyph unicode="Ä" d="M18 0q35 135 78 293t93.5 323.5t105.5 332.5t117 319h209q59 -152 113 -319t102.5 -332.5t91.5 -323.5t78 -293h-179l-75 332h-488l-74 -332h-172zM231 1520q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM303 471h410 q-47 184 -101.5 355t-101.5 294q-47 -129 -102.5 -299t-104.5 -350zM580 1520q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="Å" d="M18 0q33 129 77 287.5t93.5 321.5t101.5 316.5t105 274.5q-29 25 -49 62.5t-20 85.5q0 86 56 136t132 50t132 -50t56 -136q0 -45 -19 -84t-48 -62q51 -121 103.5 -275.5t100.5 -318.5t90 -322.5t77 -285.5h-179l-75 332h-488l-74 -332h-172zM303 471h410 q-47 184 -101.5 355t-101.5 294q-47 -129 -102.5 -299t-104.5 -350zM418 1348q0 -47 27.5 -74t68.5 -27t68.5 27t27.5 74t-27.5 73.5t-68.5 26.5t-68.5 -26.5t-27.5 -73.5z" />
|
||||||
|
<glyph unicode="Æ" d="M55 0q92 356 186.5 668.5t207.5 599.5h512v-144h-263v-389h215v-143h-215v-449h289v-143h-448v332h-242l-76 -332h-166zM334 471h205v688q-57 -180 -109.5 -358t-95.5 -330z" />
|
||||||
|
<glyph unicode="Ç" d="M94 635q0 162 42 284.5t114 206.5t168 127t205 43q76 0 154.5 -20.5t154.5 -67.5l-49 -139q-135 78 -254 78q-84 0 -150.5 -36t-114 -103.5t-73 -161.5t-25.5 -211q0 -131 28 -227.5t77 -160t117.5 -94t148.5 -30.5q59 0 124.5 15.5t135.5 54.5l45 -140 q-119 -68 -270 -78l-23 -43q53 -25 77 -55.5t24 -89.5q0 -20 -9.5 -44t-31 -43t-57.5 -32.5t-89 -13.5q-47 0 -88 7t-63 17l20 105q23 -8 47.5 -13.5t55.5 -5.5q66 0 65 41q0 41 -76 64l-14 4q8 23 20.5 50.5t24.5 53.5q-100 10 -185 54.5t-146.5 126.5t-95.5 200.5 t-34 276.5z" />
|
||||||
|
<glyph unicode="È" d="M186 0v1268h711v-144h-543v-389h475v-143h-475v-449h588v-143h-756zM363 1592l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="É" d="M186 0v1268h711v-144h-543v-389h475v-143h-475v-449h588v-143h-756zM401 1418l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="Ê" d="M186 0v1268h711v-144h-543v-389h475v-143h-475v-449h588v-143h-756zM301 1430l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="Ë" d="M186 0v1268h711v-144h-543v-389h475v-143h-475v-449h588v-143h-756zM268 1520q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM617 1520q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z " />
|
||||||
|
<glyph unicode="Ì" d="M182 0v143h246v981h-246v144h660v-144h-246v-981h246v-143h-660zM344 1592l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="Í" d="M182 0v143h246v981h-246v144h660v-144h-246v-981h246v-143h-660zM368 1418l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="Î" d="M182 0v143h246v981h-246v144h660v-144h-246v-981h246v-143h-660zM264 1430l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="Ï" d="M182 0v143h246v981h-246v144h660v-144h-246v-981h246v-143h-660zM231 1520q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM580 1520q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="Ð" d="M37 596v131h108v522q125 31 250 31q117 0 217.5 -35t173 -112.5t114.5 -200.5t42 -297q0 -176 -42 -299t-114.5 -200t-173 -111.5t-217.5 -34.5q-125 0 -250 30v576h-108zM315 141q23 -4 47.5 -5t47.5 -1q86 0 152.5 27.5t112.5 88t70.5 156t24.5 228.5q0 258 -93 379 t-274 121q-51 0 -88 -7v-401h201v-131h-201v-455z" />
|
||||||
|
<glyph unicode="Ñ" d="M113 0v1268h172q84 -154 146.5 -268.5t114.5 -222t101 -221.5t111 -263v975h153v-1268h-172q-70 170 -131 308t-117.5 259t-111.5 228.5t-113 216.5v-1012h-153zM229 1454q6 23 21.5 51.5t38 53t53.5 42t68 17.5q27 0 62.5 -15t57.5 -26q53 -29 86 -28q27 0 52.5 26.5 t38.5 55.5l88 -46q-6 -23 -21.5 -51t-38 -53t-53.5 -42t-70 -17q-27 0 -62.5 14t-57.5 25q-53 29 -86 28q-27 0 -51.5 -26.5t-37.5 -55.5z" />
|
||||||
|
<glyph unicode="Ò" d="M59 635q0 170 33 295t92.5 206t142.5 120.5t185 39.5q100 0 184 -39.5t143.5 -120.5t93.5 -206t34 -295t-34 -295t-93.5 -207t-143.5 -121t-184 -39q-102 0 -185 39t-142.5 121t-92.5 207t-33 295zM231 635q0 -250 68 -383t209 -133q143 0 215 133t72 383t-72 383 t-215 133q-141 0 -209 -133t-68 -383zM344 1592l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="Ó" d="M59 635q0 170 33 295t92.5 206t142.5 120.5t185 39.5q100 0 184 -39.5t143.5 -120.5t93.5 -206t34 -295t-34 -295t-93.5 -207t-143.5 -121t-184 -39q-102 0 -185 39t-142.5 121t-92.5 207t-33 295zM231 635q0 -250 68 -383t209 -133q143 0 215 133t72 383t-72 383 t-215 133q-141 0 -209 -133t-68 -383zM366 1418l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="Ô" d="M59 635q0 170 33 295t92.5 206t142.5 120.5t185 39.5q100 0 184 -39.5t143.5 -120.5t93.5 -206t34 -295t-34 -295t-93.5 -207t-143.5 -121t-184 -39q-102 0 -185 39t-142.5 121t-92.5 207t-33 295zM231 635q0 -250 68 -383t209 -133q143 0 215 133t72 383t-72 383 t-215 133q-141 0 -209 -133t-68 -383zM264 1430l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="Õ" d="M59 635q0 170 33 295t92.5 206t142.5 120.5t185 39.5q100 0 184 -39.5t143.5 -120.5t93.5 -206t34 -295t-34 -295t-93.5 -207t-143.5 -121t-184 -39q-102 0 -185 39t-142.5 121t-92.5 207t-33 295zM229 1454q6 23 21.5 51.5t38 53t53.5 42t68 17.5q27 0 62.5 -15 t57.5 -26q53 -29 86 -28q27 0 52.5 26.5t38.5 55.5l88 -46q-6 -23 -21.5 -51t-38 -53t-53.5 -42t-70 -17q-27 0 -62.5 14t-57.5 25q-53 29 -86 28q-27 0 -51.5 -26.5t-37.5 -55.5zM231 635q0 -250 68 -383t209 -133q143 0 215 133t72 383t-72 383t-215 133q-141 0 -209 -133 t-68 -383z" />
|
||||||
|
<glyph unicode="Ö" d="M59 635q0 170 33 295t92.5 206t142.5 120.5t185 39.5q100 0 184 -39.5t143.5 -120.5t93.5 -206t34 -295t-34 -295t-93.5 -207t-143.5 -121t-184 -39q-102 0 -185 39t-142.5 121t-92.5 207t-33 295zM231 635q0 -250 68 -383t209 -133q143 0 215 133t72 383t-72 383 t-215 133q-141 0 -209 -133t-68 -383zM231 1520q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM580 1520q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="×" d="M143 270l267 269l-267 266l103 102l266 -266l266 266l103 -102l-267 -266l267 -269l-103 -102l-266 268l-266 -268z" />
|
||||||
|
<glyph unicode="Ø" d="M59 635q0 170 33 295t92.5 206t142.5 120.5t185 39.5q115 0 211 -55l43 92l127 -63l-62 -125q63 -84 99.5 -210t36.5 -300q0 -170 -34 -295t-93.5 -207t-143.5 -121t-184 -39q-127 0 -221 58l-47 -99l-125 64l65 135q-61 82 -93 206t-32 298zM231 635q0 -98 6.5 -183 t28.5 -149l389 803q-31 25 -67.5 35t-79.5 10q-141 0 -209 -133t-68 -383zM356 166q31 -27 71 -37t81 -10q143 0 215 133t72 383q0 102 -11.5 188t-35.5 150z" />
|
||||||
|
<glyph unicode="Ù" d="M98 436v832h168v-813q0 -96 17.5 -161t49.5 -103.5t77 -55t102 -16.5t102 16.5t77 55t49.5 103t17.5 161.5v813h168v-832q0 -106 -22.5 -192t-72 -145.5t-128 -92.5t-191.5 -33t-191.5 33t-128 92.5t-72 145.5t-22.5 192zM334 1592l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="Ú" d="M98 436v832h168v-813q0 -96 17.5 -161t49.5 -103.5t77 -55t102 -16.5t102 16.5t77 55t49.5 103t17.5 161.5v813h168v-832q0 -106 -22.5 -192t-72 -145.5t-128 -92.5t-191.5 -33t-191.5 33t-128 92.5t-72 145.5t-22.5 192zM366 1418l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="Û" d="M98 436v832h168v-813q0 -96 17.5 -161t49.5 -103.5t77 -55t102 -16.5t102 16.5t77 55t49.5 103t17.5 161.5v813h168v-832q0 -106 -22.5 -192t-72 -145.5t-128 -92.5t-191.5 -33t-191.5 33t-128 92.5t-72 145.5t-22.5 192zM264 1430l248 262l248 -262l-70 -80l-178 160 l-178 -160z" />
|
||||||
|
<glyph unicode="Ü" d="M98 436v832h168v-813q0 -96 17.5 -161t49.5 -103.5t77 -55t102 -16.5t102 16.5t77 55t49.5 103t17.5 161.5v813h168v-832q0 -106 -22.5 -192t-72 -145.5t-128 -92.5t-191.5 -33t-191.5 33t-128 92.5t-72 145.5t-22.5 192zM231 1520q0 47 33 76.5t74 29.5q43 0 74.5 -29.5 t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM580 1520q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="Ý" d="M27 1268h188q59 -172 136 -329t165 -323q94 174 167 331t132 321h184q-78 -201 -178 -391.5t-223 -401.5v-475h-168v471q-125 205 -226.5 399.5t-176.5 397.5zM366 1418l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="Þ" d="M150 0v1268h167v-211q63 6 125 6q236 0 363 -93t127 -274q0 -121 -36 -202.5t-101.5 -134t-158.5 -75t-206 -22.5h-113v-262h-167zM317 403h119q72 0 131.5 13.5t102.5 46.5t66.5 87t23.5 138q0 68 -25.5 112t-66.5 69.5t-93.5 35.5t-105.5 10h-87t-65 -2v-510z" />
|
||||||
|
<glyph unicode="ß" d="M145 0v1014q0 90 24 164.5t67 128t105 83t140 29.5q94 0 160 -23.5t104.5 -64.5t56 -94.5t17.5 -110.5q0 -49 -15.5 -90t-38 -74.5t-51 -62.5t-52.5 -55q-29 -33 -42.5 -54.5t-13.5 -52.5q0 -41 28 -67.5t68.5 -50t88 -48t88.5 -60.5t68.5 -88t27.5 -132q0 -156 -84 -235 t-262 -79q-33 0 -67 6.5t-63.5 14.5t-51 16.5t-31.5 14.5l28 149q10 -6 31 -15t47.5 -18.5t57 -15.5t61.5 -6q84 0 123 41t39 119q0 55 -27.5 91t-68.5 63.5t-90.5 51t-90.5 53t-68.5 69.5t-27.5 102q0 74 31 123t78 96q43 41 76.5 82t33.5 88q0 78 -37 124t-118 46 q-86 0 -132.5 -69.5t-46.5 -192.5v-1010h-170z" />
|
||||||
|
<glyph unicode="à" d="M119 283q0 82 35.5 138t92 91t129.5 50.5t146 15.5q100 0 197 -23v47q0 43 -9.5 83t-35 73t-69.5 52t-113 19q-88 0 -154 -12t-100 -24l-21 139q35 16 116 28.5t173 12.5q106 0 179 -26.5t118 -74t63.5 -115t18.5 -147.5v-594q-59 -10 -156.5 -24.5t-200.5 -14.5 q-78 0 -151.5 13.5t-131 47.5t-92 93t-34.5 152zM291 285q0 -92 62.5 -128t168.5 -36q63 0 113.5 4t83.5 10v283q-33 10 -79 16t-97 6q-47 0 -92 -7t-80 -25.5t-57.5 -48t-22.5 -74.5zM334 1311l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="á" d="M119 283q0 82 35.5 138t92 91t129.5 50.5t146 15.5q100 0 197 -23v47q0 43 -9.5 83t-35 73t-69.5 52t-113 19q-88 0 -154 -12t-100 -24l-21 139q35 16 116 28.5t173 12.5q106 0 179 -26.5t118 -74t63.5 -115t18.5 -147.5v-594q-59 -10 -156.5 -24.5t-200.5 -14.5 q-78 0 -151.5 13.5t-131 47.5t-92 93t-34.5 152zM291 285q0 -92 62.5 -128t168.5 -36q63 0 113.5 4t83.5 10v283q-33 10 -79 16t-97 6q-47 0 -92 -7t-80 -25.5t-57.5 -48t-22.5 -74.5zM385 1137l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="â" d="M119 283q0 82 35.5 138t92 91t129.5 50.5t146 15.5q100 0 197 -23v47q0 43 -9.5 83t-35 73t-69.5 52t-113 19q-88 0 -154 -12t-100 -24l-21 139q35 16 116 28.5t173 12.5q106 0 179 -26.5t118 -74t63.5 -115t18.5 -147.5v-594q-59 -10 -156.5 -24.5t-200.5 -14.5 q-78 0 -151.5 13.5t-131 47.5t-92 93t-34.5 152zM282 1145l248 262l248 -262l-70 -80l-178 160l-178 -160zM291 285q0 -92 62.5 -128t168.5 -36q63 0 113.5 4t83.5 10v283q-33 10 -79 16t-97 6q-47 0 -92 -7t-80 -25.5t-57.5 -48t-22.5 -74.5z" />
|
||||||
|
<glyph unicode="ã" d="M119 283q0 82 35.5 138t92 91t129.5 50.5t146 15.5q100 0 197 -23v47q0 43 -9.5 83t-35 73t-69.5 52t-113 19q-88 0 -154 -12t-100 -24l-21 139q35 16 116 28.5t173 12.5q106 0 179 -26.5t118 -74t63.5 -115t18.5 -147.5v-594q-59 -10 -156.5 -24.5t-200.5 -14.5 q-78 0 -151.5 13.5t-131 47.5t-92 93t-34.5 152zM229 1169q6 23 21.5 51.5t38 53t53.5 42t68 17.5q27 0 62.5 -15t57.5 -26q53 -29 86 -28q27 0 52.5 26.5t38.5 55.5l88 -46q-6 -23 -21.5 -51t-38 -53t-53.5 -42t-70 -17q-27 0 -62.5 14t-57.5 25q-53 29 -86 28 q-27 0 -51.5 -26.5t-37.5 -55.5zM291 285q0 -92 62.5 -128t168.5 -36q63 0 113.5 4t83.5 10v283q-33 10 -79 16t-97 6q-47 0 -92 -7t-80 -25.5t-57.5 -48t-22.5 -74.5z" />
|
||||||
|
<glyph unicode="ä" d="M119 283q0 82 35.5 138t92 91t129.5 50.5t146 15.5q100 0 197 -23v47q0 43 -9.5 83t-35 73t-69.5 52t-113 19q-88 0 -154 -12t-100 -24l-21 139q35 16 116 28.5t173 12.5q106 0 179 -26.5t118 -74t63.5 -115t18.5 -147.5v-594q-59 -10 -156.5 -24.5t-200.5 -14.5 q-78 0 -151.5 13.5t-131 47.5t-92 93t-34.5 152zM231 1235q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM291 285q0 -92 62.5 -128t168.5 -36q63 0 113.5 4t83.5 10v283q-33 10 -79 16t-97 6q-47 0 -92 -7t-80 -25.5 t-57.5 -48t-22.5 -74.5zM580 1235q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="å" d="M119 283q0 82 35.5 138t92 91t129.5 50.5t146 15.5q100 0 197 -23v47q0 43 -9.5 83t-35 73t-69.5 52t-113 19q-88 0 -154 -12t-100 -24l-21 139q35 16 116 28.5t173 12.5q106 0 179 -26.5t118 -74t63.5 -115t18.5 -147.5v-594q-59 -10 -156.5 -24.5t-200.5 -14.5 q-78 0 -151.5 13.5t-131 47.5t-92 93t-34.5 152zM291 285q0 -92 62.5 -128t168.5 -36q63 0 113.5 4t83.5 10v283q-33 10 -79 16t-97 6q-47 0 -92 -7t-80 -25.5t-57.5 -48t-22.5 -74.5zM324 1239q0 86 56 136t132 50t132 -50t56 -136q0 -88 -56 -138t-132 -50t-132 50 t-56 138zM416 1239q0 -49 27.5 -75.5t68.5 -26.5t68.5 26.5t27.5 75.5q0 47 -27.5 73.5t-68.5 26.5t-68.5 -26.5t-27.5 -73.5z" />
|
||||||
|
<glyph unicode="æ" d="M63 270q0 63 17.5 119.5t52.5 98.5t85 66t118 24q25 0 54.5 -5.5t53.5 -17.5v47q0 96 -36.5 161.5t-114.5 65.5q-45 0 -88 -12t-60 -24l-18 139q18 16 72.5 28.5t107.5 12.5q90 0 147.5 -35t88.5 -96q33 61 76 96t96 35q264 0 264 -484v-27.5t-2 -31.5h-379 q0 -147 53.5 -224t136.5 -77q66 0 142 45l22 -143q-8 -8 -27.5 -17.5t-44 -17.5t-53 -13.5t-55.5 -5.5q-68 0 -120 24t-91 65q-55 -47 -112.5 -68t-116.5 -21q-68 0 -118 26t-84 67t-50.5 93t-16.5 107zM217 281q0 -61 32 -110.5t97 -49.5q35 0 75 16.5t68 42.5 q-23 51 -35 111.5t-16 126.5q-41 22 -86 22q-68 0 -101.5 -43t-33.5 -116zM602 567h223q0 76 -9 126t-24.5 81t-34 43t-34.5 12q-47 0 -84 -59t-37 -203z" />
|
||||||
|
<glyph unicode="ç" d="M100 473q0 129 41 223.5t113 155.5t167 91t204 30q70 0 138 -9.5t146 -33.5l-39 -146q-68 25 -124 32t-113 7q-74 0 -139.5 -19.5t-113.5 -61.5t-77 -108.5t-29 -160.5q0 -90 27 -154.5t75 -106.5t115.5 -62.5t149.5 -20.5q66 0 126 7t132 32l25 -141q-70 -25 -141.5 -36 t-157.5 -14l-23 -45q53 -25 76.5 -55.5t23.5 -89.5q0 -20 -9 -44t-30.5 -43t-57.5 -32.5t-89 -13.5q-47 0 -88 7t-63 17l20 105q23 -8 47.5 -13.5t54.5 -5.5q66 0 66 41t-76 64l-14 4q8 23 21.5 53.5t27.5 59.5q-186 27 -299 148.5t-113 338.5z" />
|
||||||
|
<glyph unicode="è" d="M82 473q0 127 39 221t102.5 155.5t143 92.5t163.5 31q193 0 297.5 -120t104.5 -364v-59h-680q10 -147 97 -224t245 -77q90 0 153.5 14.5t96.5 30.5l22 -143q-31 -16 -110.5 -35t-180.5 -19q-123 0 -216 38t-154.5 103.5t-92 157t-30.5 197.5zM256 567h504 q0 121 -63.5 191.5t-168.5 70.5q-59 0 -107 -22.5t-83 -59t-55.5 -84t-26.5 -96.5zM334 1311l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="é" d="M82 473q0 127 39 221t102.5 155.5t143 92.5t163.5 31q193 0 297.5 -120t104.5 -364v-59h-680q10 -147 97 -224t245 -77q90 0 153.5 14.5t96.5 30.5l22 -143q-31 -16 -110.5 -35t-180.5 -19q-123 0 -216 38t-154.5 103.5t-92 157t-30.5 197.5zM256 567h504 q0 121 -63.5 191.5t-168.5 70.5q-59 0 -107 -22.5t-83 -59t-55.5 -84t-26.5 -96.5zM385 1137l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="ê" d="M82 473q0 127 39 221t102.5 155.5t143 92.5t163.5 31q193 0 297.5 -120t104.5 -364v-59h-680q10 -147 97 -224t245 -77q90 0 153.5 14.5t96.5 30.5l22 -143q-31 -16 -110.5 -35t-180.5 -19q-123 0 -216 38t-154.5 103.5t-92 157t-30.5 197.5zM256 567h504 q0 121 -63.5 191.5t-168.5 70.5q-59 0 -107 -22.5t-83 -59t-55.5 -84t-26.5 -96.5zM291 1145l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="ë" d="M82 473q0 127 39 221t102.5 155.5t143 92.5t163.5 31q193 0 297.5 -120t104.5 -364v-59h-680q10 -147 97 -224t245 -77q90 0 153.5 14.5t96.5 30.5l22 -143q-31 -16 -110.5 -35t-180.5 -19q-123 0 -216 38t-154.5 103.5t-92 157t-30.5 197.5zM256 567h504 q0 121 -63.5 191.5t-168.5 70.5q-59 0 -107 -22.5t-83 -59t-55.5 -84t-26.5 -96.5zM258 1235q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM607 1235q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31 t-31.5 78z" />
|
||||||
|
<glyph unicode="ì" d="M111 809v141h442v-583q0 -141 39 -189.5t117 -48.5q59 0 109 14.5t79 30.5l25 -143q-12 -6 -35 -15.5t-52.5 -17.5t-65.5 -14.5t-75 -6.5q-90 0 -149.5 25t-95 74t-50 121.5t-14.5 169.5v442h-274zM262 1311l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="í" d="M111 809v141h442v-583q0 -141 39 -189.5t117 -48.5q59 0 109 14.5t79 30.5l25 -143q-12 -6 -35 -15.5t-52.5 -17.5t-65.5 -14.5t-75 -6.5q-90 0 -149.5 25t-95 74t-50 121.5t-14.5 169.5v442h-274zM295 1137l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="î" d="M111 809v141h442v-583q0 -141 39 -189.5t117 -48.5q59 0 109 14.5t79 30.5l25 -143q-12 -6 -35 -15.5t-52.5 -17.5t-65.5 -14.5t-75 -6.5q-90 0 -149.5 25t-95 74t-50 121.5t-14.5 169.5v442h-274zM192 1145l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="ï" d="M111 809v141h442v-583q0 -141 39 -189.5t117 -48.5q59 0 109 14.5t79 30.5l25 -143q-12 -6 -35 -15.5t-52.5 -17.5t-65.5 -14.5t-75 -6.5q-90 0 -149.5 25t-95 74t-50 121.5t-14.5 169.5v442h-274zM159 1235q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78 t-74.5 -31q-41 0 -74 31t-33 78zM508 1235q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="ð" d="M113 418q0 233 98 356t268 123q78 0 137.5 -29.5t88.5 -56.5q-10 74 -39 141.5t-70 130.5l-219 -75l-43 114l188 66q-31 35 -62.5 66.5t-78.5 66.5l94 98q41 -27 93.5 -70.5t105.5 -109.5l225 78l43 -115l-197 -67q59 -100 99.5 -245t40.5 -329q0 -100 -17.5 -203.5 t-62.5 -188.5t-123 -138.5t-199 -53.5q-92 0 -161.5 39t-115.5 102.5t-69.5 141.5t-23.5 158zM281 424q0 -59 13 -114.5t38.5 -97.5t63.5 -66.5t87 -24.5q70 0 116 38t72.5 99t37 139t10.5 158q0 45 -1 63.5t-1 34.5q-51 55 -109.5 78t-105.5 23q-115 0 -168 -92.5 t-53 -237.5z" />
|
||||||
|
<glyph unicode="ñ" d="M145 0v924q92 23 183.5 35t171.5 12q190 0 287.5 -98.5t97.5 -315.5v-557h-168v526q0 92 -16.5 149.5t-46 89.5t-71.5 44t-91 12q-41 0 -87.5 -5t-89.5 -13v-803h-170zM229 1169q6 23 21.5 51.5t38 53t53.5 42t68 17.5q27 0 62.5 -15t57.5 -26q53 -29 86 -28 q27 0 52.5 26.5t38.5 55.5l88 -46q-6 -23 -21.5 -51t-38 -53t-53.5 -42t-70 -17q-27 0 -62.5 14t-57.5 25q-53 29 -86 28q-27 0 -51.5 -26.5t-37.5 -55.5z" />
|
||||||
|
<glyph unicode="ò" d="M82 475q0 113 31.5 205t89 156.5t136.5 100.5t171 36q94 0 174 -36t137.5 -100.5t89 -156.5t31.5 -205t-31.5 -204t-89 -156.5t-137.5 -101.5t-174 -36q-92 0 -171 36t-136.5 101.5t-89 156.5t-31.5 204zM256 475q0 -160 68.5 -253t185.5 -93q119 0 188.5 93t69.5 253 q0 162 -69.5 255t-188.5 93q-117 0 -185.5 -93t-68.5 -255zM352 1311l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="ó" d="M82 475q0 113 31.5 205t89 156.5t136.5 100.5t171 36q94 0 174 -36t137.5 -100.5t89 -156.5t31.5 -205t-31.5 -204t-89 -156.5t-137.5 -101.5t-174 -36q-92 0 -171 36t-136.5 101.5t-89 156.5t-31.5 204zM256 475q0 -160 68.5 -253t185.5 -93q119 0 188.5 93t69.5 253 q0 162 -69.5 255t-188.5 93q-117 0 -185.5 -93t-68.5 -255zM366 1137l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="ô" d="M82 475q0 113 31.5 205t89 156.5t136.5 100.5t171 36q94 0 174 -36t137.5 -100.5t89 -156.5t31.5 -205t-31.5 -204t-89 -156.5t-137.5 -101.5t-174 -36q-92 0 -171 36t-136.5 101.5t-89 156.5t-31.5 204zM256 475q0 -160 68.5 -253t185.5 -93q119 0 188.5 93t69.5 253 q0 162 -69.5 255t-188.5 93q-117 0 -185.5 -93t-68.5 -255zM264 1145l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="õ" d="M82 475q0 113 31.5 205t89 156.5t136.5 100.5t171 36q94 0 174 -36t137.5 -100.5t89 -156.5t31.5 -205t-31.5 -204t-89 -156.5t-137.5 -101.5t-174 -36q-92 0 -171 36t-136.5 101.5t-89 156.5t-31.5 204zM229 1169q6 23 21.5 51.5t38 53t53.5 42t68 17.5q27 0 62.5 -15 t57.5 -26q53 -29 86 -28q27 0 52.5 26.5t38.5 55.5l88 -46q-6 -23 -21.5 -51t-38 -53t-53.5 -42t-70 -17q-27 0 -62.5 14t-57.5 25q-53 29 -86 28q-27 0 -51.5 -26.5t-37.5 -55.5zM256 475q0 -160 68.5 -253t185.5 -93q119 0 188.5 93t69.5 253q0 162 -69.5 255t-188.5 93 q-117 0 -185.5 -93t-68.5 -255z" />
|
||||||
|
<glyph unicode="ö" d="M82 475q0 113 31.5 205t89 156.5t136.5 100.5t171 36q94 0 174 -36t137.5 -100.5t89 -156.5t31.5 -205t-31.5 -204t-89 -156.5t-137.5 -101.5t-174 -36q-92 0 -171 36t-136.5 101.5t-89 156.5t-31.5 204zM231 1235q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5 t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM256 475q0 -160 68.5 -253t185.5 -93q119 0 188.5 93t69.5 253q0 162 -69.5 255t-188.5 93q-117 0 -185.5 -93t-68.5 -255zM580 1235q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="÷" d="M94 467v143h838v-143h-838zM389 197q0 51 34 89t89 38q53 0 86 -38t33 -89q0 -49 -33 -86t-86 -37q-55 0 -89 36.5t-34 86.5zM389 877q0 51 34 87.5t89 36.5q53 0 86 -36.5t33 -87.5q0 -49 -33 -87t-86 -38q-55 0 -89 37.5t-34 87.5z" />
|
||||||
|
<glyph unicode="ø" d="M82 475q0 113 31.5 205t89 156.5t136.5 100.5t171 36q141 0 240 -74l86 117l96 -74l-94 -129q49 -63 76.5 -148t27.5 -190q0 -113 -31.5 -204t-89 -156.5t-137.5 -101.5t-174 -36q-68 0 -127 19.5t-111 54.5l-86 -117l-94 74l92 127q-47 66 -74.5 151t-27.5 189zM256 475 q0 -63 7 -110.5t26 -88.5l368 500q-29 25 -66.5 36t-80.5 11q-117 0 -185.5 -93t-68.5 -255zM365 174q29 -25 65.5 -35t79.5 -10q119 0 188.5 93t69.5 253q0 57 -7 108.5t-26 92.5z" />
|
||||||
|
<glyph unicode="ù" d="M139 416v534h168v-497q0 -176 52.5 -250t175.5 -74q27 0 54 2t52 5t43 6t25 5v803h170v-923q-55 -14 -146.5 -30.5t-214.5 -16.5q-109 0 -180.5 31.5t-116.5 90t-63.5 138t-18.5 176.5zM334 1311l108 108l234 -282l-86 -76z" />
|
||||||
|
<glyph unicode="ú" d="M139 416v534h168v-497q0 -176 52.5 -250t175.5 -74q27 0 54 2t52 5t43 6t25 5v803h170v-923q-55 -14 -146.5 -30.5t-214.5 -16.5q-109 0 -180.5 31.5t-116.5 90t-63.5 138t-18.5 176.5zM366 1137l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="û" d="M139 416v534h168v-497q0 -176 52.5 -250t175.5 -74q27 0 54 2t52 5t43 6t25 5v803h170v-923q-55 -14 -146.5 -30.5t-214.5 -16.5q-109 0 -180.5 31.5t-116.5 90t-63.5 138t-18.5 176.5zM264 1145l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="ü" d="M139 416v534h168v-497q0 -176 52.5 -250t175.5 -74q27 0 54 2t52 5t43 6t25 5v803h170v-923q-55 -14 -146.5 -30.5t-214.5 -16.5q-109 0 -180.5 31.5t-116.5 90t-63.5 138t-18.5 176.5zM231 1235q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31 q-41 0 -74 31t-33 78zM580 1235q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="ý" d="M74 -315l30 137q18 -10 52 -16.5t63 -6.5q100 0 156.5 44t103.5 145q-115 217 -215 465.5t-166 496.5h185q20 -82 47.5 -177t62.5 -195.5t75 -202t85 -193.5q33 94 61.5 186.5t53 185.5t49 190.5t51.5 205.5h176q-66 -266 -146.5 -516t-172.5 -463q-35 -82 -75 -141 t-87 -98t-106.5 -57.5t-135.5 -18.5q-39 0 -85 10t-62 19zM379 1137l234 282l110 -108l-258 -250z" />
|
||||||
|
<glyph unicode="þ" d="M145 -338v1729l170 28v-504q59 31 114.5 44.5t109.5 13.5q86 0 159.5 -34t128 -98.5t85 -156.5t30.5 -211q0 -109 -27.5 -200t-80 -156.5t-128 -102.5t-171.5 -37q-76 0 -133.5 18.5t-86.5 41.5v-375h-170zM315 201q29 -27 84.5 -49.5t114.5 -22.5q68 0 116 26.5 t78.5 72.5t45 108.5t14.5 136.5q0 88 -18.5 154.5t-52 109.5t-80 64.5t-99.5 21.5t-101 -18.5t-102 -52.5v-551z" />
|
||||||
|
<glyph unicode="ÿ" d="M74 -315l30 137q18 -10 52 -16.5t63 -6.5q100 0 156.5 44t103.5 145q-115 217 -215 465.5t-166 496.5h185q20 -82 47.5 -177t62.5 -195.5t75 -202t85 -193.5q33 94 61.5 186.5t53 185.5t49 190.5t51.5 205.5h176q-66 -266 -146.5 -516t-172.5 -463q-35 -82 -75 -141 t-87 -98t-106.5 -57.5t-135.5 -18.5q-39 0 -85 10t-62 19zM262 1235q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78zM611 1235q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="Œ" d="M55 616q0 328 106.5 496t291.5 168q23 0 53.5 -4t58.5 -8h396v-144h-263v-389h215v-143h-215v-449h289v-143h-422q-59 -12 -114 -12q-182 0 -289 150.5t-107 477.5zM219 616q0 -238 58.5 -360.5t173.5 -122.5q41 0 61 6t27 8v973q-27 10 -48.5 12.5t-39.5 2.5 q-55 0 -99.5 -37t-73 -104.5t-44 -163t-15.5 -214.5z" />
|
||||||
|
<glyph unicode="œ" d="M63 479q0 92 15.5 181.5t46.5 159t80 111.5t117 42q76 0 131 -43t84 -142q37 96 86 140.5t108 44.5q248 0 248 -484v-26t-2 -33h-361q0 -57 11.5 -111.5t33 -96.5t55.5 -67.5t79 -25.5q27 0 57.5 8t77.5 37l22 -143q-41 -29 -88 -41.5t-92 -12.5q-72 0 -133 40t-102 145 q-35 -94 -82 -139.5t-133 -45.5q-68 0 -116 43t-80 114t-47.5 161t-15.5 184zM219 485q0 -68 7 -131t22.5 -114.5t39 -82t58.5 -30.5q31 0 51.5 28.5t33.5 77t18.5 109.5t5.5 127t-6.5 130.5t-20.5 114.5t-37.5 81.5t-56.5 31.5q-31 0 -53.5 -29.5t-36 -76.5t-19.5 -109.5 t-6 -126.5zM621 567h204q0 121 -26.5 191.5t-67.5 70.5q-51 0 -80.5 -72.5t-29.5 -189.5z" />
|
||||||
|
<glyph unicode="Ÿ" d="M27 1268h188q59 -172 136 -329t165 -323q94 174 167 331t132 321h184q-78 -201 -178 -391.5t-223 -401.5v-475h-168v471q-125 205 -226.5 399.5t-176.5 397.5zM235 1520q0 47 33 76.5t74 29.5q43 0 74.5 -29.5t31.5 -76.5t-31.5 -78t-74.5 -31q-41 0 -74 31t-33 78z M584 1520q0 47 31.5 76.5t74.5 29.5t75 -29.5t32 -76.5t-32 -78t-75 -31t-74.5 31t-31.5 78z" />
|
||||||
|
<glyph unicode="ˆ" d="M264 1145l248 262l248 -262l-70 -80l-178 160l-178 -160z" />
|
||||||
|
<glyph unicode="˜" d="M229 1169q6 23 21.5 51.5t38 53t53.5 42t68 17.5q27 0 62.5 -15t57.5 -26q53 -29 86 -28q27 0 52.5 26.5t38.5 55.5l88 -46q-6 -23 -21.5 -51t-38 -53t-53.5 -42t-70 -17q-27 0 -62.5 14t-57.5 25q-53 29 -86 28q-27 0 -51.5 -26.5t-37.5 -55.5z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="850" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1700" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="850" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="1700" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="566" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="425" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="283" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="283" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="212" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="340" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="94" />
|
||||||
|
<glyph unicode="‐" d="M287 440v160h450v-160h-450z" />
|
||||||
|
<glyph unicode="‑" d="M287 440v160h450v-160h-450z" />
|
||||||
|
<glyph unicode="‒" d="M287 440v160h450v-160h-450z" />
|
||||||
|
<glyph unicode="–" d="M141 483v144h742v-144h-742z" />
|
||||||
|
<glyph unicode="—" d="M0 483v144h1024v-144h-1024z" />
|
||||||
|
<glyph unicode="‘" d="M305 1061q0 59 23.5 123.5t70.5 121t120 96.5t169 52l31 -133q-37 -8 -73 -16.5t-66.5 -23.5t-55 -39.5t-39.5 -63.5q66 -6 95.5 -50.5t29.5 -87.5q0 -82 -47 -124t-104 -42q-76 0 -115 54.5t-39 132.5z" />
|
||||||
|
<glyph unicode="’" d="M303 1001q37 8 73 16.5t66.5 24t55 39t39.5 64.5q-66 6 -95.5 50t-29.5 87q0 82 47 124t104 42q76 0 115 -54.5t39 -131.5q0 -59 -23.5 -124t-72 -121t-120 -96t-167.5 -53z" />
|
||||||
|
<glyph unicode="‚" d="M303 -162q37 8 73 16.5t66.5 24t55 39t39.5 64.5q-66 6 -95.5 50t-29.5 87q0 82 47 124t104 42q76 0 115 -54.5t39 -132.5q0 -59 -23.5 -123.5t-72 -121t-120 -96.5t-167.5 -52z" />
|
||||||
|
<glyph unicode="“" d="M88 1071q0 57 17.5 114.5t57.5 104.5t106.5 82t166.5 47l29 -119q-35 -8 -67.5 -15t-61.5 -21.5t-51.5 -36t-34.5 -58.5q59 -6 89 -46t30 -89q0 -51 -33 -93t-103 -42q-59 0 -102 41t-43 131zM561 1071q0 57 17.5 114.5t57.5 104.5t106.5 82t166.5 47l29 -119 q-35 -8 -67.5 -15t-60.5 -21.5t-50.5 -36t-34.5 -58.5q59 -6 89 -46t30 -89q0 -51 -34 -93t-101 -42q-59 0 -103.5 41t-44.5 131z" />
|
||||||
|
<glyph unicode="”" d="M86 1018q35 8 67.5 15t60.5 21.5t50.5 37t34.5 59.5q-59 4 -89 45t-30 88q0 51 34 93t101 42q59 0 103.5 -41t44.5 -131q0 -59 -17.5 -115.5t-57.5 -103.5t-106.5 -82t-166.5 -47zM559 1018q35 8 67.5 15t61.5 21.5t51.5 37t34.5 59.5q-59 4 -89 45t-30 88q0 51 33 93 t103 42q59 0 102 -41t43 -131q0 -59 -17.5 -115.5t-57.5 -103.5t-106.5 -82t-164.5 -47z" />
|
||||||
|
<glyph unicode="„" d="M86 -152q70 14 128 37t85 95q-59 6 -89 46t-30 87q0 51 34 93t101 42q59 0 103.5 -40t44.5 -130q0 -59 -17.5 -115.5t-57.5 -103.5t-106.5 -82t-166.5 -47zM561 -152q35 8 68 15.5t61.5 22t51 36t34.5 58.5q-59 6 -89 46t-30 87q0 51 33 93t103 42q59 0 102 -40t43 -130 q0 -59 -17.5 -115.5t-57.5 -103.5t-106.5 -82t-166.5 -47z" />
|
||||||
|
<glyph unicode="•" d="M233 647q0 57 19.5 110.5t55.5 94.5t87 64.5t117 23.5q63 0 115.5 -23.5t88.5 -64.5t55.5 -94.5t19.5 -110.5q0 -59 -19.5 -112.5t-55.5 -93.5t-88.5 -63.5t-115.5 -23.5q-66 0 -117 23.5t-87 63.5t-55.5 93.5t-19.5 112.5z" />
|
||||||
|
<glyph unicode="…" d="M63 86q0 45 30 78t79 33t79 -33t30 -78t-30 -78t-79 -33t-79 33t-30 78zM408 86q0 45 28.5 78t77.5 33t78 -33t29 -78t-29 -78t-78 -33t-77.5 33t-28.5 78zM748 86q0 45 28.5 78t77.5 33t78 -33t29 -78t-29 -78t-78 -33t-77.5 33t-28.5 78z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="340" />
|
||||||
|
<glyph unicode="‹" d="M295 520l285 404l118 -64l-202 -340l202 -340l-118 -65z" />
|
||||||
|
<glyph unicode="›" d="M326 180l202 340l-202 340l118 64l285 -404l-285 -405z" />
|
||||||
|
<glyph unicode=" " horiz-adv-x="425" />
|
||||||
|
<glyph unicode="€" d="M74 416v131h125q-2 20 -2 42.5v45.5v50.5t2 45.5h-125v131h143q37 217 154.5 322.5t312.5 105.5q82 0 134 -10t102 -29l-33 -143q-43 16 -95.5 26.5t-107.5 10.5q-139 0 -204.5 -77t-86.5 -206h408l-25 -131h-401q-2 -23 -2 -46v-50v-45.5t2 -42.5h366l-24 -131h-328 q27 -164 101.5 -227.5t197.5 -63.5q78 0 133.5 13.5t98.5 35.5l36 -145q-31 -16 -107.5 -35t-170.5 -19q-213 0 -324.5 117t-140.5 324h-139z" />
|
||||||
|
<glyph unicode="™" d="M37 1165v103h381v-103h-131v-434h-119v434h-131zM457 731q6 102 12 178t13 137.5t14.5 113.5t17.5 108h111l90 -279l96 279h111q10 -55 17 -108.5t13 -115t11.5 -137.5t11.5 -176h-119q0 8 -1 53t-2 103.5t-3 120t-4 102.5l-86 -238h-92l-80 238q-4 -41 -6 -102.5 t-3 -120t-2.5 -103.5t-1.5 -53h-118z" />
|
||||||
|
<glyph unicode="◼" horiz-adv-x="952" d="M0 0v952h952v-952h-952z" />
|
||||||
|
<glyph unicode="fi" d="M57 809v141h109v86q0 184 88 283.5t272 99.5q96 0 146 -12l-25 -147q-20 8 -43.5 11t-62.5 3q-115 0 -160 -64.5t-45 -175.5v-84h252v-141h-252v-809h-170v809h-109zM723 1235q0 51 31.5 81t76.5 30q47 0 79 -30t32 -81t-32 -82t-79 -31q-45 0 -76.5 31t-31.5 82zM748 0 v950h170v-950h-170z" />
|
||||||
|
<glyph unicode="fl" d="M57 809v141h109v86q0 184 88 283.5t272 99.5q96 0 146 -12l-25 -147q-20 8 -43.5 11t-62.5 3q-115 0 -160 -64.5t-45 -175.5v-84h252v-141h-252v-809h-170v809h-109zM729 248v1143l170 28v-1143q0 -43 5 -69.5t17.5 -43t33 -24.5t51.5 -14l-23 -143q-139 4 -196.5 67.5 t-57.5 198.5z" />
|
||||||
|
</font>
|
||||||
|
</defs></svg>
|
After Width: | Height: | Size: 62 KiB |
BIN
vendor/potsky/pimp-my-log/fonts/ubuntumono-r-webfont.ttf
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/fonts/ubuntumono-r-webfont.woff
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/fonts/ubuntumono-r-webfont.woff2
vendored
Normal file
11
vendor/potsky/pimp-my-log/humans.txt
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# humanstxt.org/
|
||||||
|
# The humans responsible & technology colophon
|
||||||
|
|
||||||
|
# TEAM
|
||||||
|
|
||||||
|
Potsky -- Developer -- @potskymac
|
||||||
|
|
||||||
|
# TECHNOLOGY COLOPHON
|
||||||
|
|
||||||
|
HTML5, CSS3, jQuery, PHP
|
||||||
|
|
BIN
vendor/potsky/pimp-my-log/img/1x1blue.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1blue_low.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1green.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1green_low.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1orange.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1orange_low.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1pink.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1pink_low.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1red.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1red_low.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1yellow.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/1x1yellow_low.gif
vendored
Normal file
After Width: | Height: | Size: 35 B |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon-114x114.png
vendored
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon-120x120.png
vendored
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon-144x144.png
vendored
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon-152x152.png
vendored
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon-57x57.png
vendored
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon-72x72.png
vendored
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon-76x76.png
vendored
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
vendor/potsky/pimp-my-log/img/apple-touch-icon.png
vendored
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
vendor/potsky/pimp-my-log/img/favicon.ico
vendored
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
vendor/potsky/pimp-my-log/img/icon36.png
vendored
Normal file
After Width: | Height: | Size: 887 B |
BIN
vendor/potsky/pimp-my-log/img/icon72.png
vendored
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
vendor/potsky/pimp-my-log/img/inputclear.png
vendored
Normal file
After Width: | Height: | Size: 88 B |
BIN
vendor/potsky/pimp-my-log/img/loader.gif
vendored
Normal file
After Width: | Height: | Size: 723 B |
853
vendor/potsky/pimp-my-log/inc/classes/Feedcreator.php
vendored
Normal file
@ -0,0 +1,853 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* A FeedItem is a part of a FeedCreator feed.
|
||||||
|
*
|
||||||
|
* @author Kai Blankenhorn <kaib@bitfolge.de>
|
||||||
|
* @since 1.3
|
||||||
|
*/
|
||||||
|
class FeedItem extends HtmlDescribable {
|
||||||
|
/**
|
||||||
|
* Mandatory attributes of an item.
|
||||||
|
*/
|
||||||
|
var $title, $description, $link;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional attributes of an item.
|
||||||
|
*/
|
||||||
|
var $author, $authorEmail, $image, $category, $comments, $guid, $source, $creator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publishing date of an item. May be in one of the following formats:
|
||||||
|
*
|
||||||
|
* RFC 822:
|
||||||
|
* "Mon, 20 Jan 03 18:05:41 +0400"
|
||||||
|
* "20 Jan 03 18:05:41 +0000"
|
||||||
|
*
|
||||||
|
* ISO 8601:
|
||||||
|
* "2003-01-20T18:05:41+04:00"
|
||||||
|
*
|
||||||
|
* Unix:
|
||||||
|
* 1043082341
|
||||||
|
*/
|
||||||
|
var $date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add <enclosure> element tag RSS 2.0
|
||||||
|
* modified by : Mohammad Hafiz bin Ismail (mypapit@gmail.com)
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* display :
|
||||||
|
* <enclosure length="17691" url="http://something.com/picture.jpg" type="image/jpeg" />
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
var $enclosure;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any additional elements to include as an assiciated array. All $key => $value pairs
|
||||||
|
* will be included unencoded in the feed item in the form
|
||||||
|
* <$key>$value</$key>
|
||||||
|
* Again: No encoding will be used! This means you can invalidate or enhance the feed
|
||||||
|
* if $value contains markup. This may be abused to embed tags not implemented by
|
||||||
|
* the FeedCreator class used.
|
||||||
|
*/
|
||||||
|
var $additionalElements = Array();
|
||||||
|
|
||||||
|
// on hold
|
||||||
|
// var $source;
|
||||||
|
}
|
||||||
|
|
||||||
|
class EnclosureItem extends HtmlDescribable {
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* core variables
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
var $url,$length,$type;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For use with another extension like Yahoo mRSS
|
||||||
|
* Warning :
|
||||||
|
* These variables might not show up in
|
||||||
|
* later release / not finalize yet!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
var $width, $height, $title, $description, $keywords, $thumburl;
|
||||||
|
|
||||||
|
var $additionalElements = Array();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An FeedImage may be added to a FeedCreator feed.
|
||||||
|
* @author Kai Blankenhorn <kaib@bitfolge.de>
|
||||||
|
* @since 1.3
|
||||||
|
*/
|
||||||
|
class FeedImage extends HtmlDescribable {
|
||||||
|
/**
|
||||||
|
* Mandatory attributes of an image.
|
||||||
|
*/
|
||||||
|
var $title, $url, $link;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional attributes of an image.
|
||||||
|
*/
|
||||||
|
var $width, $height, $description;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An HtmlDescribable is an item within a feed that can have a description that may
|
||||||
|
* include HTML markup.
|
||||||
|
*/
|
||||||
|
class HtmlDescribable {
|
||||||
|
/**
|
||||||
|
* Indicates whether the description field should be rendered in HTML.
|
||||||
|
*/
|
||||||
|
var $descriptionHtmlSyndicated;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether and to how many characters a description should be truncated.
|
||||||
|
*/
|
||||||
|
var $descriptionTruncSize;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a formatted description field, depending on descriptionHtmlSyndicated and
|
||||||
|
* $descriptionTruncSize properties
|
||||||
|
* @return string the formatted description
|
||||||
|
*/
|
||||||
|
function getDescription() {
|
||||||
|
$descriptionField = new FeedHtmlField($this->description);
|
||||||
|
$descriptionField->syndicateHtml = $this->descriptionHtmlSyndicated;
|
||||||
|
$descriptionField->truncSize = $this->descriptionTruncSize;
|
||||||
|
return $descriptionField->output();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An FeedHtmlField describes and generates
|
||||||
|
* a feed, item or image html field (probably a description). Output is
|
||||||
|
* generated based on $truncSize, $syndicateHtml properties.
|
||||||
|
* @author Pascal Van Hecke <feedcreator.class.php@vanhecke.info>
|
||||||
|
* @version 1.6
|
||||||
|
*/
|
||||||
|
class FeedHtmlField {
|
||||||
|
/**
|
||||||
|
* Mandatory attributes of a FeedHtmlField.
|
||||||
|
*/
|
||||||
|
var $rawFieldContent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional attributes of a FeedHtmlField.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
var $truncSize, $syndicateHtml;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of FeedHtmlField.
|
||||||
|
* @param $string: if given, sets the rawFieldContent property
|
||||||
|
*/
|
||||||
|
function FeedHtmlField($parFieldContent) {
|
||||||
|
if ($parFieldContent) {
|
||||||
|
$this->rawFieldContent = $parFieldContent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the right output, depending on $truncSize, $syndicateHtml properties.
|
||||||
|
* @return string the formatted field
|
||||||
|
*/
|
||||||
|
function output() {
|
||||||
|
// when field available and syndicated in html we assume
|
||||||
|
// - valid html in $rawFieldContent and we enclose in CDATA tags
|
||||||
|
// - no truncation (truncating risks producing invalid html)
|
||||||
|
if (!$this->rawFieldContent) {
|
||||||
|
$result = "";
|
||||||
|
} elseif ($this->syndicateHtml) {
|
||||||
|
$result = "<![CDATA[".$this->rawFieldContent."]]>";
|
||||||
|
} else {
|
||||||
|
if ($this->truncSize and is_int($this->truncSize)) {
|
||||||
|
$result = FeedCreator::iTrunc(htmlspecialchars($this->rawFieldContent),$this->truncSize);
|
||||||
|
} else {
|
||||||
|
$result = htmlspecialchars($this->rawFieldContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UniversalFeedCreator lets you choose during runtime which
|
||||||
|
* format to build.
|
||||||
|
* For general usage of a feed class, see the FeedCreator class
|
||||||
|
* below or the example above.
|
||||||
|
*
|
||||||
|
* @since 1.3
|
||||||
|
* @author Kai Blankenhorn <kaib@bitfolge.de>
|
||||||
|
*/
|
||||||
|
class UniversalFeedCreator extends FeedCreator {
|
||||||
|
|
||||||
|
var $_feed;
|
||||||
|
|
||||||
|
function _setMIME($format) {
|
||||||
|
switch (strtoupper($format)) {
|
||||||
|
|
||||||
|
case "RSS":
|
||||||
|
case "2.0":
|
||||||
|
// fall through
|
||||||
|
case "RSS2.0":
|
||||||
|
header('Content-type: text/xml', true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "ATOM":
|
||||||
|
// fall through: always the latest ATOM version
|
||||||
|
case "ATOM1.0":
|
||||||
|
header('Content-type: application/xml', true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
case "0.91":
|
||||||
|
// fall through
|
||||||
|
case "RSS0.91":
|
||||||
|
header('Content-type: text/xml', true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function _setFormat($format) {
|
||||||
|
switch (strtoupper($format)) {
|
||||||
|
|
||||||
|
case "RSS":
|
||||||
|
case "2.0":
|
||||||
|
// fall through
|
||||||
|
case "RSS2.0":
|
||||||
|
$this->_feed = new RSSCreator20();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "0.91":
|
||||||
|
// fall through
|
||||||
|
case "RSS0.91":
|
||||||
|
$this->_feed = new RSSCreator091();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "ATOM":
|
||||||
|
// fall through: always the latest ATOM version
|
||||||
|
case "ATOM1.0":
|
||||||
|
$this->_feed = new AtomCreator10();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$this->_feed = new RSSCreator091();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$vars = get_object_vars($this);
|
||||||
|
foreach ($vars as $key => $value) {
|
||||||
|
// prevent overwriting of properties "contentType", "encoding"; do not copy "_feed" itself
|
||||||
|
if (!in_array($key, array("_feed", "contentType", "encoding"))) {
|
||||||
|
$this->_feed->{$key} = $this->{$key};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a syndication feed based on the items previously added.
|
||||||
|
*
|
||||||
|
* @see FeedCreator::addItem()
|
||||||
|
* @param string format format the feed should comply to. Valid values are:
|
||||||
|
* "PIE0.1", "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3", "HTML", "JS"
|
||||||
|
* @return string the contents of the feed.
|
||||||
|
*/
|
||||||
|
function createFeed($format = "RSS0.91") {
|
||||||
|
$this->_setFormat($format);
|
||||||
|
return $this->_feed->createFeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Outputs feed to the browser - needed for on-the-fly feed generation (like it is done in WordPress, etc.)
|
||||||
|
*
|
||||||
|
* @param format string format the feed should comply to. Valid values are:
|
||||||
|
* "PIE0.1" (deprecated), "mbox", "RSS0.91", "RSS1.0", "RSS2.0", "OPML", "ATOM0.3".
|
||||||
|
*/
|
||||||
|
function outputFeed( $timezone , $format='RSS2.0' ) {
|
||||||
|
$this->_setFormat( $format );
|
||||||
|
$this->_setMIME( $format );
|
||||||
|
$this->_feed->outputFeed( $timezone , $format );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FeedCreator is the abstract base implementation for concrete
|
||||||
|
* implementations that implement a specific format of syndication.
|
||||||
|
*
|
||||||
|
* @abstract
|
||||||
|
* @author Kai Blankenhorn <kaib@bitfolge.de>
|
||||||
|
* @since 1.4
|
||||||
|
*/
|
||||||
|
class FeedCreator extends HtmlDescribable {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mandatory attributes of a feed.
|
||||||
|
*/
|
||||||
|
var $title, $description, $link;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional attributes of a feed.
|
||||||
|
*/
|
||||||
|
var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The url of the external xsl stylesheet used to format the naked rss feed.
|
||||||
|
* Ignored in the output when empty.
|
||||||
|
*/
|
||||||
|
var $xslStyleSheet = "";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $items = Array();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This feed's MIME content type.
|
||||||
|
* @since 1.4
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $contentType = "application/xml";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This feed's character encoding.
|
||||||
|
* @since 1.6.1
|
||||||
|
**/
|
||||||
|
var $encoding = "UTF-8";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Any additional elements to include as an assiciated array. All $key => $value pairs
|
||||||
|
* will be included unencoded in the feed in the form
|
||||||
|
* <$key>$value</$key>
|
||||||
|
* Again: No encoding will be used! This means you can invalidate or enhance the feed
|
||||||
|
* if $value contains markup. This may be abused to embed tags not implemented by
|
||||||
|
* the FeedCreator class used.
|
||||||
|
*/
|
||||||
|
var $additionalElements = Array();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an FeedItem to the feed.
|
||||||
|
*
|
||||||
|
* @param object FeedItem $item The FeedItem to add to the feed.
|
||||||
|
* @access public
|
||||||
|
*/
|
||||||
|
function addItem($item) {
|
||||||
|
$this->items[] = $item;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Truncates a string to a certain length at the most sensible point.
|
||||||
|
* First, if there's a '.' character near the end of the string, the string is truncated after this character.
|
||||||
|
* If there is no '.', the string is truncated after the last ' ' character.
|
||||||
|
* If the string is truncated, " ..." is appended.
|
||||||
|
* If the string is already shorter than $length, it is returned unchanged.
|
||||||
|
*
|
||||||
|
* @static
|
||||||
|
* @param string string A string to be truncated.
|
||||||
|
* @param int length the maximum length the string should be truncated to
|
||||||
|
* @return string the truncated string
|
||||||
|
*/
|
||||||
|
function iTrunc($string, $length) {
|
||||||
|
if (strlen($string)<=$length) {
|
||||||
|
return $string;
|
||||||
|
}
|
||||||
|
|
||||||
|
$pos = strrpos($string,".");
|
||||||
|
if ($pos>=$length-4) {
|
||||||
|
$string = substr($string,0,$length-4);
|
||||||
|
$pos = strrpos($string,".");
|
||||||
|
}
|
||||||
|
if ($pos>=$length*0.4) {
|
||||||
|
return substr($string,0,$pos+1)." ...";
|
||||||
|
}
|
||||||
|
|
||||||
|
$pos = strrpos($string," ");
|
||||||
|
if ($pos>=$length-4) {
|
||||||
|
$string = substr($string,0,$length-4);
|
||||||
|
$pos = strrpos($string," ");
|
||||||
|
}
|
||||||
|
if ($pos>=$length*0.4) {
|
||||||
|
return substr($string,0,$pos)." ...";
|
||||||
|
}
|
||||||
|
|
||||||
|
return substr($string,0,$length-4)." ...";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a comment indicating the generator of this feed.
|
||||||
|
* The format of this comment seems to be recognized by
|
||||||
|
* Syndic8.com.
|
||||||
|
*/
|
||||||
|
function _createGeneratorComment() {
|
||||||
|
return "<!-- generator=\"".FEEDCREATOR_VERSION."\" -->\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a string containing all additional elements specified in
|
||||||
|
* $additionalElements.
|
||||||
|
* @param elements array an associative array containing key => value pairs
|
||||||
|
* @param indentString string a string that will be inserted before every generated line
|
||||||
|
* @return string the XML tags corresponding to $additionalElements
|
||||||
|
*/
|
||||||
|
function _createAdditionalElements($elements, $indentString="") {
|
||||||
|
$ae = "";
|
||||||
|
if (is_array($elements)) {
|
||||||
|
foreach($elements AS $key => $value) {
|
||||||
|
$ae.= $indentString."<$key>$value</$key>\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $ae;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _createStylesheetReferences() {
|
||||||
|
$xml = "";
|
||||||
|
if ( isset( $this->cssStyleSheet ) ) $xml .= "<?xml-stylesheet href=\"".$this->cssStyleSheet."\" type=\"text/css\"?>\n";
|
||||||
|
if ( isset( $this->xslStyleSheet ) ) $xml .= "<?xml-stylesheet href=\"".$this->xslStyleSheet."\" type=\"text/xsl\"?>\n";
|
||||||
|
return $xml;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the feed's text.
|
||||||
|
* @abstract
|
||||||
|
* @return string the feed's complete text
|
||||||
|
*/
|
||||||
|
function createFeed( $timezone ) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a filename for the feed cache file. The result will be $_SERVER["PHP_SELF"] with the extension changed to .xml.
|
||||||
|
* For example:
|
||||||
|
*
|
||||||
|
* echo $_SERVER["PHP_SELF"]."\n";
|
||||||
|
* echo FeedCreator::_generateFilename();
|
||||||
|
*
|
||||||
|
* would produce:
|
||||||
|
*
|
||||||
|
* /rss/latestnews.php
|
||||||
|
* latestnews.xml
|
||||||
|
*
|
||||||
|
* @return string the feed cache filename
|
||||||
|
* @since 1.4
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _generateFilename() {
|
||||||
|
$fileInfo = pathinfo($_SERVER["PHP_SELF"]);
|
||||||
|
return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).".xml";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 1.4
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _redirect($filename) {
|
||||||
|
// attention, heavily-commented-out-area
|
||||||
|
|
||||||
|
// maybe use this in addition to file time checking
|
||||||
|
//Header("Expires: ".date("r",time()+$this->_timeout));
|
||||||
|
|
||||||
|
/* no caching at all, doesn't seem to work as good:
|
||||||
|
Header("Cache-Control: no-cache");
|
||||||
|
Header("Pragma: no-cache");
|
||||||
|
*/
|
||||||
|
|
||||||
|
// HTTP redirect, some feed readers' simple HTTP implementations don't follow it
|
||||||
|
//Header("Location: ".$filename);
|
||||||
|
|
||||||
|
Header("Content-Type: ".$this->contentType."; charset=".$this->encoding."; filename=".basename($filename));
|
||||||
|
Header("Content-Disposition: inline; filename=".basename($filename));
|
||||||
|
readfile($filename, "r");
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Outputs this feed directly to the browser - for on-the-fly feed generation
|
||||||
|
* @since 1.7.2-mod
|
||||||
|
*
|
||||||
|
* still missing: proper header output - currently you have to add it manually
|
||||||
|
*/
|
||||||
|
function outputFeed( $timezone , $format='RSS2.0' ) {
|
||||||
|
echo $this->createFeed( $timezone );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FeedDate is an internal class that stores a date for a feed or feed item.
|
||||||
|
* Usually, you won't need to use this.
|
||||||
|
*/
|
||||||
|
class FeedDate {
|
||||||
|
var $unix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of FeedDate representing a given date.
|
||||||
|
* Accepts RFC 822, ISO 8601 date formats as well as unix time stamps.
|
||||||
|
* @param mixed $dateString optional the date this FeedDate will represent. If not specified, the current date and time is used.
|
||||||
|
*/
|
||||||
|
function FeedDate($dateString="") {
|
||||||
|
if ($dateString=="") $dateString = date("r");
|
||||||
|
|
||||||
|
if (is_numeric($dateString)) {
|
||||||
|
$this->unix = $dateString;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (preg_match("~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~",$dateString,$matches)) {
|
||||||
|
$months = Array("Jan"=>1,"Feb"=>2,"Mar"=>3,"Apr"=>4,"May"=>5,"Jun"=>6,"Jul"=>7,"Aug"=>8,"Sep"=>9,"Oct"=>10,"Nov"=>11,"Dec"=>12);
|
||||||
|
$this->unix = mktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]);
|
||||||
|
if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
|
||||||
|
$tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
|
||||||
|
} else {
|
||||||
|
if (strlen($matches[7])==1) {
|
||||||
|
$oneHour = 3600;
|
||||||
|
$ord = ord($matches[7]);
|
||||||
|
if ($ord < ord("M")) {
|
||||||
|
$tzOffset = (ord("A") - $ord - 1) * $oneHour;
|
||||||
|
} elseif ($ord >= ord("M") AND $matches[7]!="Z") {
|
||||||
|
$tzOffset = ($ord - ord("M")) * $oneHour;
|
||||||
|
} elseif ($matches[7]=="Z") {
|
||||||
|
$tzOffset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch ($matches[7]) {
|
||||||
|
case "UT":
|
||||||
|
case "GMT": $tzOffset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->unix += $tzOffset;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (preg_match("~(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.*)~",$dateString,$matches)) {
|
||||||
|
$this->unix = mktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]);
|
||||||
|
if (substr($matches[7],0,1)=='+' OR substr($matches[7],0,1)=='-') {
|
||||||
|
$tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;
|
||||||
|
} else {
|
||||||
|
if ($matches[7]=="Z") {
|
||||||
|
$tzOffset = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->unix += $tzOffset;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->unix = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the date stored in this FeedDate as an RFC 822 date.
|
||||||
|
*
|
||||||
|
* @return a date in RFC 822 format
|
||||||
|
*/
|
||||||
|
function rfc822() {
|
||||||
|
$d = new DateTime( "@" . $this->unix );
|
||||||
|
|
||||||
|
return $d->format( 'r' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the date stored in this FeedDate as an ISO 8601 date.
|
||||||
|
*
|
||||||
|
* @return a date in ISO 8601 (RFC 3339) format
|
||||||
|
*/
|
||||||
|
function iso8601() {
|
||||||
|
$d = new DateTime( "@" . $this->unix );
|
||||||
|
|
||||||
|
return $d->format( 'c' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the date stored in this FeedDate as unix time stamp.
|
||||||
|
*
|
||||||
|
* @return a date as a unix time stamp
|
||||||
|
*/
|
||||||
|
function unix() {
|
||||||
|
return $this->unix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RSSCreator091 is a FeedCreator that implements RSS 0.91 Spec, revision 3.
|
||||||
|
*
|
||||||
|
* @see http://my.netscape.com/publish/formats/rss-spec-0.91.html
|
||||||
|
* @since 1.3
|
||||||
|
* @author Kai Blankenhorn <kaib@bitfolge.de>
|
||||||
|
*/
|
||||||
|
class RSSCreator091 extends FeedCreator {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores this RSS feed's version number.
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $RSSVersion;
|
||||||
|
|
||||||
|
function RSSCreator091() {
|
||||||
|
$this->_setRSSVersion("0.91");
|
||||||
|
$this->contentType = "application/rss+xml";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets this RSS feed's version number.
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _setRSSVersion($version) {
|
||||||
|
$this->RSSVersion = $version;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builds the RSS feed's text. The feed will be compliant to RDF Site Summary (RSS) 1.0.
|
||||||
|
* The feed will contain all items previously added in the same order.
|
||||||
|
* @return string the feed's complete text
|
||||||
|
*/
|
||||||
|
function createFeed( $timezone ) {
|
||||||
|
$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
|
||||||
|
$feed.= $this->_createGeneratorComment();
|
||||||
|
$feed.= $this->_createStylesheetReferences();
|
||||||
|
$feed.= "<rss version=\"".$this->RSSVersion."\">\n";
|
||||||
|
$feed.= " <channel>\n";
|
||||||
|
$feed.= " <title>".FeedCreator::iTrunc(htmlspecialchars($this->title),100)."</title>\n";
|
||||||
|
$this->descriptionTruncSize = 500;
|
||||||
|
$feed.= " <description>".$this->getDescription()."</description>\n";
|
||||||
|
$feed.= " <link>".htmlspecialchars($this->link)."</link>\n";
|
||||||
|
|
||||||
|
$now = new DateTime( '@' . time() );
|
||||||
|
|
||||||
|
$feed.= " <lastBuildDate>".htmlspecialchars( $now->format( 'r' ) )."</lastBuildDate>\n";
|
||||||
|
$feed.= " <generator>".FEEDCREATOR_VERSION."</generator>\n";
|
||||||
|
|
||||||
|
if ($this->image!=null) {
|
||||||
|
$feed.= " <image>\n";
|
||||||
|
$feed.= " <url>".$this->image->url."</url>\n";
|
||||||
|
$feed.= " <title>".FeedCreator::iTrunc(htmlspecialchars($this->image->title),100)."</title>\n";
|
||||||
|
$feed.= " <link>".htmlspecialchars($this->image->link)."</link>\n";
|
||||||
|
if ($this->image->width!="") {
|
||||||
|
$feed.= " <width>".$this->image->width."</width>\n";
|
||||||
|
}
|
||||||
|
if ($this->image->height!="") {
|
||||||
|
$feed.= " <height>".$this->image->height."</height>\n";
|
||||||
|
}
|
||||||
|
if ($this->image->description!="") {
|
||||||
|
$feed.= " <description>".$this->image->getDescription()."</description>\n";
|
||||||
|
}
|
||||||
|
$feed.= " </image>\n";
|
||||||
|
}
|
||||||
|
if ($this->language!="") {
|
||||||
|
$feed.= " <language>".$this->language."</language>\n";
|
||||||
|
}
|
||||||
|
if ($this->copyright!="") {
|
||||||
|
$feed.= " <copyright>".FeedCreator::iTrunc(htmlspecialchars($this->copyright),100)."</copyright>\n";
|
||||||
|
}
|
||||||
|
if ($this->editor!="") {
|
||||||
|
$feed.= " <managingEditor>".FeedCreator::iTrunc(htmlspecialchars($this->editor),100)."</managingEditor>\n";
|
||||||
|
}
|
||||||
|
if ($this->webmaster!="") {
|
||||||
|
$feed.= " <webMaster>".FeedCreator::iTrunc(htmlspecialchars($this->webmaster),100)."</webMaster>\n";
|
||||||
|
}
|
||||||
|
if ($this->pubDate!="") {
|
||||||
|
$pubDate = new FeedDate($this->pubDate);
|
||||||
|
$feed.= " <pubDate>".htmlspecialchars($pubDate->rfc822())."</pubDate>\n";
|
||||||
|
}
|
||||||
|
if ($this->category!="") {
|
||||||
|
$feed.= " <category>".htmlspecialchars($this->category)."</category>\n";
|
||||||
|
}
|
||||||
|
if ($this->docs!="") {
|
||||||
|
$feed.= " <docs>".FeedCreator::iTrunc(htmlspecialchars($this->docs),500)."</docs>\n";
|
||||||
|
}
|
||||||
|
if ($this->ttl!="") {
|
||||||
|
$feed.= " <ttl>".htmlspecialchars($this->ttl)."</ttl>\n";
|
||||||
|
}
|
||||||
|
if ($this->rating!="") {
|
||||||
|
$feed.= " <rating>".FeedCreator::iTrunc(htmlspecialchars($this->rating),500)."</rating>\n";
|
||||||
|
}
|
||||||
|
if ($this->skipHours!="") {
|
||||||
|
$feed.= " <skipHours>".htmlspecialchars($this->skipHours)."</skipHours>\n";
|
||||||
|
}
|
||||||
|
if ($this->skipDays!="") {
|
||||||
|
$feed.= " <skipDays>".htmlspecialchars($this->skipDays)."</skipDays>\n";
|
||||||
|
}
|
||||||
|
$feed.= $this->_createAdditionalElements($this->additionalElements, " ");
|
||||||
|
|
||||||
|
for ($i=0;$i<count($this->items);$i++) {
|
||||||
|
$feed.= " <item>\n";
|
||||||
|
$feed.= " <title>".FeedCreator::iTrunc(htmlspecialchars(strip_tags($this->items[$i]->title)),100)."</title>\n";
|
||||||
|
$feed.= " <link>".htmlspecialchars($this->items[$i]->link)."</link>\n";
|
||||||
|
$feed.= " <description>".$this->items[$i]->getDescription()."</description>\n";
|
||||||
|
|
||||||
|
if ($this->items[$i]->author!="") {
|
||||||
|
$feed.= " <author>".htmlspecialchars($this->items[$i]->author)."</author>\n";
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
// on hold
|
||||||
|
if ($this->items[$i]->source!="") {
|
||||||
|
$feed.= " <source>".htmlspecialchars($this->items[$i]->source)."</source>\n";
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
if ($this->items[$i]->category!="") {
|
||||||
|
$feed.= " <category>".htmlspecialchars($this->items[$i]->category)."</category>\n";
|
||||||
|
}
|
||||||
|
if ($this->items[$i]->comments!="") {
|
||||||
|
$feed.= " <comments>".htmlspecialchars($this->items[$i]->comments)."</comments>\n";
|
||||||
|
}
|
||||||
|
if ($this->items[$i]->date!="") {
|
||||||
|
$itemDate = new FeedDate($this->items[$i]->date);
|
||||||
|
$feed.= " <pubDate>".htmlspecialchars($itemDate->rfc822())."</pubDate>\n";
|
||||||
|
}
|
||||||
|
if ($this->items[$i]->guid!="") {
|
||||||
|
$feed.= " <guid>".htmlspecialchars($this->items[$i]->guid)."</guid>\n";
|
||||||
|
}
|
||||||
|
$feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, " ");
|
||||||
|
|
||||||
|
if ($this->RSSVersion == "2.0" && $this->items[$i]->enclosure != NULL)
|
||||||
|
{
|
||||||
|
$feed.= " <enclosure url=\"";
|
||||||
|
$feed.= $this->items[$i]->enclosure->url;
|
||||||
|
$feed.= "\" length=\"";
|
||||||
|
$feed.= $this->items[$i]->enclosure->length;
|
||||||
|
$feed.= "\" type=\"";
|
||||||
|
$feed.= $this->items[$i]->enclosure->type;
|
||||||
|
$feed.= "\"/>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$feed.= " </item>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$feed.= " </channel>\n";
|
||||||
|
$feed.= "</rss>\n";
|
||||||
|
return $feed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RSSCreator20 is a FeedCreator that implements RDF Site Summary (RSS) 2.0.
|
||||||
|
*
|
||||||
|
* @see http://backend.userland.com/rss
|
||||||
|
* @since 1.3
|
||||||
|
* @author Kai Blankenhorn <kaib@bitfolge.de>
|
||||||
|
*/
|
||||||
|
class RSSCreator20 extends RSSCreator091 {
|
||||||
|
|
||||||
|
function RSSCreator20() {
|
||||||
|
parent::_setRSSVersion("2.0");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* AtomCreator10 is a FeedCreator that implements the atom specification,
|
||||||
|
* as in http://www.atomenabled.org/developers/syndication/atom-format-spec.php
|
||||||
|
* Please note that just by using AtomCreator10 you won't automatically
|
||||||
|
* produce valid atom files. For example, you have to specify either an editor
|
||||||
|
* for the feed or an author for every single feed item.
|
||||||
|
*
|
||||||
|
* Some elements have not been implemented yet. These are (incomplete list):
|
||||||
|
* author URL, item author's email and URL, item contents, alternate links,
|
||||||
|
* other link content types than text/html. Some of them may be created with
|
||||||
|
* AtomCreator10::additionalElements.
|
||||||
|
*
|
||||||
|
* @see FeedCreator#additionalElements
|
||||||
|
* @since 1.7.2-mod (modified)
|
||||||
|
* @author Mohammad Hafiz Ismail (mypapit@gmail.com)
|
||||||
|
*/
|
||||||
|
class AtomCreator10 extends FeedCreator {
|
||||||
|
|
||||||
|
function AtomCreator10() {
|
||||||
|
$this->contentType = "application/atom+xml";
|
||||||
|
$this->encoding = "utf-8";
|
||||||
|
}
|
||||||
|
|
||||||
|
function createFeed( $timezone ) {
|
||||||
|
$feed = "<?xml version=\"1.0\" encoding=\"".$this->encoding."\"?>\n";
|
||||||
|
$feed.= $this->_createGeneratorComment();
|
||||||
|
$feed.= $this->_createStylesheetReferences();
|
||||||
|
$feed.= "<feed xmlns=\"http://www.w3.org/2005/Atom\"";
|
||||||
|
if ($this->language!="") {
|
||||||
|
$feed.= " xml:lang=\"".$this->language."\"";
|
||||||
|
}
|
||||||
|
$feed.= ">\n";
|
||||||
|
$feed.= " <title>".htmlspecialchars($this->title)."</title>\n";
|
||||||
|
$feed.= " <subtitle type=\"html\">".htmlspecialchars($this->description)."</subtitle>\n";
|
||||||
|
$feed.= " <link rel=\"alternate\" type=\"text/html\" href=\"".htmlspecialchars($this->link)."\"/>\n";
|
||||||
|
$feed.= " <id>".htmlspecialchars($this->link)."</id>\n";
|
||||||
|
$now = new DateTime( '@' . time() );
|
||||||
|
$feed.= " <updated>".htmlspecialchars( $now->format( 'c' ) )."</updated>\n";
|
||||||
|
if ($this->editor!="") {
|
||||||
|
$feed.= " <author>\n";
|
||||||
|
$feed.= " <name>".$this->editor."</name>\n";
|
||||||
|
if ($this->editorEmail!="") {
|
||||||
|
$feed.= " <email>".$this->editorEmail."</email>\n";
|
||||||
|
}
|
||||||
|
$feed.= " </author>\n";
|
||||||
|
}
|
||||||
|
$feed.= " <generator>".FEEDCREATOR_VERSION."</generator>\n";
|
||||||
|
$feed.= "<link rel=\"self\" type=\"application/atom+xml\" href=\"". htmlspecialchars($this->syndicationURL) . "\" />\n";
|
||||||
|
$feed.= $this->_createAdditionalElements($this->additionalElements, " ");
|
||||||
|
for ($i=0;$i<count($this->items);$i++) {
|
||||||
|
$feed.= " <entry>\n";
|
||||||
|
$feed.= " <title>".htmlspecialchars(strip_tags($this->items[$i]->title))."</title>\n";
|
||||||
|
$feed.= " <link rel=\"alternate\" type=\"text/html\" href=\"".htmlspecialchars($this->items[$i]->link)."\"/>\n";
|
||||||
|
if ($this->items[$i]->date=="") {
|
||||||
|
$this->items[$i]->date = time();
|
||||||
|
}
|
||||||
|
$itemDate = new FeedDate($this->items[$i]->date);
|
||||||
|
$feed.= " <published>".htmlspecialchars($itemDate->iso8601())."</published>\n";
|
||||||
|
$feed.= " <updated>".htmlspecialchars($itemDate->iso8601())."</updated>\n";
|
||||||
|
$feed.= " <id>".htmlspecialchars($this->items[$i]->link)."</id>\n";
|
||||||
|
$feed.= $this->_createAdditionalElements($this->items[$i]->additionalElements, " ");
|
||||||
|
if ($this->items[$i]->author!="") {
|
||||||
|
$feed.= " <author>\n";
|
||||||
|
$feed.= " <name>".htmlspecialchars($this->items[$i]->author)."</name>\n";
|
||||||
|
$feed.= " </author>\n";
|
||||||
|
}
|
||||||
|
if ($this->items[$i]->description!="") {
|
||||||
|
$feed.= " <summary type=\"html\">".htmlspecialchars($this->items[$i]->description)."</summary>\n";
|
||||||
|
}
|
||||||
|
if ($this->items[$i]->enclosure != NULL) {
|
||||||
|
$feed.=" <link rel=\"enclosure\" href=\"". $this->items[$i]->enclosure->url ."\" type=\"". $this->items[$i]->enclosure->type."\" length=\"". $this->items[$i]->enclosure->length . "\" />\n";
|
||||||
|
}
|
||||||
|
$feed.= " </entry>\n";
|
||||||
|
}
|
||||||
|
$feed.= "</feed>\n";
|
||||||
|
return $feed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
464
vendor/potsky/pimp-my-log/inc/classes/LogParser.php
vendored
Normal file
@ -0,0 +1,464 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class LogParser
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Read a log file and return an array of logs with metadata
|
||||||
|
*
|
||||||
|
* @param string $regex A regex to match each line
|
||||||
|
* @param array $match An array of matchers
|
||||||
|
* @param array $types An array of matchers types
|
||||||
|
* @param string $tz The wanted timezone to translate matchers with a date type
|
||||||
|
* @param integer $wanted_lines the count of wanted lines to be returned
|
||||||
|
* @param array $exclude An array of exclusion matchers tokens
|
||||||
|
* @param string $file_path the file path
|
||||||
|
* @param integer $start_offset the offset where to begin to parse file
|
||||||
|
* @param integer $start_from the position from where the offset is taken
|
||||||
|
* @param boolean $load_more loadmore mode : if true, we do not try to guess the previous line
|
||||||
|
* @param string $old_lastline The fingerprint of the last known line (previous call)
|
||||||
|
* @param boolean $multiline Whether the parser should understand non understandable lines as multi lines of a field
|
||||||
|
* @param string $search A search expression
|
||||||
|
* @param integer $data_to_parse The maximum count of bytes to read a new line (basically the difference between the previous scanned file size and the current one)
|
||||||
|
* @param boolean $full Whether the log file should be loaded from scratch
|
||||||
|
* @param [type] $max_search_log_time The maximum duration in s to parse lines
|
||||||
|
*
|
||||||
|
* @return [type] [description]
|
||||||
|
*/
|
||||||
|
public static function getNewLines( $regex , $match , $types , $tz , $wanted_lines , $exclude , $file_path , $start_offset , $start_from , $load_more , $old_lastline , $multiline , $search , $data_to_parse , $full , $max_search_log_time ) {
|
||||||
|
|
||||||
|
$fl = fopen( $file_path , "r" );
|
||||||
|
if ($fl === false) {
|
||||||
|
return '1';
|
||||||
|
}
|
||||||
|
|
||||||
|
$logs = array();
|
||||||
|
$start = microtime( true );
|
||||||
|
$regsearch = false;
|
||||||
|
$found = false;
|
||||||
|
$bytes = 0;
|
||||||
|
$skip = 0;
|
||||||
|
$error = 0;
|
||||||
|
$abort = false;
|
||||||
|
$file_lastline = '';
|
||||||
|
$search_lastline = true;
|
||||||
|
$buffer = array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Last modification time and size for this log file
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( version_compare( PHP_VERSION , '5.3.0' ) >= 0 ) {
|
||||||
|
$filem = new DateTime( );
|
||||||
|
$filem->setTimestamp( filemtime( $file_path ) );
|
||||||
|
} else {
|
||||||
|
$filem = new DateTime( "@" . filemtime( $file_path ) );
|
||||||
|
}
|
||||||
|
if ( ! is_null( $tz ) ) {
|
||||||
|
$filem->setTimezone( new DateTimeZone( $tz ) );
|
||||||
|
}
|
||||||
|
$filemu = $filem->format( 'U' );
|
||||||
|
$filem = $filem->format( 'Y/m/d H:i:s' );
|
||||||
|
$filesize = filesize( $file_path );
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Try to guess if the seach expression is a regexp or not
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ($search !== '') {
|
||||||
|
$test = @preg_match( $search , 'this is just a test !' );
|
||||||
|
$regsearch = ( $test === false ) ? false : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Read file
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
for ($x_pos = $start_offset, $ln = 0, $line = '', $still = true; $still ; $x_pos--) {
|
||||||
|
|
||||||
|
// We have reached the beginning of file
|
||||||
|
// Validate the previous read chars by simulating a NL
|
||||||
|
if ( fseek( $fl, $x_pos, $start_from ) === -1 ) {
|
||||||
|
$still = false;
|
||||||
|
$char = "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read a char on a log line
|
||||||
|
else {
|
||||||
|
$char = fgetc( $fl );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// If the read char if a NL, we need to manage the previous buffered chars as a line
|
||||||
|
if ( $char === "\n" ) {
|
||||||
|
|
||||||
|
// Copy the log line as an utf8 line
|
||||||
|
$deal = ( mb_check_encoding( $line , 'UTF-8' ) === false ) ? utf8_encode( $line ) : $line;
|
||||||
|
|
||||||
|
// Reset the line for future reads
|
||||||
|
$line = '';
|
||||||
|
|
||||||
|
// Manage the new line
|
||||||
|
if ($deal !== '') {
|
||||||
|
|
||||||
|
// Get the last line of the file to compute the hash of this line
|
||||||
|
if ( $search_lastline === true ) {
|
||||||
|
$file_lastline = sha1( $deal );
|
||||||
|
$search_lastline = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we have reach the previous line in normal mode
|
||||||
|
// We don't have to manage this when loading older logs
|
||||||
|
if ( $load_more === false ) {
|
||||||
|
|
||||||
|
// We have reach the count bytes to manage
|
||||||
|
if ( $bytes > $data_to_parse ) {
|
||||||
|
|
||||||
|
// So the new line should be the last line of the previous time
|
||||||
|
if ( $old_lastline !== sha1( $deal ) ) {
|
||||||
|
|
||||||
|
// This is not the case, so the file has been rotated and the new log file is bigger than the previous time
|
||||||
|
// So we have to continue computing to find the user wanted count of lines (and alert user about the file change)
|
||||||
|
$logs['notice'] = 1;
|
||||||
|
$full = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ok lines are the same so just stop and return new found lines
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse the new line
|
||||||
|
$log = self::parseLine( $regex , $match , $deal , $types , $tz );
|
||||||
|
|
||||||
|
// The line has been successfully parsed by the parser (user regex ok)
|
||||||
|
if ( is_array( $log ) ) {
|
||||||
|
|
||||||
|
// We will get this log by default but search can exclude this log later
|
||||||
|
$return_log = true;
|
||||||
|
|
||||||
|
// If we previously have parsed some multilines, we need now to include them
|
||||||
|
$last_field_append = ( count( $buffer ) > 0 ) ? "\n" . implode( "\n" , array_reverse( $buffer ) ) : '';;
|
||||||
|
$buffer = array();
|
||||||
|
|
||||||
|
foreach ($log as $key => $value) {
|
||||||
|
|
||||||
|
// Manage multilines
|
||||||
|
if ( $key === $multiline ) {
|
||||||
|
$value .= $last_field_append;
|
||||||
|
$deal .= $last_field_append;
|
||||||
|
$log[ $key ] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is this log excluded ?
|
||||||
|
if ( ( isset( $exclude[ $key ] ) ) && ( is_array( $exclude[ $key ] ) ) ) {
|
||||||
|
foreach ($exclude[ $key ] as $ekey => $reg) {
|
||||||
|
try {
|
||||||
|
if ( preg_match( $reg , $value ) ) {
|
||||||
|
$return_log = false;
|
||||||
|
break 2;
|
||||||
|
}
|
||||||
|
} catch ( Exception $e ) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This line should be skipped because it has been excluded by user configuration
|
||||||
|
if ($return_log === false) {
|
||||||
|
$skip++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter now this line by search
|
||||||
|
else {
|
||||||
|
|
||||||
|
if ( ! empty( $search ) ) {
|
||||||
|
|
||||||
|
// Regex
|
||||||
|
if ($regsearch) {
|
||||||
|
$return_log = preg_match( $search , $deal . $last_field_append );
|
||||||
|
if ( $return_log === 0 ) $return_log = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simple search
|
||||||
|
else {
|
||||||
|
$return_log = strpos( $deal . $last_field_append, $search );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search excludes this line
|
||||||
|
if ($return_log === false) {
|
||||||
|
$skip++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search includes this line
|
||||||
|
else {
|
||||||
|
$found = true;
|
||||||
|
$log[ 'pml' ] = $deal . $last_field_append;
|
||||||
|
$log[ 'pmlo' ] = ftell($fl);
|
||||||
|
$logs[ 'logs' ][] = $log;
|
||||||
|
$ln++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The line has not been successfully parsed by the parser but multiline feature is enabled so we treat this line as a multiline
|
||||||
|
elseif ( $multiline !== '' ) {
|
||||||
|
$buffer[] = $deal;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No multiline feature and unknown line : add this line as an error
|
||||||
|
else {
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Break if we have found the wanted count of logs
|
||||||
|
if ( $ln >= $wanted_lines ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Break if time computing is too high
|
||||||
|
if ( microtime( true ) - $start > $max_search_log_time ) {
|
||||||
|
$abort = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// continue directly without keeping the \n
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepend the read char to the previous buffered chars
|
||||||
|
$line = $char . $line;
|
||||||
|
$bytes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We need to store this value for load more when a search is active
|
||||||
|
// The last searched line to display os certainly not the first line of the file
|
||||||
|
// So if the value of $last_parsed_offset is 1, even if the last displayed line is not at offset 0 or 1, we must disable the Load More button
|
||||||
|
$last_parsed_offset = ftell($fl);
|
||||||
|
|
||||||
|
fclose( $fl );
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Return
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$logs['found'] = $found;
|
||||||
|
$logs['abort'] = $abort;
|
||||||
|
$logs['regsearch'] = $regsearch;
|
||||||
|
$logs['search'] = $search;
|
||||||
|
$logs['full'] = $full;
|
||||||
|
$logs['lpo'] = $last_parsed_offset;
|
||||||
|
$logs['count'] = $ln;
|
||||||
|
$logs['bytes'] = $bytes;
|
||||||
|
$logs['skiplines'] = $skip;
|
||||||
|
$logs['errorlines'] = $error;
|
||||||
|
$logs['fingerprint'] = md5( serialize( @$logs['logs'] ) ); // Used to avoid notification on full refresh when nothing has finally changed
|
||||||
|
$logs['lastline'] = $file_lastline;
|
||||||
|
$logs['duration'] = (int) ( ( microtime( true ) - $start ) * 1000 );
|
||||||
|
$logs['filesize'] = $filesize;
|
||||||
|
$logs['filemodif'] = $filem;
|
||||||
|
$logs['filemodifu'] = $filemu;
|
||||||
|
|
||||||
|
return $logs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read lines from the bottom of giver file
|
||||||
|
*
|
||||||
|
* @param string $file the file path
|
||||||
|
* @param integer $count the count of wanted lines
|
||||||
|
*
|
||||||
|
* @return array an array of read lines or false of fiel error
|
||||||
|
*/
|
||||||
|
public static function getLinesFromBottom( $file , $count = 1 )
|
||||||
|
{
|
||||||
|
$fl = @fopen( $file , "r" );
|
||||||
|
$lines = array();
|
||||||
|
$bytes = 0;
|
||||||
|
|
||||||
|
if ( $fl === false ) return false;
|
||||||
|
|
||||||
|
$count = max( 1 , (int) $count );
|
||||||
|
|
||||||
|
for ($x_pos = 0, $ln = 0, $line = '', $still = true; $still ; $x_pos--) {
|
||||||
|
|
||||||
|
if ( fseek( $fl, $x_pos, SEEK_END ) === -1 ) {
|
||||||
|
$still = false;
|
||||||
|
$char = "\n";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$char = fgetc( $fl );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($char === "\n") {
|
||||||
|
|
||||||
|
$deal = utf8_encode( $line );
|
||||||
|
$line = '';
|
||||||
|
|
||||||
|
if ($deal !== '') {
|
||||||
|
$lines[] = $deal;
|
||||||
|
$count--;
|
||||||
|
if ( $count === 0 ) $still = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// continue directly without keeping the \n
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$line = $char . $line;
|
||||||
|
$bytes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose( $fl );
|
||||||
|
|
||||||
|
return $lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A line of log parser
|
||||||
|
*
|
||||||
|
* @param string $regex The regex which describes the user log format
|
||||||
|
* @param array $match An array which links internal tokens to regex matches
|
||||||
|
* @param string $log The text log
|
||||||
|
* @param string $types A array of types for fields
|
||||||
|
* @param string $tz A time zone identifier
|
||||||
|
*
|
||||||
|
* @return mixed An array where keys are internal tokens and values the corresponding values extracted from the log file. Or false if line is not matchable.
|
||||||
|
*/
|
||||||
|
public static function parseLine( $regex , $match , $log , $types , $tz = NULL )
|
||||||
|
{
|
||||||
|
// If line is non matchable, return
|
||||||
|
preg_match_all( $regex , $log , $out, PREG_PATTERN_ORDER );
|
||||||
|
if ( @count( $out[0] ) === 0 ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = array();
|
||||||
|
$timestamp = 0;
|
||||||
|
|
||||||
|
foreach ($match as $token => $key) {
|
||||||
|
|
||||||
|
$type = ( isset ( $types[ $token ] ) ) ? $types[ $token ] : 'txt';
|
||||||
|
|
||||||
|
if ( substr( $type , 0 , 4 ) === 'date' )
|
||||||
|
{
|
||||||
|
|
||||||
|
// Date is an array description with keys ( 'Y' : 5 , 'M' : 2 , ... )
|
||||||
|
if ( is_array( $key ) && ( is_assoc( $key ) ) )
|
||||||
|
{
|
||||||
|
$newdate = array();
|
||||||
|
foreach ($key as $k => $v)
|
||||||
|
{
|
||||||
|
$newdate[ $k ] = @$out[ $v ][ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isset( $newdate['U'] ) )
|
||||||
|
{
|
||||||
|
$str = date( 'Y/m/d H:i:s' , $newdate['U'] );
|
||||||
|
}
|
||||||
|
else if ( isset( $newdate['r'] ) )
|
||||||
|
{
|
||||||
|
$str = date( 'Y/m/d H:i:s' , $newdate['r'] );
|
||||||
|
}
|
||||||
|
else if ( isset( $newdate['c'] ) )
|
||||||
|
{
|
||||||
|
$str = date( 'Y/m/d H:i:s' , $newdate['c'] );
|
||||||
|
}
|
||||||
|
else if ( isset( $newdate['M'] ) )
|
||||||
|
{
|
||||||
|
$str = trim( $newdate['M'] . ' ' . $newdate['d'] . ' ' . $newdate['H'] . ':' . $newdate['i'] . ':' . $newdate['s'] . ' ' . $newdate['Y'] . ' ' . @$newdate['z'] );
|
||||||
|
}
|
||||||
|
elseif ( isset( $newdate['m'] ) )
|
||||||
|
{
|
||||||
|
$str = trim( $newdate['Y'] . '/' . $newdate['m'] . '/' . $newdate['d'] . ' ' . $newdate['H'] . ':' . $newdate['i'] . ':' . $newdate['s'] . ' ' . @$newdate['z'] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Date is an array description without keys ( 2 , ':' , 3 , '-' , ... )
|
||||||
|
else if ( is_array( $key ) )
|
||||||
|
{
|
||||||
|
$str = '';
|
||||||
|
foreach ($key as $v)
|
||||||
|
{
|
||||||
|
$str .= ( is_string( $v ) ) ? $v : @$out[ $v ][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str = @$out[ $key ][0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove part next to the last /
|
||||||
|
$dateformat = ( substr( $type , 0 , 5 ) === 'date:' ) ? substr( $type , 5 ) : 'Y/m/d H:i:s';
|
||||||
|
|
||||||
|
if ( ( $p = strrpos( $dateformat , '/' ) ) !== false )
|
||||||
|
{
|
||||||
|
$dateformat = substr( $dateformat , 0 , $p );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( $timestamp = strtotime( $str ) ) === false )
|
||||||
|
{
|
||||||
|
$formatted_date = "ERROR ! Unable to convert this string to date : <code>$str</code>";
|
||||||
|
$timestamp = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( version_compare( PHP_VERSION , '5.3.0' ) >= 0 )
|
||||||
|
{
|
||||||
|
$date = new DateTime();
|
||||||
|
$date->setTimestamp( $timestamp );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$date = new DateTime( "@" . $timestamp );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_null( $tz ) )
|
||||||
|
{
|
||||||
|
$date->setTimezone( new DateTimeZone( $tz ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
$formatted_date = $date->format( $dateformat );
|
||||||
|
$timestamp = (int)$date->format('U');
|
||||||
|
}
|
||||||
|
|
||||||
|
$result[ $token ] = $formatted_date;
|
||||||
|
}
|
||||||
|
// Array description without keys ( 2 , ':' , 3 , '-' , ... )
|
||||||
|
else if ( is_array( $key ) ) {
|
||||||
|
$r = '';
|
||||||
|
foreach ($key as $v) {
|
||||||
|
$r .= ( is_string( $v ) ) ? $v : @$out[ $v ][0];
|
||||||
|
}
|
||||||
|
$result[ $token ] = $r;
|
||||||
|
} else {
|
||||||
|
$result[ $token ] = @$out[ $key ][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $timestamp > 0 ) {
|
||||||
|
$result[ 'pmld' ] = $timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
935
vendor/potsky/pimp-my-log/inc/classes/Sentinel.php
vendored
Normal file
@ -0,0 +1,935 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class Sentinel
|
||||||
|
{
|
||||||
|
|
||||||
|
private static $auth;
|
||||||
|
private static $authFile;
|
||||||
|
private static $authFileP;
|
||||||
|
private static $api_session;
|
||||||
|
private static $currentlylocked = false;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manage login
|
||||||
|
*
|
||||||
|
* @param array $files the files configuration
|
||||||
|
*
|
||||||
|
* @return [type] [description]
|
||||||
|
*/
|
||||||
|
public static function attempt( $files = false )
|
||||||
|
{
|
||||||
|
|
||||||
|
if ( self::isAuthSet() ) { // authentication is enabled on this instance
|
||||||
|
|
||||||
|
$user = self::getCurrentUsername();
|
||||||
|
|
||||||
|
if ( is_null( $user ) ) { // no logged in user
|
||||||
|
|
||||||
|
if ( isset( $_POST['attempt'] ) ) { // form is posted
|
||||||
|
|
||||||
|
if ( ! csrf_verify() ) {
|
||||||
|
$attempt = $_POST['attempt'];
|
||||||
|
$error = 2;
|
||||||
|
include_once PML_BASE . '/inc/login.inc.php';
|
||||||
|
self::release();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$loggedin = self::signIn( $_POST['username'] , $_POST['password'] );
|
||||||
|
|
||||||
|
if ( is_array( $loggedin ) ) { // signed in
|
||||||
|
header( "Location: " . $_POST['attempt'] );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
else { // error while signing in
|
||||||
|
$attempt = $_POST['attempt'];
|
||||||
|
$error = 1;
|
||||||
|
include_once PML_BASE . '/inc/login.inc.php';
|
||||||
|
self::release();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if ( isset( $_GET['signin'] ) ) { // sign in page when anonymous access is enabled
|
||||||
|
|
||||||
|
$attempt = ( isset( $_GET['attempt'] ) ) ? $_GET['attempt'] : $_SERVER['REQUEST_URI'] . '?' . $_SERVER['QUERY_STRING'];
|
||||||
|
$error = 0;
|
||||||
|
include_once PML_BASE . '/inc/login.inc.php';
|
||||||
|
self::release();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
else if ( self::isAnonymousEnabled( $files ) ) { // Anonymous access is enabled, simply return to let anonymosu users to parse logs
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
else { // send form
|
||||||
|
$attempt = $_SERVER['REQUEST_URI'] . '?' . $_SERVER['QUERY_STRING'];
|
||||||
|
$error = 0;
|
||||||
|
include_once PML_BASE . '/inc/login.inc.php';
|
||||||
|
self::release();
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
|
||||||
|
if ( isset( $_GET['signout'] ) ) {
|
||||||
|
self::signOut();
|
||||||
|
self::release();
|
||||||
|
|
||||||
|
if ( self::isAnonymousEnabled( $files ) ) { // Anonymous access, redirect to normal page
|
||||||
|
header( 'Location: ' . $_SERVER['PHP_SELF'] );
|
||||||
|
}
|
||||||
|
else { // No anonymous access, redirect to login page
|
||||||
|
$error = 3;
|
||||||
|
$attempt = '?';
|
||||||
|
include_once PML_BASE . '/inc/login.inc.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the password with logging
|
||||||
|
*
|
||||||
|
* @param string $username the username
|
||||||
|
* @param string $new_password the new password
|
||||||
|
*
|
||||||
|
* @return boolean true
|
||||||
|
*/
|
||||||
|
public static function changePassword($username , $new_password)
|
||||||
|
{
|
||||||
|
self::setUser( $username , $new_password );
|
||||||
|
self::log( 'changepwd' , $username );
|
||||||
|
self::save();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new authentication file
|
||||||
|
*
|
||||||
|
* @return boolean true if ok or false if error or if already exists
|
||||||
|
*/
|
||||||
|
public static function create()
|
||||||
|
{
|
||||||
|
if ( file_exists( self::$authFile ) ) return false;
|
||||||
|
if ( @touch( self::$authFile ) === false ) return false;
|
||||||
|
|
||||||
|
self::$auth = array(
|
||||||
|
'generated' => date('U'),
|
||||||
|
'security' => self::generateSecurityToken(),
|
||||||
|
'anonymous' => array(),
|
||||||
|
'users' => array(),
|
||||||
|
);
|
||||||
|
|
||||||
|
self::save();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a user
|
||||||
|
*
|
||||||
|
* @param string $username the username to delete
|
||||||
|
*
|
||||||
|
* @return array the deleted user or false if not exists
|
||||||
|
*/
|
||||||
|
public static function deleteUser($username)
|
||||||
|
{
|
||||||
|
if ( ! self::userExists( $username ) ) return false;
|
||||||
|
|
||||||
|
$deleted_user = self::$auth['users'][ $username ];
|
||||||
|
unset( self::$auth['users'][ $username ] );
|
||||||
|
|
||||||
|
return $deleted_user;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy the authentication file
|
||||||
|
*
|
||||||
|
* @return boolean success or not
|
||||||
|
*/
|
||||||
|
public static function destroy()
|
||||||
|
{
|
||||||
|
self::sessionDestroy();
|
||||||
|
|
||||||
|
if ( self::isAuthSet() ) {
|
||||||
|
return @unlink( self::$authFile );
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path of the authentication file
|
||||||
|
*
|
||||||
|
* @return string the fila path
|
||||||
|
*/
|
||||||
|
public static function getAuthFilePath()
|
||||||
|
{
|
||||||
|
return PML_CONFIG_BASE . DIRECTORY_SEPARATOR . AUTH_CONFIGURATION_FILE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the local ip address of the current client according to proxy and more...
|
||||||
|
*
|
||||||
|
* @return string an ip address
|
||||||
|
*/
|
||||||
|
public static function getClientIp()
|
||||||
|
{
|
||||||
|
$ip = '';
|
||||||
|
if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
|
||||||
|
$ip = $_SERVER['HTTP_CLIENT_IP'];
|
||||||
|
} elseif ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
|
||||||
|
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
|
||||||
|
} elseif ( isset( $_SERVER['HTTP_X_FORWARDED'] ) ) {
|
||||||
|
$ip = $_SERVER['HTTP_X_FORWARDED'];
|
||||||
|
} elseif ( isset( $_SERVER['HTTP_FORWARDED_FOR'] ) ) {
|
||||||
|
$ip = $_SERVER['HTTP_FORWARDED_FOR'];
|
||||||
|
} elseif ( isset( $_SERVER['HTTP_FORWARDED'] ) ) {
|
||||||
|
$ip = $_SERVER['HTTP_FORWARDED'];
|
||||||
|
} elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
|
||||||
|
$ip = $_SERVER['REMOTE_ADDR'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current logged in user or null
|
||||||
|
*
|
||||||
|
* @return string the current username or null
|
||||||
|
*/
|
||||||
|
public static function getCurrentUsername()
|
||||||
|
{
|
||||||
|
if ( is_array( self::$api_session ) ) {
|
||||||
|
$auth = self::$api_session;
|
||||||
|
} else {
|
||||||
|
$auth = self::sessionRead();
|
||||||
|
}
|
||||||
|
return ( isset( $auth['username'] ) ) ? $auth['username'] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the log array
|
||||||
|
*
|
||||||
|
* @return array data
|
||||||
|
*/
|
||||||
|
public static function getLogs()
|
||||||
|
{
|
||||||
|
if ( isset( self::$auth['logs'] ) ) {
|
||||||
|
return self::$auth['logs'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the data of a user
|
||||||
|
*
|
||||||
|
* @param string $username the username
|
||||||
|
*
|
||||||
|
* @return array data or null if not exists
|
||||||
|
*/
|
||||||
|
public static function getUser($username = null)
|
||||||
|
{
|
||||||
|
if ( is_null( $username ) ) $username = self::getCurrentUsername();
|
||||||
|
|
||||||
|
if ( self::userExists( $username ) ) {
|
||||||
|
return self::$auth['users'][ $username ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find a user from its access token
|
||||||
|
*
|
||||||
|
* @param string $accesstoken the access token
|
||||||
|
*
|
||||||
|
* @return string username or null
|
||||||
|
*/
|
||||||
|
public static function getUsernameFromAccessToken( $accesstoken ) {
|
||||||
|
$users = self::getUsers();
|
||||||
|
foreach( $users as $username => $user ) {
|
||||||
|
if ( $user['at'] === $accesstoken ) {
|
||||||
|
return $username;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the array of users
|
||||||
|
*
|
||||||
|
* @return array the users
|
||||||
|
*/
|
||||||
|
public static function getUsers()
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
|
||||||
|
if ( isset( self::$auth['users'] ) ) {
|
||||||
|
return self::$auth['users'];
|
||||||
|
} else {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the users count
|
||||||
|
*
|
||||||
|
* @return integer the user count
|
||||||
|
*/
|
||||||
|
public static function getUsersCount()
|
||||||
|
{
|
||||||
|
return count( self::getUsers() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set file, etc...
|
||||||
|
*
|
||||||
|
* @return boolean success or not
|
||||||
|
*/
|
||||||
|
public static function init()
|
||||||
|
{
|
||||||
|
self::$authFile = self::getAuthFilePath();
|
||||||
|
if ( self::isAuthSet() ) {
|
||||||
|
self::reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if a user is admin or not. Being admin is having role "admin"
|
||||||
|
*
|
||||||
|
* @param string $username a username or current logged in user if not set
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function isAdmin($username = null)
|
||||||
|
{
|
||||||
|
return self::userHasRole( 'admin' , $username );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if at least one log file is accessible anonymously
|
||||||
|
*
|
||||||
|
* The $files parameter is optional. If given, it will check if all anonymous files still exist.
|
||||||
|
* If they do not exist, they must be erased and they do not count for this check.
|
||||||
|
*
|
||||||
|
* @param array $files The files configuration
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function isAnonymousEnabled( $files = false )
|
||||||
|
{
|
||||||
|
if ( ! isset( self::$auth['anonymous'] ) ) return false;
|
||||||
|
if ( ! is_array( self::$auth['anonymous'] ) ) return false;
|
||||||
|
|
||||||
|
if ( $files === false ) {
|
||||||
|
return ( count( self::$auth['anonymous'] ) > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
$found = 0;
|
||||||
|
foreach( self::$auth['anonymous'] as $file ) {
|
||||||
|
if ( isset( $files[ $file ] ) ) $found++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ( $found > 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell whether authentication file exists or not
|
||||||
|
*
|
||||||
|
* @return boolean [description]
|
||||||
|
*/
|
||||||
|
public static function isAuthSet()
|
||||||
|
{
|
||||||
|
return file_exists( self::$authFile );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if a log file is accessible anonymously
|
||||||
|
*
|
||||||
|
* @param string $log the fileid
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function isLogAnonymous( $log )
|
||||||
|
{
|
||||||
|
return ( in_array( $log , self::$auth['anonymous'] ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell whether a signature is valid for given values or not
|
||||||
|
*
|
||||||
|
* @param string $given_sign the provided signature
|
||||||
|
* @param array $values an array of values to certify
|
||||||
|
* @param string $username the user who has signed values or null for an instance signature
|
||||||
|
*
|
||||||
|
* @return boolean ok or not
|
||||||
|
*/
|
||||||
|
public static function isSignValid( $given_sign , $values , $username = null ) {
|
||||||
|
return ( self::sign( $values , $username ) === $given_sign );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell whether a password is valid or not
|
||||||
|
*
|
||||||
|
* @param string $username the username
|
||||||
|
* @param string $password the password
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function isValidPassword($username , $password)
|
||||||
|
{
|
||||||
|
if ( ! self::userExists( $username ) ) return false;
|
||||||
|
$compute = self::getPasswordHash($username , $password);
|
||||||
|
|
||||||
|
return ( $compute === self::$auth['users'][$username]['pwd'] );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log an action
|
||||||
|
*
|
||||||
|
* @param string $action the action text
|
||||||
|
* @param string $username the username or null for the current logged in user
|
||||||
|
* @param int $timestamp the action timestamp
|
||||||
|
* @param string $ip the IP address
|
||||||
|
* @param string $useragent the user agent
|
||||||
|
*
|
||||||
|
* @return bool true
|
||||||
|
*/
|
||||||
|
public static function log($action , $username = null , $timestamp = null , $ip = null , $useragent = null)
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
|
||||||
|
if ( ! isset( self::$auth['logs'] ) ) {
|
||||||
|
self::$auth['logs'] = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( is_null( $username ) ) $username = self::getCurrentUsername();
|
||||||
|
if ( is_null( $timestamp ) ) $timestamp = date("U");
|
||||||
|
if ( is_null( $ip ) ) $ip = self::getClientIp();
|
||||||
|
if ( is_null( $useragent ) ) $useragent = ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
||||||
|
|
||||||
|
self::$auth['logs'] = array_slice( array_merge( array( array( $action , $username , $timestamp , $ip , $useragent ) ) , self::$auth['logs'] ) , 0 , abs( (int) AUTH_LOG_FILE_COUNT ) );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Release the database file
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function release()
|
||||||
|
{
|
||||||
|
if ( is_null( self::$authFileP ) ) return;
|
||||||
|
$a = @flock( self::$authFileP , LOCK_UN );
|
||||||
|
@fclose( self::$authFileP );
|
||||||
|
self::$authFileP = null;
|
||||||
|
self::$currentlylocked = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just get the auth file and load it in the $auth variable
|
||||||
|
*
|
||||||
|
* @return boolean success or not
|
||||||
|
*/
|
||||||
|
public static function reload()
|
||||||
|
{
|
||||||
|
$content = preg_replace('/^.+\n/', '', self::read() );
|
||||||
|
$array = json_decode( $content , true );
|
||||||
|
if ( is_null( $array ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
self::$auth = $array;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save modifications on disk
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function save()
|
||||||
|
{
|
||||||
|
self::lock();
|
||||||
|
if ( is_null( self::$authFileP ) ) throw new Exception( 'No lock has been requested' );
|
||||||
|
|
||||||
|
$file = '<?php if (realpath(__FILE__)===realpath($_SERVER["SCRIPT_FILENAME"])) {header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");die();}?>' . "\n";
|
||||||
|
$file.= json_encode( self::$auth );
|
||||||
|
|
||||||
|
self::write( $file );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an admin
|
||||||
|
*
|
||||||
|
* @param string $username username
|
||||||
|
* @param string $password password
|
||||||
|
* @param array $logs an array of credentials for log files
|
||||||
|
*
|
||||||
|
* @return boolean true
|
||||||
|
*/
|
||||||
|
public static function setAdmin($username , $password = null , $logs = null)
|
||||||
|
{
|
||||||
|
return self::setUser( $username , $password , $roles = array('admin') , $logs );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a log anonymous or not
|
||||||
|
*
|
||||||
|
* @param string $log the fileid
|
||||||
|
* @param boolean $anonymous true or false
|
||||||
|
*
|
||||||
|
* @return boolean true
|
||||||
|
*/
|
||||||
|
public static function setLogAnonymous( $log , $anonymous )
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
|
||||||
|
$anon = array();
|
||||||
|
|
||||||
|
if ( isset( self::$auth['anonymous'] ) ) {
|
||||||
|
$anon = self::$auth['anonymous'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $anonymous === true ) {
|
||||||
|
$anon[] = $log;
|
||||||
|
$anon = array_unique( $anon );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$anon = array_diff( $anon, array( $log ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
self::$auth['anonymous'] = $anon;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a user
|
||||||
|
*
|
||||||
|
* @param string $username username
|
||||||
|
* @param string $password password
|
||||||
|
* @param array $roles an array of global roles
|
||||||
|
* @param array $logs an array of credentials for log files
|
||||||
|
* @param boolean $regeneratetokens whether access tokens should be regenerated or not
|
||||||
|
*
|
||||||
|
* @return boolean true
|
||||||
|
*/
|
||||||
|
public static function setUser($username , $password = null , $roles = null , $logs = null , $regeneratetokens = false )
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
|
||||||
|
if ( isset( self::$auth['users'][ $username ] ) ) {
|
||||||
|
$user = self::$auth['users'][ $username ];
|
||||||
|
} else {
|
||||||
|
$user = array(
|
||||||
|
'roles' => array('user'),
|
||||||
|
'pwd' => '',
|
||||||
|
'logs' => array(),
|
||||||
|
'cd' => date('U'),
|
||||||
|
'cb' => self::getCurrentUsername(),
|
||||||
|
'at' => self::generateSecurityToken(32), // Access token
|
||||||
|
'hp' => self::generateSecurityToken(16), // Presalt for this user, postsalt is the instance security token
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ( $regeneratetokens === true ) {
|
||||||
|
$user['at'] = self::generateSecurityToken(32);
|
||||||
|
$user['hp'] = self::generateSecurityToken(16);
|
||||||
|
}
|
||||||
|
if ( ! is_null( $password ) ) $user['pwd'] = self::getPasswordHash( $username , $password );
|
||||||
|
if ( is_array( $logs ) ) $user['logs'] = $logs;
|
||||||
|
if ( is_array( $roles ) ) $user['roles'] = $roles;
|
||||||
|
|
||||||
|
self::$auth['users'][ $username ] = $user;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign values
|
||||||
|
*
|
||||||
|
* @param array $values an array of key values to sign
|
||||||
|
* @param string $username the user who signs values or null for an instance signature
|
||||||
|
*
|
||||||
|
* @return string the signature of false if a problem occurs
|
||||||
|
*/
|
||||||
|
public static function sign( $values , $username = null )
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
|
||||||
|
$presalt = self::$auth['security'];
|
||||||
|
$values = json_encode( $values );
|
||||||
|
$postsalt = '';
|
||||||
|
|
||||||
|
if ( ! is_null( $username ) ) {
|
||||||
|
$user = self::getUser( $username );
|
||||||
|
$postsalt = $user['hp'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return sha1( $presalt . $values . $postsalt );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign in user
|
||||||
|
*
|
||||||
|
* @param string $username the user to sign in
|
||||||
|
* @param string $password its password
|
||||||
|
*
|
||||||
|
* @return array the user informations or false if failed
|
||||||
|
*/
|
||||||
|
public static function signIn($username , $password)
|
||||||
|
{
|
||||||
|
$ip = self::getClientIp();
|
||||||
|
$ua = ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
||||||
|
$ts = date("U");
|
||||||
|
|
||||||
|
if ( self::isValidPassword($username , $password) ) {
|
||||||
|
|
||||||
|
self::sessionWrite( array( 'username' => $username ) );
|
||||||
|
self::reload();
|
||||||
|
self::$auth['users'][ $username ]['logincount'] = (int) @self::$auth['users'][ $username ]['logincount'] + 1;
|
||||||
|
self::$auth['users'][ $username ]['lastlogin'] = array(
|
||||||
|
'ip' => $ip,
|
||||||
|
'ua' => $ua,
|
||||||
|
'ts' => $ts
|
||||||
|
);
|
||||||
|
self::log( 'signin' , $username , $ts , $ip , $ua );
|
||||||
|
self::save();
|
||||||
|
|
||||||
|
return self::$auth['users'][ $username ];
|
||||||
|
}
|
||||||
|
|
||||||
|
self::log( 'signinerr' , $username , $ts , $ip , $ua );
|
||||||
|
self::save();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign in as a user
|
||||||
|
*
|
||||||
|
* @param string $username the user to sign in
|
||||||
|
*
|
||||||
|
* @return array the user informations or false if failed
|
||||||
|
*/
|
||||||
|
public static function signInAs($username)
|
||||||
|
{
|
||||||
|
$ip = self::getClientIp();
|
||||||
|
$ua = ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
||||||
|
$ts = date("U");
|
||||||
|
$cu = self::getCurrentUsername();
|
||||||
|
|
||||||
|
self::sessionWrite( array( 'username' => $username ) );
|
||||||
|
self::reload();
|
||||||
|
|
||||||
|
self::log( 'signinas ' . $username , $cu, $ts , $ip , $ua );
|
||||||
|
self::save();
|
||||||
|
|
||||||
|
return self::$auth['users'][ $username ];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign in user with its access token
|
||||||
|
* The signin is only available for this call, no session
|
||||||
|
*
|
||||||
|
* @param string $accesstoken
|
||||||
|
*
|
||||||
|
* @return array the user informations or false if failed
|
||||||
|
*/
|
||||||
|
public static function signInWithAccessToken( $accesstoken )
|
||||||
|
{
|
||||||
|
$username = self::getUsernameFromAccessToken( $accesstoken );
|
||||||
|
|
||||||
|
if ( is_null( $username ) ) return false;
|
||||||
|
|
||||||
|
$ip = self::getClientIp();
|
||||||
|
$ua = ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
||||||
|
$ts = date("U");
|
||||||
|
$cu = get_current_url( true );
|
||||||
|
|
||||||
|
self::$api_session = array( 'username' => $username );
|
||||||
|
|
||||||
|
self::$auth['users'][ $username ]['api_logincount'] = (int) @self::$auth['users'][ $username ]['api_logincount'] + 1;
|
||||||
|
self::$auth['users'][ $username ]['api_lastlogin'] = array(
|
||||||
|
'ip' => $ip,
|
||||||
|
'ua' => $ua,
|
||||||
|
'ts' => $ts
|
||||||
|
);
|
||||||
|
if ( ! is_null( $cu ) ) self::$auth['users'][ $username ]['api_lastlogin']['ur'] = $cu;
|
||||||
|
self::save();
|
||||||
|
|
||||||
|
return self::$auth['users'][ $username ];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sign out the current user and return its username
|
||||||
|
*
|
||||||
|
* @return string the logged out username
|
||||||
|
*/
|
||||||
|
public static function signOut()
|
||||||
|
{
|
||||||
|
$username = self::getCurrentUsername();
|
||||||
|
|
||||||
|
if ( ! is_null( $username ) ) {
|
||||||
|
$ip = self::getClientIp();
|
||||||
|
$ua = ( isset( $_SERVER['HTTP_USER_AGENT'] ) ) ? $_SERVER['HTTP_USER_AGENT'] : '';
|
||||||
|
$ts = date("U");
|
||||||
|
|
||||||
|
self::log( 'signout' , $username , $ts , $ip , $ua );
|
||||||
|
self::save();
|
||||||
|
|
||||||
|
self::sessionDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $username;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if a user has an access on a log file
|
||||||
|
*
|
||||||
|
* @param string $log the fileid
|
||||||
|
* @param string $action the name of the action
|
||||||
|
* @param string $value the value for this action
|
||||||
|
* @param string $username the username
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function userCanOnLogs( $log , $action , $value , $username = null)
|
||||||
|
{
|
||||||
|
if ( is_null( $username ) ) $username = self::getCurrentUsername();
|
||||||
|
if ( is_null( $username ) ) return false;
|
||||||
|
if ( ! self::userExists( $username ) ) return false;
|
||||||
|
if ( in_array( 'admin' , self::$auth['users'][ $username ]['roles'] ) ) return true;
|
||||||
|
if ( ! isset( self::$auth['users'][ $username ]['logs'][ $log ][ $action ] ) ) return false;
|
||||||
|
return ( self::$auth['users'][ $username ]['logs'][ $log ][ $action ] === $value );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell whether user exists or not
|
||||||
|
*
|
||||||
|
* @param string $username the username
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function userExists($username)
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
return ( isset( self::$auth['users'][ $username ] ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell if a user has a role or not
|
||||||
|
*
|
||||||
|
* @param string $username a username or current logged in user if not set
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
public static function userHasRole($role , $username = null)
|
||||||
|
{
|
||||||
|
if ( is_null( $username ) ) $username = self::getCurrentUsername();
|
||||||
|
if ( is_null( $username ) ) return false;
|
||||||
|
if ( ! self::userExists( $username ) ) return false;
|
||||||
|
if ( in_array( 'admin' , self::$auth['users'][ $username ]['roles'] ) ) return true;
|
||||||
|
return ( in_array( $role , self::$auth['users'][ $username ]['roles'] ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a security token
|
||||||
|
*
|
||||||
|
* @return string the security token
|
||||||
|
*/
|
||||||
|
private static function generateSecurityToken( $len = 64 )
|
||||||
|
{
|
||||||
|
return mt_rand_str( $len );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the date when authentication file has been ganarated
|
||||||
|
*
|
||||||
|
* @return integer the generated date
|
||||||
|
*/
|
||||||
|
private static function getGenerated()
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
return self::$auth['generated'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a hash from a username and a password
|
||||||
|
*
|
||||||
|
* @param string $username username
|
||||||
|
* @param string $password password
|
||||||
|
*
|
||||||
|
* @return string the hash
|
||||||
|
*/
|
||||||
|
private static function getPasswordHash($username , $password)
|
||||||
|
{
|
||||||
|
return sha1( self::getSecurityToken() . $username . self::getGenerated() . $password );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the security token
|
||||||
|
*
|
||||||
|
* @return string the security token
|
||||||
|
*/
|
||||||
|
private static function getSecurityToken()
|
||||||
|
{
|
||||||
|
if ( ! is_array( self::$auth ) ) throw new Exception( 'Authentication not initialized' );
|
||||||
|
return self::$auth['security'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lock the database file
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
private static function lock()
|
||||||
|
{
|
||||||
|
if (self::$currentlylocked === false) {
|
||||||
|
self::$authFileP = fopen( self::$authFile , "a+" );
|
||||||
|
if ( flock( self::$authFileP , LOCK_EX ) ) {
|
||||||
|
self::$currentlylocked = true;
|
||||||
|
} else {
|
||||||
|
throw new Exception( 'Unable to lock file' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read the database
|
||||||
|
*
|
||||||
|
* @return string the database content
|
||||||
|
*/
|
||||||
|
private static function read()
|
||||||
|
{
|
||||||
|
self::lock();
|
||||||
|
if ( is_null( self::$authFileP ) ) throw new Exception( 'No lock has been requested' );
|
||||||
|
return stream_get_contents( self::$authFileP , -1 , 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destroy a session
|
||||||
|
*
|
||||||
|
* Need a wrapper to manage session with phpunit
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function sessionDestroy()
|
||||||
|
{
|
||||||
|
// Web
|
||||||
|
if ( isset( $_SERVER['SERVER_PROTOCOL'] ) ) {
|
||||||
|
Session::start();
|
||||||
|
unset( $_SESSION['auth'] );
|
||||||
|
$_SESSION['auth'] = array();
|
||||||
|
Session::write_close();
|
||||||
|
}
|
||||||
|
// CLI
|
||||||
|
else {
|
||||||
|
$value = array();
|
||||||
|
file_put_contents( '_cli_fake_session' , json_encode( $value ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a session
|
||||||
|
*
|
||||||
|
* @return array the array with all auth informations
|
||||||
|
*/
|
||||||
|
private static function sessionRead()
|
||||||
|
{
|
||||||
|
// Web
|
||||||
|
if ( isset( $_SERVER['SERVER_PROTOCOL'] ) ) {
|
||||||
|
|
||||||
|
if ( isset( $_SESSION['auth'] ) ) return $_SESSION['auth'];
|
||||||
|
|
||||||
|
Session::start();
|
||||||
|
|
||||||
|
return ( isset( $_SESSION['auth'] ) ) ? $_SESSION['auth'] : array();
|
||||||
|
}
|
||||||
|
// CLI
|
||||||
|
else {
|
||||||
|
$json = @file_get_contents( '_cli_fake_session' );
|
||||||
|
$value = json_decode( $json , true );
|
||||||
|
|
||||||
|
return ( is_array( $value ) ) ? $value : array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the session array
|
||||||
|
*
|
||||||
|
* @param array $value the array to store
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function sessionWrite($value)
|
||||||
|
{
|
||||||
|
// Web
|
||||||
|
if ( isset( $_SERVER['SERVER_PROTOCOL'] ) ) {
|
||||||
|
Session::start();
|
||||||
|
$_SESSION[ 'auth' ] = $value;
|
||||||
|
Session::write_close();
|
||||||
|
}
|
||||||
|
// CLI
|
||||||
|
else {
|
||||||
|
file_put_contents( '_cli_fake_session' , json_encode( $value ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the database
|
||||||
|
*
|
||||||
|
* @param string $content the database content
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
private static function write($content)
|
||||||
|
{
|
||||||
|
self::lock();
|
||||||
|
if ( is_null( self::$authFileP ) ) throw new Exception( 'No lock has been requested' );
|
||||||
|
ftruncate( self::$authFileP , 0 );
|
||||||
|
fwrite( self::$authFileP , $content );
|
||||||
|
|
||||||
|
return fflush( self::$authFileP );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* On shutdown, release the lock !
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
function pml_sentinel_shutdown()
|
||||||
|
{
|
||||||
|
Sentinel::release();
|
||||||
|
}
|
||||||
|
|
||||||
|
register_shutdown_function('pml_sentinel_shutdown');
|
||||||
|
|
||||||
|
Sentinel::init();
|
69
vendor/potsky/pimp-my-log/inc/classes/Session.php
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
class Session
|
||||||
|
{
|
||||||
|
const SESSION_STARTED = true;
|
||||||
|
const SESSION_NOT_STARTED = false;
|
||||||
|
private static $sessionState = self::SESSION_NOT_STARTED;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overwrite the original session start to specify a path at root of the installation
|
||||||
|
*
|
||||||
|
* If you have several instances of PML on the same server with different paths,
|
||||||
|
* authentication has to be managed distinctly
|
||||||
|
*
|
||||||
|
* @param string $path the path of the cookie
|
||||||
|
* @param integer $lifetime the lifetime of the cookie
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function start( $path = '' , $lifetime = 0 ) {
|
||||||
|
|
||||||
|
if ( self::$sessionState === self::SESSION_NOT_STARTED ) {
|
||||||
|
|
||||||
|
if ( empty( $path ) ) {
|
||||||
|
$sub = array( 'inc' );
|
||||||
|
$url = parse_url( get_current_url() );
|
||||||
|
// we add a string on bottom to manage urls like these
|
||||||
|
// - http://niania/blahblah/pimpmylog/
|
||||||
|
// - http://niania/blahblah/pimpmylog/index.php
|
||||||
|
// So they become
|
||||||
|
// - http://niania/blahblah/pimpmylog/fake
|
||||||
|
// - http://niania/blahblah/pimpmylog/index.phpfake
|
||||||
|
$path = dirname( $url[ 'path' ] . 'fake' );
|
||||||
|
// Now remove all identified subfolders
|
||||||
|
if ( in_array( basename( $path ) , $sub ) ) {
|
||||||
|
$path = dirname( $path );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session_set_cookie_params( $lifetime , $path );
|
||||||
|
|
||||||
|
self::$sessionState = self::SESSION_STARTED;
|
||||||
|
|
||||||
|
return session_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the tmp file and close it
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function write_close() {
|
||||||
|
|
||||||
|
if ( self::$sessionState === self::SESSION_STARTED ) {
|
||||||
|
self::$sessionState = self::SESSION_NOT_STARTED;
|
||||||
|
|
||||||
|
return session_write_close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
567
vendor/potsky/pimp-my-log/inc/configure.php
vendored
Normal file
@ -0,0 +1,567 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
include_once 'global.inc.php';
|
||||||
|
load_default_constants();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Prepare
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
include_once '../cfg/softwares.inc.php';
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Ajax tasks required by body
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( isset( $_POST['s'] ) ) {
|
||||||
|
|
||||||
|
$return = array(
|
||||||
|
'reload' => false,
|
||||||
|
'next' => false,
|
||||||
|
);
|
||||||
|
|
||||||
|
$config_file = PML_CONFIG_BASE . DIRECTORY_SEPARATOR . CONFIG_FILE_NAME;
|
||||||
|
$config_file_temp = PML_CONFIG_BASE . DIRECTORY_SEPARATOR . CONFIG_FILE_TEMP;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Alert user if he has not configured the date.timezone setting
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
set_error_handler( function($errno, $errstr, $errfile, $errline, array $errcontext) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); });
|
||||||
|
$a = date('U');
|
||||||
|
restore_error_handler();
|
||||||
|
|
||||||
|
|
||||||
|
switch ( $_POST['s'] ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Auth 1. Ask for authentication
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'auth':
|
||||||
|
|
||||||
|
// Destroy a previous session
|
||||||
|
Sentinel::destroy();
|
||||||
|
|
||||||
|
$return[ 'notice' ] =
|
||||||
|
'<h2>' . __( 'Setup admin account') . '</h2>'
|
||||||
|
. '<br/>'
|
||||||
|
. __('You can use <em>Pimp my Log</em> without authentication. You will be able to add this feature later from the debugger web interface.') . '<br/>'
|
||||||
|
. '<br/>'
|
||||||
|
. __('Setup an admin account will let you create other users later and give them access to certain log files only.') . '<br/>'
|
||||||
|
. '<br/>'
|
||||||
|
. __( 'Do you want to create an admin account now?') . '<br/>'
|
||||||
|
. '<br/>'
|
||||||
|
. '<br/>'
|
||||||
|
. '<a href="javascript:process_authentication_yes()" class="btn btn-primary">' . __('Create an admin account') . '</a>'
|
||||||
|
. ' '
|
||||||
|
. '<a href="javascript:process_authentication_no()" class="btn btn-default">' . __('No') . '</a>';
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Auth 2. Touch auth file
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'authtouch':
|
||||||
|
|
||||||
|
if ( Sentinel::isAuthSet() === true ) {
|
||||||
|
$path = Sentinel::getAuthFilePath();
|
||||||
|
$return[ 'notice' ] =
|
||||||
|
sprintf( __( 'File <code>%s</code> already exists!') , AUTH_CONFIGURATION_FILE )
|
||||||
|
. '<br/><br/>'
|
||||||
|
. __( 'Please remove it from the root directory:' )
|
||||||
|
. '<div class="row">'
|
||||||
|
. ' <div class="col-md-10"><pre class="clipboardcontent">' . 'mv \'' . $path . '\' \'' . $path . '.bck\'</pre></div>'
|
||||||
|
. ' <div class="col-md-2"><a class="btn btn-primary clipboard">' . __('Copy to clipboard') . '</a><script>clipboard_enable("a.clipboard","pre.clipboardcontent" , "top" , "' . __('Command copied!') . '");</script></div>'
|
||||||
|
. '</div>';
|
||||||
|
$return[ 'reload' ] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auth file is touched so return the form to ask yes or no
|
||||||
|
else if ( Sentinel::create() === true ) {
|
||||||
|
$return[ 'authform' ] =
|
||||||
|
'<h2>' . __( 'Setup admin account') . '</h2>'
|
||||||
|
. '<br/>'
|
||||||
|
. __( 'Please choose a username and a password for the admin account.')
|
||||||
|
. '<br/><br/>'
|
||||||
|
. '<form id="authsave" autocomplete="off">'
|
||||||
|
. '<div class="container">'
|
||||||
|
. '<div class="row">'
|
||||||
|
. '<div class="input-group col-sm-6 col-md-4" id="usernamegroup" data-toggle="tooltip" data-placement="top" title="' . htmlentities( __( 'Username is required' ) ) . '">
|
||||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span>
|
||||||
|
<input type="text" id="username" class="form-control" placeholder="' . __('Username') . '" autofocus="autofocus">
|
||||||
|
</div>'
|
||||||
|
. '<br/>'
|
||||||
|
. '</div>'
|
||||||
|
. '<div class="row">'
|
||||||
|
. '<div class="input-group col-sm-6 col-md-4" id="passwordgroup" data-toggle="tooltip" data-placement="bottom" title="' . htmlentities( __( 'Password must contain at least 6 chars' ) ) . '">
|
||||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
|
||||||
|
<input type="password" id="password" class="form-control" placeholder="' . __('Password') . '">
|
||||||
|
</div>'
|
||||||
|
. '<br/>'
|
||||||
|
. '</div>'
|
||||||
|
. '<div class="row">'
|
||||||
|
. '<div class="input-group col-sm-6 col-md-4" id="password2group" data-toggle="tooltip" data-placement="bottom" title="' . htmlentities( __( 'Password is not the same' ) ) . '">
|
||||||
|
<span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span>
|
||||||
|
<input type="password" id="password2" class="form-control" placeholder="' . __('Password Confirmation') . '">
|
||||||
|
</div>'
|
||||||
|
. '</div>'
|
||||||
|
. '</div>'
|
||||||
|
. '<br/><br/>'
|
||||||
|
. '<input type="submit" class="btn btn-primary" value="' . __('Continue') . '"/>'
|
||||||
|
. '</form>'
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unable to touch, return an error
|
||||||
|
else {
|
||||||
|
$return[ 'notice' ] =
|
||||||
|
'<div class="alert alert-danger">'
|
||||||
|
. sprintf( __( 'Unable to create file <code>%s</code>') , AUTH_CONFIGURATION_FILE )
|
||||||
|
. '</div>'
|
||||||
|
. __( 'Please give temporary write access to the root directory:' )
|
||||||
|
. '<div class="row">'
|
||||||
|
. ' <div class="col-md-10"><pre class="clipboardcontent">' . 'chmod 777 ' . dirname( dirname( __FILE__ ) ) . '</pre></div>'
|
||||||
|
. ' <div class="col-md-2"><a class="btn btn-primary clipboard">' . __('Copy to clipboard') . '</a><script>clipboard_enable("a.clipboard","pre.clipboardcontent" , "top" , "' . __('Command copied!') . '");</script></div>'
|
||||||
|
. '</div>';
|
||||||
|
$return[ 'reload' ] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Auth 3. Save data
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'authsave':
|
||||||
|
if ( ( mb_strlen( $_POST['u'] ) > 0 ) && ( mb_strlen( $_POST['p'] ) >= 6 ) ) {
|
||||||
|
Sentinel::setAdmin( $_POST['u'] , $_POST['p'] );
|
||||||
|
$return[ 'notice' ] = Sentinel::save();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Logs 1. Check if $config_file already exists
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'exist':
|
||||||
|
$config_file_name = get_config_file_name();
|
||||||
|
if ( ! is_null( $config_file_name ) ) {
|
||||||
|
$return[ 'notice' ] =
|
||||||
|
__( 'Please remove it manually if you want me to create it:' )
|
||||||
|
. '<br/><br/>'
|
||||||
|
. '<div class="row">'
|
||||||
|
. ' <div class="col-md-9"><pre class="clipboardcontent">' . 'rm \'' . get_config_file_path() . '\'</pre></div>'
|
||||||
|
. ' <div class="col-md-3"><a class="btn btn-primary clipboard">' . __('Copy to clipboard') . '</a><script>clipboard_enable("a.clipboard","pre.clipboardcontent" , "top" , "' . __('Command copied!') . '");</script></div>'
|
||||||
|
. '</div>';
|
||||||
|
throw new Exception( sprintf( __( 'File <code>%s</code> already exists.') , $config_file_name ) );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Logs 2. Try to touch $config_file_temp
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'touch':
|
||||||
|
if ( ! @touch( $config_file_temp ) ) {
|
||||||
|
$return[ 'notice' ] =
|
||||||
|
'<div class="alert alert-danger">'
|
||||||
|
. sprintf( __( 'Unable to create file <code>%s</code>') , $config_file_temp)
|
||||||
|
. '</div>'
|
||||||
|
. __( 'Please give temporary write access to the root directory:' )
|
||||||
|
. '<div class="row">'
|
||||||
|
. ' <div class="col-md-10"><pre class="clipboardcontent">' . 'chmod 777 ' . dirname( dirname( __FILE__ ) ) . '</pre></div>'
|
||||||
|
. ' <div class="col-md-2"><a class="btn btn-primary clipboard">' . __('Copy to clipboard') . '</a><script>clipboard_enable("a.clipboard","pre.clipboardcontent" , "top" , "' . __('Command copied!') . '");</script></div>'
|
||||||
|
. '</div>';
|
||||||
|
$return[ 'reload' ] = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Logs 3. Return a list of software that the user could install
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'soft' :
|
||||||
|
$return[ 'notice' ] = '<h2>' . __( 'Choose softwares to search log files for') . '</h2>';
|
||||||
|
$return[ 'notice' ].= '<br/>';
|
||||||
|
$return[ 'notice' ].= '<div class="table-responsive"><table id="soft"></table></div>';
|
||||||
|
$return[ 'next' ] = true;
|
||||||
|
$return[ 'sofn' ] = count( $softwares_all );
|
||||||
|
$return[ 'soft' ] = $softwares_all;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Logs 4. Check for configuration files
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'find':
|
||||||
|
$software = $_POST['so'];
|
||||||
|
$softuser = array();
|
||||||
|
$tried = array();
|
||||||
|
$found = 0;
|
||||||
|
$software_paths = '../cfg/' . $software . '.paths.php';
|
||||||
|
$software_pathsuser = '../cfg/' . $software . '.paths.user.php';
|
||||||
|
$return[ 'notice' ] = '<h2>' . sprintf( __( 'Software <em>%s</em>') , $softwares_all[ $software ]['name'] ) . '</h2>';
|
||||||
|
|
||||||
|
if ( file_exists( $software_pathsuser ) ) {
|
||||||
|
include $software_pathsuser;
|
||||||
|
$software_paths = $software_pathsuser;
|
||||||
|
}
|
||||||
|
else if ( file_exists( $software_paths ) ) {
|
||||||
|
include $software_paths;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new Exception( sprintf( __( 'Files <code>%s</code> or <code>%s</code> do not exist. Please review your software configuration.') , $software_paths , $software_pathsuser ) ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ( $paths as $userpath ) {
|
||||||
|
|
||||||
|
$gpaths = glob( $userpath , GLOB_MARK | GLOB_NOCHECK | GLOB_ONLYDIR );
|
||||||
|
|
||||||
|
if ( is_array( $gpaths ) ) {
|
||||||
|
|
||||||
|
foreach( $gpaths as $path ) {
|
||||||
|
|
||||||
|
$tried[ $software ][ $path ] = false;
|
||||||
|
|
||||||
|
if ( is_dir( $path ) ) {
|
||||||
|
|
||||||
|
$found = 1;
|
||||||
|
$tried[ $software ][ $path ] = true;
|
||||||
|
|
||||||
|
foreach ( $files as $type => $fpaths) {
|
||||||
|
|
||||||
|
foreach ( $fpaths as $userfile ) {
|
||||||
|
|
||||||
|
$gfiles = glob( $path . $userfile , GLOB_MARK | GLOB_NOCHECK );
|
||||||
|
|
||||||
|
if ( is_array( $gfiles ) ) {
|
||||||
|
|
||||||
|
foreach( $gfiles as $file ) {
|
||||||
|
|
||||||
|
$file = basename( $file );
|
||||||
|
$allfiles[ $file ] = $file;
|
||||||
|
|
||||||
|
if ( ( is_readable( $path . $file ) ) && ( ! is_dir( $path . $file ) ) ) {
|
||||||
|
|
||||||
|
if ( ! is_array( $tried[ $software ][ $path ] ) ) {
|
||||||
|
$tried[ $software ][ $path ] = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$tried[ $software ][ $path ][ $type ][] = $file;
|
||||||
|
$found = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$softuser[ $software ] = array();
|
||||||
|
foreach ( $files as $type => $fpaths) {
|
||||||
|
$softuser[ $software ][ $type ] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$return[ 'files' ] = $tried;
|
||||||
|
$return[ 'found' ] = $found;
|
||||||
|
|
||||||
|
if ( $found == 0 ) {
|
||||||
|
$return[ 'notice' ].= '<div class="alert alert-danger">' . __( 'Unable to find any directory.') . '</div>';
|
||||||
|
$return[ 'notice' ].= __( 'Check in the following list if these directories are readable by the webserver user and refresh this page' );
|
||||||
|
}
|
||||||
|
else if ( $found == 1 ) {
|
||||||
|
$return[ 'notice' ].= '<div class="alert alert-warning">' . __( 'Directories are available but unable to find files inside.') . '</div>';
|
||||||
|
$return[ 'notice' ].= __( 'Check in the following list if these directories contain readable files by the webserver user and refresh this page.' ) . ' ';
|
||||||
|
$return[ 'notice' ].= __( 'Don\'t forget that to read a file, ALL parent directories have to be accessible too!' ) . ' ';
|
||||||
|
|
||||||
|
$allfiles = array();
|
||||||
|
foreach ( $files as $type => $fpaths) {
|
||||||
|
foreach ( $fpaths as $file ) {
|
||||||
|
$allfiles[] = $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$allfiles = '<code>' . json_encode( $allfiles ) . '</code>';
|
||||||
|
|
||||||
|
$return[ 'notice' ].= sprintf( __( 'These files have been checked in all paths: %s ' ) , $allfiles );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$return[ 'notice' ].= '<div class="alert alert-info">' . __( 'Log files have been found!') . '</div>';
|
||||||
|
$return[ 'notice' ].= __( 'Check in the following list which files you want to configure.' );
|
||||||
|
$return[ 'notice' ].= '<br/>';
|
||||||
|
$return[ 'notice' ].= __( 'If files or directories are missing, verify that they are readable by the webserver user' );
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = get_server_user();
|
||||||
|
$return[ 'notice' ] .= ( $user == '' )
|
||||||
|
? ' (<em>' . __( 'unable to detect web server user') . '</em>):'
|
||||||
|
: ' (<em>' . sprintf( __( 'web server user seems to be <code>%s</code>') , $user ) . '</em>):';
|
||||||
|
|
||||||
|
$return[ 'notice' ] .= '<br/><br/>';
|
||||||
|
$return[ 'notice' ] .= '<div class="table-responsive"><table id="find"></table></div>';
|
||||||
|
$return[ 'notice' ] .= __('You can also type log files path in the text area below separated by coma:');
|
||||||
|
$return[ 'notice' ] .= '<br/><br/>';
|
||||||
|
$return[ 'notice' ] .= '<div class="table-responsive"><table class="table table-striped table-bordered table-hover"><thead><tr><th>' . __( 'Type' ) . '</th><th>' . __( 'Custom paths' ) . '</th></tr></thead><tbody>';
|
||||||
|
foreach( $softuser as $software => $types ) {
|
||||||
|
foreach ( $types as $type => $dumb ) {
|
||||||
|
$return[ 'notice' ] .= '<tr><td>' . $type . ' </td><td><textarea data-soft="' . $software . '" data-type="' . $type . '" class="userpaths form-control" rows="1"></textarea></td></tr>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$return[ 'notice' ] .= '</tbody></table></div>';
|
||||||
|
|
||||||
|
$return[ 'next' ] = true;
|
||||||
|
$return[ 'reload' ] = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Logs 5. Check for user files
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'check':
|
||||||
|
$user_files = $_POST['uf'];
|
||||||
|
if ( ! is_array( $user_files ) ) {
|
||||||
|
throw new Exception( __( 'Unknown error') ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
$found = array();
|
||||||
|
$notfound = array();
|
||||||
|
foreach ( $user_files as $files ) {
|
||||||
|
$software = $files['s'];
|
||||||
|
$type = $files['t'];
|
||||||
|
$file = realpath( $files['f'] );
|
||||||
|
if ( ( is_readable( $file ) ) && ( ! is_dir( $file ) ) ) {
|
||||||
|
$found[] = $files;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$notfound[] = $files['f'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( count( $notfound ) > 0 ) {
|
||||||
|
$return[ 'notice' ] = __( 'Custom files below are not readable, please remove them or verify that they are readable by the webserver user' );
|
||||||
|
$user = get_server_user();
|
||||||
|
$return[ 'notice' ] .= ( $user == '' )
|
||||||
|
? ' (<em>' . __( 'unable to detect web server user') . '</em>):'
|
||||||
|
: ' (<em>' . sprintf( __( 'web server user seems to be <code>%s</code>') , $user ) . '</em>):<ul>';
|
||||||
|
foreach( $notfound as $file ) {
|
||||||
|
$return[ 'notice' ] .= '<li><code>' . $file . '</code></li>';
|
||||||
|
}
|
||||||
|
$return[ 'notice' ] .= '</ul>';
|
||||||
|
$return[ 'next' ] = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$return[ 'found' ] = $found;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Logs 6. Check for user files
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'configure':
|
||||||
|
$logs = $_POST['l'];
|
||||||
|
|
||||||
|
if ( ! is_array( $logs ) ) {
|
||||||
|
throw new Exception( __( 'Unknown error') ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( count( $logs ) == 0 ) {
|
||||||
|
throw new Exception( __( 'Unknown error') ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure all logs
|
||||||
|
$counter = 0;
|
||||||
|
$config_files = array();
|
||||||
|
foreach( $logs as $log ) {
|
||||||
|
$type = $log['t'];
|
||||||
|
$software = $log['s'];
|
||||||
|
$file = $log['f'];
|
||||||
|
$get_config = $software . '_get_config';
|
||||||
|
$counter = $counter + 1;
|
||||||
|
$config = '../cfg/' . $software . '.config.php';
|
||||||
|
$configuser = PML_CONFIG_BASE . DIRECTORY_SEPARATOR . 'cfg' . DIRECTORY_SEPARATOR . $software . '.config.user.php';
|
||||||
|
|
||||||
|
if ( file_exists( $configuser ) ) {
|
||||||
|
include_once $configuser;
|
||||||
|
$config = $configuser;
|
||||||
|
}
|
||||||
|
else if ( file_exists( $config ) ) {
|
||||||
|
include_once $config;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
@unlink( $config_file_temp );
|
||||||
|
throw new Exception( sprintf( __( 'Files <code>%s</code> or <code>%s</code> do not exist. Please review your software configuration.') , $config , $configuser ) ) ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( function_exists( $get_config ) ) {
|
||||||
|
$config_files[] = call_user_func( $get_config , $type , $file , $software , $counter );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
@unlink( $config_file_temp );
|
||||||
|
throw new Exception( sprintf( __( 'File <code>%s</code> does not define function <code>%s</code>. Please review your software configuration.') , $config , $get_config ) ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create and install file
|
||||||
|
if ( count( $config_files ) > 0 ) {
|
||||||
|
$base = file_get_contents( '../cfg/pimpmylog.config.php' );
|
||||||
|
file_put_contents( $config_file_temp , str_replace( '"FILES":"FILES"' , implode( ",\n" , $config_files ) , $base ) );
|
||||||
|
rename( $config_file_temp , $config_file );
|
||||||
|
chmod( $config_file , CONFIG_FILE_MODE );
|
||||||
|
$return[ 'next' ] = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new Exception( __( 'No configuration found for softwares!') ) ;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Unknown action
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
throw new Exception( __( 'Unknown action, abort.' ) );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
// Error message for timezone not configured
|
||||||
|
if ( strpos( $e->getMessage() , 'date.timezone' ) ) {
|
||||||
|
$return[ 'error' ] = $e->getMessage() . '<hr/><span class="glyphicon glyphicon-info-sign"></span> ' . sprintf( __('You should take a look on this %spage%s.') , '<a href="' . TIME_ZONE_SUPPORT_URL . '">' , '</a>' );
|
||||||
|
}
|
||||||
|
// Other error messages
|
||||||
|
else {
|
||||||
|
$return[ 'error' ] = $e->getMessage() . '<hr/><span class="glyphicon glyphicon-info-sign"></span> ' . sprintf( __('You should take a look on this %spage%s.') , '<a href="' . SUHOSIN_URL . '">' , '</a>' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Check if we have returned something
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If not, a command has stopped the execution and we need to alert user about
|
||||||
|
| its configuration
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$check = 0;
|
||||||
|
if ( $return['reload'] === true ) $check++;
|
||||||
|
if ( $return['next'] === true ) $check++;
|
||||||
|
|
||||||
|
if ( count( $return ) === $check ) {
|
||||||
|
$return[ 'error' ] = __( 'Your PHP installation is not correctly configured to run Pimp My Log.' ) . '<hr/><span class="glyphicon glyphicon-info-sign"></span> ' . sprintf( __('You should take a look on this %spage%s.') , '<a href="' . SUHOSIN_URL . '">' , '</a>' );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
header( 'Content-type: application/json' );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Javascript Lemma
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$lemma = array(
|
||||||
|
'complete' => __( '%s% Complete' ),
|
||||||
|
'error' => __( 'An error occurs!' ),
|
||||||
|
'pleasewait' => __( 'Please wait...' ),
|
||||||
|
'software' => __( 'Software' ),
|
||||||
|
'path' => __( 'Path' ),
|
||||||
|
'file' => __( 'File' ),
|
||||||
|
'readable' => __( 'Readable' ),
|
||||||
|
'type' => __( 'Type' ),
|
||||||
|
'no' => __( 'No' ),
|
||||||
|
'yes' => __( 'Yes' ),
|
||||||
|
'name' => __( 'Name' ),
|
||||||
|
'description' => __( 'Description' ),
|
||||||
|
'notes' => __( 'Notes' ),
|
||||||
|
'choosesoftware' => __( 'You have to select at least one software to configure!' ),
|
||||||
|
'chooselog' => __( 'You have to select at least one log file or type the path of a log file!' ),
|
||||||
|
'suhosin' => sprintf( __('You should take a look on this %spage%s.') , '<a href="' . SUHOSIN_URL . '">' , '</a>' ),
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| HTML
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
?><!DOCTYPE html><!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]--><!--[if IE 7]><html class="no-js lt-ie9 lt-ie8"><![endif]--><!--[if IE 8]><html class="no-js lt-ie9"><![endif]--><!--[if gt IE 8]><!--><html class="no-js"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><title><?php echo TITLE;?></title><?php $fav = '../' ; include_once 'favicon.inc.php'; ?><meta name="description" content=""><meta name="viewport" content="width=device-width"><link rel="stylesheet" href="../css/pml.min.css"><script>var lemma = <?php echo json_encode($lemma);?>,
|
||||||
|
uuid = <?php echo json_encode($uuid);?>,
|
||||||
|
querystring = "<?php echo $_SERVER['QUERY_STRING'];?>";</script></head><body><!--[if lt IE 7]><p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p><![endif]--><div class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="logo"></div><div class="navbar-header"><a class="navbar-brand" href="?<?php echo $_SERVER['QUERY_STRING'];?>"> <?php echo __('Configurator');?></a></div></div></div><div class="jumbotronflat"><div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width:0%"><span class="sr-only"></span></div></div></div><div class="container" id="process"><br><?php
|
||||||
|
if ( SUHOSIN_LOADED === true ) {
|
||||||
|
echo '<div class="alert alert-danger"><strong>';
|
||||||
|
echo sprintf( __('Suhosin extension is loaded, according to its configuration, Pimp My Log could not run normally... More information %shere%s.') , '<a href="' . SUHOSIN_URL . '">' , '</a>' );
|
||||||
|
echo '</strong></div>';
|
||||||
|
}
|
||||||
|
?><div id="error"></div><div id="user"></div><br><p id="buttons"><a id="next" class="btn btn-primary" href="#" style="display:none"><?php _e('Continue');?></a> <a id="reload" class="btn btn-default" href="javascript:location.reload();" style="display:none"><?php _e('Reload');?></a> </p></div><div class="jumbotron" id="congratulations" style="display:none"><div class="container"><h1><?php _e( "Congratulations!" ); ?></h1><p><?php
|
||||||
|
echo '<br/>';
|
||||||
|
_e( 'Your <em>Pimp my Log</em> instance is ready to use.' );
|
||||||
|
echo '<br/>';
|
||||||
|
echo '<br/>';
|
||||||
|
echo sprintf( __( 'You can manually adjust settings in the <code>%s</code> file.' ) , CONFIG_FILE_NAME );
|
||||||
|
echo '<br/>';
|
||||||
|
_e( 'Please visit <a href="http://pimpmylog.com">pimpmylog.com</a> for more informations.' );
|
||||||
|
echo '<br/>';
|
||||||
|
echo '<br/>';
|
||||||
|
echo '<a class="btn btn-primary" href="../?' . $_SERVER['QUERY_STRING'] . '">' . __('Pimp my Logs now!') . '</a>';
|
||||||
|
?></p></div></div><div class="container"><hr><footer class="text-muted"><small><?php echo FOOTER;?></small></footer></div><script src="../js/pml.min.js"></script><script src="../js/configure.min.js"></script></body></html>
|
18
vendor/potsky/pimp-my-log/inc/error.inc.php
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
if ( realpath( __FILE__ ) === realpath( $_SERVER[ "SCRIPT_FILENAME" ] ) ) {
|
||||||
|
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found');
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
include_once 'inc/global.inc.php';
|
||||||
|
load_default_constants();
|
||||||
|
?><!DOCTYPE html><!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]--><!--[if IE 7]><html class="no-js lt-ie9 lt-ie8"><![endif]--><!--[if IE 8]><html class="no-js lt-ie9"><![endif]--><!--[if gt IE 8]><!--><html class="no-js"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="description" content=""><meta name="viewport" content="width=device-width"><title><?php echo TITLE;?></title><?php include_once 'inc/favicon.inc.php'; ?><link rel="stylesheet" href="css/pml.min.css"></head><body><!--[if lt IE 7]><p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p><![endif]--><div class="navbar navbar-inverse navbar-fixed-top"><div class="logo"></div></div><div class="jumbotron"><div class="container"><h1><?php echo $title;?></h1><p><?php echo $message;?></p><?php if ( '' != @$link_url ) { ?><p><a class="btn btn-primary" href="<?php echo $link_url;?>"><?php echo $link_msg;?> »</a></p><?php } ?></div></div><div class="container"><footer class="text-muted"><small><?php echo FOOTER;?></small></footer></div><script src="js/pml.min.js"></script></body></html>
|
19
vendor/potsky/pimp-my-log/inc/favicon.inc.php
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
if ( realpath( __FILE__ ) === realpath( $_SERVER[ "SCRIPT_FILENAME" ] ) ) {
|
||||||
|
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found');
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($fav)) {
|
||||||
|
$fav = '';
|
||||||
|
}
|
||||||
|
?><link rel="shortcut icon" href="<?php echo $fav;?>img/favicon.ico" type="image/x-icon"><link rel="apple-touch-icon" href="<?php echo $fav;?>img/apple-touch-icon.png"><link rel="apple-touch-icon" sizes="57x57" href="<?php echo $fav;?>img/apple-touch-icon-57x57.png"><link rel="apple-touch-icon" sizes="60x60" href="<?php echo $fav;?>img/apple-touch-icon-60x60.png"><link rel="apple-touch-icon" sizes="72x72" href="<?php echo $fav;?>img/apple-touch-icon-72x72.png"><link rel="apple-touch-icon" sizes="76x76" href="<?php echo $fav;?>img/apple-touch-icon-76x76.png"><link rel="apple-touch-icon" sizes="114x114" href="<?php echo $fav;?>img/apple-touch-icon-114x114.png"><link rel="apple-touch-icon" sizes="120x120" href="<?php echo $fav;?>img/apple-touch-icon-120x120.png"><link rel="apple-touch-icon" sizes="144x144" href="<?php echo $fav;?>img/apple-touch-icon-144x144.png"><link rel="apple-touch-icon" sizes="152x152" href="<?php echo $fav;?>img/apple-touch-icon-152x152.png">
|
312
vendor/potsky/pimp-my-log/inc/getlog.pml.php
vendored
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
include_once 'global.inc.php';
|
||||||
|
list( $badges , $files ) = config_load();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Login
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$current_user = Sentinel::attempt( $files );
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Checks
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if (( ! isset( $_POST['file'] ) ) ||
|
||||||
|
( ! isset( $_POST['max'] ) ) ||
|
||||||
|
( ! isset( $_POST['ldv'] ) )
|
||||||
|
) {
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error handling
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
function myErrorHandler($errno, $errstr, $errfile, $errline)
|
||||||
|
{
|
||||||
|
global $return;
|
||||||
|
|
||||||
|
//error_log( print_r( $errstr , true ) );
|
||||||
|
//error_log( print_r( $errfile , true ) );
|
||||||
|
//error_log( print_r( $errline , true ) );
|
||||||
|
//error_log( print_r( debug_backtrace() , true ) );
|
||||||
|
|
||||||
|
if ( !( error_reporting() & $errno ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ($errno) {
|
||||||
|
case E_USER_ERROR:
|
||||||
|
echo json_encode( array( 'error' => $errstr ) );
|
||||||
|
exit( 1 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E_USER_WARNING:
|
||||||
|
$return['singlewarning'] = sprintf( __('<strong>PHP Warning</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E_USER_NOTICE:
|
||||||
|
$return['singlenotice'] = sprintf( __('<strong>PHP Notice</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$return['singlewarning'] = sprintf( __('<strong>PHP Unknown error</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$old_error_handler = set_error_handler( "myErrorHandler" );
|
||||||
|
|
||||||
|
register_shutdown_function( 'shutdown' );
|
||||||
|
|
||||||
|
function shutdown()
|
||||||
|
{
|
||||||
|
$error = error_get_last();
|
||||||
|
if ($error['type'] === E_ERROR) {
|
||||||
|
echo json_encode(
|
||||||
|
array(
|
||||||
|
'error' => sprintf( __('<strong>PHP Error</strong> line %s: %s') , $error['line'] , $error['message'] )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Prepare
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$return = array();
|
||||||
|
$file_id = $_POST['file'];
|
||||||
|
$load_default_values = $_POST['ldv'];
|
||||||
|
$max = (int) $_POST['max'];
|
||||||
|
$reset = (int) @$_POST['reset'];
|
||||||
|
$old_file_size = (int) @$_POST['filesize'];
|
||||||
|
$search = @$_POST['search'];
|
||||||
|
$old_lastline = @$_POST['lastline'];
|
||||||
|
|
||||||
|
header('Content-type: application/json');
|
||||||
|
|
||||||
|
if ( ! csrf_verify() ) {
|
||||||
|
$return['error'] = __( 'Please refresh the page.' );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! isset( $files[$file_id] ) ) {
|
||||||
|
$return['error'] = sprintf( __( 'File ID <code>%s</code> does not exist, please review your configuration file and stop playing!' ) , $file_id );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$file_path = @$files[$file_id]['path'];
|
||||||
|
if ( ! file_exists( $file_path ) ) {
|
||||||
|
$return['error'] = sprintf( __( 'File <code>%s</code> for file ID <code>%s</code> does not exist, please review your configuration file.' ) , $file_path , $file_id );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$errors = config_check( $files );
|
||||||
|
if ( is_array( $errors ) ) {
|
||||||
|
$return['error'] = __( 'Configuration file has changed and is buggy now. Please refresh the page.' );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
$regex = $files[ $file_id ][ 'format' ][ 'regex' ];
|
||||||
|
$match = $files[ $file_id ][ 'format' ][ 'match' ];
|
||||||
|
$types = $files[ $file_id ][ 'format' ][ 'types' ];
|
||||||
|
$multiline = ( isset( $files[ $file_id ][ 'format' ][ 'multiline' ] ) ) ? $files[ $file_id ][ 'format' ][ 'multiline' ] : '';
|
||||||
|
$exclude = ( isset( $files[ $file_id ][ 'format' ][ 'exclude' ] ) ) ? $files[ $file_id ][ 'format' ][ 'exclude' ] : array();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Timezone
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$now = new DateTime();
|
||||||
|
if ( ! is_null( $tz ) ) {
|
||||||
|
$now->setTimezone( new DateTimeZone( $tz ) );
|
||||||
|
}
|
||||||
|
$now = $now->format( 'Y/m/d H:i:s' );
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Set the beginning of the parser
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If sp parameter exists, we need to beginning to count from the top and put an offset of sp
|
||||||
|
| If not set, just begin at the end of the file
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( isset( $_POST['sp'] ) ) {
|
||||||
|
$start_offset = (float)$_POST['sp'] - 1;
|
||||||
|
$start_from = SEEK_SET;
|
||||||
|
$load_more = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$start_offset = 0;
|
||||||
|
$start_from = SEEK_END;
|
||||||
|
$load_more = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Check how many bytes we have to read
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$new_file_size = filesize( $file_path ); // Must be the nearest of fseek !
|
||||||
|
$full = false;
|
||||||
|
if ($reset === 1) {
|
||||||
|
$full = true;
|
||||||
|
$data_to_parse = $new_file_size;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$data_to_parse = $new_file_size - $old_file_size;
|
||||||
|
if ($data_to_parse < 0) { // Log file has been rotated, read all. It is not possible on apache because server is restarted gracefully but perhaps user has done something...
|
||||||
|
$data_to_parse = $new_file_size;
|
||||||
|
$full = true;
|
||||||
|
$return['notice'] = '<strong>'. $now . '</strong> : ' . sprintf( __('Log file has been rotated (previous size was %s and new one is %s)') , human_filesize($old_file_size) , human_filesize($new_file_size) );
|
||||||
|
}
|
||||||
|
if ($old_file_size === 0) {
|
||||||
|
$full = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Get logs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$logs = LogParser::getNewLines( $regex , $match , $types , $tz , $max , $exclude , $file_path , $start_offset , $start_from , $load_more , $old_lastline , $multiline , $search , $data_to_parse , $full , MAX_SEARCH_LOG_TIME );
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error while getting logs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( ! is_array( $logs ) ) {
|
||||||
|
switch ( $logs ) {
|
||||||
|
case '1':
|
||||||
|
$return['error'] = sprintf( __( 'File <code>%s</code> for file ID <code>%s</code> does not exist anymore...' ) , $file_path , $file_id );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$return['error'] = sprintf( __( 'Unknown error %s' ) , $logs );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Return
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
else {
|
||||||
|
|
||||||
|
$return = array_merge( $return , $logs );
|
||||||
|
$ln = $return['count'];
|
||||||
|
$filem = $return['filemodif'];
|
||||||
|
|
||||||
|
if ( @$logs['notice'] === 1 ) {
|
||||||
|
$return[ 'notice' ] = '<strong>'. $now . '</strong> > ' . __('Log file has been rotated');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Return headers if logs have been found
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( $logs[ 'found' ] === true ) {
|
||||||
|
foreach ( $match as $k => $v ) {
|
||||||
|
$return['headers'][ $k ] = __( $k );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Only mark the lastline for new logs, not when we load older log lines
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( $load_more === true ) {
|
||||||
|
unset( $return['lastline'] );
|
||||||
|
} else {
|
||||||
|
$return['newfilesize'] = $new_file_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Footer
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$return['footer'] = sprintf( __( '%s in <code>%sms</code> with <code>%s</code> of logs, <code>%s</code> skipped line(s), <code>%s</code> unreadable line(s).<br/>File <code>%s</code> was last modified on <code>%s</code> at <code>%s</code>, size is <code>%s</code>%s' )
|
||||||
|
, ( $load_more === false )
|
||||||
|
? (
|
||||||
|
( $ln > 1 )
|
||||||
|
? sprintf( __('%s new logs found') , $ln )
|
||||||
|
: (
|
||||||
|
( $ln === 0 )
|
||||||
|
? __( 'no new log found')
|
||||||
|
: __( '1 new log found')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
: (
|
||||||
|
( $ln > 1 )
|
||||||
|
? sprintf( __('%s old logs found') , $ln )
|
||||||
|
: (
|
||||||
|
( $ln === 0 )
|
||||||
|
? __( 'no old log found')
|
||||||
|
: __( '1 olg log found')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
, $return['duration']
|
||||||
|
, human_filesize( $return['bytes'] )
|
||||||
|
, $return['skiplines']
|
||||||
|
, $return['errorlines']
|
||||||
|
, $file_path
|
||||||
|
, $filem
|
||||||
|
, $tz
|
||||||
|
, human_filesize( $new_file_size )
|
||||||
|
, ( isset( $files[ $file_id ][ 'format' ][ 'type' ] ) )
|
||||||
|
? ', ' . sprintf( __('log type is <code>%s</code>') , $files[ $file_id ][ 'format' ][ 'type' ] )
|
||||||
|
: ''
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode( $return );
|
||||||
|
|
||||||
|
die();
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
1390
vendor/potsky/pimp-my-log/inc/global.inc.php
vendored
Normal file
0
vendor/potsky/pimp-my-log/inc/index.html
vendored
Normal file
57
vendor/potsky/pimp-my-log/inc/login.inc.php
vendored
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
if ( realpath( __FILE__ ) === realpath( $_SERVER[ "SCRIPT_FILENAME" ] ) ) {
|
||||||
|
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found');
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
include_once 'inc/global.inc.php';
|
||||||
|
load_default_constants();
|
||||||
|
?><!DOCTYPE html><!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]--><!--[if IE 7]><html class="no-js lt-ie9 lt-ie8"><![endif]--><!--[if IE 8]><html class="no-js lt-ie9"><![endif]--><!--[if gt IE 8]><!--><html class="no-js"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="description" content=""><meta name="pmltrick" content="Pimp My Log Login Match"><meta name="viewport" content="width=device-width"><title><?php echo TITLE;?></title><?php include_once 'inc/favicon.inc.php'; ?><link rel="stylesheet" href="css/pml.min.css"></head><body><!--[if lt IE 7]><p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p><![endif]--><div class="navbar navbar-inverse navbar-fixed-top"><div class="logo"></div></div><div class="jumbotron"><center><div class="container"><div class="container"><div class="row"><div class="input-group col-sm-6 col-md-4"><?php
|
||||||
|
if ( (int)@$error === 1 ) {
|
||||||
|
echo '<div class="alert alert-danger">';
|
||||||
|
echo __('Your username or password is not correct');
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
else if ( (int)@$error === 2 ) {
|
||||||
|
echo '<div class="alert alert-warning">';
|
||||||
|
echo __('Please try again...');
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
else if ( (int)@$error === 3 ) {
|
||||||
|
echo '<div class="alert alert-info">';
|
||||||
|
echo __('You have been logged out');
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
else if ( $_SERVER['SERVER_NAME'] === 'demo.pimpmylog.com' ) {
|
||||||
|
echo '<br/>';
|
||||||
|
echo '<div class="alert alert-info">';
|
||||||
|
echo sprintf( __('You can use %s as the username and %s as the password to test the demo account') , '<code>demo</code>' , '<code>pimpmylog</code>' );
|
||||||
|
echo '</div>';
|
||||||
|
echo '<br/>';
|
||||||
|
}
|
||||||
|
?></div></div></div><h2><?php echo __("Please sign in");?></h2><br><form method="POST" action="?"><div class="container"><div class="row"><div class="input-group col-sm-6 col-md-4"><span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span> <?php
|
||||||
|
$u = ( strlen( "" . @$_POST['username'] ) > 0 ) ? htmlentities( $_POST['username'] , ENT_QUOTES , 'UTF-8' ) : '';
|
||||||
|
if ( strlen( "" . @$_POST['username'] ) === 0 ) {
|
||||||
|
echo '<input type="text" name="username" value="' . $u .'" class="form-control" placeholder="' . __('Username') . '" autofocus="autofocus"/>';
|
||||||
|
} else {
|
||||||
|
echo '<input type="text" name="username" value="' . $u .'" class="form-control" placeholder="' . __('Username') . '"/>';
|
||||||
|
}
|
||||||
|
?></div><br></div><div class="row"><div class="input-group col-sm-6 col-md-4"><span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span> <?php
|
||||||
|
if ( strlen( "" . @$_POST['username'] ) === 0 ) {
|
||||||
|
echo '<input type="password" name="password" class="form-control" placeholder="' . __('Password') . '"/>';
|
||||||
|
} else {
|
||||||
|
echo '<input type="password" name="password" class="form-control" placeholder="' . __('Password') . '" autofocus="autofocus"/>';
|
||||||
|
}
|
||||||
|
?></div></div></div><br><br><input type="submit" class="btn btn-primary" value="Pimp my Logs"><input type="hidden" name="csrf_token" value="<?php echo csrf_get(); ?>"><input type="hidden" name="attempt" value="<?php echo htmlentities( $attempt , ENT_QUOTES , 'UTF-8' ); ?>"></form><br><a href="<?php echo FORGOTTEN_YOUR_PASSWORD_URL;?>"><?php _e('Forgotten your password?') ?></a></div></center></div><div class="container"><footer class="text-muted"><small><?php echo FOOTER;?></small></footer></div><script src="js/pml.min.js"></script><script src="js/login.min.js"></script><?php if ( ( 'UA-XXXXX-X' != GOOGLE_ANALYTICS ) && ( '' != GOOGLE_ANALYTICS ) ) { ?><script>var _gaq=[['_setAccount','<?php echo GOOGLE_ANALYTICS;?>'],['_trackPageview']];
|
||||||
|
(function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
|
||||||
|
g.src='//www.google-analytics.com/ga.js';
|
||||||
|
s.parentNode.insertBefore(g,s)}(document,'script'));</script><?php } ?></body></html>
|
196
vendor/potsky/pimp-my-log/inc/rss.php
vendored
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
include_once 'global.inc.php';
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Get parameters
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( ! isset( $_GET['f'] ) ) {
|
||||||
|
http404();
|
||||||
|
}
|
||||||
|
$file_id = $_GET['f'];
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Authentication
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$user = null;
|
||||||
|
|
||||||
|
if ( ( isset( $_GET['t'] ) ) && ( isset( $_GET['h'] ) ) ) {
|
||||||
|
|
||||||
|
if ( Sentinel::isAuthSet() ) { // perhaps auth has been deactivated since link generation
|
||||||
|
$accesstoken = $_GET['t'];
|
||||||
|
$username = Sentinel::getUsernameFromAccessToken( $accesstoken );
|
||||||
|
|
||||||
|
if ( is_null( $username ) ) { // User does not exist anymore
|
||||||
|
http404();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sign in user
|
||||||
|
$user = Sentinel::signInWithAccessToken( $accesstoken );
|
||||||
|
|
||||||
|
// Check the security hash
|
||||||
|
if ( ! Sentinel::isSignValid( $_GET['h'] , array( 'f' => $file_id ) , $username ) ) {
|
||||||
|
http403();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if ( ( ! isset( $_GET['t'] ) ) && ( isset( $_GET['h'] ) ) ) {
|
||||||
|
http404();
|
||||||
|
}
|
||||||
|
else if ( ( isset( $_GET['t'] ) ) && ( ! isset( $_GET['h'] ) ) ) {
|
||||||
|
http404();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Load config
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
list( $badges , $files ) = config_load();
|
||||||
|
|
||||||
|
if ( ! isset( $files[ $file_id ] ) ) {
|
||||||
|
http403();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( isset( $files[ $file_id ]['export'] ) ) && ( $files[ $file_id ]['export'] === false ) ) {
|
||||||
|
http403();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( EXPORT === false ) && ( ! isset( $files[ $file_id ]['export'] ) ) ) {
|
||||||
|
http403();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Get logs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$search = ( isset( $_GET['search'] ) ) ? $_GET['search'] : '';
|
||||||
|
$format = ( isset( $_GET['format'] ) ) ? $_GET['format'] : 'JSON';
|
||||||
|
$count = ( isset( $_GET['count'] ) ) ? $_GET['count'] : ( ( isset( $files[ $file_id ][ 'max' ] ) ) ? $files[ $file_id ][ 'max' ] : LOGS_MAX );
|
||||||
|
$timeout = ( isset( $_GET['timeout'] ) ) ? $_GET['timeout'] : MAX_SEARCH_LOG_TIME;
|
||||||
|
|
||||||
|
$regex = $files[ $file_id ][ 'format' ][ 'regex' ];
|
||||||
|
$match = $files[ $file_id ][ 'format' ][ 'match' ];
|
||||||
|
$types = $files[ $file_id ][ 'format' ][ 'types' ];
|
||||||
|
$multiline = ( isset( $files[ $file_id ][ 'format' ][ 'multiline' ] ) ) ? $files[ $file_id ][ 'format' ][ 'multiline' ] : '';
|
||||||
|
$exclude = ( isset( $files[ $file_id ][ 'format' ][ 'exclude' ] ) ) ? $files[ $file_id ][ 'format' ][ 'exclude' ] : array();
|
||||||
|
$title = ( isset( $files[ $file_id ][ 'format' ][ 'export_title' ] ) ) ? $files[ $file_id ][ 'format' ][ 'export_title' ] : '';
|
||||||
|
$file_path = $files[$file_id]['path'];
|
||||||
|
$start_offset = 0;
|
||||||
|
$start_from = SEEK_END;
|
||||||
|
$load_more = false;
|
||||||
|
$old_lastline = '';
|
||||||
|
$data_to_parse = filesize( $file_path );
|
||||||
|
$full = true;
|
||||||
|
$logs = LogParser::getNewLines( $regex , $match , $types , $tz , $count , $exclude , $file_path , $start_offset , $start_from , $load_more , $old_lastline , $multiline , $search , $data_to_parse , $full , $timeout );
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error while getting logs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( ! is_array( $logs ) ) {
|
||||||
|
http500();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Return
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$link = str_replace( 'inc/rss.php' , '' , get_current_url( true ) );
|
||||||
|
|
||||||
|
header( "Pragma: public" );
|
||||||
|
header( "Expires: 0" );
|
||||||
|
header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
|
||||||
|
|
||||||
|
switch ( $format ) {
|
||||||
|
|
||||||
|
case 'ATOM':
|
||||||
|
case 'RSS':
|
||||||
|
require( 'classes/Feedcreator.php' );
|
||||||
|
define( 'TIME_ZONE' , $tz );
|
||||||
|
define( 'FEEDCREATOR_VERSION', 'Pimp My Log v' . get_current_pml_version() );
|
||||||
|
$rss = new UniversalFeedCreator();
|
||||||
|
$rss->title = sprintf( __( "Pimp My Log : %s" ) , $files[ $file_id ][ 'display' ] );
|
||||||
|
$rss->description = ( empty( $search ) )
|
||||||
|
? sprintf( __( "Pimp logs for file %s" ), $files[ $file_id ][ 'path' ] )
|
||||||
|
: sprintf( __( "Pimp logs for file %s with search %s" ), $files[ $file_id ][ 'path' ] , $search );
|
||||||
|
$rss->descriptionTruncSize = 500;
|
||||||
|
$rss->descriptionHtmlSyndicated = true;
|
||||||
|
$rss->link = $link;
|
||||||
|
$rss->syndicationURL = get_current_url( true );
|
||||||
|
$image = new FeedImage();
|
||||||
|
$image->title = $rss->title;
|
||||||
|
$image->url = str_replace( 'inc/rss.php' , 'img/icon72.png' , get_current_url() );
|
||||||
|
$image->link = $link;
|
||||||
|
$image->description = __( "Feed provided by Pimp My Log" );
|
||||||
|
$image->descriptionTruncSize = 500;
|
||||||
|
$image->descriptionHtmlSyndicated = true;
|
||||||
|
$rss->image = $image;
|
||||||
|
if ( ( isset( $logs['logs'] ) ) && ( is_array( $logs['logs'] ) ) ) {
|
||||||
|
foreach( array_reverse( $logs['logs'] ) as $log ) {
|
||||||
|
$item = new FeedItem();
|
||||||
|
$description = '';
|
||||||
|
foreach( $log as $key => $value ) {
|
||||||
|
if ( substr( $key , 0 , 3) !== 'pml' ) {
|
||||||
|
$description .= '<strong>' . h( $key ) . '</strong> : ' . h( $value ) . '<br/>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$item->description = $description;
|
||||||
|
if ( isset( $log['pmld'] ) ) {
|
||||||
|
$item->date = $log['pmld'];
|
||||||
|
}
|
||||||
|
if ( isset( $log[ $title ] ) ) {
|
||||||
|
$item->title = $log[ $title ];
|
||||||
|
} else {
|
||||||
|
$item->title = current( $log ) . ' - ' . sha1( serialize( $log ) );
|
||||||
|
}
|
||||||
|
if ( $format === 'ATOM' ) {
|
||||||
|
$item->author = 'PmL';
|
||||||
|
}
|
||||||
|
$item->link = $link . '&' . $log['pmlo'];
|
||||||
|
$item->guid = $link . '&' . $log['pmlo'];
|
||||||
|
$item->descriptionTruncSize = 500;
|
||||||
|
$item->descriptionHtmlSyndicated = true;
|
||||||
|
$rss->addItem($item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$rss->outputFeed( $tz , $format );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'CSV':
|
||||||
|
header( "Content-Transfer-Encoding: binary" );
|
||||||
|
header( "Content-Disposition: attachment;filename=PimpMyLog_" . get_slug( $file_id) . "_" . date( "Y-m-d-His" ) . '.csv' );
|
||||||
|
header( "Content-type: application/vnd.ms-excel; charset=UTF-16LE" );
|
||||||
|
echo chr( 255 ) . chr( 254 ) . mb_convert_encoding( array2csv( $logs['logs'] ) , 'UTF-16LE' , 'UTF-8' );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'XML':
|
||||||
|
header('Content-type: application/xml', true);
|
||||||
|
$xml = '<?xml version="1.0" encoding="UTF-8" ?>'; $xml .= '<pml>'; $xml .= generate_xml_from_array( $logs , 'log' ); $xml .= '</pml>'; echo $xml; break; case 'JSONPR': header('Content-type: application/json', true); if ( version_compare( PHP_VERSION , '5.4.0' ) >= 0 ) { echo json_encode( $logs , JSON_PRETTY_PRINT ); } else { echo json_indent( json_encode( $logs ) ); } break; case 'JSONP': header('Content-type: application/javascript', true); echo ( isset( $_GET['callback'] ) ) ? $_GET['callback'] : '?'; echo '('; echo json_encode( $logs ); echo ')'; break; case 'JSON': default: header('Content-type: application/json', true); echo json_encode( $logs ); break; } ?>
|
194
vendor/potsky/pimp-my-log/inc/rss.pml.php
vendored
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
include_once 'global.inc.php';
|
||||||
|
list( $badges , $files ) = config_load();
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error handling
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
function myErrorHandler( $errno, $errstr, $errfile, $errline ) {
|
||||||
|
global $return;
|
||||||
|
if ( !( error_reporting() & $errno ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch ( $errno ) {
|
||||||
|
case E_USER_ERROR:
|
||||||
|
echo json_encode( array( 'error' => $errstr ) );
|
||||||
|
exit( 1 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E_USER_WARNING:
|
||||||
|
$return['singlewarning'] = sprintf( __('<strong>PHP Warning</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E_USER_NOTICE:
|
||||||
|
$return['singlenotice'] = sprintf( __('<strong>PHP Notice</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$return['singlewarning'] = sprintf( __('<strong>PHP Unknown error</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$old_error_handler = set_error_handler( "myErrorHandler" );
|
||||||
|
|
||||||
|
register_shutdown_function( 'shutdown' );
|
||||||
|
|
||||||
|
function shutdown() {
|
||||||
|
$error = error_get_last();
|
||||||
|
if ( $error['type'] === E_ERROR ) {
|
||||||
|
echo json_encode(
|
||||||
|
array(
|
||||||
|
'error' => sprintf( __('<strong>PHP Error</strong> line %s: %s') , $error['line'] , $error['message'] )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Prepare
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
header('Content-type: application/json');
|
||||||
|
|
||||||
|
$return = array();
|
||||||
|
|
||||||
|
if ( ! csrf_verify() ) {
|
||||||
|
$return['error'] = __( 'Please refresh the page.' );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( ! isset( $files[ $_POST['file'] ] ) ) {
|
||||||
|
$return['error'] = __( 'This log file does not exist.' );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
$file_id = $_POST['file'];
|
||||||
|
$format = $_POST['format'];
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Actions
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
switch ( @$_POST['action'] ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Generate the RSS Link
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'get_rss_link':
|
||||||
|
|
||||||
|
$url = get_current_url();
|
||||||
|
|
||||||
|
switch ( $format ) {
|
||||||
|
case 'ATOM':
|
||||||
|
case 'RSS':
|
||||||
|
// http://en.wikipedia.org/wiki/Feed_URI_scheme
|
||||||
|
/*
|
||||||
|
$url = str_replace(
|
||||||
|
array( 'http://' , 'https://' ),
|
||||||
|
array( 'feed://' , 'feed://' ),
|
||||||
|
$url
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
$method = 'nd';
|
||||||
|
break;
|
||||||
|
case 'CSV':
|
||||||
|
$method = 'nd';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$method = 'nw';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = str_replace(
|
||||||
|
array( 'rss.pml.php' ),
|
||||||
|
array( 'rss.php' ),
|
||||||
|
$url
|
||||||
|
)
|
||||||
|
. '?f=' . urlencode( $file_id )
|
||||||
|
. '&l=' . urlencode( ( isset( $_GET['l'] ) ) ? $_GET['l'] : $lang )
|
||||||
|
. '&tz=' . urlencode( $tz )
|
||||||
|
. '&format=' . urlencode( $format )
|
||||||
|
. '&count=' . ( ( isset( $files[ $file_id ][ 'max' ] ) ) ? urlencode( $files[ $file_id ][ 'max' ] ) : urlencode( LOGS_MAX ) )
|
||||||
|
. '&timeout=' . urlencode( MAX_SEARCH_LOG_TIME )
|
||||||
|
. '&search=' . urlencode( @$_POST['search'] )
|
||||||
|
;
|
||||||
|
|
||||||
|
$current_user = Sentinel::attempt( $files );
|
||||||
|
|
||||||
|
// We authenticate the url if a user is logged in
|
||||||
|
// -> if log is anonymous, the request will be authenticated and if an admin remove
|
||||||
|
// the anonymous log, this user will always be able to get it
|
||||||
|
// -> if the log file is protected, this user will be able to get ot according to its rights
|
||||||
|
if ( ! is_null( $current_user ) ) {
|
||||||
|
$username = Sentinel::getCurrentUsername();
|
||||||
|
$user = Sentinel::getUser( $username );
|
||||||
|
$token = $user[ 'at' ];
|
||||||
|
$hash = Sentinel::sign( array( 'f' => $_POST['file'] ) , $username );
|
||||||
|
|
||||||
|
$url = $url . '&t=' . urlencode( $token ) . '&h=' . urlencode( $hash );
|
||||||
|
}
|
||||||
|
|
||||||
|
$u = parse_url($url);
|
||||||
|
$ip = $u['host'];
|
||||||
|
|
||||||
|
if ( filter_var( $ip , FILTER_VALIDATE_IP ) ) {
|
||||||
|
$return['war'] = ( ! is_not_local_ip( $ip ) );
|
||||||
|
} else if ( $ip === 'localhost' ) {
|
||||||
|
$return['war'] = true;
|
||||||
|
} else {
|
||||||
|
$return['war'] = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$return['url'] = $url;
|
||||||
|
$return['met'] = $method;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Unknown action...
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
error_log( 'Unknown action ' . @$_POST['action'] );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| End tuning
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
|
||||||
|
?>
|
422
vendor/potsky/pimp-my-log/inc/test.php
vendored
Normal file
@ -0,0 +1,422 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
include_once 'global.inc.php';
|
||||||
|
|
||||||
|
load_default_constants();
|
||||||
|
|
||||||
|
$access_file = str_replace(':', '', 'test.PLEASE_REMOVE_ME.access_from_' . get_client_ip() . '_only.php' );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Regex Tester
|
||||||
|
*
|
||||||
|
* @param string $type type
|
||||||
|
* @param string $regex regex
|
||||||
|
* @param array $match matchers
|
||||||
|
* @param array $types typers
|
||||||
|
* @param array $logs logs
|
||||||
|
* @param boolean $headers display header
|
||||||
|
* @param string $multiline multiline field
|
||||||
|
*
|
||||||
|
* @return string html
|
||||||
|
*/
|
||||||
|
function test( $type , $regex , $match , $types , $logs , $headers = true , $multiline = '' ) {
|
||||||
|
$r = '<h4>' . $type . '</h4>';
|
||||||
|
$r .= '<pre>';
|
||||||
|
$r .= ( $headers === true ) ? '<strong>Regex</strong>: ' . $regex . "\n" : '';
|
||||||
|
$r .= ( $headers === true ) ? '<strong>Log </strong>: ' . $logs . "\n" : '';
|
||||||
|
$r .= ( $headers === true ) ? "\n" : '';
|
||||||
|
|
||||||
|
$logs = array_reverse( explode( "\n" , $logs ) );
|
||||||
|
$rank = 0;
|
||||||
|
$size = count( strval( count($logs) ) ) + 2;
|
||||||
|
$blan = str_pad( '' , $size );
|
||||||
|
$buffer = array();
|
||||||
|
|
||||||
|
foreach( $logs as $log ) {
|
||||||
|
|
||||||
|
$tokens = LogParser::parseLine( $regex , $match , $log , $types );
|
||||||
|
|
||||||
|
if ( is_array( $tokens ) ) {
|
||||||
|
$rank++;
|
||||||
|
$disp = ( $headers ) ? '' : str_pad( '#' . $rank , $size );
|
||||||
|
|
||||||
|
$maxlength = 0;
|
||||||
|
foreach ( $tokens as $token => $value ) $maxlength = max( $maxlength , strlen( $token ) );
|
||||||
|
|
||||||
|
$r .= ( $headers ) ? '' : '<strong>' . $disp . $log . "</strong>\n";
|
||||||
|
|
||||||
|
foreach ( $tokens as $token => $value ) {
|
||||||
|
if ( substr( $token , 0 , 3 ) === 'pml' ) continue;
|
||||||
|
|
||||||
|
$r .= $blan . '<strong>' . str_pad( $token , $maxlength ) . '</strong>: ' . $value;
|
||||||
|
|
||||||
|
if ( $token === $multiline ) {
|
||||||
|
if ( count( $buffer ) > 0 ) {
|
||||||
|
$buffer = array_reverse( $buffer );
|
||||||
|
foreach ( $buffer as $append ) {
|
||||||
|
$r .= "\n" . $blan . str_pad( '' , $maxlength ) . ' ' . $append;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$r .= "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
$r .= "\n";
|
||||||
|
$buffer = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
$buffer[] = $log;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$r .= '</pre>';
|
||||||
|
return $r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ajax return for regexp tester
|
||||||
|
*/
|
||||||
|
if ( ( @$_POST['action'] === 'regextest' ) && ( file_exists( $access_file ) ) ) {
|
||||||
|
|
||||||
|
$return = array();
|
||||||
|
$match = @json_decode( $_POST['m'] , true );
|
||||||
|
$types = @json_decode( $_POST['t'] , true );
|
||||||
|
$regex = $_POST['r'];
|
||||||
|
$log = $_POST['l'];
|
||||||
|
$multiline = $_POST['u'];
|
||||||
|
|
||||||
|
if ( ! is_array( $match ) ) {
|
||||||
|
$return['err'] = 'inputMatch';
|
||||||
|
$return['msg'] = '<div class="alert alert-danger"><strong>' . __('Error') . '</strong> '. __('Match is not a valid associative array') . '</div>';
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_array( $types ) ) {
|
||||||
|
$return['err'] = 'inputTypes';
|
||||||
|
$return['msg'] = '<div class="alert alert-danger"><strong>' . __('Error') . '</strong> '. __('Types is not a valid associative array') . '</div>';
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( @preg_match( $regex , 'this is just a test !' ) === false ) {
|
||||||
|
$return['err'] = 'inputRegEx';
|
||||||
|
$return['msg'] = '<div class="alert alert-danger"><strong>' . __('Error') . '</strong> '. __('RegEx is not a valid PHP PCRE regular expression') . '</div>';
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
header('Content-type: application/json');
|
||||||
|
$return['msg'] = test( '' , $regex , $match, $types, $log , false , $multiline );
|
||||||
|
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////
|
||||||
|
// Javascript Lemma //
|
||||||
|
//////////////////////
|
||||||
|
$lemma = array(
|
||||||
|
"configuration_copied" => __( "Configuration array has been copied to your clipboard!" ),
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
?><!DOCTYPE html><!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]--><!--[if IE 7]><html class="no-js lt-ie9 lt-ie8"><![endif]--><!--[if IE 8]><html class="no-js lt-ie9"><![endif]--><!--[if gt IE 8]><!--><html class="no-js"><!--<![endif]--><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="description" content=""><meta name="viewport" content="width=device-width"><title><?php echo TITLE;?></title><?php $fav = '../' ; include_once 'favicon.inc.php'; ?><link rel="stylesheet" href="../css/pml.min.css"><script>var lemma = <?php echo json_encode($lemma);?>;</script></head><body><!--[if lt IE 7]><p class="chromeframe">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> or <a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.</p><![endif]--><div class="navbar navbar-inverse navbar-fixed-top"><div class="container"><div class="logo"></div><div class="navbar-header"><a class="navbar-brand" href="?<?php echo $_SERVER['QUERY_STRING'];?>"> <?php _e('Debugger');?></a></div></div></div><div class="container"><br><?php
|
||||||
|
if ( ( ! file_exists( $access_file ) ) && ( ! Sentinel::isAdmin() ) ) {
|
||||||
|
echo '<div class="row">';
|
||||||
|
echo '<div class="col-xs-12"><div class="alert alert-danger">';
|
||||||
|
echo __( 'This page is protected for security reasons.');
|
||||||
|
echo '</div>';
|
||||||
|
if ( Sentinel::isAuthSet() ) {
|
||||||
|
echo sprintf( __('%sSign in%s as an administrator to view this page or follow instructions below.') , '<a href="../index.php?signin&attempt=' . urlencode( 'inc/test.php' ) . '">' , '</a>' ) . '<br/>';
|
||||||
|
}
|
||||||
|
echo '<br/>' . __('To grant access, please create this temporary file on your server:');
|
||||||
|
echo '<br/><br/>';
|
||||||
|
echo '</div>';
|
||||||
|
echo '<div class="col-md-8"><pre class="clipboard2content">touch \'' . dirname( __FILE__ ) . DIRECTORY_SEPARATOR . $access_file . '\'</pre></div>';
|
||||||
|
echo '<div class="col-md-4"><a class="btn btn-primary clipboard" data-source=".clipboard2content" data-placement="right" data-text="' . h("Command has been copied to your clipboard!") . '">' . __('Copy to clipboard') . '</a></div>';
|
||||||
|
echo '<div class="col-xs-12">';
|
||||||
|
echo '<br/>' . __("Then reload this page.") . '<br/><br/>';
|
||||||
|
echo '<button onclick="document.location.reload();" class="btn btn-primary">' . __("Reload") . '</button>';
|
||||||
|
echo '</div>';
|
||||||
|
echo '</div>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
?><ul class="nav nav-tabs" role="tablist"><li class="active"><a href="#quittab" role="tab" data-toggle="tab"><?php _e('Quit');?></a></li><li><a href="#retestertab" role="tab" data-toggle="tab"><?php _e('Regex tester');?></a></li><li><a href="#resamplestab" role="tab" data-toggle="tab"><?php _e('Regex samples');?></a></li><li><a href="#configurationtab" role="tab" data-toggle="tab"><?php _e('Configuration');?></a></li><li><a href="#passwordtab" role="tab" data-toggle="tab"><?php _e('Password recovery');?></a></li><li><a href="#authactivation" role="tab" data-toggle="tab"><?php _e('Authentication');?></a></li></ul><div class="tab-content"><div class="tab-pane active" id="quittab"><br><div class="row"><?php if ( ! Sentinel::isAdmin() ) : ?><div class="col-xs-12"><div class="alert alert-warning"><?php _e('Please remove this temporary file on your server to disable the debugger!'); ?></div></div><br><br><div class="col-md-8"><pre class="clipboard3content"><?php echo 'rm \'' . dirname( __FILE__ ) . DIRECTORY_SEPARATOR . $access_file . '\''; ?></pre></div><?php echo '<div class="col-md-4"><a class="btn btn-primary clipboard" data-source=".clipboard3content" data-placement="right" data-text="' . h( "Command has been copied to your clipboard!" ) . '">' . __('Copy to clipboard') . '</a></div>';?><?php else : ?><div class="col-xs-12"><div class="alert alert-info"><?php _e('You can access the debugger because you are an administrator'); ?></div></div><?php endif; ?></div></div><div class="tab-pane" id="retestertab"><div class="panel-body"><form class="form-horizontal" role="form" id="regextest"><div class="form-group" id="GPinputLog"><label for="inputLog" class="col-sm-2 control-label"><?php _e('Log');?></label><div class="col-sm-10"><textarea class="form-control test" id="inputLog" placeholder="Log"><?php
|
||||||
|
echo '[27-11-2013:23:20:40 +0300] This is an error
|
||||||
|
on several lines with timezone UTC+3
|
||||||
|
[27-11-2013:23:20:41 +0100] Single line is cool too';
|
||||||
|
?></textarea></div></div><div class="form-group" id="GPinputRegEx"><label for="inputRegEx" class="col-sm-2 control-label"><?php _e('RegEx');?></label><div class="col-sm-10"><textarea class="form-control test" id="inputRegEx" placeholder="RegEx"><?php
|
||||||
|
echo '|^\[(.*)-(.*)-(.*):(.*):(.*):(.*) (.*)\] (.*)$|U';
|
||||||
|
?></textarea></div></div><div class="form-group" id="GPinputMatch"><label for="inputMatch" class="col-sm-2 control-label"><?php _e('Match');?><br><small><?php _e('must be json encoded');?></small></label><div class="col-sm-10"><textarea class="form-control test" id="inputMatch" placeholder="Match" rows="5"><?php
|
||||||
|
$match = array(
|
||||||
|
'Date' => array(
|
||||||
|
'Y' => 3,
|
||||||
|
'm' => 2,
|
||||||
|
'd' => 1,
|
||||||
|
'H' => 4,
|
||||||
|
'i' => 5,
|
||||||
|
's' => 6,
|
||||||
|
'z' => 7,
|
||||||
|
),
|
||||||
|
'Error' => 8,
|
||||||
|
);
|
||||||
|
$match = array(
|
||||||
|
'Date' => array( 3 , '/' , 2 , '/' , 1 , ' ' , 4 , ':' , 5, ':' , 6 , ' ' , 7 ),
|
||||||
|
'Error' => 8,
|
||||||
|
);
|
||||||
|
echo json_indent( json_encode($match))
|
||||||
|
?></textarea></div></div><div class="form-group" id="GPinputTypes"><label for="inputTypes" class="col-sm-2 control-label"><?php _e('Types');?><br><small><?php _e('must be json encoded');?></small></label><div class="col-sm-10"><textarea class="form-control test" id="inputTypes" placeholder="Types" rows="5"><?php
|
||||||
|
$types = array(
|
||||||
|
'Date' => 'date:d/m/Y H:i:s /100',
|
||||||
|
'Error' => 'txt',
|
||||||
|
);
|
||||||
|
echo json_indent( json_encode($types))
|
||||||
|
?></textarea></div></div><div class="form-group" id="GPinputMultiline"><label for="inputMultiline" class="col-sm-2 control-label"><?php _e('Multiline');?></label><div class="col-sm-10"><input class="form-control test" id="inputMultiline" placeholder="Multiline" value="Error"></div></div><div class="form-group"><div class="col-sm-offset-2 col-sm-10"><button type="submit" class="btn btn-success" title="<?php _h('Use CTRL-R shortcut instead of clicking on this button');?>" data-loading-text="<?php _h('Loading...');?>" id="regexTestertestBtn"><?php _e('Test');?></button> <a class="btn btn-primary clipboard"><?php _e('Copy to clipboard');?></a></div></div><div id="regexresult"></div></form></div></div><div class="tab-pane" id="resamplestab"><div class="panel-body"><?php
|
||||||
|
$type = 'Error Apache 2.2 with referer';
|
||||||
|
$log = '[Wed Nov 27 09:30:11 2013] [error] [client 127.0.0.1] PHP 1. {main}() /Users/potsky/Private/Work/GitHub/PHPApacheLogViewer/inc/get_logs.php:0, referer: http://localhost/~potsky/PHPApacheLogViewer/';
|
||||||
|
$regex = '|^\[(.*)\] \[(.*)\] (\[client (.*)\] )*((?!\[client ).*)(, referer: (.*))*$|U';
|
||||||
|
$match = array(
|
||||||
|
'Date' => 1,
|
||||||
|
'IP' => 4,
|
||||||
|
'Log' => 5,
|
||||||
|
'Severity' => 2,
|
||||||
|
'Referer' => 7,
|
||||||
|
);
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Error Apache 2.2 server restart';
|
||||||
|
$log = '[Thu Nov 28 14:03:10 2013] [notice] SIGHUP received. Attempting to restart';
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Error Apache 2.2 without referer';
|
||||||
|
$log = '[Wed Nov 27 09:30:11 2013] [error] [client 127.0.0.1] PHP 1. {main}() /Users/potsky/Private/Work/GitHub/PHPApacheLogViewer/inc/get_logs.php:0';
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Error Apache 2.4 with referer and without module name';
|
||||||
|
$log = "[Fri Oct 11 04:41:06.897613 2013] [:error] [pid 61939] [client 192.168.207.71:44171] script '/usr/local/www/apache24/data/test.php' not found or unable to stat, referer: [localhost]";
|
||||||
|
$regex = '|^\[(.*) (.*) (.*) (.*):(.*):(.*)\.(.*) (.*)\] \[(.*):(.*)\] \[pid (.*)\] .*\[client (.*):(.*)\] (.*)(, referer: (.*))*$|U';
|
||||||
|
$match = array(
|
||||||
|
'Date' => array(
|
||||||
|
'M' => 2,
|
||||||
|
'd' => 3,
|
||||||
|
'H' => 4,
|
||||||
|
'i' => 5,
|
||||||
|
's' => 6,
|
||||||
|
'Y' => 8,
|
||||||
|
),
|
||||||
|
'IP' => 12,
|
||||||
|
'Log' => 14,
|
||||||
|
'Severity' => 10,
|
||||||
|
'Referer' => 16,
|
||||||
|
);
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Error Apache 2.4 without referer and without module name';
|
||||||
|
$log = "[Fri Oct 11 04:41:06.897613 2013] [:error] [pid 61939] [client 192.168.207.71:44171] script '/usr/local/www/apache24/data/test.php' not found or unable to stat";
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Error Apache 2.4 with referer and with module name';
|
||||||
|
$log = "[Sat Nov 24 23:24:18.318257 2012] [authz_core:debug] [pid 21841:tid 140204006696704] mod_authz_core.c(802): [client 80.8.82.242:62269] AH01626: authorization result of Require all granted: granted, referer: http://www.adza.com/";
|
||||||
|
$match = array(
|
||||||
|
'Date' => array(
|
||||||
|
'M' => 2,
|
||||||
|
'd' => 3,
|
||||||
|
'H' => 4,
|
||||||
|
'i' => 5,
|
||||||
|
's' => 6,
|
||||||
|
'Y' => 8,
|
||||||
|
),
|
||||||
|
'IP' => 12,
|
||||||
|
'Log' => array( ' >>> ' , 9 , 14),
|
||||||
|
'Severity' => 10,
|
||||||
|
'Referer' => 16,
|
||||||
|
);
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Access Apache 2.2 with referer and user agent';
|
||||||
|
$log = '127.0.0.1 - - [27/Nov/2013:10:20:40 +0100] "GET /~potsky/PHPApacheLogViewer/inc/get_logs.php?ldv=false&file=access&max=27 HTTP/1.1" 200 33 "http://localhost/~potsky/PHPApacheLogViewer/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71"';
|
||||||
|
$regex = '|^((\S*) )*(\S*) (\S*) (\S*) \[(.*)\] "(\S*) (.*) (\S*)" ([0-9]*) (.*)( "(.*)" "(.*)"( [0-9]*/([0-9]*))*)*$|U';
|
||||||
|
$match = array(
|
||||||
|
'CMD' => 7,
|
||||||
|
'Code' => 10,
|
||||||
|
'Date' => 6,
|
||||||
|
'IP' => 3,
|
||||||
|
'Referer' => 13,
|
||||||
|
'Size' => 11,
|
||||||
|
'UA' => 14,
|
||||||
|
'URL' => 8,
|
||||||
|
'User' => 5,
|
||||||
|
'Time' => 16,
|
||||||
|
);
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Access Apache 2.2 with virtual host referer and user agent';
|
||||||
|
$log = 'potsky.com 62.129.4.154 - rb [19/Dec/2013:16:11:22 +0100] "POST /P1mpmyL0g-dev/inc/getlog.pml.php?1387465882519 HTTP/1.1" 200 7660 "https://home.potsky.com/P1mpmyL0g-dev/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.73.11 (KHTML, like Gecko) Version/7.0.1 Safari/537.73.11"';
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Access Apache 2.2 with tuning options';
|
||||||
|
$log = '62.129.4.154 - - [29/Nov/2013:18:13:22 +0100] "GET /PimpMyLogs/inc/getlog.pml.php?ldv=true&file=access&max=20 HTTP/1.1" 500 96 "http://www.potsky.com/PimpMyLogs/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71" 10/10003980';
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
|
||||||
|
$type = 'Access Apache 2.2 dummy SSL connection';
|
||||||
|
$log = '::1 - - [27/Nov/2013:12:02:08 +0100] "OPTIONS * HTTP/1.0" 200 - "-" "Apache/2.2.25 (Unix) mod_ssl/2.2.26 OpenSSL/1.0.1e DAV/2 PHP/5.3.27 (internal dummy connection)"';
|
||||||
|
echo test( $type , $regex , $match , $types , $log );
|
||||||
|
?></div></div><div class="tab-pane" id="configurationtab"><div class="panel-body"><div class="panel-group" id="accordion2"><div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a data-toggle="collapse" data-parent="#accordion2" href="#collapseOne2">Code <code><?php echo get_config_file_path();?></code></a></h4></div><div id="collapseOne2" class="panel-collapse collapse"><div class="panel-body"><pre><?php if (file_exists( get_config_file_path() )) show_source( get_config_file_path() ); else echo 'configuration file does not exist'; ?></pre></div></div></div><div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a data-toggle="collapse" data-parent="#accordion2" href="#collapseTwo2">Stats <code><?php echo get_config_file_path();?></code></a></h4></div><div id="collapseTwo2" class="panel-collapse collapse"><div class="panel-body"><pre><?php if (file_exists( get_config_file_path() ) ) var_export( @stat( get_config_file_path() ) ); else echo 'configuration file does not exist'; ?></pre></div></div></div><div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a data-toggle="collapse" data-parent="#accordion2" href="#collapseFive2"><?php
|
||||||
|
$current_user = Sentinel::getCurrentUsername();
|
||||||
|
if ( is_null( $current_user ) ) {
|
||||||
|
_e('Generated files with includes (no user logged in or no auth)');
|
||||||
|
} else {
|
||||||
|
echo sprintf( __( 'Generated files with includes for user %s') , '<code>' . $current_user . '</code>' );
|
||||||
|
}
|
||||||
|
?></a></h4></div><div id="collapseFive2" class="panel-collapse collapse"><div class="panel-body"><pre><?php
|
||||||
|
list( $badges , $files ) = config_load();
|
||||||
|
if ( version_compare( PHP_VERSION , '5.4.0' ) >= 0 ) {
|
||||||
|
echo json_encode( $files , JSON_PRETTY_PRINT );
|
||||||
|
} else {
|
||||||
|
echo json_indent( json_encode( $logs ) );
|
||||||
|
}
|
||||||
|
?></pre></div></div></div><div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a data-toggle="collapse" data-parent="#accordion2" href="#collapseFour2"><?php _e('Rights');?></a></h4></div><div id="collapseFour2" class="panel-collapse collapse"><div class="panel-body"><pre><?php
|
||||||
|
if (function_exists('posix_getpwuid')) {
|
||||||
|
var_dump( @posix_getpwuid(posix_geteuid()) );
|
||||||
|
} else {
|
||||||
|
_e('No POSIX functions...');
|
||||||
|
}
|
||||||
|
?></pre><?php
|
||||||
|
$paths = array(
|
||||||
|
'config' => get_config_file_path(),
|
||||||
|
);
|
||||||
|
if ( is_array( @$files ) ) {
|
||||||
|
foreach ( $files as $fileid => $file ) {
|
||||||
|
$paths[ '--> ' . $fileid ] = @$file['path'];
|
||||||
|
$dir_name = realpath( $file['path'] );
|
||||||
|
if ( file_exists( $dir_name ) ) {
|
||||||
|
while ( $dir_name != dirname( $dir_name ) ) {
|
||||||
|
$dir_name = dirname( $dir_name );
|
||||||
|
$paths[ $dir_name ] = $dir_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '<div class="table-responsive"><table>';
|
||||||
|
echo '<thead><tr><th>'.__('Read').'</th><th>'.__('Write').'</th><th>ID</th><th>'.__('Path').'</th><th>'.__('Real path').'</th></tr></thead>';
|
||||||
|
echo '<tbody>';
|
||||||
|
foreach ( $paths as $id => $file ) {
|
||||||
|
|
||||||
|
set_error_handler( function($errno, $errstr, $errfile, $errline, array $errcontext) {});
|
||||||
|
if ( is_readable($file) ) {
|
||||||
|
$r = __('Yes');
|
||||||
|
$rc = 'success';
|
||||||
|
} else {
|
||||||
|
$r = __('No');
|
||||||
|
$rc = 'danger';
|
||||||
|
}
|
||||||
|
if ( is_writable($file) ) {
|
||||||
|
$w = __('Yes');
|
||||||
|
$wc = 'success';
|
||||||
|
} else {
|
||||||
|
$w = __('No');
|
||||||
|
$wc = 'danger';
|
||||||
|
}
|
||||||
|
$rp = realpath($file);
|
||||||
|
restore_error_handler();
|
||||||
|
|
||||||
|
if ( empty( $rp ) ) {
|
||||||
|
$rc = 'default';
|
||||||
|
$wc = 'default';
|
||||||
|
$rp = __('Not allowed by open_basedir restriction');
|
||||||
|
}
|
||||||
|
|
||||||
|
echo '<tr>
|
||||||
|
<td><span class="label label-' . $rc . '">'. $r .'</span></td>
|
||||||
|
<td><span class="label label-' . $wc . '">'. $w .'</span></td>
|
||||||
|
<td>'.$id.'</td>
|
||||||
|
<td><code>'.$file.'</code></td>
|
||||||
|
<td><code>'.$rp.'</code></td>
|
||||||
|
</tr>';
|
||||||
|
}
|
||||||
|
echo '</tbody>';
|
||||||
|
echo '</table></div>';
|
||||||
|
|
||||||
|
?></div></div></div><div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a data-toggle="collapse" data-parent="#accordion2" href="#collapseSix2">PHP Modules</a></h4></div><div id="collapseSix2" class="panel-collapse collapse"><div class="panel-body"><?php
|
||||||
|
_e('To be optimal, Pimp My Log needs all these modules ok:');
|
||||||
|
echo '<ul>';
|
||||||
|
|
||||||
|
echo '<li>';
|
||||||
|
if ( MB_SUPPORT === true ) {
|
||||||
|
echo 'Multibyte String <span class="label label-success">' . __('Yes') . '</span>';
|
||||||
|
} else {
|
||||||
|
echo 'Multibyte String <span class="label label-danger">' . __('No') . '</span>';
|
||||||
|
echo ' <span class="text-muted">(' . sprintf( __('Follow instructions %shere%s to enable') , '<a href="http://php.net/manual/en/mbstring.installation.php" target="_blank">' , '</a>' ) . ')</span>';
|
||||||
|
}
|
||||||
|
echo '</li>';
|
||||||
|
|
||||||
|
echo '<li>';
|
||||||
|
if ( GETTEXT_SUPPORT === true ) {
|
||||||
|
echo 'Gettext <span class="label label-success">' . __('Yes') . '</span>';
|
||||||
|
} else {
|
||||||
|
echo 'Gettext <span class="label label-danger">' . __('No') . '</span>';
|
||||||
|
echo ' <span class="text-muted">(' . sprintf( __('Follow instructions %shere%s to enable') , '<a href="http://php.net/manual/en/gettext.installation.php" target="_blank">' , '</a>' ) . ')</span>';
|
||||||
|
}
|
||||||
|
echo '</li>';
|
||||||
|
|
||||||
|
echo '</ul>';
|
||||||
|
?></div></div></div><div class="panel panel-default"><div class="panel-heading"><h4 class="panel-title"><a data-toggle="collapse" data-parent="#accordion2" href="#collapseThree2">PHPInfo</a></h4></div><div id="collapseThree2" class="panel-collapse collapse"><div class="panel-body"><?php
|
||||||
|
ob_start();
|
||||||
|
phpinfo();
|
||||||
|
preg_match ('%<style type="text/css">(.*?)</style>.*?(<body>.*</body>)%s', ob_get_clean(), $matches);
|
||||||
|
echo $matches[2];
|
||||||
|
?></div></div></div></div></div></div><div class="tab-pane" id="authactivation"><?php
|
||||||
|
$return = '';
|
||||||
|
|
||||||
|
if ( @$_POST['action'] === 'authactivation' ) {
|
||||||
|
Sentinel::init();
|
||||||
|
Sentinel::create();
|
||||||
|
|
||||||
|
if ( Sentinel::userExists( $_POST['username'] ) ) {
|
||||||
|
$return = '<br/><div class="alert alert-danger" role="alert">' . sprintf( __('User %s already exists!') , '<code>' . $_POST['username'] . '</code>' ) . '</div>';
|
||||||
|
}
|
||||||
|
else if ( $_POST['password'] !== $_POST['password2'] ) {
|
||||||
|
$return = '<br/><div class="alert alert-danger" role="alert">' . __( 'Password confirmation is not the same' ) . '</div>';
|
||||||
|
}
|
||||||
|
else if ( mb_strlen( $_POST['password'] ) < 6 ) {
|
||||||
|
$return = '<br/><div class="alert alert-danger" role="alert">' . __( 'Password must contain at least 6 chars' ) . '</div>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Sentinel::setAdmin( $_POST['username'] , $_POST['password'] );
|
||||||
|
Sentinel::save();
|
||||||
|
$return = '<br/><div class="alert alert-success" role="alert">' . __('Authentication has been enabled and admin account has been created!') . '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?><?php if ( Sentinel::isAuthSet() ) { ?><?php echo $return; ?><br><div class="alert alert-info" role="alert"><?php _e('Authentication is currently enabled'); ?></div><br><div class="row"><div class="col-xs-12"><div class="alert alert-danger"><?php _e('Please remove this file on your server to disable authentication'); ?></div></div><br><br><div class="col-md-8"><pre class="clipboard4content">rm '<?php echo Sentinel::getAuthFilePath(); ?>'</pre></div><?php echo '<div class="col-md-4"><a class="btn btn-primary clipboard" data-source=".clipboard4content" data-placement="right" data-text="' . h( "Command has been copied to your clipboard!" ) . '">' . __('Copy to clipboard') . '</a></div>';?></div><?php } else { ?><?php echo $return; ?><br><div class="alert alert-warning" role="alert"><?php _e('Authentication is currently disabled'); ?></div><h4><?php _e( 'Setup admin account') ?></h4><form id="authsave" autocomplete="off" method="POST" action="?#authactivation"><input type="hidden" name="action" value="authactivation"><div class="container"><div class="row"><div class="input-group col-sm-6 col-md-4" id="usernamegroup" data-toggle="tooltip" data-placement="top" title="<?php _h( 'Username is required' ); ?>"><span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span> <input type="text" id="username" name="username" class="form-control" value="<?php echo h( @$_POST['username'] ); ?>" placeholder="<?php _h('Username') ?>" autofocus="autofocus"></div><br></div><div class="row"><div class="input-group col-sm-6 col-md-4" id="passwordgroup" data-toggle="tooltip" data-placement="bottom" title="<?php _h( 'Password must contain at least 6 chars' ); ?>"><span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span> <input type="password" id="password" name="password" class="form-control" value="<?php echo h( @$_POST['password'] ); ?>" placeholder="<?php _h('Password') ?>"></div><br></div><div class="row"><div class="input-group col-sm-6 col-md-4" id="password2group" data-toggle="tooltip" data-placement="bottom" title="<?php _h( 'Password is not the same' ); ?>"><span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span> <input type="password" id="password2" name="password2" class="form-control" value="<?php echo h( @$_POST['password2'] ); ?>" placeholder="<?php _h('Password Confirmation') ?>"></div></div></div><br><br><input type="submit" class="btn btn-large btn-success" value="<?php _h('Enable authentication') ?>"></form><?php } ?></div><div class="tab-pane" id="passwordtab"><?php if ( Sentinel::isAuthSet() ) { ?><br><h4><?php _e( 'Please fill an existing username and a new password') ?></h4><?php
|
||||||
|
if ( @$_POST['action'] === 'passwordtab' ) {
|
||||||
|
if ( ! Sentinel::userExists( $_POST['username'] ) ) {
|
||||||
|
echo '<div class="alert alert-danger" role="alert">' . sprintf( __('User %s does not exist!') , '<code>' . $_POST['username'] . '</code>' ) . '</div>';
|
||||||
|
}
|
||||||
|
else if ( $_POST['password'] !== $_POST['password2'] ) {
|
||||||
|
echo '<div class="alert alert-danger" role="alert">' . __( 'Password confirmation is not the same' ) . '</div>';
|
||||||
|
}
|
||||||
|
else if ( mb_strlen( $_POST['password'] ) < 6 ) {
|
||||||
|
echo '<div class="alert alert-danger" role="alert">' . __( 'Password must contain at least 6 chars' ) . '</div>';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Sentinel::setUser( $_POST['username'] , $_POST['password'] );
|
||||||
|
Sentinel::save();
|
||||||
|
echo '<div class="alert alert-success" role="alert">' . sprintf( __('Password has been updated for user %s!') , '<code>' . $_POST['username'] . '</code>' ) . '</div>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?><form id="authsave" autocomplete="off" method="POST" action="?#passwordtab"><input type="hidden" name="action" value="passwordtab"><div class="container"><div class="row"><div class="input-group col-sm-6 col-md-4" id="usernamegroup" data-toggle="tooltip" data-placement="top" title="<?php _h( 'Username is required' ); ?>"><span class="input-group-addon"><span class="glyphicon glyphicon-user"></span></span> <input type="text" id="username" name="username" class="form-control" value="<?php echo h( @$_POST['username'] ); ?>" placeholder="<?php _h('Username') ?>" autofocus="autofocus"></div><br></div><div class="row"><div class="input-group col-sm-6 col-md-4" id="passwordgroup" data-toggle="tooltip" data-placement="bottom" title="<?php _h( 'Password must contain at least 6 chars' ); ?>"><span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span> <input type="password" id="password" name="password" class="form-control" value="<?php echo h( @$_POST['password'] ); ?>" placeholder="<?php _h('Password') ?>"></div><br></div><div class="row"><div class="input-group col-sm-6 col-md-4" id="password2group" data-toggle="tooltip" data-placement="bottom" title="<?php _h( 'Password is not the same' ); ?>"><span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span> <input type="password" id="password2" name="password2" class="form-control" value="<?php echo h( @$_POST['password2'] ); ?>" placeholder="<?php _h('Password Confirmation') ?>"></div></div></div><br><br><input type="submit" class="btn btn-large btn-success" value="<?php _h('Reset') ?>"></form><?php } else { ?><br><div class="alert alert-info" role="alert"><?php _e('This feature is only available when authentication is enabled.'); ?></div><?php } ?></div></div><?php } ?><hr><footer class="text-muted"><small><?php echo FOOTER;?></small></footer></div><script src="../js/pml.min.js"></script><script src="../js/test.min.js"></script></body></html>
|
443
vendor/potsky/pimp-my-log/inc/upgrade.pml.php
vendored
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
/*! pimpmylog - 1.6.2 - 0e09a3e0b9c484aad1511108d7f86bc34dfbc7ce*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
include_once 'global.inc.php';
|
||||||
|
list( $badges , $files ) = config_load( false );
|
||||||
|
|
||||||
|
header('Content-type: application/json');
|
||||||
|
|
||||||
|
if ( ! csrf_verify() ) {
|
||||||
|
$logs['error'] = __( 'Please refresh the page.' );
|
||||||
|
echo json_encode( $logs );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Special AJAX functions
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( isset( $_POST['action'] ) ) {
|
||||||
|
|
||||||
|
switch ( $_POST['action'] ) {
|
||||||
|
case 'upgradegitpull':
|
||||||
|
if ( upgrade_is_git() ) {
|
||||||
|
$can_pull = upgrade_can_git_pull();
|
||||||
|
if ( ! is_array( $can_pull ) ) {
|
||||||
|
exec( 'git pull' , $lines );
|
||||||
|
|
||||||
|
Session::start();
|
||||||
|
$_SESSION['upgradegitpullok'] = $lines;
|
||||||
|
Session::write_close();
|
||||||
|
|
||||||
|
echo json_encode( array( 'logs' => $lines ) );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo json_encode( array( 'error' => __('GIT is no more availble, please refresh the page') ) );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo json_encode( array( 'error' => __('GIT is no more availble, please refresh the page') ) );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
die();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Let's go
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$upgrade = array(
|
||||||
|
'footer' => '',
|
||||||
|
'alert' => '',
|
||||||
|
'current' => '',
|
||||||
|
'to' => '',
|
||||||
|
'messages' => '',
|
||||||
|
'messagesto' => '',
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( file_exists( '../version.js' ) ) {
|
||||||
|
$JSl_version = json_decode( clean_json_version( @file_get_contents( '../version.js' ) ) , true );
|
||||||
|
$upgrade['current'] = $JSl_version[ 'version' ];
|
||||||
|
$default = sprintf ( __( 'Current version %s' ) , $upgrade['current'] );
|
||||||
|
$upgrade['footer'] = $default;
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
$upgrade['footer'] = '<span class="text-danger">' . __( 'Unable to check your current version!') . '</span>';;
|
||||||
|
echo json_encode( $upgrade );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Retrieve remote server upgrade informations
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
try {
|
||||||
|
$args = array( 'http' => array( 'timeout' => 5 ) );
|
||||||
|
$args['http']['header'] = "User-Agent: " . $_SERVER[ 'HTTP_USER_AGENT' ] . "\r\n";
|
||||||
|
$args['http']['header'] .= "Referer: " . $_SERVER['HTTP_REFERER'] . "\r\n";
|
||||||
|
$ctx = stream_context_create( $args );
|
||||||
|
$JSr_version = json_decode( clean_json_version( @file_get_contents( PIMPMYLOG_VERSION_URL . '?v=' . $upgrade['current'] . '&w=' . $uuid . '&' . date("U") , false , $ctx ) ), true );
|
||||||
|
if ( is_null( $JSr_version ) ) {
|
||||||
|
throw new Exception( 'Unable to fetch remote version' , 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Update disabled
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| If admin does not want to check for update, quit now
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( false === CHECK_UPGRADE ) {
|
||||||
|
echo json_encode( $upgrade );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Manage messaging system
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| We can send a message to all pml users to give them important informations
|
||||||
|
| about security features, etc...
|
||||||
|
|
|
||||||
|
| PML get the local last message and will display new messages only available remotely
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$local_messages = @$JSl_version['messages'];
|
||||||
|
$remote_messages = @$JSr_version['messages'];
|
||||||
|
|
||||||
|
if ( ! is_array( $local_messages ) ) $local_messages = array();
|
||||||
|
|
||||||
|
if ( is_array( $remote_messages ) ) {
|
||||||
|
|
||||||
|
$local_messages_version = 0;
|
||||||
|
$remote_messages_version = 0;
|
||||||
|
foreach ( $local_messages as $local_messages_version => $m ) break;
|
||||||
|
foreach ( $remote_messages as $remote_messages_version => $m ) break;
|
||||||
|
|
||||||
|
// Uncomment this to show all remote messages
|
||||||
|
// and remote cookie if needed...
|
||||||
|
//$local_messages_version = 0;
|
||||||
|
|
||||||
|
$new_messages = array();
|
||||||
|
$max_messages = 3;
|
||||||
|
$upgrade['messagesto'] = $remote_messages_version;
|
||||||
|
$show_only_greater_then = (int)@$_COOKIE['messageshide'];
|
||||||
|
|
||||||
|
// New messages are available,
|
||||||
|
foreach ( $remote_messages as $version => $message ) {
|
||||||
|
if ( ( (int)$local_messages_version >= (int)$version ) || ( $max_messages === 0 ) ) break;
|
||||||
|
if ( (int)$version > $show_only_greater_then ) {
|
||||||
|
$new_messages[ $version ] = $message;
|
||||||
|
$max_messages--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( count( $new_messages ) > 0 ) {
|
||||||
|
$message = '<div id="messagesalert" class="alert alert-info alert-dismissable">';
|
||||||
|
$message .= '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>';
|
||||||
|
$message .= '<strong>' . __( 'Messages from the development team') . '</strong>';
|
||||||
|
foreach ( $new_messages as $date => $content ) {
|
||||||
|
$message .= '<hr style="margin-top:5px;margin-bottom:5px;"/>';
|
||||||
|
$message .= '<div class="row">';
|
||||||
|
$message .= '<div class="col-sm-2">';
|
||||||
|
$message .= '<strong>' . substr( $date , 0 , 4 ) . '-' . substr( $date , 4 , 2 ) . '-' . substr( $date , 6 , 2 ) . '</strong>';
|
||||||
|
$message .= '</div>';
|
||||||
|
$message .= '<div class="col-sm-10">';
|
||||||
|
$message .= $content;
|
||||||
|
$message .= '</div>';
|
||||||
|
$message .= '</div>';
|
||||||
|
}
|
||||||
|
$message .= '<div class="row">';
|
||||||
|
$message .= '<div class="col-xs-12 text-right">';
|
||||||
|
$message .= '<a href="#" id="messagesstop" data-version="' . $remote_messages_version . '" class="btn btn-default"><span class="glyphicon glyphicon-ok"></span> ' . __("Mark as read") . '</a>';
|
||||||
|
$message .= '</div>';
|
||||||
|
$message .= '</div>';
|
||||||
|
$message .= '</div>';
|
||||||
|
|
||||||
|
$upgrade['messages'] = $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Manage upgrade now
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
$upgrade['to'] = $JSr_version[ 'version' ];
|
||||||
|
|
||||||
|
if ( version_compare( $upgrade['current'] , $upgrade['to'] ) < 0 ) {
|
||||||
|
|
||||||
|
$notices = array();
|
||||||
|
$html = '<ul>';
|
||||||
|
|
||||||
|
if ( ! isset( $JSr_version[ 'changelog' ] ) ) {
|
||||||
|
$upgrade['footer'] = $default . ' - <a href="'. PIMPMYLOG_VERSION_URL . '" target="check"><span class="text-danger" title="' . sprintf( __( 'Error while fetching URL %s from the server hosting this Pimp my Log instance.' ) , PIMPMYLOG_VERSION_URL ) . '">' . __( 'Remote version broken!') . '</span></a>';
|
||||||
|
echo json_encode( $upgrade );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_array( $JSr_version[ 'changelog' ] ) ) {
|
||||||
|
$upgrade['footer'] = $default . ' - <a href="'. PIMPMYLOG_VERSION_URL . '" target="check"><span class="text-danger" title="' . sprintf( __( 'Error while fetching URL %s from the server hosting this Pimp my Log instance.' ) , PIMPMYLOG_VERSION_URL ) . '">' . __( 'Remote version broken!') . '</span></a>';
|
||||||
|
echo json_encode( $upgrade );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ( $JSr_version[ 'changelog' ] as $version => $version_details ) {
|
||||||
|
|
||||||
|
if ( version_compare( $upgrade['current'] , $version ) >= 0 ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! is_array( $version_details ) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isset( $version_details['notice'] ) ) {
|
||||||
|
$notices[ $version ] = $version_details['notice'];
|
||||||
|
}
|
||||||
|
|
||||||
|
$html .= '<li>';
|
||||||
|
$html .= ( isset( $version_details['released'] ) )
|
||||||
|
? sprintf( __( 'Version %s released on %s' ) , '<em>' . $version . '</em>' , '<em>' . $version_details['released'] . '</em>' )
|
||||||
|
: sprintf( __( 'Version %s' ) , '<em>' . $version . '</em>' ) ;
|
||||||
|
$html .= '<ul>';
|
||||||
|
|
||||||
|
foreach ( array( 'new' => 'New' , 'changed' => 'Changed' , 'fixed' => 'Fixed' ) as $type => $type_display ) {
|
||||||
|
|
||||||
|
if ( isset( $version_details[ $type ] ) ) {
|
||||||
|
|
||||||
|
if ( is_array( $version_details[ $type ] ) ) {
|
||||||
|
|
||||||
|
$html .= '<li>' . $type_display;
|
||||||
|
$html .= '<ul>';
|
||||||
|
|
||||||
|
foreach ( $version_details[ $type ] as $issue ) {
|
||||||
|
$html .= '<li>' . preg_replace( '/#([0-9]+)/i' , '<a href="' . PIMPMYLOG_ISSUE_LINK . '$1">#$1</a>' , $issue) . '</li>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$html .= '</ul>';
|
||||||
|
$html .= '</li>';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$html .= '</ul>';
|
||||||
|
$html .= '</li>';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$html .= '</ul>';
|
||||||
|
|
||||||
|
$severity = ( count( $notices ) > 0 ) ? 'danger' : 'info';
|
||||||
|
|
||||||
|
$upgrade['alert'] .= '<div id="upgradealert" class="alert alert-' . $severity . ' alert-dismissable">';
|
||||||
|
$upgrade['alert'] .= '<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>';
|
||||||
|
$upgrade['alert'] .= '<strong>' . __( 'An upgrade is available !') . '</strong> ';
|
||||||
|
$upgrade['alert'] .= sprintf( __( 'You have version %s and version %s is available' ) , '<em>' . $upgrade['current'] . '</em>' , '<em>' . $upgrade['to'] . '</em>');
|
||||||
|
$upgrade['alert'] .= ' (<a href="#" class="alert-link" data-toggle="collapse" data-target="#changelog">' . __( 'release notes') . '</a>)';
|
||||||
|
|
||||||
|
$upgrade['alert'] .= '<br/>';
|
||||||
|
|
||||||
|
// Installation has been done via composer
|
||||||
|
if ( upgrade_is_composer() ) {
|
||||||
|
$upgrade['alert'] .= __('Simply <code>composer update</code> in the installation directory');
|
||||||
|
$upgrade['alert'] .= '<br/>';
|
||||||
|
$upgrade['alert'] .= '<br/><pre id="composercontent">cd ' . escapeshellarg( realpath( PML_BASE . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR ) ) . '; composer update</pre>';
|
||||||
|
$upgrade['alert'] .= '<div id="changelog" class="panel-collapse collapse"><br/><div class="panel-body panel panel-default">' . $html . '</div></div>';
|
||||||
|
|
||||||
|
$upgrade['alert'] .= '<div class="row">';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-left">';
|
||||||
|
$upgrade['alert'] .= '<button id="composercopy" class="btn btn-xs btn-primary clipboard"><span class="glyphicon glyphicon-cloud-download"></span> ' . __("Copy to clipboard") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-right">';
|
||||||
|
$upgrade['alert'] .= '<button id="upgradestop" data-version="' . $upgrade['to'] . '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-ok"></span> ' . __("Skip this upgrade") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '<script>clipboard_enable("#composercopy","#composercontent" , "right" , "' . __('Command copied!') . '");</script>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auto Update is forbidden when AUTO_UPDATE is false or when auth is enabled but user is not an admin
|
||||||
|
else if ( ( AUTO_UPGRADE === false ) || ( ( Sentinel::isAuthSet() ) && ( ! Sentinel::isAdmin( Sentinel::getCurrentUsername() ) ) ) ) {
|
||||||
|
$upgrade['alert'] .= sprintf( __('Simply <code>git pull</code> in your directory or follow instructions %shere%s') , '<a href="' . UPGRADE_MANUALLY_URL . '" target="doc" class="alert-link">' , '</a>');
|
||||||
|
$upgrade['alert'] .= '<br/>';
|
||||||
|
$upgrade['alert'] .= '<br/><pre id="gitcontent">cd ' . PML_BASE . '; git pull</pre>';
|
||||||
|
$upgrade['alert'] .= '<div id="changelog" class="panel-collapse collapse"><br/><div class="panel-body panel panel-default">' . $html . '</div></div>';
|
||||||
|
$upgrade['alert'] .= '<div class="row">';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-left">';
|
||||||
|
$upgrade['alert'] .= '<button id="gitcopy" class="btn btn-xs btn-primary clipboard"><span class="glyphicon glyphicon-cloud-download"></span> ' . __("Copy to clipboard") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-right">';
|
||||||
|
$upgrade['alert'] .= '<button id="upgradestop" data-version="' . $upgrade['to'] . '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-ok"></span> ' . __("Skip this upgrade") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '<script>clipboard_enable("#gitcopy","#gitcontent" , "right" , "' . __('Command copied!') . '");</script>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// .git exists so an upgrade via git pull is perhaps possible
|
||||||
|
else if ( upgrade_is_git() ) {
|
||||||
|
|
||||||
|
$can_pull = upgrade_can_git_pull();
|
||||||
|
|
||||||
|
// .git exists and all tests have passed, so we can upgrade
|
||||||
|
if ( ! is_array( $can_pull ) ) {
|
||||||
|
$upgrade['alert'] .= '<div id="changelog" class="panel-collapse collapse"><br/><div class="panel-body panel panel-default">' . $html . '</div></div>';
|
||||||
|
$upgrade['alert'] .= '<br/>';
|
||||||
|
$upgrade['alert'] .= '<div class="row">';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-left">';
|
||||||
|
$upgrade['alert'] .= '<button id="upgradegitpull" data-loading-text="' . h( __('Upgrading...') ) . '" data-version="' . $upgrade['to'] . '" class="btn btn-xs btn-primary"><span class="glyphicon glyphicon-cloud-download"></span> ' . __("Upgrade now") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-right">';
|
||||||
|
$upgrade['alert'] .= '<button id="upgradestop" data-version="' . $upgrade['to'] . '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-ok"></span> ' . __("Skip this upgrade") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// .git exists but there is a problem
|
||||||
|
else {
|
||||||
|
|
||||||
|
$upgrade['alert'] .= sprintf( __('Your GIT installation cannot be upgraded automatically because of %sthese problems%s.') , '<a href="#" class="alert-link" data-toggle="collapse" data-target="#gitpb">' , '</a>' );
|
||||||
|
$upgrade['alert'] .= '<div id="gitpb" class="panel-collapse collapse"><br/><div class="panel-body panel panel-default">';
|
||||||
|
|
||||||
|
switch ( strval( $can_pull[0] ) ) {
|
||||||
|
|
||||||
|
case '2706':
|
||||||
|
|
||||||
|
$upgrade['alert'] .= __('These files are not writable by the web server user:');
|
||||||
|
$upgrade['alert'] .= '<ul>';
|
||||||
|
foreach ( $can_pull[1] as $file ) {
|
||||||
|
$upgrade['alert'] .= '<li><code>' . $file . '</code></li>';
|
||||||
|
}
|
||||||
|
$upgrade['alert'] .= '</ul>';
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '127':
|
||||||
|
|
||||||
|
$upgrade['alert'] .= __('The <code>git</code> command is not in the webserver path');
|
||||||
|
break;
|
||||||
|
|
||||||
|
case '0':
|
||||||
|
|
||||||
|
$upgrade['alert'] .= __('You have modified these files:');
|
||||||
|
$upgrade['alert'] .= '<ul>';
|
||||||
|
foreach ( $can_pull[1] as $file ) {
|
||||||
|
$upgrade['alert'] .= '<li><code>' . $file . '</code></li>';
|
||||||
|
}
|
||||||
|
$upgrade['alert'] .= '</ul>';
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
$upgrade['alert'] .= __('Unknown error, here is the problem output:');
|
||||||
|
$upgrade['alert'] .= '<ul>';
|
||||||
|
foreach ( $can_pull[1] as $file ) {
|
||||||
|
$upgrade['alert'] .= '<li><code>' . $file . '</code></li>';
|
||||||
|
}
|
||||||
|
$upgrade['alert'] .= '</ul>';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$upgrade['alert'] .= '</div></div>';
|
||||||
|
$upgrade['alert'] .= '<br/>';
|
||||||
|
$upgrade['alert'] .= __('Simply <code>git pull</code> in your installation directory.');
|
||||||
|
$upgrade['alert'] .= '<br/>';
|
||||||
|
$upgrade['alert'] .= '<br/><pre id="gitcontent">cd ' . PML_BASE . '; git pull</pre>';
|
||||||
|
$upgrade['alert'] .= '<div id="changelog" class="panel-collapse collapse"><br/><div class="panel-body panel panel-default">' . $html . '</div></div>';
|
||||||
|
$upgrade['alert'] .= '<div class="row">';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-left">';
|
||||||
|
$upgrade['alert'] .= '<button id="gitcopy" class="btn btn-xs btn-primary clipboard"><span class="glyphicon glyphicon-cloud-download"></span> ' . __("Copy to clipboard") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-6 text-right">';
|
||||||
|
$upgrade['alert'] .= '<button id="upgradestop" data-version="' . $upgrade['to'] . '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-ok"></span> ' . __("Skip this upgrade") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '<script>clipboard_enable("#gitcopy","#gitcontent" , "right" , "' . __('Command copied!') . '");</script>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Standalone version from a tarball file, cannot upgrade now
|
||||||
|
else {
|
||||||
|
$upgrade['alert'] .= sprintf( __('Follow instructions %shere%s') , '<a href="' . UPGRADE_MANUALLY_URL . '" target="doc" class="alert-link">' , '</a>' );
|
||||||
|
$upgrade['alert'] .= '<div id="changelog" class="panel-collapse collapse"><br/><div class="panel-body panel panel-default">' . $html . '</div></div>';
|
||||||
|
$upgrade['alert'] .= '<div class="row">';
|
||||||
|
$upgrade['alert'] .= '<div class="col-xs-12 text-right">';
|
||||||
|
$upgrade['alert'] .= '<button id="upgradestop" data-version="' . $upgrade['to'] . '" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-ok"></span> ' . __("Skip this upgrade") . '</button>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( count( $notices ) > 0 ) {
|
||||||
|
|
||||||
|
$upgrade['alert'] .= '<hr/>';
|
||||||
|
$upgrade['alert'] .= '<strong>' . __( 'You should upgrade right now:') . '</strong><ul>';
|
||||||
|
|
||||||
|
foreach ( $notices as $version => $notice ) {
|
||||||
|
$upgrade['alert'] .= '<li><em>' . $version . '</em> : ' . $notice . '</li>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$upgrade['alert'] .= '</ul>';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$upgrade['alert'] .= '</div>';
|
||||||
|
$upgrade['footer'] = '<span class="text-warning">' . sprintf ( __( 'Your version %s is out of date' ) , $upgrade['current'] ) . '</span>';
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
$upgrade['footer'] = sprintf ( __( 'Your version %s is up to date' ) , $upgrade['current'] );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
catch ( Exception $e ) {
|
||||||
|
$upgrade['footer'] = $default . ' - <a href="'. PIMPMYLOG_VERSION_URL . '" target="check"><span class="text-danger" title="' . sprintf( __( 'Unable to fetch URL %s from the server hosting this Pimp my Log instance.' ) , PIMPMYLOG_VERSION_URL ) . '">' . __( 'Unable to check remote version!') . '</span></a>';
|
||||||
|
echo json_encode( $upgrade );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode( $upgrade );
|
||||||
|
die();
|
||||||
|
|
||||||
|
?>
|
609
vendor/potsky/pimp-my-log/inc/users.pml.php
vendored
Normal file
@ -0,0 +1,609 @@
|
|||||||
|
<?php
|
||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/
|
||||||
|
?><?php
|
||||||
|
include_once 'global.inc.php';
|
||||||
|
list( $badges , $files ) = config_load();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Login
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
if ( ! Sentinel::isAuthSet() ) die();
|
||||||
|
$current_user = Sentinel::attempt( $files );
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Error handling
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
function myErrorHandler( $errno, $errstr, $errfile, $errline ) {
|
||||||
|
global $return;
|
||||||
|
if ( !( error_reporting() & $errno ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch ( $errno ) {
|
||||||
|
case E_USER_ERROR:
|
||||||
|
echo json_encode( array( 'error' => $errstr ) );
|
||||||
|
exit( 1 );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E_USER_WARNING:
|
||||||
|
$return['singlewarning'] = sprintf( __('<strong>PHP Warning</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E_USER_NOTICE:
|
||||||
|
$return['singlenotice'] = sprintf( __('<strong>PHP Notice</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
$return['singlewarning'] = sprintf( __('<strong>PHP Unknown error</strong> [%s] %s') , $errno , $errstr );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$old_error_handler = set_error_handler( "myErrorHandler" );
|
||||||
|
|
||||||
|
register_shutdown_function( 'shutdown' );
|
||||||
|
|
||||||
|
function shutdown() {
|
||||||
|
$error = error_get_last();
|
||||||
|
if ( $error['type'] === E_ERROR ) {
|
||||||
|
echo json_encode(
|
||||||
|
array(
|
||||||
|
'error' => sprintf( __('<strong>PHP Error</strong> line %s: %s') , $error['line'] , $error['message'] )
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Prepare
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
header('Content-type: application/json');
|
||||||
|
|
||||||
|
$return = array();
|
||||||
|
|
||||||
|
if ( ! csrf_verify() ) {
|
||||||
|
$return['error'] = __( 'Please refresh the page.' );
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Actions
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
switch ( @$_POST['action'] ) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Change password
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'change_password':
|
||||||
|
$password1 = $_POST['password1'];
|
||||||
|
$password2 = $_POST['password2'];
|
||||||
|
$password3 = $_POST['password3'];
|
||||||
|
$username = Sentinel::getCurrentUsername();
|
||||||
|
$errors = array();
|
||||||
|
$fields = array();
|
||||||
|
$doit = true;
|
||||||
|
|
||||||
|
if ( ! Sentinel::isValidPassword( $username , $password1 ) ) {
|
||||||
|
$errors[] = __( 'Current password is not valid' );
|
||||||
|
$fields[] = 'password1';
|
||||||
|
$doit = false;
|
||||||
|
}
|
||||||
|
if ( mb_strlen( $password2 ) < 6 ) {
|
||||||
|
$errors[] = __( 'Password must contain at least 6 chars' );
|
||||||
|
$fields[] = 'password2';
|
||||||
|
$doit = false;
|
||||||
|
}
|
||||||
|
if ( $password2 !== $password3 ) {
|
||||||
|
$errors[] = __( 'Password confirmation is not the same' );
|
||||||
|
$fields[] = 'password3';
|
||||||
|
$doit = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $doit === true ) {
|
||||||
|
if ( $_SERVER['SERVER_NAME'] === 'demo.pimpmylog.com' ) {
|
||||||
|
$return['ok'] = __( 'Password has been fakely changed on the demo!' );
|
||||||
|
} else {
|
||||||
|
$return['ok'] = __( 'Password has been successfully changed!' );
|
||||||
|
Sentinel::changePassword( $username , $password2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$return['errors'] = $errors;
|
||||||
|
$return['fields'] = $fields;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| List users
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'users_list':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$users = array();
|
||||||
|
|
||||||
|
foreach ( Sentinel::getUsers() as $username => $user ) {
|
||||||
|
unset( $user['pwd'] );
|
||||||
|
if (isset($user[ 'lastlogin' ]['ts'])) $user[ 'lastlogin' ]['ts'] = date( 'Y/m/d H:i:s' , (int)$user[ 'lastlogin' ]['ts'] );
|
||||||
|
if (isset($user[ 'api_lastlogin' ]['ts'])) $user[ 'api_lastlogin' ]['ts'] = date( 'Y/m/d H:i:s' , (int)$user[ 'api_lastlogin' ]['ts'] );
|
||||||
|
$user[ 'cd' ] = date( 'Y/m/d H:i:s' , (int)$user[ 'cd' ] );
|
||||||
|
$user[ 'u' ] = $username;
|
||||||
|
$users[] = $user;
|
||||||
|
}
|
||||||
|
$return['b'] = $users;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| View a single user
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'users_view':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$username = $_POST['u'];
|
||||||
|
$user = Sentinel::getUser( $username );
|
||||||
|
|
||||||
|
if ( is_null( $user ) ) {
|
||||||
|
$return['e'] = sprintf( __('User %s does not exist') , '<code>' . $username . '</code>' );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
unset( $user['pwd'] );
|
||||||
|
if (isset($user[ 'lastlogin' ]['ts'])) $user[ 'lastlogin' ]['ts'] = date( 'Y/m/d H:i:s' , (int)$user[ 'lastlogin' ]['ts'] );
|
||||||
|
if (isset($user[ 'api_lastlogin' ]['ts'])) $user[ 'api_lastlogin' ]['ts'] = date( 'Y/m/d H:i:s' , (int)$user[ 'api_lastlogin' ]['ts'] );
|
||||||
|
$user[ 'cd' ] = date( 'Y/m/d H:i:s' , (int)$user[ 'cd' ] );
|
||||||
|
$return['b'] = $user;
|
||||||
|
$return['b']['u'] = $username;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Edit a single user
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'users_edit':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$username = $_POST['u'];
|
||||||
|
$user = Sentinel::getUser( $_POST['u'] );
|
||||||
|
|
||||||
|
if ( is_null( $user ) ) {
|
||||||
|
$return['e'] = sprintf( __('User %s does not exist') , '<code>' . $username . '</code>' );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
unset( $user['pwd'] );
|
||||||
|
unset( $user['cb'] );
|
||||||
|
unset( $user['cd'] );
|
||||||
|
unset( $user['lastlogin'] );
|
||||||
|
unset( $user['logincount'] );
|
||||||
|
$user['pwd'] = '';
|
||||||
|
$user['pwd2'] = '';
|
||||||
|
$return['b'] = $user;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Save a user
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'users_add':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$username = trim($_POST['username']);
|
||||||
|
$password = $_POST['password'];
|
||||||
|
$password2 = $_POST['password2'];
|
||||||
|
$roles = $_POST['roles'];
|
||||||
|
$type = $_POST['add-type'];
|
||||||
|
|
||||||
|
unset( $_POST['csrf_token'] );
|
||||||
|
unset( $_POST['action'] );
|
||||||
|
unset( $_POST['username'] );
|
||||||
|
unset( $_POST['password'] );
|
||||||
|
unset( $_POST['password2'] );
|
||||||
|
unset( $_POST['roles'] );
|
||||||
|
unset( $_POST['add-type'] );
|
||||||
|
|
||||||
|
$logfiles = $_POST;
|
||||||
|
|
||||||
|
$errors = array();
|
||||||
|
|
||||||
|
if ( empty( $username ) ) {
|
||||||
|
$errors[ 'username' ] = __( 'Username is required' );
|
||||||
|
}
|
||||||
|
else if ( ( $type === 'add' ) && ( Sentinel::userExists( $username ) ) ) {
|
||||||
|
$errors[ 'username' ] = sprintf( __('User %s already exists') , '<code>' . $username . '</code>' );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ( ( $type === 'edit' ) && ( ! empty( $password ) ) ) || ( $type === 'add' ) ) {
|
||||||
|
if ( mb_strlen( $password ) < 6 ) {
|
||||||
|
$errors[ 'password' ] = __( 'Password must contain at least 6 chars' );
|
||||||
|
}
|
||||||
|
if ( $password !== $password2 ) {
|
||||||
|
$errors[ 'password2' ] = __( 'Password confirmation is not the same' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( count( $errors ) === 0 ) {
|
||||||
|
if ( empty( $password ) ) $password = null;
|
||||||
|
|
||||||
|
if ( $roles === 'admin' ) {
|
||||||
|
Sentinel::setAdmin( $username , $password );
|
||||||
|
if ( $type === 'add' ) Sentinel::log( 'addadmin ' . $username , $current_user );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$logs = array();
|
||||||
|
foreach( $logfiles as $fileid => $access ) {
|
||||||
|
if ( substr( $fileid , 0 , 2 ) === 'f-' ) {
|
||||||
|
if ( (int)$access === 1 ) {
|
||||||
|
$logs[ substr( $fileid , 2 ) ] = array( 'r' => true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( substr( $fileid , 0 , 2 ) === 't-' ) {
|
||||||
|
if ( (int)$access === 1 ) {
|
||||||
|
$tags[ substr( $fileid , 2 ) ] = array( 'r' => true );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Sentinel::setUser( $username , $password , array('user') , $logs );
|
||||||
|
if ( $type === 'add' ) Sentinel::log( 'adduser ' . $username , $current_user );
|
||||||
|
}
|
||||||
|
Sentinel::save();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$return['c'] = count( $errors );
|
||||||
|
$return['e'] = $errors;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Delete a single user
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'users_delete':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$username = $_POST['u'];
|
||||||
|
|
||||||
|
if ( $username === $current_user ) {
|
||||||
|
$return['error'] = __('Please do not shoot yourself in the foot!');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Sentinel::deleteUser( $username );
|
||||||
|
Sentinel::log( 'deleteuser ' . $username , $current_user );
|
||||||
|
Sentinel::save();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Sign in as a user
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'users_signinas':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$username = $_POST['u'];
|
||||||
|
|
||||||
|
if ( $username === $current_user ) {
|
||||||
|
$return['error'] = 'You are a recursive guy, right?!';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Sentinel::signInAs( $username );
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| List auth logs
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'authlog':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$logs = array();
|
||||||
|
foreach ( Sentinel::getLogs() as $log ) {
|
||||||
|
$log[ 2 ] = date( 'Y/m/d H:i:s' , (int)$log[ 2 ] );
|
||||||
|
$logs[] = $log;
|
||||||
|
}
|
||||||
|
$return['b'] = $logs;
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Anonymous list files
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'anonymous_list':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( Sentinel::isAnonymousEnabled( $files ) ) {
|
||||||
|
$r = '<div class="alert alert-info">' . __('<strong>Anonymous access is enabled</strong>. Genuine users have to click on the user menu to sign in and access more logs.') . '</div>';
|
||||||
|
} else {
|
||||||
|
$r = '<div class="alert alert-info">' . __('<strong>Anonymous access is disabled</strong>. All users have to sign in from the sign in screen.') . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$r .= '<div class="form-group">';
|
||||||
|
$r .= ' <label class="col-sm-4 control-label"></label>';
|
||||||
|
$r .= ' <div class="col-sm-8">';
|
||||||
|
$r .= __("Select which log files can be viewed without being logged.");
|
||||||
|
$r .= ' (<a href="#" class="logs-selector-toggler">'. __('Toggle all log files') . '</a>)';
|
||||||
|
$r .= ' </div>';
|
||||||
|
$r .= '</div>';
|
||||||
|
|
||||||
|
foreach( $files as $file_id => $file ) {
|
||||||
|
|
||||||
|
$fid = h( $file_id );
|
||||||
|
$display = $files[ $file_id ][ 'display' ];
|
||||||
|
$paths = $files[ $file_id ][ 'path' ];
|
||||||
|
$color = 'default';
|
||||||
|
|
||||||
|
if ( isset( $files[ $file_id ][ 'oid' ] ) ) {
|
||||||
|
if ( $files[ $file_id ][ 'oid' ] !== $file_id ) continue;
|
||||||
|
$display = $files[ $file_id ][ 'odisplay' ];
|
||||||
|
if ( isset( $files[ $file_id ][ 'count' ] ) ) {
|
||||||
|
$remain = (int)$files[ $file_id ][ 'count' ] - 1;
|
||||||
|
if ( $remain === 1 ) {
|
||||||
|
$paths .= ' ' . __( 'and an other file defined by glob pattern' );
|
||||||
|
}
|
||||||
|
else if ( $remain > 1 ) {
|
||||||
|
$paths .= ' ' . sprintf( __( 'and %s other possible files defined by glob pattern' ) , $remain );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$color = 'warning';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( Sentinel::isLogAnonymous( $file_id ) ) {
|
||||||
|
$e = 'active btn-success';
|
||||||
|
$d = 'btn-default';
|
||||||
|
$ec = ' checked="checked"';
|
||||||
|
$dc = '';
|
||||||
|
} else {
|
||||||
|
$e = 'btn-default';
|
||||||
|
$d = 'active btn-danger';
|
||||||
|
$ec = '';
|
||||||
|
$dc = ' checked="checked"';
|
||||||
|
}
|
||||||
|
|
||||||
|
$r .= '<div class="form-group" data-fileid="' . $fid . '">';
|
||||||
|
$r .= ' <label for="' . $fid . '" class="col-sm-4 control-label text-' . $color . '">' . $display . '</label>';
|
||||||
|
$r .= ' <div class="col-sm-8">';
|
||||||
|
$r .= ' <div class="btn-group" data-toggle="buttons">';
|
||||||
|
$r .= ' <label class="btn btn-xs logs-selector-yes ' . $e . '">';
|
||||||
|
$r .= ' <input type="radio" name="f-' . $fid . '" id="anonymous-f-' . $fid . '-true" value="1"' . $ec . '/> '.__('Yes');
|
||||||
|
$r .= ' </label>';
|
||||||
|
$r .= ' <label class="btn btn-xs logs-selector-no ' . $d . '">';
|
||||||
|
$r .= ' <input type="radio" name="f-' . $fid . '" id="anonymous-f-' . $fid . '-false" value="0"' . $dc . '/> '.__('No');
|
||||||
|
$r .= ' </label>';
|
||||||
|
$r .= ' </div>';
|
||||||
|
$r .= ' <span class="glyphicon glyphicon-question-sign text-muted" data-toggle="tooltip" data-placement="right" data-html="true" title="<div class=\'hyphen\'>' . h( $paths ) . '</div>"></span>';
|
||||||
|
$r .= ' </div>';
|
||||||
|
$r .= '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
$r .= '<script>$(function(){$(\'[data-toggle="tooltip"]\').tooltip()})</script>';
|
||||||
|
|
||||||
|
$return['b'] = $r;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Anonymous save
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'anonymous_save':
|
||||||
|
|
||||||
|
if ( ! Sentinel::isAdmin() ) {
|
||||||
|
$return['error'] = 'vaffanculo';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
unset( $_POST['csrf_token'] );
|
||||||
|
unset( $_POST['action'] );
|
||||||
|
|
||||||
|
$logfiles = $_POST;
|
||||||
|
|
||||||
|
foreach( $logfiles as $fileid => $access ) {
|
||||||
|
if ( substr( $fileid , 0 , 2 ) === 'f-' ) {
|
||||||
|
Sentinel::setLogAnonymous( substr( $fileid , 2 ) , ( (int)$access === 1 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Sentinel::save();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Profile get
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'profile_get':
|
||||||
|
$user = Sentinel::getUser( $current_user );
|
||||||
|
$accesstoken = $user['at'];
|
||||||
|
$hashpresalt = $user['hp'];
|
||||||
|
$r = '';
|
||||||
|
|
||||||
|
$r .= '<div class="form-group">';
|
||||||
|
$r .= '<label for="" class="col-sm-3 control-label">' . __('Access token') . '</label>';
|
||||||
|
$r .= '<div class="col-sm-5">';
|
||||||
|
$r .= '<div class="input-group">';
|
||||||
|
$r .= '<span class="input-group-addon"><span class="glyphicon glyphicon-certificate"></span></span>';
|
||||||
|
$r .= '<input type="text" id="prat" class="form-control" value="' . h( $accesstoken ) . '" disabled="disabled"/>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '<div class="col-sm-4">';
|
||||||
|
$r .= '<a class="btn btn-xs btn-primary clipboardat">' . __('Copy to clipboard') . '</a>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '<script>clipboard_enable( "a.clipboardat", "#prat" , "top" , "' . h( __('Access token copied!') ) . '" );</script>';
|
||||||
|
|
||||||
|
$r .= '<div class="form-group">';
|
||||||
|
$r .= '<label for="" class="col-sm-3 control-label">' . __('Presalt key') . '</label>';
|
||||||
|
$r .= '<div class="col-sm-5">';
|
||||||
|
$r .= '<div class="input-group">';
|
||||||
|
$r .= '<span class="input-group-addon"><span class="glyphicon glyphicon-flash"></span></span>';
|
||||||
|
$r .= '<input type="text" id="prhp" class="form-control" value="' . h( $hashpresalt ) . '" disabled="disabled"/>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '<div class="col-sm-4">';
|
||||||
|
$r .= '<a class="btn btn-xs btn-primary clipboardhp">' . __('Copy to clipboard') . '</a>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '<script>clipboard_enable( "a.clipboardhp" , "#prhp" , "top" , "' . h( __('Presalt key copied!') ) . '" );</script>';
|
||||||
|
|
||||||
|
$r .= '<div class="form-group">';
|
||||||
|
$r .= '<label for="" class="col-sm-3 control-label"></label>';
|
||||||
|
$r .= '<div class="col-sm-9">';
|
||||||
|
$r .= '<input type="checkbox" name="regenerate" value="1"/> ' . __('Check to generate both new Access token and new Presalt key');
|
||||||
|
$r .= '</div>';
|
||||||
|
$r .= '</div>';
|
||||||
|
|
||||||
|
$r .= '<hr/>';
|
||||||
|
|
||||||
|
if ( ( ! isset( $user['api_logincount'] ) ) || ( (int)$user['api_logincount'] === 0 ) ) {
|
||||||
|
$r .= __('Your credentials have not been used');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$r .= '<p>';
|
||||||
|
if ( (int)$user['api_logincount'] === 1 ) {
|
||||||
|
$r .= __('API has been called 1 time');
|
||||||
|
} else {
|
||||||
|
$r .= sprintf( __('API has been called %s times') , (int)$user['api_logincount'] );
|
||||||
|
}
|
||||||
|
$r .= '</p>';
|
||||||
|
|
||||||
|
$r .= sprintf( __('Last API call has been done at %s by IP address %s with user agent %s on URL %s')
|
||||||
|
, '<code>' . date( 'Y/m/d H:i:s' , (int)$user[ 'api_lastlogin' ]['ts'] ) . '</code>'
|
||||||
|
, '<code>' . $user[ 'api_lastlogin' ]['ip'] . '</code>'
|
||||||
|
, '<code>' . $user[ 'api_lastlogin' ]['ua'] . '</code>'
|
||||||
|
, '<a href="' . h( $user[ 'api_lastlogin' ]['ur'] ) . '" class="hyphen" target="_blank">' . $user[ 'api_lastlogin' ]['ur'] . '</a>'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$return['b'] = $r;
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Profile save
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
case 'profile_save':
|
||||||
|
|
||||||
|
if ( @$_POST['regenerate'] === '1' ) {
|
||||||
|
Sentinel::setUser( $current_user , null , null , null , true );
|
||||||
|
Sentinel::save();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Unknown action...
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
error_log( 'Unknown action ' . @$_POST['action'] );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| End tuning
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
echo json_encode( $return );
|
||||||
|
die();
|
||||||
|
|
||||||
|
?>
|
326
vendor/potsky/pimp-my-log/index.php
vendored
Normal file
BIN
vendor/potsky/pimp-my-log/js/ZeroClipboard.swf
vendored
Normal file
8
vendor/potsky/pimp-my-log/js/configure.min.js
vendored
Normal file
8
vendor/potsky/pimp-my-log/js/login.min.js
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/$(function(){"use strict";$(".logo").click(function(){document.location.href="?"})});
|
9
vendor/potsky/pimp-my-log/js/main.min.js
vendored
Normal file
15
vendor/potsky/pimp-my-log/js/pml.min.js
vendored
Normal file
8
vendor/potsky/pimp-my-log/js/test.min.js
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/*! pimpmylog - 1.7.9 - 10b502eaf17be208850be61febb044c2fdb86207*/
|
||||||
|
/*
|
||||||
|
* pimpmylog
|
||||||
|
* http://pimpmylog.com
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 Potsky, contributors
|
||||||
|
* Licensed under the GPLv3 license.
|
||||||
|
*/$(function(){"use strict";$(document).keypress(function(a){(114==a.which||18==a.which)&&a.ctrlKey&&"#retestertab"===document.location.hash&&$("#regextest").submit()}),$(".logo").click(function(){document.location.href=".."}),$("table").addClass("table table-striped table-bordered table-hover table-condensed"),$("#regextest").submit(function(a){$("#regexTestertestBtn").button("loading"),$.ajax({url:"test.php",type:"POST",data:{r:$("#inputRegEx").val(),l:$("#inputLog").val(),m:$("#inputMatch").val(),t:$("#inputTypes").val(),u:$("#inputMultiline").val(),action:"regextest"},dataType:"json"}).fail(function(a,b,c){$("#regexTestertestBtn").button("reset"),$("#regexresult").html(c.message)}).done(function(a){$("#regexTestertestBtn").button("reset"),$("#regexresult").html(a.msg),$(".form-group").removeClass("has-error"),a.err&&($("#GP"+a.err).addClass("has-error"),$("#"+a.err).focus())}),a.preventDefault()}),$(document).ready(function(){$(".clipboard").on("mouseover",function(){var a=$(this);$(this).off("mouseover"),$(this).zclip($(this).data("source")?{path:"../js/ZeroClipboard.swf",copy:function(){return $($(this).data("source")).text()},afterCopy:function(){$(a).popover({html:!0,animation:!0,placement:$(this).data("placement"),delay:{show:100,hide:5e3},content:$(this).data("text")}).popover("show"),$(a).on("hidden.bs.popover",function(){$(a).show()})}}:{path:"../js/ZeroClipboard.swf",copy:function(){var a="{\n";return a+=' "SOFTWARE_ID": {\n',a+=' "display" : "SOFTWARE NAME",\n',a+=' "path" : "SOFTWARE PATH",\n',a+=' "format" : {\n',a+=' "multiline": '+JSON.stringify($("#inputMultiline").val())+",\n",a+=' "regex" : '+JSON.stringify($("#inputRegEx").val())+",\n",a+=' "match" : '+$("#inputMatch").val()+",\n",a+=' "types" : '+$("#inputTypes").val()+"\n",a+=" }\n",a+=" }\n",a+="}\n"},afterCopy:function(){$(a).popover({html:!0,animation:!0,placement:"right",delay:{show:100,hide:5e3},content:lemma.configuration_copied}).popover("show"),$(a).on("hidden.bs.popover",function(){$(a).show()})}})}),$("#authsave").submit(function(a){var b=$("#username").val(),c=$("#password").val(),d=$("#password2").val(),e=!0;return $("#usernamegroup").removeClass("has-error").removeClass("has-success").tooltip("hide"),$("#passwordgroup").removeClass("has-error").removeClass("has-success").tooltip("hide"),$("#password2group").removeClass("has-error").removeClass("has-success").tooltip("hide"),0===b.length&&($("#usernamegroup").addClass("has-error").tooltip("show"),e=!1),c.length<6&&($("#passwordgroup").addClass("has-error").tooltip("show"),e=!1),d!==c&&($("#password2group").addClass("has-error").tooltip("show"),e=!1),e!==!0?(a.preventDefault(),!1):void 0}),$(function(){if(location.hash){var a=$("[href="+location.hash+"]");a&&a.tab("show")}}),$(".nav-tabs a").click(function(){$(this).tab("show");var a=$("body").scrollTop();window.location.hash=this.hash,$("html,body").scrollTop(a)})})});
|