Merge lp:~percona-dev/percona-data-recovery-tool-for-innodb/sphinxdoc into lp:percona-data-recovery-tool-for-innodb

Proposed by Hrvoje Matijakovic on 2012-04-02
Status: Needs review
Proposed branch: lp:~percona-dev/percona-data-recovery-tool-for-innodb/sphinxdoc
Merge into: lp:percona-data-recovery-tool-for-innodb
Diff against target: 4130 lines (+3967/-0)
20 files modified
.bzrignore (+1/-0)
doc/Makefile (+130/-0)
doc/make.bat (+170/-0)
doc/source/advanced.rst (+452/-0)
doc/source/conf.py (+257/-0)
doc/source/ext/psdom.py (+387/-0)
doc/source/external.rst (+8/-0)
doc/source/index.rst (+54/-0)
doc/source/installation.rst (+13/-0)
doc/source/intro.rst (+25/-0)
doc/source/manual.rst (+590/-0)
doc/source/percona-theme/layout.html (+499/-0)
doc/source/percona-theme/searchbox.html (+22/-0)
doc/source/percona-theme/static/default.css_t (+469/-0)
doc/source/percona-theme/static/jquery.min.js (+154/-0)
doc/source/percona-theme/static/percona.com.css (+271/-0)
doc/source/percona-theme/static/percona.com.js (+269/-0)
doc/source/percona-theme/static/sidebar.js (+151/-0)
doc/source/percona-theme/theme.conf (+32/-0)
doc/source/support.rst (+13/-0)
To merge this branch: bzr merge lp:~percona-dev/percona-data-recovery-tool-for-innodb/sphinxdoc
Reviewer Review Type Date Requested Status
Percona developers 2012-04-02 Pending
Review via email: mp+100447@code.launchpad.net
To post a comment you must log in.
Aleksandr Kuzminsky (akuzminsky) wrote :

When making text version it misses build/text directory:
$ make text
sphinx-build -b text -d build/doctrees source build/text
Error: Cannot find output directory.
make: *** [text] Error 1

Aleksandr Kuzminsky (akuzminsky) wrote :

Next error:
$ mkdir build/text
$ sphinx-build -b text -d build/doctrees source build/text
Exception occurred:
  File "/usr/lib/python2.4/site-packages/sphinx/application.py", line 122, in setup_extension
    raise ExtensionError('Could not import extension %s' % extension, err)
ExtensionError: Could not import extension sphinx.ext.intersphinx (exception: No module named intersphinx)
The full traceback has been saved in /tmp/sphinx-err-kuwqVk.log, if you want to report the issue to the author.
Please also report this if it was a user error, so that a better error message can be provided next time.
Send reports to <email address hidden>. Thanks!

41. By Hrvoje Matijakovic on 2012-07-17

* fixed the text builds
* removed the build files from bzr tracking

Unmerged revisions

41. By Hrvoje Matijakovic on 2012-07-17

* fixed the text builds
* removed the build files from bzr tracking

40. By Hrvoje Matijakovic on 2012-04-02

* initial sphinx docs with Percona theme

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file '.bzrignore'
2--- .bzrignore 1970-01-01 00:00:00 +0000
3+++ .bzrignore 2012-07-17 08:41:18 +0000
4@@ -0,0 +1,1 @@
5+doc/build/
6
7=== added directory 'doc'
8=== added file 'doc/Makefile'
9--- doc/Makefile 1970-01-01 00:00:00 +0000
10+++ doc/Makefile 2012-07-17 08:41:18 +0000
11@@ -0,0 +1,130 @@
12+# Makefile for Sphinx documentation
13+#
14+
15+# You can set these variables from the command line.
16+SPHINXOPTS =
17+SPHINXBUILD = sphinx-build
18+PAPER =
19+BUILDDIR = build
20+
21+# Internal variables.
22+PAPEROPT_a4 = -D latex_paper_size=a4
23+PAPEROPT_letter = -D latex_paper_size=letter
24+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
25+
26+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
27+
28+help:
29+ @echo "Please use \`make <target>' where <target> is one of"
30+ @echo " html to make standalone HTML files"
31+ @echo " dirhtml to make HTML files named index.html in directories"
32+ @echo " singlehtml to make a single large HTML file"
33+ @echo " pickle to make pickle files"
34+ @echo " json to make JSON files"
35+ @echo " htmlhelp to make HTML files and a HTML help project"
36+ @echo " qthelp to make HTML files and a qthelp project"
37+ @echo " devhelp to make HTML files and a Devhelp project"
38+ @echo " epub to make an epub"
39+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
40+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
41+ @echo " text to make text files"
42+ @echo " man to make manual pages"
43+ @echo " changes to make an overview of all changed/added/deprecated items"
44+ @echo " linkcheck to check all external links for integrity"
45+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
46+
47+clean:
48+ -rm -rf $(BUILDDIR)/*
49+
50+html:
51+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
52+ @echo
53+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
54+
55+dirhtml:
56+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
57+ @echo
58+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
59+
60+singlehtml:
61+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
62+ @echo
63+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
64+
65+pickle:
66+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
67+ @echo
68+ @echo "Build finished; now you can process the pickle files."
69+
70+json:
71+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
72+ @echo
73+ @echo "Build finished; now you can process the JSON files."
74+
75+htmlhelp:
76+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
77+ @echo
78+ @echo "Build finished; now you can run HTML Help Workshop with the" \
79+ ".hhp project file in $(BUILDDIR)/htmlhelp."
80+
81+qthelp:
82+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
83+ @echo
84+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
85+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
86+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/PerconaXtraBackup.qhcp"
87+ @echo "To view the help file:"
88+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/PerconaXtraBackup.qhc"
89+
90+devhelp:
91+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
92+ @echo
93+ @echo "Build finished."
94+ @echo "To view the help file:"
95+ @echo "# mkdir -p $$HOME/.local/share/devhelp/PerconaXtraBackup"
96+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/PerconaXtraBackup"
97+ @echo "# devhelp"
98+
99+epub:
100+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
101+ @echo
102+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
103+
104+latex:
105+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
106+ @echo
107+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
108+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
109+ "(use \`make latexpdf' here to do that automatically)."
110+
111+latexpdf:
112+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
113+ @echo "Running LaTeX files through pdflatex..."
114+ make -C $(BUILDDIR)/latex all-pdf
115+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
116+
117+text:
118+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
119+ @echo
120+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
121+
122+man:
123+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
124+ @echo
125+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
126+
127+changes:
128+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
129+ @echo
130+ @echo "The overview file is in $(BUILDDIR)/changes."
131+
132+linkcheck:
133+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
134+ @echo
135+ @echo "Link check complete; look for any errors in the above output " \
136+ "or in $(BUILDDIR)/linkcheck/output.txt."
137+
138+doctest:
139+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
140+ @echo "Testing of doctests in the sources finished, look at the " \
141+ "results in $(BUILDDIR)/doctest/output.txt."
142
143=== added file 'doc/make.bat'
144--- doc/make.bat 1970-01-01 00:00:00 +0000
145+++ doc/make.bat 2012-07-17 08:41:18 +0000
146@@ -0,0 +1,170 @@
147+@ECHO OFF
148+
149+REM Command file for Sphinx documentation
150+
151+if "%SPHINXBUILD%" == "" (
152+ set SPHINXBUILD=sphinx-build
153+)
154+set BUILDDIR=build
155+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
156+if NOT "%PAPER%" == "" (
157+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
158+)
159+
160+if "%1" == "" goto help
161+
162+if "%1" == "help" (
163+ :help
164+ echo.Please use `make ^<target^>` where ^<target^> is one of
165+ echo. html to make standalone HTML files
166+ echo. dirhtml to make HTML files named index.html in directories
167+ echo. singlehtml to make a single large HTML file
168+ echo. pickle to make pickle files
169+ echo. json to make JSON files
170+ echo. htmlhelp to make HTML files and a HTML help project
171+ echo. qthelp to make HTML files and a qthelp project
172+ echo. devhelp to make HTML files and a Devhelp project
173+ echo. epub to make an epub
174+ echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
175+ echo. text to make text files
176+ echo. man to make manual pages
177+ echo. changes to make an overview over all changed/added/deprecated items
178+ echo. linkcheck to check all external links for integrity
179+ echo. doctest to run all doctests embedded in the documentation if enabled
180+ goto end
181+)
182+
183+if "%1" == "clean" (
184+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
185+ del /q /s %BUILDDIR%\*
186+ goto end
187+)
188+
189+if "%1" == "html" (
190+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
191+ if errorlevel 1 exit /b 1
192+ echo.
193+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
194+ goto end
195+)
196+
197+if "%1" == "dirhtml" (
198+ %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
199+ if errorlevel 1 exit /b 1
200+ echo.
201+ echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
202+ goto end
203+)
204+
205+if "%1" == "singlehtml" (
206+ %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
207+ if errorlevel 1 exit /b 1
208+ echo.
209+ echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
210+ goto end
211+)
212+
213+if "%1" == "pickle" (
214+ %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
215+ if errorlevel 1 exit /b 1
216+ echo.
217+ echo.Build finished; now you can process the pickle files.
218+ goto end
219+)
220+
221+if "%1" == "json" (
222+ %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
223+ if errorlevel 1 exit /b 1
224+ echo.
225+ echo.Build finished; now you can process the JSON files.
226+ goto end
227+)
228+
229+if "%1" == "htmlhelp" (
230+ %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
231+ if errorlevel 1 exit /b 1
232+ echo.
233+ echo.Build finished; now you can run HTML Help Workshop with the ^
234+.hhp project file in %BUILDDIR%/htmlhelp.
235+ goto end
236+)
237+
238+if "%1" == "qthelp" (
239+ %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
240+ if errorlevel 1 exit /b 1
241+ echo.
242+ echo.Build finished; now you can run "qcollectiongenerator" with the ^
243+.qhcp project file in %BUILDDIR%/qthelp, like this:
244+ echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PerconaXtraBackup.qhcp
245+ echo.To view the help file:
246+ echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PerconaXtraBackup.ghc
247+ goto end
248+)
249+
250+if "%1" == "devhelp" (
251+ %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
252+ if errorlevel 1 exit /b 1
253+ echo.
254+ echo.Build finished.
255+ goto end
256+)
257+
258+if "%1" == "epub" (
259+ %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
260+ if errorlevel 1 exit /b 1
261+ echo.
262+ echo.Build finished. The epub file is in %BUILDDIR%/epub.
263+ goto end
264+)
265+
266+if "%1" == "latex" (
267+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
268+ if errorlevel 1 exit /b 1
269+ echo.
270+ echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
271+ goto end
272+)
273+
274+if "%1" == "text" (
275+ %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
276+ if errorlevel 1 exit /b 1
277+ echo.
278+ echo.Build finished. The text files are in %BUILDDIR%/text.
279+ goto end
280+)
281+
282+if "%1" == "man" (
283+ %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
284+ if errorlevel 1 exit /b 1
285+ echo.
286+ echo.Build finished. The manual pages are in %BUILDDIR%/man.
287+ goto end
288+)
289+
290+if "%1" == "changes" (
291+ %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
292+ if errorlevel 1 exit /b 1
293+ echo.
294+ echo.The overview file is in %BUILDDIR%/changes.
295+ goto end
296+)
297+
298+if "%1" == "linkcheck" (
299+ %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
300+ if errorlevel 1 exit /b 1
301+ echo.
302+ echo.Link check complete; look for any errors in the above output ^
303+or in %BUILDDIR%/linkcheck/output.txt.
304+ goto end
305+)
306+
307+if "%1" == "doctest" (
308+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
309+ if errorlevel 1 exit /b 1
310+ echo.
311+ echo.Testing of doctests in the sources finished, look at the ^
312+results in %BUILDDIR%/doctest/output.txt.
313+ goto end
314+)
315+
316+:end
317
318=== added directory 'doc/source'
319=== added directory 'doc/source/_static'
320=== added file 'doc/source/_static/percona_favicon.ico'
321Binary files doc/source/_static/percona_favicon.ico 1970-01-01 00:00:00 +0000 and doc/source/_static/percona_favicon.ico 2012-07-17 08:41:18 +0000 differ
322=== added directory 'doc/source/_templates'
323=== added file 'doc/source/advanced.rst'
324--- doc/source/advanced.rst 1970-01-01 00:00:00 +0000
325+++ doc/source/advanced.rst 2012-07-17 08:41:18 +0000
326@@ -0,0 +1,452 @@
327+Advanced Recovery Techniques
328+============================
329+
330+This page contains various script snippets and helpful techniques for recovering data from difficult cases.
331+
332+Finding Index IDs
333+
334+The following script will parse the output of the InnoDB table monitor, and print every table and the index ID of its PRIMARY index:
335+
336+find-index-id.sh ::
337+
338+ #!/bin/sh
339+ # Invoke this script with the name of the file containing the tablespace info
340+ awk '
341+ $1 == "TABLE:" {
342+ n = substr($3, 1, length($3) -1);
343+ }
344+ $1 == "INDEX:" && $3 ~ /PRIMARY|GEN_CLUST_INDEX/ {
345+ i = substr($3, 1, length($3) -1);
346+ printf "%-30s %-15s %d %d\n", n, i, $5, substr($6, 1, length($6) - 1);
347+ }' "$@"
348+
349+It often happens that you don't know the index for a given table when you recover data, perhaps because you are working from a raw device or a completely unbootable data file. There are several ways to find out which index ID contains the pages you are looking for.
350+
351+The simplest way is perhaps with grep. If there are VARCHARS or CHARS in the table and you know possible values, you can grep the whole tablespace to find your index id. If you find several different indexes that contain the string you are looking for, try different strings and see if you can narrow it down. Here is an example: ::
352+
353+ $ grep -r "XXX-yyyy-ZzZz" pages-1217332715/
354+ Binary file pages-1217332715/0-276/1116-00001116.page matches
355+ Binary file pages-1217332715/0-276/596-00000596.page matches
356+ Binary file pages-1217332715/0-276/715-00000715.page matches
357+ Binary file pages-1217332715/0-276/1119-00001119.page matches
358+ Binary file pages-1217332715/0-276/1237-00001237.page matches
359+ Binary file pages-1217332715/0-276/1101-00001101.page matches
360+ Binary file pages-1217332715/0-276/709-00000709.page matches
361+
362+If you are lucky, you'll find only one index ID by grepping a tablespace based on a known string. If not, then a longer string will probably give a better match. If you know there is a John Smith in the table, and that the first-name and last-name columns are stored adjacent to each other in that order, then you can try to grep for two strings concatenated together, e.g. grep -r JohnSmith pages-\*. This will work because there is no \0 after John in the row format; column values are not stored null-terminated.
363+
364+If you are you completely unaware what is in the table, or there are only numeric columns such as INT or DATE, it is more difficult to find matching pages, but still sometimes possible.
365+
366+If you have no strings to search for, but you know some numbers such as primary key values, you can use binary grep (bgrep) to find pages containing the values. Standard grep cannot match binary values, only string values. More information on this technique is in a `blog post <http://www.mysqlperformanceblog.com/2010/11/09/lost-innodb-tables-xfs-and-binary-grep/>`_ by Aurimas Mikalauskas, one of Percona's data recovery specialists.
367+
368+Another way is to compile the constraints_parser tool with the table definition you are looking for. Make sure you define only one table. Then run the script below. The idea is that if the page contains rows matching the table structure you are looking for, then constraints_parser will find some records.
369+
370+find-pages-with-rows.sh ::
371+
372+ #!/bin/sh
373+ # Execute this script with one argument: the directory containing your page files.
374+
375+ find "$@" -name '*.page' | while read file; do
376+ num_found=$(./constraints_parser -5 -f "$file" | wc -l)
377+ if [ $num_found -gt 0 ]
378+ then
379+ echo $num_found $file
380+ fi
381+ done
382+
383+Determining the Page Format
384+---------------------------
385+
386+If you don't know what format a page is in, the constraints_parser tool can tell you. Run the tool in verbose mode (-V), and if your guess was wrong, it will tell you:
387+
388+ * "Page is in COMPACT format while we're looking for REDUNDANT - skipping" or
389+ * "Page is in REDUNDANT format while we're looking for COMPACT - skipping"
390+
391+You can also run the following. It will output 0 for REDUNDANT pages (version 4), and 1 for COMPACT (version 5) pages. ::
392+
393+ dc -e "2o `hexdump --Cd /path/to/page/file | grep 00000020 | awk '{ print $12}'` p" | sed 's/./& /g' | awk '{ print $1}'
394+
395+
396+Recovering From a Raw Partition
397+-------------------------------
398+
399+The tools do not need to be used on files in a filesystem. If you unmount the filesystem and point the page_parser tool at the raw device, it can scan it just like a file, and split out the pages. It identifies pages by looking for the internal infimum and supremum records, so it is fairly good at finding pages, and is quite fast.
400+
401+Debugging Match Failures
402+------------------------
403+
404+If the constraints_parser tool finds nothing but you see your data in the files, it is useful to run it in verbose mode. Let's say you have found a string “abcd” in a page. Your table_defs.h is: ::
405+
406+
407+ { /* int(11) */
408+ name: "id",
409+ type: FT_INT,
410+ fixed_length: 4,
411+
412+ has_limits: TRUE,
413+ limits: {
414+ can_be_null: FALSE,
415+ int_min_val: 1,
416+ int_max_val: 100000
417+ },
418+ can_be_null: FALSE
419+ },
420+ { /* */
421+ name: "DB_TRX_ID",
422+ type: FT_INTERNAL,
423+ fixed_length: 6,
424+ can_be_null: FALSE
425+ },
426+ { /* */
427+ name: "DB_ROLL_PTR",
428+ type: FT_INTERNAL,
429+ fixed_length: 7,
430+ can_be_null: FALSE
431+ },
432+ { /* varchar(100) */
433+ name: "name",
434+ type: FT_CHAR,
435+ min_length: 0,
436+ max_length: 100,
437+ has_limits: TRUE,
438+ limits: {
439+ can_be_null: TRUE,
440+ char_min_len: 0,
441+ char_max_len: 100,
442+ char_ascii_only: TRUE
443+ },
444+ can_be_null: TRUE
445+ },
446+
447+Each row will contain 4+6+7 = 17 bytes before the “abcd” string (this is the size of the preceding columns in the row). The place where the row's data begins is called the ORIGIN. Find the origin in a hex editor, then look for the offset equal to the origin in the constraints_parser verbose output. This should help you see why your record isn't found.
448+
449+A Script for Recovering Many Tables
450+-----------------------------------
451+If there are many tables to recover, this script may help you. Execute it with the database name you want to recover.
452+
453+recover-tables.sh ::
454+
455+ #!/bin/sh
456+ db=$1
457+ tables=`mysql -ss -u root -e "SHOW TABLES" $db`
458+ for i in $tables
459+ do
460+ #Check how many rows has a table
461+ rows=`mysql -u root -e "SELECT COUNT(*) FROM $i" -s $db`
462+ if [ $rows -ne 0 ]
463+ then
464+ # Prepare environment
465+ echo "Restoring table $i"
466+ table=$i
467+ cd include && rm -f table_defs.h && ln -s table_defs.h.$table table_defs.h
468+ cd ..
469+ make clean all
470+ # Restoring rows
471+ found=0
472+ while [ $found -lt 1 ]
473+ do
474+ echo ""
475+ read -p "Enter the path to directory where data of table $i might be: " dir
476+ cat $dir/*.page > p
477+ ./constraints_parser -5 -f p >> out.$i
478+ found=`cat out.$i | wc -l`
479+ done
480+ fi
481+ done
482+
483+Recovering The Data Dictionary
484+------------------------------
485+
486+InnoDB's internal data dictionary is stored in system tables, which are tables like any other. If you cannot boot up InnoDB to find index IDs, then perhaps you can simply extract the data from the system tables and find the table names and index IDs you are looking for. There are two tables of interest:
487+
488+.. code-block:: mysql
489+
490+ SYS_INDEXES, with index ID 0-3, and the following table structure:
491+ CREATE TABLE `SYS_INDEXES` (
492+ `TABLE_ID` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
493+ `ID` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
494+ `NAME` varchar(120) DEFAULT NULL,
495+ `N_FIELDS` int(10) UNSIGNED DEFAULT NULL,
496+ `TYPE` int(10) UNSIGNED DEFAULT NULL,
497+ `SPACE` int(10) UNSIGNED DEFAULT NULL,
498+ `PAGE_NO` int(10) UNSIGNED DEFAULT NULL,
499+ PRIMARY KEY (`TABLE_ID`,`ID`)
500+ ) ENGINE=InnoDB DEFAULT CHARSET=latin1
501+ SYS_TABLES, with index ID 0-1, and the following table structure:
502+ CREATE TABLE `SYS_TABLES` (
503+ `NAME` varchar(255) NOT NULL DEFAULT '',
504+ `ID` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
505+ `N_COLS` int(10) UNSIGNED DEFAULT NULL,
506+ `TYPE` int(10) UNSIGNED DEFAULT NULL,
507+ `MIX_ID` bigint(20) UNSIGNED DEFAULT NULL,
508+ `MIX_LEN` int(10) UNSIGNED DEFAULT NULL,
509+ `CLUSTER_NAME` varchar(255) DEFAULT NULL,
510+ `SPACE` int(10) UNSIGNED DEFAULT NULL,
511+ PRIMARY KEY (`NAME`)
512+ ) ENGINE=InnoDB DEFAULT CHARSET=latin1
513+
514+Both tables are in REDUNDANT format. The following two code sections contain the table definitions for these system tables:
515+
516+sys_indexes_table_defs.h ::
517+
518+ #ifndef table_defs_h
519+ #define table_defs_h
520+ // Table definitions
521+ table_def_t table_definitions[] = {
522+ {
523+ name: "SYS_INDEXES",
524+ {
525+ { /* bigint(20) unsigned */
526+ name: "TABLE_ID",
527+ type: FT_UINT,
528+ fixed_length: 8,
529+ has_limits: TRUE,
530+ limits: {
531+ can_be_null: FALSE,
532+ uint_min_val: 0,
533+ uint_max_val: 18446744073709551615ULL
534+ },
535+ can_be_null: FALSE
536+ },
537+ { /* bigint(20) unsigned */
538+ name: "ID",
539+ type: FT_UINT,
540+ fixed_length: 8,
541+ has_limits: TRUE,
542+ limits: {
543+ can_be_null: FALSE,
544+ uint_min_val: 0,
545+ uint_max_val: 18446744073709551615ULL
546+ },
547+ can_be_null: FALSE
548+ },
549+ { /* */
550+ name: "DB_TRX_ID",
551+ type: FT_INTERNAL,
552+ fixed_length: 6,
553+ can_be_null: FALSE
554+ },
555+ { /* */
556+ name: "DB_ROLL_PTR",
557+ type: FT_INTERNAL,
558+ fixed_length: 7,
559+ can_be_null: FALSE
560+ },
561+ { /* varchar(120) */
562+ name: "NAME",
563+ type: FT_CHAR,
564+ min_length: 0,
565+ max_length: 120,
566+ has_limits: TRUE,
567+ limits: {
568+ can_be_null: TRUE,
569+ char_min_len: 0,
570+ char_max_len: 120,
571+ char_ascii_only: TRUE
572+ },
573+ can_be_null: TRUE
574+ },
575+ { /* int(10) unsigned */
576+ name: "N_FIELDS",
577+ type: FT_UINT,
578+ fixed_length: 4,
579+ can_be_null: TRUE
580+ },
581+ { /* int(10) unsigned */
582+ name: "TYPE",
583+ type: FT_UINT,
584+ fixed_length: 4,
585+ can_be_null: TRUE
586+ },
587+ { /* int(10) unsigned */
588+ name: "SPACE",
589+ type: FT_UINT,
590+ fixed_length: 4,
591+ can_be_null: TRUE
592+ },
593+ { /* int(10) unsigned */
594+ name: "PAGE_NO",
595+ type: FT_UINT,
596+ fixed_length: 4,
597+ can_be_null: TRUE
598+ },
599+ { type: FT_NONE }
600+ }
601+ },
602+ };
603+ #endif
604+
605+sys_tables_table_defs.h ::
606+
607+ #ifndef table_defs_h
608+ #define table_defs_h
609+ // Table definitions
610+ table_def_t table_definitions[] = {
611+ {
612+ name: "SYS_TABLES",
613+ {
614+ { /* varchar(255) */
615+ name: "NAME",
616+ type: FT_CHAR,
617+ min_length: 0,
618+ max_length: 255,
619+ has_limits: TRUE,
620+ limits: {
621+ can_be_null: FALSE,
622+ char_min_len: 0,
623+ char_max_len: 255,
624+ char_ascii_only: TRUE
625+ },
626+ can_be_null: FALSE
627+ },
628+ { /* */
629+ name: "DB_TRX_ID",
630+ type: FT_INTERNAL,
631+ fixed_length: 6,
632+ can_be_null: FALSE
633+ },
634+ { /* */
635+ name: "DB_ROLL_PTR",
636+ type: FT_INTERNAL,
637+ fixed_length: 7,
638+ can_be_null: FALSE
639+ },
640+ { /* bigint(20) unsigned */
641+ name: "ID",
642+ type: FT_UINT,
643+ fixed_length: 8,
644+ has_limits: TRUE,
645+ limits: {
646+ can_be_null: FALSE,
647+ uint_min_val: 0,
648+ uint_max_val: 18446744073709551615ULL
649+ },
650+ can_be_null: FALSE
651+ },
652+ { /* int(10) unsigned */
653+ name: "N_COLS",
654+ type: FT_UINT,
655+ fixed_length: 4,
656+ can_be_null: TRUE
657+ },
658+ { /* int(10) unsigned */
659+ name: "TYPE",
660+ type: FT_UINT,
661+ fixed_length: 4,
662+ can_be_null: TRUE
663+ },
664+ { /* bigint(20) unsigned */
665+ name: "MIX_ID",
666+ type: FT_UINT,
667+ fixed_length: 8,
668+ has_limits: TRUE,
669+ limits: {
670+ can_be_null: TRUE,
671+ uint_min_val: 0,
672+ uint_max_val: 18446744073709551615ULL
673+ },
674+ can_be_null: TRUE
675+ },
676+ { /* int(10) unsigned */
677+ name: "MIX_LEN",
678+ type: FT_UINT,
679+ fixed_length: 4,
680+ can_be_null: TRUE
681+ },
682+ { /* varchar(255) */
683+ name: "CLUSTER_NAME",
684+ type: FT_CHAR,
685+ min_length: 0,
686+ max_length: 255,
687+ has_limits: TRUE,
688+ limits: {
689+ can_be_null: TRUE,
690+ char_min_len: 0,
691+ char_max_len: 255,
692+ char_ascii_only: TRUE
693+ },
694+ can_be_null: TRUE
695+ },
696+ { /* int(10) unsigned */
697+ name: "SPACE",
698+ type: FT_UINT,
699+ fixed_length: 4,
700+ can_be_null: TRUE
701+ },
702+ { type: FT_NONE }
703+ }
704+ },
705+ };
706+ #endif
707+
708+Getting CREATE TABLE From .frm Files
709+------------------------------------
710+
711+If you don't have the CREATE TABLE definitions for the tables you're trying to recover, but you have the .frm files, it's possible to get the CREATE TABLE from them. Boot up a MySQL server (any server will do – preferably some sandbox or other non-production instance), and create an InnoDB table with the desired name. The structure does not matter at all. Shut down the server, and overwrite the .frm file in the data directory with the .frm file from the table you're trying to recover. Start MySQL again, and you should be able to run SHOW CREATE TABLE and get the definition from the .frm file.
712+
713+Recovering Data From Secondary Indexes
714+--------------------------------------
715+
716+Usually you need only the primary key to recover data. However, if there are other indexes in a table, and some of the primary key blocks are unrecoverable, then you can try to recover some data from them. An InnoDB page is the same format regardless of the index. The non-primary index pages contain tuples with the key columns, followed by the primary key columns. The index ID can be found in SYS_TABLES/SYS_INDEXES, or in the output of the tablespace monitor, as usual. All you have to do is to prepare the include/table_defs.h as usual, but with the index's columns instead of the primary key columns. Omit the special internal columns (DB_DRX_ID, DB_ROLL_PTR), but for tables with no primary key, use DB_ROW_ID as the primary key column.
717+
718+Here is an example. Given the following table,
719+
720+.. code-block:: mysql
721+
722+ CREATE TABLE `message_comments` (
723+ `id` int(11) NOT NULL AUTO_INCREMENT,
724+ `message_id` int(11) NOT NULL DEFAULT '0',
725+ `author_id` int(11) NOT NULL DEFAULT '0',
726+ `body` text,
727+ `created_at` datetime DEFAULT NULL,
728+ `updated_at` datetime DEFAULT NULL,
729+ `attachments_count` int(11) NOT NULL DEFAULT '0',
730+ PRIMARY KEY (`id`),
731+ KEY `index_message_comments_on_message_id_and_created_at` (`message_id`,`created_at`)
732+ ) ENGINE=InnoDB AUTO_INCREMENT=33133 DEFAULT CHARSET=latin1
733+
734+You need the following contents in include/table_defs.h: ::
735+
736+ #ifndef table_defs_h
737+ #define table_defs_h
738+ // Table definitions
739+ table_def_t table_definitions[] = {
740+ {
741+ name: "index_message_comments_on_message_id_and_created_at",
742+ {
743+ { /* int(11) */
744+ name: "message_id",
745+ type: FT_INT,
746+ fixed_length: 4,
747+ has_limits: TRUE,
748+ limits: {
749+ can_be_null: FALSE,
750+ int_min_val: -2147483648LL,
751+ int_max_val: 2147483647LL
752+ },
753+ can_be_null: FALSE
754+ },
755+ { /* datetime */
756+ name: "created_at",
757+ type: FT_DATETIME,
758+ fixed_length: 8,
759+ can_be_null: TRUE
760+ },
761+ { /* int(11) */
762+ name: "id",
763+ type: FT_INT,
764+ fixed_length: 4,
765+ has_limits: TRUE,
766+ limits: {
767+ can_be_null: FALSE,
768+ int_min_val: -2147483648LL,
769+ int_max_val: 2147483647LL
770+ },
771+ can_be_null: FALSE
772+ },
773+ { type: FT_NONE }
774+ }
775+ },
776+ };
777+ #endif
778+
779
780=== added file 'doc/source/conf.py'
781--- doc/source/conf.py 1970-01-01 00:00:00 +0000
782+++ doc/source/conf.py 2012-07-17 08:41:18 +0000
783@@ -0,0 +1,257 @@
784+# -*- coding: utf-8 -*-
785+#
786+# Data Recovery Tool for InnoDB Documentation documentation build configuration
787+# file, created by
788+# sphinx-quickstart on Fri Feb 24 15:56:27 2012.
789+#
790+# This file is execfile()d with the current directory set to its containing dir.
791+#
792+# Note that not all possible configuration values are present in this
793+# autogenerated file.
794+#
795+# All configuration values have a default; values that are commented out
796+# serve to show the default.
797+
798+import sys, os
799+
800+# If extensions (or modules to document with autodoc) are in another directory,
801+# add these directories to sys.path here. If the directory is relative to the
802+# documentation root, use os.path.abspath to make it absolute, like shown here.
803+#sys.path.insert(0, os.path.abspath('.'))
804+
805+sys.path.append(os.path.abspath('ext'))
806+
807+# -- General configuration -----------------------------------------------------
808+
809+# If your documentation needs a minimal Sphinx version, state it here.
810+#needs_sphinx = '1.0'
811+
812+# Add any Sphinx extension module names here, as strings. They can be extensions
813+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
814+
815+extensions = ['sphinx.ext.intersphinx', 'sphinx.ext.todo',
816+ 'sphinx.ext.coverage', 'sphinx.ext.ifconfig',
817+ 'sphinx.ext.extlinks', 'psdom']
818+
819+# Add any paths that contain templates here, relative to this directory.
820+templates_path = ['_templates']
821+
822+# The suffix of source filenames.
823+source_suffix = '.rst'
824+
825+# The encoding of source files.
826+#source_encoding = 'utf-8-sig'
827+
828+# The master toctree document.
829+master_doc = 'index'
830+
831+# General information about the project.
832+project = u'Percona Data Recovery Tool for InnoDB'
833+copyright = u'2009-2012, Percona Inc'
834+
835+# The version info for the project you're documenting, acts as replacement for
836+# |version| and |release|, also used in various other places throughout the
837+# built documents.
838+#
839+# The short X.Y version.
840+version = '0'
841+# The full version, including alpha/beta/rc tags.
842+release = '0.5'
843+
844+# The language for content autogenerated by Sphinx. Refer to documentation
845+# for a list of supported languages.
846+#language = None
847+
848+# There are two options for replacing |today|: either, you set today to some
849+# non-false value, then it is used:
850+#today = ''
851+# Else, today_fmt is used as the format for a strftime call.
852+#today_fmt = '%B %d, %Y'
853+
854+# List of patterns, relative to source directory, that match files and
855+# directories to ignore when looking for source files.
856+exclude_patterns = []
857+
858+# The reST default role (used for this markup: `text`) to use for all documents.
859+#default_role = None
860+
861+primary_domain = 'psdom'
862+
863+# If true, '()' will be appended to :func: etc. cross-reference text.
864+#add_function_parentheses = True
865+
866+# If true, the current module name will be prepended to all description
867+# unit titles (such as .. function::).
868+#add_module_names = True
869+
870+# If true, sectionauthor and moduleauthor directives will be shown in the
871+# output. They are ignored by default.
872+#show_authors = False
873+
874+# The name of the Pygments (syntax highlighting) style to use.
875+pygments_style = 'sphinx'
876+
877+
878+rst_prolog = '''
879+.. |check| replace:: ``|[[---CHECK---]]|``
880+
881+.. |xtrabackup| replace:: :program:`xtrabackup`
882+
883+.. |innobackupex| replace:: :program:`innobackupex`
884+
885+.. |XtraBackup| replace:: *XtraBackup*
886+
887+.. |Percona Server| replace:: *Percona Server*
888+
889+.. |Percona| replace:: *Percona*
890+
891+.. |MySQL| replace:: *MySQL*
892+
893+.. |Drizzle| replace:: *Drizzle*
894+
895+.. |MariaDB| replace:: *MariaDB*
896+
897+
898+'''
899+
900+extlinks = {'bug': ('https://bugs.launchpad.net/percona-data-recovery-tool-for-innodb/+bug/%s',
901+ '#')}
902+
903+# A list of ignored prefixes for module index sorting.
904+#modindex_common_prefix = []
905+
906+
907+# -- Options for HTML output ---------------------------------------------------
908+
909+# The theme to use for HTML and HTML Help pages. See the documentation for
910+# a list of builtin themes.
911+html_theme = 'percona-theme'
912+
913+# Theme options are theme-specific and customize the look and feel of a theme
914+# further. For a list of options available for each theme, see the
915+# documentation.
916+#html_theme_options = {}
917+
918+# Add any paths that contain custom themes here, relative to this directory.
919+html_theme_path = ['.', './percona-theme']
920+
921+# The name for this set of Sphinx documents. If None, it defaults to
922+# "<project> v<release> documentation".
923+html_title = 'Percona Data Recovery Tool for InnoDB Documentation'
924+
925+# A shorter title for the navigation bar. Default is the same as html_title.
926+html_short_title = 'Percona Data Recovery Tool for InnoDB Docs'
927+
928+# The name of an image file (relative to this directory) to place at the top
929+# of the sidebar.
930+
931+# The name of an image file (within the static path) to use as favicon of the
932+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
933+# pixels large.
934+html_favicon = 'percona_favicon.ico'
935+
936+# Add any paths that contain custom static files (such as style sheets) here,
937+# relative to this directory. They are copied after the builtin static files,
938+# so a file named "default.css" will overwrite the builtin "default.css".
939+html_static_path = ['_static']
940+
941+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
942+# using the given strftime format.
943+#html_last_updated_fmt = '%b %d, %Y'
944+
945+# If true, SmartyPants will be used to convert quotes and dashes to
946+# typographically correct entities.
947+#html_use_smartypants = True
948+
949+# Custom sidebar templates, maps document names to template names.
950+#html_sidebars = {}
951+
952+# Additional templates that should be rendered to pages, maps page names to
953+# template names.
954+#html_additional_pages = {}
955+
956+# If false, no module index is generated.
957+#html_domain_indices = True
958+
959+# If false, no index is generated.
960+#html_use_index = True
961+
962+# If true, the index is split into individual pages for each letter.
963+#html_split_index = False
964+
965+# If true, links to the reST sources are added to the pages.
966+#html_show_sourcelink = True
967+
968+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
969+#html_show_sphinx = True
970+
971+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
972+#html_show_copyright = True
973+
974+# If true, an OpenSearch description file will be output, and all pages will
975+# contain a <link> tag referring to it. The value of this option must be the
976+# base URL from which the finished HTML is served.
977+#html_use_opensearch = ''
978+
979+# This is the file name suffix for HTML files (e.g. ".xhtml").
980+#html_file_suffix = None
981+
982+# Output file base name for HTML help builder.
983+htmlhelp_basename = 'innodb_recovery'
984+
985+
986+# -- Options for LaTeX output --------------------------------------------------
987+
988+# The paper size ('letter' or 'a4').
989+#latex_paper_size = 'letter'
990+
991+# The font size ('10pt', '11pt' or '12pt').
992+#latex_font_size = '10pt'
993+
994+# Grouping the document tree into LaTeX files. List of tuples
995+# (source start file, target name, title, author, documentclass [howto/manual]).
996+latex_documents = [
997+ ('index', 'percona_innodb_recovery.tex', u'Percona Data Recovery Tool for InnoDB Documentation',
998+ u'Percona Inc', 'manual'),
999+]
1000+
1001+# The name of an image file (relative to this directory) to place at the top of
1002+# the title page.
1003+#latex_logo = None
1004+
1005+# For "manual" documents, if this is true, then toplevel headings are parts,
1006+# not chapters.
1007+#latex_use_parts = False
1008+
1009+# If true, show page references after internal links.
1010+#latex_show_pagerefs = False
1011+
1012+# If true, show URL addresses after external links.
1013+#latex_show_urls = False
1014+
1015+# Additional stuff for the LaTeX preamble.
1016+#latex_preamble = ''
1017+
1018+# Documents to append as an appendix to all manuals.
1019+#latex_appendices = []
1020+
1021+# If false, no module index is generated.
1022+#latex_domain_indices = True
1023+
1024+
1025+# -- Options for manual page output --------------------------------------------
1026+
1027+# One entry per manual page. List of tuples
1028+# (source start file, name, description, authors, manual section).
1029+man_pages = [
1030+ ('index', 'innodb_recovery', u'Percona Data Recovery Tool for InnoDB Documentation',
1031+ [u'Percona Inc'], 1)
1032+]
1033+
1034+# Example configuration for intersphinx: refer to the Python standard library.
1035+intersphinx_mapping = {
1036+ 'ps55' : ('http://www.percona.com/doc/percona-server/5.5/', None),
1037+ 'xtrabackup' : ('http://www.percona.com/doc/percona-xtrabackup', None),
1038+ 'ptoolkit' : ('http://www.percona.com/doc/percona-toolkit/2.0/', None)
1039+}
1040+
1041
1042=== added directory 'doc/source/ext'
1043=== added file 'doc/source/ext/psdom.py'
1044--- doc/source/ext/psdom.py 1970-01-01 00:00:00 +0000
1045+++ doc/source/ext/psdom.py 2012-07-17 08:41:18 +0000
1046@@ -0,0 +1,387 @@
1047+# -*- coding: utf-8 -*-
1048+"""
1049+ The Percona Server domain.
1050+
1051+ :copyright: Copyright 2011 by Percona Inc.
1052+ :license: GPL3, see LICENSE for details.
1053+"""
1054+
1055+import re
1056+import string
1057+
1058+from docutils import nodes
1059+from docutils.parsers.rst import directives
1060+
1061+from sphinx import addnodes
1062+from sphinx.roles import XRefRole
1063+from sphinx.locale import l_, _
1064+from sphinx.domains import Domain, ObjType, Index
1065+from sphinx.directives import ObjectDescription
1066+from sphinx.util.nodes import make_refnode
1067+from sphinx.util.compat import Directive
1068+from sphinx.util.docfields import Field, GroupedField, TypedField
1069+
1070+
1071+# RE to split at word boundaries
1072+wsplit_re = re.compile(r'\W+')
1073+tern_re = re.compile(r'.*(\.|\:\:).*(\.).*')
1074+
1075+class PSschemaObject(ObjectDescription):
1076+ """
1077+ Description of a general PS object.
1078+ """
1079+ option_spec = {
1080+ 'noindex': directives.flag,
1081+ }
1082+
1083+
1084+ def handle_signature(self, sig, signode):
1085+ """Transform a PSschema signature into RST nodes."""
1086+ # first try the function pointer signature regex, it's more specific
1087+
1088+ name = sig
1089+
1090+ signode += addnodes.desc_name('', '')
1091+
1092+ objectname = self.env.temp_data.get('psdom:object')
1093+ ot = self.objtype
1094+ ws = wsplit_re.split(sig)
1095+
1096+ if ot == 'db':
1097+ sig_prefix = "database "
1098+ else:
1099+ sig_prefix = ot + " "
1100+
1101+ signode += addnodes.desc_annotation(sig_prefix, sig_prefix)
1102+
1103+ # for part in filter(None, ws):
1104+ # tnode = nodes.Text(part, part)
1105+ # pnode = addnodes.pending_xref(
1106+ # '', refdomain='psdom', reftype='type', reftarget=part,
1107+ # modname=None, classname=None)
1108+ # pnode = tnode
1109+ # signode += pnode
1110+
1111+ if len(ws) > 2:
1112+ dbname, tablename, columnname = ws
1113+ name = columnname
1114+ fullname = tablename + "." + columnname
1115+ elif len(ws) == 2:
1116+ if ot == 'table':
1117+ dbname, tablename = ws
1118+ dbname += "."
1119+ name = tablename
1120+ signode['table'] = tablename
1121+ signode += addnodes.desc_addname(dbname, dbname)
1122+ signode += addnodes.desc_name(tablename, tablename)
1123+ # fullname = dbname + "." + tablename
1124+ fullname = tablename
1125+ if ot == 'column':
1126+ tablename, columnname = ws
1127+ tablename += " "
1128+ signode += addnodes.desc_addname(tablename, tablename)
1129+ signode += addnodes.desc_name(columnname, columnname)
1130+ signode['table'] = tablename
1131+ fullname = tablename + "." + columnname
1132+ else:
1133+ if ot == 'table':
1134+ tablename = ws[0]
1135+ signode['table'] = tablename
1136+ dbname = self.options.get(
1137+ 'db', self.env.temp_data.get('psdom:db'))
1138+ dbname += "."
1139+ self.env.temp_data['psdom:table'] = tablename
1140+ signode += addnodes.desc_addname(dbname, dbname)
1141+ signode += addnodes.desc_name(tablename, tablename)
1142+ signode['table'] = tablename
1143+ if ot == 'column':
1144+ columnname = ws[0]
1145+ signode['column'] = columnname
1146+ tablename = self.options.get(
1147+ 'table', self.env.temp_data.get('psdom:table'))
1148+ tablename += "."
1149+ signode += addnodes.desc_addname(tablename, tablename)
1150+ signode += addnodes.desc_name(columnname, columnname)
1151+ if ot == 'db':
1152+ dbname = ws[0]
1153+ signode['db'] = dbname
1154+ name = dbname
1155+ self.env.temp_data['psdom:db'] = dbname
1156+ signode += addnodes.desc_name(dbname, dbname)
1157+ fullname = ws[0]
1158+
1159+ signode['fullname'] = fullname
1160+
1161+ return fullname
1162+
1163+ def get_index_text(self, name):
1164+ if self.objtype == 'db':
1165+ return _('%s (database)') % name
1166+ elif self.objtype == 'table':
1167+ return _('%s (table)') % name
1168+ elif self.objtype == 'column':
1169+ return _('%s (column)') % name
1170+ else:
1171+ return ''
1172+
1173+ def add_target_and_index(self, name, sig, signode):
1174+ # note target
1175+ if name not in self.state.document.ids:
1176+ signode['names'].append(name)
1177+ signode['ids'].append(name)
1178+ signode['first'] = (not self.names)
1179+ self.state.document.note_explicit_target(signode)
1180+ inv = self.env.domaindata['psdom']['objects']
1181+ if name in inv:
1182+ self.env.warn(
1183+ self.env.docname,
1184+ 'duplicate PSschema object description of %s, ' % name +
1185+ 'other instance in ' + self.env.doc2path(inv[name][0]),
1186+ self.lineno)
1187+ inv[name] = (self.env.docname, self.objtype)
1188+
1189+ indextext = self.get_index_text(name)
1190+ if indextext:
1191+ self.indexnode['entries'].append(('single', indextext, name, ''))
1192+
1193+
1194+class PSconfigObject(ObjectDescription):
1195+ """
1196+ Description of a general PS Config object.
1197+ """
1198+ option_spec = {
1199+ 'noindex': directives.flag,
1200+ }
1201+
1202+ def handle_signature(self, sig, signode):
1203+ """Transform a PSconfig signature into RST nodes."""
1204+ # first try the function pointer signature regex, it's more specific
1205+
1206+ name = sig
1207+ ot = self.objtype
1208+
1209+ sig_prefix = ot + " "
1210+ signode += addnodes.desc_annotation(sig_prefix, sig_prefix)
1211+
1212+ signode += addnodes.desc_name(name, name)
1213+ signode['fullname'] = name
1214+
1215+ return name
1216+
1217+ def get_index_text(self, name):
1218+ if self.objtype == 'option':
1219+ return _('%s (option)') % name
1220+ elif self.objtype == 'variable':
1221+ return _('%s (variable)') % name
1222+ else:
1223+ return ''
1224+
1225+ def add_target_and_index(self, name, sig, signode):
1226+ # note target
1227+ if name not in self.state.document.ids:
1228+ signode['names'].append(name)
1229+ signode['ids'].append(name)
1230+ signode['first'] = (not self.names)
1231+ self.state.document.note_explicit_target(signode)
1232+ inv = self.env.domaindata['psdom']['objects']
1233+ if name in inv:
1234+ self.env.warn(
1235+ self.env.docname,
1236+ 'duplicate PSconfig object description of %s, ' % name +
1237+ 'other instance in ' + self.env.doc2path(inv[name][0]),
1238+ self.lineno)
1239+ inv[name] = (self.env.docname, self.objtype)
1240+
1241+ indextext = self.get_index_text(name)
1242+ if indextext:
1243+ self.indexnode['entries'].append(('single', indextext, name, ''))
1244+
1245+
1246+class PSTable(PSschemaObject):
1247+
1248+ doc_field_types = [
1249+ TypedField('column', label=l_('Columns'), rolename='obj',
1250+ names=('col', 'column', 'cols'),
1251+ typerolename='obj', typenames=('paramtype', 'type')),
1252+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
1253+ names=('inpatch')),
1254+ TypedField('versioninfo', label=l_('Version Info'), rolename='obj',
1255+ names=('version', 'versioninfo'),
1256+ typerolename='obj', typenames=('paramtype', 'type')),
1257+ ]
1258+
1259+class PSDatabase(PSschemaObject):
1260+
1261+ doc_field_types = [
1262+ TypedField('tbl', label=l_('Tables'),
1263+ names=('tbl', 'table',),
1264+ typerolename='obj', typenames=('paramtype', 'type')),
1265+ Field('engine', label=l_('Storage Engine'), has_arg=False,
1266+ names=('engine')),
1267+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
1268+ names=('inpatch')),
1269+ ]
1270+
1271+class PSColumn(PSschemaObject):
1272+
1273+ doc_field_types = [
1274+ TypedField('coltype', label=l_('Type'), rolename='obj',
1275+ names=('coltype', 'type'),
1276+ typerolename='obj', typenames=('paramtype', 'type')),
1277+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
1278+ names=('inpatch')),
1279+ ]
1280+
1281+class PSVariable(PSconfigObject):
1282+
1283+ doc_field_types = [
1284+ Field('scope', label=l_('Scope'), has_arg=False,
1285+ names=('scope', 'varscope')),
1286+ Field('cmdline', label=l_('Command Line'), has_arg=False,
1287+ names=('cmdline', 'cline', 'cli')),
1288+ Field('configfile', label=l_('Config File'), has_arg=False,
1289+ names=('conffile', 'configfile', 'conf', 'cfile')),
1290+ Field('dynamic', label=l_('Dynamic'), has_arg=False,
1291+ names=('dynvar', 'dyn')),
1292+ Field('vartype', label=l_('Variable Type'), has_arg=False,
1293+ names=('vartype', 'vtype')),
1294+ Field('default', label=l_('Default Value'), has_arg=False,
1295+ names=('default', 'df')),
1296+ Field('range', label=l_('Range'), has_arg=False,
1297+ names=('range', 'range')),
1298+ Field('allowed', label=l_('Allowed Values'), has_arg=False,
1299+ names=('allowed', 'av')),
1300+ Field('unit', label=l_('Units'), has_arg=False,
1301+ names=('unit', 'un')),
1302+ Field('inpatch', label=l_('Included in Patch'), has_arg=False,
1303+ names=('inpatch')),
1304+ TypedField('versioninfo', label=l_('Version Info'), rolename='obj',
1305+ names=('version', 'versioninfo'),
1306+ typerolename='obj', typenames=('paramtype', 'type')),
1307+ ]
1308+
1309+class PSOption(PSconfigObject):
1310+ pass
1311+
1312+class PSReleaseNotes(Directive):
1313+ """
1314+ Directive to mark description of Release Notes.
1315+ """
1316+
1317+ has_content = False
1318+ required_arguments = 1
1319+ optional_arguments = 0
1320+ final_argument_whitespace = False
1321+ option_spec = {
1322+ 'platform': lambda x: x,
1323+ 'noindex': directives.flag,
1324+ }
1325+
1326+ def run(self):
1327+ env = self.state.document.settings.env
1328+ rnname = self.arguments[0].strip()
1329+ noindex = 'noindex' in self.options
1330+ env.temp_data['psdome:rn'] = rnname
1331+ ret = []
1332+ if not noindex:
1333+ env.domaindata['psdom']['objects'][rnname] = \
1334+ (env.docname, self.options.get('platform', ''))
1335+ # make a duplicate entry in 'objects' to facilitate searching for the
1336+ # module in PythonDomain.find_obj()
1337+ env.domaindata['psdom']['objects'][rnname] = (env.docname, 'rn')
1338+ targetnode = nodes.target('', '', ids=['release-' + rnname])
1339+ self.state.document.note_explicit_target(targetnode)
1340+ # the platform and synopsis aren't printed; in fact, they are only used
1341+ # in the modindex currently
1342+ ret.append(targetnode)
1343+ indextext = _('%s (release notes)') % rnname
1344+ inode = addnodes.index(entries=[('single', indextext,
1345+ 'module-' + rnname, '')])
1346+ ret.append(inode)
1347+ return ret
1348+
1349+class PSXRefRole(XRefRole):
1350+ def process_link(self, env, refnode, has_explicit_title, title, target):
1351+ if not has_explicit_title:
1352+ target = target.lstrip('~') # only has a meaning for the title
1353+ # if the first character is a tilde, don't display the module/class
1354+ # parts of the contents
1355+ if title[0:1] == '~':
1356+ title = title[1:]
1357+ dot = title.rfind('.')
1358+ if dot != -1:
1359+ title = title[dot+1:]
1360+ return title, target
1361+
1362+
1363+class PerconaServerDomain(Domain):
1364+ """Percona Server domain."""
1365+ name = 'psdom'
1366+ label = 'Percona Server'
1367+ object_types = {
1368+ 'db': ObjType(l_('db'), 'db'),
1369+ 'table': ObjType(l_('table'), 'table'),
1370+ 'column': ObjType(l_('column'), 'column'),
1371+ 'option': ObjType(l_('option'), 'option'),
1372+ 'variable': ObjType(l_('variable'), 'data'),
1373+ }
1374+
1375+ directives = {
1376+ 'db': PSDatabase,
1377+ 'table': PSTable,
1378+ 'column': PSColumn,
1379+ 'option': PSVariable,
1380+ 'variable': PSVariable,
1381+ 'rn': PSReleaseNotes
1382+ }
1383+ roles = {
1384+ 'db' : PSXRefRole(),
1385+ 'table': PSXRefRole(),
1386+ 'column': PSXRefRole(),
1387+ 'option': PSXRefRole(),
1388+ 'variable': PSXRefRole(),
1389+ 'rn': PSXRefRole(),
1390+ }
1391+ initial_data = {
1392+ 'objects': {}, # fullname -> docname, objtype
1393+ }
1394+
1395+ def clear_doc(self, docname):
1396+ for fullname, (fn, _) in self.data['objects'].items():
1397+ if fn == docname:
1398+ del self.data['objects'][fullname]
1399+
1400+ def resolve_xref(self, env, fromdocname, builder,
1401+ typ, target, node, contnode):
1402+ # strip pointer asterisk
1403+ target = target.rstrip(' *')
1404+ if target not in self.data['objects']:
1405+ return None
1406+ obj = self.data['objects'][target]
1407+ return make_refnode(builder, fromdocname, obj[0], target,
1408+ contnode, target)
1409+
1410+ def get_objects(self):
1411+ for refname, (docname, type) in self.data['objects'].iteritems():
1412+ yield (refname, refname, type, docname, refname, 1)
1413+
1414+ def find_obj(self, env, obj, name, typ, searchorder=0):
1415+ if name[-2:] == '()':
1416+ name = name[:-2]
1417+ objects = self.data['objects']
1418+ newname = None
1419+ if searchorder == 1:
1420+ if obj and obj + '.' + name in objects:
1421+ newname = obj + '.' + name
1422+ else:
1423+ newname = name
1424+ else:
1425+ if name in objects:
1426+ newname = name
1427+ elif obj and obj + '.' + name in objects:
1428+ newname = obj + '.' + name
1429+ return newname, objects.get(newname)
1430+
1431+def setup(app):
1432+ app.add_config_value('databases', {}, 'env')
1433+ app.add_domain(PerconaServerDomain)
1434
1435=== added file 'doc/source/external.rst'
1436--- doc/source/external.rst 1970-01-01 00:00:00 +0000
1437+++ doc/source/external.rst 2012-07-17 08:41:18 +0000
1438@@ -0,0 +1,8 @@
1439+External Resources
1440+==================
1441+
1442+ * There is a three-part data recovery `screencast <http://www.percona.tv/mysql/innodb-recovery-tutorial>`_ on Percona.TV, Percona's companion site for technical videos, screencasts, and webinars.
1443+ * Chris Calendar has some `notes <http://www.chriscalender.com/?p=49>`_ on his data recovery experiences on his blog.
1444+ * Zarafa has created another InnoDB toolkit with data recovery capabilities, which might be more convenient for some cases, called `innoinfo <http://developer.zarafa.com/InnoInfo>`_.
1445+
1446+
1447
1448=== added file 'doc/source/index.rst'
1449--- doc/source/index.rst 1970-01-01 00:00:00 +0000
1450+++ doc/source/index.rst 2012-07-17 08:41:18 +0000
1451@@ -0,0 +1,54 @@
1452+============================================================
1453+ Percona Data Recovery Tool for InnoDB - Documentation
1454+============================================================
1455+
1456+Percona's Data Recovery tool for InnoDB is a set of tools that can help recover data from lost or corrupted MySQL tables. It works by extracting the rows from the raw files.
1457+
1458+There are no guarantees, especially in case of corruption that affects the row storage areas of the files (as opposed to the file headers and other meta-data). It is a tedious process that requires an understanding of InnoDB's internal data storage format, C programming, and quite a bit of intuition and experience. If you are having trouble using the tools, Percona provides InnoDB data recovery services with a team of skilled and experienced technicians, and is available 24 hours a day to assist you.
1459+
1460+
1461+Introduction
1462+============
1463+
1464+.. toctree::
1465+ :maxdepth: 1
1466+ :glob:
1467+
1468+ intro
1469+
1470+Installation
1471+============
1472+
1473+.. toctree::
1474+ :maxdepth: 1
1475+ :glob:
1476+
1477+ installation
1478+
1479+User's Manual
1480+=============
1481+
1482+.. toctree::
1483+ :maxdepth: 1
1484+ :glob:
1485+
1486+ manual
1487+ advanced
1488+
1489+Miscellaneous
1490+=============
1491+
1492+.. toctree::
1493+ :maxdepth: 1
1494+ :glob:
1495+
1496+ external
1497+ support
1498+
1499+Indices and tables
1500+==================
1501+
1502+* :ref:`genindex`
1503+* :ref:`modindex`
1504+* :ref:`search`
1505+
1506
1507=== added file 'doc/source/installation.rst'
1508--- doc/source/installation.rst 1970-01-01 00:00:00 +0000
1509+++ doc/source/installation.rst 2012-07-17 08:41:18 +0000
1510@@ -0,0 +1,13 @@
1511+=====================
1512+ Building the Tools
1513+=====================
1514+
1515+To build the tools, you will need a working build environment (C compiler, make, and so on). Download the source tarbarll from Launchpad, extract it, and change to the mysql-source directory. Run ./configure, but do not run make.
1516+
1517+After the configure step finishes, change to the top-level directory extracted from the tarball, and run make. This will compile the page_parser and the constraints_parser tool. We are not ready to use constraints_parser yet, and we will recompile it later, after creating table definitions. In the meantime it is useful to have the page_parser tool available to use.
1518+
1519+Internally, the tool uses some of InnoDB's low-level routines to work with pages and row structures. This is why a minimal version of the MySQL source code is included with the tool's source code. If you have any troubles compiling, it is likely that they are related to building the MySQL source code. If this is blocking your progress, you can obtain a copy of the MySQL source code from the MySQL website, and compile MySQL separately. Then you can copy the innobase/ut/libut.a file to the toolkit's build directory, and try running make again.
1520+
1521+On Linux, you may get a compilation error saying there is no isnumber() function in check_data.c. The problem is that isnumber() is a BSD standard, but the C standard defines the isdigit() function instead. Just change the name, and you should be able to compile successfully.
1522+
1523+If you'd like to build static versions of binaries, uncomment the CFLAGS=-static line in the Makefile. This can be useful to create portable binaries.
1524
1525=== added file 'doc/source/intro.rst'
1526--- doc/source/intro.rst 1970-01-01 00:00:00 +0000
1527+++ doc/source/intro.rst 2012-07-17 08:41:18 +0000
1528@@ -0,0 +1,25 @@
1529+===================
1530+MySQL Data Recovery
1531+===================
1532+
1533+.. toctree::
1534+ :hidden:
1535+
1536+This document will show an example of how to perform data recovery on a single InnoDB table. Before we begin, let us define the scope and purpose of these tools:
1537+
1538+ * The tools work only for InnoDB/XtraDB tables, and will not work with MyISAM tables. Percona does have a preliminary set of tools for MyISAM data recovery; contact us if you need help with MyISAM data recovery.
1539+ * The tools work on a saved copy of your data files, not on the running MySQL server.
1540+ * There is no guarantee. Even with these tools, data is sometimes unrecoverable. For example, data that is overwritten cannot be recovered with these tools. There may be file system specific or physical means to recover overwritten data. This is outside the scope of this project.
1541+ * Time is of the essence. The best chance for recovery comes when you act immediately to save a copy of your raw data files as soon as you discover the loss or corruption.
1542+ * There is manual work to do. Not everything is automatic.
1543+ * Recovery depends on knowing your data. As part of the process you may have to choose between two versions of your data. The better you know your data, the better the chance you'll be able to recover it.
1544+
1545+
1546+You can reverse several types of data loss with these tools, including:
1547+
1548+ * A mistaken DROP TABLE, DELETE, TRUNCATE, or UPDATE
1549+ * Deletion of the data file on the filesystem level
1550+ * Partial corruption of the data such that InnoDB is unable to run without crashing, even with innodb_force_recovery set
1551+
1552+The following pages explain how to use the tools to accomplish this. Remember, if you have difficulty, Percona offers MySQL `data recovery services <http://www.percona.com/mysql-consulting/data-recovery/>`_ 24 hours a day.
1553+
1554
1555=== added file 'doc/source/manual.rst'
1556--- doc/source/manual.rst 1970-01-01 00:00:00 +0000
1557+++ doc/source/manual.rst 2012-07-17 08:41:18 +0000
1558@@ -0,0 +1,590 @@
1559+.. _user-manual:
1560+
1561+================================
1562+Data Recovery Tool User's Manual
1563+================================
1564+
1565+.. toctree::
1566+ :maxdepth: 1
1567+ :hidden:
1568+
1569+Prerequisites
1570+=============
1571+
1572+It is important to understand that these tools are not designed for connecting to a live database and recovering data from it. They work on an offline copy of the data, and it is not safe to use them on a copy that is in use by MySQL. When you discover data loss or corruption, you should make it a priority to stop any further writing to the data files (or, if the data files have been lost, the disks themselves), and make a copy of the files to perform the recovery work on. You can do this by stopping MySQL and copying the files, or taking a filesystem snapshot with your SAN or LVM or similar. Do not copy the InnoDB files while MySQL is running; this is not safe.
1573+
1574+In order to accomplish the data recovery, you will need the column names and data types in the tables to be recovered. The easiest way to obtain this is through SHOW CREATE TABLE, although we will show several alternatives later. It is handy to have a working MySQL server with a backup of your database, even if it is quite old or the tables are empty, to help expedite the process. It is not necessary, though.
1575+
1576+Example Data Loss Scenario
1577+==========================
1578+
1579+In this manual, we will show many examples based on the following data loss scenario. If you wish to follow along with the examples, you can create your own “sample data loss” too:
1580+
1581+Configure your server with innodb_file_per_table=0.
1582+Download and install the Sakila sample database from `here <http://dev.mysql.com/doc/sakila/en/sakila.html>`_.
1583+
1584+Execute the following commands:
1585+
1586+.. code-block:: mysql
1587+
1588+ mysql> SET foreign_key_checks=0; TRUNCATE TABLE customer;
1589+
1590+Here is a sample of the data in the table, which we will be seeing again in the future:
1591+
1592+.. code-block:: mysql
1593+
1594+ mysql> SELECT * FROM customer LIMIT 6;
1595+ +-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+
1596+ | customer_id | store_id | first_name | last_name | email | address_id | active | create_date | last_update |
1597+ +-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+
1598+ | 1 | 1 | MARY | SMITH | MARY.SMITH@sakilacustomer.org | 5 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
1599+ | 2 | 1 | PATRICIA | JOHNSON | PATRICIA.JOHNSON@sakilacustomer.org | 6 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
1600+ | 3 | 1 | LINDA | WILLIAMS | LINDA.WILLIAMS@sakilacustomer.org | 7 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
1601+ | 4 | 2 | BARBARA | JONES | BARBARA.JONES@sakilacustomer.org | 8 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
1602+ | 5 | 1 | ELIZABETH | BROWN | ELIZABETH.BROWN@sakilacustomer.org | 9 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
1603+ | 6 | 2 | JENNIFER | DAVIS | JENNIFER.DAVIS@sakilacustomer.org | 10 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
1604+ +-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+
1605+
1606+Extracting the Desired Pages
1607+============================
1608+
1609+The tools work by trying to find valid rows in pages. InnoDB's pages are 16k in size by default, and each page belongs to a specific index in a specific table. It can save a lot of time and work to determine which pages belong to which tables and indexes, and only try to extract rows from the pages that interest you and whose row format should match the index you're trying to recover. It will do you no good to try to extract an index's data from pages that don't belong to that index. You can get a lot of confusing false positives, and the tools can be much slower due to checking and re-checking pages for row matches for every possible table.
1610+
1611+To accomplish the task of separating the pages out, the toolkit contains a tool called page_parser. This tool reads a file and copies each page into a separate file in a subdirectory according to the index ID in the page header.
1612+
1613+If your server is configured with innodb_file_per_table=1, then the work is probably done for you already. The pages of interest are all in the .ibd file, and you do not need to split it out in most cases. However, even that .ibd file potentially contains multiple indexes, so it can still be beneficial to split the pages out separately. If the server is not configured with innodb_file_per_table, then the data is stored in the global tablespace (usually in a file called ibdata1), and it is usually a good idea to split the file up into its component pages.
1614+
1615+
1616+Splitting The Pages Apart
1617+-------------------------
1618+
1619+To separate the pages, execute page_parser. The following snippet shows a sample of the tool's usage. If the data is in InnoDB's old REDUNDANT format (pre-MySQL-5.0), then you need to give the -4 argument instead of -5, which is for MySQL 5.0's COMPACT format. ::
1620+
1621+ page_parser -5 -f /path/to/ibdata1
1622+ [snip]
1623+ Read page #494.. saving it to pages-1246363747/0-97/494-00000494.page
1624+ Read page #495.. saving it to pages-1246363747/0-97/495-00000495.page
1625+ Read page #496.. saving it to pages-1246363747/0-97/496-00000496.page
1626+ Read page #497.. saving it to pages-1246363747/0-97/497-00000497.page
1627+ Read page #498.. saving it to pages-1246363747/0-97/498-00000498.page
1628+ Read page #499.. saving it to pages-1246363747/0-96/499-00000499.page
1629+ [snip]
1630+
1631+The tool prints one line per page to standard output, and occasionally it prints a progress indicator to standard error.
1632+
1633+The page_parser tool creates a directory called pages-<TIMESTAMP>, with the current Unix timestamp as the last part of the name. Within this directory, it creates one directory for every index ID it finds in the data file's pages. These subdirectories are named after the page's index ID, in high-low format (InnoDB's index IDs are 64-bit integers composed of a high 32 bits and a low 32 bits). Within the index subdirectory, the pages are numbered by an incrementing integer, and the page's internal ID number. For example: ::
1634+
1635+ pages-1301110359/0-52/
1636+ pages-1301110359/0-52/216-00000216.page
1637+ pages-1301110359/0-52/70-00000216.page
1638+
1639+The file 70-00000216.page was read before the file 216-00000216.page; this physical ordering can be important to preserve.
1640+
1641+
1642+Determining the Desired Index ID
1643+--------------------------------
1644+
1645+Now that we have split the pages into separate subdirectories, we need to determine which index holds the data we are interested in recovering. In most cases, we want to recover from the table's PRIMARY index, which contains the full rows. There are several ways to accomplish this.
1646+
1647+If the database server is still running, and the table has not been dropped, you can start the InnoDB Tablespace Monitor and let it write out all of the tables and indexes, and their index IDs, to the server's error log file. You can do that by creating a magically named table:
1648+
1649+.. code-block:: mysql
1650+
1651+ mysql> CREATE TABLE innodb_table_monitor (id int) ENGINE=InnoDB;
1652+
1653+If the table already exists, DROP it, then CREATE it again. Wait for up to a minute, then look at the MySQL error log for output. Once the output comes, you can drop the special table to stop the tablespace monitor from printing more output. A summary of the output follows: ::
1654+
1655+ TABLE: name sakila/customer, id 0 142, columns 13, indexes 4, appr.rows 0
1656+ COLUMNS: customer_id: DATA_INT len 2 prec 0; store_id: DATA_INT len 1 prec 0; first_name: type 12 len 135 prec 0; last_name: type 12 len 135 prec 0; email:
1657+ type 12 len 150 prec 0; address_id: DATA_INT len 2 prec 0; active: DATA_INT len 1 prec 0; create_date: DATA_INT len 8 prec 0; last_update: DATA_INT len 4 pr
1658+ ec 0; DB_ROW_ID: DATA_SYS prtype 256 len 6 prec 0; DB_TRX_ID: DATA_SYS prtype 257 len 6 prec 0; DB_ROLL_PTR: DATA_SYS prtype 258 len 7 prec 0;
1659+ INDEX: name PRIMARY, id 0 286, fields 1/11, type 3
1660+ root page 50, appr.key vals 0, leaf pages 1, size pages 1
1661+ FIELDS: customer_id DB_TRX_ID DB_ROLL_PTR store_id first_name last_name email address_id active create_date last_update
1662+ INDEX: name idx_fk_store_id, id 0 287, fields 1/2, type 0
1663+ root page 56, appr.key vals 0, leaf pages 1, size pages 1
1664+ FIELDS: store_id customer_id
1665+ INDEX: name idx_fk_address_id, id 0 288, fields 1/2, type 0
1666+ root page 63, appr.key vals 0, leaf pages 1, size pages 1
1667+ FIELDS: address_id customer_id
1668+ INDEX: name idx_last_name, id 0 289, fields 1/2, type 0
1669+ root page 1493, appr.key vals 0, leaf pages 1, size pages 1
1670+ FIELDS: last_name customer_id
1671+
1672+For our recovery example, we're looking for the sakila/customer table's PRIMARY KEY details: INDEX: name PRIMARY, id 0 286, fields 1/11, type 3. The index ID is 0 286. This tells us that the pages we need are in the 0-286 subdirectory.
1673+
1674+
1675+Generating a Table Definition
1676+=============================
1677+
1678+Now that we know which pages contain our desired data, we need to find out the table's structure, create a table definition, compile it into the constraints_parser tool, and use that tool to extract the rows from the pages.
1679+
1680+The table definintion includes the columns, column order, and data types. If the server is still running and the table has not been dropped, then we can use SHOW CREATE TABLE to gather this information. We will use this to create the table definition as a C struct that we will compile into the constraints_parser tool, which will extract the rows from the pages. The C struct is placed into the file include/table_defs.h.
1681+
1682+If possible, the easiest way to create the table definition is with the create_defs.pl Perl script. It connects to the MySQL server and reads SHOW CREATE TABLE output, and prints the generated definition to its standard output. Here is an example: ::
1683+
1684+ $ ./create_defs.pl --host=localhost --user=root --password=s3cret \
1685+ --db=sakila --table=customer > include/table_defs.h
1686+
1687+In our example, the table structure we're working with is as follows:
1688+
1689+.. code-block:: mysql
1690+
1691+ CREATE TABLE `customer` (
1692+ `customer_id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
1693+ `store_id` tinyint(3) UNSIGNED NOT NULL,
1694+ `first_name` varchar(45) NOT NULL,
1695+ `last_name` varchar(45) NOT NULL,
1696+ `email` varchar(50) DEFAULT NULL,
1697+ `address_id` smallint(5) UNSIGNED NOT NULL,
1698+ `active` tinyint(1) NOT NULL DEFAULT '1',
1699+ `create_date` datetime NOT NULL,
1700+ `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
1701+ PRIMARY KEY (`customer_id`),
1702+ KEY `idx_fk_store_id` (`store_id`),
1703+ KEY `idx_fk_address_id` (`address_id`),
1704+ KEY `idx_last_name` (`last_name`),
1705+ CONSTRAINT `fk_customer_address` FOREIGN KEY (`address_id`) REFERENCES `address` (`address_id`) ON UPDATE CASCADE,
1706+ CONSTRAINT `fk_customer_store` FOREIGN KEY (`store_id`) REFERENCES `store` (`store_id`) ON UPDATE CASCADE
1707+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8
1708+
1709+Here is the generated table definition that results. ::
1710+
1711+ #ifndef table_defs_h
1712+ #define table_defs_h
1713+ // Table definitions
1714+ table_def_t table_definitions[] = {
1715+ {
1716+ name: "customer",
1717+ {
1718+ { /* smallint(5) unsigned */
1719+ name: "customer_id",
1720+ type: FT_UINT,
1721+ fixed_length: 2,
1722+ has_limits: TRUE,
1723+ limits: {
1724+ can_be_null: FALSE,
1725+ uint_min_val: 0,
1726+ uint_max_val: 65535
1727+ },
1728+ can_be_null: FALSE
1729+ },
1730+ { /* Innodb's internally used field */
1731+ name: "DB_TRX_ID",
1732+ type: FT_INTERNAL,
1733+ fixed_length: 6,
1734+ can_be_null: FALSE
1735+ },
1736+ { /* Innodb's internally used field */
1737+ name: "DB_ROLL_PTR",
1738+ type: FT_INTERNAL,
1739+ fixed_length: 7,
1740+ can_be_null: FALSE
1741+ },
1742+ { /* tinyint(3) unsigned */
1743+ name: "store_id",
1744+ type: FT_UINT,
1745+ fixed_length: 1,
1746+ has_limits: TRUE,
1747+ limits: {
1748+ can_be_null: FALSE,
1749+ uint_min_val: 0,
1750+ uint_max_val: 255
1751+ },
1752+ can_be_null: FALSE
1753+ },
1754+ { /* varchar(45) */
1755+ name: "first_name",
1756+ type: FT_CHAR,
1757+ min_length: 0,
1758+ max_length: 45,
1759+ has_limits: TRUE,
1760+ limits: {
1761+ can_be_null: FALSE,
1762+ char_min_len: 0,
1763+ char_max_len: 45,
1764+ char_ascii_only: TRUE
1765+ },
1766+ can_be_null: FALSE
1767+ },
1768+ { /* varchar(45) */
1769+ name: "last_name",
1770+ type: FT_CHAR,
1771+ min_length: 0,
1772+ max_length: 45,
1773+ has_limits: TRUE,
1774+ limits: {
1775+ can_be_null: FALSE,
1776+ char_min_len: 0,
1777+ char_max_len: 45,
1778+ char_ascii_only: TRUE
1779+ },
1780+ can_be_null: FALSE
1781+ },
1782+ { /* varchar(50) */
1783+ name: "email",
1784+ type: FT_CHAR,
1785+ min_length: 0,
1786+ max_length: 50,
1787+ has_limits: TRUE,
1788+ limits: {
1789+ can_be_null: TRUE,
1790+ char_min_len: 0,
1791+ char_max_len: 50,
1792+ char_ascii_only: TRUE
1793+ },
1794+ can_be_null: TRUE
1795+ },
1796+ { /* smallint(5) unsigned */
1797+ name: "address_id",
1798+ type: FT_UINT,
1799+ fixed_length: 2,
1800+ has_limits: TRUE,
1801+ limits: {
1802+ can_be_null: FALSE,
1803+ uint_min_val: 0,
1804+ uint_max_val: 65535
1805+ },
1806+ can_be_null: FALSE
1807+ },
1808+ { /* tinyint(1) */
1809+ name: "active",
1810+ type: FT_INT,
1811+ fixed_length: 1,
1812+ can_be_null: FALSE
1813+ },
1814+ { /* datetime */
1815+ name: "create_date",
1816+ type: FT_DATETIME,
1817+ fixed_length: 8,
1818+ can_be_null: FALSE
1819+ },
1820+ { /* timestamp */
1821+ name: "last_update",
1822+ type: FT_UINT,
1823+ fixed_length: 4,
1824+ can_be_null: FALSE
1825+ },
1826+ { type: FT_NONE }
1827+ }
1828+ },
1829+ };
1830+ #endif
1831+
1832+There are a couple of special internal InnoDB columns in the definition. These are required for the tool to recognize the rows:
1833+
1834+ * **DB_TRX_ID**: This column contains the ID of the last transaction to write this record.
1835+ * **DB_ROLL_PTR**: This column contains a pointer to an undo log record where a previous version of the row is stored.
1836+ * **DB_ROW_ID**: This should be the first field in tables without primary keys. Such tables have a special invisible primary key called GEN_CLUST_INDEX, and this is the 6-byte auto-increment column contained in that primary key. Note that tables without an explicit primary key might not be built on a GEN_CLUST_INDEX index; if there is a non-nullable unique index in the table, InnoDB will choose that as its primary key in the absence of a primary key, and only create a GEN_CLUST_INDEX if there is nothing else suitable.
1837+
1838+Rebuilding The Constraints Parser
1839+---------------------------------
1840+
1841+You might need to edit the include/table_defs.h file later, to fine-tune constraints on the data you are trying to recover. In the meantime, you need to rebuild the tool with make, so it is aware of your table definition. ::
1842+
1843+ $ make
1844+ gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -g -I include -I mysql-source/include -I mysql-source/innobase/include -c tables_dict.c -o lib/tables_dict.o
1845+ gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -g -I include -I mysql-source/include -I mysql-source/innobase/include -o constraints_parser constraints_parser.c lib/tables_dict.o lib/print_data.o lib/check_data.o lib/libut.a lib/libmystrings.a
1846+ gcc -DHAVE_OFFSET64_T -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -D_LARGEFILE_SOURCE=1 -g -I include -I mysql-source/include -I mysql-source/innobase/include -o page_parser page_parser.c lib/tables_dict.o lib/libut.a
1847+
1848+The tool is now ready to use.
1849+
1850+Extracting Rows From The Pages
1851+==============================
1852+
1853+The constraints_parser tool works by scanning the data file one byte at a time, and checking every offset with check_for_a_record() to see if it looks like the beginning of a row. This checks the row's origin, and the field sizes and so forth. These definitions are set in the include/table_defs.h file.
1854+
1855+If the data at the current position appears to be a valid row, then the tool applies check_constraints(), which is a kind of WHERE clause, to the row and determines whether to accept it. This is specified in each column's limits section in include/table_defs.h. We will look more at this later.
1856+
1857+Concatenating Pages Into a Single File
1858+--------------------------------------
1859+
1860+If your server doesn't use innodb_file_per_table, then before you run the tool, you need to determine which index ID contains our data, as we've seen previously. In our example, we needed index ID 0 286, and the pages containing our data are in the pages-1246363747/0-286/ directory. ::
1861+
1862+ total 120
1863+ -rw-r--r-- 1 root root 16384 Jun 30 05:09 1254-00001254.page
1864+ -rw-r--r-- 1 root root 16384 Jun 30 05:09 1255-00001255.page
1865+ -rw-r--r-- 1 root root 16384 Jun 30 05:09 1256-00001256.page
1866+ -rw-r--r-- 1 root root 16384 Jun 30 05:09 1257-00001257.page
1867+ -rw-r--r-- 1 root root 16384 Jun 30 05:09 50-00000050.page
1868+ -rw-r--r-- 1 root root 16384 Jun 30 05:09 74-00000050.page
1869+
1870+It is possible to run the tool against individual pages, and in fact that is helpful initially to ensure that your table definition is tuned optimally. When you are satisfied with the table definition, it is more useful to run it against all of the pages concatenated in physical order. You can create such a file with the cat command: ::
1871+
1872+ $ find pages-1246363747/0-286/ -type f -name '*.page' | sort -n \
1873+ | xargs cat > pages-1246363747/0-286/customer_pages_concatenated
1874+
1875+The resulting file, pages-1246363747/0-286/customer_pages_concatenated, is what we will use as input to the constraints_parser tool. If you use innodb_file_per_table, you can use the table's .ibd file instead.
1876+
1877+Running the constraints_parser Tool
1878+
1879+The core step in recovering data is to run the constraints_parser tool against the data and extract the rows. As with the page_parser tool, you must specify the page format (COMPACT or REDUNDANT), and the -f option specifies the input file. The tool prints tab-separated, quote-delimited values to standard output.
1880+
1881+Returning to our running example, we can execute the tool as follows (for this initial run, we are looking only at a single page, not the file containing all the pages concatenated together): ::
1882+
1883+ $ ./constraints_parser -5 -f pages-1246363747/0-286/50-00000050.page
1884+
1885+The output is lengthy, so we abbreviate here for demonstration purposes. Some of the output seems correct; some is obviously garbage; and some requires knowledge of the data to assess. We will see in the next section how to tune the table definition so that the tool outputs as much valid data as possible and filters out the garbage.
1886+
1887+The output columns are the table name, and the columns in the table. ::
1888+
1889+ customer 0 120 "" "" "" 32770 0 "0000-00-00 00:12:80" 0
1890+ customer 0 0 "" "" "" 0 0 "9120-22-48 29:44:00" 2
1891+ customer 61953 0 "" "" "" 2816 0 "7952-32-67 11:43:49" 0
1892+ customer 0 0 "" "" "" 0 0 "0000-00-00 00:00:00" 0
1893+ ... snip ...
1894+ customer 0 0 "" "" "" 0 0 "0000-00-00 00:00:00" 16777728
1895+ customer 28262 114 "" "" NULL 25965 117 "4603-91-96 76:21:28" 5111809
1896+ customer 0 82 "" "" "" 22867 77 "2775-94-58 03:19:18" 1397573972
1897+ customer 2 1 "PATRICIA" "JOHNSON" "PATRICIA.JOHNSON@sakilacustomer.org" 6 1 "2006-02-14 22:04:36" 1140008240
1898+ customer 3 1 "LINDA" "WILLIAMS" "LINDA.WILLIAMS@sakilacustomer.org" 7 1 "2006-02-14 22:04:36" 1140008240
1899+ customer 4 2 "BARBARA" "JONES" "BARBARA.JONES@sakilacustomer.org" 8 1 "2006-02-14 22:04:36" 1140008240
1900+ customer 5 1 "ELIZABETH" "BROWN" "ELIZABETH.BROWN@sakilacustomer.org" 9 1 "2006-02-14 22:04:36" 1140008240
1901+ customer 6 2 "JENNIFER" "DAVIS" "JENNIFER.DAVIS@sakilacustomer.org" 10 1 "2006-02-14 22:04:36" 1140008240
1902+ customer 7 1 "MARIA" "MILLER" "MARIA.MILLER@sakilacustomer.org" 11 1 "2006-02-14 22:04:36" 1140008240
1903+ customer 8 2 "SUSAN" "WILSON" "SUSAN.WILSON@sakilacustomer.org" 12 1 "2006-02-14 22:04:36" 1140008240
1904+ customer 9 2 "MARGARET" "MOORE" "MARGARET.MOORE@sakilacustomer.org" 13 1 "2006-02-14 22:04:36" 1140008240
1905+ ... snip ...
1906+ customer 0 0 "" "" "" 0 0 "0000-00-00 00:00:00" 0
1907+ customer 0 0 "" "" "" 0 0 "7679-35-98 86:44:53" 720578985
1908+
1909+Fine Tuning The Table Definition
1910+================================
1911+
1912+The table definition in the C struct contained in include/table_def.h can be tuned to not only specify the correct structure and data types in the table, but also to specify constraints on the column values. This can help the tool reject invalid data and give better results.
1913+
1914+Recognizing invalid data is not simply a matter of filtering out bad rows and cutting down on noise. If the tool believes that a row begins at a certain spot, it will accept a range of data as a row, and will not begin searching for the start of a new row until after the end of the range – it will advance the current position by the size of the row it found. Therefore, if it thinks it finds a row in a place where there is none, and a real row's origin lies within the range, the tool will not find the real row. For that reason, tuning the table definition is an important part of finding valid data, not simply filtering out false positives. Finding a bad row usually means failing to find a good row.
1915+
1916+It can be extremely helpful to run constraints_parser in verbose mode, with the -V command-line option, to inspect the process of checking data to see if it appears to be a row, and why or why not. The output is very verbose, so you will generally want to do this only on a single page, not on a large file.
1917+
1918+In our ongoing example, the tool printed out some rows whose customer_id is 0, some with empty first names, and so on. We know that this is not correct. All customers have positive integer customer_id columns, and all of them have non-empty names. To instruct the tool to reject rows unless they meet these criteria, we can change the limits clause in the table definitions header. First, we specify that customer_id must be greater than zero: ::
1919+
1920+ { /* smallint(5) unsigned */
1921+ name: "customer_id",
1922+ type: FT_UINT,
1923+ fixed_length: 2,
1924+ has_limits: TRUE,
1925+ limits: {
1926+ can_be_null: FALSE,
1927+ - uint_min_val: 0,
1928+ + uint_min_val: 1,
1929+ uint_max_val: 65535
1930+ },
1931+
1932+ can_be_null: FALSE
1933+ },
1934+
1935+Next, we specify that first_name must be at least one character long. This might still be too relaxed; is there really a customer whose first name is a single letter? The better you know your data, the more precisely you will be able to specify the constraints. In reality the minimum length in the column is 2, and the maximum is 11, even though the column is defined as VARCHAR(45). Setting the maximum length would be a good idea, if we knew it. For now, we will simply forbid empty first names: ::
1936+
1937+ { /* varchar(45) */
1938+ name: "first_name",
1939+ type: FT_CHAR,
1940+ min_length: 0,
1941+ max_length: 45,
1942+ has_limits: TRUE,
1943+ limits: {
1944+ can_be_null: FALSE,
1945+ - char_min_len: 0,
1946+ + char_min_len: 1,
1947+ char_max_len: 45,
1948+ char_ascii_only: TRUE
1949+ },
1950+
1951+ can_be_null: FALSE
1952+ },
1953+
1954+After making this change, you should rebuild and run the constraints_parser tool again. This time the output looks much better: ::
1955+
1956+ $ ./constraints_parser -5 -f pages-1246363747/0-286/50-00000050.page
1957+ customer 1 1 "MARY" "SMITH" "MARY.SMITH@sakilacustomer.org" 5 1 "2006-02-14 22:04:36" 1140008240
1958+ customer 2 1 "PATRICIA" "JOHNSON" "PATRICIA.JOHNSON@sakilacustomer.org" 6 1 "2006-02-14 22:04:36" 1140008240
1959+ customer 3 1 "LINDA" "WILLIAMS" "LINDA.WILLIAMS@sakilacustomer.org" 7 1 "2006-02-14 22:04:36" 1140008240
1960+ customer 4 2 "BARBARA" "JONES" "BARBARA.JONES@sakilacustomer.org" 8 1 "2006-02-14 22:04:36" 1140008240
1961+ customer 5 1 "ELIZABETH" "BROWN" "ELIZABETH.BROWN@sakilacustomer.org" 9 1 "2006-02-14 22:04:36" 1140008240
1962+ customer 6 2 "JENNIFER" "DAVIS" "JENNIFER.DAVIS@sakilacustomer.org" 10 1 "2006-02-14 22:04:36" 1140008240
1963+ customer 7 1 "MARIA" "MILLER" "MARIA.MILLER@sakilacustomer.org" 11 1 "2006-02-14 22:04:36" 1140008240
1964+ customer 8 2 "SUSAN" "WILSON" "SUSAN.WILSON@sakilacustomer.org" 12 1 "2006-02-14 22:04:36" 1140008240
1965+ customer 9 2 "MARGARET" "MOORE" "MARGARET.MOORE@sakilacustomer.org" 13 1 "2006-02-14 22:04:36" 1140008240
1966+ customer 10 1 "DOROTHY" "TAYLOR" "DOROTHY.TAYLOR@sakilacustomer.org" 14 1 "2006-02-14 22:04:36" 1140008240
1967+ customer 11 2 "LISA" "ANDERSON" "LISA.ANDERSON@sakilacustomer.org" 15 1 "2006-02-14 22:04:36" 1140008240
1968+ customer 12 1 "NANCY" "THOMAS" "NANCY.THOMAS@sakilacustomer.org" 16 1 "2006-02-14 22:04:36" 1140008240
1969+ ...
1970+ customer 596 1 "ENRIQUE" "FORSYTHE" "ENRIQUE.FORSYTHE@sakilacustomer.org" 602 1 "2006-02-14 22:04:37" 1140008240
1971+ customer 597 1 "FREDDIE" "DUGGAN" "FREDDIE.DUGGAN@sakilacustomer.org" 603 1 "2006-02-14 22:04:37" 1140008240
1972+ customer 598 1 "WADE" "DELVALLE" "WADE.DELVALLE@sakilacustomer.org" 604 1 "2006-02-14 22:04:37" 1140008240
1973+ customer 599 2 "AUSTIN" "CINTRON" "AUSTIN.CINTRON@sakilacustomer.org" 605 1 "2006-02-14 22:04:37" 1140008240
1974+
1975+It appears that this change has enabled the tool to recover all of the rows correctly. You can now run the tool against all of the pages, and redirect the output to a file, which you can load into the database to restore the table. ::
1976+
1977+ $ ./constraints_parser -5 -f pages-1246363747/0-286/customer_pages_concatenated \
1978+ > /tmp/customer_data.tsv
1979+
1980+Handling Duplicates and Old Row Versions
1981+----------------------------------------
1982+
1983+The file that results from the previous step has only 689 records, instead of the 1416 before specifying the constraints more accurately. However, this is still more than the actual number in the table, which is 599. What are these rows?
1984+
1985+Sometimes InnoDB marks a row as deleted, or writes a new version of a row but keeps the old version and marks it as deleted, resulting in two versions of the row in the output. Depending on the type of data loss you are trying to recover, you might need to ignore those row versions – or perhaps they are the data you are looking for. These two cases can be handled as follows:
1986+
1987+Because we sorted the pages in physical order to concatenate them, obsolete rows should come first and the newest row version should come last in the output.
1988+Deleted rows can be output by running the tool with the -D option. You can then remove these from the final results.
1989+Sometimes there are still garbage rows in the output, even with good constraints and after de-duplicating and removing old versions. The output of this tool usually requires careful validation.
1990+
1991+Understanding Table Definitions
1992+-------------------------------
1993+
1994+The tool supports a variety of data types, and filters (“limits”) on the data, but not everything is supported. Examine the header file include/tables_dict.h to see what is supported. Briefly,
1995+
1996+The tool does not support SET, BLOB, or BIT data types. ENUM is supported.
1997+CHAR and TEXT are supported, as long as off-page storage is not used.
1998+For numeric types, you can specify min and max values.
1999+For character types, you can specify min and max length.
2000+For character types, you can additionally restrict the values to ASCII, digits, or match them against a regular expression.
2001+Date types can be validated as dates.
2002+There are some special cases and things you need to know for specific data types.
2003+
2004+Defining and Constraining Data Types
2005+------------------------------------
2006+
2007+The following data types and constraints are supported:
2008+
2009+All Data Types
2010+
2011+ * Any field can be set nullable or non-nullable: can_be_null: TRUE|FALSE
2012+ * The has_limits member defines whether the limits are applied: has_limits: TRUE
2013+ * The DECIMAL Data Type
2014+
2015+DECIMAL types are stored as strings before MySQL 5.0.3, and in a packed format after that version. The create_defs.pl tool generates a definition for MySQL 5.0.3 and later. To recover DECIMAL from tables in an earlier version of MySQL, use FT_CHAR field type. For a column defined as DECIMAL(M, D), use the following rules to choose a length in the table definition:
2016+
2017+ * if D > 0, then M+2 bytes
2018+ * if D = 0, then M+1 bytes
2019+ * if M < D, then D+2 bytes
2020+
2021+Here is an example definition for a DECIMAL(4,2) column: ::
2022+
2023+ { /* decimal(4,2) unsigned */
2024+ name: "my_decimal_column",
2025+ type: FT_CHAR,
2026+ fixed_length: 6,
2027+ has_limits: FALSE,
2028+ limits: {
2029+ can_be_null: TRUE,
2030+ char_min_len: 0,
2031+ char_max_len: 2,
2032+ char_ascii_only: TRUE
2033+ },
2034+ can_be_null: TRUE
2035+ },
2036+
2037+The INT and INT UNSIGNED Data Type
2038+
2039+The INT type permits the following constraints: int_min_val and int_max_val. Unsigned integers permit uint_min_val and uint_max_val.
2040+
2041+The TIMESTAMP Data Type
2042+
2043+This data type is stored as UINT by InnoDB.
2044+
2045+The DATETIME Data Type
2046+
2047+DATETIME types are stored as 8-byte integers internally. The tool recognizes them, and you can specify that they must be validated as dates to be accepted. If you set has_limits: TRUE, then the tool will enforce that seconds and minutes are in the interval 0..59, hours range from 0..23, days range from 1..31, months range from 1..12, and years range from 1950..2050.
2048+
2049+The CHAR, VARCHAR, and TEXT Data Types
2050+
2051+The following constraints can be applied:
2052+
2053+ * char_min_len
2054+ * char_max_len
2055+ * char_ascii_only
2056+ * char_digits_only
2057+ * char_regex
2058+
2059+Here is an example to constrain values to only URLs containing ASCII codes, between 20 and 100 characters in length: ::
2060+
2061+ char_min_len: 20,
2062+ char_max_len: 100,
2063+ char_ascii_only: TRUE,
2064+ char_regex: "^http://",
2065+
2066+Although the char_regex constraint could be used to mimic other types of constraints, it is much more CPU intensive, so it should only be used when a more efficient alternative is not available.
2067+
2068+The BLOB Data Type
2069+
2070+Due to the complexities of BLOB storage, the tool does not yet support BLOB columns. However, if the values are short enough, InnoDB actually stores them as strings, and even if the value is too long and is stored off-page in a separate segment, a prefix of the value is stored on-page as a string, and if the record fits in the page, the whole value might be stored on the page. (This is not the case with the Barracuda page format, however.)
2071+
2072+To recover BLOB values, wholly or in part, you can sometimes simply treat it as FT_TEXT. You can patch the create_defs.pl file to make it treat BLOB as TEXT: ::
2073+
2074+ sub FindFieldByName($$) {
2075+ my $fields = shift;
2076+ my $name = shift;
2077+ @@ -333,7 +346,7 @@
2078+ return { type => 'FT_TEXT', min_len => 0, max_len => 255 };
2079+ }
2080+ - if ($type =~ /^TEXT$/i) {
2081+ + if ($type =~ /^(TEXT|BLOB)$/i) {
2082+ return { type => 'FT_TEXT', min_len => 0, max_len => 65535 };
2083+ }
2084+
2085+The ENUM Data Type
2086+
2087+Here is a sample definition for an ENUM, which verifies that the enum's INT representation is less than or equal to 2. The enum_values limit is not really a limit as such; rather, it defines what strings the tool will output for each valid value. ::
2088+
2089+ { /* ENUM('yes','no') */
2090+ name: "my_enum_column",
2091+ type: FT_ENUM,
2092+ fixed_length: 1,
2093+ has_limits: TRUE,
2094+ limits: {
2095+ enum_values_count: 2,
2096+ enum_values: { "yes", "no" }
2097+ },
2098+ can_be_null: FALSE
2099+ },
2100+
2101+Working with UTF8 and Other Multibyte Character Sets
2102+----------------------------------------------------
2103+
2104+When multi-byte character sets such as UTF8 are used, InnoDB allocates more storage space for the value. For example,
2105+
2106+ * CHAR(1) is stored as VARCHAR(3)
2107+ * VARCHAR(10) is stored as VARCHAR(30).
2108+ * VARCHAR(100) is stored as TEXT.
2109+
2110+The table definitions need to be adjusted accordingly. Currently create_defs.pl doesn't handle this automatically.
2111+
2112+Using Multiple Table Definitions
2113+--------------------------------
2114+
2115+The constraints_parser tool actually supports more than one table definition at a time. You can place an array of table definitions into the structure of include/table_defs.h. We have shown only one table at a time so far to keep things simple.
2116+
2117+Doing this can help avoid frequent compilation, and can enable you to run the tool against a whole tablespace with many different tables' pages mixed together, but if some tables have the same structure, then the tool will not be able to tell the difference between them. That is why we suggest working one at a time.
2118+
2119+If you do compile multiple table definitions into the tool at a time, then the output of the tool will naturally contain rows from different tables mingled together. You can use the split_dump.pl tool to split the constraints_parser output into separate files.
2120+
2121+
2122+Importing Data Into the Database
2123+================================
2124+
2125+To complete the data recovery, you can load the output of the constraints_parser tool into the database with LOAD DATA INFILE. At this point we are done using the tools; the process from here on is all performed with the database, or with other tools such as Unix command-line utilities.
2126+
2127+To import the file with LOAD DATA INFILE, you can use the following rules:
2128+
2129+ * The file is tab delimited. Use FIELDS TERMINATED BY '\t'.
2130+ * Columns are quoted. Use OPTIONALLY ENCLOSED BY '"'.
2131+ * Each line starts with the table name and a tab. Use LINES STARTING BY '<table_name>\t'.
2132+ * TIMESTAMP values are stored as integer values. Use FROM_UNIXTIME(@var).
2133+ * Use REPLACE INTO when you have old row versions that you want to ignore and overwrite with the latest version.
2134+
2135+To complete our running example, we can execute the following SQL:
2136+
2137+.. code-block:: mysql
2138+
2139+ LOAD DATA INFILE '/tmp/customer_data.tsv'
2140+ REPLACE INTO TABLE customer
2141+ FIELDS TERMINATED BY '\t'
2142+ OPTIONALLY ENCLOSED BY '"'
2143+ LINES STARTING BY 'customer\t'
2144+ (customer_id, store_id, first_name, last_name, email,
2145+ address_id, active, create_date, @last_update)
2146+ SET last_update = FROM_UNIXTIME(@last_update);
2147+
2148+
2149
2150=== added directory 'doc/source/percona-theme'
2151=== added file 'doc/source/percona-theme/layout.html'
2152--- doc/source/percona-theme/layout.html 1970-01-01 00:00:00 +0000
2153+++ doc/source/percona-theme/layout.html 2012-07-17 08:41:18 +0000
2154@@ -0,0 +1,499 @@
2155+{#
2156+ basic/layout.html
2157+ ~~~~~~~~~~~~~~~~~
2158+
2159+ Master layout template for Sphinx themes.
2160+
2161+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
2162+ :license: BSD, see LICENSE for details.
2163+#}
2164+{%- block doctype -%}
2165+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2166+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2167+{%- endblock %}
2168+{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
2169+{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
2170+{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
2171+ (sidebars != []) %}
2172+{%- set url_root = pathto('', 1) %}
2173+{# XXX necessary? #}
2174+{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
2175+{%- if not embedded and docstitle %}
2176+ {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
2177+{%- else %}
2178+ {%- set titlesuffix = "" %}
2179+{%- endif %}
2180+
2181+{%- macro relbar() %}
2182+ <div class="related">
2183+ <h3>{{ _('Navigation') }}</h3>
2184+ <ul>
2185+ {%- for rellink in rellinks %}
2186+ <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
2187+ <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
2188+ {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
2189+ {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
2190+ {%- endfor %}
2191+ {%- block rootrellink %}
2192+ <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
2193+ {%- endblock %}
2194+ {%- for parent in parents %}
2195+ <li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
2196+ {%- endfor %}
2197+ {%- block relbaritems %} {% endblock %}
2198+ </ul>
2199+ </div>
2200+{%- endmacro %}
2201+
2202+{%- macro sidebar() %}
2203+ {%- if render_sidebar %}
2204+ <div class="sphinxsidebar">
2205+ <div class="sphinxsidebarwrapper">
2206+ {%- block sidebarlogo %}
2207+ {%- if logo %}
2208+ <p class="logo"><a href="{{ pathto(master_doc) }}">
2209+ <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
2210+ </a></p>
2211+ {%- endif %}
2212+
2213+<div class="noborder" id="sidenavi">
2214+
2215+ <div class="sidebanner" id="sidebanner">
2216+ <div class="header"><a href="/contact/sales">Call Us</a></div>
2217+ <div class="numbers">
2218+ <div style="padding-bottom: 4px">
2219+ +1-888-316-9775 (USA - Sales)<br>
2220+ +1-208-473-2904 (USA - Sales)
2221+ </div>
2222+ <div>
2223+ +44-208-133-0309 (UK - Sales)
2224+ </div>
2225+ <div>
2226+ +1-877-862-4316 (Emergency)
2227+ </div>
2228+ </div>
2229+ </div>
2230+ <div id="sidefloater"></div>
2231+</div>
2232+
2233+ {%- endblock %}
2234+ {%- if sidebars != None %}
2235+ {#- new style sidebar: explicitly include/exclude templates #}
2236+ {%- for sidebartemplate in sidebars %}
2237+ {%- include sidebartemplate %}
2238+ {%- endfor %}
2239+ {%- else %}
2240+ {#- old style sidebars: using blocks -- should be deprecated #}
2241+ {%- block serverseries %}
2242+ {%- endblock %}
2243+ {%- block sidebartoc %}
2244+ {%- include "localtoc.html" %}
2245+ {%- endblock %}
2246+ {%- block sidebarrel %}
2247+ {%- include "relations.html" %}
2248+ {%- endblock %}
2249+ {%- block sidebarsourcelink %}
2250+ {%- include "sourcelink.html" %}
2251+ {%- endblock %}
2252+ {%- if customsidebar %}
2253+ {%- include customsidebar %}
2254+ {%- endif %}
2255+ {%- block sidebarsearch %}
2256+ {%- include "searchbox.html" %}
2257+ {%- endblock %}
2258+ {%- endif %}
2259+
2260+ </div>
2261+ </div>
2262+ {%- endif %}
2263+{%- endmacro %}
2264+
2265+{%- macro script() %}
2266+ <script type="text/javascript">
2267+ var DOCUMENTATION_OPTIONS = {
2268+ URL_ROOT: '{{ url_root }}',
2269+ VERSION: '{{ release|e }}',
2270+ COLLAPSE_INDEX: false,
2271+ FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
2272+ HAS_SOURCE: {{ has_source|lower }}
2273+ };
2274+ </script>
2275+ {%- for scriptfile in script_files %}
2276+ <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
2277+ {%- endfor %}
2278+{%- endmacro %}
2279+
2280+{%- macro css() %}
2281+ <link rel="stylesheet" href="{{ pathto('_static/percona.com.css', 1) }}" type="text/css" />
2282+ <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
2283+ <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
2284+ {%- for cssfile in css_files %}
2285+ <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
2286+ {%- endfor %}
2287+{%- endmacro %}
2288+
2289+<html xmlns="http://www.w3.org/1999/xhtml">
2290+ <head>
2291+ <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
2292+ {{ metatags }}
2293+ {%- block htmltitle %}
2294+ <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
2295+ {%- endblock %}
2296+
2297+ {{ css() }}
2298+ {%- if not embedded %}
2299+ {{ script() }}
2300+ {%- if use_opensearch %}
2301+ <link rel="search" type="application/opensearchdescription+xml"
2302+ title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
2303+ href="{{ pathto('_static/opensearch.xml', 1) }}"/>
2304+ {%- endif %}
2305+
2306+<script src="{{ pathto('_static/percona.com.js', 1)}}" type="text/javascript"></script>
2307+
2308+ {%- if favicon %}
2309+ <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
2310+ {%- endif %}
2311+ {%- endif %}
2312+{%- block linktags %}
2313+ {%- if hasdoc('about') %}
2314+ <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
2315+ {%- endif %}
2316+ {%- if hasdoc('genindex') %}
2317+ <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
2318+ {%- endif %}
2319+ {%- if hasdoc('search') %}
2320+ <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
2321+ {%- endif %}
2322+ {%- if hasdoc('copyright') %}
2323+ <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
2324+ {%- endif %}
2325+ <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
2326+ {%- if parents %}
2327+ <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
2328+ {%- endif %}
2329+ {%- if next %}
2330+ <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
2331+ {%- endif %}
2332+ {%- if prev %}
2333+ <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
2334+ {%- endif %}
2335+{%- endblock %}
2336+{%- block extrahead %} {% endblock %}
2337+ </head>
2338+ <body>
2339+
2340+{%- block header %}
2341+
2342+ <!-- <div id="stickywrapper"> -->
2343+ <!-- <div id="stickycontent"> -->
2344+ <div id="header"><div class="header">
2345+ <div class="logo"><a href="http://www.percona.com/" onfocus="this.blur()"><img src="http://s3.percona.com/ui-logo.png" alt="Percona Performance Consulting Experts" width="240" height="55" /></a></div>
2346+ <div class="right">
2347+ <div class="searchlink"><a onmouseover="SEARCH.Open()"><img id="searchlink-anchor" src="http://s2.percona.com/ui-search.png" alt="" /></a></div>
2348+ <span class="inv"><![CDATA[<noindex>]]></span>
2349+ <div class="navicontainer"><div class="navi">
2350+ <span id="navilink-span-about-us" ><a id="navilink-a-about-us" href="http://www.percona.com/about-us/">About Us</a></span><span id="navilink-span-mysql-consulting" ><a id="navilink-a-mysql-consulting" href="http://www.percona.com/mysql-consulting/">Consulting</a></span><span id="navilink-span-support" ><a id="navilink-a-support" href="http://www.percona.com/mysql-support/">Support</a></span><span id="navilink-span-training" ><a id="navilink-a-training" href="http://www.percona.com/training/">Training</a></span><span id="navilink-span-development" ><a id="navilink-a-development" href="http://www.percona.com/development/">Development</a></span><span id="navilink-span-software" class="selected"><a class="selected" id="navilink-a-software" href="http://www.percona.com/software/">Software</a></span><span id="navilink-span-events" ><a id="navilink-a-events" href="http://www.percona.com/live/">Events</a></span><span id="navilink-span-contact" ><a id="navilink-a-contact" href="http://www.percona.com/contact/">Contact Us</a></span> </div></div>
2351+
2352+ <span class="inv"><![CDATA[</noindex>]]></span>
2353+ <span class="inv"><![CDATA[</noindex>]]></span>
2354+ </div>
2355+ </div></div>
2356+ <div id="stripe"></div>
2357+
2358+{% endblock %}
2359+
2360+ <!-- <div id="stripe"></div> -->
2361+
2362+{%- block content %}
2363+
2364+
2365+
2366+ {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
2367+
2368+ <div class="document">
2369+
2370+
2371+
2372+ {%- block document %}
2373+ <div class="documentwrapper">
2374+ {%- if render_sidebar %}
2375+ <div class="bodywrapper">
2376+ {%- endif %}
2377+
2378+ {%- block relbar1 %}{{ relbar() }}{% endblock %}
2379+
2380+ <div class="body">
2381+ {% block body %} {% endblock %}
2382+ </div>
2383+
2384+ {%- block relbar2 %}{{ relbar() }}
2385+
2386+ {%- if render_sidebar %}
2387+ </div>
2388+ {%- endif %}
2389+
2390+
2391+
2392+ </div>
2393+
2394+ {%- endblock %}
2395+
2396+ {%- block sidebar2 %}{{ sidebar() }}{% endblock %}
2397+
2398+ <div class="clearer"></div>
2399+
2400+ {%- if last_updated %}
2401+ {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
2402+ {%- endif %}
2403+
2404+ <div class="license">
2405+
2406+ {%- if show_copyright %}
2407+ {%- if hasdoc('copyright') %}
2408+ {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
2409+ {%- else %}
2410+ {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
2411+ {%- endif %}
2412+ {%- endif %}
2413+
2414+ <br />
2415+ Except where otherwise noted, this documentation is licensed under the following license:
2416+ <br />
2417+ <a class="urlextern" rel="license" href="http://creativecommons.org/licenses/by-sa/2.0/">
2418+ CC Attribution-ShareAlike 2.0 Generic</a><br />
2419+
2420+ {%- if show_sphinx %}
2421+ {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
2422+ {%- endif %}
2423+
2424+ </div>
2425+
2426+ </div>
2427+ {%- endblock %}
2428+
2429+ {% endblock %}
2430+
2431+{%- block footer %}
2432+
2433+ <div class="file-bugs">
2434+ This documentation is developed in Launchpad as part of the <a href="https://code.launchpad.net/percona-toolkit">Percona Toolkit source code</a>.<br/>
2435+ If you spotted innacuracies, errors, don't understood it or you think something is missing or should be improved, please <a href="https://bugs.launchpad.net/percona-toolkit/+filebug?field.tags=doc&amp;field.comment=[In:Percona Toolkit Documentation]&amp;?field.tags=doc&amp;field.title=[DOC] ">file a bug</a>.
2436+
2437+ </div>
2438+
2439+ <div id="support-ribbon" class="vertical" style="z-index: 1;">
2440+ <div id="support-suboptions">
2441+ <ul>
2442+ <li><a title="Contact Me" href="http://form.percona.com/ContactMe.html" style="background: url('http://s2.percona.com/buttons/btn_contact-us.png?1');"><span>Contact Us</span></a></li>
2443+ <li><a title="Customer Portal Log In" href="https://customers.percona.com/" style="background: url('http://s2.percona.com/buttons/btn_customer.png?1');"><span>Customer Portal Log In</span></a></li>
2444+ <li><a title="Attend a Webinar" href="http://percona.com/webinars/" style="background: url('http://s2.percona.com/buttons/btn_attend-a-webinar.png?1');"><span>Attend a Webinar</span></a></li>
2445+ <li><a title="Download Software" href="http://percona.com/downloads/" style="background:url('http://s2.percona.com/buttons/btn_download.png?1');"><span>Download Software</span></a></li>
2446+ <li><a title="Register for Newsletters" href="http://percona.com/subscribe/" style="background: url('http://s2.percona.com/buttons/btn_register.png?1');"><span>Register for Newsletters</span></a></li>
2447+
2448+ </ul>
2449+ </div>
2450+ </div>
2451+
2452+ <div id="footer">
2453+
2454+ <div class="footer">
2455+ <div class="logo"><img width="110" height="25" alt="" src="{{ pathto('_static/ui-footer-logo.png', 1) }}">
2456+ </div>
2457+
2458+ <div class="text">
2459+ <span class="inv"><!--[CDATA[<noindex-->]]&gt;</span>
2460+ Call us: 1-888-316-9775 • <a href="/contact">Contact Us</a><br>
2461+ MySQL and InnoDB are trademarks of Oracle Corp.<br>
2462+ Proudly running <a href="/software/percona-server/">Percona Server<span id="recentServerVersion"></span></a><br>
2463+ Copyright &copy; 2006-2011 Percona Inc.<br>
2464+ <a href="/about-us/policies/">Copyright, Trademark, and Privacy Policy</a> • <a href="/sitemap/">Sitemap</a>
2465+ <span class="inv"><!--[CDATA[</noindex-->]]&gt;</span>
2466+ </div>
2467+ </div>
2468+
2469+ </div>
2470+{%- endblock %}
2471+<span class="inv"><!--[CDATA[<noindex-->]]&gt;</span>
2472+<div id="submenus">
2473+ <div class="navi-dropdown" id="navi-dropdown-about-us">
2474+ <div class="navi-dropdown-header-l"><!-- //--></div>
2475+ <div class="navi-dropdown-content">
2476+ <div class="item"><a href="http://www.percona.com/about-us/our-mission/">Our Mission</a></div>
2477+ <div class="item"><a href="http://www.percona.com/about-us/why-percona/">Why Percona?</a></div>
2478+ <div class="item"><a href="http://www.percona.com/about-us/procedures/">Coordinating with Percona</a></div>
2479+ <div class="item"><a href="http://www.percona.com/about-us/customers/">Customers</a></div>
2480+ <div class="item"><a href="http://www.percona.com/webinars/">Webinars</a></div>
2481+ <div class="item"><a href="http://www.percona.com/about-us/mysql-case-studies/">MySQL Case Studies</a></div>
2482+ <div class="item"><a href="http://www.percona.com/about-us/our-team/">Our Team</a></div>
2483+
2484+ <div class="item"><a href="http://www.percona.com/about-us/books/">Our Books</a></div>
2485+ <div class="item"><a href="http://www.percona.com/about-us/blogs/">Our Blogs</a></div>
2486+ <div class="item"><a href="http://www.percona.com/about-us/mysql-white-papers/">MySQL White Papers</a></div>
2487+ <div class="item"><a href="http://www.percona.com/about-us/conferences/">Conferences</a></div>
2488+ <div class="item"><a href="http://www.percona.com/about-us/presentations/">Presentations</a></div>
2489+ <div class="item"><a href="http://www.percona.com/about-us/newsletters/">Newsletters</a></div>
2490+ <div class="item"><a href="http://www.percona.com/about-us/pressreleases/">Press Releases</a></div>
2491+ <div class="item"><a href="http://www.percona.com/about-us/percona-in-the-news/">In The News</a></div>
2492+ <div class="item"><a href="http://www.percona.com/about-us/careers/">Careers</a></div>
2493+
2494+ </div>
2495+ <div class="navi-dropdown-footer"><!-- //--></div>
2496+ </div>
2497+ <div class="navi-dropdown" id="navi-dropdown-mysql-consulting">
2498+ <div class="navi-dropdown-header-l"><!-- //--></div>
2499+ <div class="navi-dropdown-content">
2500+ <div class="item"><a href="http://www.percona.com/mysql-consulting/overview/">MySQL Consulting Overview</a></div>
2501+ <div class="item"><a href="http://www.percona.com/mysql-consulting/prices/">MySQL Consulting Prices</a></div>
2502+ <div class="item"><a href="http://www.percona.com/mysql-consulting/architecture/">MySQL Architecture &amp; Design</a></div>
2503+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-backups/">MySQL Backups</a></div>
2504+ <div class="item"><a href="http://www.percona.com/mysql-consulting/cloud-computing/">MySQL Cloud Solutions</a></div>
2505+
2506+ <div class="item"><a href="http://www.percona.com/mysql-consulting/cluster/">MySQL Cluster Consulting</a></div>
2507+ <div class="item"><a href="http://www.percona.com/mysql-consulting/data-warehousing/">MySQL Data Warehousing</a></div>
2508+ <div class="item"><a href="http://www.percona.com/mysql-consulting/data-recovery/">MySQL Data Recovery</a></div>
2509+ <div class="item"><a href="http://www.percona.com/mysql-consulting/high-availability/">MySQL High Availability</a></div>
2510+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-monitoring-graphing/">MySQL Monitoring &amp; Graphing</a></div>
2511+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-onsite-consulting/">MySQL Onsite Consulting</a></div>
2512+ <div class="item"><a href="http://www.percona.com/mysql-consulting/performance-audit/">MySQL Performance Audit</a></div>
2513+ <div class="item"><a href="http://www.percona.com/mysql-consulting/remote-dba/">MySQL Remote DBA</a></div>
2514+
2515+ <div class="item"><a href="http://www.percona.com/mysql-consulting/mysql-replication/">MySQL Replication</a></div>
2516+ <div class="item"><a href="http://www.percona.com/mysql-consulting/upgrade/">MySQL Version Upgrades</a></div>
2517+ <div class="item"><a href="http://www.percona.com/mysql-consulting/24x7-emergency/">Emergency 24&times;7 Consulting</a></div>
2518+ <div class="item"><a href="http://www.percona.com/mysql-consulting/migration/">Migration to MySQL</a></div>
2519+ <div class="item"><a href="http://www.percona.com/drizzle-consulting/">Drizzle Consulting</a></div>
2520+ <div class="item"><a href="http://www.percona.com/mysql-consulting/sphinx/">Sphinx Consulting</a></div>
2521+ <div class="item"><a href="http://www.percona.com/mysql-consulting/drbd/">DRBD Consulting</a></div>
2522+ <div class="item"><a href="http://www.percona.com/mysql-consulting/memcached/">Memcached Consulting</a></div>
2523+
2524+ <div class="item"><a href="http://www.percona.com/mysql-consulting/other-services/">Other Consulting Services</a></div>
2525+ </div>
2526+ <div class="navi-dropdown-footer"><!-- //--></div>
2527+ </div>
2528+ <div class="navi-dropdown" id="navi-dropdown-support">
2529+ <div class="navi-dropdown-header-l"><!-- //--></div>
2530+ <div class="navi-dropdown-content">
2531+ <div class="item"><a href="http://www.percona.com/mysql-support/">MySQL Support Overview</a></div>
2532+ <div class="item"><a href="http://www.percona.com/prices/mysql-support/">MySQL Support Prices</a></div>
2533+ <div class="item"><a href="http://www.percona.com/mysql-support/policies/">MySQL Support Policies</a></div>
2534+ <div class="item"><a href="http://www.percona.com/mysql-support/consulting-vs-support/">Consulting vs. Support</a></div>
2535+ <div class="item"><a href="https://customers.percona.com">Customer Portal Login</a></div>
2536+
2537+ </div>
2538+ <div class="navi-dropdown-footer"><!-- //--></div>
2539+ </div>
2540+ <div class="navi-dropdown" id="navi-dropdown-training">
2541+ <div class="navi-dropdown-header-l"><!-- //--></div>
2542+ <div class="navi-dropdown-content">
2543+ <div class="item"><a href="http://www.percona.com/training/">MySQL Training Overview</a></div>
2544+ <div class="item"><a href="http://www.percona.com/prices/training/">MySQL Training Prices</a></div>
2545+ <div class="item"><a href="http://www.percona.com/training/classes/dba/">MySQL DBA Training</a></div>
2546+ <div class="item"><a href="http://www.percona.com/training/classes/developers/">MySQL Developer Training</a></div>
2547+ <div class="item"><a href="http://www.percona.com/training/classes/operations/">MySQL Operations Training</a></div>
2548+ <div class="item"><a href="http://www.percona.com/training/classes/innodb/">InnoDB &amp; XtraDB Training</a></div>
2549+
2550+ <div class="item"><a href="http://www.percona.com/training/classes/custom-onsite/">Custom Onsite Training</a></div>
2551+ </div>
2552+ <div class="navi-dropdown-footer"><!-- //--></div>
2553+ </div>
2554+ <div class="navi-dropdown" id="navi-dropdown-development">
2555+ <div class="navi-dropdown-header-l"><!-- //--></div>
2556+ <div class="navi-dropdown-content">
2557+ <div class="item"><a href="http://www.percona.com/development/mysql/">MySQL Development Overview</a></div>
2558+ <div class="item"><a href="http://www.percona.com/development/prices/">Custom Development Prices</a></div>
2559+ <div class="item"><a href="http://www.percona.com/development/maintenance/">MySQL Support Overview</a></div>
2560+ <div class="item"><a href="http://www.percona.com/development/benchmarking/">Custom Product Evaluation</a></div>
2561+ <div class="item"><a href="http://www.percona.com/development/maatkit/">Custom Maatkit Development</a></div>
2562+
2563+ <div class="item"><a href="http://www.percona.com/development/custom-tools/">Custom Tools Development</a></div>
2564+ </div>
2565+ <div class="navi-dropdown-footer"><!-- //--></div>
2566+ </div>
2567+ <div class="navi-dropdown" id="navi-dropdown-software">
2568+ <div class="navi-dropdown-header-l"><!-- //--></div>
2569+ <div class="navi-dropdown-content">
2570+ <div class="item"><a href="http://www.percona.com/software/">Percona Software for MySQL</a></div>
2571+ <div class="item"><a href="http://www.percona.com/software/percona-server/">Percona Server with XtraDB</a></div>
2572+ <div class="item"><a href="http://www.percona.com/software/percona-xtradb-cluster/">Percona XtraDB Cluster</a></div>
2573+ <div class="item"><a href="http://www.percona.com/software/percona-xtrabackup/">Percona XtraBackup</a></div>
2574+ <div class="item"><a href="http://www.percona.com/software/mysql-innodb-data-recovery-tools/">Data Recovery Toolkit</a></div>
2575+
2576+ <div class="item"><a href="http://www.percona.com/software/percona-xtradb/">Percona XtraDB</a></div>
2577+ <div class="item"><a href="http://www.percona.com/software/percona-toolkit/">Percona Toolkit</a></div>
2578+ <div class="item"><a href="http://www.percona.com/prices/software/">Software Prices</a></div>
2579+ <div class="item"><a href="http://www.percona.com/downloads/">Downloads</a></div>
2580+ <div class="item"><a href="http://www.percona.com/software/repositories/">Repositories</a></div>
2581+ <div class="item"><a href="http://www.percona.com/software/documentation/">Documentation</a></div>
2582+ <div class="item"><a href="http://forum.percona.com">Forum</a></div>
2583+ <div class="item"><a href="http://groups.google.com/group/percona-discussion">Google Discussion</a></div>
2584+ <div class="item"><a href="https://launchpad.net/percona-server">Launchpad</a></div>
2585+
2586+ </div>
2587+ <div class="navi-dropdown-footer"><!-- //--></div>
2588+ </div>
2589+ <div class="navi-dropdown" id="navi-dropdown-events">
2590+ <div class="navi-dropdown-header-r"><!-- //--></div>
2591+ <div class="navi-dropdown-content">
2592+ <div class="item"><a href="http://www.percona.com/live/mysql-conference-2012/">MySQL Conference &amp; Expo 2012</a></div>
2593+ <div class="item"><a href="http://www.percona.com/live/">Previous Percona Live Events</a></div>
2594+ </div>
2595+ <div class="navi-dropdown-footer"><!-- //--></div>
2596+ </div>
2597+
2598+ <div class="navi-dropdown" id="navi-dropdown-contact">
2599+ <div class="navi-dropdown-header-r"><!-- //--></div>
2600+ <div class="navi-dropdown-content">
2601+ <div class="item"><a href="http://www.percona.com/contact/24x7-emergency/">24&times;7 Emergency</a></div>
2602+ <div class="item"><a href="http://www.percona.com/contact/sales/">Sales &amp; General Inquiries</a></div>
2603+ <div class="item"><a href="http://www.percona.com/contact/billing/">Billing Inquiries</a></div>
2604+ <div class="item"><a href="https://customers.percona.com">Customer Portal Login</a></div>
2605+ <div class="item"><a href="http://www.percona.com/contact/phone-directory/">Phone Directory</a></div>
2606+ <div class="item"><a href="http://www.percona.com/subscribe/">Subscribe to Newsletter</a></div>
2607+
2608+ </div>
2609+ <div class="navi-dropdown-footer"><!-- //--></div>
2610+ </div>
2611+ <div id="search-dropdown" class="search-dropdown">
2612+ <div class="search-dropdown-header"><!-- //--></div>
2613+ <div class="search-dropdown-content">
2614+ <div class="search-info">Search Percona.com:</div>
2615+ <form method="get" action="http://search.percona.com/search/" id="search-form">
2616+ <div class="form"><input type="text" id="search-input" name="q" maxlength="100"></div>
2617+ </form>
2618+ </div>
2619+ <div class="search-dropdown-footer"><!-- //--></div>
2620+ </div>
2621+</div>
2622+<div id="stats">
2623+<!-- GA //-->
2624+ <script src="http://www.percona.com/static/js/urchin.js" type="text/javascript"></script>
2625+ <script type="text/javascript">
2626+ _uacct = "UA-343802-3";
2627+ urchinTracker();
2628+ </script>
2629+<!-- /GA //-->
2630+<!-- NAVI //-->
2631+<script type="text/javascript">//<![CDATA[
2632+var navi = [{id:"about-us", direction: "l"},{id:"mysql-consulting", direction: "l"},{id:"support", direction: "l"},{id:"training", direction: "l"},{id:"development", direction: "l"},{id:"software", direction: "l"},{id:"events", direction: "r"},{id:"contact", direction: "r"}];
2633+for(var i = 0, c = navi.length; i < c; i++) {
2634+window.jQuery('#navilink-a-' + navi[i].id).bind('mouseover',{id: navi[i].id, direction:navi[i].direction}, function(e) { NAVI.Open(e.data.id, e.data.direction); } );
2635+}
2636+window.jQuery('#search-form').bind('submit', function() { window.location.href = jQuery('#search-form').attr('action') + jQuery('#search-input').val(); return false; });
2637+//]]></script>
2638+<!-- /NAVI //-->
2639+<script type="text/javascript">
2640+//<![CDATA[
2641+Percona.host = 'www.percona.com';
2642+Percona.getRecentServerVersion('#recentServerVersion');
2643+//]]>
2644+</script>
2645+</div>
2646+ </body>
2647+</html>
2648+
2649+
2650+
2651+{% if theme_collapsiblesidebar|tobool %}
2652+{% set script_files = script_files + ['_static/sidebar.js'] %}
2653+{% endif %}
2654
2655=== added file 'doc/source/percona-theme/searchbox.html'
2656--- doc/source/percona-theme/searchbox.html 1970-01-01 00:00:00 +0000
2657+++ doc/source/percona-theme/searchbox.html 2012-07-17 08:41:18 +0000
2658@@ -0,0 +1,22 @@
2659+{#
2660+ basic/searchbox.html
2661+ ~~~~~~~~~~~~~~~~~~~~
2662+
2663+ Sphinx sidebar template: quick search box.
2664+
2665+ :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
2666+ :license: BSD, see LICENSE for details.
2667+#}
2668+{%- if pagename != "search" %}
2669+<div id="searchbox" style="display: none; padding: 3px;">
2670+ <h3>{{ _('Quick search') }}</h3>
2671+ <form class="search" action="{{ pathto('search') }}" method="get">
2672+ <input type="text" name="q" size="18" />
2673+ <input type="submit" value="{{ _('Go') }}" />
2674+ <input type="hidden" name="check_keywords" value="yes" />
2675+ <input type="hidden" name="area" value="default" />
2676+ </form>
2677+
2678+</div>
2679+<script type="text/javascript">$('#searchbox').show(0);</script>
2680+{%- endif %}
2681
2682=== added directory 'doc/source/percona-theme/static'
2683=== added file 'doc/source/percona-theme/static/default.css_t'
2684--- doc/source/percona-theme/static/default.css_t 1970-01-01 00:00:00 +0000
2685+++ doc/source/percona-theme/static/default.css_t 2012-07-17 08:41:18 +0000
2686@@ -0,0 +1,469 @@
2687+/*
2688+ * default.css_t
2689+ * ~~~~~~~~~~~~~
2690+ *
2691+ * Sphinx stylesheet -- default theme.
2692+ *
2693+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
2694+ * :license: BSD, see LICENSE for details.
2695+ *
2696+ */
2697+
2698+@import url("basic.css");
2699+
2700+/* -- page layout ----------------------------------------------------------- */
2701+
2702+body {
2703+ font-family: Arial,Helvetica,sans-serif;
2704+ font-size: 14px;
2705+ background-color: #fff;
2706+ color: #333333;
2707+ line-height: 20px;
2708+ margin: 0;
2709+ padding: 0;
2710+
2711+}
2712+
2713+div.document {
2714+ background-color: #fff;
2715+ margin: 0 auto;
2716+ overflow: hidden;
2717+ padding: 30px 0;
2718+ width: 960px;
2719+}
2720+
2721+div.documentwrapper {
2722+ /* float: left; */
2723+ /* width: 100%; */
2724+
2725+}
2726+
2727+div.bodywrapper {
2728+ margin: 10 0 0 0px;
2729+ width: 660px;
2730+ float:right;
2731+}
2732+
2733+div.body {
2734+ background-color: #fff;
2735+ color: #333333;
2736+ padding: 0 0 20px;
2737+}
2738+
2739+{%- if theme_rightsidebar|tobool %}
2740+div.bodywrapper {
2741+ margin: 0 {{ theme_sidebarwidth }}px 0 0;
2742+}
2743+{%- endif %}
2744+
2745+div.footer {
2746+ /* color: {{ theme_footertextcolor }}; */
2747+ /* width: 100%; */
2748+ /* padding: 9px 0 9px 0; */
2749+ /* text-align: center; */
2750+ /* font-size: 75%; */
2751+ font: 80% "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;
2752+ background: none repeat scroll 0 0 #333333;
2753+ border-top: 2px solid #D95200;
2754+ overflow: hidden;
2755+}
2756+
2757+div.footer a {
2758+ color: {{ theme_footertextcolor }};
2759+ text-decoration: underline;
2760+}
2761+
2762+div.related {
2763+ background-color: #ccc;
2764+ line-height: 30px;
2765+ color: #333;
2766+ background: none repeat scroll 0 0 #F8F8F8;
2767+ border: 1px solid #E0E0E0;
2768+ clear: both;
2769+ padding: 10px;
2770+ width: 635px;
2771+ margin-bottom: 5px;
2772+}
2773+
2774+div.related a {
2775+ color: #999;
2776+}
2777+
2778+div.sphinxsidebar {
2779+ margin-left: 0px;
2780+ margin-right: 30px;
2781+ color: #eee;
2782+ font-family: Arial,Helvetica,sans-serif;
2783+ width: 260px;
2784+ {%- if theme_stickysidebar|tobool %}
2785+ top: 30px;
2786+ bottom: 0;
2787+ margin: 0;
2788+ position: fixed;
2789+ overflow: auto;
2790+ height: auto;
2791+ {%- endif %}
2792+ {%- if theme_rightsidebar|tobool %}
2793+ float: right;
2794+ {%- if theme_stickysidebar|tobool %}
2795+ right: 0;
2796+ {%- endif %}
2797+ {%- endif %}
2798+}
2799+
2800+{%- if theme_stickysidebar|tobool %}
2801+/* this is nice, but it it leads to hidden headings when jumping
2802+ to an anchor */
2803+/*
2804+div.related {
2805+ position: fixed;
2806+}
2807+
2808+div.documentwrapper {
2809+ margin-top: 30px;
2810+}
2811+*/
2812+{%- endif %}
2813+
2814+div.sphinxsidebar h3 {
2815+ /* font-family: {{ theme_headfont }}; */
2816+ color: #999;
2817+ font-size: 18px;
2818+ line-height: 15px;
2819+ font-weight: 400;
2820+ margin-left: 5px;
2821+ padding: 0;
2822+}
2823+
2824+div.sphinxsidebar h3 a {
2825+ color: #333;
2826+}
2827+
2828+div.sphinxsidebar a:hover {
2829+ /* color: #333; */
2830+}
2831+
2832+div.sphinxsidebar h4 {
2833+ /* font-family: {{ theme_headfont }}; */
2834+ color: #666;
2835+ font-size: 18px;
2836+ font-weight: normal;
2837+ margin: 5px 0 0 5px;
2838+ padding: 0;
2839+}
2840+
2841+div.sphinxsidebar p {
2842+ color: #333;
2843+ margin-bottom: 5px;
2844+ margin-left: 5px;
2845+}
2846+
2847+div.sphinxsidebar p.topless {
2848+ margin: 5px 10px 10px 10px;
2849+}
2850+
2851+div.sphinxsidebar ul {
2852+ margin: 10px;
2853+ padding-left: 5px;
2854+ color: #333;
2855+}
2856+
2857+div.sphinxsidebar a {
2858+ color: #D12907;
2859+}
2860+
2861+div.sphinxsidebar input {
2862+ border: 1px solid #999;
2863+ font-family: sans-serif;
2864+ font-size: 1em;
2865+}
2866+
2867+{% if theme_collapsiblesidebar|tobool %}
2868+/* for collapsible sidebar */
2869+div#sidebarbutton {
2870+ background-color: {{ theme_sidebarbtncolor }};
2871+}
2872+{% endif %}
2873+
2874+/* -- hyperlink styles ------------------------------------------------------ */
2875+
2876+a {
2877+ color: #D12907;
2878+ text-decoration: underline;
2879+ border: medium none;
2880+ cursor: pointer;
2881+}
2882+
2883+a:visited {
2884+ color: #D12907;
2885+ text-decoration: underline;
2886+}
2887+
2888+a:hover {
2889+ color: #D12907;
2890+ text-decoration: underline;
2891+}
2892+
2893+{% if theme_externalrefs|tobool %}
2894+a.external {
2895+ text-decoration: none;
2896+ border-bottom: 1px dashed {{ theme_linkcolor }};
2897+}
2898+
2899+a.external:hover {
2900+ text-decoration: none;
2901+ border-bottom: none;
2902+}
2903+
2904+a.external:visited {
2905+ text-decoration: none;
2906+ border-bottom: 1px dashed {{ theme_visitedlinkcolor }};
2907+}
2908+{% endif %}
2909+
2910+/* -- body styles ----------------------------------------------------------- */
2911+
2912+div.body h1,
2913+div.body h2,
2914+div.body h3,
2915+div.body h4,
2916+div.body h5,
2917+div.body h6 {
2918+ font-family: Arial,Helvetica,sans-serif;
2919+ background-color: #fff;
2920+ font-weight: 400;
2921+
2922+ /* border-bottom: 1px solid #ccc; */
2923+ /* margin: 20px -20px 10px -20px; */
2924+ /* padding: 0; */
2925+ /* padding: 3px 0 3px 10px; */
2926+ text-decoration: none !important;
2927+
2928+ border-bottom: 1px solid #E0E0E0;
2929+ font-size: 20px;
2930+ line-height: 20px;
2931+ margin: 30px 0 15px;
2932+ padding: 0 0 3px;
2933+ color: #000;
2934+}
2935+
2936+div.body h1 {
2937+ font-size: 32px;
2938+ color: #D12907;
2939+ line-height: 40px;
2940+ margin: 10px 0 20px 0;
2941+ text-decoration: none !important;
2942+ border-bottom: none;
2943+ margin-top: 35px;
2944+}
2945+
2946+div.body h2 { font-size: 150%; }
2947+div.body h3 { font-size: 140%; }
2948+div.body h4 { font-size: 120%; }
2949+div.body h5 { font-size: 110%; }
2950+div.body h6 { font-size: 100%; }
2951+
2952+a.headerlink {
2953+ color: {{ theme_headlinkcolor }};
2954+ font-size: 0.8em;
2955+ padding: 0 4px 0 4px;
2956+ text-decoration: none;
2957+}
2958+
2959+a.headerlink:hover {
2960+ background-color: {{ theme_headlinkcolor }};
2961+ color: white;
2962+}
2963+
2964+div.body dd, div.body li {
2965+ text-align: justify;
2966+}
2967+
2968+div.body dt {
2969+ list-style-type: square;
2970+ /* margin: 8px 0 8px 30px; */
2971+ padding: 0 4px 0 5px;
2972+
2973+}
2974+
2975+div.body p {
2976+ text-align: justify;
2977+/* line-height: 130%;*/
2978+ margin: 10px 0;
2979+}
2980+
2981+/* div.body ul, */
2982+div.body li {
2983+ list-style-type: square;
2984+ margin: 8px 0 8px 30px;
2985+ padding: 0 4px 0 5px;
2986+}
2987+
2988+.reference em {
2989+ font-style: normal;
2990+}
2991+
2992+.std-term {
2993+ font-style: normal;
2994+ font-weight: 400;
2995+ color: #FF7400
2996+}
2997+
2998+div.admonition p.admonition-title + p {
2999+ display: inline;
3000+}
3001+
3002+div.admonition p {
3003+ margin-bottom: 5px;
3004+}
3005+
3006+div.admonition pre {
3007+ margin-bottom: 5px;
3008+}
3009+
3010+div.admonition ul, div.admonition ol {
3011+ margin-bottom: 5px;
3012+}
3013+
3014+div.note {
3015+ background-color: #eee;
3016+ border: 1px solid #ccc;
3017+}
3018+
3019+div.seealso {
3020+ background-color: #ffc;
3021+ border: 1px solid #ff6;
3022+}
3023+
3024+div.topic {
3025+ background-color: #eee;
3026+}
3027+
3028+div.warning {
3029+ background-color: #ffe4e4;
3030+ border: 1px solid #f66;
3031+}
3032+
3033+p.admonition-title {
3034+ display: inline;
3035+}
3036+
3037+p.admonition-title:after {
3038+ content: ":";
3039+}
3040+
3041+pre {
3042+ padding: 10px;
3043+ background-color: #F0E6D9/* {{ theme_codebgcolor }} */;
3044+ color: {{ theme_codetextcolor }};
3045+ line-height: 120%;
3046+ border: 1px dashed #ED9821;
3047+ font-size: 80%;
3048+ overflow: auto;
3049+ /* border-left: none; */
3050+ /* border-right: none; */
3051+}
3052+
3053+tt {
3054+/* background-color: #ecf0f3;
3055+ padding: 0 1px 0 1px;
3056+ font-size: 0.95em;*/
3057+ font-weight: 400;
3058+}
3059+
3060+div.body td {
3061+ text-align: none;
3062+}
3063+
3064+table.docutils th {
3065+ background-color: #DEE7EC;
3066+ border: 1px solid #8CACBB;
3067+ padding: 3px;
3068+ text-align: center;
3069+ font-style: normal;
3070+ font-weight: 400;
3071+}
3072+
3073+table.docutils td {
3074+ border: 1px solid #8CACBB;
3075+ padding: 3px;
3076+ line-height: 16px;
3077+ vertical-align: middle;
3078+}
3079+
3080+.warning tt {
3081+ background: #efc2c2;
3082+}
3083+
3084+.note tt {
3085+ background: #d6d6d6;
3086+}
3087+
3088+.viewcode-back {
3089+ font-family: {{ theme_bodyfont }};
3090+}
3091+
3092+div.viewcode-block:target {
3093+ background-color: #f4debf;
3094+ border-top: 1px solid #ac9;
3095+ border-bottom: 1px solid #ac9;
3096+}
3097+
3098+.file-bugs {
3099+ background: none repeat scroll 0 0 #E8E8E8;
3100+ border: 1px solid #E0E0E0;
3101+ clear: both;
3102+ color: #333333;
3103+ padding: 10px;
3104+ text-align: center;
3105+ font-size: 90%;
3106+}
3107+
3108+div.footer .footer {
3109+ margin: 0 auto;
3110+ overflow: hidden;
3111+ padding: 10px 0;
3112+ width: 960px;
3113+ border-top: none;
3114+}
3115+
3116+div.footer .footer .logo {
3117+ float: left;
3118+ overflow: hidden;
3119+ padding: 17px 0 0;
3120+}
3121+
3122+div.footer .footer .text {
3123+ color: #E0E0E0;
3124+ float: right;
3125+ font-family: Arial,Helvetica,sans-serif;
3126+ font-size: 11px;
3127+ line-height: 15px;
3128+ overflow: hidden;
3129+ text-align: right;
3130+}
3131+
3132+div.license {
3133+ font-size: 80%;
3134+ /* padding: 0.5em; */
3135+ text-align: center;
3136+ margin: 13px 0 -15px;
3137+}
3138+
3139+#sidenavi.noborder {
3140+ border-right: medium none;
3141+ border-top: medium none;
3142+ margin: 0;
3143+}
3144+
3145+#sidenavi {
3146+ color: #333333;
3147+ /* float: left; */
3148+ font-family: Arial,Helvetica,sans-serif;
3149+ font-size: 18px;
3150+ line-height: 25px;
3151+ overflow: hidden;
3152+ padding: 10px 0 8px 0px;
3153+ width: 255px;
3154+}
3155+
3156
3157=== added file 'doc/source/percona-theme/static/email-small.png'
3158Binary files doc/source/percona-theme/static/email-small.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/email-small.png 2012-07-17 08:41:18 +0000 differ
3159=== added file 'doc/source/percona-theme/static/jquery.min.js'
3160--- doc/source/percona-theme/static/jquery.min.js 1970-01-01 00:00:00 +0000
3161+++ doc/source/percona-theme/static/jquery.min.js 2012-07-17 08:41:18 +0000
3162@@ -0,0 +1,154 @@
3163+/*!
3164+ * jQuery JavaScript Library v1.4.2
3165+ * http://jquery.com/
3166+ *
3167+ * Copyright 2010, John Resig
3168+ * Dual licensed under the MIT or GPL Version 2 licenses.
3169+ * http://jquery.org/license
3170+ *
3171+ * Includes Sizzle.js
3172+ * http://sizzlejs.com/
3173+ * Copyright 2010, The Dojo Foundation
3174+ * Released under the MIT, BSD, and GPL Licenses.
3175+ *
3176+ * Date: Sat Feb 13 22:33:48 2010 -0500
3177+ */
3178+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
3179+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
3180+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
3181+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
3182+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
3183+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
3184+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
3185+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
3186+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
3187+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
3188+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
3189+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
3190+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
3191+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
3192+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
3193+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
3194+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
3195+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
3196+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
3197+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
3198+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
3199+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
3200+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
3201+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
3202+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
3203+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
3204+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
3205+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
3206+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
3207+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
3208+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
3209+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
3210+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
3211+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
3212+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
3213+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
3214+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
3215+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
3216+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
3217+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
3218+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
3219+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
3220+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
3221+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
3222+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
3223+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
3224+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
3225+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
3226+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
3227+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
3228+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
3229+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
3230+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
3231+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
3232+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3233+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
3234+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
3235+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
3236+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
3237+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
3238+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
3239+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
3240+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
3241+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
3242+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
3243+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
3244+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
3245+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
3246+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
3247+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
3248+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
3249+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
3250+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
3251+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
3252+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
3253+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
3254+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
3255+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
3256+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
3257+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
3258+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
3259+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
3260+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
3261+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
3262+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
3263+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
3264+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
3265+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
3266+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
3267+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
3268+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
3269+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
3270+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
3271+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
3272+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
3273+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
3274+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
3275+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
3276+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
3277+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
3278+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
3279+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
3280+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
3281+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
3282+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
3283+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
3284+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
3285+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
3286+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
3287+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
3288+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
3289+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
3290+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
3291+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
3292+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
3293+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
3294+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
3295+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
3296+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
3297+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
3298+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
3299+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
3300+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
3301+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
3302+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
3303+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
3304+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
3305+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
3306+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
3307+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
3308+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
3309+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
3310+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
3311+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
3312+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
3313+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
3314+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
3315+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
3316+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
3317
3318=== added file 'doc/source/percona-theme/static/percona.com.css'
3319--- doc/source/percona-theme/static/percona.com.css 1970-01-01 00:00:00 +0000
3320+++ doc/source/percona-theme/static/percona.com.css 2012-07-17 08:41:18 +0000
3321@@ -0,0 +1,271 @@
3322+@charset "utf-8";
3323+/**
3324+ * Support ribbon
3325+ */
3326+#support-ribbon.vertical
3327+{
3328+ position: fixed;
3329+ right:-3px;
3330+ top:145px;
3331+ color: #ffffff;
3332+ width: 153px;
3333+ height: 130px;
3334+ z-index: 1;
3335+}
3336+#support-ribbon.vertical #support-suboptions {
3337+ display: block;
3338+ position:relative;
3339+ right:0px;
3340+ top: 0px;
3341+ width:155px;
3342+ border-bottom: 0;
3343+ z-index: -10;
3344+
3345+}
3346+#support-ribbon.vertical #support-suboptions a {
3347+ margin-bottom:5px;
3348+ display: block;
3349+ opacity: 0.9;
3350+ text-align: center;
3351+ color: #fff;
3352+ height: 33px;
3353+ line-height:33px;
3354+}
3355+#support-suboptions a:hover {
3356+ opacity: 1;
3357+}
3358+#support-suboptions a span { display:none;}
3359+/**
3360+horizontal ribbon
3361+*/
3362+#support-ribbon.horizontal
3363+{
3364+ position: fixed;
3365+ bottom:0;
3366+ left:0;
3367+ color: #ffffff;
3368+ height: 38px;
3369+ z-index: 1;
3370+}
3371+ #support-ribbon.horizontal #support-suboptions {
3372+
3373+ position:relative;
3374+ top: 0px;
3375+ border-bottom: 0;
3376+ z-index: -10;
3377+ margin:auto;
3378+}
3379+#support-ribbon.horizontal #support-suboptions li {
3380+ float: left;
3381+ list-style-type: none;
3382+}
3383+#support-ribbon.horizontal #support-suboptions li a {
3384+ margin-bottom:5px;
3385+ display: block;
3386+ opacity: 0.9;
3387+ text-align: center;
3388+ color: #fff;
3389+ height: 38px;
3390+ line-height:38px;
3391+ width: 145px;
3392+ margin-right:5px;
3393+}
3394+
3395+html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,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:400;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-weight:inherit;font-size:100%;}legend{color:#000;}del,ins{text-decoration:none;}body,html{height:100%;margin:0;padding:0}form{display:inline}a{border:none;cursor:pointer}img{border:none}div,img{behavior:url(/static/css/iepngfix.htc)}em{font-style:italic;}del{text-decoration:line-through;}.hidden{display:none}#header{background:#333;height:95px;overflow:hidden;zoom:1}#header .header{height:95px;margin:0 auto;overflow:hidden;width:960px;zoom:1}#header .header .logo{float:left;overflow:hidden;padding:20px 0;width:240px;zoom:1}#header .header .logo{overflow:hidden;zoom:1;float:left;width:240px;padding:20px 0px;}#header .header .right{overflow:hidden;zoom:1;float:left;width:720px;height:35px;padding:30px 0px;}#header .header .right .searchlink{overflow:hidden;zoom:1;width:35px;height:35px;float:right;padding:0px 0px 0px 10px;}#header .header .right .navicontainer{overflow:hidden;zoom:1;float:right;height:35px;background:#ffffff url(ui-navi-l.png) top left no-repeat;}#header .header .right .navi{overflow:hidden;zoom:1;height:27px;padding:4px 10px;background:url(ui-navi-r.png) top right no-repeat;}#header .header .right .navicontainer .navi span{overflow:hidden;zoom:1;height:27px;float:left;margin:0px;}#header .header .right .navicontainer .navi span:hover{background:#f0f0f0 url(ui-navi-hover-l.png) top left no-repeat;}#header .header .right .navicontainer .navi span.selected,#header .header .right .navicontainer .navi span.selected:hover{background:#d5390b url(ui-navi-sel-l.png) top left no-repeat;}#header .header .right .navicontainer .navi span a,#header .header .right .navicontainer .navi span a:visited{display:block;padding:6px 10px 4px 10px;height:17px;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:14px;color:#000000;text-decoration:none;}#header .header .right .navicontainer .navi span a:hover{background:url(ui-navi-hover-r.png) top right no-repeat;}#header .header .right .navicontainer .navi span.selected a.selected,#header .header .right .navicontainer .navi span.selected a.selected:visited,#header .header .right .navicontainer .navi span.selected a.selected:hover{background:url(ui-navi-sel-r.png) top right no-repeat;color:#ffffff;}#slogan{overflow:hidden;zoom:1;height:125px;background:#d24300 urk(ui-orange-front.png) bottom center no-repeat;text-align:center;}#stripe{overflow:hidden;zoom:1;height:20px;background:#d24300 url(ui-orange-content.png) top center no-repeat;}#footer{overflow:hidden;zoom:1;background:#333333;border-top:2px #d95200 solid;}#footer .footer{overflow:hidden;zoom:1;width:960px;margin:0px auto;padding:10px 0px;}#footer .footer .logo{overflow:hidden;zoom:1;float:left;padding:17px 0px 0px 0px;}#footer .footer .text{overflow:hidden;zoom:1;float:right;text-align:right;font-family:Arial,Helvetica,sans-serif;font-size:11px;line-height:15px;color:#e0e0e0;}#footer .footer .text a,#footer .footer .text a:visited{color:#e0e0e0;text-decoration:none;}#footer .footer .text a:hover{color:#ffffff;text-decoration:underline;}div.navi-dropdown{display:none;position:absolute;overflow:hidden;zoom:1;width:255px;z-index:900;}div.navi-dropdown .navi-dropdown-header-l{overflow:hidden;zoom:1;width:255px;height:20px;background:url(ui-dropdown-header-l.png) top left no-repeat;}div.navi-dropdown .navi-dropdown-header-r{overflow:hidden;zoom:1;width:255px;height:20px;background:url(ui-dropdown-header-r.png) top left no-repeat;}div.navi-dropdown .navi-dropdown-content{overflow:hidden;zoom:1;width:225px;padding:0px 15px 5px 15px;background:#ffffff url(ui-dropdown-bg.png) repeat-y;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;color:#333333;}div.navi-dropdown .navi-dropdown-content .item{padding:3px 0px 1px 0px;}div.navi-dropdown .navi-dropdown-content a,div.navi-dropdown .navi-dropdown-content a:visited{display:block;color:#333333;text-decoration:none;}div.navi-dropdown .navi-dropdown-content a:hover{color:#d12907;text-decoration:underline;}div.navi-dropdown .navi-dropdown-footer{overflow:hidden;zoom:1;width:255px;height:10px;background:url(ui-dropdown-footer.png) top left no-repeat;}div.search-dropdown{display:none;position:absolute;overflow:hidden;zoom:1;width:255px;}div.search-dropdown .search-dropdown-header{overflow:hidden;zoom:1;width:255px;height:20px;background:url(ui-dropdown-header-search.png) top left no-repeat;}div.search-dropdown .search-dropdown-content{overflow:hidden;zoom:1;width:225px;padding:0px 15px 5px 15px;background:#ffffff url(ui-dropdown-bg.png) repeat-y;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;color:#333333;}div.search-dropdown .search-dropdown-content .form{padding-top:2px;}div.search-dropdown .search-dropdown-content .form input{border:1px #c0c0c0 solid;padding:4px;width:210px;outline:none;}div.search-dropdown .search-dropdown-content .form input:focus{border:1px #707070 solid;outline:none;}div.search-dropdown .search-dropdown-footer{overflow:hidden;zoom:1;width:255px;height:10px;background:url(ui-dropdown-footer.png) top left no-repeat;}#sidenavi{overflow:hidden;zoom:1;float:left;width:260px;border-top:1px #e0e0e0 solid;border-right:1px #e0e0e0 solid;margin:0px 30px 0px 0px;padding:0px 0px 20px 0px;font-family:Arial,Helvetica,sans-serif;font-size:18px;line-height:25px;color:#333333;}#sidenavi.noborder{border-top:none;border-right:none;margin:0px 31px 0px 0px;}#sidenavi .sidebanner{border-left:1px #e0e0e0 solid;border-bottom:1px #e0e0e0 solid;text-align:center;padding:15px 10px;}#sidenavi.noborder .sidebanner{border-top:1px #e0e0e0 solid;border-right:1px #e0e0e0 solid;}#sidenavi .sidebanner .header{padding:0px 0px 10px 0px;line-height:18px;text-align:center;}#sidenavi .sidebanner .numbers{padding:0px 0px 0px 58px;background:url(phone.png) 5px center no-repeat;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;text-align:left;}#sidenavi #sidefloater{padding-top:10px;}#sidenavi .item{padding:10px 10px 8px 10px;}#sidenavi > .item.selected{background:url(ui-leftnavi-sel.png) top left no-repeat;}#sidenavi a,#sidenavi a:visited{display:block;color:#333333;text-decoration:none;}#sidenavi a:hover{color:#d12907;text-decoration:none;}#sidenavi > .item.selected > a,#sidenavi > .item.selected > a:visited{color:#d12907;text-decoration:none;}#sidenavi .sidesubnavi{overflow:hidden;zoom:1;font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:17px;color:#333333;}#sidenavi .sidesubnavi .subitem{padding:7px 10px 0px 10px;}#sidenavi .sidesubnavi .subitem.selected a,#sidenavi .sidesubnavi .subitem.selected a:visited{color:#d12907;text-decoration:none;}#contentcontainer{overflow:hidden;zoom:1;width:960px;padding:30px 0px;margin:0px auto;}#content{overflow:hidden;zoom:1;font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:20px;color:#333333;}#content p{margin:10px 0px;}#content a,#content a:visited{color:#d12907;text-decoration:underline;}#content a:hover{color:#712000;text-decoration:underline;}#content h1{font-family:Arial,Helvetica,sans-serif;font-size:32px;line-height:40px;margin:5px 0px 20px 0px;color:#d12907;}#content h2{font-family:Arial,Helvetica,sans-serif;font-size:20px;line-height:20px;padding:0px 0px 3px 0px;margin:30px 0px 15px 0px;color:#000000;border-bottom:1px #e0e0e0 solid;}#content h3{font-family:Arial,Helvetica,sans-serif;font-weight:bold;font-size:16px;line-height:22px;margin:20px 0px 10px 0px;color:#000000;}#content h4{font-family:Arial,Helvetica,sans-serif;font-size:14px;line-height:14px;font-weight:bold;padding:5px 0px 0px 0px;margin:-16px 0px 20px 0px;color:#000000;border-top:1px #e0e0e0 solid;}#content h4 a,#content h4 a:visited{color:#000000;text-decoration:none;}#content h4 a:hover{color:#d12907;text-decoration:none;}#content dl dt{font-weight:bold;margin-top:10px;margin-bottom:10px;}#content dl dd{padding:0px 0px 0px 30px;}#content ul{list-style-type:square;padding:0px 0px 0px 30px;}#content ul li{list-style-type:square;margin:8px 0px;}#content ol{list-style-type:decimal;padding:0px 0px 0px 30px;}#content ol li{list-style-type:decimal;margin:8px 0px;}#content div.pagecontent{overflow:hidden;zoom:1;}div.contentbox{border:1px #e0e0e0 solid;}div.contentbox div.title{font-size:16px;line-height:20px;font-weight:bold;padding:8px 15px 2px 15px;background:url(ui-leftnavi-sel.png) repeat-x;}div.contentbox div.content{padding:15px;}div.frontpage-p{overflow:hidden;zoom:1;width:960px;margin:0px;margin-bottom:20px;padding:0px;}div.frontpage-p div.frontpage-p-container{overflow:hidden;zoom:1;width:960px;height:200px;padding-bottom:30px;z-index:100;}div.frontpage-p a.nivo-imageLink{position:absolute;top:0px;left:0px;width:960px;height:200px;border:0;padding:0;margin:0;z-index:20;display:none;}div.frontpage-p div.frontpage-p-container div.nivo-directionNav{width:1px;height:1px;display:none !important;z-index:18 !important;}div.frontpage-p div.frontpage-p-container div.nivo-controlNav{position:absolute;top:200px;width:960px;text-align:center;font-size:28px;line-height:25px;}div.frontpage-p div.frontpage-p-container div.nivo-controlNav a{padding:0px 3px;text-decoration:none !important;color:#919191 !important;}div.frontpage-p div.frontpage-p-container div.nivo-controlNav a.active{color:#d12907 !important;}div.frontpage-p div.frontpage-p-selector{overflow:hidden;zoom:1;height:20px;text-align:center;}div.frontpage-main{overflow:hidden;zoom:1;width:960px;margin:20px 0px;padding:0px;}div.frontpage-main div.frontpage-left{overflow:hidden;zoom:1;width:645px;float:left;padding:0px;}div.frontpage-boxes{overflow:hidden;zoom:1;width:645px;margin:25px 0px 0px 0px;padding:0px;}div.frontpage-boxes div.frontpage-boxes-selector{overflow:hidden;zoom:1;width:645px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item{overflow:hidden;zoom:1;width:160px;float:left;margin-left:-1px;border-top:1px #cccccc solid;border-left:1px #cccccc solid;border-right:1px #cccccc solid;border-bottom:1px #cccccc solid;text-align:center;margin-top:10px;padding:0px 0px 0px 0px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item:first-child{margin-left:0px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item.selected{background:url(ui-tab-bg.png) repeat-x;margin-top:0px;border-bottom:none;padding:5px 0px 6px 0px;}div.frontpage-boxes div.frontpage-boxes-selector div.frontpage-boxes-selector-item a{display:block;font-size:20px;line-height:20px;color:#444444 !important;text-decoration:none !important;padding:9px 0px 8px 0px;}div.frontpage-boxes div.frontpage-boxes-container{overflow:hidden;zoom:1;width:603px;height:150px;padding:20px;border-left:1px #cccccc solid;border-right:1px #cccccc solid;border-bottom:1px #cccccc solid;}div.frontpage-boxes div.frontpage-boxes-container div.frontpage-box img{padding:0px 15px 15px 5px;}div.frontpage-main div.frontpage-right{overflow:hidden;zoom:1;width:295px;float:right;margin-left:20px;padding:0px;}div.frontpage-block{overflow:hidden;zoom:1;border:1px #cccccc solid;width:288px;margin:0 0 20px 5px;}div.frontpage-block div.header{text-align:left;padding:15px 15px 0px 15px;background:url(ui-tab-bg.png) repeat-x;font-family:Arial,Helvetica,sans-serif;font-size:20px;line-height:20px;}div.frontpage-block div.content{overflow:hidden;zoom:1;padding:10px 15px 15px 15px;}div.frontpage-block div.content div.call-us{font-size:12px;line-height:17px;}div.frontpage-block div.content div.training{padding:20px;overflow:hidden;zoom:1;font-size:12px;line-height:17px;}div.frontpage-block div.content div.training ul.training-short-list{list-style-type:none !important;margin:0 !important;padding:0 !important;}div.frontpage-block div.content div.training ul.training-short-list li{list-style-type:none !important;}div.frontpage-block div.content div.more{overflow:hidden;zoom:1;text-align:right;padding:15px 0px 0px 0px;font-size:12px;line-height:17px;}.our-team-page h2{clear:both;}div.our-team-item{overflow:hidden;zoom:1;width:162px;margin-left:5px;height:230px;float:left;}div.our-team-item .img img{border:1px #e0e0e0 solid;padding:2px;}table.phonetable{margin-top:1em;border-collapse:collapse;}.phonetable{margin-left:2em;}table.phonetable th,table.phonetable tr{text-align:center;}table.phonetable th{border:1px #e0e0e0 solid;background:#f8f8f8;padding:7px;font-weight:bold;}table.phonetable td{border:1px #e0e0e0 solid;padding:7px;}table.phonetable .label{text-align:left;}table.phonetable td.label{padding-left:2em;}.form-item{clear:both;margin-top:1em;position:relative;}.form-item label{display:block;font-weight:bold;position:absolute;top:0;left:0;width:13em;}.form-required{color:#fa0;font-weight:bold;}.form-item .description{color:#888;font-size:0.85em;line-height:150%;position:relative;left:14em;}#edit-submitbutton{position:relative;left:12em;margin:1em 0;}.form-item input[type=text],.form-item select,.form-item textarea{border:1px solid #CCC;width:493px;position:relative;top:0;left:12em;}.form-item textarea{height:12em;padding:3px;}.form-item-spacer{padding-top:1em;}.form-item #captcha{position:relative;top:0;left:12em;}#edit-submitted-captcha{margin-top:0.5em;width:154px;}fieldset.form-item-set{border:1px solid #ccc;display:block;margin:12px 0;padding:12px;}fieldset.form-item-set legend{border:none;display:block;padding:0 2px;}div.error{background:#fff;border:solid 1px #c52020;color:#C52020;padding:5px;}div.messages{margin:5px 20px;font-size:11px;}div.messages ul,div.messages ul li{list-style-image:none;list-style-type:none;}div.messages ul li{padding:0 0 0.2em 0;}.form-item .error{background-color :#fdd;}#emergency-contacts .node-field-name{text-align:right;font-weight:bold;padding-right:1em;}#emergency-contacts .node-field-value-phone{font-weight:bold;color:#137F00;}#emergency-contacts .node-field-help{font-weight:bold;}#compact_footer{width:auto !important;}#compact_contentcontainer{overflow:hidden;zoom:1;width:auto;padding:30px 0px;margin:0px 20px;}.custlogo img{padding:20px;border:1px solid white;}.custlogo img:hover{border:1px solid gray;}table.formtable{border-collapse:collapse;}table.formtable th{font-weight:normal;white-space:nowrap;padding:4px 20px 4px 0px;}table.formtable td{padding:4px 0px 4px 0px;}table.formtable td input[type='text'],table.formtable td select{border:1px #e0e0e0 solid;padding:4px;width:400px;}table.formtable td.submit{padding:10px 0px 0px 0px;text-align:center;}table.datatable{margin-top:1em;border-collapse:collapse;}.datatable{margin-left:2em;}table.datatable th,table.datatable tr{text-align:center;}table.datatable th{border:1px #e0e0e0 solid;background:#f8f8f8;padding:7px;font-weight:bold;}table.datatable td{border:1px #e0e0e0 solid;padding:7px;}table.datatable .label{text-align:left;}table.datatable td.label{padding-left:2em;}.frontpage-sidebar .header{padding:0px 0px 10px 0px;font-size:18px;font-weight:normal;text-align:center;}.frontpage-sidebar .header.link{padding:13px 0px 10px 4px;text-align:left;}.frontpage-sidebar .header a,.frontpage-sidebar .header a:visited{color:#333333 !important;text-decoration:none !important;}.frontpage-sidebar .header a:hover{color:#d12907 !important;text-decoration:none !important;}.frontpage-sidebar .header.bloglink{font-size:16px;padding:0px 0px 10px 10px;text-align:center;}.frontpage-sidebar .header.blogheader{font-weight:normal;text-align:center;font-size:15px;padding:13px 10px 10px 0px;}.frontpage-sidebar .header a.email{padding:13px 10px 10px 40px;background:url(email-small.png) left center no-repeat;}.frontpage-sidebar .call-us .numbers{padding:0px 0px 0px 38px;background:url(phone-small.png) 2px center no-repeat;font-family:Arial,Helvetica,sans-serif;font-size:11px;line-height:18px;text-align:left;}.frontpage-sidebar .eventum a,.frontpage-sidebar .eventum a:visited{padding:0px 2px 0px 55px;font-size:12px;line-height:18px;text-align:left;background:url(support-small.png) left center no-repeat;display:block;color:#333333 !important;text-decoration:none !important;}.frontpage-sidebar .eventum a:hover{color:#d12907 !important;text-decoration:underline !important;}div.presentation{border-top:1px #e0e0e0 dotted;padding:15px 0px;}div.presentation:first-child{margin-top:0;border:none;}div.presentation table.presentation{border-collapse:collapse;}div.presentation table.presentation td div.bordered-image-screenshot{border:1px #e0e0e0 solid;background:#f8f8f8;padding:5px;}div.presentation table.presentation td.presentations-descr{padding-left:15px;}div.presentation table.presentation td.presentations-descr h4{font-size:18px;font-weight:bold;}.customer-vote{width:412px;text-align:justify;}strong{font-weight:bold;}html,body{height:100%;}#stickywrapper{position:relative;min-height:100%;}* html #stickywrapper{height:100%;}#stickycontent{padding-bottom:102px;}#stickyfooter{position:relative;margin:-97px auto 0 auto;}a.links{font-style:oblique;text-decoration:underline;}span.subpart{font-weight:bold;}div.software-info-container{overflow:hidden;zoom:1;float:right;padding:0px 0px 25px 25px;}table.software-info-container{width:240px;border-collapse:collapse;}table.software-info-container td{border:1px #e0e0e0 solid;padding:10px 10px 10px 10px;}table.software-info-container td.latest{padding:10px 10px 10px 62px;background:url(software-latest.png) 15px center no-repeat;min-height:32px;font-size:16px;line-height:24px;}table.software-info-container td.download a{font-weight:bold;}table.software-info-container td.download{padding:15px 62px 15px 20px;background:url(software-download.png) 195px center no-repeat;min-height:32px;font-size:18px;line-height:24px;}table.software-info-container td.links{text-align:left;padding:4px 10px 4px 20px;}table.software-info-container td.links div{margin:10px 0px;}.inv{display:none;}table.downloadstable{margin-top:20px;border-collapse:collapse;}table.downloadstable th{border:1px #e0e0e0 solid;background:#f8f8f8;padding:7px;font-weight:bold;}table.downloadstable td{border:1px #e0e0e0 solid;padding:7px;}table.downloadstable td.file{width:90%;text-align:left;}table.downloadstable td.modified{width:5%;text-align:center;white-space:nowrap;}table.downloadstable td.size{width:5%;text-align:right;white-space:nowrap;}div.downloads-maintenance-promo,div.downloads-warning{border:1px #e0e0e0 solid;padding:15px 20px 15px 150px;margin:30px 0px;background:url(shield.png) 35px center no-repeat;}div.downloads-maintenance-promo > .close-button{float:right;clear:right;margin-top:-10px;margin-right:-15px;cursor:pointer;cursor:hand;}div.downloads-warning{background:url(warning.png) 35px center no-repeat;}div.downloads-version{border-top:1px #e0e0e0 solid;margin-top:-10px;padding-top:10px;text-align:right;font-size:14px;line-height:14px;font-weight:bold;}div.downloads-anchors{font-size:12px;line-height:15px;margin:20px 0px;}div.downloads-backtotop{font-size:12px;line-height:15px;padding-top:8px;}.downloadsignupdialog .ui-dialog-titlebar{display:none;}#downloadsignup h2{font-family:Arial,Helvetica,sans-serif;font-size:22px;line-height:22px;margin:10px 0px 20px 0px;color:#d12907;}#downloadsignup .intro{margin:10px 0px 15px 0px;}#downloadsignup .form .field{overflow:hidden;zoom:1;margin:10px 0px;}#downloadsignup .form .field .label{overflow:hidden;zoom:1;width:150px;float:left;padding-top:5px;}#downloadsignup .form .field .element{overflow:hidden;zoom:1;width:410px;float:left;}#downloadsignup .form .field .element input,#downloadsignup .form .field .element select{width:400px;border:1px #cccccc solid;padding:3px;outline:none;}#downloadsignup .form .field .element input:focus,#downloadsignup .form .field .element select:focus{border:1px #333333 solid;background:#f8f8f8;outline:none;}#downloadsignup .form .field .radiolist{overflow:hidden;zoom:1;display:block;padding:0;margin:0;}#downloadsignup .form .field table.radiolist{width:100%;}#downloadsignup .form .field .radiolist td{width:25%;}#downloadsignup .form .field div.radiolist label{display:block;min-width:55px;float:left;zoom:1;padding:8px 10px 2px 24px !important;text-indent:-24px;overflow:auto;}#downloadsignup .form .field table.radiolist label{padding:8px 15px 2px 0px !important;zoom:1;display:block;}#downloadsignup .form .field .radiolist label input{margin:0px 7px 0px 3px !important;}.schedule td{padding:3px;border:1px solid #eeeeee;padding-left:10px;font-size:16px;}.tdmini{font-weight:bold;font-size:10px !important;}.tdbreak{background-color:#ffeeee;text-align:center;}.trhead td{background-color:#d12907;color:#ffffff;font-weight:bold;}.speaker{font-size:10px;}table.left-headers th{font-weight:bold;text-align:right;padding:5px 12px;vertical-align:top;border-right:1px solid black;}table.left-headers td{padding:5px 12px;}.training-list tr th{font-weight:bold;}.training-list tr td{padding-right:15px;}a.interwiki{background:transparent url(/docs/wiki/lib/images/interwiki.png) 0px 1px no-repeat;padding-left:16px;}a.iw_wp{background-image:url(/docs/wiki/lib/images/interwiki/wp.gif)}a.iw_wpfr{background-image:url(/docs/wiki/lib/images/interwiki/wpfr.gif)}a.iw_wpde{background-image:url(/docs/wiki/lib/images/interwiki/wpde.gif)}a.iw_wpes{background-image:url(/docs/wiki/lib/images/interwiki/wpes.gif)}a.iw_wppl{background-image:url(/docs/wiki/lib/images/interwiki/wppl.gif)}a.iw_wpjp{background-image:url(/docs/wiki/lib/images/interwiki/wpjp.gif)}a.iw_wpmeta{background-image:url(/docs/wiki/lib/images/interwiki/wpmeta.gif)}a.iw_doku{background-image:url(/docs/wiki/lib/images/interwiki/doku.gif)}a.iw_dokubug{background-image:url(/docs/wiki/lib/images/interwiki/dokubug.gif)}a.iw_amazon{background-image:url(/docs/wiki/lib/images/interwiki/amazon.gif)}a.iw_amazon_de{background-image:url(/docs/wiki/lib/images/interwiki/amazon.de.gif)}a.iw_amazon_uk{background-image:url(/docs/wiki/lib/images/interwiki/amazon.uk.gif)}a.iw_phpfn{background-image:url(/docs/wiki/lib/images/interwiki/phpfn.gif)}a.iw_coral{background-image:url(/docs/wiki/lib/images/interwiki/coral.gif)}a.iw_sb{background-image:url(/docs/wiki/lib/images/interwiki/sb.gif)}a.iw_google{background-image:url(/docs/wiki/lib/images/interwiki/google.gif)}a.iw_meatball{background-image:url(/docs/wiki/lib/images/interwiki/meatball.gif)}a.iw_wiki{background-image:url(/docs/wiki/lib/images/interwiki/wiki.gif)}a.mediafile{background:transparent url(/docs/wiki/lib/images/fileicons/file.png) 0px 1px no-repeat;padding-left:18px;padding-bottom:1px;}a.mf_txt{background-image:url(/docs/wiki/lib/images/fileicons/txt.png)}a.mf_sxi{background-image:url(/docs/wiki/lib/images/fileicons/sxi.png)}a.mf_tgz{background-image:url(/docs/wiki/lib/images/fileicons/tgz.png)}a.mf_wav{background-image:url(/docs/wiki/lib/images/fileicons/wav.png)}a.mf_jpg{background-image:url(/docs/wiki/lib/images/fileicons/jpg.png)}a.mf_sxd{background-image:url(/docs/wiki/lib/images/fileicons/sxd.png)}a.mf_js{background-image:url(/docs/wiki/lib/images/fileicons/js.png)}a.mf_ps{background-image:url(/docs/wiki/lib/images/fileicons/ps.png)}a.mf_conf{background-image:url(/docs/wiki/lib/images/fileicons/conf.png)}a.mf_swf{background-image:url(/docs/wiki/lib/images/fileicons/swf.png)}a.mf_xml{background-image:url(/docs/wiki/lib/images/fileicons/xml.png)}a.mf_py{background-image:url(/docs/wiki/lib/images/fileicons/py.png)}a.mf_cpp{background-image:url(/docs/wiki/lib/images/fileicons/cpp.png)}a.mf_css{background-image:url(/docs/wiki/lib/images/fileicons/css.png)}a.mf_jpeg{background-image:url(/docs/wiki/lib/images/fileicons/jpeg.png)}a.mf_odi{background-image:url(/docs/wiki/lib/images/fileicons/odi.png)}a.mf_pptx{background-image:url(/docs/wiki/lib/images/fileicons/pptx.png)}a.mf_doc{background-image:url(/docs/wiki/lib/images/fileicons/doc.png)}a.mf_bz2{background-image:url(/docs/wiki/lib/images/fileicons/bz2.png)}a.mf_png{background-image:url(/docs/wiki/lib/images/fileicons/png.png)}a.mf_ogg{background-image:url(/docs/wiki/lib/images/fileicons/ogg.png)}a.mf_xls{background-image:url(/docs/wiki/lib/images/fileicons/xls.png)}a.mf_tar{background-image:url(/docs/wiki/lib/images/fileicons/tar.png)}a.mf_pl{background-image:url(/docs/wiki/lib/images/fileicons/pl.png)}a.mf_mp3{background-image:url(/docs/wiki/lib/images/fileicons/mp3.png)}a.mf_pdf{background-image:url(/docs/wiki/lib/images/fileicons/pdf.png)}a.mf_audio{background-image:url(/docs/wiki/lib/images/fileicons/audio.png)}a.mf_rtf{background-image:url(/docs/wiki/lib/images/fileicons/rtf.png)}a.mf_java{background-image:url(/docs/wiki/lib/images/fileicons/java.png)}a.mf_cs{background-image:url(/docs/wiki/lib/images/fileicons/cs.png)}a.mf_odt{background-image:url(/docs/wiki/lib/images/fileicons/odt.png)}a.mf_c{background-image:url(/docs/wiki/lib/images/fileicons/c.png)}a.mf_rpm{background-image:url(/docs/wiki/lib/images/fileicons/rpm.png)}a.mf_docx{background-image:url(/docs/wiki/lib/images/fileicons/docx.png)}a.mf_ppt{background-image:url(/docs/wiki/lib/images/fileicons/ppt.png)}a.mf_odp{background-image:url(/docs/wiki/lib/images/fileicons/odp.png)}a.mf_html{background-image:url(/docs/wiki/lib/images/fileicons/html.png)}a.mf_gz{background-image:url(/docs/wiki/lib/images/fileicons/gz.png)}a.mf_zip{background-image:url(/docs/wiki/lib/images/fileicons/zip.png)}a.mf_gif{background-image:url(/docs/wiki/lib/images/fileicons/gif.png)}a.mf_htm{background-image:url(/docs/wiki/lib/images/fileicons/htm.png)}a.mf_sql{background-image:url(/docs/wiki/lib/images/fileicons/sql.png)}a.mf_rar{background-image:url(/docs/wiki/lib/images/fileicons/rar.png)}a.mf_rb{background-image:url(/docs/wiki/lib/images/fileicons/rb.png)}a.mf_csv{background-image:url(/docs/wiki/lib/images/fileicons/csv.png)}a.mf_odc{background-image:url(/docs/wiki/lib/images/fileicons/odc.png)}a.mf_odf{background-image:url(/docs/wiki/lib/images/fileicons/odf.png)}a.mf_deb{background-image:url(/docs/wiki/lib/images/fileicons/deb.png)}a.mf_ods{background-image:url(/docs/wiki/lib/images/fileicons/ods.png)}a.mf_xlsx{background-image:url(/docs/wiki/lib/images/fileicons/xlsx.png)}a.mf_lua{background-image:url(/docs/wiki/lib/images/fileicons/lua.png)}a.mf_sxc{background-image:url(/docs/wiki/lib/images/fileicons/sxc.png)}a.mf_odg{background-image:url(/docs/wiki/lib/images/fileicons/odg.png)}a.mf_7z{background-image:url(/docs/wiki/lib/images/fileicons/7z.png)}a.mf_sxw{background-image:url(/docs/wiki/lib/images/fileicons/sxw.png)}a.mf_php{background-image:url(/docs/wiki/lib/images/fileicons/php.png)}div.clearer{clear:both;line-height:0;height:0;overflow:hidden;}div.no{display:inline;margin:0;padding:0;}.hidden{display:none;}div.error{background:#fcc url(/docs/wiki/lib/styles/../images/error.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #faa;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}div.info{background:#ccf url(/docs/wiki/lib/styles/../images/info.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #aaf;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}div.success{background:#cfc url(/docs/wiki/lib/styles/../images/success.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #afa;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}div.notify{background:#ffc url(/docs/wiki/lib/styles/../images/notify.png) 0.5em 0px no-repeat;color:#000;border-bottom:1px solid #ffa;font-size:90%;margin:0;padding-left:3em;overflow:hidden;}.medialeft{float:left;}.mediaright{float:right;}.mediacenter{display:block;margin-left:auto;margin-right:auto;}.leftalign{text-align:left;}.centeralign{text-align:center;}.rightalign{text-align:right;}em.u{font-style:normal;text-decoration:underline;}em em.u{font-style:italic;}.code .br0{color:#6c6;}.code .co0{color:#808080;font-style:italic;}.code .co1{color:#808080;font-style:italic;}.code .co2{color:#808080;font-style:italic;}.code .co3{color:#808080;}.code .coMULTI{color:#808080;font-style:italic;}.code .es0{color:#009;font-weight:bold;}.code .kw1{color:#b1b100;}.code .kw2{color:#000;font-weight:bold;}.code .kw3{color:#006;}.code .kw4{color:#933;}.code .kw5{color:#00f;}.code .me1{color:#060;}.code .me2{color:#060;}.code .nu0{color:#c6c;}.code .re0{color:#00f;}.code .re1{color:#00f;}.code .re2{color:#00f;}.code .re3{color:#f33;font-weight:bold;}.code .re4{color:#099;}.code .st0{color:#f00;}.code .sy0{color:#6c6;}div#acl_manager div#acl__tree{font-size:90%;width:25%;height:300px;float:left;overflow:auto;border:1px solid #8cacbb;text-align:left;}div#acl_manager div#acl__tree a.cur{background-color:#ff9;font-weight:bold;}div#acl_manager div#acl__tree ul{list-style-type:none;margin:0;padding:0;}div#acl_manager div#acl__tree li{padding-left:1em;}div#acl_manager div#acl__tree ul img{margin-right:0.25em;cursor:pointer;}div#acl_manager div#acl__detail{width:73%;height:300px;float:right;overflow:auto;}div#acl_manager div#acl__detail fieldset{width:90%;}div#acl_manager div#acl__detail div#acl__user{border:1px solid #8cacbb;padding:0.5em;margin-bottom:0.6em;}div#acl_manager table.inline{width:100%;margin:0;}div#acl_manager .aclgroup{background:transparent url(/docs/wiki/lib/plugins/acl/pix/group.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager .acluser{background:transparent url(/docs/wiki/lib/plugins/acl/pix/user.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager .aclpage{background:transparent url(/docs/wiki/lib/plugins/acl/pix/page.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager .aclns{background:transparent url(/docs/wiki/lib/plugins/acl/pix/ns.png) 0px 1px no-repeat;padding:1px 0px 1px 18px;}div#acl_manager label.disabled{color:#666!important;}#acl_manager label{text-align:left;font-weight:normal;display:inline;}#acl_manager table{margin-left:10%;width:80%;}#acl_manager table tr{background-color:inherit;}#acl_manager table tr:hover{background-color:#dee7ec;}div.toolbar #tool__bar_table button.selected{background:#fff url(/docs/wiki/lib/plugins/edittable/images/buttonshadow_toggled.png) repeat-x bottom;}div.toolbar #tool__bar_table button.disabled{background:#fff url(/docs/wiki/lib/plugins/edittable/images/buttonshadow_toggled2.png) repeat-x bottom;opacity:0.4;}div.toolbar #tool__bar_table button.separator{margin-left:0.5em;}div.toolbar #tool__bar_table{margin-bottom:0.5em;}#dw__editform #edit__wrap{margin-top:1.5em;overflow:auto;border:1px solid #8cacbb;}div.dokuwiki table.edit{margin:-1px;}div.dokuwiki table.edit th,div.dokuwiki table.edit td{min-width:5em;}div.dokuwiki table.edit input{border:none;background:transparent;font:inherit;width:100%;}html>body div.dokuwiki table.edit th,html>body div.dokuwiki table.edit td{background-image:url(/docs/wiki/lib/plugins/edittable/images/inputshadow.png);background-repeat:repeat-x;background-position:top;}div.dokuwiki table.edit td.handle{color:#666;background-color:#f5f5f5;padding:0;vertical-align:bottom;position:relative;}div.dokuwiki table.edit td.rowhandle{width:3em;}div.dokuwiki table.edit td.handle{cursor:move;}div.dokuwiki table.edit td.curhandle{background-color:#dee7ec;}div.dokuwiki table.edit td.disabledhandle{background-image:none;background-color:#c0c0c0;cursor:no-drop;}html>body div.dokuwiki table.edit td.handle{background-image:url(/docs/wiki/lib/plugins/edittable/images/buttonshadow.png);background-repeat:repeat-x;background-position:bottom;}#table__dragmarker{display:block;height:100%;width:100%;position:relative;}#table__dragmarker .dragmarker_topright{position:absolute;top:-0.5em;right:0px;}#table__dragmarker .dragmarker_bottomright{position:absolute;top:0.5em;right:0px;}#table__dragmarker .dragmarker_bottomleft{position:absolute;top:0.5em;left:0px;}.handle .handle_dropdown{float:right;margin-top:3px;}.handle .handle_dropdown img{padding:4px 2px 1px;cursor:pointer;}#dw__editform .handle .handle_dropdown div{position:absolute;z-index:25;}#dw__editform .handle .handle_dropdown div ul{background:#fff none repeat scroll 0 0;border:1px solid;list-style-image:none;list-style-position:outside;list-style-type:none;opacity:0.9;padding:0.3em;margin:0;cursor:auto;font-size:0.9em;}#dw__editform .handle .handle_dropdown div ul li{width:100%;text-align:left;}#dw__editform .handle .handle_dropdown div ul li a{width:100%;display:block;cursor:pointer;}#dw__editform .handle .handle_dropdown div ul li a:hover{background:#dee7ec;}div.dokuwiki div.editbutton_table{margin-top:-1em;}div.dokuwiki div.editbutton_table form input.button{float:none;margin-left:0.6em;padding:0 0.3em;background-image:none;border-top:none;border-bottom-right-radius:0.5em;-moz-border-radius-bottomright:0.5em;-webkit-border-bottom-right-radius:0.5em;border-bottom-left-radius:0.5em;-moz-border-radius-bottomleft:0.5em;-webkit-border-bottom-left-radius:0.5em;}div.dokuwiki div.section_highlight table{background-color:#dee7ec;}div.dokuwiki div.table.section_highlight{background-color:transparent !important;}.noteredirect{margin:1em;margin-left:auto;margin-right:auto;width:70% !important;min-height:18px;clear:both;text-align:justify;vertical-align:middle;border-collapse:collapse;padding:7px 10px 5px 32px;background-position:10px 50%;background-repeat:no-repeat;-moz-border-radius:10px;-khtml-border-radius:10px;border-radius:10px;background-color:#B5E0FF;background-image:url(/docs/wiki/lib/plugins/pageredirect/images/important_small.png);}#user__manager tr.disabled{color:#6f6f6f;background:#e4e4e4;}#user__manager tr.user_info{vertical-align:top;}#user__manager div.edit_user{width:46%;float:left;}#user__manager table{margin-bottom:1em;}#user__manager input.button[disabled]{color:#ccc!important;border-color:#ccc!important;}#plugin__manager h2{margin-left:0;}#plugin__manager form{display:block;margin:0;padding:0;}#plugin__manager legend{display:none;}#plugin__manager fieldset{width:auto;}#plugin__manager .button{margin:0;}#plugin__manager p,#plugin__manager label{text-align:left;}#plugin__manager .hidden{display:none;}#plugin__manager .new{background:#dee7ec;}#plugin__manager input[disabled]{color:#ccc;border-color:#ccc;}#plugin__manager .pm_menu,#plugin__manager .pm_info{margin-left:0;text-align:left;}#plugin__manager .pm_menu{float:left;width:48%;}#plugin__manager .pm_info{float:right;width:50%;}#plugin__manager .common fieldset{margin:0;padding:0 0 1.0em 0;text-align:left;border:none;}#plugin__manager .common label{padding:0 0 0.5em 0;}#plugin__manager .common input.edit{width:24em;margin:0.5em;}#plugin__manager .plugins fieldset{color:#000;background:#fff;text-align:right;border-top:none;border-right:none;border-left:none;}#plugin__manager .plugins fieldset.protected{background:#fdd;color:#000;}#plugin__manager .plugins fieldset.disabled{background:#e0e0e0;color:#a8a8a8;}#plugin__manager .plugins .legend{color:#000;background:inherit;display:block;margin:0;padding:0;font-size:1em;line-height:1.4em;font-weight:normal;text-align:left;float:left;padding:0;clear:none;}#plugin__manager .plugins .button{font-size:95%;}#plugin__manager .plugins fieldset.buttons{border:none;}#plugin__manager .plugins fieldset.buttons .button{float:left;}#plugin__manager .pm_info h3{margin-left:0;}#plugin__manager .pm_info dl{margin:1em 0;padding:0;}#plugin__manager .pm_info dt{width:6em;float:left;clear:left;margin:0;padding:0;}#plugin__manager .pm_info dd{margin:0 0 0 7em;padding:0;background:none;}#plugin__manager .plugins .enable{float:left;width:auto;margin-right:0.5em;}.dokuwiki #plugin__captcha_wrapper img{margin:1px;vertical-align:bottom;border:1px solid #8cacbb;}#config__manager div.success,#config__manager div.error,#config__manager div.info{background-position:0.5em;padding:0.5em;text-align:center;}#config__manager fieldset{margin:1em;width:auto;margin-bottom:2em;background-color:#dee7ec;color:#000;padding:0 1em;}#config__manager legend{font-size:1.25em;}#config__manager form{}#config__manager table{margin:1em 0;width:100%;}#config__manager fieldset td{text-align:left;}#config__manager fieldset td.value{width:31em;}#config__manager td.label{padding:0.8em 0 0.6em 1em;vertical-align:top;}#config__manager td.label label{clear:left;display:block;}#config__manager td.label img{padding:0 10px;vertical-align:middle;float:right;}#config__manager td.label span.outkey{font-size:70%;margin-top:-1.7em;margin-left:-1em;display:block;background-color:#fff;color:#666;float:left;padding:0 0.1em;position:relative;z-index:1;}#config__manager td input.edit{width:30em;}#config__manager td .input{width:30.8em;}#config__manager td select.edit{}#config__manager td textarea.edit{width:27.5em;height:4em;}#config__manager tr .input,#config__manager tr input,#config__manager tr textarea,#config__manager tr select{background-color:#fff;color:#000;}#config__manager tr.default .input,#config__manager tr.default input,#config__manager tr.default textarea,#config__manager tr.default select,#config__manager .selectiondefault{background-color:#cdf;color:#000;}#config__manager tr.protected .input,#config__manager tr.protected input,#config__manager tr.protected textarea,#config__manager tr.protected select,#config__manager tr.protected .selection{background-color:#fcc!important;color:#000 !important;}#config__manager td.error{background-color:red;color:#000;}#config__manager .selection{width:14.8em;float:left;margin:0 0.3em 2px 0;}#config__manager .selection label{float:right;width:14em;font-size:90%;}* html #config__manager .selection label{padding-top:2px;}#config__manager .selection input.checkbox{padding-left:0.7em;}#config__manager .other{clear:both;padding-top:0.5em;}#config__manager .other label{padding-left:2px;font-size:90%;}div.noteclassic,div.noteimportant,div.notewarning,div.notetip{margin:2em;margin-left:auto;margin-right:auto;width:70% !important;min-height:40px;clear:both;text-align:justify;vertical-align:middle;border-collapse:collapse;padding:15px 20px 15px 80px;background-position:20px 50%;background-repeat:no-repeat;-moz-border-radius:20px;-khtml-border-radius:20px;border-radius:20px;}div.noteclassic{background-color:#eef;background-image:url(/docs/wiki/lib/plugins/note/images/note.png);}div.noteimportant{background-color:#ffc;background-image:url(/docs/wiki/lib/plugins/note/images/important.png);}div.notewarning{background-color:#fdd;background-image:url(/docs/wiki/lib/plugins/note/images/warning.png);}div.notetip{background-color:#dfd;background-image:url(/docs/wiki/lib/plugins/note/images/tip.png);}.dtree{font-family:Verdana,Geneva,Arial,Helvetica,sans-serif;font-size:11px;color:#000;white-space:nowrap;line-height:normal;}.dtree img{border:0px;vertical-align:top;}.dtree a{color:#090;text-decoration:none;}.dtree a.node,.dtree a.nodeSel a.navSel{white-space:nowrap;padding:1px 2px 1px 2px;}.dtree a.nodeSel{background-color:#dee7ec;}.dtree a.navSel{background-color:#ff9;}.indexmenu_nojs{display:block;}div.li a.indexmenu_idx{color:#f30 !important;text-decoration:none !important;font-weight:bold;}div.li a.indexmenu_idx_head{font-weight:bold;}div.dokuwiki div.indexmenu_list_themes{clear:both;border-top:2px solid #8cacbb;padding-left:1em;}.dtree a.nodeFdUrl:hover,.dtree a.nodeSel:hover,a.navSel:hover,.dtree a.nodeUrl:hover{color:#090;text-decoration:underline;background-color:#dee7ec;}.dtree a.node:hover{text-decoration:none;}.dtree .indexmenu_tocbullet{position:absolute;background:transparent url(/docs/wiki/lib/plugins/indexmenu/images/toc_bullet.gif) no-repeat scroll;vertical-align:middle;width:11px;height:11px;}.dtree .indexmenu_larrow{position:absolute;filter:alpha(opacity=60);-moz-opacity:.60;opacity:.60;background:transparent url(/docs/wiki/lib/plugins/indexmenu/images/larrow.gif) repeat-y scroll;padding-left:22px;z-index:100;}.indexmenu_toc{font-size:80%;line-height:1.2em;white-space:normal;overflow:hidden;width:200px !important;z-index:100 !important;word-wrap:break-word;}.indexmenu_toc .indexmenu_toc_inside{border:1px solid #8cacbb;background-color:#fff;text-align:left;padding:0.5em 0 0.7em 0;max-height:300px;height:expression( this.scrollHeight > 300 ? "300px":"auto" );overflow:auto;}.dtree .indexmenu_rarrow{position:absolute;background:white url(/docs/wiki/lib/plugins/indexmenu/images/rarrow.gif) no-repeat scroll;width:11px;height:15px;}.indexmenu_rmenu{position:absolute;z-index:100;background-color:#fff;border:1px solid black;font-size:80%;line-height:100%;padding-bottom:5px;}.indexmenu_rmenuhead{background:#CFC url(/docs/wiki/lib/plugins/indexmenu/images/close.gif) no-repeat scroll;border-bottom:1px solid #000;color:#000;font-size:90%;margin:0pt;text-align:left;padding:1px 15px;vertical-align:middle;overflow:hidden;width:80px;}.indexmenu_rmenu ul,.indexmenu_rmenu li{list-style-type:none !important;list-style-image:none !important;color:#000 !important;margin:2px !important;text-align:center;}.indexmenu_rmenu a:hover{background-color:#000 !important;color:#fff !important;}.indexmenu_opts{font-size:80%;}.dtree .emptynode{background:transparent url(/docs/wiki/lib/plugins/indexmenu/images/empty.gif) no-repeat scroll;display:inline;padding:1px 8px;width:16px;height:16px;vertical-align:top;zoom:1;}div.dokuwiki .header{padding:3px 0 0 2px;}div.dokuwiki .pagename{float:left;font-size:200%;font-weight:bolder;color:#dee7ec;text-align:left;vertical-align:middle;}div.dokuwiki .pagename a{color:#436976 !important;text-decoration:none !important;}div.dokuwiki .logo{float:right;font-size:220%;font-weight:bolder;text-align:right;vertical-align:middle;}div.dokuwiki .logo a{color:#dee7ec !important;text-decoration:none !important;font-variant:small-caps;letter-spacing:2pt;}div.dokuwiki .bar{border:1px #e0e0e0 solid;background:#f8f8f8;padding:10px;clear:both;}div.dokuwiki .bar-left{float:left;}div.dokuwiki .bar-right{float:right;text-align:right;}div.dokuwiki #bar__bottom{margin-bottom:3px;}div.dokuwiki .bar-tools{display:none;border-left:1px #e0e0e0 solid;border-right:1px #e0e0e0 solid;border-bottom:1px #e0e0e0 solid;background:#f8f8f8;padding:10px;clear:both;}div.dokuwiki div.meta{clear:both;margin:20px 0px 0px 0px;color:#638c9c;font-size:70%;}div.dokuwiki div.meta div.user{float:left;}div.dokuwiki div.meta div.doc{text-align:right;}*{padding:0;margin:0;}body{font:80% "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;background-color:#fff;color:#000;}div.dokuwiki div.page{text-align:justify;}div.dokuwiki table{font-size:100%;}div.dokuwiki tr,div.dokuwiki td,div.dokuwiki th{}div.dokuwiki img{border:0;}div.dokuwiki p,div.dokuwiki blockquote,div.dokuwiki table,div.dokuwiki pre{margin:0 0 1.0em 0;}div.dokuwiki hr{border:0px;border-top:1px solid #8cacbb;text-align:center;height:0px;}div.dokuwiki div.nothing{text-align:center;margin:2em;}div.dokuwiki form{border:none;display:inline;}div.dokuwiki label.block{display:block;text-align:right;font-weight:bold;}div.dokuwiki label.simple{display:block;text-align:left;font-weight:normal;}div.dokuwiki label.block input.edit{width:50%;}div.dokuwiki fieldset{width:300px;text-align:center;border:1px solid #8cacbb;padding:0.5em;margin:auto;}div.dokuwiki textarea.edit{font-family:monospace;font-size:14px;color:#000;background-color:#fff;border:1px solid #8cacbb;padding:0.3em 0 0 0.3em;width:100%;}html>body div.dokuwiki textarea.edit{background:#fff url(/docs/wiki/lib/tpl/default/images/inputshadow.png) repeat-x top;}div.dokuwiki input.edit,div.dokuwiki select.edit{font-size:100%;border:1px solid #8cacbb;color:#000;background-color:#fff;vertical-align:middle;margin:1px;padding:0.20em 0.3em;display:inline;}html>body div.dokuwiki input.edit,html>body div.dokuwiki select.edit{background:#fff url(/docs/wiki/lib/tpl/default/images/inputshadow.png) repeat-x top;}div.dokuwiki select.edit{padding:0.1em 0;}div.dokuwiki input.missing{font-size:100%;border:1px solid #8cacbb;color:#000;background-color:#fcc;vertical-align:middle;margin:1px;padding:0.20em 0.3em;display:inline;}div.dokuwiki textarea.edit[disabled],div.dokuwiki textarea.edit[readonly],div.dokuwiki input.edit[disabled],div.dokuwiki input.edit[readonly],div.dokuwiki input.button[disabled],div.dokuwiki select.edit[disabled]{background-color:#f5f5f5!important;color:#666!important;}div.dokuwiki div.toolbar,div.dokuwiki div#wiki__editbar{margin:2px 0;text-align:left;}div.dokuwiki div#size__ctl{float:right;width:60px;height:2.7em;}div.dokuwiki #size__ctl img{cursor:pointer;}div.dokuwiki div#wiki__editbar div.editButtons{float:left;padding:0 1.0em 0.7em 0;}div.dokuwiki div#wiki__editbar div.summary{float:left;}div.dokuwiki .nowrap{white-space:nowrap;}div.dokuwiki div#draft__status{float:right;color:#638c9c;}div.dokuwiki div.license{padding:0.5em;font-size:90%;text-align:center;}div.dokuwiki form#dw__editform div.license{clear:left;font-size:90%;}div.dokuwiki input.button,div.dokuwiki button.button{border:1px solid #8cacbb;color:#000;background-color:#fff;vertical-align:middle;text-decoration:none;font-size:100%;cursor:pointer;margin:1px;padding:0.125em 0.4em;}html>body div.dokuwiki input.button,html>body div.dokuwiki button.button{background:#fff url(/docs/wiki/lib/tpl/default/images/buttonshadow.png) repeat-x bottom;}* html div.dokuwiki input.button,* html div.dokuwiki button.button{height:1.8em;}div.dokuwiki div.secedit input.button{border:1px solid #8cacbb;color:#000;background-color:#fff;vertical-align:middle;text-decoration:none;margin:0;padding:0;font-size:10px;cursor:pointer;float:right;display:inline;}div.dokuwiki div.pagenav{margin:1em 0 0 0;}div.dokuwiki div.pagenav-prev{text-align:right;float:left;width:49%}div.dokuwiki div.pagenav-next{text-align:left;float:right;width:49%}div.dokuwiki a:link,div.dokuwiki a:visited{color:#436976;text-decoration:none;}div.dokuwiki a:hover,div.dokuwiki a:active{color:#000;text-decoration:underline;}div.dokuwiki h1 a{text-decoration:none !important;}div.dokuwiki h2 a,div.dokuwiki h3 a,div.dokuwiki h4 a,div.dokuwiki h5 a,div.dokuwiki a.nolink{color:#000 !important;text-decoration:none !important;}div.dokuwiki a.interwiki{}div.dokuwiki a.media{}div.dokuwiki a.mail{background:transparent url(/docs/wiki/lib/tpl/default/images/mail_icon.gif) 0px 1px no-repeat;padding:1px 0px 1px 16px;}div.dokuwiki a.wikilink2{text-decoration:none !important;border-bottom:dashed 1px #f30 !important;}div.dokuwiki div.preview{background-color:#f5f5f5;margin:0 0 0 2em;padding:4px;border:1px dashed #000;}div.dokuwiki div.breadcrumbs{background:url(http://s0.percona.com/ui-tab-bg.png) -14px left repeat-x;color:#999;font-size:11px;font-style:italic;padding:7px 0 15px 12px;}div.dokuwiki div.breadcrumbs a,div.dokuwiki div.breadcrumbs a:visited{color:#999 !important;border-color:#999 !important;}div.dokuwiki div.breadcrumbs a:hover{color:#d12907 !important;border-color:#d12907 !important;}div.dokuwiki span.user{color:#ccc;font-size:90%;}div.dokuwiki li.minor{color:#666;font-style:italic;}div.dokuwiki img.media{margin:3px;}div.dokuwiki img.medialeft{border:0;float:left;margin:0 1.5em 0 0;}div.dokuwiki img.mediaright{border:0;float:right;margin:0 0 0 1.5em;}div.dokuwiki img.mediacenter{border:0;display:block;margin:0 auto;}div.dokuwiki img.middle{vertical-align:middle;}div.dokuwiki acronym{cursor:help;border-bottom:1px dotted #000;}div.dokuwiki li.open{list-style-image:url(/docs/wiki/lib/tpl/default/images/open.gif);}div.dokuwiki li.closed{list-style-image:url(/docs/wiki/lib/tpl/default/images/closed.gif);}div.dokuwiki blockquote{border-left:2px solid #8cacbb;padding-left:3px;}div.dokuwiki pre{font-size:80%;padding:10px;border:1px dashed #8cacbb;color:#000;overflow:auto;}div.dokuwiki pre.pre{background-color:#f7f9fa;}div.dokuwiki pre.code{background-color:#f7f9fa;}div.dokuwiki pre.file{background-color:#dee7ec;}div.dokuwiki dl.file,div.dokuwiki dl.code{margin-top:2em;margin-bottom:2.5em;}div.dokuwiki dl.file dt,div.dokuwiki dl.code dt{border:1px dashed #8cacbb;display:inline;padding:0.1em 1em;margin-left:2em;}div.dokuwiki dl.code dt a,div.dokuwiki dl.file dt a{color:#000;}div.dokuwiki dl.code dt{background-color:#f7f9fa;border-bottom:1px solid #f7f9fa;}div.dokuwiki dl.file dt{background-color:#dee7ec;border-bottom:1px solid #dee7ec;}div.dokuwiki table.inline{background-color:#fff;border-spacing:0px;border-collapse:collapse;}div.dokuwiki table.inline th{padding:3px;border:1px solid #8cacbb;background-color:#dee7ec;}div.dokuwiki table.inline td{padding:3px;border:1px solid #8cacbb;}#toc{width:258px;font-size:12px;line-height:16px;clear:both;border:1px #e0e0e0 solid;background:#fff url(http://s1.percona.com/ui-tab-bg.png) top left repeat-x;}#toc div.tocheader{text-align:left;font-weight:bold;padding:7px 10px;margin-bottom:2px;font-size:16px;}#toc div.tocheader a,#toc div.tocheader a:visited{color:#000 !important;text-decoration:none !important;}#toc div.tocheader a:hover{color:#d12907 !important;text-decoration:none !important;}#toc span.toc_open,#toc span.toc_close{float:right;display:block;margin:0.4em 3px 0 0;}#toc span.toc_open span,#toc span.toc_close span{display:none;}#toc span.toc_open{margin-top:0.4em;border-top:0.4em solid #000;}#toc span.toc_close{margin-top:0;border-bottom:0.4em solid #000;}#toc #toc__inside{text-align:left;padding:1px 15px 15px 13px;}#toc ul.toc{list-style-type:none;padding-left:0px !important;margin:0;}#toc ul.toc ul{padding-left:15px !important;}#toc ul.toc li{margin:5px 0px !important;}#toc ul.toc li.clear{padding-left:0;}#toc a.toc:link,#toc a.toc:visited{color:#d12907;text-decoration:underline;}#toc a.toc:hover,#toc a.toc:active{color:#712000;text-decoration:underline;}div.dokuwiki table.diff{background-color:#fff;width:100%;}div.dokuwiki td.diff-blockheader{font-weight:bold;}div.dokuwiki table.diff th{border-bottom:1px solid #8cacbb;font-size:110%;width:50%;font-weight:normal;text-align:left;}div.dokuwiki table.diff th a{font-weight:bold;}div.dokuwiki table.diff th span.user{color:#000;font-size:80%;}div.dokuwiki table.diff th span.sum{font-size:80%;font-weight:bold;}div.dokuwiki table.diff th.minor{font-style:italic;}div.dokuwiki table.diff td{font-family:monospace;font-size:100%;}div.dokuwiki td.diff-addedline{background-color:#dfd;}div.dokuwiki td.diff-deletedline{background-color:#ffb;}div.dokuwiki td.diff-context{background-color:#f5f5f5;}div.dokuwiki table.diff td.diff-addedline strong,div.dokuwiki table.diff td.diff-deletedline strong{color:red;}div.dokuwiki div.footnotes{clear:both;border-top:1px solid #8cacbb;padding-left:1em;margin-top:1em;}div.dokuwiki div.fn{font-size:90%;}div.dokuwiki a.fn_bot{font-weight:bold;}div.insitu-footnote{font-size:80%;line-height:1.2em;border:1px solid #8cacbb;background-color:#f7f9fa;text-align:left;padding:4px;max-width:40%;}* html .insitu-footnote pre.code,* html .insitu-footnote pre.file{padding-bottom:18px;}div.dokuwiki .search_result{margin-bottom:6px;padding:0 10px 0 30px;}div.dokuwiki .search_snippet{color:#ccc;font-size:12px;margin-left:20px;}div.dokuwiki .search_sep{color:#000;}div.dokuwiki .search_hit{color:#000;background-color:#ff9;}div.dokuwiki strong.search_hit{font-weight:normal;}div.dokuwiki div.search_quickresult{margin:0 0 15px 30px;padding:0 10px 10px 0;border-bottom:1px dashed #8cacbb;}div.dokuwiki div.search_quickresult h3{margin:0 0 1.0em 0;font-size:1em;font-weight:bold;}div.dokuwiki ul.search_quickhits{margin:0 0 0.5em 1.0em;}div.dokuwiki ul.search_quickhits li{margin:0 1.0em 0 1.0em;float:left;width:30%;}div.dokuwiki div.section_highlight{background-color:#dee7ec;}div.footerinc{text-align:center;}.footerinc a img{opacity:0.5;border:0;}.footerinc a:hover img{opacity:1;}div.dokuwiki div.ajax_qsearch{position:absolute;right:237px;;width:200px;opacity:0.9;display:none;font-size:80%;line-height:1.2em;border:1px solid #8cacbb;background-color:#f7f9fa;text-align:left;padding:4px;}button.toolbutton{background-color:#fff;padding:0px;margin:0 1px 0 0;border:1px solid #8cacbb;cursor:pointer;}html>body button.toolbutton{background:#fff url(/docs/wiki/lib/tpl/default/images/buttonshadow.png) repeat-x bottom;}div.picker{width:250px;border:1px solid #8cacbb;background-color:#dee7ec;}div.pk_hl{width:125px;}button.pickerbutton{padding:0px;margin:0 1px 1px 0;border:0;background-color:transparent;font-size:80%;cursor:pointer;}div.dokuwiki div.img_big{float:left;margin-right:0.5em;}div.dokuwiki dl.img_tags dt{font-weight:bold;background-color:#dee7ec;}div.dokuwiki dl.img_tags dd{background-color:#f5f5f5;}div.dokuwiki div.imagemeta{color:#666;font-size:70%;line-height:95%;}div.dokuwiki div.imagemeta img.thumb{float:left;margin-right:0.1em;}div.dokuwiki h4{border-top:none !important;margin:20px 0px 20px 0px !important;}#media__manager{height:100%;overflow:hidden;}#media__left{width:30%;border-right:solid 1px #8cacbb;height:100%;overflow:auto;position:absolute;left:0;}#media__right{width:69.7%;height:100%;overflow:auto;position:absolute;right:0;}#media__manager h1{margin:0;padding:0;margin-bottom:0.5em;}#media__tree img{float:left;padding:0.5em 0.3em 0 0;}#media__tree ul{list-style-type:none;list-style-image:none;margin-left:1.5em;}#media__tree li{clear:left;list-style-type:none;list-style-image:none;}*+html #media__tree li,* html #media__tree li{border:1px solid #fff;}#media__opts{padding-left:1em;margin-bottom:0.5em;}#media__opts input{float:left;display:block;margin-top:4px;position:absolute;}*+html #media__opts input,* html #media__opts input{position:static;}#media__opts label{display:block;float:left;margin-left:20px;margin-bottom:4px;}*+html #media__opts label,* html #media__opts label{margin-left:10px;}#media__opts br{clear:left;}#media__content img.load{margin:1em auto;}#media__content #scroll__here{border:1px dashed #8cacbb;}#media__content .odd{background-color:#f7f9fa;padding:0.4em;}#media__content .even{padding:0.4em;}#media__content a.mediafile{margin-right:1.5em;font-weight:bold;}#media__content div.detail{padding:0.3em 0 0.3em 2em;}#media__content div.detail div.thumb{float:left;width:130px;text-align:center;margin-right:0.4em;}#media__content img.btn{vertical-align:text-bottom;}#media__content div.example{color:#666;margin-left:1em;}#media__content div.upload{font-size:90%;padding:0 0.5em 0.5em 0.5em;}#media__content form#dw__upload,#media__content div#dw__flashupload{display:block;border-bottom:solid 1px #8cacbb;padding:0 0.5em 1em 0.5em;}#media__content form#dw__upload fieldset{padding:0;margin:0;border:none;width:auto;}#media__content form#dw__upload p{text-align:left;padding:0.25em 0;margin:0;line-height:1.0em;}#media__content form#dw__upload label.check{float:none;width:auto;margin-left:11.5em;}#media__content form.meta{display:block;padding:0 0 1em 0;}#media__content form.meta label{display:block;width:25%;float:left;font-weight:bold;margin-left:1em;clear:left;}#media__content form.meta .edit{font:100% "Lucida Grande",Verdana,Lucida,Helvetica,Arial,sans-serif;float:left;width:70%;padding-right:0;padding-left:0.2em;margin:2px;}#media__content form.meta textarea.edit{height:8em;}#media__content form.meta div.metafield{clear:left;}#media__content form.meta div.buttons{clear:left;margin-left:20%;padding-left:1em;}#media__popup{background-color:#fff;display:none;border:1px solid #8cacbb;position:absolute;width:270px;}#media__popup h1{text-align:center;font-weight:normal;background-color:#dee7ec;height:16px;margin-bottom:5px;font-size:12px;border-bottom:0;}#media__popup p{display:block;line-height:14pt;margin:0.5em;}#media_nolink{padding:4px 0;}#media__popup label{float:left;width:9em;}#media__popup .button{margin-left:auto;margin-right:auto;}#media__popup .btnlbl{text-align:center;}#media__popup .btnlbl input{margin:0 1em;}#media__closeimg{float:right;}#media__linkopts label,#media__nolnk{width:80px;float:left;margin-left:10px;}#media__linkopts label{line-height:20px;}#media__nolnk,#media__linkopts label.long{margin-bottom:8px;line-height:12px;}#media__linkopts label.long{width:150px;float:none;}#media__linkopts br{clear:both;}#media__linkopts select{width:60px;margin-left:10px;}#media__linkopts input.edit{width:50px;margin-left:10px;}#media__linkopts #media__title{width:150px;}#admin__version{clear:left;float:right;color:#666;}.dokuwiki ul.admin_tasks{font-size:115%;float:left;width:40%;list-style-type:none;}.dokuwiki ul.admin_tasks li{line-height:22px;padding-left:35px;margin:1em 0;background:transparent none no-repeat scroll 0 0;text-align:left;}.dokuwiki ul.admin_tasks li div.li{font-weight:bold;}.dokuwiki ul.admin_tasks li.admin_acl{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/acl.png);}.dokuwiki ul.admin_tasks li.admin_usermanager{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/usermanager.png);}.dokuwiki ul.admin_tasks li.admin_plugin{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/plugin.png);}.dokuwiki ul.admin_tasks li.admin_config{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/config.png);}.dokuwiki ul.admin_tasks li.admin_revert{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/revert.png);}.dokuwiki ul.admin_tasks li.admin_popularity{background-image:url(/docs/wiki/lib/tpl/default/../../images/admin/popularity.png);}#link__wiz{position:absolute;display:block;z-index:99;width:300px;height:250px;padding:0;margin:0;overflow:hidden;border:1px solid #8cacbb;background-color:#f5f5f5;text-align:center;}#link__wiz_header{background-color:#dee7ec;height:16px;margin-bottom:5px;}#link__wiz_close{cursor:pointer;margin:0;}#link__wiz_result{background-color:#fff;width:293px;height:193px;overflow:auto;border:1px solid #8cacbb;margin:3px auto;text-align:left;}#link__wiz_result div.type_u{padding:3px 3px 3px 22px;background:transparent url(/docs/wiki/lib/tpl/default/../../images/up.png) 3px 3px no-repeat;}#link__wiz_result div.type_f{padding:3px 3px 3px 22px;background:transparent url(/docs/wiki/lib/tpl/default/../../images/page.png) 3px 3px no-repeat;}#link__wiz_result div.type_d{padding:3px 3px 3px 22px;background:transparent url(/docs/wiki/lib/tpl/default/../../images/ns.png) 3px 3px no-repeat;}#link__wiz_result div.even{background-color:#f5f5f5;}#link__wiz_result div.selected{background-color:#dee7ec;}#link__wiz_result span{display:block;color:#666;}.ondrag{cursor:move;opacity:0.8;}form#subscribe__form{display:block;width:300px;text-align:center;}form#subscribe__form fieldset{text-align:left;margin:0.5em 0;}form#subscribe__form label{display:block;margin:0 0.5em 0.5em;}
3396+
3397+
3398+
3399+/***
3400+ * side style buttons
3401+*/
3402+.a-btn-container {
3403+ overflow:hidden;
3404+ border-radius:4px;
3405+}
3406+.a-btn, .a-btn-green, .a-btn-red{
3407+
3408+ width: 245px;
3409+ background:#f2aa2e;
3410+ background:-webkit-gradient(linear,left top,left bottom,color-stop(##f2aa2e,0),color-stop(##c7401e,1));
3411+ background:-webkit-linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
3412+ background:-moz-linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
3413+ background:-o-linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
3414+ background:linear-gradient(top, #f2aa2e 0%, #c7401e 100%);
3415+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2aa2e', endColorstr='#c7401e',GradientType=0 );
3416+ border:1px solid #f5b74e;
3417+ border-color:#f5b74e #e5a73e #d6982f;
3418+ -webkit-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fee395;
3419+ -moz-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fee395;
3420+ box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fee395;
3421+ padding:0px;
3422+ height:65px;
3423+ display:inline-block;
3424+ position:relative;
3425+ -webkit-border-radius:4px;
3426+ -moz-border-radius:4px;
3427+ border-radius:4px;
3428+ float:left;
3429+ overflow:hidden;
3430+ -webkit-transition:all 0.3s linear;
3431+ -moz-transition:all 0.3s linear;
3432+ -o-transition:all 0.3s linear;
3433+ transition:all 0.3s linear;
3434+ text-decoration: none !important;
3435+}
3436+.a-btn-green{
3437+ background:#a1de78;
3438+ background:-webkit-gradient(linear,left top,left bottom,color-stop(##a1de78,0),color-stop(##a1de78,1));
3439+ background:-webkit-linear-gradient(top, #00e05a 0%, #006127 100%);
3440+ background:-moz-linear-gradient(center top , #00e05a 0%, #006127 130%);
3441+ background:-o-linear-gradient(top, #00e05a 0%, #006127 100%);
3442+ background:linear-gradient(top, #00e05a 0%, #006127 100%);
3443+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#00e05a', endColorstr='#444444',GradientType=0 );
3444+ border:1px solid #f5b74e;
3445+ border-color:#00ba4b #009A00 #007A31;
3446+ -webkit-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #00ED5F;
3447+ -moz-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #00ED5F;
3448+ box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #00ED5F;
3449+}
3450+
3451+.a-btn-red{
3452+ background:#e31300;
3453+ background:-webkit-gradient(linear,left top,left bottom,color-stop(##e31300,0),color-stop(##6b0900,1));
3454+ background:-webkit-linear-gradient(top, #e31300 0%, #6b0900 100%);
3455+ background:-moz-linear-gradient(center top , #e31300 0%, #6b0900 130%);
3456+ background:-o-linear-gradient(top, #e31300 0%, #6b0900 100%);
3457+ background:linear-gradient(top, #e31300 0%, #6b0900 100%);
3458+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#e31300', endColorstr='#444444',GradientType=0 );
3459+ border:1px solid #ff2d19;
3460+ border-color:#e85345 #b00f00 #63241e;
3461+ -webkit-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fa430c;
3462+ -moz-box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fa430c;
3463+ box-shadow:0 1px 1px #d3d3d3, inset 0 1px 0 #fa430c;
3464+}
3465+
3466+
3467+.a-btn-text{
3468+ padding-left:15px;
3469+ padding-top:10px;
3470+ display:block;
3471+ font-size:18px;
3472+ white-space:nowrap;
3473+ color: #f5f1ea;
3474+ text-shadow:0 1px 0 #000;
3475+ -webkit-transition:all 0.3s linear;
3476+ -moz-transition:all 0.3s linear;
3477+ -o-transition:all 0.3s linear;
3478+ transition:all 0.3s linear;
3479+
3480+}
3481+.a-btn-green .a-btn-text {
3482+ color: #fff;
3483+}
3484+
3485+.a-btn-slide-text, .a-btn-fixed-slide-text {
3486+ position:absolute;
3487+ top:35px;
3488+ left:0px;
3489+ width:auto;
3490+ right:52px;
3491+ height:0px;
3492+ background:#fff;
3493+ color:#996633;
3494+ font-size:13px;
3495+ white-space:nowrap;
3496+ font-family:Georgia, serif;
3497+ font-style:italic;
3498+ text-indent:15px;
3499+ overflow:hidden;
3500+ line-height:30px;
3501+ -webkit-box-shadow:-1px 0px 1px rgba(255,255,255,0.4), 1px 1px 1px rgba(0,0,0,0.5) inset;
3502+ -moz-box-shadow:-1px 0px 1px rgba(255,255,255,0.4), 1px 1px 1px rgba(0,0,0,0.5) inset;
3503+ box-shadow:-1px 0px 1px rgba(255,255,255,0.4), 1px 1px 1px rgba(0,0,0,0.5) inset;
3504+ -webkit-transition:height 0.3s linear;
3505+ -moz-transition:height 0.3s linear;
3506+ -o-transition:height 0.3s linear;
3507+ transition:height 0.3s linear;
3508+}
3509+.a-btn-fixed-slide-text{
3510+ height: 30px;
3511+}
3512+
3513+.a-btn-icon-right{
3514+ position:absolute;
3515+
3516+ right:0px;
3517+ top:0px;
3518+ height:100%;
3519+ width:52px;
3520+ border-left:1px solid #f5b74e;
3521+ -webkit-box-shadow:1px 0px 1px rgba(255,255,255,0.4) inset;
3522+ -moz-box-shadow:1px 0px 1px rgba(255,255,255,0.4) inset;
3523+ box-shadow:1px 0px 1px rgba(255,255,255,0.4) inset;
3524+}
3525+.a-btn-red .a-btn-icon-right {
3526+ border-left: 1px solid #fa430c;
3527+}
3528+.a-btn-icon-right span{
3529+ width:38px;
3530+ height:38px;
3531+
3532+ position:absolute;
3533+ left:50%;
3534+ top:50%;
3535+ margin:-20px 0px 0px -20px;
3536+ background:transparent url(/static/images/software-download-white-brdr.png) no-repeat 50% 55%;
3537+ -webkit-transition:all 0.3s linear;
3538+ -moz-transition:all 0.3s linear;
3539+ -o-transition:all 0.3s linear;
3540+ transition:all 0.3s linear;
3541+
3542+}
3543+.a-btn-green .a-btn-icon-right span {
3544+ background:transparent url(/static/images/software-download-white-brdr-green3.png) no-repeat 50% 55%;
3545+}
3546+.a-btn-red .a-btn-icon-right span {
3547+
3548+ background:transparent url(/static/images/software-download-white-brdr-red.png) no-repeat 50% 55%;
3549+}
3550+.a-btn:hover{
3551+ height:65px;
3552+ -webkit-box-shadow:0px 1px 1px rgba(255,255,255,0.8) inset, 1px 1px 5px rgba(0,0,0,0.4);
3553+ -moz-box-shadow:0px 1px 1px rgba(255,255,255,0.8) inset, 1px 1px 5px rgba(0,0,0,0.4);
3554+ box-shadow:0px 1px 1px rgba(255,255,255,0.8) inset, 1px 1px 5px rgba(0,0,0,0.4);
3555+}
3556+.a-btn:hover .a-btn-text{
3557+
3558+ text-shadow:0 1px 0 #000;
3559+ color:#fff;
3560+}
3561+.a-btn:hover .a-btn-slide-text:hover{
3562+ height:30px;
3563+}
3564+.a-btn:hover .a-btn-icon-right span{
3565+ opacity:1;
3566+ /**
3567+ -webkit-transform:rotate(-45deg);
3568+ -moz-transform:rotate(-45deg);
3569+ -ms-transform:rotate(-45deg);
3570+ -o-transform:rotate(-45deg);
3571+ transform:rotate(-45deg);
3572+ */
3573+}
3574+.a-btn:active{
3575+ position:relative;
3576+ top:1px;
3577+ background:#fec354;
3578+ background:-webkit-gradient(linear,left top,left bottom,color-stop(#fec354,0),color-stop(#fecd61,1));
3579+ background:-webkit-linear-gradient(top, #fec354 0%, #fecd61 100%);
3580+ background:-moz-linear-gradient(top, #fec354 0%, #fecd61 100%);
3581+ background:-o-linear-gradient(top, #fec354 0%, #fecd61 100%);
3582+ background:linear-gradient(top, #fec354 0%, #fecd61 100%);
3583+ filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fec354', endColorstr='#fecd61',GradientType=0 );
3584+ border-color:#d29a3a #cc9436 #c89133;
3585+ text-shadow:0 1px 0 #fee1a0;
3586+ -webkit-box-shadow:0 1px 1px #d4d4d4, inset 0 1px 0 #fed17e;
3587+ -moz-box-shadow:0 1px 1px #d4d4d4, inset 0 1px 0 #fed17e;
3588+ box-shadow:0 1px 1px #d4d4d4, inset 0 1px 0 #fed17e;
3589+}
3590+.body .section blockquote {
3591+ margin-left: 25px;
3592+}
3593
3594=== added file 'doc/source/percona-theme/static/percona.com.js'
3595--- doc/source/percona-theme/static/percona.com.js 1970-01-01 00:00:00 +0000
3596+++ doc/source/percona-theme/static/percona.com.js 2012-07-17 08:41:18 +0000
3597@@ -0,0 +1,269 @@
3598+window.jQuery(function($) {
3599+
3600+
3601+
3602+function setCookie(c_name, value, expiredays)
3603+{
3604+ var exdate = new Date();
3605+ exdate.setDate(exdate.getDate() + expiredays);
3606+ document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";path=/;expires=" + exdate.toUTCString());
3607+}
3608+
3609+function getCookie(c_name)
3610+{
3611+ if (document.cookie.length > 0)
3612+ {
3613+ c_start = document.cookie.indexOf(c_name + "=");
3614+ if (c_start != -1)
3615+ {
3616+ c_start = c_start + c_name.length+1;
3617+ c_end = document.cookie.indexOf(";",c_start);
3618+ if (c_end == -1)
3619+ {
3620+ c_end = document.cookie.length;
3621+ }
3622+ return unescape(document.cookie.substring(c_start, c_end));
3623+ }
3624+ }
3625+ return "";
3626+}
3627+
3628+
3629+NAVI = new Object();
3630+
3631+NAVI.CloseTimer = null;
3632+
3633+NAVI.Open = function ( menu_tag, dir )
3634+{
3635+ NAVI_CancelTimer();
3636+ NAVI_Close();
3637+ SEARCH_CancelTimer();
3638+ SEARCH_Close();
3639+ if ('h' == dir)
3640+ {
3641+ return;
3642+ }
3643+ var pos = $("#navilink-span-"+menu_tag).offset();
3644+ if (dir=='r')
3645+ {
3646+ $("#navi-dropdown-"+menu_tag).css( { "position": "absolute", "left": (pos.left + ($("#navilink-span-"+menu_tag).width()) + 2 - ($("#navi-dropdown-"+menu_tag).width())) + "px", "top": (pos.top + 32) + "px" } );
3647+ }
3648+ else
3649+ {
3650+ $("#navi-dropdown-"+menu_tag).css( { "position": "absolute", "left": (pos.left) + "px", "top": (pos.top + 32) + "px" } );
3651+ }
3652+ $("#navi-dropdown-"+menu_tag).show();
3653+ $("#navilink-span-"+menu_tag).bind('mouseover',NAVI_CancelTimer);
3654+ $("#navilink-span-"+menu_tag).bind('mouseout',NAVI_Timer);
3655+ $("#navi-dropdown-"+menu_tag).bind('mouseover',NAVI_CancelTimer);
3656+ $("#navi-dropdown-"+menu_tag).bind('mouseout',NAVI_Timer);
3657+};
3658+
3659+function NAVI_Close()
3660+{
3661+ $(".navi-dropdown").hide();
3662+ $("#menu div").unbind('mouseover');
3663+ $(".dropdown").unbind('mouseover');
3664+ $(".dropdown").unbind('mouseout');
3665+
3666+ $("#search-dropdown").hide();
3667+ $("#searchlink-anchor").unbind('mouseover');
3668+ $("#searchlink-anchor").unbind('mouseout');
3669+ $("#search-dropdown").unbind('mouseover');
3670+ $("#search-dropdown").unbind('mouseout');
3671+}
3672+
3673+function NAVI_CancelTimer()
3674+{
3675+ if (NAVI.CloseTimer!=null)
3676+ {
3677+ window.clearTimeout(NAVI.CloseTimer);
3678+ NAVI.CloseTimer = null;
3679+ }
3680+}
3681+
3682+function NAVI_Timer()
3683+{
3684+ if (NAVI.CloseTimer==null)
3685+ {
3686+ NAVI.CloseTimer = window.setTimeout(NAVI_Close, 300);
3687+ }
3688+}
3689+
3690+
3691+SUBNAVI = new Object();
3692+
3693+SUBNAVI.Open = function ( menu_tag )
3694+{
3695+ if ($("#sidesubnavi-" + menu_tag + ':hidden').length)
3696+ {
3697+ $(".sidesubnavi").hide();
3698+ $("#sidesubnavi-"+menu_tag).show();
3699+ return false;
3700+ } else {
3701+ return true;
3702+ }
3703+};
3704+
3705+
3706+SEARCH = new Object();
3707+
3708+SEARCH.CloseTimer = null;
3709+
3710+SEARCH.Open = function()
3711+{
3712+ NAVI_CancelTimer();
3713+ NAVI_Close();
3714+ SEARCH_CancelTimer();
3715+ SEARCH_Close();
3716+ var pos = $("#searchlink-anchor").offset();
3717+ $("#search-dropdown").css( { "position": "absolute", "left": (pos.left - ($("#search-dropdown").width()) + 40) + "px", "top": (pos.top + 36) + "px" } );
3718+ $("#search-dropdown").show();
3719+ $("#searchlink-anchor").bind('mouseover',NAVI_CancelTimer);
3720+ $("#searchlink-anchor").bind('mouseout',NAVI_Timer);
3721+ $("#search-dropdown").bind('mouseover',NAVI_CancelTimer);
3722+ $("#search-dropdown").bind('mouseout',NAVI_Timer);
3723+ $("#search-input")[0].focus();
3724+};
3725+
3726+function SEARCH_Close()
3727+{
3728+ $(".navi-dropdown").hide();
3729+ $("#menu div").unbind('mouseover');
3730+ $(".dropdown").unbind('mouseover');
3731+ $(".dropdown").unbind('mouseout');
3732+
3733+ $("#search-dropdown").hide();
3734+ $("#searchlink-anchor").unbind('mouseover');
3735+ $("#searchlink-anchor").unbind('mouseout');
3736+ $("#search-dropdown").unbind('mouseover');
3737+ $("#search-dropdown").unbind('mouseout');
3738+}
3739+
3740+
3741+function SEARCH_CancelTimer()
3742+{
3743+ if (SEARCH.CloseTimer!=null)
3744+ {
3745+ window.clearTimeout(SEARCH.CloseTimer);
3746+ SEARCH.CloseTimer = null;
3747+ }
3748+}
3749+
3750+function SEARCH_Timer()
3751+{
3752+ if (SEARCH.CloseTimer==null)
3753+ {
3754+ SEARCH.CloseTimer = window.setTimeout(SEARCH_Close, 300);
3755+ }
3756+}
3757+
3758+menuImg1 = new Image(); menuImg1.src = 'http://s1.percona.com/ui-dropdown-header-l.png';
3759+menuImg2 = new Image(); menuImg2.src = 'http://s2.percona.com/ui-dropdown-header-r.png';
3760+menuImg3 = new Image(); menuImg3.src = 'http://s3.percona.com/ui-dropdown-header-search.png';
3761+menuImg4 = new Image(); menuImg4.src = 'http://s0.percona.com/ui-dropdown-bg.png';
3762+menuImg5 = new Image(); menuImg5.src = 'http://s1.percona.com/ui-dropdown-footer.png';
3763+
3764+
3765+});
3766+
3767+
3768+var Percona = {
3769+ ssl: false,
3770+ host: 'www.percona.com'
3771+};
3772+/**
3773+ * @param string selector jQuery selector string
3774+ */
3775+Percona.getRecentServerVersion = function(selector)
3776+{
3777+ if ('string' != typeof(selector))
3778+ {
3779+ alert('Percona.getRecentServerVersion: missed or wrong selector!');
3780+ }
3781+ /* Localize jQuery variable */
3782+ var jQuery;
3783+ /******** Load jQuery if not present *********/
3784+ if (window.jQuery === undefined || window.jQuery.fn.jquery !== '1.4.2')
3785+ {
3786+ var script_tag = document.createElement('script');
3787+ script_tag.setAttribute("type","text/javascript");
3788+ script_tag.setAttribute('src', 'http' + (Percona.ssl ? 's' : '') + ':/' + '/ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js');
3789+ script_tag.onload = scriptLoadHandler;
3790+ script_tag.onreadystatechange = function () /* Same thing but for IE */
3791+ {
3792+ if (this.readyState == 'complete' || this.readyState == 'loaded')
3793+ {
3794+ scriptLoadHandler();
3795+ }
3796+ };
3797+ /* Try to find the head, otherwise default to the documentElement */
3798+ (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);
3799+ } else {
3800+ /* The jQuery version on the window is the one we want to use */
3801+ jQuery = window.jQuery;
3802+ main();
3803+ }
3804+ var scriptLoadHandler_counter = 0;
3805+ /******** Called once jQuery has loaded ******/
3806+ function scriptLoadHandler()
3807+ {
3808+ if (++scriptLoadHandler_counter > 1)
3809+ {
3810+ return;
3811+ }
3812+ /* Restore $ and window.jQuery to their previous values and store the
3813+ new jQuery in our local jQuery variable */
3814+ jQuery = window.jQuery.noConflict(true);
3815+ /* Call our main function */
3816+ main(jQuery);
3817+ }
3818+ /******** Our main function ********/
3819+ function main($)
3820+ {
3821+ var fillRecentServerVersion = function($)
3822+ {
3823+ if ($(selector).get(0))
3824+ {
3825+ $.get('http' + (Percona.ssl ? 's' : '') + ':/' + '/' + Percona.host + '/ajax/server-version/?callback=?', {}, function(json)
3826+ {
3827+ if ('object' == typeof(json) && 'string' == typeof(json.recentServerVersion))
3828+ {
3829+ $(selector).text(' ' + json.recentServerVersion);
3830+ }
3831+ }, 'jsonp');
3832+ }
3833+ };
3834+ $(document).ready(function()
3835+ {
3836+ fillRecentServerVersion(jQuery);
3837+ });
3838+ }
3839+};
3840+
3841+$(document).ready(function(){
3842+ $(window).bind("resize", resizeWindow);
3843+ resizeWindow();
3844+ function resizeWindow() {
3845+ var win_w = $(window).width();
3846+ var ribon = $("#support-ribbon");
3847+ if(win_w < 1265){
3848+ if(/mobile/i.test(navigator.userAgent)){
3849+ ribon.hide();
3850+ }else{
3851+ if(ribon.hasClass("vertical")){
3852+ ribon.removeClass("vertical");
3853+ ribon.addClass("horizontal");
3854+ }
3855+ ribon.css({"left":'50%', "margin-left": '-'+(ribon.width() / 2)+'px'});
3856+ }
3857+ }else{
3858+ if(ribon.hasClass("horizontal")){
3859+ ribon.addClass("vertical");
3860+ ribon.removeClass("horizontal");
3861+ ribon.removeAttr("style");
3862+ }
3863+
3864+ }
3865+ }
3866+});
3867\ No newline at end of file
3868
3869=== added file 'doc/source/percona-theme/static/phone-small.png'
3870Binary files doc/source/percona-theme/static/phone-small.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/phone-small.png 2012-07-17 08:41:18 +0000 differ
3871=== added file 'doc/source/percona-theme/static/phone.png'
3872Binary files doc/source/percona-theme/static/phone.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/phone.png 2012-07-17 08:41:18 +0000 differ
3873=== added file 'doc/source/percona-theme/static/shield.png'
3874Binary files doc/source/percona-theme/static/shield.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/shield.png 2012-07-17 08:41:18 +0000 differ
3875=== added file 'doc/source/percona-theme/static/sidebar.js'
3876--- doc/source/percona-theme/static/sidebar.js 1970-01-01 00:00:00 +0000
3877+++ doc/source/percona-theme/static/sidebar.js 2012-07-17 08:41:18 +0000
3878@@ -0,0 +1,151 @@
3879+/*
3880+ * sidebar.js
3881+ * ~~~~~~~~~~
3882+ *
3883+ * This script makes the Sphinx sidebar collapsible.
3884+ *
3885+ * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
3886+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
3887+ * used to collapse and expand the sidebar.
3888+ *
3889+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
3890+ * and the width of the sidebar and the margin-left of the document
3891+ * are decreased. When the sidebar is expanded the opposite happens.
3892+ * This script saves a per-browser/per-session cookie used to
3893+ * remember the position of the sidebar among the pages.
3894+ * Once the browser is closed the cookie is deleted and the position
3895+ * reset to the default (expanded).
3896+ *
3897+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
3898+ * :license: BSD, see LICENSE for details.
3899+ *
3900+ */
3901+
3902+$(function() {
3903+ // global elements used by the functions.
3904+ // the 'sidebarbutton' element is defined as global after its
3905+ // creation, in the add_sidebar_button function
3906+ var bodywrapper = $('.bodywrapper');
3907+ var sidebar = $('.sphinxsidebar');
3908+ var sidebarwrapper = $('.sphinxsidebarwrapper');
3909+
3910+ // for some reason, the document has no sidebar; do not run into errors
3911+ if (!sidebar.length) return;
3912+
3913+ // original margin-left of the bodywrapper and width of the sidebar
3914+ // with the sidebar expanded
3915+ var bw_margin_expanded = bodywrapper.css('margin-left');
3916+ var ssb_width_expanded = sidebar.width();
3917+
3918+ // margin-left of the bodywrapper and width of the sidebar
3919+ // with the sidebar collapsed
3920+ var bw_margin_collapsed = '.8em';
3921+ var ssb_width_collapsed = '.8em';
3922+
3923+ // colors used by the current theme
3924+ var dark_color = $('.related').css('background-color');
3925+ var light_color = $('.document').css('background-color');
3926+
3927+ function sidebar_is_collapsed() {
3928+ return sidebarwrapper.is(':not(:visible)');
3929+ }
3930+
3931+ function toggle_sidebar() {
3932+ if (sidebar_is_collapsed())
3933+ expand_sidebar();
3934+ else
3935+ collapse_sidebar();
3936+ }
3937+
3938+ function collapse_sidebar() {
3939+ sidebarwrapper.hide();
3940+ sidebar.css('width', ssb_width_collapsed);
3941+ bodywrapper.css('margin-left', bw_margin_collapsed);
3942+ sidebarbutton.css({
3943+ 'margin-left': '0',
3944+ 'height': bodywrapper.height()
3945+ });
3946+ sidebarbutton.find('span').text('»');
3947+ sidebarbutton.attr('title', _('Expand sidebar'));
3948+ document.cookie = 'sidebar=collapsed';
3949+ }
3950+
3951+ function expand_sidebar() {
3952+ bodywrapper.css('margin-left', bw_margin_expanded);
3953+ sidebar.css('width', ssb_width_expanded);
3954+ sidebarwrapper.show();
3955+ sidebarbutton.css({
3956+ 'margin-left': ssb_width_expanded-12,
3957+ 'height': bodywrapper.height()
3958+ });
3959+ sidebarbutton.find('span').text('«');
3960+ sidebarbutton.attr('title', _('Collapse sidebar'));
3961+ document.cookie = 'sidebar=expanded';
3962+ }
3963+
3964+ function add_sidebar_button() {
3965+ sidebarwrapper.css({
3966+ 'float': 'left',
3967+ 'margin-right': '0',
3968+ 'width': ssb_width_expanded - 28
3969+ });
3970+ // create the button
3971+ sidebar.append(
3972+ '<div id="sidebarbutton"><span>&laquo;</span></div>'
3973+ );
3974+ var sidebarbutton = $('#sidebarbutton');
3975+ light_color = sidebarbutton.css('background-color');
3976+ // find the height of the viewport to center the '<<' in the page
3977+ var viewport_height;
3978+ if (window.innerHeight)
3979+ viewport_height = window.innerHeight;
3980+ else
3981+ viewport_height = $(window).height();
3982+ sidebarbutton.find('span').css({
3983+ 'display': 'block',
3984+ 'margin-top': (viewport_height - sidebar.position().top - 20) / 2
3985+ });
3986+
3987+ sidebarbutton.click(toggle_sidebar);
3988+ sidebarbutton.attr('title', _('Collapse sidebar'));
3989+ sidebarbutton.css({
3990+ 'color': '#FFFFFF',
3991+ 'border-left': '1px solid ' + dark_color,
3992+ 'font-size': '1.2em',
3993+ 'cursor': 'pointer',
3994+ 'height': bodywrapper.height(),
3995+ 'padding-top': '1px',
3996+ 'margin-left': ssb_width_expanded - 12
3997+ });
3998+
3999+ sidebarbutton.hover(
4000+ function () {
4001+ $(this).css('background-color', dark_color);
4002+ },
4003+ function () {
4004+ $(this).css('background-color', light_color);
4005+ }
4006+ );
4007+ }
4008+
4009+ function set_position_from_cookie() {
4010+ if (!document.cookie)
4011+ return;
4012+ var items = document.cookie.split(';');
4013+ for(var k=0; k<items.length; k++) {
4014+ var key_val = items[k].split('=');
4015+ var key = key_val[0];
4016+ if (key == 'sidebar') {
4017+ var value = key_val[1];
4018+ if ((value == 'collapsed') && (!sidebar_is_collapsed()))
4019+ collapse_sidebar();
4020+ else if ((value == 'expanded') && (sidebar_is_collapsed()))
4021+ expand_sidebar();
4022+ }
4023+ }
4024+ }
4025+
4026+ add_sidebar_button();
4027+ var sidebarbutton = $('#sidebarbutton');
4028+ set_position_from_cookie();
4029+});
4030
4031=== added file 'doc/source/percona-theme/static/software-download.png'
4032Binary files doc/source/percona-theme/static/software-download.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/software-download.png 2012-07-17 08:41:18 +0000 differ
4033=== added file 'doc/source/percona-theme/static/software-latest.png'
4034Binary files doc/source/percona-theme/static/software-latest.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/software-latest.png 2012-07-17 08:41:18 +0000 differ
4035=== added file 'doc/source/percona-theme/static/support-small.png'
4036Binary files doc/source/percona-theme/static/support-small.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/support-small.png 2012-07-17 08:41:18 +0000 differ
4037=== added file 'doc/source/percona-theme/static/ui-dropdown-bg.png'
4038Binary files doc/source/percona-theme/static/ui-dropdown-bg.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-dropdown-bg.png 2012-07-17 08:41:18 +0000 differ
4039=== added file 'doc/source/percona-theme/static/ui-dropdown-footer.png'
4040Binary files doc/source/percona-theme/static/ui-dropdown-footer.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-dropdown-footer.png 2012-07-17 08:41:18 +0000 differ
4041=== added file 'doc/source/percona-theme/static/ui-dropdown-header-l.png'
4042Binary files doc/source/percona-theme/static/ui-dropdown-header-l.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-dropdown-header-l.png 2012-07-17 08:41:18 +0000 differ
4043=== added file 'doc/source/percona-theme/static/ui-dropdown-header-r.png'
4044Binary files doc/source/percona-theme/static/ui-dropdown-header-r.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-dropdown-header-r.png 2012-07-17 08:41:18 +0000 differ
4045=== added file 'doc/source/percona-theme/static/ui-dropdown-header-search.png'
4046Binary files doc/source/percona-theme/static/ui-dropdown-header-search.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-dropdown-header-search.png 2012-07-17 08:41:18 +0000 differ
4047=== added file 'doc/source/percona-theme/static/ui-footer-logo.png'
4048Binary files doc/source/percona-theme/static/ui-footer-logo.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-footer-logo.png 2012-07-17 08:41:18 +0000 differ
4049=== added file 'doc/source/percona-theme/static/ui-leftnavi-sel.png'
4050Binary files doc/source/percona-theme/static/ui-leftnavi-sel.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-leftnavi-sel.png 2012-07-17 08:41:18 +0000 differ
4051=== added file 'doc/source/percona-theme/static/ui-logo.png'
4052Binary files doc/source/percona-theme/static/ui-logo.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-logo.png 2012-07-17 08:41:18 +0000 differ
4053=== added file 'doc/source/percona-theme/static/ui-navi-hover-l.png'
4054Binary files doc/source/percona-theme/static/ui-navi-hover-l.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-navi-hover-l.png 2012-07-17 08:41:18 +0000 differ
4055=== added file 'doc/source/percona-theme/static/ui-navi-hover-r.png'
4056Binary files doc/source/percona-theme/static/ui-navi-hover-r.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-navi-hover-r.png 2012-07-17 08:41:18 +0000 differ
4057=== added file 'doc/source/percona-theme/static/ui-navi-l.png'
4058Binary files doc/source/percona-theme/static/ui-navi-l.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-navi-l.png 2012-07-17 08:41:18 +0000 differ
4059=== added file 'doc/source/percona-theme/static/ui-navi-r.png'
4060Binary files doc/source/percona-theme/static/ui-navi-r.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-navi-r.png 2012-07-17 08:41:18 +0000 differ
4061=== added file 'doc/source/percona-theme/static/ui-navi-sel-l.png'
4062Binary files doc/source/percona-theme/static/ui-navi-sel-l.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-navi-sel-l.png 2012-07-17 08:41:18 +0000 differ
4063=== added file 'doc/source/percona-theme/static/ui-navi-sel-r.png'
4064Binary files doc/source/percona-theme/static/ui-navi-sel-r.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-navi-sel-r.png 2012-07-17 08:41:18 +0000 differ
4065=== added file 'doc/source/percona-theme/static/ui-orange-content.png'
4066Binary files doc/source/percona-theme/static/ui-orange-content.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-orange-content.png 2012-07-17 08:41:18 +0000 differ
4067=== added file 'doc/source/percona-theme/static/ui-orange-front.png'
4068Binary files doc/source/percona-theme/static/ui-orange-front.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-orange-front.png 2012-07-17 08:41:18 +0000 differ
4069=== added file 'doc/source/percona-theme/static/ui-search.png'
4070Binary files doc/source/percona-theme/static/ui-search.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-search.png 2012-07-17 08:41:18 +0000 differ
4071=== added file 'doc/source/percona-theme/static/ui-tab-bg.png'
4072Binary files doc/source/percona-theme/static/ui-tab-bg.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/ui-tab-bg.png 2012-07-17 08:41:18 +0000 differ
4073=== added file 'doc/source/percona-theme/static/warning.png'
4074Binary files doc/source/percona-theme/static/warning.png 1970-01-01 00:00:00 +0000 and doc/source/percona-theme/static/warning.png 2012-07-17 08:41:18 +0000 differ
4075=== added file 'doc/source/percona-theme/theme.conf'
4076--- doc/source/percona-theme/theme.conf 1970-01-01 00:00:00 +0000
4077+++ doc/source/percona-theme/theme.conf 2012-07-17 08:41:18 +0000
4078@@ -0,0 +1,32 @@
4079+[theme]
4080+inherit = default
4081+stylesheet = default.css
4082+pygments_style = sphinx
4083+
4084+[options]
4085+rightsidebar = false
4086+stickysidebar = false
4087+collapsiblesidebar = false
4088+externalrefs = false
4089+
4090+footerbgcolor = #11303d
4091+footertextcolor = #ffffff
4092+sidebarbgcolor = #1c4e63
4093+sidebarbtncolor = #3c6e83
4094+sidebartextcolor = #ffffff
4095+sidebarlinkcolor = #98dbcc
4096+relbarbgcolor = #133f52
4097+relbartextcolor = #ffffff
4098+relbarlinkcolor = #ffffff
4099+bgcolor = #ffffff
4100+textcolor = #000000
4101+headbgcolor = #f2f2f2
4102+headtextcolor = #20435c
4103+headlinkcolor = #c60f0f
4104+linkcolor = #355f7c
4105+visitedlinkcolor = #355f7c
4106+codebgcolor = #eeffcc
4107+codetextcolor = #333333
4108+
4109+bodyfont = sans-serif
4110+headfont = 'Arial', 'Helvetica' sans-serif
4111
4112=== added file 'doc/source/percona_favicon.ico'
4113Binary files doc/source/percona_favicon.ico 1970-01-01 00:00:00 +0000 and doc/source/percona_favicon.ico 2012-07-17 08:41:18 +0000 differ
4114=== added file 'doc/source/support.rst'
4115--- doc/source/support.rst 1970-01-01 00:00:00 +0000
4116+++ doc/source/support.rst 2012-07-17 08:41:18 +0000
4117@@ -0,0 +1,13 @@
4118+================
4119+Help and Support
4120+================
4121+
4122+All of Percona's software is open-source and free. Development takes place on Launchpad. Use the following links to learn more and get involved with development:
4123+
4124+ * The Percona Data Recovery Tool for InnoDB project on `Launchpad <https://launchpad.net/percona-innodb-recovery-tool>`_ includes source code and issue tracking
4125+ * The `Percona-Discussion <https://groups.google.com/forum/?fromgroups#!forum/percona-discussion>`_ mailing list for general questions
4126+ * The `Percona-Dev <https://groups.google.com/forum/?fromgroups#!forum/percona-dev>`_ mailing list for discussing development
4127+ * The #percona IRC channel on FreeNode to chat with community members
4128+
4129+If you're having trouble using the tools, Percona provides InnoDB `data recovery services <http://www.percona.com/mysql-consulting/data-recovery/>`_ with a team of skilled and experienced technicians, and is available 24 hours a day to assist you.
4130+

Subscribers

People subscribed via source and target branches