28 Commits
Author SHA1 Message Date
Neo 25ddeb65d6 Version 4.7.23 2025-12-19 16:21:27 -08:00
Neo 7124a02564 Version 4.7.13 2025-12-19 16:14:56 -08:00
Neo fd22d99e69 Version 4.7.8 2025-12-19 16:10:42 -08:00
Neo 7b7404e741 Version 4.7.6 2025-12-19 16:05:19 -08:00
Neo 8ba7d43898 Version 4.7.0 2025-12-19 16:00:35 -08:00
Neo 517a5e1f70 Version 4.6.0 2025-12-19 05:55:31 -08:00
Neo f79dcf067a Version 4.5.0 2025-12-19 05:51:58 -08:00
Neo 1a0c7fd3c2 Version 4.3.6 2025-12-19 05:49:12 -08:00
Neo fe1acf984a Version 4.3.0 2025-12-19 05:47:12 -08:00
Neo 96997ddd8e Version 4.2.0 2025-12-19 05:44:59 -08:00
Neo 0dc2aee5ed Version 4.1.19.4 2025-12-19 05:42:01 -08:00
Neo 2bd5025018 Version 4.1.19 2025-12-19 05:38:56 -08:00
Neo 28bd025b35 Version 4.1.2 2025-12-19 05:32:19 -08:00
Neo 3ba79295ee Version 4.0.13.1 (nulled) 2025-12-19 05:28:09 -08:00
Neo c6a86f0d9b Version 4.0.13.1 2025-12-19 04:57:54 -08:00
Neo f9e857d255 Version 3.4.9 2025-12-19 00:44:43 -08:00
Neo c603205a25 Version 3.4.8 2025-12-19 00:42:42 -08:00
Neo b45ea0dffb Version 3.4.6 2025-12-19 00:40:53 -08:00
Neo e4478369d8 Version 3.4.5 2025-12-19 00:38:12 -08:00
Neo fb6b5baabc Version 3.3.4 2025-12-19 00:35:52 -08:00
Neo 78706903a2 Version 3.2.3 2025-12-19 00:34:03 -08:00
Neo ae5c01cc78 Version 3.1.4 2025-12-19 00:32:22 -08:00
Neo 1d4720f3e2 Version 3.0.5 2025-12-19 00:31:03 -08:00
Neo 19b38c7c74 Version 2.3.6 2025-12-19 00:26:08 -08:00
Neo a3bb603c96 Version 2.2.2 2025-12-19 00:24:35 -08:00
Neo 22f1b963ee Version 2.2.0 RC-1 2025-12-19 00:22:37 -08:00
Neo f73f8bff6d Version 2.1.7 2025-12-19 00:21:15 -08:00
Neo 0eecc172d9 Version 2.0.0 2025-12-19 00:19:56 -08:00
10479 changed files with 1311423 additions and 100297 deletions

No files matched your search

+14
View File
@@ -0,0 +1,14 @@
<?php
header("HTTP/1.0 404 Not Found");
print <<<EOF
<html>
<title>404 Not Found</title>
<body>
The file you were looking for could not be found
</body>
</html>
EOF;
exit;
+393
View File
@@ -0,0 +1,393 @@
Invision Community
(c) Invision Power Services, Inc.
Invision Power Services, Inc. is grateful to the following projects, whose work
has been used throughout Invision Community to add style, flair and functionality
to our product.
NULLING
Last Updated: 23 September 2025
Author: https://ipbmafia.ru
AES implementation in PHP
Description: Used by \IPS\Text\Encrypt to provide two-way text encryption for storing certain data.
Location: system/3rd_party/AES
Included version: Last Updated: 22 July 2014
Website: http://www.movable-type.co.uk/scripts/aes-php.html
License: http://creativecommons.org/licenses/by/3.0/
BaconQrCode
Description: Used to generate QR Codes for Authenticator MFA.
Location: system/3rd_party/BaconQrCode
Included version: 2.0.7
Website: https://github.com/Bacon/BaconQrCode
License: https://github.com/Bacon/BaconQrCode/blob/2.0.8/LICENSE - BSD 2-Clause
Brick/math
Description: Arbitrary-precision arithmetic library
Location: system/3rd_party/Brick
Included version: 0.9.2
Website: https://github.com/brick/math
License: http://opensource.org/licenses/MIT
Browser Icons
Description: Browser logo icons for UI
Location: applications/core/interface/logos/browsers
Website: https://github.com/alrra/browser-logos
License: https://github.com/alrra/browser-logos/blob/main/LICENSE.txt
Clipboard
Description: Cross browser copy to clipboard functionality
Location: applications/core/interface/clipboard
Included version: 2.0.6
Website: clipboardjs.com
License: https://zenorocha.mit-license.org
CKEditor
Description: Provides the editor functionality for submitting content.
Location: In development: applications/core/dev/ckeditor (built into applications/core/interface/ckeditor)
Included version: 4.21.0
Website: http://ckeditor.com
License: https://www.mozilla.org/en-US/MPL/1.1/
Codemirror (with C-like, CSS, HTMLMixed, JavaScript, PHP, SQL and XML modes and merge, search, and searchcursor addons)
Description: Provides code editor for adding code to content, editing templates in the AdminCP, etc.
Location: In development: applications/core/dev/codemirror
Included version: 5.49.2
Website: http://codemirror.net
License: http://codemirror.net/LICENSE
Cropper
Description: Provides cropping functionality for profile photos
Location: applications/core/interface/cropper
Included version: 1.5.9
Website: https://github.com/fengyuanchen/cropperjs
License: http://opensource.org/licenses/MIT
Devices Icon Pack
Description: Icon pack for representing different devices
Location: In development: applications/core/dev/resources/front/devices
Website: https://www.iconfinder.com/iconsets/devices-42
License: Free for commercial use
dotdotdot
Description: Javascript library for truncating long strings
Location: library/jquery/jquery.dotdotdot.min.js
Included version: 1.8.3
Website: https://dotdotdot.frebsite.nl/
License: Commercial license
Enum
Description: Dependency for BaconQrCode
Location: system/3rd_party/DASPRiD
Included version: 1.0.5
Website: https://github.com/DASPRiD/Enum
License: https://github.com/DASPRiD/Enum/blob/1.0.5/LICENSE - BSD 2-Clause
FontAwesome
Description: General icons for UI
Location: Font files in applications/core/interface/font and CSS in development in applications/core/dev/css/global/framework/fonts.css (mixed with other CSS and modified to use correct path to font files)
Included version: 4.7.0
Website: http://fortawesome.github.com/Font-Awesome
License: http://fortawesome.github.com/Font-Awesome/#license
Google Charts
Description: Generates charts for statistics in the AdminCP
Location: Loaded from CDN https://www.gstatic.com/charts/loader.js
Website: https://developers.google.com/chart/
google-code-prettify
Description: Provides syntax highlighting for code posted in content, etc.
Location: In development: dev/js/library/prettify and applications/core/dev/css/global/framework/prettify.css
Included version: 4 March 2013
Website: http://code.google.com/p/google-code-prettify/
License: http://www.apache.org/licenses/LICENSE-2.0
google-diff-mode-patch
Description: Provides diff comparisons for CodeMirror
Location: applications/core/interface/codemirror/diff_match_patch.js
Included version: 19 November 2012
Website: https://code.google.com/p/google-diff-match-patch/
License: http://www.apache.org/licenses/LICENSE-2.0
graphql-php
Description: PHP implementation of the GraphQL standard
Location: system/3rd_party/graphql-php
Included version: 14.11.6
Website: https://webonyx.github.io/graphql-php/
License: http://opensource.org/licenses/MIT
history.js
Description: HTML5 history API, used extensively in controllers
Location: /dev/js/library/jquery/jquery.history.js
Included version: 1.8b2
Website: https://github.com/browserstate/history.js
License: https://github.com/browserstate/history.js#license
Howler
Description: HTML5 audio api
Location: applications/core/interface/howler
Included version: 2.1.2
Website: https://github.com/goldfire/howler.js
License: http://opensource.org/licenses/MIT
HTMLPurifier
Description: Validates and cleans submitted HTML for content
Location: system/3rd_party/HTMLPurifier
Included version: 4.18.0
Website: http://htmlpurifier.org
License: http://www.gnu.org/copyleft/lesser.html
IcoMoon
Description: General icons for UI
Location: Font files in applications/core/interface/font and CSS in development in applications/core/dev/css/global/framework/fonts.css (mixed with other CSS and modified to use correct path to font files)
Website: https://icomoon.io/
License: http://creativecommons.org/licenses/by/4.0/
jQuery
Description: JavaScript Library
Location: In development: dev/js/library/jquery/jquery.js
Included version: 3.7.0
Website: http://jquery.com
License: http://jquery.org/license
jQuery dotdotdot
Description: On-the-fly truncating of text in elements
Location: dev/js/library/jquery/jquery.dotdotdot.min.js
Included version: 1.8.3
Website: http://dotdotdot.frebsite.nl
License: http://opensource.org/licenses/MIT
jquery.hoverintent.js
Description: Hover library for jQuery used for main navigation
Location: dev/js/library/jquery/jquery.hoverintent.js
Included version: 1.8.1
Website: http://cherne.net/brian/resources/jquery.hoverIntent.html
License: http://opensource.org/licenses/MIT
jQuery imagesLoaded plugin
Description: Plugin that can defer script execution until specified images have loaded
Location: dev/js/library/jquery/jquery.imagesloaded.js
Included version: 4.4.1
Website: http://desandro.github.io/imagesloaded/
License: http://opensource.org/licenses/MIT
jQuery.menuaim.js
Description: Library that provides intelligent activation of menu items based on mouse movement
Location: applications/core/interface/jquery/jquery.menuaim.js
Included version: 1.1
Website: https://github.com/kamens/jQuery-menu-aim
License: http://opensource.org/licenses/MIT
jQuery Migrate
Description: Migration tool for jQuery
Location: In development: dev/js/library/jquery/jquery-migrate.js
Included version: 3.4.1
Website: https://github.com/jquery/jquery-migrate/
License: https://github.com/jquery/jquery-migrate/blob/master/LICENSE.txt
jQuery.nestedSortable.js
Description: Extends jqueryui's sortable with nested support
Location: applications/core/interface/jquery/jquery.nestedSortable.js
Included version: 2.1a
Website: https://github.com/ilikenwf/nestedSortable
License: http://opensource.org/licenses/MIT
jQuery.rangyinputs.js
Description: Simple selection/caret manipulation in textboxes
Location: applications/core/interface/jquery/jquery.rangyinputs.js
Included version: 1.2.0
Website: https://github.com/timdown/rangyinputs
License: http://opensource.org/licenses/MIT
jQuery.transform.js
Description: adds support for CSS transforms to jQuery's animate(), used in ips.ui.dialog.js
Location: dev/js/library/jquery/jquery.transform.js
Included version: 1.0
Website: https://github.com/louisremi/jquery.transform.js
License: http://opensource.org/licenses/MIT
jQuery UI
Description: Javascript library for drag+drop, resizing, date polyfill
Location: applications/core/interface/jquery/jquery-ui.js
Included version: 1.13.2
Website: http://jqueryui.com
License: http://jquery.org/license
jQuery UI TouchPunch
Description: Library that adds touch support to jquery ui
Location: /applications/core/interface/jquery/jquery-touchpunch.js
Included version: 0.2.3
Website: http://touchpunch.furf.com/
License: http://opensource.org/licenses/MIT
JS-minify
Description: Provides JavaScript minification
Location: system/3rd_party/JsMinify
Included version: 1.0.0
Website: https://github.com/garfix/js-minify
License: https://github.com/garfix/js-minify/blob/main/LICENSE
JwtFramework
Description: Provides JWT signing & encryption support
Location: system/3rd_party/JwtFramework
Included version: 2.2.8
Website: https://github.com/web-token/jwt-framework
License: http://www.opensource.org/licenses/mit-license.php
linkify
Description: Provides link detection
Location: dev/js/library/linkify
Included version: 2.1.0
Website: http://soapbox.github.io/linkifyjs/
License: http://www.opensource.org/licenses/mit-license.php
Mustache.js
Description: JS templating engine
Location: dev/js/library/mustache/
Included version: 4.2.0
Website: http://github.com/janl/mustache.js
License: http://opensource.org/licenses/MIT
Normalize.css
Description: Sets base CSS styles for consistency across browsers
Location: applications/core/dev/css/global/framework/normalize.css
Included version: 6.0.0
Website: http://necolas.github.io/normalize.css/
License: http://opensource.org/licenses/MIT
Parsedown
Description: Converts Markdown to HTML
Location: applications/convert/sources/Tools/Vanilla/Parsedown
Included version: 1.7.4
Website: https://parsedown.org/
License: https://github.com/erusev/parsedown/blob/master/LICENSE.txt
parseUri
Description: Used to parse URLs in JS
Location: dev/js/framework/common/utils/ips.utils.url.js
Included version: 1.2.2
Website: http://blog.stevenlevithan.com/archives/parseuri
License: http://opensource.org/licenses/MIT
Payment Method Icons
Description: Credit card logo icons for UI
Location: applications/nexus/dev/resources/front/cards
Website: http://www.dreamstale.com/free-download-payment-method-vector-icons/
License: http://creativecommons.org/licenses/by/3.0/
PclZip
Description: Used by \IPS\Archive\Zip to provide zip handling features if the PHP Zip extension is not available
Location: system/3rd_party/pclzip
Included version: 2.8.2
Website: http://www.phpconcept.net/pclzip/
License: http://www.gnu.org/copyleft/lesser.html
phpass
Description: Password strength calculator
Location: system/3rd_party/phpass
Included version: Aug 2012
Website: https://github.com/rchouinard/phpass
License: http://mit-license.org
PHP Diff Implementation
Description: Computes difference between two strings, used to display differences between content revisions, themes, etc.
Location: system/3rd_party/Diff
Included version: 11 Feb 2013
Website: http://code.stephenmorley.org/php/diff-implementation/
License: http://creativecommons.org/publicdomain/zero/1.0/legalcode
php-punycode
Description: A library for Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)
Location: system/3rd_party/php-punycode
Included version: 2.1.1
Website: https://github.com/true/php-punycode
License: https://github.com/true/php-punycode/blob/master/LICENSE
phpQuery
Description: Handles template hooks
Location: system/3rd_party/phpQuery
Included Version: 0.9.5
Website: https://code.google.com/p/phpquery
License: http://opensource.org/licenses/mit-license.php
PHP User Agent Parser
Description: Parses user agent strings
Location: system/3rd_party/PhpUserAgent
Included Version: 1.9.0
Website: https://github.com/donatj/PhpUserAgent
License: http://opensource.org/licenses/mit-license.php
Plupload
Description: Facilitates uploading files
Location: applications/core/interface/plupload
Included version: 2.3.9
Website: http://www.plupload.com
License: http://www.plupload.com/license/plupload_commercial_oem.txt
Preloaders.net
Description: Animated gif preload imags
Website: http://preloaders.net/
License: http://preloaders.net/en/terms_of_use
Spectrum
Description: Color selector polyfill
Location: applications/core/interface/spectrum
Included version: 2.0.8
Website: https://seballot.github.io/spectrum/
License: https://github.com/seballot/spectrum/blob/master/LICENSE
success.mp3 Notification Sound by RCP Tones
Description: "Success" sound used in ips.ui.uploader.js
Location: /applications/core/interface/sounds/success.mp3
Website: http://rcptones.com/dev_tones/
License: http://creativecommons.org/licenses/by/3.0/us/
Twemoji
Description: Emoji images
Location: Served from CDN
Included version: 14.0.2
Website: http://twitter.github.io/twemoji/
License: https://github.com/twitter/twemoji/blob/gh-pages/LICENSE
Underscore.js
Description: General-purpose functional JS library
Location: dev/js/library/underscore/
Included version: 1.13.1
Website: http://underscorejs.org
License: https://github.com/documentcloud/underscore/blob/master/LICENSE
Web Push Library for PHP
Description: Provides support and utility functions for Web Push
Location: system/3rd_party/Minishlink
Included version: 6.0.3
Website: https://github.com/web-push-libs/web-push-php
License: http://opensource.org/licenses/mit-license.php
Whoops
Description: Provides error handling for development mode
Location: dev/Whoops
Included Version: 2.16.0
Website: http://filp.github.io/whoops/
License: https://github.com/filp/whoops/blob/master/LICENSE.md
world-flags-sprite
Description: Flag icons for UI
Location: In development: Image files at applications/core/dev/resources/global, facilitated by custom CSS at applications/core/dev/css/global/flags.css
Included version: Last Updated Oct 2015
Website: https://github.com/lafeber/world-flags-sprite/
License: https://github.com/lafeber/world-flags-sprite/blob/master/LICENSE
XRegExp (with addons)
Description: Advanced Regular Expression JS library, used in autolink editor plugin and search result highlighting
Location: In development: dev/js/library/xregexp/xregexp-all.js
Included Version: 3.2.0
Website: http://xregexp.com
License: http://mit-license.org
Hammer.js
Description: Provides touch and gesture javascript event support
Location: dev/js/library/hammer
Included Version: 2.0.8
Website: http://hammerjs.github.io
License: http://mit-license.org
Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 652 B

@@ -1,319 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Invision Install Guide: Help & FAQ</title>
<style>
BODY, TABLE { font-family: verdana, arial; font-size:12px; line-height:150% }
.title { background-image: url(tile_back.gif); font-family:arial; font-size:18px; color:white; font-weight:bold; height:40px }
.table1 { border:1px solid #999999 }
.table2 { border:1px dotted #999999 }
.menustrip { font-color:black; background-color:#EEEEEE; font-size:12px; height:24px }
a:link, a:visited, a:active { color:#000055 }
a:hover { color:#333377;text-decoration:underline }
.header { border-bottom:1px dashed #999999; font-family:Verdana, Arial; font-weight:bold; color:#4C77B6; font-size:20px; background-color:#FEFEFE; letter-spacing:-1px }
</style>
</head>
<body bgcolor="#FFFFFF" topmargin='5' leftmargin='0'>
<!-- Start content -->
<a name='top'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td align='center'>
<b>Sections:</b> <a href='help.html#install' target='bottom'>Installation Problems</a> | <a href='help.html#admin' target='bottom'>Admin CP Problems</a> | <a href='help.html#main' target='bottom'>Board Problems</a> | <a href='help.html#help' target='bottom'>Getting Further Help</a>
</td></tr>
</table>
<br>
<a name='install'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Installation Problems</td>
</tr>
<tr>
<td align='left'>
<b>When I run the installer, I get a page of code.</b>
<br>
If when accessing the installer via your web browser you receive a page of code and not the installation start screen, this means that either PHP has
not been installed or has not been configured properly. Please consult with your web host to see if this is the case.
<br><br>
<b>I get an error like this 'access denied for user@localhost using password YES' when I submit the main form.</b>
<br>
If you receive this error from mySQL it means that either the mySQL database name, mySQL username, mySQL password or mySQL host information is wrong. Please double check the information you
entered making sure that passwords are typed correctly. In some cases, this information is case sensitive. If this error persists, please consult with your web host to check that the information
you have is correct.
<br><br>
<b>After installing, I get this error 'Warning: fopen("/.install.lock", "w") - Permission denied ...'</b>
<br>
After installing, Invision Power Board attempts to create a "lock" file which disables the installation script. If you receive this error, the installer
has not been able to create this file. After you have logged into the Admin Center for the first time, you should remove the "sm_install.php" script
from your server and only re-upload it if you wish to make a fresh install. You can then safely ignore this warning.
<br><br>
<b>When installing I get an error like this: 'WARNING! Could not locate 'conf_global.php'</b>
<br>
This error means that the installer could not "guess" the location of the file 'conf_global.php'. Make sure you have uploaded this file into the same directory that you
uploaded 'sm_install.php' into. If you have this file already uploaded and the CHMOD value has been set, then you can tell the installer where to look for this file by simply
opening 'sm_install.php' in your favourite text editor. Look near the top for "$root = "./";". Edit this to reflect your "real" path. Note, this is a path - not a URL, entering "http://www.domain.com" or similar will
result in an error. A path is literally the file path from the server root to the current directory (such as '/home/site/public_html/forums/'). More information is provided in the script near the top. When you have completed
the edit, simply save the file and re-upload to your server and re-run through your web browser.
</td></tr>
</table>
<br>
<a name='admin'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Admin CP Problems</td>
</tr>
<tr>
<td align='left'>
<b>No matter what I do, I can't stay logged into the Admin CP.</b>
<br>
For extra security, the Admin CP checks your IP address as part of the admin session validation. In some cases your IP address will change with each page request (especially if you are using a dial up ISP). You can
stop the Admin CP checking your IP address which will solve the problem.
<br>To do this, open up "admin.php" in your text editor. Near the top of the script change <span style='color:red'>$check_ip = 1;</span> to <span style='color:red'>$check_ip = 0;</span>. Save the file and re-upload to your
server.
<br>Although there is no immediate security risk to doing this, you should not disclose your admin session ID to anyone or post the link you are using for that admin CP session to anyone.
<br><br>
<b>When I try to access the Admin CP, the page is completely blank</b>
<br>
This problem could be the result of a few things.<br>
Firstly, open up "admin.php" in a text editor and near the top change: <span style='color:red'>$use_gzip = 1;</span> to <span style='color:red'>$use_gzip = 0;</span>. Save the file and re-upload to your
server.
<br>
If that doesn't solve the problem, check the CHMOD values on the directories you created during the installation process. If in doubt, CHMOD them to 0777 and any directories contained within.
</td></tr>
</table>
<br>
<a name='main'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>General Board Problems</td>
</tr>
<tr>
<td align='left'>
<b>Every time I try to access a page on the forums it loads a blank page.</b>
<br>
Can you log into the Admin CP? If you do not know the url, enter the following into your web browser address bar <b>http://www.your-domain-here.com/forums/admin.php</b> (obviously using the correct URL to your board!).
<br>If the Admin CP loads first time, try the following:
<br>Click on "Board Settings" to expand the sub-menu. Click on "Basic Config". When the page has loaded, turn off the following: <b>Print HTTP headers?</b> and <b>DISABLE GZIP encoding?</b>. When complete, submit the form
and try to access your board again.
<br>
If it still loads a blank page, check the CHMOD values on the directories you created during the installation including any directories contained within. If in doubt, CHMOD to 0777.
<br><br>
<b>I am on a Windows server and I get an Internal Server Error when trying to access my board</b>
<br>
There is an option to disable the headers that Invision Power Board prints by default.
<br>Log into your Admin Control Panel, click on "Board Settings" to expand the sub-menu. Click on "Basic Config". When the page has loaded, turn off <b>Print HTTP headers?</b> and submit the form
and try to access your board again.
<br><br>
<b>I am on a Windows server and when I make a post I am taken to a blank page</b>
<br>
Some Windows based servers require a different HTTP protocol when redirecting HTTP requests, there is an option in the Admin Control Panel to overcome this.
<br>
Log into your Admin Control Panel, click on "Board Settings" to expand the sub-menu. Click on "Basic Config". Choose "Refresh (Windows Savvy) from the "Type of auto-redirect?" option. Submit the form.
</td></tr>
</table>
<br>
<a name='help'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Getting further help</td>
</tr>
<tr>
<td align='left'>
If you have a problem outside the ones solved in this guide, then don't panic!<br>
We have a large team of trained support professionals that <b>will</b> be able to provide a solution to your problems.<br>
Your first stop would be to post a problem on our "Support and Community Forums". We have a large active community who have experience in maintaining their Invision Power Board who may be able to give you a prompt reply - our support professionals also moderate these forums and
will read your posts. We do recommend that you make use of the search facility on the board to avoid posting problems that have already been posted - there is also a good chance that it's already been reported, discussed and solved.
<br>
<br>You may wish to consider <b>the <a href='http://www.invisionboard.com/?whyregister'>registration</a></b> option. A yearly fee will cover you for all support requests for a period of one year (12 months).
<br>Registration entitles you to the following benefits:
<ul>
<li> You will have lifetime access to the Invision Power Services Customer Service Center.
<li> Service Ticket access will allow you to submit technical tickets for our highly experienced staff to work with you. This means you will get private, one-on-one help without having to post on our support forums.
<li> Phone support inside the US and UK (toll-free in the US).
<li> Installation of Invision Power Board is included if you need this service (usually $35).
<li> Half-price upgrade installations upon request when new releases of Invision Power Board are available
<li> Discounts on Invision Power Board feature plug-ins</ul>
<br>
For more information on our registration service, please visit our <a href='http://www.invisionboard.com/support.cgi' target='_blank'>advanced services</a> page.
<br><br>
If you wish to contact us for non-technical issues, please visit our <a href='http://www.invisionpower.com/?contact' target='_blank'>Contact Page</a> which includes a handy email form, mailing address and telephone number.
</td>
</tr>
</table>
<!-- End content -->
</body>
</html>
@@ -1,671 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Invision Install Guide: Installing</title>
<style>
BODY, TABLE { font-family: verdana, arial; font-size:12px; line-height:150% }
.title { background-image: url(tile_back.gif); font-family:arial; font-size:18px; color:white; font-weight:bold; height:40px }
.table1 { border:1px solid #999999 }
.table2 { border:1px dotted #999999 }
.menustrip { font-color:black; background-color:#EEEEEE; font-size:12px; height:24px }
a:link, a:visited, a:active { color:#000055 }
a:hover { color:#333377;text-decoration:underline }
.header { border-bottom:1px dashed #999999; font-family:Verdana, Arial; font-weight:bold; color:#4C77B6; font-size:20px; background-color:#FEFEFE; letter-spacing:-1px }
</style>
</head>
<body bgcolor="#FFFFFF" topmargin='5' leftmargin='0'>
<!-- Start content -->
<a name='top'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Installing: Step 1 - Uploading</td>
</tr>
<tr>
<td align='left'>
<br>At this point, you should have the zip archive "unzipped" and the contents similar to those shown in the <a href='install.html#structure' target='bottom'>structure and CHMOD guide</a>. If you
do not have a similar structure, check to make sure you have your zip program preferences set to allow creation of directories and to preserve case and long filenames.
<br><br>
If you haven't done so already, create a new directory on your server named appropriately (if you wanted to access the forums via 'http://www.domain.com/forums/', create a directory called 'forums' in the
'public_html' or 'www' directory on your webserver.
<br><br>
Using your FTP client, move into the directory you wish to upload to (if you followed the above advice, move into the newly created 'forums' directory.)
<br><br>
Using your FTP client, create the following directories "archive_in", "archive_out", "cache", "fonts", "html", "lang", "modules", "Skin", "sources", "ssi_templates", "style_images",
and "uploads" <span style='color:blue'>(TIP: If your FTP client supports "Drag n' Drop" which most modern clients do, you can save yourself some time and effort by
simply selecting all the files from the "unzipped" zip archive and drag them into your FTP client window, this will then copy all the files, creating the directories as it goes. If you choose
to do this, you can safely ignore most of the following instruction, just remember to CHMOD as outlined in the stucture and CHMOD guide).</span>
<br><br>
Once the directories have been created, CHMOD "archive_in", "archive_out" and "uploads" to 0755 (if you get permissions errors later on, you can CHMOD these to
"0777"). Now, upload the contents of the files in your local folders (from the zip file) into the corresponding directories you've just created on your server. Some folders will contain other
files and folders, upload them all - preserving the structure you have in your zip file (for example, upload the entire contents of the "html" folder on your computer to the "html" directory on the server).
<br><br>
Once you have finished uploading into the directories, upload the rest of the files "admin.php", "conf_global.php", "conf_mime_types.php", "css.php", "index.php",
"install_templates.txt", "sm_install.php", "ssi.php" to the same place as you created the directories earlier (into "forums" for our example).
<br>
CHMOD "conf_global.php" to 0666 (if you get permission denied errors later on, you can CHMOD this to 0777).
<br><br>
That's it, the hard work is now done! You can proceed to the next step.
</td>
</tr>
</table>
<br>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Installing: Step 2 - Using the Installer</td>
</tr>
<tr>
<td align='left'>
An installer is provided to assist you in entering the information Invision Power Board needs to connect to your mySQL database and to create your new
administrators account.
<br><br>
Run the "sm_install.php" file through your web browser by entering the URL to it into your browser address bar (if you have followed our example, type in
<b>http://www.domain.com/forums/sm_install.php</b>, naturally subsituting 'domain.com' for your web address.)
<br><br>
You will be presented with a short information screen, if you receive an error telling you that "conf_global.php" does not have suitable permissions, CHMOD "conf_global.php" to
0777 via your FTP client.
<br><br>
Clicking on proceed will present you with a simple information form. You will need to know your mySQL username and password at this point. If you do not know it, please ask your web host - in most
cases it is different from the FTP log in information.
<br><br>The form is very straightfoward, with only the following points needing closer examination. If you do not know what your mySQL "host" is, try "localhost" (without the quotes). if the mySQL server
is on the same server as your website (and in most cases it is) this will suffice.
<br>
If you have created a new database for Invision Power Board, or wish to use an existing database, enter the name of the database in the appropriate field.<br><br>Unless you intend to install multiple copies of
Invision Power Board into the same database, you can leave the "table prefix" blank. If you do not have a mySQL password (if you are installing Invision Power Board on your local server) this can be left blank.
<br>
After submitting the form, you will be informed of any errors - if you do get an error similar to "permission denied for user@localhost using password YES" - the chances are you have either your mySQL username, mySQL password
or mySQL database name wrong. Consult with your webhost for the correct information and resubmit the form.
<br><br>
If the installation was successful, you will receive notification to that effect.
<br>
Follow the link to finish off the installation and to log into your newly installed board. When the log in page loads, enter in the information you chose for your administrator account.
<br>
Once you are logged into the board, click on the "Admin CP" link found in the navigation bar to access the Administration Control Panel.
</td>
</tr>
</table>
<br>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Installing: Step 3 - Admin CP First Steps</td>
</tr>
<tr>
<td align='left'>
The Invision Power Board administration control panel is a very sophisticated tool. This is where you can create new categories and forums for your board, as well
as set bad word filters, edit emoticons, change the board colours and so on. We recommend you browse the documentation at <a href='http://www.invisionboard.com/documentation.cgi'>Invision Power Board</a> before getting attempting some of the more complex operations.
<br><br>
<b>Lets get stuck in!</b>
<br>
The first thing you will need to do is remove the "sm_install.php" file from your server; although Invision Power Board locks the installer after a successful install, it's always a good idea to remove the installer as re-running it
<b>will delete your database tables</b>.
<br><br>
<b>Before anyone can post, we need some forums!</b>
<br>
If you wish to get stuck in straight away, now would be a good time to create some forums for your members to post in.
<br>
In the Administrators CP, click on the "Forum Control" expanding menu in the left menu frame. When it loads, click on "New Category".
<br>If your website was about computers, you could enter "PC Software" as the category name. Submit the form by clicking the button at the bottom of the page.
<br>Now we have a category to "group" the forums, lets create a forum or two.
<br><br>Click on "New Forum" found in the same expandable menu. Choose "Normal Forum" from the drop down box and proceed.
<br>There are many options here, which are outside the scope of this guide, for more information see the documentation at <a href='http://www.invisionboard.com/documentation.cgi'>Invision Power Board</a>. We can
create a new forum without knowing what all the options do. Using our example, you might want a forum dedicated to "Games" - if so, enter "Games" as the forum title, and a suitable description for the new forum. When you have done this
scroll down and submit the form by clicking the button at the bottom of the page.
<br><br>
If you now go back to your board, and refresh the page, you will see the new category and forum. Try a little test post to make sure the system is running perfectly.
<br><br>
Congratulations! You have installed and set up your new Invision Power Board. If you ran into trouble, please click on the "Help!" link in the top menu bar for the FAQ and how to get support.
<br><br>
<i>Thank you for supporting Invision Power Board</i>
</td>
</tr>
</table>
<br>
<br>
<br>
<br>
<a name='structure'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>File Structure and CHMOD values</td>
</tr>
<tr>
<td align='left'>Below is a table showing the file structure and recommended CHMOD values for the file (and in the case of directories, the CHMOD
values for the contents of the directories).<br>The CHMOD values are not needed for Windows based servers and can be safely ignored. The CHMOD
values may vary from system to system, if in doubt, CHMOD everything to 0777.<br>Most systems will not need to CHMOD everything to install successfully,
use the table below to determine what needs CHMOD'ding for installation, and what can be left until later.
</td>
</tr>
<tr>
<td align='center'>
<table width='100%' align='center' cellpadding='0' cellspacing='0' bgcolor='#BCBCBC'>
<tr>
<td>
<table width='100%' align='center' cellpadding='4' cellspacing='1'>
<tr>
<td width='5%' bgcolor='#EEEEEE' style='font-size:10px'>&nbsp;</td>
<td width='25%' bgcolor='#EEEEEE' style='font-size:10px'><b>File/Folder Name</b></td>
<td width='20%' bgcolor='#EEEEEE' style='font-size:10px' align='center'><b>Item CHMOD Value</b></td>
<td width='30%' bgcolor='#EEEEEE' style='font-size:10px' align='center'><b>Contents CHMOD Value</b></td>
<td width='15%' bgcolor='#EEEEEE' style='font-size:10px' align='center'><b>CHMOD for install</b></td>
<td width='15%' bgcolor='#EEEEEE' style='font-size:10px' align='center'><b>Can CHMOD later</b></td>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>admin.php</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>archive_in</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>archive_out</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>cache</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>conf_global.php</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0666</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>conf_mime_types.php</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>css.php</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>fonts</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>html</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>index.php</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>install_templates.txt</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>lang</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>modules</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>Skin</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>sm_install.php</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>sources</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='file.gif' border='0' alt='PHP file'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'>ssi.php</td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>ssi_templates</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>style_images</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0755</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
</tr>
<tr>
<td align='center' valign='middle' bgcolor='#FFFFFF'><img src='folder.gif' border='0' alt='folder'></td>
<td align='left' valign='middle' bgcolor='#FFFFFF'><span style='color:blue'>uploads</span></td>
<td align='center' valign='middle' bgcolor='#FFFFFF'>0777</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
<td align='center' valign='middle' bgcolor='#FFFFFF'><span style='color:red'><b>X</b></span></a>
<td align='center' valign='middle' bgcolor='#FFFFFF'>-</a>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
<!-- End content -->
</body>
</html>
@@ -1,62 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Invision Board Menu Bar</title>
<style>
BODY, TABLE { font-family: arial, verdana; font-size:11px }
.title { background-image: url(tile_back.gif); font-family:arial; font-size:18px; color:white; font-weight:bold; height:40px }
.table1 { border:1px solid #999999 }
.menustrip { font-color:black; background-color:#EEEEEE; font-size:12px; height:24px; letter-spacing:1px }
a:link, a:visited, a:active { color:#000055 }
a:hover { color:#333377;text-decoration:underline }
</style>
</head>
<body bgcolor="#FFFFFF" topmargin='5' leftmargin='0'>
<table width='95%' align='center' cellpadding='4' cellspacing='0' class='table1'>
<tr>
<td class='title' align='left'>Invision Board Installation and Help Guide</td>
</tr>
<tr>
<td class='menustrip' align='center'>[ <b><a href='welcome.html#welcome' target='bottom'>Welcome</a></b> ] :: [ <b><a href='welcome.html#require' target='bottom'>Requirements</a></b> ] :: [ <b><a href='install.html#top' target='bottom'>Installing</a></b> ] :: [ <b><a href='install.html#structure' target='bottom'>Structure & CHMOD</a></b> ] :: [ <b><a href='help.html#top' target='bottom'>Help & FAQ</a></b> ]</td>
</tr>
</table>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 B

@@ -1,92 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Invision Power Board Install Guide: Welcome</title>
<style>
BODY, TABLE { font-family: verdana, arial; font-size:12px; line-height:150% }
.title { background-image: url(tile_back.gif); font-family:arial; font-size:18px; color:white; font-weight:bold; height:40px }
.table1 { border:1px solid #999999 }
.table2 { border:1px dotted #999999 }
.menustrip { font-color:black; background-color:#EEEEEE; font-size:12px; height:24px }
a:link, a:visited, a:active { color:#000055 }
a:hover { color:#333377;text-decoration:underline }
.copyright { font-size:10px }
.header { border-bottom:1px dashed #999999; font-family:Verdana, Arial; font-weight:bold; color:#4C77B6; font-size:20px; background-color:#FEFEFE; letter-spacing:-1px }
</style>
</head>
<body bgcolor="#FFFFFF" topmargin='5' leftmargin='0'>
<!-- Start content -->
<a name='welcome'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Welcome to Invision Power Board!</td>
</tr>
<tr>
<td align='left'>
<br>Welcome to Invision Power Board, a fast, efficient, scalable community solution written in PHP and using MySQL for database storage.
<br><br>
This guide will help you through the installation process and get you on your way to setting up your own Invision Power Board.
<br>
Installation is very straight forward, only taking about 15 minutes from uploading the files to logging into your administration center.
<br>
<br>
You will need an FTP (File Transfer Protocol) client, if you do not have one you can download <a href='http://www.smartftp.com' target='_blank'>Smart FTP for Windows</a> or
<a href='http://www.interarchy.com' target='_blank'>InterArchy for Macintosh</a>. At the time of writing both websites have freeware or free trial versions available for download.
<br>You do not need an indepth knowledge of PHP programming to install Invision Power Board, but a working knowledge of FTP functions is a plus.
<br>
<br>This guide assumes that you have successfully downloaded the latest release from <a href='http://www.invisionboard.com' target='_blank'>Invision Power Board</a> and have the Zip file "unzipped" and ready to go.
<br>The instructions will term the zip file you downloaded as "the zip archive", the directories created by the unzipping process as "the local folders" and the directories on your website as
"website directories" - this is to prevent confusion.
<br><br>
<b>If you don't know your FTP from your PHP and your CHMOD from your CHOWN, then you might wish to consider our Installation Service. For a low cost, once only fee
- one of our installation professionals will install and set up your board for you. For more information, please visit our <a href='http://www.invisionboard.com/support.cgi' target='_blank'>advanced services</a> page.</b>
</td></tr>
</table>
<br>
<a name='require'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Requirements</td>
</tr>
<tr>
<td align='left'>The exact requirements will depend on many factors, your estimated board traffic being one.
<br><br><b>Server Requirements</b>
<br>
You must have a webserver that has PHP 4.0.3 (or better) and mySQL 3.22 (or better) installed. If you are unsure whether your server has these
programs installed, please check with your web host now. If you are capable, you can always <a href='http://www.php.net' target='_blank'>download PHP</a>
and <a href='http://www.mysql.com' target='blank'>download mySQL</a> and install it yourself. If your web host does not support PHP or mySQL, consider hosting your entire web site or forums with <a href='http://www.ipshosting.com' target='blank'>IPS Hosting</a> services.
<br>Invision Power Board works best on an Apache server, and is Apache 1 and Apache 2 savvy.
<br><br>
<b>General Requirements</b>
<br>
You <b>do not</b> need a new mySQL database as Invision Power Board supports table prefixes to prevent tables being overwritten.
<br>You will also need the mySQL username and mySQL password for a mySQL user that has permission to "CREATE", "DROP" and "ALTER" tables.
<br>You will need about 2mb of free web space and roughly 3mb of mySQL database space to allow installation and a moderately sized community.
<br>If you are unsure on any of these points, please ask your webhost before proceeding.
<br><br>
<b>&gt;&gt; <a href='install.html' target='bottom'>Enough chit chat, lets get installing!</a>
</td>
</tr>
</table>
<br><br>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td align='center' class='copyright'>
Invision Power Board, Invision Power Board Installation Guide &copy; 2002 <a href='http://www.invisionpower' target='_blank'>Invision Power Services</a>
</td>
</tr>
</table>
<!-- End content -->
</body>
</html>
@@ -1,32 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Invision Board Installation</title>
</head>
<frameset rows='90, *' frameborder='no' border='0' framespacing='0'>
<frame src="data/menu.html" name="topmenu" longdesc="Top%20Menu%20Bar" scrolling="no" noresize>
<frame src="data/welcome.html" name="bottom" longdesc="Bottom%20Bar" scrolling="auto" noresize>
</frameset>
<noframes>
Sorry, you need a frames enabled browser to view this page- and why are you still living in the dark ages,
Internet Explorer 2 isn't cool anymore!
</noframes>
</html>
-361
View File
@@ -1,361 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>Invision Power Board Upgrade Guide</title>
<style>
BODY, TABLE { font-family: verdana, arial; font-size:12px; line-height:150% }
.title { background-image: url(tile_back.gif); font-family:arial; font-size:18px; color:white; font-weight:bold; height:40px }
.table1 { border:1px solid #999999 }
.table2 { border:1px dotted #999999 }
.menustrip { font-color:black; background-color:#EEEEEE; font-size:12px; height:24px }
a:link, a:visited, a:active { color:#000055 }
a:hover { color:#333377;text-decoration:underline }
.header { border-bottom:1px dashed #999999; font-family:Verdana, Arial; font-weight:bold; color:#4C77B6; font-size:20px; background-color:#FEFEFE; letter-spacing:-1px }
</style>
</head>
<body bgcolor="#FFFFFF" topmargin='5' leftmargin='0'>
<!-- Start content -->
<a name='top'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td align='center'>
<b>Sections:</b> <a href='upgrade_v11x.html#intro'>Introduction</a> | <a href='upgrade_v11x.html#upgrade'>Upgrading</a> | <a href='upgrade_v11x.html#main'><b>HELP!!</b></a> | <a href='upgrade_v11x.html#help'>Getting Further Help</a>
</td></tr>
</table>
<br>
<a name='intro'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Welcome!</td>
</tr>
<tr>
<td align='left'>
<b>Synopsis: Upgrading from v1.1.x to v1.2</b>
<br>
To upgrade your existing board from Invision Board v1.1.x to Invision Board v1.2, you'll need to update all the program files and
run an upgrade script that is included in this distribution. You may want to create a database back up and download via FTP any
existing language packs and skin files as these may be over-written during the upgrade.
<br><br>
<b>Important: Skins and full text searching</b>
<br>
All v1.1.x skins are not compatible with v1.2. IPB v1.2 has an XHTML compliant skin which has been totally rewritten. The upgrade
process will 'sunset' all your current skins by marking them as hidden so that you may manually update them if desired.
<br /><br />
IPB v1.2 also supports full text searching. It is recommended that after the upgrade you log into your Admin CP, expand the "Board Options" sub menu and
set up full text search. Note, you will not be able to use the "quick" search until full text searching has been enabled.
</td></tr>
</table>
<br>
<a name='upgrade'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Upgrading</td>
</tr>
<tr>
<td align='left'>
<b>Saving Old Data</b>
<br>
If you wish to save the information in the old default skin, please do the following:
<br>
<span style='color:blue'>Via FTP download the directories "Skin/s1/" and "style_images/1/"</span>. The upgrade will need the
v1.1 files to reside in those directories and any previous data will be lost. You will also need to export the default macro set if
you wish to retain the information. This <em>should</em> just be the original v1.1 macro set and overwriting it will be harmless.
<br><br>
<b>Uploading the Files</b>
<br>
From the unzipped package, upload the following files to the same directory that your existing board is in:
<br><span style='color:blue'>admin.php
<br>css.php
<br>index.php
<br>install_templates.txt
<br>show.php
<br>upgrade5.php</span>
<br><br>Upload the directories (and any contents / sub directories):
<br>
<span style='color:red'>
cache
<br>
fonts
<br>
html (All files and sub forums, etc)
<br>
lang/en/*.php (All PHP files. Create the directory if it's not there and upload into it)
<br>
Skin/s1/*.php (All PHP files. Create the directory if it's not there and upload into it)
<br>
sources/*.* (All PHP files and sub folders)
<br>
style_images/1/ (All files. Create the directory "1" if it's not there and upload into it)</span>
<br><br>
In short: Upload everything as if it were a new install!
<br><br>
<b>Please check the following before you proceed</b>
<br>You MUST ensure that the new skin PHP files are in a directory called "Skin/s1/" - if you have previously removed "s1" from the "Skins" directory, please re-create it via FTP and upload the skin PHP files into it.
<br><br>You MUST ensure that the new images are in a directory called "style_images/1/" - if you have previously
removed "1" from the "style_images" directory, please re-create it via FTP and upload the images into it.
<br><br>You MUST make sure the file 'install_templates.txt' is uploaded into the same directory as 'index.php'
<br><br>You MUST make sure the script 'upgrade5.php' is uploaded into the same directory as 'index.php'
<br><br>
<b>Running the upgrade script</b>
<br>
Open up a new browser window and enter the URL to the upgrade5.php script (example: www.board.com/forums/upgrade5.php)
Follow the onscreen instructions to update your database.
<br><br>
If you get an error during the upgrade, try hitting back in your browser and try again.
<br>
This script will upgrade your database, install new templates and perform a clean up.
<br><br>
<span style='color:red'><b>IMPORTANT: PLEASE REMOVE THE SCRIPT WHEN THE UPGRADE IS COMPLETED!</b></span>
<br><br>
That's it, you should be done!
</td></tr>
</table>
<br>
<a name='main'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>HELP!!: Common Problems</td>
</tr>
<tr>
<td align='left'>
<b>The upgrade worked fine, but I get a blank screen now!!</b>
<br>
The upgrade takes it's best guess when it creates the new skin set, it's not impossible that it might not match everything up.
If you get a blank screen, it's usually because the board wrapper it's chosen is broken / doesn't exist. Try the following:
<br>Log into your Admin CP. Go to "Skins & Templates". Click on "Manage Skin Sets" and edit "IPB Default Set (1.2)" and make
sure it's got a valid template set and wrapper.
<br><br>
<b>I can't do anything, I get loads of errors!!</b>
<br>
This is <b>always</b> caused by a failure to update the files in "Skin/s1/" on your server. Simply put, they MUST be updated from
the ones included in this zip file (upload/Skins/s1). Upload the skins and refresh your browser.
</td></tr>
</table>
<br>
<a name='help'></a>
<table width='95%' align='center' cellpadding='4' cellspacing='0'>
<tr>
<td class='header' align='left'>Getting further help</td>
</tr>
<tr>
<td align='left'>
If you have a problem outside the ones solved in this guide, then don't panic!<br>
We have a large team of trained support professionals that <b>will</b> be able to provide a solution to your problems.<br>
Your first stop would be our "Support and Community Forums". We have a large active community who have experience in maintaining their Invision Power Board who may be able to give you a prompt reply - our support professionals also moderate these forums and
will read your posts. We do recommend that you make use of the search facility on the board to avoid posting problems that have already been posted - there is also a good chance that it's already been reported, discussed and solved.
<br>
<br>You may wish to consider <b><a href='http://www.invisionboard.com/?whyregister' target='_blank'>registering your board</a></b>. A once only fee will cover you for all support requests for a period of one year (12 months).
<br>Priority support entitles you to the following benefits:
<ul>
<li>Your support tickets will be marked priority and only Invision Power Board administrators will have access to those tickets.
<li>You will be given access to a private support forum on our Community Forums.
<li>If you are in the United States you will receive telephone support if desired.
<li>In most cases we will login to your account and address problems for you.
<li>We can install and upgrade the software for you if desired.</ul>
<br>
For more information on our priority support service, please visit our <a href='http://www.invisionboard.com/?services' target='_blank'>advanced services</a> page.
<br><br>
If you wish to contact us for non-technical issues, please visit our <a href='http://www.invisionpower.com/?contact' target='_blank'>Contact Page</a> which includes a handy email form, mailing address and telephone number.
</td>
</tr>
</table>
<!-- End content -->
</body>
</html>
@@ -1,262 +0,0 @@
<?php
/*
+--------------------------------------------------------------------------
| INVISION POWER BOARD PATCH SCRIPT
| ========================================
| by Matthew Mecham
| (c) 2001 - 2003 Invision Power Services
| http://www.invisionpower.com
| ========================================
| Web: http://www.invisionboard.com
| Email: matt@invisionpower.com
| Licence Info: http://www.invisionboard.com/?license
+---------------------------------------------------------------------------
|
| > Patch script
| > Script written by Matt Mecham
| > Date started: 17th June 2003
|
+--------------------------------------------------------------------------
*/
//-----------------------------------------------
// USER CONFIGURABLE ELEMENTS
//-----------------------------------------------
// Root path
$root_path = "./";
//-----------------------------------------------
// NO USER EDITABLE SECTIONS BELOW
//-----------------------------------------------
error_reporting (E_ERROR | E_WARNING | E_PARSE);
set_magic_quotes_runtime(0);
//--------------------------------
// Import $INFO, now!
//--------------------------------
require $root_path."conf_global.php";
//--------------------------------
// Load the DB driver and such
//--------------------------------
$INFO['sql_driver'] = !$INFO['sql_driver'] ? 'mySQL' : $INFO['sql_driver'];
$to_require = $root_path."sources/Drivers/".$INFO['sql_driver'].".php";
require ($to_require);
$DB = new db_driver;
$DB->obj['sql_database'] = $INFO['sql_database'];
$DB->obj['sql_user'] = $INFO['sql_user'];
$DB->obj['sql_pass'] = $INFO['sql_pass'];
$DB->obj['sql_host'] = $INFO['sql_host'];
$DB->obj['sql_tbl_prefix'] = $INFO['sql_tbl_prefix'];
// Get a DB connection
$DB->connect();
$members = array();
$DB->query("SELECT * FROM ibf_members WHERE mgroup=".$INFO['auth_group']);
while ( $r = $DB->fetch_row() )
{
$members[ $r['id'] ] = $r;
}
$tmp = $members;
$DB->query("SELECT * FROM ibf_validating");
while ( $v = $DB->fetch_row() )
{
if ( is_array( $members[ $v['member_id'] ] ) )
{
unset($members[ $v['member_id'] ]);
}
}
/*header("Content-type: text/plain");
print_r($tmp);
print_r($members);
exit();*/
$count = intval( count($members) );
if ( $count > 0 )
{
foreach( $members as $mid => $mdata )
{
$dbs = array(
'vid' => md5( time() . $mid ),
'member_id' => $mdata['id'],
'real_group' => $INFO['member_group'],
'temp_group' => $INFO['auth_group'],
'entry_date' => time(),
'coppa_user' => 0,
'new_reg' => 1,
'ip_address' => '127.0.0.1',
);
$dbstring = $DB->compile_db_insert_string($dbs);
$DB->query("INSERT INTO ibf_validating ({$dbstring['FIELD_NAMES']}) VALUES({$dbstring['FIELD_VALUES']})");
}
}
echo("<html><body><b>$count members found...</b><br /><br />Update complete, you may now remove this file</body></html>");
exit();
//+-------------------------------------------------
// GLOBAL ROUTINES
//+-------------------------------------------------
function fatal_error($message="", $help="") {
echo("$message<br><br>$help");
exit;
}
?>
File diff suppressed because it is too large. Load diff
@@ -1,58 +0,0 @@
$SQL[] = "INSERT INTO ibf_macro VALUES (1, 'A_LOCKED_B', '<img src=\'style_images/<#IMG_DIR#>/t_closed.gif\' border=\'0\' alt=\'Closed Topic\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (2, 'A_MOVED_B', '<img src=\'style_images/<#IMG_DIR#>/t_moved.gif\' border=\'0\' alt=\'Moved Topic\'>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (3, 'A_POLLONLY_B', '<img src=\'style_images/<#IMG_DIR#>/t_closed.gif\' border=\'0\' alt=\'Poll Only\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (4, 'A_POST', '<img src=\'style_images/<#IMG_DIR#>/t_new.gif\' border=\'0\' alt=\'Start new topic\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (5, 'A_REPLY', '<img src=\'style_images/<#IMG_DIR#>/t_reply.gif\' border=\'0\' alt=\'Reply to this topic\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (6, 'A_POLL', '<img src=\'style_images/<#IMG_DIR#>/t_poll.gif\' border=\'0\' alt=\'Start Poll\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (7, 'A_STAR', '<img src=\'style_images/<#IMG_DIR#>/pip.gif\' border=\'0\' alt=\'*\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (8, 'B_HOT', '<img src=\'style_images/<#IMG_DIR#>/f_hot.gif\' border=\'0\' alt=\'Hot topic\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (9, 'B_HOT_NN', '<img src=\'style_images/<#IMG_DIR#>/f_hot_no.gif\' border=\'0\' alt=\'No new\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (10, 'B_LOCKED', '<img src=\'style_images/<#IMG_DIR#>/f_closed.gif\' border=\'0\' alt=\'Closed\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (11, 'B_MOVED', '<img src=\'style_images/<#IMG_DIR#>/f_moved.gif\' border=\'0\' alt=\'Moved\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (12, 'B_NEW', '<img src=\'style_images/<#IMG_DIR#>/f_norm.gif\' border=\'0\' alt=\'New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (13, 'B_NORM', '<img src=\'style_images/<#IMG_DIR#>/f_norm_no.gif\' border=\'0\' alt=\'No New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (14, 'B_PIN', '<img src=\'style_images/<#IMG_DIR#>/f_pinned.gif\' border=\'0\' alt=\'Pinned\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (15, 'B_POLL', '<img src=\'style_images/<#IMG_DIR#>/f_poll.gif\' border=\'0\' alt=\'Poll\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (16, 'B_POLL_NN', '<img src=\'style_images/<#IMG_DIR#>/f_poll_no.gif\' border=\'0\' alt=\'No new votes\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (17, 'B_HOT_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_hot_dot.gif\' border=\'0\' alt=\'New Posts\'>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (18, 'B_NEW_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_norm_dot.gif\' border=\'0\' alt=\'No New Posts\'>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (19, 'B_HOT_NN_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_hot_no_dot.gif\' border=\'0\' alt=\'No New Posts*\'>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (20, 'B_NORM_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_norm_no_dot.gif\' border=\'0\' alt=\'No New Posts*\'>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (21, 'B_POLL_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_poll_dot.gif\' border=\'0\' alt=\'Poll*\'>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (22, 'B_POLL_NN_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_poll_no_dot.gif\' border=\'0\' alt=\'No New Votes*\'>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (23, 'C_LOCKED', '<img src=\'style_images/<#IMG_DIR#>/bf_readonly.gif\' border=\'0\' alt=\'Read Only Forum\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (24, 'C_OFF', '<img src=\'style_images/<#IMG_DIR#>/bf_nonew.gif\' border=\'0\' alt=\'No New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (25, 'C_OFF_CAT', '<img src=\'style_images/<#IMG_DIR#>/bc_nonew.gif\' border=\'0\' alt=\'No New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (26, 'C_OFF_RES', '<img src=\'style_images/<#IMG_DIR#>/br_nonew.gif\' border=\'0\' alt=\'No New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (27, 'C_ON', '<img src=\'style_images/<#IMG_DIR#>/bf_new.gif\' border=\'0\' alt=\'New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (28, 'C_ON_CAT', '<img src=\'style_images/<#IMG_DIR#>/bc_new.gif\' border=\'0\' alt=\'New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (29, 'C_ON_RES', '<img src=\'style_images/<#IMG_DIR#>/br_new.gif\' border=\'0\' alt=\'New Posts\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (30, 'F_ACTIVE', '<img src=\'style_images/<#IMG_DIR#>/user.gif\' border=\'0\' alt=\'Active Users\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (31, 'F_NAV_SEP', '&nbsp;-&gt;&nbsp;', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (32, 'F_NAV', '<img src=\'style_images/<#IMG_DIR#>/nav.gif\' border=\'0\' alt=\'&gt;\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (33, 'F_STATS', '<img src=\'style_images/<#IMG_DIR#>/stats.gif\' border=\'0\' alt=\'Board Stats\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (34, 'NO_PHOTO', '<img src=\'style_images/<#IMG_DIR#>/nophoto.gif\' border=\'0\' alt=\'No Photo\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (35, 'CAMERA', '<img src=\'style_images/<#IMG_DIR#>/camera.gif\' border=\'0\' alt=\'Photo\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (36, 'M_READ', '<img src=\'style_images/<#IMG_DIR#>/f_norm_no.gif\' border=\'0\' alt=\'Read Msg\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (37, 'M_UNREAD', '<img src=\'style_images/<#IMG_DIR#>/f_norm.gif\' border=\'0\' alt=\'Unread Msg\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (38, 'P_AOL', '<img src=\'style_images/<#IMG_DIR#>/p_aim.gif\' border=\'0\' alt=\'AOL\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (39, 'P_DELETE', '<img src=\'style_images/<#IMG_DIR#>/p_delete.gif\' border=\'0\' alt=\'Delete Post\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (40, 'P_EDIT', '<img src=\'style_images/<#IMG_DIR#>/p_edit.gif\' border=\'0\' alt=\'Edit Post\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (41, 'P_EMAIL', '<img src=\'style_images/<#IMG_DIR#>/p_email.gif\' border=\'0\' alt=\'Email Poster\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (42, 'P_ICQ', '<img src=\'style_images/<#IMG_DIR#>/p_icq.gif\' border=\'0\' alt=\'ICQ\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (43, 'P_MSG', '<img src=\'style_images/<#IMG_DIR#>/p_pm.gif\' border=\'0\' alt=\'PM\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (44, 'P_QUOTE', '<img src=\'style_images/<#IMG_DIR#>/p_quote.gif\' border=\'0\' alt=\'Quote Post\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (45, 'P_WEBSITE', '<img src=\'style_images/<#IMG_DIR#>/p_www.gif\' border=\'0\' alt=\'Users Website\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (46, 'P_YIM', '<img src=\'style_images/<#IMG_DIR#>/p_yim.gif\' border=\'0\' alt=\'Yahoo\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (47, 'P_REPORT', '<img src=\'style_images/<#IMG_DIR#>/p_report.gif\' border=\'0\' alt=\'Report Post\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (48, 'P_MSN', '<img src=\'style_images/<#IMG_DIR#>/p_msn.gif\' border=\'0\' alt=\'MSN\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (49, 'CAT_IMG', '<img src=\'style_images/<#IMG_DIR#>/nav_m.gif\' border=\'0\' alt=\'&gt;\' width=\'8\' height=\'8\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (50, 'NEW_POST', '<img src=\'style_images/<#IMG_DIR#>/newpost.gif\' border=\'0\' alt=\'Goto last unread\' title=\'Goto last unread\' hspace=2>', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (51, 'LAST_POST', '<img src=\'style_images/<#IMG_DIR#>/lastpost.gif\' border=\'0\' alt=\'Last Post\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (52, 'BR_REDIRECT', '<img src=\'style_images/<#IMG_DIR#>/br_redirect.gif\' border=\'0\' alt=\'Redirect\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (53, 'INTEGRITY_MSGR', '<img src=\'style_images/<#IMG_DIR#>/p_im.gif\' border=\'0\' alt=\'Integrity Messenger IM\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (54, 'ADDRESS_CARD', '<img src=\'style_images/<#IMG_DIR#>/addresscard.gif\' border=\'0\' alt=\'Mini Profile\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (55, 'T_QREPLY', '<img src=\'style_images/<#IMG_DIR#>/t_qr.gif\' border=\'0\' alt=\'Quick Reply\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (56, 'T_OPTS', '<img src=\'style_images/<#IMG_DIR#>/t_options.gif\' border=\'0\' alt=\'Topic Options\' />', 1, 1);";
$SQL[] = "INSERT INTO ibf_macro VALUES (57, 'CAL_NEWEVENT', '<img src=\'style_images/<#IMG_DIR#>/cal_newevent.gif\' border=\'0\' alt=\'Add New Event\' />', 0, 1);
$SQL[] = "INSERT INTO ibf_macro VALUES (58, 'F_RULES', '<img src=\'style_images/<#IMG_DIR#>/forum_rules.gif\' border=\'0\' alt=\'Forum Rules\' />', 0, 1);
@@ -1,123 +0,0 @@
INSERT INTO ibf_categories (id, position, state, name, description, image, url) VALUES (-1, NULL, NULL, '-', NULL, NULL, NULL);
INSERT INTO ibf_categories (id, position, state, name, description, image, url) VALUES (1, 1, '1', 'A Test Category', '', '', '');
INSERT INTO ibf_css (cssid, css_name, css_text, css_comments) VALUES (1, 'Invision Style Sheet', 'form { display:inline }\r\nTABLE, TR, TD { font-family: Verdana, Tahoma, Arial; font-size: 8.5pt; color: #000000 }\r\na:link, a:visited, a:active { text-decoration: underline; color: #000000 }\r\na:hover { color: #465584 }\r\n.hlight { background-color: #DFE6EF }\r\n.dlight { background-color: #EEF2F7 }\r\n.mainbg { background-color: #FFFFFF }\r\n.mainfoot { background-color: #BCD0ED }\r\n.forum1 { background-color: #DFE6EF }\r\n.forum2 { background-color: #E4EAF2 }\r\n.post1 { background-color: #F5F9FD }\r\n.post2 { background-color: #EEF2F7 }\r\n.posthead { background-color: #E4EAF2 }\r\n\r\n.postbak { background-color: #D2D2D0 }\r\n.title { background-color: #C4DCF7 }\r\n.row1 { background-color: #EEF2F7 }\r\n.row2 { background-color: #F5F9FD }\r\n.postsep { background-color: #C7D2E0; height: 1px }\r\n\r\n.signature { font-size: 7.5pt; color: #333399 }\r\n.postdetails { font-size: 7.5pt }\r\n.postcolor, #postcolor { font-size: 9pt; line-height: 160% }\r\n.membertitle { font-size: 10px; line-height: 150%; color: #000000 }\r\n.normalname { font-size: 12px; font-weight: bold; color: #000033; padding-bottom: 2px }\r\n.normalname a:link, .normalname a:visited, .normalname a:active { text-decoration: underline; color: #000033; padding-bottom: 2px }\r\n.unreg { font-size: 11px; font-weight: bold; color: #990000 }\r\n.highlight { color: #FF0000 }\r\n.highlight a:link, .highlight a:visited, .highlight a:active { text-decoration: underline; color: #FF0000 }\r\n.highlight a:hover { text-decoration: underline }\r\n.desc { font-size: 8.0pt; color: #434951 }\r\n.copyright { font-family: Verdana, Tahoma, Arial; font-size: 7.5pt; line-height: 12px }\r\n.category { font-weight: bold; line-height: 150%; color: #4C77B6; background-color: #C2CFDF }\r\n.category a:link, #category a:visited, #category a:active { text-decoration: none; color: #4C77B6 }\r\n.postfoot {\r\n\r\n font-weight:bold;\r\n\r\n color:#3A4F6C;\r\n\r\n height: 24px;\r\n\r\n background-color: #D1DCEB;\r\n\r\n}\r\n.titlefoot { font-weight: bold; color: #3A4F6C; height: 24px; background-color: #BCD0ED }\r\n.titlemedium {\r\n\r\n font-weight:bold;\r\n color:#3A4F6C;\r\n\r\n height: 30px;\r\n\r\n background-color: #9FBCE3;\r\n \r\n background-image: url(style_images/<#IMG_DIR#>/tile_sub.gif);\r\n\r\n}\r\n.titlemedium a:link, .titlefoot a:link, .titlemedium a:visited, .titlefoot a:visited, .titlemedium a:active, .titlefoot a:active { text-decoration: underline; color: #3A4F6C }\r\n.titlemedium a:hover, .subtitle a:hover, .titlefoot a:hover { text-decoration: underline; color: #000000 }\r\n.maintitle {\r\n\r\n color:#FFFFFF;\r\n\r\n font-size: 9.5pt;\r\n \r\n height: 26px;\r\n \r\n background-image: url(style_images/<#IMG_DIR#>/tile_back.gif);\r\n\r\n}\r\n.edit { font-size: 9px }\r\n.fancyborder { border: 1px dashed #999999 }\r\n.solidborder { border: 1px solid #999999 }\r\n.maintitle a:link, .maintitle a:visited, .maintitle a:active { text-decoration: none; color: #FFFFFF }\r\n.maintitle a:hover { text-decoration: underline }\r\n.nav { font-weight: bold; color: #000000; font-size: 8.5pt }\r\n.pagetitle { color: #4C77B6; font-size: 18px; font-weight: bold; letter-spacing: -1px; line-height: 120% }\r\n.useroptions { background-color: #598CC3; height: 25px; font-weight: bold; color: #FFFFFF }\r\n.useroptions a:link, .useroptions a:visited,.useroptions a:active { text-decoration: none; color: #FFFFFF }\r\n.bottomborder { border-bottom: 1px dashed #D2D2D0 }\r\n.linkthru { color: #000000; font-size:8.5pt }\r\n.linkthru a:link, .linkthru a:active { text-decoration: underline; color: #000000 }\r\n.linkthru a:visited { text-decoration: underline; color: #000000 }\r\n.linkthru a:hover { text-decoration: underline; color: #465584 }\r\n#QUOTE { font-family: Verdana, Arial; font-size: 8pt; color: #333333; background-color: #FAFCFE; border: 1px solid Black; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px }\r\n#CODE { font-family: Verdana, Arial; font-size: 8pt; color: #333333; background-color: #FAFCFE; border: 1px solid Black; padding-top: 2px; padding-right: 2px; padding-bottom: 2px; padding-left: 2px }\r\n.codebuttons { font-size: 8.5pt; font-family: verdana, helvetica, sans-serif; vertical-align: middle }\r\n.forminput { font-size: 9pt; font-family: verdana, helvetica, sans-serif; vertical-align: middle }\r\n.textinput { font-size: 9pt; font-family: verdana, helvetica, sans-serif; vertical-align: middle }\r\n.input { font-size: 9pt; font-family: verdana, helvetica, sans-serif; vertical-align: middle }\r\n', NULL);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (1, ':mellow:', 'mellow.gif', 0);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (2, ':huh:', 'huh.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (3, '^_^', 'happy.gif', 0);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (4, ':o', 'ohmy.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (5, ';)', 'wink.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (6, ':P', 'tongue.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (7, ':D', 'biggrin.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (8, ':lol:', 'laugh.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (9, 'B)', 'cool.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (10, ':rolleyes:', 'rolleyes.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (11, '-_-', 'sleep.gif', 0);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (12, '&lt;_&lt;', 'dry.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (13, ':)', 'smile.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (14, ':wub:', 'wub.gif', 0);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (15, ':angry:', 'mad.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (16, ':(', 'sad.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (17, ':unsure:', 'unsure.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (18, ':wacko:', 'wacko.gif', 0);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (19, ':blink:', 'blink.gif', 1);
INSERT INTO ibf_emoticons (id, typed, image, clickable) VALUES (20, ':ph34r:', 'ph34r.gif', 1);
INSERT INTO ibf_faq (id, title, text, description) VALUES (1, 'Registration benefits', 'To be able to use all the features on this board, the administrator will probably require that you register for a member account. Registration is free and only takes a moment to complete.\r<br>\r<br>During registration, the adminstrator requires that you supply a valid email address. This is important as the administrator may require that you validate your registration via an email. If this is the case, you will be notified when registering.\r<br>In some cases, the administrator will need to approve your regsitration before you can use your member account fully. If this is the case you will be notified during registration.\r<br>\r<br>Once you have registered and logged in, you will have access to your private messenger and your control panel.\r<br>\r<br>For more information on these items, please see the relevant sections in this documentation.', 'How to register and the added benefits of being a registered member.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (2, 'Cookies and cookie usage', 'Using cookies is optional, but strongly recommended. Cookies are used to track topics, showing you which topics have new replies since your last visit and to automatically log you in when you return.\r<br>\r<br>This board will also allow you to remove the long session id\'s found in the URL\'s. You can do this by entering your control panel (click the link at the top of the board) and entering the \'Board Settings\' section. It is recommended that you enable this feature because you may experience problems if your internet connection shares a proxy and you share a link with another user. If in doubt, choose to hide the session id.\r<br>\r<br><b>Clearing Cookies</b>\r<br>\r<br>You can clear the cookies at any time by clicking on the link found at the bottom of the main board page (the first page you see when returning to the board). If this does not work for you, you may need to remove the cookies manually.\r<br>\r<br><u>Removing Cookies in Internet Explorer for Windows</u>\r<br>\r<br><ul>\r<br><li> Close all open Internet Explorer Windows\r<br><li> Click on the \'start\' button\r<br><li> Move up to \'Find\' and click on \'Files and Folders\'\r<br><li> When the new window appears, type in the domain name of the board you are using into the \'containing text\' field. (If the boards address was \'http://www.invisionboard.com/forums/index.php\' you would enter \'invisionboard.com\' without the quotes)\r<br><li> In the \'look in\' box, type in <b>C:&#92;Windows&#92;Cookies</b> and press \'Find Now\'\r<br><li> After it has finished searching, highlight all files (click on a file then press CTRL+A) and delete them.\r<br></ul>\r<br>\r<br><u>Removing Cookies in Internet Explorer for Macintosh</u>\r<br>\r<br><ul>\r<br><li> With Internet Explorer active, choose \'Edit\' and then \'Preferences\' from the Macintosh menu bar at the top of the screen\r<br><li> When the preferences panel opens, choose \'Cookies\' found in the \'Receiving Files\' section.\r<br><li> When the cookie pane loads, look for the domain name of the board (If the boards address was \'http://www.invisionboard.com/forums/index.php\' look for \'invisionboard.com\' or \'www.invisionboard.com\'\r<br><li> For each cookie, click on the entry and press the delete button.\r<br></ul>\r<br>\r<br>Your cookies should now be removed. In some cases you may need to restart your computer for the changes to take effect.', 'The benefits of using cookies and how to remove cookies set by this board.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (3, 'Recovering lost or forgotten passwords', 'Security is a big feature on this board, and to that end, all passwords are encrypted when you register.\r<br>This means that we cannot email your password to you as we hold no record of your \'uncrypted\' password. You can however, apply to have your password reset.\r<br>\r<br>To do this, click on the <a href=\'index.php?act=Reg&CODE=10\'>Lost Password link</a> found on the log in page.\r<br>\r<br>Further instruction is available from there.', 'How to reset your password if you\'ve forgotton it.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (4, 'Your Control Panel', 'Your control panel is your own private board console. You can change how the board looks and feels as well as your own information from here.\r<br>\r<br><b>Edit Profile Info</b>\r<br>\r<br>This section allows you to add or edit your contact information and enter some personal information if you choose. All of this information is optional and can be omitted.\r<br>\r<br><b>Edit Signature</b>\r<br>\r<br>A board \'signature\' is very similar to an email signature. This signature is attached to the foot of every message you post unless you choose to check the box that allows you to ommit the signature in the message you are posting. You may use BB Code if available and in some cases, pure HTML (if the board administrator allows it).\r<br>\r<br><b>Edit Avatar Settings</b>\r<br>\r<br>An avatar is a little image that appears under your username when you view a topic or post you authored. If the administrator allows, you may either choose from the board gallery, enter a URL to an avatar stored on your server or upload an avatar to use. You may also set the width of the avatar to ensure that it\'s sized in proportion.\r<br>\r<br><b>Email Settings</b>\r<br>\r<br><u>Hide my email address</u> allows you to deny the ability for other users to send you an email from the board.\r<br><u>Send me updates sent by the board administrator</u> will allow the administrator to include your email address in any mailings they send out - this is used mostly for important updates and community information.\r<br><u>Include a copy of the post when emailing me from a subscribed topic</u>, this allows you to have the new post included in any reply to topic notifications.\r<br>\r<br><b>Board Settings</b>\r<br>\r<br>From this section, you can set your timezone, choose to not see users signatures, avatars and posted images.\r<br>You can choose to get a pop up window informing you when you have a new message and hide the long session ID in links (see the \'Cookies\' help file for more infomation on this).\r<br>\r<br><b>Skins and Languages</b>\r<br>\r<br>If available, you can choose a skin style and language choice. This affects how the board is displayed so you may wish to preview the skin before submitting the form.\r<br>\r<br><b>Change Email Address</b>\r<br>\r<br>At any time, you can change the email address that is registered to your account. In some cases, you will need to revalidate your account after changing your email address. If this is the case, you will be notified before your email address change is processed.\r<br>\r<br><b>Change Password</b>\r<br>\r<br>You may change your password from this section. Please note that you will need to know your current password before you can change your password.\r<br>\r<br><b>View Subsciptions</b>\r<br>\r<br>This is where you manage your topic subscriptions. Please see the help file \'Email Notification of new messages\' for more information on how to subscribe to topics.', 'Editing contact information, personal information, avatars, signatures, board settings, languages and style choices.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (5, 'Email Notification of new messages', 'This board can notify you when a new reply is added to a topic. Many users find this useful to keep up to date on topics without the need to view the board to check for new messages.\r<br>\r<br>To do this, simply click on the \'Track This Topic\' link found at the top and bottom of any topic. When you click this link, the topic will be added to your subscriptions that are managed from your control panel.\r<br>\r<br>Please note that to avoid multiple emails being sent to your email address, you will only get notified once per day of new replies.', 'How to get emailed when a new reply is added to a topic.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (6, 'Your Personal Messenger', 'Your personal messenger acts much like an email account in that you can send and receive messages and store messages in folders.\r<br>\r<br><b>Send a new PM</b>\r<br>\r<br>This will allow you to send a message to another member. If you have names in your contact list, you can choose a name from it - or you may choose to enter a name in the relevant form field. This will be automatically filled in if you clicked a \'PM\' button on the board (from the memberlist or a post).\r<br>If the administrator allows, you may use BB Code and HTML in your private message. If you choose to check the \'Add a copy of this message to you sent items folder\' box, a copy of the message will be saved for you for later reference. If you check the \'Get notified when this message is read\' box, you will receive a PM informing you when the message was read for your records.\r<br>\r<br><b>Contact List</b>\r<br>\r<br>You may add in users names in this section, or edit any saved entries. You can also use this as a ban list, denying the named member the ability to message you.\r<br>Names entered in this section will appear in the drop down list when sending a new PM, allowing you to quickly choose the members name when sending a message.\r<br>\r<br><b>Edit Folders</b>\r<br>\r<br>You may rename, add or remove folders to store messages is, allowing you to organise your messages to your preference. You cannot remove \'Sent Items\' or \'Inbox\'.\r<br>\r<br><b>Go to Inbox</b>\r<br>\r<br>Your inbox is where all new messages are sent to. Clicking on the message title will show you the message in a similar format to the board topic view. You can also delete or move messages from your inbox.\r<br>\r<br><b>Archive Messages</b>\r<br>\r<br>If your messenger folders are full and you are unable to receive new messages, you can archive them off. This compiles the messages into a single HTML page or Microsoft &copy; Excel Format. This page is then emailed to your registered email address for your convenience.\r<br>\r<br>', 'How to send personal messages, edit your messenger folders and archive stored messages.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (7, 'Contacting the moderating team', 'If you need to contact a moderator or simply wish to view the complete administration team, you can click the link \'The moderating team\' found at the top of the main board page (the first page you see when visiting the board).\r<br>\r<br>This list will show you administrators (those who have administration control panel access), global moderators (those who can moderate in all forums) and the moderators of the individual forums.\r<br>\r<br>If you wish to contact someone about your member account, then contact an administrator - if you wish to contact someone about a post or topic, contact either a global moderator or the forum moderator.', 'Where to find a list of the board moderators and administrators.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (8, 'Viewing members profile information', 'You can view a members profile at any time by clicking on their name when it is underlined (as a link) or by clicking on their name in a post within a topic.\r<br>\r<br>This will show you their profile page which contains their contact information (if they have entered some) and their \'active stats\'.', 'How to view members contact information.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (9, 'Viewing todays active topics', 'You can view which new topics have new replies today by clicking on the \'Todays Active Topics\' link found on the main board page (the first page you see when visiting the board).\r<br>\r<br>You can set your own date critera, choosing to view all topics with new replies during several date choices.', 'How to view all the topics which have a new reply today');
INSERT INTO ibf_faq (id, title, text, description) VALUES (10, 'Searching Topics and Posts', 'The search feature is designed to allow you to quickly find topics and posts that contain the keywords you enter.\r<br>\r<br>The \'Simple Search\' option from the drop down box allows you to enter a single keyword or phrase to search by - the advanced option allows you to join keywords with \'AND\', \'OR\' to fine tune the search. Using this option will make the search slightly slower.\r<br>\r<br>The bottom section of the form allows you to further fine tune the search. You can choose a category to search in, or a forum - or choose all forums to search in.\r<br>\r<br>If you enter a name into the \'Search by member name\' section, all posts started or replied in by this member are returned.', 'How to use the search feature.');
INSERT INTO ibf_faq (id, title, text, description) VALUES (11, 'Logging in and out', 'If you have chosen not to remember your log in details in cookies, or you are accessing the board on another computer, you will need to log into the board to access your member profile and post with your registered name.\r<br>\r<br>When you log in, you have the choice to save cookies that will log you in automatically when you return. Do not use this option on a shared computer for security.\r<br>\r<br>You can also choose to hide - this will keep your name from appearing in the active users list.\r<br>\r<br>Logging out is simply a matter of clicking on the \'Log Out\' link that is displayed when you are logged in. If you find that you are not logged out, you may need to manually remove your cookies. See the \'Cookies\' help file for more information.', 'How to log in and out from the board and how to remain anonymous and not be shown on the active users list.');
INSERT INTO ibf_forums (id, topics, posts, last_post, last_poster_id, last_poster_name, name, description, position, use_ibc, use_html, status, start_perms, reply_perms, read_perms, password, category, last_title, last_id, sort_key, sort_order, prune, show_rules, upload_perms, preview_posts, allow_poll, allow_pollbump, inc_postcount, skin_id, parent_id, subwrap, sub_can_post) VALUES (1, 1, 1, 0, 1, 'Invision Board Team', 'A Test Forum', 'A test forum that may be removed at any time', 1, 1, 0, '1', '*', '*', '*', '', 1, 'Welcome', 1, 'last_post', 'Z-A', 30, 0, '', 0, 0, 0, 1, NULL, -1, 0, 1);
INSERT INTO ibf_groups (g_id, g_view_board, g_mem_info, g_other_topics, g_use_search, g_email_friend, g_invite_friend, g_edit_profile, g_post_new_topics, g_reply_own_topics, g_reply_other_topics, g_edit_posts, g_delete_own_posts, g_open_close_posts, g_delete_own_topics, g_post_polls, g_vote_polls, g_use_pm, g_is_supmod, g_access_cp, g_title, g_can_remove, g_append_edit, g_access_offline, g_avoid_q, g_avoid_flood, g_icon, g_attach_max, g_avatar_upload, g_calendar_post, prefix, suffix, g_max_messages, g_max_mass_pm, g_search_flood, g_edit_cutoff, g_promotion, g_hide_from_list) VALUES (4, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 'Admin', 0, 1, 1, 1, 1, '', 50000, 1, 1, '', '', 50, 6, 0, 5, '-1&-1', 0);
INSERT INTO ibf_groups (g_id, g_view_board, g_mem_info, g_other_topics, g_use_search, g_email_friend, g_invite_friend, g_edit_profile, g_post_new_topics, g_reply_own_topics, g_reply_other_topics, g_edit_posts, g_delete_own_posts, g_open_close_posts, g_delete_own_topics, g_post_polls, g_vote_polls, g_use_pm, g_is_supmod, g_access_cp, g_title, g_can_remove, g_append_edit, g_access_offline, g_avoid_q, g_avoid_flood, g_icon, g_attach_max, g_avatar_upload, g_calendar_post, prefix, suffix, g_max_messages, g_max_mass_pm, g_search_flood, g_edit_cutoff, g_promotion, g_hide_from_list) VALUES (2, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, 'Guests', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, NULL, NULL, 50, 0, 20, 0, '-1&-1', 0);
INSERT INTO ibf_groups (g_id, g_view_board, g_mem_info, g_other_topics, g_use_search, g_email_friend, g_invite_friend, g_edit_profile, g_post_new_topics, g_reply_own_topics, g_reply_other_topics, g_edit_posts, g_delete_own_posts, g_open_close_posts, g_delete_own_topics, g_post_polls, g_vote_polls, g_use_pm, g_is_supmod, g_access_cp, g_title, g_can_remove, g_append_edit, g_access_offline, g_avoid_q, g_avoid_flood, g_icon, g_attach_max, g_avatar_upload, g_calendar_post, prefix, suffix, g_max_messages, g_max_mass_pm, g_search_flood, g_edit_cutoff, g_promotion, g_hide_from_list) VALUES (3, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 'Members', 0, 1, 0, 0, 0, '', 0, 1, 0, '', '', 50, 0, 20, 0, '-1&-1', 0);
INSERT INTO ibf_groups (g_id, g_view_board, g_mem_info, g_other_topics, g_use_search, g_email_friend, g_invite_friend, g_edit_profile, g_post_new_topics, g_reply_own_topics, g_reply_other_topics, g_edit_posts, g_delete_own_posts, g_open_close_posts, g_delete_own_topics, g_post_polls, g_vote_polls, g_use_pm, g_is_supmod, g_access_cp, g_title, g_can_remove, g_append_edit, g_access_offline, g_avoid_q, g_avoid_flood, g_icon, g_attach_max, g_avatar_upload, g_calendar_post, prefix, suffix, g_max_messages, g_max_mass_pm, g_search_flood, g_edit_cutoff, g_promotion, g_hide_from_list) VALUES (1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Validating', 0, 1, 0, 0, 0, NULL, 0, 0, 0, NULL, NULL, 50, 0, 20, 0, '-1&-1', 0);
INSERT INTO ibf_groups (g_id, g_view_board, g_mem_info, g_other_topics, g_use_search, g_email_friend, g_invite_friend, g_edit_profile, g_post_new_topics, g_reply_own_topics, g_reply_other_topics, g_edit_posts, g_delete_own_posts, g_open_close_posts, g_delete_own_topics, g_post_polls, g_vote_polls, g_use_pm, g_is_supmod, g_access_cp, g_title, g_can_remove, g_append_edit, g_access_offline, g_avoid_q, g_avoid_flood, g_icon, g_attach_max, g_avatar_upload, g_calendar_post, prefix, suffix, g_max_messages, g_max_mass_pm, g_search_flood, g_edit_cutoff, g_promotion, g_hide_from_list) VALUES (5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'Banned', 0, 0, 0, 0, 0, NULL, NULL, 0, 0, NULL, NULL, 50, 0, 20, 0, '-1&-1', 1);
INSERT INTO ibf_languages (lid, ldir, lname, lauthor, lemail) VALUES (1, 'en', 'English', 'Invision Board', 'languages@invisionboard.com');
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (1, 'A_LOCKED_B', '<img src=\'style_images/<#IMG_DIR#>/t_closed.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (2, 'A_MOVED_B', '<img src=\'style_images/<#IMG_DIR#>/t_moved.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (4, 'A_POLLONLY_B', '<img src=\'style_images/<#IMG_DIR#>/t_closed.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (5, 'A_POST', '<img src=\'style_images/<#IMG_DIR#>/t_new.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (6, 'A_REPLY', '<img src=\'style_images/<#IMG_DIR#>/t_reply.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (7, 'A_STAR', '<img src=\'style_images/<#IMG_DIR#>/pip.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (8, 'B_HOT', '<img src=\'style_images/<#IMG_DIR#>/f_hot.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (9, 'B_HOT_NN', '<img src=\'style_images/<#IMG_DIR#>/f_hot_no.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (10, 'B_LOCKED', '<img src=\'style_images/<#IMG_DIR#>/f_closed.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (11, 'B_MOVED', '<img src=\'style_images/<#IMG_DIR#>/f_moved.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (12, 'B_NEW', '<img src=\'style_images/<#IMG_DIR#>/f_norm.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (13, 'B_NORM', '<img src=\'style_images/<#IMG_DIR#>/f_norm_no.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (14, 'B_PIN', '<img src=\'style_images/<#IMG_DIR#>/f_pinned.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (15, 'B_POLL', '<img src=\'style_images/<#IMG_DIR#>/f_poll.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (16, 'B_POLL_NN', '<img src=\'style_images/<#IMG_DIR#>/f_poll_no.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (17, 'C_LOCKED', '<img src=\'style_images/<#IMG_DIR#>/bf_readonly.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (18, 'C_OFF', '<img src=\'style_images/<#IMG_DIR#>/bf_nonew.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (19, 'C_OFF_CAT', '<img src=\'style_images/<#IMG_DIR#>/bc_nonew.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (20, 'C_OFF_RES', '<img src=\'style_images/<#IMG_DIR#>/br_nonew.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (21, 'C_ON', '<img src=\'style_images/<#IMG_DIR#>/bf_new.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (22, 'C_ON_CAT', '<img src=\'style_images/<#IMG_DIR#>/bc_new.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (23, 'C_ON_RES', '<img src=\'style_images/<#IMG_DIR#>/br_new.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (24, 'F_ACTIVE', '<img src=\'style_images/<#IMG_DIR#>/user.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (25, 'F_NAV_SEP', ' ->', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (26, 'F_NAV', '<img src=\'style_images/<#IMG_DIR#>/nav.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (27, 'F_STATS', '<img src=\'style_images/<#IMG_DIR#>/stats.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (28, 'GO_LAST_ON', '', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (29, 'GO_LAST_OFF', '', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (30, 'M_ADDMEM', '<img src=\'style_images/<#IMG_DIR#>/msg_l_addmem.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (31, 'M_DELETE', '<img src=\'style_images/<#IMG_DIR#>/msg_l_delete.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (32, 'M_READ', '<img src=\'style_images/<#IMG_DIR#>/f_norm_no.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (33, 'M_REPLY', '<img src=\'style_images/<#IMG_DIR#>/msg_l_reply.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (34, 'M_UNREAD', '<img src=\'style_images/<#IMG_DIR#>/f_norm.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (35, 'P_AOL', '<img src=\'style_images/<#IMG_DIR#>/p_aim.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (36, 'P_DELETE', '<img src=\'style_images/<#IMG_DIR#>/p_delete.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (37, 'P_EDIT', '<img src=\'style_images/<#IMG_DIR#>/p_edit.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (38, 'P_EMAIL', '<img src=\'style_images/<#IMG_DIR#>/p_email.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (39, 'P_ICQ', '<img src=\'style_images/<#IMG_DIR#>/p_icq.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (40, 'P_MSG', '<img src=\'style_images/<#IMG_DIR#>/p_pm.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (41, 'P_PROFILE', '[ Profile ]', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (42, 'P_QUOTE', '<img src=\'style_images/<#IMG_DIR#>/p_quote.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (43, 'P_WEBSITE', '<img src=\'style_images/<#IMG_DIR#>/p_www.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (44, 'CAT_IMG', '<img src=\'style_images/<#IMG_DIR#>/nav_m.gif\' border=\'0\' alt=\'\' width=\'8\' height=\'8\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (45, 'B_HOT_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_hot_dot.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (46, 'B_NEW_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_norm_dot.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (47, 'B_HOT_NN_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_hot_no_dot.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (48, 'B_NORM_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_norm_no_dot.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (49, 'B_POLL_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_poll_dot.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (50, 'B_POLL_NN_DOT', '<img src=\'style_images/<#IMG_DIR#>/f_poll_no_dot.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (51, 'NEW_POST', '<img src=\'style_images/<#IMG_DIR#>/newpost.gif\' border=\'0\' alt=\'Goto last unread\' title=\'Goto last unread\' hspace=2>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (52, 'tbl_width', '95%', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (53, 'tbl_border', '#345487', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (55, 'P_YIM', '<img src=\'style_images/<#IMG_DIR#>/p_yim.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro (macro_id, macro_value, macro_replace, can_remove, macro_set) VALUES (56, 'P_MSN', '<img src=\'style_images/<#IMG_DIR#>/p_msn.gif\' border=\'0\' alt=\'\'>', 0, 1);
INSERT INTO ibf_macro_name (set_id, set_name) VALUES (1, 'IBF Default Macro Set');
INSERT INTO ibf_members (id, name, mgroup, password, email, joined, ip_address, avatar, avatar_size, posts, aim_name, icq_number, location, signature, website, yahoo, title, allow_admin_mails, time_offset, interests, hide_email, email_pm, email_full, skin, warn_level, language, msnname, last_post, allow_post, view_sigs, view_img, view_avs, view_pop, bday_day, bday_month, bday_year, new_msg, msg_from_id, msg_msg_id, msg_total, vdirs, show_popup, validate_key, prev_group, new_pass, misc, last_visit, last_activity, dst_in_use, view_prefs, coppa_user, mod_posts, auto_track) VALUES (0, 'Guest', 2, '', 'guest@ibforums.com', 0, '', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 1, 1, 1, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, '0', 0, 0, 0, '-1&-1', 0, 0, 0);
INSERT INTO ibf_posts (append_edit, edit_time, pid, author_id, author_name, use_sig, use_emo, ip_address, post_date, icon_id, post, queued, topic_id, forum_id, attach_id, attach_hits, attach_type, attach_file, post_title, new_topic, edit_name) VALUES (0, NULL, 1, 1, 'Invision Board Team', '1', '1', '127.0.0.1', 0, 0, 'Welcome to your new Invision Board!<br>This is simply a test message confirming that the installation was successful.<br>You can remove this message, topic, forum or even category at any time.', 0, 1, 1, '', 0, '', '', NULL, 1, NULL);
INSERT INTO ibf_skins (uid, sname, sid, set_id, tmpl_id, macro_id, css_id, img_dir, tbl_width, tbl_border, hidden, default_set) VALUES (1, 'Invision Board', 0, 1, 1, 1, 1, '1', '95%', '#999999', 0, 1);
INSERT INTO ibf_stats (TOTAL_REPLIES, TOTAL_TOPICS, LAST_MEM_NAME, LAST_MEM_ID, MOST_DATE, MOST_COUNT, MEM_COUNT) VALUES (0, 1, '', '1', 0, 1, 1);
INSERT INTO ibf_templates (tmid, template, name) VALUES (1, '<html> <head> <title> <% TITLE %> </title> <% GENERATOR %> <% CSS %> <% JAVASCRIPT %> </head><body bgcolor=\'#FFFFFF\' leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" alink=\'#000000\' vlink=\'#000000\'><% BOARD HEADER %><% NAVIGATION %><% BOARD %><% STATS %><% COPYRIGHT %></body></html>', 'Invision Board Standard');
INSERT INTO ibf_titles (id, posts, title, pips) VALUES (1, 0, 'Newbie', '1');
INSERT INTO ibf_titles (id, posts, title, pips) VALUES (2, 10, 'Member', '2');
INSERT INTO ibf_titles (id, posts, title, pips) VALUES (4, 30, 'Advanced Member', '3');
INSERT INTO ibf_tmpl_names (skid, skname, author, email, url) VALUES (1, 'Invision Board Template Set', 'Invision Board', 'skins@invisionboard.com', 'http://www.invisionboard.com');
INSERT INTO ibf_topics (tid, title, description, state, posts, starter_id, start_date, last_poster_id, last_post, icon_id, starter_name, last_poster_name, poll_state, last_vote, views, forum_id, approved, author_mode, pinned, moved_to, rating, total_votes) VALUES (1, 'Welcome', '', 'open', 0, '0', 0, '0', 0, 0, 'Invision Board Team', 'Invision Board Team', '0', 0, 0, 1, 1, 0, 0, NULL, NULL, 0);
-760
View File
@@ -1,760 +0,0 @@
CREATE TABLE ibf_admin_logs (
id bigint(20) NOT NULL auto_increment,
act varchar(255) default NULL,
code varchar(255) default NULL,
member_id int(10) default NULL,
ctime int(10) default NULL,
note text,
ip_address varchar(255) default NULL,
PRIMARY KEY (id)
);
CREATE TABLE ibf_admin_sessions (
ID varchar(32) NOT NULL default '',
IP_ADDRESS varchar(32) NOT NULL default '',
MEMBER_NAME varchar(32) NOT NULL default '',
MEMBER_ID varchar(32) NOT NULL default '',
SESSION_KEY varchar(32) NOT NULL default '',
LOCATION varchar(64) default 'index',
LOG_IN_TIME int(10) NOT NULL default '0',
RUNNING_TIME int(10) NOT NULL default '0',
PRIMARY KEY (ID)
);
CREATE TABLE ibf_badwords (
wid int(3) NOT NULL auto_increment,
type varchar(250) NOT NULL default '',
swop varchar(250) default NULL,
m_exact tinyint(1) default '0',
PRIMARY KEY (wid)
);
CREATE TABLE ibf_cache_store (
cs_key varchar(255) NOT NULL default '',
cs_value text NOT NULL,
cs_extra varchar(255) NOT NULL default '',
PRIMARY KEY (cs_key)
);
CREATE TABLE ibf_calendar_events (
eventid mediumint(8) NOT NULL auto_increment,
userid mediumint(8) NOT NULL default '0',
year int(4) NOT NULL default '2002',
month int(2) NOT NULL default '1',
mday int(2) NOT NULL default '1',
title varchar(254) NOT NULL default 'no title',
event_text text NOT NULL,
read_perms varchar(254) NOT NULL default '*',
unix_stamp int(10) NOT NULL default '0',
priv_event tinyint(1) NOT NULL default '0',
show_emoticons tinyint(1) NOT NULL default '1',
rating smallint(2) NOT NULL default '1',
event_ranged tinyint(1) NOT NULL default '0',
event_repeat tinyint(1) NOT NULL default '0',
repeat_unit char(2) NOT NULL default '',
end_day int(2) default NULL,
end_month int(2) default NULL,
end_year int(4) default NULL,
end_unix_stamp int(10) default NULL,
event_bgcolor varchar(32) NOT NULL default '',
event_color varchar(32) NOT NULL default '',
PRIMARY KEY (eventid),
KEY unix_stamp (unix_stamp)
);
CREATE TABLE ibf_categories (
id smallint(5) NOT NULL default '0',
position tinyint(3) default NULL,
state varchar(10) default NULL,
name varchar(128) NOT NULL default '',
description text,
image varchar(128) default NULL,
url varchar(128) default NULL,
PRIMARY KEY (id),
KEY id (id)
);
CREATE TABLE ibf_contacts (
id mediumint(8) NOT NULL auto_increment,
contact_id mediumint(8) NOT NULL default '0',
member_id mediumint(8) NOT NULL default '0',
contact_name varchar(32) NOT NULL default '',
allow_msg tinyint(1) default NULL,
contact_desc varchar(50) default NULL,
PRIMARY KEY (id)
);
CREATE TABLE ibf_css (
cssid int(10) NOT NULL auto_increment,
css_name varchar(128) NOT NULL default '',
css_text text,
css_comments text,
updated int(10) default '0',
PRIMARY KEY (cssid)
);
CREATE TABLE ibf_email_logs (
email_id int(10) NOT NULL auto_increment,
email_subject varchar(255) NOT NULL default '',
email_content text NOT NULL,
email_date int(10) NOT NULL default '0',
from_member_id mediumint(8) NOT NULL default '0',
from_email_address varchar(250) NOT NULL default '',
from_ip_address varchar(16) NOT NULL default '127.0.0.1',
to_member_id mediumint(8) NOT NULL default '0',
to_email_address varchar(250) NOT NULL default '',
topic_id int(10) NOT NULL default '0',
PRIMARY KEY (email_id),
KEY from_member_id (from_member_id),
KEY email_date (email_date)
);
CREATE TABLE ibf_emoticons (
id smallint(3) NOT NULL auto_increment,
typed varchar(32) NOT NULL default '',
image varchar(128) NOT NULL default '',
clickable smallint(2) NOT NULL default '1',
PRIMARY KEY (id)
);
CREATE TABLE ibf_faq (
id mediumint(8) NOT NULL auto_increment,
title varchar(128) NOT NULL default '',
text text,
description text NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE ibf_forum_perms (
perm_id int(10) NOT NULL auto_increment,
perm_name varchar(250) NOT NULL default '',
PRIMARY KEY (perm_id)
);
CREATE TABLE ibf_forum_tracker (
frid mediumint(8) NOT NULL auto_increment,
member_id varchar(32) NOT NULL default '',
forum_id smallint(5) NOT NULL default '0',
start_date int(10) default NULL,
last_sent int(10) NOT NULL default '0',
PRIMARY KEY (frid)
);
CREATE TABLE ibf_forums (
id smallint(5) NOT NULL default '0',
topics mediumint(6) default NULL,
posts mediumint(6) default NULL,
last_post int(10) default NULL,
last_poster_id mediumint(8) NOT NULL default '0',
last_poster_name varchar(32) default NULL,
name varchar(128) NOT NULL default '',
description text,
position tinyint(2) default NULL,
use_ibc tinyint(1) default NULL,
use_html tinyint(1) default NULL,
status varchar(10) default NULL,
start_perms varchar(255) NOT NULL default '',
reply_perms varchar(255) NOT NULL default '',
read_perms varchar(255) NOT NULL default '',
password varchar(32) default NULL,
category tinyint(2) NOT NULL default '0',
last_title varchar(128) default NULL,
last_id int(10) default NULL,
sort_key varchar(32) default NULL,
sort_order varchar(32) default NULL,
prune tinyint(3) default NULL,
show_rules tinyint(1) default NULL,
upload_perms varchar(255) default NULL,
preview_posts tinyint(1) default NULL,
allow_poll tinyint(1) NOT NULL default '1',
allow_pollbump tinyint(1) NOT NULL default '0',
inc_postcount tinyint(1) NOT NULL default '1',
skin_id int(10) default NULL,
parent_id mediumint(5) default '-1',
subwrap tinyint(1) default '0',
sub_can_post tinyint(1) default '1',
quick_reply tinyint(1) default '0',
redirect_url varchar(250) default '',
redirect_on tinyint(1) NOT NULL default '0',
redirect_hits int(10) NOT NULL default '0',
redirect_loc varchar(250) default '',
rules_title varchar(255) NOT NULL default '',
rules_text text NOT NULL,
has_mod_posts tinyint(1) NOT NULL default '0',
topic_mm_id varchar(250) NOT NULL default '',
notify_modq_emails text default '',
PRIMARY KEY (id),
KEY category (category),
KEY id (id)
);
CREATE TABLE ibf_groups (
g_id int(3) unsigned NOT NULL auto_increment,
g_view_board tinyint(1) default NULL,
g_mem_info tinyint(1) default NULL,
g_other_topics tinyint(1) default NULL,
g_use_search tinyint(1) default NULL,
g_email_friend tinyint(1) default NULL,
g_invite_friend tinyint(1) default NULL,
g_edit_profile tinyint(1) default NULL,
g_post_new_topics tinyint(1) default NULL,
g_reply_own_topics tinyint(1) default NULL,
g_reply_other_topics tinyint(1) default NULL,
g_edit_posts tinyint(1) default NULL,
g_delete_own_posts tinyint(1) default NULL,
g_open_close_posts tinyint(1) default NULL,
g_delete_own_topics tinyint(1) default NULL,
g_post_polls tinyint(1) default NULL,
g_vote_polls tinyint(1) default NULL,
g_use_pm tinyint(1) default NULL,
g_is_supmod tinyint(1) default NULL,
g_access_cp tinyint(1) default NULL,
g_title varchar(32) NOT NULL default '',
g_can_remove tinyint(1) default NULL,
g_append_edit tinyint(1) default NULL,
g_access_offline tinyint(1) default NULL,
g_avoid_q tinyint(1) default NULL,
g_avoid_flood tinyint(1) default NULL,
g_icon varchar(64) default NULL,
g_attach_max bigint(20) default NULL,
g_avatar_upload tinyint(1) default '0',
g_calendar_post tinyint(1) default '0',
prefix varchar(250) default NULL,
suffix varchar(250) default NULL,
g_max_messages int(5) default '50',
g_max_mass_pm int(5) default '0',
g_search_flood mediumint(6) default '20',
g_edit_cutoff int(10) default '0',
g_promotion varchar(10) default '-1&-1',
g_hide_from_list tinyint(1) default '0',
g_post_closed tinyint(1) default '0',
g_perm_id varchar(255) NOT NULL default '',
g_photo_max_vars varchar(200) default '',
g_dohtml tinyint(1) NOT NULL default '0',
g_edit_topic tinyint(1) NOT NULL default '0',
g_email_limit varchar(15) NOT NULL default '10:15',
PRIMARY KEY (g_id)
);
CREATE TABLE ibf_languages (
lid mediumint(8) NOT NULL auto_increment,
ldir varchar(64) NOT NULL default '',
lname varchar(250) NOT NULL default '',
lauthor varchar(250) default NULL,
lemail varchar(250) default NULL,
PRIMARY KEY (lid)
);
CREATE TABLE ibf_macro (
macro_id smallint(3) NOT NULL auto_increment,
macro_value varchar(200) default NULL,
macro_replace text,
can_remove tinyint(1) default '0',
macro_set smallint(3) default NULL,
PRIMARY KEY (macro_id),
KEY macro_set (macro_set)
);
CREATE TABLE ibf_macro_name (
set_id smallint(3) NOT NULL default '0',
set_name varchar(200) default NULL,
PRIMARY KEY (set_id)
);
CREATE TABLE ibf_member_extra (
id mediumint(8) NOT NULL default '0',
notes text,
links text,
bio text,
ta_size char(3) default NULL,
photo_type varchar(10) default '',
photo_location varchar(255) default '',
photo_dimensions varchar(200) default '',
PRIMARY KEY (id)
);
CREATE TABLE ibf_members (
id mediumint(8) NOT NULL default '0',
name varchar(255) NOT NULL default '',
mgroup smallint(3) NOT NULL default '0',
password varchar(32) NOT NULL default '',
email varchar(60) NOT NULL default '',
joined int(10) NOT NULL default '0',
ip_address varchar(16) NOT NULL default '',
avatar varchar(128) default NULL,
avatar_size varchar(9) default NULL,
posts mediumint(7) default '0',
aim_name varchar(40) default NULL,
icq_number varchar(40) default NULL,
location varchar(128) default NULL,
signature text,
website varchar(70) default NULL,
yahoo varchar(32) default NULL,
title varchar(64) default NULL,
allow_admin_mails tinyint(1) default NULL,
time_offset varchar(10) default NULL,
interests text,
hide_email varchar(8) default NULL,
email_pm tinyint(1) default NULL,
email_full tinyint(1) default NULL,
skin smallint(5) default NULL,
warn_level int(10) default NULL,
warn_lastwarn int(10) NOT NULL default '0',
language varchar(32) default NULL,
msnname varchar(64) default NULL,
last_post int(10) default NULL,
restrict_post varchar(100) NOT NULL default '0',
view_sigs tinyint(1) default '1',
view_img tinyint(1) default '1',
view_avs tinyint(1) default '1',
view_pop tinyint(1) default '1',
bday_day int(2) default NULL,
bday_month int(2) default NULL,
bday_year int(4) default NULL,
new_msg tinyint(2) default NULL,
msg_from_id mediumint(8) default NULL,
msg_msg_id int(10) default NULL,
msg_total smallint(5) default NULL,
vdirs text,
show_popup tinyint(1) default NULL,
misc varchar(128) default NULL,
last_visit int(10) default '0',
last_activity int(10) default '0',
dst_in_use tinyint(1) default '0',
view_prefs varchar(64) default '-1&-1',
coppa_user tinyint(1) default '0',
mod_posts varchar(100) NOT NULL default '0',
auto_track tinyint(1) default '0',
org_perm_id varchar(255) default '',
org_supmod tinyint(1) default '0',
integ_msg varchar(250) default '',
temp_ban varchar(100) default NULL,
sub_end int(10) NOT NULL default '0',
PRIMARY KEY (id),
KEY name (name),
KEY mgroup (mgroup),
KEY bday_day (bday_day),
KEY bday_month (bday_month)
);
CREATE TABLE ibf_messages (
msg_id int(10) NOT NULL auto_increment,
msg_date int(10) default NULL,
read_state tinyint(1) default NULL,
title varchar(128) default NULL,
message text,
from_id mediumint(8) NOT NULL default '0',
vid varchar(32) default NULL,
member_id mediumint(8) NOT NULL default '0',
recipient_id mediumint(8) NOT NULL default '0',
attach_type tinyint(128) default NULL,
attach_file tinyint(128) default NULL,
cc_users text,
tracking tinyint(1) default '0',
read_date int(10) default NULL,
PRIMARY KEY (msg_id),
KEY member_id (member_id),
KEY vid (vid)
);
CREATE TABLE ibf_moderator_logs (
id int(10) NOT NULL auto_increment,
forum_id int(5) default '0',
topic_id int(10) NOT NULL default '0',
post_id int(10) default NULL,
member_id mediumint(8) NOT NULL default '0',
member_name varchar(32) NOT NULL default '',
ip_address varchar(16) NOT NULL default '0',
http_referer varchar(255) default NULL,
ctime int(10) default NULL,
topic_title varchar(128) default NULL,
action varchar(128) default NULL,
query_string varchar(128) default NULL,
PRIMARY KEY (id)
);
CREATE TABLE ibf_moderators (
mid mediumint(8) NOT NULL auto_increment,
forum_id int(5) NOT NULL default '0',
member_name varchar(32) NOT NULL default '',
member_id mediumint(8) NOT NULL default '0',
edit_post tinyint(1) default NULL,
edit_topic tinyint(1) default NULL,
delete_post tinyint(1) default NULL,
delete_topic tinyint(1) default NULL,
view_ip tinyint(1) default NULL,
open_topic tinyint(1) default NULL,
close_topic tinyint(1) default NULL,
mass_move tinyint(1) default NULL,
mass_prune tinyint(1) default NULL,
move_topic tinyint(1) default NULL,
pin_topic tinyint(1) default NULL,
unpin_topic tinyint(1) default NULL,
post_q tinyint(1) default NULL,
topic_q tinyint(1) default NULL,
allow_warn tinyint(1) default NULL,
edit_user tinyint(1) NOT NULL default '0',
is_group tinyint(1) default '0',
group_id smallint(3) default NULL,
group_name varchar(200) default NULL,
split_merge tinyint(1) default '0',
can_mm tinyint(1) NOT NULL default '0',
PRIMARY KEY (mid),
KEY forum_id (forum_id),
KEY group_id (group_id),
KEY member_id (member_id)
);
CREATE TABLE ibf_pfields_content (
member_id mediumint(8) NOT NULL default '0',
updated int(10) default '0',
PRIMARY KEY (member_id)
);
CREATE TABLE ibf_pfields_data (
fid smallint(5) NOT NULL auto_increment,
ftitle varchar(200) NOT NULL default '',
fdesc varchar(250) default '',
fcontent text,
ftype varchar(250) default 'text',
freq tinyint(1) default '0',
fhide tinyint(1) default '0',
fmaxinput smallint(6) default '250',
fedit tinyint(1) default '1',
forder smallint(6) default '1',
fshowreg tinyint(1) default '0',
PRIMARY KEY (fid)
);
CREATE TABLE ibf_polls (
pid mediumint(8) NOT NULL auto_increment,
tid int(10) NOT NULL default '0',
start_date int(10) default NULL,
choices text,
starter_id mediumint(8) NOT NULL default '0',
votes smallint(5) NOT NULL default '0',
forum_id smallint(5) NOT NULL default '0',
poll_question varchar(255) default NULL,
PRIMARY KEY (pid)
);
CREATE TABLE ibf_posts (
pid int(10) NOT NULL auto_increment,
append_edit tinyint(1) default '0',
edit_time int(10) default NULL,
author_id mediumint(8) NOT NULL default '0',
author_name varchar(32) default NULL,
use_sig tinyint(1) NOT NULL default '0',
use_emo tinyint(1) NOT NULL default '0',
ip_address varchar(16) NOT NULL default '',
post_date int(10) default NULL,
icon_id smallint(3) default NULL,
post text,
queued tinyint(1) default NULL,
topic_id int(10) NOT NULL default '0',
forum_id smallint(5) NOT NULL default '0',
attach_id varchar(64) default NULL,
attach_hits int(10) default NULL,
attach_type varchar(128) default NULL,
attach_file varchar(255) default NULL,
post_title varchar(255) default NULL,
new_topic tinyint(1) default '0',
edit_name varchar(255) default NULL,
PRIMARY KEY (pid),
KEY topic_id (topic_id,author_id),
KEY author_id (author_id),
KEY forum_id (forum_id,post_date),
FULLTEXT KEY post (post)
);
CREATE TABLE ibf_reg_antispam (
regid varchar(32) NOT NULL default '',
regcode varchar(8) NOT NULL default '',
ip_address varchar(32) default NULL,
ctime int(10) default NULL,
PRIMARY KEY (regid)
);
CREATE TABLE ibf_search_results (
id varchar(32) NOT NULL default '',
topic_id text NOT NULL,
search_date int(12) NOT NULL default '0',
topic_max int(3) NOT NULL default '0',
sort_key varchar(32) NOT NULL default 'last_post',
sort_order varchar(4) NOT NULL default 'desc',
member_id mediumint(10) default '0',
ip_address varchar(64) default NULL,
post_id text,
post_max int(10) NOT NULL default '0',
query_cache text
);
CREATE TABLE ibf_sessions (
id varchar(32) NOT NULL default '0',
member_name varchar(64) default NULL,
member_id mediumint(8) NOT NULL default '0',
ip_address varchar(16) default NULL,
browser varchar(64) default NULL,
running_time int(10) default NULL,
login_type tinyint(1) default NULL,
location varchar(40) default NULL,
member_group smallint(3) default NULL,
in_forum smallint(5) NOT NULL default '0',
in_topic int(10) default NULL,
PRIMARY KEY (id),
KEY in_topic (in_topic),
KEY in_forum (in_forum)
);
CREATE TABLE ibf_skin_templates (
suid int(10) NOT NULL auto_increment,
set_id int(10) NOT NULL default '0',
group_name varchar(255) NOT NULL default '',
section_content mediumtext,
func_name varchar(255) default NULL,
func_data text,
updated int(10) default NULL,
can_remove tinyint(4) default '0',
PRIMARY KEY (suid)
);
CREATE TABLE ibf_skins (
uid int(10) NOT NULL auto_increment,
sname varchar(100) NOT NULL default '',
sid int(10) NOT NULL default '0',
set_id int(5) NOT NULL default '0',
tmpl_id int(10) NOT NULL default '0',
macro_id int(10) NOT NULL default '1',
css_id int(10) NOT NULL default '1',
img_dir varchar(200) default '1',
tbl_width varchar(250) default NULL,
tbl_border varchar(250) default NULL,
hidden tinyint(1) NOT NULL default '0',
default_set tinyint(1) NOT NULL default '0',
css_method varchar(100) default 'inline',
PRIMARY KEY (uid),
KEY tmpl_id (tmpl_id),
KEY css_id (css_id)
);
CREATE TABLE ibf_spider_logs (
sid int(10) NOT NULL auto_increment,
bot varchar(255) NOT NULL default '',
query_string text NOT NULL,
entry_date int(10) NOT NULL default '0',
ip_address varchar(16) NOT NULL default '',
PRIMARY KEY (sid)
);
CREATE TABLE ibf_stats (
TOTAL_REPLIES int(10) NOT NULL default '0',
TOTAL_TOPICS int(10) NOT NULL default '0',
LAST_MEM_NAME varchar(32) default NULL,
LAST_MEM_ID mediumint(8) NOT NULL default '0',
MOST_DATE int(10) default NULL,
MOST_COUNT int(10) default '0',
MEM_COUNT mediumint(8) NOT NULL default '0'
);
CREATE TABLE ibf_subscriptions (
sub_id smallint(5) NOT NULL auto_increment,
sub_title varchar(250) NOT NULL default '',
sub_desc text,
sub_new_group mediumint(8) NOT NULL default 0,
sub_length smallint(5) NOT NULL default '1',
sub_unit varchar(2) NOT NULL default 'm',
sub_cost decimal(10,2) NOT NULL default '0.00',
sub_run_module varchar(250) NOT NULL default '',
PRIMARY KEY (sub_id)
) TYPE=MyISAM;
CREATE TABLE ibf_subscription_extra (
subextra_id smallint(5) NOT NULL auto_increment,
subextra_sub_id smallint(5) NOT NULL default '0',
subextra_method_id smallint(5) NOT NULL default '0',
subextra_product_id varchar(250) NOT NULL default '0',
subextra_can_upgrade tinyint(1) NOT NULL default '0',
subextra_recurring tinyint(1) NOT NULL default '0',
subextra_custom_1 text,
subextra_custom_2 text,
subextra_custom_3 text,
subextra_custom_4 text,
subextra_custom_5 text,
PRIMARY KEY(subextra_id)
) TYPE=MyISAM;
CREATE TABLE ibf_subscription_trans (
subtrans_id int(10) NOT NULL auto_increment,
subtrans_sub_id smallint(5) NOT NULL default '0',
subtrans_member_id mediumint(8) NOT NULL default '0',
subtrans_old_group smallint(5) NOT NULL default '0',
subtrans_paid decimal(10,2) NOT NULL default '0.00',
subtrans_cumulative decimal(10,2) NOT NULL default '0.00',
subtrans_method varchar(20) NOT NULL default '',
subtrans_start_date int(11) NOT NULL default '0',
subtrans_end_date int(11) NOT NULL default '0',
subtrans_state varchar(200) NOT NULL default '',
subtrans_trxid varchar(200) NOT NULL default '',
subtrans_subscrid varchar(200) NOT NULL default '',
subtrans_currency varchar(10) NOT NULL default 'USD',
PRIMARY KEY (subtrans_id)
) TYPE=MyISAM;
CREATE TABLE ibf_subscription_logs (
sublog_id int(10) NOT NULL auto_increment,
sublog_date int(10) NOT NULL default '',
sublog_member_id mediumint(8) NOT NULL default '0',
sublog_transid int(10) NOT NULL default '',
sublog_ipaddress varchar(16) NOT NULL default '',
sublog_data text,
sublog_postdata text,
PRIMARY KEY (sublog_id)
) TYPE=MyISAM;
CREATE TABLE ibf_subscription_methods (
submethod_id smallint(5) NOT NULL auto_increment,
submethod_title varchar(250) NOT NULL default '',
submethod_name varchar(20) NOT NULL default '',
submethod_email varchar(250) NOT NULL default '',
submethod_sid text,
submethod_custom_1 text,
submethod_custom_2 text,
submethod_custom_3 text,
subemthod_custom_4 text,
submethod_custom_5 text,
submethod_is_cc tinyint(1) NOT NULL default '0',
submethod_is_auto tinyint(1) NOT NULL default '0',
submethod_desc text,
submethod_logo text,
submethod_active tinyint(1) NOT NULL default '',
submethod_use_currency varchar(10) NOT NULL default 'USD',
PRIMARY KEY (submethod_id)
) TYPE=MyISAM;
CREATE TABLE ibf_subscription_currency (
subcurrency_code varchar(10) NOT NULL,
subcurrency_desc varchar(250) NOT NULL default '',
subcurrency_exchange decimal(10, 8) NOT NULL,
subcurrency_default tinyint(1) NOT NULL default '0',
PRIMARY KEY(subcurrency_code)
) TYPE=MyISAM;
CREATE TABLE ibf_templates (
tmid int(10) NOT NULL auto_increment,
template mediumtext,
name varchar(128) default NULL,
PRIMARY KEY (tmid)
);
CREATE TABLE ibf_titles (
id smallint(5) NOT NULL auto_increment,
posts int(10) default NULL,
title varchar(128) default NULL,
pips varchar(128) default NULL,
PRIMARY KEY (id)
);
CREATE TABLE ibf_tmpl_names (
skid int(10) NOT NULL auto_increment,
skname varchar(60) NOT NULL default 'Invision Board',
author varchar(250) default '',
email varchar(250) default '',
url varchar(250) default '',
PRIMARY KEY (skid)
);
CREATE TABLE ibf_topic_mmod (
mm_id smallint(5) NOT NULL auto_increment,
mm_title varchar(250) NOT NULL default '',
mm_enabled tinyint(1) NOT NULL default '0',
topic_state varchar(10) NOT NULL default 'leave',
topic_pin varchar(10) NOT NULL default 'leave',
topic_move smallint(5) NOT NULL default '0',
topic_move_link tinyint(1) NOT NULL default '0',
topic_title_st varchar(250) NOT NULL default '',
topic_title_end varchar(250) NOT NULL default '',
topic_reply tinyint(1) NOT NULL default '0',
topic_reply_content text NOT NULL,
topic_reply_postcount tinyint(1) NOT NULL default '0',
PRIMARY KEY (mm_id)
);
CREATE TABLE ibf_topics (
tid int(10) NOT NULL auto_increment,
title varchar(250) NOT NULL default '',
description varchar(70) default NULL,
state varchar(8) default NULL,
posts int(10) default NULL,
starter_id mediumint(8) NOT NULL default '0',
start_date int(10) default NULL,
last_poster_id mediumint(8) NOT NULL default '0',
last_post int(10) default NULL,
icon_id tinyint(2) default NULL,
starter_name varchar(32) default NULL,
last_poster_name varchar(32) default NULL,
poll_state varchar(8) default NULL,
last_vote int(10) default NULL,
views int(10) default NULL,
forum_id smallint(5) NOT NULL default '0',
approved tinyint(1) default NULL,
author_mode tinyint(1) default NULL,
pinned tinyint(1) default NULL,
moved_to varchar(64) default NULL,
rating text,
total_votes int(5) NOT NULL default '0',
PRIMARY KEY (tid),
KEY last_post (last_post),
KEY forum_id (forum_id,approved,pinned),
FULLTEXT KEY title (title)
);
CREATE TABLE ibf_tracker (
trid mediumint(8) NOT NULL auto_increment,
member_id mediumint(8) NOT NULL default '0',
topic_id bigint(20) NOT NULL default '0',
start_date int(10) default NULL,
last_sent int(10) NOT NULL default '0',
PRIMARY KEY (trid)
);
CREATE TABLE ibf_validating (
vid varchar(32) NOT NULL default '',
member_id mediumint(8) NOT NULL default '0',
real_group smallint(3) NOT NULL default '0',
temp_group smallint(3) NOT NULL default '0',
entry_date int(10) NOT NULL default '0',
coppa_user tinyint(1) NOT NULL default '0',
lost_pass tinyint(1) NOT NULL default '0',
new_reg tinyint(1) NOT NULL default '0',
email_chg tinyint(1) NOT NULL default '0',
ip_address varchar(16) NOT NULL default '0',
PRIMARY KEY (vid),
KEY new_reg (new_reg)
);
CREATE TABLE ibf_voters (
vid int(10) NOT NULL auto_increment,
ip_address varchar(16) NOT NULL default '',
vote_date int(10) NOT NULL default '0',
tid int(10) NOT NULL default '0',
member_id varchar(32) default NULL,
forum_id smallint(5) NOT NULL default '0',
PRIMARY KEY (vid)
);
CREATE TABLE ibf_warn_logs (
wlog_id int(10) NOT NULL auto_increment,
wlog_mid mediumint(8) NOT NULL default '0',
wlog_notes text NOT NULL,
wlog_contact varchar(250) NOT NULL default 'none',
wlog_contact_content text NOT NULL,
wlog_date int(10) NOT NULL default '0',
wlog_type varchar(6) NOT NULL default 'pos',
wlog_addedby mediumint(8) NOT NULL default '0',
PRIMARY KEY (wlog_id)
);
-112
View File
@@ -1,112 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!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" />
<title>Hivemail -&gt; IPB Set Up</title>
<style type='text/css'>
body
{
background-color:#FFF;
background-image: url(http://www.invisionboard.com/tutorial/hivemail/img/bg.jpg);
background-repeat: repeat-y;
padding: 0px;
margin: 10px;
font-family: verdana;
font-size:12px;
text-align:center;
}
table
{
font-family: verdana;
font-size:11px;
}
img { border:0px }
.headline { font-family:"Trebuchet MS", verdana, arial, sans-serif; font-size:40px;font-weight:bold }
.subline { font-family:"Trebuchet MS", verdana, arial, sans-serif; font-size:18px;color:#009 }
#wrapper { text-align:left; margin-left:auto;margin-right:auto;width:90% }
</style>
</head>
<body>
<div id="wrapper">
<span class="headline">Integrating HiveMail with IPB 1.2</span>
<br />
An Invision Power Board Guide detailing how to set up your HiveMail installation with IPB.
<br />
<br />
<span class="subline">Required Components</span>
<br /><br />
You should have already installed HiveMail (1.2+) into a directory called "mail" on your server, in the same root folder as the one
that contains your IPB forums folder.
<br /><br />
<b>An example structure</b>
<br />
/home/domain/public_html/mail/
<br />/home/domain/public_html/forums/
<br /><br />
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="left" width="95%" style="padding-right:6px" valign="top">
<span class="subline">Configuring the files</span>
<br /><br />
Before you go any further, you may need to edit one of the included IPB files.
<br /><br />If you are using HiveMail 1.2.1, they you <b>do not</b> need to edit any files.
<br /><br />If you are using any version previous to 1.2.1, then you'll need to open "invision_plugin.php" and change the arrowed line in the picture to: <kbd>define( 'HIVE_TBL', '' )</kbd> or you will receive errors!
</td>
<td align="center" width="5%" valign="top"><a href="http://www.invisionboard.com/tutorial/hivemail/img/hive_code.jpg" target="_blank"><img src="http://www.invisionboard.com/tutorial/hivemail/img/hive_code_thumb.jpg" alt="IMG" /></a><br />Click picture to enlarge</td>
</tr>
</table>
<br /><br />
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="left" width="95%" style="padding-right:6px" valign="top">
<span class="subline">Uploading the files</span>
<br /><br />
<b>Upload the following files</b>
<br /><br />Where "forums" is shown, this is your IPB installation, it does not have to be forums.
<br /><br />
<kbd>/forums/modules/ipb_member_sync.php
<br /><br />/forums/modules/mod_hivemail.php
<br /><br />/forums/register.php
<br /><br />/mail/includes/invision_plugin.php</kdb>
</td>
<td align="center" width="5%" valign="top"><a href="http://www.invisionboard.com/tutorial/hivemail/img/hive_dir.jpg" target="_blank"><img src="http://www.invisionboard.com/tutorial/hivemail/img/hive_dir_thumb.jpg" alt="IMG" /></a><br />Click picture to enlarge</td>
</tr>
</table>
<br /><br />
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="left" width="95%" style="padding-right:6px" valign="top">
<span class="subline">Configuring HiveMail</span>
<br /><br />
<b>Log into the HiveMail admin center</b>
<br />
<ul>
<li>Under "HiveMail" click on "Options" in the menu.
<li>When the options menu has loaded, click option 13 "vBulletin Integration"
<li>Complete the form in a similar way show by the screenshot, mentally substituting "vBulletin" for "IPB"
</ul>
<br />
If you enabled "Allow regular registration", your members can register for HiveMail outside of the board, if not enabled, clicking on the "Sign Up" button on the HiveMail index page
will take your visitor to the IPB registration page (with the option of HiveMail email). If you visitor is already registered and logged into IPB, they will be taken to a dedicated HiveMail signup page.
<br /><br />
<a href="http://www.invisionboard.com/tutorial/hivemail/img/hive_ipb_reg.jpg" target="_blank">Show IPB Reg Form Screen Shot</a> &middot; <a href="http://www.invisionboard.com/tutorial/hivemail/img/hive_ipb_cp.jpg" target="_blank">Show IPB HiveMail Sign Up Page</a>
</td>
<td align="center" width="5%" valign="top"><a href="http://www.invisionboard.com/tutorial/hivemail/img/hive_options.jpg" target="_blank"><img src="http://www.invisionboard.com/tutorial/hivemail/img/hive_options_thumb.jpg" alt="IMG" /></a><br />Click picture to enlarge</td>
</tr>
</table>
<br /><br />
<span class="subline">That's it! You're all done!</span>
<br /><br />
<br />
~Matt for IPS, Inc. Aug 03
</div>
</body>
</html>
@@ -1,355 +0,0 @@
<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board v1.2 Module File
| ========================================
| by Matthew Mecham
| (c) 2001 - 2003 Invision Power Services
| http://www.invisionpower.com
| ========================================
| Web: http://www.invisionboard.com
| Email: matt@invisionpower.com
| Licence Info: http://www.invisionboard.com/?license
+---------------------------------------------------------------------------
|
| > Member Sync Module File
| > Module written by Matt Mecham
| > Date started: 7th July 2003
|
+--------------------------------------------------------------------------
|
| USAGE:
| ------
|
| This module is designed to hold any module modifications to with registration
| It doesn't do much in itself, but custom code can be added to handle
| synchronization, etc.
|
| - on_create_account: Is called upon successful account creation
| - on_register_form: Is called when the form is displayed
| - on_login: Is called when logged in succcessfully
| - on_delete: Is called when member deleted (single, multiple)
| - on_email_change: When email address change is confirmed
| - on_profile_update: When profile is updated (msn, sig, etc)
| - on_pass_change: When password is updated
| - on_group_change: When the member's membergroup has changed
| - on_name_change: When the member's name has been changed
+--------------------------------------------------------------------------
*/
class ipb_member_sync
{
var $class = "";
var $hiveid = 0;
var $html = "";
var $hive = "";
function ipb_member_sync()
{
global $DB, $ibforums;
if ( $ibforums->member['id'] )
{
$DB->query("SELECT id, hiveuserid FROM ibf_member_extra WHERE id={$ibforums->member['id']}");
$r = $DB->fetch_row();
$this->hiveid = intval($r['hiveuserid']);
}
}
//-----------------------------------------------
// register_class($class)
//
// Register a $this-> with this class
//
//-----------------------------------------------
function register_class($class)
{
$this->class = &$class;
$this->error = "";
}
//-----------------------------------------------
// on_create_account($member)
//
// $member = array( 'id', 'name', 'email',
// 'password', 'mgroup'...etc)
//
//-----------------------------------------------
function on_create_account($member)
{
global $DB, $std, $ibforums;
//---- START
//-------------------------------------------
// Add hivemail account?
//-------------------------------------------
$ibforums->input['hive_username'] = trim($ibforums->input['hive_username']);
if ( $ibforums->input['hive_username'] != "" )
{
define('IPB_PLUGIN', true);
require_once('../mail/includes/invision_plugin.php');
$this->hive = new invision_plugin();
$this->hive->hivemail_register_user($member, true);
if ( $this->hive->hive_error != "" )
{
$ibforums->lang['thing_name_taken'] = sprintf( $ibforums->lang['thing_name_taken'] , 'Board Email Address' );
$ibforums->lang['incorrect_thing_name'] = sprintf( $ibforums->lang['incorrect_thing_name'], 'Board Email Address' );
$this->class->show_reg_form($this->hive->hive_error);
$this->error = 1;
$this->hive->destructor();
return;
}
$this->hive->destructor();
}
//---- END
}
//-----------------------------------------------
// on_register_form()
//
//
//-----------------------------------------------
function on_register_form()
{
global $DB, $std, $ibforums;
//---- START
//-------------------------------------------
// HiveMail integration
// As register_form is defualt action, we can
// either show the hivemail entry in the reg
// form if they are not a member, or we can
// show the hive mail only sign up form
//-------------------------------------------
if ( $this->hive == "" )
{
define('IPB_PLUGIN', true);
require_once('../mail/includes/invision_plugin.php');
$this->hive = new invision_plugin();
}
if ( $ibforums->member['id'] )
{
//-------------------------------------------
// They are a member, are they a hivemail member?
//-------------------------------------------
if ( $this->hiveid AND $hiveuser = $this->hive->DB_Hive->query_first("SELECT userid FROM ".HIVE_TBL."user WHERE userid = {$this->hiveid}"))
{
//-------------------------------------------
// yeah, chuck 'em to ucp then
//-------------------------------------------
if ( $ibforums->input['mailsignup'] )
{
$this->hive->destructor();
$std->boink_it( $ibforums->base_url.'act=UserCP' );
}
}
else
{
//-------------------------------------------
// Forward them to the IPB module to show
// mail only sign-up
//-------------------------------------------
if ( $ibforums->input['mailsignup'] )
{
$this->hive->destructor();
$std->boink_it( $ibforums->base_url.'act=module&module=hivemail&show=forumform' );
}
}
}
else
{
//-------------------------------------------
// Normal reg form! chop in hivemail option
//-------------------------------------------
$extra = $this->class->html->field_entry(
'Enter a username for your own board email account',
'This is optional, please leave blank if you do not wish to get an email account.<br />Only letters and numbers please.',
$this->class->html->field_textinput('hive_username', $ibforums->input['hive_username'])."&nbsp;<select name='hive_userdomain' class='forminput'>".$this->hive->hive_domainname_options."</select>"
);
$this->class->output = str_replace( "<!--IBF.MODULES.EXTRA-->", $extra, $this->class->output );
}
$this->hive->destructor();
//---- END
}
//-----------------------------------------------
// on_login()
//
// $member = array( 'id', 'name', 'email', 'pass')
// ...etc
//-----------------------------------------------
function on_login($member=array())
{
global $DB, $std, $ibforums;
//---- START
//---- END
}
//-----------------------------------------------
// on_delete($ids)
//
// $ids = array | integer
// If array, will contain list of ids
//-----------------------------------------------
function on_delete($ids=array())
{
global $DB, $std, $ibforums;
$type = "";
//---- START
if ( is_array($ids) and count($ids) > 0 )
{
$type = arr;
}
else
{
$type = int;
}
//---- END
}
//-----------------------------------------------
// on_email_change($id, $new_email)
//
// $id = int member_id
// $new_email = string new email address
//-----------------------------------------------
function on_email_change($id, $new_email)
{
global $DB, $std, $ibforums;
//---- START
//---- END
}
//-----------------------------------------------
// on_pass_change($id, $new_raw)
//
// $id = int member_id
// $new_raw = string new plain text password
//-----------------------------------------------
function on_pass_change($id, $new_raw)
{
global $DB, $std, $ibforums;
//---- START
//-------------------------------------------
// HiveMail integration
// Update hivemail passy
//-------------------------------------------
if ( $this->hive == "" )
{
define('IPB_PLUGIN', true);
require_once('../mail/includes/invision_plugin.php');
$this->hive = new invision_plugin();
}
$this->hive->hivemail_update_password(md5($new_raw), $id);
$this->hive->destructor();
//---- END
}
//-----------------------------------------------
// on_profile_update($member)
//
// 'website','icq_number','aim_name','yahoo','msnname','integ_msg'
// 'location','interests', 'title'
// 'id'
//-----------------------------------------------
function on_profile_update( $member=array(), $custom_fields=array() )
{
global $DB, $std, $ibforums;
//---- START
//---- END
}
//-----------------------------------------------
// on_group_change()
//
// $id = int member_id
// $new_group = new int() group id
//-----------------------------------------------
function on_group_change( $id, $new_group )
{
global $DB, $std, $ibforums;
//---- START
//---- END
}
//-----------------------------------------------
// on_name_change()
//
// $id = int member_id
// $new_group = new name
//-----------------------------------------------
function on_name_change( $id, $new_name )
{
global $DB, $std, $ibforums;
//---- START
//---- END
}
}
?>
@@ -1,176 +0,0 @@
<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board v1.2 Module File
| ========================================
| by Matthew Mecham
| (c) 2001 - 2003 Invision Power Services
| http://www.invisionpower.com
| ========================================
| Web: http://www.invisionboard.com
| Email: matt@invisionpower.com
| Licence Info: http://www.invisionboard.com/?license
+---------------------------------------------------------------------------
| > Hive Mail Module
| > Module written by Matt Mecham
| > Date started: 8th July 2003
|
+--------------------------------------------------------------------------
*/
//=====================================
// Define class, this must be the same
// in all modules
//=====================================
class module extends module_loader
{
var $class = "";
var $module = "";
var $html = "";
var $result = "";
var $hive = "";
var $hiveid = "";
function module()
{
global $ibforums, $DB, $std, $print;
//-------------------------------------------
// Load skin / lang stuff
//-------------------------------------------
$ibforums->lang = $std->load_words($ibforums->lang, 'lang_register', $ibforums->lang_id);
$this->html = $std->load_template('skin_register');
//-------------------------------------------
// Are we a hivemail member?
//-------------------------------------------
$DB->query("SELECT id, hiveuserid FROM ibf_member_extra WHERE id={$ibforums->member['id']}");
$r = $DB->fetch_row();
$this->hiveid = intval($r['hiveuserid']);
//-------------------------------------------
// Load Hivemail plug in
//-------------------------------------------
define('IPB_PLUGIN', true);
require_once('../mail/includes/invision_plugin.php');
$this->hive = new invision_plugin();
//-------------------------------------------
// If we're not a member...
//-------------------------------------------
if ( ! $ibforums->member['id'] )
{
$std->boink_it( $ibforums->base_url );
}
//-------------------------------------------
// Do we already have a hivemail membership?
//-------------------------------------------
if ( $this->hiveid AND $hiveuser = $this->hive->DB_Hive->query_first("SELECT userid FROM ".HIVE_TBL."user WHERE userid = {$this->hiveid}"))
{
$this->hive->destructor();
$std->boink_it( $ibforums->base_url );
}
//-------------------------------------------
// Whatcha doin'? Yes - you?
//-------------------------------------------
switch( $ibforums->input['show'] )
{
case 'forumform':
$this->show_forumform();
break;
case 'addmail':
$this->add_mail();
default:
$this->show_forumform();
break;
}
}
function add_mail()
{
global $ibforums, $DB, $std, $print;
$hive_username = trim($ibforums->input['hive_username']);
//------------------------------------------
// Check for errors
//------------------------------------------
if ( $hive_username == "" )
{
$this->show_forumform('js_blanks');
}
$this->hive->hivemail_register_user($ibforums->member, false);
if ( $this->hive->hive_error != "" )
{
$ibforums->lang['thing_name_taken'] = sprintf( $ibforums->lang['thing_name_taken'] , 'Board Email Address' );
$ibforums->lang['incorrect_thing_name'] = sprintf( $ibforums->lang['incorrect_thing_name'], 'Board Email Address' );
$this->show_forumform($this->hive->hive_error);
$this->error = 1;
$this->hive->destructor();
return;
}
$this->hive->destructor();
$print->redirect_screen("your email account has been created, forwarding you to the email log-in page", "/mail/index.php", 1);
}
//------------------------------------------
// Show Forum Form
//
// Show the already reg'd member's mail form
//
//------------------------------------------
function show_forumform($errors="")
{
global $ibforums, $DB, $std, $print;
$this->page_title = "Sign up for your email account";
$hidden = "";
$action = $ibforums->base_url.'act=module&amp;module=hivemail&amp;show=addmail';
$content = $this->html->field_entry('Account Name:',
'The password for your email account will be the same as your forum account.<br />Letters and numbers only please.',
$this->html->field_textinput('hive_username', $ibforums->input['hive_username'])."&nbsp;<select name='hive_userdomain' class='forminput'>".$this->hive->hive_domainname_options."</select>"
);
if ($errors != "")
{
$this->output .= $this->html->errors( $ibforums->lang[$errors] );
}
$this->output .= $this->html->tmpl_form($action, $hidden, $this->page_title, $content );
$print->add_output("$this->output");
$print->do_output( array( 'TITLE' => $this->page_title, 'JS' => 0, NAV => $this->nav ) );
}
}
?>
@@ -1,29 +0,0 @@
<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board v1.2 HiveMail register.php file
| ========================================
| by Matthew Mecham
| (c) 2001 - 2003 Invision Power Services
| http://www.invisionpower.com
| ========================================
| Web: http://www.invisionboard.com
| Email: matt@invisionpower.com
| Licence Info: http://www.invisionboard.com/?license
+---------------------------------------------------------------------------
*/
// This file allows Hive Mail to integrate to IPB without restructuring too much
// Simply direct to IPB's register.
require "./conf_global.php";
$url = $INFO['board_url'].'/index.'.$INFO['php_ext'].'?act=Reg&mailsignup=1&coppa_pass=1';
@header("Location: $url");
exit();
?>
@@ -1,284 +0,0 @@
<?php
//
// +-------------------------------------------------------------+
// | HiveMail version 1.2 (English)
// | Copyright ©2002-2003 Chen Avinadav <chen@hivemail.com>
// +-------------------------------------------------------------+
// | HIVEMAIL IS NOT FREE SOFTWARE
// | If you have downloaded this software from a website other
// | than www.hivemail.com or if you have otherwise received
// | this software from someone who is not a representative of
// | this organization you are involved in an illegal activity.
// | License agreement: http://www.hivemail.com/license.html
// +-------------------------------------------------------------+
// |
// | INVISION POWER BOARD v1.2 (RC2+) INTEGRATION
// |
// +-------------------------------------------------------------+
error_reporting(E_ALL & ~E_NOTICE);
//-------------------------------------------------------
// Stop people from calling this file directly
//-------------------------------------------------------
if ( ! defined('IPB_PLUGIN') )
{
return;
}
class invision_plugin
{
var $hive_error = "";
var $hive_options = array();
var $this_folder = "";
var $DB_Hive = "";
function invision_plugin()
{
//=========================================
// EDIT THIS IF NEEDED
//=========================================
define( 'HIVE_TBL', 'hive_' );
//-------------------------------------------------------
// Change to right directory
//-------------------------------------------------------
$this->this_folder = getcwd();
chdir(dirname(__FILE__));
//-------------------------------------------------------
// We are outside the admin CP
//-------------------------------------------------------
define('INADMIN', false);
define('VB_PLUGIN', 1 );
//-------------------------------------------------------
// Start database connection
//-------------------------------------------------------
require('../includes/config.php');
require('../includes/db_mysql.php');
if ( ! function_exists('version_compare') or version_compare(phpversion(), '4.2.0') < 0 )
{
$config['server'] .= ':3306';
}
$this->DB_Hive = new DB_MySQL($config, true, true);
//-------------------------------------------------------
// Get all common functions
//-------------------------------------------------------
require('../includes/init.php');
//-------------------------------------------------------
// Get options
//-------------------------------------------------------
while ( $setting = $this->DB_Hive->fetch_array($settings, 'SELECT * FROM '.HIVE_TBL.'setting') )
{
$this->hive_options["$setting[variable]"] = $setting['value'];
}
//-------------------------------------------------------
// The domain names array
//-------------------------------------------------------
$this->hive_options['domainnames'] = preg_split("#\r?\n#", $this->hive_options['domainname']);
$this->hive_options['domainname'] = $this->hive_options['domainnames'][0];
//-------------------------------------------------------
// Create the option list of domain names
//-------------------------------------------------------
$this->hive_domainname_options = '';
if ( is_array($this->hive_options['domainnames']) and count($this->hive_options['domainnames']) > 0 )
{
foreach ( $this->hive_options['domainnames'] as $curdomainname )
{
$this->hive_domainname_options .= "<option value=\"$curdomainname\"".iif($userdomain == $curdomainname, ' selected="selected"', '').">$curdomainname</option>\n";
}
}
}
//-------------------------------------------------------
// Creates a user
//-------------------------------------------------------
function hivemail_register_user($member, $onreg = true)
{
global $ibforums, $DB, $std;
if ( ! $this->hive_options['regopen'] )
{
return;
}
$hive_username = trim($ibforums->input['hive_username']);
$hive_userdomain = trim($ibforums->input['hive_userdomain']);
//-------------------------------------------------------
// Domain name
//-------------------------------------------------------
if ( ! in_array( $hive_userdomain, $this->hive_options['domainnames'] ) )
{
$hive_userdomain = $hive_options['domainname'];
}
//-------------------------------------------------------
// Some error checking
//-------------------------------------------------------
if ($this->DB_Hive->query_first("SELECT username FROM ".HIVE_TBL."user WHERE username = '$hive_username'"))
{
if ($onreg)
{
$this->delete_reg_user($member['id']);
}
$this->hive_error = 'thing_name_taken';
return;
}
elseif ( preg_match('#[^a-z0-9_.]#i', $hive_username) or preg_match('#^[^a-z]#i', $hive_username) or strlen($hive_username) < 2 )
{
if ($onreg)
{
$this->delete_reg_user($member['id']);
}
$this->hive_error = 'incorrect_thing_name';
return;
}
//-------------------------------------------------------
// Create user
//-------------------------------------------------------
$this->DB_Hive->query("
INSERT INTO ".HIVE_TBL."user
(userid, username, password, usergroupid, skinid, realname, regdate, lastvisit, cols, birthday, options, replyto, font, timezone, soundid, domain, vbuserid, altemail)
VALUES
(NULL, '".addslashes($hive_username)."', '".addslashes($member['password'])."', ".iif($this->hive_options['moderate'], 3, 2).", ".$this->hive_options['defaultskin'].", '".addslashes($member['name'])."', ".TIMENOW.", ".TIMENOW.", '".addslashes(USER_DEFAULTCOLS)."', '".addslashes('0')."', ".USER_DEFAULTBITS.", '".addslashes($hive_username.$hive_userdomain)."', 'Verdana|10|Regular|Black|None', '".addslashes('0')."', ".intval($this->DB_Hive->get_field('SELECT soundid FROM '.HIVE_TBL.'sound WHERE userid <= 0 ORDER BY userid LIMIT 1')).", '".addslashes($ibforums->input['hive_userdomain'])."', {$member['id']}, '".addslashes($member['email'])."')
");
$hive_userid = $this->DB_Hive->insert_id();
//-------------------------------------------------------
// Log user in
//-------------------------------------------------------
if ($onreg)
{
$userid = $member['id'];
ini_set('session.name', 'hivesession');
session_start();
$std->my_setcookie(session_name(), session_id(), TIMENOW + (60 * 60 * 24 * 365));
$_SESSION['userid'] = $hive_userid;
$_SESSION['password'] = md5(md5($member['password']));
$_SESSION['ipaddress'] = md5(IPADDRESS);
$_SESSION['staylogged'] = 365;
}
//-------------------------------------------------------
// Update Invision's database
//-------------------------------------------------------
if ( ! $DB->field_exists( 'hiveuserid', 'ibf_member_extra' ) )
{
$DB->query("ALTER TABLE ibf_member_extra ADD hiveuserid mediumint(8) NOT NULL DEFAULT ''");
}
$DB->query("SELECT id, hiveuserid FROM ibf_member_extra WHERE id={$member['id']}");
if ( $r = $DB->fetch_row() )
{
// User _extra exists, update...
$DB->query("UPDATE ibf_member_extra SET hiveuserid=$hive_userid WHERE id={$member['id']}");
}
else
{
// User _extra doesn't exist...
$DB->query("INSERT INTO ibf_member_extra SET hiveuserid=$hive_userid, id={$member['id']}");
}
return $hive_userid;
}
//-------------------------------------------------------
// Delete new reg. user if error during registration
//-------------------------------------------------------
function delete_reg_user($userid)
{
global $DB;
$DB->query("DELETE FROM ibf_members WHERE id=$userid");
$DB->query("DELETE FROM ibf_member_extra WHERE id=$userid");
$DB->query("DELETE FROM ibf_pfields_content WHERE member_id=$userid");
}
//-------------------------------------------------------
// Updates the user's hivemail password
//-------------------------------------------------------
function hivemail_update_password($password, $userid)
{
$this->DB_Hive->query("
UPDATE ".HIVE_TBL."user
SET password = '".addslashes($password)."'
WHERE vbuserid = $userid
");
}
//-------------------------------------------------------
// Desctructor
//-------------------------------------------------------
function destructor()
{
chdir($this->this_folder);
}
}
function stripslashesarray($array) {
if (is_array($array)) {
foreach($array as $key => $val) {
if (is_array($val)) {
$array["$key"] = stripslashesarray($val);
} elseif (is_string($val)) {
if (get_cfg_var('magic_quotes_sybase')) {
$array["$key"] = str_replace("''", "'", $val);
} else {
$array["$key"] = stripslashes($val);
}
}
}
}
return $array;
}
function iif($eval, $true, $false = '') {
return (($eval == true) ? ($true) : ($false));
}
?>
-236
View File
@@ -1,236 +0,0 @@
<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board IPB Click Site
| ========================================
| by Matthew Mecham
| (c) 2001 - 2003 Invision Power Services
| http://www.invisionpower.com
| ========================================
| Web: http://www.invisionboard.com
| Email: matt@invisionpower.com
| Licence Info: http://www.invisionboard.com/?license
+---------------------------------------------------------------------------
|
| > IPB Portal Script
| > Written By Matthew Mecham
| > Date started: 1st July 2003
|
+--------------------------------------------------------------------------
*/
//-----------------------------------------------
// USER CONFIGURABLE ELEMENTS
//-----------------------------------------------
// Define the path to where the forums directory is
// located. This might be "./forums/" for example.
// Don't forget the trailing slash!
define( 'ROOT_PATH', "./forums/" );
// Define the URL to this script. If you're happy to
// use relative URLs - you can leave this blank.
// You can also rename the script here.
$this_script = 'index.php';
//-----------------------------------------------
// NO USER EDITABLE SECTIONS BELOW
//-----------------------------------------------
error_reporting (E_ERROR | E_WARNING | E_PARSE);
set_magic_quotes_runtime(0);
class Debug {
function startTimer() {
global $starttime;
$mtime = microtime ();
$mtime = explode (' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
}
function endTimer() {
global $starttime;
$mtime = microtime ();
$mtime = explode (' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = round (($endtime - $starttime), 5);
return $totaltime;
}
}
class info {
var $member = array();
var $input = array();
var $session_id = "";
var $base_url = "";
var $vars = "";
var $skin_id = "0"; // Skin Dir name
var $skin_rid = ""; // Real skin id (numerical only)
var $lang_id = "en";
var $skin = "";
var $lang = "";
var $server_load = 0;
var $version = "v1.0";
var $lastclick = "";
var $location = "";
var $debug_html = "";
var $perm_id = "";
var $forum_read = array();
var $topic_cache = "";
var $session_type = "";
function info() {
global $sess, $std, $DB, $INFO, $this_script;
$this->vars = &$INFO;
$this->vars['TEAM_ICON_URL'] = $INFO['html_url'] . '/team_icons';
$this->vars['AVATARS_URL'] = $INFO['html_url'] . '/avatars';
$this->vars['EMOTICONS_URL'] = $INFO['html_url'] . '/emoticons';
$this->vars['mime_img'] = $INFO['html_url'] . '/mime_types';
$this->vars['dynamiclite'] = $this_script.'?';
}
}
//--------------------------------
// Import $INFO, now!
//--------------------------------
require ROOT_PATH."conf_global.php";
//--------------------------------
// The clocks a' tickin'
//--------------------------------
$Debug = new Debug;
$Debug->startTimer();
//--------------------------------
// Require our global functions
//--------------------------------
require ROOT_PATH."sources/functions.php";
$std = new FUNC;
$print = new display();
$sess = new session();
//--------------------------------
// Load the DB driver and such
//--------------------------------
$INFO['sql_driver'] = !$INFO['sql_driver'] ? 'mySQL' : $INFO['sql_driver'];
$to_require = ROOT_PATH."sources/Drivers/".$INFO['sql_driver'].".php";
require ($to_require);
$DB = new db_driver;
$DB->obj['sql_database'] = $INFO['sql_database'];
$DB->obj['sql_user'] = $INFO['sql_user'];
$DB->obj['sql_pass'] = $INFO['sql_pass'];
$DB->obj['sql_host'] = $INFO['sql_host'];
$DB->obj['sql_tbl_prefix'] = $INFO['sql_tbl_prefix'];
$DB->obj['debug'] = ($INFO['sql_debug'] == 1) ? $_GET['debug'] : 0;
// Get a DB connection
$DB->connect();
//--------------------------------
// Wrap it all up in a nice easy to
// transport super class
//--------------------------------
$ibforums = new info();
//--------------------------------
// Set up our vars
//--------------------------------
$ibforums->input = $std->parse_incoming();
//--------------------------------
// The rest :D
//--------------------------------
$ibforums->member = $sess->authorise();
$ibforums->skin = $std->load_skin();
$ibforums->lastclick = $sess->last_click;
$ibforums->location = $sess->location;
$ibforums->session_id = $sess->session_id;
//--------------------------------
// Set up the session ID stuff
//--------------------------------
if ( $ibforums->session_type == 'cookie' )
{
$ibforums->session_id = "";
$ibforums->base_url = $ibforums->vars['board_url'].'/index.'.$ibforums->vars['php_ext'].'?';
}
else
{
$ibforums->base_url = $ibforums->vars['board_url'].'/index.'.$ibforums->vars['php_ext'].'?s='.$ibforums->session_id.'&amp;';
}
$ibforums->js_base_url = $ibforums->vars['board_url'].'/index.'.$ibforums->vars['php_ext'].'?s='.$ibforums->session_id.'&';
//--------------------------------
// Set up the forum_read cookie
//--------------------------------
$std->hdl_forum_read_cookie();
//--------------------------------
// Set up the skin stuff
//--------------------------------
$ibforums->skin_rid = $ibforums->skin['set_id'];
$ibforums->skin_id = 's'.$ibforums->skin['set_id'];
$ibforums->vars['img_url'] = $ibforums->vars['board_url'].'/style_images/' . $ibforums->skin['img_dir'];
//--------------------------------
// Set up our language choice
//--------------------------------
if ($ibforums->vars['default_language'] == "")
{
$ibforums->vars['default_language'] = 'en';
}
$ibforums->lang_id = $ibforums->member['language'] ? $ibforums->member['language'] : $ibforums->vars['default_language'];
if ( ($ibforums->lang_id != $ibforums->vars['default_language']) and (! is_dir( ROOT_PATH."lang/".$ibforums->lang_id ) ) )
{
$ibforums->lang_id = $ibforums->vars['default_language'];
}
$ibforums->lang = $std->load_words($ibforums->lang, 'lang_global', $ibforums->lang_id);
//--------------------------------
// Require and run
//--------------------------------
require ROOT_PATH."sources/dynamiclite/csite.php";
$run = new click_site();
//+-------------------------------------------------
// GLOBAL ROUTINES
//+-------------------------------------------------
function fatal_error($message="", $help="") {
echo("$message<br><br>$help");
exit;
}
?>
@@ -1,47 +0,0 @@
Invision Power Dynamic Lite
---------------------------
Installation Snyopsis
.....................
Open up index.php, edit the variables at the top save and upload to your root public_html / www folder.
INSTALLATION
------------
This guide assumes that you have installed IPB in /forums/ and wish for the portal to be the first page your visitors see.
Open up index.php and edit the path to where the forums directory is:
define( 'ROOT_PATH', "./forums" );
This is set to "forums" by default. If you had your IPB installed at http://www.domain.com/chat/ you'd need to make sure you have:
define( 'ROOT_PATH', "./chat" );
Save the file and upload it to your root web directory folder, often called "public_html" or "www".
UPLOADING IPB COMPONENTS
------------------------
If you've already got a version previous to RC2 set up, you should make sure you upload the following files found in the "upload" folder
of this zip file.
/skin/s1/skin_csite.php
/lang/en/lang_csite.php
/sources/ipdynamiclite/*.*
SETTING UP
----------
Before you can use Dynamic lite, you'll need to make sure you've switched it on from the ACP. If you don't do this, you may
receive PHP errors from index.php.
Simply log into your forums ACP and expand the "System Settings" sub-menu and click on "IPDynamic Lite Set-up".
That's it, you're all done!
File diff suppressed because it is too large. Load diff
+32
View File
@@ -0,0 +1,32 @@
#!/usr/local/bin/php
<?php
/**
* @brief UTF-8 Conversion
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
require_once 'init.php';
if ( IS_CLI )
{
\IPSUtf8\Dispatcher\Cli::i()->run();
}
else
{
print "<html><head><title>Warning</title></head>\n";
print "<body style='text-align:center'>\n";
print "This script is meant to be run via command line<br />\n";
print "More information:<br />\n";
print "<a href=\"http://www.google.com/search?hl=en&q=php+cli+windows\" target=\"_blank\" rel=\"noopener\">http://www.google.com/search?hl=en&q=php+cli+windows</a><br />\n";
print "This script will not run through a webserver.<br />\n";
print "</body></html>\n";
exit();
}
exit();
+1
View File
@@ -0,0 +1 @@
.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,0%,#e6e6e6,100%);background-image:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background-image:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;border-color:#e0e0e0;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0)}.btn-default:active,.btn-default.active{background-color:#e6e6e6;border-color:#e0e0e0}.btn-primary{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;border-color:#2d6ca2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.btn-primary:active,.btn-primary.active{background-color:#3071a9;border-color:#2d6ca2}.btn-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;border-color:#419641;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.btn-success:active,.btn-success.active{background-color:#449d44;border-color:#419641}.btn-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;border-color:#eb9316;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.btn-warning:active,.btn-warning.active{background-color:#ec971f;border-color:#eb9316}.btn-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;border-color:#c12e2a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.btn-danger:active,.btn-danger.active{background-color:#c9302c;border-color:#c12e2a}.btn-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;border-color:#2aabd2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.btn-info:active,.btn-info.active{background-color:#31b0d5;border-color:#2aabd2}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff,0%,#f8f8f8,100%);background-image:-moz-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-raLine truncated
+9
View File
@@ -0,0 +1,9 @@
/*!
* Bootstrap v3.0.0
*
* Copyright 2013 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world by @mdo and @fat.
*//*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bLine truncated
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

File renamed without changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 418 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

View File
Whitespace-only changes.
+7
View File
@@ -0,0 +1,7 @@
/*! jQuery UI - v1.10.3 - 2013-09-27
* http://jqueryui.com
* Includes: jquery.ui.core.css, jquery.ui.progressbar.css, jquery.ui.theme.css
* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.uLine truncated
+84
View File
@@ -0,0 +1,84 @@
/* Space out content a bit */
body {
padding-top: 20px;
padding-bottom: 20px;
}
div.small
{
font-size: 0.8em;
line-height: 1.2em;
}
/* Everything but the jumbotron gets side spacing for mobile first views */
.header,
.marketing,
.footer {
padding-left: 15px;
padding-right: 15px;
}
/* Custom page header */
.header {
border-bottom: 1px solid #e5e5e5;
}
/* Make the masthead heading the same height as the navigation */
.header h3 {
margin-top: 0;
margin-bottom: 0;
line-height: 40px;
padding-bottom: 19px;
}
/* Custom page footer */
.footer {
padding-top: 19px;
color: #777;
border-top: 1px solid #e5e5e5;
}
/* Customize container */
@media (min-width: 768px) {
.container {
max-width: 730px;
}
}
.container-narrow > hr {
margin: 30px 0;
}
/* Main marketing message and sign up button */
.jumbotron {
text-align: center;
border-bottom: 1px solid #e5e5e5;
}
.jumbotron .btn {
font-size: 21px;
padding: 14px 24px;
}
/* Supporting marketing content */
.marketing {
margin: 40px 0;
}
.marketing p + h4 {
margin-top: 28px;
}
/* Responsive: Portrait tablets and up */
@media screen and (min-width: 768px) {
/* Remove the padding we set earlier */
.header,
.marketing,
.footer {
padding-left: 0;
padding-right: 0;
}
/* Space out the masthead */
.header {
margin-bottom: 30px;
}
/* Remove the bottom border on the jumbotron for visual effect */
.jumbotron {
border-bottom: 0;
}
}
@@ -0,0 +1,228 @@
<?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="*" d="M1100 500h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200z" />
<glyph unicode="+" d="M1100 400h-400v-400h-300v400h-400v300h400v400h300v-400h400v-300z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#x2000;" horiz-adv-x="652" />
<glyph unicode="&#x2001;" horiz-adv-x="1304" />
<glyph unicode="&#x2002;" horiz-adv-x="652" />
<glyph unicode="&#x2003;" horiz-adv-x="1304" />
<glyph unicode="&#x2004;" horiz-adv-x="434" />
<glyph unicode="&#x2005;" horiz-adv-x="326" />
<glyph unicode="&#x2006;" horiz-adv-x="217" />
<glyph unicode="&#x2007;" horiz-adv-x="217" />
<glyph unicode="&#x2008;" horiz-adv-x="163" />
<glyph unicode="&#x2009;" horiz-adv-x="260" />
<glyph unicode="&#x200a;" horiz-adv-x="72" />
<glyph unicode="&#x202f;" horiz-adv-x="260" />
<glyph unicode="&#x205f;" horiz-adv-x="326" />
<glyph unicode="&#x20ac;" d="M800 500h-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-217l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257 q117 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 -100h406z" />
<glyph unicode="&#x2212;" d="M1100 700h-900v-300h900v300z" />
<glyph unicode="&#x2601;" d="M178 300h750q120 0 205 86t85 208q0 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.5q0 -80 56.5 -137t135.5 -57z" />
<glyph unicode="&#x2709;" d="M1200 1100h-1200l600 -603zM300 600l-300 -300v600zM1200 900v-600l-300 300zM800 500l400 -400h-1200l400 400l200 -200z" />
<glyph unicode="&#x270f;" d="M1101 889l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13l-94 -97zM401 189l614 614l-214 214l-614 -614zM-13 -13l333 112l-223 223z" />
<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#xe001;" d="M700 100h300v-100h-800v100h300v550l-500 550h1200l-500 -550v-550z" />
<glyph unicode="&#xe002;" d="M1000 934v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 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 -7q-79 -25 -122.5 -82t-25.5 -112t86 -75.5t147 5.5 q65 21 109 69t44 90v606z" />
<glyph unicode="&#xe003;" d="M913 432l300 -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 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM176 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="&#xe005;" d="M649 949q48 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.5t-94 124.5t-33.5 117.5q0 64 28 123t73 100.5t104.5 64t119 20.5 t120 -38.5t104.5 -104.5z" />
<glyph unicode="&#xe006;" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM168 71l2 1z" />
<glyph unicode="&#xe007;" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM747 331l-74 229l193 140h-235l-77 211l-78 -211h-239l196 -142l-73 -226l192 140zM168 71l2 1z" />
<glyph unicode="&#xe008;" d="M1200 143v-143h-1200v143l400 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-100z" />
<glyph unicode="&#xe009;" d="M1200 1100v-1100h-1200v1100h1200zM200 1000h-100v-100h100v100zM900 1000h-600v-400h600v400zM1100 1000h-100v-100h100v100zM200 800h-100v-100h100v100zM1100 800h-100v-100h100v100zM200 600h-100v-100h100v100zM1100 600h-100v-100h100v100zM900 500h-600v-400h600 v400zM200 400h-100v-100h100v100zM1100 400h-100v-100h100v100zM200 200h-100v-100h100v100zM1100 200h-100v-100h100v100z" />
<glyph unicode="&#xe010;" d="M500 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400 q21 0 35.5 -14.5t14.5 -35.5zM500 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe011;" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 250v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5 t14.5 -35.5z" />
<glyph unicode="&#xe012;" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700 q21 0 35.5 -14.5t14.5 -35.5zM300 450v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-200q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM1200 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe013;" d="M448 34l818 820l-212 212l-607 -607l-206 207l-212 -212z" />
<glyph unicode="&#xe014;" d="M882 106l-282 282l-282 -282l-212 212l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282z" />
<glyph unicode="&#xe015;" d="M913 432l300 -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 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM507 363q137 0 233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5t-234 -97t-97 -233 t97 -233t234 -97zM600 800h100v-200h-100v-100h-200v100h-100v200h100v100h200v-100z" />
<glyph unicode="&#xe016;" d="M913 432l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -141 -78 -262zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 801v-200h400v200h-400z" />
<glyph unicode="&#xe017;" d="M700 750v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5zM800 975v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123 t-123 184t-45.5 224.5q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155z" />
<glyph unicode="&#xe018;" d="M1200 1h-200v1200h200v-1200zM900 1h-200v800h200v-800zM600 1h-200v500h200v-500zM300 301h-200v-300h200v300z" />
<glyph unicode="&#xe019;" d="M488 183l38 -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 38l-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 5 q-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 -73q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39zM600 815q89 0 152 -63 t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152q0 88 63 151t152 63z" />
<glyph unicode="&#xe020;" d="M900 1100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100zM800 1100v100h-300v-100h300zM200 900h900v-800q0 -41 -29.5 -71 t-70.5 -30h-700q-41 0 -70.5 30t-29.5 71v800zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
<glyph unicode="&#xe021;" d="M1301 601h-200v-600h-300v400h-300v-400h-300v600h-200l656 644z" />
<glyph unicode="&#xe022;" d="M600 700h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18v1150q0 11 7 18t18 7h475v-500zM1000 800h-300v300z" />
<glyph unicode="&#xe023;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 600h200 v-100h-300v400h100v-300z" />
<glyph unicode="&#xe024;" d="M721 400h-242l-40 -400h-539l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538zM712 500l-27 300h-170l-27 -300h224z" />
<glyph unicode="&#xe025;" d="M1100 400v-400h-1100v400h490l-290 300h200v500h300v-500h200l-290 -300h490zM988 300h-175v-100h175v100z" />
<glyph unicode="&#xe026;" d="M600 1199q122 0 233 -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 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 1012q-170 0 -291 -121t-121 -291t121 -291t291 -121t291 121 t121 291t-121 291t-291 121zM700 600h150l-250 -300l-250 300h150v300h200v-300z" />
<glyph unicode="&#xe027;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM850 600h-150 v-300h-200v300h-150l250 300z" />
<glyph unicode="&#xe028;" d="M0 500l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18v475zM903 1000h-606l-97 -500h200l50 -200h300l50 200h200z" />
<glyph unicode="&#xe029;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM797 598 l-297 -201v401z" />
<glyph unicode="&#xe030;" d="M1177 600h-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 -123t-123 -184t-45.5 -224.5t45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123 t123 184t45.5 224.5z" />
<glyph unicode="&#xe031;" d="M700 800l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400zM500 400l-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 122l-145 -145v400h400z" />
<glyph unicode="&#xe032;" d="M100 1200v-1200h1100v1200h-1100zM1100 100h-900v900h900v-900zM400 800h-100v100h100v-100zM1000 800h-500v100h500v-100zM400 600h-100v100h100v-100zM1000 600h-500v100h500v-100zM400 400h-100v100h100v-100zM1000 400h-500v100h500v-100zM400 200h-100v100h100v-100 zM1000 300h-500v-100h500v100z" />
<glyph unicode="&#xe034;" d="M200 0h-100v1100h100v-1100zM1100 600v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5z" />
<glyph unicode="&#xe035;" d="M1200 275v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5t-49.5 -227v-300q0 -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 -7h50 q11 0 18 7t7 18zM400 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14zM1000 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14z" />
<glyph unicode="&#xe036;" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM971 600l141 -141l-71 -71l-141 141l-141 -141l-71 71l141 141l-141 141l71 71l141 -141l141 141l71 -71z" />
<glyph unicode="&#xe037;" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
<glyph unicode="&#xe038;" d="M974 186l6 8q142 178 142 405q0 230 -144 408l-6 8l-83 -64l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8zM300 801l300 200v-800l-300 200h-300v400h300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257z" />
<glyph unicode="&#xe039;" d="M100 700h400v100h100v100h-100v300h-500v-600h100v100zM1200 700v500h-600v-200h100v-300h200v-300h300v200h-200v100h200zM100 1100h300v-300h-300v300zM800 800v300h300v-300h-300zM200 900h100v100h-100v-100zM900 1000h100v-100h-100v100zM300 600h-100v-100h-200 v-500h500v500h-200v100zM900 200v-100h-200v100h-100v100h100v200h-200v100h300v-300h200v-100h-100zM400 400v-300h-300v300h300zM300 200h-100v100h100v-100zM1100 300h100v-100h-100v100zM600 100h100v-100h-100v100zM1200 100v-100h-300v100h300z" />
<glyph unicode="&#xe040;" d="M100 1200h-100v-1000h100v1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 1200v-1000h-200v1000h200zM400 100v-100h-300v100h300zM500 91h100v-91h-100v91zM700 91h100v-91h-100v91zM1100 91v-91h-200v91h200z " />
<glyph unicode="&#xe041;" d="M1200 500l-500 -500l-699 700v475q0 10 7.5 17.5t17.5 7.5h474zM320 882q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71t29 -71q30 -30 71.5 -30t71.5 30z" />
<glyph unicode="&#xe042;" d="M1201 500l-500 -500l-699 700v475q0 11 7 18t18 7h474zM1501 500l-500 -500l-50 50l450 450l-700 700h100zM320 882q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71t30 -71q29 -30 71 -30t71 30z" />
<glyph unicode="&#xe043;" d="M1200 1200v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900v1025l175 175h925z" />
<glyph unicode="&#xe045;" d="M947 829l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18l-94 -346l40 -124h592zM1200 800v-700h-200v200h-800v-200h-200v700h200l100 -200h600l100 200h200zM881 176l38 -152q2 -10 -3.5 -17t-15.5 -7h-600q-10 0 -15.5 7t-3.5 17l38 152q2 10 11.5 17t19.5 7 h500q10 0 19.5 -7t11.5 -17z" />
<glyph unicode="&#xe047;" d="M1200 0v66q-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-66h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417zM416 521l178 457l46 -140l116 -317 h-340z" />
<glyph unicode="&#xe048;" d="M100 1199h471q120 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 -111t-162 -38.5h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21 t-29 14t-49 14.5v70zM400 1079v-379h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400z" />
<glyph unicode="&#xe049;" d="M877 1200l2 -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-500v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425z" />
<glyph unicode="&#xe050;" d="M1150 1200h150v-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-49v300h150h700zM100 1000v-800h75l-125 -167l-125 167h75v800h-75l125 167 l125 -167h-75z" />
<glyph unicode="&#xe051;" d="M950 1201h150v-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-50v300h150h700zM200 101h800v75l167 -125l-167 -125v75h-800v-75l-167 125l167 125 v-75z" />
<glyph unicode="&#xe052;" d="M700 950v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35zM1100 650v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1000 q21 0 35.5 15t14.5 35zM900 350v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe053;" d="M1000 950v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 650v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1100 q21 0 35.5 15t14.5 35zM1000 350v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe054;" d="M500 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-600q-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 35zM0 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-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe055;" d="M0 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-1100q-21 0 -35.5 15t-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 15 t-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 15t-14.5 35zM0 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-1100 q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe056;" d="M0 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 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 -15h-800q-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 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-800 q-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 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 -15 h-800q-21 0 -35.5 15t-14.5 35zM0 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 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 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
<glyph unicode="&#xe057;" d="M400 1100h-100v-1100h100v1100zM700 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM1100 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM100 425v75h-201v100h201v75l166 -125zM900 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM1200 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" />
<glyph unicode="&#xe058;" d="M201 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM801 1100h100v-1100h-100v1100zM601 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM1101 425v75h200v100h-200v75l-167 -125zM401 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM701 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" />
<glyph unicode="&#xe059;" d="M900 925v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53zM1200 300l-300 300l300 300v-600z" />
<glyph unicode="&#xe060;" d="M1200 1056v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31zM1100 1000h-1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500zM476 750q0 -56 -39 -95t-95 -39t-95 39t-39 95t39 95t95 39t95 -39 t39 -95z" />
<glyph unicode="&#xe062;" d="M600 1213q123 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 262q0 124 60.5 231.5t165 172t226.5 64.5zM599 514q107 0 182.5 75.5t75.5 182.5t-75.5 182 t-182.5 75t-182 -75.5t-75 -181.5q0 -107 75.5 -182.5t181.5 -75.5z" />
<glyph unicode="&#xe063;" d="M600 1199q122 0 233 -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 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 173v854q-176 0 -301.5 -125t-125.5 -302t125.5 -302t301.5 -125z " />
<glyph unicode="&#xe064;" d="M554 1295q21 -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 138.5t-64 210.5q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5zM455 296q-7 6 -18 17 t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156q14 -82 59.5 -136t136.5 -80z" />
<glyph unicode="&#xe065;" d="M1108 902l113 113l-21 85l-92 28l-113 -113zM1100 625v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 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.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125zM436 341l161 50l412 412l-114 113l-405 -405z" />
<glyph unicode="&#xe066;" d="M1100 453v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 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.5z M813 431l360 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.5q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209z" />
<glyph unicode="&#xe067;" d="M1100 569v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h300q60 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.5v69z M625 348l566 567l-136 137l-430 -431l-147 147l-136 -136z" />
<glyph unicode="&#xe068;" d="M900 303v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198l-300 300l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296z" />
<glyph unicode="&#xe069;" d="M900 0l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100z" />
<glyph unicode="&#xe070;" d="M1200 0l-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.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100z" />
<glyph unicode="&#xe071;" d="M1200 0l-500 488v-488l-564 550l564 550v-487l500 487v-1100z" />
<glyph unicode="&#xe072;" d="M1100 550l-900 550v-1100z" />
<glyph unicode="&#xe073;" d="M500 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM900 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200 q21 0 35.5 14.5t14.5 35.5z" />
<glyph unicode="&#xe074;" d="M1100 150v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35z" />
<glyph unicode="&#xe075;" d="M500 0v488l-500 -488v1100l500 -487v487l564 -550z" />
<glyph unicode="&#xe076;" d="M1050 1100h100q21 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 -488v488l-500 -488v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe077;" d="M850 1100h100q21 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 -488v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe078;" d="M650 1064l-550 -564h1100zM1200 350v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe079;" d="M777 7l240 240l-353 353l353 353l-240 240l-592 -594z" />
<glyph unicode="&#xe080;" d="M513 -46l-241 240l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1z" />
<glyph unicode="&#xe081;" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM500 900v-200h-200v-200h200v-200h200v200h200v200h-200v200h-200z" />
<glyph unicode="&#xe082;" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM300 700v-200h600v200h-600z" />
<glyph unicode="&#xe083;" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM247 741l141 -141l-142 -141l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141 l-141 142z" />
<glyph unicode="&#xe084;" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM546 623l-102 102l-174 -174l276 -277l411 411l-175 174z" />
<glyph unicode="&#xe085;" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM500 500h200q5 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 3 q-105 0 -172 -56t-67 -183h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5zM500 400v-100h200v100h-200z" />
<glyph unicode="&#xe086;" d="M600 1197q162 0 299.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.5t80 299.5t217.5 217.5t299.5 80zM500 900v-100h200v100h-200zM400 700v-100h100v-200h-100v-100h400v100h-100v300h-300z" />
<glyph unicode="&#xe087;" d="M1200 700v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203zM700 500v-206q149 48 201 206h-201v200h200 q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210q24 -73 79.5 -127.5t130.5 -78.5v206h200z" />
<glyph unicode="&#xe088;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM844 735 l-135 -135l135 -135l-109 -109l-135 135l-135 -135l-109 109l135 135l-135 135l109 109l135 -135l135 135z" />
<glyph unicode="&#xe089;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM896 654 l-346 -345l-228 228l141 141l87 -87l204 205z" />
<glyph unicode="&#xe090;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM248 385l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5q0 -115 62 -215zM955 809l-564 -564q97 -59 209 -59q171 0 292.5 121.5 t121.5 292.5q0 112 -59 209z" />
<glyph unicode="&#xe091;" d="M1200 400h-600v-301l-600 448l600 453v-300h600v-300z" />
<glyph unicode="&#xe092;" d="M600 400h-600v300h600v300l600 -453l-600 -448v301z" />
<glyph unicode="&#xe093;" d="M1098 600h-298v-600h-300v600h-296l450 600z" />
<glyph unicode="&#xe094;" d="M998 600l-449 -600l-445 600h296v600h300v-600h298z" />
<glyph unicode="&#xe095;" d="M600 199v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453z" />
<glyph unicode="&#xe096;" d="M1200 1200h-400l129 -129l-294 -294l142 -142l294 294l129 -129v400zM565 423l-294 -294l129 -129h-400v400l129 -129l294 294z" />
<glyph unicode="&#xe097;" d="M871 730l129 -130h-400v400l129 -129l295 295l142 -141zM200 600h400v-400l-129 130l-295 -295l-142 141l295 295z" />
<glyph unicode="&#xe101;" d="M600 1177q118 0 224.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.5t45.5 224.5t123 184t184 123t224.5 45.5zM686 549l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5 l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5zM700 400h-200v-100h200v100z" />
<glyph unicode="&#xe102;" d="M1200 900h-111v6t-1 15t-3 18l-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-6h-111v-100h100v-200h400v300h200v-300h400v200h100v100z M731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269zM481 900h-281q-3 0 14 48t35 96l18 47zM100 0h400v400h-400v-400zM700 400h400v-400h-400v400z" />
<glyph unicode="&#xe103;" d="M0 121l216 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 -55l-201 -202 v143zM692 611q70 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.5t86.5 76.5q55 66 367 234z" />
<glyph unicode="&#xe105;" d="M1261 600l-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.5t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5 t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30zM600 240q64 0 123.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 54q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212 q0 85 46 158q-102 -87 -226 -258q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5zM484 762l-107 -106q49 -124 154 -191l105 105q-37 24 -75 72t-57 84z" />
<glyph unicode="&#xe106;" d="M906 1200l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148zM1261 600l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5 t-124 -100t-146.5 -79l38 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 -52zM513 264l37 141q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-102 -87 -226 -258q210 -282 393 -336z M484 762l-107 -106q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68z" />
<glyph unicode="&#xe107;" d="M-47 0h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66t50.5 -34zM700 200v100h-200v-100h-345l445 723l445 -723h-345zM700 700h-200v-100l100 -300l100 300v100z" />
<glyph unicode="&#xe108;" d="M800 711l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41q0 20 11 44.5t26 38.5 l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339z" />
<glyph unicode="&#xe110;" d="M941 800l-600 -600h-341v200h259l600 600h241v198l300 -295l-300 -300v197h-159zM381 678l141 142l-181 180h-341v-200h259zM1100 598l300 -295l-300 -300v197h-241l-181 181l141 142l122 -123h159v198z" />
<glyph unicode="&#xe111;" d="M100 1100h1000q41 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.5v600q0 41 29.5 70.5t70.5 29.5z" />
<glyph unicode="&#xe112;" d="M400 900h-300v300h300v-300zM1100 900h-300v300h300v-300zM1100 800v-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.5t-58 109.5t-31.5 116t-15 104t-3 83v200h300v-250q0 -113 6 -145 q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300z" />
<glyph unicode="&#xe113;" d="M902 184l226 227l-578 579l-580 -579l227 -227l352 353z" />
<glyph unicode="&#xe114;" d="M650 218l578 579l-226 227l-353 -353l-352 353l-227 -227z" />
<glyph unicode="&#xe115;" d="M1198 400v600h-796l215 -200h381v-400h-198l299 -283l299 283h-200zM-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196z" />
<glyph unicode="&#xe116;" d="M1050 1200h94q20 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 -15t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35 q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43l-100 475q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5z" />
<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
<glyph unicode="&#xe118;" d="M201 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000zM1501 700l-300 -700h-1200l300 700h1200z" />
<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
<glyph unicode="&#xe120;" d="M900 303v197h-600v-197l-300 297l300 298v-198h600v198l300 -298z" />
<glyph unicode="&#xe121;" d="M31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM100 300h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM900 200h-100v-100h100v100z M1100 200h-100v-100h100v100z" />
<glyph unicode="&#xe122;" d="M1100 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 35zM325 800l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351v250v5 q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200zM-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5z" />
<glyph unicode="&#xe124;" d="M445 1180l-45 -233l-224 78l78 -225l-233 -44l179 -156l-179 -155l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180z" />
<glyph unicode="&#xe125;" d="M700 1200h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400q0 -75 100 -75h61q123 -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.5zM700 925l-50 -225h450 v-125l-250 -375h-214l-136 100h-100v375l150 212l100 213h50v-175zM0 800v-600h200v600h-200z" />
<glyph unicode="&#xe126;" d="M700 0h-50q-27 0 -51 20t-38 48l-96 198l-145 196q-20 26 -20 63v400q0 75 100 75h61q123 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.5zM200 400h-200v600h200 v-600zM700 275l-50 225h450v125l-250 375h-214l-136 -100h-100v-375l150 -212l100 -213h50v175z" />
<glyph unicode="&#xe127;" d="M364 873l362 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-341q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM408 792v-503 l100 -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 83zM208 200h-200v600h200v-600z" />
<glyph unicode="&#xe128;" d="M475 1104l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111t54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6zM370 946 l145 -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-100h222q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237zM1199 201h-200v600h200v-600z" />
<glyph unicode="&#xe129;" d="M1100 473v342q0 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 -53l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90zM911 400h-503l-236 339 l83 86l183 -146q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294zM1000 200v-200h-600v200h600z" />
<glyph unicode="&#xe130;" d="M305 1104v200h600v-200h-600zM605 310l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15l-230 -362q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106z M905 804v-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 -146l-83 86l237 339h503z" />
<glyph unicode="&#xe131;" d="M603 1195q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM598 701h-298v-201h300l-2 -194l402 294l-402 298v-197z" />
<glyph unicode="&#xe132;" d="M597 1195q122 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5zM200 600l400 -294v194h302v201h-300v197z" />
<glyph unicode="&#xe133;" d="M603 1195q121 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM300 600h200v-300h200v300h200l-300 400z" />
<glyph unicode="&#xe134;" d="M603 1195q121 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM500 900v-300h-200l300 -400l300 400h-200v300h-200z" />
<glyph unicode="&#xe135;" d="M603 1195q121 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.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM627 1101q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6 q-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.5q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55 t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q102 -2 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.5t-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 7 q2 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.5q-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.5 t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-19 -3 -37 0zM613 994q0 -18 8 -42.5t16.5 -44t9.5 -23.5q-9 2 -31 5t-36 5t-32 8t-30 14q3 12 16 30t16 25q10 -10 18.5 -10 t14 6t14.5 14.5t16 12.5z" />
<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 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.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
<glyph unicode="&#xe138;" d="M1100 1200v-100h-1000v100h1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
<glyph unicode="&#xe140;" d="M329 729l142 142l-200 200l129 129h-400v-400l129 129zM1200 1200v-400l-129 129l-200 -200l-142 142l200 200l-129 129h400zM271 129l129 -129h-400v400l129 -129l200 200l142 -142zM1071 271l129 129v-400h-400l129 129l-200 200l142 142z" />
<glyph unicode="&#xe141;" d="M596 1192q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1010q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM455 905 q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5t16 38.5t39 16.5zM708 821l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 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.5 q0 32 20.5 56.5t51.5 29.5zM855 709q23 0 38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39q0 22 16 38t39 16zM345 709q23 0 39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39t15.5 38.5t38.5 15.5z" />
<glyph unicode="&#xe143;" d="M649 54l-16 22q-90 125 -293 323q-71 70 -104.5 105.5t-77 89.5t-61 99t-17.5 91q0 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-203 -198 -293 -323zM844 524l12 12 q64 62 97.5 97t64.5 79t31 72q0 71 -48 119t-105 48q-74 0 -132 -82l-118 -171l-114 174q-51 79 -123 79q-60 0 -109.5 -49t-49.5 -118q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203z" />
<glyph unicode="&#xe144;" d="M476 406l19 -17l105 105l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 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 -159q0 -93 66 -159zM123 193l141 -141q66 -66 159 -66q95 0 159 66 l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159q0 -94 66 -160z" />
<glyph unicode="&#xe145;" 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.5zM900 1000h-600v-700h600v700zM600 46q43 0 73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5t-73.5 -30.5t-30.5 -73.5 t30.5 -73.5t73.5 -30.5z" />
<glyph unicode="&#xe148;" d="M700 1029v-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.5h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5 t-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.5zM600 755v274q-61 -8 -97.5 -37.5t-36.5 -102.5q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3zM700 548 v-311q170 18 170 151q0 64 -44 99.5t-126 60.5z" />
<glyph unicode="&#xe149;" d="M866 300l50 -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.5t-30 142.5h-221v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5 t25 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 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94 q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30z" />
<glyph unicode="&#xe150;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1200l298 -300h-198v-900h-200v900h-198z" />
<glyph unicode="&#xe151;" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-500h-100v100h-100v-100h-100v500h300zM901 1100h-100v-200h100v200zM700 500h300v-200h-99v-100h-100v100h99v100h-200v100zM800 100h200v-100h-300v200h100v-100z" />
<glyph unicode="&#xe152;" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-200h-99v-100h-100v100h99v100h-200v100h300zM800 800h200v-100h-300v200h100v-100zM700 500h300v-500h-100v100h-100v-100h-100v500zM801 200h100v200h-100v-200z" />
<glyph unicode="&#xe153;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1100h-100v100h200v-500h-100v400zM1100 500v-500h-100v100h-200v400h300zM1001 400h-100v-200h100v200z" />
<glyph unicode="&#xe154;" d="M300 0l298 300h-198v900h-200v-900h-198zM1100 1200v-500h-100v100h-200v400h300zM1001 1100h-100v-200h100v200zM900 400h-100v100h200v-500h-100v400z" />
<glyph unicode="&#xe155;" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
<glyph unicode="&#xe156;" d="M300 0l298 300h-198v900h-200v-900h-198zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
<glyph unicode="&#xe157;" d="M400 1100h300q162 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.5v300q0 165 117.5 282.5t282.5 117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5z" />
<glyph unicode="&#xe158;" d="M700 0h-300q-163 0 -281.5 117.5t-118.5 282.5v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5zM400 800v-500l333 250z" />
<glyph unicode="&#xe159;" 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.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM800 700h-500l250 -333z" />
<glyph unicode="&#xe160;" d="M1100 700v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM550 733l-250 -333h500z" />
<glyph unicode="&#xe161;" d="M500 1100h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200zM700 550l-400 -350v200h-300v300h300v200z" />
<glyph unicode="&#xe162;" d="M403 2l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32z" />
<glyph unicode="&#xe163;" d="M800 200h-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-300q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185zM900 200v200h-300v300h300v200l400 -350z" />
<glyph unicode="&#xe164;" d="M1200 700l-149 149l-342 -353l-213 213l353 342l-149 149h500v-500zM1022 571l-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.5v-300 q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98z" />
<glyph unicode="&#xe165;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 794 q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
<glyph unicode="&#xe166;" d="M700 800v400h-300v-400h-300l445 -500l450 500h-295zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe167;" d="M400 700v-300h300v300h295l-445 500l-450 -500h300zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe168;" d="M405 400l596 596l-154 155l-442 -442l-150 151l-155 -155zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe169;" d="M409 1103l-97 97l-212 -212l97 -98zM650 861l-149 149l-212 -212l149 -149l-238 -248h700v699zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe170;" d="M539 950l-149 -149l212 -212l149 148l248 -237v700h-699zM297 709l-97 -97l212 -212l98 97zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" />
<glyph unicode="&#xe171;" d="M1200 1199v-1079l-475 272l-310 -393v416h-392zM1166 1148l-672 -712v-226z" />
<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1200h-100v-200h100v200z" />
<glyph unicode="&#xe173;" d="M578 500h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120zM700 1200h-100v-200h100v200zM1300 538l-475 -476l-244 244l123 123l120 -120l353 352z" />
<glyph unicode="&#xe174;" d="M529 500h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170zM700 1200h-100v-200h100v200zM1167 6l-170 170l-170 -170l-127 127l170 170l-170 170l127 127l170 -170l170 170l127 -128 l-170 -169l170 -170z" />
<glyph unicode="&#xe175;" d="M700 500h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200zM700 1000h-100v200h100v-200zM1000 600h-200v-300h-200l300 -300l300 300h-200v300z" />
<glyph unicode="&#xe176;" d="M602 500h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200zM700 1000h-100v200h100v-200zM1000 300h200l-300 300l-300 -300h200v-300h200v300z" />
<glyph unicode="&#xe177;" d="M1200 900v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1200zM0 800v-550q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200zM100 500h400v-200h-400v200z" />
<glyph unicode="&#xe178;" d="M500 1000h400v198l300 -298l-300 -298v198h-400v200zM100 800v200h100v-200h-100zM400 800h-100v200h100v-200zM700 300h-400v-198l-300 298l300 298v-198h400v-200zM800 500h100v-200h-100v200zM1000 500v-200h100v200h-100z" />
<glyph unicode="&#xe179;" d="M1200 50v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM550 1200l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447l-100 203v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300z" />
<glyph unicode="&#xe180;" d="M1100 106v888q0 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.5t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394 q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5z" />
<glyph unicode="&#xe181;" d="M675 1000l-100 100h-375l-100 -100h400l200 -200v-98l295 98h105v200h-425zM500 300v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5zM100 800h300v-200h-300v200zM700 565l400 133 v-163l-400 -133v163zM100 500h300v-200h-300v200zM805 300l295 98v-298h-425l-100 -100h-375l-100 100h400l200 200h105z" />
<glyph unicode="&#xe182;" d="M179 1169l-162 -162q-1 -11 -0.5 -32.5t16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118 q17 17 20 41.5t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14z" />
<glyph unicode="&#xe183;" d="M1200 712v200q-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 -40t-53.5 -36.5t-31 -27.5l-9 -10v-200q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38 t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5zM800 650l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5 t30 -27.5t12 -24l1 -10v-50z" />
<glyph unicode="&#xe184;" d="M175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250zM1200 100v-100h-1100v100h1100z" />
<glyph unicode="&#xe185;" d="M600 1100h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300v1000q0 41 29.5 70.5t70.5 29.5zM1000 800h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300v700q0 41 29.5 70.5t70.5 29.5zM400 0v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400h300z" />
<glyph unicode="&#xe186;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" />
<glyph unicode="&#xe187;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM400 600h-100v200h-100v-500h100v200h100v-200h100v500h-100v-200zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" />
<glyph unicode="&#xe188;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-500h300v100h-200v300h200v100h-300zM600 800v-500h300v100h-200v300h200v100h-300z" />
<glyph unicode="&#xe189;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM500 700l-300 -150l300 -150v300zM600 400l300 150l-300 150v-300z" />
<glyph unicode="&#xe190;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM900 800v-500h-700v500h700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM800 700h-130 q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300z" />
<glyph unicode="&#xe191;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 300h100v500h-200v-100h100v-400z M601 300h100v100h-100v-100z" />
<glyph unicode="&#xe192;" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM300 700v100h-100v-500h300v400h-200zM800 300h100v500h-200v-100h100v-400zM401 400h-100v200h100v-200z M601 300h100v100h-100v-100z" />
<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM1000 900h-900v-700h900v700zM400 700h-200v100h300v-300h-99v-100h-100v100h99v200zM800 700h-100v100h200v-500h-100v400zM201 400h100v-100 h-100v100zM701 300h-100v100h100v-100z" />
<glyph unicode="&#xe194;" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700h-300 v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
<glyph unicode="&#xe195;" d="M596 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700v-100 h-100v100h-200v-100h200v-100h-200v-100h-100v400h300zM800 400h-100v100h100v-100z" />
<glyph unicode="&#xe197;" d="M800 300h128q120 0 205 86t85 208q0 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.5q0 -80 56.5 -137t135.5 -57h222v300h400v-300zM700 200h200l-300 -300 l-300 300h200v300h200v-300z" />
<glyph unicode="&#xe198;" d="M600 714l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.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.5q0 -80 56.5 -137t135.5 -57h8zM700 -100h-200v300h-200l300 300 l300 -300h-200v-300z" />
<glyph unicode="&#xe199;" d="M700 200h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-155l-75 -45h350l-75 45v155z" />
<glyph unicode="&#xe200;" d="M700 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.5t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5 q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350z" />
<glyph unicode="&#x1f4bc;" d="M800 1000h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-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-100zM500 1000h200v100h-200v-100zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
<glyph unicode="&#x1f4c5;" d="M1100 900v150q0 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-150h1100zM0 800v-750q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100zM100 600h100v-100h-100v100zM300 600h100v-100h-100v100z M500 600h100v-100h-100v100zM700 600h100v-100h-100v100zM900 600h100v-100h-100v100zM100 400h100v-100h-100v100zM300 400h100v-100h-100v100zM500 400h100v-100h-100v100zM700 400h100v-100h-100v100zM900 400h100v-100h-100v100zM100 200h100v-100h-100v100zM300 200 h100v-100h-100v100zM500 200h100v-100h-100v100zM700 200h100v-100h-100v100zM900 200h100v-100h-100v100z" />
<glyph unicode="&#x1f4cc;" d="M902 1185l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207l-380 -303l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15z" />
<glyph unicode="&#x1f4ce;" d="M518 119l69 -60l517 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 -163t35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84 t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 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 348 q52 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 -256z" />
<glyph unicode="&#x1f4f7;" d="M1200 200v600q0 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-600q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5z M1000 700h-100v100h100v-100zM844 500q0 -100 -72 -172t-172 -72t-172 72t-72 172t72 172t172 72t172 -72t72 -172zM706 500q0 44 -31 75t-75 31t-75 -31t-31 -75t31 -75t75 -31t75 31t31 75z" />
<glyph unicode="&#x1f512;" d="M900 800h100q41 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.5v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200zM400 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="&#x1f514;" d="M1062 400h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94 q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327zM600 104q-54 0 -103 6q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6z" />
<glyph unicode="&#x1f516;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
<glyph unicode="&#x1f525;" d="M400 755q2 -12 8 -41.5t8 -43t6 -39.5t3.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 -85t5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5 q32 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.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129 q39 -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.5z" />
<glyph unicode="&#x1f527;" d="M948 778l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 62 KiB

View File
Whitespace-only changes.
+24
View File
@@ -0,0 +1,24 @@
<?php
/**
* @brief UTF-8 Conversion
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
require_once 'init.php';
if ( IS_CLI )
{
echo "This is designed to be run via your web browser.\nPlease use cli.php to run this conversion utility via command line.\n";
exit();
}
else
{
\IPSUtf8\Dispatcher\Browser::i()->run();
}
exit();
+259
View File
@@ -0,0 +1,259 @@
<?php
/**
* @brief Init for UTF8 Conversion
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 4 Sept 2013
*/
namespace IPSUtf8;
/**
* Class to contain Invision Community autoloader and exception handler
*/
class IPSUtf8
{
/**
* Initiate Invision Community UTF8 Converter, autoloader and exception handler
*
* @return void
*/
public static function init()
{
/* Set timezone */
date_default_timezone_set( 'UTC' );
/* Set default MB internal encoding */
mb_internal_encoding('UTF-8');
/* Constants */
\define( 'THIS_PATH', __DIR__ );
$bits = explode( DIRECTORY_SEPARATOR, THIS_PATH );
$bit = array_pop( $bits );
$bit2 = array_pop( $bits );
\define( 'ROOT_PATH', preg_replace( '#' . preg_quote( DIRECTORY_SEPARATOR, '#' ) . $bit2 . preg_quote( DIRECTORY_SEPARATOR, '#' ) . $bit . '$#', '', THIS_PATH ) );
\define( 'IS_CLI', ( PHP_SAPI == 'cli' || empty( $_SERVER['REMOTE_ADDR'] ) ) ? true : false );
/* Set Options - deliberately do not use root constants */
if ( file_exists( './constants.php' ) )
{
@include_once( './constants.php' );
}
foreach( static::defaultConstants() AS $k => $v )
{
if ( !\defined( $k ) )
{
\define( $k, $v );
}
}
@set_time_limit(0);
/* Set autoloader */
spl_autoload_register( '\IPSUtf8\IPSUtf8::autoloader', true, true );
set_error_handler( '\IPSUtf8\IPSUtf8::errorHandler' );
set_exception_handler( '\IPSUtf8\IPSUtf8::exceptionHandler' );
}
/**
* Default Constants
*
* @return array
*/
public static function defaultConstants()
{
return array(
'IPB_FIREWALL' => 1, /* This is a workaround for an old exploit to prevent upgrade issues */
'IPB_LOCK' => TRUE, /* Lock conversion to only IP.Board Databases */
'BYPASS_SAFETY_LOCK' => FALSE,
'FORCE_CONVERT' => FALSE, /* Enforce conversion */
'FORCE_CONVERT_CHARSET' => NULL,
'FORCE_CONVERT_METHOD' => NULL,
'SOURCE_DB_CHARSET' => NULL, /* If set, will force the source database connection to use this charset */
'UTF8_INSERT_ONLY' => FALSE, /* If true, and sql_charset is present and set to utf8 in conf_global.php, then the "fast" method will simply insert without converting. Useful for mixed collation databases where the utf8 tables are real utf8 */
'FORCE_MULTI_CONVERT' => FALSE, /* Forces the converter to use CONVERT(CONVERT(CONVERT(x AS <SOURCE_DB_CHARSET>) AS BINARY) AS UTF8) which is needed in some random old data sets */
'LOG' => FALSE, /* Log Conversion Data */
'SOURCE_CHARSET_OVERRIDE' => NULL, /* Force the converter to consider this value the value of IPB3's gb_char_set. Note that these are DOCUMENT Character Sets, not MySQL (so ISO-8859-1 for latin1, etc.) */
'MULTI_NO_CMP' => FALSE, /* When using the multi convert option, set this to true to not check the result of the conversion against the same data collated to utf8, which can cause an error in some situations. */
);
}
/**
* Error Handler
*
* @param int $errno Error number
* @param errstr $errstr Error message
* @param string $errfile File
* @param int $errline Line
* @param array $trace Backtract
* @return void
*/
public static function errorHandler( $errno, $errstr, $errfile, $errline, $trace=NULL )
{
/* We don't care about these in production */
if ( \in_array( $errno, array( E_WARNING, E_NOTICE, E_STRICT, E_DEPRECATED ) ) )
{
return;
}
throw new \ErrorException( $errstr, $errno, 0, $errfile, $errline );
}
/**
* Exception Handler
*
* @param \Exception $exception Exception class
* @return void
*/
public static function exceptionHandler( $exception )
{
/* Send a diagnostics report if we can */
$trace = $exception->getTrace();
if ( isset( $trace[0]['class'] ) )
{
self::diagnostics( $exception, $trace[0]['class'] );
}
/* And display an error screen */
try
{
if ( IS_CLI )
{
print "\nError: " . $exception->getMessage() . "\nFile: " . str_replace( THIS_PATH, '', $exception->getFile() ) . "\nLine: " . $exception->getLine() . "\n";
}
else
{
/* @todo Elaborate on this for browser */
print "\nError: " . $exception->getMessage() . "\nFile: " . str_replace( THIS_PATH, '', $exception->getFile() ) . "\nLine: " . $exception->getLine() . "\n";
}
}
catch ( \Exception $e )
{
if( isset( $_SERVER['SERVER_PROTOCOL'] ) and \strstr( $_SERVER['SERVER_PROTOCOL'], '/1.0' ) !== false )
{
header( "HTTP/1.0 500 Internal Server Error" );
}
else
{
header( "HTTP/1.1 500 Internal Server Error" );
}
if ( IS_CLI )
{
print "\nError: " . $e->getMessage() . "\nString: " . $e->getString() . "\nFile: " . str_replace( THIS_PATH, '', $e->getFile() ) . "\nLine: " . $e->getLine() . "\n";
}
else
{
/* @todo Elaborate on this for browser */
print "\nError: " . $e->getMessage() . "\nString: " . $e->getString() . "\nFile: " . str_replace( THIS_PATH, '', $e->getFile() ) . "\nLine: " . $e->getLine() . "\n";
}
}
exit;
}
/**
* Diagnostics Reporting
*
* @param \Exception $exception Exception
* @param string $class Class that caused the exception
* @return void
*/
public static function diagnostics( $exception, $class )
{
try
{
@file_put_contents( THIS_PATH . '/tmp/error_' . date('Y-m-d') . '.cgi', "\n" . str_repeat( '-', 48 ) . "\n" . date('r') . "\n" . var_export( $exception, true ), FILE_APPEND );
}
catch ( \Exception $e ) {}
}
/**
* Autoloader
*
* @param string $classname Class to load
* @return void
*/
public static function autoloader( $classname )
{
/* Separate by namespace */
$bits = explode( '\\', $classname );
$vendorName = array_shift( $bits );
/* Work out what namespace we're in */
$class = array_pop( $bits );
$namespace = empty( $bits ) ? 'IPSUtf8' : ( 'IPSUtf8\\' . implode( '\\', $bits ) );
if( !class_exists( "{$namespace}\\{$class}", FALSE ) )
{
/* Locate file */
$path = THIS_PATH . '/';
$sourcesDirSet = FALSE;
foreach ( array_merge( $bits, array( $class ) ) as $i => $bit )
{
if( preg_match( "/^[a-z0-9]/", $bit ) )
{
if( $i === 0 )
{
$sourcesDirSet = TRUE;
}
}
else if( $sourcesDirSet === FALSE )
{
$path .= 'system/';
$sourcesDirSet = TRUE;
}
$path .= "{$bit}/";
}
/* Load it */
$path = \substr( $path, 0, -1 ) . '.php';
if( !file_exists( $path ) )
{
$path = \substr( $path, 0, -4 ) . \substr( $path, \strrpos( $path, '/' ) );
if ( !file_exists( $path ) )
{
return FALSE;
}
}
require_once( $path );
/* Is it an interface? */
if ( interface_exists( "{$namespace}\\{$class}", FALSE ) )
{
return;
}
/* Doesn't exist? */
if( !class_exists( "{$namespace}\\{$class}", FALSE ) )
{
trigger_error( "Class {$classname} could not be loaded. Ensure it is in the correct namespace.", E_USER_ERROR );
}
}
}
}
/* Init */
IPSUtf8::init();
/* Custom mb_ucfirst() function - eval'd so we can put into global namespace */
eval( '
function mb_ucfirst()
{
$text = \func_get_arg( 0 );
return mb_strtoupper( mb_substr( $text, 0, 1 ) ) . mb_substr( $text, 1 );
}
');
+189
View File
@@ -0,0 +1,189 @@
/**
* IPS UTF8 Converter
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
*
* Author: Matt "I'm no Rikki Tissier" Mecham
*/
// Our namespace
var ips = {};
!function($, window, document, _undefined)
{
$.extend(ips,
{
_settings: {},
boot: function (config) {
_settings = config;
if ( $('[data-init]').length )
{
var func = $('[data-init]').attr('data-init');
this[func]();
}
$('body').on( 'click', 'a[data-confirm]', $.proxy( function(e) {
return this.confirm( e );
}, this ) );
$('body').on( 'click', 'button[data-modal=submit]', $.proxy( function(e) {
return this.modalSubmit( e );
}, this ) );
},
/**
* Confirm modal
*/
confirm: function(e)
{
var elem = $(e.target).closest('[data-confirm]');
var url = $(elem).attr('href');
$('#confirmModal').modal('show');
$('#confirmModal').attr('data-url', url );
$('#confirmModalText').html("Please confirm this action");
$('button[data-modal=submit]').html("Confirm");
return false;
},
/**
* Confirm modal
*/
modalSubmit: function(e)
{
var url = $('#confirmModal').attr('data-url');
$('#confirmModal').modal('hide');
window.location = url;
return false;
},
/**
* Init the processing screen
*/
processInit: function()
{
ips.process();
},
/**
* Main processing screen
*
*/
process: function()
{
/* Fire captain! */
ips.ajax( $('body').attr('data-url') + '?controller=' + ips.getSetting('controller') + '&do=process', {}, function( data, status, xhr )
{
console.dir( data );
if ( data[0] == 'completed' )
{
window.location = $('body').attr('data-url') + '?controller=' + ips.getSetting('controller') + '&do=completed';
}
else
{
$("#progressBar").css( 'width', data[1] + '%');
$("#progressBar span").html( data[2] );
}
$('#message').html( data[2] );
ips.process();
}, { 'type': 'GET' } );
},
/**
* Ajax Wrapper. POSTs and expects JSON
*
* @param string URL
* @param object POST data
* @param function Callback
* @param object Additional options to override or extend defaults
*
* @return XMLHttpRequest
*/
ajax: function( url, data, success, options )
{
var ajaxOptions = $.extend(true,
{
data: data,
url: url,
timeout: ips.getSetting('maxExecTime') !== false ? parseInt( ips.getSetting('maxExecTime') * 1000 ) : 30000,
cache: false,
success: function( data, textStatus, jqXHR )
{
success( data, textStatus, jqXHR );
},
type: 'POST',
dataType: 'json',
error: function(xhr, textStatus, errorThrown)
{
try
{
/* If its JSON, run it anyway */
success.call(null, $.parseJSON(xhr.responseText), textStatus);
}
catch (e)
{
/* Throw error */
ips.serverError(xhr, textStatus, errorThrown);
}
}
}, options);
return $.ajax(ajaxOptions);
},
/**
* Server error
*/
serverError: function( xhr, responseText, errorThrow )
{
if ( responseText === 'timeout' )
{
var counter = ( ips.getUrlParam('count') === false ) ? 0 : parseInt( ips.getUrlParam('count') );
if ( counter < 101 )
{
window.location = $('body').attr('data-url') + '?controller=' + ips.getSetting('controller') + '&do=process&count=' + ( counter + 1 );
return;
}
$('#confirmModal').modal('show');
$('button[data-modal=submit]').html("Continue");
$('#confirmModal').attr('data-url', $('body').attr('data-url') + '?controller=' + ips.getSetting('controller') + '&do=process' );
$('#confirmModalText').html("The server encountered multiple instances where it has stopped responding.<br><br>Press 'Continue' to reload the page and continue the conversion.<br>Press 'Cancel' to pause the conversion so that you may contact technical support.");
}
console.error( xhr.responseText );
},
getUrlParam: function( name )
{
if ( name = ( new RegExp( '[?&]'+encodeURIComponent( name ) + '=([^&]*)' ) ).exec( location.search ) )
{
return decodeURIComponent( name[1] );
}
return false;
},
/**
* Config getter
*
* @param {string} key Setting key to return
* @returns {*} Config setting, or undefined if it doesn't exist
*/
getSetting: function (key) {
return ( _settings.hasOwnProperty( key ) ) ? _settings[ key ] : false;
}
} );
ips.boot( ipsSettings );
}(jQuery, this, document);
+6
View File
@@ -0,0 +1,6 @@
/**
* bootstrap.js v3.0.0 by @fat and @mdo
* Copyright 2013 Twitter Inc.
* http://www.apache.org/licenses/LICENSE-2.0
*/
if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(functLine truncated
View File
Whitespace-only changes.
+6
View File
@@ -0,0 +1,6 @@
/*! jQuery UI - v1.10.3 - 2013-09-27
* http://jqueryui.com
* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js
* Copyright 2013 jQuery Foundation and other contributors; Licensed MIT */
(function(e,t){function i(t,i){var s,o,u,r=t.nodeName.toLowerCase();return"area"===r?(s=t.parentNode,o=s.name,t.href&&o&&"map"===s.nodeName.toLowerCase()?(u=e("img[usemap=#"+o+"]")[0],!!u&&n(u)):!1):(/input|select|textarea|button|object/.test(r)?!t.disabled:"a"===r?t.href||i:i)&&n(t)}function n(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var s=0,o=/^ui-id-\d+$/;e.ui=e.ui||{},e.extend(e.ui,{version:"1.10.3",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({focus:function(t){return function(i,n){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),n&&n.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var n,s,o=e(this[0]);o.length&&o[0]!==document;){if(n=o.css("position"),("absolute"===n||"relative"===n||"fixed"===n)&&(s=parseInt(o.css("zIndex"),10),!isNaN(s)&&0!==s))return s;o=o.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++s)})},removeUniqueId:function(){return this.each(function(){o.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,n){return!!e.data(t,n[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),s=isNaN(n);return(s||n>=0)&&i(t,!s)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(i,n){function s(t,i,n,s){return e.each(o,function(){i-=parseFloat(e.css(t,"padding"+this))||0,n&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var o="Width"===n?["Left","Right"]:["Top","Bottom"],u=n.toLowerCase(),r={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+n]=function(i){return i===t?r["inner"+n].call(this):this.each(function(){e(this).css(u,s(this,i)+"px")})},e.fn["outer"+n]=function(t,i){return"number"!=typeof t?r["outer"+n].call(this,t):this.each(function(){e(this).css(u,s(this,t,!0,i)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.support.selectstart="onselectstart"in document.createElement("div"),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,n){var s,o=e.ui[t].prototype;for(s in n)o.plugins[s]=o.plugins[s]||[],o.plugins[s].push([i,n[s]])},call:function(e,t,i){var n,s=e.plugins[t];if(s&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(n=0;s.length>n;n++)e.options[s[n][0]]&&s[n][1].apply(e.element,i)}},hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var n=i&&"left"===i?"scrollLeft":"scrollTop",s=!1;return t[n]>0?!0:(t[n]=1,s=t[n]>0,t[n]=0,s)}})})(jQuery);(function(e,t){var i=0,n=Array.prototype.slice,s=e.cleanData;e.cleanData=function(t){for(var i,n=0;null!=(i=t[n]);n++)try{e(i).triggerHandler("remove")}catch(o){}s(t)},e.widget=function(i,n,s){var o,r,a,u,l={},h=i.split(".")[0];i=i.split(".")[1],o=h+"-"+i,s||(s=n,n=e.Widget),e.expr[":"][o.toLowerCase()]=function(t){return!!e.data(t,o)},e[h]=e[h]||{},r=e[h][i],a=e[h][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new a(e,i)},e.extend(a,r,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),u=new n,u.options=e.widget.extend({},u.options),e.each(s,function(i,s){return e.isFunction(s)?(l[i]=function(){var e=function(){return n.prototype[i].apply(this,arguments)},t=function(e){return n.prototype[i].apply(this,e)};return function(){var i,n=this._super,o=this._superApply;return this._suLine truncated
+6
View File
@@ -0,0 +1,6 @@
/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
//@ sourceMappingURL=jquery-1.10.2.min.map
*/
(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(eLine truncated
}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])whilLine truncated
u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(iLine truncated
@@ -0,0 +1,157 @@
<?php
/**
* @brief Web conversion process
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8\modules\browser;
use \IPSUtf8\Output\Browser\Template;
/**
* Web Conversion process
*/
class archive extends \IPSUtf8\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function manage()
{
$output = NULL;
switch( \IPSUtf8\Session::i()->status )
{
default:
$this->welcome();
break;
case 'completed':
/* Regardless of current status, if the archive table is not utf8 we need to convert it */
if ( \IPSUtf8\Convert\Archive::i()->getNonUtf8Tables( TRUE ) !== NULL )
{
$this->welcome();
}
else
{
$this->completed();
}
break;
}
}
/**
* Process
*
* @return void
*/
public function process()
{
if ( isset( \IPSUtf8\Request::i()->use_utf8mb4 ) )
{
$sessionData = \IPSUtf8\Session::i()->json;
$sessionData['use_utf8mb4'] = ( ! empty( \IPSUtf8\Request::i()->use_utf8mb4 ) ) ? 1 : 0;
\IPSUtf8\Session::i()->json = $sessionData;
\IPSUtf8\Session::i()->save();
}
\IPSUtf8\Convert\Archive::i()->process( 100 );
$json = \IPSUtf8\Session::i()->json;
$percent = round( ($json['convertedCount'] / \IPSUtf8\Convert\Archive::i()->getTotalRowsToConvert()) * 100, 2 );
$msg = "Processing " . \IPSUtf8\Session::i()->current_table . ' (Total: ' . $percent . '%)';
if ( \in_array( \IPSUtf8\Convert\Archive::ARCHIVE_TABLE, array_keys( \IPSUtf8\Session::i()->completed_json ) ) )
{
\IPSUtf8\Session::i()->status = 'completed';
\IPSUtf8\Session::i()->save();
}
if ( ! \IPSUtf8\Request::i()->isAjax() )
{
\IPSUtf8\Output\Browser::i()->output = Template::process( \IPSUtf8\Session::i()->status, $percent, $msg );
}
else
{
\IPSUtf8\Output\Browser::i()->sendOutput( json_encode( array( \IPSUtf8\Session::i()->status, $percent, $msg ) ), 200, 'application/json' );
}
}
/**
* Completed
*
* @return void
*/
public function reset()
{
\IPSUtf8\Session::i()->reset();
return $this->welcome();
}
/**
* Completed
*
* @return void
*/
public function completed()
{
return $this->finish();
}
/**
* We're finished! (In a good way)
*
* @return void
*/
public function finish()
{
\IPSUtf8\Convert\Archive::i()->renameTables();
\IPSUtf8\Session::i()->status = null;
\IPSUtf8\Session::i()->completed_json = array();
\IPSUtf8\Session::i()->reset();
\IPSUtf8\Output\Browser::i()->output = Template::finished();
}
/**
* Welcome page
*
* @return void
*/
public function welcome()
{
if ( ! is_writable( THIS_PATH . '/tmp' ) )
{
\IPSUtf8\Output\Browser::i()->error("Please ensure that '" . THIS_PATH . '/tmp' . "' is writable.");
exit();
}
if ( ! \count( \IPSUtf8\Session::i()->has_archive ) )
{
\IPSUtf8\Output\Browser::i()->error("Cannot locate a separate database for the post archive.");
exit();
}
if ( ! \count( \IPSUtf8\Session::i()->tables ) )
{
\IPSUtf8\Output\Browser::i()->error("No tables found for processing. Please check to ensure the correct database name and prefix are being used.");
exit();
}
$json = \IPSUtf8\Session::i()->json;
$percent = ( \IPSUtf8\Convert\Archive::i()->getTotalRowsToConvert() ) ? round( ($json['convertedCount'] / \IPSUtf8\Convert\Archive::i()->getTotalRowsToConvert() ) * 100, 2 ) : 100;
$isUtf8 = (boolean) ( \IPSUtf8\Convert\Archive::i()->databaseIsUtf8() );
$processing = (boolean) ( \IPSUtf8\Session::i()->status === 'processing' );
\IPSUtf8\Output\Browser::i()->output = Template::welcome( $isUtf8, \IPSUtf8\Session::i()->status, $percent, 'archive' );
}
}
@@ -0,0 +1,177 @@
<?php
/**
* @brief Web conversion process
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8\modules\browser;
use \IPSUtf8\Output\Browser\Template;
/**
* Web Conversion process
*/
class browser extends \IPSUtf8\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function manage()
{
$output = NULL;
switch( \IPSUtf8\Session::i()->status )
{
default:
$this->welcome();
break;
case 'completed':
$this->completed();
break;
}
}
/**
* Process
*
* @return void
*/
public function process()
{
if ( isset( \IPSUtf8\Request::i()->use_utf8mb4 ) )
{
$sessionData = \IPSUtf8\Session::i()->json;
$sessionData['use_utf8mb4'] = ( ! empty( \IPSUtf8\Request::i()->use_utf8mb4 ) ) ? 1 : 0;
\IPSUtf8\Session::i()->json = $sessionData;
\IPSUtf8\Session::i()->save();
}
\IPSUtf8\Convert::i()->process( 100 );
$json = \IPSUtf8\Session::i()->json;
$percent = round( ($json['convertedCount'] / \IPSUtf8\Convert::i()->getTotalRowsToConvert()) * 100, 2 );
$msg = "Processing " . \IPSUtf8\Session::i()->current_table . '<br>Row: ' . \IPSUtf8\Session::i()->current_row . ' of ' . \IPSUtf8\Session::i()->tables[ \IPSUtf8\Session::i()->current_table ]['count'] . ' - Total: ' . $percent . '%';
if ( ! \IPSUtf8\Request::i()->isAjax() )
{
\IPSUtf8\Output\Browser::i()->output = Template::process( \IPSUtf8\Session::i()->status, $percent, $msg );
}
else
{
\IPSUtf8\Output\Browser::i()->sendOutput( json_encode( array( \IPSUtf8\Session::i()->status, $percent, $msg ) ), 200, 'application/json' );
}
}
/**
* Completed
*
* @return void
*/
public function reset()
{
\IPSUtf8\Session::i()->reset();
return $this->welcome();
}
/**
* Completed
*
* @return void
*/
public function completed()
{
\IPSUtf8\Convert::i()->finish();
\IPSUtf8\Output\Browser::i()->output = Template::completed( \IPSUtf8\Session::i()->timeTaken( true ) );
}
/**
* We're finished! (In a good way)
*
* @return void
*/
public function finish()
{
\IPSUtf8\Convert::i()->renameTables();
\IPSUtf8\Session::i()->status = null;
\IPSUtf8\Session::i()->completed_json = array();
\IPSUtf8\Session::i()->reset();
/* Attempt to automatically update conf_global.php */
$updated = FALSE;
$INFO = array();
include( ROOT_PATH . '/conf_global.php' );
$sessionData = \IPSUtf8\Session::i()->json;
$sql_charset = ( array_key_exists( 'utf8mb4', $sessionData['charSets'] ) ) ? 'utf8mb4' : 'utf8';
if( $INFO['sql_charset'] == $sql_charset )
{
$updated = TRUE;
}
else
{
if ( file_exists( ROOT_PATH . '/conf_global.php' ) AND is_writable( ROOT_PATH . '/conf_global.php' ) )
{
$INFO['sql_charset'] = $sql_charset;
if ( $sql_charset == 'utf8mb4' )
{
$INFO['sql_utf8mb4'] = true;
}
\file_put_contents( ROOT_PATH . '/conf_global.php', "<?php\n\n" . '$INFO = ' . var_export( $INFO, TRUE ) . ';' );
$updated = TRUE;
}
}
\IPSUtf8\Output\Browser::i()->output = Template::finished( $updated );
}
/**
* Welcome page
*
* @return void
*/
public function welcome()
{
if ( ! is_dir( THIS_PATH . '/tmp' ) )
{
@mkdir( THIS_PATH . '/tmp' );
@chmod( THIS_PATH . '/tmp', 0777 );
}
if ( ! is_writable( THIS_PATH . '/tmp' ) )
{
\IPSUtf8\Output\Browser::i()->error("Please ensure that '" . THIS_PATH . '/tmp' . "' is writable.");
exit();
}
if ( IPB_LOCK and ! \IPSUtf8\Session::i()->is_ipb )
{
\IPSUtf8\Output\Browser::i()->error("Cannot locate the IP.Board database tables. Please check to ensure the SQL Prefix if set, is correct in 'conf_global.php'.");
exit();
}
if ( ! \count( \IPSUtf8\Session::i()->tables ) )
{
\IPSUtf8\Output\Browser::i()->error("No tables found for processing. Please check to ensure the correct database name and prefix are being used.");
exit();
}
$json = \IPSUtf8\Session::i()->json;
$percent = ( \IPSUtf8\Convert::i()->getTotalRowsToConvert() ) ? round( ($json['convertedCount'] / \IPSUtf8\Convert::i()->getTotalRowsToConvert() ) * 100, 2 ) : 100;
$isUtf8 = (boolean) ( \IPSUtf8\Convert::i()->databaseIsUtf8() );
$processing = (boolean) ( \IPSUtf8\Session::i()->status === 'processing' );
\IPSUtf8\Output\Browser::i()->output = Template::welcome( $isUtf8, \IPSUtf8\Session::i()->status, $percent );
}
}
Whitespace-only changes.
@@ -0,0 +1,51 @@
<?php
/**
* @brief Web conversion process
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8\modules\browser;
use \IPSUtf8\Output\Browser\Template;
/**
* Web Conversion process
*/
class tools extends \IPSUtf8\Dispatcher\Controller
{
/**
* Execute
*
* @return void
*/
public function manage( $msg=null )
{
$isUtf8 = (boolean) ( \IPSUtf8\Convert::i()->database_charset == 'utf8' OR \IPSUtf8\Session::i()->current_charset == 'utf-8' );
\IPSUtf8\Output\Browser::i()->output = Template::tools( $isUtf8, $msg );
}
/**
* Check and repair collation
*
* @return void
*/
public function collation()
{
if( ( version_compare( \IPSUtf8\Db::i()->server_info, '5.5.3', '>=' ) AND \IPSUtf8\Db::i('utf8')->set_charset('utf8mb4') !== FALSE ) )
{
$sessionData = \IPSUtf8\Session::i()->json;
$sessionData['use_utf8mb4'] = 1;
\IPSUtf8\Session::i()->json = $sessionData;
\IPSUtf8\Session::i()->save();
}
\IPSUtf8\Session::i()->updateTableData();
\IPSUtf8\Convert::i()->fixCollation();
$this->manage( "Collation checked and fixed where appropriate" );
}
}
+469
View File
@@ -0,0 +1,469 @@
<?php
/**
* @brief CLI conversion process
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8\modules\cli;
/**
* CLI Conversion process
*/
class cli
{
/**
* @brief Conversion class
*/
protected static $convertClass = NULL;
/**
* Execute
*
* @return void
*/
public function execute()
{
static::$convertClass = '\IPSUtf8\Convert';
$convertClass = static::$convertClass;
if ( ! is_dir( THIS_PATH . '/tmp' ) )
{
@mkdir( THIS_PATH . '/tmp' );
@chmod( THIS_PATH . '/tmp', 0777 );
}
if ( ! is_writable( THIS_PATH . '/tmp' ) )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "<warning>Please ensure that '" . THIS_PATH . '/tmp' . "' is writable.</warning>");
exit();
}
if ( \IPSUtf8\Request::i()->isRestore() )
{
$this->restore();
}
if ( \IPSUtf8\Request::i()->isDeleteOriginals() )
{
$this->deleteOriginals();
}
if ( IPB_LOCK and ! \IPSUtf8\Session::i()->is_ipb )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "<warning>Cannot locate the IP.Board database tables. Please check to ensure the SQL Prefix if set, is correct in 'conf_global.php'.</warning>");
exit();
}
if ( \IPSUtf8\Request::i()->isDumpMethod() )
{
$this->dumpMethod();
}
if ( \IPSUtf8\Request::i()->isInfo() )
{
\IPSUtf8\Output\Cli::i()->sendOutput( implode( "\n", $convertClass::i()->getDebugString() ) );
exit();
}
$welcome = 'Welcome to the IPS UTF8 Conversion utility (v' . \IPSUtf8\Convert::VERSION_ID . ')';
$intro = "This utility will convert all the tables in this database to UTF-8.\nThe converted data is inserted into new tables prefixed with x_utf_ and the original data kept.";
\IPSUtf8\Output\Cli::i()->sendOutput( str_repeat( '-', \strlen( $welcome ) ) . "\n" . $welcome . "\n" . str_repeat( '-', \strlen( $welcome ) ) );
if ( \IPSUtf8\Session::i()->has_archive )
{
if ( ! \count( \IPSUtf8\Convert\Archive::i()->getNonUtf8Tables ) )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "You have an archive table in a different database, and it is UTF8 and collations are correct." );
}
else
{
\IPSUtf8\Output\Cli::i()->sendOutput( "<choice>You have an archive table in a different database, convert this now?\n[y] Enter 'y' to convert (recommended)\n[x] Enter 'n' to skip conversion.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
/* Convert */
while( \IPSUtf8\Convert\Archive::i()->process( 250 ) === true )
{
$json = \IPSUtf8\Session::i()->json;
\IPSUtf8\Output\Cli::i()->sendOutput( \IPSUtf8\Output\Cli::i()->progressBar( \IPSUtf8\Session::i()->current_table, \IPSUtf8\Convert\Archive::i()->getTotalRowsToConvert(), $json['convertedCount'] ), 101 );
}
\IPSUtf8\Convert\Archive::i()->renameTables();
\IPSUtf8\Session::i()->reset();
\IPSUtf8\Output\Cli::i()->sendOutput( "Archive table converted" );
}
}
}
if ( ! \count( \IPSUtf8\Session::i()->tables ) )
{
\IPSUtf8\Output\Cli::i()->sendOutput("No tables found for processing. Please check to ensure the correct database name and prefix are being used.");
exit();
}
if ( empty( \IPSUtf8\Session::i()->status ) )
{
if ( $convertClass::i()->databaseIsUtf8() )
{
/* Check collations */
if ( ! \count( $convertClass::i()->getNonUtf8CollationTables() ) )
{
/* We're golden! */
\IPSUtf8\Output\Cli::i()->sendOutput("The database is set to UTF-8, collations are correct and doesn't need converting.\n<choice>[x] Enter 'x' to exit the conversion (RECOMMENDED).\n[y] Enter 'y' to perform a full conversion anyway</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'x' )
{
exit();
}
else if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
$sessionData = \IPSUtf8\Session::i()->json;
$sessionData['force_conversion'] = 1;
\IPSUtf8\Session::i()->json = $sessionData;
\IPSUtf8\Session::i()->save();
/* Force a recount of tables */
$convertClass::i()->getNonUtf8Tables( true );
}
}
else
{
$this->collationFix();
}
}
\IPSUtf8\Output\Cli::i()->sendOutput( "\n" . \count( $convertClass::i()->getNonUtf8Tables() ) . " table(s) are not UTF-8 and need converting.\n");
$origUtf8Charset = \IPSUtf8\Db::i('utf8')->getCharset();
$canMb4 = (bool) \IPSUtf8\Db::i('utf8')->set_charset( 'utf8mb4' );
\IPSUtf8\Db::i('utf8')->set_charset( $origUtf8Charset );
if ( version_compare( \IPSUtf8\Db::i()->server_info, '5.5.3', '>=' ) AND $canMb4 !== FALSE )
{
$sessionData = \IPSUtf8\Session::i()->json;
$sessionData['use_utf8mb4'] = 1;
\IPSUtf8\Session::i()->json = $sessionData;
\IPSUtf8\Session::i()->save();
}
\IPSUtf8\Output\Cli::i()->sendOutput( $intro );
\IPSUtf8\Output\Cli::i()->sendOutput( "Press enter to continue", 100 );
}
else if ( \IPSUtf8\Session::i()->status === 'completed' )
{
$this->completed();
}
else
{
$date = date('D j F Y', \IPSUtf8\Session::i()->updated );
$count = \count( array_keys( \IPSUtf8\Session::i()->completed_json ) );
$pcent = round( ( \IPSUtf8\Session::i()->json['convertedCount'] / $convertClass::i()->getTotalRowsToConvert() * 100 ) );
$more = "<warning>You have a conversion session unfinished. The session was last updated on " . $date . " and has processed " . $count . " tables (" . $pcent . "%) so far.</warning>";
\IPSUtf8\Output\Cli::i()->sendOutput( $intro );
\IPSUtf8\Output\Cli::i()->sendOutput( $more );
\IPSUtf8\Output\Cli::i()->sendOutput( "<choice>[c] Enter 'c' to continue\n[x] Enter 'x' to reset and start the conversion again.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'x' )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "Are you sure? This will re-start the conversion\n<choice>[y] Enter 'y' to re-start the conversion\n[c] Enter 'c' to continue the conversion.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
\IPSUtf8\Session::i()->reset();
return $this->execute();
}
}
}
$json = \IPSUtf8\Session::i()->json;
\IPSUtf8\Output\Cli::i()->sendOutput( \IPSUtf8\Output\Cli::i()->progressBar( \IPSUtf8\Session::i()->current_table, $convertClass::i()->getTotalRowsToConvert(), $json['convertedCount'] ), 101 );
/* Convert */
while( $convertClass::i()->process( 250 ) === true )
{
$json = \IPSUtf8\Session::i()->json;
\IPSUtf8\Output\Cli::i()->sendOutput( \IPSUtf8\Output\Cli::i()->progressBar( \IPSUtf8\Session::i()->current_table, $convertClass::i()->getTotalRowsToConvert(), $json['convertedCount'] ), 101 );
}
/* Check for completed */
if ( \IPSUtf8\Session::i()->status === 'completed' )
{
$json = \IPSUtf8\Session::i()->json;
\IPSUtf8\Output\Cli::i()->sendOutput( \IPSUtf8\Output\Cli::i()->progressBar( \IPSUtf8\Session::i()->current_table, $convertClass::i()->getTotalRowsToConvert(), $convertClass::i()->getTotalRowsToConvert() ), 101 );
$this->completed();
}
}
/**
* Fix collations
*
*/
public function collationFix()
{
$convertClass = static::$convertClass;
\IPSUtf8\Output\Cli::i()->sendOutput("The database is set to UTF-8 and all tables are UTF-8 but " . \count( $convertClass::i()->getNonUtf8CollationTables() ) . " table(s) have incorrect collations and need fixing.\n<choice>[f] Enter 'f' to fix table and field collations (RECOMMENDED)\n[y] Enter 'y' to perform a full conversion\n[x] Enter 'x' to exit the conversion</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'x' )
{
exit();
}
else if ( \IPSUtf8\Output\Cli::i()->response === 'f' )
{
\IPSUtf8\Output\Cli::i()->sendOutput("Running now. This can take a while to complete...");
$convertClass::i()->fixCollation();
\IPSUtf8\Output\Cli::i()->sendOutput("Collation checked and fixed where appropriate");
exit();
}
}
/**
* Process is completed
*/
public function completed()
{
$convertClass = static::$convertClass;
$sessionData = \IPSUtf8\Session::i()->json;
$sql_charset = ( $sessionData['use_utf8mb4'] ) ? 'utf8mb4' : 'utf8';
$utf8mb4 = ( $sessionData['use_utf8mb4'] ) ? "\n\$INFO['sql_utf8mb4'] = true;" : '';
\IPSUtf8\Output\Cli::i()->sendOutput( "\nConversion has completed in " . \IPSUtf8\Session::i()->timeTaken( true ) );
\IPSUtf8\Output\Cli::i()->sendOutput( "<choice>[f] Enter 'f' to finish\n[x] Enter 'x' to reset and start the conversion again.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'x' )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "Are you sure? This will re-start the conversion\n<choice>[y] Enter 'y' to re-start the conversion\n[f] Enter 'f' to finish the conversion.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
\IPSUtf8\Session::i()->reset();
return $this->execute();
}
}
$convertClass::i()->finish();
\IPSUtf8\Output\Cli::i()->sendOutput( "You can now test the conversion by:\n\nEditing conf_global.php to add:\n \$INFO['sql_charset'] = '" . $sql_charset . "';{$utf8mb4}\nChange \$INFO['sql_tbl_prefix'] to: \$INFO['sql_tbl_prefix'] = '" . \IPSUtf8\Db::i('utf8')->prefix . "';\n" );
\IPSUtf8\Output\Cli::i()->sendOutput( "If you are happy with the conversion, you can have it permanently rename the tables so that you can restore your original 'sql_table_prefix' and delete the original tables." );
\IPSUtf8\Output\Cli::i()->sendOutput( "<choice>[y] Enter 'y' to rename your tables\n[x] Enter 'x' to reset and start the conversion again.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'x' )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "Are you sure? This will re-start the conversion\n<choice>[y] Enter 'y' to re-start the conversion\n[f] Enter 'f' to finish the conversion.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
\IPSUtf8\Session::i()->reset();
return $this->execute();
}
}
\IPSUtf8\Output\Cli::i()->sendOutput( "Renaming tables, this may take a short while." );
$convertClass::i()->renameTables();
if ( \count( $convertClass::i()->getNonUtf8CollationTables() ) )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "Checking and fixing collations." );
$convertClass::i()->fixCollation();
}
\IPSUtf8\Output\Cli::i()->sendOutput( "You can now complete the conversion by editing conf_global.php to add \$INFO['sql_charset'] = '" . $sql_charset . "'; and to change \$INFO['sql_tbl_prefix'] to:\n\$INFO['sql_tbl_prefix'] = '" . \IPSUtf8\Db::i()->prefix . "';" );
exit();
}
/**
* Restore tables orig_ back
*
* @return void
*/
protected function restore()
{
$convertClass = static::$convertClass;
\IPSUtf8\Output\Cli::i()->sendOutput( "<choice>Restore the original *non-UTF8* tables?\n[y] Enter 'y' to restore\n[x] Enter 'n' to exit.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
$convertClass::i()->restoreOriginalTables();
\IPSUtf8\Session::i()->reset();
\IPSUtf8\Output\Cli::i()->sendOutput( "Tables restored" );
}
exit();
}
/**
* Delete tables orig_
*
* @return void
*/
protected function deleteOriginals()
{
$convertClass = static::$convertClass;
\IPSUtf8\Output\Cli::i()->sendOutput( "<choice>DELETE the original *non-UTF8* tables?\n[y] Enter 'y' to delete\n[x] Enter 'n' to exit.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
$convertClass::i()->deleteOriginalTables();
\IPSUtf8\Session::i()->reset();
\IPSUtf8\Output\Cli::i()->sendOutput( "Tables deleted" );
}
exit();
}
/**
* Dump method. No laughing at the back
*
* @return void
*/
protected function dumpMethod()
{
$convertClass = static::$convertClass;
\IPSUtf8\Session::i()->reset();
/* Names are getting silly now */
if ( ! $convertClass::canDump() )
{
\IPSUtf8\Output\Cli::i()->sendOutput("Sorry, you can not use this as either shell_exec or iconv are disabled. Please re-run without the --dump flag");
exit();
}
\IPSUtf8\Output\Cli::i()->sendOutput("<warning>This method will OVERWRITE your existing database so please only perform this on a copy of your database.</warning>");
\IPSUtf8\Output\Cli::i()->sendOutput( "<choice>[y] Enter 'y' to continue\n[n] Enter 'n' to exit.</choice>", 100 );
if ( \IPSUtf8\Output\Cli::i()->response !== 'y' )
{
\IPSUtf8\Output\Cli::i()->sendOutput("If you want to convert without overwriting your database, please re-run without the --dump flag");
exit();
}
/* Lets continue as we're good to go */
$myDump = 'mysqldump';
if ( isset( $GLOBALS['argv'][2] ) )
{
$myDumpPath = str_replace( array( '/mysqldump', 'mysqldump' ), '', $GLOBALS['argv'][2] );
}
else
{
\IPSUtf8\Output\Cli::i()->sendOutput( "Please enter the path to mysqldump. If you do not know, or it does not have a path, just press enter\n<choice>Enter the path to mysqldump</choice>", 100 );
$myDumpPath = trim( str_replace( array( '/mysqldump', 'mysqldump' ), '', \IPSUtf8\Output\Cli::i()->response ), "\n" );
}
$myDump = $myDumpPath ? rtrim( $myDumpPath, '/' ) . '/' . $myDump : $myDump;
$mySql = $myDumpPath ? rtrim( $myDumpPath, '/' ) . '/mysql' : 'mysql';
$output = shell_exec( $myDump . ' --help' );
if ( stristr( $output, 'not found' ) )
{
\IPSUtf8\Output\Cli::i()->sendOutput( $myDump . " could not be found.");
exit();
}
$toConvert = $convertClass::i()->getNonUtf8Tables();
if ( ! \count( $toConvert ) )
{
\IPSUtf8\Output\Cli::i()->sendOutput("Nothing to convert!");
exit();
}
require( ROOT_PATH . '/conf_global.php' );
$socket = '';
$port = '';
if ( isset( $INFO['sql_socket'] ) and ! empty($INFO['sql_socket']) )
{
$socket = ' --socket=' . $INFO['sql_socket'];
}
if ( isset( $INFO['sql_port'] ) and ! empty($INFO['sql_port']) )
{
$port = ' --port=' . $INFO['sql_port'];
}
foreach( $toConvert as $table )
{
//$command = $myDump . $socket . " --max_allowed_packet=500M --quick --add-drop-table -u " . $INFO['sql_user'] . " --password='" . $INFO['sql_pass'] . "' " . $INFO['sql_database'] . " " . $table . " | sed -e 's/CHARSET\\=latin1/CHARSET\\=utf8\\ COLLATE\\=utf8_general_ci/g' | iconv -f latin1 -t UTF-8 | " . $mySql . " -u " . $INFO['sql_user'] . " --password='" . $INFO['sql_pass'] . "' " . $INFO['sql_database'];
$tableCharSet = \IPSUtf8\Convert::i()->database_charset;
$tableData = \IPSUtf8\Session::i()->tables[ $table ];
if ( ! empty( $tableData['charset'] ) )
{
$tableCharSet = $tableData['charset'];
}
$sed = " -e 's/CHARSET\\=" . $tableCharSet . "/CHARSET\\=utf8\\ COLLATE\\=utf8_unicode_ci/g' ";
$command = $myDump . $socket . $port . " --max_allowed_packet=500M --quick --add-drop-table -h " . $INFO['sql_host'] . " -u " . $INFO['sql_user'] . " --password='" . $INFO['sql_pass'] . "' " . $INFO['sql_database'] . " " . \IPSUtf8\Db::i()->prefix . $table . " | sed " . $sed . " | iconv -f " . $tableCharSet . " -t UTF-8 > tmp/{$table}.sql";
\IPSUtf8\Output\Cli::i()->sendOutput("Running\n" . $command . "\nPlease be patient, this may take some time");
exec( $command, $output );
$command = $mySql . $port . " -h " . $INFO['sql_host'] . " -u " . $INFO['sql_user'] . " --password='" . $INFO['sql_pass'] . "' " . $INFO['sql_database'] . "< tmp/{$table}.sql";
\IPSUtf8\Output\Cli::i()->sendOutput("Running\n" . $command . "\nPlease be patient, this may take some time");
exec( $command, $output );
shell_exec( "rm tmp/{$table}.sql" );
if ( stristr( implode( "\n", $output ), 'Error' ) )
{
\IPSUtf8\Output\Cli::i()->sendOutput( "Failed:\n" . $output );
exit();
}
/* Update timestamp */
\IPSUtf8\Session::i()->save();
}
\IPSUtf8\Output\Cli::i()->sendOutput( "\nConversion has completed in " . \IPSUtf8\Session::i()->timeTaken( true ) );
/* Still here... then fix collations and update DB charset */
\IPSUtf8\Output\Cli::i()->sendOutput("Fixing table collations...");
\IPSUtf8\Session::i()->updateTableData();
$convertClass::i()->fixCollation();
\IPSUtf8\Output\Cli::i()->sendOutput("Finishing...");
$convertClass::i()->finish();
\IPSUtf8\Output\Cli::i()->sendOutput( "You can now complete the conversion by editing conf_global.php to add \$INFO['sql_charset'] = 'UTF8';" );
exit();
}
}
Whitespace-only changes.
Whitespace-only changes.
+61
View File
@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html>
<head>
<title>IPS Converter Read Me</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="css/jumbotron.css" rel="stylesheet" media="screen">
</head>
<body>
<div class="container">
<div class="header">
<h3 class="text-muted">IPS UTF8 Converter Read Me</h3>
</div>
<div class="jumbotron">
<h1>Welcome!</h1>
<p class="lead">
This utility will convert all the tables in your community database to UTF-8 without deleting or overwriting your existing data.
</p>
</div>
<h3>Installing</h3>
<p>
Simply upload the directory <code>utf8convert</code> to your community root directory.
</p>
<h3>How it works</h3>
<p>
The converter will create new tables with the prefix "x_utf_". The converter will read your existing data, convert it to UTF-8 and then save it into the "x_utf_" prefixed tables.
</p>
<p>
Once the data conversion has taken place, you can test the conversion by editing your <code>conf_global.php</code> file to alter the <code>sql_tbl_prefix</code> and to make sure that the <code>sql_charset</code> is set to <code>utf8</code>. The exact instructions for this
are shown when the conversion has finished.
</p>
<p>
Once you are happy that the conversion is correct, you are prompted to <strong>finish</strong> the conversion. This will rename your existing database tables with the prefix "orig_" and the UTF-8 tables
will be renamed to your existing prefix. You are then prompted again to edit your <code>conf_global.php</code> file to alter the <code>sql_tbl_prefix</code>.
</p>
<p>
You can then delete the "orig_" prefixed tables when you are happy that the conversion is complete and the original unconverted data is no longer required.
</p>
<h3>Web or command line?</h3>
<p>
This converter is available with two interfaces. There is a <strong>web</strong> version that you can launch using the button below.
<br />
The preferred method is to use the command line version. If you have shell access with your hosting account, then please launch the shell converter interface by using <code>cd</code> to navigate to
your community root and then run <code>php cli.php</code> and follow the onscreen prompts. If you are running from the Windows command prompt or your shell client does not support colors, then run <code>php cli.php --basic</code>.
</p>
<h3>Getting Help</h3>
<p>
If you encounter any issues while using this converter, you can request support via the <a href="https://www.invisioncommunity.com/clientarea/">client center</a>.
<br />
If you're using the command line version, please run <code>php cli.php --info</code>. If you're using the web version, please click on the "Tools" button at the top. This information
will help us debug the issue. No sensitive data is ever revealed with this tool.
</p>
<p><a class="btn btn-lg btn-info" href="index.php?controller=browser">Start Web Converter</a></p>
<div class="footer">
<p>&copy; <script type="text/javascript">document.write( new Date().getFullYear() );</script><noscript>2015</noscript> Invision Power Services, Inc.</p>
</div>
</div>
<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</body>
</html>
@@ -0,0 +1,273 @@
<?php
/**
* @brief Archive table conversion module
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Convert;
/**
* Conversion class
*/
class Archive extends \IPSUtf8\Convert
{
/**
* @brief Instance
*/
protected static $instance = NULL;
/**
* @brief Tables we need to convert
*/
protected static $nonUtf8Tables = NULL;
/**
* @brief Tables we need to convert
*/
protected static $nonUtf8Collations = NULL;
/**
* @brief Number of rows we need to convert
*/
protected static $rowsToConvert = NULL;
/**
* @brief Table definition
*/
protected static $tableDefinition = NULL;
/**
* @brief Post archive table name
*/
const ARCHIVE_TABLE = 'forums_archive_posts';
/**
* @brief Native Database object
*/
protected static $db = NULL;
/**
* @brief UTF-8 Database object
*/
protected static $utf = NULL;
/**
* Get instance
*
* @return Output
*/
public static function i()
{
if ( self::$instance === NULL )
{
self::$instance = new self();
require( ROOT_PATH . '/conf_global.php' );
if ( $INFO['archive_remote_sql_database'] )
{
/* Set up two new database connections */
static::$db = \IPSUtf8\Db::i('archive', array(
'sql_host' => $INFO['archive_remote_sql_host'],
'sql_user' => $INFO['archive_remote_sql_user'],
'sql_pass' => $INFO['archive_remote_sql_pass'],
'sql_database' => $INFO['archive_remote_sql_database'],
'sql_tbl_prefix' => $INFO['sql_tbl_prefix']
) );
$sessionData = \IPSUtf8\Session::i()->json;
static::$utf = \IPSUtf8\Db::i('utf8-archive', array(
'sql_host' => $INFO['archive_remote_sql_host'],
'sql_user' => $INFO['archive_remote_sql_user'],
'sql_pass' => $INFO['archive_remote_sql_pass'],
'sql_database' => $INFO['archive_remote_sql_database'],
'sql_tbl_prefix' => $INFO['sql_tbl_prefix'],
'sql_utf8mb4' => ( isset( $sessionData['use_utf8mb4'] ) AND ! empty( $sessionData['use_utf8mb4'] ) )
) );
static::$tableDefinition = \IPSUtf8\Db::i('archive')->getTableDefinition( self::ARCHIVE_TABLE );
if ( preg_match( '#\scharset=([a-z0-9]+?)(\s|$)#i', $row['Create Table'], $matches ) )
{
static::$tableDefinition['charset'] = mb_strtolower( $matches[1] );
}
static::$tableDefinition['definition'] = static::$tableDefinition;
}
self::$instance->init();
}
return static::$instance;
}
/**
* Set the current work table
*
* @return void
*/
public function getTable()
{
$table = self::$tableDefinition;
\IPSUtf8\Session::i()->current_table = self::ARCHIVE_TABLE;
\IPSUtf8\Session::i()->current_pkey = 'archive_id';
\IPSUtf8\Session::i()->save();
if ( \in_array( self::ARCHIVE_TABLE, array_keys( \IPSUtf8\Session::i()->completed_json ) ) )
{
return null;
}
static::log( "Continuing with " . $table['name'] . ' (PKEY: ' . \IPSUtf8\Session::i()->current_pkey . ')' );
if ( ! \IPSUtf8\Db::i('utf8-archive')->checkForTable( $table['name'] ) )
{
if ( \IPSUtf8\Db::i('utf8-archive')->createTable( $this->checkTable( $table['definition'] ) ) === false )
{
throw new \RuntimeException( \IPSUtf8\Db::i('utf8-archive')->error . "\n" . var_export( $table['definition'], true ) );
}
}
return $table;
}
/**
* Return tables that need converting
*
* @param boolean $force Force a recount
* @return array
*/
public function getNonUtf8Tables( $force=false )
{
if ( static::$nonUtf8Tables === NULL or $force === TRUE )
{
$row = static::$db->query( "SHOW CREATE TABLE `" . \IPSUtf8\Db::i('archive')->prefix . self::ARCHIVE_TABLE . "`" )->fetch_assoc();
$tblCharset = null;
if ( preg_match( '#\scharset=([a-z0-9]+?)(\s|$)#i', $row['Create Table'], $matches ) )
{
$tblCharset = mb_strtolower( $matches[1] );
}
if ( $tblCharset !== 'utf8' )
{
static::$nonUtf8Tables = array( self::ARCHIVE_TABLE );
}
}
return static::$nonUtf8Tables;
}
/**
* Returns total rows to convert
*
* @return array
*/
public function getTotalRowsToConvert()
{
if ( static::$rowsToConvert === NULL )
{
static::$rowsToConvert = static::$db->select('COUNT(*) as count', self::ARCHIVE_TABLE )->setKeyField('count')->first();
}
return static::$rowsToConvert;
}
/**
* Returns whether the DB has the correct collation
*
* @return bool
*/
public function getNonUtf8CollationTables()
{
if ( static::$nonUtf8Collations === null )
{
static::$nonUtf8Collations = array();
/* Best check the tables, then */
foreach( self::$tableDefinition['definition']['columns'] as $name => $column )
{
if ( $column['collation'] and ! \in_array( $column['collation'], array( 'utf8_unicode_ci', 'utf8mb4_unicode_ci' ) ) )
{
static::$nonUtf8Collations[] = self::$tableDefinition['name'];
break;
}
}
}
return static::$nonUtf8Collations;
}
/**
* Return a list of numeric columns that need checking
*
* @param string $name Table
* @return array Array of columns that need checking as they can contain INT
*/
public static function getNumericColumns( $name )
{
if ( ! \is_string( $name ) )
{
return false;
}
$return = array();
foreach( self::$tableDefinition['definition']['columns'] as $col => $val )
{
if ( \in_array( mb_strtolower( $val['type'] ), static::$numericCols ) )
{
$return[] = $val['name'];
}
}
return $return;
}
/**
* Return a list of columns that need converting
*
* @param string $name Table
* @return array Array of columns that need converting as they can contain text
*/
public static function getConvertableColumns( $name )
{
if ( ! \is_string( $name ) )
{
return false;
}
$return = array();
foreach( self::$tableDefinition['definition']['columns'] as $col => $val )
{
if ( \in_array( mb_strtolower( $val['type'] ), static::$convertCols ) )
{
$return[] = $val['name'];
}
}
return $return;
}
/**
* Rename the tables
*
* @return null
*/
public function renameTables()
{
/* No need to bother with fancy stuffs to find the tables - we already know what they are */
\IPSUtf8\Db::i('archive')->query( "RENAME TABLE `" . \IPSUtf8\Db::i('archive')->prefix . self::ARCHIVE_TABLE . "` TO `orig_" . \IPSUtf8\Db::i('archive')->prefix . self::ARCHIVE_TABLE . "`" );
/* Sleep for a second to avoid a race condition */
sleep(1);
\IPSUtf8\Db::i('utf8-archive')->query( "RENAME TABLE `" . \IPSUtf8\Db::i('utf8-archive')->prefix . self::ARCHIVE_TABLE . "` TO `" . \IPSUtf8\Db::i('archive')->prefix . self::ARCHIVE_TABLE . "`" );
}
}
File diff suppressed because it is too large. Load diff
Whitespace-only changes.
+67
View File
@@ -0,0 +1,67 @@
<?php
/**
* @brief Binding Class for Prepared Statements
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 18 Feb 2013
*/
namespace IPSUtf8\Db;
/**
* Binding Class for Prepared Statements
*/
class Bind
{
/**
* @brief Values
*/
public $values = array();
/**
* @brief Types
*/
protected $types = '';
/**
* Add value
*
* @param string $type Type
* @param mixed $value Value
* @return void
*/
public function add( $type, $value )
{
$this->values[] = $value;
$this->types .= $type;
}
/**
* Do we have any bound values?
*
* @return bool
*/
public function haveBinds()
{
return !( empty( $this->values ) );
}
/**
* Get array to pass to mysqli_stmt::bind_param
*
* @see <a href='http://php.net/manual/en/mysqli-stmt.bind-param.php'>mysqli_stmt::bind_param</a>
* @return array
*/
public function get()
{
$values = array();
foreach ( $this->values as $k => $v )
{
$values[ $k ] = &$this->values[ $k ];
}
return array_merge( array( $this->types ), $values );
}
}
File diff suppressed because it is too large. Load diff
+68
View File
@@ -0,0 +1,68 @@
<?php
/**
* @brief Exception class for database errors
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 18 Feb 2013
*/
namespace IPSUtf8\Db;
/**
* Exception class for database errors
*/
class Exception extends \RuntimeException
{
/**
* @brief Query
*/
public $query;
/**
* @brief Binds
*/
public $binds = array();
/**
* Constructor
*
* @param string $message MySQL Error message
* @param int $code MySQL Error Code
* @param \Exception|NULL $previous Previous Exception
* @param string|NULL $query MySQL Query that caused exception
* @param array $binds Binds for query
* @return void
* @todo Log it
*/
public function __construct( $message = null, $code = 0, $previous = null, $query=NULL, $binds=array() )
{
$this->query = $query;
$this->binds = $binds;
return parent::__construct( $message, $code, $previous );
}
/**
* Send to IPS?
*
* @return bool
*/
public function shouldSendDiagnosticsReport()
{
/* Low-end server errors */
if ( $this->getCode() < 1046 or \in_array( $this->getCode(), array( 1129, 1130, 1194, 1195, 1203 ) ) )
{
return FALSE;
}
/* Low-end client errors */
if ( $this->getCode() >= 2000 and $this->getCode() < 2029 )
{
return FALSE;
}
return TRUE;
}
}
+319
View File
@@ -0,0 +1,319 @@
<?php
/**
* @brief Database SELECT Statement
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 28 Aug 2013
*/
namespace IPSUtf8\Db;
/**
* @brief Database SELECT Statement
*/
class Select implements \Iterator, \Countable
{
/**
* @brief The query
*/
public $query;
/**
* @brief Binds
*/
public $binds;
/**
* @brief The database object
*/
protected $db;
/**
* @brief The statement
*/
protected $stmt;
/**
* Constuctor
*
* @param string $query The query
* @param array $binds Binds
* @param \IPSUtf8\Db $db The database object
* @return void
*/
public function __construct( $query, array $binds, \IPSUtf8\Db $db )
{
$this->query = $query;
$this->binds = $binds;
$this->db = $db;
}
/**
* Add Join
*
* @param array|string $table The table to select from. Either (string) table_name or (array) ( name, alias )
* @param
* @return void
*/
public function join( $table, $on, $type='LEFT', $using=FALSE )
{
$query = '';
$joinConditionIsOptional = TRUE;
switch ( $type )
{
case 'INNER':
case 'CROSS':
$query .= 'INNER JOIN ';
break;
case 'STRAIGHT_JOIN':
$query .= 'STRAIGHT_JOIN';
if ( $using )
{
throw new \InvalidArgumentException; // USING cannot be used with STRAIGHT_JOIN
}
break;
case 'LEFT':
case 'RIGHT':
$query .= $type . ' JOIN';
$joinConditionIsOptional = FALSE;
break;
}
if ( \is_array( $table ) )
{
$query .= " `{$this->db->prefix}{$table[0]}` AS `{$table[1]}`";
}
else
{
$query .= " `{$this->db->prefix}{$table}` AS `{$table}`";
}
if ( $on )
{
if ( $using )
{
$query .= ' USING ( ' . implode( ', ', array_map( function( $col )
{
return '`' . $col . '`';
}, $on ) ) . ' ) ';
}
else
{
$where = $this->db->compileWhereClause( $on );
$query .= ' ON ' . $where['clause'];
$this->binds = array_merge( $where['binds'], $this->binds );
}
}
elseif ( !$joinConditionIsOptional )
{
throw new \InvalidArgumentException;
}
$this->query = preg_replace( '/(FROM `.+?` AS `.+?`)/', '$1 ' . $query, $this->query );
return $this;
}
/**
* @brief Columns in the resultset
*/
protected $columns = array();
/**
* @brief Key Field
*/
protected $keyField = NULL;
/**
* @brief Value Field
*/
protected $valueField = NULL;
/**
* Set key field
*
* @param string $column Column to treat as the key
* @return \IPSUtf8\Db\Select (for daisy=chaining)
*/
public function setKeyField( $column )
{
if ( !$this->stmt )
{
$this->rewind();
}
if ( !\in_array( $column, $this->columns ) )
{
throw new \InvalidArgumentException;
}
$this->keyField = $column;
return $this;
}
/**
* Set value field
*
* @param string $column Column to treat as the key
* @return \IPSUtf8\Db\Select (for daisy=chaining)
*/
public function setValueField( $column )
{
if ( !$this->stmt )
{
$this->rewind();
}
if ( !\in_array( $column, $this->columns ) )
{
throw new \InvalidArgumentException;
}
$this->valueField = $column;
return $this;
}
/**
* @brief The current row
*/
protected $row;
/**
* @brief The current key
*/
protected $key;
/**
* Get first record
*
* @return array
* @throws \UnderflowException
*/
public function first()
{
$this->rewind();
if ( !$this->valid() )
{
throw new \UnderflowException;
}
return $this->current();
}
/**
* [Iterator] Rewind - will (re-)execute statement
*
* @return void
*/
public function rewind( $debug=FALSE )
{
/* Run the query */
$this->stmt = $this->db->preparedQuery( $this->query, $this->binds );
/* Populate $this->row which we read into */
$this->row = array();
$params = array();
$meta = $this->stmt->result_metadata();
while ( $field = $meta->fetch_field() )
{
$params[] = &$this->row[ $field->name ];
}
$this->columns = array_keys( $this->row );
$this->stmt->bind_result( ...$params );
/* Get the first result */
$this->key = -1;
$this->next();
}
/**
* [Iterator] Get current row
*
* @return array
*/
public function current()
{
if ( $this->valueField )
{
return $this->row[ $this->valueField ];
}
elseif ( \count( $this->row ) === 1 )
{
foreach ( $this->row as $v )
{
return $v;
}
}
else
{
$row = array();
foreach ( $this->row as $k => $v )
{
$row[ $k ] = $v;
}
return $row;
}
}
/**
* [Iterator] Get current key
*
* @return mixed
*/
public function key()
{
if ( $this->keyField )
{
return $this->row[ $this->keyField ];
}
else
{
return $this->key;
}
}
/**
* [Iterator] Fetch next result
*
* @return void
*/
public function next()
{
if ( $this->stmt->fetch() === NULL )
{
$this->row = NULL;
}
$this->key++;
}
/**
* [Iterator] Is the current row valid?
*
* @return bool
*/
public function valid()
{
return ( $this->row !== NULL );
}
/**
* [Countable] Get number of rows
*
* @return int
*/
public function count()
{
if ( !$this->stmt )
{
$this->rewind();
}
return $this->stmt->num_rows;
}
}
Whitespace-only changes.
@@ -0,0 +1,69 @@
<?php
/**
* @brief Dispatcher (Web)
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Dispatcher;
use \IPSUtf8\Output\Browser\Template;
/**
* Web Dispatcher
*/
class Browser extends \IPSUtf8\Dispatcher
{
/**
* Run
*/
public function run()
{
/* Is this already Invision Community or has the lock been removed? */
if( ! \BYPASS_SAFETY_LOCK and \IPSUtf8\Convert::i()->databaseIsIPS4() )
{
\IPSUtf8\Output\Browser::i()->error( \IPSUtf8\Output\Browser\Template::errorAlreadyIPS4() );
}
$this->controller = ( \IPSUtf8\Request::i()->controller ) ? \IPSUtf8\Request::i()->controller : 'browser';
$fileLocation = \THIS_PATH . '/modules/browser/' . $this->controller . '.php';
$classname = 'IPSUtf8\\modules\\browser\\' . $this->controller;
if( !file_exists( $fileLocation ) )
{
\IPSUtf8\Output\Browser::i()->error( "Page doesn't exist" );
}
/* Run */
$this->controllerObj = new $classname;
if( !( $this->controllerObj instanceof \IPSUtf8\Dispatcher\Controller ) )
{
\IPSUtf8\Output\Browser::i()->error( "Page doesn't exist" );
}
$this->controllerObj->execute();
/* Output */
if ( \IPSUtf8\Request::i()->isAjax() )
{
\IPSUtf8\Output\Browser::i()->sendOutput( Template::blankTemplate( \IPSUtf8\Output\Browser::i()->output ), 200, 'text/html', \IPSUtf8\Output\Browser::i()->httpHeaders );
}
else
{
\IPSUtf8\Output\Browser::i()->sendOutput( Template::wrapper( \IPSUtf8\Output\Browser::i()->title, \IPSUtf8\Output\Browser::i()->output ), 200, 'text/html', \IPSUtf8\Output\Browser::i()->httpHeaders );
}
}
/**
* Init
*/
public function init()
{
}
}
@@ -0,0 +1,36 @@
<?php
/**
* @brief Dispatcher (CLI)
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Dispatcher;
/**
* CLI Dispatcher
*/
class Cli extends \IPSUtf8\Dispatcher
{
/**
* Run
*/
public function run()
{
$obj = new \IPSUtf8\modules\cli\cli;
$obj->execute();
}
/**
* Init
*/
public function init()
{
}
}
@@ -0,0 +1,46 @@
<?php
/**
* @brief Abstract class that Controllers should extend
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 18 Feb 2013
*/
namespace IPSUtf8\Dispatcher;
/**
* Abstract class that Controllers should extend
*/
abstract class Controller
{
/**
* Execute
*
* @param string $command The part of the query string which will be used to get the method
* @param \IPS\Http\Url|NULL $url The base URL for this controller or NULL to calculate automatically
* @return void
*/
public function execute()
{
if( \IPSUtf8\Request::i()->do and \substr( \IPSUtf8\Request::i()->do, 0, 1 ) !== '_' )
{
$method = ( \IPSUtf8\Request::i()->do and preg_match( '/^[a-zA-Z\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', \IPSUtf8\Request::i()->do ) ) ? \IPSUtf8\Request::i()->do : NULL;
if ( $method !== NULL AND method_exists( $this, $method ) )
{
$this->$method();
}
else
{
\IPSUtf8\Output\Browser::i()->error( "Page not found" );
}
}
else
{
$this->manage();
}
}
}
@@ -0,0 +1,74 @@
<?php
/**
* @brief Dispatcher
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8;
/**
* Dispatcher
*/
abstract class Dispatcher
{
/**
* @brief Singleton Instance
*/
protected static $instance = NULL;
/**
* @brief Controller
*/
public $controller = 'browser';
/**
* @brief Controller
*/
public $controllerObj = NULL;
/**
* Get instance
*
* @return \IPS\Dispatcher
*/
public static function i()
{
if( self::$instance === NULL )
{
$classname = \get_called_class();
if ( $classname === 'IPSUtf8\Dispatcher' )
{
self::$instance = new \IPSUtf8\Dispatcher\Browser;
}
else
{
self::$instance = new $classname;
}
self::$instance->init();
}
return self::$instance;
}
/**
* Run the dispatcher
*/
public function run()
{
}
/**
* Init
*/
public function init()
{
}
}
Whitespace-only changes.
+109
View File
@@ -0,0 +1,109 @@
<?php
/**
* @brief Output Class
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8\Output;
/**
* Output Class
*/
class Browser extends \IPSUtf8\Output
{
public static $url = null;
/**
* Constructor
*/
public static function i()
{
if ( static::$url === null )
{
static::$url = 'index.php';
}
return parent::i();
}
/**
* Redirect
*
* @param string $url Partial URL to redirect to
* @return void
*/
public function redirect( $url )
{
$this->sendOutput( '', 303, '', array( "Location: {$url}" ) );
}
/**
* Display Error Screen
*
* @param string $message language string for error message
* @return void
*/
public function error( $message )
{
/* Send output */
$this->sendOutput( \IPSUtf8\Output\Browser\Template::wrapper( "IPS Converter", \IPSUtf8\Output\Browser\Template::error( $message ), true ), 500 );
exit();
}
/**
* Send output
*
* @param string $output Content to output
* @param int $httpStatusCode HTTP Status Code
* @param string $contentType HTTP Content-type
* @param array $httpHeaders Additional HTTP Headers
* @return void
*/
public function sendOutput( $output='', $httpStatusCode=200, $contentType='text/html', $httpHeaders=array() )
{
/* Set HTTP status */
if( isset( $_SERVER['SERVER_PROTOCOL'] ) and \strstr( $_SERVER['SERVER_PROTOCOL'], '/1.0' ) !== false )
{
header( "HTTP/1.0 {$httpStatusCode} " . self::$httpStatuses[ $httpStatusCode ] );
}
else
{
header( "HTTP/1.1 {$httpStatusCode} " . self::$httpStatuses[ $httpStatusCode ] );
}
while( @ob_end_clean() );
/* Buffer output */
if ( $output )
{
if( isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) and \strpos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) !== false and (bool) ini_get('zlib.output_compression') === false )
{
ob_start('ob_gzhandler');
}
else
{
ob_start();
}
print $output;
}
/* Send headers */
header( "Content-type: {$contentType};charset=UTF-8" );
foreach ( $httpHeaders as $header )
{
header( $header );
}
header( "Connection: close" );
/* Flush and exit */
@ob_end_flush();
@flush();
exit;
}
}
@@ -0,0 +1,482 @@
<?php
/**
* @brief Template Class
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8\Output\Browser;
/**
* Template Class
*/
class Template
{
public static function wrapper( $title="IPS Converter", $content="", $isError=false )
{
$iniTime = @ini_get('max_execution_time');
$execTime = ( \is_numeric( $iniTime ) ) ? $iniTime : 30;
$url = \IPSUtf8\Output\Browser::$url;
$title = ( empty( $title ) ) ? 'IPS Converter' : $title;
$active = array( 'convert' => '', 'tools' => '', 'archive' => '' );
$hasArchive = \IPSUtf8\Session::i()->has_archive;
$controller = preg_replace( "/[^a-zA-Z0-9]/", '', empty( \IPSUtf8\Request::i()->controller ) ? 'browser' : \IPSUtf8\Request::i()->controller );
$version = \IPSUtf8\Convert::VERSION_ID;
$copyrightDate = date('Y');
if ( $controller == 'browser' )
{
$active['convert'] = 'active';
}
else if ( $controller === 'archive' )
{
$active['archive'] = 'active';
}
else
{
$active['tools'] = 'active';
}
$html = <<<EOFHTML
<!DOCTYPE html>
<html>
<head>
<title>{$title}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="css/bootstrap.min.css" rel="stylesheet" media="screen">
<link href="css/jumbotron.css" rel="stylesheet" media="screen">
</head>
<body data-url="{$url}">
<div class="container">
<div class="header">
EOFHTML;
if ( ! $isError )
{
$html .= <<<EOFHTML
<ul class="nav nav-pills pull-right">
<li class="{$active['convert']}"><a href="{url="?controller=browser"}">Convert</a></li>
EOFHTML;
if ( $hasArchive )
{
$html .= <<<EOFHTML
<li class="{$active['archive']}"><a href="{url="?controller=archive"}">Archive</a></li>
EOFHTML;
}
$html .= <<<EOFHTML
<li class="{$active['tools']}"><a href="{url="?controller=tools"}">Tools</a></li>
</ul>
EOFHTML;
}
$html .= <<<EOFHTML
<h3 class="text-muted">IPS UTF8 Converter</h3>
</div>
{$content}
<div class="footer">
<p>UTF8 Converter v{$version} &copy; {$copyrightDate} Invision Power Services, Inc.</p>
</div>
</div>
<script type="text/javascript">
var ipsSettings = { maxExecTime: {$execTime}, 'controller': '{$controller}' };
</script>
<script src="js/jquery.min.js"></script>
<script src="js/app.js?v=1"></script>
<script src="js/bootstrap.min.js"></script>
</body>
</html>
<div class="modal fade" id="confirmModal" data-url="" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Confirm</h4>
</div>
<div class="modal-body">
<p id="confirmModalText">Please confirm this action</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary" data-modal="submit">Confirm</button>
</div>
</div>
</div>
</div>
EOFHTML;
return static::parse( $html );
}
/**
* Tools page
*/
public static function tools( $isUtf8, $msg )
{
$html = <<<EOFHTML
<div class="jumbotron">
<h1>Tools</h1>
EOFHTML;
if ( $msg !== null )
{
$html .= <<<EOFHTML
<p>
<div class='alert alert-info'>{$msg}</div>
</p>
<p>&nbsp;</p>
EOFHTML;
}
if ( ! isset( \IPSUtf8\Request::i()->do ) )
{
if ( $isUtf8 === true )
{
$html .= <<<EOFHTML
<p class="text-info">The database is set to UTF-8.</p>
<p><a class="btn btn-lg btn-info" href="{url="?controller=tools&amp;do=collation"}">Check and fix UTF-8 collation</a></p>
EOFHTML;
}
else
{
$html .= <<<EOFHTML
<p class="text-info">Please <a href="{url="?controller=browser"}">convert to UTF-8</a> first.</p>
EOFHTML;
}
}
$html .= <<<EOFHTML
</div>
EOFHTML;
$code = implode( "<br />", \IPSUtf8\Convert::i()->getDebugString() );
$html .= <<<EOFHTML
<div class="jumbotron">
<h1>Info</h1>
<code>
{$code}
</code>
</div>
EOFHTML;
return static::parse( $html );
}
/**
* Error page
*/
public static function error( $msg )
{
$html = <<<EOFHTML
<div class="jumbotron">
<h1>Error</h1>
<p class="lead">{$msg}</p>
</div>
EOFHTML;
return static::parse( $html );
}
/**
* Error page explaining about database being Invision Community already
*/
public static function errorAlreadyIPS4()
{
$html = <<<EOFHTML
<p style="text-align:left">
The target database is already running Invision Community. There is no conversion required and the UTF8 converter is locked.
<br>To override this and unlock the UTF8 converter, please create a file called "constants.php" and upload it to your /admin/convertutf8/ directory with the following contents:
</p>
<p><textarea class="form-control" style="height:90px;">&lt;?php
\\define( 'BYPASS_SAFETY_LOCK', true );
</textarea>
</p>
<p class="text-danger">Please remember to remove the constants.php file when you are finished!</p>
EOFHTML;
return static::parse( $html );
}
/**
* Welcome page
*/
public static function welcome( $isUtf8, $status, $percent=false, $controller='browser' )
{
$convertClass = ( $controller === 'browser' ) ? '\IPSUtf8\Convert' : '\IPSUtf8\Convert\Archive';
$origUtf8Charset = \IPSUtf8\Db::i('utf8')->getCharset();
$canUseMb4 = ( version_compare( \IPSUtf8\Db::i()->server_info, '5.5.3', '>=' ) AND \IPSUtf8\Db::i('utf8')->set_charset('utf8mb4') !== FALSE );
\IPSUtf8\Db::i('utf8')->set_charset( $origUtf8Charset );
$badCollations = $convertClass::i()->getNonUtf8CollationTables();
$badTablesCnt = \count( $convertClass::i()->getNonUtf8Tables() );
$path = ROOT_PATH;
$dbCharSetIsCorrect = TRUE;
$isUtf8mb4 = ( $isUtf8 === TRUE AND \IPSUtf8\Convert::i()->database_charset == 'utf8mb4' );
if ( file_exists( ROOT_PATH . '/conf_global.php' ) )
{
require_once( ROOT_PATH . '/conf_global.php' );
if ( !isset( $INFO['sql_charset'] ) OR ! \in_array( $INFO['sql_charset'], array( 'utf8', 'utf8mb4' ) ) )
{
$dbCharSetIsCorrect = FALSE;
}
}
if ( isset( \IPSUtf8\Request::i()->convert_anyway ) AND \IPSUtf8\Request::i()->convert_anyway == 1 )
{
$badTablesCnt = \IPSUtf8\Session::i()->json['tableCount'];
}
$html = <<<EOFHTML
<div class="jumbotron">
<h1>Welcome</h1>
EOFHTML;
if ( $controller === 'archive' )
{
$html .= <<<EOFHTML
<p class="text-info">The converter has detected that you have an archive table in a different database.</p>
EOFHTML;
}
if ( $status === 'processing' )
{
$html .= <<<EOFHTML
<p class="text-warning">Conversion in progress ({$percent}% complete).</p>
EOFHTML;
}
else if ( $isUtf8 !== true )
{
$html .= <<<EOFHTML
<p class="lead">You have {$badTablesCnt} table(s) in this database that are not UTF-8.\nYou must convert these tables to UTF-8 before you can proceed with the upgrade.</p>
EOFHTML;
}
else if ( $isUtf8 === true )
{
if ( \count( $badCollations ) )
{
$cnt = \count( $badCollations );
$html .= <<<EOFHTML
<p class="text-info">
The database is set to UTF-8, however {$cnt} table(s) have incorrect collations and need fixing.
<p><a class="btn btn-lg btn-info" href="{url="?controller=tools&amp;do=collation"}">Fix UTF-8 collations</a></p>
</p>
EOFHTML;
}
else
{
/* If the charset stored for the gb_char_set setting is not utf-8, then we'll hit an endless loop unless we fix it here */
\IPSUtf8\Db::i()->update( 'core_sys_conf_settings', array( 'conf_value' => 'utf-8' ), array( 'conf_key=?', 'gb_char_set' ) );
$html .= <<<EOFHTML
<p class="text-info">
The database tables are UTF-8, collations are correct and there is nothing to convert. You can <strong><a href="../upgrade">proceed with the upgrade</strong>.
</p>
EOFHTML;
}
}
if ( ! $isUtf8 and $canUseMb4 )
{
$text = ( $status === 'processing' ) ? "Continue Conversion" : "Begin Conversion";
$html .= <<<EOFHTML
<p>
<a data-status="{$status}" class="btn btn-lg btn-info" href="{url="?controller={$controller}&amp;do=process&use_utf8mb4=1"}">{$text}</a>
</p>
EOFHTML;
}
if ( ! $isUtf8 and !$canUseMb4 )
{
$label = 'Start using UTF-8 (utf8)';
$selector = 'btn-success';
$more = <<<EOFHTML
<br>
<div class='small'>
<small>
Please note that you should turn your community offline before starting any conversion on a live site.
</small>
</div>
<br>
<div class='small'>
<small>
If you have a large community, or are experiencing browser timeouts during conversion, you may wish to consider running the conversion via the Command Line.<br>
<code>
cd {$path}/admin/convertutf8
php cli.php
</code>
</small>
</div>
EOFHTML;
}
if ( $status === 'processing' )
{
$label = 'Continue Conversion';
$selector = 'btn-warning';
$more = '';
}
else if ( ! $isUtf8 )
{
$label = "Begin Conversion";
$selector = 'btn-info';
}
if ( $label and $selector AND ! $isUtf8 and ! $canUseMb4 )
{
$html .= <<<EOFHTML
<p>
<a data-status="{$status}" class="btn btn-lg {$selector}" href="{url="?controller={$controller}&amp;do=process"}">{$label}</a>
{$more}
</p>
EOFHTML;
}
if ( $status === 'processing' )
{
$html .= <<<EOFHTML
<p><small><a data-status="reset" data-confirm="true" class='text-danger' href="{url="?controller={$controller}&amp;do=reset"}">Reset conversion and restart</a></small></p>
EOFHTML;
}
$html .= <<<EOFHTML
</div>
EOFHTML;
return static::parse( $html );
}
/**
* Process page
*/
public static function process( $status, $percent, $msg )
{
$utfPrefix = \IPSUtf8\Db::i('utf8')->prefix . \IPSUtf8\Db::i()->prefix;
$html = <<<EOFHTML
<div class="jumbotron" data-init="processInit">
<h1>Converting</h1>
<p>&nbsp;</p>
<p>
<div class="progress progress-striped active">
<div id="progressBar" data-start="{$percent}" class="progress-bar" role="progressbar" aria-valuenow="{$percent}" aria-valuemin="0" aria-valuemax="100" style="width: {$percent}%">
<span class='sr-only'>{$msg}</span>
</div>
</div>
</p>
<p id="message">{$msg}</p>
</div>
EOFHTML;
return static::parse( $html );
}
/**
* Completed page
*/
public static function completed( $timeTaken )
{
$html = <<<EOFHTML
<div class="jumbotron">
<h1>Almost there!</h1>
<p class="lead">The database has now been converted!</p>
<p><small>Conversion took {$timeTaken}</small></p>
<p>&nbsp;</p>
<p><a class="btn btn-lg btn-info" href="{url="?controller=browser&amp;do=finish"}">Click here to finish</a></p>
</div>
EOFHTML;
return static::parse( $html );
}
/**
* Finish page
*/
public static function finished( $updated )
{
$utfPrefix = \IPSUtf8\Db::i('utf8')->prefix;
$normalPrefix = \IPSUtf8\Db::i()->prefix;
$sessionData = \IPSUtf8\Session::i()->json;
$sql_charset = ( array_key_exists( 'utf8mb4', $sessionData['charSets'] ) ) ? 'utf8mb4' : 'utf8';
/* Phil made me give him credit for some changes in this code */
$html = <<<EOFHTML
<div class="jumbotron">
<h1>Finished!</h1>
<p class="lead">The database has now been converted and the tables correctly renamed!</p>
EOFHTML;
if ( \IPSUtf8\Request::i()->controller === 'browser' )
{
if( !$updated )
{
$utf8mb4 = ( $sql_charset == 'utf8mb4' ) ? "<br>\$INFO['sql_utf8mb4'] = true;" : '';
$html .= <<<EOFHTML
<p>You can now <strong>complete the conversion</strong> by editing conf_global.php to add <br><code>\$INFO['sql_charset'] = '{$sql_charset}';{$utf8mb4}</code>.<br>Afterwards, you can <strong><a href="../upgrade">proceed with the upgrade</strong>.</p>
</div>
EOFHTML;
}
else
{
$html .= <<<EOFHTML
<p>You can now <strong><a href="../upgrade">proceed with the upgrade</strong>.</p>
</div>
EOFHTML;
}
}
else if ( \IPSUtf8\Request::i()->controller === 'archive' )
{
$html .= <<<EOFHTML
<p>You can now <strong>complete the conversion</strong> by converting the <a href="{url="?controller=browser"}">main database</a> if you've not already done so.</p>
</div>
EOFHTML;
}
return static::parse( $html );
}
/**
* Basic HTML parsing
*
* @param string $html Raw HTML
* @return string
*/
protected static function parse( $html )
{
/* Parse {plugin="foo"} tags */
$html = preg_replace_callback
(
'/\{([a-z]+?=([\'"]).+?\\2 ?+)}/',
function( $matches )
{
/* Work out the plugin and the values to pass */
preg_match_all( '/(.+?)='.$matches[2].'(.+?)'.$matches[2].'\s?/', $matches[1], $submatches );
$plugin = array_shift( $submatches[1] );
$value = array_shift( $submatches[2] );
$options = array();
foreach ( $submatches[1] as $k => $v )
{
$options[ $v ] = $submatches[2][ $k ];
}
switch( $plugin )
{
case 'url':
return \IPSUtf8\Output\Browser::$url . $value;
break;
}
},
$html
);
return $html;
}
}
Whitespace-only changes.
+180
View File
@@ -0,0 +1,180 @@
<?php
/**
* @brief Output Class
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8\Output;
/**
* Output Class
*/
class Cli extends \IPSUtf8\Output
{
/**
* @Brief STDIN Handle
*/
protected static $stdin = null;
/**
* @Brief Progress bar has been drawn
*/
protected static $barDrawn = false;
/**
* @Brief Response
*/
public $response = null;
/**
* Display Error Screen
*
* @param string $message language string for error message
* @return void
*/
public function error( $message )
{
/* Send output */
parent::error( $message );
exit();
}
/**
* Display a CLI progress bar
*
* @param string $table Table processing
* @param int $total Total number
* @param int $current Current number processed
* @param int $size Total size of the bar
* @return string
*/
public function progressBar( $table, $total, $current, $size=50 )
{
$percent = ( $current > 0 AND $total > 0 ) ? round( ($current / $total) * 100, 0 ) : 0;
$percentString = str_pad( $percent, 6, ' ', STR_PAD_LEFT );
$totalSize = $size + 9 + 33; # 23 is 'Processing: tablename'
$output = '';
if ( $table !== null )
{
$tableName = ( mb_strlen( $table ) > 20 ) ? mb_substr( $table, 0, 20 ) : str_pad( $table, 20 );
}
else
{
$tableName = str_repeat( ' ', 20 );
}
/* No progress bar for you! */
if ( \IPSUtf8\Request::i()->isBasicClient() === true )
{
return "Processing: " . $tableName . '; Total complete: ' . $percent . "%\n";
}
/* Remove previous bar */
if ( static::$barDrawn === true )
{
for ( $i = $totalSize; $i > 0; $i-- )
{
$output .= "\x08";
}
}
$output .= "Processing: " . $tableName . ' ';
/* Print the bar */
for ( $i = 0; $i <= $size; $i++ )
{
if ( $i <= ( $current / $total * $size ) )
{
$output .= "\033[42m \033[0m";
}
else
{
$output .= "\033[47m \033[0m";
}
}
$output .= ' ' . $percentString . '%';
static::$barDrawn = true;
return $output;
}
/**
* Send output and listen for a keypress
*
* @param string $output Content to output
* @param int $httpStatusCode HTTP Status Code
* @param string $contentType HTTP Content-type
* @param array $httpHeaders Additional HTTP Headers
* @return void
*/
public function sendOutput( $output='', $httpStatusCode=200, $contentType='text/plain', $httpHeaders=array() )
{
if ( mb_stristr( $output, "<warning>" ) )
{
if ( \IPSUtf8\Request::i()->isBasicClient() === true )
{
$output = str_replace( "<warning>" , "!! ", $output );
$output = str_replace( "</warning>", " !!", $output );
}
else
{
$output = str_replace( "<warning>" , "\033[1;37m\033[41m", $output );
$output = str_replace( "</warning>", "\033[0m", $output );
}
}
if ( mb_stristr( $output, "<good>" ) )
{
if ( \IPSUtf8\Request::i()->isBasicClient() === true )
{
$output = str_replace( "<good>" , "", $output );
$output = str_replace( "</good>", "", $output );
}
else
{
$output = str_replace( "<good>" , "\033[1;37m\033[42m", $output );
$output = str_replace( "</good>", "\033[0m", $output );
}
}
if ( mb_stristr( $output, "<choice>" ) )
{
if ( \IPSUtf8\Request::i()->isBasicClient() === true )
{
$output = str_replace( "<choice>" , "", $output );
$output = str_replace( "</choice>", "", $output );
}
else
{
$output = str_replace( "<choice>" , "\033[1;32m", $output );
$output = str_replace( "</choice>", "\033[0m", $output );
}
}
if ( $httpStatusCode != 101 )
{
$output .= "\n";
}
$window = fopen('php://stdout', 'w');
fwrite( $window, $output );
fclose( $window );
if ( static::$stdin === null )
{
static::$stdin = fopen('php://stdin', 'r');
}
if ( $httpStatusCode === 100 )
{
$this->response = trim( fgets( static::$stdin ) );
}
}
}
@@ -0,0 +1,72 @@
<?php
/**
* @brief Output Class
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 9 Sept 2013
*/
namespace IPSUtf8;
/**
* Output Class
*/
abstract class Output
{
/**
* @brief HTTP Statuses
* @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
*/
protected static $httpStatuses = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 429 => 'Too Many Requests', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported' );
/**
* @brief Singleton Instance
*/
protected static $instance = NULL;
/**
* Get instance
*
* @return \IPS\Request
*/
public static function i()
{
if( static::$instance === NULL )
{
$classname = \get_called_class();
static::$instance = new $classname;
}
return static::$instance;
}
/**
* @brief Additional HTTP Headers
*/
public $httpHeaders = array();
/**
* @brief Stored Page Title
*/
public $title = '';
/**
* @brief Stored Content to output
*/
public $output = '';
/**
* Display Error Screen
*
* @param string $message language string for error message
* @return void
*/
public function error( $message )
{
/* Send output */
$this->sendOutput( "Error: " . $message );
}
}
Whitespace-only changes.
@@ -0,0 +1,127 @@
<?php
/**
* @brief Singleton Pattern
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 18 Feb 2013
*/
namespace IPSUtf8\Patterns;
/**
* Singleton Pattern
*/
class Singleton implements \Iterator
{
/**
* Get instance
*
* @return \IPS\Request
*/
public static function i()
{
if( static::$instance === NULL )
{
$classname = \get_called_class();
static::$instance = new $classname;
}
return static::$instance;
}
/**
* @brief Data Store
*/
protected $data = array();
/**
* Magic Method: Get
*
* @param mixed $key Key
* @return mixed Value from the datastore
*/
public function __get( $key )
{
if( !isset( $this->data[ $key ] ) )
{
return NULL;
}
return $this->data[ $key ];
}
/**
* Magic Method: Set
*
* @param mixed $key Key
* @param mixed $value Value
* @return void
*/
public function __set( $key, $value )
{
$this->data[ $key ] = $value;
}
/**
* Magic Method: Isset
*
* @param mixed $key Key
* @return bool
*/
public function __isset( $key )
{
return isset( $this->data[ $key ] );
}
/**
* Iterator: Rewind
*
* @return void
*/
function rewind()
{
reset( $this->data );
}
/**
* Iterator: Current
*
* @return mixed
*/
function current()
{
return current( $this->data );
}
/**
* Iterator: Key
*
* @return mixed
*/
function key()
{
return key( $this->data );
}
/**
* Iterator: Next
*
* @return void
*/
function next()
{
next( $this->data );
}
/**
* Iterator: Valid
*
* @return bool
*/
function valid()
{
return key( $this->data ) !== null;
}
}
Whitespace-only changes.
@@ -0,0 +1,275 @@
<?php
/**
* @brief HTTP Request Class
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 18 Feb 2013
*/
namespace IPSUtf8;
/**
* HTTP Request Class
*/
class Request extends \IPSUtf8\Patterns\Singleton
{
/**
* @brief Singleton Instance
*/
protected static $instance = NULL;
/**
* @brief Cookie data
*/
public $cookie = array();
/**
* Constructor
*
* @return void
* @note We do not unset $_COOKIE as it is needed by session handling
*/
public function __construct()
{
$this->parseIncomingRecursively( $_GET );
$this->parseIncomingRecursively( $_POST );
array_walk_recursive( $_COOKIE, array( $this, 'clean' ) );
$this->cookie = $_COOKIE;
unset( $_GET );
unset( $_POST );
unset( $_REQUEST );
}
/**
* Delete original tables
*
* @return boolean
*/
public function isDeleteOriginals()
{
return ( IS_CLI AND $GLOBALS['argv'][1] == '--deleteOriginals' );
}
/**
* Detect if this is using the "dump" method
*
* @return boolean
*/
public function isDumpMethod()
{
return ( IS_CLI AND $GLOBALS['argv'][1] == '--dump' );
}
/**
* Detect if this is using the "info" method
*
* @return boolean
*/
public function isInfo()
{
return ( IS_CLI AND $GLOBALS['argv'][1] == '--info' );
}
/**
* Detect if this is using the "restore orig tables" method
*
* @return boolean
*/
public function isRestore()
{
return ( IS_CLI AND $GLOBALS['argv'][1] == '--restore' );
}
/**
* Detect if this is windows command prompt or another similar basic client
*
* @return boolean
*/
public function isBasicClient()
{
return ( IS_CLI AND $GLOBALS['argv'][1] == '--basic' );
}
/**
* Parse Incoming Data
*
* @param array $data Data
* @return void
*/
protected function parseIncomingRecursively( $data )
{
foreach( $data as $k => $v )
{
if ( \is_array( $v ) )
{
array_walk_recursive( $v, array( $this, 'clean' ) );
}
else
{
$this->clean( $v, $k );
}
$this->$k = $v;
}
}
/**
* Clean Value
*
* @param mixed $v Value
* @param mixed $k Key
* @return mixed
*/
protected function clean( &$v, $k )
{
/* Remove NULL bytes and the RTL control byte */
$v = str_replace( array( "\0", "\u202E" ), '', $v );
}
/**
* Get value from array
*
* @param string Key with square brackets (e.g. "foo[bar]")
* @return mixed Value
*/
public function valueFromArray( $key )
{
$array = $this->data;
while ( $pos = mb_strpos( $key, '[' ) )
{
preg_match( '/^(.+?)\[(.+?)?\](.*)?$/', $key, $matches );
if ( !array_key_exists( $matches[1], $array ) )
{
return NULL;
}
$array = $array[ $matches[1] ];
$key = $matches[2] . $matches[3];
}
if ( !isset( $array[ $key ] ) )
{
return NULL;
}
return $array[ $key ];
}
/**
* Is this an AJAX request?
*
* @return bool
*/
public function isAjax()
{
return ( isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) and $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' );
}
/**
* Is this an SSL/Secure request?
*
* @return bool
* @note A common technique to check for SSL is to look for $_SERVER['SERVER_PORT'] == 443, however this is not a correct check. Nothing requires SSL to be on port 443, or http to be on port 80.
*/
public function isSecure()
{
if( !empty( $_SERVER['HTTPS'] ) AND mb_strtolower( $_SERVER['HTTPS'] ) == 'on' )
{
return TRUE;
}
else if( !empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) AND mb_strtolower( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) == 'https' )
{
return TRUE;
}
else if ( !empty( $_SERVER['HTTP_X_FORWARDED_HTTPS'] ) AND mb_strtolower( $_SERVER['HTTP_X_FORWARDED_HTTPS'] ) == 'https' )
{
return TRUE;
}
else if( !empty( $_SERVER['HTTP_FRONT_END_HTTPS'] ) AND mb_strtolower( $_SERVER['HTTP_FRONT_END_HTTPS'] ) == 'on' )
{
return TRUE;
}
else if( !empty( $_SERVER['HTTP_SSLSESSIONID'] ) )
{
return TRUE;
}
return FALSE;
}
/**
* Get Current URL
*
* @return string
*/
public function url()
{
return ( ( static::isSecure() ? 'https://' : 'http://' ) . $_SERVER['SERVER_NAME'] . ( ( $_SERVER['SERVER_PORT'] != 80 ) ? ":{$_SERVER['SERVER_PORT']}" : '' ) . $_SERVER['REQUEST_URI'] );
}
/**
* Get IP Address
*
* @return string
*/
public function ipAddress()
{
if ( \IPS\Settings::i()->xforward_matching )
{
foreach( explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] ) as $x_f )
{
$addrs[] = trim( $x_f );
}
$addrs[] = $_SERVER['HTTP_CLIENT_IP'];
$addrs[] = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
$addrs[] = $_SERVER['HTTP_PROXY_USER'];
}
$addrs[] = $_SERVER['REMOTE_ADDR'];
foreach ( $addrs as $ip )
{
if ( filter_var( $ip, FILTER_VALIDATE_IP ) )
{
return $ip;
}
}
return '';
}
/**
* Set a cookie
*
* @param string $name Name
* @param mixed $value Value
* @param \IPS\DateTime|null $expire Expiration date, or NULL for on session end
* @param bool $httpOnly When TRUE the cookie will be made accessible only through the HTTP protocol
* @param string|null $domain Domain to set to. If NULL, will be detected automatically.
* @param string|null $path Path to set to. If NULL, will be detected automatically.
* @return bool
*/
public function setCookie( $name, $value, $expire=NULL, $httpOnly=TRUE, $domain=NULL, $path=NULL )
{
/* Work out the path */
if ( $path === NULL )
{
$path = mb_substr( \IPS\Settings::i()->base_url, mb_strpos( \IPS\Settings::i()->base_url, $_SERVER['SERVER_NAME'] ) + mb_strlen( $_SERVER['SERVER_NAME'] ) );
$path = mb_substr( $path, mb_strpos( $path, '/' ) );
}
/* Set the cookie */
if ( setcookie( $name, $value, $expire ? $expire->getTimestamp() : 0, $path, $domain ?: $_SERVER['SERVER_NAME'], FALSE, $httpOnly ) === TRUE )
{
$this->cookie[ $name ] = $value;
return TRUE;
}
return FALSE;
}
}
Whitespace-only changes.
@@ -0,0 +1,662 @@
<?php
/**
* @brief Session Handler
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 6th Sept 2013
*/
namespace IPSUtf8;
/**
* Session Handler
*/
class Session
{
/**
* @brief Tables
*/
public $tables = NULL;
/**
* @brief Singleton Instance
*/
protected static $instance = NULL;
/**
* @brief Database Table Columns
*/
protected static $tableTableColumns = array(
array(
'name' => 'table_name',
'type' => 'TEXT',
'length' => false,
'null' => false,
'default' => null
),
array(
'name' => 'table_schema',
'type' => 'MEDIUMTEXT',
'length' => false,
'null' => true,
'default' => null
)
);
/**
* @brief Database Table Columns
*/
protected static $sessionTableColumns = array(
array(
'name' => 'session_start',
'type' => 'INT',
'length' => 10,
'null' => false,
'default' => 0
),
array(
'name' => 'session_updated',
'type' => 'INT',
'length' => 10,
'null' => false,
'default' => 0
),
array(
'name' => 'session_status',
'type' => 'VARCHAR',
'length' => 255,
'null' => true,
'default' => 0
),
array(
'name' => 'session_current_charset',
'type' => 'VARCHAR',
'length' => 255,
'null' => true,
'default' => 0
),
array(
'name' => 'session_current_table',
'type' => 'VARCHAR',
'length' => 255,
'null' => true,
'default' => 0
),
array(
'name' => 'session_current_pkey',
'type' => 'VARCHAR',
'length' => 255,
'null' => true,
'default' => 0
),
array(
'name' => 'session_current_row',
'type' => 'VARCHAR',
'length' => 255,
'null' => true,
'default' => 0
),
array(
'name' => 'session_completed_json',
'type' => 'MEDIUMTEXT',
'length' => false,
'null' => true,
'default' => 0
),
array(
'name' => 'session_json',
'type' => 'MEDIUMTEXT',
'length' => false,
'null' => true,
'default' => 0
),
array(
'name' => 'session_has_archive',
'type' => 'INT',
'length' => 1,
'null' => true,
'default' => 0
),
array(
'name' => 'session_processing_archive',
'type' => 'INT',
'length' => 1,
'null' => true,
'default' => 0
),
array(
'name' => 'session_is_ipb',
'type' => 'INT',
'length' => 1,
'null' => true,
'default' => 0
),
);
/**
* @brief Data Store
*/
protected $_data = NULL;
/**
* @brief Changed Columns
*/
public $changed = array();
/**
* Get instance
*
* @return Output
*/
public static function i()
{
if ( self::$instance === NULL )
{
self::$instance = new self();
self::$instance->init();
}
return self::$instance;
}
/**
* Init
*
* @return void
*/
public function init()
{
/* Check to see if the session table exists */
if ( file_exists( ROOT_PATH . '/conf_global.php' ) )
{
require( ROOT_PATH . '/conf_global.php' );
}
$setDefault = false;
if ( ! \IPSUtf8\Db::i('utf8')->checkForTable( 'convert_session_tables' ) )
{
\IPSUtf8\Db::i('utf8')->createTable( array(
'name' => 'convert_session_tables',
'columns' => static::$tableTableColumns
) );
$setDefault = true;
}
if ( ! \IPSUtf8\Db::i('utf8')->checkForTable( 'convert_session' ) )
{
\IPSUtf8\Db::i('utf8')->createTable( array(
'name' => 'convert_session',
'columns' => static::$sessionTableColumns
) );
$setDefault = true;
}
else
{
try
{
$this->_data = \IPSUtf8\Db::i('utf8')->select( '*', 'convert_session' )->first();
if ( ! isset( $this->_data['session_json'] ) )
{
$setDefault = true;
}
}
catch( \UnderflowException $ex )
{
$setDefault = true;
}
}
if ( $setDefault === true )
{
$this->reset();
}
/* Populate tables */
foreach( \IPSUtf8\Db::i('utf8')->select( '*', 'convert_session_tables' ) as $row )
{
$this->tables[ $row['table_name'] ] = json_decode( $row['table_schema'], true );
}
}
/**
* Reset the session and conversion process
*/
public function reset()
{
$charSet = null;
$ipbVersion = null;
/* Is this an IPB? */
if ( \IPSUtf8\Db::i()->checkForTable('core_applications' ) )
{
try
{
$row = \IPSUtf8\Db::i()->select( '*', 'core_applications', array( 'app_directory=?', 'core' ) )->first();
if ( ! empty( $row['app_directory'] ) )
{
$ipbVersion = $row['app_long_version'];
}
}
catch( \UnderflowException $ex ) { }
}
if ( !SOURCE_CHARSET_OVERRIDE )
{
if ( $ipbVersion >= 40000 )
{
/* >= 4.0 is UTF-8 */
$charSet = 'utf-8';
}
else if ( $ipbVersion !== null )
{
/* Attempt to grab current CHARSET if this is an IPB 3 */
if ( \IPSUtf8\Db::i()->checkForTable('core_sys_conf_settings' ) )
{
try
{
$row = \IPSUtf8\Db::i()->select( '*', 'core_sys_conf_settings', array( 'conf_key=?', 'gb_char_set' ) )->first();
if ( ! empty( $row['conf_key'] ) )
{
$charSet = ( $row['conf_value'] ) ? $row['conf_value'] : $row['conf_default'];
}
}
catch( \UnderflowException $ex ) { }
}
}
}
else
{
$charSet = strtolower( SOURCE_CHARSET_OVERRIDE );
}
$tableData = $this->_getTables();
\IPSUtf8\Db::i('utf8')->delete( 'convert_session_tables' );
foreach( $tableData['tables'] as $name => $schema )
{
\IPSUtf8\Db::i('utf8')->insert( 'convert_session_tables', array(
'table_name' => $name,
'table_schema' => json_encode( $schema )
) );
}
$this->_data = array(
'session_start' => time(),
'session_updated' => time(),
'session_status' => null,
'session_current_charset' => strtolower( $charSet ),
'session_current_table' => null,
'session_current_pkey' => null,
'session_current_row' => 0,
'session_completed_json' => json_encode( array() ),
'session_json' => json_encode( $tableData['data'] ),
'session_has_archive' => 0,
'session_processing_archive' => 0,
'session_is_ipb' => $ipbVersion === null ? false : true
);
/* Change database collation */
require( ROOT_PATH . '/conf_global.php' );
if ( ! empty( $INFO['archive_remote_sql_host'] ) AND ! empty( $INFO['archive_remote_sql_database'] ) AND ! empty( $INFO['archive_remote_sql_user'] ) )
{
$this->_data['session_has_archive'] = 1;
}
\IPSUtf8\Db::i('utf8')->delete( 'convert_session' );
\IPSUtf8\Db::i('utf8')->insert( 'convert_session', $this->_data );
}
/**
* Update 'all_tables'
*
* @return void
*/
public function updateTableData()
{
$tableData = $this->_getTables();
\IPSUtf8\Db::i('utf8')->delete( 'convert_session_tables' );
foreach( $tableData['tables'] as $name => $schema )
{
\IPSUtf8\Db::i('utf8')->insert( 'convert_session_tables', array(
'table_name' => $name,
'table_schema' => json_encode( $schema )
) );
}
/* Populate tables */
foreach( \IPSUtf8\Db::i('utf8')->select( '*', 'convert_session_tables' ) as $row )
{
$this->tables[ $row['table_name'] ] = json_decode( $row['table_schema'], true );
}
$this->save();
}
/**
* Grab all tables in the database that we're going to convert
*
* @return array
*/
protected function _getTables()
{
/* Grab all tables to convert */
$stmt = \IPSUtf8\Db::i()->prepare( "SHOW TABLES" );
$stmt->execute();
$stmt->bind_result( $tableName );
$tables = array();
$allTables = array();
$data = array( 'version' => \IPSUtf8\Convert::VERSION_ID, 'tableCount' => 0, 'totalCount' => 0, 'convertedCount' => 0, 'charSets' => array() );
if ( \defined( 'FORCE_CONVERT' ) AND FORCE_CONVERT === TRUE )
{
$data['force_conversion'] = 1;
}
while ( $stmt->fetch() === true )
{
/* Skip x_utf_ prefixed tables in case we don't have a prefix set */
if ( mb_substr( $tableName, 0, 6 ) === 'x_utf_' )
{
continue;
}
if ( mb_substr( $tableName, 0, 5 ) === 'orig_' )
{
continue;
}
/* Skip if it's an _old or _utftemp table */
if( mb_substr( $tableName, -4 ) == '_old' )
{
continue;
}
if( mb_substr( $tableName, -8 ) == '_utftemp' )
{
continue;
}
if ( mb_substr( $tableName, 0, mb_strlen( \IPSUtf8\Db::i()->prefix ) ) === \IPSUtf8\Db::i()->prefix )
{
$tableNameNoPrefix = $tableName;
if ( \IPSUtf8\Db::i()->prefix )
{
$tableNameNoPrefix = mb_substr( $tableName, mb_strlen( \IPSUtf8\Db::i()->prefix ) );
}
$tables[] = $tableNameNoPrefix;
}
}
foreach( $tables as $table )
{
/* Get count */
$row = \IPSUtf8\Db::i()->query( "SELECT count(*) as count FROM `" . \IPSUtf8\Db::i()->prefix . "{$table}`" )->fetch_assoc();
$count = $row['count'];
$data['totalCount'] += $count;
$data['tableCount']++;
$row = \IPSUtf8\Db::i()->query( "SHOW CREATE TABLE `" . \IPSUtf8\Db::i()->prefix . "{$table}`" )->fetch_assoc();
if ( preg_match( '#\scharset=([a-z0-9]+?)(\s|$)#i', $row['Create Table'], $matches ) )
{
$tblCharset = $matches[1];
$data['charSets'][ mb_strtolower( $tblCharset ) ][] = $table;
}
else
{
$row = \IPSUtf8\Db::i()->query( "SHOW TABLE STATUS WHERE Name='" . \IPSUtf8\Db::i()->prefix . "{$table}'" )->fetch_assoc();
if ( isset( $row['Collation'] ) )
{
$tblCharset = mb_substr( $row['Collation'], 0, strpos( $row['Collation'], '_' ) );
$data['charSets'][ mb_strtolower( $tblCharset ) ][] = $table;
}
else
{
$data['charSets'][ mb_strtolower( \IPSUtf8\Convert::i()->database_charset ) ][] = $table;
}
}
/* Make sure we can JSON Encode this table... MySQL Comments with UTF8 characters can cause it to fail */
$definition = \IPSUtf8\Db::i()->getTableDefinition( $table );
try
{
$test = @json_encode( $definition );
if ( json_last_error() != JSON_ERROR_NONE )
{
throw new \ErrorException;
}
}
catch( \ErrorException $e )
{
$definition = static::arrayWalkRecursive( $definition, function( $value ) { return utf8_encode( $value ); } );
/* Try it again - if it fails this time, remove the column comments as that is likely causing the issue if they have non-latin characters */
$test = @json_encode( $definition );
if ( json_last_error() != JSON_ERROR_NONE )
{
foreach( $definition['columns'] AS $column => $data )
{
if ( isset( $data['comment'] ) )
{
unset( $definition['columns'][ $column ]['comment'] );
}
}
}
}
/* If the collation is missing, let's do a table status check and see if we can figure it out */
if ( empty( $definition['collation'] ) )
{
$status = \IPSUtf8\Db::i()->query( "SHOW TABLE STATUS WHERE Name='" . \IPSUtf8\Db::i()->prefix . "{$table}'" )->fetch_assoc();
if( isset( $status['Collation'] ) )
{
$definition['collation'] = $status['Collation'];
}
}
/* Get other data */
$allTables[ $table ] = array(
'name' => $table,
'definition' => $definition,
'count' => $count,
'charset' => $tblCharset
);
/* Ping the UTF8 connection just in case this process takes a while, so that connection doesn't die on us */
\IPSUtf8\Db::i('utf8')->ping();
}
return array( 'tables' => $allTables, 'data' => $data );
}
/**
* Save the state of the conversion
*/
public function __destruct()
{
$this->save();
}
/**
* Get value from data store
*
* @param mixed $key Key
* @return mixed Value from the datastore
*/
public function __get( $key )
{
if ( mb_substr( $key, 0, 8 ) != 'session_' )
{
$key = 'session_' . $key;
}
if( isset( $this->_data[ $key ] ) )
{
if ( mb_substr( $key, -5 ) == '_json' AND ! \is_array( $this->_data[ $key ] ) )
{
$this->_data[ $key ] = json_decode( $this->_data[ $key ], true );
}
return $this->_data[ $key ];
}
return NULL;
}
/**
* Magic isset method
*
* @param string $key Key
*/
public function __isset( $key )
{
if ( mb_substr( $key, 0, 8 ) != 'session_' )
{
$key = 'session_' . $key;
}
return isset( $this->_data[ $key ] );
}
/**
* Set value in data store
*
* @param mixed $key Key
* @param mixed $value Value
* @return void
*/
public function __set( $key, $value )
{
if ( mb_substr( $key, 0, 8 ) != 'session_' )
{
$key = 'session_' . $key;
}
if( array_key_exists( $key, $this->_data ) )
{
$this->_data[ $key ] = $value;
$this->changed[ $key ] = $value;
}
}
/**
* Time taken for conversion
*
* @param bool $formatted Return the time formatted or in seconds
* @return mixed
*/
public function timeTaken( $formatted=false )
{
$seconds = ( $this->_data['session_updated'] - $this->_data['session_start'] );
if ( $formatted )
{
$s = $seconds % 60;
$m = floor( ( $seconds % 3600 ) / 60 );
$h = floor( ( $seconds % 86400 ) / 3600 );
if ( $h )
{
return "{$h} hour(s), {$m} minute(s) and {$s} seconds.";
}
else
{
return "{$m} minute(s) and {$s} seconds.";
}
}
else
{
return $seconds;
}
}
/**
* Save Changed Columns
*
* @return void
*/
public function save()
{
$this->_data['session_updated'] = time();
$insert = array( 'session_updated' => time() );
if ( ! empty( $this->changed ) )
{
/* JSON encode if required */
foreach ( array_merge( $this->_data, $this->changed ) as $k => $v )
{
$insert[ $k ] = ( mb_substr( $k, -5 ) == '_json' AND \is_array( $v ) ) ? json_encode( $v, true ) : $v;
}
}
else
{
foreach ( $this->_data as $k => $v )
{
$insert[ $k ] = ( mb_substr( $k, -5 ) == '_json' AND \is_array( $v ) ) ? json_encode( $v, true ) : $v;
}
}
/* Save */
if ( \count( $insert ) == \count( static::$sessionTableColumns ) )
{
\IPSUtf8\Db::i('utf8')->update( 'convert_session', $insert );
}
/* Reset our log of what's changed */
$this->changed = array();
}
/**
* Recursively apply a callback to an array - array_walk_recursive does not recurse into sub-sub-arrays, so we need a custom method
*
* @param array $array The array
* @param callback $callback The callback
* @return array The filtered array.
*/
public function arrayWalkRecursive( $array, $callback )
{
if ( ! \is_array( $array ) )
{
trigger_error( "\$array is not an array in \IPSUtf8\Session::arrayWalkRecursive()", E_USER_ERROR );
}
foreach( $array AS $key => $value )
{
if ( \is_array( $array[$key] ) )
{
$array[$key] = static::arrayWalkRecursive( $array[$key], $callback );
}
else
{
$array[$key] = $callback( $value );
}
}
return $array;
}
}
Whitespace-only changes.
+134
View File
@@ -0,0 +1,134 @@
<?php
/**
* @brief Conversion module
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Text;
/**
* Conversion class
* Refactored from IPB 3.x
*/
abstract class Charset
{
/**
* @brief Array of error messages associated with the conversion
*/
public static $errors = array();
/**
* @brief Conversion method to use
*/
public static $method = NULL;
/**
* @brief Should characters be turned into numeric entities
*/
protected static $entities = false;
/**
* @brief Path for character sets
*/
protected static $charsetPath = '';
/**
* @brief Multiton Store
*/
protected static $multitons = array();
/**
* Constructor
*/
public static function i()
{
if ( self::$method === NULL )
{
/* Try and pick best available */
if ( FORCE_CONVERT_METHOD === NULL )
{
if ( \function_exists( 'mb_convert_encoding' ) )
{
self::$method = 'mb';
}
else if ( \function_exists( 'iconv' ) )
{
self::$method = 'iconv';
}
else if ( \function_exists( 'recode_string' ) )
{
self::$method = 'recode';
}
else if ( class_exists( 'UConverter' ) )
{
self::$method = 'uconverter';
}
else
{
self::$method = 'internal';
}
}
else
{
self::$method = FORCE_CONVERT_METHOD;
}
}
self::$method = mb_ucfirst( self::$method );
if ( ! isset( static::$multitons[ self::$method ] ) )
{
$classname = "\\IPSUtf8\\Text\\Module\\" . self::$method;
static::$multitons[ self::$method ] = new $classname;
}
return new static::$multitons[ self::$method ];
}
/**
* Checks a string to see if conversion is required
*
* @param string Text string
* @param string Text string char set (original)
* @param string Desired character set (destination)
* @return @e string
*/
public static function needsConverting( $string, $from, $to='UTF-8' )
{
$from = strtolower($from);
$to = strtolower($to);
/* Return bools, null, ints, etc. */
if ( ! \is_string( $string ) )
{
return false;
}
/* Return if latin only */
if ( preg_match( '/^([a-zA-Z0-9_\-\.:;\[\]\{\}\!\@\£\$\%\^\&\*\(\)\+\=\"\'\<\>\/]+?)$/', $string ) )
{
return false;
}
if ( $to == $from )
{
return false;
}
if( ! $from )
{
return false;
}
if( !$string OR $string == '' )
{
return false;
}
return true;
}
}
@@ -0,0 +1,44 @@
<?php
/**
* @brief Conversion module
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Text\Module;
/**
* Native MB Conversion class
*/
class Iconv extends \IPSUtf8\Text\Charset
{
/**
* Converts a text string from its current charset to a destination charset using iconv
*
* @param string Text string
* @param string Text string char set (original)
* @param string Desired character set (destination)
* @return @e string
*/
public function convert( $string, $from, $to='UTF-8' )
{
if ( static::needsConverting( $string, $from, $to ) === false )
{
return $string;
}
if ( \function_exists( 'iconv' ) )
{
$text = iconv( $from, $to.'//TRANSLIT', $string );
}
else
{
static::$errors[] = "NO_ICONV_FUNCTION";
}
return $text ? $text : $string;
}
}
@@ -0,0 +1,418 @@
<?php
/**
* @brief Conversion module
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Text\Module;
/**
* Native MB Conversion class
*/
class Internal extends \IPSUtf8\Text\Charset
{
/**
* Converts a text string from its current charset to a destination charset using internal conversion class.
* The bulk of this function was written by Mikolaj Jedrzejak and used with permission via the License
*
* @param string Text string
* @param string Text string char set (original)
* @param string Desired character set (destination)
* @return @e string
*/
public function convert( $string, $from, $to='UTF-8' )
{
if ( static::needsConverting( $string, $from, $to ) === false )
{
/* Make sure it decodes properly - some characters such as £ can cause issues between windows-1250, windows-1252, and iso-8859-1 because they store them differently. @see http://php.net/manual/en/function.utf8-decode.php */
if ( $to == 'UTF-8' )
{
if ( mb_substr_count( utf8_decode( $string ), '?' ) != mb_substr_count( $string, '?' ) )
{
$string = utf8_encode( $string );
}
}
return $string;
}
$text = '';
$original = $string;
$from = strtolower( $from );
$to = strtolower( $to );
if( !static::$charsetPath )
{
static::$charsetPath = THIS_PATH . '/system/i18n/ConvertTables/';
}
/**
* This divison was made to prevent errors during convertion to/from utf-8 with
* "entities" enabled, because we need to use proper destination(to)/source(from)
* encoding table to write proper entities.
*
* This is the first case. We are converting from 1byte chars...
*/
if ($from != "utf-8")
{
/* Cache the conversion table to prevent rebuilding on every request */
static $charsetTables = array();
/**
* Now build table with both charsets for encoding change.
*/
if( !isset( $charsetTables[ $from ] ) )
{
if ($to != "utf-8")
{
$charsetTables[ $from ] = self::_makeConversionTable( $from, $to );
}
else
{
$charsetTables[ $from ] = self::_makeConversionTable( $from );
}
}
$charsetTable = $charsetTables[ $from ];
if( !\count($charsetTable) )
{
static::$errors[] = "Character set table not found";
return $original;
}
/**
* For each char in a string...
*/
for ($i = 0; $i < strlen($string); $i++)
{
$hexChar = "";
$unicodeHexChar = "";
$hexChar = strtoupper(dechex(\ord($string[$i])));
// This is fix from Mario Klingemann, it prevents
// droping chars below 16 because of missing leading 0 [zeros]
if ( strlen($hexChar)==1 )
{
$hexChar = "0" . $hexChar;
}
// This is quick fix of 10 chars in gsm0338
// Thanks goes to Andrea Carpani who pointed on this problem and solve it ;)
if ( ( $from == "gsm0338" ) && ( $hexChar == '1B' ) )
{
$i++;
$hexChar .= strtoupper(dechex(\ord($string[$i])));
}
if ( $to != "utf-8" )
{
if ( \in_array( $hexChar, $charsetTable[$from] ) )
{
$unicodeHexChar = array_search( $hexChar, $charsetTable[$from] );
$unicodeHexChars = explode( "+",$unicodeHexChar );
for( $unicodeHexCharElement = 0; $unicodeHexCharElement < \count($unicodeHexChars); $unicodeHexCharElement++ )
{
if ( array_key_exists( $unicodeHexChars[$unicodeHexCharElement], $charsetTable[$to] ) )
{
if ( self::$entities == true )
{
$text .= self::_unicodeEntity( self::_hexToUtf( $unicodeHexChars[$unicodeHexCharElement] ) );
}
else
{
$text .= \chr(hexdec($charsetTable[$to][$unicodeHexChars[$unicodeHexCharElement]]));
}
}
else
{
static::$errors[] = "NO_CHAR_IN_DESTINATION: {$string[$i]}";
return $original;
}
}
}
else
{
static::$errors[] = "NO_CHAR_IN_SOURCE: {$string[$i]}";
return $original;
}
}
else
{
if ( \in_array( $hexChar, $charsetTable[$from] ) )
{
$unicodeHexChar = array_search( $hexChar, $charsetTable[$from] );
$unicodeHexChars = explode( "+", $unicodeHexChar );
/**
* Sometimes there are two or more utf-8 chars per one regular char.
* Extream, example is polish old Mazovia encoding, where one char contains
* two lettes 007a (z) and 0142 (l slash), we need to figure out how to
* solve this problem.
* The letters are merge with "plus" sign, there can be more than two chars.
* In Mazowia we have 007A+0142, but sometimes it can look like this
* 0x007A+0x0142+0x2034 (that string means nothing, it just shows the possibility...)
*/
for( $unicodeHexCharElement = 0; $unicodeHexCharElement < \count($unicodeHexChars); $unicodeHexCharElement++)
{
if ( self::$entities == true )
{
$text .= self::_unicodeEntity( self::_hexToUtf( $unicodeHexChars[$unicodeHexCharElement] ) );
}
else
{
$text .= self::_hexToUtf( $unicodeHexChars[$unicodeHexCharElement] );
}
}
}
else
{
static::$errors[] = "NO_CHAR_IN_SOURCE: {$string[$i]}";
return $original;
}
}
}
}
/**
* This is second case. We are encoding from multibyte char string.
*/
else if( $from == "utf-8" )
{
$hexChar = "";
$unicodeHexChar = "";
$charsetTable = self::_makeConversionTable( $to );
if( \is_array($charsetTable[$to]) AND \count($charsetTable[$to]) )
{
foreach ( $charsetTable[$to] as $unicodeHexChar => $hexChar )
{
if (self::$entities == true)
{
$entityOrChar = self::_unicodeEntity(self::_hexToUtf($unicodeHexChar));
}
else
{
$entityOrChar = \chr(hexdec($hexChar));
}
$string = str_replace( self::_hexToUtf( $unicodeHexChar), $entityOrChar, $string );
}
}
$text = $string;
}
return $text ? $text : $original;
}
/**
* Convert unicode characters to unicode HTML entities
*
* @param string $unicodeString Input Unicode string (1 char can take more than 1 byte)
* @return @e string
* @see _hexToUtf()
*/
protected static function _unicodeEntity( $unicodeString )
{
$outString = "";
$stringLength = strlen( $unicodeString );
for( $charPosition = 0; $charPosition < $stringLength; $charPosition++ )
{
$char = $unicodeString [$charPosition];
$asciiChar = \ord ($char);
if ($asciiChar < 128) //1 7 0bbbbbbb (127)
{
$outString .= $char;
}
else if ($asciiChar >> 5 == 6) //2 11 110bbbbb 10bbbbbb (2047)
{
$firstByte = ($asciiChar & 31);
$charPosition++;
$char = $unicodeString [$charPosition];
$asciiChar = \ord ($char);
$secondByte = ($asciiChar & 63);
$asciiChar = ($firstByte * 64) + $secondByte;
$entity = sprintf ( "&#%d;", $asciiChar );
$outString .= $entity;
}
else if ($asciiChar >> 4 == 14) //3 16 1110bbbb 10bbbbbb 10bbbbbb
{
$firstByte = ($asciiChar & 31);
$charPosition++;
$char = $unicodeString [$charPosition];
$asciiChar = \ord ($char);
$secondByte = ($asciiChar & 63);
$charPosition++;
$char = $unicodeString [$charPosition];
$asciiChar = \ord ($char);
$thirdByte = ($asciiChar & 63);
$asciiChar = ((($firstByte * 64) + $secondByte) * 64) + $thirdByte;
$entity = sprintf ("&#%d;", $asciiChar);
$outString .= $entity;
}
else if ($asciiChar >> 3 == 30) //4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
{
$firstByte = ($asciiChar & 31);
$charPosition++;
$char = $unicodeString [$charPosition];
$asciiChar = \ord ($char);
$secondByte = ($asciiChar & 63);
$charPosition++;
$char = $unicodeString [$charPosition];
$asciiChar = \ord ($char);
$thirdByte = ($asciiChar & 63);
$charPosition++;
$char = $unicodeString [$charPosition];
$asciiChar = \ord ($char);
$fourthByte = ($asciiChar & 63);
$asciiChar = ((((($firstByte * 64) + $secondByte) * 64) + $thirdByte) * 64) + $fourthByte;
$entity = sprintf ("&#%d;", $asciiChar);
$outString .= $entity;
}
}
return $outString;
}
/**
* Convert unicode characters to unicode HTML entities.
* It is very similar to _unicodeEntity function (link below). There is one difference
* in returned format. This time it's a regular char(s), in most cases it will be one or two chars.
*
* @param string $utfCharInHex Hexadecimal value of a unicode char.
* @return @e string
* @see _unicodeEntity()
*/
protected static function _hexToUtf( $utfCharInHex )
{
$outputChar = "";
$utfCharInDec = hexdec($utfCharInHex);
if( $utfCharInDec < 128 )
{
$outputChar .= \chr($utfCharInDec);
}
else if( $utfCharInDec < 2048 )
{
$outputChar .= \chr( ( $utfCharInDec>>6 ) + 192 ) . \chr( ( $utfCharInDec&63 ) + 128 );
}
else if( $utfCharInDec < 65536 )
{
$outputChar .= \chr( ( $utfCharInDec>>12 ) + 224 ) . \chr( ( ( $utfCharInDec>>6 ) &63 ) + 128 ) . \chr( ( $utfCharInDec&63 ) + 128 );
}
else if( $utfCharInDec < 2097152 )
{
$outputChar .= \chr( $utfCharInDec>>18+240 ) . \chr( ( ( $utfCharInDec>>12 ) &63 ) + 128 ) . \chr( ( $utfCharInDec>>6 ) &63 + 128 ) . \chr( $utfCharInDec&63 + 128 );
}
return $outputChar;
}
/**
* Create the conversion tables to use.
*
* This function creates table with two SBCS (Single Byte Character Set). Every conversion is through this table.
*
* - The file with encoding tables have to be save in "Format A" of unicode.org charset table format.
* - BOTH charsets MUST be SBCS
* - The files with encoding tables have to be complete (None of chars can be missing, unles you are sure you are not going to use it)
*
* "Format A" encoding file, if you have to build it by yourself should aplly these rules:
* - you can comment everything with #
* - first column contains 1 byte chars in hex starting from 0x..
* - second column contains unicode equivalent in hex starting from 0x....
* - then every next column is optional, but in "Format A" it should contain unicode char name or/and your own comment
* - the columns can be splited by "spaces", "tabs", "," or any combination of these
* - below is an example
*
* <code>
* #
* # The entries are in ANSI X3.4 order.
* #
* 0x00 0x0000 # NULL end extra comment, if needed
* 0x01 0x0001 # START OF HEADING
* # Oh, one more thing, you can make comments inside of a rows if you like.
* 0x02 0x0002 # START OF TEXT
* 0x03 0x0003 # END OF TEXT
* next line, and so on...
* </code>
*
* You can get full tables with encodings from http://www.unicode.org
*
* @param string $firstEncoding Name of first encoding and first encoding filename (thay have to be the same)
* @param string $secondEncoding Name of second encoding and second encoding filename (thay have to be the same). Optional for building a joined table.
* @return @e array
*/
protected static function _makeConversionTable( $firstEncoding, $secondEncoding = "" )
{
$convertTable = array();
for( $i = 0, $j = \func_num_args(); $i < $j; $i++ )
{
/**
* Because func_*** can't be used inside of another function call
* we have to save it as a separate value.
*/
$fileName = \func_get_arg($i);
if ( !is_file( static::$charsetPath . $fileName ) )
{
static::$errors[] = "FILE_NOT_FOUND: {$fileName}";
return;
}
$fileWithEncTabe = fopen( static::$charsetPath . $fileName, "r" ) or die(); //This die(); is just to make sure...
while(!feof($fileWithEncTabe))
{
/**
* We asume that line is not longer
* than 1024 which is the default value for fgets function
*/
if( $oneLine = trim( fgets( $fileWithEncTabe, 1024 ) ) )
{
/**
* We don't need all comment lines. I check only for "#" sign, because
* this is a way of making comments by unicode.org in thair encoding files
* and that's where the files are from :-)
*/
if ( substr( $oneLine, 0, 1 ) != "#" )
{
/**
* Sometimes inside the charset file the hex walues are separated by
* "space" and sometimes by "tab", the below preg_split can also be used
* to split files where separator is a ",", "\r", "\n" and "\f"
*/
$hexValue = preg_split ( "/[\s,]+/", $oneLine, 3 ); //We need only first 2 values
/**
* Sometimes char is UNDEFINED, or missing so we can't use it for convertion
*/
if (substr($hexValue[1], 0, 1) != "#")
{
$arrayKey = strtoupper(str_replace(strtolower("0x"), "", $hexValue[1]));
$arrayValue = strtoupper(str_replace(strtolower("0x"), "", $hexValue[0]));
$convertTable[ \func_get_arg($i) ][ $arrayKey ] = $arrayValue;
}
}
}
}
}
return $convertTable;
}
}
@@ -0,0 +1,53 @@
<?php
/**
* @brief Conversion module
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Text\Module;
/**
* Native MB Conversion class
*/
class Mb extends \IPSUtf8\Text\Charset
{
/**
* Converts a text string from its current charset to a destination charset using mb_convert_encoding. If mb* functions are not available, logs an error to self::$errors.
*
* @param string Text string
* @param string Text string char set (original)
* @param string Desired character set (destination)
* @return @e string
*/
public function convert( $string, $from, $to='UTF-8' )
{
if ( static::needsConverting( $string, $from, $to ) === false )
{
return $string;
}
if ( \function_exists( 'mb_convert_encoding' ) )
{
$encodings = array_map( 'strtolower', mb_list_encodings() );
if( \in_array( strtolower( $to ), $encodings ) AND \in_array( strtolower( $from ), $encodings ) )
{
$text = mb_convert_encoding( $string, $to, $from );
}
else
{
static::$errors[] = "NO_MB_FUNCTION";
}
}
else
{
static::$errors[] = "NO_MB_FUNCTION";
}
return $text ? $text : $string;
}
}
@@ -0,0 +1,44 @@
<?php
/**
* @brief Conversion module
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
*/
namespace IPSUtf8\Text\Module;
/**
* Native MB Conversion class
*/
class Recode extends \IPSUtf8\Text\Charset
{
/**
* Converts a text string from its current charset to a destination charset using recode_string
*
* @param string Text string
* @param string Text string char set (original)
* @param string Desired character set (destination)
* @return @e string
*/
public function convert( $string, $from, $to='UTF-8' )
{
if ( static::needsConverting( $string, $from, $to ) === false )
{
return $string;
}
if ( \function_exists( 'recode_string' ) )
{
$text = recode_string( $from . '..' . $to, $string );
}
else
{
static::$errors[] = "NO_RECODE_FUNCTION";
}
return $text ? $text : $string;
}
}
@@ -0,0 +1,67 @@
<?php
/**
* @brief Conversion module
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Tools
* @since 4 Sept 2013
* @version SVN_VERSION_NUMBER
*/
namespace IPSUtf8\Text\Module;
/**
* Native MB Conversion class
*/
class Uconverter extends \IPSUtf8\Text\Charset
{
/**
* @brief The class
*/
protected $_class = NULL;
/**
* Converts a text string from its current charset to a destination charset using iconv
*
* @param string Text string
* @param string Text string char set (original)
* @param string Desired character set (destination)
* @return @e string
*/
public function convert( $string, $from, $to='UTF-8' )
{
if ( static::needsConverting( $string, $from, $to ) === false )
{
return $string;
}
$text = NULL;
if ( class_exists( 'UConverter' ) )
{
try
{
if ( $this->_class === NULL )
{
$this->_class = new \UConverter( $to, $from );
}
$text = $this->_class->convert( $string );
}
catch( \Exception $e )
{
static::$errors[] = $e->getMessage();
}
catch( \Throwable $e )
{
static::$errors[] = $e->getMessage();
}
}
else
{
static::$errors[] = "NO_UCONVERTER_CLASS";
}
return $text ? $text : $string;
}
}
Whitespace-only changes.
Whitespace-only changes.
@@ -0,0 +1,307 @@
<?php
$PATH_TO_CLASS = dirname(ereg_replace("\\\\", "/", __FILE__)) . "/" . "ConvertTables" . "/";
define ("CONVERT_TABLES_DIR", $PATH_TO_CLASS);
define ("DEBUG_MODE", 1);
class ConvertCharset{
var $RecognizedEncoding; // (boolean) This value keeps information if string contains multibyte chars.
var $Entities; // (boolean) This value keeps information if output should be with numeric entities.
var $FromCharset; // (string) This value keeps information about source (from) encoding
var $ToCharset; // (string) This value keeps information about destination (to) encoding
var $CharsetTable; // (array) This property keeps convert Table inside
function ConvertCharset ($FromCharset, $ToCharset, $TurnOnEntities = false)
{
$this -> FromCharset = strtolower($FromCharset);
$this -> ToCharset = strtolower($ToCharset);
$this -> Entities = $TurnOnEntities;
if ($this -> FromCharset == $this -> ToCharset)
{
print $this -> DebugOutput(1, 0, $this -> FromCharset);
}
if (($this -> FromCharset == $this -> ToCharset) AND ($this -> FromCharset == "utf-8"))
{
print $this -> DebugOutput(0, 4, $this -> FromCharset);
exit;
}
if ($this -> FromCharset == "utf-8")
{
$this -> CharsetTable = $this -> MakeConvertTable ($this -> ToCharset);
}
else if ($this -> ToCharset == "utf-8")
{
$this -> CharsetTable = $this -> MakeConvertTable ($this -> FromCharset);
}
else
{
$this -> CharsetTable = $this -> MakeConvertTable ($this -> FromCharset, $this -> ToCharset);
}
}
function UnicodeEntity ($UnicodeString)
{
$OutString = "";
$StringLenght = strlen ($UnicodeString);
for ($CharPosition = 0; $CharPosition < $StringLenght; $CharPosition++)
{
$Char = $UnicodeString [$CharPosition];
$AsciiChar = ord ($Char);
if ($AsciiChar < 128){
$OutString .= $Char;
}
else if ($AsciiChar >> 5 == 6){
$FirstByte = ($AsciiChar & 31);
$CharPosition++;
$Char = $UnicodeString [$CharPosition];
$AsciiChar = ord ($Char);
$SecondByte = ($AsciiChar & 63);
$AsciiChar = ($FirstByte * 64) + $SecondByte;
$Entity = sprintf ("&#%d;", $AsciiChar);
$OutString .= $Entity;
}
else if ($AsciiChar >> 4 == 14){
$FirstByte = ($AsciiChar & 31);
$CharPosition++;
$Char = $UnicodeString [$CharPosition];
$AsciiChar = ord ($Char);
$SecondByte = ($AsciiChar & 63);
$CharPosition++;
$Char = $UnicodeString [$CharPosition];
$AsciiChar = ord ($Char);
$ThidrByte = ($AsciiChar & 63);
$AsciiChar = ((($FirstByte * 64) + $SecondByte) * 64) + $ThidrByte;
$Entity = sprintf ("&#%d;", $AsciiChar);
$OutString .= $Entity;
}
else if ($AsciiChar >> 3 == 30){
$FirstByte = ($AsciiChar & 31);
$CharPosition++;
$Char = $UnicodeString [$CharPosition];
$AsciiChar = ord ($Char);
$SecondByte = ($AsciiChar & 63);
$CharPosition++;
$Char = $UnicodeString [$CharPosition];
$AsciiChar = ord ($Char);
$ThidrByte = ($AsciiChar & 63);
$CharPosition++;
$Char = $UnicodeString [$CharPosition];
$AsciiChar = ord ($Char);
$FourthByte = ($AsciiChar & 63);
$AsciiChar = ((((($FirstByte * 64) + $SecondByte) * 64) + $ThidrByte) * 64) + $FourthByte;
$Entity = sprintf ("&#%d;", $AsciiChar);
$OutString .= $Entity;
}
}
return $OutString;
}
function HexToUtf ($UtfCharInHex)
{
$OutputChar = "";
$UtfCharInDec = hexdec($UtfCharInHex);
if($UtfCharInDec < 128) $OutputChar .= chr($UtfCharInDec);
else if($UtfCharInDec < 2048)$OutputChar .= chr(($UtfCharInDec >> 6) + 192) . chr(($UtfCharInDec & 63) + 128);
else if($UtfCharInDec < 65536)$OutputChar .= chr(($UtfCharInDec >> 12) + 224) . chr((($UtfCharInDec >> 6) & 63) + 128) . chr(($UtfCharInDec & 63) + 128);
else if($UtfCharInDec < 2097152)$OutputChar .= chr($UtfCharInDec >> 18 + 240) . chr((($UtfCharInDec >> 12) & 63) + 128) . chr(($UtfCharInDec >> 6) & 63 + 128) . chr($UtfCharInDec & 63 + 128);
return $OutputChar;
}
function MakeConvertTable ($FromCharset, $ToCharset = '')
{
$ConvertTable = array();
for($i = 0; $i < func_num_args(); $i++)
{
$FileName = func_get_arg($i);
if (!is_file(CONVERT_TABLES_DIR . $FileName))
{
print $this -> DebugOutput(0, 0, CONVERT_TABLES_DIR . $FileName); //Print an error message
exit;
}
$FileWithEncTabe = fopen(CONVERT_TABLES_DIR . $FileName, "r") or die(); //This die(); is just to make sure...
while(!feof($FileWithEncTabe))
{
if($OneLine = trim(fgets($FileWithEncTabe, 1024)))
{
if (substr($OneLine, 0, 1) != "#")
{
$HexValue = preg_split ("/[\s,]+/", $OneLine, 3); //We need only first 2 values
if (substr($HexValue[1], 0, 1) != "#")
{
$ArrayKey = strtoupper(str_replace(strtolower("0x"), "", $HexValue[1]));
$ArrayValue = strtoupper(str_replace(strtolower("0x"), "", $HexValue[0]));
$ConvertTable[func_get_arg($i)][$ArrayKey] = $ArrayValue;
}
} //if (substr($OneLine,...
} //if($OneLine=trim(f...
} //while(!feof($FirstFileWi...
} //for($i = 0; $i < func_...
if(!is_array($ConvertTable[$FromCharset])) $ConvertTable[$FromCharset] = array();
if ((func_num_args() > 1) && (count($ConvertTable[$FromCharset]) == count($ConvertTable[$ToCharset])) && (count(array_diff_assoc($ConvertTable[$FromCharset], $ConvertTable[$ToCharset])) == 0))
{
print $this -> DebugOutput(1, 1, "$FromCharset, $ToCharset");
}
return $ConvertTable;
}
function Convert ($StringToChange)
{
if(!strlen($StringToChange)) return '';
$StringToChange = (string)($StringToChange);
if($this -> FromCharset == $this -> ToCharset) return $StringToChange;
$NewString = "";
if ($this -> FromCharset != "utf-8")
{
for ($i = 0; $i < strlen($StringToChange); $i++)
{
$HexChar = "";
$UnicodeHexChar = "";
$HexChar = strtoupper(dechex(ord($StringToChange[$i])));
if (strlen($HexChar) == 1) $HexChar = "0" . $HexChar;
if (($this -> FromCharset == "gsm0338") && ($HexChar == '1B')){
$i++;
$HexChar .= strtoupper(dechex(ord($StringToChange[$i])));
}
if ($this -> ToCharset != "utf-8")
{
if (in_array($HexChar, $this -> CharsetTable[$this -> FromCharset]))
{
$UnicodeHexChar = array_search($HexChar, $this -> CharsetTable[$this -> FromCharset]);
$UnicodeHexChars = explode("+", $UnicodeHexChar);
for($UnicodeHexCharElement = 0; $UnicodeHexCharElement < count($UnicodeHexChars); $UnicodeHexCharElement++)
{
if (array_key_exists($UnicodeHexChars[$UnicodeHexCharElement], $this -> CharsetTable[$this -> ToCharset]))
{
if ($this -> Entities == true)
{
$NewString .= $this -> UnicodeEntity($this -> HexToUtf($UnicodeHexChars[$UnicodeHexCharElement]));
}
else
{
$NewString .= chr(hexdec($this -> CharsetTable[$this -> ToCharset][$UnicodeHexChars[$UnicodeHexCharElement]]));
}
}
else
{
print $this -> DebugOutput(0, 1, $StringToChange[$i]);
}
} //for($UnicodeH...
}
else
{
print $this -> DebugOutput(0, 2, $StringToChange[$i]);
}
}
else
{
if (in_array("$HexChar", $this -> CharsetTable[$this -> FromCharset]))
{
$UnicodeHexChar = array_search($HexChar, $this -> CharsetTable[$this -> FromCharset]);
$UnicodeHexChars = explode("+", $UnicodeHexChar);
for($UnicodeHexCharElement = 0; $UnicodeHexCharElement < count($UnicodeHexChars); $UnicodeHexCharElement++)
{
if ($this -> Entities == true)
{
$NewString .= $this -> UnicodeEntity($this -> HexToUtf($UnicodeHexChars[$UnicodeHexCharElement]));
}
else
{
$NewString .= $this -> HexToUtf($UnicodeHexChars[$UnicodeHexCharElement]);
}
} // for
}
else
{
print $this -> DebugOutput(0, 2, $StringToChange[$i]);
}
}
}
}
else if($this -> FromCharset == "utf-8")
{
$HexChar = "";
$UnicodeHexChar = "";
$this -> CharsetTable = $this -> MakeConvertTable ($this -> ToCharset);
foreach ($this -> CharsetTable[$this -> ToCharset] as $UnicodeHexChar => $HexChar)
{
if ($this -> Entities == true){
$EntitieOrChar = $this -> UnicodeEntity($this -> HexToUtf($UnicodeHexChar));
}
else
{
$EntitieOrChar = chr(hexdec($HexChar));
}
$StringToChange = str_replace($this -> HexToUtf($UnicodeHexChar), $EntitieOrChar, $StringToChange);
}
$NewString = $StringToChange;
}
return $NewString;
}
function ConvertArray(& $array)
{
if (!is_array($array))
{
$array = $this -> Convert($array);
return;
}
while(list($k, $v) = each($array))
{
$this -> ConvertArray($v);
$array[$k] = $v;
}
}
function DebugOutput ($Group, $Number, $Value = false)
{
$Debug[0][0] = "Error, can NOT read file: " . $Value . "<br>";
$Debug[0][1] = "Error, can't find maching char \"" . $Value . "\" in destination encoding table!" . "<br>";
$Debug[0][2] = "Error, can't find maching char \"" . $Value . "\" in source encoding table!" . "<br>";
$Debug[0][3] = "Error, you did NOT set variable " . $Value . " in Convert() function." . "<br>";
$Debug[0][4] = "You can NOT convert string from " . $Value . " to " . $Value . "!" . "<BR>";
$Debug[1][0] = "Notice, you are trying to convert string from " . $Value . " to " . $Value . ", don't you feel it's strange? ;-)" . "<br>";
$Debug[1][1] = "Notice, both charsets " . $Value . " are identical! Check encoding tables files." . "<br>";
$Debug[1][2] = "Notice, there is no unicode char in the string you are trying to convert." . "<br>";
if (DEBUG_MODE >= $Group)
{
return $Debug[$Group][$Number];
}
} // function DebugOutput
} //class ends here
?>
Loaded 100 of 10479 files, more files were not shown because too many files have changed in this diff. Show more