Version 4.0.13.1

This commit is contained in:
Neo committed 2025-12-19 04:57:54 -08:00
1 parent f9e857d255
commit c6a86f0d9b
7517 files changed
+597400 -668041

No files matched your search

+197
View File
@@ -0,0 +1,197 @@
IPS Community Suite
(c) Invision Power Services, Inc.
Invision Power Services, Inc. is grateful to the following projects, whose work
has been used throughout the IPS Community Suite to add style, flair and functionality
to our product.
AES implementation in PHP
Last Updated: 22 July 2014
Website: http://www.movable-type.co.uk/scripts/aes-php.html
License: http://creativecommons.org/licenses/by/3.0/
Buzz.js
Included version: 1.1.8
Website: http://buzz.jaysalvat.com/
License: http://opensource.org/licenses/MIT
CKEditor
Included version: 4.4.7
Website: http://ckeditor.com
License: http://www.gnu.org/copyleft/lesser.html
Codemirror (with XML, JavaScript, CSS, HTMLMixed, C-like and PHP modes and merge, search searchcursor addons)
Included version: 4.13
Website: http://codemirror.net
License: http://codemirror.net/LICENSE
Cropper
Included version: 0.8
Website: https://github.com/fengyuanchen/cropper
License: http://opensource.org/licenses/MIT
Esrever
Included version: 0.2.0
Website: https://github.com/mathiasbynens/esrever
License: http://opensource.org/licenses/MIT
FontAwesome
Included version: 4.3.0
Website: http://fortawesome.github.com/Font-Awesome
License: http://fortawesome.github.com/Font-Awesome/#license
Google Charts
Website: https://developers.google.com/chart/
google-code-prettify
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
Included version: 19 November 2012
Website: https://code.google.com/p/google-diff-match-patch/
License: http://www.apache.org/licenses/LICENSE-2.0
history.js
Included version: 1.8b2
Website: https://github.com/browserstate/history.js
License: https://github.com/browserstate/history.js#license
HTMLPurifier
Included version: 4.6.0
Website: http://htmlpurifier.org
License: http://www.gnu.org/copyleft/lesser.html
IcoMoon
Website: https://icomoon.io/
License: http://creativecommons.org/licenses/by/4.0/
jQuery
Included version: 1.11.2
Website: http://jquery.com
License: http://jquery.org/license
jQuery dotdotdot
Included version: 1.6.16
Website: dotdotdot.frebsite.nl
License: http://opensource.org/licenses/MIT
jquery.hotkeys.js
Website: https://github.com/jeresig/jquery.hotkeys
License: http://opensource.org/licenses/MIT
jQuery imagesLoaded plugin
Included version: 2.1.2 (3.x API isn't compatible with IPS4 at this time)
Website: http://desandro.github.io/imagesloaded/
License: http://opensource.org/licenses/MIT
jQuery.menuaim.js
Website: https://github.com/kamens/jQuery-menu-aim
License: http://opensource.org/licenses/MIT
jQuery.rangyinputs.js
Included version: 1.2.0
Website: https://github.com/timdown/rangyinputs
License: http://opensource.org/licenses/MIT
jQuery slimScroll
Included version: 1.3.0
Website: http://rocha.la/jQuery-slimScroll
License: http://opensource.org/licenses/MIT
jQuery UI (core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, sortable.js, datepicker.js, progressbar.js)
Included version: 1.11.3
Website: http://jqueryui.com
License: http://jquery.org/license
jQuery UI TouchPunch
Included version: 0.2.3
Website: http://touchpunch.furf.com/
License: http://opensource.org/licenses/MIT
JSColor
Included version: 1.4.4
Website: http://jscolor.com
License: http://www.gnu.org/copyleft/lesser.html
jsTimezoneDetect
Included version: 1.0.5
Website: http://pellepim.bitbucket.org/jstz/
License: http://www.opensource.org/licenses/mit-license.php
Minify
Included Version: 2.1.7
Website: http://code.google.com/p/minify/
License: http://opensource.org/licenses/BSD-3-Clause
Mustache.js
Included version: 1.0.0
Website: http://github.com/janl/mustache.js
License: http://opensource.org/licenses/MIT
Normalize.css
Included version: 3.0.2
Website: http://necolas.github.io/normalize.css/
License: http://opensource.org/licenses/MIT
parseUri
Included version: 1.2.2
Website: http://blog.stevenlevithan.com/archives/parseuri
License: http://opensource.org/licenses/MIT
Payment Method Icons
Website: http://www.dreamstale.com/free-download-payment-method-vector-icons/
License: http://creativecommons.org/licenses/by/3.0/
PEAR Mail
Included version: 1.2.0
Website: http://pear.php.net/package/Mail
License: http://www.opensource.org/licenses/bsd-license.php
PHP Diff Implementation
Included version: 11 Feb 2013
Website: http://code.stephenmorley.org/php/diff-implementation/
License: http://creativecommons.org/publicdomain/zero/1.0/legalcode
phpQuery
Included Version: 0.9.5
Website: https://code.google.com/p/phpquery
License: http://opensource.org/licenses/mit-license.php
Plupload
Included version: 2.1.2
Website: http://www.plupload.com
License: http://www.plupload.com/license/plupload_commercial_oem.txt
Modifications: https://github.com/moxiecode/moxie/pull/67/files
pop3.class.inc
Included version: 1.17
Website: http://www.phpclasses.org/package/1120-PHP-Communicating-with-a-POP3-mail-server.html
License: http://opensource.org/licenses/GPL-1.0
Preloaders.net
Website: http://preloaders.net/
Underscore.js
Included version: 1.7.0
Website: http://underscorejs.org
License: https://github.com/documentcloud/underscore/blob/master/LICENSE
Video.js
Included version: 4.11.4
Website: http://www.videojs.com/
License: https://github.com/videojs/video.js/blob/master/LICENSE
world-flags-sprite
Website: https://github.com/lafeber/world-flags-sprite/
License: https://github.com/lafeber/world-flags-sprite/blob/master/LICENSE
XRegExp (with addons)
Included Version: 2.0.0
Website: http://xregexp.com
License: http://mit-license.org
Whoops
Website: http://filp.github.io/whoops/
License: https://github.com/filp/whoops/blob/master/LICENSE.md
-39
View File
@@ -1,39 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>IPS Community Suite Setup Guide</title>
<style type='text/css' media='all'>
@import url('data/install.css');
</style>
</head>
<body>
<div id='ipbwrapper'>
<div id='branding'>
<div class='main_width'>
<div class='logo'><img src='data/images/logo.png' /></div>
</div>
</div>
</div>
<div id='content'>
<div class='message'>
<a href='http://anonym.to/?http://external.ipslink.com/ipboard30/landing/?p=installation-guide'>Installing &rarr;
</div>
<br />
<div class='message'>
<a href='http://anonym.to/?http://external.ipslink.com/ipboard30/landing/?p=upgrade-guide'>Upgrading &rarr;
</div>
<br />
<div class='message'>
<a href='http://anonym.to/?http://external.ipslink.com/ipboard30/landing/?p=convert-guide'>Converting &rarr;
</div>
<br />
<div class='copyright'>
&copy; 2012 Invision Power Services, Inc.
</div>
</div>
</body>
</html>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1008 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1009 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1010 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

-1
View File
@@ -1 +0,0 @@
<html>␍<head><title>Invision Power Board - Bulletin Board System</title></head>␍<body>␍<h1>403: Invision Power Board -&gt; Forbidden</h1>␍<hr>␍You have reached this Page in error, please use␍your back button to return to Invision Board.␍<hr>␍Invision Power Board␍</body>␍</html>␍
Binary file not shown.

Before

Width:  |  Height:  |  Size: 778 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

-10
View File
@@ -1,10 +0,0 @@
<html>
<head><title>IP.Board - Bulletin Board System</title></head>
<body>
<h1>403: IP.Board -&gt; Forbidden</h1>
<hr>
You have reached this page in error, please use your back button to return to the forum.
<hr>
IP.Board
</body>
</html>
-545
View File
@@ -1,545 +0,0 @@
/**
* Installer CSS
* (c) Invision Power Services, Inc.
*/
/*-----------------------------------------------*/
/* This section resets default browser styles. */
/* You shouldn't need to edit this section. */
/*-----------------------------------------------*/
body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td { margin:0; padding:0; }
table { border-collapse:collapse; border-spacing:0; }
fieldset,img { border:0; }
address,caption,cite,code,dfn,em,strong,th,var { font-style:normal; font-weight:normal; }
ol,ul { list-style:none; }
caption,th { text-align:left; }
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
q:before,q:after { content:''; }
abbr,acronym { border:0; }
hr { display: none; }
html, body { /* Safari has trouble with bgcolor on body. Apply to html tag too. */
background-color: #d8dde8;
color: #5a5a5a;
}
body {
font: normal 13px helvetica, arial, sans-serif;
position: relative;
}
input, select {
font: normal 13px helvetica, arial, sans-serif;
}
a {
color: #225985;
text-decoration: none;
}
a:hover { color: #328586; }
/************************************************************************/
/* LAYOUT */
#content, .main_width {
margin: 0 auto;
width: 980px;
}
#branding, #header_bar, #primary_nav { min-width: 980px; }
/*#header_bar .main_width, #branding .main_width, #primary_nav .main_width { padding: 0 10px; }*/
/**
* @key content
* @group global
* @colorize base
* @title Main Content Area
* @description The area that contains all page content
* @default background
*/
#content {
background: #fff;
padding: 10px 10px;
line-height: 120%;
-webkit-box-shadow: 0 5px 9px rgba(0,0,0,0.1);
-moz-box-shadow: 0 5px 9px rgba(0,0,0,0.1);
box-shadow: 0 5px 9px rgba(0,0,0,0.1);
}
#branding {
background: #0f3854 url(images/branding_bg.png) repeat-x;
border-bottom: 1px solid #1b3759;
min-height: 64px;
}
#logo { display: inline; }
#primary_nav {
background: #204066;
font-size: 13px;
padding: 4px 0 0 0;
}
#community_app_menu > li { margin: 0px 3px 0 0; position: relative; }
/**
* @key primarynav_inactive
* @group header
* @colorize base
* @title Inactive App Tab
* @description An inactive tab in the Primary Nav bar
* @default background, color
*/
#community_app_menu > li > a {
color: #c5d5e2;
background: #1c3b5f;
display: block;
padding: 6px 15px 8px;
text-shadow: 0px 1px 1px rgba(0,0,0,0.5);
}
#community_app_menu > li > a:hover, #community_app_menu > li > a.menu_active { background: #173455; color: #fff; }
/**
* @key primarynav_active
* @group header
* @colorize base
* @title Active App Tab
* @description An active tab in the Primary Nav bar
* @default background, color
*/
#community_app_menu > li.active > a {
background: #fff;
color: #0b5794;
font-weight: bold;
margin-top: 0;
text-shadow: none;
}
.ipsList_inline > li {
display: inline-block;
margin: 0 3px;
}
.ipsList_inline > li:first-child { margin-left: 0; }
.ipsList_inline > li:last-child { margin-right: 0; }
.ipsList_inline.ipsList_reset > li:first-child { margin-left: 3px; }
.ipsList_inline.ipsList_reset > li:last-child { margin-right: 3px; }
.ipsList_inline.ipsList_nowrap { white-space: nowrap; }
/* Utility styles */
.right { float: right; }
.left { float: left; }
.hide { display: none; }
.short { text-align: center; }
.clear { clear: both; }
.clearfix:after { content: ".";display: block;height: 0;clear: both;visibility: hidden;}
.faded { opacity: 0.5 }
.clickable { cursor: pointer; }
.reset_cursor { cursor: default; }
/************************************************************************/
/* LAYOUT SYSTEM */
.ipsLayout.ipsLayout_withleft { padding-left: 210px; }
.ipsBox.ipsLayout.ipsLayout_withleft { padding-left: 220px; }
.ipsLayout.ipsLayout_withright { padding-right: 210px; clear: left; }
.ipsBox.ipsLayout.ipsLayout_withright { padding-right: 220px; }
/* Panes */
.ipsLayout_content, .ipsLayout .ipsLayout_left, .ipsLayout_right { position: relative; }
.ipsLayout_content { width: 100%; float: left; }
.ipsLayout .ipsLayout_left { width: 200px; margin-left: -210px; float: left; }
.ipsLayout .ipsLayout_right { width: 200px; margin-right: -210px; float: right; }
/* Wider sidebars */
.ipsLayout_largeleft.ipsLayout_withleft { padding-left: 280px; }
.ipsBox.ipsLayout_largeleft.ipsLayout_withleft { padding-left: 290px; }
.ipsLayout_largeleft.ipsLayout .ipsLayout_left { width: 270px; margin-left: -280px; }
.ipsLayout_largeright.ipsLayout_withright { padding-right: 280px; }
.ipsBox.ipsLayout_largeright.ipsLayout_withright { padding-right: 290px; }
.ipsLayout_largeright.ipsLayout .ipsLayout_right { width: 270px; margin-right: -280px; }
/* Narrow sidebars */
.ipsLayout_smallleft.ipsLayout_withleft { padding-left: 150px; }
.ipsBox.ipsLayout_smallleft.ipsLayout_withleft { padding-left: 160px; }
.ipsLayout_smallleft.ipsLayout .ipsLayout_left { width: 140px; margin-left: -150px; }
.ipsLayout_smallright.ipsLayout_withright { padding-right: 150px; }
.ipsBox.ipsLayout_smallright.ipsLayout_withright { padding-right: 160px; }
.ipsLayout_smallright.ipsLayout .ipsLayout_right { width: 140px; margin-right: -150px; }
/* Tiny sidebar */
.ipsLayout_tinyleft.ipsLayout_withleft { padding-left: 50px; }
.ipsBox.ipsLayout_tinyleft.ipsLayout_withleft { padding-left: 60px; }
.ipsLayout_tinyleft.ipsLayout .ipsLayout_left { width: 40px; margin-left: -40px; }
.ipsLayout_tinyright.ipsLayout_withright { padding-right: 50px; }
.ipsBox.ipsLayout_tinyright.ipsLayout_withright { padding-right: 60px; }
.ipsLayout_tinyright.ipsLayout .ipsLayout_right { width: 40px; margin-right: -40px; }
/* Big sidebar */
.ipsLayout_bigleft.ipsLayout_withleft { padding-left: 330px; }
.ipsBox.ipsLayout_bigleft.ipsLayout_withleft { padding-left: 340px; }
.ipsLayout_bigleft.ipsLayout .ipsLayout_left { width: 320px; margin-left: -330px; }
.ipsLayout_bigright.ipsLayout_withright { padding-right: 330px; }
.ipsBox.ipsLayout_bigright.ipsLayout_withright { padding-right: 340px; }
.ipsLayout_bigright.ipsLayout .ipsLayout_right { width: 320px; margin-right: -330px; }
/* Even Wider sidebars */
.ipsLayout_hugeleft.ipsLayout_withleft { padding-left: 380px; }
.ipsBox.ipsLayout_hugeleft.ipsLayout_withleft { padding-left: 390px; }
.ipsLayout_hugeleft.ipsLayout .ipsLayout_left { width: 370px; margin-left: -380px; }
.ipsLayout_hugeright.ipsLayout_withright { padding-right: 380px; }
.ipsBox.ipsLayout_hugeright.ipsLayout_withright { padding-right: 390px; }
.ipsLayout_hugeright.ipsLayout .ipsLayout_right { width: 370px; margin-right: -380px; }
.ipsBox { background: #ebf0f3; }
.ipsBox, .ipsPad { padding: 9px; }
.ipsPad_double { padding: 9px 19px; } /* 19px because it's still only 1px border to account for */
.ipsBox_withphoto { margin-left: 65px; }
.ipsBox_container {
background: #fff;
border: 1px solid #dbe4ef;
}
.ipsBox_notice {
padding: 10px;
line-height: 1.6;
margin-bottom: 10px;
}
.ipsBox_container .ipsBox_notice { margin: -10px -10px 10px -10px; }
.ipsPad_half { padding: 4px !important; }
.ipsPad_left { padding-left: 9px; }
.ipsPad_top { padding-top: 9px; }
.ipsPad_top_slimmer { padding-top: 7px; }
.ipsPad_top_half { padding-top: 4px; }
.ipsPad_top_bottom { padding-top: 9px; padding-bottom: 9px; }
.ipsPad_top_bottom_half { padding-top: 4px; padding-bottom: 4px; }
.ipsMargin_top { margin-top: 9px; }
#progress { margin: 10px 0px 10px 40px }
#progress .step_done {
list-style-image: url('images/bullet_done.gif');
color: #44638E;
font-style: italic;
}
#progress .step_doing {
list-style-image: url('images/bullet_doing.gif');
font-weight: bold;
}
#progress .step_doing p {
color: gray;
font-weight: normal;
}
#progress .step_notdone {
list-style-image: url('images/bullet_notdone.gif');
}
.maintitle {
background: #2c5687 url(images/maintitle.png) repeat-x top;
color: #fff;
padding: 10px 10px 11px;
font-size: 16px;
font-weight: 300;
-moz-border-radius: 4px 4px 0 0;
-webkit-border-top-left-radius: 4px;
-webkit-border-top-right-radius: 4px;
border-radius: 4px 4px 0 0;
-webkit-box-shadow: inset 0px 1px 0 #528cbc;
-moz-box-shadow: inset 0px 1px 0 #528cbc;
box-shadow: inset 0px 1px 0 #528cbc;
border-width: 1px 1px 0 1px;
border-color: #316897;
border-style: solid;
}
.maintitle a { color: #fff; }
#contentContainer {
overflow: auto;
overflow-y:auto;
overflow-x:hidden;
height: 550px;
}
.input_text, .sql_form {
padding: 4px;
border-width: 1px;
border-style: solid;
border-color: #848484 #c1c1c1 #e1e1e1 #c1c1c1;
background: #fff;
-moz-border-radius: 2px;
-webkit-border-radius: 2px;
border-radius: 2px;
}
.input_text:focus {
border-color: #4e4e4e #7c7c7c #a3a3a3 #7c7c7c;
-webkit-box-shadow: 0px 0px 5px rgba(0,0,0,0.3);
-moz-box-shadow: 0px 0px 5px rgba(0,0,0,0.3);
box-shadow: 0px 0px 5px rgba(0,0,0,0.3);
}
ipsType_pagetitle, .ipsType_subtitle {
font: 300 26px/1.3 Helvetica, Arial, sans-serif;
color: #323232;
}
.ipsType_subtitle { font-size: 18px; }
.ipsType_sectiontitle {
font-size: 16px;
font-weight: normal;
color: #595959;
padding: 5px 0;
border-bottom: 1px solid #ececec;
}
.ipsType_pagedesc {
color: #7f7f7f;
line-height: 1.5;
}
#login_controls {
margin: 0 auto;
width: 100%;
font-size: 12px;
}
#login_controls label {
display: block;
width: 35%;
color: #000;
float: left;
clear: both;
margin-bottom: 12px;
text-align: right;
padding-right: 15px;
}
#login_controls input {
margin-bottom: 12px;
font-size: 12px;
width: 45%;
}
.nav_button, .button, .realbutton {
-moz-border-radius-bottomleft:3px;
-moz-border-radius-bottomright:3px;
-moz-border-radius-topleft:3px;
-moz-border-radius-topright:3px;
background-color:#657B97;
border:1px solid #3E546F;
color:#FFFFFF;
cursor:pointer;
padding:3px;
}
.message {
padding: 10px 10px 10px 10px;
margin-bottom: 6px;
border-width: 1px;
border-style: solid;
border-color: #b0ce94;
background-color: #f1f6ec;
color: #3e4934;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
line-height: 150%;
}
.message.error {
background-color: #f3dddd;
border-color: #deb7b7;
color: #281b1b;
font-size: 1.1em;
}
.message.unspecific {
background-color: #f3f3f3;
border-color: #d4d4d4;
color: #515151;
clear: both;
margin: 0 0 10px 0;
}
.message.unspecific.note {
background-color: #f9f7e0;
border-color: #eadca0;
margin-top: 8px;
}
H1 {
margin: 0px;
/* -provide BG incase of missing img- */
background-image: url('images/title_bar.gif');
padding: 7px 5px 6px 5px;
font-size: 13px;
color: #ffffff;
font-weight: bold;
}
H2 {
margin: 0px;
font-size: 18px;
}
H3 {
font-size: 11px;
margin: 0px;
}
.content_shell
{
margin: 0px 3px 3px 3px;
border: 1px solid #24426A;
border-top: 3px solid #24426A;
background-repeat: repeat-x;
background-color: #D5DDE5;
}
.package {
clear:both;
height: 577px;
}
.content_wrap {
width: 70%;
height: 480px;
float: right;
margin: 6px 6px 4px 0px;
padding: 10px;
background-color: #ffffff;
border: 1px solid #000000;
line-height: 150%;
overflow: auto;
overflow-y:auto;
overflow-x:hidden;
}
.install_info {
float: left;
margin: -5px 0px 0px 10px;
font-size: 12px;
width: 23%;
}
.install_info H3 {
font-size: 15px;
color: #6D87A9;
}
.install_info UL {
margin: 0px;
margin-top: 15px;
padding-left: 25px;
list-style-type: none;
}
.warning {
background-color: #EDF1AB;
border: 1px solid #6E704B;
padding: 5px;
font-weight: bold;
-moz-border-radius: 5px;
overflow: auto;
}
.hr {
margin: 4px 6px 0px 6px;
border-bottom: 1px solid #627686;
}
.copyright {
width: 98%;
text-align: right;
font-size: 9px;
color: #9EA7B3;
padding-top: 3px;
padding-right: 5px;
}
.eula {
height: 400px;
border: 1px solid #76774C;
background-color: #FDFDD3;
padding: 8px;
overflow: auto;
margin-bottom: 6px;
}
#auto_progress LI {
list-style: none;
color: #029901;
font-size: 11px;
font-weight: bold;
padding: 3px;
}
.done_text {
font-size: 14px;
font-weight: bold;
}
#links {
margin: 0px;
padding: 5px;
}
#links LI {
list-style: none;
}
.float_img {
float: left;
margin-right: 5px;
}
.info {
background-color: #DCE6F3;
border: 1px solid #5876A0;
padding: 4px;
line-height: 120%;
-moz-border-radius: 7px;
color: #1D3A60;
}
.sql_form {
width: 100%;
}
FIELDSET {
padding: 10px 10px 10px 10px;
border-width: 1px;
border-style: solid;
border-color: #d5dde5;
background-color: #F1F4F7;
color: #3e4934;
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
line-height: 150%;
}
FIELDSET LEGEND {
font-weight: bold;
}
TABLE .title {
color: #2D4461;
font-weight: bold;
padding-bottom: 6px;
}
TABLE .content {
padding-bottom: 6px;
}
-240
View File
@@ -1,240 +0,0 @@
<?php
/*
+---------------------------------------------------------------------------
| IP.Board v3.4.6
| ========================================
| by Matthew Mecham
| (c) 2008 Invision Power Services
| http://www.invisionpower.com
| ========================================
+---------------------------------------------------------------------------
| Invision Power Board IS NOT FREE SOFTWARE!
+---------------------------------------------------------------------------
| http://www.invisionpower.com/
| > $Id: 10039 2011-12-20 19:49:28Z mmecham $
| > $Revision: 10039 $
| > $Date: 2011-12-20 14:49:28 -0500 (Tue, 20 Dec 2011) $
+---------------------------------------------------------------------------
*/
@set_time_limit( 3600 );
/**
* Main public executable wrapper.
*
* Set-up and load module to run
*
* @package IP.Board
* @author Matt Mecham
* @version 3.0
*/
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
elseif ( is_file( '../initdata.php' ) )
{
require_once( '../initdata.php' );/*noLibHook*/
}
else
{
require_once( 'initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
private $processed = 0;
private $parser;
private $oldparser;
private $start = 0;
private $end = 0;
const TOPICS_PER_GO = 100;
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->memberData = array();
/* Do we have a remote DB? */
if ( $this->settings['archive_remote_sql_database'] && $this->settings['archive_remote_sql_user'] )
{
if ( ! is_object( $this->registry->dbFunctions()->getDB('remoteArchive') ) )
{
$this->registry->dbFunctions()->setDB( 'mysql', 'remoteArchive', array( 'sql_database' => $this->settings['archive_remote_sql_database'],
'sql_user' => $this->settings['archive_remote_sql_user'],
'sql_pass' => $this->settings['archive_remote_sql_pass'],
'sql_host' => $this->settings['archive_remote_sql_host'],
'sql_charset' => $this->settings['archive_remote_sql_charset'],
'sql_tbl_prefix' => $this->settings['sql_tbl_prefix'],
'catchConnectionError' => true ) );
$this->remoteDB = $this->registry->dbFunctions()->getDB('remoteArchive');
/* Check for connection issue */
if ( $this->remoteDB->error )
{
$this->connectError = $this->remoteDB->error;
$this->remoteDB = null;
$this->registry->dbFunctions()->unsetDB('remoteArchive');
}
}
else
{
$this->remoteDB = $this->registry->dbFunctions()->getDB('remoteArchive');
/* Check for connection issue */
if ( $this->remoteDB->error )
{
$this->connectError = $this->remoteDB->error;
$this->remoteDB = null;
$this->registry->dbFunctions()->unsetDB('remoteArchive');
}
}
}
else
{
$this->remoteDB = $this->DB;
}
switch( $this->request['do'] )
{
case 'process':
$this->process();
break;
default:
$this->splash();
break;
}
}
function show( $content, $url='' )
{
if ( $url )
{
$firstBit = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$refresh = "<meta http-equiv='refresh' content='0; url={$firstBit}?{$url}'>";
}
if ( is_array( $content ) )
{
$content = implode( "<br />", $content );
}
$html = <<<EOF
<html>
<head>
<title>Archive Update</title>
$refresh
</head>
<body>
$content
</body>
</html>
EOF;
print $html; exit();
}
/**
* SPLASH
*/
function splash()
{
$txt = '';
if ( ! $this->remoteDB->checkForField( 'archive_forum_id', 'forums_archive_posts' ) )
{
$PRE = trim(ipsRegistry::dbFunctions()->getPrefix());
$this->remoteDB->query('ALTER TABLE ' . $PRE . 'forums_archive_posts ADD archive_forum_id INT(10) NOT NULL DEFAULT 0;');
$txt = "Adding archive_forum_id field to your database - Done<br />";
}
$html = <<<EOF
<strong>Archive Update for IP.Board 3.3.1</strong>
<br />{$txt}
<a href="?do=process">Continue</a>
EOF;
$this->show( $html );
}
/**
* Process
*/
function process()
{
$id = intval( $this->request['id'] );
$lastId = 0;
$done = intval( $this->request['done'] );
$cycleDone = 0;
$content = array();
/* skipping? */
$total = $this->remoteDB->buildAndFetch( array( 'select' => 'count(*) as count',
'from' => 'forums_archive_posts' ) );
/* Fetch batch */
$this->remoteDB->build( array( 'select' => '*',
'from' => 'forums_archive_posts',
'where' => 'archive_topic_id > ' . $id,
'limit' => array( 0, self::TOPICS_PER_GO ),
'order' => 'archive_topic_id ASC' ) );
$o = $this->remoteDB->execute();
while( $row = $this->remoteDB->fetch( $o ) )
{
$cycleDone++;
$lastId = $row['archive_topic_id'];
$content[] = "Updating topics " . ( $done + $cycleDone ) . " (archive_topic_id: " . $row['archive_topic_id'] . ") of " . $total['count'];
/* Fetch the forum ID */
$topic = $this->DB->buildAndFetch( array( 'select' => 'forum_id',
'from' => 'topics',
'where' => 'tid=' . intval( $row['archive_topic_id'] ) ) );
if ( $topic['forum_id'] )
{
$this->remoteDB->update( 'forums_archive_posts', array( 'archive_forum_id' => $topic['forum_id'] ), 'archive_topic_id=' . $row['archive_topic_id'] );
}
}
/* More? */
if ( $cycleDone )
{
/* Reset */
$done += $cycleDone;
$this->show( $content, "do=process&id=" . $lastId . "&done=" . $done );
}
else
{
$this->show( "Process complete" );
return;
}
}
}
?>
-252
View File
@@ -1,252 +0,0 @@
<?php
/*
+---------------------------------------------------------------------------
| IP.Board v3.4.6
| ========================================
| by Matthew Mecham
| (c) 2008 Invision Power Services
| http://www.invisionpower.com
| ========================================
+---------------------------------------------------------------------------
| Invision Power Board IS NOT FREE SOFTWARE!
+---------------------------------------------------------------------------
| http://www.invisionpower.com/
| > $Id: 10039 2011-12-20 19:49:28Z mmecham $
| > $Revision: 10039 $
| > $Date: 2011-12-20 14:49:28 -0500 (Tue, 20 Dec 2011) $
+---------------------------------------------------------------------------
*/
@set_time_limit( 3600 );
/**
* Main public executable wrapper.
*
* Set-up and load module to run
*
* @package IP.Board
* @author Matt Mecham
* @version 3.0
*/
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
elseif ( is_file( '../initdata.php' ) )
{
require_once( '../initdata.php' );/*noLibHook*/
}
else
{
require_once( 'initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
private $processed = 0;
private $parser;
private $oldparser;
private $start = 0;
private $end = 0;
const TOPICS_PER_GO = 100;
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->memberData = array();
/* Do we have a remote DB? */
if ( $this->settings['archive_remote_sql_database'] && $this->settings['archive_remote_sql_user'] )
{
if ( ! is_object( $this->registry->dbFunctions()->getDB('remoteArchive') ) )
{
$this->registry->dbFunctions()->setDB( 'mysql', 'remoteArchive', array( 'sql_database' => $this->settings['archive_remote_sql_database'],
'sql_user' => $this->settings['archive_remote_sql_user'],
'sql_pass' => $this->settings['archive_remote_sql_pass'],
'sql_host' => $this->settings['archive_remote_sql_host'],
'sql_charset' => $this->settings['archive_remote_sql_charset'],
'sql_tbl_prefix' => $this->settings['sql_tbl_prefix'],
'catchConnectionError' => true ) );
$this->remoteDB = $this->registry->dbFunctions()->getDB('remoteArchive');
/* Check for connection issue */
if ( $this->remoteDB->error )
{
$this->connectError = $this->remoteDB->error;
$this->remoteDB = null;
$this->registry->dbFunctions()->unsetDB('remoteArchive');
}
}
else
{
$this->remoteDB = $this->registry->dbFunctions()->getDB('remoteArchive');
/* Check for connection issue */
if ( $this->remoteDB->error )
{
$this->connectError = $this->remoteDB->error;
$this->remoteDB = null;
$this->registry->dbFunctions()->unsetDB('remoteArchive');
}
}
}
else
{
$this->remoteDB = $this->DB;
}
switch( $this->request['do'] )
{
case 'process':
$this->process();
break;
default:
$this->splash();
break;
}
}
function show( $content, $url='' )
{
if ( $url )
{
$firstBit = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$refresh = "<meta http-equiv='refresh' content='0; url={$firstBit}?{$url}'>";
}
if ( is_array( $content ) )
{
$content = implode( "<br />", $content );
}
$html = <<<EOF
<html>
<head>
<title>Archive Update</title>
$refresh
</head>
<body>
$content
</body>
</html>
EOF;
print $html; exit();
}
/**
* SPLASH
*/
function splash()
{
$txt = '';
$html = <<<EOF
<strong>Archive Update for IP.Board 3.3.3</strong>
<br />{$txt}
<a href="?do=process">Continue</a>
EOF;
$this->show( $html );
}
/**
* Process
*/
function process()
{
$data = $this->getRestoreData();
$topics = array();
$this->DB->build( array( 'select' => 'tid',
'from' => 'topics',
'where' => 'topic_archive_status=4' ) );
$this->DB->execute();
while( $row = $this->DB->fetch() )
{
$topics[ $row['tid'] ] = $row['tid'];
}
/* get maxes */
if ( count( $topics ) )
{
$this->DB->build( array( 'select' => 'topic_id, max(pid) as max',
'from' => 'posts',
'where' => 'topic_id IN( ' . implode( ',', $topics ) . ')',
'group' => 'topic_id' ) );
$this->DB->execute();
while( $row = $this->DB->fetch() )
{
$topics[ $row['topic_id'] ] = $row['max'];
}
}
$data['restore_manual_tids'] = $topics;
$this->setRestoreData( $data );
$this->show( "Process complete" );
}
/**
* Get restore data
*/
public function getRestoreData()
{
$data = $this->DB->buildAndFetch( array( 'select' => '*',
'from' => 'core_archive_restore' ) );
if ( IPSLib::isSerialized( $data['restore_manual_tids'] ) )
{
$data['restore_manual_tids'] = unserialize( $data['restore_manual_tids'] );
}
else
{
$data['restore_manual_tids'] = array();
}
return $data;
}
/**
* Set restore data
* @param array
*/
public function setRestoreData( $data )
{
if ( is_array( $data['restore_manual_tids'] ) )
{
$data['restore_manual_tids'] = serialize( $data['restore_manual_tids'] );
}
$data['restore_min_tid'] = intval( $data['restore_min_tid'] );
$data['restore_max_tid'] = intval( $data['restore_max_tid'] );
$this->DB->delete( 'core_archive_restore');
$this->DB->insert( 'core_archive_restore', $data );
}
}
?>
-166
View File
@@ -1,166 +0,0 @@
<?php
/*
+---------------------------------------------------------------------------
| IP.Board v3.4.6
| ========================================
| by Matthew Mecham
| (c) 2008 Invision Power Services
| http://www.invisionpower.com
| ========================================
+---------------------------------------------------------------------------
| Invision Power Board IS NOT FREE SOFTWARE!
+---------------------------------------------------------------------------
| http://www.invisionpower.com/
| > $Id: 10039 2011-12-20 19:49:28Z mmecham $
| > $Revision: 10039 $
| > $Date: 2011-12-20 14:49:28 -0500 (Tue, 20 Dec 2011) $
+---------------------------------------------------------------------------
*/
@set_time_limit( 3600 );
/**
* Main public executable wrapper.
*
* Set-up and load module to run
*
* @package IP.Board
* @author Matt Mecham
* @version 3.0
*/
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
elseif ( is_file( '../initdata.php' ) )
{
require_once( '../initdata.php' );/*noLibHook*/
}
else
{
require_once( 'initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
private $processed = 0;
private $parser;
private $oldparser;
private $start = 0;
private $end = 0;
const TOPICS_PER_GO = 100;
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->memberData = array();
switch( $this->request['do'] )
{
case 'media':
$this->media();
break;
default:
$this->splash();
break;
}
}
function show( $content, $url='' )
{
if ( $url )
{
$firstBit = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$refresh = "<meta http-equiv='refresh' content='0; url={$firstBit}?{$url}'>";
}
if ( is_array( $content ) )
{
$content = implode( "<br />", $content );
}
$html = <<<EOF
<html>
<head>
<title>3.4.x Post Repair</title>
$refresh
</head>
<body>
$content
</body>
</html>
EOF;
print $html; exit();
}
/**
* SPLASH
*/
function splash()
{
$txt = '';
$html = <<<EOF
<strong>Please select a tool</strong>
<br />{$txt}
<a href="?do=media">Fix MEDIA (Youtube, etc)</a>
EOF;
$this->show( $html );
}
/**
* Fix up media stuffs
*/
function media()
{
$this->DB->build( array( 'select' => '*',
'from' => 'posts',
'where' => "post LIKE '%<object%'" ) );
$o = $this->DB->execute();
while( $row = $this->DB->fetch( $o ) )
{
$original = $row['post'];
preg_match_all( '#<object(.+?)</object>#i', $row['post'], $matches, PREG_SET_ORDER );
foreach( $matches as $val )
{
preg_match( '#http(?:s)?://(?:www.)?youtube.com/v/([\d\w-_]{4,})(&\S+?)?#', $row['post'], $matches );
if ( $matches[1] )
{
$row['post'] = str_replace( $val[0], '[media]http://youtube.com/watch?v=' . $matches[1] . '[/media]', $row['post'] );
}
}
if ( $row['post'] && $row['pid'] && ( $original != $row['post'] ) )
{
$this->DB->update( 'posts', array( 'post' => $row['post'] ), 'pid=' . intval( $row['pid'] ) );
$output .= "Fixed Post Id: " . $row['pid'] . '<br />';
}
}
$this->show( "<h2>Complete</h2>" . $output );
}
}
?>
-236
View File
@@ -1,236 +0,0 @@
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2011-03-31 11:17:44 +0100 (Thu, 31 Mar 2011) $
* </pre>
*
* @author $Author: ips_terabyte $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 8229 $
*
*/
define( 'IPB_THIS_SCRIPT', 'admin' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->_doLang();
$this->_doSkins();
}
/**
* Rebuild langs
*/
protected function _doSkins()
{
/* INIT */
$start = time();
$output = array();
$errors = array();
/* Grab class */
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinFunctions.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinCaching.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinImportExport.php' );/*noLibHook*/
$skinFunctions = new skinImportExport( $this->registry );
/* Grab skin data */
$this->DB->build( array( 'select' => '*',
'from' => 'skin_collections' ) );
$this->DB->execute();
while( $row = $this->DB->fetch() )
{
/* Bit of jiggery pokery... */
if ( $row['set_key'] == 'default' )
{
$row['set_key'] = 'root';
$row['set_id'] = 0;
}
$skinSets[ $row['set_key'] ] = $row;
}
/* Templates */
foreach( ipsRegistry::$applications as $appDir => $appData )
{
foreach( $skinSets as $skinKey => $skinData )
{
$_PATH = IPSLib::getAppDir( $appDir ) . '/xml/';
$output[] = "Upgrading {$skinData['set_name']} for $appDir templates...";
if ( is_file( $_PATH . $appDir . '_' . $skinKey . '_templates.xml' ) )
{
//-----------------------------------------
// Install
//-----------------------------------------
$return = $skinFunctions->importTemplateAppXML( $appDir, $skinKey, $skinData['set_id'], TRUE );
$output[] = intval( $return['insertCount'] ) . " added, " . intval( $return['updateCount'] ) . " templates updated";
}
if ( is_file( $_PATH . $appDir . '_' . $skinKey . '_css.xml' ) )
{
//-----------------------------------------
// Install
//-----------------------------------------
$return = $skinFunctions->importCSSAppXML( $appDir, $skinKey, $skinData['set_id'] );
$output[] = intval( $return['insertCount'] ) . " {$skinData['set_name']} CSS files inserted";
}
}
}
/* Replacements */
foreach( $skinSets as $skinKey => $skinData )
{
if ( is_file( IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $skinKey . '.xml' ) )
{
$skinFunctions->importReplacementsXMLArchive( file_get_contents( IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $skinKey . '.xml' ), $skinKey );
$output[] = $skinKey . " replacements rebuilt";
}
}
/* reset ID */
//$skinSets['root']['set_id'] = 1;
/* Recache */
foreach( $skinSets as $skinKey => $skinData )
{
$skinFunctions->rebuildPHPTemplates( $skinData['set_id'] );
if ( $skinFunctions->fetchErrorMessages() !== FALSE )
{
$output[] = implode( "<br />", $skinFunctions->fetchErrorMessages() );
}
$skinFunctions->rebuildCSS( $skinData['set_id'] );
if ( $skinFunctions->fetchErrorMessages() !== FALSE )
{
$output[] = implode( "<br />", $skinFunctions->fetchErrorMessages() );
}
$skinFunctions->rebuildReplacementsCache( $skinData['set_id'] );
if ( $skinFunctions->fetchErrorMessages() !== FALSE )
{
$output[] = implode( "<br />", $skinFunctions->fetchErrorMessages() );
}
$output[] = $skinKey . " recached";
}
/* recache other */
$skinFunctions->rebuildSkinSetsCache();
$this->_print( implode( "\n", $output ) );
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Rebuild langs
*/
protected function _doLang()
{
/* Grab class */
require_once( IPS_ROOT_PATH . 'applications/core/modules_admin/languages/manage_languages.php' );/*noLibHook*/
$lang = new admin_core_languages_manage_languages( $this->registry );
$lang->makeRegistryShortcuts( $this->registry );
$start = time();
foreach( ipsRegistry::$applications as $app => $app_data )
{
$output[] = "Upgrading ADMIN languages...";
$_PATH = IPSLib::getAppDir( $app ) . '/xml/';
/* Loop through the xml directory and look for lang packs */
try
{
foreach( new DirectoryIterator( $_PATH ) as $f )
{
if( preg_match( "#(admin|public)_(.+?)_language_pack.xml#", $f->getFileName() ) )
{
//-----------------------------------------
// Import and cache
//-----------------------------------------
$output[] = "Importing " . $f->getFileName();
$this->request['file_location'] = $_PATH . $f->getFileName();
$lang->imprtFromXML( true, true, true, $app );
}
}
} catch ( Exception $e ) {}
}
$this->_print( implode( "\n", $output ) );
$this->_print( "\nAll languages imported and recached" );
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "\COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
print nl2br( preg_replace( "#\n{1,}#", "\n", $message ) );
}
}
exit();
?>
-303
View File
@@ -1,303 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-06-06 15:26:34 -0400 (Wed, 06 Jun 2012) $
* </pre>
*
* @author $Author: ips_terabyte $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10878 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'admin' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
elseif ( is_file( '../initdata.php' ) )
{
require_once( '../initdata.php' );/*noLibHook*/
}
else
{
require_once( 'initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Board Shell Get Stuff Ready For Release Tool\n--------------------------------------------\n" );
$this->_print( "What do you wish to do? [l=Rebuild and Export Lang, s=Rebuild and Export Skins, a=Both]\nEnter: " );
$option = $this->_fetchOption();
switch( $option )
{
case 'l':
$this->_doLang();
break;
case 's':
$this->_doSkins();
break;
case 'a':
$this->_doLang();
$this->_doSkins();
break;
default:
$this->_print( "\nIncorrect option" );
exit();
break;
}
}
/**
* Rebuild langs
*/
protected function _doSkins()
{
/* INIT */
$start = time();
$messages = array();
$errors = array();
/* Grab class */
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinFunctions.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinCaching.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinImportExport.php' );/*noLibHook*/
$this->skinFunctions = new skinImportExport( $this->registry );
/* This is which skins we want to export for default installations */
$skinIDs = array_values( $this->skinFunctions->remapData['export'] );
//-----------------------------------------
// Can do .. stuff?
//-----------------------------------------
if ( ! is_writable( IPS_ROOT_PATH . 'setup/xml/skins' ) )
{
$this->_print( 'Cannot write to /admin/setup/xml/skins' );
exit();
}
//-----------------------------------------
// Rebuild stuff
//-----------------------------------------
foreach( $skinIDs as $id )
{
$msg = $this->skinFunctions->rebuildMasterCSS( $id );
$messages[] = "<strong>CSS Rebuilt for $id</strong>";
$messages = array_merge( $messages, $msg, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
$msg = $this->skinFunctions->rebuildMasterFromPHP( $id );
$messages[] = "<strong>HTML Rebuilt for $id</strong>";
$messages = array_merge( $messages, $msg, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
$msg = $this->skinFunctions->rebuildMasterReplacements( $id );
$messages[] = "<strong>Replacements Rebuilt for $id</strong>";
$messages = array_merge( $messages, (array)$msg, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
}
/* Got any errors? */
if ( count( $errors ) )
{
$this->_print( 'ERROR: ' . implode( "\n *", $errors ) );
//exit();
}
$this->skinFunctions->rebuildTreeInformation();
$this->skinFunctions->rebuildSkinSetsCache();
//-----------------------------------------
// Rebuild skin caches
//-----------------------------------------
foreach( $skinIDs as $id )
{
$setData = $this->skinFunctions->fetchSkinData( $id );
$key = $setData['set_key'];
if ( $id > 0 )
{
$this->skinFunctions->rebuildPHPTemplates( $id );
$messages[] = "<strong>PHP Templates Recached for $key</strong>";
$messages = array_merge( $messages, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
$this->skinFunctions->rebuildCSS( $id );
$messages[] = "<strong>CSS Recached for $key</strong>";
$messages = array_merge( $messages, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
$this->skinFunctions->rebuildReplacementsCache( $id );
$messages[] = "<strong>Replacements Recached for $key</strong>";
$messages = array_merge( $messages, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
}
/* Build and write XML files for replacements and CSS */
$replacementsXML = $this->skinFunctions->generateReplacementsXML( $id, FALSE );
@unlink( IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $key . '.xml', $replacementsXML );
if ( $replacementsXML )
{
if ( ! @file_put_contents( IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $key . '.xml', $replacementsXML ) )
{
$errors[] = "Cannot write: " . IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $key . '.xml';
}
else
{
$messages[] = "Written: " . IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $key . '.xml';
}
}
/* Export all CSS - Function loops through all skin sets */
$this->skinFunctions->exportAllAppCSS( $id );
$messages[] = "<strong>App CSS Written For $key</strong>";
$messages = array_merge( $messages, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
/* Export all CSS - Function loops through all skin sets */
$this->skinFunctions->exportAllAppTemplates( $id );
$messages[] = "<strong>App XML Written For $key</strong>";
$messages = array_merge( $messages, $this->skinFunctions->fetchMessages( TRUE ) );
$errors = array_merge( $errors , $this->skinFunctions->fetchErrorMessages( TRUE ) );
/* Got any errors? */
if ( count( $errors ) )
{
$this->_print( 'ERROR: ' . implode( "\n *", $errors ) );
//exit();
}
}
/* Generate skin sets XML */
$skinSetXML = $this->skinFunctions->generateMasterSkinSetXML( $skinIDs );
@unlink( IPS_ROOT_PATH . 'setup/xml/skins/setsData.xml' );
if ( ! @file_put_contents( IPS_ROOT_PATH . 'setup/xml/skins/setsData.xml', $skinSetXML ) )
{
$errors[] = "Cannot write:: " . IPS_ROOT_PATH . 'setup/xml/skins/setsData.xml';
}
else
{
$messages[] = "Written: " . IPS_ROOT_PATH . 'setup/xml/skins/setsData.xml';
}
$this->_print( implode( "\n", $messages ) );
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Rebuild langs
*/
protected function _doLang()
{
/* Grab class */
require_once( IPS_ROOT_PATH . 'applications/core/modules_admin/languages/manage_languages.php' );/*noLibHook*/
$lang = new admin_core_languages_manage_languages( $this->registry );
$lang->makeRegistryShortcuts( $this->registry );
$start = time();
foreach( ipsRegistry::$applications as $app => $app_data )
{
$this->_print("\nStarting App: " . $app_data['app_title'] );
$_start = time();
/* Stuff the post array */
$_POST['apps'] = array( $app => $app );
$msgs = $lang->importFromCacheFiles( FALSE );
$_end = time();
$_tkn = ( $_end - $_start) / 60;
$this->_print( "\nDone. Took " . $_tkn . "m\n" . implode( "\n", $msgs ) );
}
$this->_print( "\nAll languages imported" );
foreach( ipsRegistry::$applications as $app_dir => $app_data )
{
$this->_print("\nExporting XML for App: " . $app_data['app_title'] );
$this->request['app_dir'] = $app_dir;
$this->request['type'] = 'admin';
$lang->languageExportToXML( 1, 1 );
$this->request['type'] = 'public';
$lang->languageExportToXML( 1, 1 );
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "\nCOMPLETE. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-285
View File
@@ -1,285 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Rebuilds stuff from XML
* Last Updated: $Date: 2012-06-06 15:26:34 -0400 (Wed, 06 Jun 2012) $
* </pre>
*
* @author $Author: ips_terabyte $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10878 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'admin' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
elseif ( is_file( '../initdata.php' ) )
{
require_once( '../initdata.php' );/*noLibHook*/
}
else
{
require_once( 'initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
/* Ensure it's CLI */
$cli = php_sapi_name() === 'cli';
if ( ! $cli )
{
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\">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();
}
print "\n ";
print "\n (_) _ __ ____ ";
print "\n | || '_ \ / ___' ";
print "\n | || |_) | \__. ";
print "\n | || .__/.\___ \ ";
print "\n |_||_| |_______/ \n\n";
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IN_DEV build tool" );
$this->_print( "This tool will create the required directories and files to run in IN_DEV\n--------------------------------------------\n" );
/* Is IN_DEV on? */
if ( ! IN_DEV )
{
$this->_print( "IN_DEV is not on. Please edit 'conf_global.php' and add: define( 'IN_DEV', 1 );" );
exit();
}
/* Can we write into require folders? */
$req = array( 'cache', 'cache/skin_cache', 'cache/lang_cache', 'cache/lang_cache/1', PUBLIC_DIRECTORY . '/style_css' );/*noLibHook*/
$stop = false;
foreach( $req as $r )
{
if ( ! is_dir( DOC_IPS_ROOT_PATH . $r ) )
{
$this->_print( "Cannot locate: $r - please CHMOD appropriately and re-run" );
$stop = true;
}
if ( ! is_writable( DOC_IPS_ROOT_PATH . $r ) )
{
$this->_print( "Cannot write to: $r - please CHMOD appropriately and re-run" );
$stop = true;
}
}
if ( $stop )
{
exit();
}
$this->_print( "Hit Any Key To Continue: " );
$option = $this->_fetchOption();
/* Export all skins required */
$this->_doSkins();
/* Export all language bits */
$this->_doLang();
}
/**
* Rebuild skins
*/
protected function _doSkins()
{
/* INIT */
$start = time();
$output = array();
$errors = array();
/* Grab class */
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinFunctions.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinCaching.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinImportExport.php' );/*noLibHook*/
$skinFunctions = new skinImportExport( $this->registry );
/* Fetch master dirs */
$master = $skinFunctions->fetchMasterKeys();
if ( ! count( $master ) )
{
$this->_print( "Could not locate any master skin keys" );
exit();
}
/* PHP */
foreach( $master as $m )
{
$path = ( $m == 'root' ) ? IPS_CACHE_PATH . 'cache/skin_cache/master_skin' : IPS_CACHE_PATH . 'cache/skin_cache/master_skin_' . $m;
$path = ( $m == 'xmlskin' ) ? IPS_CACHE_PATH . 'cache/skin_cache/master_skin_xml' : $path;
if ( is_dir( $path ) )
{
$this->_print( "$path already exists..." );
continue;
}
if ( ! mkdir( $path, IPS_FOLDER_PERMISSION ) )
{
$this->_print( "Could not create $path" );
exit();
}
else
{
@chmod( $path, IPS_FOLDER_PERMISSION );
$this->_print( "$path created..." );
}
}
/* CSS */
foreach( $master as $m )
{
$path = ( $m == 'root' ) ? DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_css/master_css' : DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_css/master_css_' . $m;
$path = ( $m == 'xmlskin' ) ? DOC_IPS_ROOT_PATH . PUBLIC_DIRECTORY . '/style_css/master_css_xml' : $path;
if ( is_dir( $path ) )
{
$this->_print( "$path already exists..." );
continue;
}
if ( ! mkdir( $path, IPS_FOLDER_PERMISSION ) )
{
$this->_print( "Could not create $path" );
exit();
}
else
{
@chmod( $path, IPS_FOLDER_PERMISSION );
$this->_print( "$path created..." );
}
}
/* Now create master dirs for PHP */
foreach( $master as $m )
{
$dir = ( $m == 'root' ) ? 'master_skin' : 'master_skin_' . $m;
$dir = ( $m == 'xmlskin' ) ? 'master_skin_xml' : $dir;
$skinFunctions->writeMasterSkin( $m, $dir );
$this->_print( "PHP templates written for $m" );
}
/* Now create master dirs for CSS */
foreach( $master as $m )
{
$dir = ( $m == 'root' ) ? 'master_css' :'master_css_' . $m;
$dir = ( $m == 'xmlskin' ) ? 'master_css_xml' : $dir;
$skinFunctions->writeMasterSkinCss( $m, $dir );
$this->_print( "CSS written for $m" );
}
/* Now create master dirs for replacements */
foreach( $master as $m )
{
$dir = ( $m == 'root' ) ? 'master_skin' : 'master_skin_' . $m;
$dir = ( $m == 'xmlskin' ) ? 'master_skin_xml' : $dir;
$skinFunctions->writeMasterSkinReplacements( $m, $dir );
$this->_print( "Replacements written for $m" );
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Rebuild langs
*/
protected function _doLang()
{
/* INIT */
$start = time();
/* Grab class */
require_once( IPS_ROOT_PATH . 'applications/core/modules_admin/languages/manage_languages.php' );/*noLibHook*/
$lang = new admin_core_languages_manage_languages( $this->registry );
$lang->makeRegistryShortcuts( $this->registry );
$lang->cacheToDisk( 'master' );
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "Master languages written" );
$this->_print( "COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-283
View File
@@ -1,283 +0,0 @@
<?php
define( 'IPB_VERSION', '3.4' );
?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="en" lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>IP.Board <?php print IPB_VERSION; ?> - Requirements Checker</title>
<style type='text/css'>
.pass {
color: green;
font-weight: bold;
}
.fail {
color: red;
font-weight: bold;
}
.warn {
color: orange;
font-weight: bold;
}
.what-you-should-do {
color: grey;
font-size: 12px;
font-style: italic;
padding-left: 15px;
}
h1 {
border-bottom: 1px solid black;
}
p {
margin: 2px;
padding: 4px;
border-bottom: 1px dotted grey;
font-size: 15px;
font-family: "Arial, Verdana";
}
p.final {
border-bottom: 0px;
padding-top: 20px;
}
</style>
</head>
<body>
<h1>IP.Board <?php print IPB_VERSION; ?> Requirements Checker</h1>
<?php
$extensions = get_loaded_extensions();
$version = phpversion();
$minVersion = '5.2.0';
//-----------------------------------------
// Checking against required version
//-----------------------------------------
$checkRequiredVersion = version_compare( $minVersion, $version, '<=' );
flushOutput( "Checking minimum version ({$minVersion})...", $checkRequiredVersion, "You must be running PHP v{$minVersion} or greater to use IP.Board " . IPB_VERSION . ". You are currently running version {$version}. Please ask your host to move you to a server running PHP v{$minVersion} or greater." );
print "<p>You are running PHP <strong>{$version}</strong></p>";
//-----------------------------------------
// Check for zend guard
//-----------------------------------------
$hasZend = false;
$hasIoncube = false;
if ( function_exists( 'zend_loader_enabled' ) )
{
if ( @zend_loader_enabled() === true )
{
$hasZend = true;
}
}
if ( extension_loaded( 'ionCube Loader' ) )
{
$hasIoncube = true;
}
flushOutput( "IP.Nexus Only: Checking for ability to load Zend Guard encoded files...", $hasZend, "Not able to run the Zend encoded files for IP.Nexus." );
flushOutput( "IP.Nexus Only: Checking for ability to load Ioncube encoded files...", $hasIoncube, "Not able to run the Ioncube encoded files for IP.Nexus." );
flushOutput( "IP.Nexus Only: Can run IP.Nexus...", $hasZend or $hasIoncube, "Not able to run either Ioncube or Zend Encoded IP.Nexus files. You can still use IP.Board, IP.Downloads. IP.Blog, IP.Gallery, IP.Content, IP.Chat" );
//-----------------------------------------
// Memory limit
//-----------------------------------------
$_memLimit = null;
$_recLimit = 128;
if( @ini_get('memory_limit') )
{
$_memLimit = @ini_get('memory_limit');
}
if( $_memLimit )
{
$_intLimit = $_memLimit;
$_intRec = $_recLimit * 1024 * 1024;
preg_match( "#^(\d+)(\w+)$#", strtolower($_intLimit), $match );
if( $match[2] == 'g' )
{
$_intLimit = intval( $_intLimit ) * 1024 * 1024 * 1024;
}
else if ( $match[2] == 'm' )
{
$_intLimit = intval( $_intLimit ) * 1024 * 1024;
}
else if ( $match[2] == 'k' )
{
$_intLimit = intval( $_intLimit ) * 1024;
}
else
{
$_intLimit = intval( $_intLimit );
}
if( $_intLimit >= $_intRec )
{
flushOutput( "Checking memory limit ({$_recLimit}M or better recommended)...", true, "Your memory limit: {$_memLimit}" );
}
else
{
flushOutput( "Checking memory limit ({$_recLimit}M or better recommended)...", 2, "Your memory limit: {$_memLimit}. You can still proceed but we recommend you contact your host and request the memory limit be raised to {$_recLimit}M to prevent possible issues." );
}
}
else
{
flushOutput( "Checking memory limit ({$_recLimit}M or better recommended)...", 2, "Could not determine your memory limit" );
}
//-----------------------------------------
// Checking for SPL
//-----------------------------------------
$splExists = in_array( 'SPL', $extensions );
flushOutput( "Checking for SPL...", $splExists, "The PHP SPL extension is required for IP.Board " . IPB_VERSION . ". Please ask your host to install the <a href='http://www.php.net/manual/en/spl.setup.php'>SPL library</a>." );
//-----------------------------------------
// Checking for DOM XML
//-----------------------------------------
$domXML = in_array( 'dom', $extensions );
flushOutput( "Checking for DOM XML Handling...", $domXML, "The DOM XML Handling extension is required for IP.Board " . IPB_VERSION . ". Please ask your host to install the <a href='http://www.php.net/manual/en/dom.setup.php'>libxml2 library</a>." );
//-----------------------------------------
// Check for GD2
//-----------------------------------------
$gd2 = in_array( 'gd', $extensions );
flushOutput( "Checking for GD library...", $gd2, "The GD2 library is required for IP.Board " . IPB_VERSION . ". Please ask your host to install the <a href='http://us.php.net/manual/en/image.setup.php'>libgd library</a>." );
if( function_exists( 'gd_info' ) )
{
$gdInfo = gd_info();
$fail = true;
if( $gdInfo["GD Version"] )
{
preg_match( "/.*?([\d\.]+).*?/", $gdInfo["GD Version"], $matches );
if( $matches[1] )
{
$compareVersions = version_compare( '2.0', $matches[1], '<=' );
if( !$compareVersions )
{
$fail = 2;
}
}
}
flushOutput( "Checking for GD2...", $fail, "While the GD library is installed, GD library version 2 is required for IP.Board " . IPB_VERSION . ". The version reported (if at all) by your server is '{$gdInfo['GD Version']}'. Please verify you are running GD version 2, and upgrade the <a href='http://us.php.net/manual/en/image.setup.php'>libgd library</a> if necessary." );
}
//-----------------------------------------
// Checking for mysql extension
//-----------------------------------------
$mysql = in_array( 'mysql', $extensions );
$mysqli = in_array( 'mysqli', $extensions );
flushOutput( "Checking for mysql support...", ( $mysql OR $mysqli ), "Your server does not appear to have a mysql library available, please ask your host to install the <a href='http://us.php.net/manual/en/mysqli.setup.php'>mysqli extension</a>." );
if( $mysql AND !$mysqli )
{
flushOutput( "Checking for mysqli support...", false, "The mysqli extension is preferred over the original mysql extension. This is not a requirement, but if possible we recommend you to install the <a href='http://us.php.net/manual/en/mysqli.setup.php'>mysqli extension</a> for better performance." );
}
//-----------------------------------------
// Checking for JSON
//-----------------------------------------
$json = in_array( 'json', $extensions );
flushOutput( "Checking for JSON...", $json, "While not required, the PHP JSON extension is recommended. The JSON extensions provides for improved efficiency in handling some functionality in IP.Board. If possible, we recommend you to install the <a href='http://us.php.net/manual/en/json.setup.php'>json extension</a>." );
//-----------------------------------------
// Checking for openSSL
//-----------------------------------------
$openssl = in_array( 'openssl', $extensions ) ? true : 2;
flushOutput( "Checking for openSSL...", $openssl, "OpenSSL is required for some Facebook, Twitter, and Subscription Manager functionality. If you do not use any of these modules, you do not need this module, otherwise we recommend you to install the <a href='http://us2.php.net/manual/en/openssl.installation.php'>openssl extension</a>." );
//-----------------------------------------
// Suhosin
//-----------------------------------------
if( extension_loaded( 'suhosin' ) )
{
$_postMaxVars = @ini_get('suhosin.post.max_vars');
$_reqMaxVars = @ini_get('suhosin.request.max_vars');
$_getMaxLen = @ini_get('suhosin.get.max_value_length');
$_postMaxLen = @ini_get('suhosin.post.max_value_length');
$_reqMaxLen = @ini_get('suhosin.request.max_value_length');
$_reqMaxVar = @ini_get('suhosin.request.max_varname_length');
$_indPMV = $_postMaxVars < 4096 ? 2 : true;
$_indRMV = $_reqMaxVars < 4096 ? 2 : true;
$_indGML = $_getMaxLen < 2000 ? 2 : true;
$_indPML = $_postMaxLen < 1000000 ? 2 : true;
$_indRML = $_reqMaxLen < 1000000 ? 2 : true;
$_indRMVL = $_reqMaxVar < 350 ? 2 : true;
flushOutput( "suhosin.post.max_vars (4096 or better recommended)...", $_indPMV, "Your value: {$_postMaxVars}. Can prevent some forms (especially in the ACP) from saving properly." );
flushOutput( "suhosin.request.max_vars (4096 or better recommended)...", $_indRMV, "Your value: {$_reqMaxVars}. Can prevent some forms (especially in the ACP) from saving properly." );
flushOutput( "suhosin.get.max_value_length (2000 or better recommended)...", $_indGML, "Your value: {$_postMaxLen}. Can prevent very long URLs from loading correctly." );
flushOutput( "suhosin.post.max_value_length (1000000 or better recommended)...", $_indPML, "Your value: {$_postMaxLen}. Can prevent very large posts or other form submissions from saving properly." );
flushOutput( "suhosin.request.max_value_length (1000000 or better recommended)...", $_indRML, "Your value: {$_reqMaxLen}. Can prevent very large posts or other form submissions from saving properly." );
flushOutput( "suhosin.request.max_varname_length (350 or better recommended)...", $_indRMVL, "Your value: {$_reqMaxVar}. Can prevent long friendly URLs from loading correctly." );
}
//-----------------------------------------
// Flush output function
//-----------------------------------------
function flushOutput( $checking, $result, $errorText )
{
print "<p>" . $checking;
if( $result === 2 )
{
print "<span class='warn'>WARNING</span><br /><span class='what-you-should-do'>{$errorText}</span>";
}
else if( !$result )
{
print "<span class='fail'>FAIL</span><br /><span class='what-you-should-do'>{$errorText}</span>";
}
else
{
print "<span class='pass'>Pass</span>";
}
print "</p>";
flush();
ob_flush();
return true;
}
?>
<p class='final'>Please also remember that MySQL 4.1 or higher (MySQL 5.0 or higher preferred) is required for IP.Board <?php print IPB_VERSION; ?>. Ask your server administrator to check the version of MySQL on your server if you are unsure.</p>
</body>
</html>
-200
View File
@@ -1,200 +0,0 @@
<?php
/*
+---------------------------------------------------------------------------
| IP.Board v3.4.6
| ========================================
| by Matthew Mecham
| (c) 2008 Invision Power Services
| http://www.invisionpower.com
| ========================================
+---------------------------------------------------------------------------
| Invision Power Board IS NOT FREE SOFTWARE!
+---------------------------------------------------------------------------
| http://www.invisionpower.com/
| > $Id: galleryRebuild4_php.php 10039 2011-12-20 19:49:28Z mmecham $
| > $Revision: 10039 $
| > $Date: 2011-12-20 14:49:28 -0500 (Tue, 20 Dec 2011) $
+---------------------------------------------------------------------------
*/
@set_time_limit( 3600 );
/**
* Main public executable wrapper.
*
* Set-up and load module to run
*
* @package IP.Board
* @author Matt Mecham
* @version 3.0
*/
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
private $processed = 0;
private $parser;
private $oldparser;
private $start = 0;
private $end = 0;
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->memberData = array();
switch( $this->request['do'] )
{
case 'save':
$this->save();
break;
default:
$this->splash();
break;
}
}
function show( $content, $url='' )
{
if ( $url )
{
$firstBit = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$refresh = "<meta http-equiv='refresh' content='0; url={$firstBit}?{$url}'>";
}
if ( is_array( $content ) )
{
$content = implode( "<br />", $content );
}
$html = <<<EOF
<html>
<head>
<title>Group Edit BitWise</title>
$refresh
</head>
<body>
$content
</body>
</html>
EOF;
print $html; exit();
}
/**
* SPLASH
*/
function splash()
{
/* Unpack bitwise fields */
$_tmp = IPSBWOptions::thaw( 0, 'groups', 'global' );
$groups = $this->caches['group_cache'];
foreach( $_tmp as $k => $v )
{
$radio .= "<tr>
<td><strong>{$k}</strong></td>
<td><input type='radio' name='bitwise[$k]' value='leave' checked='checked' /> <em>Leave as per group</em></td>
<td><input type='radio' name='bitwise[$k]' value='1' /> <span style='color:green'>ON</span></td>
<td><input type='radio' name='bitwise[$k]' value='0' /> <span style='color:red'>OFF</span></td>
</tr>";
}
foreach( $groups as $id => $data )
{
$groupHTML .= "<div><input type='checkbox' name='groups[$id]' value='1' /> " . $data['g_title'] . "</div>\n";
}
$html = <<<EOF
<form action="?do=save" method="POST">
Bitwise Values
<table>{$radio}</table>
<br />
Apply to groups:
{$groupHTML}
<br />
<input type="submit" value="Save" />
</form>
EOF;
$this->show( $html );
}
/**
* Convert images
*/
function save()
{
$gids = $_POST['groups'];
$bitwise = $_POST['bitwise'];
$groups = $this->caches['group_cache'];
foreach( $gids as $id => $val )
{
$thisGroup = $groups[ $id ];
foreach( $bitwise as $k => $v )
{
if ( $v != 'leave' )
{
$thisGroup[ $k ] = intval( $v );
}
}
$g_bitoptions = IPSBWOPtions::freeze( $thisGroup, 'groups', 'global' );
$this->DB->update( 'groups', array( 'g_bitoptions' => $g_bitoptions ), 'g_id=' . $id );
}
$this->rebuildGroupCache();
$this->show('Done');
}
/**
* Rebuilds the group cache
*
* @return @e void
*/
public function rebuildGroupCache()
{
$cache = array();
$this->DB->build( array( 'select' => '*',
'from' => 'groups',
'order' => 'g_title ASC' ) );
$this->DB->execute();
while ( $i = $this->DB->fetch() )
{
$cache[ $i['g_id'] ] = IPSMember::unpackGroup( $i );
}
$this->cache->setCache( 'group_cache', $cache, array( 'array' => 1 ) );
}
}
?>
-56
View File
@@ -1,56 +0,0 @@
===============================================================
Ñêà÷àíî ñ ñàéòà www.Skripter.info
===============================================================
Ó íàñ íà ñàéòå Âû íàéäåòå:
Datalife Engine
Wordpress
Joomla
phpBB
IPB
vBulletin
Èãðîâûå CMS .....è ò.ä.
Âñå îò ìîäóëåé è øàáëîíîâ äî óðîêîâ ïî èíòåðåñóþùèì âàñ âîïðîñàì.
----------------------------------------------------------------
Äîáðî ïîæàëîâàòü íà íàø ñàéò !!!
----------------------------------------------------------------
Àäìèíèñòðàöèÿ ñàéòà Skripter.info
==============================================
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
===============================================================
Download from www.Skripter.info
===============================================================
At our site you will find:
Datalife Engine
Wordpress
Joomla
phpBB
IPB
vBulletin
Gaming CMS ..... etc.
All of the modules and templates to lessons on your questions.
----------------------------------------------------------------
Welcome to our site!
----------------------------------------------------------------
The website administration Skripter.info
==============================================
-268
View File
@@ -1,268 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Rebuilds stuff from XML
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'admin' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Board Shell Rebuild Stuff From XML Tool\n--------------------------------------------\n" );
$this->_print( "What do you wish to do? [l=Rebuild Lang, s=Rebuild Skins, b=Both]\nEnter: " );
$option = $this->_fetchOption();
switch( $option )
{
case 'l':
$this->_doLang();
break;
case 's':
$this->_doSkins();
break;
case 'b':
$this->_doLang();
$this->_doSkins();
break;
default:
$this->_print( "\nIncorrect option" );
exit();
break;
}
}
/**
* Rebuild langs
*/
protected function _doSkins()
{
/* INIT */
$start = time();
$output = array();
$errors = array();
/* Grab class */
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinFunctions.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinCaching.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/classes/skins/skinImportExport.php' );/*noLibHook*/
$skinFunctions = new skinImportExport( $this->registry );
/* Grab skin data */
$this->DB->build( array( 'select' => '*',
'from' => 'skin_collections' ) );
$this->DB->execute();
while( $row = $this->DB->fetch() )
{
/* Bit of jiggery pokery... */
if ( $row['set_key'] == 'default' )
{
$row['set_key'] = 'root';
$row['set_id'] = 0;
}
$skinSets[ $row['set_key'] ] = $row;
}
/* Templates */
foreach( ipsRegistry::$applications as $appDir => $appData )
{
foreach( $skinSets as $skinKey => $skinData )
{
$_PATH = IPSLib::getAppDir( $appDir ) . '/xml/';
$output[] = "Upgrading {$skinData['set_name']} for $appDir templates...";
if ( is_file( $_PATH . $appDir . '_' . $skinKey . '_templates.xml' ) )
{
//-----------------------------------------
// Install
//-----------------------------------------
$return = $skinFunctions->importTemplateAppXML( $appDir, $skinKey, $skinData['set_id'], TRUE );
$output[] = intval( $return['insertCount'] ) . " added, " . intval( $return['updateCount'] ) . " templates updated";
}
if ( is_file( $_PATH . $appDir . '_' . $skinKey . '_css.xml' ) )
{
//-----------------------------------------
// Install
//-----------------------------------------
$return = $skinFunctions->importCSSAppXML( $appDir, $skinKey, $skinData['set_id'] );
$output[] = intval( $return['insertCount'] ) . " {$skinData['set_name']} CSS files inserted";
}
}
}
/* Replacements */
foreach( $skinSets as $skinKey => $skinData )
{
if ( is_file( IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $skinKey . '.xml' ) )
{
$skinFunctions->importReplacementsXMLArchive( file_get_contents( IPS_ROOT_PATH . 'setup/xml/skins/replacements_' . $skinKey . '.xml' ), $skinKey );
$output[] = $skinKey . " replacements rebuilt";
}
}
/* reset ID */
$skinSets['root']['set_id'] = 1;
/* Recache */
foreach( $skinSets as $skinKey => $skinData )
{
$skinFunctions->rebuildPHPTemplates( $skinData['set_id'] );
if ( $skinFunctions->fetchErrorMessages() !== FALSE )
{
$output[] = implode( "<br />", $skinFunctions->fetchErrorMessages() );
}
$skinFunctions->rebuildCSS( $skinData['set_id'] );
if ( $skinFunctions->fetchErrorMessages() !== FALSE )
{
$output[] = implode( "<br />", $skinFunctions->fetchErrorMessages() );
}
$skinFunctions->rebuildReplacementsCache( $skinData['set_id'] );
if ( $skinFunctions->fetchErrorMessages() !== FALSE )
{
$output[] = implode( "<br />", $skinFunctions->fetchErrorMessages() );
}
$output[] = $skinKey . " recached";
}
/* recache other */
$skinFunctions->rebuildSkinSetsCache();
$this->_print( implode( "\n", $output ) );
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Rebuild langs
*/
protected function _doLang()
{
/* Grab class */
require_once( IPS_ROOT_PATH . 'applications/core/modules_admin/languages/manage_languages.php' );/*noLibHook*/
$lang = new admin_core_languages_manage_languages( $this->registry );
$lang->makeRegistryShortcuts( $this->registry );
$start = time();
foreach( ipsRegistry::$applications as $app => $app_data )
{
$output[] = "Upgrading ADMIN languages...";
$_PATH = IPSLib::getAppDir( $app ) . '/xml/';
/* Loop through the xml directory and look for lang packs */
try
{
foreach( new DirectoryIterator( $_PATH ) as $f )
{
if( preg_match( "#(admin|public)_(.+?)_language_pack.xml#", $f->getFileName() ) )
{
//-----------------------------------------
// Import and cache
//-----------------------------------------
$output[] = "Importing " . $f->getFileName();
$this->request['file_location'] = $_PATH . $f->getFileName();
$lang->imprtFromXML( true, true, true, $app );
}
}
} catch ( Exception $e ) {}
}
$this->_print( implode( "\n", $output ) );
$this->_print( "\nAll languages imported and recached" );
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "\COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-266
View File
@@ -1,266 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'admin' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
/* Ensure it's CLI */
$cli = php_sapi_name() === 'cli';
if ( ! $cli )
{
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\">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();
}
print "\n ";
print "\n (_) _ __ ____ ";
print "\n | || '_ \ / ___' ";
print "\n | || |_) | \__. ";
print "\n | || .__/.\___ \ ";
print "\n |_||_| |_______/ \n\n";
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
/* Gallery Object */
require_once( IPSLib::getAppDir('gallery') . '/sources/classes/gallery.php' );/*noLibHook*/
$registry->setClass( 'gallery', new ipsGallery( $registry ) );
$this->albums = $this->registry->gallery->helper('albums');
$this->images = $this->registry->gallery->helper('image');
$this->moderate = $this->registry->gallery->helper('moderate');
/* Load up gallery boyo */
$this->_print( "--------------------------------------------\nWelcome to the IP.Gallery Rebuild Tool\n--------------------------------------------\n" );
$this->_print( "[0] Rebuild All Albums Node Data (Node level, left and right indexes)" );
$this->_print( "[1] Rebuild Album Data (Cover image, comment counts, etc)" );
$this->_print( "[2] Rebuild Album Permissions (Ensures inherited permissions are OK)" );
$this->_print( "[3] Rebuild Image File Data (Thumbnail images, etc)" );
$this->_print( "[4] Rebuild Image SEO Data" );
$this->_print( "Enter Choice: ", "" );
$option = $this->_fetchOption();
if ( stristr( $option, 'look' ) )
{
$this->_print("\nYou see a forest full of shadows. In the distance smoke rises from a small building. There is a troll here." );
exit;
}
switch( $option )
{
case 0:
$this->_albumNodes();
break;
case 1:
$this->_albumData();
break;
case 2:
$this->_albumPermissions();
break;
case 3:
$this->_images();
break;
case 4:
$this->_seoImages();
break;
case 99:
$this->_print("\n100!");
break;
default:
$this->_print("\nThat wasn't a real option and I strongly believe you knew that");
break;
}
}
/**
* Rebuild All Nodes
*/
protected function _albumNodes()
{
$this->albums->rebuildNodeTree();
$this->_print("Node Tree rebuilt");
exit();
}
/**
* Rebuild All Permissions
*/
protected function _albumPermissions()
{
$this->moderate->resetPermissions(0);
$this->_print("Permissions rebuilt");
exit();
}
/**
* Rebuild All Album Data
*/
protected function _albumData()
{
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'gallery_albums_main',
'where' => '1=1' ) );
$o = $this->DB->execute();
while( $row = $this->DB->fetch( $o ) )
{
$done++;
$this->albums->resync( $row );
}
$this->_print("Album Data rebuilt");
exit();
}
/**
* Rebuild Images
*/
protected function _images()
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'gallery_images',
'order' => 'id ASC' ) );
$o = $this->DB->execute();
while( $row = $this->DB->fetch( $o ) )
{
$done++;
$this->images->resync( $row );
$this->images->buildSizedCopies( $row );
if ( $done % 50 == 0 )
{
$this->_print( "Completed... " . $done . " (IMG ID=" . $row['id'] . " total=" . ( $done ) . ")" );
}
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "Finished Images. Took " . $tkn . "m\n" );
}
/**
* Rebuild Images
*/
protected function _seoImages()
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'gallery_images',
'order' => 'id ASC' ) );
$o = $this->DB->execute();
while( $row = $this->DB->fetch( $o ) )
{
$done++;
$this->DB->update( 'gallery_images', array( 'caption_seo' => IPSText::makeSeoTitle( $row['caption'] ) ), 'id=' . $row['id'] );
if ( $done % 50 == 0 )
{
$this->_print( "Completed... " . $done . " (IMG ID=" . $row['id'] . " total=" . ( $done ) . ")" );
}
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "Finished Images. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
-122
View File
@@ -1,122 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'public' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Gallery Images SEO Fixer\n--------------------------------------------\n" );
$this->_print( "Start from row?\nEnter: " );
$start = intval( $this->_fetchOption() );
$this->_print( "Do X rows\nEnter: " );
$end = intval( $this->_fetchOption() );
$this->_doImages( $start, $end );
}
/**
* Rebuild Images
*/
protected function _doImages( $_start, $end )
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'gallery_images',
'order' => 'id ASC',
'limit' => array( $_start, $end ) ) );
$t = $this->DB->execute();
while( $row = $this->DB->fetch( $t ) )
{
$this->DB->update( 'gallery_images', array( 'caption_seo' => IPSText::makeSeoTitle( $row['caption'] ) ), 'id=' . $row['id'] );
$done++;
if ( $done % 250 == 0 )
{
$this->_print( "Completed... " . $done . " (IMG ID=" . $row['file_id'] . " total=" . ( $_start + $done ) . ")" );
}
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "FINISHED Images. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
-326
View File
@@ -1,326 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'public' );
define( 'IPS_CLI_MEMORY_DEBUG', false );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
protected $processed = 0;
protected $start = 0;
protected $end = 0;
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->memberData = array();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Board PM Re-Builder\n--------------------------------------------\n" );
$this->_print( "Start at row (Enter 0 to start from the very first entry)\nEnter: " );
$this->start = intval( $this->_fetchOption() );
$this->_print( "Process X rows (Enter 0 to process all rows)\nEnter: " );
$this->end = intval( $this->_fetchOption() );
if ( $this->start == 0 )
{
$this->_print( "No starting ID? Do you want to remove all current PMs to start again? (y/n): " );
$delete = $this->_fetchOption();
if ( $delete == 'y' )
{
/* Ditch current data */
$this->DB->delete( 'message_posts' );
$this->DB->delete( 'message_topics' );
$this->DB->delete( 'message_topic_user_map' );
}
}
while( ( $result = $this->_process() ) !== FALSE )
{
$this->_print( $result );
}
/* We're done.. */
$this->_print( "COMPLETE" );
}
/**
* Actually process it
*/
protected function _process()
{
if ( ! $this->end OR ( $this->end > $this->processed ) )
{
/* More to do... */
$batch = 250;
$_s = $this->processed + $this->start;
$_e = ( $this->end AND $this->end < $batch ) ? $this->end : $batch;
$this->processed = $_s + $batch;
$this->start = 0;
$converted = 0;
$seen = 0;
/* Select max topic ID thus far */
$_tmp = $this->DB->buildAndFetch( array( 'select' => 'MAX(mt_id) as max',
'from' => 'message_topics' ) );
$topicID = intval( $_tmp['max'] );
$this->DB->build( array( 'select' => '*',
'from' => 'message_text',
'order' => 'msg_id ASC',
'limit' => array( $_s, $_e ) ) );
$o = $this->DB->execute();
while( $post = $this->DB->fetch( $o ) )
{
$seen++;
/* Make sure all data is valid */
if ( intval( $post['msg_sent_to_count'] ) < 1 )
{
continue;
}
/* a little set up */
$oldTopics = array();
/* Now fetch all topics */
$this->DB->build( array( 'select' => '*',
'from' => 'message_topics_old',
'where' => 'mt_msg_id=' . intval( $post['msg_id'] ) ) );
$t = $this->DB->execute();
while( $topic = $this->DB->fetch( $t ) )
{
/* Got any data? */
if ( ! $topic['mt_from_id'] OR ! $topic['mt_to_id'] )
{
continue;
}
$oldTopics[ $topic['mt_id'] ] = $topic; # Luke added that space. That's his first contribution to the code vaults at IPS.
}
/* Attempt to free memory */
$this->DB->freeResult( $t );
/* Fail safe */
if ( ! count( $oldTopics ) )
{
continue;
}
/* Increment number */
$topicID++;
/* Add in the post */
$this->DB->insert( 'message_posts', array( 'msg_topic_id' => $topicID,
'msg_date' => $post['msg_date'],
'msg_post' => $post['msg_post'],
'msg_post_key' => $post['msg_post_key'],
'msg_author_id' => $post['msg_author_id'],
'msg_ip_address' => $post['msg_ip_address'],
'msg_is_first_post' => 1 ) );
$postID = $this->DB->getInsertId();
/* Update attachments */
$this->DB->update( 'attachments', array( 'attach_rel_id' => $postID ), "attach_rel_module='msg' AND attach_rel_id=".$post['msg_id'] );
/* Define some stuff. "To" member is added last in IPB 2 */
$_tmp = $oldTopics;
ksort( $_tmp );
$topicData = array_pop( $_tmp );
$_invited = array();
$_seenOwner = array();
$_isDeleted = 0;
/* Add the member rows */
foreach( $oldTopics as $mt_id => $data )
{
/* Prevent SQL error with unique index: Seen the owner ID already? */
if ( $_seenOwner[ $data['mt_owner_id'] ] )
{
continue;
}
$_seenOwner[ $data['mt_owner_id'] ] = $data['mt_owner_id'];
/* Build invited - does not include 'to' person */
if ( $data['mt_owner_id'] AND ( $post['msg_author_id'] != $data['mt_owner_id'] ) AND ( $topicData['mt_to_id'] != $data['mt_owner_id'] ) )
{
$_invited[ $data['mt_owner_id'] ] = $data['mt_owner_id'];/*noLibHook*/
}
$_isSent = ( $data['mt_vid_folder'] == 'sent' ) ? 1 : 0;
$_isDraft = ( $data['mt_vid_folder'] == 'unsent' ) ? 1 : 0;
$this->DB->insert( 'message_topic_user_map', array( 'map_user_id' => $data['mt_owner_id'],
'map_topic_id' => $topicID,
'map_folder_id' => ( $_isDraft ) ? 'drafts' : 'myconvo',
'map_read_time' => ( $data['mt_user_read'] ) ? $data['mt_user_read'] : ( $data['mt_read'] ? time() : 0 ),
'map_user_active' => 1,
'map_user_banned' => 0,
'map_has_unread' => 0,//( $data['mt_read'] ) ? 0 : 1,
'map_is_system' => 0,
'map_last_topic_reply' => $post['msg_date'],
'map_is_starter' => ( $data['mt_owner_id'] == $post['msg_author_id'] ) ? 1 : 0 ) );
}
/* Now, did we see the author? If not, add them too but as inactive */
if ( ! $_seenOwner[ $post['msg_author_id'] ] )
{
$_isDeleted = 1;
/*$this->DB->insert( 'message_topic_user_map', array( 'map_user_id' => $post['msg_author_id'],
'map_topic_id' => $topicID,
'map_folder_id' => 'myconvo',
'map_read_time' => 0,
'map_user_active' => 0,
'map_user_banned' => 0,
'map_has_unread' => 0,
'map_is_system' => 0,
'map_is_starter' => 1 ) );*/
}
$_isSent = ( $topicData['mt_vid_folder'] == 'sent' ) ? 1 : 0;
$_isDraft = ( $topicData['mt_vid_folder'] == 'unsent' ) ? 1 : 0;
/* This is for MSSQL. I need a quick fix. This is it. Enjoy. */
if ( method_exists( $this->DB, 'setTableIdentityInsert' ) )
{
$this->DB->setTableIdentityInsert( 'message_topics', 'ON' );
}
/* Add the topic */
$this->DB->insert( 'message_topics', array( 'mt_id' => $topicID,
'mt_date' => $topicData['mt_date'],
'mt_title' => $topicData['mt_title'],
'mt_starter_id' => $post['msg_author_id'],
'mt_start_time' => $post['msg_date'],
'mt_last_post_time' => $post['msg_date'],
'mt_invited_members' => serialize( array_keys( $_invited ) ),
'mt_to_count' => count( array_keys( $_invited ) ) + 1,
'mt_to_member_id' => $topicData['mt_to_id'],
'mt_replies' => 0,
'mt_last_msg_id' => $postID,
'mt_first_msg_id' => $postID,
'mt_is_draft' => $_isDraft,
'mt_is_deleted' => $_isDeleted,
'mt_is_system' => 0 ) );
/* This is for MSSQL. I need a quick fix. This is it. Enjoy. */
if ( method_exists( $this->DB, 'setTableIdentityInsert' ) )
{
$this->DB->setTableIdentityInsert( 'message_topics', 'OFF' );
}
$converted++;
}
}
/* Attempt to free memory */
$this->DB->freeResult( $o );
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
/* Memory Debug */
if ( IPS_CLI_MEMORY_DEBUG )
{
IPSDebug::setMemoryDebugFlag( "Done", 0 );
foreach( IPSDebug::$memory_debug as $i )
{
$this->_print( "Debug:... " . $i[0] . ' - ' . IPSLib::sizeFormat( $i[1] ) );
}
/* Reset */
IPSDebug::$memory_debug = array();
}
if ( $seen )
{
/* Check for more.. */
return "Checked {$seen}, Completed... " . $this->processed . "(last ID=[ " . $topicID . " ] )";
}
else
{
return FALSE;
}
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-615
View File
@@ -1,615 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2013-02-05 06:22:45 -0500 (Tue, 05 Feb 2013) $
* </pre>
*
* @author $Author: mmecham $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 11935 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'public' );
define( 'IPS_CLI_MEMORY_DEBUG', false );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
protected $processed = 0;
protected $parser;
protected $oldparser;
protected $start = 0;
protected $end = 0;
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->memberData = array();
$this->stdin = fopen('php://stdin', 'r');
//-----------------------------------------
// Get new parser and old parser
//-----------------------------------------
require_once( IPS_ROOT_PATH . "sources/handlers/han_parse_bbcode.php" );/*noLibHook*/
$this->parser = new parseBbcode( $this->registry );
$this->oldparser = new parseBbcode( $this->registry, 'legacy' );
$classToLoad = IPSLib::loadLibrary( IPS_ROOT_PATH . 'sources/classes/text/parser.php', 'classes_text_parser' );
$this->newParser = new $classToLoad();
//-----------------------------------------
// Show options
//-----------------------------------------
$this->_print( "--------------------------------------------\nWelcome to the IP.Board Post Content Re-Builder\n--------------------------------------------\n" );
$this->_print( "What do you wish to build?\n(c=Calendar Events, a=Announcements, x=Personal Conversations, s=Signatures, m=About me, p=posts, o=Remove Orphaned Posts)\nEnter: " );
$option = $this->_fetchOption();
switch( $option )
{
case 'c':
$this->_doPosts('cal');
break;
case 'a':
$this->_doPosts('announce');
break;
case 'x':
$this->_doPosts('pms');
break;
case 's':
$this->_doPosts('sigs');
break;
case 'm':
$this->_doPosts('aboutme');
break;
case 'p':
$this->_doPosts('posts');
break;
case 'o':
$this->_doOrphanedPosts();
break;
default:
$this->_doPosts('posts');
break;
}
}
/**
* Rebuild data
*/
protected function _doOrphanedPosts()
{
$batch = 250;
$c = -1;
$bucket = array();
/* Lets grab the highest and lowest IDs */
$rows = $this->DB->buildAndFetch( array( 'select' => "count(pid) AS CNT, max(pid) AS MAX, min(pid) as MIN",
'from' => array( 'posts' => 'p' ),
'where' => 't.tid IS NULL',
'add_join' => array( array( 'select' => 't.*',
'from' => array( 'topics' => 't' ),
'where' => 't.tid=p.topic_id' ) ) ) );
if ( empty( $rows['CNT'] ) )
{
$this->_print( "No orphaned posts have been found" );
exit();
}
$this->DB->build( array( 'select' => 'pid, from_unixtime(post_date) as time',
'from' => 'posts',
'where' => 'pid IN( ' . $rows['MIN'] . ',' . $rows['MAX'] . ')' ) );
$this->DB->execute();
while( $r = $this->DB->fetch() )
{
$posts[ $r['pid'] ] = $r['time'];
}
$this->_print( "--------------------------------------------\n" . $rows['CNT'] . " orphaned posts found\n--------------------------------------------\n" );
$this->_print( "Oldest: PID:" . $rows['MIN'] . " - Date: " . $posts[ $rows['MIN'] ] );
$this->_print( "Newest: PID:" . $rows['MAX'] . " - Date: " . $posts[ $rows['MAX'] ] );
$this->_print( "Continue? (y/n):" );
$option = $this->_fetchOption();
if ( $option != 'y' )
{
$this->_print("Nothing deleted");
exit();
}
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir( 'forums' ) . '/sources/classes/moderate.php', 'moderatorLibrary', 'forums' );
$this->modLibrary = new $classToLoad( $this->registry );
/* Still here? */
$this->DB->build( array( 'select' => "pid",
'from' => array( 'posts' => 'p' ),
'where' => 't.tid IS NULL',
'add_join' => array( array( 'select' => 't.*',
'from' => array( 'topics' => 't' ),
'where' => 't.tid=p.topic_id' ) ) ) );
$o = $this->DB->execute();
while( $post = $this->DB->fetch( $o ) )
{
$c++;
$bucket[] = $post['pid'];
if ( $c % $batch )
{
$this->modLibrary->postDeleteFromDb( $bucket, true, true );
$this->_print( $c . ' deleted' );
//$this->_print( var_export( $bucket, true ) );
$bucket = array();
$c = 0;
}
}
$this->_print( "All done" );
}
/**
* Rebuild data
*/
protected function _doPosts( $type )
{
//-----------------------------------------
// Set up
//-----------------------------------------
$last = 0;
$output = array();
$types = array( 'posts', 'pms', 'cal', 'announce', 'sigs', 'aboutme' );
$type = in_array( $type, $types ) ? $type : 'posts';
$groupCache = $this->caches['group_cache'];
$this->_print( "Start at ID (Enter 0 to start from the very first entry)\nEnter: " );
$this->start = intval( $this->_fetchOption() );
$this->_print( "Process X rows (Enter 0 to process all rows)\nEnter: " );
$this->end = intval( $this->_fetchOption() );
//-----------------------------------------
// Process batches...
//-----------------------------------------
while( ( $result = $this->_process( $type ) ) !== FALSE )
{
$this->_print( $result );
}
/* We're done.. */
$this->_print( "COMPLETE" );
/* Update isRebuilt cache */
$sections = array();
$alreadyRebuilt = $this->DB->buildAndFetch( array( 'select' => 'cs_value', 'from' => 'cache_store', 'where' => "cs_key='isRebuilt'" ) );
if( $alreadyRebuilt['cs_value'] )
{
$sections = explode( ',', $alreadyRebuilt['cs_value'] );
}
$sections[] = $type;
$this->DB->replace( 'cache_store', array( 'cs_key' => 'isRebuilt', 'cs_value' => implode( ',', $sections ) ), array( "cs_key" ) );
/* Drop cache */
if ( $type == 'posts' )
{
$this->DB->delete( 'content_cache_posts' );
}
else if ( $type == 'sigs' )
{
$this->DB->delete( 'content_cache_sigs' );
}
}
/**
* Actually process
*
*/
protected function _process( $type )
{
if ( $this->end == 0 OR ( $this->end > $this->processed ) )
{
/* More to do... */
$batch = 250;
$_s = intval( $this->start );
$done = 0;
$this->processed += $batch;
/* On mssql, the select query blocks all the updates. Doing this causes the engine not to lock */
if ( method_exists( $this->DB, 'setQueryRowLocking' ) )
{
$this->DB->setQueryRowLocking( 'OFF' );
}
switch( $type )
{
case 'cal':
$this->DB->build( array( 'select' => 'e.*',
'from' => array( 'cal_events' => 'e' ),
'order' => 'e.event_id ASC',
'where' => 'e.event_id > ' . $_s,
'limit' => array( $batch ),
'add_join' => array( 1 => array( 'type' => 'left',
'select' => 'm.member_group_id, m.mgroup_others',
'from' => array( 'members' => 'm' ),
'where' => "m.member_id=e.event_member_id"
) )
) );
break;
case 'announce':
$this->DB->build( array( 'select' => 'a.*',
'from' => array( 'announcements' => 'a' ),
'order' => 'a.announce_id ASC',
'where' => 'a.announce_id > ' . $_s,
'limit' => array( $batch ),
'add_join' => array( 1 => array( 'type' => 'left',
'select' => 'm.member_group_id, m.mgroup_others',
'from' => array( 'members' => 'm' ),
'where' => "m.member_id=a.announce_member_id"
) )
) );
break;
case 'pms':
$this->DB->build( array( 'select' => 'p.*',
'from' => array( 'message_posts' => 'p' ),
'order' => 'p.msg_id ASC',
'where' => 'p.msg_id > ' . $_s,
'limit' => array( $batch ),
'add_join' => array( 1 => array( 'type' => 'left',
'select' => 'm.member_group_id, m.mgroup_others',
'from' => array( 'members' => 'm' ),
'where' => "m.member_id=p.msg_author_id"
) )
) );
break;
case 'sigs':
$this->DB->build( array( 'select' => 'me.signature, me.pp_member_id',
'from' => array( 'profile_portal' => 'me' ),
'order' => 'me.pp_member_id ASC',
'where' => "me.signature IS NOT NULL AND me.signature != '' AND me.pp_member_id > " . $_s,
'limit' => array( $batch ),
'add_join' => array( 1 => array( 'type' => 'left',
'select' => 'm.member_group_id, m.mgroup_others, m.members_display_name',
'from' => array( 'members' => 'm' ),
'where' => "m.member_id=me.pp_member_id"
) )
) );
break;
case 'aboutme':
$this->DB->build( array( 'select' => 'pp.pp_about_me, pp.pp_member_id',
'from' => array( 'profile_portal' => 'pp' ),
'order' => 'pp.pp_member_id ASC',
'where' => "pp.pp_about_me != '' AND pp.pp_about_me IS NOT NULL AND pp.pp_member_id > " . $_s,
'limit' => array( $batch ),
'add_join' => array( 1 => array( 'type' => 'left',
'select' => 'm.member_group_id, m.mgroup_others, m.members_display_name',
'from' => array( 'members' => 'm' ),
'where' => "m.member_id=pp.pp_member_id"
) )
) );
break;
case 'posts':
$this->DB->build( array( 'select' => 'p.*',
'from' => array( 'posts' => 'p' ),
'order' => 'p.pid ASC',
'where' => 'p.pid > ' . $_s,
'limit' => array( $batch ),
'add_join' => array( 1 => array( 'type' => 'left',
'select' => 't.forum_id',
'from' => array( 'topics' => 't' ),
'where' => "t.tid=p.topic_id"
),
2 => array( 'type' => 'left',
'select' => 'm.member_group_id, m.mgroup_others',
'from' => array( 'members' => 'm' ),
'where' => "m.member_id=p.author_id"
),
3 => array( 'type' => 'left',
'select' => 'f.*',
'from' => array( 'forums' => 'f' ),
'where' => "t.forum_id=f.id"
) ) ) );
break;
}
$outer = $this->DB->execute();
//-----------------------------------------
// Process...
//-----------------------------------------
while( $r = $this->DB->fetch( $outer ) )
{
//-----------------------------------------
// Reset
//-----------------------------------------
$this->parser->quote_open = $this->oldparser->quote_open = 0;
$this->parser->quote_closed = $this->oldparser->quote_closed = 0;
$this->parser->quote_error = $this->oldparser->quote_error = 0;
$this->parser->error = $this->oldparser->error = '';
$this->parser->image_count = $this->oldparser->image_count = 0;
$this->parser->parsing_mgroup = $this->oldparser->parsing_mgroup = $r['member_group_id'];
$this->parser->parsing_mgroup_others = $this->oldparser->parsing_mgroup_others = $r['mgroup_others'];
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
$this->memberData['g_bypass_badwords'] = $this->caches['group_cache'][ $r['member_group_id'] ]['g_bypass_badwords'];
switch( $type )
{
case 'cal':
$this->parser->parse_smilies = $this->oldparser->parse_smilies = $r['event_smilies'];
$this->parser->parse_html = $this->oldparser->parse_html = 0;
$this->parser->parse_bbcode = $this->oldparser->parse_bbcode = 1;
$this->parser->parsing_section = 'calendar';
$rawpost = $this->oldparser->preEditParse( $r['event_content'] );
break;
case 'announce':
$this->parser->parse_smilies = $this->oldparser->parse_smilies = 1;
$this->parser->parse_html = $this->oldparser->parse_html = $r['announce_html_enabled'];
$this->parser->parse_bbcode = $this->oldparser->parse_bbcode = 1;
$this->parser->parse_nl2br = $this->oldparser->parse_nl2br = $r['announce_nlbr_enabled'];
$this->parser->parsing_section = 'announcement';
$rawpost = $this->oldparser->preEditParse( $r['announce_post'] );
break;
case 'pms':
$this->parser->parse_smilies = $this->oldparser->parse_smilies = 1;
$this->parser->parse_html = $this->oldparser->parse_html = $this->caches['group_cache'][ $r['member_group_id'] ]['g_dohtml'];
$this->parser->parse_bbcode = $this->oldparser->parse_bbcode = 1;
$this->parser->parse_nl2br = $this->oldparser->parse_nl2br = 1;
$this->parser->parsing_section = 'pms';
$rawpost = $this->oldparser->preEditParse( $r['msg_post'] );
break;
case 'sigs':
$this->parser->parse_smilies = $this->oldparser->parse_smilies = 0;
$this->parser->parse_html = $this->oldparser->parse_html = $this->caches['group_cache'][ $r['member_group_id'] ]['g_dohtml'];
$this->parser->parse_bbcode = $this->oldparser->parse_bbcode = 1;
$this->parser->parse_nl2br = $this->oldparser->parse_nl2br = 1;
$this->parser->parsing_section = 'signatures';
$rawpost = $this->oldparser->preEditParse( $r['signature'] );
break;
case 'aboutme':
$this->parser->parse_smilies = $this->oldparser->parse_smilies = 1;
$this->parser->parse_html = $this->oldparser->parse_html = $this->caches['group_cache'][ $r['member_group_id'] ]['g_dohtml'];
$this->parser->parse_bbcode = $this->oldparser->parse_bbcode = 1;
$this->parser->parse_nl2br = $this->oldparser->parse_nl2br = 1;
$this->parser->parsing_section = 'aboutme';
$rawpost = $this->oldparser->preEditParse( $r['pp_about_me'] );
break;
case 'posts':
$allowHtml = ( $r['post_htmlstate'] && $r['use_html'] && $this->caches['group_cache'][ $r['member_group_id'] ]['g_dohtml'] );
$this->newParser->set( array( 'parseArea' => 'topics',
'memberData' => $r,
'parseBBCode' => $r['use_ibc'],
'parseHtml' => $allowHtml,
'parseEmoticons' => $r['use_emo'] ) );
$rawpost = $this->newParser->BBCodeToHtml( $r['post'] );
break;
}
/* @link http://community.invisionpower.com/tracker/issue-36434-rebuild-post-content-remove-break-from-post-content/ New parser retains <br>, legacy retains \n */
if ( $type == 'posts' || $type == 'sigs' )
{
/* Anything special here? */
$newpost = $rawpost;
}
else
{
if ( strstr( $rawpost, "\n" ) )
{
$rawpost = nl2br( $rawpost );
}
$newpost = $this->parser->preDbParse( $rawpost );
}
//-----------------------------------------
// Remove old \' escaping
//-----------------------------------------
$newpost = str_replace( "\\'", "'", $newpost );
//-----------------------------------------
// Convert old dohtml?
//-----------------------------------------
$htmlstate = 0;
if ( strstr( strtolower($newpost), '[dohtml]' ) )
{
//-----------------------------------------
// Can we use HTML?
//-----------------------------------------
if ( $type == 'posts' AND $this->registry->class_forums->forum_by_id[ $r['forum_id'] ]['use_html'] )
{
$htmlstate = 2;
}
$newpost = preg_replace( "#\[dohtml\]#i" , "", $newpost );
$newpost = preg_replace( "#\[/dohtml\]#i", "", $newpost );
}
else
{
$htmlstate = intval( $r['post_htmlstate'] );
}
//-----------------------------------------
// Convert old attachment tags
//-----------------------------------------
$newpost = preg_replace( "#\[attachmentid=(\d+?)\]#is", "[attachment=\\1:attachment]", $newpost );
if ( $newpost OR $type == 'sigs' OR $type == 'aboutme' )
{
switch( $type )
{
case 'posts':
$this->DB->update( 'posts', array( 'post' => $newpost, 'post_htmlstate' => $htmlstate ), 'pid='.$r['pid'] );
$string = substr( $r['post'], 0, 30 ) . '...';
$last = $r['pid'];
break;
case 'pms':
$this->DB->update( 'message_posts', array( 'msg_post' => $newpost ), 'msg_id='.$r['msg_id'] );
$string = substr( $r['msg_post'], 0, 30 ) . '...';
$last = $r['msg_id'];
break;
case 'sigs':
$this->DB->update( 'profile_portal', array( 'signature' => $newpost ), 'pp_member_id='.$r['pp_member_id'] );
$string = substr( $r['members_display_name'], 0, 30 ) . '...';
$last = $r['pp_member_id'];
break;
case 'aboutme':
$this->DB->update( 'profile_portal', array( 'pp_about_me' => $newpost ), 'pp_member_id='.$r['pp_member_id'] );
$string = substr( $r['post'], 0, 30 ) . '...';
$last = $r['pp_member_id'];
break;
case 'cal':
$this->DB->update( 'cal_events', array( 'event_content' => $newpost ), 'event_id='.$r['event_id'] );
$string = substr( $r['event_content'], 0, 30 ) . '...';
$last = $r['event_id'];
break;
case 'announce':
$this->DB->update( 'announcements', array( 'announce_post' => $newpost ), 'announce_id='.$r['announce_id'] );
$string = substr( $r['announce_post'], 0, 30 ) . '...';
$last = $r['announce_id'];
break;
}
}
unset( $r );
$done++;
}
if ( method_exists( $this->DB, 'setQueryRowLocking' ) )
{
$this->DB->setQueryRowLocking( 'ON' );
}
}
/* Attempt to free memory */
$this->DB->freeResult( $outer );
/* Memory Debug */
if ( IPS_CLI_MEMORY_DEBUG )
{
IPSDebug::setMemoryDebugFlag( "Done", 0 );
foreach( IPSDebug::$memory_debug as $i )
{
$this->_print( "Debug:... " . $i[0] . ' - ' . IPSLib::sizeFormat( $i[1] ) );
}
/* Reset */
IPSDebug::$memory_debug = array();
}
if ( $done )
{
$this->start = intval( $last );
return "Completed... " . $this->processed . "(last ID[ " . $last . " ] " . str_replace( "\n", "", $string ) . ")";
}
else
{
return FALSE;
}
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-162
View File
@@ -1,162 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'public' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Board IP.Downloads SEO Fixer\n--------------------------------------------\n" );
$this->_print( "Start from row?\nEnter: " );
$start = intval( $this->_fetchOption() );
$this->_print( "Do X rows\nEnter: " );
$end = intval( $this->_fetchOption() );
$this->_doCats();
$this->_doFiles( $start, $end );
}
/**
* Rebuild categories
*/
protected function _doCats()
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'downloads_categories',
//'limit' => array( $_start, $end ) //those variables are always null
) );
$t = $this->DB->execute();
while( $row = $this->DB->fetch( $t ) )
{
$title_seo = IPSText::makeSeoTitle( $row['cname'] );
$this->DB->update( 'downloads_categories', array( 'cname_furl' => $title_seo ), 'cid=' . $row['cid'] );
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "FINISHED CATEGORIES. Took " . $tkn . "m\n" );
}
/**
* Rebuild langs
*/
protected function _doFiles( $_start, $end )
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'downloads_files',
'order' => 'file_id ASC',
'limit' => array( $_start, $end ) ) );
$t = $this->DB->execute();
while( $row = $this->DB->fetch( $t ) )
{
$title_seo = IPSText::makeSeoTitle( $row['file_name'] );
$this->DB->update( 'downloads_files', array( 'file_name_furl' => $title_seo ), 'file_id=' . $row['file_id'] );
$done++;
if ( $done % 250 == 0 )
{
$this->_print( "Completed... " . $done . " (File ID=" . $row['file_id'] . " total=" . ( $_start + $done ) . ")" );
}
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "FINISHED FILES. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-148
View File
@@ -1,148 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'public' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Gallery Albums and Categories SEO Fixer\n--------------------------------------------\n" );
$this->_print( "Start from row?\nEnter: " );
$start = intval( $this->_fetchOption() );
$this->_print( "Do X rows\nEnter: " );
$end = intval( $this->_fetchOption() );
$this->_doCats();
$this->_doAlbums( $start, $end );
}
/**
* Rebuild categories
*/
protected function _doCats()
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*', 'from' => 'gallery_categories' ) );
$t = $this->DB->execute();
while( $row = $this->DB->fetch( $t ) )
{
$this->DB->update( 'gallery_categories', array( 'name_seo' => IPSText::makeSeoTitle( $row['name'] ) ), 'id=' . $row['id'] );
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "FINISHED CATEGORIES. Took " . $tkn . "m\n" );
}
/**
* Rebuild Images
*/
protected function _doAlbums( $_start, $end )
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'gallery_albums',
'order' => 'id ASC',
'limit' => array( $_start, $end ) ) );
$t = $this->DB->execute();
while( $row = $this->DB->fetch( $t ) )
{
$this->DB->update( 'gallery_albums', array( 'name_seo' => IPSText::makeSeoTitle( $row['seo'] ) ), 'id=' . $row['id'] );
$done++;
if ( $done % 250 == 0 )
{
$this->_print( "Completed... " . $done . " (Album ID=" . $row['file_id'] . " total=" . ( $_start + $done ) . ")" );
}
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "FINISHED Albums. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
-129
View File
@@ -1,129 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'public' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Board Member Name SEO Fixer\n--------------------------------------------\n" );
$this->_print( "Start from row?\nEnter: " );
$start = intval( $this->_fetchOption() );
$this->_print( "Do X rows\nEnter: " );
$end = intval( $this->_fetchOption() );
$this->_doTopics( $start, $end );
}
/**
* Rebuild langs
*/
protected function _doTopics( $_start, $end )
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'members',
'order' => 'member_id ASC',
'limit' => array( $_start, $end ) ) );
$t = $this->DB->execute();
while( $row = $this->DB->fetch( $t ) )
{
$members_seo_name = IPSText::makeSeoTitle( $row['members_display_name'] );
$this->DB->update( 'members', array( 'members_seo_name' => $members_seo_name ), 'member_id=' . $row['member_id'] );
$done++;
if ( $done % 250 == 0 )
{
$this->_print( "Completed... " . $done . " (Last ID=" . $row['member_id'] . " total=" . ( $_start + $done ) . ")" );
}
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-133
View File
@@ -1,133 +0,0 @@
#!/usr/local/bin/php
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Main public executable wrapper.
* Set-up and load module to run
* Last Updated: $Date: 2012-05-10 16:10:13 -0400 (Thu, 10 May 2012) $
* </pre>
*
* @author $Author: bfarber $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10721 $
*
*/
define( 'IPS_IS_SHELL', TRUE );
define( 'IPB_THIS_SCRIPT', 'public' );
if ( is_file( './initdata.php' ) )
{
require_once( './initdata.php' );/*noLibHook*/
}
else
{
require_once( '../initdata.php' );/*noLibHook*/
}
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
$moo = new moo( $reg );
class moo
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->stdin = fopen('php://stdin', 'r');
$this->_print( "--------------------------------------------\nWelcome to the IP.Board Topic Title SEO Fixer\n--------------------------------------------\n" );
$this->_print( "Start from row?\nEnter: " );
$start = intval( $this->_fetchOption() );
$this->_print( "Do X rows\nEnter: " );
$end = intval( $this->_fetchOption() );
$this->_doTopics( $start, $end );
}
/**
* Rebuild langs
*/
protected function _doTopics( $_start, $end )
{
/* INIT */
$start = time();
$done = 0;
$this->DB->build( array( 'select' => '*',
'from' => 'topics',
'order' => 'tid ASC',
'limit' => array( $_start, $end ) ) );
$t = $this->DB->execute();
while( $row = $this->DB->fetch( $t ) )
{
$title_seo = IPSText::makeSeoTitle( $row['title'] );
$seo_last_name = IPSText::makeSeoTitle( $row['last_poster_name'] );
$seo_first_name = IPSText::makeSeoTitle( $row['starter_name'] );
$this->DB->update( 'topics', array( 'title_seo' => $title_seo,
'seo_last_name' => $seo_last_name,
'seo_first_name' => $seo_first_name ), 'tid=' . $row['tid'] );
$done++;
if ( $done % 250 == 0 )
{
$this->_print( "Completed... " . $done . " (Last ID=" . $row['tid'] . " total=" . ( $_start + $done ) . ")" );
}
/* Clear cached queries */
$this->DB->obj['cached_queries'] = array();
}
$end = time();
$tkn = ( $end - $start) / 60;
$this->_print( "COMPLETE. Took " . $tkn . "m\n" );
}
/**
* Out to stdout
*/
protected function _print( $message, $newline="\n" )
{
$stdout = fopen('php://stdout', 'w');
fwrite( $stdout, $message . $newline );
fclose( $stdout );
}
/* Fetch option
*
*/
protected function _fetchOption()
{
return trim( fgets( $this->stdin ) );
}
}
exit();
?>
-39
View File
@@ -1,39 +0,0 @@
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Simple skin change script
* Place in your site root directory to send a user to a specified skin
* Last Updated: $Date: 2012-05-16 10:43:54 -0400 (Wed, 16 May 2012) $
* </pre>
*
* @author $Author: ips_terabyte $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 10760 $
*
*/
define( 'IPS_PUBLIC_SCRIPT', 'index.php' );
define( 'IPB_THIS_SCRIPT', 'public' );
require_once( './initdata.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
$reg = ipsRegistry::instance();
$reg->init();
if ( $_GET['id'] )
{
@header("Location: " . ipsRegistry::$settings['base_url'] . '&settingNewSkin=' . intval( $_GET['id'] ) . '&k=' . $reg->member()->form_hash );
}
else
{
die("No ID passed");
}
exit();
-552
View File
@@ -1,552 +0,0 @@
<?php
/*
+--------------------------------------------------------------------------
| Invision Power Board v<{%dyn.down.var.human.version%}>
| ========================================
| by Matthew Mecham
| (c) 2001 - 2009 Invision Power Services
| http://www.invisionpower.com
| ========================================
| Web: http://www.invisionboard.com
| Time: <{%dyn.down.var.time%}>
| Release: <{%dyn.down.var.md5%}>
| Email: matt@invisionpower.com
| Licence Info: http://www.invisionboard.com/?license
+---------------------------------------------------------------------------
|
| > SSI script
| > Script written by Matt Mecham
| > Date started: 29th April 2002
| > UPDATED for 2.0: 1st July 2004
| > UPDATED for 2.1: 13th Sept 2005
| > UPDATED for 3.0: 26th Feb 2009
|
+--------------------------------------------------------------------------
+--------------------------------------------------------------------------
| USAGE:
+--------------------------------------------------------------------------
Simply call this script via PHP includes, or SSI .shtml tags to generate content
on the fly, streamed into your own webpage.
+--------------------------------------------------------------------------
| To show the board statistics
+--------------------------------------------------------------------------
include("http://domain.com/forums/ssi.php?a=stats");/*noLibHook*//*TERANOTE: remove additional /*
+--------------------------------------------------------------------------
| To show the active users stats (x Members, X Guests, etc)
+--------------------------------------------------------------------------
include("http://domain.com/forums/ssi.php?a=active");/*noLibHook*//*TERANOTE: remove additional /*
+--------------------------------------------------------------------------
| RSS / XML Syndication..
+--------------------------------------------------------------------------
RSS: http://domain.com/forums/ssi.php?a=out&f=1,2,3,4,5&show=10&type=rss
XML: http://domain.com/forums/ssi.php?a=out&f=1,2,3,4,5&show=10&type=xml
Will show last 10 topics in reverse chronological last post date order from
all the forums in the comma separated list
*/
/**
* Main executable wrapper.
*
* Set-up and load module to run
*
* @package IP.Board
* @author Matt Mecham
* @version 3.0
*/
define( 'CCS_GATEWAY_CALLED', TRUE ); // Prevents redirect checks in ipsRegistry
define( 'IPS_ENFORCE_ACCESS', TRUE ); // Prevents force login setting from returning a login page
define( 'IPB_THIS_SCRIPT', 'public' );
require_once( './initdata.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );/*noLibHook*/
/**
* Path to SSI templates directory
*
*/
define( 'SSI_TEMPLATES_DIR', DOC_IPS_ROOT_PATH."ssi_templates" );
/**
* Maximum number of topics to show
*
*/
define( 'SSI_MAX_SHOW' , 100 );
/**
* Allow SSI export. Enter "0" to turn off.
*
*/
define( 'SSI_ALLOW_SYND' , 1 );
/* Go... */
$reg = ipsRegistry::instance();
$reg->init();
$ssi = new ssi( $reg );
class ssi
{
function __construct( ipsRegistry $registry )
{
$this->registry = $registry;
$this->DB = $this->registry->DB();
$this->settings =& $this->registry->fetchSettings();
$this->request =& $this->registry->fetchRequest();
$this->cache = $this->registry->cache();
$this->caches =& $this->registry->cache()->fetchCaches();
$this->member = $this->registry->member();
$this->memberData =& $this->registry->member()->fetchMemberData();
/* Load forums class */
$classToLoad = IPSLib::loadLibrary( IPSLib::getAppDir('forums') . '/sources/classes/forums/class_forums.php', 'class_forums', 'forums' );
$this->registry->setClass( 'class_forums', new $classToLoad( $registry ) );
$this->registry->class_forums->forumsInit();
switch ($this->request['a'])
{
case 'active':
$this->_doActive();
break;
case 'stats':
$this->_doStats();
break;
case 'out':
if ( SSI_ALLOW_SYND == 1 )
{
$this->_doSyndication();
}
else
{
exit();
}
break;
default:
echo("An error occurred whilst processing this directive");
exit();
break;
}
}
/**
* Do Syndication
*
* Export topics / titles from selected forums
*
* @access protected
*/
protected function _doSyndication()
{
//----------------------------------------
// Sort out the forum ids
//----------------------------------------
$tmp_forums = array();
$forums = array();
if ( $this->request['f'] )
{
$tmp_forums = explode( ",", $this->request['f'] );
}
else
{
fatal_error("Fatal error: no forum id specified");
}
//----------------------------------------
// Intval the IDs
//----------------------------------------
foreach ($tmp_forums as $f )
{
$f = intval($f);
if ( $f )
{
$forums[] = $f;
}
}
//----------------------------------------
// Check...
//----------------------------------------
if ( count($forums) < 1 )
{
fatal_error("Fatal error: no forum id specified");
}
$sql_fields = implode( ",", $forums );
//----------------------------------------
// Number of topics to return?
//----------------------------------------
$perpage = intval($this->request['show']) ? intval($this->request['show']) : 10;
$perpage = ( $perpage > SSI_MAX_SHOW ) ? SSI_MAX_SHOW : $perpage;
//----------------------------------------
// Load the template...
//----------------------------------------
if ( $this->request['type'] == 'xml' )
{
$template = $this->_loadTemplate("syndicate_xml.html");
}
else
{
$template = $this->_loadTemplate("syndicate_rss.html");
}
//----------------------------------------
// parse..
//----------------------------------------
$to_echo = "";
$top = "";
$row = "";
$bottom = "";
preg_match( "#\[TOP\](.+?)\[/TOP\]#is", $template, $match );
$top = trim($match[1]);
preg_match( "#\[ROW\](.+?)\[/ROW\]#is", $template, $match );
$row = trim($match[1]);
preg_match( "#\[BOTTOM\](.+?)\[/BOTTOM\]#is", $template, $match );
$bottom = trim($match[1]);
//----------------------------------------
// Header parse...
//----------------------------------------
//@header("Content-Type: text/xml;charset={$this->settings['gb_char_set']}");
//@header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT');
//@header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
//@header('Pragma: public');
$to_echo .= $this->_parseTemplate( $top, array ( 'board_url' => $this->settings['base_url'] ,
'board_name' => $this->settings['board_name'] ) );
//----------------------------------------
// Fix up
//----------------------------------------
$group = $this->caches['group_cache'][ $this->settings['guest_group'] ];
//----------------------------------------
// Get the topics, member info and other stuff
//----------------------------------------
$this->DB->build( array( 'select' => '*',
'from' => 'topics',
'where' => "forum_id IN ($sql_fields) AND " . $this->registry->getClass('class_forums')->fetchTopicHiddenQuery( array( 'visible' ), '' ),
'order' => 'last_post DESC',
'limit' => array( 0, $perpage ) ) );
$this->DB->execute();
if ( ! $this->DB->getTotalRows() )
{
fatal_error("Could not get the information from the database");
}
while ( $i = $this->DB->fetch() )
{
$forum = $this->registry->class_forums->forum_by_id[ $i['forum_id'] ];
if ( $this->registry->permissions->check( 'read', $forum ) != TRUE )
{
continue;
}
if ( $forum['password'] != "" )
{
continue;
}
$to_echo .= $this->_parseTemplate( $row, array ( 'topic_title' => str_replace( '&#', '&amp;#', $i['title'] ),
'topic_id' => $i['tid'],
'topic_link' => $this->settings['base_url']."showtopic=".$i['tid'],
'forum_title' => htmlspecialchars($forum['name']),
'forum_id' => $i['forum_id'],
'last_poster_id' => $i['last_poster_id'],
'last_post_name' => $i['last_poster_name'],
'last_post_time' => $this->registry->getClass('class_localization')->getDate( $i['last_post'] , 'LONG', 1 ),
'timestamp' => $i['last_post'],
'starter_id' => $i['starter_id'],
'starter_name' => $i['starter_name'],
'board_url' => $this->settings['board_url'] ,
'board_name' => $this->settings['board_name'],
'rfc_date' => date( 'r', $i['last_post'] ) ) ) . "\r\n";
}
//----------------------------------------
// Print bottom...
//----------------------------------------
echo $to_echo."\r\n".$bottom;
exit();
}
/**
* Do Stats
*
* Show totals
*/
function _doStats()
{
//----------------------------------------
// Load the template...
//----------------------------------------
$template = $this->_loadTemplate("stats.html");
//----------------------------------------
// INIT
//----------------------------------------
$to_echo = "";
$time = time() - 900;
$stats = $this->caches['stats'];
$total_posts = $stats['total_replies'] + $stats['total_topics'];
$to_echo = $this->_parseTemplate( $template, array( 'total_posts' => $total_posts,
'topics' => $stats['total_topics'],
'replies' => $stats['total_replies'],
'members' => $stats['mem_count'] ) );
echo $to_echo;
exit();
}
/**
* Do Active
*
* Show active users
*/
function _doActive()
{
//--------------------------------
// Load the template...
//--------------------------------
$template = $this->_loadTemplate("active.html");
//--------------------------------
// INIT
//--------------------------------
$to_echo = "";
//--------------------------------
// Make sure we have a cut off...
//--------------------------------
if ($this->settings['au_cutoff'] == "")
{
$this->settings['au_cutoff'] = 15;
}
//-----------------------------------------
// Get the users from the DB
//-----------------------------------------
$cut_off = $this->settings['au_cutoff'] * 60;
$time = time() - $cut_off;
$rows = array();
$ar_time = time();
if ( $this->memberData['member_id'] )
{
$rows = array( $ar_time => array( 'login_type' => IPSMember::isLoggedInAnon( $this->memberData ),
'running_time' => $ar_time,
'member_id' => $this->memberData['member_id'],
'member_name' => $this->memberData['members_display_name'],
'member_group' => $this->memberData['member_group_id'] ) );
}
$this->DB->build( array( 'select' => 'id, member_id, member_name, login_type, running_time, member_group',
'from' => 'sessions',
'where' => "running_time > $time",
) );
$this->DB->execute();
//-----------------------------------------
// FETCH...
//-----------------------------------------
while ( $r = $this->DB->fetch() )
{
$rows[ $r['running_time'].'.'.$r['id'] ] = $r;
}
krsort( $rows );
//--------------------------------
// cache all printed members so we
// don't double print them
//--------------------------------
$cached = array();
$active = array();
foreach( $rows as $result )
{
//-----------------------------------------
// Bot?
//-----------------------------------------
if ( strstr( $result['id'], '_session' ) )
{
//-----------------------------------------
// Seen bot of this type yet?
//-----------------------------------------
$botname = preg_replace( '/^(.+?)=/', "\\1", $result['id'] );
if ( ! $cached[ $result['member_name'] ] )
{
$cached[ $result['member_name'] ] = 1;
}
else
{
//-----------------------------------------
// Yup, count others as guest
//-----------------------------------------
$active['GUESTS']++;
}
}
//-----------------------------------------
// Guest?
//-----------------------------------------
else if ( ! $result['member_id'] )
{
$active['GUESTS']++;
}
//-----------------------------------------
// Member?
//-----------------------------------------
else
{
if ( empty( $cached[ $result['member_id'] ] ) )
{
$cached[ $result['member_id'] ] = 1;
/* Reset login type in case the board/group setting got changed */
$result['login_type'] = IPSMember::isLoggedInAnon( array( 'login_anonymous' => $result['login_type'] ), $result['member_group'] );
if ( $result['login_type'] )
{
$active['ANON']++;
}
else
{
$active['MEMBERS']++;
}
}
}
}
$active['TOTAL'] = $active['MEMBERS'] + $active['GUESTS'] + $active['ANON'];
$to_echo = $this->_parseTemplate( $template, array ( 'total' => $active['TOTAL'] ? $active['TOTAL'] : 0 ,
'members' => $active['MEMBERS'] ? $active['MEMBERS'] : 0,
'guests' => $active['GUESTS'] ? $active['GUESTS'] : 0,
'anon' => $active['ANON'] ? $active['ANON'] : 0 ) );
echo $to_echo;
exit();
}
/**
* Parse template
*
* Parses the template. Duh.
*
* @access protected
* @param string Template data
* @param array Array of data
*/
protected function _parseTemplate( $template, $assigned=array() )
{
foreach( $assigned as $word => $replace)
{
$template = preg_replace( "/\{$word\}/i", "$replace", $template );
}
$template = str_replace( '/ssi.php', '/index.php', $template );
return $this->registry->output->replaceMacros( $template );
}
/**
* Load template
*
* Loads the template
*
* @access protected
* @param string Template to load
*/
protected function _loadTemplate($template="")
{
$filename = SSI_TEMPLATES_DIR."/".$template;
if ( is_file($filename) )
{
if ( $FH = fopen($filename, 'r') )
{
$template = fread( $FH, filesize($filename) );
fclose($FH);
}
else
{
fatal_error("Couldn't open the template file");
}
}
else
{
fatal_error("Template file does not exist");
}
return $template;
}
}
function fatal_error( $error )
{
print $error;
exit();
}
-1
View File
@@ -1 +0,0 @@
<table cellpadding='4' cellspacing='1' border='0' width='100%' bgcolor='#000000' style='font-family:Verdana;font-size:11px'>␍<tr>␍ <td align='left' bgcolor='#CCCCCC'><b>Users browsing the forums: {total}</b></td>␍</tr>␍<tr>␍ <td align='left'bgcolor='#FEFEFE'>␍ <table style='border:1px dotted gray;width:100%;font-family:Verdana;font-size:10px'>␍ <tr>␍ <td>Active members: {members}<br>Active Guests: {guests}<br>Active Anonymous: {anon}␍ </td>␍ </tr>␍ </table>␍ </td>␍</tr>␍</table>␍<br>
-1
View File
@@ -1 +0,0 @@
<html>␍<head><title>Invision Power Board - Bulletin Board System</title></head>␍<body>␍<h1>403: Invision Power Board -&gt; Forbidden</h1>␍<hr>␍You have reached this Page in error, please use␍your back button to return to Invision Board.␍<hr>␍Invision Power Board␍</body>␍</html>␍
-1
View File
@@ -1 +0,0 @@
<table cellpadding='4' cellspacing='1' border='0' width='100%' bgcolor='#000000' style='font-family:Verdana;font-size:11px'>␍<tr>␍ <td align='left' bgcolor='#CCCCCC'><b>Board Statistics</b></td>␍</tr>␍<tr>␍ <td align='left'bgcolor='#FEFEFE'>␍ <table style='border:1px dotted gray;width:100%;font-family:Verdana;font-size:10px'>␍ <tr>␍ <td>Total Posts: {total_posts} ( Topics: {topics}, Replies {replies} )<br>␍ Registered Members: {members}␍ </td>␍ </tr>␍ </table>␍ </td>␍</tr>␍</table>␍<br>
-27
View File
@@ -1,27 +0,0 @@
[TOP]
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>{board_name}</title>
<link>{board_url}</link>
<description>{board_name} Syndication</description>
<language>en-us</language>
<generator>Invision Power Board</generator>
<ttl>30</ttl>
[/TOP]
[ROW]
<item>
<title>{topic_title}</title>
<link>{topic_link}</link>
<comments>{topic_link}</comments>
<category>{forum_title}</category>
<description><![CDATA[Forum: <a href="{board_url}?showforum={forum_id}">{forum_title}</a><br />Last Poster: <a href="{board_url}?showuser={last_poster_id}" target="_blank">{last_post_name}</a><br />Last Post: {last_post_time}]]></description>
<pubDate>{rfc_date}</pubDate>
</item>
[/ROW]
[BOTTOM]
</channel>
</rss>
[/BOTTOM]
-1
View File
@@ -1 +0,0 @@
[TOP]␍<?xml version="1.0" encoding="ISO-8859-1"?>␍<!DOCTYPE ipbsource␍[␍ <!-- CUSTOM IPB INLINE DOCTYPE -->␍ <!ELEMENT ipbsource (topic+) >␍ <!ELEMENT topic (title,lastposter,starter,forum,date) >␍ <!ATTLIST topic id CDATA #REQUIRED >␍ ␍ <!ELEMENT title (#PCDATA) >␍ ␍ <!ELEMENT lastposter (#PCDATA) >␍ <!ATTLIST lastposter id CDATA #REQUIRED >␍ ␍ <!ELEMENT starter (#PCDATA) >␍ <!ATTLIST starter id CDATA #REQUIRED >␍ ␍ <!ELEMENT forum (#PCDATA) >␍ <!ATTLIST forum id CDATA #REQUIRED >␍ ␍ <!ELEMENT date (#PCDATA) >␍ <!ATTLIST date timestamp CDATA #REQUIRED >␍]>␍<ipbsource>␍[/TOP]␍␍[ROW]␍ <topic id="{topic_id}">␍ <title>{topic_title}</title>␍ <lastposter id="{last_poster_id}">{last_post_name}</lastposter>␍ <starter id="{starter_id}">{starter_name}</starter>␍ <forum id="{forum_id}">{forum_title}</forum>␍ <date timestamp="{timestamp}">{last_post_time}</date>␍ </topic>␍[/ROW]␍␍[BOTTOM]␍</ipbsource>␍[/BOTTOM]
-142
View File
@@ -1,142 +0,0 @@
<?php
/**
* <pre>
* Invision Power Services
* IP.Board v3.4.6
* Installer: Upgrader core file
* Last Updated: $LastChangedDate: 2013-01-29 14:15:42 -0500 (Tue, 29 Jan 2013) $
* </pre>
*
* @author $Author: AndyMillne $
* @copyright (c) 2001 - 2009 Invision Power Services, Inc.
* @license http://www.invisionpower.com/company/standards.php#license
* @package IP.Board
* @link http://www.invisionpower.com
* @version $Rev: 11913 $
*
*/
/*
This script completes the upgrade from modules onwards
Move the 'upgradeFinish' folder into your 'admin' directory
and access via your web browser
*/
$startPoint = 'modules';
define( 'IPB_THIS_SCRIPT', 'admin' );
define( 'IPS_IS_UPGRADER', TRUE );
define( 'IPS_IS_INSTALLER', FALSE );
require_once( '../../initdata.php' );/*noLibHook*/
# Bypass security check
if ( ! $_GET['s'] )
{
$_GET['section'] = 'index';
$_POST['section'] = 'index';
}
require_once( IPS_ROOT_PATH . 'setup/sources/base/ipsRegistry_setup.php' );/*noLibHook*/
require_once( IPS_ROOT_PATH . 'setup/sources/base/ipsController_setup.php' );/*noLibHook*/
/* INIT */
ipsRegistry::init();
/* Fetch admin */
if ( ! $_GET['s'] )
{
$admin = ipsRegistry::DB()->buildAndFetch( array( 'select' => '*',
'from' => 'members',
'where' => 'member_group_id=' . ipsRegistry::$settings['admin_group'],
'order' => 'last_visit DESC',
'limit' => array( 0,1 ) ) );
/* Set up a session */
ipsRegistry::$request['s'] = ipsRegistry::member()->sessionClass()->createSession( $admin, $admin['member_login_key'] );
$_GET['section'] = 'upgrade';
$_POST['section'] = 'upgrade';
ipsRegistry::$request['section'] = 'upgrade';
ipsRegistry::$current_section = 'upgrade';
/* Set up the correct module */
$_GET['do'] = ( $_GET['do'] ) ? $_GET['do'] : $startPoint;
$_POST['do'] = ( $_POST['do'] ) ? $_POST['do'] : $startPoint;
ipsRegistry::$request['do'] = ( ipsRegistry::$request['do'] ) ? ipsRegistry::$request['do'] : $startPoint;
$apps = array( 'core', 'forums', 'members' );
$toSave = array();
$vNums = array();
if ( is_array( $apps ) and count( $apps ) )
{
IPSSetUp::setSavedData( 'install_apps', implode( ',', $apps ) );
/* Grab data */
foreach( $apps as $app )
{
/* Grab version numbers */
$numbers = IPSSetUp::fetchAppVersionNumbers( $app );
/* Grab all numbers */
$nums[ $app ] = IPSSetUp::fetchXmlAppVersions( $app );
/* Grab app data */
$appData[ $app ] = IPSSetUp::fetchXmlAppInformation( $app );
$appClasses[ $app ] = IPSSetUp::fetchVersionClasses( $app, $numbers['current'][0], $numbers['latest'][0] );
/* Store starting vnums */
$vNums[ $app ] = $numbers['current'][0];
}
/* Got anything? */
if ( count( $appClasses ) )
{
foreach( $appClasses as $app => $data )
{
foreach( $data as $num )
{
if ( is_file( IPSLib::getAppDir( $app ) . '/setup/versions/upg_' . $num . '/version_class.php' ) )
{
$_class = 'version_class_' . $app . '_' . $num;
require_once( IPSLib::getAppDir( $app ) . '/setup/versions/upg_' . $num . '/version_class.php' );/*noLibHook*/
$_tmp = new $_class( ipsRegistry::instance() );
if ( method_exists( $_tmp, 'preInstallOptionsSave' ) )
{
$_t = $_tmp->preInstallOptionsSave();
if ( is_array( $_t ) AND count( $_t ) )
{
$toSave[ $app ][ $num ] = $_t;
}
}
}
}
}
/* Save it */
if ( count( $toSave ) )
{
IPSSetUp::setSavedData('custom_options', $toSave );
}
if ( count( $vNums ) )
{
IPSSetUp::setSavedData('version_numbers', $vNums );
}
}
/* Freeze data */
IPSSetUp::freezeSavedData();
/* Thaw it */
IPSSetUp::thawSavedData();
}
}
/* Run our controller */
ipsController::run();
+33
View File
@@ -0,0 +1,33 @@
#!/usr/local/bin/php
<?php
/**
* @brief UTF-8 Conversion
* @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
*/
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\">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

File renamed without 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.
+25
View File
@@ -0,0 +1,25 @@
<?php
/**
* @brief UTF-8 Conversion
* @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
*/
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();
+245
View File
@@ -0,0 +1,245 @@
<?php
/**
* @brief Init for UTF8 Conversion
* @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;
/**
* Class to contain IPS Social Suite autoloader and exception handler
*/
class IPSUtf8
{
/**
* Initiate IPS Social Suite 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_LOCK' => TRUE, /* Lock conversion to only IP.Board Databases */
'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 */
);
}
/**
* 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 )
{
if ( in_array( $errno, array( E_NOTICE ) ) )
{
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();
+188
View File
@@ -0,0 +1,188 @@
/**
* IPS UTF8 Converter
* (c) 2013 Invision Power Services - http://www.invisionpower.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,
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 {mixed} 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,150 @@
<?php
/**
* @brief Web conversion process
* @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 Social Suite
* @since 9 Sept 2013
* @version SVN_VERSION_NUMBER
*/
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':
$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,187 @@
<?php
/**
* @brief Web conversion process
* @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 Social Suite
* @since 9 Sept 2013
* @version SVN_VERSION_NUMBER
*/
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 . ' (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\Convert::i()->deleteOriginalTables();
\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();
}
if ( \IPSUtf8\Convert::i()->databaseIsUtf8() )
{
\IPSUtf8\Output\Browser::i()->error( '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>.' );
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,42 @@
<?php
/**
* @brief Web conversion process
* @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 Social Suite
* @since 9 Sept 2013
* @version SVN_VERSION_NUMBER
*/
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()
{
\IPSUtf8\Convert::i()->fixCollation();
$this->manage( "Collation checked and fixed where appropriate" );
}
}
+479
View File
@@ -0,0 +1,479 @@
<?php
/**
* @brief CLI conversion process
* @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 Social Suite
* @since 9 Sept 2013
* @version SVN_VERSION_NUMBER
*/
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();
if ( version_compare( \IPSUtf8\Db::i()->server_info, '5.5.3', '>=' ) AND \IPSUtf8\Db::i('utf8')->set_charset('utf8mb4') !== FALSE )
{
\IPSUtf8\Output\Cli::i()->sendOutput("Use 4-byte UTF-8 Encoding (utf8mb4)?\nSome non-common symbols (such as historical scripts, music symbols and Emoji) require more space in the database to be stored. If you choose 'no', users will not be able to use these symbols on your site. If 'yes', these characters will be able to be used, but the database will use more disk space.\n<choice>[y] Enter 'y' for Yes\n[n] Enter 'n' for No</choice>", 100 );
$sessionData = \IPSUtf8\Session::i()->json;
if ( \IPSUtf8\Output\Cli::i()->response === 'y' )
{
$sessionData['use_utf8mb4'] = 1;
}
else
{
$sessionData['use_utf8mb4'] = 0;
}
\IPSUtf8\Session::i()->json = $sessionData;
\IPSUtf8\Session::i()->save();
}
\IPSUtf8\Db::i('utf8')->set_charset( $origUtf8Charset );
\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.
+64
View File
@@ -0,0 +1,64 @@
<!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_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_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 conveter, please report the issue to our <a href="http://community.invisionpower.com/resources/bugs.html/_/ips-extras/">bug tracker</a>. When creating a new
bug report please copy and paste the "info" from the converter output.
<br />
Active IP.Board license holders can also request support via the <a href="https://invisionpower.com/clients">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; 2015 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,274 @@
<?php
/**
* @brief Archive table 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\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.
+68
View File
@@ -0,0 +1,68 @@
<?php
/**
* @brief Binding Class for Prepared Statements
* @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 Social Suite
* @since 18 Feb 2013
* @version SVN_VERSION_NUMBER
*/
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
+69
View File
@@ -0,0 +1,69 @@
<?php
/**
* @brief Exception class for database errors
* @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 Social Suite
* @since 18 Feb 2013
* @version SVN_VERSION_NUMBER
*/
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;
}
}
+329
View File
@@ -0,0 +1,329 @@
<?php
/**
* @brief Database SELECT Statement
* @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 Social Suite
* @since 28 Aug 2013
* @version SVN_VERSION_NUMBER
*/
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 \OutOfRangeException
*/
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 );
call_user_func_array( array( $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
*
* @param bool $allRows If TRUE, will get the number of rows ignoring the limit. In order for this to work, the query must have been ran with SQL_CALC_FOUND_ROWS
* @return int
*/
public function count( $allRows = FALSE )
{
if ( !$this->stmt )
{
$this->rewind();
}
if ( $allRows )
{
$result = $this->db->query( 'SELECT FOUND_ROWS() AS count;' )->fetch_assoc();
return $result['count'];
}
else
{
return $this->stmt->num_rows;
}
}
}
Whitespace-only changes.
@@ -0,0 +1,64 @@
<?php
/**
* @brief Dispatcher (Web)
* @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\Dispatcher;
use \IPSUtf8\Output\Browser\Template;
/**
* Web Dispatcher
*/
class Browser extends \IPSUtf8\Dispatcher
{
/**
* Run
*/
public function run()
{
$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()
{
}
}
Loaded 100 of 7517 files, more files were not shown because too many files have changed in this diff. Show more